From 620b03d184ff1746d31a1213869f7718a2961658 Mon Sep 17 00:00:00 2001 From: taggon Date: Fri, 1 Apr 2011 06:51:30 +0000 Subject: [PATCH 0002/1372] set svn property - svn:eol-style LF git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8253 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- addons/autolink/autolink.addon.php | 24 +- addons/autolink/autolink.js | 158 +- addons/autolink/conf/info.xml | 106 +- addons/blogapi/blogapi.addon.php | 936 +- addons/blogapi/blogapi.func.php | 138 +- addons/blogapi/conf/info.xml | 160 +- addons/captcha/captcha.addon.php | 526 +- addons/captcha/conf/info.xml | 444 +- addons/counter/conf/info.xml | 124 +- addons/counter/counter.addon.php | 28 +- addons/member_communication/conf/info.xml | 116 +- addons/member_communication/lang/en.lang.php | 6 +- addons/member_communication/lang/es.lang.php | 6 +- addons/member_communication/lang/ge.lang.php | 6 +- addons/member_communication/lang/ru.lang.php | 18 +- addons/member_communication/lang/vi.lang.php | 22 +- .../member_communication.addon.php | 170 +- addons/member_extra_info/conf/info.xml | 106 +- .../member_extra_info.addon.php | 46 +- addons/mobile/classes/hdml.class.php | 206 +- addons/mobile/classes/mhtml.class.php | 164 +- addons/mobile/classes/mobile.class.php | 1196 +- addons/mobile/classes/wml.class.php | 212 +- addons/mobile/conf/info.xml | 224 +- addons/mobile/lang/en.lang.php | 30 +- addons/mobile/lang/jp.lang.php | 34 +- addons/mobile/lang/ko.lang.php | 34 +- addons/mobile/lang/ru.lang.php | 34 +- addons/mobile/lang/vi.lang.php | 36 +- addons/mobile/lang/zh-CN.lang.php | 22 +- addons/mobile/lang/zh-TW.lang.php | 30 +- addons/mobile/mobile.addon.php | 122 +- addons/openid_delegation_id/conf/info.xml | 250 +- .../openid_delegation_id.addon.php | 58 +- addons/point_level_icon/conf/info.xml | 124 +- .../point_level_icon.addon.php | 38 +- addons/resize_image/conf/info.xml | 106 +- addons/resize_image/resize_image.addon.php | 36 +- classes/cache/CacheApc.class.php | 144 +- classes/cache/CacheHandler.class.php | 190 +- classes/cache/CacheMemcache.class.php | 182 +- classes/db/DB.class.php | 1394 +- classes/db/DBCubrid.class.php | 2514 ++-- classes/db/DBMssql.class.php | 1816 +-- classes/db/DBMysql.class.php | 1560 +- classes/db/DBMysql_innodb.class.php | 328 +- classes/db/DBMysqli.class.php | 246 +- classes/db/DBSqlite2.class.php | 1470 +- classes/db/DBSqlite3_pdo.class.php | 1638 +- classes/display/DisplayHandler.class.php | 556 +- classes/editor/EditorHandler.class.php | 54 +- classes/extravar/Extravar.class.php | 622 +- classes/file/FileObject.class.php | 256 +- classes/handler/Handler.class.php | 22 +- classes/httprequest/XEHttpRequest.class.php | 170 +- classes/mail/Mail.class.php | 706 +- classes/module/ModuleHandler.class.php | 1064 +- classes/module/ModuleObject.class.php | 622 +- classes/object/Object.class.php | 274 +- classes/page/PageHandler.class.php | 124 +- classes/template/TemplateHandler.class.php | 1758 +-- classes/widget/WidgetHandler.class.php | 28 +- classes/xml/GeneralXmlParser.class.php | 166 +- classes/xml/XmlJsFilter.class.php | 580 +- classes/xml/XmlParser.class.php | 308 +- classes/xml/XmlQueryParser.class.php | 1084 +- common/css/button.css | 182 +- common/css/default.css | 182 +- common/js/common.js | 224 +- common/js/iepngfix_tilebg.js | 42 +- common/js/js_app.js | 32 +- common/js/plugins/filebox/filebox.js | 164 +- common/js/plugins/ui.calendar/ui.calendar.css | 70 +- common/js/plugins/ui.calendar/ui.calendar.js | 734 +- .../plugins/ui.colorpicker/xe_colorpicker.js | 732 +- .../js/plugins/ui.tree/jquery.simple.tree.css | 372 +- .../plugins/watchinput/jquery.watchinput.js | 122 +- common/js/src/common.js | 1968 +-- common/js/src/iepngfix_tilebg.js | 346 +- common/js/src/js_app.js | 558 +- common/js/src/x.js | 1352 +- common/js/src/xml_handler.js | 818 +- common/js/src/xml_js_filter.js | 674 +- common/js/unittest/JSSpec/JSSpec.js | 3094 ++-- common/js/unittest/JSSpec/demo.html | 420 +- common/js/unittest/css/JSSpec.css | 446 +- common/js/unittest/unittest_common.html | 148 +- common/js/xml_js_filter.js | 26 +- config/config.inc.php | 326 +- config/func.inc.php | 1958 +-- libs/PEAR.1.9/HTTP/Request2.php | 1720 +-- libs/PEAR.1.9/HTTP/Request2/Adapter.php | 308 +- libs/PEAR.1.9/HTTP/Request2/Adapter/Curl.php | 922 +- libs/PEAR.1.9/HTTP/Request2/Adapter/Mock.php | 340 +- .../PEAR.1.9/HTTP/Request2/Adapter/Socket.php | 2090 +-- libs/PEAR.1.9/HTTP/Request2/Exception.php | 122 +- libs/PEAR.1.9/HTTP/Request2/MultipartBody.php | 548 +- libs/PEAR.1.9/HTTP/Request2/Observer/Log.php | 428 +- libs/PEAR.1.9/HTTP/Request2/Response.php | 1116 +- libs/PEAR/HTTP/Request.php | 2922 ++-- libs/PEAR/HTTP/Request/Listener.php | 212 +- libs/PEAR/Net/URL.php | 820 +- libs/ftp.class.php | 1060 +- libs/tar.class.php | 1116 +- m.layouts/default/conf/info.xml | 212 +- m.layouts/default/layout.html | 56 +- m.layouts/default/mx.css | 46 +- m.layouts/simpleGray/conf/info.xml | 178 +- m.layouts/simpleGray/layout.html | 36 +- m.layouts/simpleGray/mx.css | 72 +- modules/addon/addon.admin.controller.php | 204 +- modules/addon/addon.admin.model.php | 626 +- modules/addon/addon.admin.view.php | 196 +- modules/addon/addon.class.php | 142 +- modules/addon/addon.controller.php | 370 +- modules/addon/conf/info.xml | 78 +- modules/addon/lang/en.lang.php | 34 +- modules/addon/lang/es.lang.php | 34 +- modules/addon/lang/fr.lang.php | 32 +- modules/addon/lang/jp.lang.php | 34 +- modules/addon/lang/ko.lang.php | 34 +- modules/addon/lang/ru.lang.php | 34 +- modules/addon/lang/tr.lang.php | 34 +- modules/addon/lang/vi.lang.php | 38 +- modules/addon/lang/zh-CN.lang.php | 34 +- modules/addon/lang/zh-TW.lang.php | 34 +- modules/admin/admin.admin.controller.php | 166 +- modules/admin/admin.admin.view.php | 716 +- modules/admin/admin.class.php | 118 +- modules/admin/conf/info.xml | 72 +- modules/admin/lang/en.lang.php | 184 +- modules/admin/lang/es.lang.php | 188 +- modules/admin/lang/fr.lang.php | 186 +- modules/admin/lang/jp.lang.php | 186 +- modules/admin/lang/ko.lang.php | 186 +- modules/admin/lang/ru.lang.php | 182 +- modules/admin/lang/tr.lang.php | 184 +- modules/admin/lang/vi.lang.php | 190 +- modules/admin/lang/zh-CN.lang.php | 184 +- modules/admin/lang/zh-TW.lang.php | 184 +- modules/admin/tpl/_footer.html | 12 +- modules/admin/tpl/_header.html | 120 +- modules/admin/tpl/css/font.css | 120 +- modules/admin/tpl/css/layout.css | 94 +- modules/admin/tpl/css/pagination.css | 170 +- modules/admin/tpl/index.html | 628 +- modules/admin/tpl/js/admin.js | 314 +- modules/admin/tpl/layout.html | 38 +- .../autoinstall.admin.controller.php | 486 +- .../autoinstall/autoinstall.admin.view.php | 638 +- modules/autoinstall/autoinstall.class.php | 174 +- modules/autoinstall/autoinstall.model.php | 370 +- modules/autoinstall/autoinstall.view.php | 52 +- modules/autoinstall/conf/info.xml | 60 +- modules/autoinstall/lang/en.lang.php | 70 +- modules/autoinstall/lang/jp.lang.php | 70 +- modules/autoinstall/lang/ko.lang.php | 70 +- modules/autoinstall/lang/ru.lang.php | 70 +- modules/autoinstall/lang/tr.lang.php | 70 +- modules/autoinstall/lang/vi.lang.php | 70 +- modules/autoinstall/lang/zh-CN.lang.php | 70 +- modules/autoinstall/lang/zh-TW.lang.php | 70 +- modules/autoinstall/tpl/css/autoinstall.css | 118 +- modules/autoinstall/tpl/index.html | 42 +- modules/autoinstall/tpl/install.html | 60 +- modules/autoinstall/tpl/leftBox.html | 100 +- modules/autoinstall/tpl/list.html | 192 +- modules/comment/comment.admin.controller.php | 144 +- modules/comment/comment.admin.view.php | 166 +- modules/comment/comment.class.php | 210 +- modules/comment/comment.controller.php | 1284 +- modules/comment/comment.model.php | 936 +- modules/comment/comment.view.php | 96 +- modules/comment/conf/info.xml | 72 +- modules/comment/lang/en.lang.php | 66 +- modules/comment/lang/es.lang.php | 66 +- modules/comment/lang/fr.lang.php | 68 +- modules/comment/lang/jp.lang.php | 68 +- modules/comment/lang/ko.lang.php | 68 +- modules/comment/lang/ru.lang.php | 68 +- modules/comment/lang/tr.lang.php | 66 +- modules/comment/lang/vi.lang.php | 70 +- modules/comment/lang/zh-CN.lang.php | 68 +- modules/comment/lang/zh-TW.lang.php | 68 +- modules/comment/tpl/comment_list.html | 150 +- modules/comment/tpl/declared_list.html | 110 +- .../communication.admin.controller.php | 70 +- .../communication.admin.model.php | 80 +- .../communication.admin.view.php | 80 +- modules/communication/communication.class.php | 84 +- .../communication.controller.php | 836 +- modules/communication/communication.model.php | 378 +- modules/communication/communication.view.php | 456 +- modules/communication/conf/info.xml | 66 +- modules/communication/lang/en.lang.php | 96 +- modules/communication/lang/es.lang.php | 98 +- modules/communication/lang/fr.lang.php | 96 +- modules/communication/lang/jp.lang.php | 96 +- modules/communication/lang/ko.lang.php | 96 +- modules/communication/lang/ru.lang.php | 98 +- modules/communication/lang/tr.lang.php | 96 +- modules/communication/lang/vi.lang.php | 100 +- modules/communication/lang/zh-CN.lang.php | 98 +- modules/communication/lang/zh-TW.lang.php | 96 +- .../communication/skins/default/friends.html | 172 +- .../communication/skins/default/messages.html | 246 +- modules/communication/skins/default/skin.xml | 244 +- modules/counter/conf/info.xml | 72 +- modules/counter/counter.admin.view.php | 100 +- modules/counter/counter.class.php | 110 +- modules/counter/counter.controller.php | 290 +- modules/counter/counter.model.php | 402 +- modules/counter/lang/en.lang.php | 50 +- modules/counter/lang/es.lang.php | 50 +- modules/counter/lang/fr.lang.php | 50 +- modules/counter/lang/jp.lang.php | 50 +- modules/counter/lang/ko.lang.php | 50 +- modules/counter/lang/ru.lang.php | 50 +- modules/counter/lang/tr.lang.php | 50 +- modules/counter/lang/vi.lang.php | 54 +- modules/counter/lang/zh-CN.lang.php | 50 +- modules/counter/lang/zh-TW.lang.php | 50 +- modules/document/conf/info.xml | 72 +- modules/document/document.admin.model.php | 174 +- modules/document/document.admin.view.php | 318 +- modules/document/document.class.php | 524 +- modules/document/document.model.php | 2202 +-- modules/document/document.view.php | 242 +- modules/document/lang/en.lang.php | 198 +- modules/document/lang/es.lang.php | 164 +- modules/document/lang/fr.lang.php | 166 +- modules/document/lang/jp.lang.php | 202 +- modules/document/lang/ru.lang.php | 210 +- modules/document/lang/tr.lang.php | 198 +- modules/document/lang/vi.lang.php | 206 +- modules/document/lang/zh-CN.lang.php | 202 +- modules/document/lang/zh-TW.lang.php | 202 +- .../queries/getChildCategoryMinListOrder.xml | 24 +- modules/document/tpl/declared_list.html | 140 +- modules/document/tpl/document_list.html | 200 +- modules/document/tpl/document_trash_list.html | 146 +- modules/document/tpl/js/document_category.js | 378 +- .../components/emoticon/emoticon.class.php | 214 +- modules/editor/components/emoticon/info.xml | 70 +- .../image_gallery/image_gallery.class.php | 162 +- .../editor/components/image_gallery/info.xml | 70 +- .../components/image_gallery/lang/en.lang.php | 54 +- .../components/image_gallery/lang/es.lang.php | 54 +- .../components/image_gallery/lang/jp.lang.php | 54 +- .../components/image_gallery/lang/ru.lang.php | 54 +- .../components/image_gallery/lang/tr.lang.php | 54 +- .../components/image_gallery/lang/vi.lang.php | 58 +- .../image_gallery/lang/zh-CN.lang.php | 54 +- .../image_gallery/lang/zh-TW.lang.php | 54 +- .../image_link/image_link.class.php | 216 +- modules/editor/components/image_link/info.xml | 70 +- .../components/image_link/lang/en.lang.php | 44 +- .../components/image_link/lang/es.lang.php | 44 +- .../components/image_link/lang/jp.lang.php | 46 +- .../components/image_link/lang/ko.lang.php | 46 +- .../components/image_link/lang/ru.lang.php | 44 +- .../components/image_link/lang/tr.lang.php | 44 +- .../components/image_link/lang/vi.lang.php | 46 +- .../components/image_link/lang/zh-CN.lang.php | 46 +- .../components/image_link/lang/zh-TW.lang.php | 44 +- .../components/multimedia_link/info.xml | 70 +- .../multimedia_link/lang/en.lang.php | 26 +- .../multimedia_link/lang/es.lang.php | 28 +- .../multimedia_link/lang/jp.lang.php | 36 +- .../multimedia_link/lang/ko.lang.php | 36 +- .../multimedia_link/lang/ru.lang.php | 26 +- .../multimedia_link/lang/tr.lang.php | 26 +- .../multimedia_link/lang/vi.lang.php | 30 +- .../multimedia_link/lang/zh-CN.lang.php | 26 +- .../multimedia_link/lang/zh-TW.lang.php | 34 +- .../multimedia_link/multimedia_link.class.php | 142 +- modules/editor/components/poll_maker/info.xml | 70 +- .../components/poll_maker/lang/en.lang.php | 36 +- .../components/poll_maker/lang/es.lang.php | 38 +- .../components/poll_maker/lang/jp.lang.php | 36 +- .../components/poll_maker/lang/ko.lang.php | 36 +- .../components/poll_maker/lang/ru.lang.php | 36 +- .../components/poll_maker/lang/tr.lang.php | 36 +- .../components/poll_maker/lang/vi.lang.php | 40 +- .../components/poll_maker/lang/zh-CN.lang.php | 36 +- .../components/poll_maker/lang/zh-TW.lang.php | 36 +- .../poll_maker/poll_maker.class.php | 120 +- modules/editor/conf/info.xml | 72 +- modules/editor/conf/module.xml | 56 +- modules/editor/editor.admin.controller.php | 332 +- modules/editor/editor.admin.view.php | 160 +- modules/editor/editor.api.php | 26 +- modules/editor/editor.class.php | 240 +- modules/editor/editor.controller.php | 914 +- modules/editor/editor.model.php | 1612 +- modules/editor/editor.view.php | 276 +- modules/editor/skins/dreditor/css/button.css | 162 +- .../editor/skins/dreditor/css/dreditor.css | 694 +- modules/editor/skins/dreditor/css/editor.css | 12 +- .../skins/dreditor/css/style@content.css | 104 +- .../skins/dreditor/drcomponents/fold/info.xml | 46 +- .../drcomponents/fold/lang/tr.lang.php | 8 +- .../dreditor/drcomponents/fold/tpl/fold.css | 22 +- .../dreditor/drcomponents/fold/tpl/fold.html | 32 +- .../dreditor/drcomponents/fold/tpl/fold.js | 410 +- modules/editor/skins/dreditor/editor.html | 1374 +- modules/editor/skins/dreditor/js/DrEditor.js | 5198 +++---- .../editor/skins/dreditor/js/Xpress_Editor.js | 12484 ++++++++-------- .../editor/skins/dreditor/js/xe_interface.js | 214 +- .../editor/skins/dreditor/lang/en.lang.php | 168 +- .../editor/skins/dreditor/lang/jp.lang.php | 168 +- .../editor/skins/dreditor/lang/ko.lang.php | 168 +- .../editor/skins/dreditor/lang/tr.lang.php | 168 +- .../editor/skins/dreditor/lang/vi.lang.php | 168 +- .../editor/skins/dreditor/lang/zh-CN.lang.php | 162 +- .../editor/skins/dreditor/lang/zh-TW.lang.php | 168 +- modules/editor/skins/dreditor/skin.xml | 262 +- modules/editor/skins/xeed/js/xe_interface.js | 290 +- modules/editor/skins/xeed/js/xe_textarea.js | 82 +- modules/editor/skins/xeed/skin.xml | 54 +- .../editor/skins/xpresseditor/css/default.css | 822 +- modules/editor/skins/xpresseditor/editor.html | 968 +- .../skins/xpresseditor/js/Xpress_Editor.js | 11526 +++++++------- .../skins/xpresseditor/js/xe_interface.js | 616 +- .../skins/xpresseditor/js/xe_textarea.js | 82 +- modules/editor/skins/xpresseditor/skin.xml | 272 +- modules/editor/styles/default/editor.css | 46 +- modules/editor/styles/default/editor.html | 20 +- modules/editor/styles/default/skin.xml | 98 +- modules/editor/styles/dreditor/editor.html | 20 +- modules/editor/styles/dreditor/style.css | 102 +- modules/editor/styles/xeStyle/editor.css | 62 +- modules/editor/styles/xeStyle/editor.html | 22 +- modules/editor/styles/xeStyle/skin.xml | 92 +- modules/editor/styles/xeStyle/style.css | 114 +- modules/editor/styles/xeStyleBlack/editor.css | 66 +- .../editor/styles/xeStyleBlack/editor.html | 22 +- modules/editor/styles/xeStyleBlack/skin.xml | 92 +- modules/editor/styles/xeStyleBlack/style.css | 108 +- modules/editor/tpl/js/editor.js | 1128 +- modules/editor/tpl/js/editor_admin.js | 86 +- modules/editor/tpl/js/editor_module_config.js | 74 +- modules/editor/tpl/js/swfupload.js | 1960 +-- modules/editor/tpl/js/uploader.js | 872 +- modules/file/conf/info.xml | 72 +- modules/file/file.admin.controller.php | 302 +- modules/file/file.admin.model.php | 192 +- modules/file/file.admin.view.php | 374 +- modules/file/file.class.php | 298 +- modules/file/file.controller.php | 1242 +- modules/file/file.model.php | 426 +- modules/file/file.view.php | 106 +- modules/file/lang/en.lang.php | 118 +- modules/file/lang/es.lang.php | 112 +- modules/file/lang/fr.lang.php | 112 +- modules/file/lang/jp.lang.php | 116 +- modules/file/lang/ko.lang.php | 114 +- modules/file/lang/ru.lang.php | 116 +- modules/file/lang/tr.lang.php | 118 +- modules/file/lang/vi.lang.php | 124 +- modules/file/lang/zh-CN.lang.php | 112 +- modules/file/lang/zh-TW.lang.php | 116 +- modules/file/queries/getFileList.xml | 72 +- modules/file/tpl/file_list.html | 266 +- modules/file/tpl/iframe.html | 54 +- modules/importer/conf/info.xml | 72 +- modules/importer/extract.class.php | 416 +- .../importer/importer.admin.controller.php | 2036 +-- modules/importer/importer.admin.view.php | 116 +- modules/importer/importer.class.php | 74 +- modules/importer/lang/es.lang.php | 124 +- modules/importer/lang/fr.lang.php | 124 +- modules/importer/lang/jp.lang.php | 122 +- modules/importer/lang/ko.lang.php | 122 +- modules/importer/lang/ru.lang.php | 124 +- modules/importer/lang/vi.lang.php | 128 +- modules/importer/lang/zh-CN.lang.php | 122 +- modules/importer/lang/zh-TW.lang.php | 122 +- modules/importer/tpl/js/importer_admin.js | 340 +- modules/importer/ttimport.class.php | 1276 +- modules/install/conf/info.xml | 72 +- modules/install/install.admin.controller.php | 324 +- modules/install/install.class.php | 74 +- modules/install/install.controller.php | 952 +- modules/install/install.view.php | 182 +- modules/install/lang/en.lang.php | 1110 +- modules/install/lang/es.lang.php | 1108 +- modules/install/lang/fr.lang.php | 1116 +- modules/install/lang/jp.lang.php | 1110 +- modules/install/lang/ko.lang.php | 1114 +- modules/install/lang/ru.lang.php | 1114 +- modules/install/lang/tr.lang.php | 1084 +- modules/install/lang/vi.lang.php | 1118 +- modules/install/lang/zh-CN.lang.php | 492 +- modules/install/lang/zh-TW.lang.php | 1112 +- modules/install/tpl/css/install.css | 96 +- modules/integration_search/conf/info.xml | 126 +- .../integration_search.admin.controller.php | 230 +- .../integration_search.admin.view.php | 168 +- .../integration_search.class.php | 82 +- .../integration_search.model.php | 386 +- .../integration_search.view.php | 206 +- modules/integration_search/lang/en.lang.php | 84 +- modules/integration_search/lang/es.lang.php | 84 +- modules/integration_search/lang/fr.lang.php | 84 +- modules/integration_search/lang/jp.lang.php | 86 +- modules/integration_search/lang/ko.lang.php | 86 +- modules/integration_search/lang/ru.lang.php | 86 +- modules/integration_search/lang/tr.lang.php | 84 +- modules/integration_search/lang/vi.lang.php | 82 +- .../integration_search/lang/zh-CN.lang.php | 86 +- .../integration_search/lang/zh-TW.lang.php | 86 +- .../skins/default/index.html | 64 +- .../integration_search/skins/default/skin.xml | 120 +- .../skins/default/white.css | 184 +- .../tpl/js/integration_search_admin.js | 10 +- modules/krzip/conf/info.xml | 126 +- modules/krzip/krzip.admin.controller.php | 66 +- modules/krzip/krzip.admin.view.php | 64 +- modules/krzip/krzip.class.php | 82 +- modules/krzip/krzip.model.php | 112 +- modules/krzip/lang/en.lang.php | 44 +- modules/krzip/lang/es.lang.php | 44 +- modules/krzip/lang/fr.lang.php | 44 +- modules/krzip/lang/jp.lang.php | 44 +- modules/krzip/lang/ko.lang.php | 44 +- modules/krzip/lang/ru.lang.php | 44 +- modules/krzip/lang/tr.lang.php | 44 +- modules/krzip/lang/vi.lang.php | 48 +- modules/krzip/lang/zh-CN.lang.php | 44 +- modules/krzip/lang/zh-TW.lang.php | 44 +- modules/layout/conf/info.xml | 72 +- modules/layout/faceoff/conf/info.xml | 266 +- modules/layout/faceoff/css/layout.css | 346 +- modules/layout/faceoff/layout.html | 112 +- modules/layout/lang/en.lang.php | 238 +- modules/layout/lang/es.lang.php | 234 +- modules/layout/lang/fr.lang.php | 234 +- modules/layout/lang/jp.lang.php | 236 +- modules/layout/lang/ko.lang.php | 240 +- modules/layout/lang/ru.lang.php | 236 +- modules/layout/lang/tr.lang.php | 238 +- modules/layout/lang/vi.lang.php | 240 +- modules/layout/lang/zh-CN.lang.php | 236 +- modules/layout/lang/zh-TW.lang.php | 236 +- modules/layout/layout.admin.controller.php | 1048 +- modules/layout/layout.admin.view.php | 592 +- modules/layout/layout.class.php | 186 +- modules/layout/layout.model.php | 1262 +- modules/layout/layout.view.php | 68 +- modules/layout/tpl/css/faceoff_menu.css | 416 +- modules/layout/tpl/css/widget.css | 1602 +- modules/layout/tpl/faceoff_layout_edit.html | 2 +- modules/layout/tpl/faceoff_layout_menu.html | 694 +- modules/layout/tpl/js/faceoff.js | 1990 +-- modules/layout/tpl/js/layout_image_list.js | 26 +- modules/layout/tpl/js/ui.toolbar.js | 274 +- modules/layout/tpl/layout_image_list.html | 68 +- modules/member/conf/info.xml | 72 +- modules/member/lang/en.lang.php | 472 +- modules/member/lang/es.lang.php | 474 +- modules/member/lang/fr.lang.php | 482 +- modules/member/lang/jp.lang.php | 482 +- modules/member/lang/ru.lang.php | 480 +- modules/member/lang/tr.lang.php | 470 +- modules/member/lang/vi.lang.php | 480 +- modules/member/lang/zh-CN.lang.php | 476 +- modules/member/lang/zh-TW.lang.php | 480 +- modules/member/member.admin.controller.php | 1078 +- modules/member/member.admin.model.php | 282 +- modules/member/member.admin.view.php | 482 +- modules/member/member.api.php | 80 +- modules/member/member.class.php | 474 +- modules/member/member.controller.php | 3874 ++--- modules/member/member.model.php | 1432 +- modules/member/member.view.php | 714 +- .../member/skins/default/document_list.html | 126 +- modules/member/skins/default/saved_list.html | 92 +- .../skins/default/saved_list_popup.html | 98 +- .../member/skins/default/scrapped_list.html | 96 +- modules/member/skins/default/skin.xml | 152 +- modules/member/tpl/denied_id_list.html | 140 +- modules/member/tpl/js/signup_check.js | 104 +- modules/member/tpl/login_form.html | 38 +- modules/member/tpl/member_list.html | 264 +- modules/menu/conf/info.xml | 72 +- modules/menu/lang/en.lang.php | 106 +- modules/menu/lang/es.lang.php | 106 +- modules/menu/lang/fr.lang.php | 106 +- modules/menu/lang/jp.lang.php | 106 +- modules/menu/lang/ko.lang.php | 106 +- modules/menu/lang/ru.lang.php | 106 +- modules/menu/lang/tr.lang.php | 106 +- modules/menu/lang/vi.lang.php | 110 +- modules/menu/lang/zh-CN.lang.php | 106 +- modules/menu/lang/zh-TW.lang.php | 106 +- modules/menu/menu.admin.controller.php | 1308 +- modules/menu/menu.admin.model.php | 308 +- modules/menu/menu.admin.view.php | 208 +- modules/menu/menu.class.php | 134 +- modules/menu/tpl/css/mmenu.css | 38 +- modules/menu/tpl/index.html | 102 +- modules/menu/tpl/js/menu_tree.js | 348 +- modules/menu/tpl/menu.html | 60 +- modules/message/conf/info.xml | 72 +- modules/message/lang/en.lang.php | 20 +- modules/message/lang/es.lang.php | 20 +- modules/message/lang/fr.lang.php | 20 +- modules/message/lang/jp.lang.php | 20 +- modules/message/lang/ko.lang.php | 20 +- modules/message/lang/ru.lang.php | 20 +- modules/message/lang/tr.lang.php | 20 +- modules/message/lang/vi.lang.php | 24 +- modules/message/lang/zh-CN.lang.php | 18 +- modules/message/lang/zh-TW.lang.php | 18 +- .../m.skins/default/system_message.html | 126 +- modules/message/message.admin.controller.php | 62 +- modules/message/message.admin.view.php | 70 +- modules/message/message.class.php | 74 +- modules/message/message.view.php | 94 +- modules/message/skins/default/message.css | 76 +- modules/message/skins/default/message.js | 76 +- .../message/skins/default/system_message.html | 120 +- modules/module/conf/info.xml | 72 +- modules/module/lang/en.lang.php | 198 +- modules/module/lang/es.lang.php | 198 +- modules/module/lang/fr.lang.php | 196 +- modules/module/lang/jp.lang.php | 196 +- modules/module/lang/ko.lang.php | 196 +- modules/module/lang/ru.lang.php | 198 +- modules/module/lang/tr.lang.php | 198 +- modules/module/lang/vi.lang.php | 202 +- modules/module/lang/zh-CN.lang.php | 198 +- modules/module/lang/zh-TW.lang.php | 196 +- modules/module/module.admin.controller.php | 970 +- modules/module/module.admin.model.php | 380 +- modules/module/module.admin.view.php | 448 +- modules/module/module.class.php | 734 +- modules/module/module.controller.php | 1514 +- modules/module/module.model.php | 2666 ++-- modules/module/module.view.php | 322 +- modules/module/queries/deleteModuleExtend.xml | 22 +- .../module/queries/deleteModuleFileBox.xml | 14 +- modules/module/queries/deleteTrigger.xml | 22 +- modules/module/queries/getModuleFileBox.xml | 16 +- .../module/queries/getModuleFileBoxList.xml | 28 +- .../module/queries/insertModuleFileBox.xml | 28 +- modules/module/schemas/module_filebox.xml | 16 +- modules/module/tpl/css/mlang.css | 48 +- modules/module/tpl/filebox_add.html | 74 +- modules/module/tpl/filebox_list.html | 130 +- modules/module/tpl/js/filebox.js | 86 +- modules/module/tpl/js/module_admin.js | 380 +- modules/module/tpl/lang.html | 30 +- modules/module/tpl/move_filebox_list.html | 4 +- modules/opage/conf/info.xml | 74 +- modules/opage/lang/en.lang.php | 36 +- modules/opage/lang/es.lang.php | 34 +- modules/opage/lang/fr.lang.php | 34 +- modules/opage/lang/jp.lang.php | 34 +- modules/opage/lang/ko.lang.php | 36 +- modules/opage/lang/ru.lang.php | 34 +- modules/opage/lang/tr.lang.php | 36 +- modules/opage/lang/vi.lang.php | 38 +- modules/opage/lang/zh-CN.lang.php | 36 +- modules/opage/lang/zh-TW.lang.php | 34 +- modules/opage/opage.admin.controller.php | 168 +- modules/opage/opage.admin.view.php | 278 +- modules/opage/opage.class.php | 90 +- modules/opage/opage.controller.php | 210 +- modules/opage/opage.model.php | 66 +- modules/opage/opage.view.php | 332 +- modules/opage/tpl/header.html | 36 +- modules/opage/tpl/index.html | 170 +- modules/opage/tpl/js/opage_admin.js | 124 +- modules/page/conf/info.xml | 72 +- modules/page/lang/en.lang.php | 32 +- modules/page/lang/es.lang.php | 32 +- modules/page/lang/fr.lang.php | 32 +- modules/page/lang/jp.lang.php | 32 +- modules/page/lang/ko.lang.php | 32 +- modules/page/lang/ru.lang.php | 32 +- modules/page/lang/tr.lang.php | 32 +- modules/page/lang/vi.lang.php | 36 +- modules/page/lang/zh-CN.lang.php | 32 +- modules/page/lang/zh-TW.lang.php | 32 +- modules/page/page.admin.controller.php | 442 +- modules/page/page.admin.view.php | 516 +- modules/page/page.api.php | 50 +- modules/page/page.class.php | 84 +- modules/page/page.view.php | 108 +- modules/page/page.wap.php | 52 +- modules/page/tpl/index.html | 202 +- modules/page/tpl/js/page_admin.js | 220 +- modules/point/conf/info.xml | 144 +- modules/point/lang/en.lang.php | 138 +- modules/point/lang/es.lang.php | 138 +- modules/point/lang/fr.lang.php | 138 +- modules/point/lang/jp.lang.php | 136 +- modules/point/lang/ko.lang.php | 136 +- modules/point/lang/ru.lang.php | 138 +- modules/point/lang/tr.lang.php | 138 +- modules/point/lang/vi.lang.php | 142 +- modules/point/lang/zh-CN.lang.php | 136 +- modules/point/lang/zh-TW.lang.php | 138 +- modules/point/point.admin.controller.php | 622 +- modules/point/point.admin.view.php | 202 +- modules/point/point.class.php | 394 +- modules/point/point.controller.php | 1322 +- modules/point/point.model.php | 292 +- modules/point/point.view.php | 124 +- modules/point/queries/getMemberCount.xml | 14 +- modules/point/queries/getPointCount.xml | 14 +- modules/point/tpl/js/point_admin.js | 140 +- modules/point/tpl/member_list.html | 182 +- modules/poll/conf/info.xml | 72 +- modules/poll/lang/en.lang.php | 76 +- modules/poll/lang/es.lang.php | 76 +- modules/poll/lang/fr.lang.php | 76 +- modules/poll/lang/jp.lang.php | 76 +- modules/poll/lang/ko.lang.php | 76 +- modules/poll/lang/ru.lang.php | 76 +- modules/poll/lang/tr.lang.php | 76 +- modules/poll/lang/vi.lang.php | 80 +- modules/poll/lang/zh-CN.lang.php | 76 +- modules/poll/lang/zh-TW.lang.php | 76 +- modules/poll/poll.admin.controller.php | 222 +- modules/poll/poll.admin.model.php | 100 +- modules/poll/poll.admin.view.php | 254 +- modules/poll/poll.class.php | 166 +- modules/poll/poll.controller.php | 632 +- modules/poll/poll.model.php | 284 +- modules/poll/skins/default/skin.xml | 82 +- modules/poll/skins/simple/skin.xml | 76 +- modules/poll/tpl/js/poll_admin.js | 112 +- modules/poll/tpl/poll_list.html | 158 +- modules/rss/conf/info.xml | 72 +- modules/rss/lang/en.lang.php | 50 +- modules/rss/lang/es.lang.php | 50 +- modules/rss/lang/fr.lang.php | 50 +- modules/rss/lang/jp.lang.php | 72 +- modules/rss/lang/ko.lang.php | 72 +- modules/rss/lang/ru.lang.php | 72 +- modules/rss/lang/tr.lang.php | 50 +- modules/rss/lang/vi.lang.php | 54 +- modules/rss/lang/zh-CN.lang.php | 72 +- modules/rss/lang/zh-TW.lang.php | 72 +- modules/rss/rss.admin.controller.php | 328 +- modules/rss/rss.admin.view.php | 94 +- modules/rss/rss.class.php | 160 +- modules/rss/rss.controller.php | 116 +- modules/rss/rss.model.php | 88 +- modules/rss/rss.view.php | 468 +- modules/rss/tpl/atom10.html | 74 +- modules/rss/tpl/js/rss.js | 32 +- modules/rss/tpl/rss_admin_index.html | 164 +- modules/session/conf/info.xml | 100 +- modules/session/lang/en.lang.php | 26 +- modules/session/lang/fr.lang.php | 26 +- modules/session/lang/jp.lang.php | 26 +- modules/session/lang/ko.lang.php | 26 +- modules/session/lang/tr.lang.php | 26 +- modules/session/lang/vi.lang.php | 30 +- modules/session/lang/zh-CN.lang.php | 26 +- modules/session/lang/zh-TW.lang.php | 26 +- modules/session/session.admin.controller.php | 52 +- modules/session/session.admin.view.php | 52 +- modules/session/session.class.php | 166 +- modules/session/session.controller.php | 140 +- modules/session/session.model.php | 186 +- modules/spamfilter/conf/info.xml | 72 +- modules/spamfilter/lang/en.lang.php | 66 +- modules/spamfilter/lang/es.lang.php | 66 +- modules/spamfilter/lang/fr.lang.php | 66 +- modules/spamfilter/lang/jp.lang.php | 66 +- modules/spamfilter/lang/ko.lang.php | 66 +- modules/spamfilter/lang/ru.lang.php | 66 +- modules/spamfilter/lang/tr.lang.php | 66 +- modules/spamfilter/lang/vi.lang.php | 70 +- modules/spamfilter/lang/zh-CN.lang.php | 66 +- modules/spamfilter/lang/zh-TW.lang.php | 66 +- .../spamfilter.admin.controller.php | 198 +- modules/spamfilter/spamfilter.admin.view.php | 118 +- modules/spamfilter/spamfilter.class.php | 214 +- modules/spamfilter/spamfilter.controller.php | 346 +- modules/spamfilter/spamfilter.model.php | 300 +- modules/syndication/conf/info.xml | 36 +- .../syndication.admin.controller.php | 266 +- .../syndication/syndication.admin.view.php | 100 +- modules/syndication/syndication.class.php | 148 +- .../syndication/syndication.controller.php | 254 +- modules/syndication/syndication.model.php | 726 +- modules/tag/conf/info.xml | 72 +- modules/tag/tag.admin.controller.php | 34 +- modules/tag/tag.class.php | 192 +- modules/tag/tag.controller.php | 184 +- modules/tag/tag.model.php | 174 +- modules/trackback/conf/info.xml | 74 +- modules/trackback/lang/en.lang.php | 58 +- modules/trackback/lang/es.lang.php | 60 +- modules/trackback/lang/fr.lang.php | 58 +- modules/trackback/lang/jp.lang.php | 58 +- modules/trackback/lang/ko.lang.php | 58 +- modules/trackback/lang/ru.lang.php | 60 +- modules/trackback/lang/tr.lang.php | 58 +- modules/trackback/lang/vi.lang.php | 64 +- modules/trackback/lang/zh-CN.lang.php | 58 +- modules/trackback/lang/zh-TW.lang.php | 58 +- modules/trackback/tpl/trackback_list.html | 200 +- .../trackback/trackback.admin.controller.php | 196 +- modules/trackback/trackback.admin.model.php | 136 +- modules/trackback/trackback.admin.view.php | 100 +- modules/trackback/trackback.class.php | 174 +- modules/trackback/trackback.controller.php | 668 +- modules/trackback/trackback.model.php | 302 +- modules/trackback/trackback.view.php | 140 +- modules/widget/conf/info.xml | 72 +- modules/widget/lang/en.lang.php | 136 +- modules/widget/lang/es.lang.php | 136 +- modules/widget/lang/fr.lang.php | 136 +- modules/widget/lang/jp.lang.php | 136 +- modules/widget/lang/ko.lang.php | 136 +- modules/widget/lang/ru.lang.php | 92 +- modules/widget/lang/tr.lang.php | 136 +- modules/widget/lang/vi.lang.php | 140 +- modules/widget/lang/zh-CN.lang.php | 136 +- modules/widget/lang/zh-TW.lang.php | 136 +- modules/widget/tpl/css/widget.css | 124 +- .../filter/style_generate_code_in_page.xml | 18 +- modules/widget/tpl/js/widget.js | 2706 ++-- modules/widget/tpl/js/widget_admin.js | 940 +- .../widget_style_generate_code_in_page.html | 222 +- modules/widget/widget.admin.view.php | 112 +- modules/widget/widget.class.php | 128 +- modules/widget/widget.controller.php | 1438 +- modules/widget/widget.model.php | 806 +- modules/widget/widget.view.php | 306 +- tests/simpletest/test/autorun_test.php | 24 +- widgets/content/conf/info.xml | 1754 +-- .../skins/default/js/content_widget.js | 118 +- widgets/content/skins/default/skin.xml | 138 +- widgets/counter_status/conf/info.xml | 134 +- .../counter_status/counter_status.class.php | 80 +- .../skins/default/counter_status.html | 28 +- widgets/counter_status/skins/default/skin.xml | 120 +- widgets/language_select/conf/info.xml | 72 +- .../language_select/language_select.class.php | 58 +- .../skins/default/js/language_select.js | 34 +- .../skins/default/language_select.html | 36 +- .../language_select/skins/default/skin.xml | 120 +- widgets/login_info/conf/info.xml | 72 +- widgets/login_info/login_info.class.php | 92 +- widgets/login_info/skins/xe_official/skin.xml | 162 +- widgets/mcontent/conf/info.xml | 1086 +- widgets/mcontent/mcontent.class.php | 1496 +- widgets/mcontent/skins/default/content.html | 22 +- .../mcontent/skins/default/image_title.html | 102 +- .../skins/default/image_title_content.html | 108 +- widgets/mcontent/skins/default/mcontent.css | 48 +- widgets/mcontent/skins/default/normal.html | 90 +- widgets/mcontent/skins/default/skin.xml | 46 +- widgetstyles/simple/skin.xml | 234 +- widgetstyles/simple/widgetstyle.html | 46 +- 763 files changed, 114595 insertions(+), 114595 deletions(-) diff --git a/addons/autolink/autolink.addon.php b/addons/autolink/autolink.addon.php index 0463eb57a..831254057 100644 --- a/addons/autolink/autolink.addon.php +++ b/addons/autolink/autolink.addon.php @@ -1,12 +1,12 @@ - + diff --git a/addons/autolink/autolink.js b/addons/autolink/autolink.js index 5b03d4bd7..ad2dcecf6 100644 --- a/addons/autolink/autolink.js +++ b/addons/autolink/autolink.js @@ -1,80 +1,80 @@ -/** - * @file autolink.js - * @brief javascript code for autolink addon - * @author NHN (developers@xpressengine.com) - */ -(function($){ - var protocol_re = '(https?|ftp|news|telnet|irc|mms)://'; - var domain_re = '(?:[\\w\\-]+\\.)+(?:[a-z]+)'; - var max_255_re = '(?:1[0-9]{2}|2[0-4][0-9]|25[0-5]|[1-9]?[0-9])'; - var ip_re = '(?:'+max_255_re+'\\.){3}'+max_255_re; - var port_re = '(?::([0-9]+))?'; - var user_re = '(?:/~[\\w-]+)?'; - var path_re = '((?:/[\\w!"$-/:-@]+)*)'; - var hash_re = '(?:#([\\w!-@]+))?'; - - var url_regex = new RegExp('('+protocol_re+'('+domain_re+'|'+ip_re+'|localhost'+')'+port_re+user_re+path_re+hash_re+')', 'ig'); - - var AutoLink = xe.createPlugin("autolink", { - targets : [], - init : function() { - this.targets = []; - }, - API_ONREADY : function() { - var thisPlugin = this; - - // extract target text nodes - this.extractTargets($('.xe_content')); - - $(this.targets).each(function(){ - thisPlugin.cast('AUTOLINK', [this]); - }); - }, - 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 = $(''); - - content = content.replace(//g, '>'); - content = content.replace(url_regex, '$1'); - - $(textNode).before(dummy); - $(textNode).replaceWith(content); - params[0] = dummy.next('a'); - dummy.remove(); - }, - 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.nodeType == 3) { // text node - var content = this.nodeValue; - - if(content.length < 5) return; - - if(!/(http|https|ftp|news|telnet|irc|mms):\/\//i.test(content)) return; - - thisPlugin.targets.push(this); - } else { - thisPlugin.extractTargets(this); - } - }); - } - }); - - xe.registerPlugin(new AutoLink()); +/** + * @file autolink.js + * @brief javascript code for autolink addon + * @author NHN (developers@xpressengine.com) + */ +(function($){ + var protocol_re = '(https?|ftp|news|telnet|irc|mms)://'; + var domain_re = '(?:[\\w\\-]+\\.)+(?:[a-z]+)'; + var max_255_re = '(?:1[0-9]{2}|2[0-4][0-9]|25[0-5]|[1-9]?[0-9])'; + var ip_re = '(?:'+max_255_re+'\\.){3}'+max_255_re; + var port_re = '(?::([0-9]+))?'; + var user_re = '(?:/~[\\w-]+)?'; + var path_re = '((?:/[\\w!"$-/:-@]+)*)'; + var hash_re = '(?:#([\\w!-@]+))?'; + + var url_regex = new RegExp('('+protocol_re+'('+domain_re+'|'+ip_re+'|localhost'+')'+port_re+user_re+path_re+hash_re+')', 'ig'); + + var AutoLink = xe.createPlugin("autolink", { + targets : [], + init : function() { + this.targets = []; + }, + API_ONREADY : function() { + var thisPlugin = this; + + // extract target text nodes + this.extractTargets($('.xe_content')); + + $(this.targets).each(function(){ + thisPlugin.cast('AUTOLINK', [this]); + }); + }, + 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 = $(''); + + content = content.replace(//g, '>'); + content = content.replace(url_regex, '$1'); + + $(textNode).before(dummy); + $(textNode).replaceWith(content); + params[0] = dummy.next('a'); + dummy.remove(); + }, + 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.nodeType == 3) { // text node + var content = this.nodeValue; + + if(content.length < 5) return; + + if(!/(http|https|ftp|news|telnet|irc|mms):\/\//i.test(content)) return; + + thisPlugin.targets.push(this); + } else { + thisPlugin.extractTargets(this); + } + }); + } + }); + + xe.registerPlugin(new AutoLink()); })(jQuery); \ No newline at end of file diff --git a/addons/autolink/conf/info.xml b/addons/autolink/conf/info.xml index 017183672..3bd566436 100644 --- a/addons/autolink/conf/info.xml +++ b/addons/autolink/conf/info.xml @@ -1,53 +1,53 @@ - - - 자동 링크 애드온 - 自動リンクアドオン - Auto Link - Auto Link - 自动链接插件 - auto vínculo addon - авто ссылка аддон - Auto-Link Addon - 自動連結 - - 글과 댓글의 내용 중 URL 문자열에 링크를 걸어주는 애드온입니다. - - - 書き込み本文とコメントに登録された内容の中、httpで始まる一般文字列に自動にリンクを貼り付け、そのリンクにマウスオーバすると、別ウィンドウ、または同一ウィンドウに開くメニュが現れるアドオンです。 - - - This addon makes a link to a string that starts with http. - - - Addon này sẽ tự động tạo ra một đường Link khi gặp chuỗi kí tự 'http' có trong bài viết. - - - 主题及评论中以http开始的字符串,自动转换为链接。并且鼠标移到链接上方时,将出现可选(新窗/本页面)提示框。 - - - Los comentarios que comienzan con http naeyongjung tema común de la cadena para vincular automáticamente a colgar el puntero del ratón sobre cada uno de los vínculos y saechang Ciudad y aparecen en el menú de add-on de decoración. - - - Комментарии, которые начинаются с http naeyongjung темой общей строки автоматически ссылку повесить мышь над каждой ссылке и saechang Сити и появляться на меню добавить-на украшения. - - - Kommentare beginnen mit http naeyongjung Thema der gemeinsamen String automatisch Link zu hängen Sie mit der Maus über die einzelnen Links und saechang Stadt und auf dem Menü des Add-On Dekoration. - - - 是種可將主題和評論內容中的URL網址字串自動轉換成連結的附加元件。 - - 0.1 - 2008-04-22 - - - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - - + + + 자동 링크 애드온 + 自動リンクアドオン + Auto Link + Auto Link + 自动链接插件 + auto vínculo addon + авто ссылка аддон + Auto-Link Addon + 自動連結 + + 글과 댓글의 내용 중 URL 문자열에 링크를 걸어주는 애드온입니다. + + + 書き込み本文とコメントに登録された内容の中、httpで始まる一般文字列に自動にリンクを貼り付け、そのリンクにマウスオーバすると、別ウィンドウ、または同一ウィンドウに開くメニュが現れるアドオンです。 + + + This addon makes a link to a string that starts with http. + + + Addon này sẽ tự động tạo ra một đường Link khi gặp chuỗi kí tự 'http' có trong bài viết. + + + 主题及评论中以http开始的字符串,自动转换为链接。并且鼠标移到链接上方时,将出现可选(新窗/本页面)提示框。 + + + Los comentarios que comienzan con http naeyongjung tema común de la cadena para vincular automáticamente a colgar el puntero del ratón sobre cada uno de los vínculos y saechang Ciudad y aparecen en el menú de add-on de decoración. + + + Комментарии, которые начинаются с http naeyongjung темой общей строки автоматически ссылку повесить мышь над каждой ссылке и saechang Сити и появляться на меню добавить-на украшения. + + + Kommentare beginnen mit http naeyongjung Thema der gemeinsamen String automatisch Link zu hängen Sie mit der Maus über die einzelnen Links und saechang Stadt und auf dem Menü des Add-On Dekoration. + + + 是種可將主題和評論內容中的URL網址字串自動轉換成連結的附加元件。 + + 0.1 + 2008-04-22 + + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + diff --git a/addons/blogapi/blogapi.addon.php b/addons/blogapi/blogapi.addon.php index 7b294e8e3..6fc86aadc 100644 --- a/addons/blogapi/blogapi.addon.php +++ b/addons/blogapi/blogapi.addon.php @@ -1,468 +1,468 @@ -domain, '', 'mid',$site_module_info->mid, 'act','api'); - - // 헤더에 rsd태그 삽입 - Context::addHtmlHeader(" ".''); - } - - // act가 api가 아니면 그냥 리턴~ - if($_REQUEST['act']!='api') return; - - // 관련 func 파일 읽음 - require_once('./addons/blogapi/blogapi.func.php'); - - // xmlprc 파싱 - // 요청된 xmlrpc를 파싱 - $oXmlParser = new XmlParser(); - $xmlDoc = $oXmlParser->parse(); - - $method_name = $xmlDoc->methodcall->methodname->body; - $params = $xmlDoc->methodcall->params->param; - if($params && !is_array($params)) $params = array($params); - - // 일부 methodname에 대한 호환 - if(in_array($method_name, array('metaWeblog.deletePost', 'metaWeblog.getUsersBlogs', 'metaWeblog.getUserInfo'))) { - $method_name = str_replace('metaWeblog.', 'blogger.', $method_name); - } - - // blogger.deletePost일 경우 첫번째 인자 값 삭제 - if($method_name == 'blogger.deletePost') array_shift($params); - - // user_id, password를 구해서 로그인 시도 - $user_id = trim($params[1]->value->string->body); - $password = trim($params[2]->value->string->body); - - // 모듈 실행전이라면 인증을 처리한다. - if($called_position == 'before_module_init') { - - // member controller을 이용해서 로그인 시도 - if($user_id && $password) { - $oMemberController = &getController('member'); - $output = $oMemberController->doLogin($user_id, $password); - // 로그인 실패시 에러 메시지 출력 - if(!$output->toBool()) { - $content = getXmlRpcFailure(1, $output->getMessage()); - printContent($content); - } - } else { - $content = getXmlRpcFailure(1, 'not logged'); - printContent($content); - } - } - - // 모듈에서 무언가 작업을 하기 전에 blogapi tool의 요청에 대한 처리를 하고 강제 종료한다. - if($called_position == 'before_module_proc') { - - // 글쓰기 권한 체크 (권한명의 경우 약속이 필요할듯..) - if(!$this->grant->write_document) { - printContent( getXmlRpcFailure(1, 'no permission') ); - } - - // 카테고리의 정보를 구해옴 - $oDocumentModel = &getModel('document'); - $category_list = $oDocumentModel->getCategoryList($this->module_srl); - - // 임시 파일 저장 장소 지정 - $tmp_uploaded_path = sprintf('./files/cache/blogapi/%s/%s/', $this->mid, $user_id); - $uploaded_target_path = sprintf('/files/cache/blogapi/%s/%s/', $this->mid, $user_id); - - switch($method_name) { - // 블로그 정보 - case 'blogger.getUsersBlogs' : - $obj->url = getFullSiteUrl(''); - $obj->blogid = $this->mid; - $obj->blogName = $this->module_info->browser_title; - $blog_list = array($obj); - - $content = getXmlRpcResponse($blog_list); - printContent($content); - break; - - // 카테고리 목록 return - case 'metaWeblog.getCategories' : - $category_obj_list = array(); - if($category_list) { - foreach($category_list as $category_srl => $category_info) { - unset($obj); - $obj->description = $category_info->title; - //$obj->htmlUrl = Context::getRequestUri().$this->mid.'/1'; - //$obj->rssUrl= Context::getRequestUri().'rss/'.$this->mid.'/1'; - $obj->title = $category_info->title; - $obj->categoryid = $category_srl; - $category_obj_list[] = $obj; - } - } - - $content = getXmlRpcResponse($category_obj_list); - printContent($content); - break; - - // 파일 업로드 - case 'metaWeblog.newMediaObject' : - // 파일 업로드 권한 체크 - $oFileModel = &getModel('file'); - $file_module_config = $oFileModel->getFileModuleConfig($this->module_srl); - if(is_array($file_module_config->download_grant) && count($file_module_config->download_grant)>0) { - $logged_info = Context::get('logged_info'); - if($logged_info->is_admin != 'Y') { - $is_permitted = false; - for($i=0;$idownload_grant);$i++) { - $group_srl = $file_module_config->download_grant[$i]; - if($logged_info->group_list[$group_srl]) { - $is_permitted = true; - break; - } - } - if(!$is_permitted) printContent( getXmlRpcFailure(1, 'no permission') ); - } - } - - $fileinfo = $params[3]->value->struct->member; - foreach($fileinfo as $key => $val) { - $nodename = $val->name->body; - if($nodename == 'bits') $filedata = base64_decode($val->value->base64->body); - elseif($nodename == 'name') $filename = $val->value->string->body; - } - - $tmp_arr = explode('/',$filename); - $filename = array_pop($tmp_arr); - - if(!is_dir($tmp_uploaded_path)) FileHandler::makeDir($tmp_uploaded_path); - - $target_filename = sprintf('%s%s', $tmp_uploaded_path, $filename); - FileHandler::writeFile($target_filename, $filedata); - $obj->url = Context::getRequestUri().$target_filename; - - $content = getXmlRpcResponse($obj); - printContent($content); - break; - - // 글 가져오기 - case 'metaWeblog.getPost' : - $document_srl = $params[0]->value->string->body; - if(!$document_srl) { - printContent( getXmlRpcFailure(1, 'no permission') ); - } else { - $oDocumentModel = &getModel('document'); - $oDocument = $oDocumentModel->getDocument($document_srl); - if(!$oDocument->isExists() || !$oDocument->isGranted()) { - printContent( getXmlRpcFailure(1, 'no permission') ); - } else { - // 카테고리를 사용하는지 확인후 사용시 카테고리 목록을 구해와서 Context에 세팅 - $category = ""; - if($oDocument->get('category_srl')) { - $oDocumentModel = &getModel('document'); - $category_list = $oDocumentModel->getCategoryList($oDocument->get('module_srl')); - if($category_list[$oDocument->get('category_srl')]) { - $category = $category_list[$oDocument->get('category_srl')]->title; - } - } - - $content = sprintf( - ''. - ''. - ''. - ''. - ''. - ''. - 'categories'. - 'dateCreated%s'. - 'description'. - 'link%s'. - 'postid%s'. - 'title'. - 'publish1'. - ''. - ''. - ''. - ''. - '', - $category, - date("Ymd", $oDocument->getRegdateTime()).'T'.date("H:i:s", $oDocument->getRegdateTime()), - $oDocument->getContent(false, false, true,false), - getFullUrl('','document_srl', $oDocument->document_srl), - $oDocument->document_srl, - $oDocument->getTitleText() - ); - printContent($content); - } - } - break; - - // 글작성 - case 'metaWeblog.newPost' : - unset($obj); - $info = $params[3]; - // 글, 제목, 카테고리 정보 구함 - for($i=0;$ivalue->struct->member);$i++) { - $val = $info->value->struct->member[$i]; - switch($val->name->body) { - case 'title' : - $obj->title = $val->value->string->body; - break; - case 'description' : - $obj->content = $val->value->string->body; - break; - case 'categories' : - $categories = $val->value->array->data->value; - if(!is_array($categories)) $categories = array($categories); - $category = $categories[0]->string->body; - if($category && $category_list) { - foreach($category_list as $category_srl => $category_info) { - if($category_info->title == $category) $obj->category_srl = $category_srl; - } - } - break; - case 'tagwords' : - $tags = $val->value->array->data->value; - if(!is_array($tags)) $tags = array($tags); - for($j=0;$jstring->body; - } - if(count($tag_list)) $obj->tags = implode(',',$tag_list); - break; - } - - } - - // 문서 번호 설정 - $document_srl = getNextSequence(); - $obj->document_srl = $document_srl; - $obj->module_srl = $this->module_srl; - - // 첨부파일 정리 - if(is_dir($tmp_uploaded_path)) { - $file_list = FileHandler::readDir($tmp_uploaded_path); - $file_count = count($file_list); - if($file_count) { - $oFileController = &getController('file'); - for($i=0;$i<$file_count;$i++) { - $file_info['tmp_name'] = sprintf('%s%s', $tmp_uploaded_path, $file_list[$i]); - $file_info['name'] = $file_list[$i]; - $oFileController->insertFile($file_info, $this->module_srl, $document_srl, 0, true); - } - $obj->uploaded_count = $file_count; - } - } - - $obj->content = str_replace($uploaded_target_path,sprintf('/files/attach/images/%s/%s%s', $this->module_srl, getNumberingPath($document_srl,3), $filename), $obj->content); - - $oDocumentController = &getController('document'); - $obj->allow_comment = 'Y'; - $obj->allow_trackback = 'Y'; - $output = $oDocumentController->insertDocument($obj); - - if(!$output->toBool()) { - $content = getXmlRpcFailure(1, $output->getMessage()); - } else { - $content = getXmlRpcResponse(strval($document_srl)); - } - FileHandler::removeDir($tmp_uploaded_path); - - printContent($content); - break; - - // 글 수정 - case 'metaWeblog.editPost' : - $tmp_val = $params[0]->value->string->body; - if(!$tmp_val) $tmp_val = $params[0]->value->i4->body; - if(!$tmp_val) { - $content = getXmlRpcFailure(1, 'no permission'); - break; - } - $tmp_arr = explode('/', $tmp_val); - $document_srl = array_pop($tmp_arr); - if(!$document_srl) { - $content = getXmlRpcFailure(1, 'no permission'); - break; - } - - $oDocumentModel = &getModel('document'); - $oDocument = $oDocumentModel->getDocument($document_srl); - - // 글 수정 권한 체크 - if(!$oDocument->isGranted()) { - $content = getXmlRpcFailure(1, 'no permission'); - break; - } - - $obj = $oDocument->getObjectVars(); - - $info = $params[3]; - - // 글, 제목, 카테고리 정보 구함 - for($i=0;$ivalue->struct->member);$i++) { - $val = $info->value->struct->member[$i]; - switch($val->name->body) { - case 'title' : - $obj->title = $val->value->string->body; - break; - case 'description' : - $obj->content = $val->value->string->body; - break; - case 'categories' : - $categories = $val->value->array->data->value; - if(!is_array($categories)) $categories = array($categories); - $category = $categories[0]->string->body; - if($category && $category_list) { - foreach($category_list as $category_srl => $category_info) { - if($category_info->title == $category) $obj->category_srl = $category_srl; - } - } - break; - case 'tagwords' : - $tags = $val->value->array->data->value; - if(!is_array($tags)) $tags = array($tags); - for($j=0;$jstring->body; - } - if(count($tag_list)) $obj->tags = implode(',',$tag_list); - break; - } - - } - - // 문서 번호 설정 - $obj->document_srl = $document_srl; - $obj->module_srl = $this->module_srl; - - // 첨부파일 정리 - if(is_dir($tmp_uploaded_path)) { - $file_list = FileHandler::readDir($tmp_uploaded_path); - $file_count = count($file_list); - if($file_count) { - $oFileController = &getController('file'); - for($i=0;$i<$file_count;$i++) { - $file_info['tmp_name'] = sprintf('%s%s', $tmp_uploaded_path, $file_list[$i]); - $file_info['name'] = $file_list[$i]; - - $moved_filename = sprintf('./files/attach/images/%s/%s/%s', $this->module_srl, $document_srl, $file_info['name']); - if(file_exists($moved_filename)) continue; - - $oFileController->insertFile($file_info, $this->module_srl, $document_srl, 0, true); - } - $obj->uploaded_count += $file_count; - } - } - - $obj->content = str_replace($uploaded_target_path,sprintf('/files/attach/images/%s/%s%s', $this->module_srl, getNumberingPath($document_srl,3), $filename), $obj->content); - - $oDocumentController = &getController('document'); - $output = $oDocumentController->updateDocument($oDocument,$obj); - - if(!$output->toBool()) { - $content = getXmlRpcFailure(1, $output->getMessage()); - } else { - $content = getXmlRpcResponse(true); - FileHandler::removeDir($tmp_uploaded_path); - } - - printContent($content); - break; - - // 글삭제 - case 'blogger.deletePost' : - $tmp_val = $params[0]->value->string->body; - $tmp_arr = explode('/', $tmp_val); - $document_srl = array_pop($tmp_arr); - - // 글 받아오기 - $oDocumentModel = &getModel('document'); - $oDocument = $oDocumentModel->getDocument($document_srl); - - // 글 존재 - if(!$oDocument->isExists()) { - $content = getXmlRpcFailure(1, 'not exists'); - - // 글 삭제 권한 체크 - } elseif(!$oDocument->isGranted()) { - $content = getXmlRpcFailure(1, 'no permission'); - break; - - // 삭제 - } else { - $oDocumentController = &getController('document'); - $output = $oDocumentController->deleteDocument($document_srl); - if(!$output->toBool()) $content = getXmlRpcFailure(1, $output->getMessage()); - else $content = getXmlRpcResponse(true); - } - - printContent($content); - break; - - // 최신글 받기 - case 'metaWeblog.getRecentPosts' : - // 목록을 구하기 위한 옵션 - $args->module_srl = $this->module_srl; ///< 현재 모듈의 module_srl - $args->page = 1; - $args->list_count = 20; - $args->sort_index = 'list_order'; ///< 소팅 값 - $logged_info = Context::get('logged_info'); - $args->search_target = 'member_srl'; - $args->search_keyword = $logged_info->member_srl; - $output = $oDocumentModel->getDocumentList($args); - if(!$output->toBool() || !$output->data) { - $content = getXmlRpcFailure(1, 'post not founded'); - printContent($content); - } else { - $oEditorController = &getController('editor'); - - $posts = array(); - foreach($output->data as $key => $oDocument) { - $post = null; - $post->categories = array(); - $post->dateCreated = date("Ymd", $oDocument->getRegdateTime()).'T'.date("H:i:s", $oDocument->getRegdateTime()); - $post->description = htmlspecialchars($oEditorController->transComponent($oDocument->getContent(false,false,true,false))); - $post->link = $post->permaLink = getFullUrl('','document_srl',$oDocument->document_srl); - $post->postid = $oDocument->document_srl; - $post->title = htmlspecialchars($oDocument->get('title')); - $post->publish = 1; - $post->userid = $oDocument->get('user_id'); - $post->mt_allow_pings = 0; - $post->mt_allow_comments = $oDocument->allowComment()=='Y'?1:0; - $posts[] = $post; - } - $content = getXmlRpcResponse($posts); - printContent($content); - } - break; - - // 아무런 요청이 없을 경우 RSD 출력 - default : - - $homepagelink = getUrl('','mid',$this->mid); - $site_module_info = Context::get('site_module_info'); - $api_url = getFullSiteUrl($site_module_info->domain, '', 'mid',$site_module_info->mid, 'act','api'); - $content = << - - - XpressEngine - http://www.xpressengine.com/ - {$homepagelink} - - - - - -RSDContent; - printContent($content); - break; - } - } -?> +domain, '', 'mid',$site_module_info->mid, 'act','api'); + + // 헤더에 rsd태그 삽입 + Context::addHtmlHeader(" ".''); + } + + // act가 api가 아니면 그냥 리턴~ + if($_REQUEST['act']!='api') return; + + // 관련 func 파일 읽음 + require_once('./addons/blogapi/blogapi.func.php'); + + // xmlprc 파싱 + // 요청된 xmlrpc를 파싱 + $oXmlParser = new XmlParser(); + $xmlDoc = $oXmlParser->parse(); + + $method_name = $xmlDoc->methodcall->methodname->body; + $params = $xmlDoc->methodcall->params->param; + if($params && !is_array($params)) $params = array($params); + + // 일부 methodname에 대한 호환 + if(in_array($method_name, array('metaWeblog.deletePost', 'metaWeblog.getUsersBlogs', 'metaWeblog.getUserInfo'))) { + $method_name = str_replace('metaWeblog.', 'blogger.', $method_name); + } + + // blogger.deletePost일 경우 첫번째 인자 값 삭제 + if($method_name == 'blogger.deletePost') array_shift($params); + + // user_id, password를 구해서 로그인 시도 + $user_id = trim($params[1]->value->string->body); + $password = trim($params[2]->value->string->body); + + // 모듈 실행전이라면 인증을 처리한다. + if($called_position == 'before_module_init') { + + // member controller을 이용해서 로그인 시도 + if($user_id && $password) { + $oMemberController = &getController('member'); + $output = $oMemberController->doLogin($user_id, $password); + // 로그인 실패시 에러 메시지 출력 + if(!$output->toBool()) { + $content = getXmlRpcFailure(1, $output->getMessage()); + printContent($content); + } + } else { + $content = getXmlRpcFailure(1, 'not logged'); + printContent($content); + } + } + + // 모듈에서 무언가 작업을 하기 전에 blogapi tool의 요청에 대한 처리를 하고 강제 종료한다. + if($called_position == 'before_module_proc') { + + // 글쓰기 권한 체크 (권한명의 경우 약속이 필요할듯..) + if(!$this->grant->write_document) { + printContent( getXmlRpcFailure(1, 'no permission') ); + } + + // 카테고리의 정보를 구해옴 + $oDocumentModel = &getModel('document'); + $category_list = $oDocumentModel->getCategoryList($this->module_srl); + + // 임시 파일 저장 장소 지정 + $tmp_uploaded_path = sprintf('./files/cache/blogapi/%s/%s/', $this->mid, $user_id); + $uploaded_target_path = sprintf('/files/cache/blogapi/%s/%s/', $this->mid, $user_id); + + switch($method_name) { + // 블로그 정보 + case 'blogger.getUsersBlogs' : + $obj->url = getFullSiteUrl(''); + $obj->blogid = $this->mid; + $obj->blogName = $this->module_info->browser_title; + $blog_list = array($obj); + + $content = getXmlRpcResponse($blog_list); + printContent($content); + break; + + // 카테고리 목록 return + case 'metaWeblog.getCategories' : + $category_obj_list = array(); + if($category_list) { + foreach($category_list as $category_srl => $category_info) { + unset($obj); + $obj->description = $category_info->title; + //$obj->htmlUrl = Context::getRequestUri().$this->mid.'/1'; + //$obj->rssUrl= Context::getRequestUri().'rss/'.$this->mid.'/1'; + $obj->title = $category_info->title; + $obj->categoryid = $category_srl; + $category_obj_list[] = $obj; + } + } + + $content = getXmlRpcResponse($category_obj_list); + printContent($content); + break; + + // 파일 업로드 + case 'metaWeblog.newMediaObject' : + // 파일 업로드 권한 체크 + $oFileModel = &getModel('file'); + $file_module_config = $oFileModel->getFileModuleConfig($this->module_srl); + if(is_array($file_module_config->download_grant) && count($file_module_config->download_grant)>0) { + $logged_info = Context::get('logged_info'); + if($logged_info->is_admin != 'Y') { + $is_permitted = false; + for($i=0;$idownload_grant);$i++) { + $group_srl = $file_module_config->download_grant[$i]; + if($logged_info->group_list[$group_srl]) { + $is_permitted = true; + break; + } + } + if(!$is_permitted) printContent( getXmlRpcFailure(1, 'no permission') ); + } + } + + $fileinfo = $params[3]->value->struct->member; + foreach($fileinfo as $key => $val) { + $nodename = $val->name->body; + if($nodename == 'bits') $filedata = base64_decode($val->value->base64->body); + elseif($nodename == 'name') $filename = $val->value->string->body; + } + + $tmp_arr = explode('/',$filename); + $filename = array_pop($tmp_arr); + + if(!is_dir($tmp_uploaded_path)) FileHandler::makeDir($tmp_uploaded_path); + + $target_filename = sprintf('%s%s', $tmp_uploaded_path, $filename); + FileHandler::writeFile($target_filename, $filedata); + $obj->url = Context::getRequestUri().$target_filename; + + $content = getXmlRpcResponse($obj); + printContent($content); + break; + + // 글 가져오기 + case 'metaWeblog.getPost' : + $document_srl = $params[0]->value->string->body; + if(!$document_srl) { + printContent( getXmlRpcFailure(1, 'no permission') ); + } else { + $oDocumentModel = &getModel('document'); + $oDocument = $oDocumentModel->getDocument($document_srl); + if(!$oDocument->isExists() || !$oDocument->isGranted()) { + printContent( getXmlRpcFailure(1, 'no permission') ); + } else { + // 카테고리를 사용하는지 확인후 사용시 카테고리 목록을 구해와서 Context에 세팅 + $category = ""; + if($oDocument->get('category_srl')) { + $oDocumentModel = &getModel('document'); + $category_list = $oDocumentModel->getCategoryList($oDocument->get('module_srl')); + if($category_list[$oDocument->get('category_srl')]) { + $category = $category_list[$oDocument->get('category_srl')]->title; + } + } + + $content = sprintf( + ''. + ''. + ''. + ''. + ''. + ''. + 'categories'. + 'dateCreated%s'. + 'description'. + 'link%s'. + 'postid%s'. + 'title'. + 'publish1'. + ''. + ''. + ''. + ''. + '', + $category, + date("Ymd", $oDocument->getRegdateTime()).'T'.date("H:i:s", $oDocument->getRegdateTime()), + $oDocument->getContent(false, false, true,false), + getFullUrl('','document_srl', $oDocument->document_srl), + $oDocument->document_srl, + $oDocument->getTitleText() + ); + printContent($content); + } + } + break; + + // 글작성 + case 'metaWeblog.newPost' : + unset($obj); + $info = $params[3]; + // 글, 제목, 카테고리 정보 구함 + for($i=0;$ivalue->struct->member);$i++) { + $val = $info->value->struct->member[$i]; + switch($val->name->body) { + case 'title' : + $obj->title = $val->value->string->body; + break; + case 'description' : + $obj->content = $val->value->string->body; + break; + case 'categories' : + $categories = $val->value->array->data->value; + if(!is_array($categories)) $categories = array($categories); + $category = $categories[0]->string->body; + if($category && $category_list) { + foreach($category_list as $category_srl => $category_info) { + if($category_info->title == $category) $obj->category_srl = $category_srl; + } + } + break; + case 'tagwords' : + $tags = $val->value->array->data->value; + if(!is_array($tags)) $tags = array($tags); + for($j=0;$jstring->body; + } + if(count($tag_list)) $obj->tags = implode(',',$tag_list); + break; + } + + } + + // 문서 번호 설정 + $document_srl = getNextSequence(); + $obj->document_srl = $document_srl; + $obj->module_srl = $this->module_srl; + + // 첨부파일 정리 + if(is_dir($tmp_uploaded_path)) { + $file_list = FileHandler::readDir($tmp_uploaded_path); + $file_count = count($file_list); + if($file_count) { + $oFileController = &getController('file'); + for($i=0;$i<$file_count;$i++) { + $file_info['tmp_name'] = sprintf('%s%s', $tmp_uploaded_path, $file_list[$i]); + $file_info['name'] = $file_list[$i]; + $oFileController->insertFile($file_info, $this->module_srl, $document_srl, 0, true); + } + $obj->uploaded_count = $file_count; + } + } + + $obj->content = str_replace($uploaded_target_path,sprintf('/files/attach/images/%s/%s%s', $this->module_srl, getNumberingPath($document_srl,3), $filename), $obj->content); + + $oDocumentController = &getController('document'); + $obj->allow_comment = 'Y'; + $obj->allow_trackback = 'Y'; + $output = $oDocumentController->insertDocument($obj); + + if(!$output->toBool()) { + $content = getXmlRpcFailure(1, $output->getMessage()); + } else { + $content = getXmlRpcResponse(strval($document_srl)); + } + FileHandler::removeDir($tmp_uploaded_path); + + printContent($content); + break; + + // 글 수정 + case 'metaWeblog.editPost' : + $tmp_val = $params[0]->value->string->body; + if(!$tmp_val) $tmp_val = $params[0]->value->i4->body; + if(!$tmp_val) { + $content = getXmlRpcFailure(1, 'no permission'); + break; + } + $tmp_arr = explode('/', $tmp_val); + $document_srl = array_pop($tmp_arr); + if(!$document_srl) { + $content = getXmlRpcFailure(1, 'no permission'); + break; + } + + $oDocumentModel = &getModel('document'); + $oDocument = $oDocumentModel->getDocument($document_srl); + + // 글 수정 권한 체크 + if(!$oDocument->isGranted()) { + $content = getXmlRpcFailure(1, 'no permission'); + break; + } + + $obj = $oDocument->getObjectVars(); + + $info = $params[3]; + + // 글, 제목, 카테고리 정보 구함 + for($i=0;$ivalue->struct->member);$i++) { + $val = $info->value->struct->member[$i]; + switch($val->name->body) { + case 'title' : + $obj->title = $val->value->string->body; + break; + case 'description' : + $obj->content = $val->value->string->body; + break; + case 'categories' : + $categories = $val->value->array->data->value; + if(!is_array($categories)) $categories = array($categories); + $category = $categories[0]->string->body; + if($category && $category_list) { + foreach($category_list as $category_srl => $category_info) { + if($category_info->title == $category) $obj->category_srl = $category_srl; + } + } + break; + case 'tagwords' : + $tags = $val->value->array->data->value; + if(!is_array($tags)) $tags = array($tags); + for($j=0;$jstring->body; + } + if(count($tag_list)) $obj->tags = implode(',',$tag_list); + break; + } + + } + + // 문서 번호 설정 + $obj->document_srl = $document_srl; + $obj->module_srl = $this->module_srl; + + // 첨부파일 정리 + if(is_dir($tmp_uploaded_path)) { + $file_list = FileHandler::readDir($tmp_uploaded_path); + $file_count = count($file_list); + if($file_count) { + $oFileController = &getController('file'); + for($i=0;$i<$file_count;$i++) { + $file_info['tmp_name'] = sprintf('%s%s', $tmp_uploaded_path, $file_list[$i]); + $file_info['name'] = $file_list[$i]; + + $moved_filename = sprintf('./files/attach/images/%s/%s/%s', $this->module_srl, $document_srl, $file_info['name']); + if(file_exists($moved_filename)) continue; + + $oFileController->insertFile($file_info, $this->module_srl, $document_srl, 0, true); + } + $obj->uploaded_count += $file_count; + } + } + + $obj->content = str_replace($uploaded_target_path,sprintf('/files/attach/images/%s/%s%s', $this->module_srl, getNumberingPath($document_srl,3), $filename), $obj->content); + + $oDocumentController = &getController('document'); + $output = $oDocumentController->updateDocument($oDocument,$obj); + + if(!$output->toBool()) { + $content = getXmlRpcFailure(1, $output->getMessage()); + } else { + $content = getXmlRpcResponse(true); + FileHandler::removeDir($tmp_uploaded_path); + } + + printContent($content); + break; + + // 글삭제 + case 'blogger.deletePost' : + $tmp_val = $params[0]->value->string->body; + $tmp_arr = explode('/', $tmp_val); + $document_srl = array_pop($tmp_arr); + + // 글 받아오기 + $oDocumentModel = &getModel('document'); + $oDocument = $oDocumentModel->getDocument($document_srl); + + // 글 존재 + if(!$oDocument->isExists()) { + $content = getXmlRpcFailure(1, 'not exists'); + + // 글 삭제 권한 체크 + } elseif(!$oDocument->isGranted()) { + $content = getXmlRpcFailure(1, 'no permission'); + break; + + // 삭제 + } else { + $oDocumentController = &getController('document'); + $output = $oDocumentController->deleteDocument($document_srl); + if(!$output->toBool()) $content = getXmlRpcFailure(1, $output->getMessage()); + else $content = getXmlRpcResponse(true); + } + + printContent($content); + break; + + // 최신글 받기 + case 'metaWeblog.getRecentPosts' : + // 목록을 구하기 위한 옵션 + $args->module_srl = $this->module_srl; ///< 현재 모듈의 module_srl + $args->page = 1; + $args->list_count = 20; + $args->sort_index = 'list_order'; ///< 소팅 값 + $logged_info = Context::get('logged_info'); + $args->search_target = 'member_srl'; + $args->search_keyword = $logged_info->member_srl; + $output = $oDocumentModel->getDocumentList($args); + if(!$output->toBool() || !$output->data) { + $content = getXmlRpcFailure(1, 'post not founded'); + printContent($content); + } else { + $oEditorController = &getController('editor'); + + $posts = array(); + foreach($output->data as $key => $oDocument) { + $post = null; + $post->categories = array(); + $post->dateCreated = date("Ymd", $oDocument->getRegdateTime()).'T'.date("H:i:s", $oDocument->getRegdateTime()); + $post->description = htmlspecialchars($oEditorController->transComponent($oDocument->getContent(false,false,true,false))); + $post->link = $post->permaLink = getFullUrl('','document_srl',$oDocument->document_srl); + $post->postid = $oDocument->document_srl; + $post->title = htmlspecialchars($oDocument->get('title')); + $post->publish = 1; + $post->userid = $oDocument->get('user_id'); + $post->mt_allow_pings = 0; + $post->mt_allow_comments = $oDocument->allowComment()=='Y'?1:0; + $posts[] = $post; + } + $content = getXmlRpcResponse($posts); + printContent($content); + } + break; + + // 아무런 요청이 없을 경우 RSD 출력 + default : + + $homepagelink = getUrl('','mid',$this->mid); + $site_module_info = Context::get('site_module_info'); + $api_url = getFullSiteUrl($site_module_info->domain, '', 'mid',$site_module_info->mid, 'act','api'); + $content = << + + + XpressEngine + http://www.xpressengine.com/ + {$homepagelink} + + + + + +RSDContent; + printContent($content); + break; + } + } +?> diff --git a/addons/blogapi/blogapi.func.php b/addons/blogapi/blogapi.func.php index 511ac44e3..f89fff237 100644 --- a/addons/blogapi/blogapi.func.php +++ b/addons/blogapi/blogapi.func.php @@ -1,69 +1,69 @@ -\n\n\nfaultCode\n%d\n\n\nfaultString\n%s\n\n\n\n", - $error, - htmlspecialchars($message) - ); - } - - // 결과 표시 - function getXmlRpcResponse($params) { - $buff = ''."\n"; - $buff .= _getEncodedVal($params); - $buff .= "\n\n"; - - return $buff; - } - - // 인코딩 처리 - function _getEncodedVal($val, $is_sub_set = false) { - if(is_int($val)) $buff = sprintf("%d", $val); - elseif(is_string($val)&&preg_match('/^([0-9]+)T([0-9\:]+)$/', $val)) $buff = sprintf("%s\n", $val); - elseif(is_double($val)) $buff = sprintf("%f", $val); - elseif(is_bool($val)) $buff = sprintf("%d", $val?1:0); - elseif(is_object($val)) { - $values = get_object_vars($val); - $val_count = count($values); - $buff = ""; - foreach($values as $k => $v) { - $buff .= sprintf("\n%s\n%s\n", htmlspecialchars($k), _getEncodedVal($v, true)); - } - $buff .= "\n"; - } elseif(is_array($val)) { - $val_count = count($val); - $buff = "\n"; - for($i=0;$i<$val_count;$i++) { - $buff .= _getEncodedVal($val[$i], true); - } - $buff .= "\n"; - } else { - $buff = sprintf("%s\n", $val); - } - if(!$is_sub_set) return sprintf("\n%s", $buff); - return $buff; - } - - // 결과 출력 - function printContent($content) { - header("Content-Type: text/xml; charset=UTF-8"); - header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); - header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); - header("Cache-Control: no-store, no-cache, must-revalidate"); - header("Cache-Control: post-check=0, pre-check=0", false); - header("Pragma: no-cache"); - print $content; - Context::close(); - exit(); - } -?> +\n\n\nfaultCode\n%d\n\n\nfaultString\n%s\n\n\n\n", + $error, + htmlspecialchars($message) + ); + } + + // 결과 표시 + function getXmlRpcResponse($params) { + $buff = ''."\n"; + $buff .= _getEncodedVal($params); + $buff .= "\n\n"; + + return $buff; + } + + // 인코딩 처리 + function _getEncodedVal($val, $is_sub_set = false) { + if(is_int($val)) $buff = sprintf("%d", $val); + elseif(is_string($val)&&preg_match('/^([0-9]+)T([0-9\:]+)$/', $val)) $buff = sprintf("%s\n", $val); + elseif(is_double($val)) $buff = sprintf("%f", $val); + elseif(is_bool($val)) $buff = sprintf("%d", $val?1:0); + elseif(is_object($val)) { + $values = get_object_vars($val); + $val_count = count($values); + $buff = ""; + foreach($values as $k => $v) { + $buff .= sprintf("\n%s\n%s\n", htmlspecialchars($k), _getEncodedVal($v, true)); + } + $buff .= "\n"; + } elseif(is_array($val)) { + $val_count = count($val); + $buff = "\n"; + for($i=0;$i<$val_count;$i++) { + $buff .= _getEncodedVal($val[$i], true); + } + $buff .= "\n"; + } else { + $buff = sprintf("%s\n", $val); + } + if(!$is_sub_set) return sprintf("\n%s", $buff); + return $buff; + } + + // 결과 출력 + function printContent($content) { + header("Content-Type: text/xml; charset=UTF-8"); + header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); + header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); + header("Cache-Control: no-store, no-cache, must-revalidate"); + header("Cache-Control: post-check=0, pre-check=0", false); + header("Pragma: no-cache"); + print $content; + Context::close(); + exit(); + } +?> diff --git a/addons/blogapi/conf/info.xml b/addons/blogapi/conf/info.xml index f533cd4a6..2dcb3c9dd 100644 --- a/addons/blogapi/conf/info.xml +++ b/addons/blogapi/conf/info.xml @@ -1,80 +1,80 @@ - - - BlogAPI 애드온 - BlogAPIアドオン - BlogAPI - Addon for BlogAPI - BlogAPI Addon - Addon für BlogAPI - Addon para BlogAPI - Аддон для BlogAPI - 部落格 API - - metaWeblog를 지원하는 blogApi애드온입니다. - 사용으로 설정하시면 각 모듈마다 RSD 태그를 노출합니다. - api의 주소는 http://설치주소/모듈명/api 입니다. - 사용으로 하셔야 RSD태그 및 api가 동작을 합니다. - - - MetaWeblogをサポートするBlog APIアドオンです。 - 「使用する」にチェックすると各モジュールごとにRSDのアドレスを表示します。 - APIのアドレスは「http://インストールURL/モジュール名/api」です。 - 「使用する」に設定してから、RSDタグ、およびAPIが作動します。 - - - 支持metaWeblog的 blogApi插件。 - 设置为"启用"时,会使每个模块都会显示RSD标签。 - api地址为http://安装地址/模块名/api。 - 把状态设置为"使用"时,才会激活RSD标签及api。 - - - This blogApi addon supports metaWeblog. - By using this option, it lets the RSD tag to be exposed to each module. - URL to the api is http://setup_path/module_name/api. - RSD tag and the api will work only if u use this addon. - - - Addon BlogAPI này hỗ trợ metaWeblog.. - Bằng việc sử dụng tùy chọn này, Tag RSD sẽ được hiển thị đến mỗi Module. - URL cho API có dạng http://setup_path/module_name/api. - RSD Tag và API chỉ làm việc khi Addon này được kích hoạt. - - - Diese blogApi addon metaWeblog unterstützt. - Durch die Verwendung dieser Option, die es ermöglicht RSD Tag ausgesetzt werden jedes Modul. - URL der api ist http://setup_path/module_name/api. - RSD-Tag und dem API arbeiten und nur dann, wenn Sie über dieses Addon. - - - Este blogApi addon soporta el metaWeblog. - Si seleccionas la optión usar, cada módulo entregará la etiqueta RSD. - La dirección de api es http://dirección de la instalación/nombre de módulo/api. - Sólo si seleccionas la opción usar, funcionará la etiqueta RSD y api. - - - Этот blogApi аддон поддерживает metaWeblog. - Используя этот аддон, RSD тег становится доступным для каждого модуля. - URL для api - http://setup_path/module_name/api. - тег RSD и api работают только при включенном аддоне. - - - 支援 MetaWeblog 的部落格 API 附加元件。 - 設置成"啟用"時,會使每個模組都顯示 RSD 圖示。 - API網址是 http://安裝位置/模組名稱/api。 - 將狀態設置成"啟用"時,才可使用 RSD 和 API - - 0.1 - 2007-02-28 - - - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - - + + + BlogAPI 애드온 + BlogAPIアドオン + BlogAPI + Addon for BlogAPI + BlogAPI Addon + Addon für BlogAPI + Addon para BlogAPI + Аддон для BlogAPI + 部落格 API + + metaWeblog를 지원하는 blogApi애드온입니다. + 사용으로 설정하시면 각 모듈마다 RSD 태그를 노출합니다. + api의 주소는 http://설치주소/모듈명/api 입니다. + 사용으로 하셔야 RSD태그 및 api가 동작을 합니다. + + + MetaWeblogをサポートするBlog APIアドオンです。 + 「使用する」にチェックすると各モジュールごとにRSDのアドレスを表示します。 + APIのアドレスは「http://インストールURL/モジュール名/api」です。 + 「使用する」に設定してから、RSDタグ、およびAPIが作動します。 + + + 支持metaWeblog的 blogApi插件。 + 设置为"启用"时,会使每个模块都会显示RSD标签。 + api地址为http://安装地址/模块名/api。 + 把状态设置为"使用"时,才会激活RSD标签及api。 + + + This blogApi addon supports metaWeblog. + By using this option, it lets the RSD tag to be exposed to each module. + URL to the api is http://setup_path/module_name/api. + RSD tag and the api will work only if u use this addon. + + + Addon BlogAPI này hỗ trợ metaWeblog.. + Bằng việc sử dụng tùy chọn này, Tag RSD sẽ được hiển thị đến mỗi Module. + URL cho API có dạng http://setup_path/module_name/api. + RSD Tag và API chỉ làm việc khi Addon này được kích hoạt. + + + Diese blogApi addon metaWeblog unterstützt. + Durch die Verwendung dieser Option, die es ermöglicht RSD Tag ausgesetzt werden jedes Modul. + URL der api ist http://setup_path/module_name/api. + RSD-Tag und dem API arbeiten und nur dann, wenn Sie über dieses Addon. + + + Este blogApi addon soporta el metaWeblog. + Si seleccionas la optión usar, cada módulo entregará la etiqueta RSD. + La dirección de api es http://dirección de la instalación/nombre de módulo/api. + Sólo si seleccionas la opción usar, funcionará la etiqueta RSD y api. + + + Этот blogApi аддон поддерживает metaWeblog. + Используя этот аддон, RSD тег становится доступным для каждого модуля. + URL для api - http://setup_path/module_name/api. + тег RSD и api работают только при включенном аддоне. + + + 支援 MetaWeblog 的部落格 API 附加元件。 + 設置成"啟用"時,會使每個模組都顯示 RSD 圖示。 + API網址是 http://安裝位置/模組名稱/api。 + 將狀態設置成"啟用"時,才可使用 RSD 和 API + + 0.1 + 2007-02-28 + + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + diff --git a/addons/captcha/captcha.addon.php b/addons/captcha/captcha.addon.php index 83dc587f1..4bc424d4e 100644 --- a/addons/captcha/captcha.addon.php +++ b/addons/captcha/captcha.addon.php @@ -1,263 +1,263 @@ -addon_info = $addon_info; - } - - function before_module_proc() - { - if($this->addon_info->act_type == 'everytime' && $_SESSION['captcha_authed']) { - unset($_SESSION['captcha_authed']); - } - } - - function before_module_init(&$ModuleHandler) - { - $logged_info = Context::get('logged_info'); - if($logged_info->is_admin == 'Y' || $logged_info->is_site_admin) return false; - if($this->addon_info->target != 'all' && Context::get('is_logged')) return false; - if($_SESSION['captcha_authed']) return false; - - $target_acts = array('procBoardInsertDocument','procBoardInsertComment','procIssuetrackerInsertIssue','procIssuetrackerInsertHistory','procTextyleInsertComment'); - if($this->addon_info->apply_find_account=='apply') $target_acts[] = 'procMemberFindAccount'; - if($this->addon_info->apply_resend_auth_mail=='apply') $target_acts[] = 'procMemberResendAuthMail'; - if($this->addon_info->apply_signup=='apply') $target_acts[] = 'procMemberInsert'; - - if(Context::getRequestMethod()!='XMLRPC' && Context::getRequestMethod()!=='JSON') - { - Context::addHtmlHeader(''); - Context::addJsFile('./addons/captcha/captcha.js',false, '', null, 'body'); - } - - // 게시판/ 이슈트래커의 글쓰기/댓글쓰기 액션 호출시 세션 비교 - if(!$_SESSION['captcha_authed'] && in_array(Context::get('act'), $target_acts)) { - Context::loadLang('./addons/captcha/lang'); - $ModuleHandler->error = "captcha_denied"; - } - - return true; - } - - function before_module_init_setCaptchaSession() - { - if($_SESSION['captcha_authed']) return false; - - // 언어파일 로드 - Context::loadLang(_XE_PATH_.'addons/captcha/lang'); - - // 키워드 생성 - $arr = range('A','Y'); - shuffle($arr); - $arr = array_slice($arr,0,6); - $_SESSION['captcha_keyword'] = join('', $arr); - - $target = Context::getLang('target_captcha'); - header("Content-Type: text/xml; charset=UTF-8"); - header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); - header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); - header("Cache-Control: no-store, no-cache, must-revalidate"); - header("Cache-Control: post-check=0, pre-check=0", false); - header("Pragma: no-cache"); - printf("\r\n 0\r\n success\r\n \r\n \r\n \r\n \r\n \r\n " - ,Context::getLang('about_captcha') - ,Context::getLang('captcha_reload') - ,Context::getLang('captcha_play') - ,Context::getLang('cmd_input') - ,Context::getLang('cmd_cancel') - ); - Context::close(); - exit(); - } - - function before_module_init_captchaImage() - { - if($_SESSION['captcha_authed']) return false; - - $keyword = $_SESSION['captcha_keyword']; - $im = $this->createCaptchaImage($keyword); - - header("Cache-Control: "); - header("Pragma: "); - header("Content-Type: image/png"); - - imagepng($im); - imagedestroy($im); - - Context::close(); - exit(); - } - - function createCaptchaImage($string) - { - $arr = array(); - for($i=0,$c=strlen($string);$i<$c;$i++) $arr[] = $string{$i}; - - // 글자 하나 사이즈 - $w = 18; - $h = 25; - - // 글자 수 - $c = count($arr); - - // 글자 이미지 - $im = array(); - - // 총사이즈로 바탕 이미지 생성 - $im[] = imagecreate(($w+2)*count($arr), $h); - - $deg = range(-30,30); - shuffle($deg); - - // 글자별 이미지 생성 - foreach($arr as $i => $str) - { - $im[$i+1] = @imagecreate($w, $h); - $background_color = imagecolorallocate($im[$i+1], 255, 255, 255); - $text_color = imagecolorallocate($im[$i+1], 0, 0, 0); - - // 글자폰트(사이즈) 조절 - $ran = range(1,20); - shuffle($ran); - - if(function_exists('imagerotate')) - { - imagestring($im[$i+1], (array_pop($ran)%3)+3, 2, (array_pop($ran)%8), $str, $text_color); - $im[$i+1] = imagerotate($im[$i+1], array_pop($deg), 0); - - $background_color = imagecolorallocate($im[$i+1], 255, 255, 255); - imagecolortransparent($im[$i+1], $background_color); - } - else - { - imagestring($im[$i+1], (array_pop($ran)%3)+3, 2, (array_pop($ran)%4), $str, $text_color); - } - } - - // 각글자 이미지를 합침 - for($i=1;$icreateCaptchaAudio($keyword); - - header('Content-type: audio/mpeg'); - header("Content-Disposition: attachment; filename=\"captcha_audio.mp3\""); - header('Cache-Control: no-store, no-cache, must-revalidate'); - header('Expires: Sun, 1 Jan 2000 12:00:00 GMT'); - header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . 'GMT'); - header('Content-Length: ' . strlen($data)); - - echo $data; - Context::close(); - exit(); - } - - function createCaptchaAudio($string) - { - $data = ''; - $_audio = './addons/captcha/audio/F_%s.mp3'; - for($i=0,$c=strlen($string);$i<$c;$i++) - { - $_data = FileHandler::readFile(sprintf($_audio, $string{$i})); - - $start = rand(5, 68); // 해더 4바이트, 데이터 영역 64바이트 정도 랜덤하게 시작 - $datalen = strlen($_data) - $start - 256; // 마지막 unchanged 256 바이트 - - for($j=$start;$j<$datalen;$j+=64) - { - $ch = ord($_data{$j}); - if($ch<9 || $ch>119) continue; - $_data{$j} = chr($ch+rand(-8,8)); - } - - $data .= $_data; - } - - return $data; - } - - function before_module_init_captchaCompare() - { - if($_SESSION['captcha_authed']) return false; - - if(strtoupper($_SESSION['captcha_keyword']) == strtoupper(Context::get('secret_text'))) $_SESSION['captcha_authed'] = true; - else unset($_SESSION['captcha_authed']); - - header("Content-Type: text/xml; charset=UTF-8"); - header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); - header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); - header("Cache-Control: no-store, no-cache, must-revalidate"); - header("Cache-Control: post-check=0, pre-check=0", false); - header("Pragma: no-cache"); - print("\r\n0\r\nsuccess\r\n"); - - Context::close(); - exit(); - } - } - - $GLOBALS['__AddonCaptcha__'] = new AddonCaptcha; - $GLOBALS['__AddonCaptcha__']->setInfo($addon_info); - } - - $oAddonCaptcha = &$GLOBALS['__AddonCaptcha__']; - - if(method_exists(&$oAddonCaptcha, $called_position)) - { - if(!call_user_func(array(&$oAddonCaptcha, $called_position), &$this)) return false; - } - - $addon_act = Context::get('captcha_action'); - if($addon_act && method_exists(&$oAddonCaptcha, $called_position.'_'.$addon_act)) - { - if(!call_user_func(array(&$oAddonCaptcha, $called_position.'_'.$addon_act), &$this)) return false; - } - -?> +addon_info = $addon_info; + } + + function before_module_proc() + { + if($this->addon_info->act_type == 'everytime' && $_SESSION['captcha_authed']) { + unset($_SESSION['captcha_authed']); + } + } + + function before_module_init(&$ModuleHandler) + { + $logged_info = Context::get('logged_info'); + if($logged_info->is_admin == 'Y' || $logged_info->is_site_admin) return false; + if($this->addon_info->target != 'all' && Context::get('is_logged')) return false; + if($_SESSION['captcha_authed']) return false; + + $target_acts = array('procBoardInsertDocument','procBoardInsertComment','procIssuetrackerInsertIssue','procIssuetrackerInsertHistory','procTextyleInsertComment'); + if($this->addon_info->apply_find_account=='apply') $target_acts[] = 'procMemberFindAccount'; + if($this->addon_info->apply_resend_auth_mail=='apply') $target_acts[] = 'procMemberResendAuthMail'; + if($this->addon_info->apply_signup=='apply') $target_acts[] = 'procMemberInsert'; + + if(Context::getRequestMethod()!='XMLRPC' && Context::getRequestMethod()!=='JSON') + { + Context::addHtmlHeader(''); + Context::addJsFile('./addons/captcha/captcha.js',false, '', null, 'body'); + } + + // 게시판/ 이슈트래커의 글쓰기/댓글쓰기 액션 호출시 세션 비교 + if(!$_SESSION['captcha_authed'] && in_array(Context::get('act'), $target_acts)) { + Context::loadLang('./addons/captcha/lang'); + $ModuleHandler->error = "captcha_denied"; + } + + return true; + } + + function before_module_init_setCaptchaSession() + { + if($_SESSION['captcha_authed']) return false; + + // 언어파일 로드 + Context::loadLang(_XE_PATH_.'addons/captcha/lang'); + + // 키워드 생성 + $arr = range('A','Y'); + shuffle($arr); + $arr = array_slice($arr,0,6); + $_SESSION['captcha_keyword'] = join('', $arr); + + $target = Context::getLang('target_captcha'); + header("Content-Type: text/xml; charset=UTF-8"); + header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); + header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); + header("Cache-Control: no-store, no-cache, must-revalidate"); + header("Cache-Control: post-check=0, pre-check=0", false); + header("Pragma: no-cache"); + printf("\r\n 0\r\n success\r\n \r\n \r\n \r\n \r\n \r\n " + ,Context::getLang('about_captcha') + ,Context::getLang('captcha_reload') + ,Context::getLang('captcha_play') + ,Context::getLang('cmd_input') + ,Context::getLang('cmd_cancel') + ); + Context::close(); + exit(); + } + + function before_module_init_captchaImage() + { + if($_SESSION['captcha_authed']) return false; + + $keyword = $_SESSION['captcha_keyword']; + $im = $this->createCaptchaImage($keyword); + + header("Cache-Control: "); + header("Pragma: "); + header("Content-Type: image/png"); + + imagepng($im); + imagedestroy($im); + + Context::close(); + exit(); + } + + function createCaptchaImage($string) + { + $arr = array(); + for($i=0,$c=strlen($string);$i<$c;$i++) $arr[] = $string{$i}; + + // 글자 하나 사이즈 + $w = 18; + $h = 25; + + // 글자 수 + $c = count($arr); + + // 글자 이미지 + $im = array(); + + // 총사이즈로 바탕 이미지 생성 + $im[] = imagecreate(($w+2)*count($arr), $h); + + $deg = range(-30,30); + shuffle($deg); + + // 글자별 이미지 생성 + foreach($arr as $i => $str) + { + $im[$i+1] = @imagecreate($w, $h); + $background_color = imagecolorallocate($im[$i+1], 255, 255, 255); + $text_color = imagecolorallocate($im[$i+1], 0, 0, 0); + + // 글자폰트(사이즈) 조절 + $ran = range(1,20); + shuffle($ran); + + if(function_exists('imagerotate')) + { + imagestring($im[$i+1], (array_pop($ran)%3)+3, 2, (array_pop($ran)%8), $str, $text_color); + $im[$i+1] = imagerotate($im[$i+1], array_pop($deg), 0); + + $background_color = imagecolorallocate($im[$i+1], 255, 255, 255); + imagecolortransparent($im[$i+1], $background_color); + } + else + { + imagestring($im[$i+1], (array_pop($ran)%3)+3, 2, (array_pop($ran)%4), $str, $text_color); + } + } + + // 각글자 이미지를 합침 + for($i=1;$icreateCaptchaAudio($keyword); + + header('Content-type: audio/mpeg'); + header("Content-Disposition: attachment; filename=\"captcha_audio.mp3\""); + header('Cache-Control: no-store, no-cache, must-revalidate'); + header('Expires: Sun, 1 Jan 2000 12:00:00 GMT'); + header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . 'GMT'); + header('Content-Length: ' . strlen($data)); + + echo $data; + Context::close(); + exit(); + } + + function createCaptchaAudio($string) + { + $data = ''; + $_audio = './addons/captcha/audio/F_%s.mp3'; + for($i=0,$c=strlen($string);$i<$c;$i++) + { + $_data = FileHandler::readFile(sprintf($_audio, $string{$i})); + + $start = rand(5, 68); // 해더 4바이트, 데이터 영역 64바이트 정도 랜덤하게 시작 + $datalen = strlen($_data) - $start - 256; // 마지막 unchanged 256 바이트 + + for($j=$start;$j<$datalen;$j+=64) + { + $ch = ord($_data{$j}); + if($ch<9 || $ch>119) continue; + $_data{$j} = chr($ch+rand(-8,8)); + } + + $data .= $_data; + } + + return $data; + } + + function before_module_init_captchaCompare() + { + if($_SESSION['captcha_authed']) return false; + + if(strtoupper($_SESSION['captcha_keyword']) == strtoupper(Context::get('secret_text'))) $_SESSION['captcha_authed'] = true; + else unset($_SESSION['captcha_authed']); + + header("Content-Type: text/xml; charset=UTF-8"); + header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); + header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); + header("Cache-Control: no-store, no-cache, must-revalidate"); + header("Cache-Control: post-check=0, pre-check=0", false); + header("Pragma: no-cache"); + print("\r\n0\r\nsuccess\r\n"); + + Context::close(); + exit(); + } + } + + $GLOBALS['__AddonCaptcha__'] = new AddonCaptcha; + $GLOBALS['__AddonCaptcha__']->setInfo($addon_info); + } + + $oAddonCaptcha = &$GLOBALS['__AddonCaptcha__']; + + if(method_exists(&$oAddonCaptcha, $called_position)) + { + if(!call_user_func(array(&$oAddonCaptcha, $called_position), &$this)) return false; + } + + $addon_act = Context::get('captcha_action'); + if($addon_act && method_exists(&$oAddonCaptcha, $called_position.'_'.$addon_act)) + { + if(!call_user_func(array(&$oAddonCaptcha, $called_position.'_'.$addon_act), &$this)) return false; + } + +?> diff --git a/addons/captcha/conf/info.xml b/addons/captcha/conf/info.xml index e2353c16b..32e31850e 100644 --- a/addons/captcha/conf/info.xml +++ b/addons/captcha/conf/info.xml @@ -1,222 +1,222 @@ - - - Captcha 애드온 - CAPTCHA - Captcha Addon - 验证码插件 - Captchaアドオン - Аддон Captcha - 圖形驗證 - - 프로그램 글 등록기를 막기 위해 게시판/ issueTracker에서 글/ 댓글을 입력하려 할 때 알파벳을 입력해야 글/댓글이 입력되는 애드온 입니다. - 로그인하지 않은 경우에만 해당됩니다. - - - To block spam written by programs, let users to choose a suitable image to text when writing a posting or comment. - This addon applies only to not-logged-in users. - - - Addon này tạo ra một hình ảnh xác nhận khi đăng kí, gửi bài, hay viết bình luận nếu thành viên không đăng nhập. - Addon này chỉ hoạt động khi được kích hoạt. - - - 为了解决互联网垃圾而开发的验证码机制。 - 非登录用户发布话题或评论时将会弹出验证图片选择框,选择正确的图片才可以正常发布(适用于版面/issueTracker)。 - - - ボット(bot)がプログラムによるスパム行為を防ぐために、掲示板/issueTrackerで書き込み・コメントを登録する際、ランダムな文字や数字の列を画面に表示し、表示されたものと一致した情報を入力した時、登録が出来るようにするアドオンです。 - ログインしてない時だけ、動作します。 - - - To block spam written by programs, let users to choose a suitable image to text when writing a posting or comment. - This addon applies only to not-logged-in users. - - - 可防止機器人程式的垃圾留言,非用戶要發表主題或回覆時,必須要輸入正確圖片中所顯示的文字才能發表。 - - 1.0 - 2010-08-19 - - - NHN - NHN - NHN - NHN - NHN - NHN - NHN - - - - - Captcha 표시 대상 - 应用对象 - Captchaを表示する対象 - 選擇目標 - Captcha Target - Captcha Target - Mục tiêu Captcha hiển thị - 글/댓글 등록시 captcha가 동작할 대상을 정할 수 있습니다. 관리자는 무조건 제외됩니다 - 可以指定验证码应用对象(管理员除外)。 - 管理者を除き、書き込み・コメントを入力する際にcaptchaイメージを見せる対象を設定します。 - 除了管理員,可以選擇圖形驗證應用的對象。 - You may specify targets CAPTCHA work. It's not applied when administrator writes. - 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 - Not logged-in users - Người dùng chưa đăng nhập - - - 모든 사용자 - 所有用户 - すべてのユーザー - 所有用戶 - All users - All users - Tất cả mọi người - - - - 동작 방식 - 验证方式 - 動作方式 - 驗證模式 - How it works - How it works - Sử dụng - "1번만 동작"을 선택하시면 1번만 동작후 상태를 저장해서 다음부터 물어보지 않고 그렇지 않으면 매번 물어보게 됩니다 - "一次"就是每个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. - 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回だけ表示 - 單次 - Chỉ một lần - once - 1 раз - - - 매번 동작 - 每次 - 毎回表示 - 每次 - every time - каждый раз - Luôn sử dụng - - - - 비밀번호 찾기 적용 - 应用到查找密码功能 - 비밀번호 찾기 적용 - 忘記密碼 - applying to an action finding account - 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. - 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 - Not apply - Không áp dụng - - - 적용 - 启用 - 적용 - 開啟 - Apply - Apply - Áp dụng - - - - 인증 메일 재발송 적용 - 应用到认证邮件重新发送功能 - 인증 메일 재발송 적용 - 重寄認證信 - apply to an action resending authmail - 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. - 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 - Not apply - Không áp dụng - - - 적용 - 启用 - 적용 - 開啟 - Apply - Apply - Áp dụng - - - - 회원 가입 적용 - 应用到用户注册表单 - 인증 메일 재발송 적용 - 會員註冊 - Apply to member signup - Apply to member signup - Apply to member signup - 적용으로 하시면 회원가입 기능에도 적용되어 악의적인 봇(또는 프로그램)의 회원가입을 막을 수 있습니다. - 启用此项功能可以有效地拦截自动注册软件的施虐。 - 적용으로 하시면 회원가입 기능에도 적용되어 악의적인 봇(또는 프로그램)의 회원가입을 막을 수 있습니다. - 開啟功能後在註冊時會顯示驗證碼。 - If you set this option as apply, CAPTCHA will work for signup action, too. - If you set this option as apply, CAPTCHA will work for signup action, too. - If you set this option as apply, CAPTCHA will work for signup action, too. - - 적용하지 않음 - 不启用 - 적용하지 않음 - 關閉 - Not apply - Not apply - Không áp dụng - - - 적용 - 启用 - 적용 - 開啟 - Apply - Apply - Áp dụng - - - - + + + Captcha 애드온 + CAPTCHA + Captcha Addon + 验证码插件 + Captchaアドオン + Аддон Captcha + 圖形驗證 + + 프로그램 글 등록기를 막기 위해 게시판/ issueTracker에서 글/ 댓글을 입력하려 할 때 알파벳을 입력해야 글/댓글이 입력되는 애드온 입니다. + 로그인하지 않은 경우에만 해당됩니다. + + + To block spam written by programs, let users to choose a suitable image to text when writing a posting or comment. + This addon applies only to not-logged-in users. + + + Addon này tạo ra một hình ảnh xác nhận khi đăng kí, gửi bài, hay viết bình luận nếu thành viên không đăng nhập. + Addon này chỉ hoạt động khi được kích hoạt. + + + 为了解决互联网垃圾而开发的验证码机制。 + 非登录用户发布话题或评论时将会弹出验证图片选择框,选择正确的图片才可以正常发布(适用于版面/issueTracker)。 + + + ボット(bot)がプログラムによるスパム行為を防ぐために、掲示板/issueTrackerで書き込み・コメントを登録する際、ランダムな文字や数字の列を画面に表示し、表示されたものと一致した情報を入力した時、登録が出来るようにするアドオンです。 + ログインしてない時だけ、動作します。 + + + To block spam written by programs, let users to choose a suitable image to text when writing a posting or comment. + This addon applies only to not-logged-in users. + + + 可防止機器人程式的垃圾留言,非用戶要發表主題或回覆時,必須要輸入正確圖片中所顯示的文字才能發表。 + + 1.0 + 2010-08-19 + + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + + + + Captcha 표시 대상 + 应用对象 + Captchaを表示する対象 + 選擇目標 + Captcha Target + Captcha Target + Mục tiêu Captcha hiển thị + 글/댓글 등록시 captcha가 동작할 대상을 정할 수 있습니다. 관리자는 무조건 제외됩니다 + 可以指定验证码应用对象(管理员除外)。 + 管理者を除き、書き込み・コメントを入力する際にcaptchaイメージを見せる対象を設定します。 + 除了管理員,可以選擇圖形驗證應用的對象。 + You may specify targets CAPTCHA work. It's not applied when administrator writes. + 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 + Not logged-in users + Người dùng chưa đăng nhập + + + 모든 사용자 + 所有用户 + すべてのユーザー + 所有用戶 + All users + All users + Tất cả mọi người + + + + 동작 방식 + 验证方式 + 動作方式 + 驗證模式 + How it works + How it works + Sử dụng + "1번만 동작"을 선택하시면 1번만 동작후 상태를 저장해서 다음부터 물어보지 않고 그렇지 않으면 매번 물어보게 됩니다 + "一次"就是每个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. + 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回だけ表示 + 單次 + Chỉ một lần + once + 1 раз + + + 매번 동작 + 每次 + 毎回表示 + 每次 + every time + каждый раз + Luôn sử dụng + + + + 비밀번호 찾기 적용 + 应用到查找密码功能 + 비밀번호 찾기 적용 + 忘記密碼 + applying to an action finding account + 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. + 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 + Not apply + Không áp dụng + + + 적용 + 启用 + 적용 + 開啟 + Apply + Apply + Áp dụng + + + + 인증 메일 재발송 적용 + 应用到认证邮件重新发送功能 + 인증 메일 재발송 적용 + 重寄認證信 + apply to an action resending authmail + 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. + 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 + Not apply + Không áp dụng + + + 적용 + 启用 + 적용 + 開啟 + Apply + Apply + Áp dụng + + + + 회원 가입 적용 + 应用到用户注册表单 + 인증 메일 재발송 적용 + 會員註冊 + Apply to member signup + Apply to member signup + Apply to member signup + 적용으로 하시면 회원가입 기능에도 적용되어 악의적인 봇(또는 프로그램)의 회원가입을 막을 수 있습니다. + 启用此项功能可以有效地拦截自动注册软件的施虐。 + 적용으로 하시면 회원가입 기능에도 적용되어 악의적인 봇(또는 프로그램)의 회원가입을 막을 수 있습니다. + 開啟功能後在註冊時會顯示驗證碼。 + If you set this option as apply, CAPTCHA will work for signup action, too. + If you set this option as apply, CAPTCHA will work for signup action, too. + If you set this option as apply, CAPTCHA will work for signup action, too. + + 적용하지 않음 + 不启用 + 적용하지 않음 + 關閉 + Not apply + Not apply + Không áp dụng + + + 적용 + 启用 + 적용 + 開啟 + Apply + Apply + Áp dụng + + + + diff --git a/addons/counter/conf/info.xml b/addons/counter/conf/info.xml index 7114c2380..cb60b24ba 100644 --- a/addons/counter/conf/info.xml +++ b/addons/counter/conf/info.xml @@ -1,62 +1,62 @@ - - - 기본 카운터 애드온 - アクセスカウンターアドオン - 网站访问统计 - Counter Addon - Counter Addon - Counter Addon - Addon contador básico - Аддон счетчика - 網站訪問統計 - - XE의 기본 카운터 모듈을 이용하여 접속 정보를 기록합니다. - 이 애드온을 켜셔야 접속 정보 수집이 됩니다. - - - XEのアクセスカウンターモジュールで接続(アクセス)情報を記録します。 - このアドオンを「使用」に設定してから、接続(アクセス)情報が記録されます。 - - - 利用XE的网站访问统计模块记录网站访问信息。 - 把状态设置为"使用"时,才会记录网站访问信息. - - - This addon logs access information based on the basic counter module within XE. - The access information will be collected only if you turn on this addon. - - - Addon này sẽ tổng hợp tất cả những lượt truy cập vào Website qua Module Counter có sẵn bên trong XE. - Thông tin truy nhập chỉ được tập hợp khi bạn bật Addon này.. - - - Dieses Addon-Logs Zugriff auf Informationen basiert auf den grundlegenden Zähler-Modul innerhalb XE. - Der Zugang zu Informationen wird nur erhoben, wenn Sie über dieses Addon. - - - Este addon contador básico de XE permite llevar la información de acceso a la página web de los visitantes. - Es necesario activar este addon para agregar la información de acceso. - - - Этот аддон пишет в лог информацию о доступе к сайту, основанную на базовом модуле счетчика в XE. - Для сбора информации необходимо включить этот аддон. - - - 使用XE的網站訪問統計模組記錄網站訪問資料。 - 將狀態設置成"使用"時,才會紀錄網站訪問資料。 - - 0.1 - 2007-02-28 - - - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - - + + + 기본 카운터 애드온 + アクセスカウンターアドオン + 网站访问统计 + Counter Addon + Counter Addon + Counter Addon + Addon contador básico + Аддон счетчика + 網站訪問統計 + + XE의 기본 카운터 모듈을 이용하여 접속 정보를 기록합니다. + 이 애드온을 켜셔야 접속 정보 수집이 됩니다. + + + XEのアクセスカウンターモジュールで接続(アクセス)情報を記録します。 + このアドオンを「使用」に設定してから、接続(アクセス)情報が記録されます。 + + + 利用XE的网站访问统计模块记录网站访问信息。 + 把状态设置为"使用"时,才会记录网站访问信息. + + + This addon logs access information based on the basic counter module within XE. + The access information will be collected only if you turn on this addon. + + + Addon này sẽ tổng hợp tất cả những lượt truy cập vào Website qua Module Counter có sẵn bên trong XE. + Thông tin truy nhập chỉ được tập hợp khi bạn bật Addon này.. + + + Dieses Addon-Logs Zugriff auf Informationen basiert auf den grundlegenden Zähler-Modul innerhalb XE. + Der Zugang zu Informationen wird nur erhoben, wenn Sie über dieses Addon. + + + Este addon contador básico de XE permite llevar la información de acceso a la página web de los visitantes. + Es necesario activar este addon para agregar la información de acceso. + + + Этот аддон пишет в лог информацию о доступе к сайту, основанную на базовом модуле счетчика в XE. + Для сбора информации необходимо включить этот аддон. + + + 使用XE的網站訪問統計模組記錄網站訪問資料。 + 將狀態設置成"使用"時,才會紀錄網站訪問資料。 + + 0.1 + 2007-02-28 + + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + diff --git a/addons/counter/counter.addon.php b/addons/counter/counter.addon.php index d46ad7b9e..c58bb8f98 100644 --- a/addons/counter/counter.addon.php +++ b/addons/counter/counter.addon.php @@ -1,14 +1,14 @@ -procCounterExecute(); - } -?> +procCounterExecute(); + } +?> diff --git a/addons/member_communication/conf/info.xml b/addons/member_communication/conf/info.xml index 25f3b7677..f58a13b1f 100644 --- a/addons/member_communication/conf/info.xml +++ b/addons/member_communication/conf/info.xml @@ -1,58 +1,58 @@ - - - 커뮤니케이션 - コミュニケーション - 会员交流 - Communication - Truyền thông - 커뮤니케이션 - 커뮤니케이션 - Общение - 交流 - - 커뮤니케이션 모듈의 기능을 활성화 시켜 쪽지나 친구기능을 사용할 수 있도록 해줍니다. - 쪽지, 친구기능등을 사용하기 위해서는 이 애드온을 사용으로 해주시면 됩니다. - - - メッセージ・友達機能を使うにはこのアドオンを「使用」にして下さい。 - - - 此插件可激活短信箱及添加好友功能。 - - - This addon enables communication module in order to use message or friend function. - Please enable this addon in case you want to use those functions. - - - Addon này cho phép sử dụng Module truyền thông để sử dụng tin nhắn hay chức năng bạn bè. - Hãy kích hoạt nếu bạn muốn sử dụng chức năng này. - - - 커뮤니케이션 모듈의 기능을 활성화 시켜 쪽지나 친구기능을 사용할 수 있도록 해줍니다. - 쪽지, 친구기능등을 사용하기 위해서는 이 애드온을 사용으로 해주시면 됩니다. - - - 커뮤니케이션 모듈의 기능을 활성화 시켜 쪽지나 친구기능을 사용할 수 있도록 해줍니다. - 쪽지, 친구기능등을 사용하기 위해서는 이 애드온을 사용으로 해주시면 됩니다. - - - Активизирует модуль Общение, позволяет использование сообщений между друзьями. - - - 讓會員擁有短訊和新增好友功能。 - - 0.1 - 2008-05-28 - - - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - - + + + 커뮤니케이션 + コミュニケーション + 会员交流 + Communication + Truyền thông + 커뮤니케이션 + 커뮤니케이션 + Общение + 交流 + + 커뮤니케이션 모듈의 기능을 활성화 시켜 쪽지나 친구기능을 사용할 수 있도록 해줍니다. + 쪽지, 친구기능등을 사용하기 위해서는 이 애드온을 사용으로 해주시면 됩니다. + + + メッセージ・友達機能を使うにはこのアドオンを「使用」にして下さい。 + + + 此插件可激活短信箱及添加好友功能。 + + + This addon enables communication module in order to use message or friend function. + Please enable this addon in case you want to use those functions. + + + Addon này cho phép sử dụng Module truyền thông để sử dụng tin nhắn hay chức năng bạn bè. + Hãy kích hoạt nếu bạn muốn sử dụng chức năng này. + + + 커뮤니케이션 모듈의 기능을 활성화 시켜 쪽지나 친구기능을 사용할 수 있도록 해줍니다. + 쪽지, 친구기능등을 사용하기 위해서는 이 애드온을 사용으로 해주시면 됩니다. + + + 커뮤니케이션 모듈의 기능을 활성화 시켜 쪽지나 친구기능을 사용할 수 있도록 해줍니다. + 쪽지, 친구기능등을 사용하기 위해서는 이 애드온을 사용으로 해주시면 됩니다. + + + Активизирует модуль Общение, позволяет использование сообщений между друзьями. + + + 讓會員擁有短訊和新增好友功能。 + + 0.1 + 2008-05-28 + + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + diff --git a/addons/member_communication/lang/en.lang.php b/addons/member_communication/lang/en.lang.php index cc9cce249..9ad7af901 100644 --- a/addons/member_communication/lang/en.lang.php +++ b/addons/member_communication/lang/en.lang.php @@ -1,3 +1,3 @@ -alert_new_message_arrived = 'You have a new message. Do you want to check now?'; -?> +alert_new_message_arrived = 'You have a new message. Do you want to check now?'; +?> diff --git a/addons/member_communication/lang/es.lang.php b/addons/member_communication/lang/es.lang.php index 51933d3f8..904702d5b 100644 --- a/addons/member_communication/lang/es.lang.php +++ b/addons/member_communication/lang/es.lang.php @@ -1,3 +1,3 @@ -alert_new_message_arrived = 'Usted tiene un nuevo mensaje. Quiere comprobar ahora?'; -?> +alert_new_message_arrived = 'Usted tiene un nuevo mensaje. Quiere comprobar ahora?'; +?> diff --git a/addons/member_communication/lang/ge.lang.php b/addons/member_communication/lang/ge.lang.php index d9b9dcb81..73894f4d4 100644 --- a/addons/member_communication/lang/ge.lang.php +++ b/addons/member_communication/lang/ge.lang.php @@ -1,3 +1,3 @@ -alert_new_message_arrived = 'Sie haben eine neue Nachricht. Wollen Sie jetzt prüfen, ob?'; -?> +alert_new_message_arrived = 'Sie haben eine neue Nachricht. Wollen Sie jetzt prüfen, ob?'; +?> diff --git a/addons/member_communication/lang/ru.lang.php b/addons/member_communication/lang/ru.lang.php index 4e47c4c23..a12c72ade 100644 --- a/addons/member_communication/lang/ru.lang.php +++ b/addons/member_communication/lang/ru.lang.php @@ -1,9 +1,9 @@ -alert_new_message_arrived = 'У Вас новые сообщения. Проверите сейчас?'; -?> +alert_new_message_arrived = 'У Вас новые сообщения. Проверите сейчас?'; +?> diff --git a/addons/member_communication/lang/vi.lang.php b/addons/member_communication/lang/vi.lang.php index 4015a8be0..02a936361 100644 --- a/addons/member_communication/lang/vi.lang.php +++ b/addons/member_communication/lang/vi.lang.php @@ -1,11 +1,11 @@ -alert_new_message_arrived = 'Bạn có một tin nhắn mới. bạn có muốn kiểm tra ngay bây giờ không?'; -?> +alert_new_message_arrived = 'Bạn có một tin nhắn mới. bạn có muốn kiểm tra ngay bây giờ không?'; +?> diff --git a/addons/member_communication/member_communication.addon.php b/addons/member_communication/member_communication.addon.php index c34822a62..1222339e0 100644 --- a/addons/member_communication/member_communication.addon.php +++ b/addons/member_communication/member_communication.addon.php @@ -1,85 +1,85 @@ -module != 'member') { - - // 커뮤니케이션 모듈의 언어파일을 읽음 - Context::loadLang('./modules/communication/lang'); - - // 회원 로그인 정보중에서 쪽지등의 메뉴를 추가 - $oMemberController = &getController('member'); - $oMemberController->addMemberMenu('dispCommunicationFriend', 'cmd_view_friend'); - $oMemberController->addMemberMenu('dispCommunicationMessages', 'cmd_view_message_box'); - - // 새로운 쪽지에 대한 플래그가 있으면 쪽지 보기 팝업 띄움 - $flag_path = './files/member_extra_info/new_message_flags/'.getNumberingPath($logged_info->member_srl); - $flag_file = sprintf('%s%s', $flag_path, $logged_info->member_srl); - - if(file_exists($flag_file)) { - $new_message_count = FileHandler::readFile($flag_file); - FileHandler::removeFile($flag_file); - Context::loadLang('./addons/member_communication/lang'); - - $script = sprintf('', sprintf(Context::getLang('alert_new_message_arrived'), $new_message_count), Context::getRequestUri().'?module=communication&act=dispCommunicationNewMessage'); - - Context::addHtmlHeader( $script ); - } - - /** - * 기능 수행 : 사용자 이름을 클릭시 요청되는 팝업메뉴의 메뉴에 쪽지 발송, 친구추가등의 링크 추가 - **/ - } elseif($called_position == 'before_module_proc' && $this->act == 'getMemberMenu') { - - $oMemberController = &getController('member'); - $member_srl = Context::get('target_srl'); - $mid = Context::get('cur_mid'); - - // communication 모델 객체 생성 - $oCommunicationModel = &getModel('communication'); - - // 자신이라면 쪽지함 보기 기능 추가 - if($logged_info->member_srl == $member_srl) { - - // 자신의 쪽지함 보기 기능 추가 - $oMemberController->addMemberPopupMenu(getUrl('','mid',$mid,'act','dispCommunicationMessages'), 'cmd_view_message_box', './modules/communication/tpl/images/icon_message_box.gif', 'self'); - - // 친구 목록 보기 - $oMemberController->addMemberPopupMenu(getUrl('','mid',$mid,'act','dispCommunicationFriend'), 'cmd_view_friend', './modules/communication/tpl/images/icon_friend_box.gif', 'self'); - - // 아니라면 쪽지 발송, 친구 등록 추가 - } else { - // 대상 회원의 정보를 가져옴 - $oMemberModel = &getModel('member'); - $target_member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); - if(!$target_member_info->member_srl) return; - - // 로그인된 사용자 정보를 구함 - $logged_info = Context::get('logged_info'); - - // 쪽지 발송 메뉴를 만듬 - if( $logged_info->is_admin == 'Y' || $target_member_info->allow_message =='Y' || ($target_member_info->allow_message == 'F' && $oCommunicationModel->isFriend($member_srl))) - $oMemberController->addMemberPopupMenu(getUrl('','module','communication','act','dispCommunicationSendMessage','receiver_srl',$member_srl), 'cmd_send_message', './modules/communication/tpl/images/icon_write_message.gif', 'popup'); - - // 친구 등록 메뉴를 만듬 (이미 등록된 친구가 아닐 경우) - if(!$oCommunicationModel->isAddedFriend($member_srl)) - $oMemberController->addMemberPopupMenu(getUrl('','module','communication','act','dispCommunicationAddFriend','target_srl',$member_srl), 'cmd_add_friend', './modules/communication/tpl/images/icon_add_friend.gif', 'popup'); - } - } -?> +module != 'member') { + + // 커뮤니케이션 모듈의 언어파일을 읽음 + Context::loadLang('./modules/communication/lang'); + + // 회원 로그인 정보중에서 쪽지등의 메뉴를 추가 + $oMemberController = &getController('member'); + $oMemberController->addMemberMenu('dispCommunicationFriend', 'cmd_view_friend'); + $oMemberController->addMemberMenu('dispCommunicationMessages', 'cmd_view_message_box'); + + // 새로운 쪽지에 대한 플래그가 있으면 쪽지 보기 팝업 띄움 + $flag_path = './files/member_extra_info/new_message_flags/'.getNumberingPath($logged_info->member_srl); + $flag_file = sprintf('%s%s', $flag_path, $logged_info->member_srl); + + if(file_exists($flag_file)) { + $new_message_count = FileHandler::readFile($flag_file); + FileHandler::removeFile($flag_file); + Context::loadLang('./addons/member_communication/lang'); + + $script = sprintf('', sprintf(Context::getLang('alert_new_message_arrived'), $new_message_count), Context::getRequestUri().'?module=communication&act=dispCommunicationNewMessage'); + + Context::addHtmlHeader( $script ); + } + + /** + * 기능 수행 : 사용자 이름을 클릭시 요청되는 팝업메뉴의 메뉴에 쪽지 발송, 친구추가등의 링크 추가 + **/ + } elseif($called_position == 'before_module_proc' && $this->act == 'getMemberMenu') { + + $oMemberController = &getController('member'); + $member_srl = Context::get('target_srl'); + $mid = Context::get('cur_mid'); + + // communication 모델 객체 생성 + $oCommunicationModel = &getModel('communication'); + + // 자신이라면 쪽지함 보기 기능 추가 + if($logged_info->member_srl == $member_srl) { + + // 자신의 쪽지함 보기 기능 추가 + $oMemberController->addMemberPopupMenu(getUrl('','mid',$mid,'act','dispCommunicationMessages'), 'cmd_view_message_box', './modules/communication/tpl/images/icon_message_box.gif', 'self'); + + // 친구 목록 보기 + $oMemberController->addMemberPopupMenu(getUrl('','mid',$mid,'act','dispCommunicationFriend'), 'cmd_view_friend', './modules/communication/tpl/images/icon_friend_box.gif', 'self'); + + // 아니라면 쪽지 발송, 친구 등록 추가 + } else { + // 대상 회원의 정보를 가져옴 + $oMemberModel = &getModel('member'); + $target_member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); + if(!$target_member_info->member_srl) return; + + // 로그인된 사용자 정보를 구함 + $logged_info = Context::get('logged_info'); + + // 쪽지 발송 메뉴를 만듬 + if( $logged_info->is_admin == 'Y' || $target_member_info->allow_message =='Y' || ($target_member_info->allow_message == 'F' && $oCommunicationModel->isFriend($member_srl))) + $oMemberController->addMemberPopupMenu(getUrl('','module','communication','act','dispCommunicationSendMessage','receiver_srl',$member_srl), 'cmd_send_message', './modules/communication/tpl/images/icon_write_message.gif', 'popup'); + + // 친구 등록 메뉴를 만듬 (이미 등록된 친구가 아닐 경우) + if(!$oCommunicationModel->isAddedFriend($member_srl)) + $oMemberController->addMemberPopupMenu(getUrl('','module','communication','act','dispCommunicationAddFriend','target_srl',$member_srl), 'cmd_add_friend', './modules/communication/tpl/images/icon_add_friend.gif', 'popup'); + } + } +?> diff --git a/addons/member_extra_info/conf/info.xml b/addons/member_extra_info/conf/info.xml index 9a82ec315..f75c6d929 100644 --- a/addons/member_extra_info/conf/info.xml +++ b/addons/member_extra_info/conf/info.xml @@ -1,53 +1,53 @@ - - - 회원 확장 정보 출력 - 会員情報拡張表示 - 用户扩展信息 - Extra Member Info - Bổ xung thông tin thành viên - 회원 확장 정보 출력 - 회원 확장 정보 출력 - Экстраинформация о пользователях - 用戶延伸資料 - - 회원이 등록한 이미지이름, 이미지마크를 사용하기 위해서는 이 애드온을 활성화 시키세요. - - - 会員が登録したイメージニックネーム、イメージマークを使うためにはこのアドオンをオンにして下さい。 - - - 此插件将把用户信息中的昵称图片,用户图标,签名等信息显示到页面当中。 - - - This addon displays a member's image name, image mark. - - - Addon này sẽ hiển thị hình ảnh thay thế tên và hình đánh dấu của thành viên. - - - This addon displays a member's image name, image mark. - - - This addon displays a member's image name, image mark. - - - Аддон изображает имя, марку картинки пользователя. - - - 可將用戶資料中的暱稱圖片、用戶圖示、簽名檔等資料顯示到頁面當中。 - - 0.2 - 2007-02-28 - - - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - - + + + 회원 확장 정보 출력 + 会員情報拡張表示 + 用户扩展信息 + Extra Member Info + Bổ xung thông tin thành viên + 회원 확장 정보 출력 + 회원 확장 정보 출력 + Экстраинформация о пользователях + 用戶延伸資料 + + 회원이 등록한 이미지이름, 이미지마크를 사용하기 위해서는 이 애드온을 활성화 시키세요. + + + 会員が登録したイメージニックネーム、イメージマークを使うためにはこのアドオンをオンにして下さい。 + + + 此插件将把用户信息中的昵称图片,用户图标,签名等信息显示到页面当中。 + + + This addon displays a member's image name, image mark. + + + Addon này sẽ hiển thị hình ảnh thay thế tên và hình đánh dấu của thành viên. + + + This addon displays a member's image name, image mark. + + + This addon displays a member's image name, image mark. + + + Аддон изображает имя, марку картинки пользователя. + + + 可將用戶資料中的暱稱圖片、用戶圖示、簽名檔等資料顯示到頁面當中。 + + 0.2 + 2007-02-28 + + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + diff --git a/addons/member_extra_info/member_extra_info.addon.php b/addons/member_extra_info/member_extra_info.addon.php index 585cc3f86..9dfcb9b16 100644 --- a/addons/member_extra_info/member_extra_info.addon.php +++ b/addons/member_extra_info/member_extra_info.addon.php @@ -1,23 +1,23 @@ -.... 로 정의가 된 부분을 찾아 회원번호를 구해서 - * 이미지이름, 이미지마크가 있는지를 확인하여 있으면 내용을 변경해버립니다. - **/ - - /** - * 출력되기 바로 직전일 경우에 이미지이름/이미지마크등을 변경 - **/ - if($called_position != "before_display_content" || Context::get('act')=='dispPageAdminContentModify') return; - - // 회원 이미지이름/ 마크/ 찾아서 대체할 함수를 담고 있는 파일을 include - require_once('./addons/member_extra_info/member_extra_info.lib.php'); - - // 1. 출력문서중에서
content
를 찾아 MemberController::transImageName() 를 이용하여 이미지이름/마크로 변경 - $output = preg_replace_callback('!<(div|span|a)([^\>]*)member_([0-9]+)([^\>]*)>(.*?)\<\/(div|span|a)\>!is', 'memberTransImageName', $output); -?> +.... 로 정의가 된 부분을 찾아 회원번호를 구해서 + * 이미지이름, 이미지마크가 있는지를 확인하여 있으면 내용을 변경해버립니다. + **/ + + /** + * 출력되기 바로 직전일 경우에 이미지이름/이미지마크등을 변경 + **/ + if($called_position != "before_display_content" || Context::get('act')=='dispPageAdminContentModify') return; + + // 회원 이미지이름/ 마크/ 찾아서 대체할 함수를 담고 있는 파일을 include + require_once('./addons/member_extra_info/member_extra_info.lib.php'); + + // 1. 출력문서중에서
content
를 찾아 MemberController::transImageName() 를 이용하여 이미지이름/마크로 변경 + $output = preg_replace_callback('!<(div|span|a)([^\>]*)member_([0-9]+)([^\>]*)>(.*?)\<\/(div|span|a)\>!is', 'memberTransImageName', $output); +?> diff --git a/addons/mobile/classes/hdml.class.php b/addons/mobile/classes/hdml.class.php index 1c3ee4262..bb20afef1 100644 --- a/addons/mobile/classes/hdml.class.php +++ b/addons/mobile/classes/hdml.class.php @@ -1,103 +1,103 @@ -charset); - header("Cache-Control: no-store, no-cache, must-revalidate"); - header("Cache-Control: post-check=0, pre-check=0", false); - header("Pragma: no-cache"); - - print ''; - print "\n"; - print $this->hasChilds()?'':''; - print "\n"; - - if($this->upperUrl) { - $url = $this->upperUrl; - printf('%s', $url->url, $url->text, "\n"); - } - } - - /** - * @brief 제목을 출력 - **/ - function printTitle() { - if($this->totalPage > $this->mobilePage) $titlePageStr = sprintf("(%d/%d)",$this->mobilePage, $this->totalPage); - printf('<%s%s>%s', $this->title,$titlePageStr,"\n"); - } - - /** - * @brief 내용을 출력 - * hasChilds()가 있으면 목록형을 그렇지 않으면 컨텐츠를 출력 - **/ - function printContent() { - if($this->hasChilds()) { - foreach($this->getChilds() as $key => $val) { - if(!$val['link']) continue; - printf('%s%s',Context::getLang('cmd_select'), $val['href'], $val['text'], "\n"); - } - } else { - printf('%s
%s', $this->getContent(),"\n"); - } - } - - /** - * @brief 버튼을 출력함 - **/ - function printBtn() { - // 메뉴 형식 - if($this->hasChilds()) { - if($this->nextUrl) { - $url = $this->nextUrl; - printf('%s%s', $url->text, $url->url, $url->text, "\n"); - } - if($this->prevUrl) { - $url = $this->prevUrl; - printf('%s%s', $url->text, $url->url, $url->text, "\n"); - } - if($this->homeUrl) { - $url = $this->homeUrl; - printf('%s%s', $url->text, $url->url, $url->text, "\n"); - } - // 컨텐츠 형식 - } else { - if($this->nextUrl) { - $url = $this->nextUrl; - printf('%s', $url->text, $url->url, $url->text); - } - if($this->prevUrl) { - $url = $this->prevUrl; - printf('%s', $url->text, $url->url, $url->text); - } - if($this->homeUrl) { - $url = $this->homeUrl; - printf('%s', $url->text, $url->url, $url->text); - } - } - } - - /** - * @brief 푸터 정보를 출력 - **/ - function printFooter() { - print $this->hasChilds()?'
':''; - print "\n"; - print("
"); - } - - } -?> +charset); + header("Cache-Control: no-store, no-cache, must-revalidate"); + header("Cache-Control: post-check=0, pre-check=0", false); + header("Pragma: no-cache"); + + print ''; + print "\n"; + print $this->hasChilds()?'':''; + print "\n"; + + if($this->upperUrl) { + $url = $this->upperUrl; + printf('%s', $url->url, $url->text, "\n"); + } + } + + /** + * @brief 제목을 출력 + **/ + function printTitle() { + if($this->totalPage > $this->mobilePage) $titlePageStr = sprintf("(%d/%d)",$this->mobilePage, $this->totalPage); + printf('<%s%s>%s', $this->title,$titlePageStr,"\n"); + } + + /** + * @brief 내용을 출력 + * hasChilds()가 있으면 목록형을 그렇지 않으면 컨텐츠를 출력 + **/ + function printContent() { + if($this->hasChilds()) { + foreach($this->getChilds() as $key => $val) { + if(!$val['link']) continue; + printf('%s%s',Context::getLang('cmd_select'), $val['href'], $val['text'], "\n"); + } + } else { + printf('%s
%s', $this->getContent(),"\n"); + } + } + + /** + * @brief 버튼을 출력함 + **/ + function printBtn() { + // 메뉴 형식 + if($this->hasChilds()) { + if($this->nextUrl) { + $url = $this->nextUrl; + printf('%s%s', $url->text, $url->url, $url->text, "\n"); + } + if($this->prevUrl) { + $url = $this->prevUrl; + printf('%s%s', $url->text, $url->url, $url->text, "\n"); + } + if($this->homeUrl) { + $url = $this->homeUrl; + printf('%s%s', $url->text, $url->url, $url->text, "\n"); + } + // 컨텐츠 형식 + } else { + if($this->nextUrl) { + $url = $this->nextUrl; + printf('%s', $url->text, $url->url, $url->text); + } + if($this->prevUrl) { + $url = $this->prevUrl; + printf('%s', $url->text, $url->url, $url->text); + } + if($this->homeUrl) { + $url = $this->homeUrl; + printf('%s', $url->text, $url->url, $url->text); + } + } + } + + /** + * @brief 푸터 정보를 출력 + **/ + function printFooter() { + print $this->hasChilds()?'
':''; + print "\n"; + print("
"); + } + + } +?> diff --git a/addons/mobile/classes/mhtml.class.php b/addons/mobile/classes/mhtml.class.php index 5b1b55ce6..32626e155 100644 --- a/addons/mobile/classes/mhtml.class.php +++ b/addons/mobile/classes/mhtml.class.php @@ -1,82 +1,82 @@ -\n"); - if($this->totalPage > $this->mobilePage) $titlePageStr = sprintf("(%d/%d)",$this->mobilePage, $this->totalPage); - printf("%s%s\n", htmlspecialchars($this->title),htmlspecialchars($titlePageStr)); - } - - // 제목을 출력 - function printTitle() { - if($this->totalPage > $this->mobilePage) $titlePageStr = sprintf("(%d/%d)",$this->mobilePage, $this->totalPage); - printf('<%s%s>
%s', htmlspecialchars($this->title),htmlspecialchars($titlePageStr),"\n"); - } - - /** - * @brief 내용을 출력 - * hasChilds()가 있으면 목록형을 그렇지 않으면 컨텐츠를 출력 - **/ - function printContent() { - if($this->hasChilds()) { - foreach($this->getChilds() as $key => $val) { - if(!$val['link']) continue; - printf('%s
%s', $val['href'], $this->getNo(), $val['text'], "\n"); - if($val['extra']) printf("
%s\n",str_replace('
','
',$val['extra'])); - } - } else { - print(str_replace('
','
',$this->getContent())."\n"); - } - print "

"; - } - - /** - * @brief 버튼을 출력함 - **/ - function printBtn() { - if($this->nextUrl) { - $url = $this->nextUrl; - printf('%s
%s', $url->url, $url->text, "\n"); - } - if($this->prevUrl) { - $url = $this->prevUrl; - printf('%s
%s', $url->url, $url->text, "\n"); - } - // 언어선택 - if(!parent::isLangChange()){ - $url = getUrl('','lcm','1','sel_lang',Context::getLangType(),'return_uri',Context::get('current_url')); - printf('%s
%s', $url, 'Language : '.Context::getLang('select_lang'), "\n"); - } - else { - printf('%s
%s', Context::get('return_uri'), Context::getLang('lang_return'), "\n"); - } - if($this->upperUrl) { - $url = $this->upperUrl; - printf('%s', $url->url, $url->text, "\n"); - } - if($this->homeUrl) { - $url = $this->homeUrl; - printf('%s
%s', $url->text, $url->url, $url->text, "\n"); - } - } - - // 푸터 정보를 출력 - function printFooter() { - print("\n"); - } - } -?> +\n"); + if($this->totalPage > $this->mobilePage) $titlePageStr = sprintf("(%d/%d)",$this->mobilePage, $this->totalPage); + printf("%s%s\n", htmlspecialchars($this->title),htmlspecialchars($titlePageStr)); + } + + // 제목을 출력 + function printTitle() { + if($this->totalPage > $this->mobilePage) $titlePageStr = sprintf("(%d/%d)",$this->mobilePage, $this->totalPage); + printf('<%s%s>
%s', htmlspecialchars($this->title),htmlspecialchars($titlePageStr),"\n"); + } + + /** + * @brief 내용을 출력 + * hasChilds()가 있으면 목록형을 그렇지 않으면 컨텐츠를 출력 + **/ + function printContent() { + if($this->hasChilds()) { + foreach($this->getChilds() as $key => $val) { + if(!$val['link']) continue; + printf('%s
%s', $val['href'], $this->getNo(), $val['text'], "\n"); + if($val['extra']) printf("
%s\n",str_replace('
','
',$val['extra'])); + } + } else { + print(str_replace('
','
',$this->getContent())."\n"); + } + print "

"; + } + + /** + * @brief 버튼을 출력함 + **/ + function printBtn() { + if($this->nextUrl) { + $url = $this->nextUrl; + printf('%s
%s', $url->url, $url->text, "\n"); + } + if($this->prevUrl) { + $url = $this->prevUrl; + printf('%s
%s', $url->url, $url->text, "\n"); + } + // 언어선택 + if(!parent::isLangChange()){ + $url = getUrl('','lcm','1','sel_lang',Context::getLangType(),'return_uri',Context::get('current_url')); + printf('%s
%s', $url, 'Language : '.Context::getLang('select_lang'), "\n"); + } + else { + printf('%s
%s', Context::get('return_uri'), Context::getLang('lang_return'), "\n"); + } + if($this->upperUrl) { + $url = $this->upperUrl; + printf('%s', $url->url, $url->text, "\n"); + } + if($this->homeUrl) { + $url = $this->homeUrl; + printf('%s
%s', $url->text, $url->url, $url->text, "\n"); + } + } + + // 푸터 정보를 출력 + function printFooter() { + print("\n"); + } + } +?> diff --git a/addons/mobile/classes/mobile.class.php b/addons/mobile/classes/mobile.class.php index e6f7f6435..5fb4a843a 100644 --- a/addons/mobile/classes/mobile.class.php +++ b/addons/mobile/classes/mobile.class.php @@ -1,598 +1,598 @@ -lang = FileHandler::readFile('./files/cache/addons/mobile/setLangType/personal_settings/'.md5(trim($_SERVER['HTTP_USER_AGENT']).trim($_SERVER['HTTP_PHONE_NUMBER']).trim($_SERVER['HTTP_HTTP_PHONE_NUMBER'])).'.php'); - if($this->lang) { - $lang_supported = Context::get('lang_supported'); - $this->lang = str_replace(array(''),array('',''),$this->lang); - if(isset($lang_supported[$this->lang])) Context::setLangType($this->lang); - } - Context::loadLang(_XE_PATH_.'addons/mobile/lang'); - - $instance = new wap(); - - $mobilePage = (int)Context::get('mpage'); - if(!$mobilePage) $mobilePage = 1; - - $instance->setMobilePage($mobilePage); - - } - - return $instance; - } - - /** - * @brief constructor - **/ - function mobileXE() { - // navigation mode 체크 - if(Context::get('nm')) { - $this->navigationMode = 1; - $this->cmid = (int)Context::get('cmid'); - } - - if(Context::get('lcm')) { - $this->languageMode = 1; - $this->lang = Context::get('sel_lang'); - } - } - - /** - * @brief navigation mode 체크 - * navigationMode 세팅과 모듈 정보의 menu_srl이 있어야 navigation mode = true로 return - **/ - function isNavigationMode() { - return ($this->navigationMode && $this->module_info->menu_srl)?true:false; - } - - /** - * @brief langchange mode 체크 - * languageMode 세팅 있어야 true return - **/ - function isLangChange() { - if($this->languageMode) return true; - else return false; - } - - /** - * @brief 언어 설정 - * 쿠키가 안되기 때문에 휴대전화마다 고유한 파일로 언어설정을 저장하는 파일 생성 - **/ - function setLangType() { - $lang_supported = Context::get('lang_supported'); - // 언어 변수가 있는지 확인하고 변수가 유효한지 확인 - if($this->lang && isset($lang_supported[$this->lang])) { - $langbuff = FileHandler::readFile('./files/cache/addons/mobile/setLangType/personal_settings/'.md5(trim($_SERVER['HTTP_USER_AGENT']).trim($_SERVER['HTTP_PHONE_NUMBER']).trim($_SERVER['HTTP_HTTP_PHONE_NUMBER'])).'.php'); - if($langbuff) FileHandler::removeFile('./files/cache/addons/mobile/setLangType/personal_settings/'.md5(trim($_SERVER['HTTP_USER_AGENT']).trim($_SERVER['HTTP_PHONE_NUMBER']).trim($_SERVER['HTTP_HTTP_PHONE_NUMBER'])).'.php'); - $langbuff = 'lang.'**/ ?>'; - FileHandler::writeFile('./files/cache/addons/mobile/setLangType/personal_settings/'.md5(trim($_SERVER['HTTP_USER_AGENT']).trim($_SERVER['HTTP_PHONE_NUMBER']).trim($_SERVER['HTTP_HTTP_PHONE_NUMBER'])).'.php',$langbuff); - } - } - - /** - * @brief 현재 요청된 모듈 정보 세팅 - **/ - function setModuleInfo(&$module_info) { - if($this->module_info) return; - $this->module_info = $module_info; - } - - /** - * @brief 현재 실행중인 모듈 instance 세팅 - **/ - function setModuleInstance(&$oModule) { - if($this->oModule) return; - - // instance 저장 - $this->oModule = $oModule; - - // 현재 모듈의 메뉴가 설정되어 있으면 메뉴 정리 - $menu_cache_file = sprintf(_XE_PATH_.'files/cache/menu/%d.php', $this->module_info->menu_srl); - if(!file_exists($menu_cache_file)) return; - - include $menu_cache_file; - - // 정리된 menu들을 1차원으로 변경 - $this->getListedItems($menu->list, $listed_items, $node_list); - - $this->listed_items = $listed_items; - $this->node_list = $node_list; - $this->menu = $menu->list; - - $k = array_keys($node_list); - $v = array_values($node_list); - $this->index_mid = $k[0]; - - // 현재 메뉴의 depth가 1이상이면 상위 버튼을 지정 - $cur_menu_item = $listed_items[$node_list[$this->module_info->mid]]; - if($cur_menu_item['parent_srl']) { - $parent_srl = $cur_menu_item['parent_srl']; - if($parent_srl && $listed_items[$parent_srl]) { - $parent_item = $listed_items[$parent_srl]; - if($parent_item) $this->setUpperUrl(getUrl('','mid',$parent_item['mid']), Context::getLang('cmd_go_upper')); - } - } elseif (!$this->isNavigationMode()) { - $this->setUpperUrl(getUrl('','mid',$this->index_mid,'nm','1','cmid',0), Context::getLang('cmd_view_sitemap')); - } - } - - /** - * @brief 접속 브라우저의 헤더를 판단하여 브라우저 타입을 return - * 모바일 브라우저가 아닐 경우 null return - **/ - function getBrowserType() { - if(Context::get('smartphone')) return null; - // 브라우저 타입을 판별 - $browserAccept = $_SERVER['HTTP_ACCEPT']; - $userAgent = $_SERVER['HTTP_USER_AGENT']; - $wap_sid = $_SERVER['HTTP_X_UP_SUBNO']; - - if(eregi("SKT11", $userAgent) || eregi("skt", $browserAccept)) { - Context::set('mobile_skt',1); - return "wml"; - } - elseif(eregi("hdml", $browserAccept)) return "hdml"; - elseif(eregi("CellPhone", $userAgent)) return "mhtml"; - return null; - } - - /** - * @brief charset 지정 - **/ - function setCharSet($charset = 'UTF-8') { - if(!$charset) $charset = 'UTF-8'; - - //SKT는 euc-kr만 지원 - if(Context::get('mobile_skt')==1) $charset = 'euc-kr'; - - $this->charset = $charset; - } - - /** - * @brief 모바일 기기의 용량 제한에 다른 가상 페이지 지정 - **/ - function setMobilePage($page=1) { - if(!$page) $page = 1; - $this->mobilePage = $page; - } - - /** - * @brief 목록형 데이터 설정을 위한 child menu지정 - **/ - function setChilds($childs) { - // menu개수가 9개 이상일 경우 자체 페이징 처리 - $menu_count = count($childs); - if($menu_count>9) { - $startNum = ($this->mobilePage-1)*9; - $idx = 0; - $new_childs = array(); - foreach($childs as $k => $v) { - if($idx >= $startNum && $idx < $startNum+9) { - $new_childs[$k] = $v; - } - $idx ++; - } - $childs = $new_childs; - - $this->totalPage = (int)(($menu_count-1)/9)+1; - - // next/prevUrl 지정 - if($this->mobilePage>1) { - $url = getUrl('mid',$_GET['mid'],'mpage',$this->mobilePage-1); - $text = sprintf('%s (%d/%d)', Context::getLang('cmd_prev'), $this->mobilePage-1, $this->totalPage); - $this->setPrevUrl($url, $text); - } - - if($this->mobilePage<$this->totalPage) { - $url = getUrl('mid',$_GET['mid'],'mpage',$this->mobilePage+1); - $text = sprintf('%s (%d/%d)', Context::getLang('cmd_next'), $this->mobilePage+1, $this->totalPage); - $this->setNextUrl($url, $text); - } - } - $this->childs = $childs; - } - - /** - * @brief menu 출력대상이 있는지 확인 - **/ - function hasChilds() { - return count($this->childs)?true:0; - } - - /** - * @brief child menu반환 - **/ - function getChilds() { - return $this->childs; - } - - /** - * @brief title 지정 - **/ - function setTitle($title) { - $oModuleController = &getController('module'); - $this->title = $title; - $oModuleController->replaceDefinedLangCode($this->title); - } - - /** - * @brief title 반환 - **/ - function getTitle() { - return $this->title; - } - - /** - * @brief 컨텐츠 정리 - * HTML 컨텐츠에서 텍스트와 링크만 추출하는 기능 - **/ - function setContent($content) { - $oModuleController = &getController('module'); - $allow_tag_array = array('','
','

','','','','','','','','','',' + + + + + + "; + //list = ""; e.append(jQuery(list)); } diff --git a/modules/install/tpl/js/jquery-1.5.2.min.js b/modules/install/tpl/js/jquery-1.5.2.min.js new file mode 100644 index 000000000..f78f96a12 --- /dev/null +++ b/modules/install/tpl/js/jquery-1.5.2.min.js @@ -0,0 +1,16 @@ +/*! + * jQuery JavaScript Library v1.5.2 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Thu Mar 31 15:28:23 2011 -0400 + */ +(function(a,b){function ci(a){return d.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cf(a){if(!b_[a]){var b=d("<"+a+">").appendTo("body"),c=b.css("display");b.remove();if(c==="none"||c==="")c="block";b_[a]=c}return b_[a]}function ce(a,b){var c={};d.each(cd.concat.apply([],cd.slice(0,b)),function(){c[this]=a});return c}function b$(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function bZ(){try{return new a.XMLHttpRequest}catch(b){}}function bY(){d(a).unload(function(){for(var a in bW)bW[a](0,1)})}function bS(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var e=a.dataTypes,f={},g,h,i=e.length,j,k=e[0],l,m,n,o,p;for(g=1;g=0===c})}function P(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function H(a,b){return(a&&a!=="*"?a+".":"")+b.replace(t,"`").replace(u,"&")}function G(a){var b,c,e,f,g,h,i,j,k,l,m,n,o,p=[],q=[],s=d._data(this,"events");if(a.liveFired!==this&&s&&s.live&&!a.target.disabled&&(!a.button||a.type!=="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var t=s.live.slice(0);for(i=0;ic)break;a.currentTarget=f.elem,a.data=f.handleObj.data,a.handleObj=f.handleObj,o=f.handleObj.origHandler.apply(f.elem,arguments);if(o===!1||a.isPropagationStopped()){c=f.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function E(a,c,e){var f=d.extend({},e[0]);f.type=a,f.originalEvent={},f.liveFired=b,d.event.handle.call(c,f),f.isDefaultPrevented()&&e[0].preventDefault()}function y(){return!0}function x(){return!1}function i(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function h(a,c,e){if(e===b&&a.nodeType===1){e=a.getAttribute("data-"+c);if(typeof e==="string"){try{e=e==="true"?!0:e==="false"?!1:e==="null"?null:d.isNaN(e)?g.test(e)?d.parseJSON(e):e:parseFloat(e)}catch(f){}d.data(a,c,e)}else e=b}return e}var c=a.document,d=function(){function G(){if(!d.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(G,1);return}d.ready()}}var d=function(a,b){return new d.fn.init(a,b,g)},e=a.jQuery,f=a.$,g,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,i=/\S/,j=/^\s+/,k=/\s+$/,l=/\d/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=navigator.userAgent,w,x,y,z=Object.prototype.toString,A=Object.prototype.hasOwnProperty,B=Array.prototype.push,C=Array.prototype.slice,D=String.prototype.trim,E=Array.prototype.indexOf,F={};d.fn=d.prototype={constructor:d,init:function(a,e,f){var g,i,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!e&&c.body){this.context=c,this[0]=c.body,this.selector="body",this.length=1;return this}if(typeof a==="string"){g=h.exec(a);if(!g||!g[1]&&e)return!e||e.jquery?(e||f).find(a):this.constructor(e).find(a);if(g[1]){e=e instanceof d?e[0]:e,k=e?e.ownerDocument||e:c,j=m.exec(a),j?d.isPlainObject(e)?(a=[c.createElement(j[1])],d.fn.attr.call(a,e,!0)):a=[k.createElement(j[1])]:(j=d.buildFragment([g[1]],[k]),a=(j.cacheable?d.clone(j.fragment):j.fragment).childNodes);return d.merge(this,a)}i=c.getElementById(g[2]);if(i&&i.parentNode){if(i.id!==g[2])return f.find(a);this.length=1,this[0]=i}this.context=c,this.selector=a;return this}if(d.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return d.makeArray(a,this)},selector:"",jquery:"1.5.2",length:0,size:function(){return this.length},toArray:function(){return C.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var e=this.constructor();d.isArray(a)?B.apply(e,a):d.merge(e,a),e.prevObject=this,e.context=this.context,b==="find"?e.selector=this.selector+(this.selector?" ":"")+c:b&&(e.selector=this.selector+"."+b+"("+c+")");return e},each:function(a,b){return d.each(this,a,b)},ready:function(a){d.bindReady(),x.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(C.apply(this,arguments),"slice",C.call(arguments).join(","))},map:function(a){return this.pushStack(d.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:B,sort:[].sort,splice:[].splice},d.fn.init.prototype=d.fn,d.extend=d.fn.extend=function(){var a,c,e,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i==="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!=="object"&&!d.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;x.resolveWith(c,[d]),d.fn.trigger&&d(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!x){x=d._Deferred();if(c.readyState==="complete")return setTimeout(d.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",y,!1),a.addEventListener("load",d.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",y),a.attachEvent("onload",d.ready);var b=!1;try{b=a.frameElement==null}catch(e){}c.documentElement.doScroll&&b&&G()}}},isFunction:function(a){return d.type(a)==="function"},isArray:Array.isArray||function(a){return d.type(a)==="array"},isWindow:function(a){return a&&typeof a==="object"&&"setInterval"in a},isNaN:function(a){return a==null||!l.test(a)||isNaN(a)},type:function(a){return a==null?String(a):F[z.call(a)]||"object"},isPlainObject:function(a){if(!a||d.type(a)!=="object"||a.nodeType||d.isWindow(a))return!1;if(a.constructor&&!A.call(a,"constructor")&&!A.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a){}return c===b||A.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!=="string"||!b)return null;b=d.trim(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return a.JSON&&a.JSON.parse?a.JSON.parse(b):(new Function("return "+b))();d.error("Invalid JSON: "+b)},parseXML:function(b,c,e){a.DOMParser?(e=new DOMParser,c=e.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),e=c.documentElement,(!e||!e.nodeName||e.nodeName==="parsererror")&&d.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(a){if(a&&i.test(a)){var b=c.head||c.getElementsByTagName("head")[0]||c.documentElement,e=c.createElement("script");d.support.scriptEval()?e.appendChild(c.createTextNode(a)):e.text=a,b.insertBefore(e,b.firstChild),b.removeChild(e)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,e){var f,g=0,h=a.length,i=h===b||d.isFunction(a);if(e){if(i){for(f in a)if(c.apply(a[f],e)===!1)break}else for(;g1?f.call(arguments,0):c,--g||h.resolveWith(h,f.call(b,0))}}var b=arguments,c=0,e=b.length,g=e,h=e<=1&&a&&d.isFunction(a.promise)?a:d.Deferred();if(e>1){for(;c
'); - - - // 링크/ 줄바꿈, 강조만 제외하고 모든 태그 제거 - $content = strip_tags($content, implode($allow_tag_array)); - - // 탭 여백 제거 - $content = str_replace("\t", "", $content); - - // 2번 이상 반복되는 공백과 줄나눔을 제거 - $content = preg_replace('/( ){2,}/s', '', $content); - $content = preg_replace("/([\r\n]+)/s", "\r\n", $content); - $content = preg_replace(array("/","
"), array("
","
"), $content); - - while(strpos($content, '

')) { - $content = str_replace('

','
',$content); - } - - // 모바일의 경우 한 덱에 필요한 사이즈가 적어서 내용을 모두 페이지로 나눔 - $contents = array(); - while($content) { - $tmp = $this->cutStr($content, $this->deckSize, ''); - $contents[] = $tmp; - $content = substr($content, strlen($tmp)); - - //$content = str_replace(array('&','<','>','"','&nbsp;'), array('&','<','>','"',' '), $content); - - foreach($allow_tag_array as $tag) { - if($tag == '
') continue; - $tag_open_pos = strpos($content, str_replace('>','',$tag)); - $tag_close_pos = strpos($content, str_replace('<','totalPage = count($contents); - - // next/prevUrl 지정 - if($this->mobilePage>1) { - $url = getUrl('mid',$_GET['mid'],'mpage',$this->mobilePage-1); - $text = sprintf('%s (%d/%d)', Context::getLang('cmd_prev'), $this->mobilePage-1, $this->totalPage); - $this->setPrevUrl($url, $text); - } - - if($this->mobilePage<$this->totalPage) { - $url = getUrl('mid',$_GET['mid'],'mpage',$this->mobilePage+1); - $text = sprintf('%s (%d/%d)', Context::getLang('cmd_next'), $this->mobilePage+1, $this->totalPage); - $this->setNextUrl($url, $text); - } - - $this->content = $contents[$this->mobilePage-1]; - $oModuleController->replaceDefinedLangCode($this->content); - $content = str_replace(array('$','\''), array('$$','''), $content); - } - - /** - * @brief byte수로 자르는 함수 - **/ - function cutStr($string, $cut_size) { - return preg_match('/.{'.$cut_size.'}/su', $string, $arr) ? $arr[0] : $string; - } - - /** - * @brief 컨텐츠 반환 - **/ - function getContent() { - return $this->content; - } - - /** - * @brief home url 지정 - **/ - function setHomeUrl($url, $text) { - if(!$url) $url = '#'; - $this->homeUrl->url = $url; - $this->homeUrl->text = $text; - } - - /** - * @brief upper url 지정 - **/ - function setUpperUrl($url, $text) { - if(!$url) $url = '#'; - $this->upperUrl->url = $url; - $this->upperUrl->text = $text; - } - - /** - * @brief prev url 지정 - **/ - function setPrevUrl($url, $text) { - if(!$url) $url = '#'; - $this->prevUrl->url = $url; - $this->prevUrl->text = $text; - } - - /** - * @brief next url 지정 - **/ - function setNextUrl($url, $text) { - if(!$url) $url = '#'; - $this->nextUrl->url = $url; - $this->nextUrl->text = $text; - } - - /** - * @brief 다음, 이전, 상위 이외에 기타 버튼 지정 - **/ - function setEtcBtn($url, $text) { - if(!$url) $url = '#'; - $etc['url'] = $url; - $etc['text'] = htmlspecialchars($text); - $this->etcBtn[] = $etc; - } - - /** - * @brief display - **/ - function display() { - // 홈버튼 지정 - $this->setHomeUrl(getUrl(), Context::getLang('cmd_go_home')); - - // 제목 지정 - if(!$this->title) $this->setTitle(Context::getBrowserTitle()); - - ob_start(); - - // 헤더를 출력 - $this->printHeader(); - - // 제목을 출력 - $this->printTitle(); - - // 내용 출력 - $this->printContent(); - - // 버튼 출력 - $this->printBtn(); - - // 푸터를 출력 - $this->printFooter(); - - $content = ob_get_clean(); - - // 변환 후 출력 - if(strtolower($this->charset) == 'utf-8') print $content; - else print iconv('UTF-8',$this->charset."//TRANSLIT//IGNORE", $content); - - exit(); - } - - /** - * @brief 페이지 이동 - **/ - function movepage($url) { - header("location:$url"); - exit(); - } - - /** - * @brief 목록등에서 일련 번호를 리턴한다 - **/ - function getNo() { - $this->no++; - $str = $this->no; - return $str; - } - - /** - * @brief XE의 Menu 모듈이 값을 사용하기 쉽게 정리해주는 함수 - **/ - function getListedItems($menu, &$listed_items, &$node_list) { - if(!count($menu)) return; - foreach($menu as $node_srl => $item) { - if(preg_match('/^([a-zA-Z0-9\_\-]+)$/', $item['url'])) { - $mid = $item['mid'] = $item['url']; - $node_list[$mid] = $node_srl; - } else { - $mid = $item['mid'] = null; - } - - $listed_items[$node_srl] = $item; - $this->getListedItems($item['list'], $listed_items, $node_list); - } - } - - /** - * @brief XE 네비게이션 출력 - **/ - function displayNavigationContent() { - $childs = array(); - - if($this->cmid) { - $cur_item = $this->listed_items[$this->cmid]; - $upper_srl = $cur_item['parent_srl'];; - $list = $cur_item['list'];; - $this->setUpperUrl(getUrl('cmid',$upper_srl), Context::getLang('cmd_go_upper')); - if(preg_match('/^([a-zA-Z0-9\_\-]+)$/', $cur_item['url'])) { - $obj = null; - $obj['href'] = getUrl('','mid',$cur_item['url']); - $obj['link'] = $obj['text'] = '['.$cur_item['text'].']'; - $childs[] = $obj; - } - - } else { - $list = $this->menu; - $upper_srl = 0; - } - - - if(count($list)) { - foreach($list as $key => $val) { - if(!$val['text']) continue; - $obj = null; - if(!count($val['list'])) { - $obj['href'] = getUrl('','mid',$val['url']); - } else { - $obj['href'] = getUrl('cmid',$val['node_srl']); - } - $obj['link'] = $obj['text'] = $val['text']; - $childs[] = $obj; - } - $this->setChilds($childs); - } - - // 출력 - $this->display(); - } - - /** - * @brief 언어설정 메뉴 출력 - **/ - function displayLangSelect() { - $childs = array(); - - $this->lang = FileHandler::readFile('./files/cache/addons/mobile/setLangType/personal_settings/'.md5(trim($_SERVER['HTTP_USER_AGENT']).trim($_SERVER['HTTP_PHONE_NUMBER']).trim($_SERVER['HTTP_HTTP_PHONE_NUMBER'])).'.php'); - if($this->lang) { - $this->lang = str_replace(array(''),array('',''),$this->lang); - Context::setLangType($this->lang); - } - $lang_supported = Context::get('lang_supported'); - $lang_type = Context::getLangType(); - $obj = null; - $obj['link'] = $obj['text'] = Context::getLang('president_lang').' : '.$lang_supported[$lang_type]; - $obj['href'] = getUrl('sel_lang',$lang_type); - $childs[] = $obj; - - if(is_array($lang_supported)) { - foreach($lang_supported as $key => $val) { - $obj = null; - $obj['link'] = $obj['text'] = $val; - $obj['href'] = getUrl('sel_lang',$key); - $childs[] = $obj; - } - } - - $this->setChilds($childs); - - $this->display(); - } - - /** - * @brief 모듈의 WAP 클래스 객체 생성하여 WAP 준비 - **/ - function displayModuleContent() { - // 선택된 모듈의 WAP class 객체 생성 - $oModule = &getWap($this->module_info->module); - if(!$oModule || !method_exists($oModule, 'procWAP') ) return; - - $vars = get_object_vars($this->oModule); - if(count($vars)) foreach($vars as $key => $val) $oModule->{$key} = $val; - - // 실행 - $oModule->procWAP($this); - - // 출력 - $this->display(); - } - - /** - * @brief WAP 컨텐츠를 별도로 구할 수 없으면 최종 결과물을 출력 - **/ - function displayContent() { - Context::set('layout','none'); - - // 템플릿 컴파일 - $oTemplate = new TemplateHandler(); - $oContext = &Context::getInstance(); - - $content = $oTemplate->compile($this->oModule->getTemplatePath(), $this->oModule->getTemplateFile()); - $this->setContent($content); - - // 출력 - $this->display(); - } - } -?> +lang = FileHandler::readFile('./files/cache/addons/mobile/setLangType/personal_settings/'.md5(trim($_SERVER['HTTP_USER_AGENT']).trim($_SERVER['HTTP_PHONE_NUMBER']).trim($_SERVER['HTTP_HTTP_PHONE_NUMBER'])).'.php'); + if($this->lang) { + $lang_supported = Context::get('lang_supported'); + $this->lang = str_replace(array(''),array('',''),$this->lang); + if(isset($lang_supported[$this->lang])) Context::setLangType($this->lang); + } + Context::loadLang(_XE_PATH_.'addons/mobile/lang'); + + $instance = new wap(); + + $mobilePage = (int)Context::get('mpage'); + if(!$mobilePage) $mobilePage = 1; + + $instance->setMobilePage($mobilePage); + + } + + return $instance; + } + + /** + * @brief constructor + **/ + function mobileXE() { + // navigation mode 체크 + if(Context::get('nm')) { + $this->navigationMode = 1; + $this->cmid = (int)Context::get('cmid'); + } + + if(Context::get('lcm')) { + $this->languageMode = 1; + $this->lang = Context::get('sel_lang'); + } + } + + /** + * @brief navigation mode 체크 + * navigationMode 세팅과 모듈 정보의 menu_srl이 있어야 navigation mode = true로 return + **/ + function isNavigationMode() { + return ($this->navigationMode && $this->module_info->menu_srl)?true:false; + } + + /** + * @brief langchange mode 체크 + * languageMode 세팅 있어야 true return + **/ + function isLangChange() { + if($this->languageMode) return true; + else return false; + } + + /** + * @brief 언어 설정 + * 쿠키가 안되기 때문에 휴대전화마다 고유한 파일로 언어설정을 저장하는 파일 생성 + **/ + function setLangType() { + $lang_supported = Context::get('lang_supported'); + // 언어 변수가 있는지 확인하고 변수가 유효한지 확인 + if($this->lang && isset($lang_supported[$this->lang])) { + $langbuff = FileHandler::readFile('./files/cache/addons/mobile/setLangType/personal_settings/'.md5(trim($_SERVER['HTTP_USER_AGENT']).trim($_SERVER['HTTP_PHONE_NUMBER']).trim($_SERVER['HTTP_HTTP_PHONE_NUMBER'])).'.php'); + if($langbuff) FileHandler::removeFile('./files/cache/addons/mobile/setLangType/personal_settings/'.md5(trim($_SERVER['HTTP_USER_AGENT']).trim($_SERVER['HTTP_PHONE_NUMBER']).trim($_SERVER['HTTP_HTTP_PHONE_NUMBER'])).'.php'); + $langbuff = 'lang.'**/ ?>'; + FileHandler::writeFile('./files/cache/addons/mobile/setLangType/personal_settings/'.md5(trim($_SERVER['HTTP_USER_AGENT']).trim($_SERVER['HTTP_PHONE_NUMBER']).trim($_SERVER['HTTP_HTTP_PHONE_NUMBER'])).'.php',$langbuff); + } + } + + /** + * @brief 현재 요청된 모듈 정보 세팅 + **/ + function setModuleInfo(&$module_info) { + if($this->module_info) return; + $this->module_info = $module_info; + } + + /** + * @brief 현재 실행중인 모듈 instance 세팅 + **/ + function setModuleInstance(&$oModule) { + if($this->oModule) return; + + // instance 저장 + $this->oModule = $oModule; + + // 현재 모듈의 메뉴가 설정되어 있으면 메뉴 정리 + $menu_cache_file = sprintf(_XE_PATH_.'files/cache/menu/%d.php', $this->module_info->menu_srl); + if(!file_exists($menu_cache_file)) return; + + include $menu_cache_file; + + // 정리된 menu들을 1차원으로 변경 + $this->getListedItems($menu->list, $listed_items, $node_list); + + $this->listed_items = $listed_items; + $this->node_list = $node_list; + $this->menu = $menu->list; + + $k = array_keys($node_list); + $v = array_values($node_list); + $this->index_mid = $k[0]; + + // 현재 메뉴의 depth가 1이상이면 상위 버튼을 지정 + $cur_menu_item = $listed_items[$node_list[$this->module_info->mid]]; + if($cur_menu_item['parent_srl']) { + $parent_srl = $cur_menu_item['parent_srl']; + if($parent_srl && $listed_items[$parent_srl]) { + $parent_item = $listed_items[$parent_srl]; + if($parent_item) $this->setUpperUrl(getUrl('','mid',$parent_item['mid']), Context::getLang('cmd_go_upper')); + } + } elseif (!$this->isNavigationMode()) { + $this->setUpperUrl(getUrl('','mid',$this->index_mid,'nm','1','cmid',0), Context::getLang('cmd_view_sitemap')); + } + } + + /** + * @brief 접속 브라우저의 헤더를 판단하여 브라우저 타입을 return + * 모바일 브라우저가 아닐 경우 null return + **/ + function getBrowserType() { + if(Context::get('smartphone')) return null; + // 브라우저 타입을 판별 + $browserAccept = $_SERVER['HTTP_ACCEPT']; + $userAgent = $_SERVER['HTTP_USER_AGENT']; + $wap_sid = $_SERVER['HTTP_X_UP_SUBNO']; + + if(eregi("SKT11", $userAgent) || eregi("skt", $browserAccept)) { + Context::set('mobile_skt',1); + return "wml"; + } + elseif(eregi("hdml", $browserAccept)) return "hdml"; + elseif(eregi("CellPhone", $userAgent)) return "mhtml"; + return null; + } + + /** + * @brief charset 지정 + **/ + function setCharSet($charset = 'UTF-8') { + if(!$charset) $charset = 'UTF-8'; + + //SKT는 euc-kr만 지원 + if(Context::get('mobile_skt')==1) $charset = 'euc-kr'; + + $this->charset = $charset; + } + + /** + * @brief 모바일 기기의 용량 제한에 다른 가상 페이지 지정 + **/ + function setMobilePage($page=1) { + if(!$page) $page = 1; + $this->mobilePage = $page; + } + + /** + * @brief 목록형 데이터 설정을 위한 child menu지정 + **/ + function setChilds($childs) { + // menu개수가 9개 이상일 경우 자체 페이징 처리 + $menu_count = count($childs); + if($menu_count>9) { + $startNum = ($this->mobilePage-1)*9; + $idx = 0; + $new_childs = array(); + foreach($childs as $k => $v) { + if($idx >= $startNum && $idx < $startNum+9) { + $new_childs[$k] = $v; + } + $idx ++; + } + $childs = $new_childs; + + $this->totalPage = (int)(($menu_count-1)/9)+1; + + // next/prevUrl 지정 + if($this->mobilePage>1) { + $url = getUrl('mid',$_GET['mid'],'mpage',$this->mobilePage-1); + $text = sprintf('%s (%d/%d)', Context::getLang('cmd_prev'), $this->mobilePage-1, $this->totalPage); + $this->setPrevUrl($url, $text); + } + + if($this->mobilePage<$this->totalPage) { + $url = getUrl('mid',$_GET['mid'],'mpage',$this->mobilePage+1); + $text = sprintf('%s (%d/%d)', Context::getLang('cmd_next'), $this->mobilePage+1, $this->totalPage); + $this->setNextUrl($url, $text); + } + } + $this->childs = $childs; + } + + /** + * @brief menu 출력대상이 있는지 확인 + **/ + function hasChilds() { + return count($this->childs)?true:0; + } + + /** + * @brief child menu반환 + **/ + function getChilds() { + return $this->childs; + } + + /** + * @brief title 지정 + **/ + function setTitle($title) { + $oModuleController = &getController('module'); + $this->title = $title; + $oModuleController->replaceDefinedLangCode($this->title); + } + + /** + * @brief title 반환 + **/ + function getTitle() { + return $this->title; + } + + /** + * @brief 컨텐츠 정리 + * HTML 컨텐츠에서 텍스트와 링크만 추출하는 기능 + **/ + function setContent($content) { + $oModuleController = &getController('module'); + $allow_tag_array = array('
','
','

','','','','','','','','','','"; - }else{ - if($.browser.firefox){ - sTD = ""; - }else{ - sTD = ""; - } - } - - var sTable = '
'); + + + // 링크/ 줄바꿈, 강조만 제외하고 모든 태그 제거 + $content = strip_tags($content, implode($allow_tag_array)); + + // 탭 여백 제거 + $content = str_replace("\t", "", $content); + + // 2번 이상 반복되는 공백과 줄나눔을 제거 + $content = preg_replace('/( ){2,}/s', '', $content); + $content = preg_replace("/([\r\n]+)/s", "\r\n", $content); + $content = preg_replace(array("/","
"), array("
","
"), $content); + + while(strpos($content, '

')) { + $content = str_replace('

','
',$content); + } + + // 모바일의 경우 한 덱에 필요한 사이즈가 적어서 내용을 모두 페이지로 나눔 + $contents = array(); + while($content) { + $tmp = $this->cutStr($content, $this->deckSize, ''); + $contents[] = $tmp; + $content = substr($content, strlen($tmp)); + + //$content = str_replace(array('&','<','>','"','&nbsp;'), array('&','<','>','"',' '), $content); + + foreach($allow_tag_array as $tag) { + if($tag == '
') continue; + $tag_open_pos = strpos($content, str_replace('>','',$tag)); + $tag_close_pos = strpos($content, str_replace('<','totalPage = count($contents); + + // next/prevUrl 지정 + if($this->mobilePage>1) { + $url = getUrl('mid',$_GET['mid'],'mpage',$this->mobilePage-1); + $text = sprintf('%s (%d/%d)', Context::getLang('cmd_prev'), $this->mobilePage-1, $this->totalPage); + $this->setPrevUrl($url, $text); + } + + if($this->mobilePage<$this->totalPage) { + $url = getUrl('mid',$_GET['mid'],'mpage',$this->mobilePage+1); + $text = sprintf('%s (%d/%d)', Context::getLang('cmd_next'), $this->mobilePage+1, $this->totalPage); + $this->setNextUrl($url, $text); + } + + $this->content = $contents[$this->mobilePage-1]; + $oModuleController->replaceDefinedLangCode($this->content); + $content = str_replace(array('$','\''), array('$$','''), $content); + } + + /** + * @brief byte수로 자르는 함수 + **/ + function cutStr($string, $cut_size) { + return preg_match('/.{'.$cut_size.'}/su', $string, $arr) ? $arr[0] : $string; + } + + /** + * @brief 컨텐츠 반환 + **/ + function getContent() { + return $this->content; + } + + /** + * @brief home url 지정 + **/ + function setHomeUrl($url, $text) { + if(!$url) $url = '#'; + $this->homeUrl->url = $url; + $this->homeUrl->text = $text; + } + + /** + * @brief upper url 지정 + **/ + function setUpperUrl($url, $text) { + if(!$url) $url = '#'; + $this->upperUrl->url = $url; + $this->upperUrl->text = $text; + } + + /** + * @brief prev url 지정 + **/ + function setPrevUrl($url, $text) { + if(!$url) $url = '#'; + $this->prevUrl->url = $url; + $this->prevUrl->text = $text; + } + + /** + * @brief next url 지정 + **/ + function setNextUrl($url, $text) { + if(!$url) $url = '#'; + $this->nextUrl->url = $url; + $this->nextUrl->text = $text; + } + + /** + * @brief 다음, 이전, 상위 이외에 기타 버튼 지정 + **/ + function setEtcBtn($url, $text) { + if(!$url) $url = '#'; + $etc['url'] = $url; + $etc['text'] = htmlspecialchars($text); + $this->etcBtn[] = $etc; + } + + /** + * @brief display + **/ + function display() { + // 홈버튼 지정 + $this->setHomeUrl(getUrl(), Context::getLang('cmd_go_home')); + + // 제목 지정 + if(!$this->title) $this->setTitle(Context::getBrowserTitle()); + + ob_start(); + + // 헤더를 출력 + $this->printHeader(); + + // 제목을 출력 + $this->printTitle(); + + // 내용 출력 + $this->printContent(); + + // 버튼 출력 + $this->printBtn(); + + // 푸터를 출력 + $this->printFooter(); + + $content = ob_get_clean(); + + // 변환 후 출력 + if(strtolower($this->charset) == 'utf-8') print $content; + else print iconv('UTF-8',$this->charset."//TRANSLIT//IGNORE", $content); + + exit(); + } + + /** + * @brief 페이지 이동 + **/ + function movepage($url) { + header("location:$url"); + exit(); + } + + /** + * @brief 목록등에서 일련 번호를 리턴한다 + **/ + function getNo() { + $this->no++; + $str = $this->no; + return $str; + } + + /** + * @brief XE의 Menu 모듈이 값을 사용하기 쉽게 정리해주는 함수 + **/ + function getListedItems($menu, &$listed_items, &$node_list) { + if(!count($menu)) return; + foreach($menu as $node_srl => $item) { + if(preg_match('/^([a-zA-Z0-9\_\-]+)$/', $item['url'])) { + $mid = $item['mid'] = $item['url']; + $node_list[$mid] = $node_srl; + } else { + $mid = $item['mid'] = null; + } + + $listed_items[$node_srl] = $item; + $this->getListedItems($item['list'], $listed_items, $node_list); + } + } + + /** + * @brief XE 네비게이션 출력 + **/ + function displayNavigationContent() { + $childs = array(); + + if($this->cmid) { + $cur_item = $this->listed_items[$this->cmid]; + $upper_srl = $cur_item['parent_srl'];; + $list = $cur_item['list'];; + $this->setUpperUrl(getUrl('cmid',$upper_srl), Context::getLang('cmd_go_upper')); + if(preg_match('/^([a-zA-Z0-9\_\-]+)$/', $cur_item['url'])) { + $obj = null; + $obj['href'] = getUrl('','mid',$cur_item['url']); + $obj['link'] = $obj['text'] = '['.$cur_item['text'].']'; + $childs[] = $obj; + } + + } else { + $list = $this->menu; + $upper_srl = 0; + } + + + if(count($list)) { + foreach($list as $key => $val) { + if(!$val['text']) continue; + $obj = null; + if(!count($val['list'])) { + $obj['href'] = getUrl('','mid',$val['url']); + } else { + $obj['href'] = getUrl('cmid',$val['node_srl']); + } + $obj['link'] = $obj['text'] = $val['text']; + $childs[] = $obj; + } + $this->setChilds($childs); + } + + // 출력 + $this->display(); + } + + /** + * @brief 언어설정 메뉴 출력 + **/ + function displayLangSelect() { + $childs = array(); + + $this->lang = FileHandler::readFile('./files/cache/addons/mobile/setLangType/personal_settings/'.md5(trim($_SERVER['HTTP_USER_AGENT']).trim($_SERVER['HTTP_PHONE_NUMBER']).trim($_SERVER['HTTP_HTTP_PHONE_NUMBER'])).'.php'); + if($this->lang) { + $this->lang = str_replace(array(''),array('',''),$this->lang); + Context::setLangType($this->lang); + } + $lang_supported = Context::get('lang_supported'); + $lang_type = Context::getLangType(); + $obj = null; + $obj['link'] = $obj['text'] = Context::getLang('president_lang').' : '.$lang_supported[$lang_type]; + $obj['href'] = getUrl('sel_lang',$lang_type); + $childs[] = $obj; + + if(is_array($lang_supported)) { + foreach($lang_supported as $key => $val) { + $obj = null; + $obj['link'] = $obj['text'] = $val; + $obj['href'] = getUrl('sel_lang',$key); + $childs[] = $obj; + } + } + + $this->setChilds($childs); + + $this->display(); + } + + /** + * @brief 모듈의 WAP 클래스 객체 생성하여 WAP 준비 + **/ + function displayModuleContent() { + // 선택된 모듈의 WAP class 객체 생성 + $oModule = &getWap($this->module_info->module); + if(!$oModule || !method_exists($oModule, 'procWAP') ) return; + + $vars = get_object_vars($this->oModule); + if(count($vars)) foreach($vars as $key => $val) $oModule->{$key} = $val; + + // 실행 + $oModule->procWAP($this); + + // 출력 + $this->display(); + } + + /** + * @brief WAP 컨텐츠를 별도로 구할 수 없으면 최종 결과물을 출력 + **/ + function displayContent() { + Context::set('layout','none'); + + // 템플릿 컴파일 + $oTemplate = new TemplateHandler(); + $oContext = &Context::getInstance(); + + $content = $oTemplate->compile($this->oModule->getTemplatePath(), $this->oModule->getTemplateFile()); + $this->setContent($content); + + // 출력 + $this->display(); + } + } +?> diff --git a/addons/mobile/classes/wml.class.php b/addons/mobile/classes/wml.class.php index 08103b37c..11e6ae35e 100644 --- a/addons/mobile/classes/wml.class.php +++ b/addons/mobile/classes/wml.class.php @@ -1,106 +1,106 @@ -charset); - if($this->totalPage > $this->mobilePage) $titlePageStr = sprintf("(%d/%d)",$this->mobilePage, $this->totalPage); - print("charset."\"?>\n"); - // 카드제목 - printf("\n\n

\n",htmlspecialchars($this->title),htmlspecialchars($titlePageStr)); - } - - /** - * @brief 제목을 출력 - **/ - function printTitle() { - if($this->totalPage > $this->mobilePage) $titlePageStr = sprintf("(%d/%d)",$this->mobilePage, $this->totalPage); - printf('<%s%s>
%s', htmlspecialchars($this->title),htmlspecialchars($titlePageStr),"\n"); - } - - /** - * @brief 내용을 출력 - * hasChilds()가 있으면 목록형을 그렇지 않으면 컨텐츠를 출력 - **/ - function printContent() { - if($this->hasChilds()) { - foreach($this->getChilds() as $key => $val) { - if(!$val['link']) continue; - printf('%s', $this->getNo(), htmlspecialchars($val['text']), $val['href'], "\n"); - if($val['extra']) printf("%s\n",$val['extra']); - } - } else { - printf('%s
%s', str_replace("
","
",$this->getContent()),"\n"); - } - print('
'); - } - - /** - * @brief 버튼을 출력함 - **/ - function printBtn() { - if($this->nextUrl) { - $url = $this->nextUrl; - printf('%s', $url->text, $url->url, "\n"); - } - if($this->prevUrl) { - $url = $this->prevUrl; - printf('%s', $url->text, $url->url, "\n"); - } - // 기타 해당사항 없는 버튼 출력 담당 (array로 전달) type?? - if($this->etcBtn) { - if(is_array($this->etcBtn)) { - foreach($this->etcBtn as $key=>$val) { - printf('%s', $key, $val['text'], $val['url'], "\n"); - } - } - } - // 언어선택 - if(!parent::isLangChange()){ - $url = getUrl('','lcm','1','sel_lang',Context::getLangType(),'return_uri',Context::get('current_url')); - printf('%s', 'Language : '.Context::getLang('select_lang'), $url, "\n"); - } - else { - printf('%s', Context::getLang('lang_return'), Context::get('return_uri'), "\n"); - } - if($this->homeUrl) { - $url = $this->homeUrl; - printf('%s', $url->text, $url->url, "\n"); - } - if($this->upperUrl) { - $url = $this->upperUrl; - printf('%s', $url->text, $url->url, "\n"); - } - } - - // 푸터 정보를 출력 - function printFooter() { - print("

\n
\n
"); - } - - // 목록등에서 일련 번호를 리턴한다 - function getNo() { - if(Context::get('mobile_skt')==1) { - return "vnd.skmn".parent::getNo(); - } - else { - return parent::getNo(); - } - return $str; - } - } -?> +charset); + if($this->totalPage > $this->mobilePage) $titlePageStr = sprintf("(%d/%d)",$this->mobilePage, $this->totalPage); + print("charset."\"?>\n"); + // 카드제목 + printf("\n\n

\n",htmlspecialchars($this->title),htmlspecialchars($titlePageStr)); + } + + /** + * @brief 제목을 출력 + **/ + function printTitle() { + if($this->totalPage > $this->mobilePage) $titlePageStr = sprintf("(%d/%d)",$this->mobilePage, $this->totalPage); + printf('<%s%s>
%s', htmlspecialchars($this->title),htmlspecialchars($titlePageStr),"\n"); + } + + /** + * @brief 내용을 출력 + * hasChilds()가 있으면 목록형을 그렇지 않으면 컨텐츠를 출력 + **/ + function printContent() { + if($this->hasChilds()) { + foreach($this->getChilds() as $key => $val) { + if(!$val['link']) continue; + printf('%s', $this->getNo(), htmlspecialchars($val['text']), $val['href'], "\n"); + if($val['extra']) printf("%s\n",$val['extra']); + } + } else { + printf('%s
%s', str_replace("
","
",$this->getContent()),"\n"); + } + print('
'); + } + + /** + * @brief 버튼을 출력함 + **/ + function printBtn() { + if($this->nextUrl) { + $url = $this->nextUrl; + printf('%s', $url->text, $url->url, "\n"); + } + if($this->prevUrl) { + $url = $this->prevUrl; + printf('%s', $url->text, $url->url, "\n"); + } + // 기타 해당사항 없는 버튼 출력 담당 (array로 전달) type?? + if($this->etcBtn) { + if(is_array($this->etcBtn)) { + foreach($this->etcBtn as $key=>$val) { + printf('%s', $key, $val['text'], $val['url'], "\n"); + } + } + } + // 언어선택 + if(!parent::isLangChange()){ + $url = getUrl('','lcm','1','sel_lang',Context::getLangType(),'return_uri',Context::get('current_url')); + printf('%s', 'Language : '.Context::getLang('select_lang'), $url, "\n"); + } + else { + printf('%s', Context::getLang('lang_return'), Context::get('return_uri'), "\n"); + } + if($this->homeUrl) { + $url = $this->homeUrl; + printf('%s', $url->text, $url->url, "\n"); + } + if($this->upperUrl) { + $url = $this->upperUrl; + printf('%s', $url->text, $url->url, "\n"); + } + } + + // 푸터 정보를 출력 + function printFooter() { + print("

\n
\n
"); + } + + // 목록등에서 일련 번호를 리턴한다 + function getNo() { + if(Context::get('mobile_skt')==1) { + return "vnd.skmn".parent::getNo(); + } + else { + return parent::getNo(); + } + return $str; + } + } +?> diff --git a/addons/mobile/conf/info.xml b/addons/mobile/conf/info.xml index 3dcee3654..d9f43b2a5 100644 --- a/addons/mobile/conf/info.xml +++ b/addons/mobile/conf/info.xml @@ -1,112 +1,112 @@ - - - 모바일XE 애드온 - モバイルXEアドオン - 手机XE插件 - Mobile XE - Mobile XE - Mobile XE - XE行動上網 - - 모바일에서 접속시 헤더 정보를 분석하여 메뉴 - 모듈의 관계를 이용하여 WAP 태그로 출력하는 애드온입니다. - wml, hdml, mhtml를 지원하고 그 이외의 경우에는 동작하지 않습니다. - - - モバイル端末機からアクセス時、ヘッダー(header)情報を分析して「メニュー」と「モジュール」の関係を利用してWAPタグに変換表示するアドオンです。 - wml, hdml, mhtmlをサポートし、その以外は対応していません。 - - - 通过手机访问网站时将网页输出为WAP标签的插件。 - 支持语言:wml, hdml, mhtml - - - This addon displays WAP tag by analyzing header information on mobile connection. - Only wml, hdml, mhtml formats are provided. - - - Addon này hiển thị WAP Tag bởi việc phân tích thông tin khi kết nối bằng di động. - Chỉ hỗ trợ cho các định dạng wml, hdml, mhtml. - - - Данный аддон показывает WAP теги, анализирую информацию мобильного соединения. - Поддерживаются только wml, hdml, mhtml форматы. - - - 透過行動工具上網時,會將網頁轉換為WAP標籤顯示。 - 只限於 wml, hdml, mhtml格式。 - - 0.1.1 - 2009-05-23 - - - NHN - NHN - NHN - NHN - NHN - NHN - NHN - - - - - misol - misol - misol - misol - misol - misol - misol - - 언어선택 추가(WML, mHTML) - 인코딩 설정 개선 - 그 외 소소한 개선들 - - - - - 문자셋 - 文字コード - 编码 - Charset - Charset - Charset - 編碼 - - 모바일 기기의 경우 UTF-8 문자셋을 인식하지 못할 수 있습니다. - 문자셋에 원하시는 문자셋을 입력하면 자동으로 변환하여 출력하여 모바일에서 이상없이 출력하도록 합니다. - 기본값은 UTF-8입니다. - (*SK Telecom 휴대전화의 경우 euc-kr인코딩만 지원하므로, 강제로 euc-kr인코딩만 지원합니다.) - - - ある特定のモバイル機器ではutf-8文字コードの認識が出来ない場合があります。 - 文字コードを設定すると、(日本語だけの場合)該当文字コードに自動変換して正常に表示出来るようになります。 - 本アドオンのデフォルト値はUTF-8で、日本の携帯はshift-jisが一般的です。 - - - 手机有时无法识别utf-8编码,这时输入相应的编码值即可自动转换。 - 默认编码为UTF-8。 - - - utf-8 may be read with mobile tools. - Mobile tools will display correct charset when you input charset you want. - Default charset is UTF-8. - - - UTF-8 không thể đọc được cho các công cụ di động. - Những công cụ di động sẽ trình bày Charset đúng khi bạn nhập vào Charset bạn muốn. - Charset mặc định là UTF-8. - - - utf-8 may be read with mobile tools. - Mobile tools will display correct charset when you input charset you want. - Default charset is UTF-8. - - - 行動工具無法讀取utf-8編碼。 - 當您輸入所想要的編碼時,行動工具將會正確的顯示。 - 預設編碼是UTF-8. - - - - + + + 모바일XE 애드온 + モバイルXEアドオン + 手机XE插件 + Mobile XE + Mobile XE + Mobile XE + XE行動上網 + + 모바일에서 접속시 헤더 정보를 분석하여 메뉴 - 모듈의 관계를 이용하여 WAP 태그로 출력하는 애드온입니다. + wml, hdml, mhtml를 지원하고 그 이외의 경우에는 동작하지 않습니다. + + + モバイル端末機からアクセス時、ヘッダー(header)情報を分析して「メニュー」と「モジュール」の関係を利用してWAPタグに変換表示するアドオンです。 + wml, hdml, mhtmlをサポートし、その以外は対応していません。 + + + 通过手机访问网站时将网页输出为WAP标签的插件。 + 支持语言:wml, hdml, mhtml + + + This addon displays WAP tag by analyzing header information on mobile connection. + Only wml, hdml, mhtml formats are provided. + + + Addon này hiển thị WAP Tag bởi việc phân tích thông tin khi kết nối bằng di động. + Chỉ hỗ trợ cho các định dạng wml, hdml, mhtml. + + + Данный аддон показывает WAP теги, анализирую информацию мобильного соединения. + Поддерживаются только wml, hdml, mhtml форматы. + + + 透過行動工具上網時,會將網頁轉換為WAP標籤顯示。 + 只限於 wml, hdml, mhtml格式。 + + 0.1.1 + 2009-05-23 + + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + + + + misol + misol + misol + misol + misol + misol + misol + + 언어선택 추가(WML, mHTML) + 인코딩 설정 개선 + 그 외 소소한 개선들 + + + + + 문자셋 + 文字コード + 编码 + Charset + Charset + Charset + 編碼 + + 모바일 기기의 경우 UTF-8 문자셋을 인식하지 못할 수 있습니다. + 문자셋에 원하시는 문자셋을 입력하면 자동으로 변환하여 출력하여 모바일에서 이상없이 출력하도록 합니다. + 기본값은 UTF-8입니다. + (*SK Telecom 휴대전화의 경우 euc-kr인코딩만 지원하므로, 강제로 euc-kr인코딩만 지원합니다.) + + + ある特定のモバイル機器ではutf-8文字コードの認識が出来ない場合があります。 + 文字コードを設定すると、(日本語だけの場合)該当文字コードに自動変換して正常に表示出来るようになります。 + 本アドオンのデフォルト値はUTF-8で、日本の携帯はshift-jisが一般的です。 + + + 手机有时无法识别utf-8编码,这时输入相应的编码值即可自动转换。 + 默认编码为UTF-8。 + + + utf-8 may be read with mobile tools. + Mobile tools will display correct charset when you input charset you want. + Default charset is UTF-8. + + + UTF-8 không thể đọc được cho các công cụ di động. + Những công cụ di động sẽ trình bày Charset đúng khi bạn nhập vào Charset bạn muốn. + Charset mặc định là UTF-8. + + + utf-8 may be read with mobile tools. + Mobile tools will display correct charset when you input charset you want. + Default charset is UTF-8. + + + 行動工具無法讀取utf-8編碼。 + 當您輸入所想要的編碼時,行動工具將會正確的顯示。 + 預設編碼是UTF-8. + + + + diff --git a/addons/mobile/lang/en.lang.php b/addons/mobile/lang/en.lang.php index 806187185..75ad30db3 100644 --- a/addons/mobile/lang/en.lang.php +++ b/addons/mobile/lang/en.lang.php @@ -1,15 +1,15 @@ -president_lang = 'selected Language'; - $lang->select_lang = 'select Language'; - $lang->lang_return = 'Go Back'; - - $lang->cmd_go_upper = 'Upper'; - $lang->cmd_go_home = 'Go Home'; - $lang->cmd_view_sitemap = 'View site map'; -?> +president_lang = 'selected Language'; + $lang->select_lang = 'select Language'; + $lang->lang_return = 'Go Back'; + + $lang->cmd_go_upper = 'Upper'; + $lang->cmd_go_home = 'Go Home'; + $lang->cmd_view_sitemap = 'View site map'; +?> diff --git a/addons/mobile/lang/jp.lang.php b/addons/mobile/lang/jp.lang.php index d9300e7e6..fc891f187 100644 --- a/addons/mobile/lang/jp.lang.php +++ b/addons/mobile/lang/jp.lang.php @@ -1,17 +1,17 @@ -president_lang = '現在言語'; - $lang->select_lang = '言語選択'; - $lang->lang_return = '戻る'; - - $lang->cmd_go_upper = '上位メニュー'; - $lang->cmd_go_home = 'トップへ'; - $lang->cmd_view_sitemap = 'サイトマップ'; - -?> +president_lang = '現在言語'; + $lang->select_lang = '言語選択'; + $lang->lang_return = '戻る'; + + $lang->cmd_go_upper = '上位メニュー'; + $lang->cmd_go_home = 'トップへ'; + $lang->cmd_view_sitemap = 'サイトマップ'; + +?> diff --git a/addons/mobile/lang/ko.lang.php b/addons/mobile/lang/ko.lang.php index 48bf404a0..90b08f866 100644 --- a/addons/mobile/lang/ko.lang.php +++ b/addons/mobile/lang/ko.lang.php @@ -1,17 +1,17 @@ -president_lang = '현재 언어'; - $lang->select_lang = '언어 선택'; - $lang->lang_return = '돌아가기'; - - $lang->cmd_go_upper = '상위'; - $lang->cmd_go_home = '홈으로'; - $lang->cmd_view_sitemap = '사이트맵 보기'; - -?> +president_lang = '현재 언어'; + $lang->select_lang = '언어 선택'; + $lang->lang_return = '돌아가기'; + + $lang->cmd_go_upper = '상위'; + $lang->cmd_go_home = '홈으로'; + $lang->cmd_view_sitemap = '사이트맵 보기'; + +?> diff --git a/addons/mobile/lang/ru.lang.php b/addons/mobile/lang/ru.lang.php index 87cc015cf..929a5689c 100644 --- a/addons/mobile/lang/ru.lang.php +++ b/addons/mobile/lang/ru.lang.php @@ -1,17 +1,17 @@ -president_lang = 'Дейсвующй язык'; - $lang->select_lang = 'Выбор языка'; - $lang->lang_return = 'Вернуться'; - - $lang->cmd_go_upper = 'Вверх'; - $lang->cmd_go_home = 'На главную страницу'; - $lang->cmd_view_sitemap = 'Посмотреть карту сайта'; - -?> +president_lang = 'Дейсвующй язык'; + $lang->select_lang = 'Выбор языка'; + $lang->lang_return = 'Вернуться'; + + $lang->cmd_go_upper = 'Вверх'; + $lang->cmd_go_home = 'На главную страницу'; + $lang->cmd_view_sitemap = 'Посмотреть карту сайта'; + +?> diff --git a/addons/mobile/lang/vi.lang.php b/addons/mobile/lang/vi.lang.php index 1ed1fa8a5..4f5e77389 100644 --- a/addons/mobile/lang/vi.lang.php +++ b/addons/mobile/lang/vi.lang.php @@ -1,18 +1,18 @@ -president_lang = 'Chọn ngôn ngữ'; - $lang->select_lang = 'Chọn ngôn ngữ'; - $lang->lang_return = 'Trở lại'; - - $lang->cmd_go_upper = 'Lên trên'; - $lang->cmd_go_home = 'Về trang chủ'; - $lang->cmd_view_sitemap = 'Xem sơ đồ Web'; -?> +president_lang = 'Chọn ngôn ngữ'; + $lang->select_lang = 'Chọn ngôn ngữ'; + $lang->lang_return = 'Trở lại'; + + $lang->cmd_go_upper = 'Lên trên'; + $lang->cmd_go_home = 'Về trang chủ'; + $lang->cmd_view_sitemap = 'Xem sơ đồ Web'; +?> diff --git a/addons/mobile/lang/zh-CN.lang.php b/addons/mobile/lang/zh-CN.lang.php index 1610b859f..96dc8d5cb 100644 --- a/addons/mobile/lang/zh-CN.lang.php +++ b/addons/mobile/lang/zh-CN.lang.php @@ -1,11 +1,11 @@ -cmd_go_upper = '上一级'; - $lang->cmd_go_home = '首页'; - $lang->cmd_view_sitemap = '网站地图'; -?> +cmd_go_upper = '上一级'; + $lang->cmd_go_home = '首页'; + $lang->cmd_view_sitemap = '网站地图'; +?> diff --git a/addons/mobile/lang/zh-TW.lang.php b/addons/mobile/lang/zh-TW.lang.php index 6de5fd45e..0435b4be0 100644 --- a/addons/mobile/lang/zh-TW.lang.php +++ b/addons/mobile/lang/zh-TW.lang.php @@ -1,15 +1,15 @@ -president_lang = '已選擇語言'; - $lang->select_lang = '選擇語言'; - $lang->lang_return = '返回'; - - $lang->cmd_go_upper = '回上頁'; - $lang->cmd_go_home = '回首頁'; - $lang->cmd_view_sitemap = '網站地圖'; -?> +president_lang = '已選擇語言'; + $lang->select_lang = '選擇語言'; + $lang->lang_return = '返回'; + + $lang->cmd_go_upper = '回上頁'; + $lang->cmd_go_home = '回首頁'; + $lang->cmd_view_sitemap = '網站地圖'; +?> diff --git a/addons/mobile/mobile.addon.php b/addons/mobile/mobile.addon.php index fd55b714c..ce99e39ea 100644 --- a/addons/mobile/mobile.addon.php +++ b/addons/mobile/mobile.addon.php @@ -1,61 +1,61 @@ - 모바일 처리를 위해 모듈의 일반 설정을 변경해야 할 경우 호출 - * - * after_module_proc > 모바일 컨텐츠 출력 - * 동작 조건 - **/ - - // 관리자 페이지는 무시 - if(Context::get('module')=='admin') return; - - // 동작 시점 관리 - if($called_position != 'before_module_proc' && $called_position != 'after_module_proc' ) return; - - // 모바일 브라우저가 아니라면 무시 - require_once(_XE_PATH_.'addons/mobile/classes/mobile.class.php'); - if(!mobileXE::getBrowserType()) return; - - // mobile instance 생성 - $oMobile = &mobileXE::getInstance(); - if(!$oMobile) return; - - // 애드온 설정에서 지정된 charset으로 지정 - $oMobile->setCharSet($addon_info->charset); - - // 모듈의 정보를 세팅 - $oMobile->setModuleInfo($this->module_info); - - // 현재 모듈 객체 등록 - $oMobile->setModuleInstance($this); - - // 네비게이트 모드이거나 WAP class가 있을 경우 미리 컨텐츠를 추출하여 출력/ 종료 - if($called_position == 'before_module_proc') { - - if($oMobile->isLangChange()) { - $oMobile->setLangType(); - $oMobile->displayLangSelect(); - } - - // 네비게이트 모드이면 네비게이션 컨텐츠 출력 - if($oMobile->isNavigationMode()) $oMobile->displayNavigationContent(); - - // WAP class가 있으면 WAP class를 통해 컨텐츠 출력 - else $oMobile->displayModuleContent(); - - // 네비게이트 모드가 아니고 WAP 클래스가 아니면 모듈의 결과를 출력 - } else if($called_position == 'after_module_proc') { - // 내용 준비 - $oMobile->displayContent(); - } -?> + 모바일 처리를 위해 모듈의 일반 설정을 변경해야 할 경우 호출 + * + * after_module_proc > 모바일 컨텐츠 출력 + * 동작 조건 + **/ + + // 관리자 페이지는 무시 + if(Context::get('module')=='admin') return; + + // 동작 시점 관리 + if($called_position != 'before_module_proc' && $called_position != 'after_module_proc' ) return; + + // 모바일 브라우저가 아니라면 무시 + require_once(_XE_PATH_.'addons/mobile/classes/mobile.class.php'); + if(!mobileXE::getBrowserType()) return; + + // mobile instance 생성 + $oMobile = &mobileXE::getInstance(); + if(!$oMobile) return; + + // 애드온 설정에서 지정된 charset으로 지정 + $oMobile->setCharSet($addon_info->charset); + + // 모듈의 정보를 세팅 + $oMobile->setModuleInfo($this->module_info); + + // 현재 모듈 객체 등록 + $oMobile->setModuleInstance($this); + + // 네비게이트 모드이거나 WAP class가 있을 경우 미리 컨텐츠를 추출하여 출력/ 종료 + if($called_position == 'before_module_proc') { + + if($oMobile->isLangChange()) { + $oMobile->setLangType(); + $oMobile->displayLangSelect(); + } + + // 네비게이트 모드이면 네비게이션 컨텐츠 출력 + if($oMobile->isNavigationMode()) $oMobile->displayNavigationContent(); + + // WAP class가 있으면 WAP class를 통해 컨텐츠 출력 + else $oMobile->displayModuleContent(); + + // 네비게이트 모드가 아니고 WAP 클래스가 아니면 모듈의 결과를 출력 + } else if($called_position == 'after_module_proc') { + // 내용 준비 + $oMobile->displayContent(); + } +?> diff --git a/addons/openid_delegation_id/conf/info.xml b/addons/openid_delegation_id/conf/info.xml index 796abb29e..9adf737f8 100644 --- a/addons/openid_delegation_id/conf/info.xml +++ b/addons/openid_delegation_id/conf/info.xml @@ -1,125 +1,125 @@ - - - OpenID delegation ID - OpenID - OpenID Delegation ID - OpenID Delegation ID - OpenID Delegation ID - Delegación ID para OpenID - OpenIDアドオン - Открытый ID(OpenID) - OpenID - - 본인의 도메인을 사용하여 오픈아이디로 활용할 수 있도록 합니다. - 꼭 설정을 통해서 openid provider관련 값을 입력후 사용해주세요. - - - 可以把本人的域名当分散式身份验证系统(OpenID)来使用。 - 必须在设置中输入openid provider相关值后再使用。 - - - This addon enables you to use your own domain name as an OpenID. - Just be sure to set the values related with openid provider before using. - - - Addon này cho phép bạn sử dụng tên miền của mình như một OpenID. - Hãy kiểm tra để đặt giá trị liên quan với OpenID trước khi sử dụng. - - - Dieses Addon ermöglicht es Ihnen, mit Ihrem eigenen Domain-Namen als OpenID. - Einfach sicher sein, dass die Werte im Zusammenhang mit OpenID-Provider, bevor Sie. - - - Utlizando su propio dominio puede usar como OpenID. - Debe utilizar luego de ingresar los valores relacionado con openid provider a través de la configuracion. - - - 保有しているオリジナルドメインをオープンIDとして活用することが出来ます。 - 必ず設定にて、OpenIDプロバイダーの関連情報を入力してから使用して下さい。 - - - Этот аддон позволяет Вам использовать Ваше доменное имя как OpenID. - Прежде, чем использовать, установите значения, имеющие отношение к openid-провайдеру . - - - 可將原本的域名當做OpenID來使用。 - 必須在設置中輸入openid provider相關資料後再使用。 - - 0.1 - 2007-02-28 - - - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - - - - - server - server - server - Server - server - Servidor - server - server - server - openid.server 값을 입력해 주세요. - 请输入 openid.server 值。 - Hãy nhập OpenID Server của bạn. - Please input your openid.server value. - Bitte geben Sie Ihre openid.server Wert. - Ingrese el valor del openid.server. - openid.server値を入力して下さい。 - Пожалуйста, введите Ваше значение openid.server - 請輸入 openid.server 值。 - - - delegate - delegate - Delegate - delegate - delegate - delegado - delegate - delegate - delegate - openid.delegate값을 입력해주세요. - 请输入 openid.delegate 值。 - Hãy nhập OpenID Delegate của bạn. - Please input your openid.delegate value. - Bitte geben Sie Ihre openid.delegate Wert. - Ingresar el valor del openid.delegate - openid.delegate値を入力して下さい。 - Пожалуйста, введите Ваше значение openid.delegate - 請輸入 openid.delegate 值。 - - - xrds - xrds - xrds - xrds - xrds - xrds - xrds - xrds - xrds - X-XRDS-Location값을 입력해주세요. - 请输入 X-XRDS-Location 值。 - Please input your X-XRDS-Location value. - Hãy nhập X-XRDS-Location của bạn. - Bitte geben Sie Ihre X-XRDS-Standort Wert. - Ingresar el valor de X-XRDS-Location - X-XRDS-Location値を入力して下さい。 - Пожалуйста, введите Ваше значение X-XRDS-Локации. - 請輸入 X-XRDS-Location 值。 - - - + + + OpenID delegation ID + OpenID + OpenID Delegation ID + OpenID Delegation ID + OpenID Delegation ID + Delegación ID para OpenID + OpenIDアドオン + Открытый ID(OpenID) + OpenID + + 본인의 도메인을 사용하여 오픈아이디로 활용할 수 있도록 합니다. + 꼭 설정을 통해서 openid provider관련 값을 입력후 사용해주세요. + + + 可以把本人的域名当分散式身份验证系统(OpenID)来使用。 + 必须在设置中输入openid provider相关值后再使用。 + + + This addon enables you to use your own domain name as an OpenID. + Just be sure to set the values related with openid provider before using. + + + Addon này cho phép bạn sử dụng tên miền của mình như một OpenID. + Hãy kiểm tra để đặt giá trị liên quan với OpenID trước khi sử dụng. + + + Dieses Addon ermöglicht es Ihnen, mit Ihrem eigenen Domain-Namen als OpenID. + Einfach sicher sein, dass die Werte im Zusammenhang mit OpenID-Provider, bevor Sie. + + + Utlizando su propio dominio puede usar como OpenID. + Debe utilizar luego de ingresar los valores relacionado con openid provider a través de la configuracion. + + + 保有しているオリジナルドメインをオープンIDとして活用することが出来ます。 + 必ず設定にて、OpenIDプロバイダーの関連情報を入力してから使用して下さい。 + + + Этот аддон позволяет Вам использовать Ваше доменное имя как OpenID. + Прежде, чем использовать, установите значения, имеющие отношение к openid-провайдеру . + + + 可將原本的域名當做OpenID來使用。 + 必須在設置中輸入openid provider相關資料後再使用。 + + 0.1 + 2007-02-28 + + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + + + + server + server + server + Server + server + Servidor + server + server + server + openid.server 값을 입력해 주세요. + 请输入 openid.server 值。 + Hãy nhập OpenID Server của bạn. + Please input your openid.server value. + Bitte geben Sie Ihre openid.server Wert. + Ingrese el valor del openid.server. + openid.server値を入力して下さい。 + Пожалуйста, введите Ваше значение openid.server + 請輸入 openid.server 值。 + + + delegate + delegate + Delegate + delegate + delegate + delegado + delegate + delegate + delegate + openid.delegate값을 입력해주세요. + 请输入 openid.delegate 值。 + Hãy nhập OpenID Delegate của bạn. + Please input your openid.delegate value. + Bitte geben Sie Ihre openid.delegate Wert. + Ingresar el valor del openid.delegate + openid.delegate値を入力して下さい。 + Пожалуйста, введите Ваше значение openid.delegate + 請輸入 openid.delegate 值。 + + + xrds + xrds + xrds + xrds + xrds + xrds + xrds + xrds + xrds + X-XRDS-Location값을 입력해주세요. + 请输入 X-XRDS-Location 值。 + Please input your X-XRDS-Location value. + Hãy nhập X-XRDS-Location của bạn. + Bitte geben Sie Ihre X-XRDS-Standort Wert. + Ingresar el valor de X-XRDS-Location + X-XRDS-Location値を入力して下さい。 + Пожалуйста, введите Ваше значение X-XRDS-Локации. + 請輸入 X-XRDS-Location 值。 + + + diff --git a/addons/openid_delegation_id/openid_delegation_id.addon.php b/addons/openid_delegation_id/openid_delegation_id.addon.php index aa5a373dd..be01816ff 100644 --- a/addons/openid_delegation_id/openid_delegation_id.addon.php +++ b/addons/openid_delegation_id/openid_delegation_id.addon.php @@ -1,29 +1,29 @@ -server||!$addon_info->delegate||!$addon_info->xrds) return; - - $header_script = sprintf( - ''."\n". - ''."\n". - '', - $addon_info->server, - $addon_info->delegate, - $addon_info->xrds - ); - - Context::addHtmlHeader($header_script); -?> +server||!$addon_info->delegate||!$addon_info->xrds) return; + + $header_script = sprintf( + ''."\n". + ''."\n". + '', + $addon_info->server, + $addon_info->delegate, + $addon_info->xrds + ); + + Context::addHtmlHeader($header_script); +?> diff --git a/addons/point_level_icon/conf/info.xml b/addons/point_level_icon/conf/info.xml index adde6ae69..201cdfb7c 100644 --- a/addons/point_level_icon/conf/info.xml +++ b/addons/point_level_icon/conf/info.xml @@ -1,62 +1,62 @@ - - - 포인트 레벨 아이콘 표시 애드온 - 积分级别图标 - ポイントレベルアイコン表示アドオン - Point Level Icon - Icon cấp độ của điểm - Point-Level-Symbol - Addon para mostar el nivel del ícono - Иконка уровня поинтов - 點數等級圖案 - - 포인트 시스템을 사용중일 경우 사용자 이름 앞에 레벨 아이콘을 표시하도록 합니다. - 레벨 아이콘은 모듈 > 포인트시스템에서 선택 가능합니다. - - - 使用积分系统时,可以在用户名前显示级别图标。 - 级别图标可以在模块 > 积分系统中进行选择。 - - - ポイントシステムを使用する場合、ユーザ名の前にレベルアイコンの表示します。 - レベルアイコンは、「モジュール > ポイントシステム」で選択します。 - - - This addon displays level icon in front of the user name when you are using the point system. - You can choose the level icon in Module > Point System. - - - Addon này sẽ hiển thị Icon cấp độ trước tên người sử dụng khi bạn sử dụng hệ thống tính điểm. - Bạn có thể chọn Icon cấp độ tại Module > cỉa hệ thống điểm. - - - Dieses Addon zeigt Level Icon vor dem Benutzernamen, wenn Sie die Punkte-System. - Sie können wählen, der Level Icon in Modul> Point-System. - - - Este addon muestra el nivel del ícono delante del nombre del usuario cuando es usado el sistema de puntos. - Tu puedes elegir los icono de cada nivel en el módulo > Sistema de Puntos. - - - Этот аддон отображает иконку уровня поинтов напротив имени пользователя, когда используется система поинтов. - Вы можете выбрать иконку уровня в Модуле Системы Поинтов. - - - 使用點數系統時,可以在用戶名前顯示等級圖案。 - 等級圖案可以在模組 > 點數系統中進行選擇。 - - 0.1 - 2007-07-26 - - - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - - + + + 포인트 레벨 아이콘 표시 애드온 + 积分级别图标 + ポイントレベルアイコン表示アドオン + Point Level Icon + Icon cấp độ của điểm + Point-Level-Symbol + Addon para mostar el nivel del ícono + Иконка уровня поинтов + 點數等級圖案 + + 포인트 시스템을 사용중일 경우 사용자 이름 앞에 레벨 아이콘을 표시하도록 합니다. + 레벨 아이콘은 모듈 > 포인트시스템에서 선택 가능합니다. + + + 使用积分系统时,可以在用户名前显示级别图标。 + 级别图标可以在模块 > 积分系统中进行选择。 + + + ポイントシステムを使用する場合、ユーザ名の前にレベルアイコンの表示します。 + レベルアイコンは、「モジュール > ポイントシステム」で選択します。 + + + This addon displays level icon in front of the user name when you are using the point system. + You can choose the level icon in Module > Point System. + + + Addon này sẽ hiển thị Icon cấp độ trước tên người sử dụng khi bạn sử dụng hệ thống tính điểm. + Bạn có thể chọn Icon cấp độ tại Module > cỉa hệ thống điểm. + + + Dieses Addon zeigt Level Icon vor dem Benutzernamen, wenn Sie die Punkte-System. + Sie können wählen, der Level Icon in Modul> Point-System. + + + Este addon muestra el nivel del ícono delante del nombre del usuario cuando es usado el sistema de puntos. + Tu puedes elegir los icono de cada nivel en el módulo > Sistema de Puntos. + + + Этот аддон отображает иконку уровня поинтов напротив имени пользователя, когда используется система поинтов. + Вы можете выбрать иконку уровня в Модуле Системы Поинтов. + + + 使用點數系統時,可以在用戶名前顯示等級圖案。 + 等級圖案可以在模組 > 點數系統中進行選擇。 + + 0.1 + 2007-07-26 + + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + diff --git a/addons/point_level_icon/point_level_icon.addon.php b/addons/point_level_icon/point_level_icon.addon.php index bbf847334..6395590c3 100644 --- a/addons/point_level_icon/point_level_icon.addon.php +++ b/addons/point_level_icon/point_level_icon.addon.php @@ -1,19 +1,19 @@ -]*)member_([0-9\-]+)([^\>]*)>(.*?)\<\/(div|span|a)\>!is', 'pointLevelIconTrans', $output); -?> +]*)member_([0-9\-]+)([^\>]*)>(.*?)\<\/(div|span|a)\>!is', 'pointLevelIconTrans', $output); +?> diff --git a/addons/resize_image/conf/info.xml b/addons/resize_image/conf/info.xml index b16c38058..7950c546d 100644 --- a/addons/resize_image/conf/info.xml +++ b/addons/resize_image/conf/info.xml @@ -1,53 +1,53 @@ - - - 본문내 이미지 조절 애드온 - 本文内イメージリーサイズアドオン - 内容区图片缩放插件 - Image Resizer - Thay đổi cỡ hình ảnh - Imagen de control add-on bonmunnae - Аддон редактирования размера картинки в тексте - Image-Add-on bonmunnae - 圖片縮放 - - 본문내에 삽입된 이미지의 크기를 본문크기에 맞게 하고 클릭시 원본을 보여주는 애드온입니다. - - - 本文内に挿入されたイメージのサイズを本文の幅サイズに合わせてリーサイズし、クリックした時、オリジナルサイズのイメージを表示します。 - - - 自动调整主题内容区内的图片大小,点击将显示原始大小的插件。 - - - Addon này sẽ lấy lại kích thước nguyên bản của hình ảnh trong bài viết hoặc bình luận khi bạn bấm vào hình. - - - This addon resizes images inserted in the article, and shows original image when you click on them. - - - La imagen corporal se inserta dentro del cuerpo para que se adapte al tamaño de la muestra original cuando hago clic en los add-ons. - - - Аддон, изменяющий размер картинки к размеру текста, при клике на картинку, появляется полное изображение. - - - Body Bild eingefügt im Inneren des Körpers zu passen die Größe des Originals zeigen, wenn ich darauf klicke auf das Add-ons. - - - 自動調整文章内的圖片大小,點擊圖片後會顯示原始大小。 - - 0.1 - 2008-04-22 - - - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - - + + + 본문내 이미지 조절 애드온 + 本文内イメージリーサイズアドオン + 内容区图片缩放插件 + Image Resizer + Thay đổi cỡ hình ảnh + Imagen de control add-on bonmunnae + Аддон редактирования размера картинки в тексте + Image-Add-on bonmunnae + 圖片縮放 + + 본문내에 삽입된 이미지의 크기를 본문크기에 맞게 하고 클릭시 원본을 보여주는 애드온입니다. + + + 本文内に挿入されたイメージのサイズを本文の幅サイズに合わせてリーサイズし、クリックした時、オリジナルサイズのイメージを表示します。 + + + 自动调整主题内容区内的图片大小,点击将显示原始大小的插件。 + + + Addon này sẽ lấy lại kích thước nguyên bản của hình ảnh trong bài viết hoặc bình luận khi bạn bấm vào hình. + + + This addon resizes images inserted in the article, and shows original image when you click on them. + + + La imagen corporal se inserta dentro del cuerpo para que se adapte al tamaño de la muestra original cuando hago clic en los add-ons. + + + Аддон, изменяющий размер картинки к размеру текста, при клике на картинку, появляется полное изображение. + + + Body Bild eingefügt im Inneren des Körpers zu passen die Größe des Originals zeigen, wenn ich darauf klicke auf das Add-ons. + + + 自動調整文章内的圖片大小,點擊圖片後會顯示原始大小。 + + 0.1 + 2008-04-22 + + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + diff --git a/addons/resize_image/resize_image.addon.php b/addons/resize_image/resize_image.addon.php index bcc74e01a..b6b3ecdfc 100644 --- a/addons/resize_image/resize_image.addon.php +++ b/addons/resize_image/resize_image.addon.php @@ -1,18 +1,18 @@ - + diff --git a/classes/cache/CacheApc.class.php b/classes/cache/CacheApc.class.php index 84b6c88fc..315dc41c5 100644 --- a/classes/cache/CacheApc.class.php +++ b/classes/cache/CacheApc.class.php @@ -1,72 +1,72 @@ -valid_time; - return apc_store(md5(_XE_PATH_.$key), array(time(), $buff), $valid_time); - } - - function isValid($key, $modified_time = 0) { - $_key = md5(_XE_PATH_.$key); - $obj = apc_fetch($_key, $success); - if(!$success || !is_array($obj)) return false; - unset($obj[1]); - - if($modified_time > 0 && $modified_time > $obj[0]) { - $this->_delete($_key); - return false; - } - - return true; - } - - function get($key, $modified_time = 0) { - $_key = md5(_XE_PATH_.$key); - $obj = apc_fetch($_key, $success); - if(!$success || !is_array($obj)) return false; - - if($modified_time > 0 && $modified_time > $obj[0]) { - $this->_delete($_key); - return false; - } - - return $obj[1]; - } - - function _delete($_key) { - $this->put($_key,null,1); - } - - function delete($key) { - $this->_delete(md5(_XE_PATH_.$key)); - } - - function truncate() { - return apc_clear_cache('user'); - } - } -?> +valid_time; + return apc_store(md5(_XE_PATH_.$key), array(time(), $buff), $valid_time); + } + + function isValid($key, $modified_time = 0) { + $_key = md5(_XE_PATH_.$key); + $obj = apc_fetch($_key, $success); + if(!$success || !is_array($obj)) return false; + unset($obj[1]); + + if($modified_time > 0 && $modified_time > $obj[0]) { + $this->_delete($_key); + return false; + } + + return true; + } + + function get($key, $modified_time = 0) { + $_key = md5(_XE_PATH_.$key); + $obj = apc_fetch($_key, $success); + if(!$success || !is_array($obj)) return false; + + if($modified_time > 0 && $modified_time > $obj[0]) { + $this->_delete($_key); + return false; + } + + return $obj[1]; + } + + function _delete($_key) { + $this->put($_key,null,1); + } + + function delete($key) { + $this->_delete(md5(_XE_PATH_.$key)); + } + + function truncate() { + return apc_clear_cache('user'); + } + } +?> diff --git a/classes/cache/CacheHandler.class.php b/classes/cache/CacheHandler.class.php index 4ca454a4e..81c3ad7be 100644 --- a/classes/cache/CacheHandler.class.php +++ b/classes/cache/CacheHandler.class.php @@ -1,95 +1,95 @@ -use_object_cache =='apc') $type = 'apc'; - else if(substr($info->use_object_cache,0,8)=='memcache'){ - $type = 'memcache'; - $url = $info->use_object_cache; - } - }else if($target == 'template'){ - if($info->use_template_cache =='apc') $type = 'apc'; - else if(substr($info->use_template_cache,0,8)=='memcache'){ - $type = 'memcache'; - $url = $info->use_template_cache; - } - } - - if($type){ - $class = 'Cache' . ucfirst($type); - include_once sprintf('%sclasses/cache/%s.class.php', _XE_PATH_, $class); - $this->handler = call_user_func(array($class,'getInstance'), $url); - } - } - } - - function isSupport(){ - if($this->handler && $this->handler->isSupport()) return true; - return false; - } - - function get($key, $modified_time = 0){ - if(!$this->handler) return false; - return $this->handler->get($key, $modified_time); - } - - function put($key, $obj, $valid_time = 0){ - if(!$this->handler) return false; - return $this->handler->put($key, $obj, $valid_time); - } - - function delete($key){ - if(!$this->handler) return false; - return $this->handler->delete($key); - } - - function isValid($key, $modified_time){ - if(!$this->handler) return false; - return $this->handler->isValid($key, $modified_time); - } - - function truncate(){ - if(!$this->handler) return false; - return $this->handler->truncate(); - } - } - - class CacheBase{ - function get($key, $modified_time = 0){ - return false; - } - - function put($key, $obj, $valid_time = 0){ - return false; - } - - function isValid($key, $modified_time = 0){ - return false; - } - - function isSupport(){ - return false; - } - - function truncate(){ - return false; - } - } -?> +use_object_cache =='apc') $type = 'apc'; + else if(substr($info->use_object_cache,0,8)=='memcache'){ + $type = 'memcache'; + $url = $info->use_object_cache; + } + }else if($target == 'template'){ + if($info->use_template_cache =='apc') $type = 'apc'; + else if(substr($info->use_template_cache,0,8)=='memcache'){ + $type = 'memcache'; + $url = $info->use_template_cache; + } + } + + if($type){ + $class = 'Cache' . ucfirst($type); + include_once sprintf('%sclasses/cache/%s.class.php', _XE_PATH_, $class); + $this->handler = call_user_func(array($class,'getInstance'), $url); + } + } + } + + function isSupport(){ + if($this->handler && $this->handler->isSupport()) return true; + return false; + } + + function get($key, $modified_time = 0){ + if(!$this->handler) return false; + return $this->handler->get($key, $modified_time); + } + + function put($key, $obj, $valid_time = 0){ + if(!$this->handler) return false; + return $this->handler->put($key, $obj, $valid_time); + } + + function delete($key){ + if(!$this->handler) return false; + return $this->handler->delete($key); + } + + function isValid($key, $modified_time){ + if(!$this->handler) return false; + return $this->handler->isValid($key, $modified_time); + } + + function truncate(){ + if(!$this->handler) return false; + return $this->handler->truncate(); + } + } + + class CacheBase{ + function get($key, $modified_time = 0){ + return false; + } + + function put($key, $obj, $valid_time = 0){ + return false; + } + + function isValid($key, $modified_time = 0){ + return false; + } + + function isSupport(){ + return false; + } + + function truncate(){ + return false; + } + } +?> diff --git a/classes/cache/CacheMemcache.class.php b/classes/cache/CacheMemcache.class.php index 6ce27624c..3a3bf555a 100644 --- a/classes/cache/CacheMemcache.class.php +++ b/classes/cache/CacheMemcache.class.php @@ -1,91 +1,91 @@ -Memcache = new Memcache; - - foreach($config['url'] as $url) { - $info = parse_url($url); - $this->Memcache->addServer($info['host'], $info['port']); - } - } - - function isSupport(){ - return $this->Memcache->set('xe', 'xe', MEMCACHE_COMPRESSED, 1); - } - - function getKey($key){ - return md5(_XE_PATH_.$key); - } - - function put($key, $buff, $valid_time = 0){ - if($valid_time == 0) $valid_time = $this->valid_time; - - return $this->Memcache->set($this->getKey($key), array(time(), $buff), MEMCACHE_COMPRESSED, $valid_time); - } - - function isValid($key, $modified_time = 0) { - $_key = $this->getKey($key); - - $obj = $this->Memcache->get($_key); - if(!$obj || !is_array($obj)) return false; - unset($obj[1]); - - if($modified_time > 0 && $modified_time > $obj[0]) { - $this->_delete($_key); - return false; - } - - return true; - } - - function get($key, $modified_time = 0) { - $_key = $this->getKey($key); - $obj = $this->Memcache->get($_key); - if(!$obj || !is_array($obj)) return false; - - if($modified_time > 0 && $modified_time > $obj[0]) { - $this->_delete($_key); - return false; - } - - unset($obj[0]); - - return $obj[1]; - } - - function delete($key) { - $_key = $this->getKey($key); - $this->_delete($_key); - } - - function _delete($_key) { - $this->Memcache->delete($_key); - } - - function truncate() { - // not support memcached - return false; - } - } -?> +Memcache = new Memcache; + + foreach($config['url'] as $url) { + $info = parse_url($url); + $this->Memcache->addServer($info['host'], $info['port']); + } + } + + function isSupport(){ + return $this->Memcache->set('xe', 'xe', MEMCACHE_COMPRESSED, 1); + } + + function getKey($key){ + return md5(_XE_PATH_.$key); + } + + function put($key, $buff, $valid_time = 0){ + if($valid_time == 0) $valid_time = $this->valid_time; + + return $this->Memcache->set($this->getKey($key), array(time(), $buff), MEMCACHE_COMPRESSED, $valid_time); + } + + function isValid($key, $modified_time = 0) { + $_key = $this->getKey($key); + + $obj = $this->Memcache->get($_key); + if(!$obj || !is_array($obj)) return false; + unset($obj[1]); + + if($modified_time > 0 && $modified_time > $obj[0]) { + $this->_delete($_key); + return false; + } + + return true; + } + + function get($key, $modified_time = 0) { + $_key = $this->getKey($key); + $obj = $this->Memcache->get($_key); + if(!$obj || !is_array($obj)) return false; + + if($modified_time > 0 && $modified_time > $obj[0]) { + $this->_delete($_key); + return false; + } + + unset($obj[0]); + + return $obj[1]; + } + + function delete($key) { + $_key = $this->getKey($key); + $this->_delete($_key); + } + + function _delete($_key) { + $this->Memcache->delete($_key); + } + + function truncate() { + // not support memcached + return false; + } + } +?> diff --git a/classes/db/DB.class.php b/classes/db/DB.class.php index 26937e7ad..9fe98db26 100644 --- a/classes/db/DB.class.php +++ b/classes/db/DB.class.php @@ -1,697 +1,697 @@ - '=', - 'more' => '>=', - 'excess' => '>', - 'less' => '<=', - 'below' => '<', - 'notequal' => '<>', - 'notnull' => 'is not null', - 'null' => 'is null', - ); - - var $fd = NULL; ///< connector resource or file description - - var $result = NULL; ///< result - - var $errno = 0; ///< error code (0 means no error) - var $errstr = ''; ///< error message - var $query = ''; ///< query string of latest executed query - var $elapsed_time = 0; ///< elapsed time of latest executed query - - var $transaction_started = false; ///< transaction flag - - var $is_connected = false; ///< is db connected - - var $supported_list = array(); ///< list of supported db, (will be written by classes/DB/DB***.class.php) - - var $cache_file = 'files/cache/queries/'; ///< location of query cache - - /** - * @brief returns instance of certain db type - * @param[in] $db_type type of db - * @return instance - **/ - function &getInstance($db_type = NULL) { - if(!$db_type) $db_type = Context::getDBType(); - if(!$db_type && Context::isInstalled()) return new Object(-1, 'msg_db_not_setted'); - - if(!$GLOBALS['__DB__']) { - $class_name = 'DB'.ucfirst($db_type); - $class_file = _XE_PATH_."classes/db/$class_name.class.php"; - if(!file_exists($class_file)) return new Object(-1, 'msg_db_not_setted'); - - // get a singletone instance of the database driver class - require_once($class_file); - $GLOBALS['__DB__'][$db_type] = call_user_func(array($class_name, 'create')); - } - - return $GLOBALS['__DB__'][$db_type]; - } - - function create() { - return new DB; - } - - /** - * @brief constructor - * @return none - **/ - function DB() { - $this->count_cache_path = _XE_PATH_.$this->count_cache_path; - $this->cache_file = _XE_PATH_.$this->cache_file; - } - - /** - * @brief returns list of supported db - * @return list of supported db - **/ - function getSupportedList() { - $oDB = new DB(); - return $oDB->_getSupportedList(); - } - - /** - * @brief returns list of supported db - * @return list of supported db - **/ - function _getSupportedList() { - $db_classes_path = _XE_PATH_."classes/db/"; - $filter = "/^DB([^\.]+)\.class\.php/i"; - $supported_list = FileHandler::readDir($db_classes_path, $filter, true); - sort($supported_list); - - // after creating instance of class, check is supported - for($i = 0; $i < count($supported_list); $i++) { - $db_type = $supported_list[$i]; - - if(version_compare(phpversion(), '5.0') < 0 && preg_match('/pdo/i',$db_type)) continue; - - $class_name = sprintf("DB%s%s", strtoupper(substr($db_type,0,1)), strtolower(substr($db_type,1))); - $class_file = sprintf(_XE_PATH_."classes/db/%s.class.php", $class_name); - if(!file_exists($class_file)) continue; - - unset($oDB); - require_once($class_file); - $tmp_fn = create_function('', "return new {$class_name}();"); - $oDB = $tmp_fn(); - - if(!$oDB) continue; - - $obj = null; - $obj->db_type = $db_type; - $obj->enable = $oDB->isSupported() ? true : false; - - $this->supported_list[] = $obj; - } - - return $this->supported_list; - } - - /** - * @brief check if the db_type is supported - * @param[in] $db_type type of db to check - * @return true: is supported, false: is not supported - **/ - function isSupported($db_type) { - $supported_list = DB::getSupportedList(); - return in_array($db_type, $supported_list); - } - - /** - * @brief check if is connected - * @return true: connected, false: not connected - **/ - function isConnected() { - return $this->is_connected ? true : false; - } - - /** - * @brief start recording log - * @return none - **/ - function actStart($query) { - $this->setError(0, 'success'); - $this->query = $query; - $this->act_start = getMicroTime(); - $this->elapsed_time = 0; - } - - /** - * @brief finish recording log - * @return none - **/ - function actFinish() { - if(!$this->query) return; - $this->act_finish = getMicroTime(); - $elapsed_time = $this->act_finish - $this->act_start; - $this->elapsed_time = $elapsed_time; - $GLOBALS['__db_elapsed_time__'] += $elapsed_time; - - $log['query'] = $this->query; - $log['elapsed_time'] = $elapsed_time; - - // leave error log if an error occured (if __DEBUG_DB_OUTPUT__ is defined) - if($this->isError()) { - $site_module_info = Context::get('site_module_info'); - $log['module'] = $site_module_info->module; - $log['act'] = Context::get('act'); - $log['query_id'] = $this->query_id; - $log['time'] = date('Y-m-d H:i:s'); - $log['result'] = 'Failed'; - $log['errno'] = $this->errno; - $log['errstr'] = $this->errstr; - - if(__DEBUG_DB_OUTPUT__ == 1) { - $debug_file = _XE_PATH_."files/_debug_db_query.php"; - $buff = array(); - if(!file_exists($debug_file)) $buff[] = ''; - $buff[] = print_r($log, true); - - if(@!$fp = fopen($debug_file, "a")) return; - fwrite($fp, implode("\n", $buff)."\n\n"); - fclose($fp); - } - } else { - $log['result'] = 'Success'; - } - $GLOBALS['__db_queries__'][] = $log; - - // if __LOG_SLOW_QUERY__ if defined, check elapsed time and leave query log - if(__LOG_SLOW_QUERY__ > 0 && $elapsed_time > __LOG_SLOW_QUERY__) { - $buff = ''; - $log_file = _XE_PATH_.'files/_db_slow_query.php'; - if(!file_exists($log_file)) { - $buff = ''."\n"; - } - - $buff .= sprintf("%s\t%s\n\t%0.6f sec\tquery_id:%s\n\n", date("Y-m-d H:i"), $this->query, $elapsed_time, $this->query_id); - - if($fp = fopen($log_file, 'a')) { - fwrite($fp, $buff); - fclose($fp); - } - } - } - - /** - * @brief set error - * @param[in] $errno error code - * @param[in] $errstr error message - * @return none - **/ - function setError($errno = 0, $errstr = 'success') { - $this->errno = $errno; - $this->errstr = $errstr; - } - - /** - * @brief check if an error occured - * @return true: error, false: no error - **/ - function isError() { - return $this->errno === 0 ? false : true; - } - - /** - * @brief returns object of error info - * @return object of error - **/ - function getError() { - $this->errstr = Context::convertEncodingStr($this->errstr); - return new Object($this->errno, $this->errstr); - } - - /** - * @brief query xml 파일을 실행하여 결과를 return - * @param[in] $query_id query id (module.queryname - * @param[in] $args arguments for query - * @return result of query - * @remarks this function finds xml file or cache file of $query_id, compiles it and then execute it - **/ - function executeQuery($query_id, $args = NULL, $arg_columns = NULL) { - if(!$query_id) return new Object(-1, 'msg_invalid_queryid'); - $this->query_id = $query_id; - - $id_args = explode('.', $query_id); - if(count($id_args) == 2) { - $target = 'modules'; - $module = $id_args[0]; - $id = $id_args[1]; - } elseif(count($id_args) == 3) { - $target = $id_args[0]; - if(!in_array($target, array('addons','widgets'))) return; - $module = $id_args[1]; - $id = $id_args[2]; - } - if(!$target || !$module || !$id) return new Object(-1, 'msg_invalid_queryid'); - - $xml_file = sprintf('%s%s/%s/queries/%s.xml', _XE_PATH_, $target, $module, $id); - if(!file_exists($xml_file)) return new Object(-1, 'msg_invalid_queryid'); - - // look for cache file - $cache_file = $this->checkQueryCacheFile($query_id, $xml_file); - - // execute query - return $this->_executeQuery($cache_file, $args, $query_id, $arg_columns); - } - - - /** - * @brief look for cache file - * @param[in] $query_id query id for finding - * @param[in] $xml_file original xml query file - * @return cache file - **/ - function checkQueryCacheFile($query_id,$xml_file){ - - // first try finding cache file - $cache_file = sprintf('%s%s%s.cache.php', _XE_PATH_, $this->cache_file, $query_id); - - if(file_exists($cache_file)) $cache_time = filemtime($cache_file); - else $cache_time = -1; - - // if there is no cache file or is not new, find original xml query file and parse it - if($cache_time < filemtime($xml_file) || $cache_time < filemtime(_XE_PATH_.'classes/db/DB.class.php') || $cache_time < filemtime(_XE_PATH_.'classes/xml/XmlQueryParser.class.php')) { - require_once(_XE_PATH_.'classes/xml/XmlQueryParser.class.php'); - $oParser = new XmlQueryParser(); - $oParser->parse($query_id, $xml_file, $cache_file); - } - - return $cache_file; - } - - - /** - * @brief execute query and return the result - * @param[in] $cache_file cache file of query - * @param[in] $source_args arguments for query - * @param[in] $query_id query id - * @return result of query - **/ - function _executeQuery($cache_file, $source_args, $query_id, $arg_columns) { - global $lang; - - if(!file_exists($cache_file)) return new Object(-1, 'msg_invalid_queryid'); - - if($source_args) $args = @clone($source_args); - - $output = @include($cache_file); - - if( (is_a($output, 'Object') || is_subclass_of($output, 'Object')) && !$output->toBool()) return $output; - $output->_tables = ($output->_tables && is_array($output->_tables)) ? $output->_tables : array(); - - // execute appropriate query - switch($output->action) { - case 'insert' : - $this->resetCountCache($output->tables); - $output = $this->_executeInsertAct($output); - break; - case 'update' : - $this->resetCountCache($output->tables); - $output = $this->_executeUpdateAct($output); - break; - case 'delete' : - $this->resetCountCache($output->tables); - $output = $this->_executeDeleteAct($output); - break; - case 'select' : - $output->arg_columns = is_array($arg_columns)?$arg_columns:array(); - $output = $this->_executeSelectAct($output); - break; - } - - if($this->isError()) $output = $this->getError(); - else if(!is_a($output, 'Object') && !is_subclass_of($output, 'Object')) $output = new Object(); - $output->add('_query', $this->query); - $output->add('_elapsed_time', sprintf("%0.5f", $this->elapsed_time)); - - return $output; - } - - /** - * @brief check $val with $filter_type - * @param[in] $key key value - * @param[in] $val value of $key - * @param[in] $filter_type type of filter to check $val - * @return object - * @remarks this function is to be used from XmlQueryParser - **/ - function checkFilter($key, $val, $filter_type) { - global $lang; - - switch($filter_type) { - case 'email' : - case 'email_address' : - if(!preg_match('/^[_0-9a-z-]+(\.[_0-9a-z-]+)*@[0-9a-z-]+(\.[0-9a-z-]+)*$/is', $val)) return new Object(-1, sprintf($lang->filter->invalid_email, $lang->{$key} ? $lang->{$key} : $key)); - break; - case 'homepage' : - if(!preg_match('/^(http|https)+(:\/\/)+[0-9a-z_-]+\.[^ ]+$/is', $val)) return new Object(-1, sprintf($lang->filter->invalid_homepage, $lang->{$key} ? $lang->{$key} : $key)); - break; - case 'userid' : - case 'user_id' : - if(!preg_match('/^[a-zA-Z]+([_0-9a-zA-Z]+)*$/is', $val)) return new Object(-1, sprintf($lang->filter->invalid_userid, $lang->{$key} ? $lang->{$key} : $key)); - break; - case 'number' : - case 'numbers' : - if(!preg_match('/^(-?)[0-9]+(,\-?[0-9]+)*$/is', $val)) return new Object(-1, sprintf($lang->filter->invalid_number, $lang->{$key} ? $lang->{$key} : $key)); - break; - case 'alpha' : - if(!preg_match('/^[a-z]+$/is', $val)) return new Object(-1, sprintf($lang->filter->invalid_alpha, $lang->{$key} ? $lang->{$key} : $key)); - break; - case 'alpha_number' : - if(!preg_match('/^[0-9a-z]+$/is', $val)) return new Object(-1, sprintf($lang->filter->invalid_alpha_number, $lang->{$key} ? $lang->{$key} : $key)); - break; - } - - return new Object(); - } - - /** - * @brief returns type of column - * @param[in] $column_type_list list of column type - * @param[in] $name name of column type - * @return column type of $name - * @remarks columns are usually like a.b, so it needs another function - **/ - function getColumnType($column_type_list, $name) { - if(strpos($name, '.') === false) return $column_type_list[$name]; - list($prefix, $name) = explode('.', $name); - return $column_type_list[$name]; - } - - /** - * @brief returns the value of condition - * @param[in] $name name of condition - * @param[in] $value value of condition - * @param[in] $operation operation this is used in condition - * @param[in] $type type of condition - * @param[in] $column_type type of column - * @return well modified $value - * @remarks if $operation is like or like_prefix, $value itself will be modified - * @remarks if $type is not 'number', call addQuotes() and wrap with ' ' - **/ - function getConditionValue($name, $value, $operation, $type, $column_type) { - - if(!in_array($operation,array('in','notin','between')) && $type == 'number') { - if(is_array($value)){ - $value = join(',',$value); - } - if(strpos($value, ',') === false && strpos($value, '(') === false) return (int)$value; - return $value; - } - - if(!is_array($value) && strpos($name, '.') !== false && strpos($value, '.') !== false) { - list($table_name, $column_name) = explode('.', $value); - if($column_type[$column_name]) return $value; - } - - switch($operation) { - case 'like_prefix' : - if(!is_array($value)) $value = preg_replace('/(^\'|\'$){1}/', '', $value); - $value = $value.'%'; - break; - case 'like_tail' : - if(!is_array($value)) $value = preg_replace('/(^\'|\'$){1}/', '', $value); - $value = '%'.$value; - break; - case 'like' : - if(!is_array($value)) $value = preg_replace('/(^\'|\'$){1}/', '', $value); - $value = '%'.$value.'%'; - break; - case 'notin' : - if(is_array($value)) - { - $value = $this->addQuotesArray($value); - if($type=='number') return join(',',$value); - else return "'". join("','",$value)."'"; - } - else - { - return $value; - } - break; - case 'in' : - if(is_array($value)) - { - $value = $this->addQuotesArray($value); - if($type=='number') return join(',',$value); - else return "'". join("','",$value)."'"; - } - else - { - return $value; - } - break; - case 'between' : - if(!is_array($value)) $value = array($value); - $value = $this->addQuotesArray($value); - if($type!='number') - { - foreach($value as $k=>$v) - { - $value[$k] = "'".$v."'"; - } - } - - return $value; - break; - default: - if(!is_array($value)) $value = preg_replace('/(^\'|\'$){1}/', '', $value); - } - - return "'".$this->addQuotes($value)."'"; - } - - /** - * @brief returns part of condition - * @param[in] $name name of condition - * @param[in] $value value of condition - * @param[in] $operation operation that is used in condition - * @return detail condition - **/ - function getConditionPart($name, $value, $operation) { - switch($operation) { - case 'equal' : - case 'more' : - case 'excess' : - case 'less' : - case 'below' : - case 'like_tail' : - case 'like_prefix' : - case 'like' : - case 'in' : - case 'notin' : - case 'notequal' : - // if variable is not set or is not string or number, return - if(!isset($value)) return; - if($value === '') return; - if(!in_array(gettype($value), array('string', 'integer'))) return; - break; - case 'between' : - if(!is_array($value)) return; - if(count($value)!=2) return; - - } - - switch($operation) { - case 'equal' : - return $name.' = '.$value; - break; - case 'more' : - return $name.' >= '.$value; - break; - case 'excess' : - return $name.' > '.$value; - break; - case 'less' : - return $name.' <= '.$value; - break; - case 'below' : - return $name.' < '.$value; - break; - case 'like_tail' : - case 'like_prefix' : - case 'like' : - return $name.' like '.$value; - break; - case 'in' : - return $name.' in ('.$value.')'; - break; - case 'notin' : - return $name.' not in ('.$value.')'; - break; - case 'notequal' : - return $name.' <> '.$value; - break; - case 'notnull' : - return $name.' is not null'; - break; - case 'null' : - return $name.' is null'; - break; - case 'between' : - return $name.' between ' . $value[0] . ' and ' . $value[1]; - break; - } - } - - /** - * @brief returns condition key - * @param[in] $output result of query - * @return array of conditions of $output - **/ - function getConditionList($output) { - $conditions = array(); - if(count($output->conditions)) { - foreach($output->conditions as $key => $val) { - if($val['condition']) { - foreach($val['condition'] as $k => $v) { - $conditions[] = $v['column']; - } - } - } - } - - return $conditions; - } - - /** - * @brief returns counter cache data - * @param[in] $tables tables to get data - * @param[in] $condition condition to get data - * @return count of cache data - **/ - function getCountCache($tables, $condition) { - return false; - if(!$tables) return false; - if(!is_dir($this->count_cache_path)) return FileHandler::makeDir($this->count_cache_path); - - $condition = md5($condition); - - if(!is_array($tables)) $tables_str = $tables; - else $tables_str = implode('.',$tables); - - $cache_path = sprintf('%s/%s%s', $this->count_cache_path, $this->prefix, $tables_str); - if(!is_dir($cache_path)) FileHandler::makeDir($cache_path); - - $cache_filename = sprintf('%s/%s.%s', $cache_path, $tables_str, $condition); - if(!file_exists($cache_filename)) return false; - - $cache_mtime = filemtime($cache_filename); - - if(!is_array($tables)) $tables = array($tables); - foreach($tables as $alias => $table) { - $table_filename = sprintf('%s/cache.%s%s', $this->count_cache_path, $this->prefix, $table) ; - if(!file_exists($table_filename) || filemtime($table_filename) > $cache_mtime) return false; - } - - $count = (int)FileHandler::readFile($cache_filename); - return $count; - } - - /** - * @brief save counter cache data - * @param[in] $tables tables to save data - * @param[in] $condition condition to save data - * @param[in] $count count of cache data to save - * @return none - **/ - function putCountCache($tables, $condition, $count = 0) { - return false; - if(!$tables) return false; - if(!is_dir($this->count_cache_path)) return FileHandler::makeDir($this->count_cache_path); - - $condition = md5($condition); - - if(!is_array($tables)) $tables_str = $tables; - else $tables_str = implode('.',$tables); - - $cache_path = sprintf('%s/%s%s', $this->count_cache_path, $this->prefix, $tables_str); - if(!is_dir($cache_path)) FileHandler::makeDir($cache_path); - - $cache_filename = sprintf('%s/%s.%s', $cache_path, $tables_str, $condition); - - FileHandler::writeFile($cache_filename, $count); - } - - /** - * @brief reset counter cache data - * @param[in] $tables tables to reset cache data - * @return true: success, false: failed - **/ - function resetCountCache($tables) { - return false; - if(!$tables) return false; - if(!is_dir($this->count_cache_path)) return FileHandler::makeDir($this->count_cache_path); - - if(!is_array($tables)) $tables = array($tables); - foreach($tables as $alias => $table) { - $filename = sprintf('%s/cache.%s%s', $this->count_cache_path, $this->prefix, $table); - FileHandler::removeFile($filename); - FileHandler::writeFile($filename, ''); - } - - return true; - } - - /** - * @brief returns supported database list - * @return list of supported database - **/ - function getSupportedDatabase(){ - $result = array(); - - if(function_exists('mysql_connect')) $result[] = 'MySQL'; - if(function_exists('cubrid_connect')) $result[] = 'Cubrid'; - if(function_exists('ibase_connect')) $result[] = 'FireBird'; - if(function_exists('pg_connect')) $result[] = 'Postgre'; - if(function_exists('sqlite_open')) $result[] = 'sqlite2'; - if(function_exists('mssql_connect')) $result[] = 'MSSQL'; - if(function_exists('PDO')) $result[] = 'sqlite3(PDO)'; - - return $result; - } - - function dropTable($table_name){ - if(!$table_name) return; - $query = sprintf("drop table %s%s", $this->prefix, $table_name); - $this->_query($query); - } - - function addQuotesArray($arr) - { - if(is_array($arr)) - { - foreach($arr as $k => $v) - { - $arr[$k] = $this->addQuotes($v); - } - } - else - { - $arr = $this->addQuotes($arr); - } - - return $arr; - } - } -?> + '=', + 'more' => '>=', + 'excess' => '>', + 'less' => '<=', + 'below' => '<', + 'notequal' => '<>', + 'notnull' => 'is not null', + 'null' => 'is null', + ); + + var $fd = NULL; ///< connector resource or file description + + var $result = NULL; ///< result + + var $errno = 0; ///< error code (0 means no error) + var $errstr = ''; ///< error message + var $query = ''; ///< query string of latest executed query + var $elapsed_time = 0; ///< elapsed time of latest executed query + + var $transaction_started = false; ///< transaction flag + + var $is_connected = false; ///< is db connected + + var $supported_list = array(); ///< list of supported db, (will be written by classes/DB/DB***.class.php) + + var $cache_file = 'files/cache/queries/'; ///< location of query cache + + /** + * @brief returns instance of certain db type + * @param[in] $db_type type of db + * @return instance + **/ + function &getInstance($db_type = NULL) { + if(!$db_type) $db_type = Context::getDBType(); + if(!$db_type && Context::isInstalled()) return new Object(-1, 'msg_db_not_setted'); + + if(!$GLOBALS['__DB__']) { + $class_name = 'DB'.ucfirst($db_type); + $class_file = _XE_PATH_."classes/db/$class_name.class.php"; + if(!file_exists($class_file)) return new Object(-1, 'msg_db_not_setted'); + + // get a singletone instance of the database driver class + require_once($class_file); + $GLOBALS['__DB__'][$db_type] = call_user_func(array($class_name, 'create')); + } + + return $GLOBALS['__DB__'][$db_type]; + } + + function create() { + return new DB; + } + + /** + * @brief constructor + * @return none + **/ + function DB() { + $this->count_cache_path = _XE_PATH_.$this->count_cache_path; + $this->cache_file = _XE_PATH_.$this->cache_file; + } + + /** + * @brief returns list of supported db + * @return list of supported db + **/ + function getSupportedList() { + $oDB = new DB(); + return $oDB->_getSupportedList(); + } + + /** + * @brief returns list of supported db + * @return list of supported db + **/ + function _getSupportedList() { + $db_classes_path = _XE_PATH_."classes/db/"; + $filter = "/^DB([^\.]+)\.class\.php/i"; + $supported_list = FileHandler::readDir($db_classes_path, $filter, true); + sort($supported_list); + + // after creating instance of class, check is supported + for($i = 0; $i < count($supported_list); $i++) { + $db_type = $supported_list[$i]; + + if(version_compare(phpversion(), '5.0') < 0 && preg_match('/pdo/i',$db_type)) continue; + + $class_name = sprintf("DB%s%s", strtoupper(substr($db_type,0,1)), strtolower(substr($db_type,1))); + $class_file = sprintf(_XE_PATH_."classes/db/%s.class.php", $class_name); + if(!file_exists($class_file)) continue; + + unset($oDB); + require_once($class_file); + $tmp_fn = create_function('', "return new {$class_name}();"); + $oDB = $tmp_fn(); + + if(!$oDB) continue; + + $obj = null; + $obj->db_type = $db_type; + $obj->enable = $oDB->isSupported() ? true : false; + + $this->supported_list[] = $obj; + } + + return $this->supported_list; + } + + /** + * @brief check if the db_type is supported + * @param[in] $db_type type of db to check + * @return true: is supported, false: is not supported + **/ + function isSupported($db_type) { + $supported_list = DB::getSupportedList(); + return in_array($db_type, $supported_list); + } + + /** + * @brief check if is connected + * @return true: connected, false: not connected + **/ + function isConnected() { + return $this->is_connected ? true : false; + } + + /** + * @brief start recording log + * @return none + **/ + function actStart($query) { + $this->setError(0, 'success'); + $this->query = $query; + $this->act_start = getMicroTime(); + $this->elapsed_time = 0; + } + + /** + * @brief finish recording log + * @return none + **/ + function actFinish() { + if(!$this->query) return; + $this->act_finish = getMicroTime(); + $elapsed_time = $this->act_finish - $this->act_start; + $this->elapsed_time = $elapsed_time; + $GLOBALS['__db_elapsed_time__'] += $elapsed_time; + + $log['query'] = $this->query; + $log['elapsed_time'] = $elapsed_time; + + // leave error log if an error occured (if __DEBUG_DB_OUTPUT__ is defined) + if($this->isError()) { + $site_module_info = Context::get('site_module_info'); + $log['module'] = $site_module_info->module; + $log['act'] = Context::get('act'); + $log['query_id'] = $this->query_id; + $log['time'] = date('Y-m-d H:i:s'); + $log['result'] = 'Failed'; + $log['errno'] = $this->errno; + $log['errstr'] = $this->errstr; + + if(__DEBUG_DB_OUTPUT__ == 1) { + $debug_file = _XE_PATH_."files/_debug_db_query.php"; + $buff = array(); + if(!file_exists($debug_file)) $buff[] = ''; + $buff[] = print_r($log, true); + + if(@!$fp = fopen($debug_file, "a")) return; + fwrite($fp, implode("\n", $buff)."\n\n"); + fclose($fp); + } + } else { + $log['result'] = 'Success'; + } + $GLOBALS['__db_queries__'][] = $log; + + // if __LOG_SLOW_QUERY__ if defined, check elapsed time and leave query log + if(__LOG_SLOW_QUERY__ > 0 && $elapsed_time > __LOG_SLOW_QUERY__) { + $buff = ''; + $log_file = _XE_PATH_.'files/_db_slow_query.php'; + if(!file_exists($log_file)) { + $buff = ''."\n"; + } + + $buff .= sprintf("%s\t%s\n\t%0.6f sec\tquery_id:%s\n\n", date("Y-m-d H:i"), $this->query, $elapsed_time, $this->query_id); + + if($fp = fopen($log_file, 'a')) { + fwrite($fp, $buff); + fclose($fp); + } + } + } + + /** + * @brief set error + * @param[in] $errno error code + * @param[in] $errstr error message + * @return none + **/ + function setError($errno = 0, $errstr = 'success') { + $this->errno = $errno; + $this->errstr = $errstr; + } + + /** + * @brief check if an error occured + * @return true: error, false: no error + **/ + function isError() { + return $this->errno === 0 ? false : true; + } + + /** + * @brief returns object of error info + * @return object of error + **/ + function getError() { + $this->errstr = Context::convertEncodingStr($this->errstr); + return new Object($this->errno, $this->errstr); + } + + /** + * @brief query xml 파일을 실행하여 결과를 return + * @param[in] $query_id query id (module.queryname + * @param[in] $args arguments for query + * @return result of query + * @remarks this function finds xml file or cache file of $query_id, compiles it and then execute it + **/ + function executeQuery($query_id, $args = NULL, $arg_columns = NULL) { + if(!$query_id) return new Object(-1, 'msg_invalid_queryid'); + $this->query_id = $query_id; + + $id_args = explode('.', $query_id); + if(count($id_args) == 2) { + $target = 'modules'; + $module = $id_args[0]; + $id = $id_args[1]; + } elseif(count($id_args) == 3) { + $target = $id_args[0]; + if(!in_array($target, array('addons','widgets'))) return; + $module = $id_args[1]; + $id = $id_args[2]; + } + if(!$target || !$module || !$id) return new Object(-1, 'msg_invalid_queryid'); + + $xml_file = sprintf('%s%s/%s/queries/%s.xml', _XE_PATH_, $target, $module, $id); + if(!file_exists($xml_file)) return new Object(-1, 'msg_invalid_queryid'); + + // look for cache file + $cache_file = $this->checkQueryCacheFile($query_id, $xml_file); + + // execute query + return $this->_executeQuery($cache_file, $args, $query_id, $arg_columns); + } + + + /** + * @brief look for cache file + * @param[in] $query_id query id for finding + * @param[in] $xml_file original xml query file + * @return cache file + **/ + function checkQueryCacheFile($query_id,$xml_file){ + + // first try finding cache file + $cache_file = sprintf('%s%s%s.cache.php', _XE_PATH_, $this->cache_file, $query_id); + + if(file_exists($cache_file)) $cache_time = filemtime($cache_file); + else $cache_time = -1; + + // if there is no cache file or is not new, find original xml query file and parse it + if($cache_time < filemtime($xml_file) || $cache_time < filemtime(_XE_PATH_.'classes/db/DB.class.php') || $cache_time < filemtime(_XE_PATH_.'classes/xml/XmlQueryParser.class.php')) { + require_once(_XE_PATH_.'classes/xml/XmlQueryParser.class.php'); + $oParser = new XmlQueryParser(); + $oParser->parse($query_id, $xml_file, $cache_file); + } + + return $cache_file; + } + + + /** + * @brief execute query and return the result + * @param[in] $cache_file cache file of query + * @param[in] $source_args arguments for query + * @param[in] $query_id query id + * @return result of query + **/ + function _executeQuery($cache_file, $source_args, $query_id, $arg_columns) { + global $lang; + + if(!file_exists($cache_file)) return new Object(-1, 'msg_invalid_queryid'); + + if($source_args) $args = @clone($source_args); + + $output = @include($cache_file); + + if( (is_a($output, 'Object') || is_subclass_of($output, 'Object')) && !$output->toBool()) return $output; + $output->_tables = ($output->_tables && is_array($output->_tables)) ? $output->_tables : array(); + + // execute appropriate query + switch($output->action) { + case 'insert' : + $this->resetCountCache($output->tables); + $output = $this->_executeInsertAct($output); + break; + case 'update' : + $this->resetCountCache($output->tables); + $output = $this->_executeUpdateAct($output); + break; + case 'delete' : + $this->resetCountCache($output->tables); + $output = $this->_executeDeleteAct($output); + break; + case 'select' : + $output->arg_columns = is_array($arg_columns)?$arg_columns:array(); + $output = $this->_executeSelectAct($output); + break; + } + + if($this->isError()) $output = $this->getError(); + else if(!is_a($output, 'Object') && !is_subclass_of($output, 'Object')) $output = new Object(); + $output->add('_query', $this->query); + $output->add('_elapsed_time', sprintf("%0.5f", $this->elapsed_time)); + + return $output; + } + + /** + * @brief check $val with $filter_type + * @param[in] $key key value + * @param[in] $val value of $key + * @param[in] $filter_type type of filter to check $val + * @return object + * @remarks this function is to be used from XmlQueryParser + **/ + function checkFilter($key, $val, $filter_type) { + global $lang; + + switch($filter_type) { + case 'email' : + case 'email_address' : + if(!preg_match('/^[_0-9a-z-]+(\.[_0-9a-z-]+)*@[0-9a-z-]+(\.[0-9a-z-]+)*$/is', $val)) return new Object(-1, sprintf($lang->filter->invalid_email, $lang->{$key} ? $lang->{$key} : $key)); + break; + case 'homepage' : + if(!preg_match('/^(http|https)+(:\/\/)+[0-9a-z_-]+\.[^ ]+$/is', $val)) return new Object(-1, sprintf($lang->filter->invalid_homepage, $lang->{$key} ? $lang->{$key} : $key)); + break; + case 'userid' : + case 'user_id' : + if(!preg_match('/^[a-zA-Z]+([_0-9a-zA-Z]+)*$/is', $val)) return new Object(-1, sprintf($lang->filter->invalid_userid, $lang->{$key} ? $lang->{$key} : $key)); + break; + case 'number' : + case 'numbers' : + if(!preg_match('/^(-?)[0-9]+(,\-?[0-9]+)*$/is', $val)) return new Object(-1, sprintf($lang->filter->invalid_number, $lang->{$key} ? $lang->{$key} : $key)); + break; + case 'alpha' : + if(!preg_match('/^[a-z]+$/is', $val)) return new Object(-1, sprintf($lang->filter->invalid_alpha, $lang->{$key} ? $lang->{$key} : $key)); + break; + case 'alpha_number' : + if(!preg_match('/^[0-9a-z]+$/is', $val)) return new Object(-1, sprintf($lang->filter->invalid_alpha_number, $lang->{$key} ? $lang->{$key} : $key)); + break; + } + + return new Object(); + } + + /** + * @brief returns type of column + * @param[in] $column_type_list list of column type + * @param[in] $name name of column type + * @return column type of $name + * @remarks columns are usually like a.b, so it needs another function + **/ + function getColumnType($column_type_list, $name) { + if(strpos($name, '.') === false) return $column_type_list[$name]; + list($prefix, $name) = explode('.', $name); + return $column_type_list[$name]; + } + + /** + * @brief returns the value of condition + * @param[in] $name name of condition + * @param[in] $value value of condition + * @param[in] $operation operation this is used in condition + * @param[in] $type type of condition + * @param[in] $column_type type of column + * @return well modified $value + * @remarks if $operation is like or like_prefix, $value itself will be modified + * @remarks if $type is not 'number', call addQuotes() and wrap with ' ' + **/ + function getConditionValue($name, $value, $operation, $type, $column_type) { + + if(!in_array($operation,array('in','notin','between')) && $type == 'number') { + if(is_array($value)){ + $value = join(',',$value); + } + if(strpos($value, ',') === false && strpos($value, '(') === false) return (int)$value; + return $value; + } + + if(!is_array($value) && strpos($name, '.') !== false && strpos($value, '.') !== false) { + list($table_name, $column_name) = explode('.', $value); + if($column_type[$column_name]) return $value; + } + + switch($operation) { + case 'like_prefix' : + if(!is_array($value)) $value = preg_replace('/(^\'|\'$){1}/', '', $value); + $value = $value.'%'; + break; + case 'like_tail' : + if(!is_array($value)) $value = preg_replace('/(^\'|\'$){1}/', '', $value); + $value = '%'.$value; + break; + case 'like' : + if(!is_array($value)) $value = preg_replace('/(^\'|\'$){1}/', '', $value); + $value = '%'.$value.'%'; + break; + case 'notin' : + if(is_array($value)) + { + $value = $this->addQuotesArray($value); + if($type=='number') return join(',',$value); + else return "'". join("','",$value)."'"; + } + else + { + return $value; + } + break; + case 'in' : + if(is_array($value)) + { + $value = $this->addQuotesArray($value); + if($type=='number') return join(',',$value); + else return "'". join("','",$value)."'"; + } + else + { + return $value; + } + break; + case 'between' : + if(!is_array($value)) $value = array($value); + $value = $this->addQuotesArray($value); + if($type!='number') + { + foreach($value as $k=>$v) + { + $value[$k] = "'".$v."'"; + } + } + + return $value; + break; + default: + if(!is_array($value)) $value = preg_replace('/(^\'|\'$){1}/', '', $value); + } + + return "'".$this->addQuotes($value)."'"; + } + + /** + * @brief returns part of condition + * @param[in] $name name of condition + * @param[in] $value value of condition + * @param[in] $operation operation that is used in condition + * @return detail condition + **/ + function getConditionPart($name, $value, $operation) { + switch($operation) { + case 'equal' : + case 'more' : + case 'excess' : + case 'less' : + case 'below' : + case 'like_tail' : + case 'like_prefix' : + case 'like' : + case 'in' : + case 'notin' : + case 'notequal' : + // if variable is not set or is not string or number, return + if(!isset($value)) return; + if($value === '') return; + if(!in_array(gettype($value), array('string', 'integer'))) return; + break; + case 'between' : + if(!is_array($value)) return; + if(count($value)!=2) return; + + } + + switch($operation) { + case 'equal' : + return $name.' = '.$value; + break; + case 'more' : + return $name.' >= '.$value; + break; + case 'excess' : + return $name.' > '.$value; + break; + case 'less' : + return $name.' <= '.$value; + break; + case 'below' : + return $name.' < '.$value; + break; + case 'like_tail' : + case 'like_prefix' : + case 'like' : + return $name.' like '.$value; + break; + case 'in' : + return $name.' in ('.$value.')'; + break; + case 'notin' : + return $name.' not in ('.$value.')'; + break; + case 'notequal' : + return $name.' <> '.$value; + break; + case 'notnull' : + return $name.' is not null'; + break; + case 'null' : + return $name.' is null'; + break; + case 'between' : + return $name.' between ' . $value[0] . ' and ' . $value[1]; + break; + } + } + + /** + * @brief returns condition key + * @param[in] $output result of query + * @return array of conditions of $output + **/ + function getConditionList($output) { + $conditions = array(); + if(count($output->conditions)) { + foreach($output->conditions as $key => $val) { + if($val['condition']) { + foreach($val['condition'] as $k => $v) { + $conditions[] = $v['column']; + } + } + } + } + + return $conditions; + } + + /** + * @brief returns counter cache data + * @param[in] $tables tables to get data + * @param[in] $condition condition to get data + * @return count of cache data + **/ + function getCountCache($tables, $condition) { + return false; + if(!$tables) return false; + if(!is_dir($this->count_cache_path)) return FileHandler::makeDir($this->count_cache_path); + + $condition = md5($condition); + + if(!is_array($tables)) $tables_str = $tables; + else $tables_str = implode('.',$tables); + + $cache_path = sprintf('%s/%s%s', $this->count_cache_path, $this->prefix, $tables_str); + if(!is_dir($cache_path)) FileHandler::makeDir($cache_path); + + $cache_filename = sprintf('%s/%s.%s', $cache_path, $tables_str, $condition); + if(!file_exists($cache_filename)) return false; + + $cache_mtime = filemtime($cache_filename); + + if(!is_array($tables)) $tables = array($tables); + foreach($tables as $alias => $table) { + $table_filename = sprintf('%s/cache.%s%s', $this->count_cache_path, $this->prefix, $table) ; + if(!file_exists($table_filename) || filemtime($table_filename) > $cache_mtime) return false; + } + + $count = (int)FileHandler::readFile($cache_filename); + return $count; + } + + /** + * @brief save counter cache data + * @param[in] $tables tables to save data + * @param[in] $condition condition to save data + * @param[in] $count count of cache data to save + * @return none + **/ + function putCountCache($tables, $condition, $count = 0) { + return false; + if(!$tables) return false; + if(!is_dir($this->count_cache_path)) return FileHandler::makeDir($this->count_cache_path); + + $condition = md5($condition); + + if(!is_array($tables)) $tables_str = $tables; + else $tables_str = implode('.',$tables); + + $cache_path = sprintf('%s/%s%s', $this->count_cache_path, $this->prefix, $tables_str); + if(!is_dir($cache_path)) FileHandler::makeDir($cache_path); + + $cache_filename = sprintf('%s/%s.%s', $cache_path, $tables_str, $condition); + + FileHandler::writeFile($cache_filename, $count); + } + + /** + * @brief reset counter cache data + * @param[in] $tables tables to reset cache data + * @return true: success, false: failed + **/ + function resetCountCache($tables) { + return false; + if(!$tables) return false; + if(!is_dir($this->count_cache_path)) return FileHandler::makeDir($this->count_cache_path); + + if(!is_array($tables)) $tables = array($tables); + foreach($tables as $alias => $table) { + $filename = sprintf('%s/cache.%s%s', $this->count_cache_path, $this->prefix, $table); + FileHandler::removeFile($filename); + FileHandler::writeFile($filename, ''); + } + + return true; + } + + /** + * @brief returns supported database list + * @return list of supported database + **/ + function getSupportedDatabase(){ + $result = array(); + + if(function_exists('mysql_connect')) $result[] = 'MySQL'; + if(function_exists('cubrid_connect')) $result[] = 'Cubrid'; + if(function_exists('ibase_connect')) $result[] = 'FireBird'; + if(function_exists('pg_connect')) $result[] = 'Postgre'; + if(function_exists('sqlite_open')) $result[] = 'sqlite2'; + if(function_exists('mssql_connect')) $result[] = 'MSSQL'; + if(function_exists('PDO')) $result[] = 'sqlite3(PDO)'; + + return $result; + } + + function dropTable($table_name){ + if(!$table_name) return; + $query = sprintf("drop table %s%s", $this->prefix, $table_name); + $this->_query($query); + } + + function addQuotesArray($arr) + { + if(is_array($arr)) + { + foreach($arr as $k => $v) + { + $arr[$k] = $this->addQuotes($v); + } + } + else + { + $arr = $this->addQuotes($arr); + } + + return $arr; + } + } +?> diff --git a/classes/db/DBCubrid.class.php b/classes/db/DBCubrid.class.php index 2de93e28e..493db32bb 100644 --- a/classes/db/DBCubrid.class.php +++ b/classes/db/DBCubrid.class.php @@ -1,1257 +1,1257 @@ - 'numeric(20)', - 'number' => 'integer', - 'varchar' => 'character varying', - 'char' => 'character', - 'tinytext' => 'character varying(256)', - 'text' => 'character varying(1073741823)', - 'bigtext' => 'character varying(1073741823)', - 'date' => 'character varying(14)', - 'float' => 'float', - ); - - /** - * @brief constructor - **/ - function DBCubrid() - { - $this->_setDBInfo(); - $this->_connect(); - } - - /** - * @brief create an instance of this class - */ - function create() - { - return new DBCubrid; - } - - /** - * @brief 설치 가능 여부를 return - **/ - function isSupported() - { - if (!function_exists('cubrid_connect')) return false; - return true; - } - - /** - * @brief DB정보 설정 및 connect/ close - **/ - function _setDBInfo() - { - $db_info = Context::getDBInfo(); - $this->hostname = $db_info->db_hostname; - $this->userid = $db_info->db_userid; - $this->password = $db_info->db_password; - $this->database = $db_info->db_database; - $this->port = $db_info->db_port; - $this->prefix = $db_info->db_table_prefix; - - if (!substr($this->prefix, -1) != '_') $this->prefix .= '_'; - } - - /** - * @brief DB 접속 - **/ - function _connect() - { - // db 정보가 없으면 무시 - if (!$this->hostname || !$this->userid || !$this->password || !$this->database || !$this->port) return; - - // 접속시도 - $this->fd = @cubrid_connect ($this->hostname, $this->port, $this->database, $this->userid, $this->password); - - // 접속체크 - if (!$this->fd) { - $this->setError (-1, 'database connect fail'); - return $this->is_connected = false; - } - - $this->is_connected = true; - $this->password = md5 ($this->password); - } - - /** - * @brief DB접속 해제 - **/ - function close() - { - if (!$this->isConnected ()) return; - - @cubrid_commit ($this->fd); - @cubrid_disconnect ($this->fd); - $this->transaction_started = false; - } - - /** - * @brief 쿼리에서 입력되는 문자열 변수들의 quotation 조절 - **/ - function addQuotes($string) - { - if (!$this->fd) return $string; - - if (version_compare (PHP_VERSION, "5.9.0", "<") && - get_magic_quotes_gpc ()) { - $string = stripslashes (str_replace ("\\","\\\\", $string)); - } - - if (!is_numeric ($string)) { - /* - if ($this->isConnected()) { - $string = cubrid_real_escape_string($string); - } - else { - $string = str_replace("'","\'",$string); - } - */ - - $string = str_replace("'","''",$string); - } - - return $string; - } - - /** - * @brief 트랜잭션 시작 - **/ - function begin() - { - if (!$this->isConnected () || $this->transaction_started) return; - $this->transaction_started = true; - } - - /** - * @brief 롤백 - **/ - function rollback() - { - if (!$this->isConnected () || !$this->transaction_started) return; - @cubrid_rollback ($this->fd); - $this->transaction_started = false; - } - - /** - * @brief 커밋 - **/ - function commit() - { - if (!$force && (!$this->isConnected () || - !$this->transaction_started)) return; - - @cubrid_commit($this->fd); - $this->transaction_started = false; - } - - /** - * @brief : 쿼리문의 실행 및 결과의 fetch 처리 - * - * query : query문 실행하고 result return\n - * fetch : reutrn 된 값이 없으면 NULL\n - * rows이면 array object\n - * row이면 object\n - * return\n - **/ - function _query($query) - { - if (!$query || !$this->isConnected ()) return; - - // 쿼리 시작을 알림 - $this->actStart ($query); - - // 쿼리 문 실행 - $result = @cubrid_execute ($this->fd, $query); - // 오류 체크 - if (cubrid_error_code ()) { - $code = cubrid_error_code (); - $msg = cubrid_error_msg (); - - $this->setError ($code, $msg); - } - - // 쿼리 실행 종료를 알림 - $this->actFinish (); - - // 결과 리턴 - return $result; - } - - /** - * @brief 결과를 fetch - **/ - function _fetch($result) - { - if (!$this->isConnected() || $this->isError() || !$result) return; - - $col_types = cubrid_column_types ($result); - $col_names = cubrid_column_names ($result); - $max = count ($col_types); - - for ($count = 0; $count < $max; $count++) { - if (preg_match ("/^char/", $col_types[$count]) > 0) { - $char_type_fields[] = $col_names[$count]; - } - } - - while ($tmp = cubrid_fetch ($result, CUBRID_OBJECT)) { - if (is_array ($char_type_fields)) { - foreach ($char_type_fields as $val) { - $tmp->{$val} = rtrim ($tmp->{$val}); - } - } - - $output[] = $tmp; - } - - unset ($char_type_fields); - - if ($result) cubrid_close_request($result); - - if (count ($output) == 1) return $output[0]; - return $output; - } - - /** - * @brief 1씩 증가되는 sequence 값을 return (cubrid의 auto_increment는 sequence테이블에서만 사용) - **/ - function getNextSequence() - { - $this->_makeSequence(); - - $query = sprintf ("select \"%ssequence\".\"nextval\" as \"seq\" from db_root", $this->prefix); - $result = $this->_query($query); - $output = $this->_fetch($result); - - return $output->seq; - } - - /** - * @brief 마이그레이션시 sequence 가 없을 경우 생성 - **/ - function _makeSequence() - { - if($_GLOBALS['XE_EXISTS_SEQUENCE']) return; - - // check cubrid serial - $query = sprintf('select count(*) as "count" from "db_serial" where name=\'%ssequence\'', $this->prefix); - $result = $this->_query($query); - $output = $this->_fetch($result); - - // if do not create serial - if ($output->count == 0) { - $query = sprintf('select max("a"."srl") as "srl" from '. - '( select max("document_srl") as "srl" from '. - '"%sdocuments" UNION '. - 'select max("comment_srl") as "srl" from '. - '"%scomments" UNION '. - 'select max("member_srl") as "srl" from '. - '"%smember"'. - ') as "a"', $this->prefix, $this->prefix, $this->prefix); - - $result = $this->_query($query); - $output = $this->_fetch($result); - $srl = $output->srl; - if ($srl < 1) { - $start = 1; - } - else { - $start = $srl + 1000000; - } - - // create sequence - $query = sprintf('create serial "%ssequence" start with %s increment by 1 minvalue 1 maxvalue 10000000000000000000000000000000000000 nocycle;', $this->prefix, $start); - $this->_query($query); - } - - $_GLOBALS['XE_EXISTS_SEQUENCE'] = true; - } - - - /** - * @brief 테이블 기생성 여부 return - **/ - function isTableExists ($target_name) - { - if($target_name == 'sequence') { - $query = sprintf ("select \"name\" from \"db_serial\" where \"name\" = '%s%s'", $this->prefix, $target_name); - } - else { - $query = sprintf ("select \"class_name\" from \"db_class\" where \"class_name\" = '%s%s'", $this->prefix, $target_name); - } - - $result = $this->_query ($query); - if (cubrid_num_rows($result) > 0) { - $output = true; - } - else { - $output = false; - } - - if ($result) cubrid_close_request ($result); - - return $output; - } - - /** - * @brief 특정 테이블에 특정 column 추가 - **/ - function addColumn($table_name, $column_name, $type = 'number', $size = '', $default = '', $notnull = false) - { - $type = strtoupper($this->column_type[$type]); - if ($type == 'INTEGER') $size = ''; - - $query = sprintf ("alter class \"%s%s\" add \"%s\" ", $this->prefix, $table_name, $column_name); - - if ($type == 'char' || $type == 'varchar') { - if ($size) $size = $size * 3; - } - - if ($size) { - $query .= sprintf ("%s(%s) ", $type, $size); - } - else { - $query .= sprintf ("%s ", $type); - } - - if ($default) { - if ($type == 'INTEGER' || $type == 'BIGINT' || $type=='INT') { - $query .= sprintf ("default %d ", $default); - } - else { - $query .= sprintf ("default '%s' ", $default); - } - } - - if ($notnull) $query .= "not null "; - - $this->_query ($query); - } - - /** - * @brief 특정 테이블에 특정 column 제거 - **/ - function dropColumn ($table_name, $column_name) - { - $query = sprintf ("alter class \"%s%s\" drop \"%s\" ", $this->prefix, $table_name, $column_name); - - $this->_query ($query); - } - - /** - * @brief 특정 테이블의 column의 정보를 return - **/ - function isColumnExists ($table_name, $column_name) - { - $query = sprintf ("select \"attr_name\" from \"db_attribute\" where ". "\"attr_name\" ='%s' and \"class_name\" = '%s%s'", $column_name, $this->prefix, $table_name); - $result = $this->_query ($query); - - if (cubrid_num_rows ($result) > 0) $output = true; - else $output = false; - - if ($result) cubrid_close_request ($result); - - return $output; - } - - /** - * @brief 특정 테이블에 특정 인덱스 추가 - * $target_columns = array(col1, col2) - * $is_unique? unique : none - **/ - function addIndex ($table_name, $index_name, $target_columns, $is_unique = false) - { - if (!is_array ($target_columns)) { - $target_columns = array ($target_columns); - } - - $query = sprintf ("create %s index \"%s\" on \"%s%s\" (%s);", $is_unique?'unique':'', $this->prefix .$index_name, $this->prefix, $table_name, '"'.implode('","',$target_columns).'"'); - - $this->_query ($query); - } - - /** - * @brief 특정 테이블의 특정 인덱스 삭제 - **/ - function dropIndex ($table_name, $index_name, $is_unique = false) - { - $query = sprintf ("drop %s index \"%s\" on \"%s%s\"", $is_unique?'unique':'', $this->prefix .$index_name, $this->prefix, $table_name); - - $this->_query($query); - } - - /** - * @brief 특정 테이블의 index 정보를 return - **/ - function isIndexExists ($table_name, $index_name) - { - $query = sprintf ("select \"index_name\" from \"db_index\" where ". "\"class_name\" = '%s%s' and \"index_name\" = '%s' ", $this->prefix, $table_name, $this->prefix .$index_name); - $result = $this->_query ($query); - - if ($this->isError ()) return false; - - $output = $this->_fetch ($result); - - if (!$output) return false; - return true; - } - - /** - * @brief xml 을 받아서 테이블을 생성 - **/ - function createTableByXml ($xml_doc) - { - return $this->_createTable ($xml_doc); - } - - /** - * @brief xml 을 받아서 테이블을 생성 - **/ - function createTableByXmlFile ($file_name) - { - if (!file_exists ($file_name)) return; - // xml 파일을 읽음 - $buff = FileHandler::readFile ($file_name); - - return $this->_createTable ($buff); - } - - /** - * @brief schema xml을 이용하여 create class query생성 - * - * type : number, varchar, tinytext, text, bigtext, char, date, \n - * opt : notnull, default, size\n - * index : primary key, index, unique\n - **/ - function _createTable ($xml_doc) - { - // xml parsing - $oXml = new XmlParser(); - $xml_obj = $oXml->parse($xml_doc); - - // 테이블 생성 schema 작성 - $table_name = $xml_obj->table->attrs->name; - - // if the table already exists exit function - if ($this->isTableExists($table_name)) return; - - // 만약 테이블 이름이 sequence라면 serial 생성 - if ($table_name == 'sequence') { - $query = sprintf ('create serial "%s" start with 1 increment by 1'. - ' minvalue 1 '. - 'maxvalue 10000000000000000000000000000000000000'. ' nocycle;', $this->prefix.$table_name); - - return $this->_query($query); - } - - - $table_name = $this->prefix.$table_name; - - $query = sprintf ('create class "%s";', $table_name); - $this->_query ($query); - - if (!is_array ($xml_obj->table->column)) { - $columns[] = $xml_obj->table->column; - } - else { - $columns = $xml_obj->table->column; - } - - $query = sprintf ("alter class \"%s\" add attribute ", $table_name); - - foreach ($columns as $column) { - $name = $column->attrs->name; - $type = $column->attrs->type; - $size = $column->attrs->size; - $notnull = $column->attrs->notnull; - $primary_key = $column->attrs->primary_key; - $index = $column->attrs->index; - $unique = $column->attrs->unique; - $default = $column->attrs->default; - - switch ($this->column_type[$type]) { - case 'integer' : - $size = null; - break; - case 'text' : - $size = null; - break; - } - - if (isset ($default) && ($type == 'varchar' || $type == 'char' || - $type == 'text' || $type == 'tinytext' || $type == 'bigtext')) { - $default = sprintf ("'%s'", $default); - } - - if ($type == 'varchar' || $type == 'char') { - if($size) $size = $size * 3; - } - - - $column_schema[] = sprintf ('"%s" %s%s %s %s', - $name, - $this->column_type[$type], - $size?'('.$size.')':'', - isset($default)?"default ".$default:'', - $notnull?'not null':''); - - if ($primary_key) { - $primary_list[] = $name; - } - else if ($unique) { - $unique_list[$unique][] = $name; - } - else if ($index) { - $index_list[$index][] = $name; - } - } - - $query .= implode (',', $column_schema).';'; - $this->_query ($query); - - if (count ($primary_list)) { - $query = sprintf ("alter class \"%s\" add attribute constraint ". "\"pkey_%s\" PRIMARY KEY(%s);", $table_name, $table_name, '"'.implode('","',$primary_list).'"'); - $this->_query ($query); - } - - if (count ($unique_list)) { - foreach ($unique_list as $key => $val) { - $query = sprintf ("create unique index \"%s\" on \"%s\" ". "(%s);", $this->prefix .$key, $table_name, '"'.implode('","', $val).'"'); - $this->_query ($query); - } - } - - if (count ($index_list)) { - foreach ($index_list as $key => $val) { - $query = sprintf ("create index \"%s\" on \"%s\" (%s);", $this->prefix .$key, $table_name, '"'.implode('","',$val).'"'); - $this->_query ($query); - } - } - } - - /** - * @brief 조건문 작성하여 return - **/ - function getCondition ($output) - { - if (!$output->conditions) return; - $condition = $this->_getCondition ($output->conditions, $output->column_type, $output); - if ($condition) $condition = ' where '.$condition; - - return $condition; - } - - function _getCondition ($conditions, $column_type, &$output) - { - $condition = ''; - - foreach ($conditions as $val) { - $sub_condition = ''; - - foreach ($val['condition'] as $v) { - if (!isset ($v['value'])) continue; - if ($v['value'] === '') continue; - if(!in_array(gettype($v['value']), array('string', 'integer', 'double', 'array'))) continue; - - $name = $v['column']; - $operation = $v['operation']; - $value = $v['value']; - $type = $this->getColumnType ($column_type, $name); - $pipe = $v['pipe']; - $value = $this->getConditionValue ($name, $value, $operation, $type, $column_type); - - if (!$value) { - $value = $v['value']; - if (strpos ($value, '(')) { - $valuetmp = $value; - } - elseif (strpos ($value, ".") === false) { - $valuetmp = $value; - } - else { - $valuetmp = '"'.str_replace('.', '"."', $value).'"'; - } - } - else { - $tmp = explode('.',$value); - - if (count($tmp)==2) { - $table = $tmp[0]; - $column = $tmp[1]; - - if ($column_type[$column] && (in_array ($table, $output->tables) || - array_key_exists($table, $output->tables))) { - $valuetmp = sprintf('"%s"."%s"', $table, $column); - } - else { - $valuetmp = $value; - } - } - else { - $valuetmp = $value; - } - } - - if (strpos ($name, '(') > 0) { - $nametmp = $name; - } - elseif (strpos ($name, ".") === false) { - $nametmp = '"'.$name.'"'; - } - else { - $nametmp = '"'.str_replace('.', '"."', $name).'"'; - } - $str = $this->getConditionPart ($nametmp, $valuetmp, $operation); - if ($sub_condition) $sub_condition .= ' '.$pipe.' '; - $sub_condition .= $str; - } - - if ($sub_condition) { - if ($condition && $val['pipe']) { - $condition .= ' '.$val['pipe'].' '; - } - $condition .= '('.$sub_condition.')'; - } - } - - return $condition; - } - - /** - * @brief insertAct 처리 - **/ - function _executeInsertAct ($output) - { - // 테이블 정리 - foreach ($output->tables as $val) { - $table_list[] = '"'.$this->prefix.$val.'"'; - } - - // 컬럼 정리 - foreach ($output->columns as $key => $val) { - $name = $val['name']; - $value = $val['value']; - //if ($this->getColumnType ($output->column_type, $name) != 'number') - if ($output->column_type[$name] != 'number') { - if (!is_null($value)) { - $value = "'" . $this->addQuotes($value) ."'"; - } - else { - if ($val['notnull']=='notnull') { - $value = "''"; - } - else { - //$value = 'null'; - $value = "''"; - } - } - } - 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 .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; - $result = $this->_query ($query); - if ($result && !$this->transaction_started) { - @cubrid_commit ($this->fd); - } - - return $result; - } - - /** - * @brief updateAct 처리 - **/ - function _executeUpdateAct ($output) - { - // 테이블 정리 - foreach ($output->tables as $key => $val) { - $table_list[] = '"'.$this->prefix.$val.'" as "'.$key.'"'; - } - - $check_click_count = true; - - // 컬럼 정리 - foreach ($output->columns as $key => $val) { - if (!isset ($val['value'])) continue; - $name = $val['name']; - $value = $val['value']; - - if (substr ($value, -2) != '+1' || $output->column_type[$name] != 'number') { - $check_click_count = false; - } - - for ($i = 0; $i < $key; $i++) { - /* 한문장에 같은 속성에 대한 중복 설정은 큐브리드에서는 허용치 않음 */ - if ($output->columns[$i]['name'] == $name) break; - } - if ($i < $key) continue; // 중복이 발견되면 이후의 설정은 무시 - - if (strpos ($name, '.') !== false && strpos ($value, '.') !== false) { - $column_list[] = $name.' = '.$value; - } - else { - if ($output->column_type[$name] != 'number') { - $check_column = false; - $value = "'".$this->addQuotes ($value)."'"; - } - elseif (!$value || is_numeric ($value)) { - $value = (int) $value; - } - - $column_list[] = sprintf ("\"%s\" = %s", $name, $value); - } - } - - // 조건절 정리 - $condition = $this->getCondition ($output); - - $check_click_count_condition = false; - if ($check_click_count) { - foreach ($output->conditions as $val) { - if ($val['pipe'] == 'or') { - $check_click_count_condition = false; - break; - } - - foreach ($val['condition'] as $v) { - if ($v['operation'] == 'equal') { - $check_click_count_condition = true; - } - else { - if ($v['operation'] == 'in' && !strpos ($v['value'], ',')) { - $check_click_count_condition = true; - } - else { - $check_click_count_condition = false; - } - } - - if ($v['pipe'] == 'or') { - $check_click_count_condition = false; - break; - } - } - } - } - - if ($check_click_count&& $check_click_count_condition && count ($output->tables) == 1 && count ($output->conditions) > 0 && count ($output->groups) == 0 && count ($output->order) == 0) { - foreach ($output->columns as $v) { - $incr_columns[] = 'incr("'.$v['name'].'")'; - } - - $query = sprintf ('select %s from %s %s', join (',', $incr_columns), implode(',', $table_list), $condition); - } - else { - $query = sprintf ("update %s set %s %s", implode (',', $table_list), implode (',', $column_list), $condition); - } - - $result = $this->_query ($query); - if ($result && !$this->transaction_started) @cubrid_commit ($this->fd); - - return $result; - } - - /** - * @brief deleteAct 처리 - **/ - function _executeDeleteAct ($output) - { - // 테이블 정리 - foreach ($output->tables as $val) { - $table_list[] = '"'.$this->prefix.$val.'"'; - } - - // 조건절 정리 - $condition = $this->getCondition ($output); - - $query = sprintf ("delete from %s %s", implode (',',$table_list), $condition); - $result = $this->_query ($query); - if ($result && !$this->transaction_started) @cubrid_commit ($this->fd); - - return $result; - } - - /** - * @brief selectAct 처리 - * - * select의 경우 특정 페이지의 목록을 가져오는 것을 편하게 하기 위해\n - * navigation이라는 method를 제공 - **/ - function _executeSelectAct ($output) - { - // 테이블 정리 - $table_list = array (); - foreach ($output->tables as $key => $val) { - $table_list[] = '"'.$this->prefix.$val.'" as "'.$key.'"'; - } - $left_join = array (); - // why??? - $left_tables = (array) $output->left_tables; - - foreach ($left_tables as $key => $val) { - $condition = $this->_getCondition ($output->left_conditions[$key], $output->column_type, $output); - if ($condition) { - $left_join[] = $val.' "'.$this->prefix.$output->_tables[$key]. '" "'.$key.'" on ('.$condition.')'; - } - } - - $click_count = array(); - if(!$output->columns){ - $output->columns = array(array('name'=>'*')); - } - - $column_list = array (); - foreach ($output->columns as $key => $val) { - $name = $val['name']; - - $click_count = '%s'; - if ($val['click_count'] && count ($output->conditions) > 0) { - $click_count = 'incr(%s)'; - } - - $alias = $val['alias'] ? sprintf ('"%s"', $val['alias']) : null; - $_alias = $val['alias']; - - if ($name == '*') { - $column_list[] = $name; - } - elseif (strpos ($name, '.') === false && strpos ($name, '(') === false) { - $name = sprintf ($click_count,$name); - if ($alias) { - $column_list[$alias] = sprintf('"%s" as %s', $name, $alias); - } - else { - $column_list[] = sprintf ('"%s"', $name); - } - } - else { - if (strpos ($name, '.') != false) { - list ($prefix, $name) = explode('.', $name); - if (($now_matchs = preg_match_all ("/\(/", $prefix, $xtmp)) > 0) { - if ($now_matchs == 1) { - $tmpval = explode ("(", $prefix); - $tmpval[1] = sprintf ('"%s"', $tmpval[1]); - $prefix = implode ("(", $tmpval); - $tmpval = explode (")", $name); - $tmpval[0] = sprintf ('"%s"', $tmpval[0]); - $name = implode (")", $tmpval); - } - } - else { - $prefix = sprintf ('"%s"', $prefix); - $name = ($name == '*') ? $name : sprintf('"%s"',$name); - } - $xtmp = null; - $now_matchs = null; - if($alias) $column_list[$_alias] = sprintf ($click_count, sprintf ('%s.%s', $prefix, $name)) . ($alias ? sprintf (' as %s',$alias) : ''); - else $column_list[] = sprintf ($click_count, sprintf ('%s.%s', $prefix, $name)); - } - elseif (($now_matchs = preg_match_all ("/\(/", $name, $xtmp)) > 0) { - if ($now_matchs == 1 && preg_match ("/[a-zA-Z0-9]*\(\*\)/", $name) < 1) { - $open_pos = strpos ($name, "("); - $close_pos = strpos ($name, ")"); - - if (preg_match ("/,/", $name)) { - $tmp_func_name = sprintf ('%s', substr ($name, 0, $open_pos)); - $tmp_params = sprintf ('%s', substr ($name, $open_pos + 1, $close_pos - $open_pos - 1)); - $tmpval = null; - $tmpval = explode (',', $tmp_params); - - foreach ($tmpval as $tmp_param) { - $tmp_param_list[] = (!is_numeric ($tmp_param)) ? sprintf ('"%s"', $tmp_param) : $tmp_param; - } - - $tmpval = implode (',', $tmp_param_list); - $name = sprintf ('%s(%s)', $tmp_func_name, $tmpval); - } - else { - $name = sprintf ('%s("%s")', substr ($name, 0, $open_pos), substr ($name, $open_pos + 1, $close_pos - $open_pos - 1)); - } - } - - if($alias) $column_list[$_alias] = sprintf ($click_count, $name). ($alias ? sprintf (' as %s', $alias) : ''); - else $column_list[] = sprintf ($click_count, $name); - } - else { - if($alias) $column_list[$_alias] = sprintf($click_count, $name). ($alias ? sprintf(' as %s',$alias) : ''); - else $column_list[] = sprintf($click_count, $name); - } - } - $columns = implode (',', $column_list); - } - - $condition = $this->getCondition ($output); - - $output->column_list = $column_list; - if ($output->list_count && $output->page) { - return ($this->_getNavigationData($table_list, $columns, $left_join, $condition, $output)); - } - - if ($output->order) { - $conditions = $this->getConditionList($output); - //if(in_array('list_order', $conditions) || in_array('update_order', $conditions)) { - foreach($output->order as $key => $val) { - $col = $val[0]; - if(!in_array($col, array('list_order','update_order'))) continue; - if ($condition) $condition .= sprintf(' and %s < 2100000000 ', $col); - else $condition = sprintf(' where %s < 2100000000 ', $col); - } - //} - } - - - if (count ($output->groups)) { - foreach ($output->groups as $key => $value) { - if (strpos ($value, '.')) { - $tmp = explode ('.', $value); - $tmp[0] = sprintf ('"%s"', $tmp[0]); - $tmp[1] = sprintf ('"%s"', $tmp[1]); - $value = implode ('.', $tmp); - } - elseif (strpos ($value, '(')) { - $value = $value; - } - else { - $value = sprintf ('"%s"', $value); - } - $output->groups[$key] = $value; - - - if(count($output->arg_columns)) - { - if($column_list[$value]) $output->arg_columns[] = $column_list[$value]; - } - } - $groupby_query = sprintf ('group by %s', implode(',', $output->groups)); - } - - - // list_count를 사용할 경우 적용 - if ($output->list_count['value']) { - $start_count = 0; - $list_count = $output->list_count['value']; - - if ($output->order) { - foreach ($output->order as $val) { - if (strpos ($val[0], '.')) { - $tmpval = explode ('.', $val[0]); - $tmpval[0] = sprintf ('"%s"', $tmpval[0]); - $tmpval[1] = sprintf ('"%s"', $tmpval[1]); - $val[0] = implode ('.', $tmpval); - } - elseif (strpos ($val[0], '(')) $val[0] = $val[0]; - elseif ($val[0] == 'count') $val[0] = 'count (*)'; - else $val[0] = sprintf ('"%s"', $val[0]); - $index_list[] = sprintf('%s %s', $val[0], $val[1]); - } - if (count($index_list)) - $orderby_query = ' order by '.implode(',', $index_list); - $orderby_query = sprintf ('%s for orderby_num() between %d and %d', $orderby_query, $start_count + 1, $list_count + $start_count); - } - else { - if (count ($output->groups)) { - $orderby_query = sprintf ('%s having groupby_num() between %d'. ' and %d', $orderby_query, $start_count + 1, $list_count + $start_count); - } - else { - if ($condition) { - $orderby_query = sprintf ('%s and inst_num() between %d'. ' and %d', $orderby_query, $start_count + 1, $list_count + $start_count); - } - else { - $orderby_query = sprintf ('%s where inst_num() between %d'. ' and %d', $orderby_query, $start_count + 1, $list_count + $start_count); - } - } - } - } - else { - if ($output->order) { - foreach ($output->order as $val) { - if (strpos ($val[0], '.')) { - $tmpval = explode ('.', $val[0]); - $tmpval[0] = sprintf ('"%s"', $tmpval[0]); - $tmpval[1] = sprintf ('"%s"', $tmpval[1]); - $val[0] = implode ('.', $tmpval); - } - elseif (strpos ($val[0], '(')) $val[0] = $val[0]; - elseif ($val[0] == 'count') $val[0] = 'count (*)'; - else $val[0] = sprintf ('"%s"', $val[0]); - $index_list[] = sprintf('%s %s', $val[0], $val[1]); - - if(count($output->arg_columns) && $column_list[$val]) $output->arg_columns[] = $column_list[$key]; - } - - if (count ($index_list)) { - $orderby_query = ' order by '.implode(',', $index_list); - } - } - } - - - if(count($output->arg_columns)) - { - $columns = array(); - foreach($output->arg_columns as $col){ - if(strpos($col,'"')===false && strpos($col,' ')===false) $columns[] = '"'.$col.'"'; - else $columns[] = $col; - } - - $columns = join(',',$columns); - } - - $query = sprintf ("select %s from %s %s %s %s", $columns, implode (',',$table_list), implode (' ',$left_join), $condition, $groupby_query.$orderby_query); - $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; - $result = $this->_query ($query); - if ($this->isError ()) return; - $data = $this->_fetch ($result); - - $buff = new Object (); - $buff->data = $data; - - return $buff; - } - - /** - * @brief 현재 시점의 Stack trace를 보여줌.결과를 fetch - **/ - function backtrace () - { - $output = "
\n"; - $output .= "Backtrace:
\n"; - $backtrace = debug_backtrace (); - - foreach ($backtrace as $bt) { - $args = ''; - foreach ($bt['args'] as $a) { - if (!empty ($args)) { - $args .= ', '; - } - switch (gettype ($a)) { - case 'integer': - case 'double': - $args .= $a; - break; - case 'string': - $a = htmlspecialchars (substr ($a, 0, 64)). - ((strlen ($a) > 64) ? '...' : ''); - $args .= "\"$a\""; - break; - case 'array': - $args .= 'Array ('. count ($a).')'; - break; - case 'object': - $args .= 'Object ('.get_class ($a).')'; - break; - case 'resource': - $args .= 'Resource ('.strstr ($a, '#').')'; - break; - case 'boolean': - $args .= $a ? 'True' : 'False'; - break; - case 'NULL': - $args .= 'Null'; - break; - default: - $args .= 'Unknown'; - } - } - $output .= "
\n"; - $output .= "file: ".$bt['line']." - ". $bt['file']."
\n"; - $output .= "call: ".$bt['class']. $bt['type'].$bt['function'].$args."
\n"; - } - $output .= "
\n"; - return $output; - } - - /** - * @brief query xml에 navigation 정보가 있을 경우 페이징 관련 작업을 처리한다 - * - * 그닥 좋지는 않은 구조이지만 편리하다.. -_-; - **/ - function _getNavigationData ($table_list, $columns, $left_join, $condition, $output) { - require_once (_XE_PATH_.'classes/page/PageHandler.class.php'); - - $column_list = $output->column_list; - - $count_condition = count($output->groups) ? sprintf('%s group by %s', $condition, implode(', ', $output->groups)) : $condition; - $count_query = sprintf('select count(*) as "count" from %s %s %s', implode(', ', $table_list), implode(' ', $left_join), $count_condition); - if (count($output->groups)) { - $count_query = sprintf('select count(*) as "count" from (%s) xet', $count_query); - } - - $count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; - $result = $this->_query($count_query); - $count_output = $this->_fetch($result); - $total_count = (int)$count_output->count; - - $list_count = $output->list_count['value']; - if (!$list_count) $list_count = 20; - $page_count = $output->page_count['value']; - if (!$page_count) $page_count = 10; - $page = $output->page['value']; - if (!$page) $page = 1; - - // 전체 페이지를 구함 - if ($total_count) { - $total_page = (int) (($total_count - 1) / $list_count) + 1; - } - else { - $total_page = 1; - } - - // 페이지 변수를 체크 - if ($page > $total_page) $page = $total_page; - $start_count = ($page - 1) * $list_count; - - if ($output->order) { - $conditions = $this->getConditionList($output); - //if(in_array('list_order', $conditions) || in_array('update_order', $conditions)) { - foreach ($output->order as $key => $val) { - $col = $val[0]; - if(!in_array($col, array('list_order','update_order'))) continue; - if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col); - else $condition = sprintf(' where %s < 2100000000 ', $col); - } - //} - } - - - if (count ($output->groups)) { - foreach ($output->groups as $key => $value) { - if (strpos ($value, '.')) { - $tmp = explode ('.', $value); - $tmp[0] = sprintf ('"%s"', $tmp[0]); - $tmp[1] = sprintf ('"%s"', $tmp[1]); - $value = implode ('.', $tmp); - } - elseif (strpos ($value, '(')) $value = $value; - else $value = sprintf ('"%s"', $value); - $output->groups[$key] = $value; - } - - $groupby_query = sprintf (' group by %s', implode (',', $output->groups)); - } - - if ($output->order) { - foreach ($output->order as $val) { - if (strpos ($val[0], '.')) { - $tmpval = explode ('.', $val[0]); - $tmpval[0] = sprintf ('"%s"', $tmpval[0]); - $tmpval[1] = sprintf ('"%s"', $tmpval[1]); - $val[0] = implode ('.', $tmpval); - } - elseif (strpos ($val[0], '(')) $val[0] = $val[0]; - elseif ($val[0] == 'count') $val[0] = 'count (*)'; - else $val[0] = sprintf ('"%s"', $val[0]); - $index_list[] = sprintf ('%s %s', $val[0], $val[1]); - } - - if (count ($index_list)) { - $orderby_query = ' order by '.implode(',', $index_list); - } - - $orderby_query = sprintf ('%s for orderby_num() between %d and %d', $orderby_query, $start_count + 1, $list_count + $start_count); - } - else { - if (count($output->groups)) { - $orderby_query = sprintf ('%s having groupby_num() between %d and %d', $orderby_query, $start_count + 1, $list_count + $start_count); - } - else { - if ($condition) { - $orderby_query = sprintf ('%s and inst_num() between %d and %d', $orderby_query, $start_count + 1, $list_count + $start_count); - } - else { - $orderby_query = sprintf('%s where inst_num() between %d and %d', $orderby_query, $start_count + 1, $list_count + $start_count); - } - } - } - - if(count($output->arg_columns)) - { - $columns = array(); - foreach($output->arg_columns as $col){ - if(strpos($col,'"')===false) $columns[] = '"'.$col.'"'; - else $columns[] = $col; - } - - $columns = join(',',$columns); - } - - $query = sprintf ("select %s from %s %s %s %s", $columns, implode (',',$table_list), implode (' ',$left_join), $condition, $groupby_query.$orderby_query); - $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; - $result = $this->_query ($query); - - if ($this->isError ()) { - $buff = new Object (); - $buff->total_count = 0; - $buff->total_page = 0; - $buff->page = 1; - $buff->data = array (); - - $buff->page_navigation = new PageHandler ($total_count, $total_page, $page, $page_count); - - return $buff; - } - - $virtual_no = $total_count - ($page - 1) * $list_count; - while ($tmp = cubrid_fetch ($result, CUBRID_OBJECT)) { - if ($tmp) { - foreach ($tmp as $k => $v) { - $tmp->{$k} = rtrim($v); - } - } - $data[$virtual_no--] = $tmp; - } - - $buff = new Object (); - $buff->total_count = $total_count; - $buff->total_page = $total_page; - $buff->page = $page; - $buff->data = $data; - - $buff->page_navigation = new PageHandler ($total_count, $total_page, $page, $page_count); - - return $buff; - } - } - -return new DBCubrid; -?> + 'numeric(20)', + 'number' => 'integer', + 'varchar' => 'character varying', + 'char' => 'character', + 'tinytext' => 'character varying(256)', + 'text' => 'character varying(1073741823)', + 'bigtext' => 'character varying(1073741823)', + 'date' => 'character varying(14)', + 'float' => 'float', + ); + + /** + * @brief constructor + **/ + function DBCubrid() + { + $this->_setDBInfo(); + $this->_connect(); + } + + /** + * @brief create an instance of this class + */ + function create() + { + return new DBCubrid; + } + + /** + * @brief 설치 가능 여부를 return + **/ + function isSupported() + { + if (!function_exists('cubrid_connect')) return false; + return true; + } + + /** + * @brief DB정보 설정 및 connect/ close + **/ + function _setDBInfo() + { + $db_info = Context::getDBInfo(); + $this->hostname = $db_info->db_hostname; + $this->userid = $db_info->db_userid; + $this->password = $db_info->db_password; + $this->database = $db_info->db_database; + $this->port = $db_info->db_port; + $this->prefix = $db_info->db_table_prefix; + + if (!substr($this->prefix, -1) != '_') $this->prefix .= '_'; + } + + /** + * @brief DB 접속 + **/ + function _connect() + { + // db 정보가 없으면 무시 + if (!$this->hostname || !$this->userid || !$this->password || !$this->database || !$this->port) return; + + // 접속시도 + $this->fd = @cubrid_connect ($this->hostname, $this->port, $this->database, $this->userid, $this->password); + + // 접속체크 + if (!$this->fd) { + $this->setError (-1, 'database connect fail'); + return $this->is_connected = false; + } + + $this->is_connected = true; + $this->password = md5 ($this->password); + } + + /** + * @brief DB접속 해제 + **/ + function close() + { + if (!$this->isConnected ()) return; + + @cubrid_commit ($this->fd); + @cubrid_disconnect ($this->fd); + $this->transaction_started = false; + } + + /** + * @brief 쿼리에서 입력되는 문자열 변수들의 quotation 조절 + **/ + function addQuotes($string) + { + if (!$this->fd) return $string; + + if (version_compare (PHP_VERSION, "5.9.0", "<") && + get_magic_quotes_gpc ()) { + $string = stripslashes (str_replace ("\\","\\\\", $string)); + } + + if (!is_numeric ($string)) { + /* + if ($this->isConnected()) { + $string = cubrid_real_escape_string($string); + } + else { + $string = str_replace("'","\'",$string); + } + */ + + $string = str_replace("'","''",$string); + } + + return $string; + } + + /** + * @brief 트랜잭션 시작 + **/ + function begin() + { + if (!$this->isConnected () || $this->transaction_started) return; + $this->transaction_started = true; + } + + /** + * @brief 롤백 + **/ + function rollback() + { + if (!$this->isConnected () || !$this->transaction_started) return; + @cubrid_rollback ($this->fd); + $this->transaction_started = false; + } + + /** + * @brief 커밋 + **/ + function commit() + { + if (!$force && (!$this->isConnected () || + !$this->transaction_started)) return; + + @cubrid_commit($this->fd); + $this->transaction_started = false; + } + + /** + * @brief : 쿼리문의 실행 및 결과의 fetch 처리 + * + * query : query문 실행하고 result return\n + * fetch : reutrn 된 값이 없으면 NULL\n + * rows이면 array object\n + * row이면 object\n + * return\n + **/ + function _query($query) + { + if (!$query || !$this->isConnected ()) return; + + // 쿼리 시작을 알림 + $this->actStart ($query); + + // 쿼리 문 실행 + $result = @cubrid_execute ($this->fd, $query); + // 오류 체크 + if (cubrid_error_code ()) { + $code = cubrid_error_code (); + $msg = cubrid_error_msg (); + + $this->setError ($code, $msg); + } + + // 쿼리 실행 종료를 알림 + $this->actFinish (); + + // 결과 리턴 + return $result; + } + + /** + * @brief 결과를 fetch + **/ + function _fetch($result) + { + if (!$this->isConnected() || $this->isError() || !$result) return; + + $col_types = cubrid_column_types ($result); + $col_names = cubrid_column_names ($result); + $max = count ($col_types); + + for ($count = 0; $count < $max; $count++) { + if (preg_match ("/^char/", $col_types[$count]) > 0) { + $char_type_fields[] = $col_names[$count]; + } + } + + while ($tmp = cubrid_fetch ($result, CUBRID_OBJECT)) { + if (is_array ($char_type_fields)) { + foreach ($char_type_fields as $val) { + $tmp->{$val} = rtrim ($tmp->{$val}); + } + } + + $output[] = $tmp; + } + + unset ($char_type_fields); + + if ($result) cubrid_close_request($result); + + if (count ($output) == 1) return $output[0]; + return $output; + } + + /** + * @brief 1씩 증가되는 sequence 값을 return (cubrid의 auto_increment는 sequence테이블에서만 사용) + **/ + function getNextSequence() + { + $this->_makeSequence(); + + $query = sprintf ("select \"%ssequence\".\"nextval\" as \"seq\" from db_root", $this->prefix); + $result = $this->_query($query); + $output = $this->_fetch($result); + + return $output->seq; + } + + /** + * @brief 마이그레이션시 sequence 가 없을 경우 생성 + **/ + function _makeSequence() + { + if($_GLOBALS['XE_EXISTS_SEQUENCE']) return; + + // check cubrid serial + $query = sprintf('select count(*) as "count" from "db_serial" where name=\'%ssequence\'', $this->prefix); + $result = $this->_query($query); + $output = $this->_fetch($result); + + // if do not create serial + if ($output->count == 0) { + $query = sprintf('select max("a"."srl") as "srl" from '. + '( select max("document_srl") as "srl" from '. + '"%sdocuments" UNION '. + 'select max("comment_srl") as "srl" from '. + '"%scomments" UNION '. + 'select max("member_srl") as "srl" from '. + '"%smember"'. + ') as "a"', $this->prefix, $this->prefix, $this->prefix); + + $result = $this->_query($query); + $output = $this->_fetch($result); + $srl = $output->srl; + if ($srl < 1) { + $start = 1; + } + else { + $start = $srl + 1000000; + } + + // create sequence + $query = sprintf('create serial "%ssequence" start with %s increment by 1 minvalue 1 maxvalue 10000000000000000000000000000000000000 nocycle;', $this->prefix, $start); + $this->_query($query); + } + + $_GLOBALS['XE_EXISTS_SEQUENCE'] = true; + } + + + /** + * @brief 테이블 기생성 여부 return + **/ + function isTableExists ($target_name) + { + if($target_name == 'sequence') { + $query = sprintf ("select \"name\" from \"db_serial\" where \"name\" = '%s%s'", $this->prefix, $target_name); + } + else { + $query = sprintf ("select \"class_name\" from \"db_class\" where \"class_name\" = '%s%s'", $this->prefix, $target_name); + } + + $result = $this->_query ($query); + if (cubrid_num_rows($result) > 0) { + $output = true; + } + else { + $output = false; + } + + if ($result) cubrid_close_request ($result); + + return $output; + } + + /** + * @brief 특정 테이블에 특정 column 추가 + **/ + function addColumn($table_name, $column_name, $type = 'number', $size = '', $default = '', $notnull = false) + { + $type = strtoupper($this->column_type[$type]); + if ($type == 'INTEGER') $size = ''; + + $query = sprintf ("alter class \"%s%s\" add \"%s\" ", $this->prefix, $table_name, $column_name); + + if ($type == 'char' || $type == 'varchar') { + if ($size) $size = $size * 3; + } + + if ($size) { + $query .= sprintf ("%s(%s) ", $type, $size); + } + else { + $query .= sprintf ("%s ", $type); + } + + if ($default) { + if ($type == 'INTEGER' || $type == 'BIGINT' || $type=='INT') { + $query .= sprintf ("default %d ", $default); + } + else { + $query .= sprintf ("default '%s' ", $default); + } + } + + if ($notnull) $query .= "not null "; + + $this->_query ($query); + } + + /** + * @brief 특정 테이블에 특정 column 제거 + **/ + function dropColumn ($table_name, $column_name) + { + $query = sprintf ("alter class \"%s%s\" drop \"%s\" ", $this->prefix, $table_name, $column_name); + + $this->_query ($query); + } + + /** + * @brief 특정 테이블의 column의 정보를 return + **/ + function isColumnExists ($table_name, $column_name) + { + $query = sprintf ("select \"attr_name\" from \"db_attribute\" where ". "\"attr_name\" ='%s' and \"class_name\" = '%s%s'", $column_name, $this->prefix, $table_name); + $result = $this->_query ($query); + + if (cubrid_num_rows ($result) > 0) $output = true; + else $output = false; + + if ($result) cubrid_close_request ($result); + + return $output; + } + + /** + * @brief 특정 테이블에 특정 인덱스 추가 + * $target_columns = array(col1, col2) + * $is_unique? unique : none + **/ + function addIndex ($table_name, $index_name, $target_columns, $is_unique = false) + { + if (!is_array ($target_columns)) { + $target_columns = array ($target_columns); + } + + $query = sprintf ("create %s index \"%s\" on \"%s%s\" (%s);", $is_unique?'unique':'', $this->prefix .$index_name, $this->prefix, $table_name, '"'.implode('","',$target_columns).'"'); + + $this->_query ($query); + } + + /** + * @brief 특정 테이블의 특정 인덱스 삭제 + **/ + function dropIndex ($table_name, $index_name, $is_unique = false) + { + $query = sprintf ("drop %s index \"%s\" on \"%s%s\"", $is_unique?'unique':'', $this->prefix .$index_name, $this->prefix, $table_name); + + $this->_query($query); + } + + /** + * @brief 특정 테이블의 index 정보를 return + **/ + function isIndexExists ($table_name, $index_name) + { + $query = sprintf ("select \"index_name\" from \"db_index\" where ". "\"class_name\" = '%s%s' and \"index_name\" = '%s' ", $this->prefix, $table_name, $this->prefix .$index_name); + $result = $this->_query ($query); + + if ($this->isError ()) return false; + + $output = $this->_fetch ($result); + + if (!$output) return false; + return true; + } + + /** + * @brief xml 을 받아서 테이블을 생성 + **/ + function createTableByXml ($xml_doc) + { + return $this->_createTable ($xml_doc); + } + + /** + * @brief xml 을 받아서 테이블을 생성 + **/ + function createTableByXmlFile ($file_name) + { + if (!file_exists ($file_name)) return; + // xml 파일을 읽음 + $buff = FileHandler::readFile ($file_name); + + return $this->_createTable ($buff); + } + + /** + * @brief schema xml을 이용하여 create class query생성 + * + * type : number, varchar, tinytext, text, bigtext, char, date, \n + * opt : notnull, default, size\n + * index : primary key, index, unique\n + **/ + function _createTable ($xml_doc) + { + // xml parsing + $oXml = new XmlParser(); + $xml_obj = $oXml->parse($xml_doc); + + // 테이블 생성 schema 작성 + $table_name = $xml_obj->table->attrs->name; + + // if the table already exists exit function + if ($this->isTableExists($table_name)) return; + + // 만약 테이블 이름이 sequence라면 serial 생성 + if ($table_name == 'sequence') { + $query = sprintf ('create serial "%s" start with 1 increment by 1'. + ' minvalue 1 '. + 'maxvalue 10000000000000000000000000000000000000'. ' nocycle;', $this->prefix.$table_name); + + return $this->_query($query); + } + + + $table_name = $this->prefix.$table_name; + + $query = sprintf ('create class "%s";', $table_name); + $this->_query ($query); + + if (!is_array ($xml_obj->table->column)) { + $columns[] = $xml_obj->table->column; + } + else { + $columns = $xml_obj->table->column; + } + + $query = sprintf ("alter class \"%s\" add attribute ", $table_name); + + foreach ($columns as $column) { + $name = $column->attrs->name; + $type = $column->attrs->type; + $size = $column->attrs->size; + $notnull = $column->attrs->notnull; + $primary_key = $column->attrs->primary_key; + $index = $column->attrs->index; + $unique = $column->attrs->unique; + $default = $column->attrs->default; + + switch ($this->column_type[$type]) { + case 'integer' : + $size = null; + break; + case 'text' : + $size = null; + break; + } + + if (isset ($default) && ($type == 'varchar' || $type == 'char' || + $type == 'text' || $type == 'tinytext' || $type == 'bigtext')) { + $default = sprintf ("'%s'", $default); + } + + if ($type == 'varchar' || $type == 'char') { + if($size) $size = $size * 3; + } + + + $column_schema[] = sprintf ('"%s" %s%s %s %s', + $name, + $this->column_type[$type], + $size?'('.$size.')':'', + isset($default)?"default ".$default:'', + $notnull?'not null':''); + + if ($primary_key) { + $primary_list[] = $name; + } + else if ($unique) { + $unique_list[$unique][] = $name; + } + else if ($index) { + $index_list[$index][] = $name; + } + } + + $query .= implode (',', $column_schema).';'; + $this->_query ($query); + + if (count ($primary_list)) { + $query = sprintf ("alter class \"%s\" add attribute constraint ". "\"pkey_%s\" PRIMARY KEY(%s);", $table_name, $table_name, '"'.implode('","',$primary_list).'"'); + $this->_query ($query); + } + + if (count ($unique_list)) { + foreach ($unique_list as $key => $val) { + $query = sprintf ("create unique index \"%s\" on \"%s\" ". "(%s);", $this->prefix .$key, $table_name, '"'.implode('","', $val).'"'); + $this->_query ($query); + } + } + + if (count ($index_list)) { + foreach ($index_list as $key => $val) { + $query = sprintf ("create index \"%s\" on \"%s\" (%s);", $this->prefix .$key, $table_name, '"'.implode('","',$val).'"'); + $this->_query ($query); + } + } + } + + /** + * @brief 조건문 작성하여 return + **/ + function getCondition ($output) + { + if (!$output->conditions) return; + $condition = $this->_getCondition ($output->conditions, $output->column_type, $output); + if ($condition) $condition = ' where '.$condition; + + return $condition; + } + + function _getCondition ($conditions, $column_type, &$output) + { + $condition = ''; + + foreach ($conditions as $val) { + $sub_condition = ''; + + foreach ($val['condition'] as $v) { + if (!isset ($v['value'])) continue; + if ($v['value'] === '') continue; + if(!in_array(gettype($v['value']), array('string', 'integer', 'double', 'array'))) continue; + + $name = $v['column']; + $operation = $v['operation']; + $value = $v['value']; + $type = $this->getColumnType ($column_type, $name); + $pipe = $v['pipe']; + $value = $this->getConditionValue ($name, $value, $operation, $type, $column_type); + + if (!$value) { + $value = $v['value']; + if (strpos ($value, '(')) { + $valuetmp = $value; + } + elseif (strpos ($value, ".") === false) { + $valuetmp = $value; + } + else { + $valuetmp = '"'.str_replace('.', '"."', $value).'"'; + } + } + else { + $tmp = explode('.',$value); + + if (count($tmp)==2) { + $table = $tmp[0]; + $column = $tmp[1]; + + if ($column_type[$column] && (in_array ($table, $output->tables) || + array_key_exists($table, $output->tables))) { + $valuetmp = sprintf('"%s"."%s"', $table, $column); + } + else { + $valuetmp = $value; + } + } + else { + $valuetmp = $value; + } + } + + if (strpos ($name, '(') > 0) { + $nametmp = $name; + } + elseif (strpos ($name, ".") === false) { + $nametmp = '"'.$name.'"'; + } + else { + $nametmp = '"'.str_replace('.', '"."', $name).'"'; + } + $str = $this->getConditionPart ($nametmp, $valuetmp, $operation); + if ($sub_condition) $sub_condition .= ' '.$pipe.' '; + $sub_condition .= $str; + } + + if ($sub_condition) { + if ($condition && $val['pipe']) { + $condition .= ' '.$val['pipe'].' '; + } + $condition .= '('.$sub_condition.')'; + } + } + + return $condition; + } + + /** + * @brief insertAct 처리 + **/ + function _executeInsertAct ($output) + { + // 테이블 정리 + foreach ($output->tables as $val) { + $table_list[] = '"'.$this->prefix.$val.'"'; + } + + // 컬럼 정리 + foreach ($output->columns as $key => $val) { + $name = $val['name']; + $value = $val['value']; + //if ($this->getColumnType ($output->column_type, $name) != 'number') + if ($output->column_type[$name] != 'number') { + if (!is_null($value)) { + $value = "'" . $this->addQuotes($value) ."'"; + } + else { + if ($val['notnull']=='notnull') { + $value = "''"; + } + else { + //$value = 'null'; + $value = "''"; + } + } + } + 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 .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; + $result = $this->_query ($query); + if ($result && !$this->transaction_started) { + @cubrid_commit ($this->fd); + } + + return $result; + } + + /** + * @brief updateAct 처리 + **/ + function _executeUpdateAct ($output) + { + // 테이블 정리 + foreach ($output->tables as $key => $val) { + $table_list[] = '"'.$this->prefix.$val.'" as "'.$key.'"'; + } + + $check_click_count = true; + + // 컬럼 정리 + foreach ($output->columns as $key => $val) { + if (!isset ($val['value'])) continue; + $name = $val['name']; + $value = $val['value']; + + if (substr ($value, -2) != '+1' || $output->column_type[$name] != 'number') { + $check_click_count = false; + } + + for ($i = 0; $i < $key; $i++) { + /* 한문장에 같은 속성에 대한 중복 설정은 큐브리드에서는 허용치 않음 */ + if ($output->columns[$i]['name'] == $name) break; + } + if ($i < $key) continue; // 중복이 발견되면 이후의 설정은 무시 + + if (strpos ($name, '.') !== false && strpos ($value, '.') !== false) { + $column_list[] = $name.' = '.$value; + } + else { + if ($output->column_type[$name] != 'number') { + $check_column = false; + $value = "'".$this->addQuotes ($value)."'"; + } + elseif (!$value || is_numeric ($value)) { + $value = (int) $value; + } + + $column_list[] = sprintf ("\"%s\" = %s", $name, $value); + } + } + + // 조건절 정리 + $condition = $this->getCondition ($output); + + $check_click_count_condition = false; + if ($check_click_count) { + foreach ($output->conditions as $val) { + if ($val['pipe'] == 'or') { + $check_click_count_condition = false; + break; + } + + foreach ($val['condition'] as $v) { + if ($v['operation'] == 'equal') { + $check_click_count_condition = true; + } + else { + if ($v['operation'] == 'in' && !strpos ($v['value'], ',')) { + $check_click_count_condition = true; + } + else { + $check_click_count_condition = false; + } + } + + if ($v['pipe'] == 'or') { + $check_click_count_condition = false; + break; + } + } + } + } + + if ($check_click_count&& $check_click_count_condition && count ($output->tables) == 1 && count ($output->conditions) > 0 && count ($output->groups) == 0 && count ($output->order) == 0) { + foreach ($output->columns as $v) { + $incr_columns[] = 'incr("'.$v['name'].'")'; + } + + $query = sprintf ('select %s from %s %s', join (',', $incr_columns), implode(',', $table_list), $condition); + } + else { + $query = sprintf ("update %s set %s %s", implode (',', $table_list), implode (',', $column_list), $condition); + } + + $result = $this->_query ($query); + if ($result && !$this->transaction_started) @cubrid_commit ($this->fd); + + return $result; + } + + /** + * @brief deleteAct 처리 + **/ + function _executeDeleteAct ($output) + { + // 테이블 정리 + foreach ($output->tables as $val) { + $table_list[] = '"'.$this->prefix.$val.'"'; + } + + // 조건절 정리 + $condition = $this->getCondition ($output); + + $query = sprintf ("delete from %s %s", implode (',',$table_list), $condition); + $result = $this->_query ($query); + if ($result && !$this->transaction_started) @cubrid_commit ($this->fd); + + return $result; + } + + /** + * @brief selectAct 처리 + * + * select의 경우 특정 페이지의 목록을 가져오는 것을 편하게 하기 위해\n + * navigation이라는 method를 제공 + **/ + function _executeSelectAct ($output) + { + // 테이블 정리 + $table_list = array (); + foreach ($output->tables as $key => $val) { + $table_list[] = '"'.$this->prefix.$val.'" as "'.$key.'"'; + } + $left_join = array (); + // why??? + $left_tables = (array) $output->left_tables; + + foreach ($left_tables as $key => $val) { + $condition = $this->_getCondition ($output->left_conditions[$key], $output->column_type, $output); + if ($condition) { + $left_join[] = $val.' "'.$this->prefix.$output->_tables[$key]. '" "'.$key.'" on ('.$condition.')'; + } + } + + $click_count = array(); + if(!$output->columns){ + $output->columns = array(array('name'=>'*')); + } + + $column_list = array (); + foreach ($output->columns as $key => $val) { + $name = $val['name']; + + $click_count = '%s'; + if ($val['click_count'] && count ($output->conditions) > 0) { + $click_count = 'incr(%s)'; + } + + $alias = $val['alias'] ? sprintf ('"%s"', $val['alias']) : null; + $_alias = $val['alias']; + + if ($name == '*') { + $column_list[] = $name; + } + elseif (strpos ($name, '.') === false && strpos ($name, '(') === false) { + $name = sprintf ($click_count,$name); + if ($alias) { + $column_list[$alias] = sprintf('"%s" as %s', $name, $alias); + } + else { + $column_list[] = sprintf ('"%s"', $name); + } + } + else { + if (strpos ($name, '.') != false) { + list ($prefix, $name) = explode('.', $name); + if (($now_matchs = preg_match_all ("/\(/", $prefix, $xtmp)) > 0) { + if ($now_matchs == 1) { + $tmpval = explode ("(", $prefix); + $tmpval[1] = sprintf ('"%s"', $tmpval[1]); + $prefix = implode ("(", $tmpval); + $tmpval = explode (")", $name); + $tmpval[0] = sprintf ('"%s"', $tmpval[0]); + $name = implode (")", $tmpval); + } + } + else { + $prefix = sprintf ('"%s"', $prefix); + $name = ($name == '*') ? $name : sprintf('"%s"',$name); + } + $xtmp = null; + $now_matchs = null; + if($alias) $column_list[$_alias] = sprintf ($click_count, sprintf ('%s.%s', $prefix, $name)) . ($alias ? sprintf (' as %s',$alias) : ''); + else $column_list[] = sprintf ($click_count, sprintf ('%s.%s', $prefix, $name)); + } + elseif (($now_matchs = preg_match_all ("/\(/", $name, $xtmp)) > 0) { + if ($now_matchs == 1 && preg_match ("/[a-zA-Z0-9]*\(\*\)/", $name) < 1) { + $open_pos = strpos ($name, "("); + $close_pos = strpos ($name, ")"); + + if (preg_match ("/,/", $name)) { + $tmp_func_name = sprintf ('%s', substr ($name, 0, $open_pos)); + $tmp_params = sprintf ('%s', substr ($name, $open_pos + 1, $close_pos - $open_pos - 1)); + $tmpval = null; + $tmpval = explode (',', $tmp_params); + + foreach ($tmpval as $tmp_param) { + $tmp_param_list[] = (!is_numeric ($tmp_param)) ? sprintf ('"%s"', $tmp_param) : $tmp_param; + } + + $tmpval = implode (',', $tmp_param_list); + $name = sprintf ('%s(%s)', $tmp_func_name, $tmpval); + } + else { + $name = sprintf ('%s("%s")', substr ($name, 0, $open_pos), substr ($name, $open_pos + 1, $close_pos - $open_pos - 1)); + } + } + + if($alias) $column_list[$_alias] = sprintf ($click_count, $name). ($alias ? sprintf (' as %s', $alias) : ''); + else $column_list[] = sprintf ($click_count, $name); + } + else { + if($alias) $column_list[$_alias] = sprintf($click_count, $name). ($alias ? sprintf(' as %s',$alias) : ''); + else $column_list[] = sprintf($click_count, $name); + } + } + $columns = implode (',', $column_list); + } + + $condition = $this->getCondition ($output); + + $output->column_list = $column_list; + if ($output->list_count && $output->page) { + return ($this->_getNavigationData($table_list, $columns, $left_join, $condition, $output)); + } + + if ($output->order) { + $conditions = $this->getConditionList($output); + //if(in_array('list_order', $conditions) || in_array('update_order', $conditions)) { + foreach($output->order as $key => $val) { + $col = $val[0]; + if(!in_array($col, array('list_order','update_order'))) continue; + if ($condition) $condition .= sprintf(' and %s < 2100000000 ', $col); + else $condition = sprintf(' where %s < 2100000000 ', $col); + } + //} + } + + + if (count ($output->groups)) { + foreach ($output->groups as $key => $value) { + if (strpos ($value, '.')) { + $tmp = explode ('.', $value); + $tmp[0] = sprintf ('"%s"', $tmp[0]); + $tmp[1] = sprintf ('"%s"', $tmp[1]); + $value = implode ('.', $tmp); + } + elseif (strpos ($value, '(')) { + $value = $value; + } + else { + $value = sprintf ('"%s"', $value); + } + $output->groups[$key] = $value; + + + if(count($output->arg_columns)) + { + if($column_list[$value]) $output->arg_columns[] = $column_list[$value]; + } + } + $groupby_query = sprintf ('group by %s', implode(',', $output->groups)); + } + + + // list_count를 사용할 경우 적용 + if ($output->list_count['value']) { + $start_count = 0; + $list_count = $output->list_count['value']; + + if ($output->order) { + foreach ($output->order as $val) { + if (strpos ($val[0], '.')) { + $tmpval = explode ('.', $val[0]); + $tmpval[0] = sprintf ('"%s"', $tmpval[0]); + $tmpval[1] = sprintf ('"%s"', $tmpval[1]); + $val[0] = implode ('.', $tmpval); + } + elseif (strpos ($val[0], '(')) $val[0] = $val[0]; + elseif ($val[0] == 'count') $val[0] = 'count (*)'; + else $val[0] = sprintf ('"%s"', $val[0]); + $index_list[] = sprintf('%s %s', $val[0], $val[1]); + } + if (count($index_list)) + $orderby_query = ' order by '.implode(',', $index_list); + $orderby_query = sprintf ('%s for orderby_num() between %d and %d', $orderby_query, $start_count + 1, $list_count + $start_count); + } + else { + if (count ($output->groups)) { + $orderby_query = sprintf ('%s having groupby_num() between %d'. ' and %d', $orderby_query, $start_count + 1, $list_count + $start_count); + } + else { + if ($condition) { + $orderby_query = sprintf ('%s and inst_num() between %d'. ' and %d', $orderby_query, $start_count + 1, $list_count + $start_count); + } + else { + $orderby_query = sprintf ('%s where inst_num() between %d'. ' and %d', $orderby_query, $start_count + 1, $list_count + $start_count); + } + } + } + } + else { + if ($output->order) { + foreach ($output->order as $val) { + if (strpos ($val[0], '.')) { + $tmpval = explode ('.', $val[0]); + $tmpval[0] = sprintf ('"%s"', $tmpval[0]); + $tmpval[1] = sprintf ('"%s"', $tmpval[1]); + $val[0] = implode ('.', $tmpval); + } + elseif (strpos ($val[0], '(')) $val[0] = $val[0]; + elseif ($val[0] == 'count') $val[0] = 'count (*)'; + else $val[0] = sprintf ('"%s"', $val[0]); + $index_list[] = sprintf('%s %s', $val[0], $val[1]); + + if(count($output->arg_columns) && $column_list[$val]) $output->arg_columns[] = $column_list[$key]; + } + + if (count ($index_list)) { + $orderby_query = ' order by '.implode(',', $index_list); + } + } + } + + + if(count($output->arg_columns)) + { + $columns = array(); + foreach($output->arg_columns as $col){ + if(strpos($col,'"')===false && strpos($col,' ')===false) $columns[] = '"'.$col.'"'; + else $columns[] = $col; + } + + $columns = join(',',$columns); + } + + $query = sprintf ("select %s from %s %s %s %s", $columns, implode (',',$table_list), implode (' ',$left_join), $condition, $groupby_query.$orderby_query); + $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; + $result = $this->_query ($query); + if ($this->isError ()) return; + $data = $this->_fetch ($result); + + $buff = new Object (); + $buff->data = $data; + + return $buff; + } + + /** + * @brief 현재 시점의 Stack trace를 보여줌.결과를 fetch + **/ + function backtrace () + { + $output = "
\n"; + $output .= "Backtrace:
\n"; + $backtrace = debug_backtrace (); + + foreach ($backtrace as $bt) { + $args = ''; + foreach ($bt['args'] as $a) { + if (!empty ($args)) { + $args .= ', '; + } + switch (gettype ($a)) { + case 'integer': + case 'double': + $args .= $a; + break; + case 'string': + $a = htmlspecialchars (substr ($a, 0, 64)). + ((strlen ($a) > 64) ? '...' : ''); + $args .= "\"$a\""; + break; + case 'array': + $args .= 'Array ('. count ($a).')'; + break; + case 'object': + $args .= 'Object ('.get_class ($a).')'; + break; + case 'resource': + $args .= 'Resource ('.strstr ($a, '#').')'; + break; + case 'boolean': + $args .= $a ? 'True' : 'False'; + break; + case 'NULL': + $args .= 'Null'; + break; + default: + $args .= 'Unknown'; + } + } + $output .= "
\n"; + $output .= "file: ".$bt['line']." - ". $bt['file']."
\n"; + $output .= "call: ".$bt['class']. $bt['type'].$bt['function'].$args."
\n"; + } + $output .= "
\n"; + return $output; + } + + /** + * @brief query xml에 navigation 정보가 있을 경우 페이징 관련 작업을 처리한다 + * + * 그닥 좋지는 않은 구조이지만 편리하다.. -_-; + **/ + function _getNavigationData ($table_list, $columns, $left_join, $condition, $output) { + require_once (_XE_PATH_.'classes/page/PageHandler.class.php'); + + $column_list = $output->column_list; + + $count_condition = count($output->groups) ? sprintf('%s group by %s', $condition, implode(', ', $output->groups)) : $condition; + $count_query = sprintf('select count(*) as "count" from %s %s %s', implode(', ', $table_list), implode(' ', $left_join), $count_condition); + if (count($output->groups)) { + $count_query = sprintf('select count(*) as "count" from (%s) xet', $count_query); + } + + $count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; + $result = $this->_query($count_query); + $count_output = $this->_fetch($result); + $total_count = (int)$count_output->count; + + $list_count = $output->list_count['value']; + if (!$list_count) $list_count = 20; + $page_count = $output->page_count['value']; + if (!$page_count) $page_count = 10; + $page = $output->page['value']; + if (!$page) $page = 1; + + // 전체 페이지를 구함 + if ($total_count) { + $total_page = (int) (($total_count - 1) / $list_count) + 1; + } + else { + $total_page = 1; + } + + // 페이지 변수를 체크 + if ($page > $total_page) $page = $total_page; + $start_count = ($page - 1) * $list_count; + + if ($output->order) { + $conditions = $this->getConditionList($output); + //if(in_array('list_order', $conditions) || in_array('update_order', $conditions)) { + foreach ($output->order as $key => $val) { + $col = $val[0]; + if(!in_array($col, array('list_order','update_order'))) continue; + if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col); + else $condition = sprintf(' where %s < 2100000000 ', $col); + } + //} + } + + + if (count ($output->groups)) { + foreach ($output->groups as $key => $value) { + if (strpos ($value, '.')) { + $tmp = explode ('.', $value); + $tmp[0] = sprintf ('"%s"', $tmp[0]); + $tmp[1] = sprintf ('"%s"', $tmp[1]); + $value = implode ('.', $tmp); + } + elseif (strpos ($value, '(')) $value = $value; + else $value = sprintf ('"%s"', $value); + $output->groups[$key] = $value; + } + + $groupby_query = sprintf (' group by %s', implode (',', $output->groups)); + } + + if ($output->order) { + foreach ($output->order as $val) { + if (strpos ($val[0], '.')) { + $tmpval = explode ('.', $val[0]); + $tmpval[0] = sprintf ('"%s"', $tmpval[0]); + $tmpval[1] = sprintf ('"%s"', $tmpval[1]); + $val[0] = implode ('.', $tmpval); + } + elseif (strpos ($val[0], '(')) $val[0] = $val[0]; + elseif ($val[0] == 'count') $val[0] = 'count (*)'; + else $val[0] = sprintf ('"%s"', $val[0]); + $index_list[] = sprintf ('%s %s', $val[0], $val[1]); + } + + if (count ($index_list)) { + $orderby_query = ' order by '.implode(',', $index_list); + } + + $orderby_query = sprintf ('%s for orderby_num() between %d and %d', $orderby_query, $start_count + 1, $list_count + $start_count); + } + else { + if (count($output->groups)) { + $orderby_query = sprintf ('%s having groupby_num() between %d and %d', $orderby_query, $start_count + 1, $list_count + $start_count); + } + else { + if ($condition) { + $orderby_query = sprintf ('%s and inst_num() between %d and %d', $orderby_query, $start_count + 1, $list_count + $start_count); + } + else { + $orderby_query = sprintf('%s where inst_num() between %d and %d', $orderby_query, $start_count + 1, $list_count + $start_count); + } + } + } + + if(count($output->arg_columns)) + { + $columns = array(); + foreach($output->arg_columns as $col){ + if(strpos($col,'"')===false) $columns[] = '"'.$col.'"'; + else $columns[] = $col; + } + + $columns = join(',',$columns); + } + + $query = sprintf ("select %s from %s %s %s %s", $columns, implode (',',$table_list), implode (' ',$left_join), $condition, $groupby_query.$orderby_query); + $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; + $result = $this->_query ($query); + + if ($this->isError ()) { + $buff = new Object (); + $buff->total_count = 0; + $buff->total_page = 0; + $buff->page = 1; + $buff->data = array (); + + $buff->page_navigation = new PageHandler ($total_count, $total_page, $page, $page_count); + + return $buff; + } + + $virtual_no = $total_count - ($page - 1) * $list_count; + while ($tmp = cubrid_fetch ($result, CUBRID_OBJECT)) { + if ($tmp) { + foreach ($tmp as $k => $v) { + $tmp->{$k} = rtrim($v); + } + } + $data[$virtual_no--] = $tmp; + } + + $buff = new Object (); + $buff->total_count = $total_count; + $buff->total_page = $total_page; + $buff->page = $page; + $buff->data = $data; + + $buff->page_navigation = new PageHandler ($total_count, $total_page, $page, $page_count); + + return $buff; + } + } + +return new DBCubrid; +?> diff --git a/classes/db/DBMssql.class.php b/classes/db/DBMssql.class.php index 13651a35a..3a0b75bb0 100644 --- a/classes/db/DBMssql.class.php +++ b/classes/db/DBMssql.class.php @@ -1,908 +1,908 @@ - 'bigint', - 'number' => 'int', - 'varchar' => 'varchar', - 'char' => 'char', - 'text' => 'text', - 'bigtext' => 'text', - 'date' => 'varchar(14)', - 'float' => 'float', - ); - - /** - * @brief constructor - **/ - function DBMssql() { - $this->_setDBInfo(); - $this->_connect(); - } - - /** - * @brief create an instance of this class - */ - function create() - { - return new DBMssql; - } - - /** - * @brief 설치 가능 여부를 return - **/ - function isSupported() { - if (!extension_loaded("sqlsrv")) return false; - return true; - } - - /** - * @brief DB정보 설정 및 connect/ close - **/ - function _setDBInfo() { - $db_info = Context::getDBInfo(); - $this->hostname = $db_info->db_hostname; - $this->port = $db_info->db_port; - $this->userid = $db_info->db_userid; - $this->password = $db_info->db_password; - $this->database = $db_info->db_database; - $this->prefix = $db_info->db_table_prefix; - - if(!substr($this->prefix,-1)!='_') $this->prefix .= '_'; - } - - /** - * @brief DB 접속 - **/ - function _connect() { - // db 정보가 없으면 무시 - if(!$this->hostname || !$this->database) return; - - //sqlsrv_configure( 'WarningsReturnAsErrors', 0 ); - //sqlsrv_configure( 'LogSeverity', SQLSRV_LOG_SEVERITY_ALL ); - //sqlsrv_configure( 'LogSubsystems', SQLSRV_LOG_SYSTEM_ALL ); - - $this->conn = sqlsrv_connect( $this->hostname, - array( 'Database' => $this->database,'UID'=>$this->userid,'PWD'=>$this->password )); - - - // 접속체크 - if($this->conn){ - $this->is_connected = true; - $this->password = md5($this->password); - }else{ - $this->is_connected = false; - } - } - - /** - * @brief DB접속 해제 - **/ - function close() { - if($this->is_connected == false) return; - - $this->commit(); - sqlsrv_close($this->conn); - $this->conn = null; - } - - /** - * @brief 쿼리에서 입력되는 문자열 변수들의 quotation 조절 - **/ - function addQuotes($string) { - if(version_compare(PHP_VERSION, "5.9.0", "<") && get_magic_quotes_gpc()) $string = stripslashes(str_replace("\\","\\\\",$string)); - //if(!is_numeric($string)) $string = str_replace("'","''",$string); - - return $string; - } - - /** - * @brief 트랜잭션 시작 - **/ - function begin() { - if($this->is_connected == false || $this->transaction_started) return; - if(sqlsrv_begin_transaction( $this->conn ) === false) return; - - $this->transaction_started = true; - } - - /** - * @brief 롤백 - **/ - function rollback() { - if($this->is_connected == false || !$this->transaction_started) return; - - $this->transaction_started = false; - sqlsrv_rollback( $this->conn ); - } - - /** - * @brief 커밋 - **/ - function commit($force = false) { - if(!$force && ($this->is_connected == false || !$this->transaction_started)) return; - - $this->transaction_started = false; - sqlsrv_commit( $this->conn ); - } - - /** - * @brief : 쿼리문의 실행 및 결과의 fetch 처리 - * - * query : query문 실행하고 result return\n - * fetch : reutrn 된 값이 없으면 NULL\n - * rows이면 array object\n - * row이면 object\n - * return\n - **/ - function _query($query) { - if($this->is_connected == false || !$query) return; - - $_param = array(); - - if(count($this->param)){ - foreach($this->param as $k => $o){ - if($o['type'] == 'number'){ - $_param[] = &$o['value']; - }else{ - $_param[] = array(&$o['value'], SQLSRV_PARAM_IN, SQLSRV_PHPTYPE_STRING('utf-8')); - } - } - } - - // 쿼리 시작을 알림 - $this->actStart($query); - - // 쿼리 문 실행 - $result = false; - if(count($_param)){ - $result = @sqlsrv_query($this->conn, $query, $_param); - }else{ - $result = @sqlsrv_query($this->conn, $query); - } - - // 오류 체크 - if(!$result) $this->setError(print_r(sqlsrv_errors(),true)); - - // 쿼리 실행 종료를 알림 - $this->actFinish(); - $this->param = array(); - - return $result; - } - - /** - * @brief 결과를 fetch - **/ - function _fetch($result) { - if(!$this->isConnected() || $this->isError() || !$result) return; - - $c = sqlsrv_num_fields($result); - $m = null; - $output = array(); - - while(sqlsrv_fetch($result)){ - if(!$m) $m = sqlsrv_field_metadata($result); - unset($row); - for($i=0;$i<$c;$i++){ - $row->{$m[$i]['Name']} = sqlsrv_get_field( $result, $i, SQLSRV_PHPTYPE_STRING( 'utf-8' )); - } - $output[] = $row; - } - - if(count($output)==1) return $output[0]; - return $output; - - } - - /** - * @brief 1씩 증가되는 sequence값을 return (mssql의 auto_increment는 sequence테이블에서만 사용) - **/ - function getNextSequence() { - $query = sprintf("insert into %ssequence (seq) values (ident_incr('%ssequence'))", $this->prefix, $this->prefix); - $this->_query($query); - - $query = sprintf("select ident_current('%ssequence')+1 as sequence", $this->prefix); - $result = $this->_query($query); - $tmp = $this->_fetch($result); - - - return $tmp->sequence; - } - - /** - * @brief 테이블 기생성 여부 return - **/ - function isTableExists($target_name) { - $query = sprintf("select name from sysobjects where name = '%s%s' and xtype='U'", $this->prefix, $this->addQuotes($target_name)); - $result = $this->_query($query); - $tmp = $this->_fetch($result); - - if(!$tmp) return false; - return true; - } - - /** - * @brief 특정 테이블에 특정 column 추가 - **/ - function addColumn($table_name, $column_name, $type='number', $size='', $default = '', $notnull=false) { - if($this->isColumnExists($table_name, $column_name)) return; - $type = $this->column_type[$type]; - if(strtoupper($type)=='INTEGER') $size = ''; - - $query = sprintf("alter table %s%s add %s ", $this->prefix, $table_name, $column_name); - if($size) $query .= sprintf(" %s(%s) ", $type, $size); - else $query .= sprintf(" %s ", $type); - if($default) $query .= sprintf(" default '%s' ", $default); - if($notnull) $query .= " not null "; - - $this->_query($query); - } - - /** - * @brief 특정 테이블에 특정 column 제거 - **/ - function dropColumn($table_name, $column_name) { - if(!$this->isColumnExists($table_name, $column_name)) return; - $query = sprintf("alter table %s%s drop %s ", $this->prefix, $table_name, $column_name); - $this->_query($query); - } - - /** - * @brief 특정 테이블의 column의 정보를 return - **/ - function isColumnExists($table_name, $column_name) { - $query = sprintf("select syscolumns.name as name from syscolumns, sysobjects where sysobjects.name = '%s%s' and sysobjects.id = syscolumns.id and syscolumns.name = '%s'", $this->prefix, $table_name, $column_name); - $result = $this->_query($query); - if($this->isError()) return; - $tmp = $this->_fetch($result); - if(!$tmp->name) return false; - return true; - } - - /** - * @brief 특정 테이블에 특정 인덱스 추가 - * $target_columns = array(col1, col2) - * $is_unique? unique : none - **/ - function addIndex($table_name, $index_name, $target_columns, $is_unique = false) { - if($this->isIndexExists($table_name, $index_name)) return; - if(!is_array($target_columns)) $target_columns = array($target_columns); - - $query = sprintf("create %s index %s on %s%s (%s)", $is_unique?'unique':'', $index_name, $this->prefix, $table_name, implode(',',$target_columns)); - $this->_query($query); - } - - /** - * @brief 특정 테이블의 특정 인덱스 삭제 - **/ - function dropIndex($table_name, $index_name, $is_unique = false) { - if(!$this->isIndexExists($table_name, $index_name)) return; - $query = sprintf("drop index %s%s.%s", $this->prefix, $table_name, $index_name); - $this->_query($query); - } - - /** - * @brief 특정 테이블의 index 정보를 return - **/ - function isIndexExists($table_name, $index_name) { - $query = sprintf("select sysindexes.name as name from sysindexes, sysobjects where sysobjects.name = '%s%s' and sysobjects.id = sysindexes.id and sysindexes.name = '%s'", $this->prefix, $table_name, $index_name); - - $result = $this->_query($query); - if($this->isError()) return; - $tmp = $this->_fetch($result); - - if(!$tmp->name) return false; - return true; - } - - /** - * @brief xml 을 받아서 테이블을 생성 - **/ - function createTableByXml($xml_doc) { - return $this->_createTable($xml_doc); - } - - /** - * @brief xml 을 받아서 테이블을 생성 - **/ - function createTableByXmlFile($file_name) { - if(!file_exists($file_name)) return; - // xml 파일을 읽음 - $buff = FileHandler::readFile($file_name); - return $this->_createTable($buff); - } - - /** - * @brief schema xml을 이용하여 create table query생성 - * - * type : number, varchar, text, char, date, \n - * opt : notnull, default, size\n - * index : primary key, index, unique\n - **/ - function _createTable($xml_doc) { - // xml parsing - $oXml = new XmlParser(); - $xml_obj = $oXml->parse($xml_doc); - - // 테이블 생성 schema 작성 - $table_name = $xml_obj->table->attrs->name; - if($this->isTableExists($table_name)) return; - - if($table_name == 'sequence') { - $table_name = $this->prefix.$table_name; - $query = sprintf('create table %s ( sequence int identity(1,1), seq int )', $table_name); - return $this->_query($query); - } else { - $table_name = $this->prefix.$table_name; - - if(!is_array($xml_obj->table->column)) $columns[] = $xml_obj->table->column; - else $columns = $xml_obj->table->column; - - foreach($columns as $column) { - $name = $column->attrs->name; - $type = $column->attrs->type; - $size = $column->attrs->size; - $notnull = $column->attrs->notnull; - $primary_key = $column->attrs->primary_key; - $index = $column->attrs->index; - $unique = $column->attrs->unique; - $default = $column->attrs->default; - $auto_increment = $column->attrs->auto_increment; - - $column_schema[] = sprintf('[%s] %s%s %s %s %s %s', - $name, - $this->column_type[$type], - !in_array($type,array('number','text'))&&$size?'('.$size.')':'', - $primary_key?'primary key':'', - isset($default)?"default '".$default."'":'', - $notnull?'not null':'null', - $auto_increment?'identity(1,1)':'' - ); - - if($unique) $unique_list[$unique][] = $name; - else if($index) $index_list[$index][] = $name; - } - - $schema = sprintf('create table [%s] (xe_seq int identity(1,1),%s%s)', $this->addQuotes($table_name), "\n", implode($column_schema,",\n")); - $output = $this->_query($schema); - if(!$output) return false; - - if(count($unique_list)) { - foreach($unique_list as $key => $val) { - $query = sprintf("create unique index %s on %s (%s);", $key, $table_name, '['.implode('],[',$val).']'); - $this->_query($query); - } - } - - if(count($index_list)) { - foreach($index_list as $key => $val) { - $query = sprintf("create index %s on %s (%s);", $key, $table_name, '['.implode('],[',$val).']'); - $this->_query($query); - } - } - return true; - } - } - - /** - * @brief 조건문 작성하여 return - **/ - function getCondition($output) { - if(!$output->conditions) return; - $condition = $this->_getCondition($output->conditions,$output->column_type); - if($condition) $condition = ' where '.$condition; - return $condition; - } - - function getLeftCondition($conditions,$column_type){ - return $this->_getCondition($conditions,$column_type); - } - - - function _getCondition($conditions,$column_type) { - $condition = ''; - - foreach($conditions as $val) { - $sub_condition = ''; - foreach($val['condition'] as $v) { - if(!isset($v['value'])) continue; - if($v['value'] === '') continue; - if(!in_array(gettype($v['value']), array('string', 'integer', 'double'))) continue; - - $name = $v['column']; - if(preg_match('/^substr\(/i',$name)) $name = preg_replace('/^substr\(/i','substring(',$name); - $operation = $v['operation']; - $value = $v['value']; - - $type = $this->getColumnType($column_type,$name); - $pipe = $v['pipe']; - - $value = $this->getConditionValue($name, $value, $operation, $type, $column_type); - if(!$value) $value = $v['value']; - $str = $this->getConditionPart($name, $value, $operation); - if($sub_condition) $sub_condition .= ' '.$pipe.' '; - $sub_condition .= $str; - } - if($sub_condition) { - if($condition && $val['pipe']) $condition .= ' '.$val['pipe'].' '; - $condition .= '('.$sub_condition.')'; - } - } - return $condition; - } - - - function getConditionValue($name, $value, $operation, $type, $column_type) { - - if($type == 'number') { - if(strpos($value,',')===false && strpos($value,'(')===false){ - - if(is_integer($value)){ - $this->param[] = array('type'=>'number','value'=>(int)$value); - return '?'; - }else{ - return $value; - } - } - } - - if(strpos($name,'.')!==false&&strpos($value,'.')!==false) { - list($table_name, $column_name) = explode('.',$value); - if($column_type[$column_name]){ - return $value; - } - } - - switch($operation) { - case 'like_prefix' : - $value = preg_replace('/(^\'|\'$){1}/','',$value); - $this->param[] = array('type'=>$column_type[$name],'value'=>$value); - - $value = "? + '%'"; - break; - case 'like_tail' : - $value = preg_replace('/(^\'|\'$){1}/','',$value); - $this->param[] = array('type'=>$column_type[$name],'value'=>$value); - - $value = "'%' + ?"; - break; - case 'like' : - $value = preg_replace('/(^\'|\'$){1}/','',$value); - $this->param[] = array('type'=>$column_type[$name],'value'=>$value); - - $value = "'%' + ? + '%'"; - break; - case 'notin' : - preg_match_all('/,?\'([^\']*)\'/',$value,$match); - $val = array(); - foreach($match[1] as $k => $v){ - $this->param[] = array('type'=>$column_type[$name],'value'=>trim($v)); - $val[] ='?'; - } - $value = join(',',$val); - break; - case 'in' : - preg_match_all('/,?\'([^\']*)\'/',$value,$match); - $val = array(); - foreach($match[1] as $k => $v){ - $this->param[] = array('type'=>$column_type[$name],'value'=>trim($v)); - $val[] ='?'; - } - $value = join(',',$val); - break; - default: - $value = preg_replace('/(^\'|\'$){1}/','',$value); - $this->param[] = array('type'=>$column_type[$name],'value'=>$value); - $value = '?'; - break; - } - - return $value; - } - - /** - * @brief insertAct 처리 - **/ - function _executeInsertAct($output) { - - // 테이블 정리 - foreach($output->tables as $key => $val) { - $table_list[] = '['.$this->prefix.$val.']'; - } - - // 컬럼 정리 - foreach($output->columns as $key => $val) { - $name = $val['name']; - $value = $val['value']; - - if($output->column_type[$name]!='number') { - $value = $this->addQuotes($value); - if(!$value) $value = ''; - } elseif(is_numeric($value)){ - if(!$value) $value = ''; - $value = (int)$value; - } elseif(!$value){ - $value = ''; - } - - $column_list[] = '['.$name.']'; - $value_list[] = '?'; - - $this->param[] = array('type'=>$output->column_type[$name], 'value'=>$value); - } - - $query = sprintf("insert into %s (%s) values (%s);", implode(',',$table_list), implode(',',$column_list), implode(',', $value_list)); - - return $this->_query($query); - } - - /** - * @brief updateAct 처리 - **/ - function _executeUpdateAct($output) { - // 테이블 정리 - foreach($output->tables as $key => $val) { - $table_list[] = '['.$this->prefix.$val.']'; - } - - // 컬럼 정리 - foreach($output->columns as $key => $val) { - if(!isset($val['value'])) continue; - - $name = $val['name']; - $value = $val['value']; - if(strpos($name,'.')!==false&&strpos($value,'.')!==false){ - $column_list[] = $name.' = '.$value; - } else { - if($output->column_type[$name]!='number'){ - $value = $this->addQuotes($value); - if(!$value) $value = ''; - - $this->param[] = array('type'=>$output->column_type[$name], 'value'=>$value); - $column_list[] = sprintf("[%s] = ?", $name); - }elseif(!$value || is_numeric($value)){ - $value = (int)$value; - - $this->param[] = array('type'=>$output->column_type[$name], 'value'=>$value); - $column_list[] = sprintf("[%s] = ?", $name); - }else{ - if(!$value) $value = ''; - $column_list[] = sprintf("[%s] = %s", $name, $value); - } - - - } - } - - // 조건절 정리 - $condition = $this->getCondition($output); - - $query = sprintf("update %s set %s %s", implode(',',$table_list), implode(',',$column_list), $condition); - - return $this->_query($query); - } - - /** - * @brief deleteAct 처리 - **/ - function _executeDeleteAct($output) { - // 테이블 정리 - foreach($output->tables as $key => $val) { - $table_list[] = '['.$this->prefix.$val.']'; - } - - // 조건절 정리 - $condition = $this->getCondition($output); - - $query = sprintf("delete from %s %s", implode(',',$table_list), $condition); - - return $this->_query($query); - } - - /** - * @brief selectAct 처리 - * - * select의 경우 특정 페이지의 목록을 가져오는 것을 편하게 하기 위해\n - * navigation이라는 method를 제공 - **/ - function _executeSelectAct($output) { - // 테이블 정리 - $table_list = array(); - foreach($output->tables as $key => $val) { - $table_list[] = '['.$this->prefix.$val.'] as '.$key; - } - - $left_join = array(); - // why??? - $left_tables= (array)$output->left_tables; - - foreach($left_tables as $key => $val) { - $condition = $this->_getCondition($output->left_conditions[$key],$output->column_type); - if($condition){ - $left_join[] = $val . ' ['.$this->prefix.$output->_tables[$key].'] as '.$key . ' on (' . $condition . ')'; - } - } - - $click_count = array(); - if(!$output->columns){ - $output->columns = array(array('name'=>'*')); - } - - $column_list = array(); - foreach($output->columns as $key => $val) { - $name = $val['name']; - if(preg_match('/^substr\(/i',$name)) $name = preg_replace('/^substr\(/i','substring(',$name); - $alias = $val['alias']; - if($val['click_count']) $click_count[] = $val['name']; - - if(substr($name,-1) == '*') { - $column_list[] = $name; - } elseif(strpos($name,'.')===false && strpos($name,'(')===false) { - if($alias) $column_list[$alias] = sprintf('[%s] as [%s]', $name, $alias); - else $column_list[] = sprintf('[%s]',$name); - } else { - if($alias) $column_list[$alias] = sprintf('%s as [%s]', $name, $alias); - else $column_list[] = sprintf('%s',$name); - } - } - $columns = implode(',',$column_list); - - $condition = $this->getCondition($output); - - $output->column_list = $column_list; - if($output->list_count && $output->page) return $this->_getNavigationData($table_list, $columns, $left_join, $condition, $output); - - // list_order, update_order 로 정렬시에 인덱스 사용을 위해 condition에 쿼리 추가 - if($output->order) { - $conditions = $this->getConditionList($output); - if(!in_array('list_order', $conditions) && !in_array('update_order', $conditions)) { - foreach($output->order as $key => $val) { - $col = $val[0]; - if(!in_array($col, array('list_order','update_order'))) continue; - if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col); - else $condition = sprintf(' where %s < 2100000000 ', $col); - } - } - } - - if(count($output->groups)){ - foreach($output->groups as $k => $v ){ - if(preg_match('/^substr\(/i',$v)) $output->groups[$k] = preg_replace('/^substr\(/i','substring(',$v); - if($column_list[$v]) $output->arg_columns[] = $column_list[$v]; - } - $groupby_query = sprintf(' group by %s', implode(',',$output->groups)); - } - - if($output->order && !preg_match('/count\(\*\)/i',$columns) ) { - foreach($output->order as $key => $val) { - if(preg_match('/^substr\(/i',$val[0])) $name = preg_replace('/^substr\(/i','substring(',$val[0]); - $index_list[] = sprintf('%s %s', $val[0], $val[1]); - if(count($output->arg_columns) && $column_list[$val[0]]) $output->arg_columns[] = $column_list[$val[0]]; - } - if(count($index_list)) $orderby_query = ' order by '.implode(',',$index_list); - } - - if(count($output->arg_columns)) - { - $columns = array(); - foreach($output->arg_columns as $col){ - if(strpos($col,'[')===false && strpos($col,' ')==false) $columns[] = '['.$col.']'; - else $columns[] = $col; - } - - $columns = join(',',$columns); - } - - $query = sprintf("%s from %s %s %s %s", $columns, implode(',',$table_list),implode(' ',$left_join), $condition, $groupby_query.$orderby_query); - // list_count를 사용할 경우 적용 - if($output->list_count['value']) $query = sprintf('select top %d %s', $output->list_count['value'], $query); - else $query = "select ".$query; - - $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id):''; - $result = $this->_query($query); - if($this->isError()) return; - - if(count($click_count)>0 && count($output->conditions)>0){ - $_query = ''; - foreach($click_count as $k => $c) $_query .= sprintf(',%s=%s+1 ',$c,$c); - $_query = sprintf('update %s set %s %s',implode(',',$table_list), substr($_query,1), $condition); - $this->_query($_query); - } - - $data = $this->_fetch($result); - - $buff = new Object(); - $buff->data = $data; - return $buff; - } - - /** - * @brief query xml에 navigation 정보가 있을 경우 페이징 관련 작업을 처리한다 - * - * 그닥 좋지는 않은 구조이지만 편리하다.. -_-; - **/ - function _getNavigationData($table_list, $columns, $left_join, $condition, $output) { - require_once(_XE_PATH_.'classes/page/PageHandler.class.php'); - - $column_list = $output->column_list; - - // 전체 개수를 구함 - if(count($output->groups)){ - foreach($output->groups as $k => $v ){ - if(preg_match('/^substr\(/i',$v)) $output->groups[$k] = preg_replace('/^substr\(/i','substring(',$v); - if($column_list[$v]) $output->arg_columns[] = $column_list[$v]; - } - $count_condition = sprintf('%s group by %s', $condition, implode(', ', $output->groups)); - }else{ - $count_condition = $condition; - } - - $count_query = sprintf("select count(*) as count from %s %s %s", implode(', ', $table_list), implode(' ', $left_join), $count_condition); - if (count($output->groups)) $count_query = sprintf('select count(*) as count from (%s) xet', $count_query); - - $param = $this->param; - - $count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id . ' count(*)'):''; - $result = $this->_query($count_query); - - $this->param = $param; - $count_output = $this->_fetch($result); - - $total_count = (int)$count_output->count; - - $list_count = $output->list_count['value']; - if(!$list_count) $list_count = 20; - $page_count = $output->page_count['value']; - if(!$page_count) $page_count = 10; - $page = $output->page['value']; - if(!$page) $page = 1; - - // 전체 페이지를 구함 - if($total_count) $total_page = (int)( ($total_count-1) / $list_count) + 1; - else $total_page = 1; - - // 페이지 변수를 체크 - if($page > $total_page) $page = $total_page; - $start_count = ($page-1)*$list_count; - - // list_order, update_order 로 정렬시에 인덱스 사용을 위해 condition에 쿼리 추가 - $conditions = $this->getConditionList($output); - if($output->order) { - if(!in_array('list_order', $conditions) && !in_array('update_order', $conditions)) { - foreach($output->order as $key => $val) { - $col = $val[0]; - if(!in_array($col, array('list_order','update_order'))) continue; - if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col); - else $condition = sprintf(' %s < 2100000000 ', $col); - } - } - } - - // group by 절 추가 - if(count($output->groups)){ - foreach($output->groups as $k => $v ){ - if(preg_match('/^substr\(/i',$v)) $output->groups[$k] = preg_replace('/^substr\(/i','substring(',$v); - if($column_list[$v]) $output->arg_columns[] = $column_list[$v]; - } - - $group = sprintf('group by %s', implode(',',$output->groups)); - } - - // order 절 추가 - $order_targets = array(); - if($output->order) { - foreach($output->order as $key => $val) { - if(preg_match('/^substr\(/i',$val[0])) $name = preg_replace('/^substr\(/i','substring(',$val[0]); - $order_targets[$val[0]] = $val[1]; - $index_list[] = sprintf('%s %s', $val[0], $val[1]); - if(count($output->arg_columns) && $column_list[$val[0]]) $output->arg_columns[] = $column_list[$val[0]]; - } - if(count($index_list)) $order .= 'order by '.implode(',',$index_list); - } - if(!count($order_targets)) { - if(in_array('list_order',$conditions)) $order_targets['list_order'] = 'asc'; - else $order_targets['xe_seq'] = 'desc'; - } - - if(count($output->arg_columns)) - { - $columns = array(); - foreach($output->arg_columns as $col){ - if(strpos($col,'[')===false && strpos($col,' ')==false) $columns[] = '['.$col.']'; - else $columns[] = $col; - } - - $columns = join(',',$columns); - } - - if($start_count<1) { - $query = sprintf('select top %d %s from %s %s %s %s %s', $list_count, $columns, implode(',',$table_list), implode(' ',$left_join), $condition, $group, $order); - - } else { - foreach($order_targets as $k => $v) { - $first_columns[] = sprintf('%s(%s) as %s', $v=='asc'?'max':'min', $k, $k); - $first_sub_columns[] = $k; - } - - // 1차로 order 대상에 해당 하는 값을 가져옴 - $param = $this->param; - $first_query = sprintf("select %s from (select top %d %s from %s %s %s %s %s) xet", implode(',',$first_columns), $start_count, implode(',',$first_sub_columns), implode(',',$table_list), implode(' ',$left_join), $condition, $group, $order); - $result = $this->_query($first_query); - $this->param = $param; - $tmp = $this->_fetch($result); - - - - // 1차에서 나온 값을 이용 다시 쿼리 실행 - $sub_cond = array(); - foreach($order_targets as $k => $v) { - $sub_cond[] = sprintf("%s %s '%s'", $k, $v=='asc'?'>':'<', $tmp->{$k}); - } - $sub_condition = ' and( '.implode(' and ',$sub_cond).' )'; - - if($condition) $condition .= $sub_condition; - else $condition = ' where '.$sub_condition; - $query = sprintf('select top %d %s from %s %s %s %s %s', $list_count, $columns, implode(',',$table_list), implode(' ',$left_join), $condition, $group, $order); - } - - $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id):''; - $result = $this->_query($query); - - if($this->isError()) { - $buff = new Object(); - $buff->total_count = 0; - $buff->total_page = 0; - $buff->page = 1; - $buff->data = array(); - - $buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count); - return $buff; - } - - $virtual_no = $total_count - ($page-1)*$list_count; - - $output = $this->_fetch($result); - if(!is_array($output)) $output = array($output); - - foreach($output as $k => $v) { - $data[$virtual_no--] = $v; - } - - $buff = new Object(); - $buff->total_count = $total_count; - $buff->total_page = $total_page; - $buff->page = $page; - $buff->data = $data; - - $buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count); - return $buff; - } - - } - -return new DBMssql; -?> + 'bigint', + 'number' => 'int', + 'varchar' => 'varchar', + 'char' => 'char', + 'text' => 'text', + 'bigtext' => 'text', + 'date' => 'varchar(14)', + 'float' => 'float', + ); + + /** + * @brief constructor + **/ + function DBMssql() { + $this->_setDBInfo(); + $this->_connect(); + } + + /** + * @brief create an instance of this class + */ + function create() + { + return new DBMssql; + } + + /** + * @brief 설치 가능 여부를 return + **/ + function isSupported() { + if (!extension_loaded("sqlsrv")) return false; + return true; + } + + /** + * @brief DB정보 설정 및 connect/ close + **/ + function _setDBInfo() { + $db_info = Context::getDBInfo(); + $this->hostname = $db_info->db_hostname; + $this->port = $db_info->db_port; + $this->userid = $db_info->db_userid; + $this->password = $db_info->db_password; + $this->database = $db_info->db_database; + $this->prefix = $db_info->db_table_prefix; + + if(!substr($this->prefix,-1)!='_') $this->prefix .= '_'; + } + + /** + * @brief DB 접속 + **/ + function _connect() { + // db 정보가 없으면 무시 + if(!$this->hostname || !$this->database) return; + + //sqlsrv_configure( 'WarningsReturnAsErrors', 0 ); + //sqlsrv_configure( 'LogSeverity', SQLSRV_LOG_SEVERITY_ALL ); + //sqlsrv_configure( 'LogSubsystems', SQLSRV_LOG_SYSTEM_ALL ); + + $this->conn = sqlsrv_connect( $this->hostname, + array( 'Database' => $this->database,'UID'=>$this->userid,'PWD'=>$this->password )); + + + // 접속체크 + if($this->conn){ + $this->is_connected = true; + $this->password = md5($this->password); + }else{ + $this->is_connected = false; + } + } + + /** + * @brief DB접속 해제 + **/ + function close() { + if($this->is_connected == false) return; + + $this->commit(); + sqlsrv_close($this->conn); + $this->conn = null; + } + + /** + * @brief 쿼리에서 입력되는 문자열 변수들의 quotation 조절 + **/ + function addQuotes($string) { + if(version_compare(PHP_VERSION, "5.9.0", "<") && get_magic_quotes_gpc()) $string = stripslashes(str_replace("\\","\\\\",$string)); + //if(!is_numeric($string)) $string = str_replace("'","''",$string); + + return $string; + } + + /** + * @brief 트랜잭션 시작 + **/ + function begin() { + if($this->is_connected == false || $this->transaction_started) return; + if(sqlsrv_begin_transaction( $this->conn ) === false) return; + + $this->transaction_started = true; + } + + /** + * @brief 롤백 + **/ + function rollback() { + if($this->is_connected == false || !$this->transaction_started) return; + + $this->transaction_started = false; + sqlsrv_rollback( $this->conn ); + } + + /** + * @brief 커밋 + **/ + function commit($force = false) { + if(!$force && ($this->is_connected == false || !$this->transaction_started)) return; + + $this->transaction_started = false; + sqlsrv_commit( $this->conn ); + } + + /** + * @brief : 쿼리문의 실행 및 결과의 fetch 처리 + * + * query : query문 실행하고 result return\n + * fetch : reutrn 된 값이 없으면 NULL\n + * rows이면 array object\n + * row이면 object\n + * return\n + **/ + function _query($query) { + if($this->is_connected == false || !$query) return; + + $_param = array(); + + if(count($this->param)){ + foreach($this->param as $k => $o){ + if($o['type'] == 'number'){ + $_param[] = &$o['value']; + }else{ + $_param[] = array(&$o['value'], SQLSRV_PARAM_IN, SQLSRV_PHPTYPE_STRING('utf-8')); + } + } + } + + // 쿼리 시작을 알림 + $this->actStart($query); + + // 쿼리 문 실행 + $result = false; + if(count($_param)){ + $result = @sqlsrv_query($this->conn, $query, $_param); + }else{ + $result = @sqlsrv_query($this->conn, $query); + } + + // 오류 체크 + if(!$result) $this->setError(print_r(sqlsrv_errors(),true)); + + // 쿼리 실행 종료를 알림 + $this->actFinish(); + $this->param = array(); + + return $result; + } + + /** + * @brief 결과를 fetch + **/ + function _fetch($result) { + if(!$this->isConnected() || $this->isError() || !$result) return; + + $c = sqlsrv_num_fields($result); + $m = null; + $output = array(); + + while(sqlsrv_fetch($result)){ + if(!$m) $m = sqlsrv_field_metadata($result); + unset($row); + for($i=0;$i<$c;$i++){ + $row->{$m[$i]['Name']} = sqlsrv_get_field( $result, $i, SQLSRV_PHPTYPE_STRING( 'utf-8' )); + } + $output[] = $row; + } + + if(count($output)==1) return $output[0]; + return $output; + + } + + /** + * @brief 1씩 증가되는 sequence값을 return (mssql의 auto_increment는 sequence테이블에서만 사용) + **/ + function getNextSequence() { + $query = sprintf("insert into %ssequence (seq) values (ident_incr('%ssequence'))", $this->prefix, $this->prefix); + $this->_query($query); + + $query = sprintf("select ident_current('%ssequence')+1 as sequence", $this->prefix); + $result = $this->_query($query); + $tmp = $this->_fetch($result); + + + return $tmp->sequence; + } + + /** + * @brief 테이블 기생성 여부 return + **/ + function isTableExists($target_name) { + $query = sprintf("select name from sysobjects where name = '%s%s' and xtype='U'", $this->prefix, $this->addQuotes($target_name)); + $result = $this->_query($query); + $tmp = $this->_fetch($result); + + if(!$tmp) return false; + return true; + } + + /** + * @brief 특정 테이블에 특정 column 추가 + **/ + function addColumn($table_name, $column_name, $type='number', $size='', $default = '', $notnull=false) { + if($this->isColumnExists($table_name, $column_name)) return; + $type = $this->column_type[$type]; + if(strtoupper($type)=='INTEGER') $size = ''; + + $query = sprintf("alter table %s%s add %s ", $this->prefix, $table_name, $column_name); + if($size) $query .= sprintf(" %s(%s) ", $type, $size); + else $query .= sprintf(" %s ", $type); + if($default) $query .= sprintf(" default '%s' ", $default); + if($notnull) $query .= " not null "; + + $this->_query($query); + } + + /** + * @brief 특정 테이블에 특정 column 제거 + **/ + function dropColumn($table_name, $column_name) { + if(!$this->isColumnExists($table_name, $column_name)) return; + $query = sprintf("alter table %s%s drop %s ", $this->prefix, $table_name, $column_name); + $this->_query($query); + } + + /** + * @brief 특정 테이블의 column의 정보를 return + **/ + function isColumnExists($table_name, $column_name) { + $query = sprintf("select syscolumns.name as name from syscolumns, sysobjects where sysobjects.name = '%s%s' and sysobjects.id = syscolumns.id and syscolumns.name = '%s'", $this->prefix, $table_name, $column_name); + $result = $this->_query($query); + if($this->isError()) return; + $tmp = $this->_fetch($result); + if(!$tmp->name) return false; + return true; + } + + /** + * @brief 특정 테이블에 특정 인덱스 추가 + * $target_columns = array(col1, col2) + * $is_unique? unique : none + **/ + function addIndex($table_name, $index_name, $target_columns, $is_unique = false) { + if($this->isIndexExists($table_name, $index_name)) return; + if(!is_array($target_columns)) $target_columns = array($target_columns); + + $query = sprintf("create %s index %s on %s%s (%s)", $is_unique?'unique':'', $index_name, $this->prefix, $table_name, implode(',',$target_columns)); + $this->_query($query); + } + + /** + * @brief 특정 테이블의 특정 인덱스 삭제 + **/ + function dropIndex($table_name, $index_name, $is_unique = false) { + if(!$this->isIndexExists($table_name, $index_name)) return; + $query = sprintf("drop index %s%s.%s", $this->prefix, $table_name, $index_name); + $this->_query($query); + } + + /** + * @brief 특정 테이블의 index 정보를 return + **/ + function isIndexExists($table_name, $index_name) { + $query = sprintf("select sysindexes.name as name from sysindexes, sysobjects where sysobjects.name = '%s%s' and sysobjects.id = sysindexes.id and sysindexes.name = '%s'", $this->prefix, $table_name, $index_name); + + $result = $this->_query($query); + if($this->isError()) return; + $tmp = $this->_fetch($result); + + if(!$tmp->name) return false; + return true; + } + + /** + * @brief xml 을 받아서 테이블을 생성 + **/ + function createTableByXml($xml_doc) { + return $this->_createTable($xml_doc); + } + + /** + * @brief xml 을 받아서 테이블을 생성 + **/ + function createTableByXmlFile($file_name) { + if(!file_exists($file_name)) return; + // xml 파일을 읽음 + $buff = FileHandler::readFile($file_name); + return $this->_createTable($buff); + } + + /** + * @brief schema xml을 이용하여 create table query생성 + * + * type : number, varchar, text, char, date, \n + * opt : notnull, default, size\n + * index : primary key, index, unique\n + **/ + function _createTable($xml_doc) { + // xml parsing + $oXml = new XmlParser(); + $xml_obj = $oXml->parse($xml_doc); + + // 테이블 생성 schema 작성 + $table_name = $xml_obj->table->attrs->name; + if($this->isTableExists($table_name)) return; + + if($table_name == 'sequence') { + $table_name = $this->prefix.$table_name; + $query = sprintf('create table %s ( sequence int identity(1,1), seq int )', $table_name); + return $this->_query($query); + } else { + $table_name = $this->prefix.$table_name; + + if(!is_array($xml_obj->table->column)) $columns[] = $xml_obj->table->column; + else $columns = $xml_obj->table->column; + + foreach($columns as $column) { + $name = $column->attrs->name; + $type = $column->attrs->type; + $size = $column->attrs->size; + $notnull = $column->attrs->notnull; + $primary_key = $column->attrs->primary_key; + $index = $column->attrs->index; + $unique = $column->attrs->unique; + $default = $column->attrs->default; + $auto_increment = $column->attrs->auto_increment; + + $column_schema[] = sprintf('[%s] %s%s %s %s %s %s', + $name, + $this->column_type[$type], + !in_array($type,array('number','text'))&&$size?'('.$size.')':'', + $primary_key?'primary key':'', + isset($default)?"default '".$default."'":'', + $notnull?'not null':'null', + $auto_increment?'identity(1,1)':'' + ); + + if($unique) $unique_list[$unique][] = $name; + else if($index) $index_list[$index][] = $name; + } + + $schema = sprintf('create table [%s] (xe_seq int identity(1,1),%s%s)', $this->addQuotes($table_name), "\n", implode($column_schema,",\n")); + $output = $this->_query($schema); + if(!$output) return false; + + if(count($unique_list)) { + foreach($unique_list as $key => $val) { + $query = sprintf("create unique index %s on %s (%s);", $key, $table_name, '['.implode('],[',$val).']'); + $this->_query($query); + } + } + + if(count($index_list)) { + foreach($index_list as $key => $val) { + $query = sprintf("create index %s on %s (%s);", $key, $table_name, '['.implode('],[',$val).']'); + $this->_query($query); + } + } + return true; + } + } + + /** + * @brief 조건문 작성하여 return + **/ + function getCondition($output) { + if(!$output->conditions) return; + $condition = $this->_getCondition($output->conditions,$output->column_type); + if($condition) $condition = ' where '.$condition; + return $condition; + } + + function getLeftCondition($conditions,$column_type){ + return $this->_getCondition($conditions,$column_type); + } + + + function _getCondition($conditions,$column_type) { + $condition = ''; + + foreach($conditions as $val) { + $sub_condition = ''; + foreach($val['condition'] as $v) { + if(!isset($v['value'])) continue; + if($v['value'] === '') continue; + if(!in_array(gettype($v['value']), array('string', 'integer', 'double'))) continue; + + $name = $v['column']; + if(preg_match('/^substr\(/i',$name)) $name = preg_replace('/^substr\(/i','substring(',$name); + $operation = $v['operation']; + $value = $v['value']; + + $type = $this->getColumnType($column_type,$name); + $pipe = $v['pipe']; + + $value = $this->getConditionValue($name, $value, $operation, $type, $column_type); + if(!$value) $value = $v['value']; + $str = $this->getConditionPart($name, $value, $operation); + if($sub_condition) $sub_condition .= ' '.$pipe.' '; + $sub_condition .= $str; + } + if($sub_condition) { + if($condition && $val['pipe']) $condition .= ' '.$val['pipe'].' '; + $condition .= '('.$sub_condition.')'; + } + } + return $condition; + } + + + function getConditionValue($name, $value, $operation, $type, $column_type) { + + if($type == 'number') { + if(strpos($value,',')===false && strpos($value,'(')===false){ + + if(is_integer($value)){ + $this->param[] = array('type'=>'number','value'=>(int)$value); + return '?'; + }else{ + return $value; + } + } + } + + if(strpos($name,'.')!==false&&strpos($value,'.')!==false) { + list($table_name, $column_name) = explode('.',$value); + if($column_type[$column_name]){ + return $value; + } + } + + switch($operation) { + case 'like_prefix' : + $value = preg_replace('/(^\'|\'$){1}/','',$value); + $this->param[] = array('type'=>$column_type[$name],'value'=>$value); + + $value = "? + '%'"; + break; + case 'like_tail' : + $value = preg_replace('/(^\'|\'$){1}/','',$value); + $this->param[] = array('type'=>$column_type[$name],'value'=>$value); + + $value = "'%' + ?"; + break; + case 'like' : + $value = preg_replace('/(^\'|\'$){1}/','',$value); + $this->param[] = array('type'=>$column_type[$name],'value'=>$value); + + $value = "'%' + ? + '%'"; + break; + case 'notin' : + preg_match_all('/,?\'([^\']*)\'/',$value,$match); + $val = array(); + foreach($match[1] as $k => $v){ + $this->param[] = array('type'=>$column_type[$name],'value'=>trim($v)); + $val[] ='?'; + } + $value = join(',',$val); + break; + case 'in' : + preg_match_all('/,?\'([^\']*)\'/',$value,$match); + $val = array(); + foreach($match[1] as $k => $v){ + $this->param[] = array('type'=>$column_type[$name],'value'=>trim($v)); + $val[] ='?'; + } + $value = join(',',$val); + break; + default: + $value = preg_replace('/(^\'|\'$){1}/','',$value); + $this->param[] = array('type'=>$column_type[$name],'value'=>$value); + $value = '?'; + break; + } + + return $value; + } + + /** + * @brief insertAct 처리 + **/ + function _executeInsertAct($output) { + + // 테이블 정리 + foreach($output->tables as $key => $val) { + $table_list[] = '['.$this->prefix.$val.']'; + } + + // 컬럼 정리 + foreach($output->columns as $key => $val) { + $name = $val['name']; + $value = $val['value']; + + if($output->column_type[$name]!='number') { + $value = $this->addQuotes($value); + if(!$value) $value = ''; + } elseif(is_numeric($value)){ + if(!$value) $value = ''; + $value = (int)$value; + } elseif(!$value){ + $value = ''; + } + + $column_list[] = '['.$name.']'; + $value_list[] = '?'; + + $this->param[] = array('type'=>$output->column_type[$name], 'value'=>$value); + } + + $query = sprintf("insert into %s (%s) values (%s);", implode(',',$table_list), implode(',',$column_list), implode(',', $value_list)); + + return $this->_query($query); + } + + /** + * @brief updateAct 처리 + **/ + function _executeUpdateAct($output) { + // 테이블 정리 + foreach($output->tables as $key => $val) { + $table_list[] = '['.$this->prefix.$val.']'; + } + + // 컬럼 정리 + foreach($output->columns as $key => $val) { + if(!isset($val['value'])) continue; + + $name = $val['name']; + $value = $val['value']; + if(strpos($name,'.')!==false&&strpos($value,'.')!==false){ + $column_list[] = $name.' = '.$value; + } else { + if($output->column_type[$name]!='number'){ + $value = $this->addQuotes($value); + if(!$value) $value = ''; + + $this->param[] = array('type'=>$output->column_type[$name], 'value'=>$value); + $column_list[] = sprintf("[%s] = ?", $name); + }elseif(!$value || is_numeric($value)){ + $value = (int)$value; + + $this->param[] = array('type'=>$output->column_type[$name], 'value'=>$value); + $column_list[] = sprintf("[%s] = ?", $name); + }else{ + if(!$value) $value = ''; + $column_list[] = sprintf("[%s] = %s", $name, $value); + } + + + } + } + + // 조건절 정리 + $condition = $this->getCondition($output); + + $query = sprintf("update %s set %s %s", implode(',',$table_list), implode(',',$column_list), $condition); + + return $this->_query($query); + } + + /** + * @brief deleteAct 처리 + **/ + function _executeDeleteAct($output) { + // 테이블 정리 + foreach($output->tables as $key => $val) { + $table_list[] = '['.$this->prefix.$val.']'; + } + + // 조건절 정리 + $condition = $this->getCondition($output); + + $query = sprintf("delete from %s %s", implode(',',$table_list), $condition); + + return $this->_query($query); + } + + /** + * @brief selectAct 처리 + * + * select의 경우 특정 페이지의 목록을 가져오는 것을 편하게 하기 위해\n + * navigation이라는 method를 제공 + **/ + function _executeSelectAct($output) { + // 테이블 정리 + $table_list = array(); + foreach($output->tables as $key => $val) { + $table_list[] = '['.$this->prefix.$val.'] as '.$key; + } + + $left_join = array(); + // why??? + $left_tables= (array)$output->left_tables; + + foreach($left_tables as $key => $val) { + $condition = $this->_getCondition($output->left_conditions[$key],$output->column_type); + if($condition){ + $left_join[] = $val . ' ['.$this->prefix.$output->_tables[$key].'] as '.$key . ' on (' . $condition . ')'; + } + } + + $click_count = array(); + if(!$output->columns){ + $output->columns = array(array('name'=>'*')); + } + + $column_list = array(); + foreach($output->columns as $key => $val) { + $name = $val['name']; + if(preg_match('/^substr\(/i',$name)) $name = preg_replace('/^substr\(/i','substring(',$name); + $alias = $val['alias']; + if($val['click_count']) $click_count[] = $val['name']; + + if(substr($name,-1) == '*') { + $column_list[] = $name; + } elseif(strpos($name,'.')===false && strpos($name,'(')===false) { + if($alias) $column_list[$alias] = sprintf('[%s] as [%s]', $name, $alias); + else $column_list[] = sprintf('[%s]',$name); + } else { + if($alias) $column_list[$alias] = sprintf('%s as [%s]', $name, $alias); + else $column_list[] = sprintf('%s',$name); + } + } + $columns = implode(',',$column_list); + + $condition = $this->getCondition($output); + + $output->column_list = $column_list; + if($output->list_count && $output->page) return $this->_getNavigationData($table_list, $columns, $left_join, $condition, $output); + + // list_order, update_order 로 정렬시에 인덱스 사용을 위해 condition에 쿼리 추가 + if($output->order) { + $conditions = $this->getConditionList($output); + if(!in_array('list_order', $conditions) && !in_array('update_order', $conditions)) { + foreach($output->order as $key => $val) { + $col = $val[0]; + if(!in_array($col, array('list_order','update_order'))) continue; + if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col); + else $condition = sprintf(' where %s < 2100000000 ', $col); + } + } + } + + if(count($output->groups)){ + foreach($output->groups as $k => $v ){ + if(preg_match('/^substr\(/i',$v)) $output->groups[$k] = preg_replace('/^substr\(/i','substring(',$v); + if($column_list[$v]) $output->arg_columns[] = $column_list[$v]; + } + $groupby_query = sprintf(' group by %s', implode(',',$output->groups)); + } + + if($output->order && !preg_match('/count\(\*\)/i',$columns) ) { + foreach($output->order as $key => $val) { + if(preg_match('/^substr\(/i',$val[0])) $name = preg_replace('/^substr\(/i','substring(',$val[0]); + $index_list[] = sprintf('%s %s', $val[0], $val[1]); + if(count($output->arg_columns) && $column_list[$val[0]]) $output->arg_columns[] = $column_list[$val[0]]; + } + if(count($index_list)) $orderby_query = ' order by '.implode(',',$index_list); + } + + if(count($output->arg_columns)) + { + $columns = array(); + foreach($output->arg_columns as $col){ + if(strpos($col,'[')===false && strpos($col,' ')==false) $columns[] = '['.$col.']'; + else $columns[] = $col; + } + + $columns = join(',',$columns); + } + + $query = sprintf("%s from %s %s %s %s", $columns, implode(',',$table_list),implode(' ',$left_join), $condition, $groupby_query.$orderby_query); + // list_count를 사용할 경우 적용 + if($output->list_count['value']) $query = sprintf('select top %d %s', $output->list_count['value'], $query); + else $query = "select ".$query; + + $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id):''; + $result = $this->_query($query); + if($this->isError()) return; + + if(count($click_count)>0 && count($output->conditions)>0){ + $_query = ''; + foreach($click_count as $k => $c) $_query .= sprintf(',%s=%s+1 ',$c,$c); + $_query = sprintf('update %s set %s %s',implode(',',$table_list), substr($_query,1), $condition); + $this->_query($_query); + } + + $data = $this->_fetch($result); + + $buff = new Object(); + $buff->data = $data; + return $buff; + } + + /** + * @brief query xml에 navigation 정보가 있을 경우 페이징 관련 작업을 처리한다 + * + * 그닥 좋지는 않은 구조이지만 편리하다.. -_-; + **/ + function _getNavigationData($table_list, $columns, $left_join, $condition, $output) { + require_once(_XE_PATH_.'classes/page/PageHandler.class.php'); + + $column_list = $output->column_list; + + // 전체 개수를 구함 + if(count($output->groups)){ + foreach($output->groups as $k => $v ){ + if(preg_match('/^substr\(/i',$v)) $output->groups[$k] = preg_replace('/^substr\(/i','substring(',$v); + if($column_list[$v]) $output->arg_columns[] = $column_list[$v]; + } + $count_condition = sprintf('%s group by %s', $condition, implode(', ', $output->groups)); + }else{ + $count_condition = $condition; + } + + $count_query = sprintf("select count(*) as count from %s %s %s", implode(', ', $table_list), implode(' ', $left_join), $count_condition); + if (count($output->groups)) $count_query = sprintf('select count(*) as count from (%s) xet', $count_query); + + $param = $this->param; + + $count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id . ' count(*)'):''; + $result = $this->_query($count_query); + + $this->param = $param; + $count_output = $this->_fetch($result); + + $total_count = (int)$count_output->count; + + $list_count = $output->list_count['value']; + if(!$list_count) $list_count = 20; + $page_count = $output->page_count['value']; + if(!$page_count) $page_count = 10; + $page = $output->page['value']; + if(!$page) $page = 1; + + // 전체 페이지를 구함 + if($total_count) $total_page = (int)( ($total_count-1) / $list_count) + 1; + else $total_page = 1; + + // 페이지 변수를 체크 + if($page > $total_page) $page = $total_page; + $start_count = ($page-1)*$list_count; + + // list_order, update_order 로 정렬시에 인덱스 사용을 위해 condition에 쿼리 추가 + $conditions = $this->getConditionList($output); + if($output->order) { + if(!in_array('list_order', $conditions) && !in_array('update_order', $conditions)) { + foreach($output->order as $key => $val) { + $col = $val[0]; + if(!in_array($col, array('list_order','update_order'))) continue; + if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col); + else $condition = sprintf(' %s < 2100000000 ', $col); + } + } + } + + // group by 절 추가 + if(count($output->groups)){ + foreach($output->groups as $k => $v ){ + if(preg_match('/^substr\(/i',$v)) $output->groups[$k] = preg_replace('/^substr\(/i','substring(',$v); + if($column_list[$v]) $output->arg_columns[] = $column_list[$v]; + } + + $group = sprintf('group by %s', implode(',',$output->groups)); + } + + // order 절 추가 + $order_targets = array(); + if($output->order) { + foreach($output->order as $key => $val) { + if(preg_match('/^substr\(/i',$val[0])) $name = preg_replace('/^substr\(/i','substring(',$val[0]); + $order_targets[$val[0]] = $val[1]; + $index_list[] = sprintf('%s %s', $val[0], $val[1]); + if(count($output->arg_columns) && $column_list[$val[0]]) $output->arg_columns[] = $column_list[$val[0]]; + } + if(count($index_list)) $order .= 'order by '.implode(',',$index_list); + } + if(!count($order_targets)) { + if(in_array('list_order',$conditions)) $order_targets['list_order'] = 'asc'; + else $order_targets['xe_seq'] = 'desc'; + } + + if(count($output->arg_columns)) + { + $columns = array(); + foreach($output->arg_columns as $col){ + if(strpos($col,'[')===false && strpos($col,' ')==false) $columns[] = '['.$col.']'; + else $columns[] = $col; + } + + $columns = join(',',$columns); + } + + if($start_count<1) { + $query = sprintf('select top %d %s from %s %s %s %s %s', $list_count, $columns, implode(',',$table_list), implode(' ',$left_join), $condition, $group, $order); + + } else { + foreach($order_targets as $k => $v) { + $first_columns[] = sprintf('%s(%s) as %s', $v=='asc'?'max':'min', $k, $k); + $first_sub_columns[] = $k; + } + + // 1차로 order 대상에 해당 하는 값을 가져옴 + $param = $this->param; + $first_query = sprintf("select %s from (select top %d %s from %s %s %s %s %s) xet", implode(',',$first_columns), $start_count, implode(',',$first_sub_columns), implode(',',$table_list), implode(' ',$left_join), $condition, $group, $order); + $result = $this->_query($first_query); + $this->param = $param; + $tmp = $this->_fetch($result); + + + + // 1차에서 나온 값을 이용 다시 쿼리 실행 + $sub_cond = array(); + foreach($order_targets as $k => $v) { + $sub_cond[] = sprintf("%s %s '%s'", $k, $v=='asc'?'>':'<', $tmp->{$k}); + } + $sub_condition = ' and( '.implode(' and ',$sub_cond).' )'; + + if($condition) $condition .= $sub_condition; + else $condition = ' where '.$sub_condition; + $query = sprintf('select top %d %s from %s %s %s %s %s', $list_count, $columns, implode(',',$table_list), implode(' ',$left_join), $condition, $group, $order); + } + + $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id):''; + $result = $this->_query($query); + + if($this->isError()) { + $buff = new Object(); + $buff->total_count = 0; + $buff->total_page = 0; + $buff->page = 1; + $buff->data = array(); + + $buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count); + return $buff; + } + + $virtual_no = $total_count - ($page-1)*$list_count; + + $output = $this->_fetch($result); + if(!is_array($output)) $output = array($output); + + foreach($output as $k => $v) { + $data[$virtual_no--] = $v; + } + + $buff = new Object(); + $buff->total_count = $total_count; + $buff->total_page = $total_page; + $buff->page = $page; + $buff->data = $data; + + $buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count); + return $buff; + } + + } + +return new DBMssql; +?> diff --git a/classes/db/DBMysql.class.php b/classes/db/DBMysql.class.php index 8a5072850..1caab871c 100644 --- a/classes/db/DBMysql.class.php +++ b/classes/db/DBMysql.class.php @@ -1,780 +1,780 @@ - 'bigint', - 'number' => 'bigint', - 'varchar' => 'varchar', - 'char' => 'char', - 'text' => 'text', - 'bigtext' => 'longtext', - 'date' => 'varchar(14)', - 'float' => 'float', - ); - - /** - * @brief constructor - **/ - function DBMysql() { - $this->_setDBInfo(); - $this->_connect(); - } - - function create() { - return new DBMysql; - } - - /** - * @brief 설치 가능 여부를 return - **/ - function isSupported() { - if(!function_exists('mysql_connect')) return false; - return true; - } - - /** - * @brief DB정보 설정 및 connect/ close - **/ - function _setDBInfo() { - $db_info = Context::getDBInfo(); - $this->hostname = $db_info->db_hostname; - $this->port = $db_info->db_port; - $this->userid = $db_info->db_userid; - $this->password = $db_info->db_password; - $this->database = $db_info->db_database; - $this->prefix = $db_info->db_table_prefix; - if(!substr($this->prefix,-1)!='_') $this->prefix .= '_'; - } - - /** - * @brief DB 접속 - **/ - function _connect() { - // db 정보가 없으면 무시 - if(!$this->hostname || !$this->userid || !$this->password || !$this->database) return; - - if(strpos($this->hostname, ':')===false && $this->port) $this->hostname .= ':'.$this->port; - - // 접속시도 - $this->fd = @mysql_connect($this->hostname, $this->userid, $this->password); - if(mysql_error()) { - $this->setError(mysql_errno(), mysql_error()); - return; - } - - // 버전 확인후 4.1 이하면 오류 표시 - if(mysql_get_server_info($this->fd)<"4.1") { - $this->setError(-1, "XE cannot be installed under the version of mysql 4.1. Current mysql version is ".mysql_get_server_info()); - return; - } - - // db 선택 - @mysql_select_db($this->database, $this->fd); - if(mysql_error()) { - $this->setError(mysql_errno(), mysql_error()); - return; - } - - // 접속체크 - $this->is_connected = true; - $this->password = md5($this->password); - - // mysql의 경우 utf8임을 지정 - $this->_query("set names 'utf8'"); - } - - /** - * @brief DB접속 해제 - **/ - function close() { - if(!$this->isConnected()) return; - @mysql_close($this->fd); - } - - /** - * @brief 쿼리에서 입력되는 문자열 변수들의 quotation 조절 - **/ - function addQuotes($string) { - if(version_compare(PHP_VERSION, "5.9.0", "<") && get_magic_quotes_gpc()) $string = stripslashes(str_replace("\\","\\\\",$string)); - if(!is_numeric($string)) $string = @mysql_escape_string($string); - return $string; - } - - /** - * @brief 트랜잭션 시작 - **/ - function begin() { - } - - /** - * @brief 롤백 - **/ - function rollback() { - } - - /** - * @brief 커밋 - **/ - function commit() { - } - - /** - * @brief : 쿼리문의 실행 및 결과의 fetch 처리 - * - * query : query문 실행하고 result return\n - * fetch : reutrn 된 값이 없으면 NULL\n - * rows이면 array object\n - * row이면 object\n - * return\n - **/ - function _query($query) { - if(!$this->isConnected()) return; - - // 쿼리 시작을 알림 - $this->actStart($query); - - // 쿼리 문 실행 - $result = @mysql_query($query, $this->fd); - - // 오류 체크 - if(mysql_error($this->fd)) $this->setError(mysql_errno($this->fd), mysql_error($this->fd)); - - // 쿼리 실행 종료를 알림 - $this->actFinish(); - - // 결과 리턴 - return $result; - } - - /** - * @brief 결과를 fetch - **/ - function _fetch($result) { - if(!$this->isConnected() || $this->isError() || !$result) return; - while($tmp = $this->db_fetch_object($result)) { - $output[] = $tmp; - } - if(count($output)==1) return $output[0]; - return $output; - } - - /** - * @brief 1씩 증가되는 sequence값을 return (mysql의 auto_increment는 sequence테이블에서만 사용) - **/ - function getNextSequence() { - $query = sprintf("insert into `%ssequence` (seq) values ('0')", $this->prefix); - $this->_query($query); - $sequence = $this->db_insert_id(); - if($sequence % 10000 == 0) { - $query = sprintf("delete from `%ssequence` where seq < %d", $this->prefix, $sequence); - $this->_query($query); - } - - return $sequence; - } - - /** - * @brief mysql old password를 가져오는 함수 (mysql에서만 사용) - **/ - function isValidOldPassword($password, $saved_password) { - $query = sprintf("select password('%s') as password, old_password('%s') as old_password", $this->addQuotes($password), $this->addQuotes($password)); - $result = $this->_query($query); - $tmp = $this->_fetch($result); - if($tmp->password == $saved_password || $tmp->old_password == $saved_password) return true; - return false; - } - - /** - * @brief 테이블 기생성 여부 return - **/ - function isTableExists($target_name) { - $query = sprintf("show tables like '%s%s'", $this->prefix, $this->addQuotes($target_name)); - $result = $this->_query($query); - $tmp = $this->_fetch($result); - if(!$tmp) return false; - return true; - } - - /** - * @brief 특정 테이블에 특정 column 추가 - **/ - function addColumn($table_name, $column_name, $type='number', $size='', $default = '', $notnull=false) { - $type = $this->column_type[$type]; - if(strtoupper($type)=='INTEGER') $size = ''; - - $query = sprintf("alter table `%s%s` add `%s` ", $this->prefix, $table_name, $column_name); - if($size) $query .= sprintf(" %s(%s) ", $type, $size); - else $query .= sprintf(" %s ", $type); - if($default) $query .= sprintf(" default '%s' ", $default); - if($notnull) $query .= " not null "; - - $this->_query($query); - } - - /** - * @brief 특정 테이블에 특정 column 제거 - **/ - function dropColumn($table_name, $column_name) { - $query = sprintf("alter table `%s%s` drop `%s` ", $this->prefix, $table_name, $column_name); - $this->_query($query); - } - - /** - * @brief 특정 테이블의 column의 정보를 return - **/ - function isColumnExists($table_name, $column_name) { - $query = sprintf("show fields from `%s%s`", $this->prefix, $table_name); - $result = $this->_query($query); - if($this->isError()) return; - $output = $this->_fetch($result); - if($output) { - $column_name = strtolower($column_name); - foreach($output as $key => $val) { - $name = strtolower($val->Field); - if($column_name == $name) return true; - } - } - return false; - } - - /** - * @brief 특정 테이블에 특정 인덱스 추가 - * $target_columns = array(col1, col2) - * $is_unique? unique : none - **/ - function addIndex($table_name, $index_name, $target_columns, $is_unique = false) { - if(!is_array($target_columns)) $target_columns = array($target_columns); - - $query = sprintf("alter table `%s%s` add %s index `%s` (%s);", $this->prefix, $table_name, $is_unique?'unique':'', $index_name, implode(',',$target_columns)); - $this->_query($query); - } - - /** - * @brief 특정 테이블의 특정 인덱스 삭제 - **/ - function dropIndex($table_name, $index_name, $is_unique = false) { - $query = sprintf("alter table `%s%s` drop index `%s`", $this->prefix, $table_name, $index_name); - $this->_query($query); - } - - - /** - * @brief 특정 테이블의 index 정보를 return - **/ - function isIndexExists($table_name, $index_name) { - //$query = sprintf("show indexes from %s%s where key_name = '%s' ", $this->prefix, $table_name, $index_name); - $query = sprintf("show indexes from `%s%s`", $this->prefix, $table_name); - $result = $this->_query($query); - if($this->isError()) return; - $output = $this->_fetch($result); - if(!$output) return; - if(!is_array($output)) $output = array($output); - - for($i=0;$iKey_name == $index_name) return true; - } - return false; - } - - /** - * @brief xml 을 받아서 테이블을 생성 - **/ - function createTableByXml($xml_doc) { - return $this->_createTable($xml_doc); - } - - /** - * @brief xml 을 받아서 테이블을 생성 - **/ - function createTableByXmlFile($file_name) { - if(!file_exists($file_name)) return; - // xml 파일을 읽음 - $buff = FileHandler::readFile($file_name); - return $this->_createTable($buff); - } - - /** - * @brief schema xml을 이용하여 create table query생성 - * - * type : number, varchar, text, char, date, \n - * opt : notnull, default, size\n - * index : primary key, index, unique\n - **/ - function _createTable($xml_doc) { - // xml parsing - $oXml = new XmlParser(); - $xml_obj = $oXml->parse($xml_doc); - - // 테이블 생성 schema 작성 - $table_name = $xml_obj->table->attrs->name; - if($this->isTableExists($table_name)) return; - $table_name = $this->prefix.$table_name; - - if(!is_array($xml_obj->table->column)) $columns[] = $xml_obj->table->column; - else $columns = $xml_obj->table->column; - - foreach($columns as $column) { - $name = $column->attrs->name; - $type = $column->attrs->type; - $size = $column->attrs->size; - $notnull = $column->attrs->notnull; - $primary_key = $column->attrs->primary_key; - $index = $column->attrs->index; - $unique = $column->attrs->unique; - $default = $column->attrs->default; - $auto_increment = $column->attrs->auto_increment; - - $column_schema[] = sprintf('`%s` %s%s %s %s %s', - $name, - $this->column_type[$type], - $size?'('.$size.')':'', - isset($default)?"default '".$default."'":'', - $notnull?'not null':'', - $auto_increment?'auto_increment':'' - ); - - if($primary_key) $primary_list[] = $name; - else if($unique) $unique_list[$unique][] = $name; - else if($index) $index_list[$index][] = $name; - } - - if(count($primary_list)) { - $column_schema[] = sprintf("primary key (%s)", '`'.implode($primary_list,'`,`').'`'); - } - - if(count($unique_list)) { - foreach($unique_list as $key => $val) { - $column_schema[] = sprintf("unique %s (%s)", $key, '`'.implode($val,'`,`').'`'); - } - } - - if(count($index_list)) { - foreach($index_list as $key => $val) { - $column_schema[] = sprintf("index %s (%s)", $key, '`'.implode($val,'`,`').'`'); - } - } - - $schema = sprintf('create table `%s` (%s%s) %s;', $this->addQuotes($table_name), "\n", implode($column_schema,",\n"), "ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci"); - - $output = $this->_query($schema); - if(!$output) return false; - } - - /** - * @brief 조건문 작성하여 return - **/ - function getCondition($output) { - if(!$output->conditions) return; - $condition = $this->_getCondition($output->conditions,$output->column_type); - if($condition) $condition = ' where '.$condition; - return $condition; - } - - function getLeftCondition($conditions,$column_type){ - return $this->_getCondition($conditions,$column_type); - } - - - function _getCondition($conditions,$column_type) { - $condition = ''; - foreach($conditions as $val) { - $sub_condition = ''; - foreach($val['condition'] as $v) { - if(!isset($v['value'])) continue; - if($v['value'] === '') continue; - if(!in_array(gettype($v['value']), array('string', 'integer', 'double', 'array'))) continue; - - $name = $v['column']; - $operation = $v['operation']; - $value = $v['value']; - $type = $this->getColumnType($column_type,$name); - $pipe = $v['pipe']; - $value = $this->getConditionValue($name, $value, $operation, $type, $column_type); - if(!$value) $value = $v['value']; - $str = $this->getConditionPart($name, $value, $operation); - if($sub_condition) $sub_condition .= ' '.$pipe.' '; - $sub_condition .= $str; - } - if($sub_condition) { - if($condition && $val['pipe']) $condition .= ' '.$val['pipe'].' '; - $condition .= '('.$sub_condition.')'; - } - } - return $condition; - } - - /** - * @brief insertAct 처리 - **/ - function _executeInsertAct($output) { - // 테이블 정리 - foreach($output->tables as $key => $val) { - $table_list[] = '`'.$this->prefix.$val.'`'; - } - - // 컬럼 정리 - foreach($output->columns as $key => $val) { - $name = $val['name']; - $value = $val['value']; - - if($output->column_type[$name]!='number') { - - if(!is_null($value)){ - $value = "'" . $this->addQuotes($value) ."'"; - }else{ - if($val['notnull']=='notnull') { - $value = "''"; - } else { - //$value = 'null'; - $value = "''"; - } - } - - } elseif(!$value || is_numeric($value)) $value = (int)$value; - - $column_list[] = '`'.$name.'`'; - $value_list[] = $value; - } - - $query = sprintf("insert into %s (%s) values (%s);", implode(',',$table_list), implode(',',$column_list), implode(',', $value_list)); - return $this->_query($query); - } - - /** - * @brief updateAct 처리 - **/ - function _executeUpdateAct($output) { - // 테이블 정리 - foreach($output->tables as $key => $val) { - $table_list[] = '`'.$this->prefix.$val.'` as '.$key; - } - - // 컬럼 정리 - foreach($output->columns as $key => $val) { - if(!isset($val['value'])) continue; - $name = $val['name']; - $value = $val['value']; - if(strpos($name,'.')!==false&&strpos($value,'.')!==false) $column_list[] = $name.' = '.$value; - else { - if($output->column_type[$name]!='number') $value = "'".$this->addQuotes($value)."'"; - elseif(!$value || is_numeric($value)) $value = (int)$value; - - $column_list[] = sprintf("`%s` = %s", $name, $value); - } - } - - // 조건절 정리 - $condition = $this->getCondition($output); - - $query = sprintf("update %s set %s %s", implode(',',$table_list), implode(',',$column_list), $condition); - - return $this->_query($query); - } - - /** - * @brief deleteAct 처리 - **/ - function _executeDeleteAct($output) { - // 테이블 정리 - foreach($output->tables as $key => $val) { - $table_list[] = '`'.$this->prefix.$val.'`'; - } - - // 조건절 정리 - $condition = $this->getCondition($output); - - $query = sprintf("delete from %s %s", implode(',',$table_list), $condition); - - return $this->_query($query); - } - - /** - * @brief selectAct 처리 - * - * select의 경우 특정 페이지의 목록을 가져오는 것을 편하게 하기 위해\n - * navigation이라는 method를 제공 - **/ - function _executeSelectAct($output) { - // 테이블 정리 - $table_list = array(); - foreach($output->tables as $key => $val) { - $table_list[] = '`'.$this->prefix.$val.'` as '.$key; - } - - $left_join = array(); - // why??? - $left_tables= (array)$output->left_tables; - - foreach($left_tables as $key => $val) { - $condition = $this->_getCondition($output->left_conditions[$key],$output->column_type); - if($condition){ - $left_join[] = $val . ' `'.$this->prefix.$output->_tables[$key].'` as '.$key . ' on (' . $condition . ')'; - } - } - - $click_count = array(); - if(!$output->columns){ - $output->columns = array(array('name'=>'*')); - } - - $column_list = array(); - foreach($output->columns as $key => $val) - { - $name = $val['name']; - $alias = $val['alias']; - if($val['click_count']) $click_count[] = $val['name']; - - if(substr($name,-1) == '*') - { - $column_list[] = $name; - } - else if(strpos($name,'.')===false && strpos($name,'(')===false) - { - if($alias) - { - $col = sprintf('`%s` as `%s`', $name, $alias); - $column_list[$alias] = $col; - } - else - { - $column_list[] = sprintf('`%s`',$name); - } - } - else - { - if($alias) - { - $col = sprintf('%s as `%s`', $name, $alias); - $column_list[$alias] = $col; - } - else - { - $column_list[] = sprintf('%s',$name); - } - } - } - - $columns = implode(',',$column_list); - $output->column_list = $column_list; - $condition = $this->getCondition($output); - - if($output->list_count && $output->page) return $this->_getNavigationData($table_list, $columns, $left_join, $condition, $output); - - // list_order, update_order 로 정렬시에 인덱스 사용을 위해 condition에 쿼리 추가 - if($output->order) { - $conditions = $this->getConditionList($output); - if(!in_array('list_order', $conditions) && !in_array('update_order', $conditions)) { - foreach($output->order as $key => $val) { - $col = $val[0]; - if(!in_array($col, array('list_order','update_order'))) continue; - if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col); - else $condition = sprintf(' where %s < 2100000000 ', $col); - } - } - } - - - if(count($output->groups)) - { - $groupby_query = sprintf(' group by %s', implode(',',$output->groups)); - - if(count($output->arg_columns)) - { - foreach($output->groups as $group) - { - if($column_list[$group]) $output->arg_columns[] = $column_list[$group]; - } - } - } - - if($output->order) { - foreach($output->order as $key => $val) { - $index_list[] = sprintf('%s %s', $val[0], $val[1]); - if(count($output->arg_columns) && $column_list[$val[0]]) $output->arg_columns[] = $column_list[$val[0]]; - } - if(count($index_list)) $orderby_query .= ' order by '.implode(',',$index_list); - } - - if(count($output->arg_columns)) - { - $columns = array(); - foreach($output->arg_columns as $col){ - if(strpos($col,'`')===false && strpos($col,' ')==false) $columns[] = '`'.$col.'`'; - else $columns[] = $col; - } - - $columns = join(',',$columns); - } - - $query = sprintf("select %s from %s %s %s %s", $columns, implode(',',$table_list),implode(' ',$left_join), $condition, $groupby_query.$orderby_query); - - // list_count를 사용할 경우 적용 - if($output->list_count['value']) $query = sprintf('%s limit %d', $query, $output->list_count['value']); - - $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id):''; - - $result = $this->_query($query); - if($this->isError()) return; - if(count($click_count) && count($output->conditions)){ - $_query = ''; - foreach($click_count as $k => $c) $_query .= sprintf(',%s=%s+1 ',$c,$c); - $_query = sprintf('update %s set %s %s',implode(',',$table_list), substr($_query,1), $condition); - $this->_query($_query); - } - - $data = $this->_fetch($result); - - $buff = new Object(); - $buff->data = $data; - - return $buff; - } - - /** - * @brief query xml에 navigation 정보가 있을 경우 페이징 관련 작업을 처리한다 - * - * 그닥 좋지는 않은 구조이지만 편리하다.. -_-; - **/ - function _getNavigationData($table_list, $columns, $left_join, $condition, $output) { - require_once(_XE_PATH_.'classes/page/PageHandler.class.php'); - - $column_list = $output->column_list; - - // 전체 개수를 구함 - $count_condition = count($output->groups) ? sprintf('%s group by %s', $condition, implode(', ', $output->groups)) : $condition; - $count_query = sprintf("select count(*) as count from %s %s %s", implode(', ', $table_list), implode(' ', $left_join), $count_condition); - if (count($output->groups)) $count_query = sprintf('select count(*) as count from (%s) xet', $count_query); - - $count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id . ' count(*)'):''; - $result = $this->_query($count_query); - $count_output = $this->_fetch($result); - $total_count = (int)$count_output->count; - - $list_count = $output->list_count['value']; - if(!$list_count) $list_count = 20; - $page_count = $output->page_count['value']; - if(!$page_count) $page_count = 10; - $page = $output->page['value']; - if(!$page) $page = 1; - - // 전체 페이지를 구함 - if($total_count) $total_page = (int)( ($total_count-1) / $list_count) + 1; - else $total_page = 1; - - // 페이지 변수를 체크 - if($page > $total_page) $page = $total_page; - $start_count = ($page-1)*$list_count; - - // list_order, update_order 로 정렬시에 인덱스 사용을 위해 condition에 쿼리 추가 - if($output->order) { - $conditions = $this->getConditionList($output); - if(!in_array('list_order', $conditions) && !in_array('update_order', $conditions)) { - foreach($output->order as $key => $val) { - $col = $val[0]; - if(!in_array($col, array('list_order','update_order'))) continue; - if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col); - else $condition = sprintf(' where %s < 2100000000 ', $col); - } - } - } - - if(count($output->groups)){ - $groupby_query = sprintf(' group by %s', implode(',',$output->groups)); - - if(count($output->arg_columns)) - { - foreach($output->groups as $group) - { - if($column_list[$group]) $output->arg_columns[] = $column_list[$group]; - } - } - } - - if(count($output->order)) { - foreach($output->order as $key => $val) { - $index_list[] = sprintf('%s %s', $val[0], $val[1]); - if(count($output->arg_columns) && $column_list[$val[0]]) $output->arg_columns[] = $column_list[$val[0]]; - } - if(count($index_list)) $orderby_query = ' order by '.implode(',',$index_list); - } - - if(count($output->arg_columns)) - { - $columns = array(); - foreach($output->arg_columns as $col){ - if(strpos($col,'`')===false && strpos($col,' ')==false) $columns[] = '`'.$col.'`'; - else $columns[] = $col; - } - - $columns = join(',',$columns); - } - - $query = sprintf("select %s from %s %s %s %s", $columns, implode(',',$table_list), implode(' ',$left_join), $condition, $groupby_query.$orderby_query); - $query = sprintf('%s limit %d, %d', $query, $start_count, $list_count); - $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id):''; - - $result = $this->_query($query); - if($this->isError()) { - $buff = new Object(); - $buff->total_count = 0; - $buff->total_page = 0; - $buff->page = 1; - $buff->data = array(); - - $buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count); - return $buff; - } - - $virtual_no = $total_count - ($page-1)*$list_count; - $data = array(); - while($tmp = $this->db_fetch_object($result)) { - $data[$virtual_no--] = $tmp; - } - $buff = new Object(); - $buff->total_count = $total_count; - $buff->total_page = $total_page; - $buff->page = $page; - $buff->data = $data; - - $buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count); - return $buff; - } - - function db_insert_id() - { - return mysql_insert_id($this->fd); - } - - function db_fetch_object(&$result) - { - return mysql_fetch_object($result); - } - } - -return new DBMysql; -?> + 'bigint', + 'number' => 'bigint', + 'varchar' => 'varchar', + 'char' => 'char', + 'text' => 'text', + 'bigtext' => 'longtext', + 'date' => 'varchar(14)', + 'float' => 'float', + ); + + /** + * @brief constructor + **/ + function DBMysql() { + $this->_setDBInfo(); + $this->_connect(); + } + + function create() { + return new DBMysql; + } + + /** + * @brief 설치 가능 여부를 return + **/ + function isSupported() { + if(!function_exists('mysql_connect')) return false; + return true; + } + + /** + * @brief DB정보 설정 및 connect/ close + **/ + function _setDBInfo() { + $db_info = Context::getDBInfo(); + $this->hostname = $db_info->db_hostname; + $this->port = $db_info->db_port; + $this->userid = $db_info->db_userid; + $this->password = $db_info->db_password; + $this->database = $db_info->db_database; + $this->prefix = $db_info->db_table_prefix; + if(!substr($this->prefix,-1)!='_') $this->prefix .= '_'; + } + + /** + * @brief DB 접속 + **/ + function _connect() { + // db 정보가 없으면 무시 + if(!$this->hostname || !$this->userid || !$this->password || !$this->database) return; + + if(strpos($this->hostname, ':')===false && $this->port) $this->hostname .= ':'.$this->port; + + // 접속시도 + $this->fd = @mysql_connect($this->hostname, $this->userid, $this->password); + if(mysql_error()) { + $this->setError(mysql_errno(), mysql_error()); + return; + } + + // 버전 확인후 4.1 이하면 오류 표시 + if(mysql_get_server_info($this->fd)<"4.1") { + $this->setError(-1, "XE cannot be installed under the version of mysql 4.1. Current mysql version is ".mysql_get_server_info()); + return; + } + + // db 선택 + @mysql_select_db($this->database, $this->fd); + if(mysql_error()) { + $this->setError(mysql_errno(), mysql_error()); + return; + } + + // 접속체크 + $this->is_connected = true; + $this->password = md5($this->password); + + // mysql의 경우 utf8임을 지정 + $this->_query("set names 'utf8'"); + } + + /** + * @brief DB접속 해제 + **/ + function close() { + if(!$this->isConnected()) return; + @mysql_close($this->fd); + } + + /** + * @brief 쿼리에서 입력되는 문자열 변수들의 quotation 조절 + **/ + function addQuotes($string) { + if(version_compare(PHP_VERSION, "5.9.0", "<") && get_magic_quotes_gpc()) $string = stripslashes(str_replace("\\","\\\\",$string)); + if(!is_numeric($string)) $string = @mysql_escape_string($string); + return $string; + } + + /** + * @brief 트랜잭션 시작 + **/ + function begin() { + } + + /** + * @brief 롤백 + **/ + function rollback() { + } + + /** + * @brief 커밋 + **/ + function commit() { + } + + /** + * @brief : 쿼리문의 실행 및 결과의 fetch 처리 + * + * query : query문 실행하고 result return\n + * fetch : reutrn 된 값이 없으면 NULL\n + * rows이면 array object\n + * row이면 object\n + * return\n + **/ + function _query($query) { + if(!$this->isConnected()) return; + + // 쿼리 시작을 알림 + $this->actStart($query); + + // 쿼리 문 실행 + $result = @mysql_query($query, $this->fd); + + // 오류 체크 + if(mysql_error($this->fd)) $this->setError(mysql_errno($this->fd), mysql_error($this->fd)); + + // 쿼리 실행 종료를 알림 + $this->actFinish(); + + // 결과 리턴 + return $result; + } + + /** + * @brief 결과를 fetch + **/ + function _fetch($result) { + if(!$this->isConnected() || $this->isError() || !$result) return; + while($tmp = $this->db_fetch_object($result)) { + $output[] = $tmp; + } + if(count($output)==1) return $output[0]; + return $output; + } + + /** + * @brief 1씩 증가되는 sequence값을 return (mysql의 auto_increment는 sequence테이블에서만 사용) + **/ + function getNextSequence() { + $query = sprintf("insert into `%ssequence` (seq) values ('0')", $this->prefix); + $this->_query($query); + $sequence = $this->db_insert_id(); + if($sequence % 10000 == 0) { + $query = sprintf("delete from `%ssequence` where seq < %d", $this->prefix, $sequence); + $this->_query($query); + } + + return $sequence; + } + + /** + * @brief mysql old password를 가져오는 함수 (mysql에서만 사용) + **/ + function isValidOldPassword($password, $saved_password) { + $query = sprintf("select password('%s') as password, old_password('%s') as old_password", $this->addQuotes($password), $this->addQuotes($password)); + $result = $this->_query($query); + $tmp = $this->_fetch($result); + if($tmp->password == $saved_password || $tmp->old_password == $saved_password) return true; + return false; + } + + /** + * @brief 테이블 기생성 여부 return + **/ + function isTableExists($target_name) { + $query = sprintf("show tables like '%s%s'", $this->prefix, $this->addQuotes($target_name)); + $result = $this->_query($query); + $tmp = $this->_fetch($result); + if(!$tmp) return false; + return true; + } + + /** + * @brief 특정 테이블에 특정 column 추가 + **/ + function addColumn($table_name, $column_name, $type='number', $size='', $default = '', $notnull=false) { + $type = $this->column_type[$type]; + if(strtoupper($type)=='INTEGER') $size = ''; + + $query = sprintf("alter table `%s%s` add `%s` ", $this->prefix, $table_name, $column_name); + if($size) $query .= sprintf(" %s(%s) ", $type, $size); + else $query .= sprintf(" %s ", $type); + if($default) $query .= sprintf(" default '%s' ", $default); + if($notnull) $query .= " not null "; + + $this->_query($query); + } + + /** + * @brief 특정 테이블에 특정 column 제거 + **/ + function dropColumn($table_name, $column_name) { + $query = sprintf("alter table `%s%s` drop `%s` ", $this->prefix, $table_name, $column_name); + $this->_query($query); + } + + /** + * @brief 특정 테이블의 column의 정보를 return + **/ + function isColumnExists($table_name, $column_name) { + $query = sprintf("show fields from `%s%s`", $this->prefix, $table_name); + $result = $this->_query($query); + if($this->isError()) return; + $output = $this->_fetch($result); + if($output) { + $column_name = strtolower($column_name); + foreach($output as $key => $val) { + $name = strtolower($val->Field); + if($column_name == $name) return true; + } + } + return false; + } + + /** + * @brief 특정 테이블에 특정 인덱스 추가 + * $target_columns = array(col1, col2) + * $is_unique? unique : none + **/ + function addIndex($table_name, $index_name, $target_columns, $is_unique = false) { + if(!is_array($target_columns)) $target_columns = array($target_columns); + + $query = sprintf("alter table `%s%s` add %s index `%s` (%s);", $this->prefix, $table_name, $is_unique?'unique':'', $index_name, implode(',',$target_columns)); + $this->_query($query); + } + + /** + * @brief 특정 테이블의 특정 인덱스 삭제 + **/ + function dropIndex($table_name, $index_name, $is_unique = false) { + $query = sprintf("alter table `%s%s` drop index `%s`", $this->prefix, $table_name, $index_name); + $this->_query($query); + } + + + /** + * @brief 특정 테이블의 index 정보를 return + **/ + function isIndexExists($table_name, $index_name) { + //$query = sprintf("show indexes from %s%s where key_name = '%s' ", $this->prefix, $table_name, $index_name); + $query = sprintf("show indexes from `%s%s`", $this->prefix, $table_name); + $result = $this->_query($query); + if($this->isError()) return; + $output = $this->_fetch($result); + if(!$output) return; + if(!is_array($output)) $output = array($output); + + for($i=0;$iKey_name == $index_name) return true; + } + return false; + } + + /** + * @brief xml 을 받아서 테이블을 생성 + **/ + function createTableByXml($xml_doc) { + return $this->_createTable($xml_doc); + } + + /** + * @brief xml 을 받아서 테이블을 생성 + **/ + function createTableByXmlFile($file_name) { + if(!file_exists($file_name)) return; + // xml 파일을 읽음 + $buff = FileHandler::readFile($file_name); + return $this->_createTable($buff); + } + + /** + * @brief schema xml을 이용하여 create table query생성 + * + * type : number, varchar, text, char, date, \n + * opt : notnull, default, size\n + * index : primary key, index, unique\n + **/ + function _createTable($xml_doc) { + // xml parsing + $oXml = new XmlParser(); + $xml_obj = $oXml->parse($xml_doc); + + // 테이블 생성 schema 작성 + $table_name = $xml_obj->table->attrs->name; + if($this->isTableExists($table_name)) return; + $table_name = $this->prefix.$table_name; + + if(!is_array($xml_obj->table->column)) $columns[] = $xml_obj->table->column; + else $columns = $xml_obj->table->column; + + foreach($columns as $column) { + $name = $column->attrs->name; + $type = $column->attrs->type; + $size = $column->attrs->size; + $notnull = $column->attrs->notnull; + $primary_key = $column->attrs->primary_key; + $index = $column->attrs->index; + $unique = $column->attrs->unique; + $default = $column->attrs->default; + $auto_increment = $column->attrs->auto_increment; + + $column_schema[] = sprintf('`%s` %s%s %s %s %s', + $name, + $this->column_type[$type], + $size?'('.$size.')':'', + isset($default)?"default '".$default."'":'', + $notnull?'not null':'', + $auto_increment?'auto_increment':'' + ); + + if($primary_key) $primary_list[] = $name; + else if($unique) $unique_list[$unique][] = $name; + else if($index) $index_list[$index][] = $name; + } + + if(count($primary_list)) { + $column_schema[] = sprintf("primary key (%s)", '`'.implode($primary_list,'`,`').'`'); + } + + if(count($unique_list)) { + foreach($unique_list as $key => $val) { + $column_schema[] = sprintf("unique %s (%s)", $key, '`'.implode($val,'`,`').'`'); + } + } + + if(count($index_list)) { + foreach($index_list as $key => $val) { + $column_schema[] = sprintf("index %s (%s)", $key, '`'.implode($val,'`,`').'`'); + } + } + + $schema = sprintf('create table `%s` (%s%s) %s;', $this->addQuotes($table_name), "\n", implode($column_schema,",\n"), "ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci"); + + $output = $this->_query($schema); + if(!$output) return false; + } + + /** + * @brief 조건문 작성하여 return + **/ + function getCondition($output) { + if(!$output->conditions) return; + $condition = $this->_getCondition($output->conditions,$output->column_type); + if($condition) $condition = ' where '.$condition; + return $condition; + } + + function getLeftCondition($conditions,$column_type){ + return $this->_getCondition($conditions,$column_type); + } + + + function _getCondition($conditions,$column_type) { + $condition = ''; + foreach($conditions as $val) { + $sub_condition = ''; + foreach($val['condition'] as $v) { + if(!isset($v['value'])) continue; + if($v['value'] === '') continue; + if(!in_array(gettype($v['value']), array('string', 'integer', 'double', 'array'))) continue; + + $name = $v['column']; + $operation = $v['operation']; + $value = $v['value']; + $type = $this->getColumnType($column_type,$name); + $pipe = $v['pipe']; + $value = $this->getConditionValue($name, $value, $operation, $type, $column_type); + if(!$value) $value = $v['value']; + $str = $this->getConditionPart($name, $value, $operation); + if($sub_condition) $sub_condition .= ' '.$pipe.' '; + $sub_condition .= $str; + } + if($sub_condition) { + if($condition && $val['pipe']) $condition .= ' '.$val['pipe'].' '; + $condition .= '('.$sub_condition.')'; + } + } + return $condition; + } + + /** + * @brief insertAct 처리 + **/ + function _executeInsertAct($output) { + // 테이블 정리 + foreach($output->tables as $key => $val) { + $table_list[] = '`'.$this->prefix.$val.'`'; + } + + // 컬럼 정리 + foreach($output->columns as $key => $val) { + $name = $val['name']; + $value = $val['value']; + + if($output->column_type[$name]!='number') { + + if(!is_null($value)){ + $value = "'" . $this->addQuotes($value) ."'"; + }else{ + if($val['notnull']=='notnull') { + $value = "''"; + } else { + //$value = 'null'; + $value = "''"; + } + } + + } elseif(!$value || is_numeric($value)) $value = (int)$value; + + $column_list[] = '`'.$name.'`'; + $value_list[] = $value; + } + + $query = sprintf("insert into %s (%s) values (%s);", implode(',',$table_list), implode(',',$column_list), implode(',', $value_list)); + return $this->_query($query); + } + + /** + * @brief updateAct 처리 + **/ + function _executeUpdateAct($output) { + // 테이블 정리 + foreach($output->tables as $key => $val) { + $table_list[] = '`'.$this->prefix.$val.'` as '.$key; + } + + // 컬럼 정리 + foreach($output->columns as $key => $val) { + if(!isset($val['value'])) continue; + $name = $val['name']; + $value = $val['value']; + if(strpos($name,'.')!==false&&strpos($value,'.')!==false) $column_list[] = $name.' = '.$value; + else { + if($output->column_type[$name]!='number') $value = "'".$this->addQuotes($value)."'"; + elseif(!$value || is_numeric($value)) $value = (int)$value; + + $column_list[] = sprintf("`%s` = %s", $name, $value); + } + } + + // 조건절 정리 + $condition = $this->getCondition($output); + + $query = sprintf("update %s set %s %s", implode(',',$table_list), implode(',',$column_list), $condition); + + return $this->_query($query); + } + + /** + * @brief deleteAct 처리 + **/ + function _executeDeleteAct($output) { + // 테이블 정리 + foreach($output->tables as $key => $val) { + $table_list[] = '`'.$this->prefix.$val.'`'; + } + + // 조건절 정리 + $condition = $this->getCondition($output); + + $query = sprintf("delete from %s %s", implode(',',$table_list), $condition); + + return $this->_query($query); + } + + /** + * @brief selectAct 처리 + * + * select의 경우 특정 페이지의 목록을 가져오는 것을 편하게 하기 위해\n + * navigation이라는 method를 제공 + **/ + function _executeSelectAct($output) { + // 테이블 정리 + $table_list = array(); + foreach($output->tables as $key => $val) { + $table_list[] = '`'.$this->prefix.$val.'` as '.$key; + } + + $left_join = array(); + // why??? + $left_tables= (array)$output->left_tables; + + foreach($left_tables as $key => $val) { + $condition = $this->_getCondition($output->left_conditions[$key],$output->column_type); + if($condition){ + $left_join[] = $val . ' `'.$this->prefix.$output->_tables[$key].'` as '.$key . ' on (' . $condition . ')'; + } + } + + $click_count = array(); + if(!$output->columns){ + $output->columns = array(array('name'=>'*')); + } + + $column_list = array(); + foreach($output->columns as $key => $val) + { + $name = $val['name']; + $alias = $val['alias']; + if($val['click_count']) $click_count[] = $val['name']; + + if(substr($name,-1) == '*') + { + $column_list[] = $name; + } + else if(strpos($name,'.')===false && strpos($name,'(')===false) + { + if($alias) + { + $col = sprintf('`%s` as `%s`', $name, $alias); + $column_list[$alias] = $col; + } + else + { + $column_list[] = sprintf('`%s`',$name); + } + } + else + { + if($alias) + { + $col = sprintf('%s as `%s`', $name, $alias); + $column_list[$alias] = $col; + } + else + { + $column_list[] = sprintf('%s',$name); + } + } + } + + $columns = implode(',',$column_list); + $output->column_list = $column_list; + $condition = $this->getCondition($output); + + if($output->list_count && $output->page) return $this->_getNavigationData($table_list, $columns, $left_join, $condition, $output); + + // list_order, update_order 로 정렬시에 인덱스 사용을 위해 condition에 쿼리 추가 + if($output->order) { + $conditions = $this->getConditionList($output); + if(!in_array('list_order', $conditions) && !in_array('update_order', $conditions)) { + foreach($output->order as $key => $val) { + $col = $val[0]; + if(!in_array($col, array('list_order','update_order'))) continue; + if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col); + else $condition = sprintf(' where %s < 2100000000 ', $col); + } + } + } + + + if(count($output->groups)) + { + $groupby_query = sprintf(' group by %s', implode(',',$output->groups)); + + if(count($output->arg_columns)) + { + foreach($output->groups as $group) + { + if($column_list[$group]) $output->arg_columns[] = $column_list[$group]; + } + } + } + + if($output->order) { + foreach($output->order as $key => $val) { + $index_list[] = sprintf('%s %s', $val[0], $val[1]); + if(count($output->arg_columns) && $column_list[$val[0]]) $output->arg_columns[] = $column_list[$val[0]]; + } + if(count($index_list)) $orderby_query .= ' order by '.implode(',',$index_list); + } + + if(count($output->arg_columns)) + { + $columns = array(); + foreach($output->arg_columns as $col){ + if(strpos($col,'`')===false && strpos($col,' ')==false) $columns[] = '`'.$col.'`'; + else $columns[] = $col; + } + + $columns = join(',',$columns); + } + + $query = sprintf("select %s from %s %s %s %s", $columns, implode(',',$table_list),implode(' ',$left_join), $condition, $groupby_query.$orderby_query); + + // list_count를 사용할 경우 적용 + if($output->list_count['value']) $query = sprintf('%s limit %d', $query, $output->list_count['value']); + + $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id):''; + + $result = $this->_query($query); + if($this->isError()) return; + if(count($click_count) && count($output->conditions)){ + $_query = ''; + foreach($click_count as $k => $c) $_query .= sprintf(',%s=%s+1 ',$c,$c); + $_query = sprintf('update %s set %s %s',implode(',',$table_list), substr($_query,1), $condition); + $this->_query($_query); + } + + $data = $this->_fetch($result); + + $buff = new Object(); + $buff->data = $data; + + return $buff; + } + + /** + * @brief query xml에 navigation 정보가 있을 경우 페이징 관련 작업을 처리한다 + * + * 그닥 좋지는 않은 구조이지만 편리하다.. -_-; + **/ + function _getNavigationData($table_list, $columns, $left_join, $condition, $output) { + require_once(_XE_PATH_.'classes/page/PageHandler.class.php'); + + $column_list = $output->column_list; + + // 전체 개수를 구함 + $count_condition = count($output->groups) ? sprintf('%s group by %s', $condition, implode(', ', $output->groups)) : $condition; + $count_query = sprintf("select count(*) as count from %s %s %s", implode(', ', $table_list), implode(' ', $left_join), $count_condition); + if (count($output->groups)) $count_query = sprintf('select count(*) as count from (%s) xet', $count_query); + + $count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id . ' count(*)'):''; + $result = $this->_query($count_query); + $count_output = $this->_fetch($result); + $total_count = (int)$count_output->count; + + $list_count = $output->list_count['value']; + if(!$list_count) $list_count = 20; + $page_count = $output->page_count['value']; + if(!$page_count) $page_count = 10; + $page = $output->page['value']; + if(!$page) $page = 1; + + // 전체 페이지를 구함 + if($total_count) $total_page = (int)( ($total_count-1) / $list_count) + 1; + else $total_page = 1; + + // 페이지 변수를 체크 + if($page > $total_page) $page = $total_page; + $start_count = ($page-1)*$list_count; + + // list_order, update_order 로 정렬시에 인덱스 사용을 위해 condition에 쿼리 추가 + if($output->order) { + $conditions = $this->getConditionList($output); + if(!in_array('list_order', $conditions) && !in_array('update_order', $conditions)) { + foreach($output->order as $key => $val) { + $col = $val[0]; + if(!in_array($col, array('list_order','update_order'))) continue; + if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col); + else $condition = sprintf(' where %s < 2100000000 ', $col); + } + } + } + + if(count($output->groups)){ + $groupby_query = sprintf(' group by %s', implode(',',$output->groups)); + + if(count($output->arg_columns)) + { + foreach($output->groups as $group) + { + if($column_list[$group]) $output->arg_columns[] = $column_list[$group]; + } + } + } + + if(count($output->order)) { + foreach($output->order as $key => $val) { + $index_list[] = sprintf('%s %s', $val[0], $val[1]); + if(count($output->arg_columns) && $column_list[$val[0]]) $output->arg_columns[] = $column_list[$val[0]]; + } + if(count($index_list)) $orderby_query = ' order by '.implode(',',$index_list); + } + + if(count($output->arg_columns)) + { + $columns = array(); + foreach($output->arg_columns as $col){ + if(strpos($col,'`')===false && strpos($col,' ')==false) $columns[] = '`'.$col.'`'; + else $columns[] = $col; + } + + $columns = join(',',$columns); + } + + $query = sprintf("select %s from %s %s %s %s", $columns, implode(',',$table_list), implode(' ',$left_join), $condition, $groupby_query.$orderby_query); + $query = sprintf('%s limit %d, %d', $query, $start_count, $list_count); + $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id):''; + + $result = $this->_query($query); + if($this->isError()) { + $buff = new Object(); + $buff->total_count = 0; + $buff->total_page = 0; + $buff->page = 1; + $buff->data = array(); + + $buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count); + return $buff; + } + + $virtual_no = $total_count - ($page-1)*$list_count; + $data = array(); + while($tmp = $this->db_fetch_object($result)) { + $data[$virtual_no--] = $tmp; + } + $buff = new Object(); + $buff->total_count = $total_count; + $buff->total_page = $total_page; + $buff->page = $page; + $buff->data = $data; + + $buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count); + return $buff; + } + + function db_insert_id() + { + return mysql_insert_id($this->fd); + } + + function db_fetch_object(&$result) + { + return mysql_fetch_object($result); + } + } + +return new DBMysql; +?> diff --git a/classes/db/DBMysql_innodb.class.php b/classes/db/DBMysql_innodb.class.php index 7ba8f304a..2ada937b0 100644 --- a/classes/db/DBMysql_innodb.class.php +++ b/classes/db/DBMysql_innodb.class.php @@ -1,164 +1,164 @@ -_setDBInfo(); - $this->_connect(); - } - - /** - * @brief create an instance of this class - */ - function create() - { - return new DBMysql_innodb; - } - - /** - * @brief DB접속 해제 - **/ - function close() { - if(!$this->isConnected()) return; - $this->_query("commit"); - @mysql_close($this->fd); - } - - /** - * @brief 트랜잭션 시작 - **/ - function begin() { - if(!$this->isConnected() || $this->transaction_started) return; - $this->transaction_started = true; - $this->_query("begin"); - } - - /** - * @brief 롤백 - **/ - function rollback() { - if(!$this->isConnected() || !$this->transaction_started) return; - $this->_query("rollback"); - $this->transaction_started = false; - } - - /** - * @brief 커밋 - **/ - function commit($force = false) { - if(!$force && (!$this->isConnected() || !$this->transaction_started)) return; - $this->_query("commit"); - $this->transaction_started = false; - } - - /** - * @brief : 쿼리문의 실행 및 결과의 fetch 처리 - * - * query : query문 실행하고 result return\n - * fetch : reutrn 된 값이 없으면 NULL\n - * rows이면 array object\n - * row이면 object\n - * return\n - **/ - function _query($query) { - if(!$this->isConnected()) return; - - // 쿼리 시작을 알림 - $this->actStart($query); - - // 쿼리 문 실행 - $result = @mysql_query($query, $this->fd); - - // 오류 체크 - if(mysql_error($this->fd)) $this->setError(mysql_errno($this->fd), mysql_error($this->fd)); - - // 쿼리 실행 종료를 알림 - $this->actFinish(); - - // 결과 리턴 - return $result; - } - - /** - * @brief schema xml을 이용하여 create table query생성 - * - * type : number, varchar, text, char, date, \n - * opt : notnull, default, size\n - * index : primary key, index, unique\n - **/ - function _createTable($xml_doc) { - // xml parsing - $oXml = new XmlParser(); - $xml_obj = $oXml->parse($xml_doc); - - // 테이블 생성 schema 작성 - $table_name = $xml_obj->table->attrs->name; - if($this->isTableExists($table_name)) return; - $table_name = $this->prefix.$table_name; - - if(!is_array($xml_obj->table->column)) $columns[] = $xml_obj->table->column; - else $columns = $xml_obj->table->column; - - foreach($columns as $column) { - $name = $column->attrs->name; - $type = $column->attrs->type; - $size = $column->attrs->size; - $notnull = $column->attrs->notnull; - $primary_key = $column->attrs->primary_key; - $index = $column->attrs->index; - $unique = $column->attrs->unique; - $default = $column->attrs->default; - $auto_increment = $column->attrs->auto_increment; - - $column_schema[] = sprintf('`%s` %s%s %s %s %s', - $name, - $this->column_type[$type], - $size?'('.$size.')':'', - isset($default)?"default '".$default."'":'', - $notnull?'not null':'', - $auto_increment?'auto_increment':'' - ); - - if($primary_key) $primary_list[] = $name; - else if($unique) $unique_list[$unique][] = $name; - else if($index) $index_list[$index][] = $name; - } - - if(count($primary_list)) { - $column_schema[] = sprintf("primary key (%s)", '`'.implode($primary_list,'`,`').'`'); - } - - if(count($unique_list)) { - foreach($unique_list as $key => $val) { - $column_schema[] = sprintf("unique %s (%s)", $key, '`'.implode($val,'`,`').'`'); - } - } - - if(count($index_list)) { - foreach($index_list as $key => $val) { - $column_schema[] = sprintf("index %s (%s)", $key, '`'.implode($val,'`,`').'`'); - } - } - - $schema = sprintf('create table `%s` (%s%s) %s;', $this->addQuotes($table_name), "\n", implode($column_schema,",\n"), "ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_general_ci"); - - $output = $this->_query($schema); - if(!$output) return false; - } - } - -return new DBMysql_innodb; -?> +_setDBInfo(); + $this->_connect(); + } + + /** + * @brief create an instance of this class + */ + function create() + { + return new DBMysql_innodb; + } + + /** + * @brief DB접속 해제 + **/ + function close() { + if(!$this->isConnected()) return; + $this->_query("commit"); + @mysql_close($this->fd); + } + + /** + * @brief 트랜잭션 시작 + **/ + function begin() { + if(!$this->isConnected() || $this->transaction_started) return; + $this->transaction_started = true; + $this->_query("begin"); + } + + /** + * @brief 롤백 + **/ + function rollback() { + if(!$this->isConnected() || !$this->transaction_started) return; + $this->_query("rollback"); + $this->transaction_started = false; + } + + /** + * @brief 커밋 + **/ + function commit($force = false) { + if(!$force && (!$this->isConnected() || !$this->transaction_started)) return; + $this->_query("commit"); + $this->transaction_started = false; + } + + /** + * @brief : 쿼리문의 실행 및 결과의 fetch 처리 + * + * query : query문 실행하고 result return\n + * fetch : reutrn 된 값이 없으면 NULL\n + * rows이면 array object\n + * row이면 object\n + * return\n + **/ + function _query($query) { + if(!$this->isConnected()) return; + + // 쿼리 시작을 알림 + $this->actStart($query); + + // 쿼리 문 실행 + $result = @mysql_query($query, $this->fd); + + // 오류 체크 + if(mysql_error($this->fd)) $this->setError(mysql_errno($this->fd), mysql_error($this->fd)); + + // 쿼리 실행 종료를 알림 + $this->actFinish(); + + // 결과 리턴 + return $result; + } + + /** + * @brief schema xml을 이용하여 create table query생성 + * + * type : number, varchar, text, char, date, \n + * opt : notnull, default, size\n + * index : primary key, index, unique\n + **/ + function _createTable($xml_doc) { + // xml parsing + $oXml = new XmlParser(); + $xml_obj = $oXml->parse($xml_doc); + + // 테이블 생성 schema 작성 + $table_name = $xml_obj->table->attrs->name; + if($this->isTableExists($table_name)) return; + $table_name = $this->prefix.$table_name; + + if(!is_array($xml_obj->table->column)) $columns[] = $xml_obj->table->column; + else $columns = $xml_obj->table->column; + + foreach($columns as $column) { + $name = $column->attrs->name; + $type = $column->attrs->type; + $size = $column->attrs->size; + $notnull = $column->attrs->notnull; + $primary_key = $column->attrs->primary_key; + $index = $column->attrs->index; + $unique = $column->attrs->unique; + $default = $column->attrs->default; + $auto_increment = $column->attrs->auto_increment; + + $column_schema[] = sprintf('`%s` %s%s %s %s %s', + $name, + $this->column_type[$type], + $size?'('.$size.')':'', + isset($default)?"default '".$default."'":'', + $notnull?'not null':'', + $auto_increment?'auto_increment':'' + ); + + if($primary_key) $primary_list[] = $name; + else if($unique) $unique_list[$unique][] = $name; + else if($index) $index_list[$index][] = $name; + } + + if(count($primary_list)) { + $column_schema[] = sprintf("primary key (%s)", '`'.implode($primary_list,'`,`').'`'); + } + + if(count($unique_list)) { + foreach($unique_list as $key => $val) { + $column_schema[] = sprintf("unique %s (%s)", $key, '`'.implode($val,'`,`').'`'); + } + } + + if(count($index_list)) { + foreach($index_list as $key => $val) { + $column_schema[] = sprintf("index %s (%s)", $key, '`'.implode($val,'`,`').'`'); + } + } + + $schema = sprintf('create table `%s` (%s%s) %s;', $this->addQuotes($table_name), "\n", implode($column_schema,",\n"), "ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_general_ci"); + + $output = $this->_query($schema); + if(!$output) return false; + } + } + +return new DBMysql_innodb; +?> diff --git a/classes/db/DBMysqli.class.php b/classes/db/DBMysqli.class.php index 4ccaf3c41..354571fd8 100644 --- a/classes/db/DBMysqli.class.php +++ b/classes/db/DBMysqli.class.php @@ -1,123 +1,123 @@ -_setDBInfo(); - $this->_connect(); - } - - /** - * @brief 설치 가능 여부를 return - **/ - function isSupported() { - if(!function_exists('mysqli_connect')) return false; - return true; - } - - /** - * @brief create an instance of this class - */ - function create() - { - return new DBMysqli; - } - - /** - * @brief DB 접속 - **/ - function _connect() { - // 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{ - $this->fd = @mysqli_connect($this->hostname, $this->userid, $this->password, $this->database); - } - $error = mysqli_connect_errno(); - if($error) { - $this->setError($error,mysqli_connect_error()); - return; - } - mysqli_set_charset($this->fd,'utf8'); - - // 접속체크 - $this->is_connected = true; - $this->password = md5($this->password); - } - - /** - * @brief DB접속 해제 - **/ - function close() { - if(!$this->isConnected()) return; - mysqli_close($this->fd); - } - - /** - * @brief 쿼리에서 입력되는 문자열 변수들의 quotation 조절 - **/ - function addQuotes($string) { - if(version_compare(PHP_VERSION, "5.9.0", "<") && get_magic_quotes_gpc()) $string = stripslashes(str_replace("\\","\\\\",$string)); - if(!is_numeric($string)) $string = mysqli_escape_string($this->fd,$string); - return $string; - } - - /** - * @brief : 쿼리문의 실행 및 결과의 fetch 처리 - * - * query : query문 실행하고 result return\n - * fetch : reutrn 된 값이 없으면 NULL\n - * rows이면 array object\n - * row이면 object\n - * return\n - **/ - function _query($query) { - if(!$this->isConnected()) return; - - // 쿼리 시작을 알림 - $this->actStart($query); - - // 쿼리 문 실행 - $result = mysqli_query($this->fd,$query); - // 오류 체크 - $error = mysqli_error($this->fd); - if($error){ - $this->setError(mysqli_errno($this->fd), $error); - } - - // 쿼리 실행 종료를 알림 - $this->actFinish(); - - // 결과 리턴 - return $result; - } - - function db_insert_id() - { - return mysqli_insert_id($this->fd); - } - - function db_fetch_object(&$result) - { - return mysqli_fetch_object($result); - } - } - -return new DBMysqli; -?> +_setDBInfo(); + $this->_connect(); + } + + /** + * @brief 설치 가능 여부를 return + **/ + function isSupported() { + if(!function_exists('mysqli_connect')) return false; + return true; + } + + /** + * @brief create an instance of this class + */ + function create() + { + return new DBMysqli; + } + + /** + * @brief DB 접속 + **/ + function _connect() { + // 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{ + $this->fd = @mysqli_connect($this->hostname, $this->userid, $this->password, $this->database); + } + $error = mysqli_connect_errno(); + if($error) { + $this->setError($error,mysqli_connect_error()); + return; + } + mysqli_set_charset($this->fd,'utf8'); + + // 접속체크 + $this->is_connected = true; + $this->password = md5($this->password); + } + + /** + * @brief DB접속 해제 + **/ + function close() { + if(!$this->isConnected()) return; + mysqli_close($this->fd); + } + + /** + * @brief 쿼리에서 입력되는 문자열 변수들의 quotation 조절 + **/ + function addQuotes($string) { + if(version_compare(PHP_VERSION, "5.9.0", "<") && get_magic_quotes_gpc()) $string = stripslashes(str_replace("\\","\\\\",$string)); + if(!is_numeric($string)) $string = mysqli_escape_string($this->fd,$string); + return $string; + } + + /** + * @brief : 쿼리문의 실행 및 결과의 fetch 처리 + * + * query : query문 실행하고 result return\n + * fetch : reutrn 된 값이 없으면 NULL\n + * rows이면 array object\n + * row이면 object\n + * return\n + **/ + function _query($query) { + if(!$this->isConnected()) return; + + // 쿼리 시작을 알림 + $this->actStart($query); + + // 쿼리 문 실행 + $result = mysqli_query($this->fd,$query); + // 오류 체크 + $error = mysqli_error($this->fd); + if($error){ + $this->setError(mysqli_errno($this->fd), $error); + } + + // 쿼리 실행 종료를 알림 + $this->actFinish(); + + // 결과 리턴 + return $result; + } + + function db_insert_id() + { + return mysqli_insert_id($this->fd); + } + + function db_fetch_object(&$result) + { + return mysqli_fetch_object($result); + } + } + +return new DBMysqli; +?> diff --git a/classes/db/DBSqlite2.class.php b/classes/db/DBSqlite2.class.php index 833628ad8..5d4c447b7 100644 --- a/classes/db/DBSqlite2.class.php +++ b/classes/db/DBSqlite2.class.php @@ -1,735 +1,735 @@ - 'INTEGER', - 'number' => 'INTEGER', - 'varchar' => 'VARHAR', - 'char' => 'CHAR', - 'text' => 'TEXT', - 'bigtext' => 'TEXT', - 'date' => 'VARCHAR(14)', - 'float' => 'FLOAT', - ); - - /** - * @brief constructor - **/ - function DBSqlite2() { - $this->_setDBInfo(); - $this->_connect(); - } - - /** - * @brief create an instance of this class - */ - function create() - { - return new DBSqlite2; - } - - /** - * @brief 설치 가능 여부를 return - **/ - function isSupported() { - if(!function_exists('sqlite_open')) return false; - return true; - } - - /** - * @brief DB정보 설정 및 connect/ close - **/ - function _setDBInfo() { - $db_info = Context::getDBInfo(); - $this->database = $db_info->db_database; - $this->prefix = $db_info->db_table_prefix; - if(!substr($this->prefix,-1)!='_') $this->prefix .= '_'; - } - - /** - * @brief DB 접속 - **/ - function _connect() { - // db 정보가 없으면 무시 - if(!$this->database) return; - - // 데이터 베이스 파일 접속 시도 - $this->fd = sqlite_open($this->database, 0666, $error); - if(!file_exists($this->database) || $error) { - $this->setError(-1,$error); - $this->is_connected = false; - return; - } - - // 접속체크 - $this->is_connected = true; - $this->password = md5($this->password); - } - - /** - * @brief DB접속 해제 - **/ - function close() { - if(!$this->isConnected()) return; - sqlite_close($this->fd); - } - - /** - * @brief 트랜잭션 시작 - **/ - function begin() { - if(!$this->is_connected || $this->transaction_started) return; - if($this->_query("BEGIN;")) $this->transaction_started = true; - } - - /** - * @brief 롤백 - **/ - function rollback() { - if(!$this->is_connected || !$this->transaction_started) return; - $this->_query("ROLLBACK;"); - $this->transaction_started = false; - } - - /** - * @brief 커밋 - **/ - function commit($force = false) { - if(!$force && (!$this->isConnected() || !$this->transaction_started)) return; - if(!$this->is_connected || !$this->transaction_started) return; - $this->_query("COMMIT;"); - $this->transaction_started = false; - } - - /** - * @brief 쿼리에서 입력되는 문자열 변수들의 quotation 조절 - **/ - function addQuotes($string) { - if(version_compare(PHP_VERSION, "5.9.0", "<") && get_magic_quotes_gpc()) $string = stripslashes(str_replace("\\","\\\\",$string)); - if(!is_numeric($string)) $string = str_replace("'","''", $string); - return $string; - } - - /** - * @brief : 쿼리문의 실행 및 결과의 fetch 처리 - * - * query : query문 실행하고 result return\n - * fetch : reutrn 된 값이 없으면 NULL\n - * rows이면 array object\n - * row이면 object\n - * return\n - **/ - function _query($query) { - if(!$this->isConnected()) return; - - // 쿼리 시작을 알림 - $this->actStart($query); - - // 쿼리 문 실행 - $result = @sqlite_query($query, $this->fd); - - // 오류 체크 - if(sqlite_last_error($this->fd)) $this->setError(sqlite_last_error($this->fd), sqlite_error_string(sqlite_last_error($this->fd))); - - // 쿼리 실행 알림 - $this->actFinish(); - - return $result; - } - - /** - * @brief 결과를 fetch - **/ - function _fetch($result) { - if($this->isError() || !$result) return; - - while($tmp = sqlite_fetch_array($result, SQLITE_ASSOC)) { - unset($obj); - foreach($tmp as $key => $val) { - $pos = strpos($key, '.'); - if($pos) $key = substr($key, $pos+1); - $obj->{$key} = $val; - } - $output[] = $obj; - } - - if(count($output)==1) return $output[0]; - return $output; - } - - /** - * @brief 1씩 증가되는 sequence값을 return - **/ - function getNextSequence() { - $query = sprintf("insert into %ssequence (seq) values ('')", $this->prefix); - $this->_query($query); - $sequence = sqlite_last_insert_rowid($this->fd); - if($sequence % 10000 == 0) { - $query = sprintf("delete from %ssequence where seq < %d", $this->prefix, $sequence); - $this->_query($query); - } - - return $sequence; - } - - /** - * @brief 테이블 기생성 여부 return - **/ - function isTableExists($target_name) { - $query = sprintf('pragma table_info(%s%s)', $this->prefix, $this->addQuotes($target_name)); - $result = $this->_query($query); - if(sqlite_num_rows($result)==0) return false; - return true; - } - - /** - * @brief 특정 테이블에 특정 column 추가 - **/ - function addColumn($table_name, $column_name, $type='number', $size='', $default = '', $notnull=false) { - $type = $this->column_type[$type]; - if(strtoupper($type)=='INTEGER') $size = ''; - - $query = sprintf("alter table %s%s add %s ", $this->prefix, $table_name, $column_name); - if($size) $query .= sprintf(" %s(%s) ", $type, $size); - else $query .= sprintf(" %s ", $type); - if($default) $query .= sprintf(" default '%s' ", $default); - if($notnull) $query .= " not null "; - - return $this->_query($query); - } - - /** - * @brief 특정 테이블에 특정 column 제거 - **/ - function dropColumn($table_name, $column_name) { - $query = sprintf("alter table %s%s drop column %s ", $this->prefix, $table_name, $column_name); - $this->_query($query); - } - - /** - * @brief 특정 테이블의 column의 정보를 return - **/ - function isColumnExists($table_name, $column_name) { - $query = sprintf("pragma table_info(%s%s)", $this->prefix, $table_name); - $result = $this->_query($query); - $output = $this->_fetch($result); - if($output) { - $column_name = strtolower($column_name); - foreach($output as $key => $val) { - $name = strtolower($val->name); - if($column_name == $name) return true; - } - } - return false; - } - - /** - * @brief 특정 테이블에 특정 인덱스 추가 - * $target_columns = array(col1, col2) - * $is_unique? unique : none - **/ - function addIndex($table_name, $index_name, $target_columns, $is_unique = false) { - if(!is_array($target_columns)) $target_columns = array($target_columns); - - $key_name = sprintf('%s%s_%s', $this->prefix, $table_name, $index_name); - $query = sprintf("pragma table_info(%s%s)", $this->prefix, $table_name); - - $query = sprintf('CREATE %s INDEX %s ON %s%s (%s)', $is_unique?'UNIQUE':'', $key_name, $this->prefix, $table_name, implode(',',$target_columns)); - return $this->_query($query); - } - - /** - * @brief 특정 테이블의 특정 인덱스 삭제 - **/ - function dropIndex($table_name, $index_name, $is_unique = false) { - $key_name = sprintf('%s%s_%s', $this->prefix, $table_name, $index_name); - $query = sprintf("DROP INDEX %s", $this->prefix, $table_name, $key_name); - $this->_query($query); - } - - /** - * @brief 특정 테이블의 index 정보를 return - **/ - function isIndexExists($table_name, $index_name) { - $key_name = sprintf('%s%s_%s', $this->prefix, $table_name, $index_name); - $query = sprintf("pragma index_info(%s)", $key_name); - $result = $this->_query($query); - $output = $this->_fetch($result); - if(!$output) return false; - return true; - } - - /** - * @brief xml 을 받아서 테이블을 생성 - **/ - function createTableByXml($xml_doc) { - return $this->_createTable($xml_doc); - } - - /** - * @brief xml 을 받아서 테이블을 생성 - **/ - function createTableByXmlFile($file_name) { - if(!file_exists($file_name)) return; - // xml 파일을 읽음 - $buff = FileHandler::readFile($file_name); - return $this->_createTable($buff); - } - - /** - * @brief schema xml을 이용하여 create table query생성 - * - * type : number, varchar, text, char, date, \n - * opt : notnull, default, size\n - * index : primary key, index, unique\n - **/ - function _createTable($xml_doc) { - // xml parsing - $oXml = new XmlParser(); - $xml_obj = $oXml->parse($xml_doc); - - // 테이블 생성 schema 작성 - $table_name = $xml_obj->table->attrs->name; - if($this->isTableExists($table_name)) return; - $table_name = $this->prefix.$table_name; - - if(!is_array($xml_obj->table->column)) $columns[] = $xml_obj->table->column; - else $columns = $xml_obj->table->column; - - foreach($columns as $column) { - $name = $column->attrs->name; - $type = $column->attrs->type; - if(strtoupper($this->column_type[$type])=='INTEGER') $size = ''; - else $size = $column->attrs->size; - $notnull = $column->attrs->notnull; - $primary_key = $column->attrs->primary_key; - $index = $column->attrs->index; - $unique = $column->attrs->unique; - $default = $column->attrs->default; - $auto_increment = $column->attrs->auto_increment; - - if($auto_increment) { - $column_schema[] = sprintf('%s %s %s', - $name, - $this->column_type[$type], - $auto_increment?'AUTOINCREMENT':'' - ); - } else { - $column_schema[] = sprintf('%s %s%s %s %s %s %s', - $name, - $this->column_type[$type], - $size?'('.$size.')':'', - $notnull?'NOT NULL':'', - $primary_key?'PRIMARY KEY':'', - isset($default)?"DEFAULT '".$default."'":'', - $auto_increment?'AUTOINCREMENT':'' - ); - } - - if($unique) $unique_list[$unique][] = $name; - else if($index) $index_list[$index][] = $name; - } - - $schema = sprintf('CREATE TABLE %s (%s%s) ;', $this->addQuotes($table_name)," ", implode($column_schema,", ")); - $this->_query($schema); - - if(count($unique_list)) { - foreach($unique_list as $key => $val) { - $query = sprintf('CREATE UNIQUE INDEX %s_%s ON %s (%s)', $this->addQuotes($table_name), $key, $this->addQuotes($table_name), implode(',',$val)); - $this->_query($query); - } - } - - if(count($index_list)) { - foreach($index_list as $key => $val) { - $query = sprintf('CREATE INDEX %s_%s ON %s (%s)', $this->addQuotes($table_name), $key, $this->addQuotes($table_name), implode(',',$val)); - $this->_query($query); - } - } - } - - /** - * @brief 조건문 작성하여 return - **/ - function getCondition($output) { - if(!$output->conditions) return; - $condition = $this->_getCondition($output->conditions,$output->column_type); - if($condition) $condition = ' where '.$condition; - return $condition; - } - - function getLeftCondition($conditions,$column_type){ - return $this->_getCondition($conditions,$column_type); - } - - - function _getCondition($conditions,$column_type) { - $condition = ''; - foreach($conditions as $val) { - $sub_condition = ''; - foreach($val['condition'] as $v) { - if(!isset($v['value'])) continue; - if($v['value'] === '') continue; - if(!in_array(gettype($v['value']), array('string', 'integer', 'double'))) continue; - - $name = $v['column']; - $operation = $v['operation']; - $value = $v['value']; - $type = $this->getColumnType($column_type,$name); - $pipe = $v['pipe']; - - $value = $this->getConditionValue($name, $value, $operation, $type, $column_type); - if(!$value) $value = $v['value']; - $str = $this->getConditionPart($name, $value, $operation); - if($sub_condition) $sub_condition .= ' '.$pipe.' '; - $sub_condition .= $str; - } - if($sub_condition) { - if($condition && $val['pipe']) $condition .= ' '.$val['pipe'].' '; - $condition .= '('.$sub_condition.')'; - } - } - return $condition; - } - - /** - * @brief insertAct 처리 - **/ - function _executeInsertAct($output) { - // 테이블 정리 - foreach($output->tables as $key => $val) { - $table_list[] = $this->prefix.$val; - } - - // 컬럼 정리 - foreach($output->columns as $key => $val) { - $name = $val['name']; - $value = $val['value']; - if($output->column_type[$name]!='number') { - $value = "'".$this->addQuotes($value)."'"; - if(!$value) $value = 'null'; - } elseif(!$value || is_numeric($value)) $value = (int)$value; - - $column_list[] = $name; - $value_list[] = $value; - } - - $query = sprintf("insert into %s (%s) values (%s);", implode(',',$table_list), implode(',',$column_list), implode(',', $value_list)); - return $this->_query($query); - } - - /** - * @brief updateAct 처리 - **/ - function _executeUpdateAct($output) { - $table_count = count(array_values($output->tables)); - - // 대상 테이블이 1개일 경우 - if($table_count == 1) { - // 테이블 정리 - list($target_table) = array_values($output->tables); - $target_table = $this->prefix.$target_table; - - // 컬럼 정리 - foreach($output->columns as $key => $val) { - if(!isset($val['value'])) continue; - $name = $val['name']; - $value = $val['value']; - if(strpos($name,'.')!==false&&strpos($value,'.')!==false) $column_list[] = $name.' = '.$value; - else { - if($output->column_type[$name]!='number') $value = "'".$this->addQuotes($value)."'"; - elseif(!$value || is_numeric($value)) $value = (int)$value; - - $column_list[] = sprintf("%s = %s", $name, $value); - } - } - - // 조건절 정리 - $condition = $this->getCondition($output); - - $query = sprintf("update %s set %s %s", $target_table, implode(',',$column_list), $condition); - - // 대상 테이블이 2개일 경우 (sqlite에서 update 테이블을 1개 이상 지정 못해서 이렇게 꽁수로... 다른 방법이 있으려나..) - } elseif($table_count == 2) { - // 테이블 정리 - foreach($output->tables as $key => $val) { - $table_list[$val] = $this->prefix.$key; - } - list($source_table, $target_table) = array_values($table_list); - - // 조건절 정리 - $condition = $this->getCondition($output); - foreach($table_list as $key => $val) { - $condition = eregi_replace($key.'\\.', $val.'.', $condition); - } - - // 컬럼 정리 - foreach($output->columns as $key => $val) { - if(!isset($val['value'])) continue; - $name = $val['name']; - $value = $val['value']; - list($s_prefix, $s_column) = explode('.',$name); - list($t_prefix, $t_column) = explode('.',$value); - - $s_table = $table_list[$s_prefix]; - $t_table = $table_list[$t_prefix]; - $column_list[] = sprintf(' %s = (select %s from %s %s) ', $s_column, $t_column, $t_table, $condition); - } - - $query = sprintf('update %s set %s where exists(select * from %s %s)', $source_table, implode(',', $column_list), $target_table, $condition); - } else { - return; - } - - return $this->_query($query); - } - - /** - * @brief deleteAct 처리 - **/ - function _executeDeleteAct($output) { - // 테이블 정리 - foreach($output->tables as $key => $val) { - $table_list[] = $this->prefix.$val; - } - - // 조건절 정리 - $condition = $this->getCondition($output); - - $query = sprintf("delete from %s %s", implode(',',$table_list), $condition); - - return $this->_query($query); - } - - /** - * @brief selectAct 처리 - * - * select의 경우 특정 페이지의 목록을 가져오는 것을 편하게 하기 위해\n - * navigation이라는 method를 제공 - **/ - function _executeSelectAct($output) { - // 테이블 정리 - $table_list = array(); - foreach($output->tables as $key => $val) { - $table_list[] = $this->prefix.$val.' as '.$key; - } - - $left_join = array(); - // why??? - $left_tables= (array)$output->left_tables; - - foreach($left_tables as $key => $val) { - $condition = $this->_getCondition($output->left_conditions[$key],$output->column_type); - if($condition){ - $left_join[] = $val . ' '.$this->prefix.$output->_tables[$key].' as '.$key . ' on ' . $condition . ''; - } - } - - if(!$output->columns) { - $columns = '*'; - } else { - $column_list = array(); - foreach($output->columns as $key => $val) { - $name = $val['name']; - $alias = $val['alias']; - if($val['click_count']) $click_count[] = $val['name']; - - if(substr($name,-1) == '*') { - $column_list[] = $name; - } elseif(strpos($name,'.')===false && strpos($name,'(')===false) { - if($alias) $column_list[] = sprintf('%s as %s', $name, $alias); - else $column_list[] = sprintf('%s',$name); - } else { - if($alias) $column_list[] = sprintf('%s as %s', $name, $alias); - else $column_list[] = sprintf('%s',$name); - } - } - $columns = implode(',',$column_list); - } - - $condition = $this->getCondition($output); - - $output->column_list = $column_list; - if($output->list_count && $output->page) return $this->_getNavigationData($table_list, $columns, $left_join, $condition, $output); - - // list_order, update_order 로 정렬시에 인덱스 사용을 위해 condition에 쿼리 추가 - if($output->order) { - $conditions = $this->getConditionList($output); - if(!in_array('list_order', $conditions) && !in_array('update_order', $conditions)) { - foreach($output->order as $key => $val) { - $col = $val[0]; - if(!in_array($col, array('list_order','update_order'))) continue; - if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col); - else $condition = sprintf(' where %s < 2100000000 ', $col); - } - } - } - - $query = sprintf("select %s from %s %s %s", $columns, implode(',',$table_list),implode(' ',$left_join), $condition); - - if(count($output->groups)) $query .= sprintf(' group by %s', implode(',',$output->groups)); - - if($output->order) { - foreach($output->order as $key => $val) { - $index_list[] = sprintf('%s %s', $val[0], $val[1]); - } - if(count($index_list)) $query .= ' order by '.implode(',',$index_list); - } - - // list_count를 사용할 경우 적용 - if($output->list_count['value']) $query = sprintf('%s limit %d', $query, $output->list_count['value']); - - $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id):''; - $result = $this->_query($query); - if($this->isError()) return; - - if(count($click_count)>0 && count($output->conditions)>0){ - $_query = ''; - foreach($click_count as $k => $c) $_query .= sprintf(',%s=%s+1 ',$c,$c); - $_query = sprintf('update %s set %s %s',implode(',',$table_list), substr($_query,1), $condition); - $this->_query($_query); - } - - $data = $this->_fetch($result); - - $buff = new Object(); - $buff->data = $data; - return $buff; - } - - /** - * @brief query xml에 navigation 정보가 있을 경우 페이징 관련 작업을 처리한다 - * - * 그닥 좋지는 않은 구조이지만 편리하다.. -_-; - **/ - function _getNavigationData($table_list, $columns, $left_join, $condition, $output) { - require_once(_XE_PATH_.'classes/page/PageHandler.class.php'); - - $column_list = $output->column_list; - /* - // group by 절이 포함된 SELECT 쿼리의 전체 갯수를 구하기 위한 수정 - // 정상적인 동작이 확인되면 주석으로 막아둔 부분으로 대체합니다. - // - $count_condition = count($output->groups) ? sprintf('%s group by %s', $condition, implode(', ', $output->groups)) : $condition; - $total_count = $this->getCountCache($output->tables, $count_condition); - if($total_count === false) { - $count_query = sprintf("select count(*) as count from %s %s %s", implode(', ', $table_list), implode(' ', $left_join), $count_condition); - if (count($output->groups)) - $count_query = sprintf('select count(*) as count from (%s) xet', $count_query); - $result = $this->_query($count_query); - $count_output = $this->_fetch($result); - $total_count = (int)$count_output->count; - $this->putCountCache($output->tables, $count_condition, $total_count); - } - */ - - // 전체 개수를 구함 - $count_query = sprintf("select count(*) as count from %s %s %s", implode(',',$table_list),implode(' ',$left_join), $condition); - $count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id . ' count(*)'):''; - $result = $this->_query($count_query); - $count_output = $this->_fetch($result); - $total_count = (int)$count_output->count; - - $list_count = $output->list_count['value']; - if(!$list_count) $list_count = 20; - $page_count = $output->page_count['value']; - if(!$page_count) $page_count = 10; - $page = $output->page['value']; - if(!$page) $page = 1; - - // 전체 페이지를 구함 - if($total_count) $total_page = (int)( ($total_count-1) / $list_count) + 1; - else $total_page = 1; - - // 페이지 변수를 체크 - if($page > $total_page) $page = $total_page; - $start_count = ($page-1)*$list_count; - - // list_order, update_order 로 정렬시에 인덱스 사용을 위해 condition에 쿼리 추가 - if($output->order) { - $conditions = $this->getConditionList($output); - if(!in_array('list_order', $conditions) && !in_array('update_order', $conditions)) { - foreach($output->order as $key => $val) { - $col = $val[0]; - if(!in_array($col, array('list_order','update_order'))) continue; - if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col); - else $condition = sprintf(' where %s < 2100000000 ', $col); - } - } - } - - $query = sprintf("select %s from %s %s %s", $columns, implode(',',$table_list), implode(' ',$left_join), $condition); - - - if(count($output->groups)) $query .= sprintf(' group by %s', implode(',',$output->groups)); - - if($output->order) { - foreach($output->order as $key => $val) { - $index_list[] = sprintf('%s %s', $val[0], $val[1]); - } - if(count($index_list)) $query .= ' order by '.implode(',',$index_list); - } - - $query = sprintf('%s limit %d, %d', $query, $start_count, $list_count); - $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id):''; - - $result = $this->_query($query); - if($this->isError()) { - $buff = new Object(); - $buff->total_count = 0; - $buff->total_page = 0; - $buff->page = 1; - $buff->data = array(); - - $buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count); - return $buff; - } - - if($result) { - $virtual_no = $total_count - ($page-1)*$list_count; - while($tmp = sqlite_fetch_array($result, SQLITE_ASSOC)) { - unset($obj); - foreach($tmp as $key => $val) { - $pos = strpos($key, '.'); - if($pos) $key = substr($key, $pos+1); - $obj->{$key} = $val; - } - $data[$virtual_no--] = $obj; - } - } - - $buff = new Object(); - $buff->total_count = $total_count; - $buff->total_page = $total_page; - $buff->page = $page; - $buff->data = $data; - - $buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count); - return $buff; - } - } - -return new DBSqlite2; -?> + 'INTEGER', + 'number' => 'INTEGER', + 'varchar' => 'VARHAR', + 'char' => 'CHAR', + 'text' => 'TEXT', + 'bigtext' => 'TEXT', + 'date' => 'VARCHAR(14)', + 'float' => 'FLOAT', + ); + + /** + * @brief constructor + **/ + function DBSqlite2() { + $this->_setDBInfo(); + $this->_connect(); + } + + /** + * @brief create an instance of this class + */ + function create() + { + return new DBSqlite2; + } + + /** + * @brief 설치 가능 여부를 return + **/ + function isSupported() { + if(!function_exists('sqlite_open')) return false; + return true; + } + + /** + * @brief DB정보 설정 및 connect/ close + **/ + function _setDBInfo() { + $db_info = Context::getDBInfo(); + $this->database = $db_info->db_database; + $this->prefix = $db_info->db_table_prefix; + if(!substr($this->prefix,-1)!='_') $this->prefix .= '_'; + } + + /** + * @brief DB 접속 + **/ + function _connect() { + // db 정보가 없으면 무시 + if(!$this->database) return; + + // 데이터 베이스 파일 접속 시도 + $this->fd = sqlite_open($this->database, 0666, $error); + if(!file_exists($this->database) || $error) { + $this->setError(-1,$error); + $this->is_connected = false; + return; + } + + // 접속체크 + $this->is_connected = true; + $this->password = md5($this->password); + } + + /** + * @brief DB접속 해제 + **/ + function close() { + if(!$this->isConnected()) return; + sqlite_close($this->fd); + } + + /** + * @brief 트랜잭션 시작 + **/ + function begin() { + if(!$this->is_connected || $this->transaction_started) return; + if($this->_query("BEGIN;")) $this->transaction_started = true; + } + + /** + * @brief 롤백 + **/ + function rollback() { + if(!$this->is_connected || !$this->transaction_started) return; + $this->_query("ROLLBACK;"); + $this->transaction_started = false; + } + + /** + * @brief 커밋 + **/ + function commit($force = false) { + if(!$force && (!$this->isConnected() || !$this->transaction_started)) return; + if(!$this->is_connected || !$this->transaction_started) return; + $this->_query("COMMIT;"); + $this->transaction_started = false; + } + + /** + * @brief 쿼리에서 입력되는 문자열 변수들의 quotation 조절 + **/ + function addQuotes($string) { + if(version_compare(PHP_VERSION, "5.9.0", "<") && get_magic_quotes_gpc()) $string = stripslashes(str_replace("\\","\\\\",$string)); + if(!is_numeric($string)) $string = str_replace("'","''", $string); + return $string; + } + + /** + * @brief : 쿼리문의 실행 및 결과의 fetch 처리 + * + * query : query문 실행하고 result return\n + * fetch : reutrn 된 값이 없으면 NULL\n + * rows이면 array object\n + * row이면 object\n + * return\n + **/ + function _query($query) { + if(!$this->isConnected()) return; + + // 쿼리 시작을 알림 + $this->actStart($query); + + // 쿼리 문 실행 + $result = @sqlite_query($query, $this->fd); + + // 오류 체크 + if(sqlite_last_error($this->fd)) $this->setError(sqlite_last_error($this->fd), sqlite_error_string(sqlite_last_error($this->fd))); + + // 쿼리 실행 알림 + $this->actFinish(); + + return $result; + } + + /** + * @brief 결과를 fetch + **/ + function _fetch($result) { + if($this->isError() || !$result) return; + + while($tmp = sqlite_fetch_array($result, SQLITE_ASSOC)) { + unset($obj); + foreach($tmp as $key => $val) { + $pos = strpos($key, '.'); + if($pos) $key = substr($key, $pos+1); + $obj->{$key} = $val; + } + $output[] = $obj; + } + + if(count($output)==1) return $output[0]; + return $output; + } + + /** + * @brief 1씩 증가되는 sequence값을 return + **/ + function getNextSequence() { + $query = sprintf("insert into %ssequence (seq) values ('')", $this->prefix); + $this->_query($query); + $sequence = sqlite_last_insert_rowid($this->fd); + if($sequence % 10000 == 0) { + $query = sprintf("delete from %ssequence where seq < %d", $this->prefix, $sequence); + $this->_query($query); + } + + return $sequence; + } + + /** + * @brief 테이블 기생성 여부 return + **/ + function isTableExists($target_name) { + $query = sprintf('pragma table_info(%s%s)', $this->prefix, $this->addQuotes($target_name)); + $result = $this->_query($query); + if(sqlite_num_rows($result)==0) return false; + return true; + } + + /** + * @brief 특정 테이블에 특정 column 추가 + **/ + function addColumn($table_name, $column_name, $type='number', $size='', $default = '', $notnull=false) { + $type = $this->column_type[$type]; + if(strtoupper($type)=='INTEGER') $size = ''; + + $query = sprintf("alter table %s%s add %s ", $this->prefix, $table_name, $column_name); + if($size) $query .= sprintf(" %s(%s) ", $type, $size); + else $query .= sprintf(" %s ", $type); + if($default) $query .= sprintf(" default '%s' ", $default); + if($notnull) $query .= " not null "; + + return $this->_query($query); + } + + /** + * @brief 특정 테이블에 특정 column 제거 + **/ + function dropColumn($table_name, $column_name) { + $query = sprintf("alter table %s%s drop column %s ", $this->prefix, $table_name, $column_name); + $this->_query($query); + } + + /** + * @brief 특정 테이블의 column의 정보를 return + **/ + function isColumnExists($table_name, $column_name) { + $query = sprintf("pragma table_info(%s%s)", $this->prefix, $table_name); + $result = $this->_query($query); + $output = $this->_fetch($result); + if($output) { + $column_name = strtolower($column_name); + foreach($output as $key => $val) { + $name = strtolower($val->name); + if($column_name == $name) return true; + } + } + return false; + } + + /** + * @brief 특정 테이블에 특정 인덱스 추가 + * $target_columns = array(col1, col2) + * $is_unique? unique : none + **/ + function addIndex($table_name, $index_name, $target_columns, $is_unique = false) { + if(!is_array($target_columns)) $target_columns = array($target_columns); + + $key_name = sprintf('%s%s_%s', $this->prefix, $table_name, $index_name); + $query = sprintf("pragma table_info(%s%s)", $this->prefix, $table_name); + + $query = sprintf('CREATE %s INDEX %s ON %s%s (%s)', $is_unique?'UNIQUE':'', $key_name, $this->prefix, $table_name, implode(',',$target_columns)); + return $this->_query($query); + } + + /** + * @brief 특정 테이블의 특정 인덱스 삭제 + **/ + function dropIndex($table_name, $index_name, $is_unique = false) { + $key_name = sprintf('%s%s_%s', $this->prefix, $table_name, $index_name); + $query = sprintf("DROP INDEX %s", $this->prefix, $table_name, $key_name); + $this->_query($query); + } + + /** + * @brief 특정 테이블의 index 정보를 return + **/ + function isIndexExists($table_name, $index_name) { + $key_name = sprintf('%s%s_%s', $this->prefix, $table_name, $index_name); + $query = sprintf("pragma index_info(%s)", $key_name); + $result = $this->_query($query); + $output = $this->_fetch($result); + if(!$output) return false; + return true; + } + + /** + * @brief xml 을 받아서 테이블을 생성 + **/ + function createTableByXml($xml_doc) { + return $this->_createTable($xml_doc); + } + + /** + * @brief xml 을 받아서 테이블을 생성 + **/ + function createTableByXmlFile($file_name) { + if(!file_exists($file_name)) return; + // xml 파일을 읽음 + $buff = FileHandler::readFile($file_name); + return $this->_createTable($buff); + } + + /** + * @brief schema xml을 이용하여 create table query생성 + * + * type : number, varchar, text, char, date, \n + * opt : notnull, default, size\n + * index : primary key, index, unique\n + **/ + function _createTable($xml_doc) { + // xml parsing + $oXml = new XmlParser(); + $xml_obj = $oXml->parse($xml_doc); + + // 테이블 생성 schema 작성 + $table_name = $xml_obj->table->attrs->name; + if($this->isTableExists($table_name)) return; + $table_name = $this->prefix.$table_name; + + if(!is_array($xml_obj->table->column)) $columns[] = $xml_obj->table->column; + else $columns = $xml_obj->table->column; + + foreach($columns as $column) { + $name = $column->attrs->name; + $type = $column->attrs->type; + if(strtoupper($this->column_type[$type])=='INTEGER') $size = ''; + else $size = $column->attrs->size; + $notnull = $column->attrs->notnull; + $primary_key = $column->attrs->primary_key; + $index = $column->attrs->index; + $unique = $column->attrs->unique; + $default = $column->attrs->default; + $auto_increment = $column->attrs->auto_increment; + + if($auto_increment) { + $column_schema[] = sprintf('%s %s %s', + $name, + $this->column_type[$type], + $auto_increment?'AUTOINCREMENT':'' + ); + } else { + $column_schema[] = sprintf('%s %s%s %s %s %s %s', + $name, + $this->column_type[$type], + $size?'('.$size.')':'', + $notnull?'NOT NULL':'', + $primary_key?'PRIMARY KEY':'', + isset($default)?"DEFAULT '".$default."'":'', + $auto_increment?'AUTOINCREMENT':'' + ); + } + + if($unique) $unique_list[$unique][] = $name; + else if($index) $index_list[$index][] = $name; + } + + $schema = sprintf('CREATE TABLE %s (%s%s) ;', $this->addQuotes($table_name)," ", implode($column_schema,", ")); + $this->_query($schema); + + if(count($unique_list)) { + foreach($unique_list as $key => $val) { + $query = sprintf('CREATE UNIQUE INDEX %s_%s ON %s (%s)', $this->addQuotes($table_name), $key, $this->addQuotes($table_name), implode(',',$val)); + $this->_query($query); + } + } + + if(count($index_list)) { + foreach($index_list as $key => $val) { + $query = sprintf('CREATE INDEX %s_%s ON %s (%s)', $this->addQuotes($table_name), $key, $this->addQuotes($table_name), implode(',',$val)); + $this->_query($query); + } + } + } + + /** + * @brief 조건문 작성하여 return + **/ + function getCondition($output) { + if(!$output->conditions) return; + $condition = $this->_getCondition($output->conditions,$output->column_type); + if($condition) $condition = ' where '.$condition; + return $condition; + } + + function getLeftCondition($conditions,$column_type){ + return $this->_getCondition($conditions,$column_type); + } + + + function _getCondition($conditions,$column_type) { + $condition = ''; + foreach($conditions as $val) { + $sub_condition = ''; + foreach($val['condition'] as $v) { + if(!isset($v['value'])) continue; + if($v['value'] === '') continue; + if(!in_array(gettype($v['value']), array('string', 'integer', 'double'))) continue; + + $name = $v['column']; + $operation = $v['operation']; + $value = $v['value']; + $type = $this->getColumnType($column_type,$name); + $pipe = $v['pipe']; + + $value = $this->getConditionValue($name, $value, $operation, $type, $column_type); + if(!$value) $value = $v['value']; + $str = $this->getConditionPart($name, $value, $operation); + if($sub_condition) $sub_condition .= ' '.$pipe.' '; + $sub_condition .= $str; + } + if($sub_condition) { + if($condition && $val['pipe']) $condition .= ' '.$val['pipe'].' '; + $condition .= '('.$sub_condition.')'; + } + } + return $condition; + } + + /** + * @brief insertAct 처리 + **/ + function _executeInsertAct($output) { + // 테이블 정리 + foreach($output->tables as $key => $val) { + $table_list[] = $this->prefix.$val; + } + + // 컬럼 정리 + foreach($output->columns as $key => $val) { + $name = $val['name']; + $value = $val['value']; + if($output->column_type[$name]!='number') { + $value = "'".$this->addQuotes($value)."'"; + if(!$value) $value = 'null'; + } elseif(!$value || is_numeric($value)) $value = (int)$value; + + $column_list[] = $name; + $value_list[] = $value; + } + + $query = sprintf("insert into %s (%s) values (%s);", implode(',',$table_list), implode(',',$column_list), implode(',', $value_list)); + return $this->_query($query); + } + + /** + * @brief updateAct 처리 + **/ + function _executeUpdateAct($output) { + $table_count = count(array_values($output->tables)); + + // 대상 테이블이 1개일 경우 + if($table_count == 1) { + // 테이블 정리 + list($target_table) = array_values($output->tables); + $target_table = $this->prefix.$target_table; + + // 컬럼 정리 + foreach($output->columns as $key => $val) { + if(!isset($val['value'])) continue; + $name = $val['name']; + $value = $val['value']; + if(strpos($name,'.')!==false&&strpos($value,'.')!==false) $column_list[] = $name.' = '.$value; + else { + if($output->column_type[$name]!='number') $value = "'".$this->addQuotes($value)."'"; + elseif(!$value || is_numeric($value)) $value = (int)$value; + + $column_list[] = sprintf("%s = %s", $name, $value); + } + } + + // 조건절 정리 + $condition = $this->getCondition($output); + + $query = sprintf("update %s set %s %s", $target_table, implode(',',$column_list), $condition); + + // 대상 테이블이 2개일 경우 (sqlite에서 update 테이블을 1개 이상 지정 못해서 이렇게 꽁수로... 다른 방법이 있으려나..) + } elseif($table_count == 2) { + // 테이블 정리 + foreach($output->tables as $key => $val) { + $table_list[$val] = $this->prefix.$key; + } + list($source_table, $target_table) = array_values($table_list); + + // 조건절 정리 + $condition = $this->getCondition($output); + foreach($table_list as $key => $val) { + $condition = eregi_replace($key.'\\.', $val.'.', $condition); + } + + // 컬럼 정리 + foreach($output->columns as $key => $val) { + if(!isset($val['value'])) continue; + $name = $val['name']; + $value = $val['value']; + list($s_prefix, $s_column) = explode('.',$name); + list($t_prefix, $t_column) = explode('.',$value); + + $s_table = $table_list[$s_prefix]; + $t_table = $table_list[$t_prefix]; + $column_list[] = sprintf(' %s = (select %s from %s %s) ', $s_column, $t_column, $t_table, $condition); + } + + $query = sprintf('update %s set %s where exists(select * from %s %s)', $source_table, implode(',', $column_list), $target_table, $condition); + } else { + return; + } + + return $this->_query($query); + } + + /** + * @brief deleteAct 처리 + **/ + function _executeDeleteAct($output) { + // 테이블 정리 + foreach($output->tables as $key => $val) { + $table_list[] = $this->prefix.$val; + } + + // 조건절 정리 + $condition = $this->getCondition($output); + + $query = sprintf("delete from %s %s", implode(',',$table_list), $condition); + + return $this->_query($query); + } + + /** + * @brief selectAct 처리 + * + * select의 경우 특정 페이지의 목록을 가져오는 것을 편하게 하기 위해\n + * navigation이라는 method를 제공 + **/ + function _executeSelectAct($output) { + // 테이블 정리 + $table_list = array(); + foreach($output->tables as $key => $val) { + $table_list[] = $this->prefix.$val.' as '.$key; + } + + $left_join = array(); + // why??? + $left_tables= (array)$output->left_tables; + + foreach($left_tables as $key => $val) { + $condition = $this->_getCondition($output->left_conditions[$key],$output->column_type); + if($condition){ + $left_join[] = $val . ' '.$this->prefix.$output->_tables[$key].' as '.$key . ' on ' . $condition . ''; + } + } + + if(!$output->columns) { + $columns = '*'; + } else { + $column_list = array(); + foreach($output->columns as $key => $val) { + $name = $val['name']; + $alias = $val['alias']; + if($val['click_count']) $click_count[] = $val['name']; + + if(substr($name,-1) == '*') { + $column_list[] = $name; + } elseif(strpos($name,'.')===false && strpos($name,'(')===false) { + if($alias) $column_list[] = sprintf('%s as %s', $name, $alias); + else $column_list[] = sprintf('%s',$name); + } else { + if($alias) $column_list[] = sprintf('%s as %s', $name, $alias); + else $column_list[] = sprintf('%s',$name); + } + } + $columns = implode(',',$column_list); + } + + $condition = $this->getCondition($output); + + $output->column_list = $column_list; + if($output->list_count && $output->page) return $this->_getNavigationData($table_list, $columns, $left_join, $condition, $output); + + // list_order, update_order 로 정렬시에 인덱스 사용을 위해 condition에 쿼리 추가 + if($output->order) { + $conditions = $this->getConditionList($output); + if(!in_array('list_order', $conditions) && !in_array('update_order', $conditions)) { + foreach($output->order as $key => $val) { + $col = $val[0]; + if(!in_array($col, array('list_order','update_order'))) continue; + if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col); + else $condition = sprintf(' where %s < 2100000000 ', $col); + } + } + } + + $query = sprintf("select %s from %s %s %s", $columns, implode(',',$table_list),implode(' ',$left_join), $condition); + + if(count($output->groups)) $query .= sprintf(' group by %s', implode(',',$output->groups)); + + if($output->order) { + foreach($output->order as $key => $val) { + $index_list[] = sprintf('%s %s', $val[0], $val[1]); + } + if(count($index_list)) $query .= ' order by '.implode(',',$index_list); + } + + // list_count를 사용할 경우 적용 + if($output->list_count['value']) $query = sprintf('%s limit %d', $query, $output->list_count['value']); + + $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id):''; + $result = $this->_query($query); + if($this->isError()) return; + + if(count($click_count)>0 && count($output->conditions)>0){ + $_query = ''; + foreach($click_count as $k => $c) $_query .= sprintf(',%s=%s+1 ',$c,$c); + $_query = sprintf('update %s set %s %s',implode(',',$table_list), substr($_query,1), $condition); + $this->_query($_query); + } + + $data = $this->_fetch($result); + + $buff = new Object(); + $buff->data = $data; + return $buff; + } + + /** + * @brief query xml에 navigation 정보가 있을 경우 페이징 관련 작업을 처리한다 + * + * 그닥 좋지는 않은 구조이지만 편리하다.. -_-; + **/ + function _getNavigationData($table_list, $columns, $left_join, $condition, $output) { + require_once(_XE_PATH_.'classes/page/PageHandler.class.php'); + + $column_list = $output->column_list; + /* + // group by 절이 포함된 SELECT 쿼리의 전체 갯수를 구하기 위한 수정 + // 정상적인 동작이 확인되면 주석으로 막아둔 부분으로 대체합니다. + // + $count_condition = count($output->groups) ? sprintf('%s group by %s', $condition, implode(', ', $output->groups)) : $condition; + $total_count = $this->getCountCache($output->tables, $count_condition); + if($total_count === false) { + $count_query = sprintf("select count(*) as count from %s %s %s", implode(', ', $table_list), implode(' ', $left_join), $count_condition); + if (count($output->groups)) + $count_query = sprintf('select count(*) as count from (%s) xet', $count_query); + $result = $this->_query($count_query); + $count_output = $this->_fetch($result); + $total_count = (int)$count_output->count; + $this->putCountCache($output->tables, $count_condition, $total_count); + } + */ + + // 전체 개수를 구함 + $count_query = sprintf("select count(*) as count from %s %s %s", implode(',',$table_list),implode(' ',$left_join), $condition); + $count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id . ' count(*)'):''; + $result = $this->_query($count_query); + $count_output = $this->_fetch($result); + $total_count = (int)$count_output->count; + + $list_count = $output->list_count['value']; + if(!$list_count) $list_count = 20; + $page_count = $output->page_count['value']; + if(!$page_count) $page_count = 10; + $page = $output->page['value']; + if(!$page) $page = 1; + + // 전체 페이지를 구함 + if($total_count) $total_page = (int)( ($total_count-1) / $list_count) + 1; + else $total_page = 1; + + // 페이지 변수를 체크 + if($page > $total_page) $page = $total_page; + $start_count = ($page-1)*$list_count; + + // list_order, update_order 로 정렬시에 인덱스 사용을 위해 condition에 쿼리 추가 + if($output->order) { + $conditions = $this->getConditionList($output); + if(!in_array('list_order', $conditions) && !in_array('update_order', $conditions)) { + foreach($output->order as $key => $val) { + $col = $val[0]; + if(!in_array($col, array('list_order','update_order'))) continue; + if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col); + else $condition = sprintf(' where %s < 2100000000 ', $col); + } + } + } + + $query = sprintf("select %s from %s %s %s", $columns, implode(',',$table_list), implode(' ',$left_join), $condition); + + + if(count($output->groups)) $query .= sprintf(' group by %s', implode(',',$output->groups)); + + if($output->order) { + foreach($output->order as $key => $val) { + $index_list[] = sprintf('%s %s', $val[0], $val[1]); + } + if(count($index_list)) $query .= ' order by '.implode(',',$index_list); + } + + $query = sprintf('%s limit %d, %d', $query, $start_count, $list_count); + $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id):''; + + $result = $this->_query($query); + if($this->isError()) { + $buff = new Object(); + $buff->total_count = 0; + $buff->total_page = 0; + $buff->page = 1; + $buff->data = array(); + + $buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count); + return $buff; + } + + if($result) { + $virtual_no = $total_count - ($page-1)*$list_count; + while($tmp = sqlite_fetch_array($result, SQLITE_ASSOC)) { + unset($obj); + foreach($tmp as $key => $val) { + $pos = strpos($key, '.'); + if($pos) $key = substr($key, $pos+1); + $obj->{$key} = $val; + } + $data[$virtual_no--] = $obj; + } + } + + $buff = new Object(); + $buff->total_count = $total_count; + $buff->total_page = $total_page; + $buff->page = $page; + $buff->data = $data; + + $buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count); + return $buff; + } + } + +return new DBSqlite2; +?> diff --git a/classes/db/DBSqlite3_pdo.class.php b/classes/db/DBSqlite3_pdo.class.php index 83ebfcddc..e1ed6168a 100644 --- a/classes/db/DBSqlite3_pdo.class.php +++ b/classes/db/DBSqlite3_pdo.class.php @@ -1,819 +1,819 @@ - 'INTEGER', - 'number' => 'INTEGER', - 'varchar' => 'VARHAR', - 'char' => 'CHAR', - 'text' => 'TEXT', - 'bigtext' => 'TEXT', - 'date' => 'VARCHAR(14)', - 'float' => 'REAL', - ); - - /** - * @brief constructor - **/ - function DBSqlite3_pdo() { - $this->_setDBInfo(); - $this->_connect(); - } - - /** - * @brief create an instance of this class - */ - function create() - { - return new DBSqlite3_pdo; - } - - /** - * @brief 설치 가능 여부를 return - **/ - function isSupported() { - return class_exists('PDO'); - } - - /** - * @brief DB정보 설정 및 connect/ close - **/ - function _setDBInfo() { - $db_info = Context::getDBInfo(); - $this->database = $db_info->db_database; - $this->prefix = $db_info->db_table_prefix; - if(!substr($this->prefix,-1)!='_') $this->prefix .= '_'; - } - - /** - * @brief DB 접속 - **/ - function _connect() { - // db 정보가 없으면 무시 - if(!$this->database) return; - - // 데이터 베이스 파일 접속 시도 - try { - // PDO is only supported with PHP5, - // so it is allowed to use try~catch statment in this class. - $this->handler = new PDO('sqlite:'.$this->database); - } catch (PDOException $e) { - $this->setError(-1, 'Connection failed: '.$e->getMessage()); - $this->is_connected = false; - return; - } - - // 접속체크 - $this->is_connected = true; - $this->password = md5($this->password); - } - - /** - * @brief DB접속 해제 - **/ - function close() { - if(!$this->is_connected) return; - $this->commit(); - } - - /** - * @brief 트랜잭션 시작 - **/ - function begin() { - if(!$this->is_connected || $this->transaction_started) return; - if($this->handler->beginTransaction()) $this->transaction_started = true; - } - - /** - * @brief 롤백 - **/ - function rollback() { - if(!$this->is_connected || !$this->transaction_started) return; - $this->handler->rollBack(); - $this->transaction_started = false; - } - - /** - * @brief 커밋 - **/ - function commit($force = false) { - if(!$force && (!$this->is_connected || !$this->transaction_started)) return; - $this->handler->commit(); - $this->transaction_started = false; - } - - /** - * @brief 쿼리에서 입력되는 문자열 변수들의 quotation 조절 - **/ - function addQuotes($string) { - if(version_compare(PHP_VERSION, "5.9.0", "<") && get_magic_quotes_gpc()) $string = stripslashes(str_replace("\\","\\\\",$string)); - if(!is_numeric($string)) $string = str_replace("'","''",$string); - return $string; - } - - /** - * @brief : 쿼리문의 prepare - **/ - function _prepare($query) { - if(!$this->is_connected) return; - - // 쿼리 시작을 알림 - $this->actStart($query); - - $this->stmt = $this->handler->prepare($query); - - if($this->handler->errorCode() != '00000') { - $this->setError($this->handler->errorCode(), print_r($this->handler->errorInfo(),true)); - $this->actFinish(); - } - $this->bind_idx = 0; - $this->bind_vars = array(); - } - - /** - * @brief : stmt에 binding params - **/ - function _bind($val) { - if(!$this->is_connected || !$this->stmt) return; - - $this->bind_idx ++; - $this->bind_vars[] = $val; - $this->stmt->bindParam($this->bind_idx, $val); - } - - /** - * @brief : prepare된 쿼리의 execute - **/ - function _execute() { - if(!$this->is_connected || !$this->stmt) return; - - $this->stmt->execute(); - - if($this->stmt->errorCode() === '00000') { - $output = null; - while($tmp = $this->stmt->fetch(PDO::FETCH_ASSOC)) { - unset($obj); - foreach($tmp as $key => $val) { - $pos = strpos($key, '.'); - if($pos) $key = substr($key, $pos+1); - $obj->{$key} = str_replace("''","'",$val); - } - $output[] = $obj; - } - } else { - $this->setError($this->stmt->errorCode(),print_r($this->stmt->errorInfo(),true)); - } - - $this->stmt = null; - $this->actFinish(); - - if(is_array($output) && count($output)==1) return $output[0]; - return $output; - } - - /** - * @brief 1씩 증가되는 sequence값을 return - **/ - function getNextSequence() { - $query = sprintf("insert into %ssequence (seq) values (NULL)", $this->prefix); - $this->_prepare($query); - $result = $this->_execute(); - $sequence = $this->handler->lastInsertId(); - if($sequence % 10000 == 0) { - $query = sprintf("delete from %ssequence where seq < %d", $this->prefix, $sequence); - $this->_prepare($query); - $result = $this->_execute(); - } - - return $sequence; - } - - /** - * @brief 테이블 기생성 여부 return - **/ - function isTableExists($target_name) { - $query = sprintf('pragma table_info(%s%s)', $this->prefix, $target_name); - $this->_prepare($query); - if(!$this->_execute()) return false; - return true; - } - - /** - * @brief 특정 테이블에 특정 column 추가 - **/ - function addColumn($table_name, $column_name, $type='number', $size='', $default = '', $notnull=false) { - $type = $this->column_type[$type]; - if(strtoupper($type)=='INTEGER') $size = ''; - - $query = sprintf("alter table %s%s add %s ", $this->prefix, $table_name, $column_name); - if($size) $query .= sprintf(" %s(%s) ", $type, $size); - else $query .= sprintf(" %s ", $type); - if($default) $query .= sprintf(" default '%s' ", $default); - if($notnull) $query .= " not null "; - - $this->_prepare($query); - return $this->_execute(); - } - - /** - * @brief 특정 테이블에 특정 column 제거 - **/ - function dropColumn($table_name, $column_name) { - $query = sprintf("alter table %s%s drop column %s ", $this->prefix, $table_name, $column_name); - $this->_query($query); - } - - /** - * @brief 특정 테이블의 column의 정보를 return - **/ - function isColumnExists($table_name, $column_name) { - $query = sprintf("pragma table_info(%s%s)", $this->prefix, $table_name); - $this->_prepare($query); - $output = $this->_execute(); - - if($output) { - $column_name = strtolower($column_name); - foreach($output as $key => $val) { - $name = strtolower($val->name); - if($column_name == $name) return true; - } - } - return false; - } - - /** - * @brief 특정 테이블에 특정 인덱스 추가 - * $target_columns = array(col1, col2) - * $is_unique? unique : none - **/ - function addIndex($table_name, $index_name, $target_columns, $is_unique = false) { - if(!is_array($target_columns)) $target_columns = array($target_columns); - - $key_name = sprintf('%s%s_%s', $this->prefix, $table_name, $index_name); - - $query = sprintf('CREATE %s INDEX %s ON %s%s (%s)', $is_unique?'UNIQUE':'', $key_name, $this->prefix, $table_name, implode(',',$target_columns)); - $this->_prepare($query); - $this->_execute(); - } - - /** - * @brief 특정 테이블의 특정 인덱스 삭제 - **/ - function dropIndex($table_name, $index_name, $is_unique = false) { - $key_name = sprintf('%s%s_%s', $this->prefix, $table_name, $index_name); - $query = sprintf("DROP INDEX %s", $this->prefix, $table_name, $key_name); - $this->_query($query); - } - - /** - * @brief 특정 테이블의 index 정보를 return - **/ - function isIndexExists($table_name, $index_name) { - $key_name = sprintf('%s%s_%s', $this->prefix, $table_name, $index_name); - - $query = sprintf("pragma index_info(%s)", $key_name); - $this->_prepare($query); - $output = $this->_execute(); - if(!$output) return false; - return true; - } - - /** - * @brief xml 을 받아서 테이블을 생성 - **/ - function createTableByXml($xml_doc) { - return $this->_createTable($xml_doc); - } - - /** - * @brief xml 을 받아서 테이블을 생성 - **/ - function createTableByXmlFile($file_name) { - if(!file_exists($file_name)) return; - // xml 파일을 읽음 - $buff = FileHandler::readFile($file_name); - return $this->_createTable($buff); - } - - /** - * @brief schema xml을 이용하여 create table query생성 - * - * type : number, varchar, text, char, date, \n - * opt : notnull, default, size\n - * index : primary key, index, unique\n - **/ - function _createTable($xml_doc) { - // xml parsing - $oXml = new XmlParser(); - $xml_obj = $oXml->parse($xml_doc); - - // 테이블 생성 schema 작성 - $table_name = $xml_obj->table->attrs->name; - if($this->isTableExists($table_name)) return; - $table_name = $this->prefix.$table_name; - - if(!is_array($xml_obj->table->column)) $columns[] = $xml_obj->table->column; - else $columns = $xml_obj->table->column; - - foreach($columns as $column) { - $name = $column->attrs->name; - $type = $column->attrs->type; - if(strtoupper($this->column_type[$type])=='INTEGER') $size = ''; - else $size = $column->attrs->size; - $notnull = $column->attrs->notnull; - $primary_key = $column->attrs->primary_key; - $index = $column->attrs->index; - $unique = $column->attrs->unique; - $default = $column->attrs->default; - $auto_increment = $column->attrs->auto_increment; - - if($auto_increment) { - $column_schema[] = sprintf('%s %s PRIMARY KEY %s', - $name, - $this->column_type[$type], - $auto_increment?'AUTOINCREMENT':'' - ); - } else { - $column_schema[] = sprintf('%s %s%s %s %s %s', - $name, - $this->column_type[$type], - $size?'('.$size.')':'', - $notnull?'NOT NULL':'', - $primary_key?'PRIMARY KEY':'', - isset($default)?"DEFAULT '".$default."'":'' - ); - } - - if($unique) $unique_list[$unique][] = $name; - else if($index) $index_list[$index][] = $name; - } - - $schema = sprintf('CREATE TABLE %s (%s%s) ;', $table_name," ", implode($column_schema,", ")); - $this->_prepare($schema); - $this->_execute(); - if($this->isError()) return; - - if(count($unique_list)) { - foreach($unique_list as $key => $val) { - $query = sprintf('CREATE UNIQUE INDEX %s_%s ON %s (%s)', $this->addQuotes($table_name), $key, $this->addQuotes($table_name), implode(',',$val)); - $this->_prepare($query); - $this->_execute(); - if($this->isError()) $this->rollback(); - } - } - - if(count($index_list)) { - foreach($index_list as $key => $val) { - $query = sprintf('CREATE INDEX %s_%s ON %s (%s)', $this->addQuotes($table_name), $key, $this->addQuotes($table_name), implode(',',$val)); - $this->_prepare($query); - $this->_execute(); - if($this->isError()) $this->rollback(); - } - } - } - - /** - * @brief 조건문 작성하여 return - **/ - function getCondition($output) { - if(!$output->conditions) return; - $condition = $this->_getCondition($output->conditions,$output->column_type); - if($condition) $condition = ' where '.$condition; - return $condition; - } - - function getLeftCondition($conditions,$column_type){ - return $this->_getCondition($conditions,$column_type); - } - - - function _getCondition($conditions,$column_type) { - $condition = ''; - foreach($conditions as $val) { - $sub_condition = ''; - foreach($val['condition'] as $v) { - if(!isset($v['value'])) continue; - if($v['value'] === '') continue; - if(!in_array(gettype($v['value']), array('string', 'integer', 'double', 'array'))) continue; - - $name = $v['column']; - $operation = $v['operation']; - $value = $v['value']; - $type = $this->getColumnType($column_type,$name); - $pipe = $v['pipe']; - - $value = $this->getConditionValue($name, $value, $operation, $type, $column_type); - if(!$value) $value = $v['value']; - $str = $this->getConditionPart($name, $value, $operation); - if($sub_condition) $sub_condition .= ' '.$pipe.' '; - $sub_condition .= $str; - } - if($sub_condition) { - if($condition && $val['pipe']) $condition .= ' '.$val['pipe'].' '; - $condition .= '('.$sub_condition.')'; - } - } - return $condition; - } - - /** - * @brief insertAct 처리 - **/ - function _executeInsertAct($output) { - // 테이블 정리 - foreach($output->tables as $key => $val) { - $table_list[] = $this->prefix.$val; - } - - // 컬럼 정리 - foreach($output->columns as $key => $val) { - $name = $val['name']; - $value = $val['value']; - - $key_list[] = $name; - - if($output->column_type[$name]!='number') $val_list[] = $this->addQuotes($value); - else { - if(!$value || is_numeric($value)) $value = (int)$value; - $val_list[] = $value; - } - - $prepare_list[] = '?'; - } - - $query = sprintf("INSERT INTO %s (%s) VALUES (%s);", implode(',',$table_list), implode(',',$key_list), implode(',',$prepare_list)); - - $this->_prepare($query); - - $val_count = count($val_list); - for($i=0;$i<$val_count;$i++) $this->_bind($val_list[$i]); - - return $this->_execute(); - } - - /** - * @brief updateAct 처리 - **/ - function _executeUpdateAct($output) { - $table_count = count(array_values($output->tables)); - - // 대상 테이블이 1개일 경우 - if($table_count == 1) { - // 테이블 정리 - list($target_table) = array_values($output->tables); - $target_table = $this->prefix.$target_table; - - // 컬럼 정리 - foreach($output->columns as $key => $val) { - if(!isset($val['value'])) continue; - $name = $val['name']; - $value = $val['value']; - if(strpos($name,'.')!==false&&strpos($value,'.')!==false) $column_list[] = $name.' = '.$value; - else { - if($output->column_type[$name]!='number') $value = "'".$this->addQuotes($value)."'"; - elseif(!$value || is_numeric($value)) $value = (int)$value; - - $column_list[] = sprintf("%s = %s", $name, $value); - } - } - - // 조건절 정리 - $condition = $this->getCondition($output); - - $query = sprintf("update %s set %s %s", $target_table, implode(',',$column_list), $condition); - - // 대상 테이블이 2개일 경우 (sqlite에서 update 테이블을 1개 이상 지정 못해서 이렇게 꽁수로... 다른 방법이 있으려나..) - } elseif($table_count == 2) { - // 테이블 정리 - foreach($output->tables as $key => $val) { - $table_list[$val] = $this->prefix.$key; - } - list($source_table, $target_table) = array_values($table_list); - - // 조건절 정리 - $condition = $this->getCondition($output); - foreach($table_list as $key => $val) { - $condition = eregi_replace($key.'\\.', $val.'.', $condition); - } - - // 컬럼 정리 - foreach($output->columns as $key => $val) { - if(!isset($val['value'])) continue; - $name = $val['name']; - $value = $val['value']; - list($s_prefix, $s_column) = explode('.',$name); - list($t_prefix, $t_column) = explode('.',$value); - - $s_table = $table_list[$s_prefix]; - $t_table = $table_list[$t_prefix]; - $column_list[] = sprintf(' %s = (select %s from %s %s) ', $s_column, $t_column, $t_table, $condition); - } - - $query = sprintf('update %s set %s where exists(select * from %s %s)', $source_table, implode(',', $column_list), $target_table, $condition); - } else { - return; - } - - $this->_prepare($query); - return $this->_execute(); - } - - /** - * @brief deleteAct 처리 - **/ - function _executeDeleteAct($output) { - // 테이블 정리 - foreach($output->tables as $key => $val) { - $table_list[] = $this->prefix.$val; - } - - // 조건절 정리 - $condition = $this->getCondition($output); - - $query = sprintf("delete from %s %s", implode(',',$table_list), $condition); - - $this->_prepare($query); - return $this->_execute(); - } - - /** - * @brief selectAct 처리 - * - * select의 경우 특정 페이지의 목록을 가져오는 것을 편하게 하기 위해\n - * navigation이라는 method를 제공 - **/ - function _executeSelectAct($output) { - // 테이블 정리 - $table_list = array(); - foreach($output->tables as $key => $val) { - $table_list[] = $this->prefix.$val.' as '.$key; - } - - $left_join = array(); - // why??? - $left_tables= (array)$output->left_tables; - - foreach($left_tables as $key => $val) { - $condition = $this->_getCondition($output->left_conditions[$key],$output->column_type); - if($condition){ - $left_join[] = $val . ' '.$this->prefix.$output->_tables[$key].' as '.$key . ' on (' . $condition . ')'; - } - } - - - $click_count = array(); - if(!$output->columns){ - $output->columns = array(array('name'=>'*')); - } - - $column_list = array(); - foreach($output->columns as $key => $val) { - $name = $val['name']; - $alias = $val['alias']; - if($val['click_count']) $click_count[] = $val['name']; - - if(substr($name,-1) == '*') { - $column_list[] = $name; - } elseif(strpos($name,'.')===false && strpos($name,'(')===false) { - if($alias) $column_list[$alias] = sprintf('%s as %s', $name, $alias); - else $column_list[] = sprintf('%s',$name); - } else { - if($alias) $column_list[$alias] = sprintf('%s as %s', $name, $alias); - else $column_list[] = sprintf('%s',$name); - } - } - $columns = implode(',',$column_list); - - $condition = $this->getCondition($output); - - $output->column_list = $column_list; - if($output->list_count && $output->page) return $this->_getNavigationData($table_list, $columns, $left_join, $condition, $output); - - // list_order, update_order 로 정렬시에 인덱스 사용을 위해 condition에 쿼리 추가 - if($output->order) { - $conditions = $this->getConditionList($output); - if(!in_array('list_order', $conditions) && !in_array('update_order', $conditions)) { - foreach($output->order as $key => $val) { - $col = $val[0]; - if(!in_array($col, array('list_order','update_order'))) continue; - if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col); - else $condition = sprintf(' where %s < 2100000000 ', $col); - } - } - } - - if(count($output->groups)){ - $groupby_query = sprintf(' group by %s', implode(',',$output->groups)); - if(count($output->arg_columns)) - { - foreach($output->groups as $group) - { - if($column_list[$group]) $output->arg_columns[] = $column_list[$group]; - } - } - } - - if($output->order) { - foreach($output->order as $key => $val) { - $index_list[] = sprintf('%s %s', $val[0], $val[1]); - if(count($output->arg_columns) && $column_list[$val[0]]) $output->arg_columns[] = $column_list[$val[0]]; - } - if(count($index_list)) $orderby_query = ' order by '.implode(',',$index_list); - } - - if(count($output->arg_columns)) - { - $columns = join(',',$output->arg_columns); - } - - $query = sprintf("select %s from %s %s %s %s", $columns, implode(',',$table_list),implode(' ',$left_join), $condition, $groupby_query.$orderby_query); - // list_count를 사용할 경우 적용 - if($output->list_count['value']) $query = sprintf('%s limit %d', $query, $output->list_count['value']); - - $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id):''; - $this->_prepare($query); - $data = $this->_execute(); - if($this->isError()) return; - - if(count($click_count)>0 && count($output->conditions)>0){ - $_query = ''; - foreach($click_count as $k => $c) $_query .= sprintf(',%s=%s+1 ',$c,$c); - $_query = sprintf('update %s set %s %s',implode(',',$table_list), substr($_query,1), $condition); - $this->_query($_query); - } - - $buff = new Object(); - $buff->data = $data; - return $buff; - } - - /** - * @brief query xml에 navigation 정보가 있을 경우 페이징 관련 작업을 처리한다 - * - * 그닥 좋지는 않은 구조이지만 편리하다.. -_-; - **/ - function _getNavigationData($table_list, $columns, $left_join, $condition, $output) { - require_once(_XE_PATH_.'classes/page/PageHandler.class.php'); - - $column_list = $output->column_list; - /* - // group by 절이 포함된 SELECT 쿼리의 전체 갯수를 구하기 위한 수정 - // 정상적인 동작이 확인되면 주석으로 막아둔 부분으로 대체합니다. - // - $count_condition = count($output->groups) ? sprintf('%s group by %s', $condition, implode(', ', $output->groups)) : $condition; - $total_count = $this->getCountCache($output->tables, $count_condition); - if($total_count === false) { - $count_query = sprintf("select count(*) as count from %s %s %s", implode(', ', $table_list), implode(' ', $left_join), $count_condition); - if (count($output->groups)) - $count_query = sprintf('select count(*) as count from (%s) xet', $count_query); - $result = $this->_query($count_query); - $count_output = $this->_fetch($result); - $total_count = (int)$count_output->count; - $this->putCountCache($output->tables, $count_condition, $total_count); - } - */ - - // 전체 개수를 구함 - $count_query = sprintf("select count(*) as count from %s %s %s", implode(',',$table_list),implode(' ',$left_join), $condition); - $count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id . ' count(*)'):''; - $this->_prepare($count_query); - $count_output = $this->_execute(); - $total_count = (int)$count_output->count; - - $list_count = $output->list_count['value']; - if(!$list_count) $list_count = 20; - $page_count = $output->page_count['value']; - if(!$page_count) $page_count = 10; - $page = $output->page['value']; - if(!$page) $page = 1; - - // 전체 페이지를 구함 - if($total_count) $total_page = (int)( ($total_count-1) / $list_count) + 1; - else $total_page = 1; - - // 페이지 변수를 체크 - if($page > $total_page) $page = $total_page; - $start_count = ($page-1)*$list_count; - - // list_order, update_order 로 정렬시에 인덱스 사용을 위해 condition에 쿼리 추가 - if($output->order) { - $conditions = $this->getConditionList($output); - if(!in_array('list_order', $conditions) && !in_array('update_order', $conditions)) { - foreach($output->order as $key => $val) { - $col = $val[0]; - if(!in_array($col, array('list_order','update_order'))) continue; - if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col); - else $condition = sprintf(' where %s < 2100000000 ', $col); - } - } - } - - if(count($output->groups)){ - $groupby_query = sprintf(' group by %s', implode(',',$output->groups)); - if(count($output->arg_columns)) - { - foreach($output->groups as $group) - { - if($column_list[$group]) $output->arg_columns[] = $column_list[$group]; - } - } - } - - if($output->order) { - foreach($output->order as $key => $val) { - $index_list[] = sprintf('%s %s', $val[0], $val[1]); - if(count($output->arg_columns) && $column_list[$val[0]]) $output->arg_columns[] = $column_list[$val[0]]; - } - if(count($index_list)) $orderby_query = ' order by '.implode(',',$index_list); - } - - if(count($output->arg_columns)) - { - $columns = join(',',$output->arg_columns); - } - - // return 결과물 생성 - $buff = new Object(); - $buff->total_count = 0; - $buff->total_page = 0; - $buff->page = 1; - $buff->data = array(); - $buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count); - - // 쿼리 실행 - $query = sprintf("select %s from %s %s %s %s", $columns, implode(',',$table_list),implode(' ',$left_join), $condition, $groupby_query.$orderby_query); - $query = sprintf('%s limit %d, %d', $query, $start_count, $list_count); - $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id):''; - - $this->_prepare($query); - - if($this->isError()) { - $this->setError($this->handler->errorCode(), print_r($this->handler->errorInfo(),true)); - $this->actFinish(); - return $buff; - } - - $this->stmt->execute(); - - if($this->stmt->errorCode() != '00000') { - $this->setError($this->stmt->errorCode(), print_r($this->stmt->errorInfo(),true)); - $this->actFinish(); - return $buff; - } - - $output = null; - $virtual_no = $total_count - ($page-1)*$list_count; - while($tmp = $this->stmt->fetch(PDO::FETCH_ASSOC)) { - unset($obj); - foreach($tmp as $key => $val) { - $pos = strpos($key, '.'); - if($pos) $key = substr($key, $pos+1); - $obj->{$key} = $val; - } - $data[$virtual_no--] = $obj; - } - - $this->stmt = null; - $this->actFinish(); - - $buff = new Object(); - $buff->total_count = $total_count; - $buff->total_page = $total_page; - $buff->page = $page; - $buff->data = $data; - - $buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count); - return $buff; - } - } - -return new DBSqlite3_pdo; -?> + 'INTEGER', + 'number' => 'INTEGER', + 'varchar' => 'VARHAR', + 'char' => 'CHAR', + 'text' => 'TEXT', + 'bigtext' => 'TEXT', + 'date' => 'VARCHAR(14)', + 'float' => 'REAL', + ); + + /** + * @brief constructor + **/ + function DBSqlite3_pdo() { + $this->_setDBInfo(); + $this->_connect(); + } + + /** + * @brief create an instance of this class + */ + function create() + { + return new DBSqlite3_pdo; + } + + /** + * @brief 설치 가능 여부를 return + **/ + function isSupported() { + return class_exists('PDO'); + } + + /** + * @brief DB정보 설정 및 connect/ close + **/ + function _setDBInfo() { + $db_info = Context::getDBInfo(); + $this->database = $db_info->db_database; + $this->prefix = $db_info->db_table_prefix; + if(!substr($this->prefix,-1)!='_') $this->prefix .= '_'; + } + + /** + * @brief DB 접속 + **/ + function _connect() { + // db 정보가 없으면 무시 + if(!$this->database) return; + + // 데이터 베이스 파일 접속 시도 + try { + // PDO is only supported with PHP5, + // so it is allowed to use try~catch statment in this class. + $this->handler = new PDO('sqlite:'.$this->database); + } catch (PDOException $e) { + $this->setError(-1, 'Connection failed: '.$e->getMessage()); + $this->is_connected = false; + return; + } + + // 접속체크 + $this->is_connected = true; + $this->password = md5($this->password); + } + + /** + * @brief DB접속 해제 + **/ + function close() { + if(!$this->is_connected) return; + $this->commit(); + } + + /** + * @brief 트랜잭션 시작 + **/ + function begin() { + if(!$this->is_connected || $this->transaction_started) return; + if($this->handler->beginTransaction()) $this->transaction_started = true; + } + + /** + * @brief 롤백 + **/ + function rollback() { + if(!$this->is_connected || !$this->transaction_started) return; + $this->handler->rollBack(); + $this->transaction_started = false; + } + + /** + * @brief 커밋 + **/ + function commit($force = false) { + if(!$force && (!$this->is_connected || !$this->transaction_started)) return; + $this->handler->commit(); + $this->transaction_started = false; + } + + /** + * @brief 쿼리에서 입력되는 문자열 변수들의 quotation 조절 + **/ + function addQuotes($string) { + if(version_compare(PHP_VERSION, "5.9.0", "<") && get_magic_quotes_gpc()) $string = stripslashes(str_replace("\\","\\\\",$string)); + if(!is_numeric($string)) $string = str_replace("'","''",$string); + return $string; + } + + /** + * @brief : 쿼리문의 prepare + **/ + function _prepare($query) { + if(!$this->is_connected) return; + + // 쿼리 시작을 알림 + $this->actStart($query); + + $this->stmt = $this->handler->prepare($query); + + if($this->handler->errorCode() != '00000') { + $this->setError($this->handler->errorCode(), print_r($this->handler->errorInfo(),true)); + $this->actFinish(); + } + $this->bind_idx = 0; + $this->bind_vars = array(); + } + + /** + * @brief : stmt에 binding params + **/ + function _bind($val) { + if(!$this->is_connected || !$this->stmt) return; + + $this->bind_idx ++; + $this->bind_vars[] = $val; + $this->stmt->bindParam($this->bind_idx, $val); + } + + /** + * @brief : prepare된 쿼리의 execute + **/ + function _execute() { + if(!$this->is_connected || !$this->stmt) return; + + $this->stmt->execute(); + + if($this->stmt->errorCode() === '00000') { + $output = null; + while($tmp = $this->stmt->fetch(PDO::FETCH_ASSOC)) { + unset($obj); + foreach($tmp as $key => $val) { + $pos = strpos($key, '.'); + if($pos) $key = substr($key, $pos+1); + $obj->{$key} = str_replace("''","'",$val); + } + $output[] = $obj; + } + } else { + $this->setError($this->stmt->errorCode(),print_r($this->stmt->errorInfo(),true)); + } + + $this->stmt = null; + $this->actFinish(); + + if(is_array($output) && count($output)==1) return $output[0]; + return $output; + } + + /** + * @brief 1씩 증가되는 sequence값을 return + **/ + function getNextSequence() { + $query = sprintf("insert into %ssequence (seq) values (NULL)", $this->prefix); + $this->_prepare($query); + $result = $this->_execute(); + $sequence = $this->handler->lastInsertId(); + if($sequence % 10000 == 0) { + $query = sprintf("delete from %ssequence where seq < %d", $this->prefix, $sequence); + $this->_prepare($query); + $result = $this->_execute(); + } + + return $sequence; + } + + /** + * @brief 테이블 기생성 여부 return + **/ + function isTableExists($target_name) { + $query = sprintf('pragma table_info(%s%s)', $this->prefix, $target_name); + $this->_prepare($query); + if(!$this->_execute()) return false; + return true; + } + + /** + * @brief 특정 테이블에 특정 column 추가 + **/ + function addColumn($table_name, $column_name, $type='number', $size='', $default = '', $notnull=false) { + $type = $this->column_type[$type]; + if(strtoupper($type)=='INTEGER') $size = ''; + + $query = sprintf("alter table %s%s add %s ", $this->prefix, $table_name, $column_name); + if($size) $query .= sprintf(" %s(%s) ", $type, $size); + else $query .= sprintf(" %s ", $type); + if($default) $query .= sprintf(" default '%s' ", $default); + if($notnull) $query .= " not null "; + + $this->_prepare($query); + return $this->_execute(); + } + + /** + * @brief 특정 테이블에 특정 column 제거 + **/ + function dropColumn($table_name, $column_name) { + $query = sprintf("alter table %s%s drop column %s ", $this->prefix, $table_name, $column_name); + $this->_query($query); + } + + /** + * @brief 특정 테이블의 column의 정보를 return + **/ + function isColumnExists($table_name, $column_name) { + $query = sprintf("pragma table_info(%s%s)", $this->prefix, $table_name); + $this->_prepare($query); + $output = $this->_execute(); + + if($output) { + $column_name = strtolower($column_name); + foreach($output as $key => $val) { + $name = strtolower($val->name); + if($column_name == $name) return true; + } + } + return false; + } + + /** + * @brief 특정 테이블에 특정 인덱스 추가 + * $target_columns = array(col1, col2) + * $is_unique? unique : none + **/ + function addIndex($table_name, $index_name, $target_columns, $is_unique = false) { + if(!is_array($target_columns)) $target_columns = array($target_columns); + + $key_name = sprintf('%s%s_%s', $this->prefix, $table_name, $index_name); + + $query = sprintf('CREATE %s INDEX %s ON %s%s (%s)', $is_unique?'UNIQUE':'', $key_name, $this->prefix, $table_name, implode(',',$target_columns)); + $this->_prepare($query); + $this->_execute(); + } + + /** + * @brief 특정 테이블의 특정 인덱스 삭제 + **/ + function dropIndex($table_name, $index_name, $is_unique = false) { + $key_name = sprintf('%s%s_%s', $this->prefix, $table_name, $index_name); + $query = sprintf("DROP INDEX %s", $this->prefix, $table_name, $key_name); + $this->_query($query); + } + + /** + * @brief 특정 테이블의 index 정보를 return + **/ + function isIndexExists($table_name, $index_name) { + $key_name = sprintf('%s%s_%s', $this->prefix, $table_name, $index_name); + + $query = sprintf("pragma index_info(%s)", $key_name); + $this->_prepare($query); + $output = $this->_execute(); + if(!$output) return false; + return true; + } + + /** + * @brief xml 을 받아서 테이블을 생성 + **/ + function createTableByXml($xml_doc) { + return $this->_createTable($xml_doc); + } + + /** + * @brief xml 을 받아서 테이블을 생성 + **/ + function createTableByXmlFile($file_name) { + if(!file_exists($file_name)) return; + // xml 파일을 읽음 + $buff = FileHandler::readFile($file_name); + return $this->_createTable($buff); + } + + /** + * @brief schema xml을 이용하여 create table query생성 + * + * type : number, varchar, text, char, date, \n + * opt : notnull, default, size\n + * index : primary key, index, unique\n + **/ + function _createTable($xml_doc) { + // xml parsing + $oXml = new XmlParser(); + $xml_obj = $oXml->parse($xml_doc); + + // 테이블 생성 schema 작성 + $table_name = $xml_obj->table->attrs->name; + if($this->isTableExists($table_name)) return; + $table_name = $this->prefix.$table_name; + + if(!is_array($xml_obj->table->column)) $columns[] = $xml_obj->table->column; + else $columns = $xml_obj->table->column; + + foreach($columns as $column) { + $name = $column->attrs->name; + $type = $column->attrs->type; + if(strtoupper($this->column_type[$type])=='INTEGER') $size = ''; + else $size = $column->attrs->size; + $notnull = $column->attrs->notnull; + $primary_key = $column->attrs->primary_key; + $index = $column->attrs->index; + $unique = $column->attrs->unique; + $default = $column->attrs->default; + $auto_increment = $column->attrs->auto_increment; + + if($auto_increment) { + $column_schema[] = sprintf('%s %s PRIMARY KEY %s', + $name, + $this->column_type[$type], + $auto_increment?'AUTOINCREMENT':'' + ); + } else { + $column_schema[] = sprintf('%s %s%s %s %s %s', + $name, + $this->column_type[$type], + $size?'('.$size.')':'', + $notnull?'NOT NULL':'', + $primary_key?'PRIMARY KEY':'', + isset($default)?"DEFAULT '".$default."'":'' + ); + } + + if($unique) $unique_list[$unique][] = $name; + else if($index) $index_list[$index][] = $name; + } + + $schema = sprintf('CREATE TABLE %s (%s%s) ;', $table_name," ", implode($column_schema,", ")); + $this->_prepare($schema); + $this->_execute(); + if($this->isError()) return; + + if(count($unique_list)) { + foreach($unique_list as $key => $val) { + $query = sprintf('CREATE UNIQUE INDEX %s_%s ON %s (%s)', $this->addQuotes($table_name), $key, $this->addQuotes($table_name), implode(',',$val)); + $this->_prepare($query); + $this->_execute(); + if($this->isError()) $this->rollback(); + } + } + + if(count($index_list)) { + foreach($index_list as $key => $val) { + $query = sprintf('CREATE INDEX %s_%s ON %s (%s)', $this->addQuotes($table_name), $key, $this->addQuotes($table_name), implode(',',$val)); + $this->_prepare($query); + $this->_execute(); + if($this->isError()) $this->rollback(); + } + } + } + + /** + * @brief 조건문 작성하여 return + **/ + function getCondition($output) { + if(!$output->conditions) return; + $condition = $this->_getCondition($output->conditions,$output->column_type); + if($condition) $condition = ' where '.$condition; + return $condition; + } + + function getLeftCondition($conditions,$column_type){ + return $this->_getCondition($conditions,$column_type); + } + + + function _getCondition($conditions,$column_type) { + $condition = ''; + foreach($conditions as $val) { + $sub_condition = ''; + foreach($val['condition'] as $v) { + if(!isset($v['value'])) continue; + if($v['value'] === '') continue; + if(!in_array(gettype($v['value']), array('string', 'integer', 'double', 'array'))) continue; + + $name = $v['column']; + $operation = $v['operation']; + $value = $v['value']; + $type = $this->getColumnType($column_type,$name); + $pipe = $v['pipe']; + + $value = $this->getConditionValue($name, $value, $operation, $type, $column_type); + if(!$value) $value = $v['value']; + $str = $this->getConditionPart($name, $value, $operation); + if($sub_condition) $sub_condition .= ' '.$pipe.' '; + $sub_condition .= $str; + } + if($sub_condition) { + if($condition && $val['pipe']) $condition .= ' '.$val['pipe'].' '; + $condition .= '('.$sub_condition.')'; + } + } + return $condition; + } + + /** + * @brief insertAct 처리 + **/ + function _executeInsertAct($output) { + // 테이블 정리 + foreach($output->tables as $key => $val) { + $table_list[] = $this->prefix.$val; + } + + // 컬럼 정리 + foreach($output->columns as $key => $val) { + $name = $val['name']; + $value = $val['value']; + + $key_list[] = $name; + + if($output->column_type[$name]!='number') $val_list[] = $this->addQuotes($value); + else { + if(!$value || is_numeric($value)) $value = (int)$value; + $val_list[] = $value; + } + + $prepare_list[] = '?'; + } + + $query = sprintf("INSERT INTO %s (%s) VALUES (%s);", implode(',',$table_list), implode(',',$key_list), implode(',',$prepare_list)); + + $this->_prepare($query); + + $val_count = count($val_list); + for($i=0;$i<$val_count;$i++) $this->_bind($val_list[$i]); + + return $this->_execute(); + } + + /** + * @brief updateAct 처리 + **/ + function _executeUpdateAct($output) { + $table_count = count(array_values($output->tables)); + + // 대상 테이블이 1개일 경우 + if($table_count == 1) { + // 테이블 정리 + list($target_table) = array_values($output->tables); + $target_table = $this->prefix.$target_table; + + // 컬럼 정리 + foreach($output->columns as $key => $val) { + if(!isset($val['value'])) continue; + $name = $val['name']; + $value = $val['value']; + if(strpos($name,'.')!==false&&strpos($value,'.')!==false) $column_list[] = $name.' = '.$value; + else { + if($output->column_type[$name]!='number') $value = "'".$this->addQuotes($value)."'"; + elseif(!$value || is_numeric($value)) $value = (int)$value; + + $column_list[] = sprintf("%s = %s", $name, $value); + } + } + + // 조건절 정리 + $condition = $this->getCondition($output); + + $query = sprintf("update %s set %s %s", $target_table, implode(',',$column_list), $condition); + + // 대상 테이블이 2개일 경우 (sqlite에서 update 테이블을 1개 이상 지정 못해서 이렇게 꽁수로... 다른 방법이 있으려나..) + } elseif($table_count == 2) { + // 테이블 정리 + foreach($output->tables as $key => $val) { + $table_list[$val] = $this->prefix.$key; + } + list($source_table, $target_table) = array_values($table_list); + + // 조건절 정리 + $condition = $this->getCondition($output); + foreach($table_list as $key => $val) { + $condition = eregi_replace($key.'\\.', $val.'.', $condition); + } + + // 컬럼 정리 + foreach($output->columns as $key => $val) { + if(!isset($val['value'])) continue; + $name = $val['name']; + $value = $val['value']; + list($s_prefix, $s_column) = explode('.',$name); + list($t_prefix, $t_column) = explode('.',$value); + + $s_table = $table_list[$s_prefix]; + $t_table = $table_list[$t_prefix]; + $column_list[] = sprintf(' %s = (select %s from %s %s) ', $s_column, $t_column, $t_table, $condition); + } + + $query = sprintf('update %s set %s where exists(select * from %s %s)', $source_table, implode(',', $column_list), $target_table, $condition); + } else { + return; + } + + $this->_prepare($query); + return $this->_execute(); + } + + /** + * @brief deleteAct 처리 + **/ + function _executeDeleteAct($output) { + // 테이블 정리 + foreach($output->tables as $key => $val) { + $table_list[] = $this->prefix.$val; + } + + // 조건절 정리 + $condition = $this->getCondition($output); + + $query = sprintf("delete from %s %s", implode(',',$table_list), $condition); + + $this->_prepare($query); + return $this->_execute(); + } + + /** + * @brief selectAct 처리 + * + * select의 경우 특정 페이지의 목록을 가져오는 것을 편하게 하기 위해\n + * navigation이라는 method를 제공 + **/ + function _executeSelectAct($output) { + // 테이블 정리 + $table_list = array(); + foreach($output->tables as $key => $val) { + $table_list[] = $this->prefix.$val.' as '.$key; + } + + $left_join = array(); + // why??? + $left_tables= (array)$output->left_tables; + + foreach($left_tables as $key => $val) { + $condition = $this->_getCondition($output->left_conditions[$key],$output->column_type); + if($condition){ + $left_join[] = $val . ' '.$this->prefix.$output->_tables[$key].' as '.$key . ' on (' . $condition . ')'; + } + } + + + $click_count = array(); + if(!$output->columns){ + $output->columns = array(array('name'=>'*')); + } + + $column_list = array(); + foreach($output->columns as $key => $val) { + $name = $val['name']; + $alias = $val['alias']; + if($val['click_count']) $click_count[] = $val['name']; + + if(substr($name,-1) == '*') { + $column_list[] = $name; + } elseif(strpos($name,'.')===false && strpos($name,'(')===false) { + if($alias) $column_list[$alias] = sprintf('%s as %s', $name, $alias); + else $column_list[] = sprintf('%s',$name); + } else { + if($alias) $column_list[$alias] = sprintf('%s as %s', $name, $alias); + else $column_list[] = sprintf('%s',$name); + } + } + $columns = implode(',',$column_list); + + $condition = $this->getCondition($output); + + $output->column_list = $column_list; + if($output->list_count && $output->page) return $this->_getNavigationData($table_list, $columns, $left_join, $condition, $output); + + // list_order, update_order 로 정렬시에 인덱스 사용을 위해 condition에 쿼리 추가 + if($output->order) { + $conditions = $this->getConditionList($output); + if(!in_array('list_order', $conditions) && !in_array('update_order', $conditions)) { + foreach($output->order as $key => $val) { + $col = $val[0]; + if(!in_array($col, array('list_order','update_order'))) continue; + if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col); + else $condition = sprintf(' where %s < 2100000000 ', $col); + } + } + } + + if(count($output->groups)){ + $groupby_query = sprintf(' group by %s', implode(',',$output->groups)); + if(count($output->arg_columns)) + { + foreach($output->groups as $group) + { + if($column_list[$group]) $output->arg_columns[] = $column_list[$group]; + } + } + } + + if($output->order) { + foreach($output->order as $key => $val) { + $index_list[] = sprintf('%s %s', $val[0], $val[1]); + if(count($output->arg_columns) && $column_list[$val[0]]) $output->arg_columns[] = $column_list[$val[0]]; + } + if(count($index_list)) $orderby_query = ' order by '.implode(',',$index_list); + } + + if(count($output->arg_columns)) + { + $columns = join(',',$output->arg_columns); + } + + $query = sprintf("select %s from %s %s %s %s", $columns, implode(',',$table_list),implode(' ',$left_join), $condition, $groupby_query.$orderby_query); + // list_count를 사용할 경우 적용 + if($output->list_count['value']) $query = sprintf('%s limit %d', $query, $output->list_count['value']); + + $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id):''; + $this->_prepare($query); + $data = $this->_execute(); + if($this->isError()) return; + + if(count($click_count)>0 && count($output->conditions)>0){ + $_query = ''; + foreach($click_count as $k => $c) $_query .= sprintf(',%s=%s+1 ',$c,$c); + $_query = sprintf('update %s set %s %s',implode(',',$table_list), substr($_query,1), $condition); + $this->_query($_query); + } + + $buff = new Object(); + $buff->data = $data; + return $buff; + } + + /** + * @brief query xml에 navigation 정보가 있을 경우 페이징 관련 작업을 처리한다 + * + * 그닥 좋지는 않은 구조이지만 편리하다.. -_-; + **/ + function _getNavigationData($table_list, $columns, $left_join, $condition, $output) { + require_once(_XE_PATH_.'classes/page/PageHandler.class.php'); + + $column_list = $output->column_list; + /* + // group by 절이 포함된 SELECT 쿼리의 전체 갯수를 구하기 위한 수정 + // 정상적인 동작이 확인되면 주석으로 막아둔 부분으로 대체합니다. + // + $count_condition = count($output->groups) ? sprintf('%s group by %s', $condition, implode(', ', $output->groups)) : $condition; + $total_count = $this->getCountCache($output->tables, $count_condition); + if($total_count === false) { + $count_query = sprintf("select count(*) as count from %s %s %s", implode(', ', $table_list), implode(' ', $left_join), $count_condition); + if (count($output->groups)) + $count_query = sprintf('select count(*) as count from (%s) xet', $count_query); + $result = $this->_query($count_query); + $count_output = $this->_fetch($result); + $total_count = (int)$count_output->count; + $this->putCountCache($output->tables, $count_condition, $total_count); + } + */ + + // 전체 개수를 구함 + $count_query = sprintf("select count(*) as count from %s %s %s", implode(',',$table_list),implode(' ',$left_join), $condition); + $count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id . ' count(*)'):''; + $this->_prepare($count_query); + $count_output = $this->_execute(); + $total_count = (int)$count_output->count; + + $list_count = $output->list_count['value']; + if(!$list_count) $list_count = 20; + $page_count = $output->page_count['value']; + if(!$page_count) $page_count = 10; + $page = $output->page['value']; + if(!$page) $page = 1; + + // 전체 페이지를 구함 + if($total_count) $total_page = (int)( ($total_count-1) / $list_count) + 1; + else $total_page = 1; + + // 페이지 변수를 체크 + if($page > $total_page) $page = $total_page; + $start_count = ($page-1)*$list_count; + + // list_order, update_order 로 정렬시에 인덱스 사용을 위해 condition에 쿼리 추가 + if($output->order) { + $conditions = $this->getConditionList($output); + if(!in_array('list_order', $conditions) && !in_array('update_order', $conditions)) { + foreach($output->order as $key => $val) { + $col = $val[0]; + if(!in_array($col, array('list_order','update_order'))) continue; + if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col); + else $condition = sprintf(' where %s < 2100000000 ', $col); + } + } + } + + if(count($output->groups)){ + $groupby_query = sprintf(' group by %s', implode(',',$output->groups)); + if(count($output->arg_columns)) + { + foreach($output->groups as $group) + { + if($column_list[$group]) $output->arg_columns[] = $column_list[$group]; + } + } + } + + if($output->order) { + foreach($output->order as $key => $val) { + $index_list[] = sprintf('%s %s', $val[0], $val[1]); + if(count($output->arg_columns) && $column_list[$val[0]]) $output->arg_columns[] = $column_list[$val[0]]; + } + if(count($index_list)) $orderby_query = ' order by '.implode(',',$index_list); + } + + if(count($output->arg_columns)) + { + $columns = join(',',$output->arg_columns); + } + + // return 결과물 생성 + $buff = new Object(); + $buff->total_count = 0; + $buff->total_page = 0; + $buff->page = 1; + $buff->data = array(); + $buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count); + + // 쿼리 실행 + $query = sprintf("select %s from %s %s %s %s", $columns, implode(',',$table_list),implode(' ',$left_join), $condition, $groupby_query.$orderby_query); + $query = sprintf('%s limit %d, %d', $query, $start_count, $list_count); + $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id):''; + + $this->_prepare($query); + + if($this->isError()) { + $this->setError($this->handler->errorCode(), print_r($this->handler->errorInfo(),true)); + $this->actFinish(); + return $buff; + } + + $this->stmt->execute(); + + if($this->stmt->errorCode() != '00000') { + $this->setError($this->stmt->errorCode(), print_r($this->stmt->errorInfo(),true)); + $this->actFinish(); + return $buff; + } + + $output = null; + $virtual_no = $total_count - ($page-1)*$list_count; + while($tmp = $this->stmt->fetch(PDO::FETCH_ASSOC)) { + unset($obj); + foreach($tmp as $key => $val) { + $pos = strpos($key, '.'); + if($pos) $key = substr($key, $pos+1); + $obj->{$key} = $val; + } + $data[$virtual_no--] = $obj; + } + + $this->stmt = null; + $this->actFinish(); + + $buff = new Object(); + $buff->total_count = $total_count; + $buff->total_page = $total_page; + $buff->page = $page; + $buff->data = $data; + + $buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count); + return $buff; + } + } + +return new DBSqlite3_pdo; +?> diff --git a/classes/display/DisplayHandler.class.php b/classes/display/DisplayHandler.class.php index 8ad991f7a..251605ac7 100644 --- a/classes/display/DisplayHandler.class.php +++ b/classes/display/DisplayHandler.class.php @@ -1,278 +1,278 @@ -gz_enabled = true; - - // request method에 따른 컨텐츠 결과물 추출 - if(Context::get('xeVirtualRequestMethod')=='xml') { - require_once("./classes/display/VirtualXMLDisplayHandler.php"); - $handler = new VirtualXMLDisplayHandler(); - } - else if(Context::getRequestMethod() == 'XMLRPC') { - require_once("./classes/display/XMLDisplayHandler.php"); - $handler = new XMLDisplayHandler(); - if(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false) $this->gz_enabled = false; - } - else if(Context::getRequestMethod() == 'JSON') { - require_once("./classes/display/JSONDisplayHandler.php"); - $handler = new JSONDisplayHandler(); - } - else { - require_once("./classes/display/HTMLDisplayHandler.php"); - $handler = new HTMLDisplayHandler(); - } - - $output = $handler->toDoc($oModule); - - // 출력하기 전에 trigger 호출 (before) - ModuleHandler::triggerCall('display', 'before', $output); - - // 애드온 실행 - $called_position = 'before_display_content'; - $oAddonController = &getController('addon'); - $addon_file = $oAddonController->getCacheFilePath(Mobile::isFromMobilePhone()?"mobile":"pc"); - @include($addon_file); - - if(method_exists($handler, "prepareToPrint")) $handler->prepareToPrint($output); - - // header 출력 - if($this->gz_enabled) header("Content-Encoding: gzip"); - if(Context::getResponseMethod() == 'JSON') $this->_printJSONHeader(); - else if(Context::getResponseMethod() != 'HTML') $this->_printXMLHeader(); - else $this->_printHTMLHeader(); - - // debugOutput 출력 - $this->content_size = strlen($output); - $output .= $this->_debugOutput(); - - // 결과물 직접 출력 - if($this->gz_enabled) print ob_gzhandler($output, 5); - else print $output; - - // 출력 후 trigger 호출 (after) - ModuleHandler::triggerCall('display', 'after', $content); - } - - - /** - * @brief Print debugging message to designated output source depending on the value set to __DEBUG_OUTPUT_. \n - * This method only functions when __DEBUG__ variable is set to 1. - * __DEBUG_OUTPUT__ == 0, messages are written in ./files/_debug_message.php - **/ - function _debugOutput() { - if(!__DEBUG__) return; - - $end = getMicroTime(); - - // Firebug 콘솔 출력 - if(__DEBUG_OUTPUT__ == 2 && version_compare(PHP_VERSION, '6.0.0') === -1) { - static $firephp; - if(!isset($firephp)) $firephp = FirePHP::getInstance(true); - - if(__DEBUG_PROTECT__ == 1 && __DEBUG_PROTECT_IP__ != $_SERVER['REMOTE_ADDR']) { - $firephp->fb('Change the value of __DEBUG_PROTECT_IP__ into your IP address in config/config.user.inc.php or config/config.inc.php', 'The IP address is not allowed.'); - return; - } - - // 전체 실행 시간 출력, Request/Response info 출력 - if(__DEBUG__ & 2) { - $firephp->fb( - array('Request / Response info >>> '.$_SERVER['REQUEST_METHOD'].' / '.Context::getResponseMethod(), - array( - array('Request URI', 'Request method', 'Response method', 'Response contents size'), - array( - sprintf("%s:%s%s%s%s", $_SERVER['SERVER_NAME'], $_SERVER['SERVER_PORT'], $_SERVER['PHP_SELF'], $_SERVER['QUERY_STRING']?'?':'', $_SERVER['QUERY_STRING']), - $_SERVER['REQUEST_METHOD'], - Context::getResponseMethod(), - $this->content_size.' byte' - ) - ) - ), - 'TABLE' - ); - $firephp->fb( - array('Elapsed time >>> Total : '.sprintf('%0.5f sec', $end - __StartTime__), - array(array('DB queries', 'class file load', 'Template compile', 'XmlParse compile', 'PHP', 'Widgets', 'Trans Content'), - array( - sprintf('%0.5f sec', $GLOBALS['__db_elapsed_time__']), - sprintf('%0.5f sec', $GLOBALS['__elapsed_class_load__']), - sprintf('%0.5f sec (%d called)', $GLOBALS['__template_elapsed__'], $GLOBALS['__TemplateHandlerCalled__']), - sprintf('%0.5f sec', $GLOBALS['__xmlparse_elapsed__']), - sprintf('%0.5f sec', $end-__StartTime__-$GLOBALS['__template_elapsed__']-$GLOBALS['__xmlparse_elapsed__']-$GLOBALS['__db_elapsed_time__']-$GLOBALS['__elapsed_class_load__']), - sprintf('%0.5f sec', $GLOBALS['__widget_excute_elapsed__']), - sprintf('%0.5f sec', $GLOBALS['__trans_content_elapsed__']) - ) - ) - ), - 'TABLE' - ); - } - - // DB 쿼리 내역 출력 - if((__DEBUG__ & 4) && $GLOBALS['__db_queries__']) { - $queries_output = array(array('Query', 'Elapsed time', 'Result')); - foreach($GLOBALS['__db_queries__'] as $query) { - array_push($queries_output, array($query['query'], sprintf('%0.5f', $query['elapsed_time']), $query['result'])); - } - $firephp->fb( - array( - 'DB Queries >>> '.count($GLOBALS['__db_queries__']).' Queries, '.sprintf('%0.5f sec', $GLOBALS['__db_elapsed_time__']), - $queries_output - ), - 'TABLE' - ); - } - - - // 파일 및 HTML 주석으로 출력 - } else { - - // 전체 실행 시간 출력, Request/Response info 출력 - if(__DEBUG__ & 2) { - if(__DEBUG_PROTECT__ == 1 && __DEBUG_PROTECT_IP__ != $_SERVER['REMOTE_ADDR']) { - return; - } - - // Request/Response 정보 작성 - $buff .= "\n- Request/ Response info\n"; - $buff .= sprintf("\tRequest URI \t\t\t: %s:%s%s%s%s\n", $_SERVER['SERVER_NAME'], $_SERVER['SERVER_PORT'], $_SERVER['PHP_SELF'], $_SERVER['QUERY_STRING']?'?':'', $_SERVER['QUERY_STRING']); - $buff .= sprintf("\tRequest method \t\t\t: %s\n", $_SERVER['REQUEST_METHOD']); - $buff .= sprintf("\tResponse method \t\t: %s\n", Context::getResponseMethod()); - $buff .= sprintf("\tResponse contents size\t\t: %d byte\n", $this->content_size); - - // 전체 실행 시간 - $buff .= sprintf("\n- Total elapsed time : %0.5f sec\n", $end-__StartTime__); - - $buff .= sprintf("\tclass file load elapsed time \t: %0.5f sec\n", $GLOBALS['__elapsed_class_load__']); - $buff .= sprintf("\tTemplate compile elapsed time\t: %0.5f sec (%d called)\n", $GLOBALS['__template_elapsed__'], $GLOBALS['__TemplateHandlerCalled__']); - $buff .= sprintf("\tXmlParse compile elapsed time\t: %0.5f sec\n", $GLOBALS['__xmlparse_elapsed__']); - $buff .= sprintf("\tPHP elapsed time \t\t: %0.5f sec\n", $end-__StartTime__-$GLOBALS['__template_elapsed__']-$GLOBALS['__xmlparse_elapsed__']-$GLOBALS['__db_elapsed_time__']-$GLOBALS['__elapsed_class_load__']); - - // 위젯 실행 시간 작성 - $buff .= sprintf("\n\tWidgets elapsed time \t\t: %0.5f sec", $GLOBALS['__widget_excute_elapsed__']); - - // 레이아웃 실행 시간 - $buff .= sprintf("\n\tLayout compile elapsed time \t: %0.5f sec", $GLOBALS['__layout_compile_elapsed__']); - - // 위젯, 에디터 컴포넌트 치환 시간 - $buff .= sprintf("\n\tTrans Content \t\t\t: %0.5f sec\n", $GLOBALS['__trans_content_elapsed__']); - } - - // DB 로그 작성 - if(__DEBUG__ & 4) { - if(__DEBUG_PROTECT__ == 1 && __DEBUG_PROTECT_IP__ != $_SERVER['REMOTE_ADDR']) { - return; - } - - if($GLOBALS['__db_queries__']) { - $buff .= sprintf("\n- DB Queries : %d Queries. %0.5f sec\n", count($GLOBALS['__db_queries__']), $GLOBALS['__db_elapsed_time__']); - $num = 0; - - foreach($GLOBALS['__db_queries__'] as $query) { - $buff .= sprintf("\t%02d. %s\n\t\t%0.6f sec. ", ++$num, $query['query'], $query['elapsed_time']); - if($query['result'] == 'Success') { - $buff .= "Query Success\n"; - } else { - $buff .= sprintf("Query $s : %d\n\t\t\t %s\n", $query['result'], $query['errno'], $query['errstr']); - } - } - } - } - - // HTML 주석으로 출력 - if($buff && __DEBUG_OUTPUT__ == 1 && Context::getResponseMethod() == 'HTML') { - $buff = sprintf("[%s %s:%d]\n%s\n", date('Y-m-d H:i:s'), $file_name, $line_num, print_r($buff, true)); - - if(__DEBUG_PROTECT__ == 1 && __DEBUG_PROTECT_IP__ != $_SERVER['REMOTE_ADDR']) { - $buff = 'The IP address is not allowed. Change the value of __DEBUG_PROTECT_IP__ into your IP address in config/config.user.inc.php or config/config.inc.php'; - } - - return ""; - } - - // 파일에 출력 - if($buff && __DEBUG_OUTPUT__ == 0) { - $debug_file = _XE_PATH_.'files/_debug_message.php'; - $buff = sprintf("[%s %s:%d]\n%s\n", date('Y-m-d H:i:s'), $file_name, $line_num, print_r($buff, true)); - - $buff = str_repeat('=', 40)."\n".$buff.str_repeat('-', 40); - $buff = "\n\n"; - - if(@!$fp = fopen($debug_file, 'a')) return; - fwrite($fp, $buff); - fclose($fp); - } - } - } - - /** - * @brief print a HTTP HEADER for XML, which is encoded in UTF-8 - **/ - function _printXMLHeader() { - header("Content-Type: text/xml; charset=UTF-8"); - header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); - header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); - header("Cache-Control: no-store, no-cache, must-revalidate"); - header("Cache-Control: post-check=0, pre-check=0", false); - header("Pragma: no-cache"); - } - - - /** - * @brief print a HTTP HEADER for HTML, which is encoded in UTF-8 - **/ - function _printHTMLHeader() { - header("Content-Type: text/html; charset=UTF-8"); - header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); - header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); - header("Cache-Control: no-store, no-cache, must-revalidate"); - header("Cache-Control: post-check=0, pre-check=0", false); - header("Pragma: no-cache"); - } - - - /** - * @brief print a HTTP HEADER for JSON, which is encoded in UTF-8 - **/ - function _printJSONHeader() { - header("Content-Type: text/html; charset=UTF-8"); - header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); - header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); - header("Cache-Control: no-store, no-cache, must-revalidate"); - header("Cache-Control: post-check=0, pre-check=0", false); - header("Pragma: no-cache"); - } - - - - - } -?> +gz_enabled = true; + + // request method에 따른 컨텐츠 결과물 추출 + if(Context::get('xeVirtualRequestMethod')=='xml') { + require_once("./classes/display/VirtualXMLDisplayHandler.php"); + $handler = new VirtualXMLDisplayHandler(); + } + else if(Context::getRequestMethod() == 'XMLRPC') { + require_once("./classes/display/XMLDisplayHandler.php"); + $handler = new XMLDisplayHandler(); + if(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false) $this->gz_enabled = false; + } + else if(Context::getRequestMethod() == 'JSON') { + require_once("./classes/display/JSONDisplayHandler.php"); + $handler = new JSONDisplayHandler(); + } + else { + require_once("./classes/display/HTMLDisplayHandler.php"); + $handler = new HTMLDisplayHandler(); + } + + $output = $handler->toDoc($oModule); + + // 출력하기 전에 trigger 호출 (before) + ModuleHandler::triggerCall('display', 'before', $output); + + // 애드온 실행 + $called_position = 'before_display_content'; + $oAddonController = &getController('addon'); + $addon_file = $oAddonController->getCacheFilePath(Mobile::isFromMobilePhone()?"mobile":"pc"); + @include($addon_file); + + if(method_exists($handler, "prepareToPrint")) $handler->prepareToPrint($output); + + // header 출력 + if($this->gz_enabled) header("Content-Encoding: gzip"); + if(Context::getResponseMethod() == 'JSON') $this->_printJSONHeader(); + else if(Context::getResponseMethod() != 'HTML') $this->_printXMLHeader(); + else $this->_printHTMLHeader(); + + // debugOutput 출력 + $this->content_size = strlen($output); + $output .= $this->_debugOutput(); + + // 결과물 직접 출력 + if($this->gz_enabled) print ob_gzhandler($output, 5); + else print $output; + + // 출력 후 trigger 호출 (after) + ModuleHandler::triggerCall('display', 'after', $content); + } + + + /** + * @brief Print debugging message to designated output source depending on the value set to __DEBUG_OUTPUT_. \n + * This method only functions when __DEBUG__ variable is set to 1. + * __DEBUG_OUTPUT__ == 0, messages are written in ./files/_debug_message.php + **/ + function _debugOutput() { + if(!__DEBUG__) return; + + $end = getMicroTime(); + + // Firebug 콘솔 출력 + if(__DEBUG_OUTPUT__ == 2 && version_compare(PHP_VERSION, '6.0.0') === -1) { + static $firephp; + if(!isset($firephp)) $firephp = FirePHP::getInstance(true); + + if(__DEBUG_PROTECT__ == 1 && __DEBUG_PROTECT_IP__ != $_SERVER['REMOTE_ADDR']) { + $firephp->fb('Change the value of __DEBUG_PROTECT_IP__ into your IP address in config/config.user.inc.php or config/config.inc.php', 'The IP address is not allowed.'); + return; + } + + // 전체 실행 시간 출력, Request/Response info 출력 + if(__DEBUG__ & 2) { + $firephp->fb( + array('Request / Response info >>> '.$_SERVER['REQUEST_METHOD'].' / '.Context::getResponseMethod(), + array( + array('Request URI', 'Request method', 'Response method', 'Response contents size'), + array( + sprintf("%s:%s%s%s%s", $_SERVER['SERVER_NAME'], $_SERVER['SERVER_PORT'], $_SERVER['PHP_SELF'], $_SERVER['QUERY_STRING']?'?':'', $_SERVER['QUERY_STRING']), + $_SERVER['REQUEST_METHOD'], + Context::getResponseMethod(), + $this->content_size.' byte' + ) + ) + ), + 'TABLE' + ); + $firephp->fb( + array('Elapsed time >>> Total : '.sprintf('%0.5f sec', $end - __StartTime__), + array(array('DB queries', 'class file load', 'Template compile', 'XmlParse compile', 'PHP', 'Widgets', 'Trans Content'), + array( + sprintf('%0.5f sec', $GLOBALS['__db_elapsed_time__']), + sprintf('%0.5f sec', $GLOBALS['__elapsed_class_load__']), + sprintf('%0.5f sec (%d called)', $GLOBALS['__template_elapsed__'], $GLOBALS['__TemplateHandlerCalled__']), + sprintf('%0.5f sec', $GLOBALS['__xmlparse_elapsed__']), + sprintf('%0.5f sec', $end-__StartTime__-$GLOBALS['__template_elapsed__']-$GLOBALS['__xmlparse_elapsed__']-$GLOBALS['__db_elapsed_time__']-$GLOBALS['__elapsed_class_load__']), + sprintf('%0.5f sec', $GLOBALS['__widget_excute_elapsed__']), + sprintf('%0.5f sec', $GLOBALS['__trans_content_elapsed__']) + ) + ) + ), + 'TABLE' + ); + } + + // DB 쿼리 내역 출력 + if((__DEBUG__ & 4) && $GLOBALS['__db_queries__']) { + $queries_output = array(array('Query', 'Elapsed time', 'Result')); + foreach($GLOBALS['__db_queries__'] as $query) { + array_push($queries_output, array($query['query'], sprintf('%0.5f', $query['elapsed_time']), $query['result'])); + } + $firephp->fb( + array( + 'DB Queries >>> '.count($GLOBALS['__db_queries__']).' Queries, '.sprintf('%0.5f sec', $GLOBALS['__db_elapsed_time__']), + $queries_output + ), + 'TABLE' + ); + } + + + // 파일 및 HTML 주석으로 출력 + } else { + + // 전체 실행 시간 출력, Request/Response info 출력 + if(__DEBUG__ & 2) { + if(__DEBUG_PROTECT__ == 1 && __DEBUG_PROTECT_IP__ != $_SERVER['REMOTE_ADDR']) { + return; + } + + // Request/Response 정보 작성 + $buff .= "\n- Request/ Response info\n"; + $buff .= sprintf("\tRequest URI \t\t\t: %s:%s%s%s%s\n", $_SERVER['SERVER_NAME'], $_SERVER['SERVER_PORT'], $_SERVER['PHP_SELF'], $_SERVER['QUERY_STRING']?'?':'', $_SERVER['QUERY_STRING']); + $buff .= sprintf("\tRequest method \t\t\t: %s\n", $_SERVER['REQUEST_METHOD']); + $buff .= sprintf("\tResponse method \t\t: %s\n", Context::getResponseMethod()); + $buff .= sprintf("\tResponse contents size\t\t: %d byte\n", $this->content_size); + + // 전체 실행 시간 + $buff .= sprintf("\n- Total elapsed time : %0.5f sec\n", $end-__StartTime__); + + $buff .= sprintf("\tclass file load elapsed time \t: %0.5f sec\n", $GLOBALS['__elapsed_class_load__']); + $buff .= sprintf("\tTemplate compile elapsed time\t: %0.5f sec (%d called)\n", $GLOBALS['__template_elapsed__'], $GLOBALS['__TemplateHandlerCalled__']); + $buff .= sprintf("\tXmlParse compile elapsed time\t: %0.5f sec\n", $GLOBALS['__xmlparse_elapsed__']); + $buff .= sprintf("\tPHP elapsed time \t\t: %0.5f sec\n", $end-__StartTime__-$GLOBALS['__template_elapsed__']-$GLOBALS['__xmlparse_elapsed__']-$GLOBALS['__db_elapsed_time__']-$GLOBALS['__elapsed_class_load__']); + + // 위젯 실행 시간 작성 + $buff .= sprintf("\n\tWidgets elapsed time \t\t: %0.5f sec", $GLOBALS['__widget_excute_elapsed__']); + + // 레이아웃 실행 시간 + $buff .= sprintf("\n\tLayout compile elapsed time \t: %0.5f sec", $GLOBALS['__layout_compile_elapsed__']); + + // 위젯, 에디터 컴포넌트 치환 시간 + $buff .= sprintf("\n\tTrans Content \t\t\t: %0.5f sec\n", $GLOBALS['__trans_content_elapsed__']); + } + + // DB 로그 작성 + if(__DEBUG__ & 4) { + if(__DEBUG_PROTECT__ == 1 && __DEBUG_PROTECT_IP__ != $_SERVER['REMOTE_ADDR']) { + return; + } + + if($GLOBALS['__db_queries__']) { + $buff .= sprintf("\n- DB Queries : %d Queries. %0.5f sec\n", count($GLOBALS['__db_queries__']), $GLOBALS['__db_elapsed_time__']); + $num = 0; + + foreach($GLOBALS['__db_queries__'] as $query) { + $buff .= sprintf("\t%02d. %s\n\t\t%0.6f sec. ", ++$num, $query['query'], $query['elapsed_time']); + if($query['result'] == 'Success') { + $buff .= "Query Success\n"; + } else { + $buff .= sprintf("Query $s : %d\n\t\t\t %s\n", $query['result'], $query['errno'], $query['errstr']); + } + } + } + } + + // HTML 주석으로 출력 + if($buff && __DEBUG_OUTPUT__ == 1 && Context::getResponseMethod() == 'HTML') { + $buff = sprintf("[%s %s:%d]\n%s\n", date('Y-m-d H:i:s'), $file_name, $line_num, print_r($buff, true)); + + if(__DEBUG_PROTECT__ == 1 && __DEBUG_PROTECT_IP__ != $_SERVER['REMOTE_ADDR']) { + $buff = 'The IP address is not allowed. Change the value of __DEBUG_PROTECT_IP__ into your IP address in config/config.user.inc.php or config/config.inc.php'; + } + + return ""; + } + + // 파일에 출력 + if($buff && __DEBUG_OUTPUT__ == 0) { + $debug_file = _XE_PATH_.'files/_debug_message.php'; + $buff = sprintf("[%s %s:%d]\n%s\n", date('Y-m-d H:i:s'), $file_name, $line_num, print_r($buff, true)); + + $buff = str_repeat('=', 40)."\n".$buff.str_repeat('-', 40); + $buff = "\n\n"; + + if(@!$fp = fopen($debug_file, 'a')) return; + fwrite($fp, $buff); + fclose($fp); + } + } + } + + /** + * @brief print a HTTP HEADER for XML, which is encoded in UTF-8 + **/ + function _printXMLHeader() { + header("Content-Type: text/xml; charset=UTF-8"); + header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); + header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); + header("Cache-Control: no-store, no-cache, must-revalidate"); + header("Cache-Control: post-check=0, pre-check=0", false); + header("Pragma: no-cache"); + } + + + /** + * @brief print a HTTP HEADER for HTML, which is encoded in UTF-8 + **/ + function _printHTMLHeader() { + header("Content-Type: text/html; charset=UTF-8"); + header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); + header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); + header("Cache-Control: no-store, no-cache, must-revalidate"); + header("Cache-Control: post-check=0, pre-check=0", false); + header("Pragma: no-cache"); + } + + + /** + * @brief print a HTTP HEADER for JSON, which is encoded in UTF-8 + **/ + function _printJSONHeader() { + header("Content-Type: text/html; charset=UTF-8"); + header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); + header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); + header("Cache-Control: no-store, no-cache, must-revalidate"); + header("Cache-Control: post-check=0, pre-check=0", false); + header("Pragma: no-cache"); + } + + + + + } +?> diff --git a/classes/editor/EditorHandler.class.php b/classes/editor/EditorHandler.class.php index 930139792..806b30008 100644 --- a/classes/editor/EditorHandler.class.php +++ b/classes/editor/EditorHandler.class.php @@ -1,27 +1,27 @@ -extra_vars) return; - - foreach($info->extra_vars as $key => $val) { - $this->{$key} = trim($val->value); - } - } - - } - -?> +extra_vars) return; + + foreach($info->extra_vars as $key => $val) { + $this->{$key} = trim($val->value); + } + } + + } + +?> diff --git a/classes/extravar/Extravar.class.php b/classes/extravar/Extravar.class.php index bf3d83389..443b98fa1 100644 --- a/classes/extravar/Extravar.class.php +++ b/classes/extravar/Extravar.class.php @@ -1,311 +1,311 @@ -module_srl = $module_srl; - } - - /** - * @brief 확장변수 키를 등록 - * @param module_srl, idx, name, type, default, desc, is_required, search, value - **/ - function setExtraVarKeys($extra_keys) { - if(!is_array($extra_keys) || !count($extra_keys)) return; - foreach($extra_keys as $key => $val) { - $obj = null; - $obj = new ExtraItem($val->module_srl, $val->idx, $val->name, $val->type, $val->default, $val->desc, $val->is_required, $val->search, $val->value, $val->eid); - $this->keys[$val->idx] = $obj; - } - } - - /** - * @brief 확장변수 객체 배열 return - **/ - function getExtraVars() { - return $this->keys; - } - } - - /** - * @class ExtraItem - * @author NHN (developers@xpressengine.com) - * @brief 확장변수의 개별 값 - **/ - class ExtraItem { - var $module_srl = 0; - var $idx = 0; - var $name = 0; - var $type = 'text'; - var $default = null; - var $desc = ''; - var $is_required = 'N'; - var $search = 'N'; - var $value = null; - var $eid = ''; - - /** - * @brief constructor - **/ - function ExtraItem($module_srl, $idx, $name, $type = 'text', $default = null, $desc = '', $is_required = 'N', $search = 'N', $value = null, $eid = '') { - if(!$idx) return; - $this->module_srl = $module_srl; - $this->idx = $idx; - $this->name = $name; - $this->type = $type; - $this->default = $default; - $this->desc = $desc; - $this->is_required = $is_required; - $this->search = $search; - $this->value = $value; - $this->eid = $eid; - } - - /** - * @brief 값 지정 - **/ - function setValue($value) { - $this->value = $value; - } - - /** - * @brief type에 따라서 주어진 값을 변형하여 원형 값을 return - **/ - function _getTypeValue($type, $value) { - $value = trim($value); - if(!isset($value)) return; - switch($type) { - case 'homepage' : - if($value && !preg_match('/^([a-z]+):\/\//i',$value)) $value = 'http://'.$value; - return htmlspecialchars($value); - break; - case 'tel' : - if(is_array($value)) $values = $value; - elseif(strpos($value,'|@|')!==false) $values = explode('|@|', $value); - elseif(strpos($value,',')!==false) $values = explode(',', $value); - $values[0] = $values[0]; - $values[1] = $values[1]; - $values[2] = $values[2]; - return $values; - break; - break; - case 'checkbox' : - case 'radio' : - case 'select' : - if(is_array($value)) $values = $value; - elseif(strpos($value,'|@|')!==false) $values = explode('|@|', $value); - elseif(strpos($value,',')!==false) $values = explode(',', $value); - else $values = array($value); - for($i=0;$i_getTypeValue($this->type, $this->value); - switch($this->type) { - case 'homepage' : - return ($value)?(sprintf('
%s', $value, strlen($value)>60?substr($value,0,40).'...'.substr($value,-10):$value)):""; - case 'email_address' : - return ($value)?sprintf('%s', $value, $value):""; - break; - case 'tel' : - return sprintf('%s - %s - %s', $value[0],$value[1],$value[2]); - break; - case 'textarea' : - return nl2br($value); - break; - case 'checkbox' : - if(is_array($value)) return implode(', ',$value); - else return $value; - break; - case 'date' : - return zdate($value,"Y-m-d"); - break; - case 'select' : - case 'radio' : - if(is_array($value)) return implode(', ',$value); - else return $value; - break; - case 'kr_zip' : - if(is_array($value)) return implode(' ',$value); - else return $value; - break; - // case 'text' : - default : - return $value; - } - } - - /** - * @brief type에 따른 form을 리턴 - **/ - function getFormHTML() { - static $id_num = 1000; - - $type = $this->type; - $name = $this->name; - $value = $this->_getTypeValue($this->type, $this->value); - $default = $this->_getTypeValue($this->type, $this->default); - $column_name = 'extra_vars'.$this->idx; - $tmp_id = $column_name.'-'.$id_num++; - - $buff = ''; - switch($type) { - // 홈페이지 주소 - case 'homepage' : - $buff .= ''; - break; - - // Email 주소 - case 'email_address' : - $buff .= ''; - break; - - // 전화번호 - case 'tel' : - $buff .= - ''. - ''. - ''; - break; - - // textarea - case 'textarea' : - $buff .= ''; - break; - - // 다중 선택 - case 'checkbox' : - $buff .= '
    '; - foreach($default as $v) { - if($value && in_array($v, $value)) $checked = ' checked="checked"'; - else $checked = ''; - - // Temporary ID for labeling - $tmp_id = $column_name.'-'.$id_num++; - - $buff .='
  • '; - } - $buff .= '
'; - break; - - // 단일 선택 - case 'select' : - $buff .= ''; - break; - - // radio - case 'radio' : - $buff .= '
    '; - foreach($default as $v) { - if($value && in_array($v,$value)) $checked = ' checked="checked"'; - else $checked = ''; - - // Temporary ID for labeling - $tmp_id = $column_name.'-'.$id_num++; - - $buff .= '
  • '; - } - $buff .= '
'; - break; - - // 날짜 입력 - case 'date' : - // datepicker javascript plugin load - Context::loadJavascriptPlugin('ui.datepicker'); - - $buff .= - ''. - ''."\n". - ''; - break; - - // 주소 입력 - case "kr_zip" : - // krzip address javascript plugin load - Context::loadJavascriptPlugin('ui.krzip'); - - $buff .= - ''. - - ''. - - ''. - - ''. - ''; - break; - - // 일반 text - default : - $buff .=' '; - break; - } - if($this->desc) $buff .= '

'.$this->desc.'

'; - return $buff; - } - } -?> +module_srl = $module_srl; + } + + /** + * @brief 확장변수 키를 등록 + * @param module_srl, idx, name, type, default, desc, is_required, search, value + **/ + function setExtraVarKeys($extra_keys) { + if(!is_array($extra_keys) || !count($extra_keys)) return; + foreach($extra_keys as $key => $val) { + $obj = null; + $obj = new ExtraItem($val->module_srl, $val->idx, $val->name, $val->type, $val->default, $val->desc, $val->is_required, $val->search, $val->value, $val->eid); + $this->keys[$val->idx] = $obj; + } + } + + /** + * @brief 확장변수 객체 배열 return + **/ + function getExtraVars() { + return $this->keys; + } + } + + /** + * @class ExtraItem + * @author NHN (developers@xpressengine.com) + * @brief 확장변수의 개별 값 + **/ + class ExtraItem { + var $module_srl = 0; + var $idx = 0; + var $name = 0; + var $type = 'text'; + var $default = null; + var $desc = ''; + var $is_required = 'N'; + var $search = 'N'; + var $value = null; + var $eid = ''; + + /** + * @brief constructor + **/ + function ExtraItem($module_srl, $idx, $name, $type = 'text', $default = null, $desc = '', $is_required = 'N', $search = 'N', $value = null, $eid = '') { + if(!$idx) return; + $this->module_srl = $module_srl; + $this->idx = $idx; + $this->name = $name; + $this->type = $type; + $this->default = $default; + $this->desc = $desc; + $this->is_required = $is_required; + $this->search = $search; + $this->value = $value; + $this->eid = $eid; + } + + /** + * @brief 값 지정 + **/ + function setValue($value) { + $this->value = $value; + } + + /** + * @brief type에 따라서 주어진 값을 변형하여 원형 값을 return + **/ + function _getTypeValue($type, $value) { + $value = trim($value); + if(!isset($value)) return; + switch($type) { + case 'homepage' : + if($value && !preg_match('/^([a-z]+):\/\//i',$value)) $value = 'http://'.$value; + return htmlspecialchars($value); + break; + case 'tel' : + if(is_array($value)) $values = $value; + elseif(strpos($value,'|@|')!==false) $values = explode('|@|', $value); + elseif(strpos($value,',')!==false) $values = explode(',', $value); + $values[0] = $values[0]; + $values[1] = $values[1]; + $values[2] = $values[2]; + return $values; + break; + break; + case 'checkbox' : + case 'radio' : + case 'select' : + if(is_array($value)) $values = $value; + elseif(strpos($value,'|@|')!==false) $values = explode('|@|', $value); + elseif(strpos($value,',')!==false) $values = explode(',', $value); + else $values = array($value); + for($i=0;$i_getTypeValue($this->type, $this->value); + switch($this->type) { + case 'homepage' : + return ($value)?(sprintf('%s', $value, strlen($value)>60?substr($value,0,40).'...'.substr($value,-10):$value)):""; + case 'email_address' : + return ($value)?sprintf('%s', $value, $value):""; + break; + case 'tel' : + return sprintf('%s - %s - %s', $value[0],$value[1],$value[2]); + break; + case 'textarea' : + return nl2br($value); + break; + case 'checkbox' : + if(is_array($value)) return implode(', ',$value); + else return $value; + break; + case 'date' : + return zdate($value,"Y-m-d"); + break; + case 'select' : + case 'radio' : + if(is_array($value)) return implode(', ',$value); + else return $value; + break; + case 'kr_zip' : + if(is_array($value)) return implode(' ',$value); + else return $value; + break; + // case 'text' : + default : + return $value; + } + } + + /** + * @brief type에 따른 form을 리턴 + **/ + function getFormHTML() { + static $id_num = 1000; + + $type = $this->type; + $name = $this->name; + $value = $this->_getTypeValue($this->type, $this->value); + $default = $this->_getTypeValue($this->type, $this->default); + $column_name = 'extra_vars'.$this->idx; + $tmp_id = $column_name.'-'.$id_num++; + + $buff = ''; + switch($type) { + // 홈페이지 주소 + case 'homepage' : + $buff .= ''; + break; + + // Email 주소 + case 'email_address' : + $buff .= ''; + break; + + // 전화번호 + case 'tel' : + $buff .= + ''. + ''. + ''; + break; + + // textarea + case 'textarea' : + $buff .= ''; + break; + + // 다중 선택 + case 'checkbox' : + $buff .= '
    '; + foreach($default as $v) { + if($value && in_array($v, $value)) $checked = ' checked="checked"'; + else $checked = ''; + + // Temporary ID for labeling + $tmp_id = $column_name.'-'.$id_num++; + + $buff .='
  • '; + } + $buff .= '
'; + break; + + // 단일 선택 + case 'select' : + $buff .= ''; + break; + + // radio + case 'radio' : + $buff .= '
    '; + foreach($default as $v) { + if($value && in_array($v,$value)) $checked = ' checked="checked"'; + else $checked = ''; + + // Temporary ID for labeling + $tmp_id = $column_name.'-'.$id_num++; + + $buff .= '
  • '; + } + $buff .= '
'; + break; + + // 날짜 입력 + case 'date' : + // datepicker javascript plugin load + Context::loadJavascriptPlugin('ui.datepicker'); + + $buff .= + ''. + ''."\n". + ''; + break; + + // 주소 입력 + case "kr_zip" : + // krzip address javascript plugin load + Context::loadJavascriptPlugin('ui.krzip'); + + $buff .= + ''. + + ''. + + ''. + + ''. + ''; + break; + + // 일반 text + default : + $buff .=' '; + break; + } + if($this->desc) $buff .= '

'.$this->desc.'

'; + return $buff; + } + } +?> diff --git a/classes/file/FileObject.class.php b/classes/file/FileObject.class.php index cbe1ae2b0..6c1ef931a 100644 --- a/classes/file/FileObject.class.php +++ b/classes/file/FileObject.class.php @@ -1,128 +1,128 @@ -Open($path, $mode); - } - - /** - * @brief append target file's content to current file - * @param[in] $file_name path of target file - * @return none - **/ - function append($file_name) - { - $target = new FileObject($file_name, "r"); - while(!$target->feof()) - { - $readstr = $target->read(); - $this->write($readstr); - } - $target->close(); - } - - /** - * @brief check current file meets eof - * @return true: if eof. false: otherwise - **/ - function feof() - { - return feof($this->fp); - } - - /** - * @brief read from current file - * @param[in] $size size to read - * @return read bytes - **/ - function read($size = 1024) - { - return fread($this->fp, $size); - } - - - /** - * @brief write string to current file - * @param[in] $str string to write - * @return written bytes. if failed, it returns false - **/ - function write($str) - { - $len = strlen($str); - if(!$str || $len <= 0) return false; - if(!$this->fp) return false; - $written = fwrite($this->fp, $str); - return $written; - } - - /** - * @brief open a file - * @param[in] $path path of target file - * @param[in] $mode file open mode - * @remarks if file is opened, close it and open the new path - * @return true if succeed, false otherwise. - */ - function open($path, $mode) - { - if($this->fp != null) - { - $this->close(); - } - $this->fp = fopen($path, $mode); - if(! is_resource($this->fp) ) - { - $this->fp = null; - return false; - } - $this->path = $path; - return true; - } - - /** - * @brief return current file's path - * @return file path - **/ - function getPath() - { - if($this->fp != null) - { - return $this->path; - } - else - { - return null; - } - } - - /** - * @brief close file - * @return none - **/ - function close() - { - if($this->fp != null) - { - fclose($this->fp); - $this->fp = null; - } - } - - } -?> +Open($path, $mode); + } + + /** + * @brief append target file's content to current file + * @param[in] $file_name path of target file + * @return none + **/ + function append($file_name) + { + $target = new FileObject($file_name, "r"); + while(!$target->feof()) + { + $readstr = $target->read(); + $this->write($readstr); + } + $target->close(); + } + + /** + * @brief check current file meets eof + * @return true: if eof. false: otherwise + **/ + function feof() + { + return feof($this->fp); + } + + /** + * @brief read from current file + * @param[in] $size size to read + * @return read bytes + **/ + function read($size = 1024) + { + return fread($this->fp, $size); + } + + + /** + * @brief write string to current file + * @param[in] $str string to write + * @return written bytes. if failed, it returns false + **/ + function write($str) + { + $len = strlen($str); + if(!$str || $len <= 0) return false; + if(!$this->fp) return false; + $written = fwrite($this->fp, $str); + return $written; + } + + /** + * @brief open a file + * @param[in] $path path of target file + * @param[in] $mode file open mode + * @remarks if file is opened, close it and open the new path + * @return true if succeed, false otherwise. + */ + function open($path, $mode) + { + if($this->fp != null) + { + $this->close(); + } + $this->fp = fopen($path, $mode); + if(! is_resource($this->fp) ) + { + $this->fp = null; + return false; + } + $this->path = $path; + return true; + } + + /** + * @brief return current file's path + * @return file path + **/ + function getPath() + { + if($this->fp != null) + { + return $this->path; + } + else + { + return null; + } + } + + /** + * @brief close file + * @return none + **/ + function close() + { + if($this->fp != null) + { + fclose($this->fp); + $this->fp = null; + } + } + + } +?> diff --git a/classes/handler/Handler.class.php b/classes/handler/Handler.class.php index 375dfe281..1454f733e 100644 --- a/classes/handler/Handler.class.php +++ b/classes/handler/Handler.class.php @@ -1,11 +1,11 @@ - + diff --git a/classes/httprequest/XEHttpRequest.class.php b/classes/httprequest/XEHttpRequest.class.php index cf09444ff..c9c73f8de 100644 --- a/classes/httprequest/XEHttpRequest.class.php +++ b/classes/httprequest/XEHttpRequest.class.php @@ -1,85 +1,85 @@ -m_host = $host; - $this->m_port = $port; - $this->m_headers = array(); - } - - /** - * @brief mether to add key/value pair to the HTTP request header - * @param[in] key HTTP header element - * @param[in] value value string for HTTP header element - */ - function AddToHeader($key, $value) - { - $this->m_headers[$key] = $value; - } - - /** - * @brief send HTTP message to the host - * @param[in] target ip or url of the external server - * @param[in] method HTTP method such as GET and POST - * @param[in] timeout time out value for HTTP request expiration - * @return Returns an object containing HTTP Response body and HTTP response code - */ - function Send($target, $method="GET", $timeout = 3) - { - $socket = @fsockopen($this->m_host, $this->m_port, $errno, $errstr, $timeout); - if(!$socket) - { - return new Object(-1, "socket_connect_failed"); - } - - $this->AddToHeader('Host', $this->m_host); - $this->AddToHeader('Connection', "close"); - - $crlf = "\r\n"; - $request = "$method $target HTTP/1.1$crlf"; - - foreach($this->m_headers as $equiv => $content) - { - $request .= "$equiv: $content$crlf"; - } - $request .= $crlf; - fwrite($socket, $request); - - list($httpver, $code, $status) = split(' +', rtrim(fgets($socket))); - // read response header - while(strlen(trim($line = fgets($socket)))) - { - list($equiv, $content) = split(' *: *', rtrim($line)); - } - $body = ''; - while(!feof($socket)) - { - $body .= fgets($socket, 128); - } - fclose($socket); - - $ret->result_code = $code; - $ret->body = $body; - - return $ret; - } - } -?> +m_host = $host; + $this->m_port = $port; + $this->m_headers = array(); + } + + /** + * @brief mether to add key/value pair to the HTTP request header + * @param[in] key HTTP header element + * @param[in] value value string for HTTP header element + */ + function AddToHeader($key, $value) + { + $this->m_headers[$key] = $value; + } + + /** + * @brief send HTTP message to the host + * @param[in] target ip or url of the external server + * @param[in] method HTTP method such as GET and POST + * @param[in] timeout time out value for HTTP request expiration + * @return Returns an object containing HTTP Response body and HTTP response code + */ + function Send($target, $method="GET", $timeout = 3) + { + $socket = @fsockopen($this->m_host, $this->m_port, $errno, $errstr, $timeout); + if(!$socket) + { + return new Object(-1, "socket_connect_failed"); + } + + $this->AddToHeader('Host', $this->m_host); + $this->AddToHeader('Connection', "close"); + + $crlf = "\r\n"; + $request = "$method $target HTTP/1.1$crlf"; + + foreach($this->m_headers as $equiv => $content) + { + $request .= "$equiv: $content$crlf"; + } + $request .= $crlf; + fwrite($socket, $request); + + list($httpver, $code, $status) = split(' +', rtrim(fgets($socket))); + // read response header + while(strlen(trim($line = fgets($socket)))) + { + list($equiv, $content) = split(' *: *', rtrim($line)); + } + $body = ''; + while(!feof($socket)) + { + $body .= fgets($socket, 128); + } + fclose($socket); + + $ret->result_code = $code; + $ret->body = $body; + + return $ret; + } + } +?> diff --git a/classes/mail/Mail.class.php b/classes/mail/Mail.class.php index ad5b3d19a..3af574210 100644 --- a/classes/mail/Mail.class.php +++ b/classes/mail/Mail.class.php @@ -1,353 +1,353 @@ -additional_params = $additional_params; - } - - function addAttachment($filename, $orgfilename) - { - $this->attachments[$orgfilename] = $filename; - } - - function addCidAttachment($filename, $cid) - { - $this->cidAttachments[$cid] = $filename; - } - - function setSender($name, $email) { - $this->sender_name = $name; - $this->sender_email = $email; - } - - function getSender() { - if(!stristr(PHP_OS, 'win') && $this->sender_name) return sprintf("%s <%s>", '=?utf-8?b?'.base64_encode($this->sender_name).'?=', $this->sender_email); - return $this->sender_email; - } - - function setReceiptor($name, $email) { - $this->receiptor_name = $name; - $this->receiptor_email = $email; - } - - function getReceiptor() { - if(!stristr(PHP_OS, 'win') && $this->receiptor_name && $this->receiptor_name != $this->receiptor_email) return sprintf("%s <%s>", '=?utf-8?b?'.base64_encode($this->receiptor_name).'?=', $this->receiptor_email); - return $this->receiptor_email; - } - - function setTitle($title) { - $this->title = $title; - } - - function getTitle() { - return '=?utf-8?b?'.base64_encode($this->title).'?='; - } - - function setBCC($bcc) - { - $this->bcc = $bcc; - } - - function setMessageID($messageId) { - $this->messageId = $messageId; - } - - function setReferences($references) { - $this->references = $references; - } - - function setReplyTo($replyTo) - { - $this->replyTo = $replyTo; - } - - function setContent($content) { - $content = preg_replace_callback('/]+)>/i',array($this,'replaceResourceRealPath'), $content); - $this->content = $content; - } - - function replaceResourceRealPath($matches) { - return preg_replace('/src=(["\']?)files/i','src=$1'.Context::getRequestUri().'files', $matches[0]); - } - - function getPlainContent() { - return chunk_split(base64_encode(str_replace(array("<",">","&"), array("<",">","&"), $this->content))); - } - - function getHTMLContent() { - return chunk_split(base64_encode($this->content_type!='html'?nl2br($this->content):$this->content)); - } - - function setContentType($mode = 'html') { - $this->content_type = $mode=='html'?'html':''; - } - - function procAttachments() - { - if(count($this->attachments) > 0) - { - $this->body = $this->header.$this->body; - $boundary = '----=='.uniqid(rand(),true); - $this->header = "Content-Type: multipart/mixed;".$this->eol."\tboundary=\"".$boundary."\"".$this->eol.$this->eol; - $this->body = "--".$boundary.$this->eol.$this->body.$this->eol.$this->eol; - $res = array(); - $res[] = $this->body; - foreach($this->attachments as $filename => $attachment) - { - $type = $this->returnMIMEType($filename); - $file_str = FileHandler::readFile($attachment); - $chunks = chunk_split(base64_encode($file_str)); - $tempBody = sprintf( - "--".$boundary.$this->eol. - "Content-Type: %s;".$this->eol. - "\tname=\"%s\"".$this->eol. - "Content-Transfer-Encoding: base64".$this->eol. - "Content-Description: %s".$this->eol. - "Content-Disposition: attachment;".$this->eol. - "\tfilename=\"%s\"".$this->eol.$this->eol. - "%s".$this->eol.$this->eol, - $type, - $filename, - $filename, - $filename, - $chunks); - $res[] = $tempBody; - } - $this->body = implode("", $res); - $this->body .= "--".$boundary."--"; - } - } - - function procCidAttachments() - { - if(count($this->cidAttachments) > 0) - { - $this->body = $this->header.$this->body; - $boundary = '----=='.uniqid(rand(),true); - $this->header = "Content-Type: multipart/relative;".$this->eol."\ttype=\"multipart/alternative\";".$this->eol."\tboundary=\"".$boundary."\"".$this->eol.$this->eol; - $this->body = "--".$boundary.$this->eol.$this->body.$this->eol.$this->eol; - $res = array(); - $res[] = $this->body; - foreach($this->cidAttachments as $cid => $attachment) - { - $filename = basename($attachment); - $type = $this->returnMIMEType(FileHandler::getRealPath($attachment)); - $file_str = FileHandler::readFile($attachment); - $chunks = chunk_split(base64_encode($file_str)); - $tempBody = sprintf( - "--".$boundary.$this->eol. - "Content-Type: %s;".$this->eol. - "\tname=\"%s\"".$this->eol. - "Content-Transfer-Encoding: base64".$this->eol. - "Content-ID: <%s>".$this->eol. - "Content-Description: %s".$this->eol. - "Content-Location: %s".$this->eol.$this->eol. - "%s".$this->eol.$this->eol, - $type, - $filename, - $cid, - $filename, - $filename, - $chunks); - $res[] = $tempBody; - } - $this->body = implode("", $res); - $this->body .= "--".$boundary."--"; - } - } - - - function send() { - $boundary = '----=='.uniqid(rand(),true); - $this->eol = $GLOBALS['_qmail_compatibility'] == "Y" ? "\n" : "\r\n"; - - $this->header = "Content-Type: multipart/alternative;".$this->eol."\tboundary=\"".$boundary."\"".$this->eol.$this->eol; - $this->body = sprintf( - "--%s".$this->eol. - "Content-Type: text/plain; charset=utf-8; format=flowed".$this->eol. - "Content-Transfer-Encoding: base64".$this->eol. - "Content-Disposition: inline".$this->eol.$this->eol. - "%s". - "--%s".$this->eol. - "Content-Type: text/html; charset=utf-8".$this->eol. - "Content-Transfer-Encoding: base64".$this->eol. - "Content-Disposition: inline".$this->eol.$this->eol. - "%s". - "--%s--". - "", - $boundary, - $this->getPlainContent(), - $boundary, - $this->getHTMLContent(), - $boundary - ); - - $this->procCidAttachments(); - $this->procAttachments(); - - $headers = sprintf( - "From: %s".$this->eol. - "%s". - "%s". - "%s". - "%s". - "MIME-Version: 1.0".$this->eol."", - $this->getSender(), - $this->messageId?("Message-ID: <".$this->messageId.">".$this->eol):"", - $this->replyTo?("Reply-To: <".$this->replyTo.">".$this->eol):"", - $this->bcc?("Bcc: ".$this->bcc.$this->eol):"", - $this->references?("References: <".$this->references.">".$this->eol."In-Reply-To: <".$this->references.">".$this->eol):"" - ); - $headers .= $this->header; - if($this->additional_params) return mail($this->getReceiptor(), $this->getTitle(), $this->body, $headers, $this->additional_params); - return mail($this->getReceiptor(), $this->getTitle(), $this->body, $headers); - } - - function checkMailMX($email_address) { - if(!Mail::isVaildMailAddress($email_address)) return false; - list($user, $host) = explode("@", $email_address); - if(function_exists('checkdnsrr')) { - if (checkdnsrr($host, "MX") or checkdnsrr($host, "A")) return true; - else return false; - } - return true; - } - - function isVaildMailAddress($email_address) { - if( preg_match("/([a-z0-9\_\-\.]+)@([a-z0-9\_\-\.]+)/i", $email_address) ) return $email_address; - else return ''; - } - - function returnMIMEType($filename) - { - preg_match("|\.([a-z0-9]{2,4})$|i", $filename, $fileSuffix); - - switch(strtolower($fileSuffix[1])) - { - case "js" : - return "application/x-javascript"; - - case "json" : - return "application/json"; - - case "jpg" : - case "jpeg" : - case "jpe" : - return "image/jpg"; - - case "png" : - case "gif" : - case "bmp" : - case "tiff" : - return "image/".strtolower($fileSuffix[1]); - - case "css" : - return "text/css"; - - case "xml" : - return "application/xml"; - - case "doc" : - case "docx" : - return "application/msword"; - - case "xls" : - case "xlt" : - case "xlm" : - case "xld" : - case "xla" : - case "xlc" : - case "xlw" : - case "xll" : - return "application/vnd.ms-excel"; - - case "ppt" : - case "pps" : - return "application/vnd.ms-powerpoint"; - - case "rtf" : - return "application/rtf"; - - case "pdf" : - return "application/pdf"; - - case "html" : - case "htm" : - case "php" : - return "text/html"; - - case "txt" : - return "text/plain"; - - case "mpeg" : - case "mpg" : - case "mpe" : - return "video/mpeg"; - - case "mp3" : - return "audio/mpeg3"; - - case "wav" : - return "audio/wav"; - - case "aiff" : - case "aif" : - return "audio/aiff"; - - case "avi" : - return "video/msvideo"; - - case "wmv" : - return "video/x-ms-wmv"; - - case "mov" : - return "video/quicktime"; - - case "zip" : - return "application/zip"; - - case "tar" : - return "application/x-tar"; - - case "swf" : - return "application/x-shockwave-flash"; - - default : - if(function_exists("mime_content_type")) - { - $fileSuffix = mime_content_type($filename); - } - - return "unknown/" . trim($fileSuffix[0], "."); - } - } - } -?> +additional_params = $additional_params; + } + + function addAttachment($filename, $orgfilename) + { + $this->attachments[$orgfilename] = $filename; + } + + function addCidAttachment($filename, $cid) + { + $this->cidAttachments[$cid] = $filename; + } + + function setSender($name, $email) { + $this->sender_name = $name; + $this->sender_email = $email; + } + + function getSender() { + if(!stristr(PHP_OS, 'win') && $this->sender_name) return sprintf("%s <%s>", '=?utf-8?b?'.base64_encode($this->sender_name).'?=', $this->sender_email); + return $this->sender_email; + } + + function setReceiptor($name, $email) { + $this->receiptor_name = $name; + $this->receiptor_email = $email; + } + + function getReceiptor() { + if(!stristr(PHP_OS, 'win') && $this->receiptor_name && $this->receiptor_name != $this->receiptor_email) return sprintf("%s <%s>", '=?utf-8?b?'.base64_encode($this->receiptor_name).'?=', $this->receiptor_email); + return $this->receiptor_email; + } + + function setTitle($title) { + $this->title = $title; + } + + function getTitle() { + return '=?utf-8?b?'.base64_encode($this->title).'?='; + } + + function setBCC($bcc) + { + $this->bcc = $bcc; + } + + function setMessageID($messageId) { + $this->messageId = $messageId; + } + + function setReferences($references) { + $this->references = $references; + } + + function setReplyTo($replyTo) + { + $this->replyTo = $replyTo; + } + + function setContent($content) { + $content = preg_replace_callback('/]+)>/i',array($this,'replaceResourceRealPath'), $content); + $this->content = $content; + } + + function replaceResourceRealPath($matches) { + return preg_replace('/src=(["\']?)files/i','src=$1'.Context::getRequestUri().'files', $matches[0]); + } + + function getPlainContent() { + return chunk_split(base64_encode(str_replace(array("<",">","&"), array("<",">","&"), $this->content))); + } + + function getHTMLContent() { + return chunk_split(base64_encode($this->content_type!='html'?nl2br($this->content):$this->content)); + } + + function setContentType($mode = 'html') { + $this->content_type = $mode=='html'?'html':''; + } + + function procAttachments() + { + if(count($this->attachments) > 0) + { + $this->body = $this->header.$this->body; + $boundary = '----=='.uniqid(rand(),true); + $this->header = "Content-Type: multipart/mixed;".$this->eol."\tboundary=\"".$boundary."\"".$this->eol.$this->eol; + $this->body = "--".$boundary.$this->eol.$this->body.$this->eol.$this->eol; + $res = array(); + $res[] = $this->body; + foreach($this->attachments as $filename => $attachment) + { + $type = $this->returnMIMEType($filename); + $file_str = FileHandler::readFile($attachment); + $chunks = chunk_split(base64_encode($file_str)); + $tempBody = sprintf( + "--".$boundary.$this->eol. + "Content-Type: %s;".$this->eol. + "\tname=\"%s\"".$this->eol. + "Content-Transfer-Encoding: base64".$this->eol. + "Content-Description: %s".$this->eol. + "Content-Disposition: attachment;".$this->eol. + "\tfilename=\"%s\"".$this->eol.$this->eol. + "%s".$this->eol.$this->eol, + $type, + $filename, + $filename, + $filename, + $chunks); + $res[] = $tempBody; + } + $this->body = implode("", $res); + $this->body .= "--".$boundary."--"; + } + } + + function procCidAttachments() + { + if(count($this->cidAttachments) > 0) + { + $this->body = $this->header.$this->body; + $boundary = '----=='.uniqid(rand(),true); + $this->header = "Content-Type: multipart/relative;".$this->eol."\ttype=\"multipart/alternative\";".$this->eol."\tboundary=\"".$boundary."\"".$this->eol.$this->eol; + $this->body = "--".$boundary.$this->eol.$this->body.$this->eol.$this->eol; + $res = array(); + $res[] = $this->body; + foreach($this->cidAttachments as $cid => $attachment) + { + $filename = basename($attachment); + $type = $this->returnMIMEType(FileHandler::getRealPath($attachment)); + $file_str = FileHandler::readFile($attachment); + $chunks = chunk_split(base64_encode($file_str)); + $tempBody = sprintf( + "--".$boundary.$this->eol. + "Content-Type: %s;".$this->eol. + "\tname=\"%s\"".$this->eol. + "Content-Transfer-Encoding: base64".$this->eol. + "Content-ID: <%s>".$this->eol. + "Content-Description: %s".$this->eol. + "Content-Location: %s".$this->eol.$this->eol. + "%s".$this->eol.$this->eol, + $type, + $filename, + $cid, + $filename, + $filename, + $chunks); + $res[] = $tempBody; + } + $this->body = implode("", $res); + $this->body .= "--".$boundary."--"; + } + } + + + function send() { + $boundary = '----=='.uniqid(rand(),true); + $this->eol = $GLOBALS['_qmail_compatibility'] == "Y" ? "\n" : "\r\n"; + + $this->header = "Content-Type: multipart/alternative;".$this->eol."\tboundary=\"".$boundary."\"".$this->eol.$this->eol; + $this->body = sprintf( + "--%s".$this->eol. + "Content-Type: text/plain; charset=utf-8; format=flowed".$this->eol. + "Content-Transfer-Encoding: base64".$this->eol. + "Content-Disposition: inline".$this->eol.$this->eol. + "%s". + "--%s".$this->eol. + "Content-Type: text/html; charset=utf-8".$this->eol. + "Content-Transfer-Encoding: base64".$this->eol. + "Content-Disposition: inline".$this->eol.$this->eol. + "%s". + "--%s--". + "", + $boundary, + $this->getPlainContent(), + $boundary, + $this->getHTMLContent(), + $boundary + ); + + $this->procCidAttachments(); + $this->procAttachments(); + + $headers = sprintf( + "From: %s".$this->eol. + "%s". + "%s". + "%s". + "%s". + "MIME-Version: 1.0".$this->eol."", + $this->getSender(), + $this->messageId?("Message-ID: <".$this->messageId.">".$this->eol):"", + $this->replyTo?("Reply-To: <".$this->replyTo.">".$this->eol):"", + $this->bcc?("Bcc: ".$this->bcc.$this->eol):"", + $this->references?("References: <".$this->references.">".$this->eol."In-Reply-To: <".$this->references.">".$this->eol):"" + ); + $headers .= $this->header; + if($this->additional_params) return mail($this->getReceiptor(), $this->getTitle(), $this->body, $headers, $this->additional_params); + return mail($this->getReceiptor(), $this->getTitle(), $this->body, $headers); + } + + function checkMailMX($email_address) { + if(!Mail::isVaildMailAddress($email_address)) return false; + list($user, $host) = explode("@", $email_address); + if(function_exists('checkdnsrr')) { + if (checkdnsrr($host, "MX") or checkdnsrr($host, "A")) return true; + else return false; + } + return true; + } + + function isVaildMailAddress($email_address) { + if( preg_match("/([a-z0-9\_\-\.]+)@([a-z0-9\_\-\.]+)/i", $email_address) ) return $email_address; + else return ''; + } + + function returnMIMEType($filename) + { + preg_match("|\.([a-z0-9]{2,4})$|i", $filename, $fileSuffix); + + switch(strtolower($fileSuffix[1])) + { + case "js" : + return "application/x-javascript"; + + case "json" : + return "application/json"; + + case "jpg" : + case "jpeg" : + case "jpe" : + return "image/jpg"; + + case "png" : + case "gif" : + case "bmp" : + case "tiff" : + return "image/".strtolower($fileSuffix[1]); + + case "css" : + return "text/css"; + + case "xml" : + return "application/xml"; + + case "doc" : + case "docx" : + return "application/msword"; + + case "xls" : + case "xlt" : + case "xlm" : + case "xld" : + case "xla" : + case "xlc" : + case "xlw" : + case "xll" : + return "application/vnd.ms-excel"; + + case "ppt" : + case "pps" : + return "application/vnd.ms-powerpoint"; + + case "rtf" : + return "application/rtf"; + + case "pdf" : + return "application/pdf"; + + case "html" : + case "htm" : + case "php" : + return "text/html"; + + case "txt" : + return "text/plain"; + + case "mpeg" : + case "mpg" : + case "mpe" : + return "video/mpeg"; + + case "mp3" : + return "audio/mpeg3"; + + case "wav" : + return "audio/wav"; + + case "aiff" : + case "aif" : + return "audio/aiff"; + + case "avi" : + return "video/msvideo"; + + case "wmv" : + return "video/x-ms-wmv"; + + case "mov" : + return "video/quicktime"; + + case "zip" : + return "application/zip"; + + case "tar" : + return "application/x-tar"; + + case "swf" : + return "application/x-shockwave-flash"; + + default : + if(function_exists("mime_content_type")) + { + $fileSuffix = mime_content_type($filename); + } + + return "unknown/" . trim($fileSuffix[0], "."); + } + } + } +?> diff --git a/classes/module/ModuleHandler.class.php b/classes/module/ModuleHandler.class.php index b973eeb6e..9ff062dff 100644 --- a/classes/module/ModuleHandler.class.php +++ b/classes/module/ModuleHandler.class.php @@ -1,532 +1,532 @@ -module = 'install'; - $this->act = Context::get('act'); - return; - } - - // Set variables from request arguments - $this->module = $module?$module:Context::get('module'); - $this->act = $act?$act:Context::get('act'); - $this->mid = $mid?$mid:Context::get('mid'); - $this->document_srl = $document_srl?(int)$document_srl:(int)Context::get('document_srl'); - $this->module_srl = $module_srl?(int)$module_srl:(int)Context::get('module_srl'); - $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")); - if($this->mid && !preg_match("/^([a-z0-9\_\-]+)$/i",$this->mid)) die(Context::getLang("msg_invalid_request")); - if($this->act && !preg_match("/^([a-z0-9\_\-]+)$/i",$this->act)) die(Context::getLang("msg_invalid_request")); - - // execute addon (before module initialization) - $called_position = 'before_module_init'; - $oAddonController = &getController('addon'); - $addon_file = $oAddonController->getCacheFilePath(Mobile::isFromMobilePhone()?'mobile':'pc'); - @include($addon_file); - } - - /** - * @brief Initialization. It finds the target module based on module, mid, document_srl, and prepares to execute an action - * @return true: OK, false: redirected - **/ - function init() { - $oModuleModel = &getModel('module'); - $site_module_info = Context::get('site_module_info'); - - if(!$this->document_srl && $this->mid && $this->entry) { - $oDocumentModel = &getModel('document'); - $this->document_srl = $oDocumentModel->getDocumentSrlByAlias($this->mid, $this->entry); - if($this->document_srl) Context::set('document_srl', $this->document_srl); - } - - // Get module's information based on document_srl, if it's specified - if($this->document_srl && !$this->module) { - $module_info = $oModuleModel->getModuleInfoByDocumentSrl($this->document_srl); - - // If the document does not exist, remove document_srl - if(!$module_info) { - unset($this->document_srl); - } else { - // If it exists, compare mid based on the module information - // if mids are not matching, set it as the document's mid - if($this->mid != $module_info->mid) { - $this->mid = $module_info->mid; - Context::set('mid', $module_info->mid, true); - } - } - // if requested module is different from one of the document, remove the module information retrieved based on the document number - if($this->module && $module_info->module != $this->module) unset($module_info); - } - - // If module_info is not set yet, and there exists mid information, get module information based on the mid - if(!$module_info && $this->mid) { - $module_info = $oModuleModel->getModuleInfoByMid($this->mid, $site_module_info->site_srl); - //if($this->module && $module_info->module != $this->module) unset($module_info); - } - - // redirect, if module_site_srl and site_srl are different - if(!$this->module && !$module_info && $site_module_info->site_srl == 0 && $site_module_info->module_site_srl > 0) { - $site_info = $oModuleModel->getSiteInfo($site_module_info->module_site_srl); - header("location:".getNotEncodedSiteUrl($site_info->domain,'mid',$site_module_info->mid)); - return false; - } - - // If module_info is not set still, and $module does not exist, find the default module - if(!$module_info && !$this->module) $module_info = $site_module_info; - - if(!$module_info && !$this->module && $site_module_info->module_site_srl) $module_info = $site_module_info; - - // redirect, if site_srl of module_info is different from one of site's module_info - if($module_info && $module_info->site_srl != $site_module_info->site_srl && !isCrawler()) { - // If the module is of virtual site - if($module_info->site_srl) { - $site_info = $oModuleModel->getSiteInfo($module_info->site_srl); - $redirect_url = getNotEncodedSiteUrl($site_info->domain, 'mid',Context::get('mid'),'document_srl',Context::get('document_srl'),'module_srl',Context::get('module_srl'),'entry',Context::get('entry')); - // If it's called from a virtual site, though it's not a module of the virtual site - } else { - $db_info = Context::getDBInfo(); - if(!$db_info->default_url) return Context::getLang('msg_default_url_is_not_defined'); - else $redirect_url = getNotEncodedSiteUrl($db_info->default_url, 'mid',Context::get('mid'),'document_srl',Context::get('document_srl'),'module_srl',Context::get('module_srl'),'entry',Context::get('entry')); - } - header("location:".$redirect_url); - return false; - } - - // If module info was set, retrieve variables from the module information - if($module_info) { - $this->module = $module_info->module; - $this->mid = $module_info->mid; - $this->module_info = $module_info; - Context::setBrowserTitle($module_info->browser_title); - $part_config= $oModuleModel->getModulePartConfig('layout',$module_info->layout_srl); - Context::addHtmlHeader($part_config->header_script); - } - - // Set module and mid into module_info - $this->module_info->module = $this->module; - $this->module_info->mid = $this->mid; - - // Still no module? it's an error - if(!$this->module) $this->error = 'msg_module_does_not_exist'; - - // If mid exists, set mid into context - if($this->mid) Context::set('mid', $this->mid, true); - - // Call a trigger after moduleHandler init - $output = ModuleHandler::triggerCall('moduleHandler.init', 'after', $this->module_info); - if(!$output->toBool()) { - $this->error = $output->getMessage(); - return false; - } - - // Set current module info into context - Context::set('current_module_info', $this->module_info); - - return true; - } - - /** - * @brief get a module instance and execute an action - * @return executed module instance - **/ - function procModule() { - // If error occurred while preparation, return a message instance - if($this->error) { - $type = Mobile::isFromMobilePhone() ? 'mobile' : 'view'; - $oMessageObject = &ModuleHandler::getModuleInstance('message',$type); - $oMessageObject->setError(-1); - $oMessageObject->setMessage($this->error); - $oMessageObject->dispMessage(); - return $oMessageObject; - } - - $oModuleModel = &getModel('module'); - - // Get action information with conf/action.xml - $xml_info = $oModuleModel->getModuleActionXml($this->module); - - // If not installed yet, modify act - if($this->module=="install") { - if(!$this->act || !$xml_info->action->{$this->act}) $this->act = $xml_info->default_index_act; - } - - // if act exists, find type of the action, if not use default index act - if(!$this->act) $this->act = $xml_info->default_index_act; - - // still no act means error - if(!$this->act) { - $this->error = 'msg_module_does_not_exist'; - return; - } - - // get type, kind - $type = $xml_info->action->{$this->act}->type; - $kind = strpos(strtolower($this->act),'admin')!==false?'admin':''; - if(!$kind && $this->module == 'admin') $kind = 'admin'; - if($this->module_info->use_mobile != "Y") Mobile::setMobile(false); - - // if(type == view, and case for using mobilephone) - if($type == "view" && Mobile::isFromMobilePhone() && Context::isInstalled()) - { - $orig_type = "view"; - $type = "mobile"; - // create a module instance - $oModule = &$this->getModuleInstance($this->module, $type, $kind); - if(!is_object($oModule) || !method_exists($oModule, $this->act)) { - $type = $orig_type; - Mobile::setMobile(false); - $oModule = &$this->getModuleInstance($this->module, $type, $kind); - } - } - else - { - // create a module instance - $oModule = &$this->getModuleInstance($this->module, $type, $kind); - } - - if(!is_object($oModule)) { - $this->error = 'msg_module_does_not_exist'; - return; - } - - // If there is no such action in the module object - if(!isset($xml_info->action->{$this->act}) || !method_exists($oModule, $this->act)) - { - if(!Context::isInstalled()) - { - $this->error = 'msg_invalid_request'; - return; - } - - $forward = null; - // 1. Look for the module with action name - if(preg_match('/^([a-z]+)([A-Z])([a-z0-9\_]+)(.*)$/', $this->act, $matches)) { - $module = strtolower($matches[2].$matches[3]); - $xml_info = $oModuleModel->getModuleActionXml($module); - if($xml_info->action->{$this->act}) { - $forward->module = $module; - $forward->type = $xml_info->action->{$this->act}->type; - $forward->act = $this->act; - } - } - - if(!$forward) - { - $forward = $oModuleModel->getActionForward($this->act); - } - - if($forward->module && $forward->type && $forward->act && $forward->act == $this->act) { - $kind = strpos(strtolower($forward->act),'admin')!==false?'admin':''; - $type = $forward->type; - $tpl_path = $oModule->getTemplatePath(); - $orig_module = $oModule; - - if($type == "view" && Mobile::isFromMobilePhone()) - { - $orig_type = "view"; - $type = "mobile"; - // create a module instance - $oModule = &$this->getModuleInstance($forward->module, $type, $kind); - if(!is_object($oModule) || !method_exists($oModule, $this->act)) { - $type = $orig_type; - Mobile::setMobile(false); - $oModule = &$this->getModuleInstance($forward->module, $type, $kind); - } - } - else - { - $oModule = &$this->getModuleInstance($forward->module, $type, $kind); - } - $xml_info = $oModuleModel->getModuleActionXml($forward->module); - if($this->module == "admin" && $type == "view") - { - $oMemberModel = &getModel('member'); - - $logged_info = $oMemberModel->getLoggedInfo(); - if($logged_info->is_admin=='Y') { - $orig_module->loadSideBar(); - $oModule->setLayoutPath("./modules/admin/tpl"); - $oModule->setLayoutFile("layout.html"); - } - } - } - else if($xml_info->default_index_act && method_exists($oModule, $xml_info->default_index_act)) - { - $this->act = $xml_info->default_index_act; - } - else - { - $this->error = 'msg_invalid_request'; - return; - } - } - - $oModule->setAct($this->act); - - $this->module_info->module_type = $type; - $oModule->setModuleInfo($this->module_info, $xml_info); - - // execute the action, and if failed, set error - if(!$oModule->proc()) $this->error = $oModule->getMessage(); - - return $oModule; - } - - /** - * @brief display contents from executed module - * @param[in] $oModule module instance - * @return none - **/ - function displayContent($oModule = NULL) { - // If the module is not set or not an object, set error - if(!$oModule || !is_object($oModule)) { - $this->error = 'msg_module_does_not_exists'; - } - - // If connection to DB has a problem even though it's not install module, set error - if($this->module != 'install' && $GLOBALS['__DB__'][Context::getDBType()]->is_connected == false) { - $this->error = 'msg_dbconnect_failed'; - } - - // Call trigger after moduleHandler proc - $output = ModuleHandler::triggerCall('moduleHandler.proc', 'after', $oModule); - if(!$output->toBool()) $this->error = $output->getMessage(); - - // Use message view object, if HTML call - if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) { - // If error occurred, handle it - if($this->error) { - // display content with message module instance - $type = Mobile::isFromMobilePhone() ? 'mobile' : 'view'; - $oMessageObject = &ModuleHandler::getModuleInstance('message',$type); - $oMessageObject->setError(-1); - $oMessageObject->setMessage($this->error); - $oMessageObject->dispMessage(); - - // If module was called normally, change the templates of the module into ones of the message view module - if($oModule) { - $oModule->setTemplatePath($oMessageObject->getTemplatePath()); - $oModule->setTemplateFile($oMessageObject->getTemplateFile()); - - // Otherwise, set message instance as the target module - } else { - $oModule = $oMessageObject; - } - } - - // Check if layout_srl exists for the module - if(Mobile::isFromMobilePhone()) - { - $layout_srl = $oModule->module_info->mlayout_srl; - } - else - { - $layout_srl = $oModule->module_info->layout_srl; - } - - if($layout_srl && !$oModule->getLayoutFile()) { - - // If layout_srl exists, get information of the layout, and set the location of layout_path/ layout_file - $oLayoutModel = &getModel('layout'); - $layout_info = $oLayoutModel->getLayout($layout_srl); - if($layout_info) { - - // Input extra_vars into $layout_info - if($layout_info->extra_var_count) { - - foreach($layout_info->extra_var as $var_id => $val) { - if($val->type == 'image') { - if(preg_match('/^\.\/files\/attach\/images\/(.+)/i',$val->value)) $val->value = Context::getRequestUri().substr($val->value,2); - } - $layout_info->{$var_id} = $val->value; - } - } - // Set menus into context - if($layout_info->menu_count) { - foreach($layout_info->menu as $menu_id => $menu) { - if(file_exists($menu->php_file)) @include($menu->php_file); - Context::set($menu_id, $menu); - } - } - - // Set layout information into context - Context::set('layout_info', $layout_info); - - $oModule->setLayoutPath($layout_info->path); - $oModule->setLayoutFile('layout'); - - // If layout was modified, use the modified version - $edited_layout = $oLayoutModel->getUserLayoutHtml($layout_info->layout_srl); - if(file_exists($edited_layout)) $oModule->setEditedLayoutFile($edited_layout); - } - } - } - - // Display contents - $oDisplayHandler = new DisplayHandler(); - $oDisplayHandler->printContent($oModule); - } - - /** - * @brief returns module's path - * @param[in] $module module name - * @return path of the module - **/ - function getModulePath($module) { - return sprintf('./modules/%s/', $module); - } - - /** - * @brief It creates a module instance - * @param[in] $module module name - * @param[in] $type instance type, (e.g., view, controller, model) - * @param[in] $kind admin or svc - * @return module instance (if failed it returns null) - * @remarks if there exists a module instance created before, returns it. - **/ - function &getModuleInstance($module, $type = 'view', $kind = '') { - - if(__DEBUG__==3) $start_time = getMicroTime(); - - $kind = strtolower($kind); - $type = strtolower($type); - - $kinds = explode(' ', 'svc admin'); - if(!in_array($kind, $kinds)) $kind = $kinds[0]; - - $key = $module.'.'.($kind!='admin'?'':'admin').'.'.$type; - - if(is_array($GLOBALS['__MODULE_EXTEND__']) && array_key_exists($key, $GLOBALS['__MODULE_EXTEND__'])) { - $module = $extend_module = $GLOBALS['__MODULE_EXTEND__'][$key]; - }else{ - unset($parent_module); - } - - // if there is no instance of the module in global variable, create a new one - if(!$GLOBALS['_loaded_module'][$module][$type][$kind]) { - $parent_module = $module; - - $class_path = ModuleHandler::getModulePath($module); - if(!is_dir(FileHandler::getRealPath($class_path))) return NULL; - - // Get base class name and load the file contains it - if(!class_exists($module)) { - $high_class_file = sprintf('%s%s%s.class.php', _XE_PATH_,$class_path, $module); - if(!file_exists($high_class_file)) return NULL; - require_once($high_class_file); - } - - // Get the object's name - $types = explode(' ', 'view controller model api wap mobile class'); - if(!in_array($type, $types)) $type = $types[0]; - if($type == 'class') { - $instance_name = '%s'; - $class_file = '%s%s.%s.php'; - } elseif($kind == 'admin' && array_search($type, $types) < 3) { - $instance_name = '%sAdmin%s'; - $class_file = '%s%s.admin.%s.php'; - } else{ - $instance_name = '%s%s'; - $class_file = '%s%s.%s.php'; - } - $instance_name = sprintf($instance_name, $module, ucfirst($type)); - $class_file = sprintf($class_file, $class_path, $module, $type); - $class_file = FileHandler::getRealPath($class_file); - - // Get the name of the class file - if(!is_readable($class_file)) return NULL; - - // Create an instance with eval function - require_once($class_file); - if(!class_exists($instance_name)) return NULL; - $tmp_fn = create_function('', "return new {$instance_name}();"); - $oModule = $tmp_fn(); - if(!is_object($oModule)) return NULL; - - // Load language files for the class - Context::loadLang($class_path.'lang'); - if($extend_module) { - Context::loadLang(ModuleHandler::getModulePath($parent_module).'lang'); - } - - // Set variables to the instance - $oModule->setModule($module); - $oModule->setModulePath($class_path); - - // If the module has a constructor, run it. - if(!isset($GLOBALS['_called_constructor'][$instance_name])) { - $GLOBALS['_called_constructor'][$instance_name] = true; - if(@method_exists($oModule, $instance_name)) $oModule->{$instance_name}(); - } - - // Store the created instance into GLOBALS variable - $GLOBALS['_loaded_module'][$module][$type][$kind] = $oModule; - } - - if(__DEBUG__==3) $GLOBALS['__elapsed_class_load__'] += getMicroTime() - $start_time; - - // return the instance - return $GLOBALS['_loaded_module'][$module][$type][$kind]; - } - - /** - * @brief call a trigger - * @param[in] $trigger_name trigger's name to call - * @param[in] $called_position called position - * @param[in] $obj an object as a parameter to trigger - * @return Object - **/ - function triggerCall($trigger_name, $called_position, &$obj) { - // skip if not installed - if(!Context::isInstalled()) return new Object(); - - $oModuleModel = &getModel('module'); - $triggers = $oModuleModel->getTriggers($trigger_name, $called_position); - if(!$triggers || !count($triggers)) return new Object(); - - foreach($triggers as $item) { - $module = $item->module; - $type = $item->type; - $called_method = $item->called_method; - - $oModule = null; - $oModule = &getModule($module, $type); - if(!$oModule || !method_exists($oModule, $called_method)) continue; - - $output = $oModule->{$called_method}($obj); - if(is_object($output) && method_exists($output, 'toBool') && !$output->toBool()) return $output; - unset($oModule); - } - - return new Object(); - } - } -?> +module = 'install'; + $this->act = Context::get('act'); + return; + } + + // Set variables from request arguments + $this->module = $module?$module:Context::get('module'); + $this->act = $act?$act:Context::get('act'); + $this->mid = $mid?$mid:Context::get('mid'); + $this->document_srl = $document_srl?(int)$document_srl:(int)Context::get('document_srl'); + $this->module_srl = $module_srl?(int)$module_srl:(int)Context::get('module_srl'); + $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")); + if($this->mid && !preg_match("/^([a-z0-9\_\-]+)$/i",$this->mid)) die(Context::getLang("msg_invalid_request")); + if($this->act && !preg_match("/^([a-z0-9\_\-]+)$/i",$this->act)) die(Context::getLang("msg_invalid_request")); + + // execute addon (before module initialization) + $called_position = 'before_module_init'; + $oAddonController = &getController('addon'); + $addon_file = $oAddonController->getCacheFilePath(Mobile::isFromMobilePhone()?'mobile':'pc'); + @include($addon_file); + } + + /** + * @brief Initialization. It finds the target module based on module, mid, document_srl, and prepares to execute an action + * @return true: OK, false: redirected + **/ + function init() { + $oModuleModel = &getModel('module'); + $site_module_info = Context::get('site_module_info'); + + if(!$this->document_srl && $this->mid && $this->entry) { + $oDocumentModel = &getModel('document'); + $this->document_srl = $oDocumentModel->getDocumentSrlByAlias($this->mid, $this->entry); + if($this->document_srl) Context::set('document_srl', $this->document_srl); + } + + // Get module's information based on document_srl, if it's specified + if($this->document_srl && !$this->module) { + $module_info = $oModuleModel->getModuleInfoByDocumentSrl($this->document_srl); + + // If the document does not exist, remove document_srl + if(!$module_info) { + unset($this->document_srl); + } else { + // If it exists, compare mid based on the module information + // if mids are not matching, set it as the document's mid + if($this->mid != $module_info->mid) { + $this->mid = $module_info->mid; + Context::set('mid', $module_info->mid, true); + } + } + // if requested module is different from one of the document, remove the module information retrieved based on the document number + if($this->module && $module_info->module != $this->module) unset($module_info); + } + + // If module_info is not set yet, and there exists mid information, get module information based on the mid + if(!$module_info && $this->mid) { + $module_info = $oModuleModel->getModuleInfoByMid($this->mid, $site_module_info->site_srl); + //if($this->module && $module_info->module != $this->module) unset($module_info); + } + + // redirect, if module_site_srl and site_srl are different + if(!$this->module && !$module_info && $site_module_info->site_srl == 0 && $site_module_info->module_site_srl > 0) { + $site_info = $oModuleModel->getSiteInfo($site_module_info->module_site_srl); + header("location:".getNotEncodedSiteUrl($site_info->domain,'mid',$site_module_info->mid)); + return false; + } + + // If module_info is not set still, and $module does not exist, find the default module + if(!$module_info && !$this->module) $module_info = $site_module_info; + + if(!$module_info && !$this->module && $site_module_info->module_site_srl) $module_info = $site_module_info; + + // redirect, if site_srl of module_info is different from one of site's module_info + if($module_info && $module_info->site_srl != $site_module_info->site_srl && !isCrawler()) { + // If the module is of virtual site + if($module_info->site_srl) { + $site_info = $oModuleModel->getSiteInfo($module_info->site_srl); + $redirect_url = getNotEncodedSiteUrl($site_info->domain, 'mid',Context::get('mid'),'document_srl',Context::get('document_srl'),'module_srl',Context::get('module_srl'),'entry',Context::get('entry')); + // If it's called from a virtual site, though it's not a module of the virtual site + } else { + $db_info = Context::getDBInfo(); + if(!$db_info->default_url) return Context::getLang('msg_default_url_is_not_defined'); + else $redirect_url = getNotEncodedSiteUrl($db_info->default_url, 'mid',Context::get('mid'),'document_srl',Context::get('document_srl'),'module_srl',Context::get('module_srl'),'entry',Context::get('entry')); + } + header("location:".$redirect_url); + return false; + } + + // If module info was set, retrieve variables from the module information + if($module_info) { + $this->module = $module_info->module; + $this->mid = $module_info->mid; + $this->module_info = $module_info; + Context::setBrowserTitle($module_info->browser_title); + $part_config= $oModuleModel->getModulePartConfig('layout',$module_info->layout_srl); + Context::addHtmlHeader($part_config->header_script); + } + + // Set module and mid into module_info + $this->module_info->module = $this->module; + $this->module_info->mid = $this->mid; + + // Still no module? it's an error + if(!$this->module) $this->error = 'msg_module_does_not_exist'; + + // If mid exists, set mid into context + if($this->mid) Context::set('mid', $this->mid, true); + + // Call a trigger after moduleHandler init + $output = ModuleHandler::triggerCall('moduleHandler.init', 'after', $this->module_info); + if(!$output->toBool()) { + $this->error = $output->getMessage(); + return false; + } + + // Set current module info into context + Context::set('current_module_info', $this->module_info); + + return true; + } + + /** + * @brief get a module instance and execute an action + * @return executed module instance + **/ + function procModule() { + // If error occurred while preparation, return a message instance + if($this->error) { + $type = Mobile::isFromMobilePhone() ? 'mobile' : 'view'; + $oMessageObject = &ModuleHandler::getModuleInstance('message',$type); + $oMessageObject->setError(-1); + $oMessageObject->setMessage($this->error); + $oMessageObject->dispMessage(); + return $oMessageObject; + } + + $oModuleModel = &getModel('module'); + + // Get action information with conf/action.xml + $xml_info = $oModuleModel->getModuleActionXml($this->module); + + // If not installed yet, modify act + if($this->module=="install") { + if(!$this->act || !$xml_info->action->{$this->act}) $this->act = $xml_info->default_index_act; + } + + // if act exists, find type of the action, if not use default index act + if(!$this->act) $this->act = $xml_info->default_index_act; + + // still no act means error + if(!$this->act) { + $this->error = 'msg_module_does_not_exist'; + return; + } + + // get type, kind + $type = $xml_info->action->{$this->act}->type; + $kind = strpos(strtolower($this->act),'admin')!==false?'admin':''; + if(!$kind && $this->module == 'admin') $kind = 'admin'; + if($this->module_info->use_mobile != "Y") Mobile::setMobile(false); + + // if(type == view, and case for using mobilephone) + if($type == "view" && Mobile::isFromMobilePhone() && Context::isInstalled()) + { + $orig_type = "view"; + $type = "mobile"; + // create a module instance + $oModule = &$this->getModuleInstance($this->module, $type, $kind); + if(!is_object($oModule) || !method_exists($oModule, $this->act)) { + $type = $orig_type; + Mobile::setMobile(false); + $oModule = &$this->getModuleInstance($this->module, $type, $kind); + } + } + else + { + // create a module instance + $oModule = &$this->getModuleInstance($this->module, $type, $kind); + } + + if(!is_object($oModule)) { + $this->error = 'msg_module_does_not_exist'; + return; + } + + // If there is no such action in the module object + if(!isset($xml_info->action->{$this->act}) || !method_exists($oModule, $this->act)) + { + if(!Context::isInstalled()) + { + $this->error = 'msg_invalid_request'; + return; + } + + $forward = null; + // 1. Look for the module with action name + if(preg_match('/^([a-z]+)([A-Z])([a-z0-9\_]+)(.*)$/', $this->act, $matches)) { + $module = strtolower($matches[2].$matches[3]); + $xml_info = $oModuleModel->getModuleActionXml($module); + if($xml_info->action->{$this->act}) { + $forward->module = $module; + $forward->type = $xml_info->action->{$this->act}->type; + $forward->act = $this->act; + } + } + + if(!$forward) + { + $forward = $oModuleModel->getActionForward($this->act); + } + + if($forward->module && $forward->type && $forward->act && $forward->act == $this->act) { + $kind = strpos(strtolower($forward->act),'admin')!==false?'admin':''; + $type = $forward->type; + $tpl_path = $oModule->getTemplatePath(); + $orig_module = $oModule; + + if($type == "view" && Mobile::isFromMobilePhone()) + { + $orig_type = "view"; + $type = "mobile"; + // create a module instance + $oModule = &$this->getModuleInstance($forward->module, $type, $kind); + if(!is_object($oModule) || !method_exists($oModule, $this->act)) { + $type = $orig_type; + Mobile::setMobile(false); + $oModule = &$this->getModuleInstance($forward->module, $type, $kind); + } + } + else + { + $oModule = &$this->getModuleInstance($forward->module, $type, $kind); + } + $xml_info = $oModuleModel->getModuleActionXml($forward->module); + if($this->module == "admin" && $type == "view") + { + $oMemberModel = &getModel('member'); + + $logged_info = $oMemberModel->getLoggedInfo(); + if($logged_info->is_admin=='Y') { + $orig_module->loadSideBar(); + $oModule->setLayoutPath("./modules/admin/tpl"); + $oModule->setLayoutFile("layout.html"); + } + } + } + else if($xml_info->default_index_act && method_exists($oModule, $xml_info->default_index_act)) + { + $this->act = $xml_info->default_index_act; + } + else + { + $this->error = 'msg_invalid_request'; + return; + } + } + + $oModule->setAct($this->act); + + $this->module_info->module_type = $type; + $oModule->setModuleInfo($this->module_info, $xml_info); + + // execute the action, and if failed, set error + if(!$oModule->proc()) $this->error = $oModule->getMessage(); + + return $oModule; + } + + /** + * @brief display contents from executed module + * @param[in] $oModule module instance + * @return none + **/ + function displayContent($oModule = NULL) { + // If the module is not set or not an object, set error + if(!$oModule || !is_object($oModule)) { + $this->error = 'msg_module_does_not_exists'; + } + + // If connection to DB has a problem even though it's not install module, set error + if($this->module != 'install' && $GLOBALS['__DB__'][Context::getDBType()]->is_connected == false) { + $this->error = 'msg_dbconnect_failed'; + } + + // Call trigger after moduleHandler proc + $output = ModuleHandler::triggerCall('moduleHandler.proc', 'after', $oModule); + if(!$output->toBool()) $this->error = $output->getMessage(); + + // Use message view object, if HTML call + if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) { + // If error occurred, handle it + if($this->error) { + // display content with message module instance + $type = Mobile::isFromMobilePhone() ? 'mobile' : 'view'; + $oMessageObject = &ModuleHandler::getModuleInstance('message',$type); + $oMessageObject->setError(-1); + $oMessageObject->setMessage($this->error); + $oMessageObject->dispMessage(); + + // If module was called normally, change the templates of the module into ones of the message view module + if($oModule) { + $oModule->setTemplatePath($oMessageObject->getTemplatePath()); + $oModule->setTemplateFile($oMessageObject->getTemplateFile()); + + // Otherwise, set message instance as the target module + } else { + $oModule = $oMessageObject; + } + } + + // Check if layout_srl exists for the module + if(Mobile::isFromMobilePhone()) + { + $layout_srl = $oModule->module_info->mlayout_srl; + } + else + { + $layout_srl = $oModule->module_info->layout_srl; + } + + if($layout_srl && !$oModule->getLayoutFile()) { + + // If layout_srl exists, get information of the layout, and set the location of layout_path/ layout_file + $oLayoutModel = &getModel('layout'); + $layout_info = $oLayoutModel->getLayout($layout_srl); + if($layout_info) { + + // Input extra_vars into $layout_info + if($layout_info->extra_var_count) { + + foreach($layout_info->extra_var as $var_id => $val) { + if($val->type == 'image') { + if(preg_match('/^\.\/files\/attach\/images\/(.+)/i',$val->value)) $val->value = Context::getRequestUri().substr($val->value,2); + } + $layout_info->{$var_id} = $val->value; + } + } + // Set menus into context + if($layout_info->menu_count) { + foreach($layout_info->menu as $menu_id => $menu) { + if(file_exists($menu->php_file)) @include($menu->php_file); + Context::set($menu_id, $menu); + } + } + + // Set layout information into context + Context::set('layout_info', $layout_info); + + $oModule->setLayoutPath($layout_info->path); + $oModule->setLayoutFile('layout'); + + // If layout was modified, use the modified version + $edited_layout = $oLayoutModel->getUserLayoutHtml($layout_info->layout_srl); + if(file_exists($edited_layout)) $oModule->setEditedLayoutFile($edited_layout); + } + } + } + + // Display contents + $oDisplayHandler = new DisplayHandler(); + $oDisplayHandler->printContent($oModule); + } + + /** + * @brief returns module's path + * @param[in] $module module name + * @return path of the module + **/ + function getModulePath($module) { + return sprintf('./modules/%s/', $module); + } + + /** + * @brief It creates a module instance + * @param[in] $module module name + * @param[in] $type instance type, (e.g., view, controller, model) + * @param[in] $kind admin or svc + * @return module instance (if failed it returns null) + * @remarks if there exists a module instance created before, returns it. + **/ + function &getModuleInstance($module, $type = 'view', $kind = '') { + + if(__DEBUG__==3) $start_time = getMicroTime(); + + $kind = strtolower($kind); + $type = strtolower($type); + + $kinds = explode(' ', 'svc admin'); + if(!in_array($kind, $kinds)) $kind = $kinds[0]; + + $key = $module.'.'.($kind!='admin'?'':'admin').'.'.$type; + + if(is_array($GLOBALS['__MODULE_EXTEND__']) && array_key_exists($key, $GLOBALS['__MODULE_EXTEND__'])) { + $module = $extend_module = $GLOBALS['__MODULE_EXTEND__'][$key]; + }else{ + unset($parent_module); + } + + // if there is no instance of the module in global variable, create a new one + if(!$GLOBALS['_loaded_module'][$module][$type][$kind]) { + $parent_module = $module; + + $class_path = ModuleHandler::getModulePath($module); + if(!is_dir(FileHandler::getRealPath($class_path))) return NULL; + + // Get base class name and load the file contains it + if(!class_exists($module)) { + $high_class_file = sprintf('%s%s%s.class.php', _XE_PATH_,$class_path, $module); + if(!file_exists($high_class_file)) return NULL; + require_once($high_class_file); + } + + // Get the object's name + $types = explode(' ', 'view controller model api wap mobile class'); + if(!in_array($type, $types)) $type = $types[0]; + if($type == 'class') { + $instance_name = '%s'; + $class_file = '%s%s.%s.php'; + } elseif($kind == 'admin' && array_search($type, $types) < 3) { + $instance_name = '%sAdmin%s'; + $class_file = '%s%s.admin.%s.php'; + } else{ + $instance_name = '%s%s'; + $class_file = '%s%s.%s.php'; + } + $instance_name = sprintf($instance_name, $module, ucfirst($type)); + $class_file = sprintf($class_file, $class_path, $module, $type); + $class_file = FileHandler::getRealPath($class_file); + + // Get the name of the class file + if(!is_readable($class_file)) return NULL; + + // Create an instance with eval function + require_once($class_file); + if(!class_exists($instance_name)) return NULL; + $tmp_fn = create_function('', "return new {$instance_name}();"); + $oModule = $tmp_fn(); + if(!is_object($oModule)) return NULL; + + // Load language files for the class + Context::loadLang($class_path.'lang'); + if($extend_module) { + Context::loadLang(ModuleHandler::getModulePath($parent_module).'lang'); + } + + // Set variables to the instance + $oModule->setModule($module); + $oModule->setModulePath($class_path); + + // If the module has a constructor, run it. + if(!isset($GLOBALS['_called_constructor'][$instance_name])) { + $GLOBALS['_called_constructor'][$instance_name] = true; + if(@method_exists($oModule, $instance_name)) $oModule->{$instance_name}(); + } + + // Store the created instance into GLOBALS variable + $GLOBALS['_loaded_module'][$module][$type][$kind] = $oModule; + } + + if(__DEBUG__==3) $GLOBALS['__elapsed_class_load__'] += getMicroTime() - $start_time; + + // return the instance + return $GLOBALS['_loaded_module'][$module][$type][$kind]; + } + + /** + * @brief call a trigger + * @param[in] $trigger_name trigger's name to call + * @param[in] $called_position called position + * @param[in] $obj an object as a parameter to trigger + * @return Object + **/ + function triggerCall($trigger_name, $called_position, &$obj) { + // skip if not installed + if(!Context::isInstalled()) return new Object(); + + $oModuleModel = &getModel('module'); + $triggers = $oModuleModel->getTriggers($trigger_name, $called_position); + if(!$triggers || !count($triggers)) return new Object(); + + foreach($triggers as $item) { + $module = $item->module; + $type = $item->type; + $called_method = $item->called_method; + + $oModule = null; + $oModule = &getModule($module, $type); + if(!$oModule || !method_exists($oModule, $called_method)) continue; + + $output = $oModule->{$called_method}($obj); + if(is_object($output) && method_exists($output, 'toBool') && !$output->toBool()) return $output; + unset($oModule); + } + + return new Object(); + } + } +?> diff --git a/classes/module/ModuleObject.class.php b/classes/module/ModuleObject.class.php index 35f0fba01..7019a23ae 100644 --- a/classes/module/ModuleObject.class.php +++ b/classes/module/ModuleObject.class.php @@ -1,311 +1,311 @@ -module = $module; - } - - /** - * @brief setter to set the name of module path - * @param the directory path to a module directory - **/ - function setModulePath($path) { - if(substr($path,-1)!='/') $path.='/'; - $this->module_path = $path; - } - - /** - * @brief setter to set an url for redirection - * @param $url url for redirection - * @remark redirect_url is used only for ajax requests - **/ - function setRedirectUrl($url='./') { - $this->add('redirect_url', $url); - } - - /** - * @brief sett to set the template path for refresh.html - * @remark refresh.html is executed as a result of method execution - * 공통 tpl중 refresh.html을 실행할 뿐.. - **/ - function setRefreshPage() { - $this->setTemplatePath('./common/tpl'); - $this->setTemplateFile('refresh'); - } - - - /** - * @brief sett to set the action name - **/ - function setAct($act) { - $this->act = $act; - } - - /** - * @brief sett to set module information - * @param[in] $module_info object containing module information - * @param[in] $xml_info object containing module description - **/ - function setModuleInfo($module_info, $xml_info) { - // 기본 변수 설정 - $this->mid = $module_info->mid; - $this->module_srl = $module_info->module_srl; - $this->module_info = $module_info; - $this->xml_info = $xml_info; - $this->skin_vars = $module_info->skin_vars; - - // 웹서비스에서 꼭 필요한 인증 정보와 권한 설정 체크 - $is_logged = Context::get('is_logged'); - $logged_info = Context::get('logged_info'); - - // module model 객체 생성 - $oModuleModel = &getModel('module'); - - // XE에서 access, manager (== is_admin) 는 고정된 권한명이며 이와 관련된 권한 설정 - $module_srl = Context::get('module_srl'); - if(!$module_info->mid && preg_match('/^([0-9]+)$/',$module_srl)) { - $request_module = $oModuleModel->getModuleInfoByModuleSrl($module_srl); - if($request_module->module_srl == $module_srl) { - $grant = $oModuleModel->getGrant($request_module, $logged_info); - } - } else { - $grant = $oModuleModel->getGrant($module_info, $logged_info, $xml_info); - } - - // 현재 모듈의 access 권한이 없으면 권한 없음 표시 - //if(!$grant->access) return $this->stop("msg_not_permitted"); - - // 관리 권한이 없으면 permision, action 확인 - if(!$grant->manager) { - // 현재 요청된 action의 퍼미션 type(guest, member, manager, root)를 구함 - $permission_target = $xml_info->permission->{$this->act}; - - // module.xml에 명시된 퍼미션이 없을때 action명에 Admin이 있으면 manager로 체크 - if(!$permission_target && substr_count($this->act, 'Admin')) $permission_target = 'manager'; - - // 권한 체크 - switch($permission_target) { - case 'root' : - $this->stop('msg_not_permitted_act'); - break; - case 'manager' : - if(!$grant->manager) $this->stop('msg_not_permitted_act'); - break; - case 'member' : - if(!$is_logged) $this->stop('msg_not_permitted_act'); - break; - } - } - - // 권한변수 설정 - $this->grant = $grant; - Context::set('grant', $grant); - - if(method_exists($this, 'init')) $this->init(); - } - - /** - * @brief set the stop_proc and approprate message for msg_code - * @param $msg_code an error code - **/ - function stop($msg_code) { - // proc 수행을 중지 시키기 위한 플래그 세팅 - $this->stop_proc = true; - - // 에러 처리 - $this->setError(-1); - $this->setMessage($msg_code); - - // message 모듈의 에러 표시 - $type = Mobile::isFromMobilePhone() ? 'mobile' : 'view'; - $oMessageObject = &ModuleHandler::getModuleInstance('message',$type); - $oMessageObject->setError(-1); - $oMessageObject->setMessage($msg_code); - $oMessageObject->dispMessage(); - - $this->setTemplatePath($oMessageObject->getTemplatePath()); - $this->setTemplateFile($oMessageObject->getTemplateFile()); - - return $this; - } - - /** - * @brief set the file name of the template file - **/ - function setTemplateFile($filename) { - if(substr($filename,-5)!='.html') $filename .= '.html'; - $this->template_file = $filename; - } - - /** - * @brief retrieve the directory path of the template directory - **/ - function getTemplateFile() { - return $this->template_file; - } - - /** - * @brief set the directory path of the template directory - **/ - function setTemplatePath($path) { - if(substr($path,0,1)!='/' && substr($path,0,2)!='./') $path = './'.$path; - if(substr($path,-1)!='/') $path .= '/'; - $this->template_path = $path; - } - - /** - - * @brief retrieve the directory path of the template directory - **/ - function getTemplatePath() { - return $this->template_path; - } - - /** - * @brief set the file name of the temporarily modified by admin - **/ - function setEditedLayoutFile($filename) { - if(substr($filename,-5)!='.html') $filename .= '.html'; - $this->edited_layout_file = $filename; - } - - /** - * @brief retreived the file name of edited_layout_file - **/ - function getEditedLayoutFile() { - return $this->edited_layout_file; - } - - /** - * @brief set the file name of the layout file - **/ - function setLayoutFile($filename) { - if(substr($filename,-5)!='.html') $filename .= '.html'; - $this->layout_file = $filename; - } - - /** - * @brief get the file name of the layout file - **/ - function getLayoutFile() { - return $this->layout_file; - } - - /** - * @brief set the directory path of the layout directory - **/ - function setLayoutPath($path) { - if(substr($path,0,1)!='/' && substr($path,0,2)!='./') $path = './'.$path; - if(substr($path,-1)!='/') $path .= '/'; - $this->layout_path = $path; - } - - /** - * @brief set the directory path of the layout directory - **/ - function getLayoutPath() { - return $this->layout_path; - } - - /** - * @brief excute the member method specified by $act variable - * - **/ - function proc() { - // stop_proc==true이면 그냥 패스 - if($this->stop_proc) return false; - - // trigger call - $triggerOutput = ModuleHandler::triggerCall('moduleObject.proc', 'before', $this); - if(!$triggerOutput->toBool()) { - $this->setError($triggerOutput->getError()); - $this->setMessage($triggerOutput->getMessage()); - return false; - } - - // addon 실행(called_position 를 before_module_proc로 하여 호출) - $called_position = 'before_module_proc'; - $oAddonController = &getController('addon'); - $addon_file = $oAddonController->getCacheFilePath(Mobile::isFromMobilePhone()?"mobile":"pc"); - @include($addon_file); - - if(isset($this->xml_info->action->{$this->act}) && method_exists($this, $this->act)) { - - // 권한 체크 - if(!$this->grant->access) return $this->stop("msg_not_permitted_act"); - - // 모듈의 스킨 정보를 연동 (스킨 정보의 테이블 분리로 동작대상 모듈에만 스킨 정보를 싱크시키도록 변경) - $oModuleModel = &getModel('module'); - $oModuleModel->syncSkinInfoToModuleInfo($this->module_info); - Context::set('module_info', $this->module_info); - - // 실행 - $output = $this->{$this->act}(); - } - else { - return false; - } - - // trigger call - $triggerOutput = ModuleHandler::triggerCall('moduleObject.proc', 'after', $this); - if(!$triggerOutput->toBool()) { - $this->setError($triggerOutput->getError()); - $this->setMessage($triggerOutput->getMessage()); - return false; - } - - // addon 실행(called_position 를 after_module_proc로 하여 호출) - $called_position = 'after_module_proc'; - $oAddonController = &getController('addon'); - $addon_file = $oAddonController->getCacheFilePath(Mobile::isFromMobilePhone()?"mobile":"pc"); - @include($addon_file); - - if(is_a($output, 'Object') || is_subclass_of($output, 'Object')) { - $this->setError($output->getError()); - $this->setMessage($output->getMessage()); - return false; - } - - // view action이고 결과 출력이 XMLRPC 또는 JSON일 경우 해당 모듈의 api method를 실행 - if($this->module_info->module_type == 'view'){ - if(Context::getResponseMethod() == 'XMLRPC' || Context::getResponseMethod() == 'JSON') { - $oAPI = getAPI($this->module_info->module, 'api'); - if(method_exists($oAPI, $this->act)) { - $oAPI->{$this->act}($this); - } - } - } - - return true; - } - } -?> +module = $module; + } + + /** + * @brief setter to set the name of module path + * @param the directory path to a module directory + **/ + function setModulePath($path) { + if(substr($path,-1)!='/') $path.='/'; + $this->module_path = $path; + } + + /** + * @brief setter to set an url for redirection + * @param $url url for redirection + * @remark redirect_url is used only for ajax requests + **/ + function setRedirectUrl($url='./') { + $this->add('redirect_url', $url); + } + + /** + * @brief sett to set the template path for refresh.html + * @remark refresh.html is executed as a result of method execution + * 공통 tpl중 refresh.html을 실행할 뿐.. + **/ + function setRefreshPage() { + $this->setTemplatePath('./common/tpl'); + $this->setTemplateFile('refresh'); + } + + + /** + * @brief sett to set the action name + **/ + function setAct($act) { + $this->act = $act; + } + + /** + * @brief sett to set module information + * @param[in] $module_info object containing module information + * @param[in] $xml_info object containing module description + **/ + function setModuleInfo($module_info, $xml_info) { + // 기본 변수 설정 + $this->mid = $module_info->mid; + $this->module_srl = $module_info->module_srl; + $this->module_info = $module_info; + $this->xml_info = $xml_info; + $this->skin_vars = $module_info->skin_vars; + + // 웹서비스에서 꼭 필요한 인증 정보와 권한 설정 체크 + $is_logged = Context::get('is_logged'); + $logged_info = Context::get('logged_info'); + + // module model 객체 생성 + $oModuleModel = &getModel('module'); + + // XE에서 access, manager (== is_admin) 는 고정된 권한명이며 이와 관련된 권한 설정 + $module_srl = Context::get('module_srl'); + if(!$module_info->mid && preg_match('/^([0-9]+)$/',$module_srl)) { + $request_module = $oModuleModel->getModuleInfoByModuleSrl($module_srl); + if($request_module->module_srl == $module_srl) { + $grant = $oModuleModel->getGrant($request_module, $logged_info); + } + } else { + $grant = $oModuleModel->getGrant($module_info, $logged_info, $xml_info); + } + + // 현재 모듈의 access 권한이 없으면 권한 없음 표시 + //if(!$grant->access) return $this->stop("msg_not_permitted"); + + // 관리 권한이 없으면 permision, action 확인 + if(!$grant->manager) { + // 현재 요청된 action의 퍼미션 type(guest, member, manager, root)를 구함 + $permission_target = $xml_info->permission->{$this->act}; + + // module.xml에 명시된 퍼미션이 없을때 action명에 Admin이 있으면 manager로 체크 + if(!$permission_target && substr_count($this->act, 'Admin')) $permission_target = 'manager'; + + // 권한 체크 + switch($permission_target) { + case 'root' : + $this->stop('msg_not_permitted_act'); + break; + case 'manager' : + if(!$grant->manager) $this->stop('msg_not_permitted_act'); + break; + case 'member' : + if(!$is_logged) $this->stop('msg_not_permitted_act'); + break; + } + } + + // 권한변수 설정 + $this->grant = $grant; + Context::set('grant', $grant); + + if(method_exists($this, 'init')) $this->init(); + } + + /** + * @brief set the stop_proc and approprate message for msg_code + * @param $msg_code an error code + **/ + function stop($msg_code) { + // proc 수행을 중지 시키기 위한 플래그 세팅 + $this->stop_proc = true; + + // 에러 처리 + $this->setError(-1); + $this->setMessage($msg_code); + + // message 모듈의 에러 표시 + $type = Mobile::isFromMobilePhone() ? 'mobile' : 'view'; + $oMessageObject = &ModuleHandler::getModuleInstance('message',$type); + $oMessageObject->setError(-1); + $oMessageObject->setMessage($msg_code); + $oMessageObject->dispMessage(); + + $this->setTemplatePath($oMessageObject->getTemplatePath()); + $this->setTemplateFile($oMessageObject->getTemplateFile()); + + return $this; + } + + /** + * @brief set the file name of the template file + **/ + function setTemplateFile($filename) { + if(substr($filename,-5)!='.html') $filename .= '.html'; + $this->template_file = $filename; + } + + /** + * @brief retrieve the directory path of the template directory + **/ + function getTemplateFile() { + return $this->template_file; + } + + /** + * @brief set the directory path of the template directory + **/ + function setTemplatePath($path) { + if(substr($path,0,1)!='/' && substr($path,0,2)!='./') $path = './'.$path; + if(substr($path,-1)!='/') $path .= '/'; + $this->template_path = $path; + } + + /** + + * @brief retrieve the directory path of the template directory + **/ + function getTemplatePath() { + return $this->template_path; + } + + /** + * @brief set the file name of the temporarily modified by admin + **/ + function setEditedLayoutFile($filename) { + if(substr($filename,-5)!='.html') $filename .= '.html'; + $this->edited_layout_file = $filename; + } + + /** + * @brief retreived the file name of edited_layout_file + **/ + function getEditedLayoutFile() { + return $this->edited_layout_file; + } + + /** + * @brief set the file name of the layout file + **/ + function setLayoutFile($filename) { + if(substr($filename,-5)!='.html') $filename .= '.html'; + $this->layout_file = $filename; + } + + /** + * @brief get the file name of the layout file + **/ + function getLayoutFile() { + return $this->layout_file; + } + + /** + * @brief set the directory path of the layout directory + **/ + function setLayoutPath($path) { + if(substr($path,0,1)!='/' && substr($path,0,2)!='./') $path = './'.$path; + if(substr($path,-1)!='/') $path .= '/'; + $this->layout_path = $path; + } + + /** + * @brief set the directory path of the layout directory + **/ + function getLayoutPath() { + return $this->layout_path; + } + + /** + * @brief excute the member method specified by $act variable + * + **/ + function proc() { + // stop_proc==true이면 그냥 패스 + if($this->stop_proc) return false; + + // trigger call + $triggerOutput = ModuleHandler::triggerCall('moduleObject.proc', 'before', $this); + if(!$triggerOutput->toBool()) { + $this->setError($triggerOutput->getError()); + $this->setMessage($triggerOutput->getMessage()); + return false; + } + + // addon 실행(called_position 를 before_module_proc로 하여 호출) + $called_position = 'before_module_proc'; + $oAddonController = &getController('addon'); + $addon_file = $oAddonController->getCacheFilePath(Mobile::isFromMobilePhone()?"mobile":"pc"); + @include($addon_file); + + if(isset($this->xml_info->action->{$this->act}) && method_exists($this, $this->act)) { + + // 권한 체크 + if(!$this->grant->access) return $this->stop("msg_not_permitted_act"); + + // 모듈의 스킨 정보를 연동 (스킨 정보의 테이블 분리로 동작대상 모듈에만 스킨 정보를 싱크시키도록 변경) + $oModuleModel = &getModel('module'); + $oModuleModel->syncSkinInfoToModuleInfo($this->module_info); + Context::set('module_info', $this->module_info); + + // 실행 + $output = $this->{$this->act}(); + } + else { + return false; + } + + // trigger call + $triggerOutput = ModuleHandler::triggerCall('moduleObject.proc', 'after', $this); + if(!$triggerOutput->toBool()) { + $this->setError($triggerOutput->getError()); + $this->setMessage($triggerOutput->getMessage()); + return false; + } + + // addon 실행(called_position 를 after_module_proc로 하여 호출) + $called_position = 'after_module_proc'; + $oAddonController = &getController('addon'); + $addon_file = $oAddonController->getCacheFilePath(Mobile::isFromMobilePhone()?"mobile":"pc"); + @include($addon_file); + + if(is_a($output, 'Object') || is_subclass_of($output, 'Object')) { + $this->setError($output->getError()); + $this->setMessage($output->getMessage()); + return false; + } + + // view action이고 결과 출력이 XMLRPC 또는 JSON일 경우 해당 모듈의 api method를 실행 + if($this->module_info->module_type == 'view'){ + if(Context::getResponseMethod() == 'XMLRPC' || Context::getResponseMethod() == 'JSON') { + $oAPI = getAPI($this->module_info->module, 'api'); + if(method_exists($oAPI, $this->act)) { + $oAPI->{$this->act}($this); + } + } + } + + return true; + } + } +?> diff --git a/classes/object/Object.class.php b/classes/object/Object.class.php index 4cf8bab11..fe4cab0ea 100644 --- a/classes/object/Object.class.php +++ b/classes/object/Object.class.php @@ -1,137 +1,137 @@ -setError($error); - $this->setMessage($message); - } - - /** - * @brief Setter to set error code - * @param[in] $error error code - **/ - function setError($error = 0) { - $this->error = $error; - } - - /** - * @brief Getter to retrieve error code - **/ - function getError() { - return $this->error; - } - - /** - * @brief Setter to set set the error message - * @param[in] $message a messge string - * @return return True - * @remark this method always returns True. We'd better remove it - **/ - function setMessage($message = 'success') { - if(Context::getLang($message)) $message = Context::getLang($message); - $this->message = $message; - return true; - } - - /** - * @brief getter to retrieve an error message - **/ - function getMessage() { - return $this->message; - } - - /** - * @brief setter to set a key/value pair as an additional variable - * @param[in] $key a variable name - * @param[in] $val a value for the variable - **/ - function add($key, $val) { - $this->variables[$key] = $val; - } - - /** - * @brief method to set multiple key/value pairs as an additional variables - * @param[in] $object either object or array containg key/value pairs to be added - **/ - function adds($object) { - if(is_object($object)) { - $vars = get_object_vars($object); - foreach($vars as $key => $val) $this->add($key, $val); - } elseif(is_array($object)) { - foreach($object as $key => $val) $this->add($key, $val); - } - } - - /** - * @brief method to retrieve a corresponding value to a given key - **/ - function get($key) { - return $this->variables[$key]; - } - - - /** - * @brief method to retrieve an object containing a key/value paris - * @return Returns an object containing key/value pairs - **/ - function gets() { - $num_args = func_num_args(); - $args_list = func_get_args(); - for($i=0;$i<$num_args;$i++) { - $key = $args_list[$i]; - $output->{$key} = $this->get($key); - } - return $output; - } - - /** - * @brief method to retrieve an array of key/value pairs - * @return Return a list of key/value pairs - **/ - function getVariables() { - return $this->variables; - } - - /** - * @brief method to retrieve an object of key/value pairs - * @return Return an object of key/value pairs - **/ - function getObjectVars() { - foreach($this->variables as $key => $val) $output->{$key} = $val; - return $output; - } - - /** - * @brief method to return either true or false depnding on the value in a 'error' variable - * @remark this method is misleading in that it returns true if error is 0, which should be true in - * boolean representation. - **/ - function toBool() { - return $this->error==0?true:false; - } - - - /** - * @brief method to return either true or false depnding on the value in a 'error' variable - **/ - function toBoolean() { - return $this->toBool(); - } - } -?> +setError($error); + $this->setMessage($message); + } + + /** + * @brief Setter to set error code + * @param[in] $error error code + **/ + function setError($error = 0) { + $this->error = $error; + } + + /** + * @brief Getter to retrieve error code + **/ + function getError() { + return $this->error; + } + + /** + * @brief Setter to set set the error message + * @param[in] $message a messge string + * @return return True + * @remark this method always returns True. We'd better remove it + **/ + function setMessage($message = 'success') { + if(Context::getLang($message)) $message = Context::getLang($message); + $this->message = $message; + return true; + } + + /** + * @brief getter to retrieve an error message + **/ + function getMessage() { + return $this->message; + } + + /** + * @brief setter to set a key/value pair as an additional variable + * @param[in] $key a variable name + * @param[in] $val a value for the variable + **/ + function add($key, $val) { + $this->variables[$key] = $val; + } + + /** + * @brief method to set multiple key/value pairs as an additional variables + * @param[in] $object either object or array containg key/value pairs to be added + **/ + function adds($object) { + if(is_object($object)) { + $vars = get_object_vars($object); + foreach($vars as $key => $val) $this->add($key, $val); + } elseif(is_array($object)) { + foreach($object as $key => $val) $this->add($key, $val); + } + } + + /** + * @brief method to retrieve a corresponding value to a given key + **/ + function get($key) { + return $this->variables[$key]; + } + + + /** + * @brief method to retrieve an object containing a key/value paris + * @return Returns an object containing key/value pairs + **/ + function gets() { + $num_args = func_num_args(); + $args_list = func_get_args(); + for($i=0;$i<$num_args;$i++) { + $key = $args_list[$i]; + $output->{$key} = $this->get($key); + } + return $output; + } + + /** + * @brief method to retrieve an array of key/value pairs + * @return Return a list of key/value pairs + **/ + function getVariables() { + return $this->variables; + } + + /** + * @brief method to retrieve an object of key/value pairs + * @return Return an object of key/value pairs + **/ + function getObjectVars() { + foreach($this->variables as $key => $val) $output->{$key} = $val; + return $output; + } + + /** + * @brief method to return either true or false depnding on the value in a 'error' variable + * @remark this method is misleading in that it returns true if error is 0, which should be true in + * boolean representation. + **/ + function toBool() { + return $this->error==0?true:false; + } + + + /** + * @brief method to return either true or false depnding on the value in a 'error' variable + **/ + function toBoolean() { + return $this->toBool(); + } + } +?> diff --git a/classes/page/PageHandler.class.php b/classes/page/PageHandler.class.php index 4f65e4bed..5ba96bfc5 100644 --- a/classes/page/PageHandler.class.php +++ b/classes/page/PageHandler.class.php @@ -1,62 +1,62 @@ -total_count = $total_count; - $this->total_page = $total_page; - $this->cur_page = $cur_page; - $this->page_count = $page_count; - $this->point = 0; - - $first_page = $cur_page - (int)($page_count/2); - if($first_page<1) $first_page = 1; - $last_page = $total_page; - if($last_page>$total_page) $last_page = $total_page; - - $this->first_page = $first_page; - $this->last_page = $last_page; - - if($total_page < $this->page_count) $this->page_count = $total_page; - } - - /** - * @brief request next page - * @return next page number - **/ - function getNextPage() { - $page = $this->first_page+$this->point++; - if($this->point > $this->page_count || $page > $this->last_page) $page = 0; - return $page; - } - - function getPage($offset) - { - return max(min($this->cur_page + $offset, $this->total_page), ''); - } - } -?> +total_count = $total_count; + $this->total_page = $total_page; + $this->cur_page = $cur_page; + $this->page_count = $page_count; + $this->point = 0; + + $first_page = $cur_page - (int)($page_count/2); + if($first_page<1) $first_page = 1; + $last_page = $total_page; + if($last_page>$total_page) $last_page = $total_page; + + $this->first_page = $first_page; + $this->last_page = $last_page; + + if($total_page < $this->page_count) $this->page_count = $total_page; + } + + /** + * @brief request next page + * @return next page number + **/ + function getNextPage() { + $page = $this->first_page+$this->point++; + if($this->point > $this->page_count || $page > $this->last_page) $page = 0; + return $page; + } + + function getPage($offset) + { + return max(min($this->cur_page + $offset, $this->total_page), ''); + } + } +?> diff --git a/classes/template/TemplateHandler.class.php b/classes/template/TemplateHandler.class.php index f8059c80b..3ba9db1ad 100644 --- a/classes/template/TemplateHandler.class.php +++ b/classes/template/TemplateHandler.class.php @@ -1,879 +1,879 @@ -path = preg_replace('/^\.\//','',$info['dirname']).'/'; - $this->path = $tpl_path; - $this->filename = $tpl_filename; - $this->file = $tpl_file; - - $this->xe_path = preg_replace('/([^\.^\/]+)\.php$/i','',$_SERVER['SCRIPT_NAME']); - $this->web_path = $this->xe_path.str_replace(_XE_PATH_,'',$this->path); - - // get compiled file name - $this->compiled_file = sprintf('%s%s.compiled.php',$this->compiled_path, md5($this->file)); - - // compare various file's modified time for check changed - $this->handler_mtime = filemtime(_XE_PATH_.'classes/template/TemplateHandler.class.php'); - - $this->buff = null; - } - - /** - * @brief compiles specified tpl file and execution result in Context into resultant content - * @param[in] $tpl_path path of the directory containing target template file - * @param[in] $tpl_filename target template file's name - * @param[in] $tpl_file if specified use it as template file's full path - * @return Returns compiled result in case of success, NULL otherwise - */ - function compile($tpl_path, $tpl_filename, $tpl_file = '') { - // store the starting time for debug information - if(__DEBUG__==3 ) $start = getMicroTime(); - - // initiation - $this->init($tpl_path, $tpl_filename, $tpl_file); - - // if target file does not exist exit - if(!$this->file || !file_exists($this->file)) return sprintf('Err : "%s" template file does not exists.', $this->file); - - $source_template_mtime = filemtime($this->file); - $latest_mtime = $source_template_mtime>$this->handler_mtime?$source_template_mtime:$this->handler_mtime; - - // cache controll - $oCacheHandler = &CacheHandler::getInstance('template'); - - // get cached buff - if($oCacheHandler->isSupport()){ - $cache_key = 'template:'.$this->file; - $this->buff = $oCacheHandler->get($cache_key, $latest_mtime); - } else { - if(file_exists($this->compiled_file) && filemtime($this->compiled_file)>$latest_mtime) { - $this->buff = FileHandler::readFile($this->compiled_file); - } - } - - if(!$this->buff) { - $this->parse(); - if($oCacheHandler->isSupport()) $oCacheHandler->put($cache_key, $this->buff); - else FileHandler::writeFile($this->compiled_file, $this->buff); - } - - $output = $this->_fetch(); - - // store the ending time for debug information - if(__DEBUG__==3 ) $GLOBALS['__template_elapsed__'] += getMicroTime() - $start; - - return $output; - } - - /** - * @brief compile specified file and immediately return - * @param[in] $tpl_path path of the directory containing target template file - * @param[in] $tpl_filename target template file's name - * @return Returns compiled content in case of success or NULL in case of failure - **/ - function compileDirect($tpl_path, $tpl_filename) { - $this->init($tpl_path, $tpl_filename, null); - - // if target file does not exist exit - if(!$this->file || !file_exists($this->file)) { - Context::close(); - printf('"%s" template file is not exists.', $this->file); - exit(); - } - - $this->parse(); - return $this->buff; - } - - /** - * @brief compile a template file specified in $tpl_file and - * @pre files specified by $tpl_file exists. - * @param[in] $tpl_file path of tpl file - * @param[in] $compiled_tpl_file if specified, write compiled result into the file - * @return compiled result in case of success or NULL in case of error - **/ - function parse() { - if(!file_exists($this->file)) return; - - // read tpl file - $buff = FileHandler::readFile($this->file); - - // replace value of src in img/input/script tag - $buff = preg_replace_callback('/<(img|input|script)([^>]*)src="([^"]*?)"/is', array($this, '_replacePath'), $buff); - - // loop 템플릿 문법을 변환 - $buff = $this->_replaceLoop($buff); - - // cond 템플릿 문법을 변환 - $buff = $this->_replaceCond($buff); - - // |cond 템플릿 문법을 변환 - $buff = preg_replace_callback("/<\/?(\w+)((\s+\w+(\s*=\s*(?:\".*?\"|'.*?'|[^'\">\s]+))?)+\s*|\s*)\/?>/i", array($this, '_replacePipeCond'), $buff); - - // include 태그의 변환 - $buff = preg_replace_callback('!]+)>!is', array($this, '_replaceInclude'), $buff); - - // unload/ load 태그의 변환 - $buff = preg_replace_callback('!<(unload|load) ([^>]+)>!is', array($this, '_replaceLoad'), $buff); - - // 가상 태그인 block의 변환 - $buff = preg_replace('/|<\/block>/is','',$buff); - - // replace include - $buff = preg_replace_callback('!<\!--#include\(([^\)]*?)\)-->!is', array($this, '_compileIncludeToCode'), $buff); - - // replace - $buff = preg_replace_callback('!<\!--@(.*?)-->!is', array($this, '_compileFuncToCode'), $buff); - - // remove comments - $buff = preg_replace('!(\n?)( *?)<\!--//(.*?)-->!is', '', $buff); - - // import xml filter/ css/ js/ files (media is applied to only css) - $buff = preg_replace_callback('!<\!--%import\(\"([^\"]*?)\"(,optimized\=(true|false))?(,media\=\"([^\"]*)\")?(,targetie=\"([^\"]*)\")?(,index=\"([^\"]*)\")?(,type=\"([^\"]*)\")?\)-->!is', array($this, '_compileImportCode'), $buff); - - // unload css/ js (media is applied to only css) - $buff = preg_replace_callback('!<\!--%unload\(\"([^\"]*?)\"(,optimized\=(true|false))?(,media\=\"([^\"]*)\")?(,targetie=\"([^\"]*)\")?\)-->!is', array($this, '_compileUnloadCode'), $buff); - - // javascript plugin import - $buff = preg_replace_callback('!<\!--%load_js_plugin\(\"([^\"]*?)\"\)-->!is', array($this, '_compileLoadJavascriptPlugin'), $buff); - - // replace variables - $buff = preg_replace_callback('/\{[^@^ ]([^\{\}\n]+)\}/i', array($this, '_compileVarToContext'), $buff); - - // PHP 변수형의 변환 ($문자등을 공유 context로 변환) - $buff = $this->_replaceVarInPHP($buff); - - // replace parts not displaying results - $buff = preg_replace_callback('/\{\@([^\{\}]+)\}/i', array($this, '_compileVarToSilenceExecute'), $buff); - - // prevent from calling directly before writing into file - $this->buff = ''.$buff; - } - - /** - * @brief fetch using ob_* function - * @param[in] $compiled_tpl_file path of compiled template file - * @param[in] $buff if buff is not null, eval it instead of including compiled template file - * @param[in] $tpl_path set context's tpl path - * @return result string - **/ - function _fetch() { - if(!$this->buff) return; - - $__Context = &$GLOBALS['__Context__']; - $__Context->tpl_path = $this->path; - - if($_SESSION['is_logged']) $__Context->logged_info = $_SESSION['logged_info']; - - ob_start(); - $eval_str = "?>".$this->buff; - eval($eval_str); - return ob_get_clean(); - } - - /** - * @brief change image path - * @pre $matches is an array containg three elements - * @param[in] $matches match - * @return changed result - **/ - function _replacePath($matches) - { - preg_match_all('/src="([^"]*?)"/is', $matches[0], $m); - for($i=0,$c=count($m[0]);$i<$c;$i++) { - $path = trim($m[1][$i]); - if(substr($path,0,1)=='/' || substr($path,0,1)=='{' || strpos($path,'://')!==false) continue; - if(substr($path,0,2)=='./') $path = substr($path,2); - $target = $this->web_path.$path; - while(strpos($target,'/../')!==false) - { - $target = preg_replace('/\/([^\/]+)\/\.\.\//','/',$target); - } - $target = str_replace('/./','/',$target); - $matches[0] = str_replace($m[0][$i], 'src="'.$target.'"', $matches[0]); - } - return $matches[0]; - } - - /** - * @brief loop 문법의 변환 - **/ - function _replaceLoop($buff) - { - while(false !== $pos = strpos($buff, ' loop="')) - { - $pre = substr($buff,0,$pos); - $next = substr($buff,$pos); - - $pre_pos = strrpos($pre, '<'); - - preg_match('/^ loop="([^"]+)"/i',$next,$m); - $tag = substr($next,0,strlen($m[0])); - $next = substr($next,strlen($m[0])); - $next_pos = strpos($next, '<'); - - $tag = substr($pre, $pre_pos). $tag. substr($next, 0, $next_pos); - $pre = substr($pre, 0, $pre_pos); - $next = substr($next, $next_pos); - - $tag_name = trim(substr($tag,1,strpos($tag,' '))); - $tag_head = $tag_tail = ''; - - if(!preg_match('/ loop="([^"]+)"/is',$tag)) { - print "Invalid XpressEngine Template Syntax
"; - print "File : ".$this->file."
"; - print "Code : ".htmlspecialchars($tag); - exit(); - } - - preg_match_all('/ loop="([^"]+)"/is',$tag,$m); - $tag = preg_replace('/ loop="([^"]+)"/is','', $tag); - - for($i=0,$c=count($m[0]);$i<$c;$i++) - { - $loop = $m[1][$i]; - if(false!== $fpos = strpos($loop,'=>')) - { - $target = trim(substr($loop,0,$fpos)); - $vars = trim(substr($loop,$fpos+2)); - if(false===strpos($vars,',')) - { - $tag_head .= ''; - $tag_tail .= ''; - } - else - { - $t = explode(',',$vars); - $tag_head .= ' '.trim($t[1]).') { ?>'; - $tag_tail .= ''; - } - } - elseif(false!==strpos($loop,';')) - { - $tag_head .= ''; - $tag_tail .= ''; - } - else - { - $t = explode('=',$loop); - if(count($t)==2) - { - $tag_head .= ''; - $tag_tail .= ''; - } - } - } - - if(substr(trim($tag),-2)!='/>') - { - while(false !== $close_pos = strpos($next, '')); - $tag .= $tmp_buff; - $next = substr($next, strlen($tmp_buff)); - if(substr_count($tag, '<'.$tag_name) == substr_count($tag,' %s="%s"', $m[3], $m[1], $m[2]), $matches[0]); - } - } - - return $matches[0]; - } - - /** - * @brief cond 문법의 변환 - **/ - function _replaceCond($buff) - { - while(false !== ($pos = strpos($buff, ' cond="'))) - { - $pre = substr($buff,0,$pos); - $next = substr($buff,$pos); - - $pre_pos = strrpos($pre, '<'); - - preg_match('/<(\/|[a-z])/i',$next,$m); - if(!$m[0]) return $buff; - $next_pos = strpos($next, $m[0]); - - $tag = substr($pre, $pre_pos). substr($next, 0, $next_pos); - $pre = substr($pre, 0, $pre_pos); - $next = substr($next, $next_pos); - $tag_name = trim(substr($tag,1,strpos($tag,' '))); - $tag_head = $tag_tail = ''; - - if(preg_match_all('/ cond=\"([^\"]+)"/is',$tag,$m)) - { - for($i=0,$c=count($m[0]);$i<$c;$i++) - { - $tag_head .= ''; - $tag_tail .= ''; - } - } - - if(!preg_match('/ cond="([^"]+)"/is',$tag)) { - print "Invalid XpressEngine Template Syntax
"; - print "File : ".$this->file."
"; - print "Code : ".htmlspecialchars($tag); - exit(); - } - - $tag = preg_replace('/ cond="([^"]+)"/is','', $tag); - if(substr(trim($tag),-2)=='/>') - { - $buff = $pre.$tag_head.$tag.$tag_tail.$next; - } - else - { - while(false !== $close_pos = strpos($next, '')); - $tag .= $tmp_buff; - $next = substr($next, strlen($tmp_buff)); - - if(substr_count($tag, '<'.$tag_name) == substr_count($tag,'path.substr($target,0,$pos); - } - - return sprintf( - 'compile(\'%s\',\'%s\');%s'. - '?>%s', - "\n", - "\n", - $path, $filename, "\n", - "\n" - ); - } - - /** - * @brief load 태그의 변환 - **/ - function _replaceLoad($matches) { - $output = $matches[0]; - if(!preg_match_all('/ ([^=]+)=\"([^\"]+)\"/is',$matches[0], $m)) return $matches[0]; - - $type = $matches[1]; - for($i=0,$c=count($m[1]);$i<$c;$i++) - { - if(!trim($m[1][$i])) continue; - $attrs[trim($m[1][$i])] = trim($m[2][$i]); - } - - if(!$attrs['target']) return $matches[0]; - - $web_path = $this->web_path; - $base_path = $this->path; - - $target = $attrs['target']; - if(!preg_match('/^(http|https)/i',$target)) - { - if(substr($target,0,2)=='./') $target = substr($target,2); - if(substr($target,0,1)!='/') $target = $web_path.$target; - } - - if(!$attrs['index']) $attrs['index'] = 'null'; - if($attrs['type']!='body') $attrs['type'] = 'head'; - - // if target ends with lang, load language pack - if(substr($target, -4)=='lang') { - if(substr($target,0,2)=='./') $target = substr($target, 2); - $lang_dir = $base_path.$target; - if(is_dir($lang_dir)) $output = sprintf('', $lang_dir); - - // otherwise try to load xml, css, js file - } else { - if(substr($target,0,1)!='/') $source_filename = $base_path.$target; - else $source_filename = $target; - $source_filename = str_replace(array('/./','//'),'/',$source_filename); - - // get filename and path - $tmp_arr = explode("/",$source_filename); - $filename = array_pop($tmp_arr); - - //$base_path = implode("/",$tmp_arr)."/"; - - // get the ext - $tmp_arr = explode(".",$filename); - $ext = strtolower(array_pop($tmp_arr)); - - // according to ext., import the file - switch($ext) { - // xml js filter - case 'xml' : - if(preg_match('/^(http|https)/i',$source_filename)) return; - // create an instance of XmlJSFilter class, then create js and handle Context::addJsFile - $output = sprintf( - 'compile();%s'. - '?>%s', - "\n", - "\n", - dirname($base_path . $attrs['target']).'/', - $filename, - "\n", - "\n", - "\n" - ); - break; - // css file - case 'css' : - if($type == 'unload') { - $output = ''; - } else { - $output = ''; - } - break; - // js file - case 'js' : - if($type == 'unload') { - $output = ''; - } else { - $output = ''; - } - break; - } - } - - return $output; - } - - /** - * @brief $문자 의 PHP 변수 변환 - **/ - function _replaceVarInPHP($buff) { - $head = $tail = ''; - while(false !== $pos = strpos($buff, ''); - $body = substr($buff,0,$pos+2); - $head .= preg_replace_callback('/(.?)\$(\w+[a-z0-9\_\-\[\]\'\"]+)/is',array($this, '_replaceVarString'), $body); - - $buff = substr($buff,$pos+2); - } - return $head.$buff; - } - - - /** - * @brief php5의 class::$변수명의 경우 context를 사용하지 않아야 하기에 함수로 대체 - **/ - function _replaceVarString($matches) - { - if($matches[1]==':') return $matches[0]; - if(substr($matches[2],0,1)=='_') return $matches[0]; - return $matches[1].'$__Context->'.$matches[2]; - } - - /** - * @brief replace with php code - * @param[in] $matches match - * @return replaced result - **/ - function _compileIncludeToCode($matches) { - // if target string to include contains variables handle them - $arg = str_replace(array('"','\''), '', $matches[1]); - if(!$arg) return; - - $tmp_arr = explode("/", $arg); - for($i=0;$ifile), $arg); - $path = substr($this->path,-1)=='/'?substr($this->path,0,-1):$this->path; - $source_filename = sprintf("%s/%s", $path, $arg); - - // step2: check path from root - if(!file_exists($source_filename)) $source_filename = './'.$arg; - if(!file_exists($source_filename)) return; - - // split into path and filename - $tmp_arr = explode('/', $source_filename); - $filename = array_pop($tmp_arr); - $path = implode('/', $tmp_arr).'/'; - - // try to include - $output = sprintf( - 'compile(\'%s\',\'%s\');%s'. - '?>%s', - "\n", - "\n", - $path, $filename, "\n", - "\n" - ); - - return $output; - } - - /** - * @brief replace $... variables in { } with Context::get(...) - * @param[in] $matches match - * @return replaced result in case of success or NULL in case of error - **/ - function _compileVarToContext($matches) { - $str = trim(substr($matches[0],1,strlen($matches[0])-2)); - if(!$str) return $matches[0]; - if(!in_array(substr($str,0,1),array('(','$','\'','"'))) { - if(preg_match('/^([^\( \.]+)(\(| \.)/i',$str,$m)) { - $func = trim($m[1]); - if(strpos($func,'::')===false) { - if(!function_exists($func)) { - return $matches[0]; - } - } else { - list($class, $method) = explode('::',$func); - // FIXME regardless of whether class/func name is case-sensitive, it is safe - // to assume names are case sensitive. We don't have compare twice. - if(!class_exists($class) || !in_array($method, get_class_methods($class))) { - // In some environment, the name of classes and methods may be case-sensitive - list($class, $method) = explode('::',strtolower($func)); - if(!class_exists($class) || !in_array($method, get_class_methods($class))) { - return $matches[0]; - } - } - } - } else { - if(!defined($str)) return $matches[0]; - } - } - return ']+)/i','$__Context->\\1', $str).');?>'; - } - - /** - * @brief replace @... function in { } into print func(..) - * @param[in] $matches match - * @return replaced result - **/ - function _compileVarToSilenceExecute($matches) { - if(strtolower(trim(str_replace(array(';',' '),'', $matches[1])))=='return') return ''; - return ']+)/i','$__Context->\\1', trim($matches[1])).';?>'; - } - - /** - * @brief replace code in with php code - * @param[in] $matches match - * @return changed result - **/ - function _compileFuncToCode($matches) { - static $idx = 0; - $code = trim($matches[1]); - if(!$code) return; - - switch(strtolower($code)) { - case 'else' : - $output = '}else{'; - break; - case 'end' : - case 'endif' : - case 'endfor' : - case 'endforeach' : - case 'endswitch' : - $output = '}'; - break; - case 'break' : - $output = 'break;'; - break; - case 'default' : - $output = 'default :'; - break; - case 'break@default' : - $output = 'break; default :'; - break; - default : - $suffix = '{'; - - if(substr($code, 0, 4) == 'else') { - $code = '}'.$code; - } elseif(substr($code, 0, 7) == 'foreach') { - $tmp_str = substr($code, 8); - $tmp_arr = explode(' ', $tmp_str); - $var_name = $tmp_arr[0]; - $prefix = '$Context->__idx['.$idx.']=0;'; - if(substr($var_name, 0, 1) == '$') { - $prefix .= sprintf('if(count($__Context->%s)) ', substr($var_name, 1)); - } else { - $prefix .= sprintf('if(count(%s)) ', $var_name); - } - $idx++; - $suffix .= '$__idx['.$idx.']=($__idx['.$idx.']+1)%2; $cycle_idx = $__idx['.$idx.']+1;'; - } elseif(substr($code, 0, 4) == 'case') { - $suffix = ':'; - } elseif(substr($code, 0, 10) == 'break@case') { - $code = 'break; case'.substr($code, 10); - $suffix = ':'; - } - $output = preg_replace('/\$([a-zA-Z0-9\_\-]+)/i', '$__Context->\\1', $code.$suffix); - break; - } - - return sprintf('', $prefix, $output); - } - - - /** - * @brief replace xe specific code, "" with appropriate php code - * @param[in] $matches match - * @return Returns modified result or NULL in case of error - **/ - function _compileImportCode($matches) { - // find xml file - $base_path = $this->path; - $given_file = trim($matches[1]); - if(!$given_file) return; - if(isset($matches[3])) $optimized = strtolower(trim($matches[3])); - if(!$optimized) $optimized = 'true'; - if(isset($matches[5])) $media = trim($matches[5]); - if(!$media) $media = 'all'; - if(isset($matches[7])) $targetie = trim($matches[7]); - if(!$targetie) $targetie = ''; - else $optimized = 'false'; - - if(isset($matches[9])) $index = intval($matches[9]); - if(!$index) $index = 'null'; - if(isset($matches[11])) $type = strtolower(trim($matches[11])); - if($type!='body') $type = 'head'; - - // if given_file ends with lang, load language pack - if(substr($given_file, -4)=='lang') { - if(substr($given_file,0,2)=='./') $given_file = substr($given_file, 2); - $lang_dir = $base_path.$given_file; - if(is_dir($lang_dir)) $output = sprintf('', $lang_dir); - - // otherwise try to load xml, css, js file - } else { - if(preg_match('/^(http|https):/i',$given_file)) $source_filename = $given_file; - elseif(substr($given_file,0,1)!='/') $source_filename = sprintf("%s%s",$base_path, $given_file); - else $source_filename = $given_file; - - // get filename and path - $tmp_arr = explode("/",$source_filename); - $filename = array_pop($tmp_arr); - - $base_path = implode("/",$tmp_arr)."/"; - - // get the ext - $tmp_arr = explode(".",$filename); - $ext = strtolower(array_pop($tmp_arr)); - - // according to ext., import the file - switch($ext) { - // xml js filter - case 'xml' : - // create an instance of XmlJSFilter class, then create js and handle Context::addJsFile - $output = sprintf( - 'compile();%s'. - '?>%s', - "\n", - "\n", - $base_path, - $filename, - "\n", - "\n", - "\n" - ); - break; - // css file - case 'css' : - if(preg_match('/^(http|\/)/i',$source_filename)) { - $output = sprintf('', $source_filename, 'false', $media, $targetie, $index); - } else { - $output = sprintf('', $base_path, $filename, $optimized, $media, $targetie, $index); - } - break; - // js file - case 'js' : - if(preg_match('/^(http|\/)/i',$source_filename)) { - $output = sprintf('', $source_filename, 'false', $targetie, $index, $type); - } else { - $output = sprintf('', $base_path, $filename, $optimized, $targetie, $index, $type); - } - break; - } - } - - return $output; - } - - /** - * @brief import javascript plugin - * @param[in] $matches match - * @return result loading the plugin - * @remarks javascript plugin works as optimized = false - **/ - function _compileLoadJavascriptPlugin($matches) { - $base_path = $this->path; - $plugin = trim($matches[1]); - return sprintf('', $plugin); - } - - /** - * @brief remove loading part of css/ js file - * @param[in] $matches match - * @return removed result - **/ - function _compileUnloadCode($matches) { - // find xml file - $base_path = $this->path; - $given_file = trim($matches[1]); - if(!$given_file) return; - if(isset($matches[3])) $optimized = strtolower(trim($matches[3])); - if(!$optimized) $optimized = 'true'; - if(isset($matches[5])) $media = trim($matches[5]); - if(!$media) $media = 'all'; - if(isset($matches[7])) $targetie = trim($matches[7]); - if(!$targetie) $targetie = ''; - else $optimized = 'false'; - - if(substr($given_file,0,1)!='/') $source_filename = sprintf("%s%s",$base_path, $given_file); - else $source_filename = $given_file; - - // get path and file nam - $tmp_arr = explode("/",$source_filename); - $filename = array_pop($tmp_arr); - - $base_path = implode("/",$tmp_arr)."/"; - - // get an ext. - $tmp_arr = explode(".",$filename); - $ext = strtolower(array_pop($tmp_arr)); - - switch($ext) { - // css file - case 'css' : - if(preg_match('/^(http|https|\/)/i',$source_filename)) { - $output = sprintf('', $source_filename, 'false', $media, $targetie); - } else { - $output = sprintf('', $base_path, $filename, $optimized, $media, $targetie); - } - break; - // js file - case 'js' : - if(preg_match('/^(http|https|\/)/i',$source_filename)) { - $output = sprintf('', $source_filename, 'false', $targetie); - } else { - $output = sprintf('', $base_path, $filename, $optimized, $targetie); - } - break; - } - - return $output; - } - } -?> +path = preg_replace('/^\.\//','',$info['dirname']).'/'; + $this->path = $tpl_path; + $this->filename = $tpl_filename; + $this->file = $tpl_file; + + $this->xe_path = preg_replace('/([^\.^\/]+)\.php$/i','',$_SERVER['SCRIPT_NAME']); + $this->web_path = $this->xe_path.str_replace(_XE_PATH_,'',$this->path); + + // get compiled file name + $this->compiled_file = sprintf('%s%s.compiled.php',$this->compiled_path, md5($this->file)); + + // compare various file's modified time for check changed + $this->handler_mtime = filemtime(_XE_PATH_.'classes/template/TemplateHandler.class.php'); + + $this->buff = null; + } + + /** + * @brief compiles specified tpl file and execution result in Context into resultant content + * @param[in] $tpl_path path of the directory containing target template file + * @param[in] $tpl_filename target template file's name + * @param[in] $tpl_file if specified use it as template file's full path + * @return Returns compiled result in case of success, NULL otherwise + */ + function compile($tpl_path, $tpl_filename, $tpl_file = '') { + // store the starting time for debug information + if(__DEBUG__==3 ) $start = getMicroTime(); + + // initiation + $this->init($tpl_path, $tpl_filename, $tpl_file); + + // if target file does not exist exit + if(!$this->file || !file_exists($this->file)) return sprintf('Err : "%s" template file does not exists.', $this->file); + + $source_template_mtime = filemtime($this->file); + $latest_mtime = $source_template_mtime>$this->handler_mtime?$source_template_mtime:$this->handler_mtime; + + // cache controll + $oCacheHandler = &CacheHandler::getInstance('template'); + + // get cached buff + if($oCacheHandler->isSupport()){ + $cache_key = 'template:'.$this->file; + $this->buff = $oCacheHandler->get($cache_key, $latest_mtime); + } else { + if(file_exists($this->compiled_file) && filemtime($this->compiled_file)>$latest_mtime) { + $this->buff = FileHandler::readFile($this->compiled_file); + } + } + + if(!$this->buff) { + $this->parse(); + if($oCacheHandler->isSupport()) $oCacheHandler->put($cache_key, $this->buff); + else FileHandler::writeFile($this->compiled_file, $this->buff); + } + + $output = $this->_fetch(); + + // store the ending time for debug information + if(__DEBUG__==3 ) $GLOBALS['__template_elapsed__'] += getMicroTime() - $start; + + return $output; + } + + /** + * @brief compile specified file and immediately return + * @param[in] $tpl_path path of the directory containing target template file + * @param[in] $tpl_filename target template file's name + * @return Returns compiled content in case of success or NULL in case of failure + **/ + function compileDirect($tpl_path, $tpl_filename) { + $this->init($tpl_path, $tpl_filename, null); + + // if target file does not exist exit + if(!$this->file || !file_exists($this->file)) { + Context::close(); + printf('"%s" template file is not exists.', $this->file); + exit(); + } + + $this->parse(); + return $this->buff; + } + + /** + * @brief compile a template file specified in $tpl_file and + * @pre files specified by $tpl_file exists. + * @param[in] $tpl_file path of tpl file + * @param[in] $compiled_tpl_file if specified, write compiled result into the file + * @return compiled result in case of success or NULL in case of error + **/ + function parse() { + if(!file_exists($this->file)) return; + + // read tpl file + $buff = FileHandler::readFile($this->file); + + // replace value of src in img/input/script tag + $buff = preg_replace_callback('/<(img|input|script)([^>]*)src="([^"]*?)"/is', array($this, '_replacePath'), $buff); + + // loop 템플릿 문법을 변환 + $buff = $this->_replaceLoop($buff); + + // cond 템플릿 문법을 변환 + $buff = $this->_replaceCond($buff); + + // |cond 템플릿 문법을 변환 + $buff = preg_replace_callback("/<\/?(\w+)((\s+\w+(\s*=\s*(?:\".*?\"|'.*?'|[^'\">\s]+))?)+\s*|\s*)\/?>/i", array($this, '_replacePipeCond'), $buff); + + // include 태그의 변환 + $buff = preg_replace_callback('!]+)>!is', array($this, '_replaceInclude'), $buff); + + // unload/ load 태그의 변환 + $buff = preg_replace_callback('!<(unload|load) ([^>]+)>!is', array($this, '_replaceLoad'), $buff); + + // 가상 태그인 block의 변환 + $buff = preg_replace('/|<\/block>/is','',$buff); + + // replace include + $buff = preg_replace_callback('!<\!--#include\(([^\)]*?)\)-->!is', array($this, '_compileIncludeToCode'), $buff); + + // replace + $buff = preg_replace_callback('!<\!--@(.*?)-->!is', array($this, '_compileFuncToCode'), $buff); + + // remove comments + $buff = preg_replace('!(\n?)( *?)<\!--//(.*?)-->!is', '', $buff); + + // import xml filter/ css/ js/ files (media is applied to only css) + $buff = preg_replace_callback('!<\!--%import\(\"([^\"]*?)\"(,optimized\=(true|false))?(,media\=\"([^\"]*)\")?(,targetie=\"([^\"]*)\")?(,index=\"([^\"]*)\")?(,type=\"([^\"]*)\")?\)-->!is', array($this, '_compileImportCode'), $buff); + + // unload css/ js (media is applied to only css) + $buff = preg_replace_callback('!<\!--%unload\(\"([^\"]*?)\"(,optimized\=(true|false))?(,media\=\"([^\"]*)\")?(,targetie=\"([^\"]*)\")?\)-->!is', array($this, '_compileUnloadCode'), $buff); + + // javascript plugin import + $buff = preg_replace_callback('!<\!--%load_js_plugin\(\"([^\"]*?)\"\)-->!is', array($this, '_compileLoadJavascriptPlugin'), $buff); + + // replace variables + $buff = preg_replace_callback('/\{[^@^ ]([^\{\}\n]+)\}/i', array($this, '_compileVarToContext'), $buff); + + // PHP 변수형의 변환 ($문자등을 공유 context로 변환) + $buff = $this->_replaceVarInPHP($buff); + + // replace parts not displaying results + $buff = preg_replace_callback('/\{\@([^\{\}]+)\}/i', array($this, '_compileVarToSilenceExecute'), $buff); + + // prevent from calling directly before writing into file + $this->buff = ''.$buff; + } + + /** + * @brief fetch using ob_* function + * @param[in] $compiled_tpl_file path of compiled template file + * @param[in] $buff if buff is not null, eval it instead of including compiled template file + * @param[in] $tpl_path set context's tpl path + * @return result string + **/ + function _fetch() { + if(!$this->buff) return; + + $__Context = &$GLOBALS['__Context__']; + $__Context->tpl_path = $this->path; + + if($_SESSION['is_logged']) $__Context->logged_info = $_SESSION['logged_info']; + + ob_start(); + $eval_str = "?>".$this->buff; + eval($eval_str); + return ob_get_clean(); + } + + /** + * @brief change image path + * @pre $matches is an array containg three elements + * @param[in] $matches match + * @return changed result + **/ + function _replacePath($matches) + { + preg_match_all('/src="([^"]*?)"/is', $matches[0], $m); + for($i=0,$c=count($m[0]);$i<$c;$i++) { + $path = trim($m[1][$i]); + if(substr($path,0,1)=='/' || substr($path,0,1)=='{' || strpos($path,'://')!==false) continue; + if(substr($path,0,2)=='./') $path = substr($path,2); + $target = $this->web_path.$path; + while(strpos($target,'/../')!==false) + { + $target = preg_replace('/\/([^\/]+)\/\.\.\//','/',$target); + } + $target = str_replace('/./','/',$target); + $matches[0] = str_replace($m[0][$i], 'src="'.$target.'"', $matches[0]); + } + return $matches[0]; + } + + /** + * @brief loop 문법의 변환 + **/ + function _replaceLoop($buff) + { + while(false !== $pos = strpos($buff, ' loop="')) + { + $pre = substr($buff,0,$pos); + $next = substr($buff,$pos); + + $pre_pos = strrpos($pre, '<'); + + preg_match('/^ loop="([^"]+)"/i',$next,$m); + $tag = substr($next,0,strlen($m[0])); + $next = substr($next,strlen($m[0])); + $next_pos = strpos($next, '<'); + + $tag = substr($pre, $pre_pos). $tag. substr($next, 0, $next_pos); + $pre = substr($pre, 0, $pre_pos); + $next = substr($next, $next_pos); + + $tag_name = trim(substr($tag,1,strpos($tag,' '))); + $tag_head = $tag_tail = ''; + + if(!preg_match('/ loop="([^"]+)"/is',$tag)) { + print "Invalid XpressEngine Template Syntax
"; + print "File : ".$this->file."
"; + print "Code : ".htmlspecialchars($tag); + exit(); + } + + preg_match_all('/ loop="([^"]+)"/is',$tag,$m); + $tag = preg_replace('/ loop="([^"]+)"/is','', $tag); + + for($i=0,$c=count($m[0]);$i<$c;$i++) + { + $loop = $m[1][$i]; + if(false!== $fpos = strpos($loop,'=>')) + { + $target = trim(substr($loop,0,$fpos)); + $vars = trim(substr($loop,$fpos+2)); + if(false===strpos($vars,',')) + { + $tag_head .= ''; + $tag_tail .= ''; + } + else + { + $t = explode(',',$vars); + $tag_head .= ' '.trim($t[1]).') { ?>'; + $tag_tail .= ''; + } + } + elseif(false!==strpos($loop,';')) + { + $tag_head .= ''; + $tag_tail .= ''; + } + else + { + $t = explode('=',$loop); + if(count($t)==2) + { + $tag_head .= ''; + $tag_tail .= ''; + } + } + } + + if(substr(trim($tag),-2)!='/>') + { + while(false !== $close_pos = strpos($next, '')); + $tag .= $tmp_buff; + $next = substr($next, strlen($tmp_buff)); + if(substr_count($tag, '<'.$tag_name) == substr_count($tag,' %s="%s"', $m[3], $m[1], $m[2]), $matches[0]); + } + } + + return $matches[0]; + } + + /** + * @brief cond 문법의 변환 + **/ + function _replaceCond($buff) + { + while(false !== ($pos = strpos($buff, ' cond="'))) + { + $pre = substr($buff,0,$pos); + $next = substr($buff,$pos); + + $pre_pos = strrpos($pre, '<'); + + preg_match('/<(\/|[a-z])/i',$next,$m); + if(!$m[0]) return $buff; + $next_pos = strpos($next, $m[0]); + + $tag = substr($pre, $pre_pos). substr($next, 0, $next_pos); + $pre = substr($pre, 0, $pre_pos); + $next = substr($next, $next_pos); + $tag_name = trim(substr($tag,1,strpos($tag,' '))); + $tag_head = $tag_tail = ''; + + if(preg_match_all('/ cond=\"([^\"]+)"/is',$tag,$m)) + { + for($i=0,$c=count($m[0]);$i<$c;$i++) + { + $tag_head .= ''; + $tag_tail .= ''; + } + } + + if(!preg_match('/ cond="([^"]+)"/is',$tag)) { + print "Invalid XpressEngine Template Syntax
"; + print "File : ".$this->file."
"; + print "Code : ".htmlspecialchars($tag); + exit(); + } + + $tag = preg_replace('/ cond="([^"]+)"/is','', $tag); + if(substr(trim($tag),-2)=='/>') + { + $buff = $pre.$tag_head.$tag.$tag_tail.$next; + } + else + { + while(false !== $close_pos = strpos($next, '')); + $tag .= $tmp_buff; + $next = substr($next, strlen($tmp_buff)); + + if(substr_count($tag, '<'.$tag_name) == substr_count($tag,'path.substr($target,0,$pos); + } + + return sprintf( + 'compile(\'%s\',\'%s\');%s'. + '?>%s', + "\n", + "\n", + $path, $filename, "\n", + "\n" + ); + } + + /** + * @brief load 태그의 변환 + **/ + function _replaceLoad($matches) { + $output = $matches[0]; + if(!preg_match_all('/ ([^=]+)=\"([^\"]+)\"/is',$matches[0], $m)) return $matches[0]; + + $type = $matches[1]; + for($i=0,$c=count($m[1]);$i<$c;$i++) + { + if(!trim($m[1][$i])) continue; + $attrs[trim($m[1][$i])] = trim($m[2][$i]); + } + + if(!$attrs['target']) return $matches[0]; + + $web_path = $this->web_path; + $base_path = $this->path; + + $target = $attrs['target']; + if(!preg_match('/^(http|https)/i',$target)) + { + if(substr($target,0,2)=='./') $target = substr($target,2); + if(substr($target,0,1)!='/') $target = $web_path.$target; + } + + if(!$attrs['index']) $attrs['index'] = 'null'; + if($attrs['type']!='body') $attrs['type'] = 'head'; + + // if target ends with lang, load language pack + if(substr($target, -4)=='lang') { + if(substr($target,0,2)=='./') $target = substr($target, 2); + $lang_dir = $base_path.$target; + if(is_dir($lang_dir)) $output = sprintf('', $lang_dir); + + // otherwise try to load xml, css, js file + } else { + if(substr($target,0,1)!='/') $source_filename = $base_path.$target; + else $source_filename = $target; + $source_filename = str_replace(array('/./','//'),'/',$source_filename); + + // get filename and path + $tmp_arr = explode("/",$source_filename); + $filename = array_pop($tmp_arr); + + //$base_path = implode("/",$tmp_arr)."/"; + + // get the ext + $tmp_arr = explode(".",$filename); + $ext = strtolower(array_pop($tmp_arr)); + + // according to ext., import the file + switch($ext) { + // xml js filter + case 'xml' : + if(preg_match('/^(http|https)/i',$source_filename)) return; + // create an instance of XmlJSFilter class, then create js and handle Context::addJsFile + $output = sprintf( + 'compile();%s'. + '?>%s', + "\n", + "\n", + dirname($base_path . $attrs['target']).'/', + $filename, + "\n", + "\n", + "\n" + ); + break; + // css file + case 'css' : + if($type == 'unload') { + $output = ''; + } else { + $output = ''; + } + break; + // js file + case 'js' : + if($type == 'unload') { + $output = ''; + } else { + $output = ''; + } + break; + } + } + + return $output; + } + + /** + * @brief $문자 의 PHP 변수 변환 + **/ + function _replaceVarInPHP($buff) { + $head = $tail = ''; + while(false !== $pos = strpos($buff, ''); + $body = substr($buff,0,$pos+2); + $head .= preg_replace_callback('/(.?)\$(\w+[a-z0-9\_\-\[\]\'\"]+)/is',array($this, '_replaceVarString'), $body); + + $buff = substr($buff,$pos+2); + } + return $head.$buff; + } + + + /** + * @brief php5의 class::$변수명의 경우 context를 사용하지 않아야 하기에 함수로 대체 + **/ + function _replaceVarString($matches) + { + if($matches[1]==':') return $matches[0]; + if(substr($matches[2],0,1)=='_') return $matches[0]; + return $matches[1].'$__Context->'.$matches[2]; + } + + /** + * @brief replace with php code + * @param[in] $matches match + * @return replaced result + **/ + function _compileIncludeToCode($matches) { + // if target string to include contains variables handle them + $arg = str_replace(array('"','\''), '', $matches[1]); + if(!$arg) return; + + $tmp_arr = explode("/", $arg); + for($i=0;$ifile), $arg); + $path = substr($this->path,-1)=='/'?substr($this->path,0,-1):$this->path; + $source_filename = sprintf("%s/%s", $path, $arg); + + // step2: check path from root + if(!file_exists($source_filename)) $source_filename = './'.$arg; + if(!file_exists($source_filename)) return; + + // split into path and filename + $tmp_arr = explode('/', $source_filename); + $filename = array_pop($tmp_arr); + $path = implode('/', $tmp_arr).'/'; + + // try to include + $output = sprintf( + 'compile(\'%s\',\'%s\');%s'. + '?>%s', + "\n", + "\n", + $path, $filename, "\n", + "\n" + ); + + return $output; + } + + /** + * @brief replace $... variables in { } with Context::get(...) + * @param[in] $matches match + * @return replaced result in case of success or NULL in case of error + **/ + function _compileVarToContext($matches) { + $str = trim(substr($matches[0],1,strlen($matches[0])-2)); + if(!$str) return $matches[0]; + if(!in_array(substr($str,0,1),array('(','$','\'','"'))) { + if(preg_match('/^([^\( \.]+)(\(| \.)/i',$str,$m)) { + $func = trim($m[1]); + if(strpos($func,'::')===false) { + if(!function_exists($func)) { + return $matches[0]; + } + } else { + list($class, $method) = explode('::',$func); + // FIXME regardless of whether class/func name is case-sensitive, it is safe + // to assume names are case sensitive. We don't have compare twice. + if(!class_exists($class) || !in_array($method, get_class_methods($class))) { + // In some environment, the name of classes and methods may be case-sensitive + list($class, $method) = explode('::',strtolower($func)); + if(!class_exists($class) || !in_array($method, get_class_methods($class))) { + return $matches[0]; + } + } + } + } else { + if(!defined($str)) return $matches[0]; + } + } + return ']+)/i','$__Context->\\1', $str).');?>'; + } + + /** + * @brief replace @... function in { } into print func(..) + * @param[in] $matches match + * @return replaced result + **/ + function _compileVarToSilenceExecute($matches) { + if(strtolower(trim(str_replace(array(';',' '),'', $matches[1])))=='return') return ''; + return ']+)/i','$__Context->\\1', trim($matches[1])).';?>'; + } + + /** + * @brief replace code in with php code + * @param[in] $matches match + * @return changed result + **/ + function _compileFuncToCode($matches) { + static $idx = 0; + $code = trim($matches[1]); + if(!$code) return; + + switch(strtolower($code)) { + case 'else' : + $output = '}else{'; + break; + case 'end' : + case 'endif' : + case 'endfor' : + case 'endforeach' : + case 'endswitch' : + $output = '}'; + break; + case 'break' : + $output = 'break;'; + break; + case 'default' : + $output = 'default :'; + break; + case 'break@default' : + $output = 'break; default :'; + break; + default : + $suffix = '{'; + + if(substr($code, 0, 4) == 'else') { + $code = '}'.$code; + } elseif(substr($code, 0, 7) == 'foreach') { + $tmp_str = substr($code, 8); + $tmp_arr = explode(' ', $tmp_str); + $var_name = $tmp_arr[0]; + $prefix = '$Context->__idx['.$idx.']=0;'; + if(substr($var_name, 0, 1) == '$') { + $prefix .= sprintf('if(count($__Context->%s)) ', substr($var_name, 1)); + } else { + $prefix .= sprintf('if(count(%s)) ', $var_name); + } + $idx++; + $suffix .= '$__idx['.$idx.']=($__idx['.$idx.']+1)%2; $cycle_idx = $__idx['.$idx.']+1;'; + } elseif(substr($code, 0, 4) == 'case') { + $suffix = ':'; + } elseif(substr($code, 0, 10) == 'break@case') { + $code = 'break; case'.substr($code, 10); + $suffix = ':'; + } + $output = preg_replace('/\$([a-zA-Z0-9\_\-]+)/i', '$__Context->\\1', $code.$suffix); + break; + } + + return sprintf('', $prefix, $output); + } + + + /** + * @brief replace xe specific code, "" with appropriate php code + * @param[in] $matches match + * @return Returns modified result or NULL in case of error + **/ + function _compileImportCode($matches) { + // find xml file + $base_path = $this->path; + $given_file = trim($matches[1]); + if(!$given_file) return; + if(isset($matches[3])) $optimized = strtolower(trim($matches[3])); + if(!$optimized) $optimized = 'true'; + if(isset($matches[5])) $media = trim($matches[5]); + if(!$media) $media = 'all'; + if(isset($matches[7])) $targetie = trim($matches[7]); + if(!$targetie) $targetie = ''; + else $optimized = 'false'; + + if(isset($matches[9])) $index = intval($matches[9]); + if(!$index) $index = 'null'; + if(isset($matches[11])) $type = strtolower(trim($matches[11])); + if($type!='body') $type = 'head'; + + // if given_file ends with lang, load language pack + if(substr($given_file, -4)=='lang') { + if(substr($given_file,0,2)=='./') $given_file = substr($given_file, 2); + $lang_dir = $base_path.$given_file; + if(is_dir($lang_dir)) $output = sprintf('', $lang_dir); + + // otherwise try to load xml, css, js file + } else { + if(preg_match('/^(http|https):/i',$given_file)) $source_filename = $given_file; + elseif(substr($given_file,0,1)!='/') $source_filename = sprintf("%s%s",$base_path, $given_file); + else $source_filename = $given_file; + + // get filename and path + $tmp_arr = explode("/",$source_filename); + $filename = array_pop($tmp_arr); + + $base_path = implode("/",$tmp_arr)."/"; + + // get the ext + $tmp_arr = explode(".",$filename); + $ext = strtolower(array_pop($tmp_arr)); + + // according to ext., import the file + switch($ext) { + // xml js filter + case 'xml' : + // create an instance of XmlJSFilter class, then create js and handle Context::addJsFile + $output = sprintf( + 'compile();%s'. + '?>%s', + "\n", + "\n", + $base_path, + $filename, + "\n", + "\n", + "\n" + ); + break; + // css file + case 'css' : + if(preg_match('/^(http|\/)/i',$source_filename)) { + $output = sprintf('', $source_filename, 'false', $media, $targetie, $index); + } else { + $output = sprintf('', $base_path, $filename, $optimized, $media, $targetie, $index); + } + break; + // js file + case 'js' : + if(preg_match('/^(http|\/)/i',$source_filename)) { + $output = sprintf('', $source_filename, 'false', $targetie, $index, $type); + } else { + $output = sprintf('', $base_path, $filename, $optimized, $targetie, $index, $type); + } + break; + } + } + + return $output; + } + + /** + * @brief import javascript plugin + * @param[in] $matches match + * @return result loading the plugin + * @remarks javascript plugin works as optimized = false + **/ + function _compileLoadJavascriptPlugin($matches) { + $base_path = $this->path; + $plugin = trim($matches[1]); + return sprintf('', $plugin); + } + + /** + * @brief remove loading part of css/ js file + * @param[in] $matches match + * @return removed result + **/ + function _compileUnloadCode($matches) { + // find xml file + $base_path = $this->path; + $given_file = trim($matches[1]); + if(!$given_file) return; + if(isset($matches[3])) $optimized = strtolower(trim($matches[3])); + if(!$optimized) $optimized = 'true'; + if(isset($matches[5])) $media = trim($matches[5]); + if(!$media) $media = 'all'; + if(isset($matches[7])) $targetie = trim($matches[7]); + if(!$targetie) $targetie = ''; + else $optimized = 'false'; + + if(substr($given_file,0,1)!='/') $source_filename = sprintf("%s%s",$base_path, $given_file); + else $source_filename = $given_file; + + // get path and file nam + $tmp_arr = explode("/",$source_filename); + $filename = array_pop($tmp_arr); + + $base_path = implode("/",$tmp_arr)."/"; + + // get an ext. + $tmp_arr = explode(".",$filename); + $ext = strtolower(array_pop($tmp_arr)); + + switch($ext) { + // css file + case 'css' : + if(preg_match('/^(http|https|\/)/i',$source_filename)) { + $output = sprintf('', $source_filename, 'false', $media, $targetie); + } else { + $output = sprintf('', $base_path, $filename, $optimized, $media, $targetie); + } + break; + // js file + case 'js' : + if(preg_match('/^(http|https|\/)/i',$source_filename)) { + $output = sprintf('', $source_filename, 'false', $targetie); + } else { + $output = sprintf('', $base_path, $filename, $optimized, $targetie); + } + break; + } + + return $output; + } + } +?> diff --git a/classes/widget/WidgetHandler.class.php b/classes/widget/WidgetHandler.class.php index c35e4a188..8acf4abb4 100644 --- a/classes/widget/WidgetHandler.class.php +++ b/classes/widget/WidgetHandler.class.php @@ -1,14 +1,14 @@ - + diff --git a/classes/xml/GeneralXmlParser.class.php b/classes/xml/GeneralXmlParser.class.php index 18b938ab0..becf581d4 100644 --- a/classes/xml/GeneralXmlParser.class.php +++ b/classes/xml/GeneralXmlParser.class.php @@ -1,83 +1,83 @@ -output)) return; - $this->output = array_shift($this->output); - - return $this->output; - } - - /** - * @brief start element handler - * @param[in] $parse an instance of parser - * @param[in] $node_name a name of node - * @param[in] $attrs attributes to be set - */ - function _tagOpen($parser, $node_name, $attrs) { - $obj->node_name = strtolower($node_name); - $obj->attrs = $attrs; - $obj->childNodes = array(); - - array_push($this->output, $obj); - } - - /** - * @brief character data handler - * variable in the last element of this->output - * @param[in] $parse an instance of parser - * @param[in] $body a data to be added - */ - function _tagBody($parser, $body) { - //if(!trim($body)) return; - $this->output[count($this->output)-1]->body .= $body; - } - - - /** - * @brief end element handler - * @param[in] $parse an instance of parser - * @param[in] $node_name name of xml node - */ - function _tagClosed($parser, $node_name) { - $node_name = strtolower($node_name); - $cur_obj = array_pop($this->output); - $parent_obj = &$this->output[count($this->output)-1]; - - if($parent_obj->childNodes[$node_name]) - { - $tmp_obj = $parent_obj->childNodes[$node_name]; - if(is_array($tmp_obj)) { - array_push($parent_obj->childNodes[$node_name], $cur_obj); - } else { - $parent_obj->childNodes[$node_name] = array(); - array_push($parent_obj->childNodes[$node_name], $tmp_obj); - array_push($parent_obj->childNodes[$node_name], $cur_obj); - } - } else { - $parent_obj->childNodes[$node_name] = $cur_obj; - } - } - - } -?> +output)) return; + $this->output = array_shift($this->output); + + return $this->output; + } + + /** + * @brief start element handler + * @param[in] $parse an instance of parser + * @param[in] $node_name a name of node + * @param[in] $attrs attributes to be set + */ + function _tagOpen($parser, $node_name, $attrs) { + $obj->node_name = strtolower($node_name); + $obj->attrs = $attrs; + $obj->childNodes = array(); + + array_push($this->output, $obj); + } + + /** + * @brief character data handler + * variable in the last element of this->output + * @param[in] $parse an instance of parser + * @param[in] $body a data to be added + */ + function _tagBody($parser, $body) { + //if(!trim($body)) return; + $this->output[count($this->output)-1]->body .= $body; + } + + + /** + * @brief end element handler + * @param[in] $parse an instance of parser + * @param[in] $node_name name of xml node + */ + function _tagClosed($parser, $node_name) { + $node_name = strtolower($node_name); + $cur_obj = array_pop($this->output); + $parent_obj = &$this->output[count($this->output)-1]; + + if($parent_obj->childNodes[$node_name]) + { + $tmp_obj = $parent_obj->childNodes[$node_name]; + if(is_array($tmp_obj)) { + array_push($parent_obj->childNodes[$node_name], $cur_obj); + } else { + $parent_obj->childNodes[$node_name] = array(); + array_push($parent_obj->childNodes[$node_name], $tmp_obj); + array_push($parent_obj->childNodes[$node_name], $cur_obj); + } + } else { + $parent_obj->childNodes[$node_name] = $cur_obj; + } + } + + } +?> diff --git a/classes/xml/XmlJsFilter.class.php b/classes/xml/XmlJsFilter.class.php index a97a8eceb..10fb03246 100644 --- a/classes/xml/XmlJsFilter.class.php +++ b/classes/xml/XmlJsFilter.class.php @@ -1,290 +1,290 @@ - - *
<-- code to validate data in the form - * - * - * <-- 폼 항목을 조합하여 key=val 의 js array로 return, act는 필수 - * - * - * <-- 서버에 ajax로 전송하여 받을 결과값 - * <-- error이름의 결과값을 받겠다는 것 - * - * - * } - * - * @detail { - * - syntax description of
node - * target = name of for element - * required = flag indicating whether a field is mandatory or not - * minlength, maxlength = mininum, maxinum length of string allowed for the field - * filter = name of filter to be used for javascript validation. Following is the description of filter available - * 1) email : validate the confirmance of the value against an email format - * 2) userid : validate the confirmance of the value against the format of user id. (combination of number[0-9],alphabet(lower case) and '_', underscore starting with an alphatic character) - * 3) alpha : check if the value is consists of alphabatic characters. - * 4) number : check if the value is consists of numerical digits - * 5) equalto = target : indicate that values in the form should be equal to those in target - * 6) pattern_id/regex pattern/[i] : check the value using custom regular expression. - * - * - parameter - param - * name = key : indicate that a new array, 'key' will be created and a value will be assigned to it - * target = target_name : target form element의 값을 가져옴 - * - * - response - * tag = key : name of variable that will contain the result of the execution - * } - **/ - - class XmlJsFilter extends XmlParser { - var $version = '0.2.5'; - var $compiled_path = './files/cache/js_filter_compiled/'; ///< 컴파일된 캐시 파일이 놓일 위치 - var $xml_file = NULL; ///< 대상 xml 파일 - var $js_file = NULL; ///< 컴파일된 js 파일 - - /** - * @brief constructor - **/ - function XmlJsFilter($path, $xml_file) { - if(substr($path,-1)!=='/') $path .= '/'; - $this->xml_file = sprintf("%s%s",$path, $xml_file); - $this->js_file = $this->_getCompiledFileName($this->xml_file); - } - - /** - * @brief compile a xml_file only when a corresponding js file does not exists or is outdated - * @return Returns NULL regardless of the success of failure of the operation - **/ - function compile() { - if(!file_exists($this->xml_file)) return; - if(!file_exists($this->js_file)) $this->_compile(); - else if(filemtime($this->xml_file)>filemtime($this->js_file)) $this->_compile(); - Context::addJsFile($this->js_file, false, '',null,'body'); - } - - /** - * @brief compile a xml_file into js_file - **/ - function _compile() { - global $lang; - - // xml 파일을 읽음 - $buff = FileHandler::readFile($this->xml_file); - - // xml parsing - $xml_obj = parent::parse($buff); - - $attrs = $xml_obj->filter->attrs; - $rules = $xml_obj->filter->rules; - - // XmlJsFilter는 filter_name, field, parameter 3개의 데이터를 핸들링 - $filter_name = $attrs->name; - $confirm_msg_code = $attrs->confirm_msg_code; - $module = $attrs->module; - $act = $attrs->act; - $extend_filter = $attrs->extend_filter; - - - $field_node = $xml_obj->filter->form->node; - if($field_node && !is_array($field_node)) $field_node = array($field_node); - - $parameter_param = $xml_obj->filter->parameter->param; - if($parameter_param && !is_array($parameter_param)) $parameter_param = array($parameter_param); - - $response_tag = $xml_obj->filter->response->tag; - if($response_tag && !is_array($response_tag)) $response_tag = array($response_tag); - - // extend_filter가 있을 경우 해당 method를 호출하여 결과를 받음 - if($extend_filter) { - - // extend_filter가 있을 경우 캐시 사용을 못하도록 js 캐시 파일명을 변경 - $this->js_file .= '.nocache.js'; - - // extend_filter는 module.method 로 지칭되어 이를 분리 - list($module_name, $method) = explode('.',$extend_filter); - - // 모듈 이름과 method가 있을 경우 진행 - if($module_name&&$method) { - // 해당 module의 model 객체를 받음 - $oExtendFilter = &getModel($module_name); - - // method가 존재하면 실행 - if(method_exists($oExtendFilter, $method)) { - // 결과를 받음 - $extend_filter_list = $oExtendFilter->{$method}(true); - $extend_filter_count = count($extend_filter_list); - - // 결과에서 lang값을 이용 문서 변수에 적용 - for($i=0; $i < $extend_filter_count; $i++) { - $name = $extend_filter_list[$i]->name; - $lang_value = $extend_filter_list[$i]->lang; - if($lang_value) $lang->{$name} = $lang_value; - } - } - - } - } - - // 언어 입력을 위한 사용되는 필드 조사 - $target_list = array(); - $target_type_list = array(); - - // javascript contents - $js_rules = array(); - $js_messages = array(); - - $fields = array(); - - // create custom rule - if ($rules && $rules->rule) { - if (!is_array($rules->rule)) $rules->rule = array($rules->rule); - foreach($rules->rule as $r) { - if ($r->attrs->type == 'regex') { - $js_rules[] = "v.cast('ADD_RULE', ['{$r->attrs->name}', {$r->body}]);"; - } - } - } - - // field, 즉 체크항목의 script 생성 - $node_count = count($field_node); - if($node_count) { - foreach($field_node as $key =>$node) { - $attrs = $node->attrs; - $target = trim($attrs->target); - - if(!$target) continue; - - $rule = trim($attrs->rule?$attrs->rule:$attrs->filter); - $equalto = trim($attrs->equalto); - - $field = array(); - - if($attrs->required == 'true') $field[] = 'required:true'; - if($attrs->minlength > 0) $field[] = 'minlength:'.$attrs->minlength; - if($attrs->maxlength > 0) $field[] = 'maxlength:'.$attrs->maxlength; - if($equalto) $field[] = "equalto:'{$attrs->equalto}'"; - if($rule) $field[] = "rule:'{$rule}'"; - - $fields[] = "'{$target}': {".implode(',', $field)."}"; - - if(!in_array($target, $target_list)) $target_list[] = $target; - if(!$target_type_list[$target]) $target_type_list[$target] = $filter; - } - } - - // extend_filter_item 체크 - $rule_types = array('homepage'=>'homepage', 'email_address'=>'email'); - - for($i=0;$i<$extend_filter_count;$i++) { - $filter_item = $extend_filter_list[$i]; - $target = trim($filter_item->name); - - if(!$target) continue; - - // extend filter item의 type으로 rule을 구함 - $type = $filter_item->type; - $rule = $rule_types[$type]?$rule_types[$type]:''; - $required = ($filter_item->required == 'true'); - - $field = array(); - if($required) $field[] = 'required:true'; - if($rule) $field[] = "rule:'{$rule}'"; - $fields[] = "\t\t'{$target}' : {".implode(',', $field)."}"; - - if(!in_array($target, $target_list)) $target_list[] = $target; - if(!$target_type_list[$target]) $target_type_list[$target] = $type; - } - - // 데이터를 만들기 위한 parameter script 생성 - $rename_params = array(); - $parameter_count = count($parameter_param); - if($parameter_count) { - // 기본 필터 내용의 parameter로 구성 - foreach($parameter_param as $key =>$param) { - $attrs = $param->attrs; - $name = trim($attrs->name); - $target = trim($attrs->target); - - //if($name && $target && ($name != $target)) $js_doc[] = "\t\tparams['{$name}'] = params['{$target}']; delete params['{$target}'];"; - if($name && $target && ($name != $target)) $rename_params[] = "'{$target}':'{$name}'"; - if($name && !in_array($name, $target_list)) $target_list[] = $name; - } - - // extend_filter_item 체크 - for($i=0;$i<$extend_filter_count;$i++) { - $filter_item = $extend_filter_list[$i]; - $target = $name = trim($filter_item->name); - if(!$name || !$target) continue; - - if(!in_array($name, $target_list)) $target_list[] = $name; - } - } - - // response script 생성 - $response_count = count($response_tag); - $responses = array(); - for($i=0;$i<$response_count;$i++) { - $attrs = $response_tag[$i]->attrs; - $name = $attrs->name; - $responses[] = "'{$name}'"; - } - - // lang : form field description - $target_count = count($target_list); - for($i=0;$i<$target_count;$i++) { - $target = $target_list[$i]; - if(!$lang->{$target}) $lang->{$target} = $target; - $js_messages[] = sprintf("v.cast('ADD_MESSAGE',['%s','%s']);", $target, addslashes($lang->{$target})); - } - - // target type을 기록 - /* - $target_type_count = count($target_type_list); - if($target_type_count) { - foreach($target_type_list as $target => $type) { - //$js_doc .= sprintf("target_type_list[\"%s\"] = \"%s\";\n", $target, $type); - } - } - */ - - // lang : error message - foreach($lang->filter as $key => $val) { - if(!$val) $val = $key; - $js_messages[] = sprintf("v.cast('ADD_MESSAGE',['%s','%s']);", $key, $val); - } - - $callback_func = $xml_obj->filter->response->attrs->callback_func; - if(!$callback_func) $callback_func = "filterAlertMessage"; - - $confirm_msg = ''; - if ($confirm_msg_code) $confirm_msg = $lang->{$confirm_msg_code}; - - $jsdoc = array(); - $jsdoc[] = "function {$filter_name}(form){ return legacy_filter('{$filter_name}', form, '{$module}', '{$act}', {$callback_func}, [".implode(',', $responses)."], '".addslashes($confirm_msg)."', {".implode(',', $rename_params)."}) };"; - $jsdoc[] = '(function($){'; - $jsdoc[] = "\tvar v=xe.getApp('validator')[0];if(!v)return false;"; - $jsdoc[] = "\t".'v.cast("ADD_FILTER", ["'.$filter_name.'", {'.implode(',', $fields).'}]);'; - $jsdoc[] = "\t".implode("\n\t", $js_rules); - $jsdoc[] = "\t".implode("\n\t", $js_messages); - $jsdoc[] = '})(jQuery);'; - $jsdoc = implode("\n", $jsdoc); - - // js파일 생성 - FileHandler::writeFile($this->js_file, $jsdoc); - } - - /** - * @brief return a file name of js file corresponding to the xml file - **/ - function _getCompiledFileName($xml_file) { - return sprintf('%s%s.%s.compiled.js',$this->compiled_path, md5($this->version.$xml_file),Context::getLangType()); - } - } -?> + + * <-- code to validate data in the form + * + * + * <-- 폼 항목을 조합하여 key=val 의 js array로 return, act는 필수 + * + * + * <-- 서버에 ajax로 전송하여 받을 결과값 + * <-- error이름의 결과값을 받겠다는 것 + * + * + * } + * + * @detail { + * - syntax description of
node + * target = name of for element + * required = flag indicating whether a field is mandatory or not + * minlength, maxlength = mininum, maxinum length of string allowed for the field + * filter = name of filter to be used for javascript validation. Following is the description of filter available + * 1) email : validate the confirmance of the value against an email format + * 2) userid : validate the confirmance of the value against the format of user id. (combination of number[0-9],alphabet(lower case) and '_', underscore starting with an alphatic character) + * 3) alpha : check if the value is consists of alphabatic characters. + * 4) number : check if the value is consists of numerical digits + * 5) equalto = target : indicate that values in the form should be equal to those in target + * 6) pattern_id/regex pattern/[i] : check the value using custom regular expression. + * + * - parameter - param + * name = key : indicate that a new array, 'key' will be created and a value will be assigned to it + * target = target_name : target form element의 값을 가져옴 + * + * - response + * tag = key : name of variable that will contain the result of the execution + * } + **/ + + class XmlJsFilter extends XmlParser { + var $version = '0.2.5'; + var $compiled_path = './files/cache/js_filter_compiled/'; ///< 컴파일된 캐시 파일이 놓일 위치 + var $xml_file = NULL; ///< 대상 xml 파일 + var $js_file = NULL; ///< 컴파일된 js 파일 + + /** + * @brief constructor + **/ + function XmlJsFilter($path, $xml_file) { + if(substr($path,-1)!=='/') $path .= '/'; + $this->xml_file = sprintf("%s%s",$path, $xml_file); + $this->js_file = $this->_getCompiledFileName($this->xml_file); + } + + /** + * @brief compile a xml_file only when a corresponding js file does not exists or is outdated + * @return Returns NULL regardless of the success of failure of the operation + **/ + function compile() { + if(!file_exists($this->xml_file)) return; + if(!file_exists($this->js_file)) $this->_compile(); + else if(filemtime($this->xml_file)>filemtime($this->js_file)) $this->_compile(); + Context::addJsFile($this->js_file, false, '',null,'body'); + } + + /** + * @brief compile a xml_file into js_file + **/ + function _compile() { + global $lang; + + // xml 파일을 읽음 + $buff = FileHandler::readFile($this->xml_file); + + // xml parsing + $xml_obj = parent::parse($buff); + + $attrs = $xml_obj->filter->attrs; + $rules = $xml_obj->filter->rules; + + // XmlJsFilter는 filter_name, field, parameter 3개의 데이터를 핸들링 + $filter_name = $attrs->name; + $confirm_msg_code = $attrs->confirm_msg_code; + $module = $attrs->module; + $act = $attrs->act; + $extend_filter = $attrs->extend_filter; + + + $field_node = $xml_obj->filter->form->node; + if($field_node && !is_array($field_node)) $field_node = array($field_node); + + $parameter_param = $xml_obj->filter->parameter->param; + if($parameter_param && !is_array($parameter_param)) $parameter_param = array($parameter_param); + + $response_tag = $xml_obj->filter->response->tag; + if($response_tag && !is_array($response_tag)) $response_tag = array($response_tag); + + // extend_filter가 있을 경우 해당 method를 호출하여 결과를 받음 + if($extend_filter) { + + // extend_filter가 있을 경우 캐시 사용을 못하도록 js 캐시 파일명을 변경 + $this->js_file .= '.nocache.js'; + + // extend_filter는 module.method 로 지칭되어 이를 분리 + list($module_name, $method) = explode('.',$extend_filter); + + // 모듈 이름과 method가 있을 경우 진행 + if($module_name&&$method) { + // 해당 module의 model 객체를 받음 + $oExtendFilter = &getModel($module_name); + + // method가 존재하면 실행 + if(method_exists($oExtendFilter, $method)) { + // 결과를 받음 + $extend_filter_list = $oExtendFilter->{$method}(true); + $extend_filter_count = count($extend_filter_list); + + // 결과에서 lang값을 이용 문서 변수에 적용 + for($i=0; $i < $extend_filter_count; $i++) { + $name = $extend_filter_list[$i]->name; + $lang_value = $extend_filter_list[$i]->lang; + if($lang_value) $lang->{$name} = $lang_value; + } + } + + } + } + + // 언어 입력을 위한 사용되는 필드 조사 + $target_list = array(); + $target_type_list = array(); + + // javascript contents + $js_rules = array(); + $js_messages = array(); + + $fields = array(); + + // create custom rule + if ($rules && $rules->rule) { + if (!is_array($rules->rule)) $rules->rule = array($rules->rule); + foreach($rules->rule as $r) { + if ($r->attrs->type == 'regex') { + $js_rules[] = "v.cast('ADD_RULE', ['{$r->attrs->name}', {$r->body}]);"; + } + } + } + + // field, 즉 체크항목의 script 생성 + $node_count = count($field_node); + if($node_count) { + foreach($field_node as $key =>$node) { + $attrs = $node->attrs; + $target = trim($attrs->target); + + if(!$target) continue; + + $rule = trim($attrs->rule?$attrs->rule:$attrs->filter); + $equalto = trim($attrs->equalto); + + $field = array(); + + if($attrs->required == 'true') $field[] = 'required:true'; + if($attrs->minlength > 0) $field[] = 'minlength:'.$attrs->minlength; + if($attrs->maxlength > 0) $field[] = 'maxlength:'.$attrs->maxlength; + if($equalto) $field[] = "equalto:'{$attrs->equalto}'"; + if($rule) $field[] = "rule:'{$rule}'"; + + $fields[] = "'{$target}': {".implode(',', $field)."}"; + + if(!in_array($target, $target_list)) $target_list[] = $target; + if(!$target_type_list[$target]) $target_type_list[$target] = $filter; + } + } + + // extend_filter_item 체크 + $rule_types = array('homepage'=>'homepage', 'email_address'=>'email'); + + for($i=0;$i<$extend_filter_count;$i++) { + $filter_item = $extend_filter_list[$i]; + $target = trim($filter_item->name); + + if(!$target) continue; + + // extend filter item의 type으로 rule을 구함 + $type = $filter_item->type; + $rule = $rule_types[$type]?$rule_types[$type]:''; + $required = ($filter_item->required == 'true'); + + $field = array(); + if($required) $field[] = 'required:true'; + if($rule) $field[] = "rule:'{$rule}'"; + $fields[] = "\t\t'{$target}' : {".implode(',', $field)."}"; + + if(!in_array($target, $target_list)) $target_list[] = $target; + if(!$target_type_list[$target]) $target_type_list[$target] = $type; + } + + // 데이터를 만들기 위한 parameter script 생성 + $rename_params = array(); + $parameter_count = count($parameter_param); + if($parameter_count) { + // 기본 필터 내용의 parameter로 구성 + foreach($parameter_param as $key =>$param) { + $attrs = $param->attrs; + $name = trim($attrs->name); + $target = trim($attrs->target); + + //if($name && $target && ($name != $target)) $js_doc[] = "\t\tparams['{$name}'] = params['{$target}']; delete params['{$target}'];"; + if($name && $target && ($name != $target)) $rename_params[] = "'{$target}':'{$name}'"; + if($name && !in_array($name, $target_list)) $target_list[] = $name; + } + + // extend_filter_item 체크 + for($i=0;$i<$extend_filter_count;$i++) { + $filter_item = $extend_filter_list[$i]; + $target = $name = trim($filter_item->name); + if(!$name || !$target) continue; + + if(!in_array($name, $target_list)) $target_list[] = $name; + } + } + + // response script 생성 + $response_count = count($response_tag); + $responses = array(); + for($i=0;$i<$response_count;$i++) { + $attrs = $response_tag[$i]->attrs; + $name = $attrs->name; + $responses[] = "'{$name}'"; + } + + // lang : form field description + $target_count = count($target_list); + for($i=0;$i<$target_count;$i++) { + $target = $target_list[$i]; + if(!$lang->{$target}) $lang->{$target} = $target; + $js_messages[] = sprintf("v.cast('ADD_MESSAGE',['%s','%s']);", $target, addslashes($lang->{$target})); + } + + // target type을 기록 + /* + $target_type_count = count($target_type_list); + if($target_type_count) { + foreach($target_type_list as $target => $type) { + //$js_doc .= sprintf("target_type_list[\"%s\"] = \"%s\";\n", $target, $type); + } + } + */ + + // lang : error message + foreach($lang->filter as $key => $val) { + if(!$val) $val = $key; + $js_messages[] = sprintf("v.cast('ADD_MESSAGE',['%s','%s']);", $key, $val); + } + + $callback_func = $xml_obj->filter->response->attrs->callback_func; + if(!$callback_func) $callback_func = "filterAlertMessage"; + + $confirm_msg = ''; + if ($confirm_msg_code) $confirm_msg = $lang->{$confirm_msg_code}; + + $jsdoc = array(); + $jsdoc[] = "function {$filter_name}(form){ return legacy_filter('{$filter_name}', form, '{$module}', '{$act}', {$callback_func}, [".implode(',', $responses)."], '".addslashes($confirm_msg)."', {".implode(',', $rename_params)."}) };"; + $jsdoc[] = '(function($){'; + $jsdoc[] = "\tvar v=xe.getApp('validator')[0];if(!v)return false;"; + $jsdoc[] = "\t".'v.cast("ADD_FILTER", ["'.$filter_name.'", {'.implode(',', $fields).'}]);'; + $jsdoc[] = "\t".implode("\n\t", $js_rules); + $jsdoc[] = "\t".implode("\n\t", $js_messages); + $jsdoc[] = '})(jQuery);'; + $jsdoc = implode("\n", $jsdoc); + + // js파일 생성 + FileHandler::writeFile($this->js_file, $jsdoc); + } + + /** + * @brief return a file name of js file corresponding to the xml file + **/ + function _getCompiledFileName($xml_file) { + return sprintf('%s%s.%s.compiled.js',$this->compiled_path, md5($this->version.$xml_file),Context::getLangType()); + } + } +?> diff --git a/classes/xml/XmlParser.class.php b/classes/xml/XmlParser.class.php index 4e68a2abf..04469a3a1 100644 --- a/classes/xml/XmlParser.class.php +++ b/classes/xml/XmlParser.class.php @@ -1,154 +1,154 @@ -parse($buff); - } - - /** - * @brief parse xml data to extract values from it and construct data object - * @param[in] a data buffer containing xml data - * @return Returns a resultant data object or NULL in case of error - **/ - function parse($input = '') { - // 디버그를 위한 컴파일 시작 시간 저장 - if(__DEBUG__==3) $start = getMicroTime(); - - $this->lang = Context::getLangType(); - - $this->input = $input?$input:$GLOBALS['HTTP_RAW_POST_DATA']; - $this->input = str_replace(array('',''),array('',''),$this->input); - - // 지원언어 종류를 뽑음 - preg_match_all("/xml:lang=\"([^\"].+)\"/i", $this->input, $matches); - - // xml:lang이 쓰였을 경우 지원하는 언어종류를 뽑음 - if(count($matches[1]) && $supported_lang = array_unique($matches[1])) { - // supported_lang에 현재 접속자의 lang이 없으면 en이 있는지 확인하여 en이 있으면 en을 기본, 아니면 첫번째것을.. - if(!in_array($this->lang, $supported_lang)) { - if(in_array('en', $supported_lang)) { - $this->lang = 'en'; - } else { - $this->lang = array_shift($supported_lang); - } - } - // 특별한 언어가 지정되지 않았다면 언어체크를 하지 않음 - } else { - unset($this->lang); - } - - $this->oParser = xml_parser_create('UTF-8'); - - xml_set_object($this->oParser, $this); - xml_set_element_handler($this->oParser, "_tagOpen", "_tagClosed"); - xml_set_character_data_handler($this->oParser, "_tagBody"); - - xml_parse($this->oParser, $this->input); - xml_parser_free($this->oParser); - - if(!count($this->output)) return; - - $output = array_shift($this->output); - - // 디버그를 위한 컴파일 시작 시간 저장 - if(__DEBUG__==3) $GLOBALS['__xmlparse_elapsed__'] += getMicroTime() - $start; - - return $output; - } - - - /** - * @brief start element handler. - * @param[in] $parse an instance of parser - * @param[in] $node_name a name of node - * @param[in] $attrs attributes to be set - */ - function _tagOpen($parser, $node_name, $attrs) { - $obj->node_name = strtolower($node_name); - $obj->attrs = $this->_arrToObj($attrs); - - array_push($this->output, $obj); - } - - - /** - * @brief character data handler - * variable in the last element of this->output - * @param[in] $parse an instance of parser - * @param[in] $body a data to be added - * @remark the first parameter, $parser ought to be remove since it is not used. - */ - function _tagBody($parser, $body) { - //if(!trim($body)) return; - $this->output[count($this->output)-1]->body .= $body; - } - - /** - * @brief end element handler - * @param[in] $parse an instance of parser - * @param[in] $node_name name of xml node - */ - function _tagClosed($parser, $node_name) { - $node_name = strtolower($node_name); - $cur_obj = array_pop($this->output); - $parent_obj = &$this->output[count($this->output)-1]; - if($this->lang&&$cur_obj->attrs->{'xml:lang'}&&$cur_obj->attrs->{'xml:lang'}!=$this->lang) return; - if($this->lang&&$parent_obj->{$node_name}->attrs->{'xml:lang'}&&$parent_obj->{$node_name}->attrs->{'xml:lang'}!=$this->lang) return; - - if($parent_obj->{$node_name}) { - $tmp_obj = $parent_obj->{$node_name}; - if(is_array($tmp_obj)) { - array_push($parent_obj->{$node_name}, $cur_obj); - } else { - $parent_obj->{$node_name} = array(); - array_push($parent_obj->{$node_name}, $tmp_obj); - array_push($parent_obj->{$node_name}, $cur_obj); - } - } else { - $parent_obj->{$node_name} = $cur_obj; - } - } - - /** - * @brief method to transfer values in an array to a data object - * @param[in] $arr data array - **/ - function _arrToObj($arr) { - if(!count($arr)) return; - foreach($arr as $key => $val) { - $key = strtolower($key); - $output->{$key} = $val; - } - return $output; - } - } -?> +parse($buff); + } + + /** + * @brief parse xml data to extract values from it and construct data object + * @param[in] a data buffer containing xml data + * @return Returns a resultant data object or NULL in case of error + **/ + function parse($input = '') { + // 디버그를 위한 컴파일 시작 시간 저장 + if(__DEBUG__==3) $start = getMicroTime(); + + $this->lang = Context::getLangType(); + + $this->input = $input?$input:$GLOBALS['HTTP_RAW_POST_DATA']; + $this->input = str_replace(array('',''),array('',''),$this->input); + + // 지원언어 종류를 뽑음 + preg_match_all("/xml:lang=\"([^\"].+)\"/i", $this->input, $matches); + + // xml:lang이 쓰였을 경우 지원하는 언어종류를 뽑음 + if(count($matches[1]) && $supported_lang = array_unique($matches[1])) { + // supported_lang에 현재 접속자의 lang이 없으면 en이 있는지 확인하여 en이 있으면 en을 기본, 아니면 첫번째것을.. + if(!in_array($this->lang, $supported_lang)) { + if(in_array('en', $supported_lang)) { + $this->lang = 'en'; + } else { + $this->lang = array_shift($supported_lang); + } + } + // 특별한 언어가 지정되지 않았다면 언어체크를 하지 않음 + } else { + unset($this->lang); + } + + $this->oParser = xml_parser_create('UTF-8'); + + xml_set_object($this->oParser, $this); + xml_set_element_handler($this->oParser, "_tagOpen", "_tagClosed"); + xml_set_character_data_handler($this->oParser, "_tagBody"); + + xml_parse($this->oParser, $this->input); + xml_parser_free($this->oParser); + + if(!count($this->output)) return; + + $output = array_shift($this->output); + + // 디버그를 위한 컴파일 시작 시간 저장 + if(__DEBUG__==3) $GLOBALS['__xmlparse_elapsed__'] += getMicroTime() - $start; + + return $output; + } + + + /** + * @brief start element handler. + * @param[in] $parse an instance of parser + * @param[in] $node_name a name of node + * @param[in] $attrs attributes to be set + */ + function _tagOpen($parser, $node_name, $attrs) { + $obj->node_name = strtolower($node_name); + $obj->attrs = $this->_arrToObj($attrs); + + array_push($this->output, $obj); + } + + + /** + * @brief character data handler + * variable in the last element of this->output + * @param[in] $parse an instance of parser + * @param[in] $body a data to be added + * @remark the first parameter, $parser ought to be remove since it is not used. + */ + function _tagBody($parser, $body) { + //if(!trim($body)) return; + $this->output[count($this->output)-1]->body .= $body; + } + + /** + * @brief end element handler + * @param[in] $parse an instance of parser + * @param[in] $node_name name of xml node + */ + function _tagClosed($parser, $node_name) { + $node_name = strtolower($node_name); + $cur_obj = array_pop($this->output); + $parent_obj = &$this->output[count($this->output)-1]; + if($this->lang&&$cur_obj->attrs->{'xml:lang'}&&$cur_obj->attrs->{'xml:lang'}!=$this->lang) return; + if($this->lang&&$parent_obj->{$node_name}->attrs->{'xml:lang'}&&$parent_obj->{$node_name}->attrs->{'xml:lang'}!=$this->lang) return; + + if($parent_obj->{$node_name}) { + $tmp_obj = $parent_obj->{$node_name}; + if(is_array($tmp_obj)) { + array_push($parent_obj->{$node_name}, $cur_obj); + } else { + $parent_obj->{$node_name} = array(); + array_push($parent_obj->{$node_name}, $tmp_obj); + array_push($parent_obj->{$node_name}, $cur_obj); + } + } else { + $parent_obj->{$node_name} = $cur_obj; + } + } + + /** + * @brief method to transfer values in an array to a data object + * @param[in] $arr data array + **/ + function _arrToObj($arr) { + if(!count($arr)) return; + foreach($arr as $key => $val) { + $key = strtolower($key); + $output->{$key} = $val; + } + return $output; + } + } +?> diff --git a/classes/xml/XmlQueryParser.class.php b/classes/xml/XmlQueryParser.class.php index 15cccc026..cd474162e 100644 --- a/classes/xml/XmlQueryParser.class.php +++ b/classes/xml/XmlQueryParser.class.php @@ -1,542 +1,542 @@ -query->attrs->action); - if(!$action) return; - - // 테이블 정리 (배열코드로 변환) - $tables = $xml_obj->query->tables->table; - $output->left_tables = array(); - - $left_conditions = array(); - - if(!$tables) return; - if(!is_array($tables)) $tables = array($tables); - foreach($tables as $key => $val) { - - // 테이블과 alias의 이름을 구함 - $table_name = $val->attrs->name; - $alias = $val->attrs->alias; - if(!$alias) $alias = $table_name; - - $output->tables[$alias] = $table_name; - - if(in_array($val->attrs->type,array('left join','left outer join','right join','right outer join')) && count($val->conditions)){ - $output->left_tables[$alias] = $val->attrs->type; - $left_conditions[$alias] = $val->conditions; - } - - // 테이블을 찾아서 컬럼의 속성을 구함 - $table_file = sprintf('%s%s/%s/schemas/%s.xml', _XE_PATH_, 'modules', $module, $table_name); - if(!file_exists($table_file)) { - $searched_list = FileHandler::readDir(_XE_PATH_.'modules'); - $searched_count = count($searched_list); - for($i=0;$i<$searched_count;$i++) { - $table_file = sprintf('%s%s/%s/schemas/%s.xml', _XE_PATH_, 'modules', $searched_list[$i], $table_name); - if(file_exists($table_file)) break; - } - } - - if(file_exists($table_file)) { - $table_xml = FileHandler::readFile($table_file); - $table_obj = parent::parse($table_xml); - if($table_obj->table) { - if(isset($table_obj->table->column) && !is_array($table_obj->table->column)) - { - $table_obj->table->column = array($table_obj->table->column); - } - - foreach($table_obj->table->column as $k => $v) { - $buff .= sprintf('$output->column_type["%s"] = "%s";%s', $v->attrs->name, $v->attrs->type, "\n"); - } - } - } - } - - - // 컬럼 정리 - $columns = $xml_obj->query->columns->column; - $out = $this->_setColumn($columns); - $output->columns = $out->columns; - - $conditions = $xml_obj->query->conditions; - $out = $this->_setConditions($conditions); - $output->conditions = $out->conditions; - - foreach($output->left_tables as $key => $val){ - if($left_conditions[$key]){ - $out = $this->_setConditions($left_conditions[$key]); - $output->left_conditions[$key] = $out->conditions; - } - } - - $group_list = $xml_obj->query->groups->group; - $out = $this->_setGroup($group_list); - $output->groups = $out->groups; - - // 네비게이션 정리 - $out = $this->_setNavigation($xml_obj); - $output->order = $out->order; - $output->list_count = $out->list_count; - $output->page_count = $out->page_count; - $output->page = $out->page; - - $column_count = count($output->columns); - $condition_count = count($output->conditions); - - $buff .= '$output->tables = array( '; - foreach($output->tables as $key => $val) { - if(!array_key_exists($key,$output->left_tables)){ - $buff .= sprintf('"%s"=>"%s",', $key, $val); - } - } - $buff .= ' );'."\n"; - - // php script 생성 - $buff .= '$output->_tables = array( '; - foreach($output->tables as $key => $val) { - $buff .= sprintf('"%s"=>"%s",', $key, $val); - } - $buff .= ' );'."\n"; - - if(count($output->left_tables)){ - $buff .= '$output->left_tables = array( '; - foreach($output->left_tables as $key => $val) { - $buff .= sprintf('"%s"=>"%s",', $key, $val); - } - $buff .= ' );'."\n"; - } - - // column 정리 - if($column_count) { - $buff .= '$output->columns = array ( '; - $buff .= $this->_getColumn($output->columns); - $buff .= ' );'."\n"; - } - - // conditions 정리 - if($condition_count) { - $buff .= '$output->conditions = array ( '; - $buff .= $this->_getConditions($output->conditions); - $buff .= ' );'."\n"; - } - - // conditions 정리 - if(count($output->left_conditions)) { - $buff .= '$output->left_conditions = array ( '; - foreach($output->left_conditions as $key => $val){ - $buff .= "'{$key}' => array ( "; - $buff .= $this->_getConditions($val); - $buff .= "),\n"; - } - $buff .= ' );'."\n"; - } - - // args 변수 확인 - $arg_list = $this->getArguments(); - if($arg_list) - { - foreach($arg_list as $arg) - { - $pre_buff .= 'if(is_object($args->'.$arg.')){ $args->'.$arg.' = array_values(get_method_vars($args->'.$arg.')); }'. "\n"; - $pre_buff .= 'if(is_array($args->'.$arg.') && count($args->'.$arg.')==0){ unset($args->'.$arg.'); };'."\n"; - } - } - - // order 정리 - if($output->order) { - $buff .= '$output->order = array('; - foreach($output->order as $key => $val) { - $buff .= sprintf('array($args->%s?$args->%s:"%s",in_array($args->%s,array("asc","desc"))?$args->%s:("%s"?"%s":"asc")),', $val->var, $val->var, $val->default, $val->order, $val->order, $val->order, $val->order); - } - $buff .= ');'."\n"; - } - - // list_count 정리 - if($output->list_count) { - $buff .= sprintf('$output->list_count = array("var"=>"%s", "value"=>$args->%s?$args->%s:"%s");%s', $output->list_count->var, $output->list_count->var, $output->list_count->var, $output->list_count->default,"\n"); - } - - // page_count 정리 - if($output->page_count) { - $buff .= sprintf('$output->page_count = array("var"=>"%s", "value"=>$args->%s?$args->%s:"%s");%s', $output->page_count->var, $output->page_count->var, $output->page_count->var, $output->list_count->default,"\n"); - } - - // page 정리 - if($output->page) { - $buff .= sprintf('$output->page = array("var"=>"%s", "value"=>$args->%s?$args->%s:"%s");%s', $output->page->var, $output->page->var, $output->page->var, $output->list->default,"\n"); - } - - // group by 정리 - if($output->groups) { - $buff .= sprintf('$output->groups = array("%s");%s', implode('","',$output->groups),"\n"); - } - - // minlength check - if(count($minlength_list)) { - foreach($minlength_list as $key => $val) { - $pre_buff .= 'if($args->'.$key.'&&strlen($args->'.$key.')<'.$val.') return new Object(-1, sprintf($lang->filter->outofrange, $lang->'.$key.'?$lang->'.$key.':\''.$key.'\'));'."\n"; - } - } - - // maxlength check - if(count($maxlength_list)) { - foreach($maxlength_list as $key => $val) { - $pre_buff .= 'if($args->'.$key.'&&strlen($args->'.$key.')>'.$val.') return new Object(-1, sprintf($lang->filter->outofrange, $lang->'.$key.'?$lang->'.$key.':\''.$key.'\'));'."\n"; - } - } - - // filter check - if(count($this->filter_list)) { - foreach($this->filter_list as $key => $val) { - $pre_buff .= sprintf('if(isset($args->%s)) { unset($_output); $_output = $this->checkFilter("%s",$args->%s,"%s"); if(!$_output->toBool()) return $_output; } %s',$val->var, $val->var,$val->var,$val->filter,"\n"); - } - } - - // default check - if(count($this->default_list)) { - foreach($this->default_list as $key => $val) { - $pre_buff .= 'if(!isset($args->'.$key.')) $args->'.$key.' = '.$val.';'."\n"; - } - } - - // not null check - if(count($this->notnull_list)) { - foreach($this->notnull_list as $key => $val) { - $pre_buff .= 'if(!isset($args->'.$val.')) return new Object(-1, sprintf($lang->filter->isnull, $lang->'.$val.'?$lang->'.$val.':\''.$val.'\'));'."\n"; - } - } - - $buff = "query_id = "%s";%s', $query_id, "\n") - . sprintf('$output->action = "%s";%s', $action, "\n") - . $pre_buff - . $buff - . 'return $output; ?>'; - - // 저장 - FileHandler::writeFile($cache_file, $buff); - } - - /** - * @brief transfer given column information to object->columns - * @param[in] column information - * @result Returns $object - */ - - function _setColumn($columns){ - if(!$columns) { - $output->column[] = array("*" => "*"); - } else { - if(!is_array($columns)) $columns = array($columns); - foreach($columns as $key => $val) { - $name = $val->attrs->name; - /* - if(strpos('.',$name)===false && count($output->tables)==1) { - $tmp = array_values($output->tables); - $name = sprintf('%s.%s', $tmp[0], $val->attrs->name); - } - */ - - $output->columns[] = array( - "name" => $name, - "var" => $val->attrs->var, - "default" => $val->attrs->default, - "notnull" => $val->attrs->notnull, - "filter" => $val->attrs->filter, - "minlength" => $val->attrs->minlength, - "maxlength" => $val->attrs->maxlength, - "alias" => $val->attrs->alias, - "click_count" => $val->attrs->click_count, - ); - } - } - return $output; - } - - /** - * @brief transfer condition information to $object->conditions - * @param[in] SQL condition information - * @result Returns $output - */ - function _setConditions($conditions){ - // 조건절 정리 - - $condition = $conditions->condition; - if($condition) { - $obj->condition = $condition; - unset($condition); - $condition = array($obj); - } - $condition_group = $conditions->group; - if($condition_group && !is_array($condition_group)) $condition_group = array($condition_group); - - if($condition && $condition_group) $cond = array_merge($condition, $condition_group); - elseif($condition_group) $cond = $condition_group; - else $cond = $condition; - - if($cond) { - foreach($cond as $key => $val) { - unset($cond_output); - - if($val->attrs->pipe) $cond_output->pipe = $val->attrs->pipe; - else $cond_output->pipe = null; - - if(!$val->condition) continue; - if(!is_array($val->condition)) $val->condition = array($val->condition); - - foreach($val->condition as $k => $v) { - $obj = $v->attrs; - if(!$obj->alias) $obj->alias = $obj->column; - $cond_output->condition[] = $obj; - } - - $output->conditions[] = $cond_output; - } - } - return $output; - } - - /** - * @brief transfer condition information to $object->groups - * @param[in] SQL group information - * @result Returns $output - */ - function _setGroup($group_list){ - // group 정리 - - if($group_list) { - if(!is_array($group_list)) $group_list = array($group_list); - for($i=0;$iattrs->column); - if(!$column) continue; - $group_column_list[] = $column; - } - if(count($group_column_list)) $output->groups = $group_column_list; - } - return $output; - } - - - /** - * @brief transfer pagnation information to $output - * @param[in] $xml_obj xml object containing Navigation information - * @result Returns $output - */ - function _setNavigation($xml_obj){ - $navigation = $xml_obj->query->navigation; - if($navigation) { - $order = $navigation->index; - if($order) { - if(!is_array($order)) $order = array($order); - foreach($order as $order_info) { - $output->order[] = $order_info->attrs; - } - } - - $list_count = $navigation->list_count->attrs; - $output->list_count = $list_count; - - $page_count = $navigation->page_count->attrs; - $output->page_count = $page_count; - - $page = $navigation->page->attrs; - $output->page = $page ; - } - return $output; - } - - /** - * @brief retrieve column information from $output->colums to generate corresponding php code - * @param[in] $column - * @remarks the name of this method is misleading. - * @result Returns string buffer containing php code - */ - function _getColumn($columns){ - $buff = ''; - $str = ''; - $print_vars = array(); - - foreach($columns as $key => $val) { - $str = 'array("name"=>"%s","alias"=>"%s"'; - $print_vars = array(); - $print_vars[] = $val['name']; - $print_vars[] = $val['alias']; - - $val['default'] = $this->getDefault($val['name'], $val['default']); - if($val['var'] && strpos($val['var'],'.')===false) { - - if($val['default']){ - $str .= ',"value"=>$args->%s?$args->%s:%s'; - $print_vars[] = $val['var']; - $print_vars[] = $val['var']; - $print_vars[] = $val['default']; - }else{ - $str .= ',"value"=>$args->%s'; - $print_vars[] = $val['var']; - } - - } else { - if($val['default']){ - $str .= ',"value"=>%s'; - $print_vars[] = $val['default']; - } - } - - if($val['click_count']){ - $str .= ',"click_count"=>$args->%s'; - $print_vars[] = $val['click_count']; - } - - $str .= '),%s'; - $print_vars[] = "\n"; - - $buff .= vsprintf($str, $print_vars); - } - return $buff; - } - - /** - * @brief retrieve condition information from $output->condition to generate corresponding php code - * @param[in] $conditions array containing Query conditions - * @remarks the name of this method is misleading. - * @return Returns string buffer containing php code - */ - function _getConditions($conditions){ - $buff = ''; - foreach($conditions as $key => $val) { - $buff .= sprintf('array("pipe"=>"%s",%s"condition"=>array(', $val->pipe,"\n"); - foreach($val->condition as $k => $v) { - $v->default = $this->getDefault($v->column, $v->default); - if($v->var) { - if(strpos($v->var,".")===false) { - if($v->default) $this->default_list[$v->var] = $v->default; - if($v->filter) $this->filter_list[] = $v; - if($v->notnull) $this->notnull_list[] = $v->var; - if($v->default) $buff .= sprintf('array("column"=>"%s", "value"=>$args->%s?$args->%s:%s,"pipe"=>"%s","operation"=>"%s",),%s', $v->column, $v->var, $v->var, $v->default, $v->pipe, $v->operation, "\n"); - else $buff .= sprintf('array("column"=>"%s", "value"=>$args->%s,"pipe"=>"%s","operation"=>"%s",),%s', $v->column, $v->var, $v->pipe, $v->operation, "\n"); - - $this->addArguments($v->var); - } else { - $buff .= sprintf('array("column"=>"%s", "value"=>"%s","pipe"=>"%s","operation"=>"%s",),%s', $v->column, $v->var, $v->pipe, $v->operation, "\n"); - } - } else { - if($v->default) $buff .= sprintf('array("column"=>"%s", "value"=>%s,"pipe"=>"%s","operation"=>"%s",),%s', $v->column, $v->default ,$v->pipe, $v->operation,"\n"); - else $buff .= sprintf('array("column"=>"%s", "pipe"=>"%s","operation"=>"%s",),%s', $v->column, $v->pipe, $v->operation,"\n"); - } - } - $buff .= ')),'."\n"; - } - return $buff; - } - - function addArguments($args_name) - { - $this->args[] = $args_name; - } - - function getArguments() - { - return $this->args; - } - - /** - * @brief returns predefined default values correspoding to given parameters - * @param[in] $name - * @param[in] $value - * @return Returns a default value for specified field - */ - function getDefault($name, $value) { - $db_info = Context::getDBInfo (); - if(!isset($value)) return; - $str_pos = strpos($value, '('); - if($str_pos===false) return '"'.$value.'"'; - - $func_name = substr($value, 0, $str_pos); - $args = substr($value, $str_pos+1, strlen($value)-1); - - switch($func_name) { - case 'ipaddress' : - $val = '$_SERVER[\'REMOTE_ADDR\']'; - break; - case 'unixtime' : - $val = 'time()'; - break; - case 'curdate' : - $val = 'date("YmdHis")'; - break; - case 'sequence' : - $val = '$this->getNextSequence()'; - break; - case 'plus' : - $args = abs($args); - if ($db_info->db_type == 'cubrid') { - $val = sprintf ('"\\"%s\\"+%d"', $name, $args); - } else { - $val = sprintf('"%s+%d"', $name, $args); - } - break; - case 'minus' : - $args = abs($args); - if ($db_info->db_type == 'cubrid') { - $val = sprintf ('"\\"%s\\"-%d"', $name, $args); - } else { - $val = sprintf('"%s-%d"', $name, $args); - } - break; - case 'multiply' : - $args = intval($args); - if ($db_info->db_type == 'cubrid') { - $val = sprintf ('"\\"%s\\"*%d"', $name, $args); - } else { - $val = sprintf('"%s*%d"', $name, $args); - } - break; - } - - return $val; - } - } -?> +query->attrs->action); + if(!$action) return; + + // 테이블 정리 (배열코드로 변환) + $tables = $xml_obj->query->tables->table; + $output->left_tables = array(); + + $left_conditions = array(); + + if(!$tables) return; + if(!is_array($tables)) $tables = array($tables); + foreach($tables as $key => $val) { + + // 테이블과 alias의 이름을 구함 + $table_name = $val->attrs->name; + $alias = $val->attrs->alias; + if(!$alias) $alias = $table_name; + + $output->tables[$alias] = $table_name; + + if(in_array($val->attrs->type,array('left join','left outer join','right join','right outer join')) && count($val->conditions)){ + $output->left_tables[$alias] = $val->attrs->type; + $left_conditions[$alias] = $val->conditions; + } + + // 테이블을 찾아서 컬럼의 속성을 구함 + $table_file = sprintf('%s%s/%s/schemas/%s.xml', _XE_PATH_, 'modules', $module, $table_name); + if(!file_exists($table_file)) { + $searched_list = FileHandler::readDir(_XE_PATH_.'modules'); + $searched_count = count($searched_list); + for($i=0;$i<$searched_count;$i++) { + $table_file = sprintf('%s%s/%s/schemas/%s.xml', _XE_PATH_, 'modules', $searched_list[$i], $table_name); + if(file_exists($table_file)) break; + } + } + + if(file_exists($table_file)) { + $table_xml = FileHandler::readFile($table_file); + $table_obj = parent::parse($table_xml); + if($table_obj->table) { + if(isset($table_obj->table->column) && !is_array($table_obj->table->column)) + { + $table_obj->table->column = array($table_obj->table->column); + } + + foreach($table_obj->table->column as $k => $v) { + $buff .= sprintf('$output->column_type["%s"] = "%s";%s', $v->attrs->name, $v->attrs->type, "\n"); + } + } + } + } + + + // 컬럼 정리 + $columns = $xml_obj->query->columns->column; + $out = $this->_setColumn($columns); + $output->columns = $out->columns; + + $conditions = $xml_obj->query->conditions; + $out = $this->_setConditions($conditions); + $output->conditions = $out->conditions; + + foreach($output->left_tables as $key => $val){ + if($left_conditions[$key]){ + $out = $this->_setConditions($left_conditions[$key]); + $output->left_conditions[$key] = $out->conditions; + } + } + + $group_list = $xml_obj->query->groups->group; + $out = $this->_setGroup($group_list); + $output->groups = $out->groups; + + // 네비게이션 정리 + $out = $this->_setNavigation($xml_obj); + $output->order = $out->order; + $output->list_count = $out->list_count; + $output->page_count = $out->page_count; + $output->page = $out->page; + + $column_count = count($output->columns); + $condition_count = count($output->conditions); + + $buff .= '$output->tables = array( '; + foreach($output->tables as $key => $val) { + if(!array_key_exists($key,$output->left_tables)){ + $buff .= sprintf('"%s"=>"%s",', $key, $val); + } + } + $buff .= ' );'."\n"; + + // php script 생성 + $buff .= '$output->_tables = array( '; + foreach($output->tables as $key => $val) { + $buff .= sprintf('"%s"=>"%s",', $key, $val); + } + $buff .= ' );'."\n"; + + if(count($output->left_tables)){ + $buff .= '$output->left_tables = array( '; + foreach($output->left_tables as $key => $val) { + $buff .= sprintf('"%s"=>"%s",', $key, $val); + } + $buff .= ' );'."\n"; + } + + // column 정리 + if($column_count) { + $buff .= '$output->columns = array ( '; + $buff .= $this->_getColumn($output->columns); + $buff .= ' );'."\n"; + } + + // conditions 정리 + if($condition_count) { + $buff .= '$output->conditions = array ( '; + $buff .= $this->_getConditions($output->conditions); + $buff .= ' );'."\n"; + } + + // conditions 정리 + if(count($output->left_conditions)) { + $buff .= '$output->left_conditions = array ( '; + foreach($output->left_conditions as $key => $val){ + $buff .= "'{$key}' => array ( "; + $buff .= $this->_getConditions($val); + $buff .= "),\n"; + } + $buff .= ' );'."\n"; + } + + // args 변수 확인 + $arg_list = $this->getArguments(); + if($arg_list) + { + foreach($arg_list as $arg) + { + $pre_buff .= 'if(is_object($args->'.$arg.')){ $args->'.$arg.' = array_values(get_method_vars($args->'.$arg.')); }'. "\n"; + $pre_buff .= 'if(is_array($args->'.$arg.') && count($args->'.$arg.')==0){ unset($args->'.$arg.'); };'."\n"; + } + } + + // order 정리 + if($output->order) { + $buff .= '$output->order = array('; + foreach($output->order as $key => $val) { + $buff .= sprintf('array($args->%s?$args->%s:"%s",in_array($args->%s,array("asc","desc"))?$args->%s:("%s"?"%s":"asc")),', $val->var, $val->var, $val->default, $val->order, $val->order, $val->order, $val->order); + } + $buff .= ');'."\n"; + } + + // list_count 정리 + if($output->list_count) { + $buff .= sprintf('$output->list_count = array("var"=>"%s", "value"=>$args->%s?$args->%s:"%s");%s', $output->list_count->var, $output->list_count->var, $output->list_count->var, $output->list_count->default,"\n"); + } + + // page_count 정리 + if($output->page_count) { + $buff .= sprintf('$output->page_count = array("var"=>"%s", "value"=>$args->%s?$args->%s:"%s");%s', $output->page_count->var, $output->page_count->var, $output->page_count->var, $output->list_count->default,"\n"); + } + + // page 정리 + if($output->page) { + $buff .= sprintf('$output->page = array("var"=>"%s", "value"=>$args->%s?$args->%s:"%s");%s', $output->page->var, $output->page->var, $output->page->var, $output->list->default,"\n"); + } + + // group by 정리 + if($output->groups) { + $buff .= sprintf('$output->groups = array("%s");%s', implode('","',$output->groups),"\n"); + } + + // minlength check + if(count($minlength_list)) { + foreach($minlength_list as $key => $val) { + $pre_buff .= 'if($args->'.$key.'&&strlen($args->'.$key.')<'.$val.') return new Object(-1, sprintf($lang->filter->outofrange, $lang->'.$key.'?$lang->'.$key.':\''.$key.'\'));'."\n"; + } + } + + // maxlength check + if(count($maxlength_list)) { + foreach($maxlength_list as $key => $val) { + $pre_buff .= 'if($args->'.$key.'&&strlen($args->'.$key.')>'.$val.') return new Object(-1, sprintf($lang->filter->outofrange, $lang->'.$key.'?$lang->'.$key.':\''.$key.'\'));'."\n"; + } + } + + // filter check + if(count($this->filter_list)) { + foreach($this->filter_list as $key => $val) { + $pre_buff .= sprintf('if(isset($args->%s)) { unset($_output); $_output = $this->checkFilter("%s",$args->%s,"%s"); if(!$_output->toBool()) return $_output; } %s',$val->var, $val->var,$val->var,$val->filter,"\n"); + } + } + + // default check + if(count($this->default_list)) { + foreach($this->default_list as $key => $val) { + $pre_buff .= 'if(!isset($args->'.$key.')) $args->'.$key.' = '.$val.';'."\n"; + } + } + + // not null check + if(count($this->notnull_list)) { + foreach($this->notnull_list as $key => $val) { + $pre_buff .= 'if(!isset($args->'.$val.')) return new Object(-1, sprintf($lang->filter->isnull, $lang->'.$val.'?$lang->'.$val.':\''.$val.'\'));'."\n"; + } + } + + $buff = "query_id = "%s";%s', $query_id, "\n") + . sprintf('$output->action = "%s";%s', $action, "\n") + . $pre_buff + . $buff + . 'return $output; ?>'; + + // 저장 + FileHandler::writeFile($cache_file, $buff); + } + + /** + * @brief transfer given column information to object->columns + * @param[in] column information + * @result Returns $object + */ + + function _setColumn($columns){ + if(!$columns) { + $output->column[] = array("*" => "*"); + } else { + if(!is_array($columns)) $columns = array($columns); + foreach($columns as $key => $val) { + $name = $val->attrs->name; + /* + if(strpos('.',$name)===false && count($output->tables)==1) { + $tmp = array_values($output->tables); + $name = sprintf('%s.%s', $tmp[0], $val->attrs->name); + } + */ + + $output->columns[] = array( + "name" => $name, + "var" => $val->attrs->var, + "default" => $val->attrs->default, + "notnull" => $val->attrs->notnull, + "filter" => $val->attrs->filter, + "minlength" => $val->attrs->minlength, + "maxlength" => $val->attrs->maxlength, + "alias" => $val->attrs->alias, + "click_count" => $val->attrs->click_count, + ); + } + } + return $output; + } + + /** + * @brief transfer condition information to $object->conditions + * @param[in] SQL condition information + * @result Returns $output + */ + function _setConditions($conditions){ + // 조건절 정리 + + $condition = $conditions->condition; + if($condition) { + $obj->condition = $condition; + unset($condition); + $condition = array($obj); + } + $condition_group = $conditions->group; + if($condition_group && !is_array($condition_group)) $condition_group = array($condition_group); + + if($condition && $condition_group) $cond = array_merge($condition, $condition_group); + elseif($condition_group) $cond = $condition_group; + else $cond = $condition; + + if($cond) { + foreach($cond as $key => $val) { + unset($cond_output); + + if($val->attrs->pipe) $cond_output->pipe = $val->attrs->pipe; + else $cond_output->pipe = null; + + if(!$val->condition) continue; + if(!is_array($val->condition)) $val->condition = array($val->condition); + + foreach($val->condition as $k => $v) { + $obj = $v->attrs; + if(!$obj->alias) $obj->alias = $obj->column; + $cond_output->condition[] = $obj; + } + + $output->conditions[] = $cond_output; + } + } + return $output; + } + + /** + * @brief transfer condition information to $object->groups + * @param[in] SQL group information + * @result Returns $output + */ + function _setGroup($group_list){ + // group 정리 + + if($group_list) { + if(!is_array($group_list)) $group_list = array($group_list); + for($i=0;$iattrs->column); + if(!$column) continue; + $group_column_list[] = $column; + } + if(count($group_column_list)) $output->groups = $group_column_list; + } + return $output; + } + + + /** + * @brief transfer pagnation information to $output + * @param[in] $xml_obj xml object containing Navigation information + * @result Returns $output + */ + function _setNavigation($xml_obj){ + $navigation = $xml_obj->query->navigation; + if($navigation) { + $order = $navigation->index; + if($order) { + if(!is_array($order)) $order = array($order); + foreach($order as $order_info) { + $output->order[] = $order_info->attrs; + } + } + + $list_count = $navigation->list_count->attrs; + $output->list_count = $list_count; + + $page_count = $navigation->page_count->attrs; + $output->page_count = $page_count; + + $page = $navigation->page->attrs; + $output->page = $page ; + } + return $output; + } + + /** + * @brief retrieve column information from $output->colums to generate corresponding php code + * @param[in] $column + * @remarks the name of this method is misleading. + * @result Returns string buffer containing php code + */ + function _getColumn($columns){ + $buff = ''; + $str = ''; + $print_vars = array(); + + foreach($columns as $key => $val) { + $str = 'array("name"=>"%s","alias"=>"%s"'; + $print_vars = array(); + $print_vars[] = $val['name']; + $print_vars[] = $val['alias']; + + $val['default'] = $this->getDefault($val['name'], $val['default']); + if($val['var'] && strpos($val['var'],'.')===false) { + + if($val['default']){ + $str .= ',"value"=>$args->%s?$args->%s:%s'; + $print_vars[] = $val['var']; + $print_vars[] = $val['var']; + $print_vars[] = $val['default']; + }else{ + $str .= ',"value"=>$args->%s'; + $print_vars[] = $val['var']; + } + + } else { + if($val['default']){ + $str .= ',"value"=>%s'; + $print_vars[] = $val['default']; + } + } + + if($val['click_count']){ + $str .= ',"click_count"=>$args->%s'; + $print_vars[] = $val['click_count']; + } + + $str .= '),%s'; + $print_vars[] = "\n"; + + $buff .= vsprintf($str, $print_vars); + } + return $buff; + } + + /** + * @brief retrieve condition information from $output->condition to generate corresponding php code + * @param[in] $conditions array containing Query conditions + * @remarks the name of this method is misleading. + * @return Returns string buffer containing php code + */ + function _getConditions($conditions){ + $buff = ''; + foreach($conditions as $key => $val) { + $buff .= sprintf('array("pipe"=>"%s",%s"condition"=>array(', $val->pipe,"\n"); + foreach($val->condition as $k => $v) { + $v->default = $this->getDefault($v->column, $v->default); + if($v->var) { + if(strpos($v->var,".")===false) { + if($v->default) $this->default_list[$v->var] = $v->default; + if($v->filter) $this->filter_list[] = $v; + if($v->notnull) $this->notnull_list[] = $v->var; + if($v->default) $buff .= sprintf('array("column"=>"%s", "value"=>$args->%s?$args->%s:%s,"pipe"=>"%s","operation"=>"%s",),%s', $v->column, $v->var, $v->var, $v->default, $v->pipe, $v->operation, "\n"); + else $buff .= sprintf('array("column"=>"%s", "value"=>$args->%s,"pipe"=>"%s","operation"=>"%s",),%s', $v->column, $v->var, $v->pipe, $v->operation, "\n"); + + $this->addArguments($v->var); + } else { + $buff .= sprintf('array("column"=>"%s", "value"=>"%s","pipe"=>"%s","operation"=>"%s",),%s', $v->column, $v->var, $v->pipe, $v->operation, "\n"); + } + } else { + if($v->default) $buff .= sprintf('array("column"=>"%s", "value"=>%s,"pipe"=>"%s","operation"=>"%s",),%s', $v->column, $v->default ,$v->pipe, $v->operation,"\n"); + else $buff .= sprintf('array("column"=>"%s", "pipe"=>"%s","operation"=>"%s",),%s', $v->column, $v->pipe, $v->operation,"\n"); + } + } + $buff .= ')),'."\n"; + } + return $buff; + } + + function addArguments($args_name) + { + $this->args[] = $args_name; + } + + function getArguments() + { + return $this->args; + } + + /** + * @brief returns predefined default values correspoding to given parameters + * @param[in] $name + * @param[in] $value + * @return Returns a default value for specified field + */ + function getDefault($name, $value) { + $db_info = Context::getDBInfo (); + if(!isset($value)) return; + $str_pos = strpos($value, '('); + if($str_pos===false) return '"'.$value.'"'; + + $func_name = substr($value, 0, $str_pos); + $args = substr($value, $str_pos+1, strlen($value)-1); + + switch($func_name) { + case 'ipaddress' : + $val = '$_SERVER[\'REMOTE_ADDR\']'; + break; + case 'unixtime' : + $val = 'time()'; + break; + case 'curdate' : + $val = 'date("YmdHis")'; + break; + case 'sequence' : + $val = '$this->getNextSequence()'; + break; + case 'plus' : + $args = abs($args); + if ($db_info->db_type == 'cubrid') { + $val = sprintf ('"\\"%s\\"+%d"', $name, $args); + } else { + $val = sprintf('"%s+%d"', $name, $args); + } + break; + case 'minus' : + $args = abs($args); + if ($db_info->db_type == 'cubrid') { + $val = sprintf ('"\\"%s\\"-%d"', $name, $args); + } else { + $val = sprintf('"%s-%d"', $name, $args); + } + break; + case 'multiply' : + $args = intval($args); + if ($db_info->db_type == 'cubrid') { + $val = sprintf ('"\\"%s\\"*%d"', $name, $args); + } else { + $val = sprintf('"%s*%d"', $name, $args); + } + break; + } + + return $val; + } + } +?> diff --git a/common/css/button.css b/common/css/button.css index fb9661cd9..5177e1e4c 100644 --- a/common/css/button.css +++ b/common/css/button.css @@ -1,91 +1,91 @@ -/* NHN (developers@xpressengine.com) */ - -/* Anchor Button */ -a.button, -a.button span { position:relative; display:inline-block; text-decoration:none !important; background:url(../tpl/images/buttonWhite.gif) no-repeat; cursor:pointer; white-space:nowrap; vertical-align:middle;} -a.button { padding:0; background-position:left top; overflow:visible;} -a.button span { left:2px; padding:6px 10px 5px 8px; color:#000; font:12px/12px Sans-serif; background-position:right top; *vertical-align:top;} -/* Large Size */ -a.button.large { background-position:left -30px; } -a.button.large span { padding:7px 10px 6px 8px; font:16px/16px Sans-serif; background-position:right -30px;} -/* xLarge Size */ -a.button.xLarge { background-position:left -65px; } -a.button.xLarge span { padding:8px 10px 7px 8px; font:20px/20px Sans-serif; background-position:right -65px;} -/* Small Size */ -a.button.small { background-position:left -107px; } -a.button.small span { padding:4px 6px 3px 4px; font:11px/11px Sans-serif; background-position:right -107px;} - -/* Control Button + Submit Button */ -span.button, -span.button button, -span.button input { position:relative; margin:0; display:inline-block; border:0; font:12px Sans-serif; white-space:nowrap; background:url(../tpl/images/buttonWhite.gif) no-repeat; vertical-align:middle;} -span.button { padding:0; background-position:left top;} -span.button button, -span.button input { height:23px; left:2px; *vertical-align:top; padding:0 10px 0 8px; line-height:24px; background-position:right top; cursor:pointer; *overflow:visible;} -/* Large Size */ -span.button.large { background-position:left -30px;} -span.button.large button, -span.button.large input { height:30px; padding:0 10px 0 8px; font:16px/30px Sans-serif; background-position:right -30px;} -/* xLarge Size */ -span.button.xLarge { background-position:left -65px;} -span.button.xLarge button, -span.button.xLarge input { height:35px; padding:0 10px 0 8px; font:20px/36px Sans-serif; background-position:right -65px;} -/* Small Size */ -span.button.small { background-position:left -107px;} -span.button.small button, -span.button.small input { height:18px; padding:0 6px 0 4px; font:11px/18px Sans-serif; background-position:right -107px;} - -/* Strong Button */ -a.button.strong *, -span.button.strong * { font-weight:bold !important;} - -/* Icon Add */ -a.button .icon { position:relative; border:0; vertical-align:middle;} -span.button .icon { position:relative; left:10px; margin-right:8px; vertical-align:middle;} - -/* Color Preset */ -a.button.green, -a.button.green span, -span.button.green, -span.button.green button, -span.button.green input { background-image:url(../tpl/images/buttonGreen.gif); color:#fff;} -a.button.black, -a.button.black span, -span.button.black, -span.button.black button, -span.button.black input { background-image:url(../tpl/images/buttonBlack.gif); color:#fff;} -a.button.red, -a.button.red span, -span.button.red, -span.button.red button, -span.button.red input { background-image:url(../tpl/images/buttonRed.gif); color:#fff;} -a.button.blue, -a.button.blue span, -span.button.blue, -span.button.blue button, -span.button.blue input { background-image:url(../tpl/images/buttonBlue.gif); color:#fff;} - -/* Offset Debug */ -a.button, -span.button{ margin-right:2px;} - -/* Button Set */ -.buttonSet{ width:16px; height:16px; background-image:url(../tpl/images/buttonSet.gif); background-repeat:no-repeat; border:0; background-color:transparent; vertical-align:middle; display:inline-block; text-decoration:none;} -.buttonSet span{ z-index:-1; font-size:0; line-height:0; visibility:hidden;} -.buttonSet.buttonUp{ background-position:0 0;} -.buttonSet.buttonDown{ background-position:0 -16px;} -.buttonSet.buttonLeft{ background-position:0 -32px;} -.buttonSet.buttonRight{ background-position:0 -48px;} -.buttonSet.buttonInfo{ background-position:0 -64px;} -.buttonSet.buttonCopy{ background-position:0 -80px;} -.buttonSet.buttonSetting{ background-position:0 -96px;} -.buttonSet.buttonActive{ background-position:0 -112px;} -.buttonSet.buttonDisable{ background-position:0 -128px;} -.buttonSet.buttonDelete{ background-position:0 -144px;} -.buttonSet.buttonHomepage{ background-position:0 -160px;} -.buttonSet.buttonBlog{ background-position:0 -176px;} -.buttonSet.buttonCalendar{ background-position:0 -192px;} -.buttonSet.buttonLayoutEditor{ background-position:0 -208px;} -.buttonSet.buttonAddWidget{ background-position:0 -224px;} -.buttonSet.buttonAddContent{ background-position:0 -240px;} - +/* NHN (developers@xpressengine.com) */ + +/* Anchor Button */ +a.button, +a.button span { position:relative; display:inline-block; text-decoration:none !important; background:url(../tpl/images/buttonWhite.gif) no-repeat; cursor:pointer; white-space:nowrap; vertical-align:middle;} +a.button { padding:0; background-position:left top; overflow:visible;} +a.button span { left:2px; padding:6px 10px 5px 8px; color:#000; font:12px/12px Sans-serif; background-position:right top; *vertical-align:top;} +/* Large Size */ +a.button.large { background-position:left -30px; } +a.button.large span { padding:7px 10px 6px 8px; font:16px/16px Sans-serif; background-position:right -30px;} +/* xLarge Size */ +a.button.xLarge { background-position:left -65px; } +a.button.xLarge span { padding:8px 10px 7px 8px; font:20px/20px Sans-serif; background-position:right -65px;} +/* Small Size */ +a.button.small { background-position:left -107px; } +a.button.small span { padding:4px 6px 3px 4px; font:11px/11px Sans-serif; background-position:right -107px;} + +/* Control Button + Submit Button */ +span.button, +span.button button, +span.button input { position:relative; margin:0; display:inline-block; border:0; font:12px Sans-serif; white-space:nowrap; background:url(../tpl/images/buttonWhite.gif) no-repeat; vertical-align:middle;} +span.button { padding:0; background-position:left top;} +span.button button, +span.button input { height:23px; left:2px; *vertical-align:top; padding:0 10px 0 8px; line-height:24px; background-position:right top; cursor:pointer; *overflow:visible;} +/* Large Size */ +span.button.large { background-position:left -30px;} +span.button.large button, +span.button.large input { height:30px; padding:0 10px 0 8px; font:16px/30px Sans-serif; background-position:right -30px;} +/* xLarge Size */ +span.button.xLarge { background-position:left -65px;} +span.button.xLarge button, +span.button.xLarge input { height:35px; padding:0 10px 0 8px; font:20px/36px Sans-serif; background-position:right -65px;} +/* Small Size */ +span.button.small { background-position:left -107px;} +span.button.small button, +span.button.small input { height:18px; padding:0 6px 0 4px; font:11px/18px Sans-serif; background-position:right -107px;} + +/* Strong Button */ +a.button.strong *, +span.button.strong * { font-weight:bold !important;} + +/* Icon Add */ +a.button .icon { position:relative; border:0; vertical-align:middle;} +span.button .icon { position:relative; left:10px; margin-right:8px; vertical-align:middle;} + +/* Color Preset */ +a.button.green, +a.button.green span, +span.button.green, +span.button.green button, +span.button.green input { background-image:url(../tpl/images/buttonGreen.gif); color:#fff;} +a.button.black, +a.button.black span, +span.button.black, +span.button.black button, +span.button.black input { background-image:url(../tpl/images/buttonBlack.gif); color:#fff;} +a.button.red, +a.button.red span, +span.button.red, +span.button.red button, +span.button.red input { background-image:url(../tpl/images/buttonRed.gif); color:#fff;} +a.button.blue, +a.button.blue span, +span.button.blue, +span.button.blue button, +span.button.blue input { background-image:url(../tpl/images/buttonBlue.gif); color:#fff;} + +/* Offset Debug */ +a.button, +span.button{ margin-right:2px;} + +/* Button Set */ +.buttonSet{ width:16px; height:16px; background-image:url(../tpl/images/buttonSet.gif); background-repeat:no-repeat; border:0; background-color:transparent; vertical-align:middle; display:inline-block; text-decoration:none;} +.buttonSet span{ z-index:-1; font-size:0; line-height:0; visibility:hidden;} +.buttonSet.buttonUp{ background-position:0 0;} +.buttonSet.buttonDown{ background-position:0 -16px;} +.buttonSet.buttonLeft{ background-position:0 -32px;} +.buttonSet.buttonRight{ background-position:0 -48px;} +.buttonSet.buttonInfo{ background-position:0 -64px;} +.buttonSet.buttonCopy{ background-position:0 -80px;} +.buttonSet.buttonSetting{ background-position:0 -96px;} +.buttonSet.buttonActive{ background-position:0 -112px;} +.buttonSet.buttonDisable{ background-position:0 -128px;} +.buttonSet.buttonDelete{ background-position:0 -144px;} +.buttonSet.buttonHomepage{ background-position:0 -160px;} +.buttonSet.buttonBlog{ background-position:0 -176px;} +.buttonSet.buttonCalendar{ background-position:0 -192px;} +.buttonSet.buttonLayoutEditor{ background-position:0 -208px;} +.buttonSet.buttonAddWidget{ background-position:0 -224px;} +.buttonSet.buttonAddContent{ background-position:0 -240px;} + diff --git a/common/css/default.css b/common/css/default.css index dba8b421f..b9e81d058 100644 --- a/common/css/default.css +++ b/common/css/default.css @@ -1,91 +1,91 @@ -/* default.css - Type Selector Definition */ -body { margin:0;padding:0; font-size:.75em;} - -img { border:none; } -label { cursor:pointer; } -form { margin:0; padding:0; } - -/* Special Class Selector */ -.fr { float:right; } -.fl { float:left; } -.clear { clear:both; } -.fwB { font-weight:bold;} -.tCenter { text-align:center; } -.tRight { text-align:right; } -.tLeft { text-align:left; } -.gap1 { margin-top:.8em; } -.nowrap { white-space:nowrap; } - -.iePngFix { behavior:url(./common/js/iePngFix.htc); } -.zbxe_info { vertical-align:middle; behavior:url(./common/js/iePngFix.htc); } - -/* Input Style Definition */ -.inputTypeText { border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; height:1.4em; padding:.2em 0 0 .3em; background:#ffffff; font-size:1em; _font-size:9pt; } -*:first-child+html .inputTypeText { font-size:9pt; } -.inputTypeText:hover, -.inputTypeText:focus { background:#f4f4f4; } -.inputTypeTextArea { border:1px solid !important; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6 !important; background:#ffffff; font-size:1em; _font-size:9pt; height:100px;} -*:first-child+html .inputTypeTextArea { font-size:9pt; } - -.w40 { width:40px; } -.w60 { width:60px; } -.w70 { width:70px; } -.w80 { width:80px; } -.w90 { width:90px; } -.w100 { width:100px; } -.w110 { width:110px; } -.w120 { width:120px; } -.w130 { width:130px; } -.w140 { width:140px; } -.w150 { width:150px; } -.w160 { width:160px; } -.w170 { width:170px; } -.w180 { width:180px; } -.w190 { width:190px; } -.w200 { width:200px; } -.w210 { width:210px; } -.w220 { width:220px; } -.w230 { width:230px; } -.w240 { width:240px; } -.w250 { width:250px; } -.w260 { width:260px; } -.w270 { width:270px; } -.w280 { width:280px; } -.w290 { width:290px; } -.w300 { width:300px; } -.w400 { width:400px; } - -/* editor style */ -a.bold { font-weight:bold; } - -.editor_blue_text { color: #145ff9 !important; text-decoration:underline !important; } -.editor_blue_text a { color: #145ff9 !important; text-decoration:underline !important; } -.editor_red_text { color: #f42126 !important; text-decoration:underline !important; } -.editor_red_text a { color: #f42126 !important; text-decoration:underline !important; } -.editor_yellow_text { color: #c9bd00 !important; text-decoration:underline !important; } -.editor_yellow_text a { color: #c9bd00 !important; text-decoration:underline !important; } -.editor_green_text { color: #08830B !important; text-decoration:underline !important; } -.editor_green_text a { color: #08830B !important; text-decoration:underline !important; } - -.folder_opener { display: block; } -.folder_closer { display: none; } -.folder_area { display: none; } - -.xe_content { line-height:1.6; overflow:hidden; } - -.zbxe_widget_output { background:url(../tpl/images/widget_text.gif) no-repeat center bottom; display:block;} - -/* xe layer */ -#waitingforserverresponse { border:2px solid #444444; font-weight:bold; color:#444444; padding: 7px 5px 5px 25px; background:#FFFFFF url("../tpl/images/loading.gif") no-repeat 5px 5px; top:40px; left:40px; position:absolute; z-index:100; visibility:hidden; } - -#popup_menu_area{ position:absolute; background:#fff; border:2px solid #eee; -moz-border-radius:5px; -webkit-border-radius:5px; margin:0; padding:0;} -#popup_menu_area *{ margin:0; padding:0; list-style:none; font-size:12px; line-height:normal;} -#popup_menu_area ul{ border:1px solid #ddd; -moz-border-radius:5px; -webkit-border-radius:5px; padding:10px 10px 5px 10px;} -#popup_menu_area li{ padding:2px 0 2px 20px; background-repeat:no-repeat; background-position:left center; margin-bottom:3px; white-space:nowrap;} -#popup_menu_area li a{ text-decoration:none; color:#000;} -#popup_menu_area li a:hover, -#popup_menu_area li a:active, -#popup_menu_area li a:focus{ font-weight:bold; letter-spacing:-1px;} - -/* xe faceoff */ -.faceOffManager { position:fixed; _position:absolute; right:3px; top:3px; height:23px; } +/* default.css - Type Selector Definition */ +body { margin:0;padding:0; font-size:.75em;} + +img { border:none; } +label { cursor:pointer; } +form { margin:0; padding:0; } + +/* Special Class Selector */ +.fr { float:right; } +.fl { float:left; } +.clear { clear:both; } +.fwB { font-weight:bold;} +.tCenter { text-align:center; } +.tRight { text-align:right; } +.tLeft { text-align:left; } +.gap1 { margin-top:.8em; } +.nowrap { white-space:nowrap; } + +.iePngFix { behavior:url(./common/js/iePngFix.htc); } +.zbxe_info { vertical-align:middle; behavior:url(./common/js/iePngFix.htc); } + +/* Input Style Definition */ +.inputTypeText { border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; height:1.4em; padding:.2em 0 0 .3em; background:#ffffff; font-size:1em; _font-size:9pt; } +*:first-child+html .inputTypeText { font-size:9pt; } +.inputTypeText:hover, +.inputTypeText:focus { background:#f4f4f4; } +.inputTypeTextArea { border:1px solid !important; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6 !important; background:#ffffff; font-size:1em; _font-size:9pt; height:100px;} +*:first-child+html .inputTypeTextArea { font-size:9pt; } + +.w40 { width:40px; } +.w60 { width:60px; } +.w70 { width:70px; } +.w80 { width:80px; } +.w90 { width:90px; } +.w100 { width:100px; } +.w110 { width:110px; } +.w120 { width:120px; } +.w130 { width:130px; } +.w140 { width:140px; } +.w150 { width:150px; } +.w160 { width:160px; } +.w170 { width:170px; } +.w180 { width:180px; } +.w190 { width:190px; } +.w200 { width:200px; } +.w210 { width:210px; } +.w220 { width:220px; } +.w230 { width:230px; } +.w240 { width:240px; } +.w250 { width:250px; } +.w260 { width:260px; } +.w270 { width:270px; } +.w280 { width:280px; } +.w290 { width:290px; } +.w300 { width:300px; } +.w400 { width:400px; } + +/* editor style */ +a.bold { font-weight:bold; } + +.editor_blue_text { color: #145ff9 !important; text-decoration:underline !important; } +.editor_blue_text a { color: #145ff9 !important; text-decoration:underline !important; } +.editor_red_text { color: #f42126 !important; text-decoration:underline !important; } +.editor_red_text a { color: #f42126 !important; text-decoration:underline !important; } +.editor_yellow_text { color: #c9bd00 !important; text-decoration:underline !important; } +.editor_yellow_text a { color: #c9bd00 !important; text-decoration:underline !important; } +.editor_green_text { color: #08830B !important; text-decoration:underline !important; } +.editor_green_text a { color: #08830B !important; text-decoration:underline !important; } + +.folder_opener { display: block; } +.folder_closer { display: none; } +.folder_area { display: none; } + +.xe_content { line-height:1.6; overflow:hidden; } + +.zbxe_widget_output { background:url(../tpl/images/widget_text.gif) no-repeat center bottom; display:block;} + +/* xe layer */ +#waitingforserverresponse { border:2px solid #444444; font-weight:bold; color:#444444; padding: 7px 5px 5px 25px; background:#FFFFFF url("../tpl/images/loading.gif") no-repeat 5px 5px; top:40px; left:40px; position:absolute; z-index:100; visibility:hidden; } + +#popup_menu_area{ position:absolute; background:#fff; border:2px solid #eee; -moz-border-radius:5px; -webkit-border-radius:5px; margin:0; padding:0;} +#popup_menu_area *{ margin:0; padding:0; list-style:none; font-size:12px; line-height:normal;} +#popup_menu_area ul{ border:1px solid #ddd; -moz-border-radius:5px; -webkit-border-radius:5px; padding:10px 10px 5px 10px;} +#popup_menu_area li{ padding:2px 0 2px 20px; background-repeat:no-repeat; background-position:left center; margin-bottom:3px; white-space:nowrap;} +#popup_menu_area li a{ text-decoration:none; color:#000;} +#popup_menu_area li a:hover, +#popup_menu_area li a:active, +#popup_menu_area li a:focus{ font-weight:bold; letter-spacing:-1px;} + +/* xe faceoff */ +.faceOffManager { position:fixed; _position:absolute; right:3px; top:3px; height:23px; } diff --git a/common/js/common.js b/common/js/common.js index edb2957fd..21168c11a 100644 --- a/common/js/common.js +++ b/common/js/common.js @@ -1,113 +1,113 @@ -/** - * @file common.js - * @author NHN (developers@xpressengine.com) - * @brief 몇가지 유용한 & 기본적으로 자주 사용되는 자바스크립트 함수들 모음 - **/ -if(jQuery)jQuery.noConflict();(function($){var UA=navigator.userAgent.toLowerCase();$.os={Linux:/linux/.test(UA),Unix:/x11/.test(UA),Mac:/mac/.test(UA),Windows:/win/.test(UA)};$.os.name=($.os.Windows)?'Windows':($.os.Linux)?'Linux':($.os.Unix)?'Unix':($.os.Mac)?'Mac':'';window.XE={loaded_popup_menus:new Array(),addedDocument:new Array(),checkboxToggleAll:function(){var itemName='cart';var options={wrap:null,checked:'toggle',doClick:false};switch(arguments.length){case 1:if(typeof(arguments[0])=="string"){itemName=arguments[0];}else{$.extend(options,arguments[0]||{});} -break;case 2:itemName=arguments[0];$.extend(options,arguments[1]||{});} -if(options.doClick==true)options.checked=null;if(typeof(options.wrap)=="string")options.wrap='#'+options.wrap;if(options.wrap){var obj=$(options.wrap).find('input[name='+itemName+']:checkbox');}else{var obj=$('input[name='+itemName+']:checkbox');} -if(options.checked=='toggle'){obj.each(function(){$(this).attr('checked',($(this).attr('checked'))?false:true);});}else{(options.doClick==true)?obj.click():obj.attr('checked',options.checked);}},displayPopupMenu:function(ret_obj,response_tags,params){var target_srl=params["target_srl"];var menu_id=params["menu_id"];var menus=ret_obj['menus'];var html="";if(this.loaded_popup_menus[menu_id]){html=this.loaded_popup_menus[menu_id];}else{if(menus){var item=menus['item'];if(typeof(item.length)=='undefined'||item.length<1)item=new Array(item);if(item.length){for(var i=0;i'+str+' ';}}} -this.loaded_popup_menus[menu_id]=html;} -if(html){var area=$('#popup_menu_area').html('
    '+html+'
');var areaOffset={top:params['page_y'],left:params['page_x']};if(area.outerHeight()+areaOffset.top>$(window).height()+$(window).scrollTop()) -areaOffset.top=$(window).height()-area.outerHeight()+$(window).scrollTop();if(area.outerWidth()+areaOffset.left>$(window).width()+$(window).scrollLeft()) -areaOffset.left=$(window).width()-area.outerWidth()+$(window).scrollLeft();area.css({top:areaOffset.top,left:areaOffset.left}).show();}}}})(jQuery);jQuery(function($){if(!$('#popup_menu_area').length){var menuObj=$('
').attr('id','popup_menu_area').css({display:'none',zIndex:9999});$(document.body).append(menuObj);} -$(document).click(function(evt){var area=$('#popup_menu_area');if(!area.length)return;area.hide();var targetObj=$(evt.target);if(!targetObj.length)return;if(targetObj.length&&$.inArray(targetObj.attr('nodeName'),['DIV','SPAN','A'])==-1)targetObj=targetObj.parent();if(!targetObj.length||$.inArray(targetObj.attr('nodeName'),['DIV','SPAN','A'])==-1)return;var class_name=targetObj.attr('className');if(class_name.indexOf('_')<=0)return;var class_name_list=class_name.split(' ');var menu_id='';var menu_id_regx=/^([a-zA-Z]+)_([0-9]+)$/;for(var i=0,c=class_name_list.length;i-1)?first_enable[i]:j;}} -if(!disabled_exists)return;sels.oldonchange=sels.onchange;sels.onchange=function(){if(this.options[this.selectedIndex].disabled){this.selectedIndex=first_enable[i];}else{if(this.oldonchange)this.oldonchange();}};if(sels.selectedIndex>=0&&sels.options[sels.selectedIndex].disabled)sels.onchange();});} -var drEditorFold=$('.xe_content .fold_button');if(drEditorFold.size()){var fold_container=$('div.fold_container',drEditorFold);$('button.more',drEditorFold).click(function(){$(this).hide().next('button').show().parent().next(fold_container).show();});$('button.less',drEditorFold).click(function(){$(this).hide().prev('button').show().parent().next(fold_container).hide();});}});String.prototype.getQuery=function(key){var idx=this.indexOf('?');if(idx==-1)return null;var query_string=this.substr(idx+1,this.length);var args={};query_string.replace(/([^=]+)=([^&]*)(&|$)/g,function(){args[arguments[1]]=arguments[2];});var q=args[key];if(typeof(q)=="undefined")q="";return q;} -String.prototype.setQuery=function(key,val){var idx=this.indexOf('?');var uri=this.replace(/#$/,'');if(idx!=-1){var query_string=uri.substr(idx+1,this.length),args={},q_list=[];uri=this.substr(0,idx);query_string.replace(/([^=]+)=([^&]*)(&|$)/g,function(all,key,val){args[key]=val;});args[key]=val;jQuery.each(args,function(key,val){if(!jQuery.trim(val))return;q_list.push(key+'='+decodeURI(val));});query_string=q_list.join('&');uri=uri+(query_string?'?'+query_string:'');}else{if(val.toString().trim())uri=uri+"?"+key+"="+val;} -var re=/https:\/\/([^:\/]+)(:\d+|)/i;var check=re.exec(uri);if(check) -{var toReplace="http://"+check[1];if(typeof(http_port)!='undefined'&&http_port!=80) -{toReplace+=":"+http_port;} -uri=uri.replace(re,toReplace);} -var bUseSSL=false;if(typeof(enforce_ssl)!='undefined'&&enforce_ssl) -{bUseSSL=true;} -else if(typeof(ssl_actions)!='undefined'&&typeof(ssl_actions.length)!='undefined'&&uri.getQuery('act')){var act=uri.getQuery('act');for(i=0;i-1&&!url.getQuery('vid'))url=url.setQuery('vid',xeVid);try{if(target!="_blank"&&winopen_list[target]){winopen_list[target].close();winopen_list[target]=null;}}catch(e){} -if(typeof(target)=='undefined')target='_blank';if(typeof(attribute)=='undefined')attribute='';var win=window.open(url,target,attribute);win.focus();if(target!="_blank")winopen_list[target]=win;} -function popopen(url,target){if(typeof(target)=="undefined")target="_blank";if(typeof(xeVid)!='undefined'&&url.indexOf(request_uri)>-1&&!url.getQuery('vid'))url=url.setQuery('vid',xeVid);winopen(url,target,"left=10,top=10,width=10,height=10,scrollbars=no,resizable=yes,toolbars=no");} -function sendMailTo(to){location.href="mailto:"+to;} -function move_url(url,open_wnidow){if(!url)return false;if(typeof(open_wnidow)=='undefined')open_wnidow='N';if(open_wnidow=='N'){open_wnidow=false;}else{open_wnidow=true;} -if(/^\./.test(url))url=request_uri+url;if(open_wnidow){winopen(url);}else{location.href=url;} -return false;} -function displayMultimedia(src,width,height,options){var html=_displayMultimedia(src,width,height,options);if(html)document.writeln(html);} -function _displayMultimedia(src,width,height,options){if(src.indexOf('files')==0)src=request_uri+src;var defaults={wmode:'transparent',allowScriptAccess:'sameDomain',quality:'high',flashvars:'',autostart:false};var params=jQuery.extend(defaults,options||{});var autostart=(params.autostart&¶ms.autostart!='false')?'true':'false';delete(params.autostart);var clsid="";var codebase="";var html="";if(/\.(gif|jpg|jpeg|bmp|png)$/i.test(src)){html='';}else if(/\.flv$/i.test(src)||/\.mov$/i.test(src)||/\.moov$/i.test(src)||/\.m4v$/i.test(src)){html='';}else if(/\.swf/i.test(src)){clsid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000';if(typeof(enforce_ssl)!='undefined'&&enforce_ssl){codebase="https://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0";} -else{codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0";} -html='';html+='';for(var name in params){if(params[name]!='undefined'&¶ms[name]!=''){html+='';}} -html+='' -+'' -+'';}else{if(jQuery.browser.mozilla||jQuery.browser.opera){autostart=(params.autostart&¶ms.autostart!='false')?'1':'0';} -html='400){$body.css({overflow:'auto',overflowX:'hidden',height:400+'px'});}} -var $win=$(window);var $pc=$('#popup_content');var w=Math.max($pc[0].offsetWidth,600);var h=$pc[0].offsetHeight;var dw=$win.width();var dh=$win.height();var _w=0,_h=0;if(w!=dw)_w=w-dw;if(h!=dh)_h=h-dh;if(_w||_h){window.resizeBy(_w,_h);} -if(!arguments.callee.executed){setTimeout(setFixedPopupSize,300);arguments.callee.executed=true;}} -function doCallModuleAction(module,action,target_srl){var params=new Array();params['target_srl']=target_srl;params['cur_mid']=current_mid;exec_xml(module,action,params,completeCallModuleAction);} -function completeCallModuleAction(ret_obj,response_tags){if(ret_obj['message']!='success')alert(ret_obj['message']);location.reload();} -function completeMessage(ret_obj){alert(ret_obj['message']);location.reload();} -function doChangeLangType(obj){if(typeof(obj)=="string"){setLangType(obj);}else{var val=obj.options[obj.selectedIndex].value;setLangType(val);} -location.href=location.href.setQuery('l','');} -function setLangType(lang_type){var expire=new Date();expire.setTime(expire.getTime()+(7000*24*3600000));setCookie('lang_type',lang_type,expire,'/');} -function doDocumentPreview(obj){var fo_obj=obj;while(fo_obj.nodeName!="FORM"){fo_obj=fo_obj.parentNode;} -if(fo_obj.nodeName!="FORM")return;var editor_sequence=fo_obj.getAttribute('editor_sequence');var content=editorGetContent(editor_sequence);var win=window.open("","previewDocument","toolbars=no,width=700px;height=800px,scrollbars=yes,resizable=yes");var dummy_obj=jQuery("#previewDocument");if(!dummy_obj.length){jQuery(''+''+''+''+'').appendTo(document.body);dummy_obj=jQuery("#previewDocument")[0];} -if(dummy_obj){dummy_obj.content.value=content;dummy_obj.submit();}} -function doDocumentSave(obj){var editor_sequence=obj.form.getAttribute('editor_sequence');var prev_content=editorRelKeys[editor_sequence]['content'].value;if(typeof(editor_sequence)!='undefined'&&editor_sequence&&typeof(editorRelKeys)!='undefined'&&typeof(editorGetContent)=='function'){var content=editorGetContent(editor_sequence);editorRelKeys[editor_sequence]['content'].value=content;} -var params={},responses=['error','message','document_srl'],elms=obj.form.elements,data=jQuery(obj.form).serializeArray();;jQuery.each(data,function(i,field){var val=jQuery.trim(field.value);if(!val)return true;if(/\[\]$/.test(field.name))field.name=field.name.replace(/\[\]$/,'');if(params[field.name])params[field.name]+='|@|'+val;else params[field.name]=field.value;});exec_xml('member','procMemberSaveDocument',params,completeDocumentSave,responses,params,obj.form);editorRelKeys[editor_sequence]['content'].value=prev_content;return false;} -function completeDocumentSave(ret_obj){jQuery('input[name=document_srl]').eq(0).val(ret_obj['document_srl']);alert(ret_obj['message']);} -var objForSavedDoc=null;function doDocumentLoad(obj){objForSavedDoc=obj.form;popopen(request_uri.setQuery('module','member').setQuery('act','dispSavedDocumentList'));} -function doDocumentSelect(document_srl){if(!opener||!opener.objForSavedDoc){window.close();return;} -opener.location.href=opener.current_url.setQuery('document_srl',document_srl).setQuery('act','dispBoardWrite');window.close();} -function viewSkinInfo(module,skin){popopen("./?module=module&act=dispModuleSkinInfo&selected_module="+module+"&skin="+skin,'SkinInfo');} -var addedDocument=new Array();function doAddDocumentCart(obj){var srl=obj.value;addedDocument[addedDocument.length]=srl;setTimeout(function(){callAddDocumentCart(addedDocument.length);},100);} -function callAddDocumentCart(document_length){if(addedDocument.length<1||document_length!=addedDocument.length)return;var params=new Array();params["srls"]=addedDocument.join(",");exec_xml("document","procDocumentAddCart",params,null);addedDocument=new Array();} -function transRGB2Hex(value){if(!value)return value;if(value.indexOf('#')>-1)return value.replace(/^#/,'');if(value.toLowerCase().indexOf('rgb')<0)return value;value=value.replace(/^rgb\(/i,'').replace(/\)$/,'');value_list=value.split(',');var hex='';for(var i=0;i>2;enc2=((chr1&3)<<4)|(chr2>>4);enc3=((chr2&15)<<2)|(chr3>>6);enc4=chr3&63;if(isNaN(chr2)){enc3=enc4=64;}else if(isNaN(chr3)){enc4=64;} -output=output+ -this._keyStr.charAt(enc1)+this._keyStr.charAt(enc2)+ -this._keyStr.charAt(enc3)+this._keyStr.charAt(enc4);} -return output;},decode:function(input){var output="";var chr1,chr2,chr3;var enc1,enc2,enc3,enc4;var i=0;input=input.replace(/[^A-Za-z0-9\+\/\=]/g,"");while(i>4);chr2=((enc2&15)<<4)|(enc3>>2);chr3=((enc3&3)<<6)|enc4;output=output+String.fromCharCode(chr1);if(enc3!=64){output=output+String.fromCharCode(chr2);} -if(enc4!=64){output=output+String.fromCharCode(chr3);}} -output=Base64._utf8_decode(output);return output;},_utf8_encode:function(string){string=string.replace(/\r\n/g,"\n");var utftext="";for(var n=0;n127)&&(c<2048)){utftext+=String.fromCharCode((c>>6)|192);utftext+=String.fromCharCode((c&63)|128);} -else{utftext+=String.fromCharCode((c>>12)|224);utftext+=String.fromCharCode(((c>>6)&63)|128);utftext+=String.fromCharCode((c&63)|128);}} -return utftext;},_utf8_decode:function(utftext){var string="";var i=0;var c=c1=c2=0;while(i191)&&(c<224)){c2=utftext.charCodeAt(i+1);string+=String.fromCharCode(((c&31)<<6)|(c2&63));i+=2;} -else{c2=utftext.charCodeAt(i+1);c3=utftext.charCodeAt(i+2);string+=String.fromCharCode(((c&15)<<12)|((c2&63)<<6)|(c3&63));i+=3;}} -return string;}} -if(typeof(resizeImageContents)=='undefined'){function resizeImageContents(){}} -if(typeof(activateOptionDisabled)=='undefined'){function activateOptionDisabled(){}} -objectExtend=jQuery.extend;function toggleDisplay(objId){jQuery('#'+objId).toggle();} -function checkboxSelectAll(formObj,name,checked){var itemName=name;var option={};if(typeof(formObj)!="undefined")option.wrap=formObj;if(typeof(checked)!="undefined")option.checked=checked;XE.checkboxToggleAll(itemName,option);} -function clickCheckBoxAll(formObj,name){var itemName=name;var option={doClick:true};if(typeof(formObj)!="undefined")option.wrap=formObj;XE.checkboxToggleAll(itemName,option);} -function svc_folder_open(id){jQuery("#_folder_open_"+id).hide();jQuery("#_folder_close_"+id).show();jQuery("#_folder_"+id).show();} -function svc_folder_close(id){jQuery("#_folder_open_"+id).show();jQuery("#_folder_close_"+id).hide();jQuery("#_folder_"+id).hide();} -function open_calendar(fo_id,day_str,callback_func){if(typeof(day_str)=="undefined")day_str="";var url="./common/tpl/calendar.php?";if(fo_id)url+="fo_id="+fo_id;if(day_str)url+="&day_str="+day_str;if(callback_func)url+="&callback_func="+callback_func;popopen(url,'Calendar');} -var loaded_popup_menus=XE.loaded_popup_menus;function createPopupMenu(){} -function chkPopupMenu(){} -function displayPopupMenu(ret_obj,response_tags,params){XE.displayPopupMenu(ret_obj,response_tags,params);} -function GetObjLeft(obj){return jQuery(obj).offset().left;} -function GetObjTop(obj){return jQuery(obj).offset().top;} -function replaceOuterHTML(obj,html){jQuery(obj).replaceWith(html);} -function getOuterHTML(obj){return jQuery(obj).html().trim();} -function setCookie(name,value,expire,path){var s_cookie=name+"="+escape(value)+ -((!expire)?"":("; expires="+expire.toGMTString()))+"; path="+((!path)?"/":path);document.cookie=s_cookie;} -jQuery(function(){jQuery(".lang_code").each(function() +/** + * @file common.js + * @author NHN (developers@xpressengine.com) + * @brief 몇가지 유용한 & 기본적으로 자주 사용되는 자바스크립트 함수들 모음 + **/ +if(jQuery)jQuery.noConflict();(function($){var UA=navigator.userAgent.toLowerCase();$.os={Linux:/linux/.test(UA),Unix:/x11/.test(UA),Mac:/mac/.test(UA),Windows:/win/.test(UA)};$.os.name=($.os.Windows)?'Windows':($.os.Linux)?'Linux':($.os.Unix)?'Unix':($.os.Mac)?'Mac':'';window.XE={loaded_popup_menus:new Array(),addedDocument:new Array(),checkboxToggleAll:function(){var itemName='cart';var options={wrap:null,checked:'toggle',doClick:false};switch(arguments.length){case 1:if(typeof(arguments[0])=="string"){itemName=arguments[0];}else{$.extend(options,arguments[0]||{});} +break;case 2:itemName=arguments[0];$.extend(options,arguments[1]||{});} +if(options.doClick==true)options.checked=null;if(typeof(options.wrap)=="string")options.wrap='#'+options.wrap;if(options.wrap){var obj=$(options.wrap).find('input[name='+itemName+']:checkbox');}else{var obj=$('input[name='+itemName+']:checkbox');} +if(options.checked=='toggle'){obj.each(function(){$(this).attr('checked',($(this).attr('checked'))?false:true);});}else{(options.doClick==true)?obj.click():obj.attr('checked',options.checked);}},displayPopupMenu:function(ret_obj,response_tags,params){var target_srl=params["target_srl"];var menu_id=params["menu_id"];var menus=ret_obj['menus'];var html="";if(this.loaded_popup_menus[menu_id]){html=this.loaded_popup_menus[menu_id];}else{if(menus){var item=menus['item'];if(typeof(item.length)=='undefined'||item.length<1)item=new Array(item);if(item.length){for(var i=0;i'+str+' ';}}} +this.loaded_popup_menus[menu_id]=html;} +if(html){var area=$('#popup_menu_area').html('
    '+html+'
');var areaOffset={top:params['page_y'],left:params['page_x']};if(area.outerHeight()+areaOffset.top>$(window).height()+$(window).scrollTop()) +areaOffset.top=$(window).height()-area.outerHeight()+$(window).scrollTop();if(area.outerWidth()+areaOffset.left>$(window).width()+$(window).scrollLeft()) +areaOffset.left=$(window).width()-area.outerWidth()+$(window).scrollLeft();area.css({top:areaOffset.top,left:areaOffset.left}).show();}}}})(jQuery);jQuery(function($){if(!$('#popup_menu_area').length){var menuObj=$('
').attr('id','popup_menu_area').css({display:'none',zIndex:9999});$(document.body).append(menuObj);} +$(document).click(function(evt){var area=$('#popup_menu_area');if(!area.length)return;area.hide();var targetObj=$(evt.target);if(!targetObj.length)return;if(targetObj.length&&$.inArray(targetObj.attr('nodeName'),['DIV','SPAN','A'])==-1)targetObj=targetObj.parent();if(!targetObj.length||$.inArray(targetObj.attr('nodeName'),['DIV','SPAN','A'])==-1)return;var class_name=targetObj.attr('className');if(class_name.indexOf('_')<=0)return;var class_name_list=class_name.split(' ');var menu_id='';var menu_id_regx=/^([a-zA-Z]+)_([0-9]+)$/;for(var i=0,c=class_name_list.length;i-1)?first_enable[i]:j;}} +if(!disabled_exists)return;sels.oldonchange=sels.onchange;sels.onchange=function(){if(this.options[this.selectedIndex].disabled){this.selectedIndex=first_enable[i];}else{if(this.oldonchange)this.oldonchange();}};if(sels.selectedIndex>=0&&sels.options[sels.selectedIndex].disabled)sels.onchange();});} +var drEditorFold=$('.xe_content .fold_button');if(drEditorFold.size()){var fold_container=$('div.fold_container',drEditorFold);$('button.more',drEditorFold).click(function(){$(this).hide().next('button').show().parent().next(fold_container).show();});$('button.less',drEditorFold).click(function(){$(this).hide().prev('button').show().parent().next(fold_container).hide();});}});String.prototype.getQuery=function(key){var idx=this.indexOf('?');if(idx==-1)return null;var query_string=this.substr(idx+1,this.length);var args={};query_string.replace(/([^=]+)=([^&]*)(&|$)/g,function(){args[arguments[1]]=arguments[2];});var q=args[key];if(typeof(q)=="undefined")q="";return q;} +String.prototype.setQuery=function(key,val){var idx=this.indexOf('?');var uri=this.replace(/#$/,'');if(idx!=-1){var query_string=uri.substr(idx+1,this.length),args={},q_list=[];uri=this.substr(0,idx);query_string.replace(/([^=]+)=([^&]*)(&|$)/g,function(all,key,val){args[key]=val;});args[key]=val;jQuery.each(args,function(key,val){if(!jQuery.trim(val))return;q_list.push(key+'='+decodeURI(val));});query_string=q_list.join('&');uri=uri+(query_string?'?'+query_string:'');}else{if(val.toString().trim())uri=uri+"?"+key+"="+val;} +var re=/https:\/\/([^:\/]+)(:\d+|)/i;var check=re.exec(uri);if(check) +{var toReplace="http://"+check[1];if(typeof(http_port)!='undefined'&&http_port!=80) +{toReplace+=":"+http_port;} +uri=uri.replace(re,toReplace);} +var bUseSSL=false;if(typeof(enforce_ssl)!='undefined'&&enforce_ssl) +{bUseSSL=true;} +else if(typeof(ssl_actions)!='undefined'&&typeof(ssl_actions.length)!='undefined'&&uri.getQuery('act')){var act=uri.getQuery('act');for(i=0;i-1&&!url.getQuery('vid'))url=url.setQuery('vid',xeVid);try{if(target!="_blank"&&winopen_list[target]){winopen_list[target].close();winopen_list[target]=null;}}catch(e){} +if(typeof(target)=='undefined')target='_blank';if(typeof(attribute)=='undefined')attribute='';var win=window.open(url,target,attribute);win.focus();if(target!="_blank")winopen_list[target]=win;} +function popopen(url,target){if(typeof(target)=="undefined")target="_blank";if(typeof(xeVid)!='undefined'&&url.indexOf(request_uri)>-1&&!url.getQuery('vid'))url=url.setQuery('vid',xeVid);winopen(url,target,"left=10,top=10,width=10,height=10,scrollbars=no,resizable=yes,toolbars=no");} +function sendMailTo(to){location.href="mailto:"+to;} +function move_url(url,open_wnidow){if(!url)return false;if(typeof(open_wnidow)=='undefined')open_wnidow='N';if(open_wnidow=='N'){open_wnidow=false;}else{open_wnidow=true;} +if(/^\./.test(url))url=request_uri+url;if(open_wnidow){winopen(url);}else{location.href=url;} +return false;} +function displayMultimedia(src,width,height,options){var html=_displayMultimedia(src,width,height,options);if(html)document.writeln(html);} +function _displayMultimedia(src,width,height,options){if(src.indexOf('files')==0)src=request_uri+src;var defaults={wmode:'transparent',allowScriptAccess:'sameDomain',quality:'high',flashvars:'',autostart:false};var params=jQuery.extend(defaults,options||{});var autostart=(params.autostart&¶ms.autostart!='false')?'true':'false';delete(params.autostart);var clsid="";var codebase="";var html="";if(/\.(gif|jpg|jpeg|bmp|png)$/i.test(src)){html='';}else if(/\.flv$/i.test(src)||/\.mov$/i.test(src)||/\.moov$/i.test(src)||/\.m4v$/i.test(src)){html='';}else if(/\.swf/i.test(src)){clsid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000';if(typeof(enforce_ssl)!='undefined'&&enforce_ssl){codebase="https://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0";} +else{codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0";} +html='';html+='';for(var name in params){if(params[name]!='undefined'&¶ms[name]!=''){html+='';}} +html+='' ++'' ++'';}else{if(jQuery.browser.mozilla||jQuery.browser.opera){autostart=(params.autostart&¶ms.autostart!='false')?'1':'0';} +html='400){$body.css({overflow:'auto',overflowX:'hidden',height:400+'px'});}} +var $win=$(window);var $pc=$('#popup_content');var w=Math.max($pc[0].offsetWidth,600);var h=$pc[0].offsetHeight;var dw=$win.width();var dh=$win.height();var _w=0,_h=0;if(w!=dw)_w=w-dw;if(h!=dh)_h=h-dh;if(_w||_h){window.resizeBy(_w,_h);} +if(!arguments.callee.executed){setTimeout(setFixedPopupSize,300);arguments.callee.executed=true;}} +function doCallModuleAction(module,action,target_srl){var params=new Array();params['target_srl']=target_srl;params['cur_mid']=current_mid;exec_xml(module,action,params,completeCallModuleAction);} +function completeCallModuleAction(ret_obj,response_tags){if(ret_obj['message']!='success')alert(ret_obj['message']);location.reload();} +function completeMessage(ret_obj){alert(ret_obj['message']);location.reload();} +function doChangeLangType(obj){if(typeof(obj)=="string"){setLangType(obj);}else{var val=obj.options[obj.selectedIndex].value;setLangType(val);} +location.href=location.href.setQuery('l','');} +function setLangType(lang_type){var expire=new Date();expire.setTime(expire.getTime()+(7000*24*3600000));setCookie('lang_type',lang_type,expire,'/');} +function doDocumentPreview(obj){var fo_obj=obj;while(fo_obj.nodeName!="FORM"){fo_obj=fo_obj.parentNode;} +if(fo_obj.nodeName!="FORM")return;var editor_sequence=fo_obj.getAttribute('editor_sequence');var content=editorGetContent(editor_sequence);var win=window.open("","previewDocument","toolbars=no,width=700px;height=800px,scrollbars=yes,resizable=yes");var dummy_obj=jQuery("#previewDocument");if(!dummy_obj.length){jQuery('
'+''+''+''+'
').appendTo(document.body);dummy_obj=jQuery("#previewDocument")[0];} +if(dummy_obj){dummy_obj.content.value=content;dummy_obj.submit();}} +function doDocumentSave(obj){var editor_sequence=obj.form.getAttribute('editor_sequence');var prev_content=editorRelKeys[editor_sequence]['content'].value;if(typeof(editor_sequence)!='undefined'&&editor_sequence&&typeof(editorRelKeys)!='undefined'&&typeof(editorGetContent)=='function'){var content=editorGetContent(editor_sequence);editorRelKeys[editor_sequence]['content'].value=content;} +var params={},responses=['error','message','document_srl'],elms=obj.form.elements,data=jQuery(obj.form).serializeArray();;jQuery.each(data,function(i,field){var val=jQuery.trim(field.value);if(!val)return true;if(/\[\]$/.test(field.name))field.name=field.name.replace(/\[\]$/,'');if(params[field.name])params[field.name]+='|@|'+val;else params[field.name]=field.value;});exec_xml('member','procMemberSaveDocument',params,completeDocumentSave,responses,params,obj.form);editorRelKeys[editor_sequence]['content'].value=prev_content;return false;} +function completeDocumentSave(ret_obj){jQuery('input[name=document_srl]').eq(0).val(ret_obj['document_srl']);alert(ret_obj['message']);} +var objForSavedDoc=null;function doDocumentLoad(obj){objForSavedDoc=obj.form;popopen(request_uri.setQuery('module','member').setQuery('act','dispSavedDocumentList'));} +function doDocumentSelect(document_srl){if(!opener||!opener.objForSavedDoc){window.close();return;} +opener.location.href=opener.current_url.setQuery('document_srl',document_srl).setQuery('act','dispBoardWrite');window.close();} +function viewSkinInfo(module,skin){popopen("./?module=module&act=dispModuleSkinInfo&selected_module="+module+"&skin="+skin,'SkinInfo');} +var addedDocument=new Array();function doAddDocumentCart(obj){var srl=obj.value;addedDocument[addedDocument.length]=srl;setTimeout(function(){callAddDocumentCart(addedDocument.length);},100);} +function callAddDocumentCart(document_length){if(addedDocument.length<1||document_length!=addedDocument.length)return;var params=new Array();params["srls"]=addedDocument.join(",");exec_xml("document","procDocumentAddCart",params,null);addedDocument=new Array();} +function transRGB2Hex(value){if(!value)return value;if(value.indexOf('#')>-1)return value.replace(/^#/,'');if(value.toLowerCase().indexOf('rgb')<0)return value;value=value.replace(/^rgb\(/i,'').replace(/\)$/,'');value_list=value.split(',');var hex='';for(var i=0;i>2;enc2=((chr1&3)<<4)|(chr2>>4);enc3=((chr2&15)<<2)|(chr3>>6);enc4=chr3&63;if(isNaN(chr2)){enc3=enc4=64;}else if(isNaN(chr3)){enc4=64;} +output=output+ +this._keyStr.charAt(enc1)+this._keyStr.charAt(enc2)+ +this._keyStr.charAt(enc3)+this._keyStr.charAt(enc4);} +return output;},decode:function(input){var output="";var chr1,chr2,chr3;var enc1,enc2,enc3,enc4;var i=0;input=input.replace(/[^A-Za-z0-9\+\/\=]/g,"");while(i>4);chr2=((enc2&15)<<4)|(enc3>>2);chr3=((enc3&3)<<6)|enc4;output=output+String.fromCharCode(chr1);if(enc3!=64){output=output+String.fromCharCode(chr2);} +if(enc4!=64){output=output+String.fromCharCode(chr3);}} +output=Base64._utf8_decode(output);return output;},_utf8_encode:function(string){string=string.replace(/\r\n/g,"\n");var utftext="";for(var n=0;n127)&&(c<2048)){utftext+=String.fromCharCode((c>>6)|192);utftext+=String.fromCharCode((c&63)|128);} +else{utftext+=String.fromCharCode((c>>12)|224);utftext+=String.fromCharCode(((c>>6)&63)|128);utftext+=String.fromCharCode((c&63)|128);}} +return utftext;},_utf8_decode:function(utftext){var string="";var i=0;var c=c1=c2=0;while(i191)&&(c<224)){c2=utftext.charCodeAt(i+1);string+=String.fromCharCode(((c&31)<<6)|(c2&63));i+=2;} +else{c2=utftext.charCodeAt(i+1);c3=utftext.charCodeAt(i+2);string+=String.fromCharCode(((c&15)<<12)|((c2&63)<<6)|(c3&63));i+=3;}} +return string;}} +if(typeof(resizeImageContents)=='undefined'){function resizeImageContents(){}} +if(typeof(activateOptionDisabled)=='undefined'){function activateOptionDisabled(){}} +objectExtend=jQuery.extend;function toggleDisplay(objId){jQuery('#'+objId).toggle();} +function checkboxSelectAll(formObj,name,checked){var itemName=name;var option={};if(typeof(formObj)!="undefined")option.wrap=formObj;if(typeof(checked)!="undefined")option.checked=checked;XE.checkboxToggleAll(itemName,option);} +function clickCheckBoxAll(formObj,name){var itemName=name;var option={doClick:true};if(typeof(formObj)!="undefined")option.wrap=formObj;XE.checkboxToggleAll(itemName,option);} +function svc_folder_open(id){jQuery("#_folder_open_"+id).hide();jQuery("#_folder_close_"+id).show();jQuery("#_folder_"+id).show();} +function svc_folder_close(id){jQuery("#_folder_open_"+id).show();jQuery("#_folder_close_"+id).hide();jQuery("#_folder_"+id).hide();} +function open_calendar(fo_id,day_str,callback_func){if(typeof(day_str)=="undefined")day_str="";var url="./common/tpl/calendar.php?";if(fo_id)url+="fo_id="+fo_id;if(day_str)url+="&day_str="+day_str;if(callback_func)url+="&callback_func="+callback_func;popopen(url,'Calendar');} +var loaded_popup_menus=XE.loaded_popup_menus;function createPopupMenu(){} +function chkPopupMenu(){} +function displayPopupMenu(ret_obj,response_tags,params){XE.displayPopupMenu(ret_obj,response_tags,params);} +function GetObjLeft(obj){return jQuery(obj).offset().left;} +function GetObjTop(obj){return jQuery(obj).offset().top;} +function replaceOuterHTML(obj,html){jQuery(obj).replaceWith(html);} +function getOuterHTML(obj){return jQuery(obj).html().trim();} +function setCookie(name,value,expire,path){var s_cookie=name+"="+escape(value)+ +((!expire)?"":("; expires="+expire.toGMTString()))+"; path="+((!path)?"/":path);document.cookie=s_cookie;} +jQuery(function(){jQuery(".lang_code").each(function() {var objText=jQuery(this);var targetName=objText.attr("id");if(typeof(targetName)=="undefined")targetName=objText.attr("name");if(typeof(targetName)=="undefined")return;objText.after("find_langcode");});}); \ No newline at end of file diff --git a/common/js/iepngfix_tilebg.js b/common/js/iepngfix_tilebg.js index 72ba3f3e2..7f2f8dda4 100644 --- a/common/js/iepngfix_tilebg.js +++ b/common/js/iepngfix_tilebg.js @@ -1,22 +1,22 @@ -// IE5.5+ PNG Alpha Fix v2.0 Alpha: Background Tiling Support -// (c) 2008 Angus Turnbull http://www.twinhelix.com - -// This is licensed under the GNU LGPL, version 2.1 or later. -// For details, see: http://creativecommons.org/licenses/LGPL/2.1/ -var IEPNGFix=window.IEPNGFix||{};IEPNGFix.tileBG=function(elm,pngSrc,ready){var data=this.data[elm.uniqueID],elmW=Math.max(elm.clientWidth,elm.scrollWidth),elmH=Math.max(elm.clientHeight,elm.scrollHeight),bgX=elm.currentStyle.backgroundPositionX,bgY=elm.currentStyle.backgroundPositionY,bgR=elm.currentStyle.backgroundRepeat;if(!data.tiles){data.tiles={elm:elm,src:'',cache:[],img:new Image(),old:{}};} -var tiles=data.tiles,pngW=tiles.img.width,pngH=tiles.img.height;if(pngSrc){if(!ready&&pngSrc!=tiles.src){tiles.img.onload=function(){this.onload=null;IEPNGFix.tileBG(elm,pngSrc,1);};return tiles.img.src=pngSrc;}}else{if(tiles.src)ready=1;pngW=pngH=0;} -tiles.src=pngSrc;if(!ready&&elmW==tiles.old.w&&elmH==tiles.old.h&&bgX==tiles.old.x&&bgY==tiles.old.y&&bgR==tiles.old.r){return;} -var pos={top:'0%',left:'0%',center:'50%',bottom:'100%',right:'100%'},x,y,pc;x=pos[bgX]||bgX;y=pos[bgY]||bgY;if(pc=x.match(/(\d+)%/)){x=Math.round((elmW-pngW)*(parseInt(pc[1])/100));} -if(pc=y.match(/(\d+)%/)){y=Math.round((elmH-pngH)*(parseInt(pc[1])/100));} -x=parseInt(x);y=parseInt(y);var repeatX={'repeat':1,'repeat-x':1}[bgR],repeatY={'repeat':1,'repeat-y':1}[bgR];if(repeatX){x%=pngW;if(x>0)x-=pngW;} -if(repeatY){y%=pngH;if(y>0)y-=pngH;} -this.hook.enabled=0;if(!({relative:1,absolute:1}[elm.currentStyle.position])){elm.style.position='relative';} -var count=0,xPos,maxX=repeatX?elmW:x+0.1,yPos,maxY=repeatY?elmH:y+0.1,d,s,isNew;if(pngW&&pngH){for(xPos=x;xPoselmW?elmW-xPos:pngW),clipB=(yPos+pngH>elmH?elmH-yPos:pngH);d=tiles.cache[count];s=d.style;s.behavior='none';s.left=xPos+'px';s.top=yPos+'px';s.width=clipR+'px';s.height=clipB+'px';s.clip='rect('+ -(yPos<0?0-yPos:0)+'px,'+ -clipR+'px,'+ -clipB+'px,'+ -(xPos<0?0-xPos:0)+'px)';s.display='block';if(isNew){s.position='absolute';s.zIndex=-999;if(elm.firstChild){elm.insertBefore(d,elm.firstChild);}else{elm.appendChild(d);}} -this.fix(d,pngSrc,0);count++;}}} -while(count0)x-=pngW;} +if(repeatY){y%=pngH;if(y>0)y-=pngH;} +this.hook.enabled=0;if(!({relative:1,absolute:1}[elm.currentStyle.position])){elm.style.position='relative';} +var count=0,xPos,maxX=repeatX?elmW:x+0.1,yPos,maxY=repeatY?elmH:y+0.1,d,s,isNew;if(pngW&&pngH){for(xPos=x;xPoselmW?elmW-xPos:pngW),clipB=(yPos+pngH>elmH?elmH-yPos:pngH);d=tiles.cache[count];s=d.style;s.behavior='none';s.left=xPos+'px';s.top=yPos+'px';s.width=clipR+'px';s.height=clipB+'px';s.clip='rect('+ +(yPos<0?0-yPos:0)+'px,'+ +clipR+'px,'+ +clipB+'px,'+ +(xPos<0?0-xPos:0)+'px)';s.display='block';if(isNew){s.position='absolute';s.zIndex=-999;if(elm.firstChild){elm.insertBefore(d,elm.firstChild);}else{elm.appendChild(d);}} +this.fix(d,pngSrc,0);count++;}}} +while(count=0)_apps.splice(nIndex,1);if($.isArray(_apps[sName])){nIndex=$.inArray(oApp,_apps[sName]);if(nIndex>=0)_apps[sName].splice(nIndex,1);} -if($.isFunction(oApp.deactivate))oApp.deactivate();},broadcast:function(msg,params){this._broadcast(this,msg,params);},_broadcast:function(sender,msg,params){for(var i=0;i<_apps.length;i++){_apps[i]._cast(sender,msg,params);} -this._cast(sender,msg,params);}} -_app_base={_plugins:[],_messages:{},getPlugin:function(sPluginName){sPluginName=sPluginName.toLowerCase();if($.isArray(this._plugins[sPluginName])){return this._plugins[sPluginName];}else{return[];}},registerPlugin:function(oPlugin){var self=this;var sName=oPlugin.getName().toLowerCase();if($.inArray(oPlugin,this._plugins)>=0)return false;this._plugins.push(oPlugin);if(!$.isArray(this._plugins[sName]))this._plugins[sName]=[];this._plugins[sName].push(oPlugin);$.each(oPlugin._binded_fn,function(api,fn){self.registerHandler(api,fn);});oPlugin.oApp=this;if($.isFunction(oPlugin.activate))oPlugin.activate();return true;},registerHandler:function(api,func){var msgs=this._messages;api=api.toUpperCase();if(!$.isArray(msgs[api]))msgs[api]=[];msgs[api].push(func);},cast:function(msg,params){return this._cast(this,msg,params||[]);},broadcast:function(sender,msg,params){if(this.parent&&this.parent._broadcast){this.parent._broadcast(sender,msg,params);}},_cast:function(sender,msg,params){var i,len;var aMsg=this._messages;msg=msg.toUpperCase();if(aMsg['BEFORE_'+msg]||this['API_BEFORE_'+msg]){var bContinue=this._cast(sender,'BEFORE_'+msg,params);if(!bContinue)return;} -var vRet=[],sFn='API_'+msg;if($.isArray(aMsg[msg])){for(i=0;i=0)_apps.splice(nIndex,1);if($.isArray(_apps[sName])){nIndex=$.inArray(oApp,_apps[sName]);if(nIndex>=0)_apps[sName].splice(nIndex,1);} +if($.isFunction(oApp.deactivate))oApp.deactivate();},broadcast:function(msg,params){this._broadcast(this,msg,params);},_broadcast:function(sender,msg,params){for(var i=0;i<_apps.length;i++){_apps[i]._cast(sender,msg,params);} +this._cast(sender,msg,params);}} +_app_base={_plugins:[],_messages:{},getPlugin:function(sPluginName){sPluginName=sPluginName.toLowerCase();if($.isArray(this._plugins[sPluginName])){return this._plugins[sPluginName];}else{return[];}},registerPlugin:function(oPlugin){var self=this;var sName=oPlugin.getName().toLowerCase();if($.inArray(oPlugin,this._plugins)>=0)return false;this._plugins.push(oPlugin);if(!$.isArray(this._plugins[sName]))this._plugins[sName]=[];this._plugins[sName].push(oPlugin);$.each(oPlugin._binded_fn,function(api,fn){self.registerHandler(api,fn);});oPlugin.oApp=this;if($.isFunction(oPlugin.activate))oPlugin.activate();return true;},registerHandler:function(api,func){var msgs=this._messages;api=api.toUpperCase();if(!$.isArray(msgs[api]))msgs[api]=[];msgs[api].push(func);},cast:function(msg,params){return this._cast(this,msg,params||[]);},broadcast:function(sender,msg,params){if(this.parent&&this.parent._broadcast){this.parent._broadcast(sender,msg,params);}},_cast:function(sender,msg,params){var i,len;var aMsg=this._messages;msg=msg.toUpperCase();if(aMsg['BEFORE_'+msg]||this['API_BEFORE_'+msg]){var bContinue=this._cast(sender,'BEFORE_'+msg,params);if(!bContinue)return;} +var vRet=[],sFn='API_'+msg;if($.isArray(aMsg[msg])){for(i=0;i 9?v['m']:'0'+v['m']; - - // 연간 달력이 아니라면 이 달의 날짜를 구한다. - if (cal.options.type != 'month') { - // 날짜에 사용할 달력 - v['weeks'] = []; - - var d = new Date(cal.date.getTime()), w = []; - var last = (v.m!=2)? ((v.m+(v.m>7?1:0))%2?31:30) : ((new Date(v.yyyy,v.m-1,29)).getMonth()==v.m?29:28); // 마지막 날 - - d.setDate(1); // 1일로 설정 후 1일의 요일을 가져온다. - var start = d.getDay(), end = last+start; - - for(var i=0,len=end+(7-(end%7||7));i= end) w.push(' '); - else w.push(''); - } - } - - // 템플릿 처리 - tpl = this._processTemplate(tpl, v); - obj.html(tpl); - - // 선택한 날짜 - if (cal.options.type == 'month') { - - } else { - var t = new Date(); - obj.find('td>button.day'+t.getFullYear()+'-'+(t.getMonth()+1)+'-'+t.getDate()).addClass('today'); - - t = cal.activeDate; - obj.find('td>button.day'+t.getFullYear()+'-'+(t.getMonth()+1)+'-'+t.getDate()).addClass('active'); - } - - // 이벤트 핸들러 - obj.find('button.close').click(function(){ $.calendar._hide(obj); }); - obj.find('button.today').click(function(){ $.calendar._moveToday(obj); }); - if (cal.options.type == 'month') { - obj.find('button.prev').click(function(){ $.calendar._prevYear(obj) }); - obj.find('button.next').click(function(){ $.calendar._nextYear(obj) }); - } else { - obj.find('button.prev').click(function(){ $.calendar._prevMonth(obj) }); - obj.find('button.next').click(function(){ $.calendar._nextMonth(obj) }); - obj.find('button.prev_year').click(function(){ $.calendar._prevYear(obj) }); - obj.find('button.next_year').click(function(){ $.calendar._nextYear(obj) }); - } - obj.find('td>button').click(function(){ $.calendar._selectDate(obj, $(this)) }); - }, - _selectDate : function(obj, btn) { - var cal = calendars[ this._getuid(obj) ]; - var date = btn.attr('class').match(/day([\d\-]+)/); - if (!date) return; - - date = date[1].split('-'); - - var ad = cal.activeDate; - ad.setFullYear(date[0]-0); - ad.setMonth(date[1]-1); - ad.setDate(date[2]-0); - - this._setDate(obj, ad); - }, - _setDate : function(obj, newDate) { - var uid = this._getuid(obj); - if (uid < 0) return null; - if (!newDate || !(newDate instanceof Date)) newDate = new Date(); - - var cal = calendars[uid]; - cal.activeDate = new Date(newDate.getTime()); - cal.date = new Date(newDate.getTime()); - this._draw(obj); - - if ($.isFunction(cal.options.select) && obj.hasClass('ui-calendar')) { - cal.options.select(newDate.getFullYear(), newDate.getMonth()+1, newDate.getDate()); - } - }, - _getDate : function(obj, format) { - var uid = this._getuid(obj); - if (uid < 0) return null; - if (typeof format != 'string') return calendars[uid].activeDate; - - // format string - }, - _moveToday : function(obj) { - calendars[this._getuid(obj)].date = new Date(); - this._draw(obj); - }, - _prevMonth : function(obj) { - var cal = calendars[this._getuid(obj)]; - var m = cal.date.getMonth(); - - cal.date.setDate(1); - if (m == 0) { - cal.date.setFullYear(cal.date.getFullYear()-1); - cal.date.setMonth(11); - } else { - cal.date.setMonth(m-1); - } - - this._draw(obj); - }, - _nextMonth : function(obj) { - var cal = calendars[this._getuid(obj)]; - var m = cal.date.getMonth(); - - cal.date.setDate(1); - if (m == 11) { - cal.date.setFullYear(cal.date.getFullYear()+1); - cal.date.setMonth(0); - } else { - cal.date.setMonth(m+1); - } - - this._draw(obj); - }, - _prevYear : function(obj) { - var cal = calendars[this._getuid(obj)]; - - cal.date.setFullYear(cal.date.getFullYear()-1); - this._draw(obj); - }, - _nextYear : function(obj) { - var cal = calendars[this._getuid(obj)]; - - cal.date.setFullYear(cal.date.getFullYear()+1); - this._draw(obj); - } -}); - -/** - * Invoke the calednar functionallity - * @return jQuery object - */ -$.fn.calendar = function(options) { - var args = $.makeArray(arguments); - - if (!$.calendar.initialized) { - $(document).mousedown($.calendar._checkExternalClick); - $.calendar.initialized = true; - } - - if (typeof options == 'string' && $.inArray(options, ['getDate'])) { - args.shift(); - return $.calendar['_'+options].apply($.calendar, [$(this[0])].concat(args) ); - } - - return this.each(function(){ - if (typeof options == 'string') { - args.shift(); - $.calendar['_'+ options].apply($.calendar, [$(this)].concat(args)); - } else { - $.calendar._attachCalendar($(this), options); - } - }); -} - -$.calendar = new Calendar(); // singleton instance -$.calendar.initialized = false; -$.calendar.uuid = new Date().getTime(); -$.calendar.version = $.ui.calendar.version; - -// template -template.calendar = '\ -\ -\ -\ - \ - \ - \ - \ - \ - \ - \ - \ - \ -\ -\ - {@week in weeks}\ - \ - \ - \ - \ - \ - \ - \ - \ - \ - {/}\ -\ -
\ - \ - {yyyy}.{mm}.\ - \ - \ - \ - \ - \ - \ -
{lang.weekdays[0]}{lang.weekdays[1]}{lang.weekdays[2]}{lang.weekdays[3]}{lang.weekdays[4]}{lang.weekdays[5]}{lang.weekdays[6]}
{week[0]}{week[1]}{week[2]}{week[3]}{week[4]}{week[5]}{week[6]}
\ -'; - -template.month = '\ -\ -\ -\ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ -\ -
\ - \ - {yyyy}.{mm} \ - \ - \ - \ -
\ -'; - +/** + * @brief XE Calendar + * @author NHN (developers@xpressengine.com) + * + * 사용법 + * + **/ +(function($){ + +if (!$.ui) $.ui = {}; +$.extend($.ui, { calendar: { version:'0.3' } }); + +var PROP_NAME = 'calendar'; +var index = 0; +var calendars = {}; +var template = {calendar:'',month:''}; + +function Calendar() { +} + +$.extend(Calendar.prototype, { + _activeCalendar : null, + _getuid : function(obj) { + var uid = obj.attr('class').match(/ui-calendar-(\d+-\d+)/); + + if (!uid) return -1; + return uid[1]; + }, + _show : function(obj) { + if (this._activeCalendar) this._hide(this._activeCalendar); + + // disabled? + if (obj.hasClass('ui-calendar-disabled')) return; + + // Active Calendar + this._activeCalendar = obj.show(300); + }, + _hide : function(obj) { + if (this._activeCalendar && this._activeCalendar.get(0) == obj.get(0)) this._activeCalendar = null; + obj.hide(300); + }, + _toggle : function(obj) { + (obj.css('display' ) == 'none')?this._show(obj):this._hide(obj); + }, + _attachCalendar : function(obj, options) { + if ((obj=$(obj)).hasClass('ui-calendar')) return; + + var uid = $.calendar.uuid+'-'+(index++); + var c = calendars[uid] = {}; + + // uid 추가 + obj.addClass('ui-calendar-'+uid).mousedown(function(){return false}); + + // default options + c.options = $.extend({ + type : 'day', + activeDate : '' + }, options||{}); + c.lang = $.extend({ + weekdays : 'Sun,Mon,Tue,Wed,Thu,Fri,Sat', + today : 'Today', + prevmonth : 'Prev Month', + nextmonth : 'Next Month', + prevyear : 'Prev Year', + nextyear : 'Next Year', + close : 'Close' + }, options.lang||{}); + + c.lang.weekdays = c.lang.weekdays.split(','); + + // 날짜 설정 + var d; + if (typeof c.options.activeDate == 'string' && c.options.activeDate) { + var s = c.options.activeDate.split('/'); + d = new Date(s[0], s[1]-1, s[2]-0); + } else { + d = new Date(); + } + this._setDate(obj, d); + + // 토글 버튼 + if (c.options.button) { + (c.button=$(c.options.button)).click(function(){ obj.calendar('toggle') }); + } + + // 클래스 추가 + obj.addClass('ui-calendar'); + + // position 설정한 후, 좌표를 (0,0)으로 변경 + var pos = obj.css({position:'absolute',top:0,left:0}).show().offset(); + + // 버튼의 위치 구해서 좌표 조정 + var bpos = c.button.offset(); + var dx = bpos.left - pos.left; + var dy = bpos.top - pos.top; + + // 좌표 조정 후 레이어 숨김 + obj.css({top:(dy+c.button.height())+'px',left:dx+'px'}).hide(); + }, + _checkExternalClick : function(e) { + if ($.calendar._activeCalendar) $.calendar._hide($.calendar._activeCalendar); + }, + _processTemplate : function(tpl, vars) { + tpl = (' '+tpl+' ').split(/[\{\}]/g); + + for(var i=0; i < tpl.length; i++) { + if (i%2) { + if (/^[\w\.\[\]]+$/.test(tpl[i])) tpl[i] = 'try{v=vv.'+tpl[i]+'}catch(e){v=""};ret.push(v);'; + else if (/^@(\w+)\s+in\s+(\w+)$/.test(tpl[i])) tpl[i] = 'for(i=0,l=vv.'+RegExp.$2+'.length;i 9?v['m']:'0'+v['m']; + + // 연간 달력이 아니라면 이 달의 날짜를 구한다. + if (cal.options.type != 'month') { + // 날짜에 사용할 달력 + v['weeks'] = []; + + var d = new Date(cal.date.getTime()), w = []; + var last = (v.m!=2)? ((v.m+(v.m>7?1:0))%2?31:30) : ((new Date(v.yyyy,v.m-1,29)).getMonth()==v.m?29:28); // 마지막 날 + + d.setDate(1); // 1일로 설정 후 1일의 요일을 가져온다. + var start = d.getDay(), end = last+start; + + for(var i=0,len=end+(7-(end%7||7));i= end) w.push(' '); + else w.push(''); + } + } + + // 템플릿 처리 + tpl = this._processTemplate(tpl, v); + obj.html(tpl); + + // 선택한 날짜 + if (cal.options.type == 'month') { + + } else { + var t = new Date(); + obj.find('td>button.day'+t.getFullYear()+'-'+(t.getMonth()+1)+'-'+t.getDate()).addClass('today'); + + t = cal.activeDate; + obj.find('td>button.day'+t.getFullYear()+'-'+(t.getMonth()+1)+'-'+t.getDate()).addClass('active'); + } + + // 이벤트 핸들러 + obj.find('button.close').click(function(){ $.calendar._hide(obj); }); + obj.find('button.today').click(function(){ $.calendar._moveToday(obj); }); + if (cal.options.type == 'month') { + obj.find('button.prev').click(function(){ $.calendar._prevYear(obj) }); + obj.find('button.next').click(function(){ $.calendar._nextYear(obj) }); + } else { + obj.find('button.prev').click(function(){ $.calendar._prevMonth(obj) }); + obj.find('button.next').click(function(){ $.calendar._nextMonth(obj) }); + obj.find('button.prev_year').click(function(){ $.calendar._prevYear(obj) }); + obj.find('button.next_year').click(function(){ $.calendar._nextYear(obj) }); + } + obj.find('td>button').click(function(){ $.calendar._selectDate(obj, $(this)) }); + }, + _selectDate : function(obj, btn) { + var cal = calendars[ this._getuid(obj) ]; + var date = btn.attr('class').match(/day([\d\-]+)/); + if (!date) return; + + date = date[1].split('-'); + + var ad = cal.activeDate; + ad.setFullYear(date[0]-0); + ad.setMonth(date[1]-1); + ad.setDate(date[2]-0); + + this._setDate(obj, ad); + }, + _setDate : function(obj, newDate) { + var uid = this._getuid(obj); + if (uid < 0) return null; + if (!newDate || !(newDate instanceof Date)) newDate = new Date(); + + var cal = calendars[uid]; + cal.activeDate = new Date(newDate.getTime()); + cal.date = new Date(newDate.getTime()); + this._draw(obj); + + if ($.isFunction(cal.options.select) && obj.hasClass('ui-calendar')) { + cal.options.select(newDate.getFullYear(), newDate.getMonth()+1, newDate.getDate()); + } + }, + _getDate : function(obj, format) { + var uid = this._getuid(obj); + if (uid < 0) return null; + if (typeof format != 'string') return calendars[uid].activeDate; + + // format string + }, + _moveToday : function(obj) { + calendars[this._getuid(obj)].date = new Date(); + this._draw(obj); + }, + _prevMonth : function(obj) { + var cal = calendars[this._getuid(obj)]; + var m = cal.date.getMonth(); + + cal.date.setDate(1); + if (m == 0) { + cal.date.setFullYear(cal.date.getFullYear()-1); + cal.date.setMonth(11); + } else { + cal.date.setMonth(m-1); + } + + this._draw(obj); + }, + _nextMonth : function(obj) { + var cal = calendars[this._getuid(obj)]; + var m = cal.date.getMonth(); + + cal.date.setDate(1); + if (m == 11) { + cal.date.setFullYear(cal.date.getFullYear()+1); + cal.date.setMonth(0); + } else { + cal.date.setMonth(m+1); + } + + this._draw(obj); + }, + _prevYear : function(obj) { + var cal = calendars[this._getuid(obj)]; + + cal.date.setFullYear(cal.date.getFullYear()-1); + this._draw(obj); + }, + _nextYear : function(obj) { + var cal = calendars[this._getuid(obj)]; + + cal.date.setFullYear(cal.date.getFullYear()+1); + this._draw(obj); + } +}); + +/** + * Invoke the calednar functionallity + * @return jQuery object + */ +$.fn.calendar = function(options) { + var args = $.makeArray(arguments); + + if (!$.calendar.initialized) { + $(document).mousedown($.calendar._checkExternalClick); + $.calendar.initialized = true; + } + + if (typeof options == 'string' && $.inArray(options, ['getDate'])) { + args.shift(); + return $.calendar['_'+options].apply($.calendar, [$(this[0])].concat(args) ); + } + + return this.each(function(){ + if (typeof options == 'string') { + args.shift(); + $.calendar['_'+ options].apply($.calendar, [$(this)].concat(args)); + } else { + $.calendar._attachCalendar($(this), options); + } + }); +} + +$.calendar = new Calendar(); // singleton instance +$.calendar.initialized = false; +$.calendar.uuid = new Date().getTime(); +$.calendar.version = $.ui.calendar.version; + +// template +template.calendar = '\ +\ +\ +\ + \ + \ + \ + \ + \ + \ + \ + \ + \ +\ +\ + {@week in weeks}\ + \ + \ + \ + \ + \ + \ + \ + \ + \ + {/}\ +\ +
\ + \ + {yyyy}.{mm}.\ + \ + \ + \ + \ + \ + \ +
{lang.weekdays[0]}{lang.weekdays[1]}{lang.weekdays[2]}{lang.weekdays[3]}{lang.weekdays[4]}{lang.weekdays[5]}{lang.weekdays[6]}
{week[0]}{week[1]}{week[2]}{week[3]}{week[4]}{week[5]}{week[6]}
\ +'; + +template.month = '\ +\ +\ +\ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ +\ +
\ + \ + {yyyy}.{mm} \ + \ + \ + \ +
\ +'; + })(jQuery); \ No newline at end of file diff --git a/common/js/plugins/ui.colorpicker/xe_colorpicker.js b/common/js/plugins/ui.colorpicker/xe_colorpicker.js index 8e592ce4d..1825ed917 100644 --- a/common/js/plugins/ui.colorpicker/xe_colorpicker.js +++ b/common/js/plugins/ui.colorpicker/xe_colorpicker.js @@ -1,366 +1,366 @@ -/** - * @brief XE Colorpicker - * @author NHN (developers@xpressengine.com) - **/ -jQuery(function($){ - var ready = false; - var tmp = $('').hide(); - // var panel = null; - - $.fn.xe_colorpicker = function(settings){ - var selection = this; - - if (!ready) { - ColorPicker.init(settings); - ready = true; - } - - this.each(function(){ - var col = color($(this).val()); - - $(this).val( col ).css('background-color', col ); - setTextColor( $(this) ); - }).focus(function(event){ - var t = this; - $(this).select(); - - // show color picker - ColorPicker.show(this); - }).keypress(function(event){ - if (!ColorPicker.is(':visible')) return; - - if (/^#?[0-9a-f]{6}$/i.test( event.target.value )) { - ColorPicker.color( event.target.value ); - } - }); - - $(document).mousedown(function(event){ - var target = event.target; - - if (selection.index(target) > -1) return; - if ($(target).parents().add(target).index(ColorPicker.element) > -1) return; - if ($(target).parents().add(target).index(ColorPicker.buttons) > -1) return; - - ColorPicker.hide(); - }); - - return this; - }; - - var ColorPicker = { - element : null, - picker : null, - colpane: null, - buttons : null, - _target : null, - _backup : null, - _hsv : null, - _mode : 'none', - - init : function() { - var cp = this; - - this.element = $('
'); - - this.picker = this.element.find('> div.colorpicker'); - this.colpane = this.picker.find('div.colortable > div.background'); - this.colpoint = this.colpane.find('> .indicator'); - this.buttons = this.element.find('> div.buttons'); - this.huepane = this.element.find('div.huebar > .background'); - this.huepoint = this.huepane.find('> .indicator'); - - this._mousedown = method(this.onmousedown, this); - this._mousemove = method(this.onmousemove, this); - this._mouseup = method(this.onmouseup, this); - - this.picker.find('.background').mousedown(this._mousedown); - - this.buttons.find('button.ok').click(method(this.ok,this)); - this.buttons.find('button.cancel').click(method(this.cancel,this)); - this.buttons.find('button.none').click(method(this.none,this)); - - // only for IE6 - if ($.browser.msie && parseInt($.browser.version) < 7) { - this.element.append( $(''.replace(/%id%/g, frame_id)).appendTo(document.body); - } - - $('#'+form_id).remove(); - var form = $('
'.replace(/%id%/g, form_id)).attr({ - 'id' : form_id, - 'method' : 'post', - 'action' : url, - 'target' : frame_id - }); - - params['xeVirtualRequestMethod'] = 'xml'; - params['xeRequestURI'] = location.href.replace(/#(.*)$/i,''); - params['xeVirtualRequestUrl'] = request_uri; - - $.each(params, function(key, value){ - $('').attr('name', key).attr('value', value).appendTo(form); - }); - - form.appendTo(document.body).submit(); -} -function arr2obj(arr) { - var ret = {}; - for(var key in arr) { - if(arr.hasOwnProperty(key)) ret[key] = arr[key]; - } - return ret; -} - -/** - * @brief exec_json (exec_xml와 같은 용도) - **/ -$.exec_json = function(action,data,func){ - if(typeof(data) == 'undefined') data = {}; - action = action.split("."); - if(action.length == 2){ - - if(show_waiting_message) { - $("#waitingforserverresponse").html(waiting_message).css('top',$(document).scrollTop()+20).css('left',$(document).scrollLeft()+20).css('visibility','visible'); - } - - $.extend(data,{module:action[0],act:action[1]}); - if(typeof(xeVid)!='undefined') $.extend(data,{vid:xeVid}); - $.ajax({ - type:"POST" - ,dataType:"json" - ,url:request_uri - ,contentType:"application/json" - ,data:$.param(data) - ,success : function(data){ - $("#waitingforserverresponse").css('visibility','hidden'); - if(data.error > 0) alert(data.message); - if($.isFunction(func)) func(data); - } - }); - } -}; - -$.fn.exec_html = function(action,data,type,func,args){ - if(typeof(data) == 'undefined') data = {}; - if(!$.inArray(type, ['html','append','prepend'])) type = 'html'; - - var self = $(this); - action = action.split("."); - if(action.length == 2){ - if(show_waiting_message) { - $("#waitingforserverresponse").html(waiting_message).css('top',$(document).scrollTop()+20).css('left',$(document).scrollLeft()+20).css('visibility','visible'); - } - - $.extend(data,{module:action[0],act:action[1]}); - $.ajax({ - type:"POST" - ,dataType:"html" - ,url:request_uri - ,data:$.param(data) - ,success : function(html){ - $("#waitingforserverresponse").css('visibility','hidden'); - self[type](html); - if($.isFunction(func)) func(args); - } - }); - } -}; -})(jQuery); +/** + * @file common/js/xml_handler.js + * @brief XE에서 ajax기능을 이용함에 있어 module, act를 잘 사용하기 위한 자바스크립트 + **/ + +// xml handler을 이용하는 user function +var show_waiting_message = true; + +/* This work is licensed under Creative Commons GNU LGPL License. + + License: http://creativecommons.org/licenses/LGPL/2.1/ + Version: 0.9 + Author: Stefan Goessner/2006 + Web: http://goessner.net/ +*/ +function xml2json(xml, tab, ignoreAttrib) { + var X = { + toObj: function(xml) { + var o = {}; + if (xml.nodeType==1) { // element node .. + if (ignoreAttrib && xml.attributes.length) // element with attributes .. + for (var i=0; i 1) + o = X.escape(X.innerXml(xml)); + else + for (var n=xml.firstChild; n; n=n.nextSibling){ + //o["#cdata"] = X.escape(n.nodeValue); + o = X.escape(n.nodeValue); + } + } + } + if (!xml.attributes.length && !xml.firstChild) o = null; + } + else if (xml.nodeType==9) { // document.node + o = X.toObj(xml.documentElement); + } + else + alert("unhandled node type: " + xml.nodeType); + return o; + }, + toJson: function(o, name, ind) { + var json = name ? ("\""+name+"\"") : ""; + if (o instanceof Array) { + for (var i=0,n=o.length; i 1 ? ("\n"+ind+"\t"+o.join(",\n"+ind+"\t")+"\n"+ind) : o.join("")) + "]"; + } + else if (o == null) + json += (name&&":") + "null"; + else if (typeof(o) == "object") { + var arr = []; + for (var m in o) + arr[arr.length] = X.toJson(o[m], m, ind+"\t"); + json += (name?":{":"{") + (arr.length > 1 ? ("\n"+ind+"\t"+arr.join(",\n"+ind+"\t")+"\n"+ind) : arr.join("")) + "}"; + } + else if (typeof(o) == "string") + json += (name&&":") + "\"" + o.toString() + "\""; + else + json += (name&&":") + o.toString(); + return json; + }, + innerXml: function(node) { + var s = "" + if ("innerHTML" in node) + s = node.innerHTML; + else { + var asXml = function(n) { + var s = ""; + if (n.nodeType == 1) { + s += "<" + n.nodeName; + for (var i=0; i"; + } + else + s += "/>"; + } + else if (n.nodeType == 3) + s += n.nodeValue; + else if (n.nodeType == 4) + s += ""; + return s; + }; + for (var c=node.firstChild; c; c=c.nextSibling) + s += asXml(c); + } + return s; + }, + escape: function(txt) { + return txt.replace(/[\\]/g, "\\\\") + .replace(/[\"]/g, '\\"') + .replace(/[\n]/g, '\\n') + .replace(/[\r]/g, '\\r'); + }, + removeWhite: function(e) { + e.normalize(); + for (var n = e.firstChild; n; ) { + if (n.nodeType == 3) { // text node + if (!n.nodeValue.match(/[^ \f\n\r\t\v]/)) { // pure whitespace text node + var nxt = n.nextSibling; + e.removeChild(n); + n = nxt; + } + else + n = n.nextSibling; + } + else if (n.nodeType == 1) { // element node + X.removeWhite(n); + n = n.nextSibling; + } + else // any other node + n = n.nextSibling; + } + return e; + } + }; + if (xml.nodeType == 9) // document node + xml = xml.documentElement; + + var json_obj = X.toObj(X.removeWhite(xml)), json_str; + + if (typeof(JSON)=='object' && jQuery.isFunction(JSON.stringify) && false) { + var obj = {}; obj[xml.nodeName] = json_obj; + json_str = JSON.stringify(obj); + return json_str; + } else { + json_str = X.toJson(json_obj, xml.nodeName, ""); + return "{" + (tab ? json_str.replace(/\t/g, tab) : json_str.replace(/\t|\n/g, "")) + "}"; + } +} + +(function($){ +/** + * @brief exec_xml + * @author NHN (developers@xpressengine.com) + **/ +$.exec_xml = window.exec_xml = function(module, act, params, callback_func, response_tags, callback_func_arg, fo_obj) { + var xml_path = request_uri+"index.php" + if(!params) params = {}; + + // {{{ set parameters + if($.isArray(params)) params = arr2obj(params); + params['module'] = module; + params['act'] = act; + + if(typeof(xeVid)!='undefined') params['vid'] = xeVid; + if(typeof(response_tags)=="undefined" || response_tags.length<1) response_tags = ['error','message']; + else { + response_tags.push('error', 'message'); + } + // }}} set parameters + + // use ssl? + if ($.isArray(ssl_actions) && params['act'] && $.inArray(params['act'], ssl_actions) >= 0) + { + var url = default_url || request_uri; + var port = window.https_port || 443; + var _ul = $('').attr('href', url)[0]; + var target = 'https://' + _ul.hostname.replace(/:\d+$/, ''); + + if(port != 443) target += ':'+port; + if(_ul.pathname[0] != '/') target += '/'; + + target += _ul.pathname; + xml_path = target.replace(/\/$/, '')+'/index.php'; + } + + var _u1 = $('').attr('href', location.href)[0]; + var _u2 = $('').attr('href', xml_path)[0]; + + // 현 url과 ajax call 대상 url의 schema 또는 port가 다르면 직접 form 전송 + if(_u1.protocol != _u2.protocol || _u1.port != _u2.port) return send_by_form(xml_path, params); + + var xml = [], i = 0; + xml[i++] = ''; + xml[i++] = ''; + xml[i++] = ''; + + $.each(params, function(key, val) { + xml[i++] = '<'+key+'>'; + }); + + xml[i++] = ''; + xml[i++] = ''; + + var _xhr = null; + if (_xhr && _xhr.readyState != 0) _xhr.abort(); + + // 전송 성공시 + function onsuccess(data, textStatus, xhr) { + var resp_xml = $(data).find('response')[0], resp_obj, txt='', ret=[], tags={}, json_str=''; + + waiting_obj.css('visibility', 'hidden'); + + if(!resp_xml) { + alert(_xhr.responseText); + return null; + } + + json_str = xml2json(resp_xml, false, false); + resp_obj = (typeof(JSON)=='object' && $.isFunction(JSON.parse))?JSON.parse(json_str):eval('('+json_str+')'); + resp_obj = resp_obj.response; + + if (typeof(resp_obj)=='undefined') { + ret['error'] = -1; + ret['message'] = 'Unexpected error occured.'; + try { + if(typeof(txt=resp_xml.childNodes[0].firstChild.data)!='undefined') ret['message'] += '\r\n'+txt; + } catch(e){}; + return ret; + } + + $.each(response_tags, function(key, val){ tags[val] = true; }); + tags["redirect_url"] = true; + tags["act"] = true; + $.each(resp_obj, function(key, val){ if(tags[key]) ret[key] = val; }); + + if(ret['error'] != 0) { + if ($.isFunction($.exec_xml.onerror)) { + return $.exec_xml.onerror(module, act, ret, callback_func, response_tags, callback_func_arg, fo_obj); + } + + alert(ret['message'] || 'error!'); + return null; + } + + if(ret['redirect_url']) { + location.href = ret['redirect_url'].replace(/&/g, '&'); + return null; + } + + if($.isFunction(callback_func)) callback_func(ret, response_tags, callback_func_arg, fo_obj); + } + + // 모든 xml데이터는 POST방식으로 전송. try-catch문으로 오류 발생시 대처 + try { + $.ajax({ + url : xml_path, + type : 'POST', + dataType : 'xml', + data : xml.join('\n'), + contentType : 'text/plain', + beforeSend : function(xhr){ _xhr = xhr; }, + success : onsuccess, + error : function(xhr, textStatus) { + waiting_obj.css('visibility', 'hidden'); + + var msg = ''; + if (textStatus == 'parsererror') { + msg = 'The result is not valid XML :\n-------------------------------------\n'; + if(xhr.responseText == "") return; + msg += xhr.responseText.replace(/<[^>]+>/g, ''); + } else { + msg = textStatus; + } + + alert(msg); + } + }); + } catch(e) { + alert(e); + return; + } + + // ajax 통신중 대기 메세지 출력 (show_waiting_message값을 false로 세팅시 보이지 않음) + var waiting_obj = $('#waitingforserverresponse'); + if(show_waiting_message && waiting_obj.length) { + var d = $(document); + waiting_obj.html(waiting_message).css({ + 'top' : (d.scrollTop()+20)+'px', + 'left' : (d.scrollLeft()+20)+'px', + 'visibility' : 'visible' + }); + } +} +function send_by_form(url, params) { + var frame_id = 'xeTmpIframe'; + var form_id = 'xeVirtualForm'; + + if (!$('#'+frame_id).length) { + $(''.replace(/%id%/g, frame_id)).appendTo(document.body); + } + + $('#'+form_id).remove(); + var form = $('
'.replace(/%id%/g, form_id)).attr({ + 'id' : form_id, + 'method' : 'post', + 'action' : url, + 'target' : frame_id + }); + + params['xeVirtualRequestMethod'] = 'xml'; + params['xeRequestURI'] = location.href.replace(/#(.*)$/i,''); + params['xeVirtualRequestUrl'] = request_uri; + + $.each(params, function(key, value){ + $('').attr('name', key).attr('value', value).appendTo(form); + }); + + form.appendTo(document.body).submit(); +} +function arr2obj(arr) { + var ret = {}; + for(var key in arr) { + if(arr.hasOwnProperty(key)) ret[key] = arr[key]; + } + return ret; +} + +/** + * @brief exec_json (exec_xml와 같은 용도) + **/ +$.exec_json = function(action,data,func){ + if(typeof(data) == 'undefined') data = {}; + action = action.split("."); + if(action.length == 2){ + + if(show_waiting_message) { + $("#waitingforserverresponse").html(waiting_message).css('top',$(document).scrollTop()+20).css('left',$(document).scrollLeft()+20).css('visibility','visible'); + } + + $.extend(data,{module:action[0],act:action[1]}); + if(typeof(xeVid)!='undefined') $.extend(data,{vid:xeVid}); + $.ajax({ + type:"POST" + ,dataType:"json" + ,url:request_uri + ,contentType:"application/json" + ,data:$.param(data) + ,success : function(data){ + $("#waitingforserverresponse").css('visibility','hidden'); + if(data.error > 0) alert(data.message); + if($.isFunction(func)) func(data); + } + }); + } +}; + +$.fn.exec_html = function(action,data,type,func,args){ + if(typeof(data) == 'undefined') data = {}; + if(!$.inArray(type, ['html','append','prepend'])) type = 'html'; + + var self = $(this); + action = action.split("."); + if(action.length == 2){ + if(show_waiting_message) { + $("#waitingforserverresponse").html(waiting_message).css('top',$(document).scrollTop()+20).css('left',$(document).scrollLeft()+20).css('visibility','visible'); + } + + $.extend(data,{module:action[0],act:action[1]}); + $.ajax({ + type:"POST" + ,dataType:"html" + ,url:request_uri + ,data:$.param(data) + ,success : function(html){ + $("#waitingforserverresponse").css('visibility','hidden'); + self[type](html); + if($.isFunction(func)) func(args); + } + }); + } +}; +})(jQuery); diff --git a/common/js/src/xml_js_filter.js b/common/js/src/xml_js_filter.js index 993d748fb..f03278515 100644 --- a/common/js/src/xml_js_filter.js +++ b/common/js/src/xml_js_filter.js @@ -1,338 +1,338 @@ -/** - * @file common/js/xml_js_filter.js - * @author NHN (developers@xpressengine.com) - * @brief xml filter (validator) plugin - * - * A rule is a method validate one field. - * A filter is made up of one or more rules. - **/ -(function($){ - -var messages = []; -var rules = []; -var filters = []; -var callbacks = []; -var extras = {}; - -var Validator = xe.createApp('Validator', { - init : function() { - // {{{ add filters - // email - var regEmail = /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/; - this.cast('ADD_RULE', ['email', regEmail]); - this.cast('ADD_RULE', ['email_address', regEmail]); - - // userid - var regUserid = /^[a-z]+[\w-]*[a-z0-9_]+$/i; - this.cast('ADD_RULE', ['userid', regUserid]); - this.cast('ADD_RULE', ['user_id', regUserid]); - - // url - var regUrl = /^(https?|ftp|mms):\/\/[0-9a-z-]+(\.[_0-9a-z-\/\~]+)+(:[0-9]{2,4})*$/; - this.cast('ADD_RULE', ['url', regUrl]); - this.cast('ADD_RULE', ['homepage', regUrl]); - - // korean - var regKor = /^[가-힣]*$/; - this.cast('ADD_RULE', ['korean', regKor]); - - // korean_number - var regKorNum = /^[가-힣0-9]*$/; - this.cast('ADD_RULE', ['korean_number', regKorNum]); - - // alpha - var regAlpha = /^[a-z]*$/i; - this.cast('ADD_RULE', ['alpha', regAlpha]); - - // alpha_number - var regAlphaNum = /^[a-z][a-z0-9_]*$/i; - this.cast('ADD_RULE', ['alpha_number', regAlphaNum]); - - // number - var regNum = /^[0-9]*$/; - this.cast('ADD_RULE', ['number', regNum]); - // }}} add filters - }, - // run validator - run : function(oForm) { - var filter = ''; - - if (oForm._filter) filter = oForm._filter.value; - - var params = [oForm, filter]; - var result = this.cast('VALIDATE', params); - if (typeof result == 'undefined') result = false; - - return result; - }, - API_ONREADY : function() { - var self = this; - - // hook form submit event - $('form') - .each(function(){ - if (this.onsubmit) { - this['xe:onsubmit'] = this.onsubmit; - this.onsubmit = null; - } - }) - .submit(function(){ - var legacyFn = this['xe:onsubmit']; - var hasLegacyFn = $.isFunction(legacyFn); - var bResult = hasLegacyFn?legacyFn.apply(this):self.run(this); - - return bResult; - }); - }, - API_VALIDATE : function(sender, params) { - var self = this, result = true, form = params[0], filter=null, callback=null; - - if (form.elements['_filter']) filter = form.elements['_filter'].value; - if (!filter) return true; - if ($.isFunction(callbacks[filter])) callback = callbacks[filter]; - filter = $.extend({}, filters[filter.toLowerCase()] || {}, extras); - - $.each(filter, function(name) { - var _el = form.elements[name]; - - if (!_el) return true; - - var el = $(_el), val = $.trim(get_value(el)); - var minlen = parseInt(this.minlength) || 0; - var maxlen = parseInt(this.maxlength) || 0; - var rule = (this.rule || '').split(','); - - if (this.required && !val) return (result = (!!self.cast('ALERT', [form, name, 'isnull']) && false)); - if (!this.required && !val) return (result = true); - if ((minlen && val.length < minlen) || (maxlen && val.length > maxlen)) return (result = (!!self.cast('ALERT', [form, name, 'outofrange', minlen, maxlen]) && false)); - - if (this.equalto) { - var eq_val = get_value($(form.elements[this.equalto])); - if (eq_val != val) return (result = (!!self.cast('ALERT', [form, name, 'equalto']) && false)); - } - - if (rule) { - $.each(rule, function(i,r) { - if (!r) return true; - - var ret = self.cast('APPLY_RULE', [r, val]); - if (!ret) { - self.cast('ALERT', [form, name, 'invalid_'+this]); - return (result = false); - } - }); - } - - if (!result) return false; - }); - - if (!result) return false; - if ($.isFunction(callback)) return callback(form); - - return true; - }, - API_ADD_RULE : function(sender, params) { - var name = params[0].toLowerCase(); - rules[name] = params[1]; - }, - API_DEL_RULE : function(sender, params) { - var name = params[0].toLowerCase(); - delete rules[name]; - }, - API_GET_RULE : function(sender, params) { - var name = params[0].toLowerCase(); - - if (rules[name]) { - return rules[name]; - } else { - return null; - } - }, - API_ADD_FILTER : function(sender, params) { - var name = params[0].toLowerCase(); - var filter = params[1]; - - filters[name] = filter; - }, - API_DEL_FILTER : function(sender, params) { - var name = params[0].toLowerCase(); - delete filters[name]; - }, - API_GET_FILTER : function(sender, params) { - var name = params[0].toLowerCase(); - - if (filters[name]) { - return filters[name]; - } else { - return null; - } - }, - API_ADD_EXTRA_FIELD : function(sender, params) { - var name = params[0].toLowerCase(); - var prop = params[1]; - - extras[name] = prop; - }, - API_GET_EXTRA_FIELD : function(sender, params) { - var name = params[0].toLowerCase(); - return extras[name]; - }, - API_DEL_EXTRA_FIELD : function(sender, params) { - var name = params[0].toLowerCase(); - delete extras[name]; - }, - API_APPLY_RULE : function(sender, params) { - var name = params[0]; - var value = params[1]; - - if (typeof(rules[name]) == 'undefined') return true; // no filter - if ($.isFunction(rules[name])) return rules[name](value); - if (rules[name] instanceof RegExp) return rules[name].test(value); - - return true; - }, - API_ALERT : function(sender, params) { - var form = params[0]; - var field_name = params[1]; - var msg_code = params[2]; - var minlen = params[3]; - var maxlen = params[4]; - - var field_msg = this.cast('GET_MESSAGE', [field_name]); - var msg = this.cast('GET_MESSAGE', [msg_code]); - - if (msg != msg_code) msg = (msg.indexOf('%s')<0)?(field_msg+msg):(msg.replace('%s',field_msg)); - if (minlen||maxlen) msg += '('+(minlen||'')+'~'+(maxlen||'')+')'; - - this.cast('SHOW_ALERT', [msg]); - - // set focus - $(form.elements[field_name]).focus(); - }, - API_SHOW_ALERT : function(sender, params) { - alert(params[0]); - }, - API_ADD_MESSAGE : function(sender, params) { - var msg_code = params[0]; - var msg_str = params[1]; - - messages[msg_code] = msg_str; - }, - API_GET_MESSAGE : function(sender, params) { - var msg_code = params[0]; - - return messages[msg_code] || msg_code; - }, - API_ADD_CALLBACK : function(sender, params) { - var name = params[0]; - var func = params[1]; - - callbacks[name] = func; - }, - API_REMOVE_CALLBACK : function(sender, params) { - var name = params[0]; - - delete callbacks[name]; - } -}); - -var oValidator = new Validator; - -// register validator -xe.registerApp(oValidator); - -// 호환성을 위해 추가한 플러그인 - 에디터에서 컨텐트를 가져와서 설정한다. -var EditorStub = xe.createPlugin('editor_stub', { - API_BEFORE_VALIDATE : function(sender, params) { - var form = params[0]; - var seq = form.getAttribute('editor_sequence'); - - // bug fix for IE6,7 - if (seq && typeof seq == 'object') seq = seq.value; - - if (seq) { - try { - editorRelKeys[seq].content.value = editorRelKeys[seq].func(seq) || ''; - } catch(e) { } - } - } -}); -oValidator.registerPlugin(new EditorStub); - -// functions -function get_value(elem) { - var vals = []; - if (elem.is(':radio')){ - return elem.filter(':checked').val(); - } else if (elem.is(':checkbox')) { - elem.filter(':checked').each(function(){ - vals.push(this.value); - }); - return vals.join('|@|'); - } else { - return elem.val(); - } -} - -})(jQuery); - -/** - * @function filterAlertMessage - * @brief ajax로 서버에 요청후 결과를 처리할 callback_function을 지정하지 않았을 시 호출되는 기본 함수 - **/ -function filterAlertMessage(ret_obj) { - var error = ret_obj["error"]; - var message = ret_obj["message"]; - var act = ret_obj["act"]; - var redirect_url = ret_obj["redirect_url"]; - var url = location.href; - - if(typeof(message)!="undefined"&&message&&message!="success") alert(message); - - if(typeof(act)!="undefined" && act) url = current_url.setQuery("act", act); - else if(typeof(redirect_url)!="undefined" && redirect_url) url = redirect_url; - - if(url == location.href) url = url.replace(/#(.*)$/,''); - - location.href = url; -} - -/** - * @brief Function to process filters - * @deprecated - */ -function procFilter(form, filter_func) { - filter_func(form); - return false; -} - -function legacy_filter(filter_name, form, module, act, callback, responses, confirm_msg, rename_params) { - var v = xe.getApp('Validator')[0], $ = jQuery, args = []; - - if (!v) return false; - - if (!form.elements['_filter']) $(form).prepend(''); - form.elements['_filter'].value = filter_name; - - args[0] = filter_name; - args[1] = function(f) { - var params = {}, res = [], elms = f.elements, data = $(f).serializeArray(); - $.each(data, function(i, field) { - var v = $.trim(field.value), n = field.name; - if(!v || !n) return true; - if(rename_params[n]) n = rename_params[n]; - - if(/\[\]$/.test(n)) n = n.replace(/\[\]$/, ''); - if(params[n]) params[n] += '|@|'+v; - else params[n] = field.value; - }); - - if (confirm_msg && !confirm(confirm_msg)) return false; - exec_xml(module, act, params, callback, responses, params, form); - }; - - v.cast('ADD_CALLBACK', args); - v.cast('VALIDATE', [form, filter_name]); - - return false; +/** + * @file common/js/xml_js_filter.js + * @author NHN (developers@xpressengine.com) + * @brief xml filter (validator) plugin + * + * A rule is a method validate one field. + * A filter is made up of one or more rules. + **/ +(function($){ + +var messages = []; +var rules = []; +var filters = []; +var callbacks = []; +var extras = {}; + +var Validator = xe.createApp('Validator', { + init : function() { + // {{{ add filters + // email + var regEmail = /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/; + this.cast('ADD_RULE', ['email', regEmail]); + this.cast('ADD_RULE', ['email_address', regEmail]); + + // userid + var regUserid = /^[a-z]+[\w-]*[a-z0-9_]+$/i; + this.cast('ADD_RULE', ['userid', regUserid]); + this.cast('ADD_RULE', ['user_id', regUserid]); + + // url + var regUrl = /^(https?|ftp|mms):\/\/[0-9a-z-]+(\.[_0-9a-z-\/\~]+)+(:[0-9]{2,4})*$/; + this.cast('ADD_RULE', ['url', regUrl]); + this.cast('ADD_RULE', ['homepage', regUrl]); + + // korean + var regKor = /^[가-힣]*$/; + this.cast('ADD_RULE', ['korean', regKor]); + + // korean_number + var regKorNum = /^[가-힣0-9]*$/; + this.cast('ADD_RULE', ['korean_number', regKorNum]); + + // alpha + var regAlpha = /^[a-z]*$/i; + this.cast('ADD_RULE', ['alpha', regAlpha]); + + // alpha_number + var regAlphaNum = /^[a-z][a-z0-9_]*$/i; + this.cast('ADD_RULE', ['alpha_number', regAlphaNum]); + + // number + var regNum = /^[0-9]*$/; + this.cast('ADD_RULE', ['number', regNum]); + // }}} add filters + }, + // run validator + run : function(oForm) { + var filter = ''; + + if (oForm._filter) filter = oForm._filter.value; + + var params = [oForm, filter]; + var result = this.cast('VALIDATE', params); + if (typeof result == 'undefined') result = false; + + return result; + }, + API_ONREADY : function() { + var self = this; + + // hook form submit event + $('form') + .each(function(){ + if (this.onsubmit) { + this['xe:onsubmit'] = this.onsubmit; + this.onsubmit = null; + } + }) + .submit(function(){ + var legacyFn = this['xe:onsubmit']; + var hasLegacyFn = $.isFunction(legacyFn); + var bResult = hasLegacyFn?legacyFn.apply(this):self.run(this); + + return bResult; + }); + }, + API_VALIDATE : function(sender, params) { + var self = this, result = true, form = params[0], filter=null, callback=null; + + if (form.elements['_filter']) filter = form.elements['_filter'].value; + if (!filter) return true; + if ($.isFunction(callbacks[filter])) callback = callbacks[filter]; + filter = $.extend({}, filters[filter.toLowerCase()] || {}, extras); + + $.each(filter, function(name) { + var _el = form.elements[name]; + + if (!_el) return true; + + var el = $(_el), val = $.trim(get_value(el)); + var minlen = parseInt(this.minlength) || 0; + var maxlen = parseInt(this.maxlength) || 0; + var rule = (this.rule || '').split(','); + + if (this.required && !val) return (result = (!!self.cast('ALERT', [form, name, 'isnull']) && false)); + if (!this.required && !val) return (result = true); + if ((minlen && val.length < minlen) || (maxlen && val.length > maxlen)) return (result = (!!self.cast('ALERT', [form, name, 'outofrange', minlen, maxlen]) && false)); + + if (this.equalto) { + var eq_val = get_value($(form.elements[this.equalto])); + if (eq_val != val) return (result = (!!self.cast('ALERT', [form, name, 'equalto']) && false)); + } + + if (rule) { + $.each(rule, function(i,r) { + if (!r) return true; + + var ret = self.cast('APPLY_RULE', [r, val]); + if (!ret) { + self.cast('ALERT', [form, name, 'invalid_'+this]); + return (result = false); + } + }); + } + + if (!result) return false; + }); + + if (!result) return false; + if ($.isFunction(callback)) return callback(form); + + return true; + }, + API_ADD_RULE : function(sender, params) { + var name = params[0].toLowerCase(); + rules[name] = params[1]; + }, + API_DEL_RULE : function(sender, params) { + var name = params[0].toLowerCase(); + delete rules[name]; + }, + API_GET_RULE : function(sender, params) { + var name = params[0].toLowerCase(); + + if (rules[name]) { + return rules[name]; + } else { + return null; + } + }, + API_ADD_FILTER : function(sender, params) { + var name = params[0].toLowerCase(); + var filter = params[1]; + + filters[name] = filter; + }, + API_DEL_FILTER : function(sender, params) { + var name = params[0].toLowerCase(); + delete filters[name]; + }, + API_GET_FILTER : function(sender, params) { + var name = params[0].toLowerCase(); + + if (filters[name]) { + return filters[name]; + } else { + return null; + } + }, + API_ADD_EXTRA_FIELD : function(sender, params) { + var name = params[0].toLowerCase(); + var prop = params[1]; + + extras[name] = prop; + }, + API_GET_EXTRA_FIELD : function(sender, params) { + var name = params[0].toLowerCase(); + return extras[name]; + }, + API_DEL_EXTRA_FIELD : function(sender, params) { + var name = params[0].toLowerCase(); + delete extras[name]; + }, + API_APPLY_RULE : function(sender, params) { + var name = params[0]; + var value = params[1]; + + if (typeof(rules[name]) == 'undefined') return true; // no filter + if ($.isFunction(rules[name])) return rules[name](value); + if (rules[name] instanceof RegExp) return rules[name].test(value); + + return true; + }, + API_ALERT : function(sender, params) { + var form = params[0]; + var field_name = params[1]; + var msg_code = params[2]; + var minlen = params[3]; + var maxlen = params[4]; + + var field_msg = this.cast('GET_MESSAGE', [field_name]); + var msg = this.cast('GET_MESSAGE', [msg_code]); + + if (msg != msg_code) msg = (msg.indexOf('%s')<0)?(field_msg+msg):(msg.replace('%s',field_msg)); + if (minlen||maxlen) msg += '('+(minlen||'')+'~'+(maxlen||'')+')'; + + this.cast('SHOW_ALERT', [msg]); + + // set focus + $(form.elements[field_name]).focus(); + }, + API_SHOW_ALERT : function(sender, params) { + alert(params[0]); + }, + API_ADD_MESSAGE : function(sender, params) { + var msg_code = params[0]; + var msg_str = params[1]; + + messages[msg_code] = msg_str; + }, + API_GET_MESSAGE : function(sender, params) { + var msg_code = params[0]; + + return messages[msg_code] || msg_code; + }, + API_ADD_CALLBACK : function(sender, params) { + var name = params[0]; + var func = params[1]; + + callbacks[name] = func; + }, + API_REMOVE_CALLBACK : function(sender, params) { + var name = params[0]; + + delete callbacks[name]; + } +}); + +var oValidator = new Validator; + +// register validator +xe.registerApp(oValidator); + +// 호환성을 위해 추가한 플러그인 - 에디터에서 컨텐트를 가져와서 설정한다. +var EditorStub = xe.createPlugin('editor_stub', { + API_BEFORE_VALIDATE : function(sender, params) { + var form = params[0]; + var seq = form.getAttribute('editor_sequence'); + + // bug fix for IE6,7 + if (seq && typeof seq == 'object') seq = seq.value; + + if (seq) { + try { + editorRelKeys[seq].content.value = editorRelKeys[seq].func(seq) || ''; + } catch(e) { } + } + } +}); +oValidator.registerPlugin(new EditorStub); + +// functions +function get_value(elem) { + var vals = []; + if (elem.is(':radio')){ + return elem.filter(':checked').val(); + } else if (elem.is(':checkbox')) { + elem.filter(':checked').each(function(){ + vals.push(this.value); + }); + return vals.join('|@|'); + } else { + return elem.val(); + } +} + +})(jQuery); + +/** + * @function filterAlertMessage + * @brief ajax로 서버에 요청후 결과를 처리할 callback_function을 지정하지 않았을 시 호출되는 기본 함수 + **/ +function filterAlertMessage(ret_obj) { + var error = ret_obj["error"]; + var message = ret_obj["message"]; + var act = ret_obj["act"]; + var redirect_url = ret_obj["redirect_url"]; + var url = location.href; + + if(typeof(message)!="undefined"&&message&&message!="success") alert(message); + + if(typeof(act)!="undefined" && act) url = current_url.setQuery("act", act); + else if(typeof(redirect_url)!="undefined" && redirect_url) url = redirect_url; + + if(url == location.href) url = url.replace(/#(.*)$/,''); + + location.href = url; +} + +/** + * @brief Function to process filters + * @deprecated + */ +function procFilter(form, filter_func) { + filter_func(form); + return false; +} + +function legacy_filter(filter_name, form, module, act, callback, responses, confirm_msg, rename_params) { + var v = xe.getApp('Validator')[0], $ = jQuery, args = []; + + if (!v) return false; + + if (!form.elements['_filter']) $(form).prepend(''); + form.elements['_filter'].value = filter_name; + + args[0] = filter_name; + args[1] = function(f) { + var params = {}, res = [], elms = f.elements, data = $(f).serializeArray(); + $.each(data, function(i, field) { + var v = $.trim(field.value), n = field.name; + if(!v || !n) return true; + if(rename_params[n]) n = rename_params[n]; + + if(/\[\]$/.test(n)) n = n.replace(/\[\]$/, ''); + if(params[n]) params[n] += '|@|'+v; + else params[n] = field.value; + }); + + if (confirm_msg && !confirm(confirm_msg)) return false; + exec_xml(module, act, params, callback, responses, params, form); + }; + + v.cast('ADD_CALLBACK', args); + v.cast('VALIDATE', [form, filter_name]); + + return false; } \ No newline at end of file diff --git a/common/js/unittest/JSSpec/JSSpec.js b/common/js/unittest/JSSpec/JSSpec.js index 91cd142b3..1a337df41 100644 --- a/common/js/unittest/JSSpec/JSSpec.js +++ b/common/js/unittest/JSSpec/JSSpec.js @@ -1,1548 +1,1548 @@ -/** - * JSSpec - * - * Copyright 2007 Alan Kang - * - mailto:jania902@gmail.com - * - http://jania.pe.kr - * - * http://jania.pe.kr/aw/moin.cgi/JSSpec - * - * Dependencies: - * - diff_match_patch.js ( http://code.google.com/p/google-diff-match-patch ) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - */ - -/** - * Namespace - */ - -var JSSpec = { - specs: [], - - EMPTY_FUNCTION: function() {}, - - Browser: { - // By Rendering Engines - Trident: navigator.appName === "Microsoft Internet Explorer", - Webkit: navigator.userAgent.indexOf('AppleWebKit/') > -1, - Gecko: navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') === -1, - KHTML: navigator.userAgent.indexOf('KHTML') !== -1, - Presto: navigator.appName === "Opera", - - // By Platforms - Mac: navigator.userAgent.indexOf("Macintosh") !== -1, - Ubuntu: navigator.userAgent.indexOf('Ubuntu') !== -1, - Win: navigator.userAgent.indexOf('Windows') !== -1, - - // By Browsers - IE: navigator.appName === "Microsoft Internet Explorer", - IE6: navigator.userAgent.indexOf('MSIE 6') !== -1, - IE7: navigator.userAgent.indexOf('MSIE 7') !== -1, - IE8: navigator.userAgent.indexOf('MSIE 8') !== -1, - - FF: navigator.userAgent.indexOf('Firefox') !== -1, - FF2: navigator.userAgent.indexOf('Firefox/2') !== -1, - FF3: navigator.userAgent.indexOf('Firefox/3') !== -1, - Safari: navigator.userAgent.indexOf('Safari') !== -1 - } -}; - - - -/** - * Executor - */ -JSSpec.Executor = function(target, onSuccess, onException) { - this.target = target; - this.onSuccess = typeof onSuccess == 'function' ? onSuccess : JSSpec.EMPTY_FUNCTION; - this.onException = typeof onException == 'function' ? onException : JSSpec.EMPTY_FUNCTION; - - if(JSSpec.Browser.Trident) { - // Exception handler for Trident. It helps to collect exact line number where exception occured. - window.onerror = function(message, fileName, lineNumber) { - var self = window._curExecutor; - var ex = {message:message, fileName:fileName, lineNumber:lineNumber}; - - if(JSSpec._secondPass) { - ex = self.mergeExceptions(JSSpec._assertionFailure, ex); - delete JSSpec._secondPass; - delete JSSpec._assertionFailure; - - ex.type = "failure"; - self.onException(self, ex); - } else if(JSSpec._assertionFailure) { - JSSpec._secondPass = true; - self.run(); - } else { - self.onException(self, ex); - } - - return true; - }; - } -}; -JSSpec.Executor.prototype.mergeExceptions = function(assertionFailure, normalException) { - var merged = { - message:assertionFailure.message, - fileName:normalException.fileName, - lineNumber:normalException.lineNumber - }; - - return merged; -}; - -JSSpec.Executor.prototype.run = function() { - var self = this; - var target = this.target; - var onSuccess = this.onSuccess; - var onException = this.onException; - - window.setTimeout( - function() { - var result; - if(JSSpec.Browser.Trident) { - window._curExecutor = self; - - result = self.target(); - self.onSuccess(self, result); - } else { - try { - result = self.target(); - self.onSuccess(self, result); - } catch(ex) { - if(JSSpec.Browser.Webkit) ex = {message:ex.message, fileName:ex.sourceURL, lineNumber:ex.line}; - - if(JSSpec._secondPass) { - ex = self.mergeExceptions(JSSpec._assertionFailure, ex); - delete JSSpec._secondPass; - delete JSSpec._assertionFailure; - - ex.type = "failure"; - self.onException(self, ex); - } else if(JSSpec._assertionFailure) { - JSSpec._secondPass = true; - self.run(); - } else { - self.onException(self, ex); - } - } - } - }, - 0 - ); -}; - - - -/** - * CompositeExecutor composites one or more executors and execute them sequencially. - */ -JSSpec.CompositeExecutor = function(onSuccess, onException, continueOnException) { - this.queue = []; - this.onSuccess = typeof onSuccess == 'function' ? onSuccess : JSSpec.EMPTY_FUNCTION; - this.onException = typeof onException == 'function' ? onException : JSSpec.EMPTY_FUNCTION; - this.continueOnException = !!continueOnException; -}; - -JSSpec.CompositeExecutor.prototype.addFunction = function(func) { - this.addExecutor(new JSSpec.Executor(func)); -}; - -JSSpec.CompositeExecutor.prototype.addExecutor = function(executor) { - var last = this.queue.length == 0 ? null : this.queue[this.queue.length - 1]; - if(last) { - last.next = executor; - } - - executor.parent = this; - executor.onSuccessBackup = executor.onSuccess; - executor.onSuccess = function(result) { - this.onSuccessBackup(result); - if(this.next) { - this.next.run(); - } else { - this.parent.onSuccess(); - } - }; - executor.onExceptionBackup = executor.onException; - executor.onException = function(executor, ex) { - this.onExceptionBackup(executor, ex); - - if(this.parent.continueOnException) { - if(this.next) { - this.next.run(); - } else { - this.parent.onSuccess(); - } - } else { - this.parent.onException(executor, ex); - } - }; - - this.queue.push(executor); -}; - -JSSpec.CompositeExecutor.prototype.run = function() { - if(this.queue.length > 0) { - this.queue[0].run(); - } -}; - -/** - * Spec is a set of Examples in a specific context - */ -JSSpec.Spec = function(context, entries) { - this.id = JSSpec.Spec.id++; - this.context = context; - this.url = location.href; - - this.filterEntriesByEmbeddedExpressions(entries); - this.extractOutSpecialEntries(entries); - this.examples = this.makeExamplesFromEntries(entries); - this.examplesMap = this.makeMapFromExamples(this.examples); -}; - -JSSpec.Spec.id = 0; -JSSpec.Spec.prototype.getExamples = function() { - return this.examples; -}; - -JSSpec.Spec.prototype.hasException = function() { - return this.getTotalFailures() > 0 || this.getTotalErrors() > 0; -}; - -JSSpec.Spec.prototype.getTotalFailures = function() { - var examples = this.examples; - var failures = 0; - for(var i = 0; i < examples.length; i++) { - if(examples[i].isFailure()) failures++; - } - return failures; -}; - -JSSpec.Spec.prototype.getTotalErrors = function() { - var examples = this.examples; - var errors = 0; - for(var i = 0; i < examples.length; i++) { - if(examples[i].isError()) errors++; - } - return errors; -}; - -JSSpec.Spec.prototype.filterEntriesByEmbeddedExpressions = function(entries) { - var isTrue; - for(name in entries) if(entries.hasOwnProperty(name)) { - var m = name.match(/\[\[(.+)\]\]/); - if(m && m[1]) { - eval("isTrue = (" + m[1] + ")"); - if(!isTrue) delete entries[name]; - } - } -}; - -JSSpec.Spec.prototype.extractOutSpecialEntries = function(entries) { - this.beforeEach = JSSpec.EMPTY_FUNCTION; - this.beforeAll = JSSpec.EMPTY_FUNCTION; - this.afterEach = JSSpec.EMPTY_FUNCTION; - this.afterAll = JSSpec.EMPTY_FUNCTION; - - for(name in entries) if(entries.hasOwnProperty(name)) { - if(name == 'before' || name == 'before each' || name == 'before_each') { - this.beforeEach = entries[name]; - } else if(name == 'before all' || name == 'before_all') { - this.beforeAll = entries[name]; - } else if(name == 'after' || name == 'after each' || name == 'after_each') { - this.afterEach = entries[name]; - } else if(name == 'after all' || name == 'after_all') { - this.afterAll = entries[name]; - } - } - - delete entries['before']; - delete entries['before each']; - delete entries['before_each']; - delete entries['before all']; - delete entries['before_all']; - delete entries['after']; - delete entries['after each']; - delete entries['after_each']; - delete entries['after all']; - delete entries['after_all']; -}; - -JSSpec.Spec.prototype.makeExamplesFromEntries = function(entries) { - var examples = []; - for(name in entries) if(entries.hasOwnProperty(name)) { - examples.push(new JSSpec.Example(name, entries[name], this.beforeEach, this.afterEach)); - } - return examples; -}; - -JSSpec.Spec.prototype.makeMapFromExamples = function(examples) { - var map = {}; - for(var i = 0; i < examples.length; i++) { - var example = examples[i]; - map[example.id] = examples[i]; - } - return map; -}; - -JSSpec.Spec.prototype.getExampleById = function(id) { - return this.examplesMap[id]; -}; - -JSSpec.Spec.prototype.getExecutor = function() { - var self = this; - var onException = function(executor, ex) { - self.exception = ex; - }; - - var composite = new JSSpec.CompositeExecutor(); - composite.addFunction(function() {JSSpec.log.onSpecStart(self);}); - composite.addExecutor(new JSSpec.Executor(this.beforeAll, null, function(exec, ex) { - self.exception = ex; - JSSpec.log.onSpecEnd(self); - })); - - var exampleAndAfter = new JSSpec.CompositeExecutor(null,null,true); - for(var i = 0; i < this.examples.length; i++) { - exampleAndAfter.addExecutor(this.examples[i].getExecutor()); - } - exampleAndAfter.addExecutor(new JSSpec.Executor(this.afterAll, null, onException)); - exampleAndAfter.addFunction(function() {JSSpec.log.onSpecEnd(self);}); - composite.addExecutor(exampleAndAfter); - - return composite; -}; - -/** - * Example - */ -JSSpec.Example = function(name, target, before, after) { - this.id = JSSpec.Example.id++; - this.name = name; - this.target = target; - this.before = before; - this.after = after; -}; - -JSSpec.Example.id = 0; -JSSpec.Example.prototype.isFailure = function() { - return this.exception && this.exception.type == "failure"; -}; - -JSSpec.Example.prototype.isError = function() { - return this.exception && !this.exception.type; -}; - -JSSpec.Example.prototype.getExecutor = function() { - var self = this; - var onException = function(executor, ex) { - self.exception = ex; - }; - - var composite = new JSSpec.CompositeExecutor(); - composite.addFunction(function() {JSSpec.log.onExampleStart(self);}); - composite.addExecutor(new JSSpec.Executor(this.before, null, function(exec, ex) { - self.exception = ex; - JSSpec.log.onExampleEnd(self); - })); - - var targetAndAfter = new JSSpec.CompositeExecutor(null,null,true); - - targetAndAfter.addExecutor(new JSSpec.Executor(this.target, null, onException)); - targetAndAfter.addExecutor(new JSSpec.Executor(this.after, null, onException)); - targetAndAfter.addFunction(function() {JSSpec.log.onExampleEnd(self);}); - - composite.addExecutor(targetAndAfter); - - return composite; -}; - -/** - * Runner - */ -JSSpec.Runner = function(specs, logger) { - JSSpec.log = logger; - - this.totalExamples = 0; - this.specs = []; - this.specsMap = {}; - this.addAllSpecs(specs); -}; - -JSSpec.Runner.prototype.addAllSpecs = function(specs) { - for(var i = 0; i < specs.length; i++) { - this.addSpec(specs[i]); - } -}; - -JSSpec.Runner.prototype.addSpec = function(spec) { - this.specs.push(spec); - this.specsMap[spec.id] = spec; - this.totalExamples += spec.getExamples().length; -}; - -JSSpec.Runner.prototype.getSpecById = function(id) { - return this.specsMap[id]; -}; - -JSSpec.Runner.prototype.getSpecByContext = function(context) { - for(var i = 0; i < this.specs.length; i++) { - if(this.specs[i].context == context) return this.specs[i]; - } - return null; -}; - -JSSpec.Runner.prototype.getSpecs = function() { - return this.specs; -}; - -JSSpec.Runner.prototype.hasException = function() { - return this.getTotalFailures() > 0 || this.getTotalErrors() > 0; -}; - -JSSpec.Runner.prototype.getTotalFailures = function() { - var specs = this.specs; - var failures = 0; - for(var i = 0; i < specs.length; i++) { - failures += specs[i].getTotalFailures(); - } - return failures; -}; - -JSSpec.Runner.prototype.getTotalErrors = function() { - var specs = this.specs; - var errors = 0; - for(var i = 0; i < specs.length; i++) { - errors += specs[i].getTotalErrors(); - } - return errors; -}; - - -JSSpec.Runner.prototype.run = function() { - JSSpec.log.onRunnerStart(); - var executor = new JSSpec.CompositeExecutor(function() {JSSpec.log.onRunnerEnd()},null,true); - for(var i = 0; i < this.specs.length; i++) { - executor.addExecutor(this.specs[i].getExecutor()); - } - executor.run(); -}; - - -JSSpec.Runner.prototype.rerun = function(context) { - JSSpec.runner = new JSSpec.Runner([this.getSpecByContext(context)], JSSpec.log); - JSSpec.runner.run(); -}; - -/** - * Logger - */ -JSSpec.Logger = function() { - this.finishedExamples = 0; - this.startedAt = null; -}; - -JSSpec.Logger.prototype.onRunnerStart = function() { - this._title = document.title; - - this.startedAt = new Date(); - var container = document.getElementById('jsspec_container'); - if(container) { - container.innerHTML = ""; - } else { - container = document.createElement("DIV"); - container.id = "jsspec_container"; - document.body.appendChild(container); - } - - var title = document.createElement("DIV"); - title.id = "title"; - title.innerHTML = [ - '

JSSpec

', - '
    ', - JSSpec.options.rerun ? '
  • [X] ' + JSSpec.util.escapeTags(decodeURIComponent(JSSpec.options.rerun)) + '
  • ' : '', - '
  • ' + JSSpec.runner.totalExamples + ' examples
  • ', - '
  • 0 failures
  • ', - '
  • 0 errors
  • ', - '
  • 0% done
  • ', - '
  • 0 secs
  • ', - '
', - '

JSSpec homepage

', - ].join(""); - container.appendChild(title); - - var list = document.createElement("DIV"); - list.id = "list"; - list.innerHTML = [ - '

List

', - '' - ].join(""); - container.appendChild(list); - - var log = document.createElement("DIV"); - log.id = "log"; - log.innerHTML = [ - '

Log

', - '
    ', - function() { - var specs = JSSpec.runner.getSpecs(); - var sb = []; - for(var i = 0; i < specs.length; i++) { - var spec = specs[i]; - sb.push('
  • '); - sb.push('

    ' + JSSpec.util.escapeTags(specs[i].context) + ' [rerun]

    '); - sb.push('
      '); - for(var j = 0; j < spec.examples.length; j++) { - var example = spec.examples[j]; - sb.push('
    • '); - sb.push('

      ' + JSSpec.util.escapeTags(example.name) + '

      '); - sb.push('
      '+JSSpec.util.escapeTags(example.target.toString())+'
      '); - sb.push('
    • '); - } - sb.push('
    '); - sb.push('
  • '); - } - return sb.join(""); - }(), - '
' - ].join(""); - - container.appendChild(log); - - // add event handler for toggling - var specs = JSSpec.runner.getSpecs(); - var sb = []; - for(var i = 0; i < specs.length; i++) { - var spec = document.getElementById("spec_" + specs[i].id); - var title = spec.getElementsByTagName("H3")[0]; - title.onclick = function(e) { - var target = document.getElementById(this.parentNode.id + "_examples"); - target.style.display = target.style.display == "none" ? "block" : "none"; - return true; - } - } -}; - -JSSpec.Logger.prototype.onRunnerEnd = function() { - if(JSSpec.runner.hasException()) { - var times = 4; - var title1 = "*" + this._title; - var title2 = "*F" + JSSpec.runner.getTotalFailures() + " E" + JSSpec.runner.getTotalErrors() + "* " + this._title; - } else { - var times = 2; - var title1 = this._title; - var title2 = "Success"; - } - this.blinkTitle(times,title1,title2); -}; - -JSSpec.Logger.prototype.blinkTitle = function(times, title1, title2) { - var times = times * 2; - var mode = true; - - var f = function() { - if(times > 0) { - document.title = mode ? title1 : title2; - mode = !mode; - times--; - window.setTimeout(f, 500); - } else { - document.title = title1; - } - }; - - f(); -}; - -JSSpec.Logger.prototype.onSpecStart = function(spec) { - var spec_list = document.getElementById("spec_" + spec.id + "_list"); - var spec_log = document.getElementById("spec_" + spec.id); - - spec_list.className = "ongoing"; - spec_log.className = "ongoing"; -}; - -JSSpec.Logger.prototype.onSpecEnd = function(spec) { - var spec_list = document.getElementById("spec_" + spec.id + "_list"); - var spec_log = document.getElementById("spec_" + spec.id); - var examples = document.getElementById("spec_" + spec.id + "_examples"); - var className = spec.hasException() ? "exception" : "success"; - - spec_list.className = className; - spec_log.className = className; - - if(JSSpec.options.autocollapse && !spec.hasException()) examples.style.display = "none"; - - if(spec.exception) { - spec_log.appendChild(document.createTextNode(" - " + spec.exception.message)); - } -}; - -JSSpec.Logger.prototype.onExampleStart = function(example) { - var li = document.getElementById("example_" + example.id); - li.className = "ongoing"; -}; - -JSSpec.Logger.prototype.onExampleEnd = function(example) { - var li = document.getElementById("example_" + example.id); - li.className = example.exception ? "exception" : "success"; - - if(example.exception) { - var div = document.createElement("DIV"); - div.innerHTML = example.exception.message + "


" + " at " + example.exception.fileName + ", line " + example.exception.lineNumber + "

"; - li.appendChild(div); - } - - var title = document.getElementById("title"); - var runner = JSSpec.runner; - - title.className = runner.hasException() ? "exception" : "success"; - - this.finishedExamples++; - document.getElementById("total_failures").innerHTML = runner.getTotalFailures(); - document.getElementById("total_errors").innerHTML = runner.getTotalErrors(); - var progress = parseInt(this.finishedExamples / runner.totalExamples * 100); - document.getElementById("progress").innerHTML = progress; - document.getElementById("total_elapsed").innerHTML = (new Date().getTime() - this.startedAt.getTime()) / 1000; - - document.title = progress + "%: " + this._title; -}; - -/** - * IncludeMatcher - */ -JSSpec.IncludeMatcher = function(actual, expected, condition) { - this.actual = actual; - this.expected = expected; - this.condition = condition; - this.match = false; - this.explaination = this.makeExplain(); -}; - -JSSpec.IncludeMatcher.createInstance = function(actual, expected, condition) { - return new JSSpec.IncludeMatcher(actual, expected, condition); -}; - -JSSpec.IncludeMatcher.prototype.matches = function() { - return this.match; -}; - -JSSpec.IncludeMatcher.prototype.explain = function() { - return this.explaination; -}; - -JSSpec.IncludeMatcher.prototype.makeExplain = function() { - if(typeof this.actual.length == 'undefined') { - return this.makeExplainForNotArray(); - } else { - return this.makeExplainForArray(); - } -}; - -JSSpec.IncludeMatcher.prototype.makeExplainForNotArray = function() { - if(this.condition) { - this.match = !!this.actual[this.expected]; - } else { - this.match = !this.actual[this.expected]; - } - - var sb = []; - sb.push('

actual value:

'); - sb.push('

' + JSSpec.util.inspect(this.actual, false, this.expected) + '

'); - sb.push('

should ' + (this.condition ? '' : 'not') + ' include:

'); - sb.push('

' + JSSpec.util.inspect(this.expected) + '

'); - return sb.join(""); -}; - -JSSpec.IncludeMatcher.prototype.makeExplainForArray = function() { - var matches; - if(this.condition) { - for(var i = 0; i < this.actual.length; i++) { - matches = JSSpec.EqualityMatcher.createInstance(this.expected, this.actual[i]).matches(); - if(matches) { - this.match = true; - break; - } - } - } else { - for(var i = 0; i < this.actual.length; i++) { - matches = JSSpec.EqualityMatcher.createInstance(this.expected, this.actual[i]).matches(); - if(matches) { - this.match = false; - break; - } - } - } - - if(this.match) return ""; - - var sb = []; - sb.push('

actual value:

'); - sb.push('

' + JSSpec.util.inspect(this.actual, false, this.condition ? null : i) + '

'); - sb.push('

should ' + (this.condition ? '' : 'not') + ' include:

'); - sb.push('

' + JSSpec.util.inspect(this.expected) + '

'); - return sb.join(""); -}; - -/** - * PropertyLengthMatcher - */ -JSSpec.PropertyLengthMatcher = function(num, property, o, condition) { - this.num = num; - this.o = o; - this.property = property; - if((property == 'characters' || property == 'items') && typeof o.length != 'undefined') { - this.property = 'length'; - } - - this.condition = condition; - this.conditionMet = function(x) { - if(condition == 'exactly') return x.length == num; - if(condition == 'at least') return x.length >= num; - if(condition == 'at most') return x.length <= num; - - throw "Unknown condition '" + condition + "'"; - }; - this.match = false; - this.explaination = this.makeExplain(); -}; - -JSSpec.PropertyLengthMatcher.prototype.makeExplain = function() { - if(this.o._type == 'String' && this.property == 'length') { - this.match = this.conditionMet(this.o); - return this.match ? '' : this.makeExplainForString(); - } else if(typeof this.o.length != 'undefined' && this.property == "length") { - this.match = this.conditionMet(this.o); - return this.match ? '' : this.makeExplainForArray(); - } else if(typeof this.o[this.property] != 'undefined' && this.o[this.property] != null) { - this.match = this.conditionMet(this.o[this.property]); - return this.match ? '' : this.makeExplainForObject(); - } else if(typeof this.o[this.property] == 'undefined' || this.o[this.property] == null) { - this.match = false; - return this.makeExplainForNoProperty(); - } - - this.match = true; -}; - -JSSpec.PropertyLengthMatcher.prototype.makeExplainForString = function() { - var sb = []; - - var exp = this.num == 0 ? - 'be an empty string' : - 'have ' + this.condition + ' ' + this.num + ' characters'; - - sb.push('

actual value has ' + this.o.length + ' characters:

'); - sb.push('

' + JSSpec.util.inspect(this.o) + '

'); - sb.push('

but it should ' + exp + '.

'); - - return sb.join(""); -}; - -JSSpec.PropertyLengthMatcher.prototype.makeExplainForArray = function() { - var sb = []; - - var exp = this.num == 0 ? - 'be an empty array' : - 'have ' + this.condition + ' ' + this.num + ' items'; - - sb.push('

actual value has ' + this.o.length + ' items:

'); - sb.push('

' + JSSpec.util.inspect(this.o) + '

'); - sb.push('

but it should ' + exp + '.

'); - - return sb.join(""); -}; - -JSSpec.PropertyLengthMatcher.prototype.makeExplainForObject = function() { - var sb = []; - - var exp = this.num == 0 ? - 'be empty' : - 'have ' + this.condition + ' ' + this.num + ' ' + this.property + '.'; - - sb.push('

actual value has ' + this.o[this.property].length + ' ' + this.property + ':

'); - sb.push('

' + JSSpec.util.inspect(this.o, false, this.property) + '

'); - sb.push('

but it should ' + exp + '.

'); - - return sb.join(""); -}; - -JSSpec.PropertyLengthMatcher.prototype.makeExplainForNoProperty = function() { - var sb = []; - - sb.push('

actual value:

'); - sb.push('

' + JSSpec.util.inspect(this.o) + '

'); - sb.push('

should have ' + this.condition + ' ' + this.num + ' ' + this.property + ' but there\'s no such property.

'); - - return sb.join(""); -}; - -JSSpec.PropertyLengthMatcher.prototype.matches = function() { - return this.match; -}; - -JSSpec.PropertyLengthMatcher.prototype.explain = function() { - return this.explaination; -}; - -JSSpec.PropertyLengthMatcher.createInstance = function(num, property, o, condition) { - return new JSSpec.PropertyLengthMatcher(num, property, o, condition); -}; - -/** - * EqualityMatcher - */ -JSSpec.EqualityMatcher = {}; - -JSSpec.EqualityMatcher.createInstance = function(expected, actual) { - if(expected == null || actual == null) { - return new JSSpec.NullEqualityMatcher(expected, actual); - } else if(expected._type && expected._type == actual._type) { - if(expected._type == "String") { - return new JSSpec.StringEqualityMatcher(expected, actual); - } else if(expected._type == "Date") { - return new JSSpec.DateEqualityMatcher(expected, actual); - } else if(expected._type == "Number") { - return new JSSpec.NumberEqualityMatcher(expected, actual); - } else if(expected._type == "Array") { - return new JSSpec.ArrayEqualityMatcher(expected, actual); - } else if(expected._type == "Boolean") { - return new JSSpec.BooleanEqualityMatcher(expected, actual); - } - } - - return new JSSpec.ObjectEqualityMatcher(expected, actual); -}; - -JSSpec.EqualityMatcher.basicExplain = function(expected, actual, expectedDesc, actualDesc) { - var sb = []; - - sb.push(actualDesc || '

actual value:

'); - sb.push('

' + JSSpec.util.inspect(actual) + '

'); - sb.push(expectedDesc || '

should be:

'); - sb.push('

' + JSSpec.util.inspect(expected) + '

'); - - return sb.join(""); -}; - -JSSpec.EqualityMatcher.diffExplain = function(expected, actual) { - var sb = []; - - sb.push('

diff:

'); - sb.push('

'); - - var dmp = new diff_match_patch(); - var diff = dmp.diff_main(expected, actual); - dmp.diff_cleanupEfficiency(diff); - - sb.push(JSSpec.util.inspect(dmp.diff_prettyHtml(diff), true)); - - sb.push('

'); - - return sb.join(""); -}; - -/** - * BooleanEqualityMatcher - */ -JSSpec.BooleanEqualityMatcher = function(expected, actual) { - this.expected = expected; - this.actual = actual; -}; - -JSSpec.BooleanEqualityMatcher.prototype.explain = function() { - var sb = []; - - sb.push('

actual value:

'); - sb.push('

' + JSSpec.util.inspect(this.actual) + '

'); - sb.push('

should be:

'); - sb.push('

' + JSSpec.util.inspect(this.expected) + '

'); - - return sb.join(""); -}; - -JSSpec.BooleanEqualityMatcher.prototype.matches = function() { - return this.expected == this.actual; -}; - -/** - * NullEqualityMatcher - */ -JSSpec.NullEqualityMatcher = function(expected, actual) { - this.expected = expected; - this.actual = actual; -}; - -JSSpec.NullEqualityMatcher.prototype.matches = function() { - return this.expected == this.actual && typeof this.expected == typeof this.actual; -}; - -JSSpec.NullEqualityMatcher.prototype.explain = function() { - return JSSpec.EqualityMatcher.basicExplain(this.expected, this.actual); -}; - -JSSpec.DateEqualityMatcher = function(expected, actual) { - this.expected = expected; - this.actual = actual; -}; - -JSSpec.DateEqualityMatcher.prototype.matches = function() { - return this.expected.getTime() == this.actual.getTime(); -}; - -JSSpec.DateEqualityMatcher.prototype.explain = function() { - var sb = []; - - sb.push(JSSpec.EqualityMatcher.basicExplain(this.expected, this.actual)); - sb.push(JSSpec.EqualityMatcher.diffExplain(this.expected.toString(), this.actual.toString())); - - return sb.join(""); -}; - -/** - * ObjectEqualityMatcher - */ -JSSpec.ObjectEqualityMatcher = function(expected, actual) { - this.expected = expected; - this.actual = actual; - this.match = this.expected == this.actual; - this.explaination = this.makeExplain(); -}; - -JSSpec.ObjectEqualityMatcher.prototype.matches = function() {return this.match}; - -JSSpec.ObjectEqualityMatcher.prototype.explain = function() {return this.explaination}; - -JSSpec.ObjectEqualityMatcher.prototype.makeExplain = function() { - if(this.expected == this.actual) { - this.match = true; - return ""; - } - - if(JSSpec.util.isDomNode(this.expected)) { - return this.makeExplainForDomNode(); - } - - var key, expectedHasItem, actualHasItem; - - for(key in this.expected) { - expectedHasItem = this.expected[key] != null && typeof this.expected[key] != 'undefined'; - actualHasItem = this.actual[key] != null && typeof this.actual[key] != 'undefined'; - if(expectedHasItem && !actualHasItem) return this.makeExplainForMissingItem(key); - } - for(key in this.actual) { - expectedHasItem = this.expected[key] != null && typeof this.expected[key] != 'undefined'; - actualHasItem = this.actual[key] != null && typeof this.actual[key] != 'undefined'; - if(actualHasItem && !expectedHasItem) return this.makeExplainForUnknownItem(key); - } - - for(key in this.expected) { - var matcher = JSSpec.EqualityMatcher.createInstance(this.expected[key], this.actual[key]); - if(!matcher.matches()) return this.makeExplainForItemMismatch(key); - } - - this.match = true; -}; - -JSSpec.ObjectEqualityMatcher.prototype.makeExplainForDomNode = function(key) { - var sb = []; - - sb.push(JSSpec.EqualityMatcher.basicExplain(this.expected, this.actual)); - - return sb.join(""); -}; - -JSSpec.ObjectEqualityMatcher.prototype.makeExplainForMissingItem = function(key) { - var sb = []; - - sb.push('

actual value has no item named ' + JSSpec.util.inspect(key) + '

'); - sb.push('

' + JSSpec.util.inspect(this.actual, false, key) + '

'); - sb.push('

but it should have the item whose value is ' + JSSpec.util.inspect(this.expected[key]) + '

'); - sb.push('

' + JSSpec.util.inspect(this.expected, false, key) + '

'); - - return sb.join(""); -}; - -JSSpec.ObjectEqualityMatcher.prototype.makeExplainForUnknownItem = function(key) { - var sb = []; - - sb.push('

actual value has item named ' + JSSpec.util.inspect(key) + '

'); - sb.push('

' + JSSpec.util.inspect(this.actual, false, key) + '

'); - sb.push('

but there should be no such item

'); - sb.push('

' + JSSpec.util.inspect(this.expected, false, key) + '

'); - - return sb.join(""); -}; - -JSSpec.ObjectEqualityMatcher.prototype.makeExplainForItemMismatch = function(key) { - var sb = []; - - sb.push('

actual value has an item named ' + JSSpec.util.inspect(key) + ' whose value is ' + JSSpec.util.inspect(this.actual[key]) + '

'); - sb.push('

' + JSSpec.util.inspect(this.actual, false, key) + '

'); - sb.push('

but it\'s value should be ' + JSSpec.util.inspect(this.expected[key]) + '

'); - sb.push('

' + JSSpec.util.inspect(this.expected, false, key) + '

'); - - return sb.join(""); -}; - - - - -/** - * ArrayEqualityMatcher - */ -JSSpec.ArrayEqualityMatcher = function(expected, actual) { - this.expected = expected; - this.actual = actual; - this.match = this.expected == this.actual; - this.explaination = this.makeExplain(); -}; - -JSSpec.ArrayEqualityMatcher.prototype.matches = function() {return this.match}; - -JSSpec.ArrayEqualityMatcher.prototype.explain = function() {return this.explaination}; - -JSSpec.ArrayEqualityMatcher.prototype.makeExplain = function() { - if(this.expected.length != this.actual.length) return this.makeExplainForLengthMismatch(); - - for(var i = 0; i < this.expected.length; i++) { - var matcher = JSSpec.EqualityMatcher.createInstance(this.expected[i], this.actual[i]); - if(!matcher.matches()) return this.makeExplainForItemMismatch(i); - } - - this.match = true; -}; - -JSSpec.ArrayEqualityMatcher.prototype.makeExplainForLengthMismatch = function() { - return JSSpec.EqualityMatcher.basicExplain( - this.expected, - this.actual, - '

but it should be ' + this.expected.length + '

', - '

actual value has ' + this.actual.length + ' items

' - ); -}; - -JSSpec.ArrayEqualityMatcher.prototype.makeExplainForItemMismatch = function(index) { - var postfix = ["th", "st", "nd", "rd", "th"][Math.min((index + 1) % 10,4)]; - - var sb = []; - - sb.push('

' + (index + 1) + postfix + ' item (index ' + index + ') of actual value is ' + JSSpec.util.inspect(this.actual[index]) + ':

'); - sb.push('

' + JSSpec.util.inspect(this.actual, false, index) + '

'); - sb.push('

but it should be ' + JSSpec.util.inspect(this.expected[index]) + ':

'); - sb.push('

' + JSSpec.util.inspect(this.expected, false, index) + '

'); - - return sb.join(""); -}; - -/** - * NumberEqualityMatcher - */ -JSSpec.NumberEqualityMatcher = function(expected, actual) { - this.expected = expected; - this.actual = actual; -}; - -JSSpec.NumberEqualityMatcher.prototype.matches = function() { - if(this.expected == this.actual) return true; -}; - -JSSpec.NumberEqualityMatcher.prototype.explain = function() { - return JSSpec.EqualityMatcher.basicExplain(this.expected, this.actual); -}; - -/** - * StringEqualityMatcher - */ -JSSpec.StringEqualityMatcher = function(expected, actual) { - this.expected = expected; - this.actual = actual; -}; - -JSSpec.StringEqualityMatcher.prototype.matches = function() { - return this.expected == this.actual; -}; - -JSSpec.StringEqualityMatcher.prototype.explain = function() { - var sb = []; - - sb.push(JSSpec.EqualityMatcher.basicExplain(this.expected, this.actual)); - sb.push(JSSpec.EqualityMatcher.diffExplain(this.expected, this.actual)); - return sb.join(""); -}; - -/** - * PatternMatcher - */ -JSSpec.PatternMatcher = function(actual, pattern, condition) { - this.actual = actual; - this.pattern = pattern; - this.condition = condition; - this.match = false; - this.explaination = this.makeExplain(); -}; - -JSSpec.PatternMatcher.createInstance = function(actual, pattern, condition) { - return new JSSpec.PatternMatcher(actual, pattern, condition); -}; - -JSSpec.PatternMatcher.prototype.makeExplain = function() { - var sb; - if(this.actual == null || this.actual._type != 'String') { - sb = []; - sb.push('

actual value:

'); - sb.push('

' + JSSpec.util.inspect(this.actual) + '

'); - sb.push('

should ' + (this.condition ? '' : 'not') + ' match with pattern:

'); - sb.push('

' + JSSpec.util.inspect(this.pattern) + '

'); - sb.push('

but pattern matching cannot be performed.

'); - return sb.join(""); - } else { - this.match = this.condition == !!this.actual.match(this.pattern); - if(this.match) return ""; - - sb = []; - sb.push('

actual value:

'); - sb.push('

' + JSSpec.util.inspect(this.actual) + '

'); - sb.push('

should ' + (this.condition ? '' : 'not') + ' match with pattern:

'); - sb.push('

' + JSSpec.util.inspect(this.pattern) + '

'); - return sb.join(""); - } -}; - -JSSpec.PatternMatcher.prototype.matches = function() { - return this.match; -}; - -JSSpec.PatternMatcher.prototype.explain = function() { - return this.explaination; -}; - -/** - * Domain Specific Languages - */ -JSSpec.DSL = {}; - -JSSpec.DSL.forString = { - normalizeHtml: function() { - var html = this; - - // Uniformize quotation, turn tag names and attribute names into lower case - html = html.replace(/<(\/?)(\w+)([^>]*?)>/img, function(str, closingMark, tagName, attrs) { - var sortedAttrs = JSSpec.util.sortHtmlAttrs(JSSpec.util.correctHtmlAttrQuotation(attrs).toLowerCase()) - return "<" + closingMark + tagName.toLowerCase() + sortedAttrs + ">" - }); - - // validation self-closing tags - html = html.replace(/<(br|hr|img)([^>]*?)>/mg, function(str, tag, attrs) { - return "<" + tag + attrs + " />"; - }); - - // append semi-colon at the end of style value - html = html.replace(/style="(.*?)"/mg, function(str, styleStr) { - styleStr = JSSpec.util.sortStyleEntries(styleStr.strip()); // for Safari - if(styleStr.charAt(styleStr.length - 1) != ';') styleStr += ";" - - return 'style="' + styleStr + '"' - }); - - // sort style entries - - // remove empty style attributes - html = html.replace(/ style=";"/mg, ""); - - // remove new-lines - html = html.replace(/\r/mg, ''); - html = html.replace(/\n/mg, ''); - - return html; - } -}; - - -JSSpec.DSL.describe = function(context, entries, base) { - if(base) { - for(var i = 0; i < JSSpec.specs.length; i++) { - if(JSSpec.specs[i].context === base) { - base = JSSpec.specs[i]; - break; - } - } - - for(var i = 0; i < base.examples.length; i++) { - var example = base.examples[i]; - - if(!entries[example.name]) entries[example.name] = example.target; - } - } - - JSSpec.specs.push(new JSSpec.Spec(context, entries)); -}; - -JSSpec.DSL.value_of = function(target) { - if(JSSpec._secondPass) return {}; - - var subject = new JSSpec.DSL.Subject(target); - return subject; -}; - -JSSpec.DSL.Subject = function(target) { - this.target = target; -}; - -JSSpec.DSL.Subject.prototype._type = 'Subject'; - -JSSpec.DSL.Subject.prototype.should_fail = function(message) { - JSSpec._assertionFailure = {message:message}; - throw JSSpec._assertionFailure; -}; - -JSSpec.DSL.Subject.prototype.should_be = function(expected) { - var matcher = JSSpec.EqualityMatcher.createInstance(expected, this.target); - if(!matcher.matches()) { - JSSpec._assertionFailure = {message:matcher.explain()}; - throw JSSpec._assertionFailure; - } -}; - -JSSpec.DSL.Subject.prototype.should_not_be = function(expected) { - // TODO JSSpec.EqualityMatcher should support 'condition' - var matcher = JSSpec.EqualityMatcher.createInstance(expected, this.target); - if(matcher.matches()) { - JSSpec._assertionFailure = {message:"'" + this.target + "' should not be '" + expected + "'"}; - throw JSSpec._assertionFailure; - } -}; - -JSSpec.DSL.Subject.prototype.should_be_empty = function() { - this.should_have(0, this.getType() == 'String' ? 'characters' : 'items'); -}; - -JSSpec.DSL.Subject.prototype.should_not_be_empty = function() { - this.should_have_at_least(1, this.getType() == 'String' ? 'characters' : 'items'); -}; - -JSSpec.DSL.Subject.prototype.should_be_true = function() { - this.should_be(true); -}; - -JSSpec.DSL.Subject.prototype.should_be_false = function() { - this.should_be(false); -}; - -JSSpec.DSL.Subject.prototype.should_be_null = function() { - this.should_be(null); -}; - -JSSpec.DSL.Subject.prototype.should_be_undefined = function() { - this.should_be(undefined); -}; - -JSSpec.DSL.Subject.prototype.should_not_be_null = function() { - this.should_not_be(null); -}; - -JSSpec.DSL.Subject.prototype.should_not_be_undefined = function() { - this.should_not_be(undefined); -}; - -JSSpec.DSL.Subject.prototype._should_have = function(num, property, condition) { - var matcher = JSSpec.PropertyLengthMatcher.createInstance(num, property, this.target, condition); - if(!matcher.matches()) { - JSSpec._assertionFailure = {message:matcher.explain()}; - throw JSSpec._assertionFailure; - } -}; - -JSSpec.DSL.Subject.prototype.should_have = function(num, property) { - this._should_have(num, property, "exactly"); -}; - -JSSpec.DSL.Subject.prototype.should_have_exactly = function(num, property) { - this._should_have(num, property, "exactly"); -}; - -JSSpec.DSL.Subject.prototype.should_have_at_least = function(num, property) { - this._should_have(num, property, "at least"); -}; - -JSSpec.DSL.Subject.prototype.should_have_at_most = function(num, property) { - this._should_have(num, property, "at most"); -}; - -JSSpec.DSL.Subject.prototype.should_include = function(expected) { - var matcher = JSSpec.IncludeMatcher.createInstance(this.target, expected, true); - if(!matcher.matches()) { - JSSpec._assertionFailure = {message:matcher.explain()}; - throw JSSpec._assertionFailure; - } -}; - -JSSpec.DSL.Subject.prototype.should_not_include = function(expected) { - var matcher = JSSpec.IncludeMatcher.createInstance(this.target, expected, false); - if(!matcher.matches()) { - JSSpec._assertionFailure = {message:matcher.explain()}; - throw JSSpec._assertionFailure; - } -}; - -JSSpec.DSL.Subject.prototype.should_match = function(pattern) { - var matcher = JSSpec.PatternMatcher.createInstance(this.target, pattern, true); - if(!matcher.matches()) { - JSSpec._assertionFailure = {message:matcher.explain()}; - throw JSSpec._assertionFailure; - } -} -JSSpec.DSL.Subject.prototype.should_not_match = function(pattern) { - var matcher = JSSpec.PatternMatcher.createInstance(this.target, pattern, false); - if(!matcher.matches()) { - JSSpec._assertionFailure = {message:matcher.explain()}; - throw JSSpec._assertionFailure; - } -}; - -JSSpec.DSL.Subject.prototype.getType = function() { - if(typeof this.target == 'undefined') { - return 'undefined'; - } else if(this.target == null) { - return 'null'; - } else if(this.target._type) { - return this.target._type; - } else if(JSSpec.util.isDomNode(this.target)) { - return 'DomNode'; - } else { - return 'object'; - } -}; - -/** - * Utilities - */ -JSSpec.util = { - escapeTags: function(string) { - return string.replace(//img, '>'); - }, - escapeMetastring: function(string) { - return string.replace(/\r/img, '\\r').replace(/\n/img, '\\n').replace(/\¶\;\/img, '\\n').replace(/\t/img, '\\t'); - }, - parseOptions: function(defaults) { - var options = defaults; - - var url = location.href; - var queryIndex = url.indexOf('?'); - if(queryIndex == -1) return options; - - var query = url.substring(queryIndex + 1).split('#')[0]; - var pairs = query.split('&'); - for(var i = 0; i < pairs.length; i++) { - var tokens = pairs[i].split('='); - options[tokens[0]] = tokens[1]; - } - - return options; - }, - correctHtmlAttrQuotation: function(html) { - html = html.replace(/(\w+)=['"]([^'"]+)['"]/mg,function (str, name, value) {return name + '=' + '"' + value + '"';}); - html = html.replace(/(\w+)=([^ '"]+)/mg,function (str, name, value) {return name + '=' + '"' + value + '"';}); - html = html.replace(/'/mg, '"'); - - return html; - }, - sortHtmlAttrs: function(html) { - var attrs = []; - html.replace(/((\w+)="[^"]+")/mg, function(str, matched) { - attrs.push(matched); - }); - return attrs.length == 0 ? "" : " " + attrs.sort().join(" "); - }, - sortStyleEntries: function(styleText) { - var entries = styleText.split(/; /); - return entries.sort().join("; "); - }, - escapeHtml: function(str) { - if(!this._div) { - this._div = document.createElement("DIV"); - this._text = document.createTextNode(''); - this._div.appendChild(this._text); - } - this._text.data = str; - return this._div.innerHTML; - }, - isDomNode: function(o) { - // TODO: make it more stricter - return (typeof o.nodeName == 'string') && (typeof o.nodeType == 'number'); - }, - inspectDomPath: function(o) { - var sb = []; - while(o && o.nodeName != '#document' && o.parent) { - var siblings = o.parentNode.childNodes; - for(var i = 0; i < siblings.length; i++) { - if(siblings[i] == o) { - sb.push(o.nodeName + (i == 0 ? '' : '[' + i + ']')); - break; - } - } - o = o.parentNode; - } - return sb.join(" > "); - }, - inspectDomNode: function(o) { - if(o.nodeType == 1) { - var nodeName = o.nodeName.toLowerCase(); - var sb = []; - sb.push(''); - sb.push("<"); - sb.push(nodeName); - - var attrs = o.attributes; - for(var i = 0; i < attrs.length; i++) { - if( - attrs[i].nodeValue && - attrs[i].nodeName != 'contentEditable' && - attrs[i].nodeName != 'style' && - typeof attrs[i].nodeValue != 'function' - ) sb.push(' ' + attrs[i].nodeName.toLowerCase() + '="' + attrs[i].nodeValue + '"'); - } - if(o.style && o.style.cssText) { - sb.push(' style="' + o.style.cssText + '"'); - } - sb.push('>'); - sb.push(JSSpec.util.escapeHtml(o.innerHTML)); - sb.push('</' + nodeName + '>'); - sb.push(' (' + JSSpec.util.inspectDomPath(o) + ')' ); - sb.push(''); - return sb.join(""); - } else if(o.nodeType == 3) { - return '#text ' + o.nodeValue + ''; - } else { - return 'UnknownDomNode'; - } - }, - inspect: function(o, dontEscape, emphasisKey) { - var sb, inspected; - - if(typeof o == 'undefined') return 'undefined'; - if(o == null) return 'null'; - if(o._type == 'String') return '"' + (dontEscape ? JSSpec.util.escapeMetastring(o) : JSSpec.util.escapeHtml(JSSpec.util.escapeMetastring(o))) + '"'; - - if(o._type == 'Date') { - return '"' + o.toString() + '"'; - } - - if(o._type == 'Number') return '' + (dontEscape ? o : JSSpec.util.escapeHtml(o)) + ''; - - if(o._type == 'Boolean') return '' + o + ''; - - if(o._type == 'RegExp') return '' + JSSpec.util.escapeHtml(o.toString()) + ''; - - if(JSSpec.util.isDomNode(o)) return JSSpec.util.inspectDomNode(o); - - if(o._type == 'Array' || typeof o.length != 'undefined') { - sb = []; - for(var i = 0; i < o.length; i++) { - inspected = JSSpec.util.inspect(o[i]); - sb.push(i == emphasisKey ? ('' + inspected + '') : inspected); - } - return '[' + sb.join(', ') + ']'; - } - - // object - sb = []; - for(var key in o) { - if(key == 'should') continue; - - inspected = JSSpec.util.inspect(key) + ":" + JSSpec.util.inspect(o[key]); - sb.push(key == emphasisKey ? ('' + inspected + '') : inspected); - } - return '{' + sb.join(', ') + '}'; - } -}; - -describe = JSSpec.DSL.describe; -behavior_of = JSSpec.DSL.describe; -value_of = JSSpec.DSL.value_of; -expect = JSSpec.DSL.value_of; // @deprecated - -String.prototype._type = "String"; -Number.prototype._type = "Number"; -Date.prototype._type = "Date"; -Array.prototype._type = "Array"; -Boolean.prototype._type = "Boolean"; -RegExp.prototype._type = "RegExp"; - -var targets = [Array.prototype, Date.prototype, Number.prototype, String.prototype, Boolean.prototype, RegExp.prototype]; - -String.prototype.normalizeHtml = JSSpec.DSL.forString.normalizeHtml; -String.prototype.asHtml = String.prototype.normalizeHtml; //@deprecated -String.prototype.strip = function() {return this.replace(/^\s+/, '').replace(/\s+$/, '');} - - -/** - * Main - */ -JSSpec.defaultOptions = { - autorun: 1, - specIdBeginsWith: 0, - exampleIdBeginsWith: 0, - autocollapse: 1 -}; -JSSpec.options = JSSpec.util.parseOptions(JSSpec.defaultOptions); - -JSSpec.Spec.id = JSSpec.options.specIdBeginsWith; -JSSpec.Example.id = JSSpec.options.exampleIdBeginsWith; - - - -window.onload = function() { - if(JSSpec.specs.length > 0) { - if(!JSSpec.options.inSuite) { - JSSpec.runner = new JSSpec.Runner(JSSpec.specs, new JSSpec.Logger()); - if(JSSpec.options.rerun) { - JSSpec.runner.rerun(decodeURIComponent(JSSpec.options.rerun)); - } else { - JSSpec.runner.run(); - } - } else { - // in suite, send all specs to parent - var parentWindow = window.frames.parent.window; - for(var i = 0; i < JSSpec.specs.length; i++) { - parentWindow.JSSpec.specs.push(JSSpec.specs[i]); - } - } - } else { - var links = document.getElementById('list').getElementsByTagName('A'); - var frameContainer = document.createElement('DIV'); - frameContainer.style.display = 'none'; - document.body.appendChild(frameContainer); - - for(var i = 0; i < links.length; i++) { - var frame = document.createElement('IFRAME'); - frame.src = links[i].href + '?inSuite=0&specIdBeginsWith=' + (i * 10000) + '&exampleIdBeginsWith=' + (i * 10000); - frameContainer.appendChild(frame); - } - } +/** + * JSSpec + * + * Copyright 2007 Alan Kang + * - mailto:jania902@gmail.com + * - http://jania.pe.kr + * + * http://jania.pe.kr/aw/moin.cgi/JSSpec + * + * Dependencies: + * - diff_match_patch.js ( http://code.google.com/p/google-diff-match-patch ) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/** + * Namespace + */ + +var JSSpec = { + specs: [], + + EMPTY_FUNCTION: function() {}, + + Browser: { + // By Rendering Engines + Trident: navigator.appName === "Microsoft Internet Explorer", + Webkit: navigator.userAgent.indexOf('AppleWebKit/') > -1, + Gecko: navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') === -1, + KHTML: navigator.userAgent.indexOf('KHTML') !== -1, + Presto: navigator.appName === "Opera", + + // By Platforms + Mac: navigator.userAgent.indexOf("Macintosh") !== -1, + Ubuntu: navigator.userAgent.indexOf('Ubuntu') !== -1, + Win: navigator.userAgent.indexOf('Windows') !== -1, + + // By Browsers + IE: navigator.appName === "Microsoft Internet Explorer", + IE6: navigator.userAgent.indexOf('MSIE 6') !== -1, + IE7: navigator.userAgent.indexOf('MSIE 7') !== -1, + IE8: navigator.userAgent.indexOf('MSIE 8') !== -1, + + FF: navigator.userAgent.indexOf('Firefox') !== -1, + FF2: navigator.userAgent.indexOf('Firefox/2') !== -1, + FF3: navigator.userAgent.indexOf('Firefox/3') !== -1, + Safari: navigator.userAgent.indexOf('Safari') !== -1 + } +}; + + + +/** + * Executor + */ +JSSpec.Executor = function(target, onSuccess, onException) { + this.target = target; + this.onSuccess = typeof onSuccess == 'function' ? onSuccess : JSSpec.EMPTY_FUNCTION; + this.onException = typeof onException == 'function' ? onException : JSSpec.EMPTY_FUNCTION; + + if(JSSpec.Browser.Trident) { + // Exception handler for Trident. It helps to collect exact line number where exception occured. + window.onerror = function(message, fileName, lineNumber) { + var self = window._curExecutor; + var ex = {message:message, fileName:fileName, lineNumber:lineNumber}; + + if(JSSpec._secondPass) { + ex = self.mergeExceptions(JSSpec._assertionFailure, ex); + delete JSSpec._secondPass; + delete JSSpec._assertionFailure; + + ex.type = "failure"; + self.onException(self, ex); + } else if(JSSpec._assertionFailure) { + JSSpec._secondPass = true; + self.run(); + } else { + self.onException(self, ex); + } + + return true; + }; + } +}; +JSSpec.Executor.prototype.mergeExceptions = function(assertionFailure, normalException) { + var merged = { + message:assertionFailure.message, + fileName:normalException.fileName, + lineNumber:normalException.lineNumber + }; + + return merged; +}; + +JSSpec.Executor.prototype.run = function() { + var self = this; + var target = this.target; + var onSuccess = this.onSuccess; + var onException = this.onException; + + window.setTimeout( + function() { + var result; + if(JSSpec.Browser.Trident) { + window._curExecutor = self; + + result = self.target(); + self.onSuccess(self, result); + } else { + try { + result = self.target(); + self.onSuccess(self, result); + } catch(ex) { + if(JSSpec.Browser.Webkit) ex = {message:ex.message, fileName:ex.sourceURL, lineNumber:ex.line}; + + if(JSSpec._secondPass) { + ex = self.mergeExceptions(JSSpec._assertionFailure, ex); + delete JSSpec._secondPass; + delete JSSpec._assertionFailure; + + ex.type = "failure"; + self.onException(self, ex); + } else if(JSSpec._assertionFailure) { + JSSpec._secondPass = true; + self.run(); + } else { + self.onException(self, ex); + } + } + } + }, + 0 + ); +}; + + + +/** + * CompositeExecutor composites one or more executors and execute them sequencially. + */ +JSSpec.CompositeExecutor = function(onSuccess, onException, continueOnException) { + this.queue = []; + this.onSuccess = typeof onSuccess == 'function' ? onSuccess : JSSpec.EMPTY_FUNCTION; + this.onException = typeof onException == 'function' ? onException : JSSpec.EMPTY_FUNCTION; + this.continueOnException = !!continueOnException; +}; + +JSSpec.CompositeExecutor.prototype.addFunction = function(func) { + this.addExecutor(new JSSpec.Executor(func)); +}; + +JSSpec.CompositeExecutor.prototype.addExecutor = function(executor) { + var last = this.queue.length == 0 ? null : this.queue[this.queue.length - 1]; + if(last) { + last.next = executor; + } + + executor.parent = this; + executor.onSuccessBackup = executor.onSuccess; + executor.onSuccess = function(result) { + this.onSuccessBackup(result); + if(this.next) { + this.next.run(); + } else { + this.parent.onSuccess(); + } + }; + executor.onExceptionBackup = executor.onException; + executor.onException = function(executor, ex) { + this.onExceptionBackup(executor, ex); + + if(this.parent.continueOnException) { + if(this.next) { + this.next.run(); + } else { + this.parent.onSuccess(); + } + } else { + this.parent.onException(executor, ex); + } + }; + + this.queue.push(executor); +}; + +JSSpec.CompositeExecutor.prototype.run = function() { + if(this.queue.length > 0) { + this.queue[0].run(); + } +}; + +/** + * Spec is a set of Examples in a specific context + */ +JSSpec.Spec = function(context, entries) { + this.id = JSSpec.Spec.id++; + this.context = context; + this.url = location.href; + + this.filterEntriesByEmbeddedExpressions(entries); + this.extractOutSpecialEntries(entries); + this.examples = this.makeExamplesFromEntries(entries); + this.examplesMap = this.makeMapFromExamples(this.examples); +}; + +JSSpec.Spec.id = 0; +JSSpec.Spec.prototype.getExamples = function() { + return this.examples; +}; + +JSSpec.Spec.prototype.hasException = function() { + return this.getTotalFailures() > 0 || this.getTotalErrors() > 0; +}; + +JSSpec.Spec.prototype.getTotalFailures = function() { + var examples = this.examples; + var failures = 0; + for(var i = 0; i < examples.length; i++) { + if(examples[i].isFailure()) failures++; + } + return failures; +}; + +JSSpec.Spec.prototype.getTotalErrors = function() { + var examples = this.examples; + var errors = 0; + for(var i = 0; i < examples.length; i++) { + if(examples[i].isError()) errors++; + } + return errors; +}; + +JSSpec.Spec.prototype.filterEntriesByEmbeddedExpressions = function(entries) { + var isTrue; + for(name in entries) if(entries.hasOwnProperty(name)) { + var m = name.match(/\[\[(.+)\]\]/); + if(m && m[1]) { + eval("isTrue = (" + m[1] + ")"); + if(!isTrue) delete entries[name]; + } + } +}; + +JSSpec.Spec.prototype.extractOutSpecialEntries = function(entries) { + this.beforeEach = JSSpec.EMPTY_FUNCTION; + this.beforeAll = JSSpec.EMPTY_FUNCTION; + this.afterEach = JSSpec.EMPTY_FUNCTION; + this.afterAll = JSSpec.EMPTY_FUNCTION; + + for(name in entries) if(entries.hasOwnProperty(name)) { + if(name == 'before' || name == 'before each' || name == 'before_each') { + this.beforeEach = entries[name]; + } else if(name == 'before all' || name == 'before_all') { + this.beforeAll = entries[name]; + } else if(name == 'after' || name == 'after each' || name == 'after_each') { + this.afterEach = entries[name]; + } else if(name == 'after all' || name == 'after_all') { + this.afterAll = entries[name]; + } + } + + delete entries['before']; + delete entries['before each']; + delete entries['before_each']; + delete entries['before all']; + delete entries['before_all']; + delete entries['after']; + delete entries['after each']; + delete entries['after_each']; + delete entries['after all']; + delete entries['after_all']; +}; + +JSSpec.Spec.prototype.makeExamplesFromEntries = function(entries) { + var examples = []; + for(name in entries) if(entries.hasOwnProperty(name)) { + examples.push(new JSSpec.Example(name, entries[name], this.beforeEach, this.afterEach)); + } + return examples; +}; + +JSSpec.Spec.prototype.makeMapFromExamples = function(examples) { + var map = {}; + for(var i = 0; i < examples.length; i++) { + var example = examples[i]; + map[example.id] = examples[i]; + } + return map; +}; + +JSSpec.Spec.prototype.getExampleById = function(id) { + return this.examplesMap[id]; +}; + +JSSpec.Spec.prototype.getExecutor = function() { + var self = this; + var onException = function(executor, ex) { + self.exception = ex; + }; + + var composite = new JSSpec.CompositeExecutor(); + composite.addFunction(function() {JSSpec.log.onSpecStart(self);}); + composite.addExecutor(new JSSpec.Executor(this.beforeAll, null, function(exec, ex) { + self.exception = ex; + JSSpec.log.onSpecEnd(self); + })); + + var exampleAndAfter = new JSSpec.CompositeExecutor(null,null,true); + for(var i = 0; i < this.examples.length; i++) { + exampleAndAfter.addExecutor(this.examples[i].getExecutor()); + } + exampleAndAfter.addExecutor(new JSSpec.Executor(this.afterAll, null, onException)); + exampleAndAfter.addFunction(function() {JSSpec.log.onSpecEnd(self);}); + composite.addExecutor(exampleAndAfter); + + return composite; +}; + +/** + * Example + */ +JSSpec.Example = function(name, target, before, after) { + this.id = JSSpec.Example.id++; + this.name = name; + this.target = target; + this.before = before; + this.after = after; +}; + +JSSpec.Example.id = 0; +JSSpec.Example.prototype.isFailure = function() { + return this.exception && this.exception.type == "failure"; +}; + +JSSpec.Example.prototype.isError = function() { + return this.exception && !this.exception.type; +}; + +JSSpec.Example.prototype.getExecutor = function() { + var self = this; + var onException = function(executor, ex) { + self.exception = ex; + }; + + var composite = new JSSpec.CompositeExecutor(); + composite.addFunction(function() {JSSpec.log.onExampleStart(self);}); + composite.addExecutor(new JSSpec.Executor(this.before, null, function(exec, ex) { + self.exception = ex; + JSSpec.log.onExampleEnd(self); + })); + + var targetAndAfter = new JSSpec.CompositeExecutor(null,null,true); + + targetAndAfter.addExecutor(new JSSpec.Executor(this.target, null, onException)); + targetAndAfter.addExecutor(new JSSpec.Executor(this.after, null, onException)); + targetAndAfter.addFunction(function() {JSSpec.log.onExampleEnd(self);}); + + composite.addExecutor(targetAndAfter); + + return composite; +}; + +/** + * Runner + */ +JSSpec.Runner = function(specs, logger) { + JSSpec.log = logger; + + this.totalExamples = 0; + this.specs = []; + this.specsMap = {}; + this.addAllSpecs(specs); +}; + +JSSpec.Runner.prototype.addAllSpecs = function(specs) { + for(var i = 0; i < specs.length; i++) { + this.addSpec(specs[i]); + } +}; + +JSSpec.Runner.prototype.addSpec = function(spec) { + this.specs.push(spec); + this.specsMap[spec.id] = spec; + this.totalExamples += spec.getExamples().length; +}; + +JSSpec.Runner.prototype.getSpecById = function(id) { + return this.specsMap[id]; +}; + +JSSpec.Runner.prototype.getSpecByContext = function(context) { + for(var i = 0; i < this.specs.length; i++) { + if(this.specs[i].context == context) return this.specs[i]; + } + return null; +}; + +JSSpec.Runner.prototype.getSpecs = function() { + return this.specs; +}; + +JSSpec.Runner.prototype.hasException = function() { + return this.getTotalFailures() > 0 || this.getTotalErrors() > 0; +}; + +JSSpec.Runner.prototype.getTotalFailures = function() { + var specs = this.specs; + var failures = 0; + for(var i = 0; i < specs.length; i++) { + failures += specs[i].getTotalFailures(); + } + return failures; +}; + +JSSpec.Runner.prototype.getTotalErrors = function() { + var specs = this.specs; + var errors = 0; + for(var i = 0; i < specs.length; i++) { + errors += specs[i].getTotalErrors(); + } + return errors; +}; + + +JSSpec.Runner.prototype.run = function() { + JSSpec.log.onRunnerStart(); + var executor = new JSSpec.CompositeExecutor(function() {JSSpec.log.onRunnerEnd()},null,true); + for(var i = 0; i < this.specs.length; i++) { + executor.addExecutor(this.specs[i].getExecutor()); + } + executor.run(); +}; + + +JSSpec.Runner.prototype.rerun = function(context) { + JSSpec.runner = new JSSpec.Runner([this.getSpecByContext(context)], JSSpec.log); + JSSpec.runner.run(); +}; + +/** + * Logger + */ +JSSpec.Logger = function() { + this.finishedExamples = 0; + this.startedAt = null; +}; + +JSSpec.Logger.prototype.onRunnerStart = function() { + this._title = document.title; + + this.startedAt = new Date(); + var container = document.getElementById('jsspec_container'); + if(container) { + container.innerHTML = ""; + } else { + container = document.createElement("DIV"); + container.id = "jsspec_container"; + document.body.appendChild(container); + } + + var title = document.createElement("DIV"); + title.id = "title"; + title.innerHTML = [ + '

JSSpec

', + '
    ', + JSSpec.options.rerun ? '
  • [X] ' + JSSpec.util.escapeTags(decodeURIComponent(JSSpec.options.rerun)) + '
  • ' : '', + '
  • ' + JSSpec.runner.totalExamples + ' examples
  • ', + '
  • 0 failures
  • ', + '
  • 0 errors
  • ', + '
  • 0% done
  • ', + '
  • 0 secs
  • ', + '
', + '

JSSpec homepage

', + ].join(""); + container.appendChild(title); + + var list = document.createElement("DIV"); + list.id = "list"; + list.innerHTML = [ + '

List

', + '' + ].join(""); + container.appendChild(list); + + var log = document.createElement("DIV"); + log.id = "log"; + log.innerHTML = [ + '

Log

', + '
    ', + function() { + var specs = JSSpec.runner.getSpecs(); + var sb = []; + for(var i = 0; i < specs.length; i++) { + var spec = specs[i]; + sb.push('
  • '); + sb.push('

    ' + JSSpec.util.escapeTags(specs[i].context) + ' [rerun]

    '); + sb.push('
      '); + for(var j = 0; j < spec.examples.length; j++) { + var example = spec.examples[j]; + sb.push('
    • '); + sb.push('

      ' + JSSpec.util.escapeTags(example.name) + '

      '); + sb.push('
      '+JSSpec.util.escapeTags(example.target.toString())+'
      '); + sb.push('
    • '); + } + sb.push('
    '); + sb.push('
  • '); + } + return sb.join(""); + }(), + '
' + ].join(""); + + container.appendChild(log); + + // add event handler for toggling + var specs = JSSpec.runner.getSpecs(); + var sb = []; + for(var i = 0; i < specs.length; i++) { + var spec = document.getElementById("spec_" + specs[i].id); + var title = spec.getElementsByTagName("H3")[0]; + title.onclick = function(e) { + var target = document.getElementById(this.parentNode.id + "_examples"); + target.style.display = target.style.display == "none" ? "block" : "none"; + return true; + } + } +}; + +JSSpec.Logger.prototype.onRunnerEnd = function() { + if(JSSpec.runner.hasException()) { + var times = 4; + var title1 = "*" + this._title; + var title2 = "*F" + JSSpec.runner.getTotalFailures() + " E" + JSSpec.runner.getTotalErrors() + "* " + this._title; + } else { + var times = 2; + var title1 = this._title; + var title2 = "Success"; + } + this.blinkTitle(times,title1,title2); +}; + +JSSpec.Logger.prototype.blinkTitle = function(times, title1, title2) { + var times = times * 2; + var mode = true; + + var f = function() { + if(times > 0) { + document.title = mode ? title1 : title2; + mode = !mode; + times--; + window.setTimeout(f, 500); + } else { + document.title = title1; + } + }; + + f(); +}; + +JSSpec.Logger.prototype.onSpecStart = function(spec) { + var spec_list = document.getElementById("spec_" + spec.id + "_list"); + var spec_log = document.getElementById("spec_" + spec.id); + + spec_list.className = "ongoing"; + spec_log.className = "ongoing"; +}; + +JSSpec.Logger.prototype.onSpecEnd = function(spec) { + var spec_list = document.getElementById("spec_" + spec.id + "_list"); + var spec_log = document.getElementById("spec_" + spec.id); + var examples = document.getElementById("spec_" + spec.id + "_examples"); + var className = spec.hasException() ? "exception" : "success"; + + spec_list.className = className; + spec_log.className = className; + + if(JSSpec.options.autocollapse && !spec.hasException()) examples.style.display = "none"; + + if(spec.exception) { + spec_log.appendChild(document.createTextNode(" - " + spec.exception.message)); + } +}; + +JSSpec.Logger.prototype.onExampleStart = function(example) { + var li = document.getElementById("example_" + example.id); + li.className = "ongoing"; +}; + +JSSpec.Logger.prototype.onExampleEnd = function(example) { + var li = document.getElementById("example_" + example.id); + li.className = example.exception ? "exception" : "success"; + + if(example.exception) { + var div = document.createElement("DIV"); + div.innerHTML = example.exception.message + "


" + " at " + example.exception.fileName + ", line " + example.exception.lineNumber + "

"; + li.appendChild(div); + } + + var title = document.getElementById("title"); + var runner = JSSpec.runner; + + title.className = runner.hasException() ? "exception" : "success"; + + this.finishedExamples++; + document.getElementById("total_failures").innerHTML = runner.getTotalFailures(); + document.getElementById("total_errors").innerHTML = runner.getTotalErrors(); + var progress = parseInt(this.finishedExamples / runner.totalExamples * 100); + document.getElementById("progress").innerHTML = progress; + document.getElementById("total_elapsed").innerHTML = (new Date().getTime() - this.startedAt.getTime()) / 1000; + + document.title = progress + "%: " + this._title; +}; + +/** + * IncludeMatcher + */ +JSSpec.IncludeMatcher = function(actual, expected, condition) { + this.actual = actual; + this.expected = expected; + this.condition = condition; + this.match = false; + this.explaination = this.makeExplain(); +}; + +JSSpec.IncludeMatcher.createInstance = function(actual, expected, condition) { + return new JSSpec.IncludeMatcher(actual, expected, condition); +}; + +JSSpec.IncludeMatcher.prototype.matches = function() { + return this.match; +}; + +JSSpec.IncludeMatcher.prototype.explain = function() { + return this.explaination; +}; + +JSSpec.IncludeMatcher.prototype.makeExplain = function() { + if(typeof this.actual.length == 'undefined') { + return this.makeExplainForNotArray(); + } else { + return this.makeExplainForArray(); + } +}; + +JSSpec.IncludeMatcher.prototype.makeExplainForNotArray = function() { + if(this.condition) { + this.match = !!this.actual[this.expected]; + } else { + this.match = !this.actual[this.expected]; + } + + var sb = []; + sb.push('

actual value:

'); + sb.push('

' + JSSpec.util.inspect(this.actual, false, this.expected) + '

'); + sb.push('

should ' + (this.condition ? '' : 'not') + ' include:

'); + sb.push('

' + JSSpec.util.inspect(this.expected) + '

'); + return sb.join(""); +}; + +JSSpec.IncludeMatcher.prototype.makeExplainForArray = function() { + var matches; + if(this.condition) { + for(var i = 0; i < this.actual.length; i++) { + matches = JSSpec.EqualityMatcher.createInstance(this.expected, this.actual[i]).matches(); + if(matches) { + this.match = true; + break; + } + } + } else { + for(var i = 0; i < this.actual.length; i++) { + matches = JSSpec.EqualityMatcher.createInstance(this.expected, this.actual[i]).matches(); + if(matches) { + this.match = false; + break; + } + } + } + + if(this.match) return ""; + + var sb = []; + sb.push('

actual value:

'); + sb.push('

' + JSSpec.util.inspect(this.actual, false, this.condition ? null : i) + '

'); + sb.push('

should ' + (this.condition ? '' : 'not') + ' include:

'); + sb.push('

' + JSSpec.util.inspect(this.expected) + '

'); + return sb.join(""); +}; + +/** + * PropertyLengthMatcher + */ +JSSpec.PropertyLengthMatcher = function(num, property, o, condition) { + this.num = num; + this.o = o; + this.property = property; + if((property == 'characters' || property == 'items') && typeof o.length != 'undefined') { + this.property = 'length'; + } + + this.condition = condition; + this.conditionMet = function(x) { + if(condition == 'exactly') return x.length == num; + if(condition == 'at least') return x.length >= num; + if(condition == 'at most') return x.length <= num; + + throw "Unknown condition '" + condition + "'"; + }; + this.match = false; + this.explaination = this.makeExplain(); +}; + +JSSpec.PropertyLengthMatcher.prototype.makeExplain = function() { + if(this.o._type == 'String' && this.property == 'length') { + this.match = this.conditionMet(this.o); + return this.match ? '' : this.makeExplainForString(); + } else if(typeof this.o.length != 'undefined' && this.property == "length") { + this.match = this.conditionMet(this.o); + return this.match ? '' : this.makeExplainForArray(); + } else if(typeof this.o[this.property] != 'undefined' && this.o[this.property] != null) { + this.match = this.conditionMet(this.o[this.property]); + return this.match ? '' : this.makeExplainForObject(); + } else if(typeof this.o[this.property] == 'undefined' || this.o[this.property] == null) { + this.match = false; + return this.makeExplainForNoProperty(); + } + + this.match = true; +}; + +JSSpec.PropertyLengthMatcher.prototype.makeExplainForString = function() { + var sb = []; + + var exp = this.num == 0 ? + 'be an empty string' : + 'have ' + this.condition + ' ' + this.num + ' characters'; + + sb.push('

actual value has ' + this.o.length + ' characters:

'); + sb.push('

' + JSSpec.util.inspect(this.o) + '

'); + sb.push('

but it should ' + exp + '.

'); + + return sb.join(""); +}; + +JSSpec.PropertyLengthMatcher.prototype.makeExplainForArray = function() { + var sb = []; + + var exp = this.num == 0 ? + 'be an empty array' : + 'have ' + this.condition + ' ' + this.num + ' items'; + + sb.push('

actual value has ' + this.o.length + ' items:

'); + sb.push('

' + JSSpec.util.inspect(this.o) + '

'); + sb.push('

but it should ' + exp + '.

'); + + return sb.join(""); +}; + +JSSpec.PropertyLengthMatcher.prototype.makeExplainForObject = function() { + var sb = []; + + var exp = this.num == 0 ? + 'be empty' : + 'have ' + this.condition + ' ' + this.num + ' ' + this.property + '.'; + + sb.push('

actual value has ' + this.o[this.property].length + ' ' + this.property + ':

'); + sb.push('

' + JSSpec.util.inspect(this.o, false, this.property) + '

'); + sb.push('

but it should ' + exp + '.

'); + + return sb.join(""); +}; + +JSSpec.PropertyLengthMatcher.prototype.makeExplainForNoProperty = function() { + var sb = []; + + sb.push('

actual value:

'); + sb.push('

' + JSSpec.util.inspect(this.o) + '

'); + sb.push('

should have ' + this.condition + ' ' + this.num + ' ' + this.property + ' but there\'s no such property.

'); + + return sb.join(""); +}; + +JSSpec.PropertyLengthMatcher.prototype.matches = function() { + return this.match; +}; + +JSSpec.PropertyLengthMatcher.prototype.explain = function() { + return this.explaination; +}; + +JSSpec.PropertyLengthMatcher.createInstance = function(num, property, o, condition) { + return new JSSpec.PropertyLengthMatcher(num, property, o, condition); +}; + +/** + * EqualityMatcher + */ +JSSpec.EqualityMatcher = {}; + +JSSpec.EqualityMatcher.createInstance = function(expected, actual) { + if(expected == null || actual == null) { + return new JSSpec.NullEqualityMatcher(expected, actual); + } else if(expected._type && expected._type == actual._type) { + if(expected._type == "String") { + return new JSSpec.StringEqualityMatcher(expected, actual); + } else if(expected._type == "Date") { + return new JSSpec.DateEqualityMatcher(expected, actual); + } else if(expected._type == "Number") { + return new JSSpec.NumberEqualityMatcher(expected, actual); + } else if(expected._type == "Array") { + return new JSSpec.ArrayEqualityMatcher(expected, actual); + } else if(expected._type == "Boolean") { + return new JSSpec.BooleanEqualityMatcher(expected, actual); + } + } + + return new JSSpec.ObjectEqualityMatcher(expected, actual); +}; + +JSSpec.EqualityMatcher.basicExplain = function(expected, actual, expectedDesc, actualDesc) { + var sb = []; + + sb.push(actualDesc || '

actual value:

'); + sb.push('

' + JSSpec.util.inspect(actual) + '

'); + sb.push(expectedDesc || '

should be:

'); + sb.push('

' + JSSpec.util.inspect(expected) + '

'); + + return sb.join(""); +}; + +JSSpec.EqualityMatcher.diffExplain = function(expected, actual) { + var sb = []; + + sb.push('

diff:

'); + sb.push('

'); + + var dmp = new diff_match_patch(); + var diff = dmp.diff_main(expected, actual); + dmp.diff_cleanupEfficiency(diff); + + sb.push(JSSpec.util.inspect(dmp.diff_prettyHtml(diff), true)); + + sb.push('

'); + + return sb.join(""); +}; + +/** + * BooleanEqualityMatcher + */ +JSSpec.BooleanEqualityMatcher = function(expected, actual) { + this.expected = expected; + this.actual = actual; +}; + +JSSpec.BooleanEqualityMatcher.prototype.explain = function() { + var sb = []; + + sb.push('

actual value:

'); + sb.push('

' + JSSpec.util.inspect(this.actual) + '

'); + sb.push('

should be:

'); + sb.push('

' + JSSpec.util.inspect(this.expected) + '

'); + + return sb.join(""); +}; + +JSSpec.BooleanEqualityMatcher.prototype.matches = function() { + return this.expected == this.actual; +}; + +/** + * NullEqualityMatcher + */ +JSSpec.NullEqualityMatcher = function(expected, actual) { + this.expected = expected; + this.actual = actual; +}; + +JSSpec.NullEqualityMatcher.prototype.matches = function() { + return this.expected == this.actual && typeof this.expected == typeof this.actual; +}; + +JSSpec.NullEqualityMatcher.prototype.explain = function() { + return JSSpec.EqualityMatcher.basicExplain(this.expected, this.actual); +}; + +JSSpec.DateEqualityMatcher = function(expected, actual) { + this.expected = expected; + this.actual = actual; +}; + +JSSpec.DateEqualityMatcher.prototype.matches = function() { + return this.expected.getTime() == this.actual.getTime(); +}; + +JSSpec.DateEqualityMatcher.prototype.explain = function() { + var sb = []; + + sb.push(JSSpec.EqualityMatcher.basicExplain(this.expected, this.actual)); + sb.push(JSSpec.EqualityMatcher.diffExplain(this.expected.toString(), this.actual.toString())); + + return sb.join(""); +}; + +/** + * ObjectEqualityMatcher + */ +JSSpec.ObjectEqualityMatcher = function(expected, actual) { + this.expected = expected; + this.actual = actual; + this.match = this.expected == this.actual; + this.explaination = this.makeExplain(); +}; + +JSSpec.ObjectEqualityMatcher.prototype.matches = function() {return this.match}; + +JSSpec.ObjectEqualityMatcher.prototype.explain = function() {return this.explaination}; + +JSSpec.ObjectEqualityMatcher.prototype.makeExplain = function() { + if(this.expected == this.actual) { + this.match = true; + return ""; + } + + if(JSSpec.util.isDomNode(this.expected)) { + return this.makeExplainForDomNode(); + } + + var key, expectedHasItem, actualHasItem; + + for(key in this.expected) { + expectedHasItem = this.expected[key] != null && typeof this.expected[key] != 'undefined'; + actualHasItem = this.actual[key] != null && typeof this.actual[key] != 'undefined'; + if(expectedHasItem && !actualHasItem) return this.makeExplainForMissingItem(key); + } + for(key in this.actual) { + expectedHasItem = this.expected[key] != null && typeof this.expected[key] != 'undefined'; + actualHasItem = this.actual[key] != null && typeof this.actual[key] != 'undefined'; + if(actualHasItem && !expectedHasItem) return this.makeExplainForUnknownItem(key); + } + + for(key in this.expected) { + var matcher = JSSpec.EqualityMatcher.createInstance(this.expected[key], this.actual[key]); + if(!matcher.matches()) return this.makeExplainForItemMismatch(key); + } + + this.match = true; +}; + +JSSpec.ObjectEqualityMatcher.prototype.makeExplainForDomNode = function(key) { + var sb = []; + + sb.push(JSSpec.EqualityMatcher.basicExplain(this.expected, this.actual)); + + return sb.join(""); +}; + +JSSpec.ObjectEqualityMatcher.prototype.makeExplainForMissingItem = function(key) { + var sb = []; + + sb.push('

actual value has no item named ' + JSSpec.util.inspect(key) + '

'); + sb.push('

' + JSSpec.util.inspect(this.actual, false, key) + '

'); + sb.push('

but it should have the item whose value is ' + JSSpec.util.inspect(this.expected[key]) + '

'); + sb.push('

' + JSSpec.util.inspect(this.expected, false, key) + '

'); + + return sb.join(""); +}; + +JSSpec.ObjectEqualityMatcher.prototype.makeExplainForUnknownItem = function(key) { + var sb = []; + + sb.push('

actual value has item named ' + JSSpec.util.inspect(key) + '

'); + sb.push('

' + JSSpec.util.inspect(this.actual, false, key) + '

'); + sb.push('

but there should be no such item

'); + sb.push('

' + JSSpec.util.inspect(this.expected, false, key) + '

'); + + return sb.join(""); +}; + +JSSpec.ObjectEqualityMatcher.prototype.makeExplainForItemMismatch = function(key) { + var sb = []; + + sb.push('

actual value has an item named ' + JSSpec.util.inspect(key) + ' whose value is ' + JSSpec.util.inspect(this.actual[key]) + '

'); + sb.push('

' + JSSpec.util.inspect(this.actual, false, key) + '

'); + sb.push('

but it\'s value should be ' + JSSpec.util.inspect(this.expected[key]) + '

'); + sb.push('

' + JSSpec.util.inspect(this.expected, false, key) + '

'); + + return sb.join(""); +}; + + + + +/** + * ArrayEqualityMatcher + */ +JSSpec.ArrayEqualityMatcher = function(expected, actual) { + this.expected = expected; + this.actual = actual; + this.match = this.expected == this.actual; + this.explaination = this.makeExplain(); +}; + +JSSpec.ArrayEqualityMatcher.prototype.matches = function() {return this.match}; + +JSSpec.ArrayEqualityMatcher.prototype.explain = function() {return this.explaination}; + +JSSpec.ArrayEqualityMatcher.prototype.makeExplain = function() { + if(this.expected.length != this.actual.length) return this.makeExplainForLengthMismatch(); + + for(var i = 0; i < this.expected.length; i++) { + var matcher = JSSpec.EqualityMatcher.createInstance(this.expected[i], this.actual[i]); + if(!matcher.matches()) return this.makeExplainForItemMismatch(i); + } + + this.match = true; +}; + +JSSpec.ArrayEqualityMatcher.prototype.makeExplainForLengthMismatch = function() { + return JSSpec.EqualityMatcher.basicExplain( + this.expected, + this.actual, + '

but it should be ' + this.expected.length + '

', + '

actual value has ' + this.actual.length + ' items

' + ); +}; + +JSSpec.ArrayEqualityMatcher.prototype.makeExplainForItemMismatch = function(index) { + var postfix = ["th", "st", "nd", "rd", "th"][Math.min((index + 1) % 10,4)]; + + var sb = []; + + sb.push('

' + (index + 1) + postfix + ' item (index ' + index + ') of actual value is ' + JSSpec.util.inspect(this.actual[index]) + ':

'); + sb.push('

' + JSSpec.util.inspect(this.actual, false, index) + '

'); + sb.push('

but it should be ' + JSSpec.util.inspect(this.expected[index]) + ':

'); + sb.push('

' + JSSpec.util.inspect(this.expected, false, index) + '

'); + + return sb.join(""); +}; + +/** + * NumberEqualityMatcher + */ +JSSpec.NumberEqualityMatcher = function(expected, actual) { + this.expected = expected; + this.actual = actual; +}; + +JSSpec.NumberEqualityMatcher.prototype.matches = function() { + if(this.expected == this.actual) return true; +}; + +JSSpec.NumberEqualityMatcher.prototype.explain = function() { + return JSSpec.EqualityMatcher.basicExplain(this.expected, this.actual); +}; + +/** + * StringEqualityMatcher + */ +JSSpec.StringEqualityMatcher = function(expected, actual) { + this.expected = expected; + this.actual = actual; +}; + +JSSpec.StringEqualityMatcher.prototype.matches = function() { + return this.expected == this.actual; +}; + +JSSpec.StringEqualityMatcher.prototype.explain = function() { + var sb = []; + + sb.push(JSSpec.EqualityMatcher.basicExplain(this.expected, this.actual)); + sb.push(JSSpec.EqualityMatcher.diffExplain(this.expected, this.actual)); + return sb.join(""); +}; + +/** + * PatternMatcher + */ +JSSpec.PatternMatcher = function(actual, pattern, condition) { + this.actual = actual; + this.pattern = pattern; + this.condition = condition; + this.match = false; + this.explaination = this.makeExplain(); +}; + +JSSpec.PatternMatcher.createInstance = function(actual, pattern, condition) { + return new JSSpec.PatternMatcher(actual, pattern, condition); +}; + +JSSpec.PatternMatcher.prototype.makeExplain = function() { + var sb; + if(this.actual == null || this.actual._type != 'String') { + sb = []; + sb.push('

actual value:

'); + sb.push('

' + JSSpec.util.inspect(this.actual) + '

'); + sb.push('

should ' + (this.condition ? '' : 'not') + ' match with pattern:

'); + sb.push('

' + JSSpec.util.inspect(this.pattern) + '

'); + sb.push('

but pattern matching cannot be performed.

'); + return sb.join(""); + } else { + this.match = this.condition == !!this.actual.match(this.pattern); + if(this.match) return ""; + + sb = []; + sb.push('

actual value:

'); + sb.push('

' + JSSpec.util.inspect(this.actual) + '

'); + sb.push('

should ' + (this.condition ? '' : 'not') + ' match with pattern:

'); + sb.push('

' + JSSpec.util.inspect(this.pattern) + '

'); + return sb.join(""); + } +}; + +JSSpec.PatternMatcher.prototype.matches = function() { + return this.match; +}; + +JSSpec.PatternMatcher.prototype.explain = function() { + return this.explaination; +}; + +/** + * Domain Specific Languages + */ +JSSpec.DSL = {}; + +JSSpec.DSL.forString = { + normalizeHtml: function() { + var html = this; + + // Uniformize quotation, turn tag names and attribute names into lower case + html = html.replace(/<(\/?)(\w+)([^>]*?)>/img, function(str, closingMark, tagName, attrs) { + var sortedAttrs = JSSpec.util.sortHtmlAttrs(JSSpec.util.correctHtmlAttrQuotation(attrs).toLowerCase()) + return "<" + closingMark + tagName.toLowerCase() + sortedAttrs + ">" + }); + + // validation self-closing tags + html = html.replace(/<(br|hr|img)([^>]*?)>/mg, function(str, tag, attrs) { + return "<" + tag + attrs + " />"; + }); + + // append semi-colon at the end of style value + html = html.replace(/style="(.*?)"/mg, function(str, styleStr) { + styleStr = JSSpec.util.sortStyleEntries(styleStr.strip()); // for Safari + if(styleStr.charAt(styleStr.length - 1) != ';') styleStr += ";" + + return 'style="' + styleStr + '"' + }); + + // sort style entries + + // remove empty style attributes + html = html.replace(/ style=";"/mg, ""); + + // remove new-lines + html = html.replace(/\r/mg, ''); + html = html.replace(/\n/mg, ''); + + return html; + } +}; + + +JSSpec.DSL.describe = function(context, entries, base) { + if(base) { + for(var i = 0; i < JSSpec.specs.length; i++) { + if(JSSpec.specs[i].context === base) { + base = JSSpec.specs[i]; + break; + } + } + + for(var i = 0; i < base.examples.length; i++) { + var example = base.examples[i]; + + if(!entries[example.name]) entries[example.name] = example.target; + } + } + + JSSpec.specs.push(new JSSpec.Spec(context, entries)); +}; + +JSSpec.DSL.value_of = function(target) { + if(JSSpec._secondPass) return {}; + + var subject = new JSSpec.DSL.Subject(target); + return subject; +}; + +JSSpec.DSL.Subject = function(target) { + this.target = target; +}; + +JSSpec.DSL.Subject.prototype._type = 'Subject'; + +JSSpec.DSL.Subject.prototype.should_fail = function(message) { + JSSpec._assertionFailure = {message:message}; + throw JSSpec._assertionFailure; +}; + +JSSpec.DSL.Subject.prototype.should_be = function(expected) { + var matcher = JSSpec.EqualityMatcher.createInstance(expected, this.target); + if(!matcher.matches()) { + JSSpec._assertionFailure = {message:matcher.explain()}; + throw JSSpec._assertionFailure; + } +}; + +JSSpec.DSL.Subject.prototype.should_not_be = function(expected) { + // TODO JSSpec.EqualityMatcher should support 'condition' + var matcher = JSSpec.EqualityMatcher.createInstance(expected, this.target); + if(matcher.matches()) { + JSSpec._assertionFailure = {message:"'" + this.target + "' should not be '" + expected + "'"}; + throw JSSpec._assertionFailure; + } +}; + +JSSpec.DSL.Subject.prototype.should_be_empty = function() { + this.should_have(0, this.getType() == 'String' ? 'characters' : 'items'); +}; + +JSSpec.DSL.Subject.prototype.should_not_be_empty = function() { + this.should_have_at_least(1, this.getType() == 'String' ? 'characters' : 'items'); +}; + +JSSpec.DSL.Subject.prototype.should_be_true = function() { + this.should_be(true); +}; + +JSSpec.DSL.Subject.prototype.should_be_false = function() { + this.should_be(false); +}; + +JSSpec.DSL.Subject.prototype.should_be_null = function() { + this.should_be(null); +}; + +JSSpec.DSL.Subject.prototype.should_be_undefined = function() { + this.should_be(undefined); +}; + +JSSpec.DSL.Subject.prototype.should_not_be_null = function() { + this.should_not_be(null); +}; + +JSSpec.DSL.Subject.prototype.should_not_be_undefined = function() { + this.should_not_be(undefined); +}; + +JSSpec.DSL.Subject.prototype._should_have = function(num, property, condition) { + var matcher = JSSpec.PropertyLengthMatcher.createInstance(num, property, this.target, condition); + if(!matcher.matches()) { + JSSpec._assertionFailure = {message:matcher.explain()}; + throw JSSpec._assertionFailure; + } +}; + +JSSpec.DSL.Subject.prototype.should_have = function(num, property) { + this._should_have(num, property, "exactly"); +}; + +JSSpec.DSL.Subject.prototype.should_have_exactly = function(num, property) { + this._should_have(num, property, "exactly"); +}; + +JSSpec.DSL.Subject.prototype.should_have_at_least = function(num, property) { + this._should_have(num, property, "at least"); +}; + +JSSpec.DSL.Subject.prototype.should_have_at_most = function(num, property) { + this._should_have(num, property, "at most"); +}; + +JSSpec.DSL.Subject.prototype.should_include = function(expected) { + var matcher = JSSpec.IncludeMatcher.createInstance(this.target, expected, true); + if(!matcher.matches()) { + JSSpec._assertionFailure = {message:matcher.explain()}; + throw JSSpec._assertionFailure; + } +}; + +JSSpec.DSL.Subject.prototype.should_not_include = function(expected) { + var matcher = JSSpec.IncludeMatcher.createInstance(this.target, expected, false); + if(!matcher.matches()) { + JSSpec._assertionFailure = {message:matcher.explain()}; + throw JSSpec._assertionFailure; + } +}; + +JSSpec.DSL.Subject.prototype.should_match = function(pattern) { + var matcher = JSSpec.PatternMatcher.createInstance(this.target, pattern, true); + if(!matcher.matches()) { + JSSpec._assertionFailure = {message:matcher.explain()}; + throw JSSpec._assertionFailure; + } +} +JSSpec.DSL.Subject.prototype.should_not_match = function(pattern) { + var matcher = JSSpec.PatternMatcher.createInstance(this.target, pattern, false); + if(!matcher.matches()) { + JSSpec._assertionFailure = {message:matcher.explain()}; + throw JSSpec._assertionFailure; + } +}; + +JSSpec.DSL.Subject.prototype.getType = function() { + if(typeof this.target == 'undefined') { + return 'undefined'; + } else if(this.target == null) { + return 'null'; + } else if(this.target._type) { + return this.target._type; + } else if(JSSpec.util.isDomNode(this.target)) { + return 'DomNode'; + } else { + return 'object'; + } +}; + +/** + * Utilities + */ +JSSpec.util = { + escapeTags: function(string) { + return string.replace(//img, '>'); + }, + escapeMetastring: function(string) { + return string.replace(/\r/img, '\\r').replace(/\n/img, '\\n').replace(/\¶\;\/img, '\\n').replace(/\t/img, '\\t'); + }, + parseOptions: function(defaults) { + var options = defaults; + + var url = location.href; + var queryIndex = url.indexOf('?'); + if(queryIndex == -1) return options; + + var query = url.substring(queryIndex + 1).split('#')[0]; + var pairs = query.split('&'); + for(var i = 0; i < pairs.length; i++) { + var tokens = pairs[i].split('='); + options[tokens[0]] = tokens[1]; + } + + return options; + }, + correctHtmlAttrQuotation: function(html) { + html = html.replace(/(\w+)=['"]([^'"]+)['"]/mg,function (str, name, value) {return name + '=' + '"' + value + '"';}); + html = html.replace(/(\w+)=([^ '"]+)/mg,function (str, name, value) {return name + '=' + '"' + value + '"';}); + html = html.replace(/'/mg, '"'); + + return html; + }, + sortHtmlAttrs: function(html) { + var attrs = []; + html.replace(/((\w+)="[^"]+")/mg, function(str, matched) { + attrs.push(matched); + }); + return attrs.length == 0 ? "" : " " + attrs.sort().join(" "); + }, + sortStyleEntries: function(styleText) { + var entries = styleText.split(/; /); + return entries.sort().join("; "); + }, + escapeHtml: function(str) { + if(!this._div) { + this._div = document.createElement("DIV"); + this._text = document.createTextNode(''); + this._div.appendChild(this._text); + } + this._text.data = str; + return this._div.innerHTML; + }, + isDomNode: function(o) { + // TODO: make it more stricter + return (typeof o.nodeName == 'string') && (typeof o.nodeType == 'number'); + }, + inspectDomPath: function(o) { + var sb = []; + while(o && o.nodeName != '#document' && o.parent) { + var siblings = o.parentNode.childNodes; + for(var i = 0; i < siblings.length; i++) { + if(siblings[i] == o) { + sb.push(o.nodeName + (i == 0 ? '' : '[' + i + ']')); + break; + } + } + o = o.parentNode; + } + return sb.join(" > "); + }, + inspectDomNode: function(o) { + if(o.nodeType == 1) { + var nodeName = o.nodeName.toLowerCase(); + var sb = []; + sb.push(''); + sb.push("<"); + sb.push(nodeName); + + var attrs = o.attributes; + for(var i = 0; i < attrs.length; i++) { + if( + attrs[i].nodeValue && + attrs[i].nodeName != 'contentEditable' && + attrs[i].nodeName != 'style' && + typeof attrs[i].nodeValue != 'function' + ) sb.push(' ' + attrs[i].nodeName.toLowerCase() + '="' + attrs[i].nodeValue + '"'); + } + if(o.style && o.style.cssText) { + sb.push(' style="' + o.style.cssText + '"'); + } + sb.push('>'); + sb.push(JSSpec.util.escapeHtml(o.innerHTML)); + sb.push('</' + nodeName + '>'); + sb.push(' (' + JSSpec.util.inspectDomPath(o) + ')' ); + sb.push(''); + return sb.join(""); + } else if(o.nodeType == 3) { + return '#text ' + o.nodeValue + ''; + } else { + return 'UnknownDomNode'; + } + }, + inspect: function(o, dontEscape, emphasisKey) { + var sb, inspected; + + if(typeof o == 'undefined') return 'undefined'; + if(o == null) return 'null'; + if(o._type == 'String') return '"' + (dontEscape ? JSSpec.util.escapeMetastring(o) : JSSpec.util.escapeHtml(JSSpec.util.escapeMetastring(o))) + '"'; + + if(o._type == 'Date') { + return '"' + o.toString() + '"'; + } + + if(o._type == 'Number') return '' + (dontEscape ? o : JSSpec.util.escapeHtml(o)) + ''; + + if(o._type == 'Boolean') return '' + o + ''; + + if(o._type == 'RegExp') return '' + JSSpec.util.escapeHtml(o.toString()) + ''; + + if(JSSpec.util.isDomNode(o)) return JSSpec.util.inspectDomNode(o); + + if(o._type == 'Array' || typeof o.length != 'undefined') { + sb = []; + for(var i = 0; i < o.length; i++) { + inspected = JSSpec.util.inspect(o[i]); + sb.push(i == emphasisKey ? ('' + inspected + '') : inspected); + } + return '[' + sb.join(', ') + ']'; + } + + // object + sb = []; + for(var key in o) { + if(key == 'should') continue; + + inspected = JSSpec.util.inspect(key) + ":" + JSSpec.util.inspect(o[key]); + sb.push(key == emphasisKey ? ('' + inspected + '') : inspected); + } + return '{' + sb.join(', ') + '}'; + } +}; + +describe = JSSpec.DSL.describe; +behavior_of = JSSpec.DSL.describe; +value_of = JSSpec.DSL.value_of; +expect = JSSpec.DSL.value_of; // @deprecated + +String.prototype._type = "String"; +Number.prototype._type = "Number"; +Date.prototype._type = "Date"; +Array.prototype._type = "Array"; +Boolean.prototype._type = "Boolean"; +RegExp.prototype._type = "RegExp"; + +var targets = [Array.prototype, Date.prototype, Number.prototype, String.prototype, Boolean.prototype, RegExp.prototype]; + +String.prototype.normalizeHtml = JSSpec.DSL.forString.normalizeHtml; +String.prototype.asHtml = String.prototype.normalizeHtml; //@deprecated +String.prototype.strip = function() {return this.replace(/^\s+/, '').replace(/\s+$/, '');} + + +/** + * Main + */ +JSSpec.defaultOptions = { + autorun: 1, + specIdBeginsWith: 0, + exampleIdBeginsWith: 0, + autocollapse: 1 +}; +JSSpec.options = JSSpec.util.parseOptions(JSSpec.defaultOptions); + +JSSpec.Spec.id = JSSpec.options.specIdBeginsWith; +JSSpec.Example.id = JSSpec.options.exampleIdBeginsWith; + + + +window.onload = function() { + if(JSSpec.specs.length > 0) { + if(!JSSpec.options.inSuite) { + JSSpec.runner = new JSSpec.Runner(JSSpec.specs, new JSSpec.Logger()); + if(JSSpec.options.rerun) { + JSSpec.runner.rerun(decodeURIComponent(JSSpec.options.rerun)); + } else { + JSSpec.runner.run(); + } + } else { + // in suite, send all specs to parent + var parentWindow = window.frames.parent.window; + for(var i = 0; i < JSSpec.specs.length; i++) { + parentWindow.JSSpec.specs.push(JSSpec.specs[i]); + } + } + } else { + var links = document.getElementById('list').getElementsByTagName('A'); + var frameContainer = document.createElement('DIV'); + frameContainer.style.display = 'none'; + document.body.appendChild(frameContainer); + + for(var i = 0; i < links.length; i++) { + var frame = document.createElement('IFRAME'); + frame.src = links[i].href + '?inSuite=0&specIdBeginsWith=' + (i * 10000) + '&exampleIdBeginsWith=' + (i * 10000); + frameContainer.appendChild(frame); + } + } } \ No newline at end of file diff --git a/common/js/unittest/JSSpec/demo.html b/common/js/unittest/JSSpec/demo.html index 21a097111..e992e39bd 100644 --- a/common/js/unittest/JSSpec/demo.html +++ b/common/js/unittest/JSSpec/demo.html @@ -1,210 +1,210 @@ - - - - -JSSpec results - - - - - -

A

B

- + + + + +JSSpec results + + + + + +

A

B

+ diff --git a/common/js/unittest/css/JSSpec.css b/common/js/unittest/css/JSSpec.css index b03804ba9..0eac8183a 100644 --- a/common/js/unittest/css/JSSpec.css +++ b/common/js/unittest/css/JSSpec.css @@ -1,224 +1,224 @@ -@CHARSET "UTF-8"; - -/* -------------------- - * @Layout - */ - -html { - overflow: hidden; -} - -body, #jsspec_container { - overflow: hidden; - padding: 0; - margin: 0; - width: 100%; - height: 100%; - background-color: white; -} - -#title { - padding: 0; - margin: 0; - position: absolute; - top: 0px; - left: 0px; - width: 100%; - height: 40px; - overflow: hidden; -} - -#list { - padding: 0; - margin: 0; - position: absolute; - top: 40px; - left: 0px; - bottom: 0px; - overflow: auto; - width: 250px; - _height:expression(document.body.clientHeight-40); -} - -#log { - padding: 0; - margin: 0; - position: absolute; - top: 40px; - left: 250px; - right: 0px; - bottom: 0px; - overflow: auto; - _height:expression(document.body.clientHeight-40); - _width:expression(document.body.clientWidth-250); -} - - - -/* -------------------- - * @Decorations and colors - */ -* { - padding: 0; - margin: 0; - font-family: "Lucida Grande", Helvetica, sans-serif; -} - -li { - list-style: none; -} - -/* hiding subtitles */ -h2 { - display: none; -} - -/* title section */ -div#title { - padding: 0em 0.5em; -} - -div#title h1 { - font-size: 1.5em; - float: left; -} - -div#title ul li { - float: left; - padding: 0.5em 0em 0.5em 0.75em; -} - -div#title p { - float:right; - margin-right:1em; - font-size: 0.75em; -} - -/* spec container */ -ul.specs { - margin: 0.5em; -} -ul.specs li { - margin-bottom: 0.1em; -} - -/* spec title */ -ul.specs li h3 { - font-weight: bold; - font-size: 0.75em; - padding: 0.2em 1em; - cursor: pointer; - _cursor: hand; -} - -/* example container */ -ul.examples li { - border-style: solid; - border-width: 0px 0px 1px 5px; - margin: 0.2em 0em 0.2em 1em; -} - -/* example title */ -ul.examples li h4 { - font-weight: normal; - font-size: 0.75em; - margin-left: 1em; -} - -pre.examples-code { - margin: 0.5em 2em; - padding: 0.5em; - background: white; - border: solid 1px #CCC; -} - -/* example explaination */ -ul.examples li div { - padding: 1em 2em; - font-size: 0.75em; -} - -/* styles for ongoing, success, failure, error */ -div.success, div.success a { - color: #FFFFFF; - background-color: #65C400; -} - -ul.specs li.success h3, ul.specs li.success h3 a { - color: #FFFFFF; - background-color: #65C400; -} - -ul.examples li.success, ul.examples li.success a { - color: #3D7700; - background-color: #DBFFB4; - border-color: #65C400; -} - -div.exception, div.exception a { - color: #FFFFFF; - background-color: #C20000; -} - -ul.specs li.exception h3, ul.specs li.exception h3 a { - color: #FFFFFF; - background-color: #C20000; -} - -ul.examples li.exception, ul.examples li.exception a { - color: #C20000; - background-color: #FFFBD3; - border-color: #C20000; -} - -div.ongoing, div.ongoing a { - color: #000000; - background-color: #FFFF80; -} - -ul.specs li.ongoing h3, ul.specs li.ongoing h3 a { - color: #000000; - background-color: #FFFF80; -} - -ul.examples li.ongoing, ul.examples li.ongoing a { - color: #000000; - background-color: #FFFF80; - border-color: #DDDD00; -} - - - -/* -------------------- - * values - */ -.number_value, .string_value, .regexp_value, .boolean_value, .dom_value { - font-family: monospace; - color: blue; -} -.object_value, .array_value { - line-height: 2em; - padding: 0.1em 0.2em; - margin: 0.1em 0; -} -.date_value { - font-family: monospace; - color: olive; -} -.undefined_value, .null_value { - font-style: italic; - color: blue; -} -.dom_attr_name { -} -.dom_attr_value { - color: red; -} -.dom_path { - font-size: 0.75em; - color: gray; -} -strong { - font-weight: normal; - background-color: #FFC6C6; +@CHARSET "UTF-8"; + +/* -------------------- + * @Layout + */ + +html { + overflow: hidden; +} + +body, #jsspec_container { + overflow: hidden; + padding: 0; + margin: 0; + width: 100%; + height: 100%; + background-color: white; +} + +#title { + padding: 0; + margin: 0; + position: absolute; + top: 0px; + left: 0px; + width: 100%; + height: 40px; + overflow: hidden; +} + +#list { + padding: 0; + margin: 0; + position: absolute; + top: 40px; + left: 0px; + bottom: 0px; + overflow: auto; + width: 250px; + _height:expression(document.body.clientHeight-40); +} + +#log { + padding: 0; + margin: 0; + position: absolute; + top: 40px; + left: 250px; + right: 0px; + bottom: 0px; + overflow: auto; + _height:expression(document.body.clientHeight-40); + _width:expression(document.body.clientWidth-250); +} + + + +/* -------------------- + * @Decorations and colors + */ +* { + padding: 0; + margin: 0; + font-family: "Lucida Grande", Helvetica, sans-serif; +} + +li { + list-style: none; +} + +/* hiding subtitles */ +h2 { + display: none; +} + +/* title section */ +div#title { + padding: 0em 0.5em; +} + +div#title h1 { + font-size: 1.5em; + float: left; +} + +div#title ul li { + float: left; + padding: 0.5em 0em 0.5em 0.75em; +} + +div#title p { + float:right; + margin-right:1em; + font-size: 0.75em; +} + +/* spec container */ +ul.specs { + margin: 0.5em; +} +ul.specs li { + margin-bottom: 0.1em; +} + +/* spec title */ +ul.specs li h3 { + font-weight: bold; + font-size: 0.75em; + padding: 0.2em 1em; + cursor: pointer; + _cursor: hand; +} + +/* example container */ +ul.examples li { + border-style: solid; + border-width: 0px 0px 1px 5px; + margin: 0.2em 0em 0.2em 1em; +} + +/* example title */ +ul.examples li h4 { + font-weight: normal; + font-size: 0.75em; + margin-left: 1em; +} + +pre.examples-code { + margin: 0.5em 2em; + padding: 0.5em; + background: white; + border: solid 1px #CCC; +} + +/* example explaination */ +ul.examples li div { + padding: 1em 2em; + font-size: 0.75em; +} + +/* styles for ongoing, success, failure, error */ +div.success, div.success a { + color: #FFFFFF; + background-color: #65C400; +} + +ul.specs li.success h3, ul.specs li.success h3 a { + color: #FFFFFF; + background-color: #65C400; +} + +ul.examples li.success, ul.examples li.success a { + color: #3D7700; + background-color: #DBFFB4; + border-color: #65C400; +} + +div.exception, div.exception a { + color: #FFFFFF; + background-color: #C20000; +} + +ul.specs li.exception h3, ul.specs li.exception h3 a { + color: #FFFFFF; + background-color: #C20000; +} + +ul.examples li.exception, ul.examples li.exception a { + color: #C20000; + background-color: #FFFBD3; + border-color: #C20000; +} + +div.ongoing, div.ongoing a { + color: #000000; + background-color: #FFFF80; +} + +ul.specs li.ongoing h3, ul.specs li.ongoing h3 a { + color: #000000; + background-color: #FFFF80; +} + +ul.examples li.ongoing, ul.examples li.ongoing a { + color: #000000; + background-color: #FFFF80; + border-color: #DDDD00; +} + + + +/* -------------------- + * values + */ +.number_value, .string_value, .regexp_value, .boolean_value, .dom_value { + font-family: monospace; + color: blue; +} +.object_value, .array_value { + line-height: 2em; + padding: 0.1em 0.2em; + margin: 0.1em 0; +} +.date_value { + font-family: monospace; + color: olive; +} +.undefined_value, .null_value { + font-style: italic; + color: blue; +} +.dom_attr_name { +} +.dom_attr_value { + color: red; +} +.dom_path { + font-size: 0.75em; + color: gray; +} +strong { + font-weight: normal; + background-color: #FFC6C6; } \ No newline at end of file diff --git a/common/js/unittest/unittest_common.html b/common/js/unittest/unittest_common.html index 7cfdf728a..d747815d4 100644 --- a/common/js/unittest/unittest_common.html +++ b/common/js/unittest/unittest_common.html @@ -1,74 +1,74 @@ - - - - -JSSpec results - - - - - - - -

A

B

- + + + + +JSSpec results + + + + + + + +

A

B

+ diff --git a/common/js/xml_js_filter.js b/common/js/xml_js_filter.js index 0f7dfd99e..f0a2ff581 100644 --- a/common/js/xml_js_filter.js +++ b/common/js/xml_js_filter.js @@ -1,14 +1,14 @@ -/** - * @file common/js/xml_js_filter.js - * @author NHN (developers@xpressengine.com) - * @brief xml filter (validator) plugin - * - * A rule is a method validate one field. - * A filter is made up of one or more rules. - **/ - -(function($){var messages=[];var rules=[];var filters=[];var callbacks=[];var extras={};var Validator=xe.createApp('Validator',{init:function(){var regEmail=/^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/;this.cast('ADD_RULE',['email',regEmail]);this.cast('ADD_RULE',['email_address',regEmail]);var regUserid=/^[a-z]+[\w-]*[a-z0-9_]+$/i;this.cast('ADD_RULE',['userid',regUserid]);this.cast('ADD_RULE',['user_id',regUserid]);var regUrl=/^(https?|ftp|mms):\/\/[0-9a-z-]+(\.[_0-9a-z-\/\~]+)+(:[0-9]{2,4})*$/;this.cast('ADD_RULE',['url',regUrl]);this.cast('ADD_RULE',['homepage',regUrl]);var regKor=/^[가-힣]*$/;this.cast('ADD_RULE',['korean',regKor]);var regKorNum=/^[가-힣0-9]*$/;this.cast('ADD_RULE',['korean_number',regKorNum]);var regAlpha=/^[a-z]*$/i;this.cast('ADD_RULE',['alpha',regAlpha]);var regAlphaNum=/^[a-z][a-z0-9_]*$/i;this.cast('ADD_RULE',['alpha_number',regAlphaNum]);var regNum=/^[0-9]*$/;this.cast('ADD_RULE',['number',regNum]);},run:function(oForm){var filter='';if(oForm._filter)filter=oForm._filter.value;var params=[oForm,filter];var result=this.cast('VALIDATE',params);if(typeof result=='undefined')result=false;return result;},API_ONREADY:function(){var self=this;$('form').each(function(){if(this.onsubmit){this['xe:onsubmit']=this.onsubmit;this.onsubmit=null;}}).submit(function(){var legacyFn=this['xe:onsubmit'];var hasLegacyFn=$.isFunction(legacyFn);var bResult=hasLegacyFn?legacyFn.apply(this):self.run(this);return bResult;});},API_VALIDATE:function(sender,params){var self=this,result=true,form=params[0],filter=null,callback=null;if(form.elements['_filter'])filter=form.elements['_filter'].value;if(!filter)return true;if($.isFunction(callbacks[filter]))callback=callbacks[filter];filter=$.extend({},filters[filter.toLowerCase()]||{},extras);$.each(filter,function(name){var _el=form.elements[name];if(!_el)return true;var el=$(_el),val=$.trim(get_value(el));var minlen=parseInt(this.minlength)||0;var maxlen=parseInt(this.maxlength)||0;var rule=(this.rule||'').split(',');if(this.required&&!val)return(result=(!!self.cast('ALERT',[form,name,'isnull'])&&false));if(!this.required&&!val)return(result=true);if((minlen&&val.lengthmaxlen))return(result=(!!self.cast('ALERT',[form,name,'outofrange',minlen,maxlen])&&false));if(this.equalto){var eq_val=get_value($(form.elements[this.equalto]));if(eq_val!=val)return(result=(!!self.cast('ALERT',[form,name,'equalto'])&&false));} -if(rule){$.each(rule,function(i,r){if(!r)return true;var ret=self.cast('APPLY_RULE',[r,val]);if(!ret){self.cast('ALERT',[form,name,'invalid_'+this]);return(result=false);}});} -if(!result)return false;});if(!result)return false;if($.isFunction(callback))return callback(form);return true;},API_ADD_RULE:function(sender,params){var name=params[0].toLowerCase();rules[name]=params[1];},API_DEL_RULE:function(sender,params){var name=params[0].toLowerCase();delete rules[name];},API_GET_RULE:function(sender,params){var name=params[0].toLowerCase();if(rules[name]){return rules[name];}else{return null;}},API_ADD_FILTER:function(sender,params){var name=params[0].toLowerCase();var filter=params[1];filters[name]=filter;},API_DEL_FILTER:function(sender,params){var name=params[0].toLowerCase();delete filters[name];},API_GET_FILTER:function(sender,params){var name=params[0].toLowerCase();if(filters[name]){return filters[name];}else{return null;}},API_ADD_EXTRA_FIELD:function(sender,params){var name=params[0].toLowerCase();var prop=params[1];extras[name]=prop;},API_GET_EXTRA_FIELD:function(sender,params){var name=params[0].toLowerCase();return extras[name];},API_DEL_EXTRA_FIELD:function(sender,params){var name=params[0].toLowerCase();delete extras[name];},API_APPLY_RULE:function(sender,params){var name=params[0];var value=params[1];if(typeof(rules[name])=='undefined')return true;if($.isFunction(rules[name]))return rules[name](value);if(rules[name]instanceof RegExp)return rules[name].test(value);return true;},API_ALERT:function(sender,params){var form=params[0];var field_name=params[1];var msg_code=params[2];var minlen=params[3];var maxlen=params[4];var field_msg=this.cast('GET_MESSAGE',[field_name]);var msg=this.cast('GET_MESSAGE',[msg_code]);if(msg!=msg_code)msg=(msg.indexOf('%s')<0)?(field_msg+msg):(msg.replace('%s',field_msg));if(minlen||maxlen)msg+='('+(minlen||'')+'~'+(maxlen||'')+')';this.cast('SHOW_ALERT',[msg]);$(form.elements[field_name]).focus();},API_SHOW_ALERT:function(sender,params){alert(params[0]);},API_ADD_MESSAGE:function(sender,params){var msg_code=params[0];var msg_str=params[1];messages[msg_code]=msg_str;},API_GET_MESSAGE:function(sender,params){var msg_code=params[0];return messages[msg_code]||msg_code;},API_ADD_CALLBACK:function(sender,params){var name=params[0];var func=params[1];callbacks[name]=func;},API_REMOVE_CALLBACK:function(sender,params){var name=params[0];delete callbacks[name];}});var oValidator=new Validator;xe.registerApp(oValidator);var EditorStub=xe.createPlugin('editor_stub',{API_BEFORE_VALIDATE:function(sender,params){var form=params[0];var seq=form.getAttribute('editor_sequence');if(seq && typeof seq=='object')seq=seq.value;if(seq){try{editorRelKeys[seq].content.value=editorRelKeys[seq].func(seq)||'';}catch(e){}}}});oValidator.registerPlugin(new EditorStub);function get_value(elem){var vals=[];if(elem.is(':radio')){return elem.filter(':checked').val();}else if(elem.is(':checkbox')){elem.filter(':checked').each(function(){vals.push(this.value);});return vals.join('|@|');}else{return elem.val();}}})(jQuery);function filterAlertMessage(ret_obj){var error=ret_obj["error"];var message=ret_obj["message"];var act=ret_obj["act"];var redirect_url=ret_obj["redirect_url"];var url=location.href;if(typeof(message)!="undefined"&&message&&message!="success")alert(message);if(typeof(act)!="undefined"&&act)url=current_url.setQuery("act",act);else if(typeof(redirect_url)!="undefined"&&redirect_url)url=redirect_url;if(url==location.href)url=url.replace(/#(.*)$/,'');location.href=url;} -function procFilter(form,filter_func){filter_func(form);return false;} +/** + * @file common/js/xml_js_filter.js + * @author NHN (developers@xpressengine.com) + * @brief xml filter (validator) plugin + * + * A rule is a method validate one field. + * A filter is made up of one or more rules. + **/ + +(function($){var messages=[];var rules=[];var filters=[];var callbacks=[];var extras={};var Validator=xe.createApp('Validator',{init:function(){var regEmail=/^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/;this.cast('ADD_RULE',['email',regEmail]);this.cast('ADD_RULE',['email_address',regEmail]);var regUserid=/^[a-z]+[\w-]*[a-z0-9_]+$/i;this.cast('ADD_RULE',['userid',regUserid]);this.cast('ADD_RULE',['user_id',regUserid]);var regUrl=/^(https?|ftp|mms):\/\/[0-9a-z-]+(\.[_0-9a-z-\/\~]+)+(:[0-9]{2,4})*$/;this.cast('ADD_RULE',['url',regUrl]);this.cast('ADD_RULE',['homepage',regUrl]);var regKor=/^[가-힣]*$/;this.cast('ADD_RULE',['korean',regKor]);var regKorNum=/^[가-힣0-9]*$/;this.cast('ADD_RULE',['korean_number',regKorNum]);var regAlpha=/^[a-z]*$/i;this.cast('ADD_RULE',['alpha',regAlpha]);var regAlphaNum=/^[a-z][a-z0-9_]*$/i;this.cast('ADD_RULE',['alpha_number',regAlphaNum]);var regNum=/^[0-9]*$/;this.cast('ADD_RULE',['number',regNum]);},run:function(oForm){var filter='';if(oForm._filter)filter=oForm._filter.value;var params=[oForm,filter];var result=this.cast('VALIDATE',params);if(typeof result=='undefined')result=false;return result;},API_ONREADY:function(){var self=this;$('form').each(function(){if(this.onsubmit){this['xe:onsubmit']=this.onsubmit;this.onsubmit=null;}}).submit(function(){var legacyFn=this['xe:onsubmit'];var hasLegacyFn=$.isFunction(legacyFn);var bResult=hasLegacyFn?legacyFn.apply(this):self.run(this);return bResult;});},API_VALIDATE:function(sender,params){var self=this,result=true,form=params[0],filter=null,callback=null;if(form.elements['_filter'])filter=form.elements['_filter'].value;if(!filter)return true;if($.isFunction(callbacks[filter]))callback=callbacks[filter];filter=$.extend({},filters[filter.toLowerCase()]||{},extras);$.each(filter,function(name){var _el=form.elements[name];if(!_el)return true;var el=$(_el),val=$.trim(get_value(el));var minlen=parseInt(this.minlength)||0;var maxlen=parseInt(this.maxlength)||0;var rule=(this.rule||'').split(',');if(this.required&&!val)return(result=(!!self.cast('ALERT',[form,name,'isnull'])&&false));if(!this.required&&!val)return(result=true);if((minlen&&val.lengthmaxlen))return(result=(!!self.cast('ALERT',[form,name,'outofrange',minlen,maxlen])&&false));if(this.equalto){var eq_val=get_value($(form.elements[this.equalto]));if(eq_val!=val)return(result=(!!self.cast('ALERT',[form,name,'equalto'])&&false));} +if(rule){$.each(rule,function(i,r){if(!r)return true;var ret=self.cast('APPLY_RULE',[r,val]);if(!ret){self.cast('ALERT',[form,name,'invalid_'+this]);return(result=false);}});} +if(!result)return false;});if(!result)return false;if($.isFunction(callback))return callback(form);return true;},API_ADD_RULE:function(sender,params){var name=params[0].toLowerCase();rules[name]=params[1];},API_DEL_RULE:function(sender,params){var name=params[0].toLowerCase();delete rules[name];},API_GET_RULE:function(sender,params){var name=params[0].toLowerCase();if(rules[name]){return rules[name];}else{return null;}},API_ADD_FILTER:function(sender,params){var name=params[0].toLowerCase();var filter=params[1];filters[name]=filter;},API_DEL_FILTER:function(sender,params){var name=params[0].toLowerCase();delete filters[name];},API_GET_FILTER:function(sender,params){var name=params[0].toLowerCase();if(filters[name]){return filters[name];}else{return null;}},API_ADD_EXTRA_FIELD:function(sender,params){var name=params[0].toLowerCase();var prop=params[1];extras[name]=prop;},API_GET_EXTRA_FIELD:function(sender,params){var name=params[0].toLowerCase();return extras[name];},API_DEL_EXTRA_FIELD:function(sender,params){var name=params[0].toLowerCase();delete extras[name];},API_APPLY_RULE:function(sender,params){var name=params[0];var value=params[1];if(typeof(rules[name])=='undefined')return true;if($.isFunction(rules[name]))return rules[name](value);if(rules[name]instanceof RegExp)return rules[name].test(value);return true;},API_ALERT:function(sender,params){var form=params[0];var field_name=params[1];var msg_code=params[2];var minlen=params[3];var maxlen=params[4];var field_msg=this.cast('GET_MESSAGE',[field_name]);var msg=this.cast('GET_MESSAGE',[msg_code]);if(msg!=msg_code)msg=(msg.indexOf('%s')<0)?(field_msg+msg):(msg.replace('%s',field_msg));if(minlen||maxlen)msg+='('+(minlen||'')+'~'+(maxlen||'')+')';this.cast('SHOW_ALERT',[msg]);$(form.elements[field_name]).focus();},API_SHOW_ALERT:function(sender,params){alert(params[0]);},API_ADD_MESSAGE:function(sender,params){var msg_code=params[0];var msg_str=params[1];messages[msg_code]=msg_str;},API_GET_MESSAGE:function(sender,params){var msg_code=params[0];return messages[msg_code]||msg_code;},API_ADD_CALLBACK:function(sender,params){var name=params[0];var func=params[1];callbacks[name]=func;},API_REMOVE_CALLBACK:function(sender,params){var name=params[0];delete callbacks[name];}});var oValidator=new Validator;xe.registerApp(oValidator);var EditorStub=xe.createPlugin('editor_stub',{API_BEFORE_VALIDATE:function(sender,params){var form=params[0];var seq=form.getAttribute('editor_sequence');if(seq && typeof seq=='object')seq=seq.value;if(seq){try{editorRelKeys[seq].content.value=editorRelKeys[seq].func(seq)||'';}catch(e){}}}});oValidator.registerPlugin(new EditorStub);function get_value(elem){var vals=[];if(elem.is(':radio')){return elem.filter(':checked').val();}else if(elem.is(':checkbox')){elem.filter(':checked').each(function(){vals.push(this.value);});return vals.join('|@|');}else{return elem.val();}}})(jQuery);function filterAlertMessage(ret_obj){var error=ret_obj["error"];var message=ret_obj["message"];var act=ret_obj["act"];var redirect_url=ret_obj["redirect_url"];var url=location.href;if(typeof(message)!="undefined"&&message&&message!="success")alert(message);if(typeof(act)!="undefined"&&act)url=current_url.setQuery("act",act);else if(typeof(redirect_url)!="undefined"&&redirect_url)url=redirect_url;if(url==location.href)url=url.replace(/#(.*)$/,'');location.href=url;} +function procFilter(form,filter_func){filter_func(form);return false;} function legacy_filter(filter_name,form,module,act,callback,responses,confirm_msg,rename_params){var v=xe.getApp('Validator')[0],$=jQuery,args=[];if(!v)return false;if(!form.elements['_filter'])$(form).prepend('');form.elements['_filter'].value=filter_name;args[0]=filter_name;args[1]=function(f){var params={},res=[],elms=f.elements,data=$(f).serializeArray();$.each(data,function(i,field){var v=$.trim(field.value),n=field.name;if(!v||!n)return true;if(rename_params[n])n=rename_params[n];if(/\[\]$/.test(n))n=n.replace(/\[\]$/,'');if(params[n])params[n]+='|@|'+v;else params[n]=field.value;});if(confirm_msg&&!confirm(confirm_msg))return false;exec_xml(module,act,params,callback,responses,params,form);};v.cast('ADD_CALLBACK',args);v.cast('VALIDATE',[form,filter_name]);return false;} \ No newline at end of file diff --git a/config/config.inc.php b/config/config.inc.php index 898502c4f..32519e430 100644 --- a/config/config.inc.php +++ b/config/config.inc.php @@ -1,163 +1,163 @@ - - */ - if(file_exists(_XE_PATH_.'config/config.user.inc.php')) { - require _XE_PATH_.'config/config.user.inc.php'; - } - - /** - * @brief 디버깅 메시지 출력 (비트 값) - * 0 : 디버그 메시지를 생성/ 출력하지 않음 - * 1 : debugPrint() 함수를 통한 메시지 출력 - * 2 : 소요시간, Request/Response info 출력 - * 4 : DB 쿼리 내역 출력 - **/ - if(!defined('__DEBUG__')) define('__DEBUG__', 0); - - /** - * @brief 디버그 메세지의 출력 장소 - * 0 : files/_debug_message.php 에 연결하여 출력 - * 1 : HTML 최하단에 주석으로 출력 (Response Method가 HTML 일 때) - * 2 : Firebug 콘솔에 출력 (PHP 4 & 5. Firebug/FirePHP 플러그인 필요) - **/ - if(!defined('__DEBUG_OUTPUT__')) define('__DEBUG_OUTPUT__', 0); - - /** - * @brief FirePHP 콘솔 및 브라우저 주석 출력 보안 - * 0 : 제한 없음 (권장하지 않음) - * 1 : 지정한 IP 주소에만 허용 - **/ - if(!defined('__DEBUG_PROTECT__')) define('__DEBUG_PROTECT__', 1); - if(!defined('__DEBUG_PROTECT_IP__')) define('__DEBUG_PROTECT_IP__', '127.0.0.1'); - - /** - * @brief DB 오류 메세지 출력 정의 - * 0 : 출력하지 않음 - * 1 : files/_debug_db_query.php 에 연결하여 출력 - **/ - if(!defined('__DEBUG_DB_OUTPUT__')) define('__DEBUG_DB_OUTPUT__', 0); - - /** - * @brief DB 쿼리중 정해진 시간을 넘기는 쿼리의 로그 남김 - * 0 : 로그를 남기지 않음 - * 0 이상 : 단위를 초로 하여 지정된 초 이상의 실행시간이 걸린 쿼리를 로그로 남김 - * 로그파일은 ./files/_db_slow_query.php 파일로 저장됨 - **/ - if(!defined('__LOG_SLOW_QUERY__')) define('__LOG_SLOW_QUERY__', 0); - - /** - * @brief DB 쿼리 정보를 남김 - * 0 : 쿼리에 정보를 추가하지 않음 - * 1 : XML Query ID를 쿼리 주석으로 남김 - **/ - if(!defined('__DEBUG_QUERY__')) define('__DEBUG_QUERY__', 0); - - /** - * @brief ob_gzhandler를 이용한 압축 기능을 강제로 사용하거나 끄는 옵션 - * 0 : 사용하지 않음 - * 1 : 사용함 - * 대부분의 서버에서는 문제가 없는데 특정 서버군에서 압축전송시 IE에서 오동작을 일으키는경우가 있음 - **/ - if(!defined('__OB_GZHANDLER_ENABLE__')) define('__OB_GZHANDLER_ENABLE__', 1); - - /** - * @brief php unit test (경로/tests/index.php) 의 실행 유무 지정 - * 0 : 사용하지 않음 - * 1 : 사용함 - **/ - if(!defined('__ENABLE_PHPUNIT_TEST__')) define('__ENABLE_PHPUNIT_TEST__', 0); - - /** - * @brief __PROXY_SERVER__ 는 대상 서버를 거쳐서 외부 요청을 하도록 하는 서버의 정보를 가지고 있음 - * FileHandler::getRemoteResource 에서 이 상수를 사용함 - **/ - if(!defined('__PROXY_SERVER__')) define('__PROXY_SERVER__', null); - - /** - * @brief Firebug 콘솔 출력 사용시 관련 파일 require - **/ - if((__DEBUG_OUTPUT__ == 2) && version_compare(PHP_VERSION, '6.0.0') === -1) { - require _XE_PATH_.'libs/FirePHPCore/FirePHP.class.php'; - } - - /** - * @brief Set Timezone as server time - **/ - if(version_compare(PHP_VERSION, '5.3.0') >= 0) - { - date_default_timezone_set(@date_default_timezone_get()); - } - - if(!defined('__XE_LOADED_CLASS__')){ - /** - * @brief 간단하게 사용하기 위한 함수 정의한 파일 require - **/ - require(_XE_PATH_.'config/func.inc.php'); - - if(__DEBUG__) define('__StartTime__', getMicroTime()); - - /** - * @brief 기본적인 class 파일 include - * @TODO : PHP5 기반으로 바꾸게 되면 _autoload()를 이용할 수 있기에 제거 대상 - **/ - if(__DEBUG__) define('__ClassLoadStartTime__', getMicroTime()); - 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/cache/CacheHandler.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'); - require(_XE_PATH_.'classes/mobile/Mobile.class.php'); - if(__DEBUG__) $GLOBALS['__elapsed_class_load__'] = getMicroTime() - __ClassLoadStartTime__; - } -?> + + */ + if(file_exists(_XE_PATH_.'config/config.user.inc.php')) { + require _XE_PATH_.'config/config.user.inc.php'; + } + + /** + * @brief 디버깅 메시지 출력 (비트 값) + * 0 : 디버그 메시지를 생성/ 출력하지 않음 + * 1 : debugPrint() 함수를 통한 메시지 출력 + * 2 : 소요시간, Request/Response info 출력 + * 4 : DB 쿼리 내역 출력 + **/ + if(!defined('__DEBUG__')) define('__DEBUG__', 0); + + /** + * @brief 디버그 메세지의 출력 장소 + * 0 : files/_debug_message.php 에 연결하여 출력 + * 1 : HTML 최하단에 주석으로 출력 (Response Method가 HTML 일 때) + * 2 : Firebug 콘솔에 출력 (PHP 4 & 5. Firebug/FirePHP 플러그인 필요) + **/ + if(!defined('__DEBUG_OUTPUT__')) define('__DEBUG_OUTPUT__', 0); + + /** + * @brief FirePHP 콘솔 및 브라우저 주석 출력 보안 + * 0 : 제한 없음 (권장하지 않음) + * 1 : 지정한 IP 주소에만 허용 + **/ + if(!defined('__DEBUG_PROTECT__')) define('__DEBUG_PROTECT__', 1); + if(!defined('__DEBUG_PROTECT_IP__')) define('__DEBUG_PROTECT_IP__', '127.0.0.1'); + + /** + * @brief DB 오류 메세지 출력 정의 + * 0 : 출력하지 않음 + * 1 : files/_debug_db_query.php 에 연결하여 출력 + **/ + if(!defined('__DEBUG_DB_OUTPUT__')) define('__DEBUG_DB_OUTPUT__', 0); + + /** + * @brief DB 쿼리중 정해진 시간을 넘기는 쿼리의 로그 남김 + * 0 : 로그를 남기지 않음 + * 0 이상 : 단위를 초로 하여 지정된 초 이상의 실행시간이 걸린 쿼리를 로그로 남김 + * 로그파일은 ./files/_db_slow_query.php 파일로 저장됨 + **/ + if(!defined('__LOG_SLOW_QUERY__')) define('__LOG_SLOW_QUERY__', 0); + + /** + * @brief DB 쿼리 정보를 남김 + * 0 : 쿼리에 정보를 추가하지 않음 + * 1 : XML Query ID를 쿼리 주석으로 남김 + **/ + if(!defined('__DEBUG_QUERY__')) define('__DEBUG_QUERY__', 0); + + /** + * @brief ob_gzhandler를 이용한 압축 기능을 강제로 사용하거나 끄는 옵션 + * 0 : 사용하지 않음 + * 1 : 사용함 + * 대부분의 서버에서는 문제가 없는데 특정 서버군에서 압축전송시 IE에서 오동작을 일으키는경우가 있음 + **/ + if(!defined('__OB_GZHANDLER_ENABLE__')) define('__OB_GZHANDLER_ENABLE__', 1); + + /** + * @brief php unit test (경로/tests/index.php) 의 실행 유무 지정 + * 0 : 사용하지 않음 + * 1 : 사용함 + **/ + if(!defined('__ENABLE_PHPUNIT_TEST__')) define('__ENABLE_PHPUNIT_TEST__', 0); + + /** + * @brief __PROXY_SERVER__ 는 대상 서버를 거쳐서 외부 요청을 하도록 하는 서버의 정보를 가지고 있음 + * FileHandler::getRemoteResource 에서 이 상수를 사용함 + **/ + if(!defined('__PROXY_SERVER__')) define('__PROXY_SERVER__', null); + + /** + * @brief Firebug 콘솔 출력 사용시 관련 파일 require + **/ + if((__DEBUG_OUTPUT__ == 2) && version_compare(PHP_VERSION, '6.0.0') === -1) { + require _XE_PATH_.'libs/FirePHPCore/FirePHP.class.php'; + } + + /** + * @brief Set Timezone as server time + **/ + if(version_compare(PHP_VERSION, '5.3.0') >= 0) + { + date_default_timezone_set(@date_default_timezone_get()); + } + + if(!defined('__XE_LOADED_CLASS__')){ + /** + * @brief 간단하게 사용하기 위한 함수 정의한 파일 require + **/ + require(_XE_PATH_.'config/func.inc.php'); + + if(__DEBUG__) define('__StartTime__', getMicroTime()); + + /** + * @brief 기본적인 class 파일 include + * @TODO : PHP5 기반으로 바꾸게 되면 _autoload()를 이용할 수 있기에 제거 대상 + **/ + if(__DEBUG__) define('__ClassLoadStartTime__', getMicroTime()); + 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/cache/CacheHandler.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'); + require(_XE_PATH_.'classes/mobile/Mobile.class.php'); + if(__DEBUG__) $GLOBALS['__elapsed_class_load__'] = getMicroTime() - __ClassLoadStartTime__; + } +?> diff --git a/config/func.inc.php b/config/func.inc.php index e1cff33ce..d3c206396 100644 --- a/config/func.inc.php +++ b/config/func.inc.php @@ -1,979 +1,979 @@ - '[GMT -12:00] Baker Island Time', - '-1100' => '[GMT -11:00] Niue Time, Samoa Standard Time', - '-1000' => '[GMT -10:00] Hawaii-Aleutian Standard Time, Cook Island Time', - '-0930' => '[GMT -09:30] Marquesas Islands Time', - '-0900' => '[GMT -09:00] Alaska Standard Time, Gambier Island Time', - '-0800' => '[GMT -08:00] Pacific Standard Time', - '-0700' => '[GMT -07:00] Mountain Standard Time', - '-0600' => '[GMT -06:00] Central Standard Time', - '-0500' => '[GMT -05:00] Eastern Standard Time', - '-0400' => '[GMT -04:00] Atlantic Standard Time', - '-0330' => '[GMT -03:30] Newfoundland Standard Time', - '-0300' => '[GMT -03:00] Amazon Standard Time, Central Greenland Time', - '-0200' => '[GMT -02:00] Fernando de Noronha Time, South Georgia & the South Sandwich Islands Time', - '-0100' => '[GMT -01:00] Azores Standard Time, Cape Verde Time, Eastern Greenland Time', - '0000' => '[GMT 00:00] Western European Time, Greenwich Mean Time', - '+0100' => '[GMT +01:00] Central European Time, West African Time', - '+0200' => '[GMT +02:00] Eastern European Time, Central African Time', - '+0300' => '[GMT +03:00] Moscow Standard Time, Eastern African Time', - '+0330' => '[GMT +03:30] Iran Standard Time', - '+0400' => '[GMT +04:00] Gulf Standard Time, Samara Standard Time', - '+0430' => '[GMT +04:30] Afghanistan Time', - '+0500' => '[GMT +05:00] Pakistan Standard Time, Yekaterinburg Standard Time', - '+0530' => '[GMT +05:30] Indian Standard Time, Sri Lanka Time', - '+0545' => '[GMT +05:45] Nepal Time', - '+0600' => '[GMT +06:00] Bangladesh Time, Bhutan Time, Novosibirsk Standard Time', - '+0630' => '[GMT +06:30] Cocos Islands Time, Myanmar Time', - '+0700' => '[GMT +07:00] Indochina Time, Krasnoyarsk Standard Time', - '+0800' => '[GMT +08:00] Chinese Standard Time, Australian Western Standard Time, Irkutsk Standard Time', - '+0845' => '[GMT +08:45] Southeastern Western Australia Standard Time', - '+0900' => '[GMT +09:00] Korea Standard Time, Japan Standard Time, China Standard Time', - '+0930' => '[GMT +09:30] Australian Central Standard Time', - '+1000' => '[GMT +10:00] Australian Eastern Standard Time, Vladivostok Standard Time', - '+1030' => '[GMT +10:30] Lord Howe Standard Time', - '+1100' => '[GMT +11:00] Solomon Island Time, Magadan Standard Time', - '+1130' => '[GMT +11:30] Norfolk Island Time', - '+1200' => '[GMT +12:00] New Zealand Time, Fiji Time, Kamchatka Standard Time', - '+1245' => '[GMT +12:45] Chatham Islands Time', - '+1300' => '[GMT +13:00] Tonga Time, Phoenix Islands Time', - '+1400' => '[GMT +14:00] Line Island Time' - ) ; - - /** - * @brief ModuleHandler::getModuleObject($module_name, $type)을 쓰기 쉽게 함수로 선언 - * @param module_name 모듈이름 - * @param type disp, proc, controller, class - * @param kind admin, null - * @return module instance - **/ - function &getModule($module_name, $type = 'view', $kind = '') { - return ModuleHandler::getModuleInstance($module_name, $type, $kind); - } - - /** - * @brief module의 controller 객체 생성용 - * @param module_name 모듈이름 - * @return module controller instance - **/ - function &getController($module_name) { - return getModule($module_name, 'controller'); - } - - /** - * @brief module의 admin controller 객체 생성용 - * @param module_name 모듈이름 - * @return module admin controller instance - **/ - function &getAdminController($module_name) { - return getModule($module_name, 'controller','admin'); - } - - /** - * @brief module의 view 객체 생성용 - * @param module_name 모듈이름 - * @return module view instance - **/ - function &getView($module_name) { - return getModule($module_name, 'view'); - } - - /** - * @brief module의 mobile 객체 생성용 - * @param module_name 모듈이름 - * @return module mobile instance - **/ - function &getMobile($module_name) { - return getModule($module_name, 'mobile'); - } - - /** - * @brief module의 admin view 객체 생성용 - * @param module_name 모듈이름 - * @return module admin view instance - **/ - function &getAdminView($module_name) { - return getModule($module_name, 'view','admin'); - } - - /** - * @brief module의 model 객체 생성용 - * @param module_name 모듈이름 - * @return module model instance - **/ - function &getModel($module_name) { - return getModule($module_name, 'model'); - } - - /** - * @brief module의 admin model 객체 생성용 - * @param module_name 모듈이름 - * @return module admin model instance - **/ - function &getAdminModel($module_name) { - return getModule($module_name, 'model','admin'); - } - - /** - * @brief module의 api 객체 생성용 - * @param module_name 모듈이름 - * @return module api class instance - **/ - function &getAPI($module_name) { - return getModule($module_name, 'api'); - } - - /** - * @brief module의 wap 객체 생성용 - * @param module_name 모듈이름 - * @return module wap class instance - **/ - function &getWAP($module_name) { - return getModule($module_name, 'wap'); - } - - /** - * @brief module의 상위 class 객체 생성용 - * @param module_name 모듈이름 - * @return module class instance - **/ - function &getClass($module_name) { - return getModule($module_name, 'class'); - } - - /** - * @brief DB::executeQuery() 의 alias - * @param query_id 쿼리 ID ( 모듈명.쿼리XML파일 ) - * @param args object 변수로 선언된 인자값 - * @return 처리결과 - **/ - function executeQuery($query_id, $args = null) { - $oDB = &DB::getInstance(); - return $oDB->executeQuery($query_id, $args); - } - - /** - * @brief DB::executeQuery() 의 결과값을 무조건 배열로 처리하도록 하는 함수 - * @param query_id 쿼리 ID ( 모듈명.쿼리XML파일 ) - * @param args object 변수로 선언된 인자값 - * @return 처리결과 - **/ - function executeQueryArray($query_id, $args = null) { - $oDB = &DB::getInstance(); - $output = $oDB->executeQuery($query_id, $args); - if(!is_array($output->data) && count($output->data) > 0){ - $output->data = array($output->data); - } - return $output; - } - - /** - * @brief DB::getNextSequence() 의 alias - * @return big int - **/ - function getNextSequence() { - $oDB = &DB::getInstance(); - return $oDB->getNextSequence(); - } - - /** - * @brief Context::getUrl()를 쓰기 쉽게 함수로 선언 - * @return string - * - * getUrl()은 현재 요청된 RequestURI에 주어진 인자의 값으로 변형하여 url을 리턴한다\n - * 1. 인자는 (key, value)... 의 형식으로 주어져야 한다.\n - * ex) getUrl('key1','val1', 'key2', '') : key1, key2를 val1과 '' 로 변형\n - * 2. 아무런 인자가 없으면 argument를 제외한 url을 리턴 - * 3. 첫 인자값이 '' 이면 RequestUri에다가 추가된 args_list로 url을 만듬 - **/ - function getUrl() { - $num_args = func_num_args(); - $args_list = func_get_args(); - - if(!$num_args) return Context::getRequestUri(); - - return Context::getUrl($num_args, $args_list); - } - - function getNotEncodedUrl() { - $num_args = func_num_args(); - $args_list = func_get_args(); - - if(!$num_args) return Context::getRequestUri(); - - return Context::getUrl($num_args, $args_list, null, false); - } - - /** - * @brief getUrl()의 값에 request uri를 추가하여 reutrn - * full url을 얻기 위함 - **/ - function getFullUrl() { - $num_args = func_num_args(); - $args_list = func_get_args(); - $request_uri = Context::getRequestUri(); - if(!$num_args) return $request_uri; - - $url = Context::getUrl($num_args, $args_list); - if(!preg_match('/^http/i',$url)){ - preg_match('/^(http|https):\/\/([^\/]+)\//',$request_uri,$match); - return substr($match[0],0,-1).$url; - } - return $url; - } - - function getNotEncodedFullUrl() { - $num_args = func_num_args(); - $args_list = func_get_args(); - $request_uri = Context::getRequestUri(); - if(!$num_args) return $request_uri; - - $url = Context::getUrl($num_args, $args_list); - if(!preg_match('/^http/i',$url)){ - preg_match('/^(http|https):\/\/([^\/]+)\//',$request_uri,$match); - $url = Context::getUrl($num_args, $args_list, null, false); - return substr($match[0],0,-1).$url; - } - return $url; - } - - /** - * @brief Context::getUrl()를 쓰기 쉽게 함수로 선언 - * @return string - * - * getSiteUrl()은 지정된 도메인에 대해 주어진 인자의 값으로 변형하여 url을 리턴한다\n - * 첫 인자는 도메인(http://등이 제외된)+path 여야 함. - **/ - function getSiteUrl() { - $num_args = func_num_args(); - $args_list = func_get_args(); - - if(!$num_args) return Context::getRequestUri(); - - $domain = array_shift($args_list); - $num_args = count($args_list); - - return Context::getUrl($num_args, $args_list, $domain); - } - - function getNotEncodedSiteUrl() { - $num_args = func_num_args(); - $args_list = func_get_args(); - - if(!$num_args) return Context::getRequestUri(); - - $domain = array_shift($args_list); - $num_args = count($args_list); - - return Context::getUrl($num_args, $args_list, $domain, false); - } - - /** - * @brief getSiteUrl()의 값에 request uri를 추가하여 reutrn - * full url을 얻기 위함 - **/ - function getFullSiteUrl() { - $num_args = func_num_args(); - $args_list = func_get_args(); - - $request_uri = Context::getRequestUri(); - if(!$num_args) return $request_uri; - - $domain = array_shift($args_list); - $num_args = count($args_list); - - $url = Context::getUrl($num_args, $args_list, $domain); - if(!preg_match('/^http/i',$url)){ - preg_match('/^(http|https):\/\/([^\/]+)\//',$request_uri,$match); - return substr($match[0],0,-1).$url; - } - return $url; - } - - /** - * @brief 가상사이트의 Domain이 url형식인지 site id인지 return - **/ - function isSiteID($domain) { - return preg_match('/^([a-z0-9\_]+)$/i', $domain); - } - - /** - * @brief 주어진 문자를 주어진 크기로 자르고 잘라졌을 경우 주어진 꼬리를 담 - * @param string 자를 원 문자열 - * @param cut_size 주어진 원 문자열을 자를 크기 - * @param tail 잘라졌을 경우 문자열의 제일 뒤에 붙을 꼬리 - * @return string - **/ - function cut_str($string,$cut_size=0,$tail = '...') { - if($cut_size<1 || !$string) return $string; - - $chars = Array(12, 4, 3, 5, 7, 7, 11, 8, 4, 5, 5, 6, 6, 4, 6, 4, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 4, 4, 8, 6, 8, 6, 10, 8, 8, 9, 8, 8, 7, 9, 8, 3, 6, 7, 7, 11, 8, 9, 8, 9, 8, 8, 7, 8, 8, 10, 8, 8, 8, 6, 11, 6, 6, 6, 4, 7, 7, 7, 7, 7, 3, 7, 7, 3, 3, 6, 3, 9, 7, 7, 7, 7, 4, 7, 3, 7, 6, 10, 6, 6, 7, 6, 6, 6, 9); - $max_width = $cut_size*$chars[0]/2; - $char_width = 0; - - $string_length = strlen($string); - $char_count = 0; - - $idx = 0; - while($idx < $string_length && $char_count < $cut_size && $char_width <= $max_width) { - $c = ord(substr($string, $idx,1)); - $char_count++; - if($c<128) { - $char_width += (int)$chars[$c-32]; - $idx++; - } - else if (191<$c && $c < 224) { - $char_width += $chars[4]; - $idx += 2; - } - else { - $char_width += $chars[0]; - $idx += 3; - } - } - $output = substr($string,0,$idx); - if(strlen($output)<$string_length) $output .= $tail; - return $output; - } - - function zgap() { - $time_zone = $GLOBALS['_time_zone']; - if($time_zone < 0) $to = -1; else $to = 1; - $t_hour = substr($time_zone, 1, 2) * $to; - $t_min = substr($time_zone, 3, 2) * $to; - - $server_time_zone = date("O"); - if($server_time_zone < 0) $so = -1; else $so = 1; - $c_hour = substr($server_time_zone, 1, 2) * $so; - $c_min = substr($server_time_zone, 3, 2) * $so; - - $g_min = $t_min - $c_min; - $g_hour = $t_hour - $c_hour; - - $gap = $g_min*60 + $g_hour*60*60; - return $gap; - } - - /** - * @brief YYYYMMDDHHIISS 형식의 시간값을 unix time으로 변경 - * @param str YYYYMMDDHHIISS 형식의 시간값 - * @return int - **/ - function ztime($str) { - if(!$str) return; - $hour = (int)substr($str,8,2); - $min = (int)substr($str,10,2); - $sec = (int)substr($str,12,2); - $year = (int)substr($str,0,4); - $month = (int)substr($str,4,2); - $day = (int)substr($str,6,2); - if(strlen($str) <= 8) { - $gap = 0; - } else { - $gap = zgap(); - } - - return mktime($hour, $min, $sec, $month?$month:1, $day?$day:1, $year)+$gap; - } - - /** - * @brief YmdHis의 시간 형식을 지금으로 부터 몇분/몇시간전, 1일 이상 차이나면 format string return - **/ - function getTimeGap($date, $format = 'Y.m.d') { - $gap = time() - ztime($date); - - $lang_time_gap = Context::getLang('time_gap'); - if($gap<60) $buff = sprintf($lang_time_gap['min'], (int)($gap / 60)+1); - elseif($gap<60*60) $buff = sprintf($lang_time_gap['mins'], (int)($gap / 60)+1); - elseif($gap<60*60*2) $buff = sprintf($lang_time_gap['hour'], (int)($gap / 60 /60)+1); - elseif($gap<60*60*24) $buff = sprintf($lang_time_gap['hours'], (int)($gap / 60 /60)+1); - else $buff = zdate($date, $format); - return $buff; - } - - /** - * @brief 월이름을 return - **/ - function getMonthName($month, $short = true) { - $short_month = array('','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'); - $long_month = array('','January','February','March','April','May','June','July','August','September','October','November','December'); - return !$short?$long_month[$month]:$short_month[$month]; - } - - /** - * @brief YYYYMMDDHHIISS 형식의 시간값을 원하는 시간 포맷으로 변형 - * @param string|int str YYYYMMDDHHIISS 형식의 시간 값 - * @param string format php date()함수의 시간 포맷 - * @param bool conversion 언어에 따라 날짜 포맷의 자동변환 여부 - * @return string - **/ - function zdate($str, $format = 'Y-m-d H:i:s', $conversion=true) { - // 대상 시간이 없으면 null return - if(!$str) return; - - // 언어권에 따라서 지정된 날짜 포맷을 변경 - if($conversion == true) { - switch(Context::getLangType()) { - case 'en' : - case 'es' : - if($format == 'Y-m-d') $format = 'M d, Y'; - elseif($format == 'Y-m-d H:i:s') $format = 'M d, Y H:i:s'; - elseif($format == 'Y-m-d H:i') $format = 'M d, Y H:i'; - break; - case 'vi' : - if($format == 'Y-m-d') $format = 'd-m-Y'; - elseif($format == 'Y-m-d H:i:s') $format = 'H:i:s d-m-Y'; - elseif($format == 'Y-m-d H:i') $format = 'H:i d-m-Y'; - break; - - } - } - - // 년도가 1970년 이전이면 별도 처리 - if((int)substr($str,0,4) < 1970) { - $hour = (int)substr($str,8,2); - $min = (int)substr($str,10,2); - $sec = (int)substr($str,12,2); - $year = (int)substr($str,0,4); - $month = (int)substr($str,4,2); - $day = (int)substr($str,6,2); - - // leading zero? - $lz = create_function('$n', 'return ($n>9?"":"0").$n;'); - - $trans = array( - 'Y'=>$year, - 'y'=>$lz($year%100), - 'm'=>$lz($month), - 'n'=>$month, - 'd'=>$lz($day), - 'j'=>$day, - 'G'=>$hour, - 'H'=>$lz($hour), - 'g'=>$hour%12, - 'h'=>$lz($hour%12), - 'i'=>$lz($min), - 's'=>$lz($sec), - 'M'=>getMonthName($month), - 'F'=>getMonthName($month,false) - ); - - $string = strtr($format, $trans); - } else { - // 1970년 이후라면 ztime()함수로 unixtime을 구하고 date함수로 처리 - $string = date($format, ztime($str)); - } - - // 요일, am/pm을 각 언어에 맞게 변경 - $unit_week = Context::getLang('unit_week'); - $unit_meridiem = Context::getLang('unit_meridiem'); - $string = str_replace(array('Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'),$unit_week, $string); - $string = str_replace(array('am','pm','AM','PM'), $unit_meridiem, $string); - return $string; - } - - /** - * @brief prints debug messages - * @param debug_output target object to be printed - * @param display_line boolean flag whether to print seperator (default:true) - * @return none - * - * ./files/_debug_message.php 파일에 $buff 내용을 출력한다. - * tail -f ./files/_debug_message.php 하여 계속 살펴 볼 수 있다 - **/ - function debugPrint($debug_output = null, $display_option = true, $file = '_debug_message.php') { - if(!(__DEBUG__ & 1)) return; - - static $firephp; - $bt = debug_backtrace(); - if(is_array($bt)) $first = array_shift($bt); - $file_name = array_pop(explode(DIRECTORY_SEPARATOR, $first['file'])); - $line_num = $first['line']; - - if(__DEBUG_OUTPUT__ == 2 && version_compare(PHP_VERSION, '6.0.0') === -1) { - if(!isset($firephp)) $firephp = FirePHP::getInstance(true); - if(function_exists("memory_get_usage")) - { - $label = sprintf('[%s:%d] (m:%s)', $file_name, $line_num, FileHandler::filesize(memory_get_usage())); - } - else - { - $label = sprintf('[%s:%d] ', $file_name, $line_num); - } - - // FirePHP 옵션 체크 - if($display_option === 'TABLE') $label = $display_option; - - // __DEBUG_PROTECT__ 옵션으로 지정된 IP와 접근 IP가 동일한지 체크 - if(__DEBUG_PROTECT__ === 1 && __DEBUG_PROTECT_IP__ != $_SERVER['REMOTE_ADDR']) { - $debug_output = 'The IP address is not allowed. Change the value of __DEBUG_PROTECT_IP__ into your IP address in config/config.user.inc.php or config/config.inc.php'; - $label = null; - } - - $firephp->fb($debug_output, $label); - - } else { - if(__DEBUG_PROTECT__ === 1 && __DEBUG_PROTECT_IP__ != $_SERVER['REMOTE_ADDR']) { - return; - } - $debug_file = _XE_PATH_.'files/'.$file; - if(function_exists("memory_get_usage")) - { - $debug_output = sprintf("[%s %s:%d] - mem(%s)\n%s\n", date('Y-m-d H:i:s'), $file_name, $line_num, FileHandler::filesize(memory_get_usage()), print_r($debug_output, true)); - } - else - { - $debug_output = sprintf("[%s %s:%d]\n%s\n", date('Y-m-d H:i:s'), $file_name, $line_num, print_r($debug_output, true)); - } - - if($display_option === true) $debug_output = str_repeat('=', 40)."\n".$debug_output.str_repeat('-', 40); - $debug_output = "\n\n"; - - if(@!$fp = fopen($debug_file, 'a')) return; - fwrite($fp, $debug_output); - fclose($fp); - } - } - - - /** - * @brief microtime() return - * @return float - **/ - function getMicroTime() { - list($time1, $time2) = explode(' ', microtime()); - return (float)$time1 + (float)$time2; - } - - /** - * @brief 첫번째 인자로 오는 object var에서 2번째 object의 var들을 제거 - * @param target_obj 원 object - * @param del_obj 원 object의 vars에서 del_obj의 vars를 제거한다 - * @return object - **/ - function delObjectVars($target_obj, $del_obj) { - if(!is_object($target_obj)) return; - if(!is_object($del_obj)) return; - - $target_vars = get_object_vars($target_obj); - $del_vars = get_object_vars($del_obj); - - $target = array_keys($target_vars); - $del = array_keys($del_vars); - if(!count($target)||!count($del)) return $target_obj; - - $return_obj = NULL; - - $target_count = count($target); - for($i = 0; $i < $target_count; $i++) { - $target_key = $target[$i]; - if(!in_array($target_key, $del)) $return_obj->{$target_key} = $target_obj->{$target_key}; - } - - return $return_obj; - } - - /** - * @brief php5 이상에서 error_handing을 debugPrint로 변경 - * @param errno - * @param errstr - * @return file - * @return line - **/ - function handleError($errno, $errstr, $file, $line) { - if(!__DEBUG__) return; - $errors = array(E_USER_ERROR, E_ERROR, E_PARSE); - if(!in_array($errno, $errors)) return; - - $output = sprintf("Fatal error : %s - %d", $file, $line); - $output .= sprintf("%d - %s", $errno, $errstr); - - debugPrint($output); - } - - /** - * @brief 주어진 숫자를 주어진 크기로 recursive하게 잘라줌 - * @param no 주어진 숫자 - * @param size 잘라낼 크기 - **/ - function getNumberingPath($no, $size=3) { - $mod = pow(10, $size); - $output = sprintf('%0'.$size.'d/', $no%$mod); - if($no >= $mod) $output .= getNumberingPath((int)$no/$mod, $size); - return $output; - } - - /** - * @brief 한글이 들어간 url의 decode - **/ - function url_decode($str) { - return preg_replace('/%u([[:alnum:]]{4})/', '&#x\\1;',$str); - } - - /** - * @brief 해킹 시도로 의심되는 코드들을 미리 차단 - **/ - function removeHackTag($content) { - // 특정 태그들을 일반 문자로 변경 - $content = preg_replace('/<(\/?)(iframe|script|meta|style|applet|link|base|html|body)/is', '<$1$2', $content); - - /** - * 이미지나 동영상등의 태그에서 src에 관리자 세션을 악용하는 코드를 제거 - * - 취약점 제보 : 김상원님 - **/ - $content = preg_replace_callback("!<(/?)([a-z]+)(.*?)>!is", removeSrcHack, $content); - - // xmp tag 확인 및 추가 - $content = checkXmpTag($content); - - return $content; - } - - /** - * @brief xmp tag 확인 및 닫히지 않은 경우 추가 - **/ - function checkXmpTag($content) { - if(($start_xmp = strrpos($content, '')) !==false) { - if(($close_xmp = strrpos($content, '')) === false) $content .= ''; - else if($close_xmp < $start_xmp) $content .= ''; - } - - return $content; - } - - function removeSrcHack($matches) { - $tag = strtolower(trim($matches[2])); - - // xmp tag 정리 - if($tag=='xmp') return '<'.$matches[1].'xmp>'; - if($matches[1]=='/') return $matches[0]; - - //$buff = trim(preg_replace('/(\/>|>)/','/>',$matches[0])); - $buff = $matches[0]; - $buff = str_replace(array('&','&'),array('&','&'),$buff); - $buff = preg_replace_callback('/([^=^"^ ]*)=([^ ^>]*)/i', 'fixQuotation', $buff); - - $oXmlParser = new XmlParser(); - $xml_doc = $oXmlParser->parse($buff); - if(!$xml_doc) return sprintf("<%s>", $tag); - - // src값에 module=admin이라는 값이 입력되어 있으면 이 값을 무효화 시킴 - $src = $xml_doc->attrs->src; - $dynsrc = $xml_doc->attrs->dynsrc; - $lowsrc = $xml_doc->attrs->lowsrc; - $href = $xml_doc->attrs->href; - $data = $xml_doc->attrs->data; - $background = $xml_doc->attrs->background; - $style = $xml_doc->attrs->style; - if($style) { - $url = preg_match_all('/url\s*\(([^\)]+)\)/is', $style, $matches2); - if(count($matches2[0])) - { - foreach($matches2[1] as $target) - { - if(_isHackedSrc($target)) return sprintf("<%s>",$tag); - } - } - } - if(_isHackedSrc($src) || _isHackedSrc($dynsrc) || _isHackedSrc($lowsrc) || _isHackedSrc($href) || _isHackedSrc($data) || _isHackedSrc($background) || _isHackedSrcExp($style)) return sprintf("<%s>",$tag); - - if($tag=='param' && $xml_doc->attrs->value && preg_match('/^javascript:/i',$xml_doc->attrs->value)) return sprintf("<%s>",$tag); - if($tag=='object' && $xml_doc->attrs->data && preg_match('/^javascript:/i',$xml_doc->attrs->data)) return sprintf("<%s>",$tag); - - return $buff; - } - - function _isHackedSrcExp($style) { - if(!$style) return false; - if(preg_match('/((\/\*)|(\*\/)|(\\n)|(expression))/i', $style)) return true; - return false; - } - - function _isHackedSrc($src) { - if(!$src) return false; - if($src) { - $target = trim($src); - if(preg_match('/(\s|(\&\#)|(script:))/i', $target)) return true; - if(preg_match('/data:/i', $target)) return true; - - $url_info = parse_url($src); - $query = $url_info['query']; - if(!trim($query)) return false; - $query = str_replace("&","&",$query); - $queries = explode('&', $query); - $cnt = count($queries); - for($i=0;$i<$cnt;$i++) { - $tmp_str = strtolower(trim($queries[$i])); - $pos = strpos($tmp_str,'='); - if($pos === false) continue; - $key = strtolower(trim(substr($tmp_str, 0, $pos))); - $val = strtolower(trim(substr($tmp_str,$pos+1))); - if( ($key=='module'&&$val=='admin') || ($key=='act'&&preg_match('/admin/i',$val)) ) return true; - } - } - return false; - } - - /** - * @brief attribute의 value를 " 로 둘러싸도록 처리하는 함수 - **/ - function fixQuotation($matches) { - $key = $matches[1]; - $val = trim($matches[2]); - - $close_tag = false; - if(substr($val,-1)=='/') { - $close_tag = true; - $val = rtrim(substr($val,0,-1)); - } - - if($val{0}=="'" && substr($val,-1)=="'") - { - $val = sprintf('"%s"', substr($val,1,-1)); - } - - if($close_tag) $val .= ' /'; - - // attribute on* remove - if(preg_match('/^on([a-z]+)/i',preg_replace('/[^a-zA-Z_]/','',$key))) return ''; - - $output = sprintf('%s=%s', $key, $val); - - return $output; - } - - // hexa값을 RGB로 변환 - if(!function_exists('hexrgb')) { - function hexrgb($hexstr) { - $int = hexdec($hexstr); - - return array('red' => 0xFF & ($int >> 0x10), - 'green' => 0xFF & ($int >> 0x8), - 'blue' => 0xFF & $int); - } - - } - - /** - * @brief mysql old_password 의 php 구현 함수 - * 제로보드4나 기타 mysql4.1 이전의 old_password()함수를 쓴 데이터의 사용을 위해서 - * mysql의 password.c 소스 참조해서 구현함 - **/ - function mysql_pre4_hash_password($password) { - $nr = 1345345333; - $add = 7; - $nr2 = 0x12345671; - - settype($password, "string"); - - for ($i=0; $i>6)+192).chr(($num&63)+128); - if($num<65536)return chr(($num>>12)+224).chr((($num>>6)&63)+128).chr(($num&63)+128); - if($num<2097152)return chr(($num>>18)+240).chr((($num>>12)&63)+128).chr((($num>>6)&63)+128) .chr(($num&63)+128); - return ''; - } - - - function detectUTF8($string, $return_convert = false, $urldecode = true) { - if($urldecode) $string = urldecode($string); - - $sample = iconv('utf-8', 'utf-8', $string); - $is_utf8 = (md5($sample) == md5($string)); - - if(!$urldecode) $string = urldecode($string); - - if($return_convert) return ($is_utf8) ? $string : iconv('euc-kr', 'utf-8', $string); - - return $is_utf8; - } - - - function json_encode2($data) { - switch (gettype($data)) { - case 'boolean': - return $data?'true':'false'; - case 'integer': - case 'double': - return $data; - case 'string': - return '"'.strtr($data, array('\\'=>'\\\\','"'=>'\\"')).'"'; - case 'object': - $data = get_object_vars($data); - case 'array': - $rel = false; // relative array? - $key = array_keys($data); - foreach ($key as $v) { - if (!is_int($v)) { - $rel = true; - break; - } - } - - $arr = array(); - foreach ($data as $k=>$v) { - $arr[] = ($rel?'"'.strtr($k, array('\\'=>'\\\\','"'=>'\\"')).'":':'').json_encode2($v); - } - - return $rel?'{'.join(',', $arr).'}':'['.join(',', $arr).']'; - default: - return '""'; - } - } - - - function isCrawler($agent = null) { - if(!$agent) $agent = $_SERVER['HTTP_USER_AGENT']; - $check_agent = array('bot', 'spider', 'google', 'yahoo', 'daum', 'teoma', 'fish', 'hanrss', 'facebook'); - $check_ip = array( - '211.245.21.11*' /* mixsh */ - ); - - foreach($check_agent as $str) { - if(stristr($agent, $str) != FALSE) return true; - } - - $check_ip = '/^('.implode($check_ip, '|').')/'; - $check_ip = str_replace('.', '\.', $check_ip); - $check_ip = str_replace('*', '.+', $check_ip); - $check_ip = str_replace('?', '.?', $check_ip); - - if(preg_match($check_ip, $_SERVER['REMOTE_ADDR'], $matches)) return true; - - return false; - } - - function stripEmbedTagForAdmin(&$content, $writer_member_srl) - { - if(!Context::get('is_logged')) return; - $oModuleModel = &getModel('module'); - $logged_info = Context::get('logged_info'); - - if($writer_member_srl != $logged_info->member_srl && ($logged_info->is_admin == "Y" || $oModuleModel->isSiteAdmin($logged_info)) ) - { - if($writer_member_srl) - { - $oMemberModel =& getModel('member'); - $member_info = $oMemberModel->getMemberInfoByMemberSrl($writer_member_srl); - if($member_info->is_admin == "Y") - { - return; - } - } - $security_msg = "

".Context::getLang('security_warning_embed')."

"; - $content = preg_replace('/]+>(.*?<\/object>)?/is', $security_msg, $content); - $content = preg_replace('/]+>(\s*<\/embed>)?/is', $security_msg, $content); - $content = preg_replace('/]+editor_component="multimedia_link"[^>]*>(\s*<\/img>)?/is', $security_msg, $content); - } - - return; - } - - function requirePear() - { - if(version_compare(PHP_VERSION, "5.3.0") < 0) - { - set_include_path(_XE_PATH_."libs/PEAR"); - } - else - { - set_include_path(_XE_PATH_."libs/PEAR.1.9"); - - } - } - -?> + '[GMT -12:00] Baker Island Time', + '-1100' => '[GMT -11:00] Niue Time, Samoa Standard Time', + '-1000' => '[GMT -10:00] Hawaii-Aleutian Standard Time, Cook Island Time', + '-0930' => '[GMT -09:30] Marquesas Islands Time', + '-0900' => '[GMT -09:00] Alaska Standard Time, Gambier Island Time', + '-0800' => '[GMT -08:00] Pacific Standard Time', + '-0700' => '[GMT -07:00] Mountain Standard Time', + '-0600' => '[GMT -06:00] Central Standard Time', + '-0500' => '[GMT -05:00] Eastern Standard Time', + '-0400' => '[GMT -04:00] Atlantic Standard Time', + '-0330' => '[GMT -03:30] Newfoundland Standard Time', + '-0300' => '[GMT -03:00] Amazon Standard Time, Central Greenland Time', + '-0200' => '[GMT -02:00] Fernando de Noronha Time, South Georgia & the South Sandwich Islands Time', + '-0100' => '[GMT -01:00] Azores Standard Time, Cape Verde Time, Eastern Greenland Time', + '0000' => '[GMT 00:00] Western European Time, Greenwich Mean Time', + '+0100' => '[GMT +01:00] Central European Time, West African Time', + '+0200' => '[GMT +02:00] Eastern European Time, Central African Time', + '+0300' => '[GMT +03:00] Moscow Standard Time, Eastern African Time', + '+0330' => '[GMT +03:30] Iran Standard Time', + '+0400' => '[GMT +04:00] Gulf Standard Time, Samara Standard Time', + '+0430' => '[GMT +04:30] Afghanistan Time', + '+0500' => '[GMT +05:00] Pakistan Standard Time, Yekaterinburg Standard Time', + '+0530' => '[GMT +05:30] Indian Standard Time, Sri Lanka Time', + '+0545' => '[GMT +05:45] Nepal Time', + '+0600' => '[GMT +06:00] Bangladesh Time, Bhutan Time, Novosibirsk Standard Time', + '+0630' => '[GMT +06:30] Cocos Islands Time, Myanmar Time', + '+0700' => '[GMT +07:00] Indochina Time, Krasnoyarsk Standard Time', + '+0800' => '[GMT +08:00] Chinese Standard Time, Australian Western Standard Time, Irkutsk Standard Time', + '+0845' => '[GMT +08:45] Southeastern Western Australia Standard Time', + '+0900' => '[GMT +09:00] Korea Standard Time, Japan Standard Time, China Standard Time', + '+0930' => '[GMT +09:30] Australian Central Standard Time', + '+1000' => '[GMT +10:00] Australian Eastern Standard Time, Vladivostok Standard Time', + '+1030' => '[GMT +10:30] Lord Howe Standard Time', + '+1100' => '[GMT +11:00] Solomon Island Time, Magadan Standard Time', + '+1130' => '[GMT +11:30] Norfolk Island Time', + '+1200' => '[GMT +12:00] New Zealand Time, Fiji Time, Kamchatka Standard Time', + '+1245' => '[GMT +12:45] Chatham Islands Time', + '+1300' => '[GMT +13:00] Tonga Time, Phoenix Islands Time', + '+1400' => '[GMT +14:00] Line Island Time' + ) ; + + /** + * @brief ModuleHandler::getModuleObject($module_name, $type)을 쓰기 쉽게 함수로 선언 + * @param module_name 모듈이름 + * @param type disp, proc, controller, class + * @param kind admin, null + * @return module instance + **/ + function &getModule($module_name, $type = 'view', $kind = '') { + return ModuleHandler::getModuleInstance($module_name, $type, $kind); + } + + /** + * @brief module의 controller 객체 생성용 + * @param module_name 모듈이름 + * @return module controller instance + **/ + function &getController($module_name) { + return getModule($module_name, 'controller'); + } + + /** + * @brief module의 admin controller 객체 생성용 + * @param module_name 모듈이름 + * @return module admin controller instance + **/ + function &getAdminController($module_name) { + return getModule($module_name, 'controller','admin'); + } + + /** + * @brief module의 view 객체 생성용 + * @param module_name 모듈이름 + * @return module view instance + **/ + function &getView($module_name) { + return getModule($module_name, 'view'); + } + + /** + * @brief module의 mobile 객체 생성용 + * @param module_name 모듈이름 + * @return module mobile instance + **/ + function &getMobile($module_name) { + return getModule($module_name, 'mobile'); + } + + /** + * @brief module의 admin view 객체 생성용 + * @param module_name 모듈이름 + * @return module admin view instance + **/ + function &getAdminView($module_name) { + return getModule($module_name, 'view','admin'); + } + + /** + * @brief module의 model 객체 생성용 + * @param module_name 모듈이름 + * @return module model instance + **/ + function &getModel($module_name) { + return getModule($module_name, 'model'); + } + + /** + * @brief module의 admin model 객체 생성용 + * @param module_name 모듈이름 + * @return module admin model instance + **/ + function &getAdminModel($module_name) { + return getModule($module_name, 'model','admin'); + } + + /** + * @brief module의 api 객체 생성용 + * @param module_name 모듈이름 + * @return module api class instance + **/ + function &getAPI($module_name) { + return getModule($module_name, 'api'); + } + + /** + * @brief module의 wap 객체 생성용 + * @param module_name 모듈이름 + * @return module wap class instance + **/ + function &getWAP($module_name) { + return getModule($module_name, 'wap'); + } + + /** + * @brief module의 상위 class 객체 생성용 + * @param module_name 모듈이름 + * @return module class instance + **/ + function &getClass($module_name) { + return getModule($module_name, 'class'); + } + + /** + * @brief DB::executeQuery() 의 alias + * @param query_id 쿼리 ID ( 모듈명.쿼리XML파일 ) + * @param args object 변수로 선언된 인자값 + * @return 처리결과 + **/ + function executeQuery($query_id, $args = null) { + $oDB = &DB::getInstance(); + return $oDB->executeQuery($query_id, $args); + } + + /** + * @brief DB::executeQuery() 의 결과값을 무조건 배열로 처리하도록 하는 함수 + * @param query_id 쿼리 ID ( 모듈명.쿼리XML파일 ) + * @param args object 변수로 선언된 인자값 + * @return 처리결과 + **/ + function executeQueryArray($query_id, $args = null) { + $oDB = &DB::getInstance(); + $output = $oDB->executeQuery($query_id, $args); + if(!is_array($output->data) && count($output->data) > 0){ + $output->data = array($output->data); + } + return $output; + } + + /** + * @brief DB::getNextSequence() 의 alias + * @return big int + **/ + function getNextSequence() { + $oDB = &DB::getInstance(); + return $oDB->getNextSequence(); + } + + /** + * @brief Context::getUrl()를 쓰기 쉽게 함수로 선언 + * @return string + * + * getUrl()은 현재 요청된 RequestURI에 주어진 인자의 값으로 변형하여 url을 리턴한다\n + * 1. 인자는 (key, value)... 의 형식으로 주어져야 한다.\n + * ex) getUrl('key1','val1', 'key2', '') : key1, key2를 val1과 '' 로 변형\n + * 2. 아무런 인자가 없으면 argument를 제외한 url을 리턴 + * 3. 첫 인자값이 '' 이면 RequestUri에다가 추가된 args_list로 url을 만듬 + **/ + function getUrl() { + $num_args = func_num_args(); + $args_list = func_get_args(); + + if(!$num_args) return Context::getRequestUri(); + + return Context::getUrl($num_args, $args_list); + } + + function getNotEncodedUrl() { + $num_args = func_num_args(); + $args_list = func_get_args(); + + if(!$num_args) return Context::getRequestUri(); + + return Context::getUrl($num_args, $args_list, null, false); + } + + /** + * @brief getUrl()의 값에 request uri를 추가하여 reutrn + * full url을 얻기 위함 + **/ + function getFullUrl() { + $num_args = func_num_args(); + $args_list = func_get_args(); + $request_uri = Context::getRequestUri(); + if(!$num_args) return $request_uri; + + $url = Context::getUrl($num_args, $args_list); + if(!preg_match('/^http/i',$url)){ + preg_match('/^(http|https):\/\/([^\/]+)\//',$request_uri,$match); + return substr($match[0],0,-1).$url; + } + return $url; + } + + function getNotEncodedFullUrl() { + $num_args = func_num_args(); + $args_list = func_get_args(); + $request_uri = Context::getRequestUri(); + if(!$num_args) return $request_uri; + + $url = Context::getUrl($num_args, $args_list); + if(!preg_match('/^http/i',$url)){ + preg_match('/^(http|https):\/\/([^\/]+)\//',$request_uri,$match); + $url = Context::getUrl($num_args, $args_list, null, false); + return substr($match[0],0,-1).$url; + } + return $url; + } + + /** + * @brief Context::getUrl()를 쓰기 쉽게 함수로 선언 + * @return string + * + * getSiteUrl()은 지정된 도메인에 대해 주어진 인자의 값으로 변형하여 url을 리턴한다\n + * 첫 인자는 도메인(http://등이 제외된)+path 여야 함. + **/ + function getSiteUrl() { + $num_args = func_num_args(); + $args_list = func_get_args(); + + if(!$num_args) return Context::getRequestUri(); + + $domain = array_shift($args_list); + $num_args = count($args_list); + + return Context::getUrl($num_args, $args_list, $domain); + } + + function getNotEncodedSiteUrl() { + $num_args = func_num_args(); + $args_list = func_get_args(); + + if(!$num_args) return Context::getRequestUri(); + + $domain = array_shift($args_list); + $num_args = count($args_list); + + return Context::getUrl($num_args, $args_list, $domain, false); + } + + /** + * @brief getSiteUrl()의 값에 request uri를 추가하여 reutrn + * full url을 얻기 위함 + **/ + function getFullSiteUrl() { + $num_args = func_num_args(); + $args_list = func_get_args(); + + $request_uri = Context::getRequestUri(); + if(!$num_args) return $request_uri; + + $domain = array_shift($args_list); + $num_args = count($args_list); + + $url = Context::getUrl($num_args, $args_list, $domain); + if(!preg_match('/^http/i',$url)){ + preg_match('/^(http|https):\/\/([^\/]+)\//',$request_uri,$match); + return substr($match[0],0,-1).$url; + } + return $url; + } + + /** + * @brief 가상사이트의 Domain이 url형식인지 site id인지 return + **/ + function isSiteID($domain) { + return preg_match('/^([a-z0-9\_]+)$/i', $domain); + } + + /** + * @brief 주어진 문자를 주어진 크기로 자르고 잘라졌을 경우 주어진 꼬리를 담 + * @param string 자를 원 문자열 + * @param cut_size 주어진 원 문자열을 자를 크기 + * @param tail 잘라졌을 경우 문자열의 제일 뒤에 붙을 꼬리 + * @return string + **/ + function cut_str($string,$cut_size=0,$tail = '...') { + if($cut_size<1 || !$string) return $string; + + $chars = Array(12, 4, 3, 5, 7, 7, 11, 8, 4, 5, 5, 6, 6, 4, 6, 4, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 4, 4, 8, 6, 8, 6, 10, 8, 8, 9, 8, 8, 7, 9, 8, 3, 6, 7, 7, 11, 8, 9, 8, 9, 8, 8, 7, 8, 8, 10, 8, 8, 8, 6, 11, 6, 6, 6, 4, 7, 7, 7, 7, 7, 3, 7, 7, 3, 3, 6, 3, 9, 7, 7, 7, 7, 4, 7, 3, 7, 6, 10, 6, 6, 7, 6, 6, 6, 9); + $max_width = $cut_size*$chars[0]/2; + $char_width = 0; + + $string_length = strlen($string); + $char_count = 0; + + $idx = 0; + while($idx < $string_length && $char_count < $cut_size && $char_width <= $max_width) { + $c = ord(substr($string, $idx,1)); + $char_count++; + if($c<128) { + $char_width += (int)$chars[$c-32]; + $idx++; + } + else if (191<$c && $c < 224) { + $char_width += $chars[4]; + $idx += 2; + } + else { + $char_width += $chars[0]; + $idx += 3; + } + } + $output = substr($string,0,$idx); + if(strlen($output)<$string_length) $output .= $tail; + return $output; + } + + function zgap() { + $time_zone = $GLOBALS['_time_zone']; + if($time_zone < 0) $to = -1; else $to = 1; + $t_hour = substr($time_zone, 1, 2) * $to; + $t_min = substr($time_zone, 3, 2) * $to; + + $server_time_zone = date("O"); + if($server_time_zone < 0) $so = -1; else $so = 1; + $c_hour = substr($server_time_zone, 1, 2) * $so; + $c_min = substr($server_time_zone, 3, 2) * $so; + + $g_min = $t_min - $c_min; + $g_hour = $t_hour - $c_hour; + + $gap = $g_min*60 + $g_hour*60*60; + return $gap; + } + + /** + * @brief YYYYMMDDHHIISS 형식의 시간값을 unix time으로 변경 + * @param str YYYYMMDDHHIISS 형식의 시간값 + * @return int + **/ + function ztime($str) { + if(!$str) return; + $hour = (int)substr($str,8,2); + $min = (int)substr($str,10,2); + $sec = (int)substr($str,12,2); + $year = (int)substr($str,0,4); + $month = (int)substr($str,4,2); + $day = (int)substr($str,6,2); + if(strlen($str) <= 8) { + $gap = 0; + } else { + $gap = zgap(); + } + + return mktime($hour, $min, $sec, $month?$month:1, $day?$day:1, $year)+$gap; + } + + /** + * @brief YmdHis의 시간 형식을 지금으로 부터 몇분/몇시간전, 1일 이상 차이나면 format string return + **/ + function getTimeGap($date, $format = 'Y.m.d') { + $gap = time() - ztime($date); + + $lang_time_gap = Context::getLang('time_gap'); + if($gap<60) $buff = sprintf($lang_time_gap['min'], (int)($gap / 60)+1); + elseif($gap<60*60) $buff = sprintf($lang_time_gap['mins'], (int)($gap / 60)+1); + elseif($gap<60*60*2) $buff = sprintf($lang_time_gap['hour'], (int)($gap / 60 /60)+1); + elseif($gap<60*60*24) $buff = sprintf($lang_time_gap['hours'], (int)($gap / 60 /60)+1); + else $buff = zdate($date, $format); + return $buff; + } + + /** + * @brief 월이름을 return + **/ + function getMonthName($month, $short = true) { + $short_month = array('','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'); + $long_month = array('','January','February','March','April','May','June','July','August','September','October','November','December'); + return !$short?$long_month[$month]:$short_month[$month]; + } + + /** + * @brief YYYYMMDDHHIISS 형식의 시간값을 원하는 시간 포맷으로 변형 + * @param string|int str YYYYMMDDHHIISS 형식의 시간 값 + * @param string format php date()함수의 시간 포맷 + * @param bool conversion 언어에 따라 날짜 포맷의 자동변환 여부 + * @return string + **/ + function zdate($str, $format = 'Y-m-d H:i:s', $conversion=true) { + // 대상 시간이 없으면 null return + if(!$str) return; + + // 언어권에 따라서 지정된 날짜 포맷을 변경 + if($conversion == true) { + switch(Context::getLangType()) { + case 'en' : + case 'es' : + if($format == 'Y-m-d') $format = 'M d, Y'; + elseif($format == 'Y-m-d H:i:s') $format = 'M d, Y H:i:s'; + elseif($format == 'Y-m-d H:i') $format = 'M d, Y H:i'; + break; + case 'vi' : + if($format == 'Y-m-d') $format = 'd-m-Y'; + elseif($format == 'Y-m-d H:i:s') $format = 'H:i:s d-m-Y'; + elseif($format == 'Y-m-d H:i') $format = 'H:i d-m-Y'; + break; + + } + } + + // 년도가 1970년 이전이면 별도 처리 + if((int)substr($str,0,4) < 1970) { + $hour = (int)substr($str,8,2); + $min = (int)substr($str,10,2); + $sec = (int)substr($str,12,2); + $year = (int)substr($str,0,4); + $month = (int)substr($str,4,2); + $day = (int)substr($str,6,2); + + // leading zero? + $lz = create_function('$n', 'return ($n>9?"":"0").$n;'); + + $trans = array( + 'Y'=>$year, + 'y'=>$lz($year%100), + 'm'=>$lz($month), + 'n'=>$month, + 'd'=>$lz($day), + 'j'=>$day, + 'G'=>$hour, + 'H'=>$lz($hour), + 'g'=>$hour%12, + 'h'=>$lz($hour%12), + 'i'=>$lz($min), + 's'=>$lz($sec), + 'M'=>getMonthName($month), + 'F'=>getMonthName($month,false) + ); + + $string = strtr($format, $trans); + } else { + // 1970년 이후라면 ztime()함수로 unixtime을 구하고 date함수로 처리 + $string = date($format, ztime($str)); + } + + // 요일, am/pm을 각 언어에 맞게 변경 + $unit_week = Context::getLang('unit_week'); + $unit_meridiem = Context::getLang('unit_meridiem'); + $string = str_replace(array('Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'),$unit_week, $string); + $string = str_replace(array('am','pm','AM','PM'), $unit_meridiem, $string); + return $string; + } + + /** + * @brief prints debug messages + * @param debug_output target object to be printed + * @param display_line boolean flag whether to print seperator (default:true) + * @return none + * + * ./files/_debug_message.php 파일에 $buff 내용을 출력한다. + * tail -f ./files/_debug_message.php 하여 계속 살펴 볼 수 있다 + **/ + function debugPrint($debug_output = null, $display_option = true, $file = '_debug_message.php') { + if(!(__DEBUG__ & 1)) return; + + static $firephp; + $bt = debug_backtrace(); + if(is_array($bt)) $first = array_shift($bt); + $file_name = array_pop(explode(DIRECTORY_SEPARATOR, $first['file'])); + $line_num = $first['line']; + + if(__DEBUG_OUTPUT__ == 2 && version_compare(PHP_VERSION, '6.0.0') === -1) { + if(!isset($firephp)) $firephp = FirePHP::getInstance(true); + if(function_exists("memory_get_usage")) + { + $label = sprintf('[%s:%d] (m:%s)', $file_name, $line_num, FileHandler::filesize(memory_get_usage())); + } + else + { + $label = sprintf('[%s:%d] ', $file_name, $line_num); + } + + // FirePHP 옵션 체크 + if($display_option === 'TABLE') $label = $display_option; + + // __DEBUG_PROTECT__ 옵션으로 지정된 IP와 접근 IP가 동일한지 체크 + if(__DEBUG_PROTECT__ === 1 && __DEBUG_PROTECT_IP__ != $_SERVER['REMOTE_ADDR']) { + $debug_output = 'The IP address is not allowed. Change the value of __DEBUG_PROTECT_IP__ into your IP address in config/config.user.inc.php or config/config.inc.php'; + $label = null; + } + + $firephp->fb($debug_output, $label); + + } else { + if(__DEBUG_PROTECT__ === 1 && __DEBUG_PROTECT_IP__ != $_SERVER['REMOTE_ADDR']) { + return; + } + $debug_file = _XE_PATH_.'files/'.$file; + if(function_exists("memory_get_usage")) + { + $debug_output = sprintf("[%s %s:%d] - mem(%s)\n%s\n", date('Y-m-d H:i:s'), $file_name, $line_num, FileHandler::filesize(memory_get_usage()), print_r($debug_output, true)); + } + else + { + $debug_output = sprintf("[%s %s:%d]\n%s\n", date('Y-m-d H:i:s'), $file_name, $line_num, print_r($debug_output, true)); + } + + if($display_option === true) $debug_output = str_repeat('=', 40)."\n".$debug_output.str_repeat('-', 40); + $debug_output = "\n\n"; + + if(@!$fp = fopen($debug_file, 'a')) return; + fwrite($fp, $debug_output); + fclose($fp); + } + } + + + /** + * @brief microtime() return + * @return float + **/ + function getMicroTime() { + list($time1, $time2) = explode(' ', microtime()); + return (float)$time1 + (float)$time2; + } + + /** + * @brief 첫번째 인자로 오는 object var에서 2번째 object의 var들을 제거 + * @param target_obj 원 object + * @param del_obj 원 object의 vars에서 del_obj의 vars를 제거한다 + * @return object + **/ + function delObjectVars($target_obj, $del_obj) { + if(!is_object($target_obj)) return; + if(!is_object($del_obj)) return; + + $target_vars = get_object_vars($target_obj); + $del_vars = get_object_vars($del_obj); + + $target = array_keys($target_vars); + $del = array_keys($del_vars); + if(!count($target)||!count($del)) return $target_obj; + + $return_obj = NULL; + + $target_count = count($target); + for($i = 0; $i < $target_count; $i++) { + $target_key = $target[$i]; + if(!in_array($target_key, $del)) $return_obj->{$target_key} = $target_obj->{$target_key}; + } + + return $return_obj; + } + + /** + * @brief php5 이상에서 error_handing을 debugPrint로 변경 + * @param errno + * @param errstr + * @return file + * @return line + **/ + function handleError($errno, $errstr, $file, $line) { + if(!__DEBUG__) return; + $errors = array(E_USER_ERROR, E_ERROR, E_PARSE); + if(!in_array($errno, $errors)) return; + + $output = sprintf("Fatal error : %s - %d", $file, $line); + $output .= sprintf("%d - %s", $errno, $errstr); + + debugPrint($output); + } + + /** + * @brief 주어진 숫자를 주어진 크기로 recursive하게 잘라줌 + * @param no 주어진 숫자 + * @param size 잘라낼 크기 + **/ + function getNumberingPath($no, $size=3) { + $mod = pow(10, $size); + $output = sprintf('%0'.$size.'d/', $no%$mod); + if($no >= $mod) $output .= getNumberingPath((int)$no/$mod, $size); + return $output; + } + + /** + * @brief 한글이 들어간 url의 decode + **/ + function url_decode($str) { + return preg_replace('/%u([[:alnum:]]{4})/', '&#x\\1;',$str); + } + + /** + * @brief 해킹 시도로 의심되는 코드들을 미리 차단 + **/ + function removeHackTag($content) { + // 특정 태그들을 일반 문자로 변경 + $content = preg_replace('/<(\/?)(iframe|script|meta|style|applet|link|base|html|body)/is', '<$1$2', $content); + + /** + * 이미지나 동영상등의 태그에서 src에 관리자 세션을 악용하는 코드를 제거 + * - 취약점 제보 : 김상원님 + **/ + $content = preg_replace_callback("!<(/?)([a-z]+)(.*?)>!is", removeSrcHack, $content); + + // xmp tag 확인 및 추가 + $content = checkXmpTag($content); + + return $content; + } + + /** + * @brief xmp tag 확인 및 닫히지 않은 경우 추가 + **/ + function checkXmpTag($content) { + if(($start_xmp = strrpos($content, '')) !==false) { + if(($close_xmp = strrpos($content, '')) === false) $content .= ''; + else if($close_xmp < $start_xmp) $content .= ''; + } + + return $content; + } + + function removeSrcHack($matches) { + $tag = strtolower(trim($matches[2])); + + // xmp tag 정리 + if($tag=='xmp') return '<'.$matches[1].'xmp>'; + if($matches[1]=='/') return $matches[0]; + + //$buff = trim(preg_replace('/(\/>|>)/','/>',$matches[0])); + $buff = $matches[0]; + $buff = str_replace(array('&','&'),array('&','&'),$buff); + $buff = preg_replace_callback('/([^=^"^ ]*)=([^ ^>]*)/i', 'fixQuotation', $buff); + + $oXmlParser = new XmlParser(); + $xml_doc = $oXmlParser->parse($buff); + if(!$xml_doc) return sprintf("<%s>", $tag); + + // src값에 module=admin이라는 값이 입력되어 있으면 이 값을 무효화 시킴 + $src = $xml_doc->attrs->src; + $dynsrc = $xml_doc->attrs->dynsrc; + $lowsrc = $xml_doc->attrs->lowsrc; + $href = $xml_doc->attrs->href; + $data = $xml_doc->attrs->data; + $background = $xml_doc->attrs->background; + $style = $xml_doc->attrs->style; + if($style) { + $url = preg_match_all('/url\s*\(([^\)]+)\)/is', $style, $matches2); + if(count($matches2[0])) + { + foreach($matches2[1] as $target) + { + if(_isHackedSrc($target)) return sprintf("<%s>",$tag); + } + } + } + if(_isHackedSrc($src) || _isHackedSrc($dynsrc) || _isHackedSrc($lowsrc) || _isHackedSrc($href) || _isHackedSrc($data) || _isHackedSrc($background) || _isHackedSrcExp($style)) return sprintf("<%s>",$tag); + + if($tag=='param' && $xml_doc->attrs->value && preg_match('/^javascript:/i',$xml_doc->attrs->value)) return sprintf("<%s>",$tag); + if($tag=='object' && $xml_doc->attrs->data && preg_match('/^javascript:/i',$xml_doc->attrs->data)) return sprintf("<%s>",$tag); + + return $buff; + } + + function _isHackedSrcExp($style) { + if(!$style) return false; + if(preg_match('/((\/\*)|(\*\/)|(\\n)|(expression))/i', $style)) return true; + return false; + } + + function _isHackedSrc($src) { + if(!$src) return false; + if($src) { + $target = trim($src); + if(preg_match('/(\s|(\&\#)|(script:))/i', $target)) return true; + if(preg_match('/data:/i', $target)) return true; + + $url_info = parse_url($src); + $query = $url_info['query']; + if(!trim($query)) return false; + $query = str_replace("&","&",$query); + $queries = explode('&', $query); + $cnt = count($queries); + for($i=0;$i<$cnt;$i++) { + $tmp_str = strtolower(trim($queries[$i])); + $pos = strpos($tmp_str,'='); + if($pos === false) continue; + $key = strtolower(trim(substr($tmp_str, 0, $pos))); + $val = strtolower(trim(substr($tmp_str,$pos+1))); + if( ($key=='module'&&$val=='admin') || ($key=='act'&&preg_match('/admin/i',$val)) ) return true; + } + } + return false; + } + + /** + * @brief attribute의 value를 " 로 둘러싸도록 처리하는 함수 + **/ + function fixQuotation($matches) { + $key = $matches[1]; + $val = trim($matches[2]); + + $close_tag = false; + if(substr($val,-1)=='/') { + $close_tag = true; + $val = rtrim(substr($val,0,-1)); + } + + if($val{0}=="'" && substr($val,-1)=="'") + { + $val = sprintf('"%s"', substr($val,1,-1)); + } + + if($close_tag) $val .= ' /'; + + // attribute on* remove + if(preg_match('/^on([a-z]+)/i',preg_replace('/[^a-zA-Z_]/','',$key))) return ''; + + $output = sprintf('%s=%s', $key, $val); + + return $output; + } + + // hexa값을 RGB로 변환 + if(!function_exists('hexrgb')) { + function hexrgb($hexstr) { + $int = hexdec($hexstr); + + return array('red' => 0xFF & ($int >> 0x10), + 'green' => 0xFF & ($int >> 0x8), + 'blue' => 0xFF & $int); + } + + } + + /** + * @brief mysql old_password 의 php 구현 함수 + * 제로보드4나 기타 mysql4.1 이전의 old_password()함수를 쓴 데이터의 사용을 위해서 + * mysql의 password.c 소스 참조해서 구현함 + **/ + function mysql_pre4_hash_password($password) { + $nr = 1345345333; + $add = 7; + $nr2 = 0x12345671; + + settype($password, "string"); + + for ($i=0; $i>6)+192).chr(($num&63)+128); + if($num<65536)return chr(($num>>12)+224).chr((($num>>6)&63)+128).chr(($num&63)+128); + if($num<2097152)return chr(($num>>18)+240).chr((($num>>12)&63)+128).chr((($num>>6)&63)+128) .chr(($num&63)+128); + return ''; + } + + + function detectUTF8($string, $return_convert = false, $urldecode = true) { + if($urldecode) $string = urldecode($string); + + $sample = iconv('utf-8', 'utf-8', $string); + $is_utf8 = (md5($sample) == md5($string)); + + if(!$urldecode) $string = urldecode($string); + + if($return_convert) return ($is_utf8) ? $string : iconv('euc-kr', 'utf-8', $string); + + return $is_utf8; + } + + + function json_encode2($data) { + switch (gettype($data)) { + case 'boolean': + return $data?'true':'false'; + case 'integer': + case 'double': + return $data; + case 'string': + return '"'.strtr($data, array('\\'=>'\\\\','"'=>'\\"')).'"'; + case 'object': + $data = get_object_vars($data); + case 'array': + $rel = false; // relative array? + $key = array_keys($data); + foreach ($key as $v) { + if (!is_int($v)) { + $rel = true; + break; + } + } + + $arr = array(); + foreach ($data as $k=>$v) { + $arr[] = ($rel?'"'.strtr($k, array('\\'=>'\\\\','"'=>'\\"')).'":':'').json_encode2($v); + } + + return $rel?'{'.join(',', $arr).'}':'['.join(',', $arr).']'; + default: + return '""'; + } + } + + + function isCrawler($agent = null) { + if(!$agent) $agent = $_SERVER['HTTP_USER_AGENT']; + $check_agent = array('bot', 'spider', 'google', 'yahoo', 'daum', 'teoma', 'fish', 'hanrss', 'facebook'); + $check_ip = array( + '211.245.21.11*' /* mixsh */ + ); + + foreach($check_agent as $str) { + if(stristr($agent, $str) != FALSE) return true; + } + + $check_ip = '/^('.implode($check_ip, '|').')/'; + $check_ip = str_replace('.', '\.', $check_ip); + $check_ip = str_replace('*', '.+', $check_ip); + $check_ip = str_replace('?', '.?', $check_ip); + + if(preg_match($check_ip, $_SERVER['REMOTE_ADDR'], $matches)) return true; + + return false; + } + + function stripEmbedTagForAdmin(&$content, $writer_member_srl) + { + if(!Context::get('is_logged')) return; + $oModuleModel = &getModel('module'); + $logged_info = Context::get('logged_info'); + + if($writer_member_srl != $logged_info->member_srl && ($logged_info->is_admin == "Y" || $oModuleModel->isSiteAdmin($logged_info)) ) + { + if($writer_member_srl) + { + $oMemberModel =& getModel('member'); + $member_info = $oMemberModel->getMemberInfoByMemberSrl($writer_member_srl); + if($member_info->is_admin == "Y") + { + return; + } + } + $security_msg = "

".Context::getLang('security_warning_embed')."

"; + $content = preg_replace('/]+>(.*?<\/object>)?/is', $security_msg, $content); + $content = preg_replace('/]+>(\s*<\/embed>)?/is', $security_msg, $content); + $content = preg_replace('/]+editor_component="multimedia_link"[^>]*>(\s*<\/img>)?/is', $security_msg, $content); + } + + return; + } + + function requirePear() + { + if(version_compare(PHP_VERSION, "5.3.0") < 0) + { + set_include_path(_XE_PATH_."libs/PEAR"); + } + else + { + set_include_path(_XE_PATH_."libs/PEAR.1.9"); + + } + } + +?> diff --git a/libs/PEAR.1.9/HTTP/Request2.php b/libs/PEAR.1.9/HTTP/Request2.php index 980d2c343..1347d6ece 100644 --- a/libs/PEAR.1.9/HTTP/Request2.php +++ b/libs/PEAR.1.9/HTTP/Request2.php @@ -1,861 +1,861 @@ - - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * The names of the authors may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * @category HTTP - * @package HTTP_Request2 - * @author Alexey Borzov - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version SVN: $Id: Request2.php 298246 2010-04-21 10:41:16Z avb $ - * @link http://pear.php.net/package/HTTP_Request2 - */ - -/** - * A class representing an URL as per RFC 3986. - */ -require_once 'Net/URL2.php'; - -/** - * Exception class for HTTP_Request2 package - */ -require_once 'HTTP/Request2/Exception.php'; - -/** - * Class representing a HTTP request message - * - * @category HTTP - * @package HTTP_Request2 - * @author Alexey Borzov - * @version Release: 0.5.2 - * @link http://tools.ietf.org/html/rfc2616#section-5 - */ -class HTTP_Request2 implements SplSubject -{ - /**#@+ - * Constants for HTTP request methods - * - * @link http://tools.ietf.org/html/rfc2616#section-5.1.1 - */ - const METHOD_OPTIONS = 'OPTIONS'; - const METHOD_GET = 'GET'; - const METHOD_HEAD = 'HEAD'; - const METHOD_POST = 'POST'; - const METHOD_PUT = 'PUT'; - const METHOD_DELETE = 'DELETE'; - const METHOD_TRACE = 'TRACE'; - const METHOD_CONNECT = 'CONNECT'; - /**#@-*/ - - /**#@+ - * Constants for HTTP authentication schemes - * - * @link http://tools.ietf.org/html/rfc2617 - */ - const AUTH_BASIC = 'basic'; - const AUTH_DIGEST = 'digest'; - /**#@-*/ - - /** - * Regular expression used to check for invalid symbols in RFC 2616 tokens - * @link http://pear.php.net/bugs/bug.php?id=15630 - */ - const REGEXP_INVALID_TOKEN = '![\x00-\x1f\x7f-\xff()<>@,;:\\\\"/\[\]?={}\s]!'; - - /** - * Regular expression used to check for invalid symbols in cookie strings - * @link http://pear.php.net/bugs/bug.php?id=15630 - * @link http://web.archive.org/web/20080331104521/http://cgi.netscape.com/newsref/std/cookie_spec.html - */ - const REGEXP_INVALID_COOKIE = '/[\s,;]/'; - - /** - * Fileinfo magic database resource - * @var resource - * @see detectMimeType() - */ - private static $_fileinfoDb; - - /** - * Observers attached to the request (instances of SplObserver) - * @var array - */ - protected $observers = array(); - - /** - * Request URL - * @var Net_URL2 - */ - protected $url; - - /** - * Request method - * @var string - */ - protected $method = self::METHOD_GET; - - /** - * Authentication data - * @var array - * @see getAuth() - */ - protected $auth; - - /** - * Request headers - * @var array - */ - protected $headers = array(); - - /** - * Configuration parameters - * @var array - * @see setConfig() - */ - protected $config = array( - 'adapter' => 'HTTP_Request2_Adapter_Socket', - 'connect_timeout' => 10, - 'timeout' => 0, - 'use_brackets' => true, - 'protocol_version' => '1.1', - 'buffer_size' => 16384, - 'store_body' => true, - - 'proxy_host' => '', - 'proxy_port' => '', - 'proxy_user' => '', - 'proxy_password' => '', - 'proxy_auth_scheme' => self::AUTH_BASIC, - - 'ssl_verify_peer' => true, - 'ssl_verify_host' => true, - 'ssl_cafile' => null, - 'ssl_capath' => null, - 'ssl_local_cert' => null, - 'ssl_passphrase' => null, - - 'digest_compat_ie' => false, - - 'follow_redirects' => false, - 'max_redirects' => 5, - 'strict_redirects' => false - ); - - /** - * Last event in request / response handling, intended for observers - * @var array - * @see getLastEvent() - */ - protected $lastEvent = array( - 'name' => 'start', - 'data' => null - ); - - /** - * Request body - * @var string|resource - * @see setBody() - */ - protected $body = ''; - - /** - * Array of POST parameters - * @var array - */ - protected $postParams = array(); - - /** - * Array of file uploads (for multipart/form-data POST requests) - * @var array - */ - protected $uploads = array(); - - /** - * Adapter used to perform actual HTTP request - * @var HTTP_Request2_Adapter - */ - protected $adapter; - - - /** - * Constructor. Can set request URL, method and configuration array. - * - * Also sets a default value for User-Agent header. - * - * @param string|Net_Url2 Request URL - * @param string Request method - * @param array Configuration for this Request instance - */ - public function __construct($url = null, $method = self::METHOD_GET, array $config = array()) - { - $this->setConfig($config); - if (!empty($url)) { - $this->setUrl($url); - } - if (!empty($method)) { - $this->setMethod($method); - } - $this->setHeader('user-agent', 'HTTP_Request2/0.5.2 ' . - '(http://pear.php.net/package/http_request2) ' . - 'PHP/' . phpversion()); - } - - /** - * Sets the URL for this request - * - * If the URL has userinfo part (username & password) these will be removed - * and converted to auth data. If the URL does not have a path component, - * that will be set to '/'. - * - * @param string|Net_URL2 Request URL - * @return HTTP_Request2 - * @throws HTTP_Request2_Exception - */ - public function setUrl($url) - { - if (is_string($url)) { - $url = new Net_URL2( - $url, array(Net_URL2::OPTION_USE_BRACKETS => $this->config['use_brackets']) - ); - } - if (!$url instanceof Net_URL2) { - throw new HTTP_Request2_Exception('Parameter is not a valid HTTP URL'); - } - // URL contains username / password? - if ($url->getUserinfo()) { - $username = $url->getUser(); - $password = $url->getPassword(); - $this->setAuth(rawurldecode($username), $password? rawurldecode($password): ''); - $url->setUserinfo(''); - } - if ('' == $url->getPath()) { - $url->setPath('/'); - } - $this->url = $url; - - return $this; - } - - /** - * Returns the request URL - * - * @return Net_URL2 - */ - public function getUrl() - { - return $this->url; - } - - /** - * Sets the request method - * - * @param string - * @return HTTP_Request2 - * @throws HTTP_Request2_Exception if the method name is invalid - */ - public function setMethod($method) - { - // Method name should be a token: http://tools.ietf.org/html/rfc2616#section-5.1.1 - if (preg_match(self::REGEXP_INVALID_TOKEN, $method)) { - throw new HTTP_Request2_Exception("Invalid request method '{$method}'"); - } - $this->method = $method; - - return $this; - } - - /** - * Returns the request method - * - * @return string - */ - public function getMethod() - { - return $this->method; - } - - /** - * Sets the configuration parameter(s) - * - * The following parameters are available: - *
    - *
  • 'adapter' - adapter to use (string)
  • - *
  • 'connect_timeout' - Connection timeout in seconds (integer)
  • - *
  • 'timeout' - Total number of seconds a request can take. - * Use 0 for no limit, should be greater than - * 'connect_timeout' if set (integer)
  • - *
  • 'use_brackets' - Whether to append [] to array variable names (bool)
  • - *
  • 'protocol_version' - HTTP Version to use, '1.0' or '1.1' (string)
  • - *
  • 'buffer_size' - Buffer size to use for reading and writing (int)
  • - *
  • 'store_body' - Whether to store response body in response object. - * Set to false if receiving a huge response and - * using an Observer to save it (boolean)
  • - *
  • 'proxy_host' - Proxy server host (string)
  • - *
  • 'proxy_port' - Proxy server port (integer)
  • - *
  • 'proxy_user' - Proxy auth username (string)
  • - *
  • 'proxy_password' - Proxy auth password (string)
  • - *
  • 'proxy_auth_scheme' - Proxy auth scheme, one of HTTP_Request2::AUTH_* constants (string)
  • - *
  • 'ssl_verify_peer' - Whether to verify peer's SSL certificate (bool)
  • - *
  • 'ssl_verify_host' - Whether to check that Common Name in SSL - * certificate matches host name (bool)
  • - *
  • 'ssl_cafile' - Cerificate Authority file to verify the peer - * with (use with 'ssl_verify_peer') (string)
  • - *
  • 'ssl_capath' - Directory holding multiple Certificate - * Authority files (string)
  • - *
  • 'ssl_local_cert' - Name of a file containing local cerificate (string)
  • - *
  • 'ssl_passphrase' - Passphrase with which local certificate - * was encoded (string)
  • - *
  • 'digest_compat_ie' - Whether to imitate behaviour of MSIE 5 and 6 - * in using URL without query string in digest - * authentication (boolean)
  • - *
  • 'follow_redirects' - Whether to automatically follow HTTP Redirects (boolean)
  • - *
  • 'max_redirects' - Maximum number of redirects to follow (integer)
  • - *
  • 'strict_redirects' - Whether to keep request method on redirects via status 301 and - * 302 (true, needed for compatibility with RFC 2616) - * or switch to GET (false, needed for compatibility with most - * browsers) (boolean)
  • - *
- * - * @param string|array configuration parameter name or array - * ('parameter name' => 'parameter value') - * @param mixed parameter value if $nameOrConfig is not an array - * @return HTTP_Request2 - * @throws HTTP_Request2_Exception If the parameter is unknown - */ - public function setConfig($nameOrConfig, $value = null) - { - if (is_array($nameOrConfig)) { - foreach ($nameOrConfig as $name => $value) { - $this->setConfig($name, $value); - } - - } else { - if (!array_key_exists($nameOrConfig, $this->config)) { - throw new HTTP_Request2_Exception( - "Unknown configuration parameter '{$nameOrConfig}'" - ); - } - $this->config[$nameOrConfig] = $value; - } - - return $this; - } - - /** - * Returns the value(s) of the configuration parameter(s) - * - * @param string parameter name - * @return mixed value of $name parameter, array of all configuration - * parameters if $name is not given - * @throws HTTP_Request2_Exception If the parameter is unknown - */ - public function getConfig($name = null) - { - if (null === $name) { - return $this->config; - } elseif (!array_key_exists($name, $this->config)) { - throw new HTTP_Request2_Exception( - "Unknown configuration parameter '{$name}'" - ); - } - return $this->config[$name]; - } - - /** - * Sets the autentification data - * - * @param string user name - * @param string password - * @param string authentication scheme - * @return HTTP_Request2 - */ - public function setAuth($user, $password = '', $scheme = self::AUTH_BASIC) - { - if (empty($user)) { - $this->auth = null; - } else { - $this->auth = array( - 'user' => (string)$user, - 'password' => (string)$password, - 'scheme' => $scheme - ); - } - - return $this; - } - - /** - * Returns the authentication data - * - * The array has the keys 'user', 'password' and 'scheme', where 'scheme' - * is one of the HTTP_Request2::AUTH_* constants. - * - * @return array - */ - public function getAuth() - { - return $this->auth; - } - - /** - * Sets request header(s) - * - * The first parameter may be either a full header string 'header: value' or - * header name. In the former case $value parameter is ignored, in the latter - * the header's value will either be set to $value or the header will be - * removed if $value is null. The first parameter can also be an array of - * headers, in that case method will be called recursively. - * - * Note that headers are treated case insensitively as per RFC 2616. - * - * - * $req->setHeader('Foo: Bar'); // sets the value of 'Foo' header to 'Bar' - * $req->setHeader('FoO', 'Baz'); // sets the value of 'Foo' header to 'Baz' - * $req->setHeader(array('foo' => 'Quux')); // sets the value of 'Foo' header to 'Quux' - * $req->setHeader('FOO'); // removes 'Foo' header from request - * - * - * @param string|array header name, header string ('Header: value') - * or an array of headers - * @param string|null header value, header will be removed if null - * @return HTTP_Request2 - * @throws HTTP_Request2_Exception - */ - public function setHeader($name, $value = null) - { - if (is_array($name)) { - foreach ($name as $k => $v) { - if (is_string($k)) { - $this->setHeader($k, $v); - } else { - $this->setHeader($v); - } - } - } else { - if (null === $value && strpos($name, ':')) { - list($name, $value) = array_map('trim', explode(':', $name, 2)); - } - // Header name should be a token: http://tools.ietf.org/html/rfc2616#section-4.2 - if (preg_match(self::REGEXP_INVALID_TOKEN, $name)) { - throw new HTTP_Request2_Exception("Invalid header name '{$name}'"); - } - // Header names are case insensitive anyway - $name = strtolower($name); - if (null === $value) { - unset($this->headers[$name]); - } else { - $this->headers[$name] = $value; - } - } - - return $this; - } - - /** - * Returns the request headers - * - * The array is of the form ('header name' => 'header value'), header names - * are lowercased - * - * @return array - */ - public function getHeaders() - { - return $this->headers; - } - - /** - * Appends a cookie to "Cookie:" header - * - * @param string cookie name - * @param string cookie value - * @return HTTP_Request2 - * @throws HTTP_Request2_Exception - */ - public function addCookie($name, $value) - { - $cookie = $name . '=' . $value; - if (preg_match(self::REGEXP_INVALID_COOKIE, $cookie)) { - throw new HTTP_Request2_Exception("Invalid cookie: '{$cookie}'"); - } - $cookies = empty($this->headers['cookie'])? '': $this->headers['cookie'] . '; '; - $this->setHeader('cookie', $cookies . $cookie); - - return $this; - } - - /** - * Sets the request body - * - * @param string Either a string with the body or filename containing body - * @param bool Whether first parameter is a filename - * @return HTTP_Request2 - * @throws HTTP_Request2_Exception - */ - public function setBody($body, $isFilename = false) - { - if (!$isFilename) { - if (!$body instanceof HTTP_Request2_MultipartBody) { - $this->body = (string)$body; - } else { - $this->body = $body; - } - } else { - if (!($fp = @fopen($body, 'rb'))) { - throw new HTTP_Request2_Exception("Cannot open file {$body}"); - } - $this->body = $fp; - if (empty($this->headers['content-type'])) { - $this->setHeader('content-type', self::detectMimeType($body)); - } - } - $this->postParams = $this->uploads = array(); - - return $this; - } - - /** - * Returns the request body - * - * @return string|resource|HTTP_Request2_MultipartBody - */ - public function getBody() - { - if (self::METHOD_POST == $this->method && - (!empty($this->postParams) || !empty($this->uploads)) - ) { - if ('application/x-www-form-urlencoded' == $this->headers['content-type']) { - $body = http_build_query($this->postParams, '', '&'); - if (!$this->getConfig('use_brackets')) { - $body = preg_replace('/%5B\d+%5D=/', '=', $body); - } - // support RFC 3986 by not encoding '~' symbol (request #15368) - return str_replace('%7E', '~', $body); - - } elseif ('multipart/form-data' == $this->headers['content-type']) { - require_once 'HTTP/Request2/MultipartBody.php'; - return new HTTP_Request2_MultipartBody( - $this->postParams, $this->uploads, $this->getConfig('use_brackets') - ); - } - } - return $this->body; - } - - /** - * Adds a file to form-based file upload - * - * Used to emulate file upload via a HTML form. The method also sets - * Content-Type of HTTP request to 'multipart/form-data'. - * - * If you just want to send the contents of a file as the body of HTTP - * request you should use setBody() method. - * - * @param string name of file-upload field - * @param mixed full name of local file - * @param string filename to send in the request - * @param string content-type of file being uploaded - * @return HTTP_Request2 - * @throws HTTP_Request2_Exception - */ - public function addUpload($fieldName, $filename, $sendFilename = null, - $contentType = null) - { - if (!is_array($filename)) { - if (!($fp = @fopen($filename, 'rb'))) { - throw new HTTP_Request2_Exception("Cannot open file {$filename}"); - } - $this->uploads[$fieldName] = array( - 'fp' => $fp, - 'filename' => empty($sendFilename)? basename($filename): $sendFilename, - 'size' => filesize($filename), - 'type' => empty($contentType)? self::detectMimeType($filename): $contentType - ); - } else { - $fps = $names = $sizes = $types = array(); - foreach ($filename as $f) { - if (!is_array($f)) { - $f = array($f); - } - if (!($fp = @fopen($f[0], 'rb'))) { - throw new HTTP_Request2_Exception("Cannot open file {$f[0]}"); - } - $fps[] = $fp; - $names[] = empty($f[1])? basename($f[0]): $f[1]; - $sizes[] = filesize($f[0]); - $types[] = empty($f[2])? self::detectMimeType($f[0]): $f[2]; - } - $this->uploads[$fieldName] = array( - 'fp' => $fps, 'filename' => $names, 'size' => $sizes, 'type' => $types - ); - } - if (empty($this->headers['content-type']) || - 'application/x-www-form-urlencoded' == $this->headers['content-type'] - ) { - $this->setHeader('content-type', 'multipart/form-data'); - } - - return $this; - } - - /** - * Adds POST parameter(s) to the request. - * - * @param string|array parameter name or array ('name' => 'value') - * @param mixed parameter value (can be an array) - * @return HTTP_Request2 - */ - public function addPostParameter($name, $value = null) - { - if (!is_array($name)) { - $this->postParams[$name] = $value; - } else { - foreach ($name as $k => $v) { - $this->addPostParameter($k, $v); - } - } - if (empty($this->headers['content-type'])) { - $this->setHeader('content-type', 'application/x-www-form-urlencoded'); - } - - return $this; - } - - /** - * Attaches a new observer - * - * @param SplObserver - */ - public function attach(SplObserver $observer) - { - foreach ($this->observers as $attached) { - if ($attached === $observer) { - return; - } - } - $this->observers[] = $observer; - } - - /** - * Detaches an existing observer - * - * @param SplObserver - */ - public function detach(SplObserver $observer) - { - foreach ($this->observers as $key => $attached) { - if ($attached === $observer) { - unset($this->observers[$key]); - return; - } - } - } - - /** - * Notifies all observers - */ - public function notify() - { - foreach ($this->observers as $observer) { - $observer->update($this); - } - } - - /** - * Sets the last event - * - * Adapters should use this method to set the current state of the request - * and notify the observers. - * - * @param string event name - * @param mixed event data - */ - public function setLastEvent($name, $data = null) - { - $this->lastEvent = array( - 'name' => $name, - 'data' => $data - ); - $this->notify(); - } - - /** - * Returns the last event - * - * Observers should use this method to access the last change in request. - * The following event names are possible: - *
    - *
  • 'connect' - after connection to remote server, - * data is the destination (string)
  • - *
  • 'disconnect' - after disconnection from server
  • - *
  • 'sentHeaders' - after sending the request headers, - * data is the headers sent (string)
  • - *
  • 'sentBodyPart' - after sending a part of the request body, - * data is the length of that part (int)
  • - *
  • 'receivedHeaders' - after receiving the response headers, - * data is HTTP_Request2_Response object
  • - *
  • 'receivedBodyPart' - after receiving a part of the response - * body, data is that part (string)
  • - *
  • 'receivedEncodedBodyPart' - as 'receivedBodyPart', but data is still - * encoded by Content-Encoding
  • - *
  • 'receivedBody' - after receiving the complete response - * body, data is HTTP_Request2_Response object
  • - *
- * Different adapters may not send all the event types. Mock adapter does - * not send any events to the observers. - * - * @return array The array has two keys: 'name' and 'data' - */ - public function getLastEvent() - { - return $this->lastEvent; - } - - /** - * Sets the adapter used to actually perform the request - * - * You can pass either an instance of a class implementing HTTP_Request2_Adapter - * or a class name. The method will only try to include a file if the class - * name starts with HTTP_Request2_Adapter_, it will also try to prepend this - * prefix to the class name if it doesn't contain any underscores, so that - * - * $request->setAdapter('curl'); - * - * will work. - * - * @param string|HTTP_Request2_Adapter - * @return HTTP_Request2 - * @throws HTTP_Request2_Exception - */ - public function setAdapter($adapter) - { - if (is_string($adapter)) { - if (!class_exists($adapter, false)) { - if (false === strpos($adapter, '_')) { - $adapter = 'HTTP_Request2_Adapter_' . ucfirst($adapter); - } - if (preg_match('/^HTTP_Request2_Adapter_([a-zA-Z0-9]+)$/', $adapter)) { - include_once str_replace('_', DIRECTORY_SEPARATOR, $adapter) . '.php'; - } - if (!class_exists($adapter, false)) { - throw new HTTP_Request2_Exception("Class {$adapter} not found"); - } - } - $adapter = new $adapter; - } - if (!$adapter instanceof HTTP_Request2_Adapter) { - throw new HTTP_Request2_Exception('Parameter is not a HTTP request adapter'); - } - $this->adapter = $adapter; - - return $this; - } - - /** - * Sends the request and returns the response - * - * @throws HTTP_Request2_Exception - * @return HTTP_Request2_Response - */ - public function send() - { - // Sanity check for URL - if (!$this->url instanceof Net_URL2) { - throw new HTTP_Request2_Exception('No URL given'); - } elseif (!$this->url->isAbsolute()) { - throw new HTTP_Request2_Exception('Absolute URL required'); - } elseif (!in_array(strtolower($this->url->getScheme()), array('https', 'http'))) { - throw new HTTP_Request2_Exception('Not a HTTP URL'); - } - if (empty($this->adapter)) { - $this->setAdapter($this->getConfig('adapter')); - } - // magic_quotes_runtime may break file uploads and chunked response - // processing; see bug #4543. Don't use ini_get() here; see bug #16440. - if ($magicQuotes = get_magic_quotes_runtime()) { - set_magic_quotes_runtime(false); - } - // force using single byte encoding if mbstring extension overloads - // strlen() and substr(); see bug #1781, bug #10605 - if (extension_loaded('mbstring') && (2 & ini_get('mbstring.func_overload'))) { - $oldEncoding = mb_internal_encoding(); - mb_internal_encoding('iso-8859-1'); - } - - try { - $response = $this->adapter->sendRequest($this); - } catch (Exception $e) { - } - // cleanup in either case (poor man's "finally" clause) - if ($magicQuotes) { - set_magic_quotes_runtime(true); - } - if (!empty($oldEncoding)) { - mb_internal_encoding($oldEncoding); - } - // rethrow the exception - if (!empty($e)) { - throw $e; - } - return $response; - } - - /** - * Tries to detect MIME type of a file - * - * The method will try to use fileinfo extension if it is available, - * deprecated mime_content_type() function in the other case. If neither - * works, default 'application/octet-stream' MIME type is returned - * - * @param string filename - * @return string file MIME type - */ - protected static function detectMimeType($filename) - { - // finfo extension from PECL available - if (function_exists('finfo_open')) { - if (!isset(self::$_fileinfoDb)) { - self::$_fileinfoDb = @finfo_open(FILEINFO_MIME); - } - if (self::$_fileinfoDb) { - $info = finfo_file(self::$_fileinfoDb, $filename); - } - } - // (deprecated) mime_content_type function available - if (empty($info) && function_exists('mime_content_type')) { - return mime_content_type($filename); - } - return empty($info)? 'application/octet-stream': $info; - } -} + + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * The names of the authors may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * @category HTTP + * @package HTTP_Request2 + * @author Alexey Borzov + * @license http://opensource.org/licenses/bsd-license.php New BSD License + * @version SVN: $Id: Request2.php 298246 2010-04-21 10:41:16Z avb $ + * @link http://pear.php.net/package/HTTP_Request2 + */ + +/** + * A class representing an URL as per RFC 3986. + */ +require_once 'Net/URL2.php'; + +/** + * Exception class for HTTP_Request2 package + */ +require_once 'HTTP/Request2/Exception.php'; + +/** + * Class representing a HTTP request message + * + * @category HTTP + * @package HTTP_Request2 + * @author Alexey Borzov + * @version Release: 0.5.2 + * @link http://tools.ietf.org/html/rfc2616#section-5 + */ +class HTTP_Request2 implements SplSubject +{ + /**#@+ + * Constants for HTTP request methods + * + * @link http://tools.ietf.org/html/rfc2616#section-5.1.1 + */ + const METHOD_OPTIONS = 'OPTIONS'; + const METHOD_GET = 'GET'; + const METHOD_HEAD = 'HEAD'; + const METHOD_POST = 'POST'; + const METHOD_PUT = 'PUT'; + const METHOD_DELETE = 'DELETE'; + const METHOD_TRACE = 'TRACE'; + const METHOD_CONNECT = 'CONNECT'; + /**#@-*/ + + /**#@+ + * Constants for HTTP authentication schemes + * + * @link http://tools.ietf.org/html/rfc2617 + */ + const AUTH_BASIC = 'basic'; + const AUTH_DIGEST = 'digest'; + /**#@-*/ + + /** + * Regular expression used to check for invalid symbols in RFC 2616 tokens + * @link http://pear.php.net/bugs/bug.php?id=15630 + */ + const REGEXP_INVALID_TOKEN = '![\x00-\x1f\x7f-\xff()<>@,;:\\\\"/\[\]?={}\s]!'; + + /** + * Regular expression used to check for invalid symbols in cookie strings + * @link http://pear.php.net/bugs/bug.php?id=15630 + * @link http://web.archive.org/web/20080331104521/http://cgi.netscape.com/newsref/std/cookie_spec.html + */ + const REGEXP_INVALID_COOKIE = '/[\s,;]/'; + + /** + * Fileinfo magic database resource + * @var resource + * @see detectMimeType() + */ + private static $_fileinfoDb; + + /** + * Observers attached to the request (instances of SplObserver) + * @var array + */ + protected $observers = array(); + + /** + * Request URL + * @var Net_URL2 + */ + protected $url; + + /** + * Request method + * @var string + */ + protected $method = self::METHOD_GET; + + /** + * Authentication data + * @var array + * @see getAuth() + */ + protected $auth; + + /** + * Request headers + * @var array + */ + protected $headers = array(); + + /** + * Configuration parameters + * @var array + * @see setConfig() + */ + protected $config = array( + 'adapter' => 'HTTP_Request2_Adapter_Socket', + 'connect_timeout' => 10, + 'timeout' => 0, + 'use_brackets' => true, + 'protocol_version' => '1.1', + 'buffer_size' => 16384, + 'store_body' => true, + + 'proxy_host' => '', + 'proxy_port' => '', + 'proxy_user' => '', + 'proxy_password' => '', + 'proxy_auth_scheme' => self::AUTH_BASIC, + + 'ssl_verify_peer' => true, + 'ssl_verify_host' => true, + 'ssl_cafile' => null, + 'ssl_capath' => null, + 'ssl_local_cert' => null, + 'ssl_passphrase' => null, + + 'digest_compat_ie' => false, + + 'follow_redirects' => false, + 'max_redirects' => 5, + 'strict_redirects' => false + ); + + /** + * Last event in request / response handling, intended for observers + * @var array + * @see getLastEvent() + */ + protected $lastEvent = array( + 'name' => 'start', + 'data' => null + ); + + /** + * Request body + * @var string|resource + * @see setBody() + */ + protected $body = ''; + + /** + * Array of POST parameters + * @var array + */ + protected $postParams = array(); + + /** + * Array of file uploads (for multipart/form-data POST requests) + * @var array + */ + protected $uploads = array(); + + /** + * Adapter used to perform actual HTTP request + * @var HTTP_Request2_Adapter + */ + protected $adapter; + + + /** + * Constructor. Can set request URL, method and configuration array. + * + * Also sets a default value for User-Agent header. + * + * @param string|Net_Url2 Request URL + * @param string Request method + * @param array Configuration for this Request instance + */ + public function __construct($url = null, $method = self::METHOD_GET, array $config = array()) + { + $this->setConfig($config); + if (!empty($url)) { + $this->setUrl($url); + } + if (!empty($method)) { + $this->setMethod($method); + } + $this->setHeader('user-agent', 'HTTP_Request2/0.5.2 ' . + '(http://pear.php.net/package/http_request2) ' . + 'PHP/' . phpversion()); + } + + /** + * Sets the URL for this request + * + * If the URL has userinfo part (username & password) these will be removed + * and converted to auth data. If the URL does not have a path component, + * that will be set to '/'. + * + * @param string|Net_URL2 Request URL + * @return HTTP_Request2 + * @throws HTTP_Request2_Exception + */ + public function setUrl($url) + { + if (is_string($url)) { + $url = new Net_URL2( + $url, array(Net_URL2::OPTION_USE_BRACKETS => $this->config['use_brackets']) + ); + } + if (!$url instanceof Net_URL2) { + throw new HTTP_Request2_Exception('Parameter is not a valid HTTP URL'); + } + // URL contains username / password? + if ($url->getUserinfo()) { + $username = $url->getUser(); + $password = $url->getPassword(); + $this->setAuth(rawurldecode($username), $password? rawurldecode($password): ''); + $url->setUserinfo(''); + } + if ('' == $url->getPath()) { + $url->setPath('/'); + } + $this->url = $url; + + return $this; + } + + /** + * Returns the request URL + * + * @return Net_URL2 + */ + public function getUrl() + { + return $this->url; + } + + /** + * Sets the request method + * + * @param string + * @return HTTP_Request2 + * @throws HTTP_Request2_Exception if the method name is invalid + */ + public function setMethod($method) + { + // Method name should be a token: http://tools.ietf.org/html/rfc2616#section-5.1.1 + if (preg_match(self::REGEXP_INVALID_TOKEN, $method)) { + throw new HTTP_Request2_Exception("Invalid request method '{$method}'"); + } + $this->method = $method; + + return $this; + } + + /** + * Returns the request method + * + * @return string + */ + public function getMethod() + { + return $this->method; + } + + /** + * Sets the configuration parameter(s) + * + * The following parameters are available: + *
    + *
  • 'adapter' - adapter to use (string)
  • + *
  • 'connect_timeout' - Connection timeout in seconds (integer)
  • + *
  • 'timeout' - Total number of seconds a request can take. + * Use 0 for no limit, should be greater than + * 'connect_timeout' if set (integer)
  • + *
  • 'use_brackets' - Whether to append [] to array variable names (bool)
  • + *
  • 'protocol_version' - HTTP Version to use, '1.0' or '1.1' (string)
  • + *
  • 'buffer_size' - Buffer size to use for reading and writing (int)
  • + *
  • 'store_body' - Whether to store response body in response object. + * Set to false if receiving a huge response and + * using an Observer to save it (boolean)
  • + *
  • 'proxy_host' - Proxy server host (string)
  • + *
  • 'proxy_port' - Proxy server port (integer)
  • + *
  • 'proxy_user' - Proxy auth username (string)
  • + *
  • 'proxy_password' - Proxy auth password (string)
  • + *
  • 'proxy_auth_scheme' - Proxy auth scheme, one of HTTP_Request2::AUTH_* constants (string)
  • + *
  • 'ssl_verify_peer' - Whether to verify peer's SSL certificate (bool)
  • + *
  • 'ssl_verify_host' - Whether to check that Common Name in SSL + * certificate matches host name (bool)
  • + *
  • 'ssl_cafile' - Cerificate Authority file to verify the peer + * with (use with 'ssl_verify_peer') (string)
  • + *
  • 'ssl_capath' - Directory holding multiple Certificate + * Authority files (string)
  • + *
  • 'ssl_local_cert' - Name of a file containing local cerificate (string)
  • + *
  • 'ssl_passphrase' - Passphrase with which local certificate + * was encoded (string)
  • + *
  • 'digest_compat_ie' - Whether to imitate behaviour of MSIE 5 and 6 + * in using URL without query string in digest + * authentication (boolean)
  • + *
  • 'follow_redirects' - Whether to automatically follow HTTP Redirects (boolean)
  • + *
  • 'max_redirects' - Maximum number of redirects to follow (integer)
  • + *
  • 'strict_redirects' - Whether to keep request method on redirects via status 301 and + * 302 (true, needed for compatibility with RFC 2616) + * or switch to GET (false, needed for compatibility with most + * browsers) (boolean)
  • + *
+ * + * @param string|array configuration parameter name or array + * ('parameter name' => 'parameter value') + * @param mixed parameter value if $nameOrConfig is not an array + * @return HTTP_Request2 + * @throws HTTP_Request2_Exception If the parameter is unknown + */ + public function setConfig($nameOrConfig, $value = null) + { + if (is_array($nameOrConfig)) { + foreach ($nameOrConfig as $name => $value) { + $this->setConfig($name, $value); + } + + } else { + if (!array_key_exists($nameOrConfig, $this->config)) { + throw new HTTP_Request2_Exception( + "Unknown configuration parameter '{$nameOrConfig}'" + ); + } + $this->config[$nameOrConfig] = $value; + } + + return $this; + } + + /** + * Returns the value(s) of the configuration parameter(s) + * + * @param string parameter name + * @return mixed value of $name parameter, array of all configuration + * parameters if $name is not given + * @throws HTTP_Request2_Exception If the parameter is unknown + */ + public function getConfig($name = null) + { + if (null === $name) { + return $this->config; + } elseif (!array_key_exists($name, $this->config)) { + throw new HTTP_Request2_Exception( + "Unknown configuration parameter '{$name}'" + ); + } + return $this->config[$name]; + } + + /** + * Sets the autentification data + * + * @param string user name + * @param string password + * @param string authentication scheme + * @return HTTP_Request2 + */ + public function setAuth($user, $password = '', $scheme = self::AUTH_BASIC) + { + if (empty($user)) { + $this->auth = null; + } else { + $this->auth = array( + 'user' => (string)$user, + 'password' => (string)$password, + 'scheme' => $scheme + ); + } + + return $this; + } + + /** + * Returns the authentication data + * + * The array has the keys 'user', 'password' and 'scheme', where 'scheme' + * is one of the HTTP_Request2::AUTH_* constants. + * + * @return array + */ + public function getAuth() + { + return $this->auth; + } + + /** + * Sets request header(s) + * + * The first parameter may be either a full header string 'header: value' or + * header name. In the former case $value parameter is ignored, in the latter + * the header's value will either be set to $value or the header will be + * removed if $value is null. The first parameter can also be an array of + * headers, in that case method will be called recursively. + * + * Note that headers are treated case insensitively as per RFC 2616. + * + * + * $req->setHeader('Foo: Bar'); // sets the value of 'Foo' header to 'Bar' + * $req->setHeader('FoO', 'Baz'); // sets the value of 'Foo' header to 'Baz' + * $req->setHeader(array('foo' => 'Quux')); // sets the value of 'Foo' header to 'Quux' + * $req->setHeader('FOO'); // removes 'Foo' header from request + * + * + * @param string|array header name, header string ('Header: value') + * or an array of headers + * @param string|null header value, header will be removed if null + * @return HTTP_Request2 + * @throws HTTP_Request2_Exception + */ + public function setHeader($name, $value = null) + { + if (is_array($name)) { + foreach ($name as $k => $v) { + if (is_string($k)) { + $this->setHeader($k, $v); + } else { + $this->setHeader($v); + } + } + } else { + if (null === $value && strpos($name, ':')) { + list($name, $value) = array_map('trim', explode(':', $name, 2)); + } + // Header name should be a token: http://tools.ietf.org/html/rfc2616#section-4.2 + if (preg_match(self::REGEXP_INVALID_TOKEN, $name)) { + throw new HTTP_Request2_Exception("Invalid header name '{$name}'"); + } + // Header names are case insensitive anyway + $name = strtolower($name); + if (null === $value) { + unset($this->headers[$name]); + } else { + $this->headers[$name] = $value; + } + } + + return $this; + } + + /** + * Returns the request headers + * + * The array is of the form ('header name' => 'header value'), header names + * are lowercased + * + * @return array + */ + public function getHeaders() + { + return $this->headers; + } + + /** + * Appends a cookie to "Cookie:" header + * + * @param string cookie name + * @param string cookie value + * @return HTTP_Request2 + * @throws HTTP_Request2_Exception + */ + public function addCookie($name, $value) + { + $cookie = $name . '=' . $value; + if (preg_match(self::REGEXP_INVALID_COOKIE, $cookie)) { + throw new HTTP_Request2_Exception("Invalid cookie: '{$cookie}'"); + } + $cookies = empty($this->headers['cookie'])? '': $this->headers['cookie'] . '; '; + $this->setHeader('cookie', $cookies . $cookie); + + return $this; + } + + /** + * Sets the request body + * + * @param string Either a string with the body or filename containing body + * @param bool Whether first parameter is a filename + * @return HTTP_Request2 + * @throws HTTP_Request2_Exception + */ + public function setBody($body, $isFilename = false) + { + if (!$isFilename) { + if (!$body instanceof HTTP_Request2_MultipartBody) { + $this->body = (string)$body; + } else { + $this->body = $body; + } + } else { + if (!($fp = @fopen($body, 'rb'))) { + throw new HTTP_Request2_Exception("Cannot open file {$body}"); + } + $this->body = $fp; + if (empty($this->headers['content-type'])) { + $this->setHeader('content-type', self::detectMimeType($body)); + } + } + $this->postParams = $this->uploads = array(); + + return $this; + } + + /** + * Returns the request body + * + * @return string|resource|HTTP_Request2_MultipartBody + */ + public function getBody() + { + if (self::METHOD_POST == $this->method && + (!empty($this->postParams) || !empty($this->uploads)) + ) { + if ('application/x-www-form-urlencoded' == $this->headers['content-type']) { + $body = http_build_query($this->postParams, '', '&'); + if (!$this->getConfig('use_brackets')) { + $body = preg_replace('/%5B\d+%5D=/', '=', $body); + } + // support RFC 3986 by not encoding '~' symbol (request #15368) + return str_replace('%7E', '~', $body); + + } elseif ('multipart/form-data' == $this->headers['content-type']) { + require_once 'HTTP/Request2/MultipartBody.php'; + return new HTTP_Request2_MultipartBody( + $this->postParams, $this->uploads, $this->getConfig('use_brackets') + ); + } + } + return $this->body; + } + + /** + * Adds a file to form-based file upload + * + * Used to emulate file upload via a HTML form. The method also sets + * Content-Type of HTTP request to 'multipart/form-data'. + * + * If you just want to send the contents of a file as the body of HTTP + * request you should use setBody() method. + * + * @param string name of file-upload field + * @param mixed full name of local file + * @param string filename to send in the request + * @param string content-type of file being uploaded + * @return HTTP_Request2 + * @throws HTTP_Request2_Exception + */ + public function addUpload($fieldName, $filename, $sendFilename = null, + $contentType = null) + { + if (!is_array($filename)) { + if (!($fp = @fopen($filename, 'rb'))) { + throw new HTTP_Request2_Exception("Cannot open file {$filename}"); + } + $this->uploads[$fieldName] = array( + 'fp' => $fp, + 'filename' => empty($sendFilename)? basename($filename): $sendFilename, + 'size' => filesize($filename), + 'type' => empty($contentType)? self::detectMimeType($filename): $contentType + ); + } else { + $fps = $names = $sizes = $types = array(); + foreach ($filename as $f) { + if (!is_array($f)) { + $f = array($f); + } + if (!($fp = @fopen($f[0], 'rb'))) { + throw new HTTP_Request2_Exception("Cannot open file {$f[0]}"); + } + $fps[] = $fp; + $names[] = empty($f[1])? basename($f[0]): $f[1]; + $sizes[] = filesize($f[0]); + $types[] = empty($f[2])? self::detectMimeType($f[0]): $f[2]; + } + $this->uploads[$fieldName] = array( + 'fp' => $fps, 'filename' => $names, 'size' => $sizes, 'type' => $types + ); + } + if (empty($this->headers['content-type']) || + 'application/x-www-form-urlencoded' == $this->headers['content-type'] + ) { + $this->setHeader('content-type', 'multipart/form-data'); + } + + return $this; + } + + /** + * Adds POST parameter(s) to the request. + * + * @param string|array parameter name or array ('name' => 'value') + * @param mixed parameter value (can be an array) + * @return HTTP_Request2 + */ + public function addPostParameter($name, $value = null) + { + if (!is_array($name)) { + $this->postParams[$name] = $value; + } else { + foreach ($name as $k => $v) { + $this->addPostParameter($k, $v); + } + } + if (empty($this->headers['content-type'])) { + $this->setHeader('content-type', 'application/x-www-form-urlencoded'); + } + + return $this; + } + + /** + * Attaches a new observer + * + * @param SplObserver + */ + public function attach(SplObserver $observer) + { + foreach ($this->observers as $attached) { + if ($attached === $observer) { + return; + } + } + $this->observers[] = $observer; + } + + /** + * Detaches an existing observer + * + * @param SplObserver + */ + public function detach(SplObserver $observer) + { + foreach ($this->observers as $key => $attached) { + if ($attached === $observer) { + unset($this->observers[$key]); + return; + } + } + } + + /** + * Notifies all observers + */ + public function notify() + { + foreach ($this->observers as $observer) { + $observer->update($this); + } + } + + /** + * Sets the last event + * + * Adapters should use this method to set the current state of the request + * and notify the observers. + * + * @param string event name + * @param mixed event data + */ + public function setLastEvent($name, $data = null) + { + $this->lastEvent = array( + 'name' => $name, + 'data' => $data + ); + $this->notify(); + } + + /** + * Returns the last event + * + * Observers should use this method to access the last change in request. + * The following event names are possible: + *
    + *
  • 'connect' - after connection to remote server, + * data is the destination (string)
  • + *
  • 'disconnect' - after disconnection from server
  • + *
  • 'sentHeaders' - after sending the request headers, + * data is the headers sent (string)
  • + *
  • 'sentBodyPart' - after sending a part of the request body, + * data is the length of that part (int)
  • + *
  • 'receivedHeaders' - after receiving the response headers, + * data is HTTP_Request2_Response object
  • + *
  • 'receivedBodyPart' - after receiving a part of the response + * body, data is that part (string)
  • + *
  • 'receivedEncodedBodyPart' - as 'receivedBodyPart', but data is still + * encoded by Content-Encoding
  • + *
  • 'receivedBody' - after receiving the complete response + * body, data is HTTP_Request2_Response object
  • + *
+ * Different adapters may not send all the event types. Mock adapter does + * not send any events to the observers. + * + * @return array The array has two keys: 'name' and 'data' + */ + public function getLastEvent() + { + return $this->lastEvent; + } + + /** + * Sets the adapter used to actually perform the request + * + * You can pass either an instance of a class implementing HTTP_Request2_Adapter + * or a class name. The method will only try to include a file if the class + * name starts with HTTP_Request2_Adapter_, it will also try to prepend this + * prefix to the class name if it doesn't contain any underscores, so that + * + * $request->setAdapter('curl'); + * + * will work. + * + * @param string|HTTP_Request2_Adapter + * @return HTTP_Request2 + * @throws HTTP_Request2_Exception + */ + public function setAdapter($adapter) + { + if (is_string($adapter)) { + if (!class_exists($adapter, false)) { + if (false === strpos($adapter, '_')) { + $adapter = 'HTTP_Request2_Adapter_' . ucfirst($adapter); + } + if (preg_match('/^HTTP_Request2_Adapter_([a-zA-Z0-9]+)$/', $adapter)) { + include_once str_replace('_', DIRECTORY_SEPARATOR, $adapter) . '.php'; + } + if (!class_exists($adapter, false)) { + throw new HTTP_Request2_Exception("Class {$adapter} not found"); + } + } + $adapter = new $adapter; + } + if (!$adapter instanceof HTTP_Request2_Adapter) { + throw new HTTP_Request2_Exception('Parameter is not a HTTP request adapter'); + } + $this->adapter = $adapter; + + return $this; + } + + /** + * Sends the request and returns the response + * + * @throws HTTP_Request2_Exception + * @return HTTP_Request2_Response + */ + public function send() + { + // Sanity check for URL + if (!$this->url instanceof Net_URL2) { + throw new HTTP_Request2_Exception('No URL given'); + } elseif (!$this->url->isAbsolute()) { + throw new HTTP_Request2_Exception('Absolute URL required'); + } elseif (!in_array(strtolower($this->url->getScheme()), array('https', 'http'))) { + throw new HTTP_Request2_Exception('Not a HTTP URL'); + } + if (empty($this->adapter)) { + $this->setAdapter($this->getConfig('adapter')); + } + // magic_quotes_runtime may break file uploads and chunked response + // processing; see bug #4543. Don't use ini_get() here; see bug #16440. + if ($magicQuotes = get_magic_quotes_runtime()) { + set_magic_quotes_runtime(false); + } + // force using single byte encoding if mbstring extension overloads + // strlen() and substr(); see bug #1781, bug #10605 + if (extension_loaded('mbstring') && (2 & ini_get('mbstring.func_overload'))) { + $oldEncoding = mb_internal_encoding(); + mb_internal_encoding('iso-8859-1'); + } + + try { + $response = $this->adapter->sendRequest($this); + } catch (Exception $e) { + } + // cleanup in either case (poor man's "finally" clause) + if ($magicQuotes) { + set_magic_quotes_runtime(true); + } + if (!empty($oldEncoding)) { + mb_internal_encoding($oldEncoding); + } + // rethrow the exception + if (!empty($e)) { + throw $e; + } + return $response; + } + + /** + * Tries to detect MIME type of a file + * + * The method will try to use fileinfo extension if it is available, + * deprecated mime_content_type() function in the other case. If neither + * works, default 'application/octet-stream' MIME type is returned + * + * @param string filename + * @return string file MIME type + */ + protected static function detectMimeType($filename) + { + // finfo extension from PECL available + if (function_exists('finfo_open')) { + if (!isset(self::$_fileinfoDb)) { + self::$_fileinfoDb = @finfo_open(FILEINFO_MIME); + } + if (self::$_fileinfoDb) { + $info = finfo_file(self::$_fileinfoDb, $filename); + } + } + // (deprecated) mime_content_type function available + if (empty($info) && function_exists('mime_content_type')) { + return mime_content_type($filename); + } + return empty($info)? 'application/octet-stream': $info; + } +} ?> \ No newline at end of file diff --git a/libs/PEAR.1.9/HTTP/Request2/Adapter.php b/libs/PEAR.1.9/HTTP/Request2/Adapter.php index 8e3a7891f..8ebbf4607 100644 --- a/libs/PEAR.1.9/HTTP/Request2/Adapter.php +++ b/libs/PEAR.1.9/HTTP/Request2/Adapter.php @@ -1,154 +1,154 @@ - - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * The names of the authors may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * @category HTTP - * @package HTTP_Request2 - * @author Alexey Borzov - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version SVN: $Id: Adapter.php 291118 2009-11-21 17:58:23Z avb $ - * @link http://pear.php.net/package/HTTP_Request2 - */ - -/** - * Class representing a HTTP response - */ -require_once 'HTTP/Request2/Response.php'; - -/** - * Base class for HTTP_Request2 adapters - * - * HTTP_Request2 class itself only defines methods for aggregating the request - * data, all actual work of sending the request to the remote server and - * receiving its response is performed by adapters. - * - * @category HTTP - * @package HTTP_Request2 - * @author Alexey Borzov - * @version Release: 0.5.2 - */ -abstract class HTTP_Request2_Adapter -{ - /** - * A list of methods that MUST NOT have a request body, per RFC 2616 - * @var array - */ - protected static $bodyDisallowed = array('TRACE'); - - /** - * Methods having defined semantics for request body - * - * Content-Length header (indicating that the body follows, section 4.3 of - * RFC 2616) will be sent for these methods even if no body was added - * - * @var array - * @link http://pear.php.net/bugs/bug.php?id=12900 - * @link http://pear.php.net/bugs/bug.php?id=14740 - */ - protected static $bodyRequired = array('POST', 'PUT'); - - /** - * Request being sent - * @var HTTP_Request2 - */ - protected $request; - - /** - * Request body - * @var string|resource|HTTP_Request2_MultipartBody - * @see HTTP_Request2::getBody() - */ - protected $requestBody; - - /** - * Length of the request body - * @var integer - */ - protected $contentLength; - - /** - * Sends request to the remote server and returns its response - * - * @param HTTP_Request2 - * @return HTTP_Request2_Response - * @throws HTTP_Request2_Exception - */ - abstract public function sendRequest(HTTP_Request2 $request); - - /** - * Calculates length of the request body, adds proper headers - * - * @param array associative array of request headers, this method will - * add proper 'Content-Length' and 'Content-Type' headers - * to this array (or remove them if not needed) - */ - protected function calculateRequestLength(&$headers) - { - $this->requestBody = $this->request->getBody(); - - if (is_string($this->requestBody)) { - $this->contentLength = strlen($this->requestBody); - } elseif (is_resource($this->requestBody)) { - $stat = fstat($this->requestBody); - $this->contentLength = $stat['size']; - rewind($this->requestBody); - } else { - $this->contentLength = $this->requestBody->getLength(); - $headers['content-type'] = 'multipart/form-data; boundary=' . - $this->requestBody->getBoundary(); - $this->requestBody->rewind(); - } - - if (in_array($this->request->getMethod(), self::$bodyDisallowed) || - 0 == $this->contentLength - ) { - // No body: send a Content-Length header nonetheless (request #12900), - // but do that only for methods that require a body (bug #14740) - if (in_array($this->request->getMethod(), self::$bodyRequired)) { - $headers['content-length'] = 0; - } else { - unset($headers['content-length']); - // if the method doesn't require a body and doesn't have a - // body, don't send a Content-Type header. (request #16799) - unset($headers['content-type']); - } - } else { - if (empty($headers['content-type'])) { - $headers['content-type'] = 'application/x-www-form-urlencoded'; - } - $headers['content-length'] = $this->contentLength; - } - } -} -?> + + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * The names of the authors may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * @category HTTP + * @package HTTP_Request2 + * @author Alexey Borzov + * @license http://opensource.org/licenses/bsd-license.php New BSD License + * @version SVN: $Id: Adapter.php 291118 2009-11-21 17:58:23Z avb $ + * @link http://pear.php.net/package/HTTP_Request2 + */ + +/** + * Class representing a HTTP response + */ +require_once 'HTTP/Request2/Response.php'; + +/** + * Base class for HTTP_Request2 adapters + * + * HTTP_Request2 class itself only defines methods for aggregating the request + * data, all actual work of sending the request to the remote server and + * receiving its response is performed by adapters. + * + * @category HTTP + * @package HTTP_Request2 + * @author Alexey Borzov + * @version Release: 0.5.2 + */ +abstract class HTTP_Request2_Adapter +{ + /** + * A list of methods that MUST NOT have a request body, per RFC 2616 + * @var array + */ + protected static $bodyDisallowed = array('TRACE'); + + /** + * Methods having defined semantics for request body + * + * Content-Length header (indicating that the body follows, section 4.3 of + * RFC 2616) will be sent for these methods even if no body was added + * + * @var array + * @link http://pear.php.net/bugs/bug.php?id=12900 + * @link http://pear.php.net/bugs/bug.php?id=14740 + */ + protected static $bodyRequired = array('POST', 'PUT'); + + /** + * Request being sent + * @var HTTP_Request2 + */ + protected $request; + + /** + * Request body + * @var string|resource|HTTP_Request2_MultipartBody + * @see HTTP_Request2::getBody() + */ + protected $requestBody; + + /** + * Length of the request body + * @var integer + */ + protected $contentLength; + + /** + * Sends request to the remote server and returns its response + * + * @param HTTP_Request2 + * @return HTTP_Request2_Response + * @throws HTTP_Request2_Exception + */ + abstract public function sendRequest(HTTP_Request2 $request); + + /** + * Calculates length of the request body, adds proper headers + * + * @param array associative array of request headers, this method will + * add proper 'Content-Length' and 'Content-Type' headers + * to this array (or remove them if not needed) + */ + protected function calculateRequestLength(&$headers) + { + $this->requestBody = $this->request->getBody(); + + if (is_string($this->requestBody)) { + $this->contentLength = strlen($this->requestBody); + } elseif (is_resource($this->requestBody)) { + $stat = fstat($this->requestBody); + $this->contentLength = $stat['size']; + rewind($this->requestBody); + } else { + $this->contentLength = $this->requestBody->getLength(); + $headers['content-type'] = 'multipart/form-data; boundary=' . + $this->requestBody->getBoundary(); + $this->requestBody->rewind(); + } + + if (in_array($this->request->getMethod(), self::$bodyDisallowed) || + 0 == $this->contentLength + ) { + // No body: send a Content-Length header nonetheless (request #12900), + // but do that only for methods that require a body (bug #14740) + if (in_array($this->request->getMethod(), self::$bodyRequired)) { + $headers['content-length'] = 0; + } else { + unset($headers['content-length']); + // if the method doesn't require a body and doesn't have a + // body, don't send a Content-Type header. (request #16799) + unset($headers['content-type']); + } + } else { + if (empty($headers['content-type'])) { + $headers['content-type'] = 'application/x-www-form-urlencoded'; + } + $headers['content-length'] = $this->contentLength; + } + } +} +?> diff --git a/libs/PEAR.1.9/HTTP/Request2/Adapter/Curl.php b/libs/PEAR.1.9/HTTP/Request2/Adapter/Curl.php index 4c520d353..3d9833403 100644 --- a/libs/PEAR.1.9/HTTP/Request2/Adapter/Curl.php +++ b/libs/PEAR.1.9/HTTP/Request2/Adapter/Curl.php @@ -1,461 +1,461 @@ - - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * The names of the authors may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * @category HTTP - * @package HTTP_Request2 - * @author Alexey Borzov - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version SVN: $Id: Curl.php 291118 2009-11-21 17:58:23Z avb $ - * @link http://pear.php.net/package/HTTP_Request2 - */ - -/** - * Base class for HTTP_Request2 adapters - */ -require_once 'HTTP/Request2/Adapter.php'; - -/** - * Adapter for HTTP_Request2 wrapping around cURL extension - * - * @category HTTP - * @package HTTP_Request2 - * @author Alexey Borzov - * @version Release: 0.5.2 - */ -class HTTP_Request2_Adapter_Curl extends HTTP_Request2_Adapter -{ - /** - * Mapping of header names to cURL options - * @var array - */ - protected static $headerMap = array( - 'accept-encoding' => CURLOPT_ENCODING, - 'cookie' => CURLOPT_COOKIE, - 'referer' => CURLOPT_REFERER, - 'user-agent' => CURLOPT_USERAGENT - ); - - /** - * Mapping of SSL context options to cURL options - * @var array - */ - protected static $sslContextMap = array( - 'ssl_verify_peer' => CURLOPT_SSL_VERIFYPEER, - 'ssl_cafile' => CURLOPT_CAINFO, - 'ssl_capath' => CURLOPT_CAPATH, - 'ssl_local_cert' => CURLOPT_SSLCERT, - 'ssl_passphrase' => CURLOPT_SSLCERTPASSWD - ); - - /** - * Response being received - * @var HTTP_Request2_Response - */ - protected $response; - - /** - * Whether 'sentHeaders' event was sent to observers - * @var boolean - */ - protected $eventSentHeaders = false; - - /** - * Whether 'receivedHeaders' event was sent to observers - * @var boolean - */ - protected $eventReceivedHeaders = false; - - /** - * Position within request body - * @var integer - * @see callbackReadBody() - */ - protected $position = 0; - - /** - * Information about last transfer, as returned by curl_getinfo() - * @var array - */ - protected $lastInfo; - - /** - * Sends request to the remote server and returns its response - * - * @param HTTP_Request2 - * @return HTTP_Request2_Response - * @throws HTTP_Request2_Exception - */ - public function sendRequest(HTTP_Request2 $request) - { - if (!extension_loaded('curl')) { - throw new HTTP_Request2_Exception('cURL extension not available'); - } - - $this->request = $request; - $this->response = null; - $this->position = 0; - $this->eventSentHeaders = false; - $this->eventReceivedHeaders = false; - - try { - if (false === curl_exec($ch = $this->createCurlHandle())) { - $errorMessage = 'Error sending request: #' . curl_errno($ch) . - ' ' . curl_error($ch); - } - } catch (Exception $e) { - } - $this->lastInfo = curl_getinfo($ch); - curl_close($ch); - - $response = $this->response; - unset($this->request, $this->requestBody, $this->response); - - if (!empty($e)) { - throw $e; - } elseif (!empty($errorMessage)) { - throw new HTTP_Request2_Exception($errorMessage); - } - - if (0 < $this->lastInfo['size_download']) { - $request->setLastEvent('receivedBody', $response); - } - return $response; - } - - /** - * Returns information about last transfer - * - * @return array associative array as returned by curl_getinfo() - */ - public function getInfo() - { - return $this->lastInfo; - } - - /** - * Creates a new cURL handle and populates it with data from the request - * - * @return resource a cURL handle, as created by curl_init() - * @throws HTTP_Request2_Exception - */ - protected function createCurlHandle() - { - $ch = curl_init(); - - curl_setopt_array($ch, array( - // setup write callbacks - CURLOPT_HEADERFUNCTION => array($this, 'callbackWriteHeader'), - CURLOPT_WRITEFUNCTION => array($this, 'callbackWriteBody'), - // buffer size - CURLOPT_BUFFERSIZE => $this->request->getConfig('buffer_size'), - // connection timeout - CURLOPT_CONNECTTIMEOUT => $this->request->getConfig('connect_timeout'), - // save full outgoing headers, in case someone is interested - CURLINFO_HEADER_OUT => true, - // request url - CURLOPT_URL => $this->request->getUrl()->getUrl() - )); - - // set up redirects - if (!$this->request->getConfig('follow_redirects')) { - curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); - } else { - curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); - curl_setopt($ch, CURLOPT_MAXREDIRS, $this->request->getConfig('max_redirects')); - // limit redirects to http(s), works in 5.2.10+ - if (defined('CURLOPT_REDIR_PROTOCOLS')) { - curl_setopt($ch, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS); - } - // works sometime after 5.3.0, http://bugs.php.net/bug.php?id=49571 - if ($this->request->getConfig('strict_redirects') && defined('CURLOPT_POSTREDIR ')) { - curl_setopt($ch, CURLOPT_POSTREDIR, 3); - } - } - - // request timeout - if ($timeout = $this->request->getConfig('timeout')) { - curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); - } - - // set HTTP version - switch ($this->request->getConfig('protocol_version')) { - case '1.0': - curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); - break; - case '1.1': - curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); - } - - // set request method - switch ($this->request->getMethod()) { - case HTTP_Request2::METHOD_GET: - curl_setopt($ch, CURLOPT_HTTPGET, true); - break; - case HTTP_Request2::METHOD_POST: - curl_setopt($ch, CURLOPT_POST, true); - break; - case HTTP_Request2::METHOD_HEAD: - curl_setopt($ch, CURLOPT_NOBODY, true); - break; - default: - curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $this->request->getMethod()); - } - - // set proxy, if needed - if ($host = $this->request->getConfig('proxy_host')) { - if (!($port = $this->request->getConfig('proxy_port'))) { - throw new HTTP_Request2_Exception('Proxy port not provided'); - } - curl_setopt($ch, CURLOPT_PROXY, $host . ':' . $port); - if ($user = $this->request->getConfig('proxy_user')) { - curl_setopt($ch, CURLOPT_PROXYUSERPWD, $user . ':' . - $this->request->getConfig('proxy_password')); - switch ($this->request->getConfig('proxy_auth_scheme')) { - case HTTP_Request2::AUTH_BASIC: - curl_setopt($ch, CURLOPT_PROXYAUTH, CURLAUTH_BASIC); - break; - case HTTP_Request2::AUTH_DIGEST: - curl_setopt($ch, CURLOPT_PROXYAUTH, CURLAUTH_DIGEST); - } - } - } - - // set authentication data - if ($auth = $this->request->getAuth()) { - curl_setopt($ch, CURLOPT_USERPWD, $auth['user'] . ':' . $auth['password']); - switch ($auth['scheme']) { - case HTTP_Request2::AUTH_BASIC: - curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); - break; - case HTTP_Request2::AUTH_DIGEST: - curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST); - } - } - - // set SSL options - if (0 == strcasecmp($this->request->getUrl()->getScheme(), 'https')) { - foreach ($this->request->getConfig() as $name => $value) { - if ('ssl_verify_host' == $name && null !== $value) { - curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, $value? 2: 0); - } elseif (isset(self::$sslContextMap[$name]) && null !== $value) { - curl_setopt($ch, self::$sslContextMap[$name], $value); - } - } - } - - $headers = $this->request->getHeaders(); - // make cURL automagically send proper header - if (!isset($headers['accept-encoding'])) { - $headers['accept-encoding'] = ''; - } - - // set headers having special cURL keys - foreach (self::$headerMap as $name => $option) { - if (isset($headers[$name])) { - curl_setopt($ch, $option, $headers[$name]); - unset($headers[$name]); - } - } - - $this->calculateRequestLength($headers); - if (isset($headers['content-length'])) { - $this->workaroundPhpBug47204($ch, $headers); - } - - // set headers not having special keys - $headersFmt = array(); - foreach ($headers as $name => $value) { - $canonicalName = implode('-', array_map('ucfirst', explode('-', $name))); - $headersFmt[] = $canonicalName . ': ' . $value; - } - curl_setopt($ch, CURLOPT_HTTPHEADER, $headersFmt); - - return $ch; - } - - /** - * Workaround for PHP bug #47204 that prevents rewinding request body - * - * The workaround consists of reading the entire request body into memory - * and setting it as CURLOPT_POSTFIELDS, so it isn't recommended for large - * file uploads, use Socket adapter instead. - * - * @param resource cURL handle - * @param array Request headers - */ - protected function workaroundPhpBug47204($ch, &$headers) - { - // no redirects, no digest auth -> probably no rewind needed - if (!$this->request->getConfig('follow_redirects') - && (!($auth = $this->request->getAuth()) - || HTTP_Request2::AUTH_DIGEST != $auth['scheme']) - ) { - curl_setopt($ch, CURLOPT_READFUNCTION, array($this, 'callbackReadBody')); - - // rewind may be needed, read the whole body into memory - } else { - if ($this->requestBody instanceof HTTP_Request2_MultipartBody) { - $this->requestBody = $this->requestBody->__toString(); - - } elseif (is_resource($this->requestBody)) { - $fp = $this->requestBody; - $this->requestBody = ''; - while (!feof($fp)) { - $this->requestBody .= fread($fp, 16384); - } - } - // curl hangs up if content-length is present - unset($headers['content-length']); - curl_setopt($ch, CURLOPT_POSTFIELDS, $this->requestBody); - } - } - - /** - * Callback function called by cURL for reading the request body - * - * @param resource cURL handle - * @param resource file descriptor (not used) - * @param integer maximum length of data to return - * @return string part of the request body, up to $length bytes - */ - protected function callbackReadBody($ch, $fd, $length) - { - if (!$this->eventSentHeaders) { - $this->request->setLastEvent( - 'sentHeaders', curl_getinfo($ch, CURLINFO_HEADER_OUT) - ); - $this->eventSentHeaders = true; - } - if (in_array($this->request->getMethod(), self::$bodyDisallowed) || - 0 == $this->contentLength || $this->position >= $this->contentLength - ) { - return ''; - } - if (is_string($this->requestBody)) { - $string = substr($this->requestBody, $this->position, $length); - } elseif (is_resource($this->requestBody)) { - $string = fread($this->requestBody, $length); - } else { - $string = $this->requestBody->read($length); - } - $this->request->setLastEvent('sentBodyPart', strlen($string)); - $this->position += strlen($string); - return $string; - } - - /** - * Callback function called by cURL for saving the response headers - * - * @param resource cURL handle - * @param string response header (with trailing CRLF) - * @return integer number of bytes saved - * @see HTTP_Request2_Response::parseHeaderLine() - */ - protected function callbackWriteHeader($ch, $string) - { - // we may receive a second set of headers if doing e.g. digest auth - if ($this->eventReceivedHeaders || !$this->eventSentHeaders) { - // don't bother with 100-Continue responses (bug #15785) - if (!$this->eventSentHeaders || - $this->response->getStatus() >= 200 - ) { - $this->request->setLastEvent( - 'sentHeaders', curl_getinfo($ch, CURLINFO_HEADER_OUT) - ); - } - $upload = curl_getinfo($ch, CURLINFO_SIZE_UPLOAD); - // if body wasn't read by a callback, send event with total body size - if ($upload > $this->position) { - $this->request->setLastEvent( - 'sentBodyPart', $upload - $this->position - ); - $this->position = $upload; - } - $this->eventSentHeaders = true; - // we'll need a new response object - if ($this->eventReceivedHeaders) { - $this->eventReceivedHeaders = false; - $this->response = null; - } - } - if (empty($this->response)) { - $this->response = new HTTP_Request2_Response($string, false); - } else { - $this->response->parseHeaderLine($string); - if ('' == trim($string)) { - // don't bother with 100-Continue responses (bug #15785) - if (200 <= $this->response->getStatus()) { - $this->request->setLastEvent('receivedHeaders', $this->response); - } - // for versions lower than 5.2.10, check the redirection URL protocol - if ($this->request->getConfig('follow_redirects') && !defined('CURLOPT_REDIR_PROTOCOLS') - && $this->response->isRedirect() - ) { - $redirectUrl = new Net_URL2($this->response->getHeader('location')); - if ($redirectUrl->isAbsolute() - && !in_array($redirectUrl->getScheme(), array('http', 'https')) - ) { - return -1; - } - } - $this->eventReceivedHeaders = true; - } - } - return strlen($string); - } - - /** - * Callback function called by cURL for saving the response body - * - * @param resource cURL handle (not used) - * @param string part of the response body - * @return integer number of bytes saved - * @see HTTP_Request2_Response::appendBody() - */ - protected function callbackWriteBody($ch, $string) - { - // cURL calls WRITEFUNCTION callback without calling HEADERFUNCTION if - // response doesn't start with proper HTTP status line (see bug #15716) - if (empty($this->response)) { - throw new HTTP_Request2_Exception("Malformed response: {$string}"); - } - if ($this->request->getConfig('store_body')) { - $this->response->appendBody($string); - } - $this->request->setLastEvent('receivedBodyPart', $string); - return strlen($string); - } -} -?> + + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * The names of the authors may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * @category HTTP + * @package HTTP_Request2 + * @author Alexey Borzov + * @license http://opensource.org/licenses/bsd-license.php New BSD License + * @version SVN: $Id: Curl.php 291118 2009-11-21 17:58:23Z avb $ + * @link http://pear.php.net/package/HTTP_Request2 + */ + +/** + * Base class for HTTP_Request2 adapters + */ +require_once 'HTTP/Request2/Adapter.php'; + +/** + * Adapter for HTTP_Request2 wrapping around cURL extension + * + * @category HTTP + * @package HTTP_Request2 + * @author Alexey Borzov + * @version Release: 0.5.2 + */ +class HTTP_Request2_Adapter_Curl extends HTTP_Request2_Adapter +{ + /** + * Mapping of header names to cURL options + * @var array + */ + protected static $headerMap = array( + 'accept-encoding' => CURLOPT_ENCODING, + 'cookie' => CURLOPT_COOKIE, + 'referer' => CURLOPT_REFERER, + 'user-agent' => CURLOPT_USERAGENT + ); + + /** + * Mapping of SSL context options to cURL options + * @var array + */ + protected static $sslContextMap = array( + 'ssl_verify_peer' => CURLOPT_SSL_VERIFYPEER, + 'ssl_cafile' => CURLOPT_CAINFO, + 'ssl_capath' => CURLOPT_CAPATH, + 'ssl_local_cert' => CURLOPT_SSLCERT, + 'ssl_passphrase' => CURLOPT_SSLCERTPASSWD + ); + + /** + * Response being received + * @var HTTP_Request2_Response + */ + protected $response; + + /** + * Whether 'sentHeaders' event was sent to observers + * @var boolean + */ + protected $eventSentHeaders = false; + + /** + * Whether 'receivedHeaders' event was sent to observers + * @var boolean + */ + protected $eventReceivedHeaders = false; + + /** + * Position within request body + * @var integer + * @see callbackReadBody() + */ + protected $position = 0; + + /** + * Information about last transfer, as returned by curl_getinfo() + * @var array + */ + protected $lastInfo; + + /** + * Sends request to the remote server and returns its response + * + * @param HTTP_Request2 + * @return HTTP_Request2_Response + * @throws HTTP_Request2_Exception + */ + public function sendRequest(HTTP_Request2 $request) + { + if (!extension_loaded('curl')) { + throw new HTTP_Request2_Exception('cURL extension not available'); + } + + $this->request = $request; + $this->response = null; + $this->position = 0; + $this->eventSentHeaders = false; + $this->eventReceivedHeaders = false; + + try { + if (false === curl_exec($ch = $this->createCurlHandle())) { + $errorMessage = 'Error sending request: #' . curl_errno($ch) . + ' ' . curl_error($ch); + } + } catch (Exception $e) { + } + $this->lastInfo = curl_getinfo($ch); + curl_close($ch); + + $response = $this->response; + unset($this->request, $this->requestBody, $this->response); + + if (!empty($e)) { + throw $e; + } elseif (!empty($errorMessage)) { + throw new HTTP_Request2_Exception($errorMessage); + } + + if (0 < $this->lastInfo['size_download']) { + $request->setLastEvent('receivedBody', $response); + } + return $response; + } + + /** + * Returns information about last transfer + * + * @return array associative array as returned by curl_getinfo() + */ + public function getInfo() + { + return $this->lastInfo; + } + + /** + * Creates a new cURL handle and populates it with data from the request + * + * @return resource a cURL handle, as created by curl_init() + * @throws HTTP_Request2_Exception + */ + protected function createCurlHandle() + { + $ch = curl_init(); + + curl_setopt_array($ch, array( + // setup write callbacks + CURLOPT_HEADERFUNCTION => array($this, 'callbackWriteHeader'), + CURLOPT_WRITEFUNCTION => array($this, 'callbackWriteBody'), + // buffer size + CURLOPT_BUFFERSIZE => $this->request->getConfig('buffer_size'), + // connection timeout + CURLOPT_CONNECTTIMEOUT => $this->request->getConfig('connect_timeout'), + // save full outgoing headers, in case someone is interested + CURLINFO_HEADER_OUT => true, + // request url + CURLOPT_URL => $this->request->getUrl()->getUrl() + )); + + // set up redirects + if (!$this->request->getConfig('follow_redirects')) { + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); + } else { + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); + curl_setopt($ch, CURLOPT_MAXREDIRS, $this->request->getConfig('max_redirects')); + // limit redirects to http(s), works in 5.2.10+ + if (defined('CURLOPT_REDIR_PROTOCOLS')) { + curl_setopt($ch, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS); + } + // works sometime after 5.3.0, http://bugs.php.net/bug.php?id=49571 + if ($this->request->getConfig('strict_redirects') && defined('CURLOPT_POSTREDIR ')) { + curl_setopt($ch, CURLOPT_POSTREDIR, 3); + } + } + + // request timeout + if ($timeout = $this->request->getConfig('timeout')) { + curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); + } + + // set HTTP version + switch ($this->request->getConfig('protocol_version')) { + case '1.0': + curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); + break; + case '1.1': + curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); + } + + // set request method + switch ($this->request->getMethod()) { + case HTTP_Request2::METHOD_GET: + curl_setopt($ch, CURLOPT_HTTPGET, true); + break; + case HTTP_Request2::METHOD_POST: + curl_setopt($ch, CURLOPT_POST, true); + break; + case HTTP_Request2::METHOD_HEAD: + curl_setopt($ch, CURLOPT_NOBODY, true); + break; + default: + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $this->request->getMethod()); + } + + // set proxy, if needed + if ($host = $this->request->getConfig('proxy_host')) { + if (!($port = $this->request->getConfig('proxy_port'))) { + throw new HTTP_Request2_Exception('Proxy port not provided'); + } + curl_setopt($ch, CURLOPT_PROXY, $host . ':' . $port); + if ($user = $this->request->getConfig('proxy_user')) { + curl_setopt($ch, CURLOPT_PROXYUSERPWD, $user . ':' . + $this->request->getConfig('proxy_password')); + switch ($this->request->getConfig('proxy_auth_scheme')) { + case HTTP_Request2::AUTH_BASIC: + curl_setopt($ch, CURLOPT_PROXYAUTH, CURLAUTH_BASIC); + break; + case HTTP_Request2::AUTH_DIGEST: + curl_setopt($ch, CURLOPT_PROXYAUTH, CURLAUTH_DIGEST); + } + } + } + + // set authentication data + if ($auth = $this->request->getAuth()) { + curl_setopt($ch, CURLOPT_USERPWD, $auth['user'] . ':' . $auth['password']); + switch ($auth['scheme']) { + case HTTP_Request2::AUTH_BASIC: + curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); + break; + case HTTP_Request2::AUTH_DIGEST: + curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST); + } + } + + // set SSL options + if (0 == strcasecmp($this->request->getUrl()->getScheme(), 'https')) { + foreach ($this->request->getConfig() as $name => $value) { + if ('ssl_verify_host' == $name && null !== $value) { + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, $value? 2: 0); + } elseif (isset(self::$sslContextMap[$name]) && null !== $value) { + curl_setopt($ch, self::$sslContextMap[$name], $value); + } + } + } + + $headers = $this->request->getHeaders(); + // make cURL automagically send proper header + if (!isset($headers['accept-encoding'])) { + $headers['accept-encoding'] = ''; + } + + // set headers having special cURL keys + foreach (self::$headerMap as $name => $option) { + if (isset($headers[$name])) { + curl_setopt($ch, $option, $headers[$name]); + unset($headers[$name]); + } + } + + $this->calculateRequestLength($headers); + if (isset($headers['content-length'])) { + $this->workaroundPhpBug47204($ch, $headers); + } + + // set headers not having special keys + $headersFmt = array(); + foreach ($headers as $name => $value) { + $canonicalName = implode('-', array_map('ucfirst', explode('-', $name))); + $headersFmt[] = $canonicalName . ': ' . $value; + } + curl_setopt($ch, CURLOPT_HTTPHEADER, $headersFmt); + + return $ch; + } + + /** + * Workaround for PHP bug #47204 that prevents rewinding request body + * + * The workaround consists of reading the entire request body into memory + * and setting it as CURLOPT_POSTFIELDS, so it isn't recommended for large + * file uploads, use Socket adapter instead. + * + * @param resource cURL handle + * @param array Request headers + */ + protected function workaroundPhpBug47204($ch, &$headers) + { + // no redirects, no digest auth -> probably no rewind needed + if (!$this->request->getConfig('follow_redirects') + && (!($auth = $this->request->getAuth()) + || HTTP_Request2::AUTH_DIGEST != $auth['scheme']) + ) { + curl_setopt($ch, CURLOPT_READFUNCTION, array($this, 'callbackReadBody')); + + // rewind may be needed, read the whole body into memory + } else { + if ($this->requestBody instanceof HTTP_Request2_MultipartBody) { + $this->requestBody = $this->requestBody->__toString(); + + } elseif (is_resource($this->requestBody)) { + $fp = $this->requestBody; + $this->requestBody = ''; + while (!feof($fp)) { + $this->requestBody .= fread($fp, 16384); + } + } + // curl hangs up if content-length is present + unset($headers['content-length']); + curl_setopt($ch, CURLOPT_POSTFIELDS, $this->requestBody); + } + } + + /** + * Callback function called by cURL for reading the request body + * + * @param resource cURL handle + * @param resource file descriptor (not used) + * @param integer maximum length of data to return + * @return string part of the request body, up to $length bytes + */ + protected function callbackReadBody($ch, $fd, $length) + { + if (!$this->eventSentHeaders) { + $this->request->setLastEvent( + 'sentHeaders', curl_getinfo($ch, CURLINFO_HEADER_OUT) + ); + $this->eventSentHeaders = true; + } + if (in_array($this->request->getMethod(), self::$bodyDisallowed) || + 0 == $this->contentLength || $this->position >= $this->contentLength + ) { + return ''; + } + if (is_string($this->requestBody)) { + $string = substr($this->requestBody, $this->position, $length); + } elseif (is_resource($this->requestBody)) { + $string = fread($this->requestBody, $length); + } else { + $string = $this->requestBody->read($length); + } + $this->request->setLastEvent('sentBodyPart', strlen($string)); + $this->position += strlen($string); + return $string; + } + + /** + * Callback function called by cURL for saving the response headers + * + * @param resource cURL handle + * @param string response header (with trailing CRLF) + * @return integer number of bytes saved + * @see HTTP_Request2_Response::parseHeaderLine() + */ + protected function callbackWriteHeader($ch, $string) + { + // we may receive a second set of headers if doing e.g. digest auth + if ($this->eventReceivedHeaders || !$this->eventSentHeaders) { + // don't bother with 100-Continue responses (bug #15785) + if (!$this->eventSentHeaders || + $this->response->getStatus() >= 200 + ) { + $this->request->setLastEvent( + 'sentHeaders', curl_getinfo($ch, CURLINFO_HEADER_OUT) + ); + } + $upload = curl_getinfo($ch, CURLINFO_SIZE_UPLOAD); + // if body wasn't read by a callback, send event with total body size + if ($upload > $this->position) { + $this->request->setLastEvent( + 'sentBodyPart', $upload - $this->position + ); + $this->position = $upload; + } + $this->eventSentHeaders = true; + // we'll need a new response object + if ($this->eventReceivedHeaders) { + $this->eventReceivedHeaders = false; + $this->response = null; + } + } + if (empty($this->response)) { + $this->response = new HTTP_Request2_Response($string, false); + } else { + $this->response->parseHeaderLine($string); + if ('' == trim($string)) { + // don't bother with 100-Continue responses (bug #15785) + if (200 <= $this->response->getStatus()) { + $this->request->setLastEvent('receivedHeaders', $this->response); + } + // for versions lower than 5.2.10, check the redirection URL protocol + if ($this->request->getConfig('follow_redirects') && !defined('CURLOPT_REDIR_PROTOCOLS') + && $this->response->isRedirect() + ) { + $redirectUrl = new Net_URL2($this->response->getHeader('location')); + if ($redirectUrl->isAbsolute() + && !in_array($redirectUrl->getScheme(), array('http', 'https')) + ) { + return -1; + } + } + $this->eventReceivedHeaders = true; + } + } + return strlen($string); + } + + /** + * Callback function called by cURL for saving the response body + * + * @param resource cURL handle (not used) + * @param string part of the response body + * @return integer number of bytes saved + * @see HTTP_Request2_Response::appendBody() + */ + protected function callbackWriteBody($ch, $string) + { + // cURL calls WRITEFUNCTION callback without calling HEADERFUNCTION if + // response doesn't start with proper HTTP status line (see bug #15716) + if (empty($this->response)) { + throw new HTTP_Request2_Exception("Malformed response: {$string}"); + } + if ($this->request->getConfig('store_body')) { + $this->response->appendBody($string); + } + $this->request->setLastEvent('receivedBodyPart', $string); + return strlen($string); + } +} +?> diff --git a/libs/PEAR.1.9/HTTP/Request2/Adapter/Mock.php b/libs/PEAR.1.9/HTTP/Request2/Adapter/Mock.php index 17e9e08d9..fdedccac0 100644 --- a/libs/PEAR.1.9/HTTP/Request2/Adapter/Mock.php +++ b/libs/PEAR.1.9/HTTP/Request2/Adapter/Mock.php @@ -1,171 +1,171 @@ - - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * The names of the authors may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * @category HTTP - * @package HTTP_Request2 - * @author Alexey Borzov - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version SVN: $Id: Mock.php 290192 2009-11-03 21:29:32Z avb $ - * @link http://pear.php.net/package/HTTP_Request2 - */ - -/** - * Base class for HTTP_Request2 adapters - */ -require_once 'HTTP/Request2/Adapter.php'; - -/** - * Mock adapter intended for testing - * - * Can be used to test applications depending on HTTP_Request2 package without - * actually performing any HTTP requests. This adapter will return responses - * previously added via addResponse() - * - * $mock = new HTTP_Request2_Adapter_Mock(); - * $mock->addResponse("HTTP/1.1 ... "); - * - * $request = new HTTP_Request2(); - * $request->setAdapter($mock); - * - * // This will return the response set above - * $response = $req->send(); - * - * - * @category HTTP - * @package HTTP_Request2 - * @author Alexey Borzov - * @version Release: 0.5.2 - */ -class HTTP_Request2_Adapter_Mock extends HTTP_Request2_Adapter -{ - /** - * A queue of responses to be returned by sendRequest() - * @var array - */ - protected $responses = array(); - - /** - * Returns the next response from the queue built by addResponse() - * - * If the queue is empty it will return default empty response with status 400, - * if an Exception object was added to the queue it will be thrown. - * - * @param HTTP_Request2 - * @return HTTP_Request2_Response - * @throws Exception - */ - public function sendRequest(HTTP_Request2 $request) - { - if (count($this->responses) > 0) { - $response = array_shift($this->responses); - if ($response instanceof HTTP_Request2_Response) { - return $response; - } else { - // rethrow the exception - $class = get_class($response); - $message = $response->getMessage(); - $code = $response->getCode(); - throw new $class($message, $code); - } - } else { - return self::createResponseFromString("HTTP/1.1 400 Bad Request\r\n\r\n"); - } - } - - /** - * Adds response to the queue - * - * @param mixed either a string, a pointer to an open file, - * an instance of HTTP_Request2_Response or Exception - * @throws HTTP_Request2_Exception - */ - public function addResponse($response) - { - if (is_string($response)) { - $response = self::createResponseFromString($response); - } elseif (is_resource($response)) { - $response = self::createResponseFromFile($response); - } elseif (!$response instanceof HTTP_Request2_Response && - !$response instanceof Exception - ) { - throw new HTTP_Request2_Exception('Parameter is not a valid response'); - } - $this->responses[] = $response; - } - - /** - * Creates a new HTTP_Request2_Response object from a string - * - * @param string - * @return HTTP_Request2_Response - * @throws HTTP_Request2_Exception - */ - public static function createResponseFromString($str) - { - $parts = preg_split('!(\r?\n){2}!m', $str, 2); - $headerLines = explode("\n", $parts[0]); - $response = new HTTP_Request2_Response(array_shift($headerLines)); - foreach ($headerLines as $headerLine) { - $response->parseHeaderLine($headerLine); - } - $response->parseHeaderLine(''); - if (isset($parts[1])) { - $response->appendBody($parts[1]); - } - return $response; - } - - /** - * Creates a new HTTP_Request2_Response object from a file - * - * @param resource file pointer returned by fopen() - * @return HTTP_Request2_Response - * @throws HTTP_Request2_Exception - */ - public static function createResponseFromFile($fp) - { - $response = new HTTP_Request2_Response(fgets($fp)); - do { - $headerLine = fgets($fp); - $response->parseHeaderLine($headerLine); - } while ('' != trim($headerLine)); - - while (!feof($fp)) { - $response->appendBody(fread($fp, 8192)); - } - return $response; - } -} + + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * The names of the authors may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * @category HTTP + * @package HTTP_Request2 + * @author Alexey Borzov + * @license http://opensource.org/licenses/bsd-license.php New BSD License + * @version SVN: $Id: Mock.php 290192 2009-11-03 21:29:32Z avb $ + * @link http://pear.php.net/package/HTTP_Request2 + */ + +/** + * Base class for HTTP_Request2 adapters + */ +require_once 'HTTP/Request2/Adapter.php'; + +/** + * Mock adapter intended for testing + * + * Can be used to test applications depending on HTTP_Request2 package without + * actually performing any HTTP requests. This adapter will return responses + * previously added via addResponse() + * + * $mock = new HTTP_Request2_Adapter_Mock(); + * $mock->addResponse("HTTP/1.1 ... "); + * + * $request = new HTTP_Request2(); + * $request->setAdapter($mock); + * + * // This will return the response set above + * $response = $req->send(); + * + * + * @category HTTP + * @package HTTP_Request2 + * @author Alexey Borzov + * @version Release: 0.5.2 + */ +class HTTP_Request2_Adapter_Mock extends HTTP_Request2_Adapter +{ + /** + * A queue of responses to be returned by sendRequest() + * @var array + */ + protected $responses = array(); + + /** + * Returns the next response from the queue built by addResponse() + * + * If the queue is empty it will return default empty response with status 400, + * if an Exception object was added to the queue it will be thrown. + * + * @param HTTP_Request2 + * @return HTTP_Request2_Response + * @throws Exception + */ + public function sendRequest(HTTP_Request2 $request) + { + if (count($this->responses) > 0) { + $response = array_shift($this->responses); + if ($response instanceof HTTP_Request2_Response) { + return $response; + } else { + // rethrow the exception + $class = get_class($response); + $message = $response->getMessage(); + $code = $response->getCode(); + throw new $class($message, $code); + } + } else { + return self::createResponseFromString("HTTP/1.1 400 Bad Request\r\n\r\n"); + } + } + + /** + * Adds response to the queue + * + * @param mixed either a string, a pointer to an open file, + * an instance of HTTP_Request2_Response or Exception + * @throws HTTP_Request2_Exception + */ + public function addResponse($response) + { + if (is_string($response)) { + $response = self::createResponseFromString($response); + } elseif (is_resource($response)) { + $response = self::createResponseFromFile($response); + } elseif (!$response instanceof HTTP_Request2_Response && + !$response instanceof Exception + ) { + throw new HTTP_Request2_Exception('Parameter is not a valid response'); + } + $this->responses[] = $response; + } + + /** + * Creates a new HTTP_Request2_Response object from a string + * + * @param string + * @return HTTP_Request2_Response + * @throws HTTP_Request2_Exception + */ + public static function createResponseFromString($str) + { + $parts = preg_split('!(\r?\n){2}!m', $str, 2); + $headerLines = explode("\n", $parts[0]); + $response = new HTTP_Request2_Response(array_shift($headerLines)); + foreach ($headerLines as $headerLine) { + $response->parseHeaderLine($headerLine); + } + $response->parseHeaderLine(''); + if (isset($parts[1])) { + $response->appendBody($parts[1]); + } + return $response; + } + + /** + * Creates a new HTTP_Request2_Response object from a file + * + * @param resource file pointer returned by fopen() + * @return HTTP_Request2_Response + * @throws HTTP_Request2_Exception + */ + public static function createResponseFromFile($fp) + { + $response = new HTTP_Request2_Response(fgets($fp)); + do { + $headerLine = fgets($fp); + $response->parseHeaderLine($headerLine); + } while ('' != trim($headerLine)); + + while (!feof($fp)) { + $response->appendBody(fread($fp, 8192)); + } + return $response; + } +} ?> \ No newline at end of file diff --git a/libs/PEAR.1.9/HTTP/Request2/Adapter/Socket.php b/libs/PEAR.1.9/HTTP/Request2/Adapter/Socket.php index e7afdbd3f..a9c9ea361 100644 --- a/libs/PEAR.1.9/HTTP/Request2/Adapter/Socket.php +++ b/libs/PEAR.1.9/HTTP/Request2/Adapter/Socket.php @@ -1,1046 +1,1046 @@ - - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * The names of the authors may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * @category HTTP - * @package HTTP_Request2 - * @author Alexey Borzov - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version SVN: $Id: Socket.php 290921 2009-11-18 17:31:58Z avb $ - * @link http://pear.php.net/package/HTTP_Request2 - */ - -/** - * Base class for HTTP_Request2 adapters - */ -require_once 'HTTP/Request2/Adapter.php'; - -/** - * Socket-based adapter for HTTP_Request2 - * - * This adapter uses only PHP sockets and will work on almost any PHP - * environment. Code is based on original HTTP_Request PEAR package. - * - * @category HTTP - * @package HTTP_Request2 - * @author Alexey Borzov - * @version Release: 0.5.2 - */ -class HTTP_Request2_Adapter_Socket extends HTTP_Request2_Adapter -{ - /** - * Regular expression for 'token' rule from RFC 2616 - */ - const REGEXP_TOKEN = '[^\x00-\x1f\x7f-\xff()<>@,;:\\\\"/\[\]?={}\s]+'; - - /** - * Regular expression for 'quoted-string' rule from RFC 2616 - */ - const REGEXP_QUOTED_STRING = '"(?:\\\\.|[^\\\\"])*"'; - - /** - * Connected sockets, needed for Keep-Alive support - * @var array - * @see connect() - */ - protected static $sockets = array(); - - /** - * Data for digest authentication scheme - * - * The keys for the array are URL prefixes. - * - * The values are associative arrays with data (realm, nonce, nonce-count, - * opaque...) needed for digest authentication. Stored here to prevent making - * duplicate requests to digest-protected resources after we have already - * received the challenge. - * - * @var array - */ - protected static $challenges = array(); - - /** - * Connected socket - * @var resource - * @see connect() - */ - protected $socket; - - /** - * Challenge used for server digest authentication - * @var array - */ - protected $serverChallenge; - - /** - * Challenge used for proxy digest authentication - * @var array - */ - protected $proxyChallenge; - - /** - * Sum of start time and global timeout, exception will be thrown if request continues past this time - * @var integer - */ - protected $deadline = null; - - /** - * Remaining length of the current chunk, when reading chunked response - * @var integer - * @see readChunked() - */ - protected $chunkLength = 0; - - /** - * Remaining amount of redirections to follow - * - * Starts at 'max_redirects' configuration parameter and is reduced on each - * subsequent redirect. An Exception will be thrown once it reaches zero. - * - * @var integer - */ - protected $redirectCountdown = null; - - /** - * Sends request to the remote server and returns its response - * - * @param HTTP_Request2 - * @return HTTP_Request2_Response - * @throws HTTP_Request2_Exception - */ - public function sendRequest(HTTP_Request2 $request) - { - $this->request = $request; - - // Use global request timeout if given, see feature requests #5735, #8964 - if ($timeout = $request->getConfig('timeout')) { - $this->deadline = time() + $timeout; - } else { - $this->deadline = null; - } - - try { - $keepAlive = $this->connect(); - $headers = $this->prepareHeaders(); - if (false === @fwrite($this->socket, $headers, strlen($headers))) { - throw new HTTP_Request2_Exception('Error writing request'); - } - // provide request headers to the observer, see request #7633 - $this->request->setLastEvent('sentHeaders', $headers); - $this->writeBody(); - - if ($this->deadline && time() > $this->deadline) { - throw new HTTP_Request2_Exception( - 'Request timed out after ' . - $request->getConfig('timeout') . ' second(s)' - ); - } - - $response = $this->readResponse(); - - if (!$this->canKeepAlive($keepAlive, $response)) { - $this->disconnect(); - } - - if ($this->shouldUseProxyDigestAuth($response)) { - return $this->sendRequest($request); - } - if ($this->shouldUseServerDigestAuth($response)) { - return $this->sendRequest($request); - } - if ($authInfo = $response->getHeader('authentication-info')) { - $this->updateChallenge($this->serverChallenge, $authInfo); - } - if ($proxyInfo = $response->getHeader('proxy-authentication-info')) { - $this->updateChallenge($this->proxyChallenge, $proxyInfo); - } - - } catch (Exception $e) { - $this->disconnect(); - } - - unset($this->request, $this->requestBody); - - if (!empty($e)) { - throw $e; - } - - if (!$request->getConfig('follow_redirects') || !$response->isRedirect()) { - return $response; - } else { - return $this->handleRedirect($request, $response); - } - } - - /** - * Connects to the remote server - * - * @return bool whether the connection can be persistent - * @throws HTTP_Request2_Exception - */ - protected function connect() - { - $secure = 0 == strcasecmp($this->request->getUrl()->getScheme(), 'https'); - $tunnel = HTTP_Request2::METHOD_CONNECT == $this->request->getMethod(); - $headers = $this->request->getHeaders(); - $reqHost = $this->request->getUrl()->getHost(); - if (!($reqPort = $this->request->getUrl()->getPort())) { - $reqPort = $secure? 443: 80; - } - - if ($host = $this->request->getConfig('proxy_host')) { - if (!($port = $this->request->getConfig('proxy_port'))) { - throw new HTTP_Request2_Exception('Proxy port not provided'); - } - $proxy = true; - } else { - $host = $reqHost; - $port = $reqPort; - $proxy = false; - } - - if ($tunnel && !$proxy) { - throw new HTTP_Request2_Exception( - "Trying to perform CONNECT request without proxy" - ); - } - if ($secure && !in_array('ssl', stream_get_transports())) { - throw new HTTP_Request2_Exception( - 'Need OpenSSL support for https:// requests' - ); - } - - // RFC 2068, section 19.7.1: A client MUST NOT send the Keep-Alive - // connection token to a proxy server... - if ($proxy && !$secure && - !empty($headers['connection']) && 'Keep-Alive' == $headers['connection'] - ) { - $this->request->setHeader('connection'); - } - - $keepAlive = ('1.1' == $this->request->getConfig('protocol_version') && - empty($headers['connection'])) || - (!empty($headers['connection']) && - 'Keep-Alive' == $headers['connection']); - $host = ((!$secure || $proxy)? 'tcp://': 'ssl://') . $host; - - $options = array(); - if ($secure || $tunnel) { - foreach ($this->request->getConfig() as $name => $value) { - if ('ssl_' == substr($name, 0, 4) && null !== $value) { - if ('ssl_verify_host' == $name) { - if ($value) { - $options['CN_match'] = $reqHost; - } - } else { - $options[substr($name, 4)] = $value; - } - } - } - ksort($options); - } - - // Changing SSL context options after connection is established does *not* - // work, we need a new connection if options change - $remote = $host . ':' . $port; - $socketKey = $remote . (($secure && $proxy)? "->{$reqHost}:{$reqPort}": '') . - (empty($options)? '': ':' . serialize($options)); - unset($this->socket); - - // We use persistent connections and have a connected socket? - // Ensure that the socket is still connected, see bug #16149 - if ($keepAlive && !empty(self::$sockets[$socketKey]) && - !feof(self::$sockets[$socketKey]) - ) { - $this->socket =& self::$sockets[$socketKey]; - - } elseif ($secure && $proxy && !$tunnel) { - $this->establishTunnel(); - $this->request->setLastEvent( - 'connect', "ssl://{$reqHost}:{$reqPort} via {$host}:{$port}" - ); - self::$sockets[$socketKey] =& $this->socket; - - } else { - // Set SSL context options if doing HTTPS request or creating a tunnel - $context = stream_context_create(); - foreach ($options as $name => $value) { - if (!stream_context_set_option($context, 'ssl', $name, $value)) { - throw new HTTP_Request2_Exception( - "Error setting SSL context option '{$name}'" - ); - } - } - $this->socket = @stream_socket_client( - $remote, $errno, $errstr, - $this->request->getConfig('connect_timeout'), - STREAM_CLIENT_CONNECT, $context - ); - if (!$this->socket) { - throw new HTTP_Request2_Exception( - "Unable to connect to {$remote}. Error #{$errno}: {$errstr}" - ); - } - $this->request->setLastEvent('connect', $remote); - self::$sockets[$socketKey] =& $this->socket; - } - return $keepAlive; - } - - /** - * Establishes a tunnel to a secure remote server via HTTP CONNECT request - * - * This method will fail if 'ssl_verify_peer' is enabled. Probably because PHP - * sees that we are connected to a proxy server (duh!) rather than the server - * that presents its certificate. - * - * @link http://tools.ietf.org/html/rfc2817#section-5.2 - * @throws HTTP_Request2_Exception - */ - protected function establishTunnel() - { - $donor = new self; - $connect = new HTTP_Request2( - $this->request->getUrl(), HTTP_Request2::METHOD_CONNECT, - array_merge($this->request->getConfig(), - array('adapter' => $donor)) - ); - $response = $connect->send(); - // Need any successful (2XX) response - if (200 > $response->getStatus() || 300 <= $response->getStatus()) { - throw new HTTP_Request2_Exception( - 'Failed to connect via HTTPS proxy. Proxy response: ' . - $response->getStatus() . ' ' . $response->getReasonPhrase() - ); - } - $this->socket = $donor->socket; - - $modes = array( - STREAM_CRYPTO_METHOD_TLS_CLIENT, - STREAM_CRYPTO_METHOD_SSLv3_CLIENT, - STREAM_CRYPTO_METHOD_SSLv23_CLIENT, - STREAM_CRYPTO_METHOD_SSLv2_CLIENT - ); - - foreach ($modes as $mode) { - if (stream_socket_enable_crypto($this->socket, true, $mode)) { - return; - } - } - throw new HTTP_Request2_Exception( - 'Failed to enable secure connection when connecting through proxy' - ); - } - - /** - * Checks whether current connection may be reused or should be closed - * - * @param boolean whether connection could be persistent - * in the first place - * @param HTTP_Request2_Response response object to check - * @return boolean - */ - protected function canKeepAlive($requestKeepAlive, HTTP_Request2_Response $response) - { - // Do not close socket on successful CONNECT request - if (HTTP_Request2::METHOD_CONNECT == $this->request->getMethod() && - 200 <= $response->getStatus() && 300 > $response->getStatus() - ) { - return true; - } - - $lengthKnown = 'chunked' == strtolower($response->getHeader('transfer-encoding')) || - null !== $response->getHeader('content-length'); - $persistent = 'keep-alive' == strtolower($response->getHeader('connection')) || - (null === $response->getHeader('connection') && - '1.1' == $response->getVersion()); - return $requestKeepAlive && $lengthKnown && $persistent; - } - - /** - * Disconnects from the remote server - */ - protected function disconnect() - { - if (is_resource($this->socket)) { - fclose($this->socket); - $this->socket = null; - $this->request->setLastEvent('disconnect'); - } - } - - /** - * Handles HTTP redirection - * - * This method will throw an Exception if redirect to a non-HTTP(S) location - * is attempted, also if number of redirects performed already is equal to - * 'max_redirects' configuration parameter. - * - * @param HTTP_Request2 Original request - * @param HTTP_Request2_Response Response containing redirect - * @return HTTP_Request2_Response Response from a new location - * @throws HTTP_Request2_Exception - */ - protected function handleRedirect(HTTP_Request2 $request, - HTTP_Request2_Response $response) - { - if (is_null($this->redirectCountdown)) { - $this->redirectCountdown = $request->getConfig('max_redirects'); - } - if (0 == $this->redirectCountdown) { - // Copying cURL behaviour - throw new HTTP_Request2_Exception( - 'Maximum (' . $request->getConfig('max_redirects') . ') redirects followed' - ); - } - $redirectUrl = new Net_URL2( - $response->getHeader('location'), - array(Net_URL2::OPTION_USE_BRACKETS => $request->getConfig('use_brackets')) - ); - // refuse non-HTTP redirect - if ($redirectUrl->isAbsolute() - && !in_array($redirectUrl->getScheme(), array('http', 'https')) - ) { - throw new HTTP_Request2_Exception( - 'Refusing to redirect to a non-HTTP URL ' . $redirectUrl->__toString() - ); - } - // Theoretically URL should be absolute (see http://tools.ietf.org/html/rfc2616#section-14.30), - // but in practice it is often not - if (!$redirectUrl->isAbsolute()) { - $redirectUrl = $request->getUrl()->resolve($redirectUrl); - } - $redirect = clone $request; - $redirect->setUrl($redirectUrl); - if (303 == $response->getStatus() || (!$request->getConfig('strict_redirects') - && in_array($response->getStatus(), array(301, 302))) - ) { - $redirect->setMethod(HTTP_Request2::METHOD_GET); - $redirect->setBody(''); - } - - if (0 < $this->redirectCountdown) { - $this->redirectCountdown--; - } - return $this->sendRequest($redirect); - } - - /** - * Checks whether another request should be performed with server digest auth - * - * Several conditions should be satisfied for it to return true: - * - response status should be 401 - * - auth credentials should be set in the request object - * - response should contain WWW-Authenticate header with digest challenge - * - there is either no challenge stored for this URL or new challenge - * contains stale=true parameter (in other case we probably just failed - * due to invalid username / password) - * - * The method stores challenge values in $challenges static property - * - * @param HTTP_Request2_Response response to check - * @return boolean whether another request should be performed - * @throws HTTP_Request2_Exception in case of unsupported challenge parameters - */ - protected function shouldUseServerDigestAuth(HTTP_Request2_Response $response) - { - // no sense repeating a request if we don't have credentials - if (401 != $response->getStatus() || !$this->request->getAuth()) { - return false; - } - if (!$challenge = $this->parseDigestChallenge($response->getHeader('www-authenticate'))) { - return false; - } - - $url = $this->request->getUrl(); - $scheme = $url->getScheme(); - $host = $scheme . '://' . $url->getHost(); - if ($port = $url->getPort()) { - if ((0 == strcasecmp($scheme, 'http') && 80 != $port) || - (0 == strcasecmp($scheme, 'https') && 443 != $port) - ) { - $host .= ':' . $port; - } - } - - if (!empty($challenge['domain'])) { - $prefixes = array(); - foreach (preg_split('/\\s+/', $challenge['domain']) as $prefix) { - // don't bother with different servers - if ('/' == substr($prefix, 0, 1)) { - $prefixes[] = $host . $prefix; - } - } - } - if (empty($prefixes)) { - $prefixes = array($host . '/'); - } - - $ret = true; - foreach ($prefixes as $prefix) { - if (!empty(self::$challenges[$prefix]) && - (empty($challenge['stale']) || strcasecmp('true', $challenge['stale'])) - ) { - // probably credentials are invalid - $ret = false; - } - self::$challenges[$prefix] =& $challenge; - } - return $ret; - } - - /** - * Checks whether another request should be performed with proxy digest auth - * - * Several conditions should be satisfied for it to return true: - * - response status should be 407 - * - proxy auth credentials should be set in the request object - * - response should contain Proxy-Authenticate header with digest challenge - * - there is either no challenge stored for this proxy or new challenge - * contains stale=true parameter (in other case we probably just failed - * due to invalid username / password) - * - * The method stores challenge values in $challenges static property - * - * @param HTTP_Request2_Response response to check - * @return boolean whether another request should be performed - * @throws HTTP_Request2_Exception in case of unsupported challenge parameters - */ - protected function shouldUseProxyDigestAuth(HTTP_Request2_Response $response) - { - if (407 != $response->getStatus() || !$this->request->getConfig('proxy_user')) { - return false; - } - if (!($challenge = $this->parseDigestChallenge($response->getHeader('proxy-authenticate')))) { - return false; - } - - $key = 'proxy://' . $this->request->getConfig('proxy_host') . - ':' . $this->request->getConfig('proxy_port'); - - if (!empty(self::$challenges[$key]) && - (empty($challenge['stale']) || strcasecmp('true', $challenge['stale'])) - ) { - $ret = false; - } else { - $ret = true; - } - self::$challenges[$key] = $challenge; - return $ret; - } - - /** - * Extracts digest method challenge from (WWW|Proxy)-Authenticate header value - * - * There is a problem with implementation of RFC 2617: several of the parameters - * are defined as quoted-string there and thus may contain backslash escaped - * double quotes (RFC 2616, section 2.2). However, RFC 2617 defines unq(X) as - * just value of quoted-string X without surrounding quotes, it doesn't speak - * about removing backslash escaping. - * - * Now realm parameter is user-defined and human-readable, strange things - * happen when it contains quotes: - * - Apache allows quotes in realm, but apparently uses realm value without - * backslashes for digest computation - * - Squid allows (manually escaped) quotes there, but it is impossible to - * authorize with either escaped or unescaped quotes used in digest, - * probably it can't parse the response (?) - * - Both IE and Firefox display realm value with backslashes in - * the password popup and apparently use the same value for digest - * - * HTTP_Request2 follows IE and Firefox (and hopefully RFC 2617) in - * quoted-string handling, unfortunately that means failure to authorize - * sometimes - * - * @param string value of WWW-Authenticate or Proxy-Authenticate header - * @return mixed associative array with challenge parameters, false if - * no challenge is present in header value - * @throws HTTP_Request2_Exception in case of unsupported challenge parameters - */ - protected function parseDigestChallenge($headerValue) - { - $authParam = '(' . self::REGEXP_TOKEN . ')\\s*=\\s*(' . - self::REGEXP_TOKEN . '|' . self::REGEXP_QUOTED_STRING . ')'; - $challenge = "!(?<=^|\\s|,)Digest ({$authParam}\\s*(,\\s*|$))+!"; - if (!preg_match($challenge, $headerValue, $matches)) { - return false; - } - - preg_match_all('!' . $authParam . '!', $matches[0], $params); - $paramsAry = array(); - $knownParams = array('realm', 'domain', 'nonce', 'opaque', 'stale', - 'algorithm', 'qop'); - for ($i = 0; $i < count($params[0]); $i++) { - // section 3.2.1: Any unrecognized directive MUST be ignored. - if (in_array($params[1][$i], $knownParams)) { - if ('"' == substr($params[2][$i], 0, 1)) { - $paramsAry[$params[1][$i]] = substr($params[2][$i], 1, -1); - } else { - $paramsAry[$params[1][$i]] = $params[2][$i]; - } - } - } - // we only support qop=auth - if (!empty($paramsAry['qop']) && - !in_array('auth', array_map('trim', explode(',', $paramsAry['qop']))) - ) { - throw new HTTP_Request2_Exception( - "Only 'auth' qop is currently supported in digest authentication, " . - "server requested '{$paramsAry['qop']}'" - ); - } - // we only support algorithm=MD5 - if (!empty($paramsAry['algorithm']) && 'MD5' != $paramsAry['algorithm']) { - throw new HTTP_Request2_Exception( - "Only 'MD5' algorithm is currently supported in digest authentication, " . - "server requested '{$paramsAry['algorithm']}'" - ); - } - - return $paramsAry; - } - - /** - * Parses [Proxy-]Authentication-Info header value and updates challenge - * - * @param array challenge to update - * @param string value of [Proxy-]Authentication-Info header - * @todo validate server rspauth response - */ - protected function updateChallenge(&$challenge, $headerValue) - { - $authParam = '!(' . self::REGEXP_TOKEN . ')\\s*=\\s*(' . - self::REGEXP_TOKEN . '|' . self::REGEXP_QUOTED_STRING . ')!'; - $paramsAry = array(); - - preg_match_all($authParam, $headerValue, $params); - for ($i = 0; $i < count($params[0]); $i++) { - if ('"' == substr($params[2][$i], 0, 1)) { - $paramsAry[$params[1][$i]] = substr($params[2][$i], 1, -1); - } else { - $paramsAry[$params[1][$i]] = $params[2][$i]; - } - } - // for now, just update the nonce value - if (!empty($paramsAry['nextnonce'])) { - $challenge['nonce'] = $paramsAry['nextnonce']; - $challenge['nc'] = 1; - } - } - - /** - * Creates a value for [Proxy-]Authorization header when using digest authentication - * - * @param string user name - * @param string password - * @param string request URL - * @param array digest challenge parameters - * @return string value of [Proxy-]Authorization request header - * @link http://tools.ietf.org/html/rfc2617#section-3.2.2 - */ - protected function createDigestResponse($user, $password, $url, &$challenge) - { - if (false !== ($q = strpos($url, '?')) && - $this->request->getConfig('digest_compat_ie') - ) { - $url = substr($url, 0, $q); - } - - $a1 = md5($user . ':' . $challenge['realm'] . ':' . $password); - $a2 = md5($this->request->getMethod() . ':' . $url); - - if (empty($challenge['qop'])) { - $digest = md5($a1 . ':' . $challenge['nonce'] . ':' . $a2); - } else { - $challenge['cnonce'] = 'Req2.' . rand(); - if (empty($challenge['nc'])) { - $challenge['nc'] = 1; - } - $nc = sprintf('%08x', $challenge['nc']++); - $digest = md5($a1 . ':' . $challenge['nonce'] . ':' . $nc . ':' . - $challenge['cnonce'] . ':auth:' . $a2); - } - return 'Digest username="' . str_replace(array('\\', '"'), array('\\\\', '\\"'), $user) . '", ' . - 'realm="' . $challenge['realm'] . '", ' . - 'nonce="' . $challenge['nonce'] . '", ' . - 'uri="' . $url . '", ' . - 'response="' . $digest . '"' . - (!empty($challenge['opaque'])? - ', opaque="' . $challenge['opaque'] . '"': - '') . - (!empty($challenge['qop'])? - ', qop="auth", nc=' . $nc . ', cnonce="' . $challenge['cnonce'] . '"': - ''); - } - - /** - * Adds 'Authorization' header (if needed) to request headers array - * - * @param array request headers - * @param string request host (needed for digest authentication) - * @param string request URL (needed for digest authentication) - * @throws HTTP_Request2_Exception - */ - protected function addAuthorizationHeader(&$headers, $requestHost, $requestUrl) - { - if (!($auth = $this->request->getAuth())) { - return; - } - switch ($auth['scheme']) { - case HTTP_Request2::AUTH_BASIC: - $headers['authorization'] = - 'Basic ' . base64_encode($auth['user'] . ':' . $auth['password']); - break; - - case HTTP_Request2::AUTH_DIGEST: - unset($this->serverChallenge); - $fullUrl = ('/' == $requestUrl[0])? - $this->request->getUrl()->getScheme() . '://' . - $requestHost . $requestUrl: - $requestUrl; - foreach (array_keys(self::$challenges) as $key) { - if ($key == substr($fullUrl, 0, strlen($key))) { - $headers['authorization'] = $this->createDigestResponse( - $auth['user'], $auth['password'], - $requestUrl, self::$challenges[$key] - ); - $this->serverChallenge =& self::$challenges[$key]; - break; - } - } - break; - - default: - throw new HTTP_Request2_Exception( - "Unknown HTTP authentication scheme '{$auth['scheme']}'" - ); - } - } - - /** - * Adds 'Proxy-Authorization' header (if needed) to request headers array - * - * @param array request headers - * @param string request URL (needed for digest authentication) - * @throws HTTP_Request2_Exception - */ - protected function addProxyAuthorizationHeader(&$headers, $requestUrl) - { - if (!$this->request->getConfig('proxy_host') || - !($user = $this->request->getConfig('proxy_user')) || - (0 == strcasecmp('https', $this->request->getUrl()->getScheme()) && - HTTP_Request2::METHOD_CONNECT != $this->request->getMethod()) - ) { - return; - } - - $password = $this->request->getConfig('proxy_password'); - switch ($this->request->getConfig('proxy_auth_scheme')) { - case HTTP_Request2::AUTH_BASIC: - $headers['proxy-authorization'] = - 'Basic ' . base64_encode($user . ':' . $password); - break; - - case HTTP_Request2::AUTH_DIGEST: - unset($this->proxyChallenge); - $proxyUrl = 'proxy://' . $this->request->getConfig('proxy_host') . - ':' . $this->request->getConfig('proxy_port'); - if (!empty(self::$challenges[$proxyUrl])) { - $headers['proxy-authorization'] = $this->createDigestResponse( - $user, $password, - $requestUrl, self::$challenges[$proxyUrl] - ); - $this->proxyChallenge =& self::$challenges[$proxyUrl]; - } - break; - - default: - throw new HTTP_Request2_Exception( - "Unknown HTTP authentication scheme '" . - $this->request->getConfig('proxy_auth_scheme') . "'" - ); - } - } - - - /** - * Creates the string with the Request-Line and request headers - * - * @return string - * @throws HTTP_Request2_Exception - */ - protected function prepareHeaders() - { - $headers = $this->request->getHeaders(); - $url = $this->request->getUrl(); - $connect = HTTP_Request2::METHOD_CONNECT == $this->request->getMethod(); - $host = $url->getHost(); - - $defaultPort = 0 == strcasecmp($url->getScheme(), 'https')? 443: 80; - if (($port = $url->getPort()) && $port != $defaultPort || $connect) { - $host .= ':' . (empty($port)? $defaultPort: $port); - } - // Do not overwrite explicitly set 'Host' header, see bug #16146 - if (!isset($headers['host'])) { - $headers['host'] = $host; - } - - if ($connect) { - $requestUrl = $host; - - } else { - if (!$this->request->getConfig('proxy_host') || - 0 == strcasecmp($url->getScheme(), 'https') - ) { - $requestUrl = ''; - } else { - $requestUrl = $url->getScheme() . '://' . $host; - } - $path = $url->getPath(); - $query = $url->getQuery(); - $requestUrl .= (empty($path)? '/': $path) . (empty($query)? '': '?' . $query); - } - - if ('1.1' == $this->request->getConfig('protocol_version') && - extension_loaded('zlib') && !isset($headers['accept-encoding']) - ) { - $headers['accept-encoding'] = 'gzip, deflate'; - } - - $this->addAuthorizationHeader($headers, $host, $requestUrl); - $this->addProxyAuthorizationHeader($headers, $requestUrl); - $this->calculateRequestLength($headers); - - $headersStr = $this->request->getMethod() . ' ' . $requestUrl . ' HTTP/' . - $this->request->getConfig('protocol_version') . "\r\n"; - foreach ($headers as $name => $value) { - $canonicalName = implode('-', array_map('ucfirst', explode('-', $name))); - $headersStr .= $canonicalName . ': ' . $value . "\r\n"; - } - return $headersStr . "\r\n"; - } - - /** - * Sends the request body - * - * @throws HTTP_Request2_Exception - */ - protected function writeBody() - { - if (in_array($this->request->getMethod(), self::$bodyDisallowed) || - 0 == $this->contentLength - ) { - return; - } - - $position = 0; - $bufferSize = $this->request->getConfig('buffer_size'); - while ($position < $this->contentLength) { - if (is_string($this->requestBody)) { - $str = substr($this->requestBody, $position, $bufferSize); - } elseif (is_resource($this->requestBody)) { - $str = fread($this->requestBody, $bufferSize); - } else { - $str = $this->requestBody->read($bufferSize); - } - if (false === @fwrite($this->socket, $str, strlen($str))) { - throw new HTTP_Request2_Exception('Error writing request'); - } - // Provide the length of written string to the observer, request #7630 - $this->request->setLastEvent('sentBodyPart', strlen($str)); - $position += strlen($str); - } - } - - /** - * Reads the remote server's response - * - * @return HTTP_Request2_Response - * @throws HTTP_Request2_Exception - */ - protected function readResponse() - { - $bufferSize = $this->request->getConfig('buffer_size'); - - do { - $response = new HTTP_Request2_Response($this->readLine($bufferSize), true); - do { - $headerLine = $this->readLine($bufferSize); - $response->parseHeaderLine($headerLine); - } while ('' != $headerLine); - } while (in_array($response->getStatus(), array(100, 101))); - - $this->request->setLastEvent('receivedHeaders', $response); - - // No body possible in such responses - if (HTTP_Request2::METHOD_HEAD == $this->request->getMethod() || - (HTTP_Request2::METHOD_CONNECT == $this->request->getMethod() && - 200 <= $response->getStatus() && 300 > $response->getStatus()) || - in_array($response->getStatus(), array(204, 304)) - ) { - return $response; - } - - $chunked = 'chunked' == $response->getHeader('transfer-encoding'); - $length = $response->getHeader('content-length'); - $hasBody = false; - if ($chunked || null === $length || 0 < intval($length)) { - // RFC 2616, section 4.4: - // 3. ... If a message is received with both a - // Transfer-Encoding header field and a Content-Length header field, - // the latter MUST be ignored. - $toRead = ($chunked || null === $length)? null: $length; - $this->chunkLength = 0; - - while (!feof($this->socket) && (is_null($toRead) || 0 < $toRead)) { - if ($chunked) { - $data = $this->readChunked($bufferSize); - } elseif (is_null($toRead)) { - $data = $this->fread($bufferSize); - } else { - $data = $this->fread(min($toRead, $bufferSize)); - $toRead -= strlen($data); - } - if ('' == $data && (!$this->chunkLength || feof($this->socket))) { - break; - } - - $hasBody = true; - if ($this->request->getConfig('store_body')) { - $response->appendBody($data); - } - if (!in_array($response->getHeader('content-encoding'), array('identity', null))) { - $this->request->setLastEvent('receivedEncodedBodyPart', $data); - } else { - $this->request->setLastEvent('receivedBodyPart', $data); - } - } - } - - if ($hasBody) { - $this->request->setLastEvent('receivedBody', $response); - } - return $response; - } - - /** - * Reads until either the end of the socket or a newline, whichever comes first - * - * Strips the trailing newline from the returned data, handles global - * request timeout. Method idea borrowed from Net_Socket PEAR package. - * - * @param int buffer size to use for reading - * @return Available data up to the newline (not including newline) - * @throws HTTP_Request2_Exception In case of timeout - */ - protected function readLine($bufferSize) - { - $line = ''; - while (!feof($this->socket)) { - if ($this->deadline) { - stream_set_timeout($this->socket, max($this->deadline - time(), 1)); - } - $line .= @fgets($this->socket, $bufferSize); - $info = stream_get_meta_data($this->socket); - if ($info['timed_out'] || $this->deadline && time() > $this->deadline) { - $reason = $this->deadline - ? 'after ' . $this->request->getConfig('timeout') . ' second(s)' - : 'due to default_socket_timeout php.ini setting'; - throw new HTTP_Request2_Exception("Request timed out {$reason}"); - } - if (substr($line, -1) == "\n") { - return rtrim($line, "\r\n"); - } - } - return $line; - } - - /** - * Wrapper around fread(), handles global request timeout - * - * @param int Reads up to this number of bytes - * @return Data read from socket - * @throws HTTP_Request2_Exception In case of timeout - */ - protected function fread($length) - { - if ($this->deadline) { - stream_set_timeout($this->socket, max($this->deadline - time(), 1)); - } - $data = fread($this->socket, $length); - $info = stream_get_meta_data($this->socket); - if ($info['timed_out'] || $this->deadline && time() > $this->deadline) { - $reason = $this->deadline - ? 'after ' . $this->request->getConfig('timeout') . ' second(s)' - : 'due to default_socket_timeout php.ini setting'; - throw new HTTP_Request2_Exception("Request timed out {$reason}"); - } - return $data; - } - - /** - * Reads a part of response body encoded with chunked Transfer-Encoding - * - * @param int buffer size to use for reading - * @return string - * @throws HTTP_Request2_Exception - */ - protected function readChunked($bufferSize) - { - // at start of the next chunk? - if (0 == $this->chunkLength) { - $line = $this->readLine($bufferSize); - if (!preg_match('/^([0-9a-f]+)/i', $line, $matches)) { - throw new HTTP_Request2_Exception( - "Cannot decode chunked response, invalid chunk length '{$line}'" - ); - } else { - $this->chunkLength = hexdec($matches[1]); - // Chunk with zero length indicates the end - if (0 == $this->chunkLength) { - $this->readLine($bufferSize); - return ''; - } - } - } - $data = $this->fread(min($this->chunkLength, $bufferSize)); - $this->chunkLength -= strlen($data); - if (0 == $this->chunkLength) { - $this->readLine($bufferSize); // Trailing CRLF - } - return $data; - } -} - + + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * The names of the authors may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * @category HTTP + * @package HTTP_Request2 + * @author Alexey Borzov + * @license http://opensource.org/licenses/bsd-license.php New BSD License + * @version SVN: $Id: Socket.php 290921 2009-11-18 17:31:58Z avb $ + * @link http://pear.php.net/package/HTTP_Request2 + */ + +/** + * Base class for HTTP_Request2 adapters + */ +require_once 'HTTP/Request2/Adapter.php'; + +/** + * Socket-based adapter for HTTP_Request2 + * + * This adapter uses only PHP sockets and will work on almost any PHP + * environment. Code is based on original HTTP_Request PEAR package. + * + * @category HTTP + * @package HTTP_Request2 + * @author Alexey Borzov + * @version Release: 0.5.2 + */ +class HTTP_Request2_Adapter_Socket extends HTTP_Request2_Adapter +{ + /** + * Regular expression for 'token' rule from RFC 2616 + */ + const REGEXP_TOKEN = '[^\x00-\x1f\x7f-\xff()<>@,;:\\\\"/\[\]?={}\s]+'; + + /** + * Regular expression for 'quoted-string' rule from RFC 2616 + */ + const REGEXP_QUOTED_STRING = '"(?:\\\\.|[^\\\\"])*"'; + + /** + * Connected sockets, needed for Keep-Alive support + * @var array + * @see connect() + */ + protected static $sockets = array(); + + /** + * Data for digest authentication scheme + * + * The keys for the array are URL prefixes. + * + * The values are associative arrays with data (realm, nonce, nonce-count, + * opaque...) needed for digest authentication. Stored here to prevent making + * duplicate requests to digest-protected resources after we have already + * received the challenge. + * + * @var array + */ + protected static $challenges = array(); + + /** + * Connected socket + * @var resource + * @see connect() + */ + protected $socket; + + /** + * Challenge used for server digest authentication + * @var array + */ + protected $serverChallenge; + + /** + * Challenge used for proxy digest authentication + * @var array + */ + protected $proxyChallenge; + + /** + * Sum of start time and global timeout, exception will be thrown if request continues past this time + * @var integer + */ + protected $deadline = null; + + /** + * Remaining length of the current chunk, when reading chunked response + * @var integer + * @see readChunked() + */ + protected $chunkLength = 0; + + /** + * Remaining amount of redirections to follow + * + * Starts at 'max_redirects' configuration parameter and is reduced on each + * subsequent redirect. An Exception will be thrown once it reaches zero. + * + * @var integer + */ + protected $redirectCountdown = null; + + /** + * Sends request to the remote server and returns its response + * + * @param HTTP_Request2 + * @return HTTP_Request2_Response + * @throws HTTP_Request2_Exception + */ + public function sendRequest(HTTP_Request2 $request) + { + $this->request = $request; + + // Use global request timeout if given, see feature requests #5735, #8964 + if ($timeout = $request->getConfig('timeout')) { + $this->deadline = time() + $timeout; + } else { + $this->deadline = null; + } + + try { + $keepAlive = $this->connect(); + $headers = $this->prepareHeaders(); + if (false === @fwrite($this->socket, $headers, strlen($headers))) { + throw new HTTP_Request2_Exception('Error writing request'); + } + // provide request headers to the observer, see request #7633 + $this->request->setLastEvent('sentHeaders', $headers); + $this->writeBody(); + + if ($this->deadline && time() > $this->deadline) { + throw new HTTP_Request2_Exception( + 'Request timed out after ' . + $request->getConfig('timeout') . ' second(s)' + ); + } + + $response = $this->readResponse(); + + if (!$this->canKeepAlive($keepAlive, $response)) { + $this->disconnect(); + } + + if ($this->shouldUseProxyDigestAuth($response)) { + return $this->sendRequest($request); + } + if ($this->shouldUseServerDigestAuth($response)) { + return $this->sendRequest($request); + } + if ($authInfo = $response->getHeader('authentication-info')) { + $this->updateChallenge($this->serverChallenge, $authInfo); + } + if ($proxyInfo = $response->getHeader('proxy-authentication-info')) { + $this->updateChallenge($this->proxyChallenge, $proxyInfo); + } + + } catch (Exception $e) { + $this->disconnect(); + } + + unset($this->request, $this->requestBody); + + if (!empty($e)) { + throw $e; + } + + if (!$request->getConfig('follow_redirects') || !$response->isRedirect()) { + return $response; + } else { + return $this->handleRedirect($request, $response); + } + } + + /** + * Connects to the remote server + * + * @return bool whether the connection can be persistent + * @throws HTTP_Request2_Exception + */ + protected function connect() + { + $secure = 0 == strcasecmp($this->request->getUrl()->getScheme(), 'https'); + $tunnel = HTTP_Request2::METHOD_CONNECT == $this->request->getMethod(); + $headers = $this->request->getHeaders(); + $reqHost = $this->request->getUrl()->getHost(); + if (!($reqPort = $this->request->getUrl()->getPort())) { + $reqPort = $secure? 443: 80; + } + + if ($host = $this->request->getConfig('proxy_host')) { + if (!($port = $this->request->getConfig('proxy_port'))) { + throw new HTTP_Request2_Exception('Proxy port not provided'); + } + $proxy = true; + } else { + $host = $reqHost; + $port = $reqPort; + $proxy = false; + } + + if ($tunnel && !$proxy) { + throw new HTTP_Request2_Exception( + "Trying to perform CONNECT request without proxy" + ); + } + if ($secure && !in_array('ssl', stream_get_transports())) { + throw new HTTP_Request2_Exception( + 'Need OpenSSL support for https:// requests' + ); + } + + // RFC 2068, section 19.7.1: A client MUST NOT send the Keep-Alive + // connection token to a proxy server... + if ($proxy && !$secure && + !empty($headers['connection']) && 'Keep-Alive' == $headers['connection'] + ) { + $this->request->setHeader('connection'); + } + + $keepAlive = ('1.1' == $this->request->getConfig('protocol_version') && + empty($headers['connection'])) || + (!empty($headers['connection']) && + 'Keep-Alive' == $headers['connection']); + $host = ((!$secure || $proxy)? 'tcp://': 'ssl://') . $host; + + $options = array(); + if ($secure || $tunnel) { + foreach ($this->request->getConfig() as $name => $value) { + if ('ssl_' == substr($name, 0, 4) && null !== $value) { + if ('ssl_verify_host' == $name) { + if ($value) { + $options['CN_match'] = $reqHost; + } + } else { + $options[substr($name, 4)] = $value; + } + } + } + ksort($options); + } + + // Changing SSL context options after connection is established does *not* + // work, we need a new connection if options change + $remote = $host . ':' . $port; + $socketKey = $remote . (($secure && $proxy)? "->{$reqHost}:{$reqPort}": '') . + (empty($options)? '': ':' . serialize($options)); + unset($this->socket); + + // We use persistent connections and have a connected socket? + // Ensure that the socket is still connected, see bug #16149 + if ($keepAlive && !empty(self::$sockets[$socketKey]) && + !feof(self::$sockets[$socketKey]) + ) { + $this->socket =& self::$sockets[$socketKey]; + + } elseif ($secure && $proxy && !$tunnel) { + $this->establishTunnel(); + $this->request->setLastEvent( + 'connect', "ssl://{$reqHost}:{$reqPort} via {$host}:{$port}" + ); + self::$sockets[$socketKey] =& $this->socket; + + } else { + // Set SSL context options if doing HTTPS request or creating a tunnel + $context = stream_context_create(); + foreach ($options as $name => $value) { + if (!stream_context_set_option($context, 'ssl', $name, $value)) { + throw new HTTP_Request2_Exception( + "Error setting SSL context option '{$name}'" + ); + } + } + $this->socket = @stream_socket_client( + $remote, $errno, $errstr, + $this->request->getConfig('connect_timeout'), + STREAM_CLIENT_CONNECT, $context + ); + if (!$this->socket) { + throw new HTTP_Request2_Exception( + "Unable to connect to {$remote}. Error #{$errno}: {$errstr}" + ); + } + $this->request->setLastEvent('connect', $remote); + self::$sockets[$socketKey] =& $this->socket; + } + return $keepAlive; + } + + /** + * Establishes a tunnel to a secure remote server via HTTP CONNECT request + * + * This method will fail if 'ssl_verify_peer' is enabled. Probably because PHP + * sees that we are connected to a proxy server (duh!) rather than the server + * that presents its certificate. + * + * @link http://tools.ietf.org/html/rfc2817#section-5.2 + * @throws HTTP_Request2_Exception + */ + protected function establishTunnel() + { + $donor = new self; + $connect = new HTTP_Request2( + $this->request->getUrl(), HTTP_Request2::METHOD_CONNECT, + array_merge($this->request->getConfig(), + array('adapter' => $donor)) + ); + $response = $connect->send(); + // Need any successful (2XX) response + if (200 > $response->getStatus() || 300 <= $response->getStatus()) { + throw new HTTP_Request2_Exception( + 'Failed to connect via HTTPS proxy. Proxy response: ' . + $response->getStatus() . ' ' . $response->getReasonPhrase() + ); + } + $this->socket = $donor->socket; + + $modes = array( + STREAM_CRYPTO_METHOD_TLS_CLIENT, + STREAM_CRYPTO_METHOD_SSLv3_CLIENT, + STREAM_CRYPTO_METHOD_SSLv23_CLIENT, + STREAM_CRYPTO_METHOD_SSLv2_CLIENT + ); + + foreach ($modes as $mode) { + if (stream_socket_enable_crypto($this->socket, true, $mode)) { + return; + } + } + throw new HTTP_Request2_Exception( + 'Failed to enable secure connection when connecting through proxy' + ); + } + + /** + * Checks whether current connection may be reused or should be closed + * + * @param boolean whether connection could be persistent + * in the first place + * @param HTTP_Request2_Response response object to check + * @return boolean + */ + protected function canKeepAlive($requestKeepAlive, HTTP_Request2_Response $response) + { + // Do not close socket on successful CONNECT request + if (HTTP_Request2::METHOD_CONNECT == $this->request->getMethod() && + 200 <= $response->getStatus() && 300 > $response->getStatus() + ) { + return true; + } + + $lengthKnown = 'chunked' == strtolower($response->getHeader('transfer-encoding')) || + null !== $response->getHeader('content-length'); + $persistent = 'keep-alive' == strtolower($response->getHeader('connection')) || + (null === $response->getHeader('connection') && + '1.1' == $response->getVersion()); + return $requestKeepAlive && $lengthKnown && $persistent; + } + + /** + * Disconnects from the remote server + */ + protected function disconnect() + { + if (is_resource($this->socket)) { + fclose($this->socket); + $this->socket = null; + $this->request->setLastEvent('disconnect'); + } + } + + /** + * Handles HTTP redirection + * + * This method will throw an Exception if redirect to a non-HTTP(S) location + * is attempted, also if number of redirects performed already is equal to + * 'max_redirects' configuration parameter. + * + * @param HTTP_Request2 Original request + * @param HTTP_Request2_Response Response containing redirect + * @return HTTP_Request2_Response Response from a new location + * @throws HTTP_Request2_Exception + */ + protected function handleRedirect(HTTP_Request2 $request, + HTTP_Request2_Response $response) + { + if (is_null($this->redirectCountdown)) { + $this->redirectCountdown = $request->getConfig('max_redirects'); + } + if (0 == $this->redirectCountdown) { + // Copying cURL behaviour + throw new HTTP_Request2_Exception( + 'Maximum (' . $request->getConfig('max_redirects') . ') redirects followed' + ); + } + $redirectUrl = new Net_URL2( + $response->getHeader('location'), + array(Net_URL2::OPTION_USE_BRACKETS => $request->getConfig('use_brackets')) + ); + // refuse non-HTTP redirect + if ($redirectUrl->isAbsolute() + && !in_array($redirectUrl->getScheme(), array('http', 'https')) + ) { + throw new HTTP_Request2_Exception( + 'Refusing to redirect to a non-HTTP URL ' . $redirectUrl->__toString() + ); + } + // Theoretically URL should be absolute (see http://tools.ietf.org/html/rfc2616#section-14.30), + // but in practice it is often not + if (!$redirectUrl->isAbsolute()) { + $redirectUrl = $request->getUrl()->resolve($redirectUrl); + } + $redirect = clone $request; + $redirect->setUrl($redirectUrl); + if (303 == $response->getStatus() || (!$request->getConfig('strict_redirects') + && in_array($response->getStatus(), array(301, 302))) + ) { + $redirect->setMethod(HTTP_Request2::METHOD_GET); + $redirect->setBody(''); + } + + if (0 < $this->redirectCountdown) { + $this->redirectCountdown--; + } + return $this->sendRequest($redirect); + } + + /** + * Checks whether another request should be performed with server digest auth + * + * Several conditions should be satisfied for it to return true: + * - response status should be 401 + * - auth credentials should be set in the request object + * - response should contain WWW-Authenticate header with digest challenge + * - there is either no challenge stored for this URL or new challenge + * contains stale=true parameter (in other case we probably just failed + * due to invalid username / password) + * + * The method stores challenge values in $challenges static property + * + * @param HTTP_Request2_Response response to check + * @return boolean whether another request should be performed + * @throws HTTP_Request2_Exception in case of unsupported challenge parameters + */ + protected function shouldUseServerDigestAuth(HTTP_Request2_Response $response) + { + // no sense repeating a request if we don't have credentials + if (401 != $response->getStatus() || !$this->request->getAuth()) { + return false; + } + if (!$challenge = $this->parseDigestChallenge($response->getHeader('www-authenticate'))) { + return false; + } + + $url = $this->request->getUrl(); + $scheme = $url->getScheme(); + $host = $scheme . '://' . $url->getHost(); + if ($port = $url->getPort()) { + if ((0 == strcasecmp($scheme, 'http') && 80 != $port) || + (0 == strcasecmp($scheme, 'https') && 443 != $port) + ) { + $host .= ':' . $port; + } + } + + if (!empty($challenge['domain'])) { + $prefixes = array(); + foreach (preg_split('/\\s+/', $challenge['domain']) as $prefix) { + // don't bother with different servers + if ('/' == substr($prefix, 0, 1)) { + $prefixes[] = $host . $prefix; + } + } + } + if (empty($prefixes)) { + $prefixes = array($host . '/'); + } + + $ret = true; + foreach ($prefixes as $prefix) { + if (!empty(self::$challenges[$prefix]) && + (empty($challenge['stale']) || strcasecmp('true', $challenge['stale'])) + ) { + // probably credentials are invalid + $ret = false; + } + self::$challenges[$prefix] =& $challenge; + } + return $ret; + } + + /** + * Checks whether another request should be performed with proxy digest auth + * + * Several conditions should be satisfied for it to return true: + * - response status should be 407 + * - proxy auth credentials should be set in the request object + * - response should contain Proxy-Authenticate header with digest challenge + * - there is either no challenge stored for this proxy or new challenge + * contains stale=true parameter (in other case we probably just failed + * due to invalid username / password) + * + * The method stores challenge values in $challenges static property + * + * @param HTTP_Request2_Response response to check + * @return boolean whether another request should be performed + * @throws HTTP_Request2_Exception in case of unsupported challenge parameters + */ + protected function shouldUseProxyDigestAuth(HTTP_Request2_Response $response) + { + if (407 != $response->getStatus() || !$this->request->getConfig('proxy_user')) { + return false; + } + if (!($challenge = $this->parseDigestChallenge($response->getHeader('proxy-authenticate')))) { + return false; + } + + $key = 'proxy://' . $this->request->getConfig('proxy_host') . + ':' . $this->request->getConfig('proxy_port'); + + if (!empty(self::$challenges[$key]) && + (empty($challenge['stale']) || strcasecmp('true', $challenge['stale'])) + ) { + $ret = false; + } else { + $ret = true; + } + self::$challenges[$key] = $challenge; + return $ret; + } + + /** + * Extracts digest method challenge from (WWW|Proxy)-Authenticate header value + * + * There is a problem with implementation of RFC 2617: several of the parameters + * are defined as quoted-string there and thus may contain backslash escaped + * double quotes (RFC 2616, section 2.2). However, RFC 2617 defines unq(X) as + * just value of quoted-string X without surrounding quotes, it doesn't speak + * about removing backslash escaping. + * + * Now realm parameter is user-defined and human-readable, strange things + * happen when it contains quotes: + * - Apache allows quotes in realm, but apparently uses realm value without + * backslashes for digest computation + * - Squid allows (manually escaped) quotes there, but it is impossible to + * authorize with either escaped or unescaped quotes used in digest, + * probably it can't parse the response (?) + * - Both IE and Firefox display realm value with backslashes in + * the password popup and apparently use the same value for digest + * + * HTTP_Request2 follows IE and Firefox (and hopefully RFC 2617) in + * quoted-string handling, unfortunately that means failure to authorize + * sometimes + * + * @param string value of WWW-Authenticate or Proxy-Authenticate header + * @return mixed associative array with challenge parameters, false if + * no challenge is present in header value + * @throws HTTP_Request2_Exception in case of unsupported challenge parameters + */ + protected function parseDigestChallenge($headerValue) + { + $authParam = '(' . self::REGEXP_TOKEN . ')\\s*=\\s*(' . + self::REGEXP_TOKEN . '|' . self::REGEXP_QUOTED_STRING . ')'; + $challenge = "!(?<=^|\\s|,)Digest ({$authParam}\\s*(,\\s*|$))+!"; + if (!preg_match($challenge, $headerValue, $matches)) { + return false; + } + + preg_match_all('!' . $authParam . '!', $matches[0], $params); + $paramsAry = array(); + $knownParams = array('realm', 'domain', 'nonce', 'opaque', 'stale', + 'algorithm', 'qop'); + for ($i = 0; $i < count($params[0]); $i++) { + // section 3.2.1: Any unrecognized directive MUST be ignored. + if (in_array($params[1][$i], $knownParams)) { + if ('"' == substr($params[2][$i], 0, 1)) { + $paramsAry[$params[1][$i]] = substr($params[2][$i], 1, -1); + } else { + $paramsAry[$params[1][$i]] = $params[2][$i]; + } + } + } + // we only support qop=auth + if (!empty($paramsAry['qop']) && + !in_array('auth', array_map('trim', explode(',', $paramsAry['qop']))) + ) { + throw new HTTP_Request2_Exception( + "Only 'auth' qop is currently supported in digest authentication, " . + "server requested '{$paramsAry['qop']}'" + ); + } + // we only support algorithm=MD5 + if (!empty($paramsAry['algorithm']) && 'MD5' != $paramsAry['algorithm']) { + throw new HTTP_Request2_Exception( + "Only 'MD5' algorithm is currently supported in digest authentication, " . + "server requested '{$paramsAry['algorithm']}'" + ); + } + + return $paramsAry; + } + + /** + * Parses [Proxy-]Authentication-Info header value and updates challenge + * + * @param array challenge to update + * @param string value of [Proxy-]Authentication-Info header + * @todo validate server rspauth response + */ + protected function updateChallenge(&$challenge, $headerValue) + { + $authParam = '!(' . self::REGEXP_TOKEN . ')\\s*=\\s*(' . + self::REGEXP_TOKEN . '|' . self::REGEXP_QUOTED_STRING . ')!'; + $paramsAry = array(); + + preg_match_all($authParam, $headerValue, $params); + for ($i = 0; $i < count($params[0]); $i++) { + if ('"' == substr($params[2][$i], 0, 1)) { + $paramsAry[$params[1][$i]] = substr($params[2][$i], 1, -1); + } else { + $paramsAry[$params[1][$i]] = $params[2][$i]; + } + } + // for now, just update the nonce value + if (!empty($paramsAry['nextnonce'])) { + $challenge['nonce'] = $paramsAry['nextnonce']; + $challenge['nc'] = 1; + } + } + + /** + * Creates a value for [Proxy-]Authorization header when using digest authentication + * + * @param string user name + * @param string password + * @param string request URL + * @param array digest challenge parameters + * @return string value of [Proxy-]Authorization request header + * @link http://tools.ietf.org/html/rfc2617#section-3.2.2 + */ + protected function createDigestResponse($user, $password, $url, &$challenge) + { + if (false !== ($q = strpos($url, '?')) && + $this->request->getConfig('digest_compat_ie') + ) { + $url = substr($url, 0, $q); + } + + $a1 = md5($user . ':' . $challenge['realm'] . ':' . $password); + $a2 = md5($this->request->getMethod() . ':' . $url); + + if (empty($challenge['qop'])) { + $digest = md5($a1 . ':' . $challenge['nonce'] . ':' . $a2); + } else { + $challenge['cnonce'] = 'Req2.' . rand(); + if (empty($challenge['nc'])) { + $challenge['nc'] = 1; + } + $nc = sprintf('%08x', $challenge['nc']++); + $digest = md5($a1 . ':' . $challenge['nonce'] . ':' . $nc . ':' . + $challenge['cnonce'] . ':auth:' . $a2); + } + return 'Digest username="' . str_replace(array('\\', '"'), array('\\\\', '\\"'), $user) . '", ' . + 'realm="' . $challenge['realm'] . '", ' . + 'nonce="' . $challenge['nonce'] . '", ' . + 'uri="' . $url . '", ' . + 'response="' . $digest . '"' . + (!empty($challenge['opaque'])? + ', opaque="' . $challenge['opaque'] . '"': + '') . + (!empty($challenge['qop'])? + ', qop="auth", nc=' . $nc . ', cnonce="' . $challenge['cnonce'] . '"': + ''); + } + + /** + * Adds 'Authorization' header (if needed) to request headers array + * + * @param array request headers + * @param string request host (needed for digest authentication) + * @param string request URL (needed for digest authentication) + * @throws HTTP_Request2_Exception + */ + protected function addAuthorizationHeader(&$headers, $requestHost, $requestUrl) + { + if (!($auth = $this->request->getAuth())) { + return; + } + switch ($auth['scheme']) { + case HTTP_Request2::AUTH_BASIC: + $headers['authorization'] = + 'Basic ' . base64_encode($auth['user'] . ':' . $auth['password']); + break; + + case HTTP_Request2::AUTH_DIGEST: + unset($this->serverChallenge); + $fullUrl = ('/' == $requestUrl[0])? + $this->request->getUrl()->getScheme() . '://' . + $requestHost . $requestUrl: + $requestUrl; + foreach (array_keys(self::$challenges) as $key) { + if ($key == substr($fullUrl, 0, strlen($key))) { + $headers['authorization'] = $this->createDigestResponse( + $auth['user'], $auth['password'], + $requestUrl, self::$challenges[$key] + ); + $this->serverChallenge =& self::$challenges[$key]; + break; + } + } + break; + + default: + throw new HTTP_Request2_Exception( + "Unknown HTTP authentication scheme '{$auth['scheme']}'" + ); + } + } + + /** + * Adds 'Proxy-Authorization' header (if needed) to request headers array + * + * @param array request headers + * @param string request URL (needed for digest authentication) + * @throws HTTP_Request2_Exception + */ + protected function addProxyAuthorizationHeader(&$headers, $requestUrl) + { + if (!$this->request->getConfig('proxy_host') || + !($user = $this->request->getConfig('proxy_user')) || + (0 == strcasecmp('https', $this->request->getUrl()->getScheme()) && + HTTP_Request2::METHOD_CONNECT != $this->request->getMethod()) + ) { + return; + } + + $password = $this->request->getConfig('proxy_password'); + switch ($this->request->getConfig('proxy_auth_scheme')) { + case HTTP_Request2::AUTH_BASIC: + $headers['proxy-authorization'] = + 'Basic ' . base64_encode($user . ':' . $password); + break; + + case HTTP_Request2::AUTH_DIGEST: + unset($this->proxyChallenge); + $proxyUrl = 'proxy://' . $this->request->getConfig('proxy_host') . + ':' . $this->request->getConfig('proxy_port'); + if (!empty(self::$challenges[$proxyUrl])) { + $headers['proxy-authorization'] = $this->createDigestResponse( + $user, $password, + $requestUrl, self::$challenges[$proxyUrl] + ); + $this->proxyChallenge =& self::$challenges[$proxyUrl]; + } + break; + + default: + throw new HTTP_Request2_Exception( + "Unknown HTTP authentication scheme '" . + $this->request->getConfig('proxy_auth_scheme') . "'" + ); + } + } + + + /** + * Creates the string with the Request-Line and request headers + * + * @return string + * @throws HTTP_Request2_Exception + */ + protected function prepareHeaders() + { + $headers = $this->request->getHeaders(); + $url = $this->request->getUrl(); + $connect = HTTP_Request2::METHOD_CONNECT == $this->request->getMethod(); + $host = $url->getHost(); + + $defaultPort = 0 == strcasecmp($url->getScheme(), 'https')? 443: 80; + if (($port = $url->getPort()) && $port != $defaultPort || $connect) { + $host .= ':' . (empty($port)? $defaultPort: $port); + } + // Do not overwrite explicitly set 'Host' header, see bug #16146 + if (!isset($headers['host'])) { + $headers['host'] = $host; + } + + if ($connect) { + $requestUrl = $host; + + } else { + if (!$this->request->getConfig('proxy_host') || + 0 == strcasecmp($url->getScheme(), 'https') + ) { + $requestUrl = ''; + } else { + $requestUrl = $url->getScheme() . '://' . $host; + } + $path = $url->getPath(); + $query = $url->getQuery(); + $requestUrl .= (empty($path)? '/': $path) . (empty($query)? '': '?' . $query); + } + + if ('1.1' == $this->request->getConfig('protocol_version') && + extension_loaded('zlib') && !isset($headers['accept-encoding']) + ) { + $headers['accept-encoding'] = 'gzip, deflate'; + } + + $this->addAuthorizationHeader($headers, $host, $requestUrl); + $this->addProxyAuthorizationHeader($headers, $requestUrl); + $this->calculateRequestLength($headers); + + $headersStr = $this->request->getMethod() . ' ' . $requestUrl . ' HTTP/' . + $this->request->getConfig('protocol_version') . "\r\n"; + foreach ($headers as $name => $value) { + $canonicalName = implode('-', array_map('ucfirst', explode('-', $name))); + $headersStr .= $canonicalName . ': ' . $value . "\r\n"; + } + return $headersStr . "\r\n"; + } + + /** + * Sends the request body + * + * @throws HTTP_Request2_Exception + */ + protected function writeBody() + { + if (in_array($this->request->getMethod(), self::$bodyDisallowed) || + 0 == $this->contentLength + ) { + return; + } + + $position = 0; + $bufferSize = $this->request->getConfig('buffer_size'); + while ($position < $this->contentLength) { + if (is_string($this->requestBody)) { + $str = substr($this->requestBody, $position, $bufferSize); + } elseif (is_resource($this->requestBody)) { + $str = fread($this->requestBody, $bufferSize); + } else { + $str = $this->requestBody->read($bufferSize); + } + if (false === @fwrite($this->socket, $str, strlen($str))) { + throw new HTTP_Request2_Exception('Error writing request'); + } + // Provide the length of written string to the observer, request #7630 + $this->request->setLastEvent('sentBodyPart', strlen($str)); + $position += strlen($str); + } + } + + /** + * Reads the remote server's response + * + * @return HTTP_Request2_Response + * @throws HTTP_Request2_Exception + */ + protected function readResponse() + { + $bufferSize = $this->request->getConfig('buffer_size'); + + do { + $response = new HTTP_Request2_Response($this->readLine($bufferSize), true); + do { + $headerLine = $this->readLine($bufferSize); + $response->parseHeaderLine($headerLine); + } while ('' != $headerLine); + } while (in_array($response->getStatus(), array(100, 101))); + + $this->request->setLastEvent('receivedHeaders', $response); + + // No body possible in such responses + if (HTTP_Request2::METHOD_HEAD == $this->request->getMethod() || + (HTTP_Request2::METHOD_CONNECT == $this->request->getMethod() && + 200 <= $response->getStatus() && 300 > $response->getStatus()) || + in_array($response->getStatus(), array(204, 304)) + ) { + return $response; + } + + $chunked = 'chunked' == $response->getHeader('transfer-encoding'); + $length = $response->getHeader('content-length'); + $hasBody = false; + if ($chunked || null === $length || 0 < intval($length)) { + // RFC 2616, section 4.4: + // 3. ... If a message is received with both a + // Transfer-Encoding header field and a Content-Length header field, + // the latter MUST be ignored. + $toRead = ($chunked || null === $length)? null: $length; + $this->chunkLength = 0; + + while (!feof($this->socket) && (is_null($toRead) || 0 < $toRead)) { + if ($chunked) { + $data = $this->readChunked($bufferSize); + } elseif (is_null($toRead)) { + $data = $this->fread($bufferSize); + } else { + $data = $this->fread(min($toRead, $bufferSize)); + $toRead -= strlen($data); + } + if ('' == $data && (!$this->chunkLength || feof($this->socket))) { + break; + } + + $hasBody = true; + if ($this->request->getConfig('store_body')) { + $response->appendBody($data); + } + if (!in_array($response->getHeader('content-encoding'), array('identity', null))) { + $this->request->setLastEvent('receivedEncodedBodyPart', $data); + } else { + $this->request->setLastEvent('receivedBodyPart', $data); + } + } + } + + if ($hasBody) { + $this->request->setLastEvent('receivedBody', $response); + } + return $response; + } + + /** + * Reads until either the end of the socket or a newline, whichever comes first + * + * Strips the trailing newline from the returned data, handles global + * request timeout. Method idea borrowed from Net_Socket PEAR package. + * + * @param int buffer size to use for reading + * @return Available data up to the newline (not including newline) + * @throws HTTP_Request2_Exception In case of timeout + */ + protected function readLine($bufferSize) + { + $line = ''; + while (!feof($this->socket)) { + if ($this->deadline) { + stream_set_timeout($this->socket, max($this->deadline - time(), 1)); + } + $line .= @fgets($this->socket, $bufferSize); + $info = stream_get_meta_data($this->socket); + if ($info['timed_out'] || $this->deadline && time() > $this->deadline) { + $reason = $this->deadline + ? 'after ' . $this->request->getConfig('timeout') . ' second(s)' + : 'due to default_socket_timeout php.ini setting'; + throw new HTTP_Request2_Exception("Request timed out {$reason}"); + } + if (substr($line, -1) == "\n") { + return rtrim($line, "\r\n"); + } + } + return $line; + } + + /** + * Wrapper around fread(), handles global request timeout + * + * @param int Reads up to this number of bytes + * @return Data read from socket + * @throws HTTP_Request2_Exception In case of timeout + */ + protected function fread($length) + { + if ($this->deadline) { + stream_set_timeout($this->socket, max($this->deadline - time(), 1)); + } + $data = fread($this->socket, $length); + $info = stream_get_meta_data($this->socket); + if ($info['timed_out'] || $this->deadline && time() > $this->deadline) { + $reason = $this->deadline + ? 'after ' . $this->request->getConfig('timeout') . ' second(s)' + : 'due to default_socket_timeout php.ini setting'; + throw new HTTP_Request2_Exception("Request timed out {$reason}"); + } + return $data; + } + + /** + * Reads a part of response body encoded with chunked Transfer-Encoding + * + * @param int buffer size to use for reading + * @return string + * @throws HTTP_Request2_Exception + */ + protected function readChunked($bufferSize) + { + // at start of the next chunk? + if (0 == $this->chunkLength) { + $line = $this->readLine($bufferSize); + if (!preg_match('/^([0-9a-f]+)/i', $line, $matches)) { + throw new HTTP_Request2_Exception( + "Cannot decode chunked response, invalid chunk length '{$line}'" + ); + } else { + $this->chunkLength = hexdec($matches[1]); + // Chunk with zero length indicates the end + if (0 == $this->chunkLength) { + $this->readLine($bufferSize); + return ''; + } + } + } + $data = $this->fread(min($this->chunkLength, $bufferSize)); + $this->chunkLength -= strlen($data); + if (0 == $this->chunkLength) { + $this->readLine($bufferSize); // Trailing CRLF + } + return $data; + } +} + ?> \ No newline at end of file diff --git a/libs/PEAR.1.9/HTTP/Request2/Exception.php b/libs/PEAR.1.9/HTTP/Request2/Exception.php index 4109f89d0..2b960fc20 100644 --- a/libs/PEAR.1.9/HTTP/Request2/Exception.php +++ b/libs/PEAR.1.9/HTTP/Request2/Exception.php @@ -1,62 +1,62 @@ - - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * The names of the authors may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * @category HTTP - * @package HTTP_Request2 - * @author Alexey Borzov - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version SVN: $Id: Exception.php 290192 2009-11-03 21:29:32Z avb $ - * @link http://pear.php.net/package/HTTP_Request2 - */ - -/** - * Base class for exceptions in PEAR - */ -require_once 'PEAR/Exception.php'; - -/** - * Exception class for HTTP_Request2 package - * - * Such a class is required by the Exception RFC: - * http://pear.php.net/pepr/pepr-proposal-show.php?id=132 - * - * @category HTTP - * @package HTTP_Request2 - * @version Release: 0.5.2 - */ -class HTTP_Request2_Exception extends PEAR_Exception -{ -} + + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * The names of the authors may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * @category HTTP + * @package HTTP_Request2 + * @author Alexey Borzov + * @license http://opensource.org/licenses/bsd-license.php New BSD License + * @version SVN: $Id: Exception.php 290192 2009-11-03 21:29:32Z avb $ + * @link http://pear.php.net/package/HTTP_Request2 + */ + +/** + * Base class for exceptions in PEAR + */ +require_once 'PEAR/Exception.php'; + +/** + * Exception class for HTTP_Request2 package + * + * Such a class is required by the Exception RFC: + * http://pear.php.net/pepr/pepr-proposal-show.php?id=132 + * + * @category HTTP + * @package HTTP_Request2 + * @version Release: 0.5.2 + */ +class HTTP_Request2_Exception extends PEAR_Exception +{ +} ?> \ No newline at end of file diff --git a/libs/PEAR.1.9/HTTP/Request2/MultipartBody.php b/libs/PEAR.1.9/HTTP/Request2/MultipartBody.php index e2cc547d1..f640de3e7 100644 --- a/libs/PEAR.1.9/HTTP/Request2/MultipartBody.php +++ b/libs/PEAR.1.9/HTTP/Request2/MultipartBody.php @@ -1,274 +1,274 @@ - - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * The names of the authors may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * @category HTTP - * @package HTTP_Request2 - * @author Alexey Borzov - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version SVN: $Id: MultipartBody.php 290192 2009-11-03 21:29:32Z avb $ - * @link http://pear.php.net/package/HTTP_Request2 - */ - -/** - * Class for building multipart/form-data request body - * - * The class helps to reduce memory consumption by streaming large file uploads - * from disk, it also allows monitoring of upload progress (see request #7630) - * - * @category HTTP - * @package HTTP_Request2 - * @author Alexey Borzov - * @version Release: 0.5.2 - * @link http://tools.ietf.org/html/rfc1867 - */ -class HTTP_Request2_MultipartBody -{ - /** - * MIME boundary - * @var string - */ - private $_boundary; - - /** - * Form parameters added via {@link HTTP_Request2::addPostParameter()} - * @var array - */ - private $_params = array(); - - /** - * File uploads added via {@link HTTP_Request2::addUpload()} - * @var array - */ - private $_uploads = array(); - - /** - * Header for parts with parameters - * @var string - */ - private $_headerParam = "--%s\r\nContent-Disposition: form-data; name=\"%s\"\r\n\r\n"; - - /** - * Header for parts with uploads - * @var string - */ - private $_headerUpload = "--%s\r\nContent-Disposition: form-data; name=\"%s\"; filename=\"%s\"\r\nContent-Type: %s\r\n\r\n"; - - /** - * Current position in parameter and upload arrays - * - * First number is index of "current" part, second number is position within - * "current" part - * - * @var array - */ - private $_pos = array(0, 0); - - - /** - * Constructor. Sets the arrays with POST data. - * - * @param array values of form fields set via {@link HTTP_Request2::addPostParameter()} - * @param array file uploads set via {@link HTTP_Request2::addUpload()} - * @param bool whether to append brackets to array variable names - */ - public function __construct(array $params, array $uploads, $useBrackets = true) - { - $this->_params = self::_flattenArray('', $params, $useBrackets); - foreach ($uploads as $fieldName => $f) { - if (!is_array($f['fp'])) { - $this->_uploads[] = $f + array('name' => $fieldName); - } else { - for ($i = 0; $i < count($f['fp']); $i++) { - $upload = array( - 'name' => ($useBrackets? $fieldName . '[' . $i . ']': $fieldName) - ); - foreach (array('fp', 'filename', 'size', 'type') as $key) { - $upload[$key] = $f[$key][$i]; - } - $this->_uploads[] = $upload; - } - } - } - } - - /** - * Returns the length of the body to use in Content-Length header - * - * @return integer - */ - public function getLength() - { - $boundaryLength = strlen($this->getBoundary()); - $headerParamLength = strlen($this->_headerParam) - 4 + $boundaryLength; - $headerUploadLength = strlen($this->_headerUpload) - 8 + $boundaryLength; - $length = $boundaryLength + 6; - foreach ($this->_params as $p) { - $length += $headerParamLength + strlen($p[0]) + strlen($p[1]) + 2; - } - foreach ($this->_uploads as $u) { - $length += $headerUploadLength + strlen($u['name']) + strlen($u['type']) + - strlen($u['filename']) + $u['size'] + 2; - } - return $length; - } - - /** - * Returns the boundary to use in Content-Type header - * - * @return string - */ - public function getBoundary() - { - if (empty($this->_boundary)) { - $this->_boundary = '--' . md5('PEAR-HTTP_Request2-' . microtime()); - } - return $this->_boundary; - } - - /** - * Returns next chunk of request body - * - * @param integer Amount of bytes to read - * @return string Up to $length bytes of data, empty string if at end - */ - public function read($length) - { - $ret = ''; - $boundary = $this->getBoundary(); - $paramCount = count($this->_params); - $uploadCount = count($this->_uploads); - while ($length > 0 && $this->_pos[0] <= $paramCount + $uploadCount) { - $oldLength = $length; - if ($this->_pos[0] < $paramCount) { - $param = sprintf($this->_headerParam, $boundary, - $this->_params[$this->_pos[0]][0]) . - $this->_params[$this->_pos[0]][1] . "\r\n"; - $ret .= substr($param, $this->_pos[1], $length); - $length -= min(strlen($param) - $this->_pos[1], $length); - - } elseif ($this->_pos[0] < $paramCount + $uploadCount) { - $pos = $this->_pos[0] - $paramCount; - $header = sprintf($this->_headerUpload, $boundary, - $this->_uploads[$pos]['name'], - $this->_uploads[$pos]['filename'], - $this->_uploads[$pos]['type']); - if ($this->_pos[1] < strlen($header)) { - $ret .= substr($header, $this->_pos[1], $length); - $length -= min(strlen($header) - $this->_pos[1], $length); - } - $filePos = max(0, $this->_pos[1] - strlen($header)); - if ($length > 0 && $filePos < $this->_uploads[$pos]['size']) { - $ret .= fread($this->_uploads[$pos]['fp'], $length); - $length -= min($length, $this->_uploads[$pos]['size'] - $filePos); - } - if ($length > 0) { - $start = $this->_pos[1] + ($oldLength - $length) - - strlen($header) - $this->_uploads[$pos]['size']; - $ret .= substr("\r\n", $start, $length); - $length -= min(2 - $start, $length); - } - - } else { - $closing = '--' . $boundary . "--\r\n"; - $ret .= substr($closing, $this->_pos[1], $length); - $length -= min(strlen($closing) - $this->_pos[1], $length); - } - if ($length > 0) { - $this->_pos = array($this->_pos[0] + 1, 0); - } else { - $this->_pos[1] += $oldLength; - } - } - return $ret; - } - - /** - * Sets the current position to the start of the body - * - * This allows reusing the same body in another request - */ - public function rewind() - { - $this->_pos = array(0, 0); - foreach ($this->_uploads as $u) { - rewind($u['fp']); - } - } - - /** - * Returns the body as string - * - * Note that it reads all file uploads into memory so it is a good idea not - * to use this method with large file uploads and rely on read() instead. - * - * @return string - */ - public function __toString() - { - $this->rewind(); - return $this->read($this->getLength()); - } - - - /** - * Helper function to change the (probably multidimensional) associative array - * into the simple one. - * - * @param string name for item - * @param mixed item's values - * @param bool whether to append [] to array variables' names - * @return array array with the following items: array('item name', 'item value'); - */ - private static function _flattenArray($name, $values, $useBrackets) - { - if (!is_array($values)) { - return array(array($name, $values)); - } else { - $ret = array(); - foreach ($values as $k => $v) { - if (empty($name)) { - $newName = $k; - } elseif ($useBrackets) { - $newName = $name . '[' . $k . ']'; - } else { - $newName = $name; - } - $ret = array_merge($ret, self::_flattenArray($newName, $v, $useBrackets)); - } - return $ret; - } - } -} -?> + + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * The names of the authors may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * @category HTTP + * @package HTTP_Request2 + * @author Alexey Borzov + * @license http://opensource.org/licenses/bsd-license.php New BSD License + * @version SVN: $Id: MultipartBody.php 290192 2009-11-03 21:29:32Z avb $ + * @link http://pear.php.net/package/HTTP_Request2 + */ + +/** + * Class for building multipart/form-data request body + * + * The class helps to reduce memory consumption by streaming large file uploads + * from disk, it also allows monitoring of upload progress (see request #7630) + * + * @category HTTP + * @package HTTP_Request2 + * @author Alexey Borzov + * @version Release: 0.5.2 + * @link http://tools.ietf.org/html/rfc1867 + */ +class HTTP_Request2_MultipartBody +{ + /** + * MIME boundary + * @var string + */ + private $_boundary; + + /** + * Form parameters added via {@link HTTP_Request2::addPostParameter()} + * @var array + */ + private $_params = array(); + + /** + * File uploads added via {@link HTTP_Request2::addUpload()} + * @var array + */ + private $_uploads = array(); + + /** + * Header for parts with parameters + * @var string + */ + private $_headerParam = "--%s\r\nContent-Disposition: form-data; name=\"%s\"\r\n\r\n"; + + /** + * Header for parts with uploads + * @var string + */ + private $_headerUpload = "--%s\r\nContent-Disposition: form-data; name=\"%s\"; filename=\"%s\"\r\nContent-Type: %s\r\n\r\n"; + + /** + * Current position in parameter and upload arrays + * + * First number is index of "current" part, second number is position within + * "current" part + * + * @var array + */ + private $_pos = array(0, 0); + + + /** + * Constructor. Sets the arrays with POST data. + * + * @param array values of form fields set via {@link HTTP_Request2::addPostParameter()} + * @param array file uploads set via {@link HTTP_Request2::addUpload()} + * @param bool whether to append brackets to array variable names + */ + public function __construct(array $params, array $uploads, $useBrackets = true) + { + $this->_params = self::_flattenArray('', $params, $useBrackets); + foreach ($uploads as $fieldName => $f) { + if (!is_array($f['fp'])) { + $this->_uploads[] = $f + array('name' => $fieldName); + } else { + for ($i = 0; $i < count($f['fp']); $i++) { + $upload = array( + 'name' => ($useBrackets? $fieldName . '[' . $i . ']': $fieldName) + ); + foreach (array('fp', 'filename', 'size', 'type') as $key) { + $upload[$key] = $f[$key][$i]; + } + $this->_uploads[] = $upload; + } + } + } + } + + /** + * Returns the length of the body to use in Content-Length header + * + * @return integer + */ + public function getLength() + { + $boundaryLength = strlen($this->getBoundary()); + $headerParamLength = strlen($this->_headerParam) - 4 + $boundaryLength; + $headerUploadLength = strlen($this->_headerUpload) - 8 + $boundaryLength; + $length = $boundaryLength + 6; + foreach ($this->_params as $p) { + $length += $headerParamLength + strlen($p[0]) + strlen($p[1]) + 2; + } + foreach ($this->_uploads as $u) { + $length += $headerUploadLength + strlen($u['name']) + strlen($u['type']) + + strlen($u['filename']) + $u['size'] + 2; + } + return $length; + } + + /** + * Returns the boundary to use in Content-Type header + * + * @return string + */ + public function getBoundary() + { + if (empty($this->_boundary)) { + $this->_boundary = '--' . md5('PEAR-HTTP_Request2-' . microtime()); + } + return $this->_boundary; + } + + /** + * Returns next chunk of request body + * + * @param integer Amount of bytes to read + * @return string Up to $length bytes of data, empty string if at end + */ + public function read($length) + { + $ret = ''; + $boundary = $this->getBoundary(); + $paramCount = count($this->_params); + $uploadCount = count($this->_uploads); + while ($length > 0 && $this->_pos[0] <= $paramCount + $uploadCount) { + $oldLength = $length; + if ($this->_pos[0] < $paramCount) { + $param = sprintf($this->_headerParam, $boundary, + $this->_params[$this->_pos[0]][0]) . + $this->_params[$this->_pos[0]][1] . "\r\n"; + $ret .= substr($param, $this->_pos[1], $length); + $length -= min(strlen($param) - $this->_pos[1], $length); + + } elseif ($this->_pos[0] < $paramCount + $uploadCount) { + $pos = $this->_pos[0] - $paramCount; + $header = sprintf($this->_headerUpload, $boundary, + $this->_uploads[$pos]['name'], + $this->_uploads[$pos]['filename'], + $this->_uploads[$pos]['type']); + if ($this->_pos[1] < strlen($header)) { + $ret .= substr($header, $this->_pos[1], $length); + $length -= min(strlen($header) - $this->_pos[1], $length); + } + $filePos = max(0, $this->_pos[1] - strlen($header)); + if ($length > 0 && $filePos < $this->_uploads[$pos]['size']) { + $ret .= fread($this->_uploads[$pos]['fp'], $length); + $length -= min($length, $this->_uploads[$pos]['size'] - $filePos); + } + if ($length > 0) { + $start = $this->_pos[1] + ($oldLength - $length) - + strlen($header) - $this->_uploads[$pos]['size']; + $ret .= substr("\r\n", $start, $length); + $length -= min(2 - $start, $length); + } + + } else { + $closing = '--' . $boundary . "--\r\n"; + $ret .= substr($closing, $this->_pos[1], $length); + $length -= min(strlen($closing) - $this->_pos[1], $length); + } + if ($length > 0) { + $this->_pos = array($this->_pos[0] + 1, 0); + } else { + $this->_pos[1] += $oldLength; + } + } + return $ret; + } + + /** + * Sets the current position to the start of the body + * + * This allows reusing the same body in another request + */ + public function rewind() + { + $this->_pos = array(0, 0); + foreach ($this->_uploads as $u) { + rewind($u['fp']); + } + } + + /** + * Returns the body as string + * + * Note that it reads all file uploads into memory so it is a good idea not + * to use this method with large file uploads and rely on read() instead. + * + * @return string + */ + public function __toString() + { + $this->rewind(); + return $this->read($this->getLength()); + } + + + /** + * Helper function to change the (probably multidimensional) associative array + * into the simple one. + * + * @param string name for item + * @param mixed item's values + * @param bool whether to append [] to array variables' names + * @return array array with the following items: array('item name', 'item value'); + */ + private static function _flattenArray($name, $values, $useBrackets) + { + if (!is_array($values)) { + return array(array($name, $values)); + } else { + $ret = array(); + foreach ($values as $k => $v) { + if (empty($name)) { + $newName = $k; + } elseif ($useBrackets) { + $newName = $name . '[' . $k . ']'; + } else { + $newName = $name; + } + $ret = array_merge($ret, self::_flattenArray($newName, $v, $useBrackets)); + } + return $ret; + } + } +} +?> diff --git a/libs/PEAR.1.9/HTTP/Request2/Observer/Log.php b/libs/PEAR.1.9/HTTP/Request2/Observer/Log.php index add4a2ff0..7df821ef4 100644 --- a/libs/PEAR.1.9/HTTP/Request2/Observer/Log.php +++ b/libs/PEAR.1.9/HTTP/Request2/Observer/Log.php @@ -1,215 +1,215 @@ - - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * The names of the authors may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * @category HTTP - * @package HTTP_Request2 - * @author David Jean Louis - * @author Alexey Borzov - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version SVN: $Id: Log.php 293416 2010-01-11 18:06:15Z avb $ - * @link http://pear.php.net/package/HTTP_Request2 - */ - -/** - * Exception class for HTTP_Request2 package - */ -require_once 'HTTP/Request2/Exception.php'; - -/** - * A debug observer useful for debugging / testing. - * - * This observer logs to a log target data corresponding to the various request - * and response events, it logs by default to php://output but can be configured - * to log to a file or via the PEAR Log package. - * - * A simple example: - * - * require_once 'HTTP/Request2.php'; - * require_once 'HTTP/Request2/Observer/Log.php'; - * - * $request = new HTTP_Request2('http://www.example.com'); - * $observer = new HTTP_Request2_Observer_Log(); - * $request->attach($observer); - * $request->send(); - * - * - * A more complex example with PEAR Log: - * - * require_once 'HTTP/Request2.php'; - * require_once 'HTTP/Request2/Observer/Log.php'; - * require_once 'Log.php'; - * - * $request = new HTTP_Request2('http://www.example.com'); - * // we want to log with PEAR log - * $observer = new HTTP_Request2_Observer_Log(Log::factory('console')); - * - * // we only want to log received headers - * $observer->events = array('receivedHeaders'); - * - * $request->attach($observer); - * $request->send(); - * - * - * @category HTTP - * @package HTTP_Request2 - * @author David Jean Louis - * @author Alexey Borzov - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version Release: 0.5.2 - * @link http://pear.php.net/package/HTTP_Request2 - */ -class HTTP_Request2_Observer_Log implements SplObserver -{ - // properties {{{ - - /** - * The log target, it can be a a resource or a PEAR Log instance. - * - * @var resource|Log $target - */ - protected $target = null; - - /** - * The events to log. - * - * @var array $events - */ - public $events = array( - 'connect', - 'sentHeaders', - 'sentBodyPart', - 'receivedHeaders', - 'receivedBody', - 'disconnect', - ); - - // }}} - // __construct() {{{ - - /** - * Constructor. - * - * @param mixed $target Can be a file path (default: php://output), a resource, - * or an instance of the PEAR Log class. - * @param array $events Array of events to listen to (default: all events) - * - * @return void - */ - public function __construct($target = 'php://output', array $events = array()) - { - if (!empty($events)) { - $this->events = $events; - } - if (is_resource($target) || $target instanceof Log) { - $this->target = $target; - } elseif (false === ($this->target = @fopen($target, 'ab'))) { - throw new HTTP_Request2_Exception("Unable to open '{$target}'"); - } - } - - // }}} - // update() {{{ - - /** - * Called when the request notifies us of an event. - * - * @param HTTP_Request2 $subject The HTTP_Request2 instance - * - * @return void - */ - public function update(SplSubject $subject) - { - $event = $subject->getLastEvent(); - if (!in_array($event['name'], $this->events)) { - return; - } - - switch ($event['name']) { - case 'connect': - $this->log('* Connected to ' . $event['data']); - break; - case 'sentHeaders': - $headers = explode("\r\n", $event['data']); - array_pop($headers); - foreach ($headers as $header) { - $this->log('> ' . $header); - } - break; - case 'sentBodyPart': - $this->log('> ' . $event['data'] . ' byte(s) sent'); - break; - case 'receivedHeaders': - $this->log(sprintf('< HTTP/%s %s %s', - $event['data']->getVersion(), - $event['data']->getStatus(), - $event['data']->getReasonPhrase())); - $headers = $event['data']->getHeader(); - foreach ($headers as $key => $val) { - $this->log('< ' . $key . ': ' . $val); - } - $this->log('< '); - break; - case 'receivedBody': - $this->log($event['data']->getBody()); - break; - case 'disconnect': - $this->log('* Disconnected'); - break; - } - } - - // }}} - // log() {{{ - - /** - * Logs the given message to the configured target. - * - * @param string $message Message to display - * - * @return void - */ - protected function log($message) - { - if ($this->target instanceof Log) { - $this->target->debug($message); - } elseif (is_resource($this->target)) { - fwrite($this->target, $message . "\r\n"); - } - } - - // }}} -} - + + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * The names of the authors may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * @category HTTP + * @package HTTP_Request2 + * @author David Jean Louis + * @author Alexey Borzov + * @license http://opensource.org/licenses/bsd-license.php New BSD License + * @version SVN: $Id: Log.php 293416 2010-01-11 18:06:15Z avb $ + * @link http://pear.php.net/package/HTTP_Request2 + */ + +/** + * Exception class for HTTP_Request2 package + */ +require_once 'HTTP/Request2/Exception.php'; + +/** + * A debug observer useful for debugging / testing. + * + * This observer logs to a log target data corresponding to the various request + * and response events, it logs by default to php://output but can be configured + * to log to a file or via the PEAR Log package. + * + * A simple example: + * + * require_once 'HTTP/Request2.php'; + * require_once 'HTTP/Request2/Observer/Log.php'; + * + * $request = new HTTP_Request2('http://www.example.com'); + * $observer = new HTTP_Request2_Observer_Log(); + * $request->attach($observer); + * $request->send(); + * + * + * A more complex example with PEAR Log: + * + * require_once 'HTTP/Request2.php'; + * require_once 'HTTP/Request2/Observer/Log.php'; + * require_once 'Log.php'; + * + * $request = new HTTP_Request2('http://www.example.com'); + * // we want to log with PEAR log + * $observer = new HTTP_Request2_Observer_Log(Log::factory('console')); + * + * // we only want to log received headers + * $observer->events = array('receivedHeaders'); + * + * $request->attach($observer); + * $request->send(); + * + * + * @category HTTP + * @package HTTP_Request2 + * @author David Jean Louis + * @author Alexey Borzov + * @license http://opensource.org/licenses/bsd-license.php New BSD License + * @version Release: 0.5.2 + * @link http://pear.php.net/package/HTTP_Request2 + */ +class HTTP_Request2_Observer_Log implements SplObserver +{ + // properties {{{ + + /** + * The log target, it can be a a resource or a PEAR Log instance. + * + * @var resource|Log $target + */ + protected $target = null; + + /** + * The events to log. + * + * @var array $events + */ + public $events = array( + 'connect', + 'sentHeaders', + 'sentBodyPart', + 'receivedHeaders', + 'receivedBody', + 'disconnect', + ); + + // }}} + // __construct() {{{ + + /** + * Constructor. + * + * @param mixed $target Can be a file path (default: php://output), a resource, + * or an instance of the PEAR Log class. + * @param array $events Array of events to listen to (default: all events) + * + * @return void + */ + public function __construct($target = 'php://output', array $events = array()) + { + if (!empty($events)) { + $this->events = $events; + } + if (is_resource($target) || $target instanceof Log) { + $this->target = $target; + } elseif (false === ($this->target = @fopen($target, 'ab'))) { + throw new HTTP_Request2_Exception("Unable to open '{$target}'"); + } + } + + // }}} + // update() {{{ + + /** + * Called when the request notifies us of an event. + * + * @param HTTP_Request2 $subject The HTTP_Request2 instance + * + * @return void + */ + public function update(SplSubject $subject) + { + $event = $subject->getLastEvent(); + if (!in_array($event['name'], $this->events)) { + return; + } + + switch ($event['name']) { + case 'connect': + $this->log('* Connected to ' . $event['data']); + break; + case 'sentHeaders': + $headers = explode("\r\n", $event['data']); + array_pop($headers); + foreach ($headers as $header) { + $this->log('> ' . $header); + } + break; + case 'sentBodyPart': + $this->log('> ' . $event['data'] . ' byte(s) sent'); + break; + case 'receivedHeaders': + $this->log(sprintf('< HTTP/%s %s %s', + $event['data']->getVersion(), + $event['data']->getStatus(), + $event['data']->getReasonPhrase())); + $headers = $event['data']->getHeader(); + foreach ($headers as $key => $val) { + $this->log('< ' . $key . ': ' . $val); + } + $this->log('< '); + break; + case 'receivedBody': + $this->log($event['data']->getBody()); + break; + case 'disconnect': + $this->log('* Disconnected'); + break; + } + } + + // }}} + // log() {{{ + + /** + * Logs the given message to the configured target. + * + * @param string $message Message to display + * + * @return void + */ + protected function log($message) + { + if ($this->target instanceof Log) { + $this->target->debug($message); + } elseif (is_resource($this->target)) { + fwrite($this->target, $message . "\r\n"); + } + } + + // }}} +} + ?> \ No newline at end of file diff --git a/libs/PEAR.1.9/HTTP/Request2/Response.php b/libs/PEAR.1.9/HTTP/Request2/Response.php index 30679c880..f27ea51f4 100644 --- a/libs/PEAR.1.9/HTTP/Request2/Response.php +++ b/libs/PEAR.1.9/HTTP/Request2/Response.php @@ -1,559 +1,559 @@ - - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * The names of the authors may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * @category HTTP - * @package HTTP_Request2 - * @author Alexey Borzov - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version SVN: $Id: Response.php 290520 2009-11-11 20:09:42Z avb $ - * @link http://pear.php.net/package/HTTP_Request2 - */ - -/** - * Exception class for HTTP_Request2 package - */ -require_once 'HTTP/Request2/Exception.php'; - -/** - * Class representing a HTTP response - * - * The class is designed to be used in "streaming" scenario, building the - * response as it is being received: - * - * $statusLine = read_status_line(); - * $response = new HTTP_Request2_Response($statusLine); - * do { - * $headerLine = read_header_line(); - * $response->parseHeaderLine($headerLine); - * } while ($headerLine != ''); - * - * while ($chunk = read_body()) { - * $response->appendBody($chunk); - * } - * - * var_dump($response->getHeader(), $response->getCookies(), $response->getBody()); - * - * - * - * @category HTTP - * @package HTTP_Request2 - * @author Alexey Borzov - * @version Release: 0.5.2 - * @link http://tools.ietf.org/html/rfc2616#section-6 - */ -class HTTP_Request2_Response -{ - /** - * HTTP protocol version (e.g. 1.0, 1.1) - * @var string - */ - protected $version; - - /** - * Status code - * @var integer - * @link http://tools.ietf.org/html/rfc2616#section-6.1.1 - */ - protected $code; - - /** - * Reason phrase - * @var string - * @link http://tools.ietf.org/html/rfc2616#section-6.1.1 - */ - protected $reasonPhrase; - - /** - * Associative array of response headers - * @var array - */ - protected $headers = array(); - - /** - * Cookies set in the response - * @var array - */ - protected $cookies = array(); - - /** - * Name of last header processed by parseHederLine() - * - * Used to handle the headers that span multiple lines - * - * @var string - */ - protected $lastHeader = null; - - /** - * Response body - * @var string - */ - protected $body = ''; - - /** - * Whether the body is still encoded by Content-Encoding - * - * cURL provides the decoded body to the callback; if we are reading from - * socket the body is still gzipped / deflated - * - * @var bool - */ - protected $bodyEncoded; - - /** - * Associative array of HTTP status code / reason phrase. - * - * @var array - * @link http://tools.ietf.org/html/rfc2616#section-10 - */ - protected static $phrases = array( - - // 1xx: Informational - Request received, continuing process - 100 => 'Continue', - 101 => 'Switching Protocols', - - // 2xx: Success - The action was successfully received, understood and - // accepted - 200 => 'OK', - 201 => 'Created', - 202 => 'Accepted', - 203 => 'Non-Authoritative Information', - 204 => 'No Content', - 205 => 'Reset Content', - 206 => 'Partial Content', - - // 3xx: Redirection - Further action must be taken in order to complete - // the request - 300 => 'Multiple Choices', - 301 => 'Moved Permanently', - 302 => 'Found', // 1.1 - 303 => 'See Other', - 304 => 'Not Modified', - 305 => 'Use Proxy', - 307 => 'Temporary Redirect', - - // 4xx: Client Error - The request contains bad syntax or cannot be - // fulfilled - 400 => 'Bad Request', - 401 => 'Unauthorized', - 402 => 'Payment Required', - 403 => 'Forbidden', - 404 => 'Not Found', - 405 => 'Method Not Allowed', - 406 => 'Not Acceptable', - 407 => 'Proxy Authentication Required', - 408 => 'Request Timeout', - 409 => 'Conflict', - 410 => 'Gone', - 411 => 'Length Required', - 412 => 'Precondition Failed', - 413 => 'Request Entity Too Large', - 414 => 'Request-URI Too Long', - 415 => 'Unsupported Media Type', - 416 => 'Requested Range Not Satisfiable', - 417 => 'Expectation Failed', - - // 5xx: Server Error - The server failed to fulfill an apparently - // valid request - 500 => 'Internal Server Error', - 501 => 'Not Implemented', - 502 => 'Bad Gateway', - 503 => 'Service Unavailable', - 504 => 'Gateway Timeout', - 505 => 'HTTP Version Not Supported', - 509 => 'Bandwidth Limit Exceeded', - - ); - - /** - * Constructor, parses the response status line - * - * @param string Response status line (e.g. "HTTP/1.1 200 OK") - * @param bool Whether body is still encoded by Content-Encoding - * @throws HTTP_Request2_Exception if status line is invalid according to spec - */ - public function __construct($statusLine, $bodyEncoded = true) - { - if (!preg_match('!^HTTP/(\d\.\d) (\d{3})(?: (.+))?!', $statusLine, $m)) { - throw new HTTP_Request2_Exception("Malformed response: {$statusLine}"); - } - $this->version = $m[1]; - $this->code = intval($m[2]); - if (!empty($m[3])) { - $this->reasonPhrase = trim($m[3]); - } elseif (!empty(self::$phrases[$this->code])) { - $this->reasonPhrase = self::$phrases[$this->code]; - } - $this->bodyEncoded = (bool)$bodyEncoded; - } - - /** - * Parses the line from HTTP response filling $headers array - * - * The method should be called after reading the line from socket or receiving - * it into cURL callback. Passing an empty string here indicates the end of - * response headers and triggers additional processing, so be sure to pass an - * empty string in the end. - * - * @param string Line from HTTP response - */ - public function parseHeaderLine($headerLine) - { - $headerLine = trim($headerLine, "\r\n"); - - // empty string signals the end of headers, process the received ones - if ('' == $headerLine) { - if (!empty($this->headers['set-cookie'])) { - $cookies = is_array($this->headers['set-cookie'])? - $this->headers['set-cookie']: - array($this->headers['set-cookie']); - foreach ($cookies as $cookieString) { - $this->parseCookie($cookieString); - } - unset($this->headers['set-cookie']); - } - foreach (array_keys($this->headers) as $k) { - if (is_array($this->headers[$k])) { - $this->headers[$k] = implode(', ', $this->headers[$k]); - } - } - - // string of the form header-name: header value - } elseif (preg_match('!^([^\x00-\x1f\x7f-\xff()<>@,;:\\\\"/\[\]?={}\s]+):(.+)$!', $headerLine, $m)) { - $name = strtolower($m[1]); - $value = trim($m[2]); - if (empty($this->headers[$name])) { - $this->headers[$name] = $value; - } else { - if (!is_array($this->headers[$name])) { - $this->headers[$name] = array($this->headers[$name]); - } - $this->headers[$name][] = $value; - } - $this->lastHeader = $name; - - // continuation of a previous header - } elseif (preg_match('!^\s+(.+)$!', $headerLine, $m) && $this->lastHeader) { - if (!is_array($this->headers[$this->lastHeader])) { - $this->headers[$this->lastHeader] .= ' ' . trim($m[1]); - } else { - $key = count($this->headers[$this->lastHeader]) - 1; - $this->headers[$this->lastHeader][$key] .= ' ' . trim($m[1]); - } - } - } - - /** - * Parses a Set-Cookie header to fill $cookies array - * - * @param string value of Set-Cookie header - * @link http://web.archive.org/web/20080331104521/http://cgi.netscape.com/newsref/std/cookie_spec.html - */ - protected function parseCookie($cookieString) - { - $cookie = array( - 'expires' => null, - 'domain' => null, - 'path' => null, - 'secure' => false - ); - - // Only a name=value pair - if (!strpos($cookieString, ';')) { - $pos = strpos($cookieString, '='); - $cookie['name'] = trim(substr($cookieString, 0, $pos)); - $cookie['value'] = trim(substr($cookieString, $pos + 1)); - - // Some optional parameters are supplied - } else { - $elements = explode(';', $cookieString); - $pos = strpos($elements[0], '='); - $cookie['name'] = trim(substr($elements[0], 0, $pos)); - $cookie['value'] = trim(substr($elements[0], $pos + 1)); - - for ($i = 1; $i < count($elements); $i++) { - if (false === strpos($elements[$i], '=')) { - $elName = trim($elements[$i]); - $elValue = null; - } else { - list ($elName, $elValue) = array_map('trim', explode('=', $elements[$i])); - } - $elName = strtolower($elName); - if ('secure' == $elName) { - $cookie['secure'] = true; - } elseif ('expires' == $elName) { - $cookie['expires'] = str_replace('"', '', $elValue); - } elseif ('path' == $elName || 'domain' == $elName) { - $cookie[$elName] = urldecode($elValue); - } else { - $cookie[$elName] = $elValue; - } - } - } - $this->cookies[] = $cookie; - } - - /** - * Appends a string to the response body - * @param string - */ - public function appendBody($bodyChunk) - { - $this->body .= $bodyChunk; - } - - /** - * Returns the status code - * @return integer - */ - public function getStatus() - { - return $this->code; - } - - /** - * Returns the reason phrase - * @return string - */ - public function getReasonPhrase() - { - return $this->reasonPhrase; - } - - /** - * Whether response is a redirect that can be automatically handled by HTTP_Request2 - * @return bool - */ - public function isRedirect() - { - return in_array($this->code, array(300, 301, 302, 303, 307)) - && isset($this->headers['location']); - } - - /** - * Returns either the named header or all response headers - * - * @param string Name of header to return - * @return string|array Value of $headerName header (null if header is - * not present), array of all response headers if - * $headerName is null - */ - public function getHeader($headerName = null) - { - if (null === $headerName) { - return $this->headers; - } else { - $headerName = strtolower($headerName); - return isset($this->headers[$headerName])? $this->headers[$headerName]: null; - } - } - - /** - * Returns cookies set in response - * - * @return array - */ - public function getCookies() - { - return $this->cookies; - } - - /** - * Returns the body of the response - * - * @return string - * @throws HTTP_Request2_Exception if body cannot be decoded - */ - public function getBody() - { - if (!$this->bodyEncoded || - !in_array(strtolower($this->getHeader('content-encoding')), array('gzip', 'deflate')) - ) { - return $this->body; - - } else { - if (extension_loaded('mbstring') && (2 & ini_get('mbstring.func_overload'))) { - $oldEncoding = mb_internal_encoding(); - mb_internal_encoding('iso-8859-1'); - } - - try { - switch (strtolower($this->getHeader('content-encoding'))) { - case 'gzip': - $decoded = self::decodeGzip($this->body); - break; - case 'deflate': - $decoded = self::decodeDeflate($this->body); - } - } catch (Exception $e) { - } - - if (!empty($oldEncoding)) { - mb_internal_encoding($oldEncoding); - } - if (!empty($e)) { - throw $e; - } - return $decoded; - } - } - - /** - * Get the HTTP version of the response - * - * @return string - */ - public function getVersion() - { - return $this->version; - } - - /** - * Decodes the message-body encoded by gzip - * - * The real decoding work is done by gzinflate() built-in function, this - * method only parses the header and checks data for compliance with - * RFC 1952 - * - * @param string gzip-encoded data - * @return string decoded data - * @throws HTTP_Request2_Exception - * @link http://tools.ietf.org/html/rfc1952 - */ - public static function decodeGzip($data) - { - $length = strlen($data); - // If it doesn't look like gzip-encoded data, don't bother - if (18 > $length || strcmp(substr($data, 0, 2), "\x1f\x8b")) { - return $data; - } - if (!function_exists('gzinflate')) { - throw new HTTP_Request2_Exception('Unable to decode body: gzip extension not available'); - } - $method = ord(substr($data, 2, 1)); - if (8 != $method) { - throw new HTTP_Request2_Exception('Error parsing gzip header: unknown compression method'); - } - $flags = ord(substr($data, 3, 1)); - if ($flags & 224) { - throw new HTTP_Request2_Exception('Error parsing gzip header: reserved bits are set'); - } - - // header is 10 bytes minimum. may be longer, though. - $headerLength = 10; - // extra fields, need to skip 'em - if ($flags & 4) { - if ($length - $headerLength - 2 < 8) { - throw new HTTP_Request2_Exception('Error parsing gzip header: data too short'); - } - $extraLength = unpack('v', substr($data, 10, 2)); - if ($length - $headerLength - 2 - $extraLength[1] < 8) { - throw new HTTP_Request2_Exception('Error parsing gzip header: data too short'); - } - $headerLength += $extraLength[1] + 2; - } - // file name, need to skip that - if ($flags & 8) { - if ($length - $headerLength - 1 < 8) { - throw new HTTP_Request2_Exception('Error parsing gzip header: data too short'); - } - $filenameLength = strpos(substr($data, $headerLength), chr(0)); - if (false === $filenameLength || $length - $headerLength - $filenameLength - 1 < 8) { - throw new HTTP_Request2_Exception('Error parsing gzip header: data too short'); - } - $headerLength += $filenameLength + 1; - } - // comment, need to skip that also - if ($flags & 16) { - if ($length - $headerLength - 1 < 8) { - throw new HTTP_Request2_Exception('Error parsing gzip header: data too short'); - } - $commentLength = strpos(substr($data, $headerLength), chr(0)); - if (false === $commentLength || $length - $headerLength - $commentLength - 1 < 8) { - throw new HTTP_Request2_Exception('Error parsing gzip header: data too short'); - } - $headerLength += $commentLength + 1; - } - // have a CRC for header. let's check - if ($flags & 2) { - if ($length - $headerLength - 2 < 8) { - throw new HTTP_Request2_Exception('Error parsing gzip header: data too short'); - } - $crcReal = 0xffff & crc32(substr($data, 0, $headerLength)); - $crcStored = unpack('v', substr($data, $headerLength, 2)); - if ($crcReal != $crcStored[1]) { - throw new HTTP_Request2_Exception('Header CRC check failed'); - } - $headerLength += 2; - } - // unpacked data CRC and size at the end of encoded data - $tmp = unpack('V2', substr($data, -8)); - $dataCrc = $tmp[1]; - $dataSize = $tmp[2]; - - // finally, call the gzinflate() function - // don't pass $dataSize to gzinflate, see bugs #13135, #14370 - $unpacked = gzinflate(substr($data, $headerLength, -8)); - if (false === $unpacked) { - throw new HTTP_Request2_Exception('gzinflate() call failed'); - } elseif ($dataSize != strlen($unpacked)) { - throw new HTTP_Request2_Exception('Data size check failed'); - } elseif ((0xffffffff & $dataCrc) != (0xffffffff & crc32($unpacked))) { - throw new HTTP_Request2_Exception('Data CRC check failed'); - } - return $unpacked; - } - - /** - * Decodes the message-body encoded by deflate - * - * @param string deflate-encoded data - * @return string decoded data - * @throws HTTP_Request2_Exception - */ - public static function decodeDeflate($data) - { - if (!function_exists('gzuncompress')) { - throw new HTTP_Request2_Exception('Unable to decode body: gzip extension not available'); - } - // RFC 2616 defines 'deflate' encoding as zlib format from RFC 1950, - // while many applications send raw deflate stream from RFC 1951. - // We should check for presence of zlib header and use gzuncompress() or - // gzinflate() as needed. See bug #15305 - $header = unpack('n', substr($data, 0, 2)); - return (0 == $header[1] % 31)? gzuncompress($data): gzinflate($data); - } -} + + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * The names of the authors may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * @category HTTP + * @package HTTP_Request2 + * @author Alexey Borzov + * @license http://opensource.org/licenses/bsd-license.php New BSD License + * @version SVN: $Id: Response.php 290520 2009-11-11 20:09:42Z avb $ + * @link http://pear.php.net/package/HTTP_Request2 + */ + +/** + * Exception class for HTTP_Request2 package + */ +require_once 'HTTP/Request2/Exception.php'; + +/** + * Class representing a HTTP response + * + * The class is designed to be used in "streaming" scenario, building the + * response as it is being received: + * + * $statusLine = read_status_line(); + * $response = new HTTP_Request2_Response($statusLine); + * do { + * $headerLine = read_header_line(); + * $response->parseHeaderLine($headerLine); + * } while ($headerLine != ''); + * + * while ($chunk = read_body()) { + * $response->appendBody($chunk); + * } + * + * var_dump($response->getHeader(), $response->getCookies(), $response->getBody()); + * + * + * + * @category HTTP + * @package HTTP_Request2 + * @author Alexey Borzov + * @version Release: 0.5.2 + * @link http://tools.ietf.org/html/rfc2616#section-6 + */ +class HTTP_Request2_Response +{ + /** + * HTTP protocol version (e.g. 1.0, 1.1) + * @var string + */ + protected $version; + + /** + * Status code + * @var integer + * @link http://tools.ietf.org/html/rfc2616#section-6.1.1 + */ + protected $code; + + /** + * Reason phrase + * @var string + * @link http://tools.ietf.org/html/rfc2616#section-6.1.1 + */ + protected $reasonPhrase; + + /** + * Associative array of response headers + * @var array + */ + protected $headers = array(); + + /** + * Cookies set in the response + * @var array + */ + protected $cookies = array(); + + /** + * Name of last header processed by parseHederLine() + * + * Used to handle the headers that span multiple lines + * + * @var string + */ + protected $lastHeader = null; + + /** + * Response body + * @var string + */ + protected $body = ''; + + /** + * Whether the body is still encoded by Content-Encoding + * + * cURL provides the decoded body to the callback; if we are reading from + * socket the body is still gzipped / deflated + * + * @var bool + */ + protected $bodyEncoded; + + /** + * Associative array of HTTP status code / reason phrase. + * + * @var array + * @link http://tools.ietf.org/html/rfc2616#section-10 + */ + protected static $phrases = array( + + // 1xx: Informational - Request received, continuing process + 100 => 'Continue', + 101 => 'Switching Protocols', + + // 2xx: Success - The action was successfully received, understood and + // accepted + 200 => 'OK', + 201 => 'Created', + 202 => 'Accepted', + 203 => 'Non-Authoritative Information', + 204 => 'No Content', + 205 => 'Reset Content', + 206 => 'Partial Content', + + // 3xx: Redirection - Further action must be taken in order to complete + // the request + 300 => 'Multiple Choices', + 301 => 'Moved Permanently', + 302 => 'Found', // 1.1 + 303 => 'See Other', + 304 => 'Not Modified', + 305 => 'Use Proxy', + 307 => 'Temporary Redirect', + + // 4xx: Client Error - The request contains bad syntax or cannot be + // fulfilled + 400 => 'Bad Request', + 401 => 'Unauthorized', + 402 => 'Payment Required', + 403 => 'Forbidden', + 404 => 'Not Found', + 405 => 'Method Not Allowed', + 406 => 'Not Acceptable', + 407 => 'Proxy Authentication Required', + 408 => 'Request Timeout', + 409 => 'Conflict', + 410 => 'Gone', + 411 => 'Length Required', + 412 => 'Precondition Failed', + 413 => 'Request Entity Too Large', + 414 => 'Request-URI Too Long', + 415 => 'Unsupported Media Type', + 416 => 'Requested Range Not Satisfiable', + 417 => 'Expectation Failed', + + // 5xx: Server Error - The server failed to fulfill an apparently + // valid request + 500 => 'Internal Server Error', + 501 => 'Not Implemented', + 502 => 'Bad Gateway', + 503 => 'Service Unavailable', + 504 => 'Gateway Timeout', + 505 => 'HTTP Version Not Supported', + 509 => 'Bandwidth Limit Exceeded', + + ); + + /** + * Constructor, parses the response status line + * + * @param string Response status line (e.g. "HTTP/1.1 200 OK") + * @param bool Whether body is still encoded by Content-Encoding + * @throws HTTP_Request2_Exception if status line is invalid according to spec + */ + public function __construct($statusLine, $bodyEncoded = true) + { + if (!preg_match('!^HTTP/(\d\.\d) (\d{3})(?: (.+))?!', $statusLine, $m)) { + throw new HTTP_Request2_Exception("Malformed response: {$statusLine}"); + } + $this->version = $m[1]; + $this->code = intval($m[2]); + if (!empty($m[3])) { + $this->reasonPhrase = trim($m[3]); + } elseif (!empty(self::$phrases[$this->code])) { + $this->reasonPhrase = self::$phrases[$this->code]; + } + $this->bodyEncoded = (bool)$bodyEncoded; + } + + /** + * Parses the line from HTTP response filling $headers array + * + * The method should be called after reading the line from socket or receiving + * it into cURL callback. Passing an empty string here indicates the end of + * response headers and triggers additional processing, so be sure to pass an + * empty string in the end. + * + * @param string Line from HTTP response + */ + public function parseHeaderLine($headerLine) + { + $headerLine = trim($headerLine, "\r\n"); + + // empty string signals the end of headers, process the received ones + if ('' == $headerLine) { + if (!empty($this->headers['set-cookie'])) { + $cookies = is_array($this->headers['set-cookie'])? + $this->headers['set-cookie']: + array($this->headers['set-cookie']); + foreach ($cookies as $cookieString) { + $this->parseCookie($cookieString); + } + unset($this->headers['set-cookie']); + } + foreach (array_keys($this->headers) as $k) { + if (is_array($this->headers[$k])) { + $this->headers[$k] = implode(', ', $this->headers[$k]); + } + } + + // string of the form header-name: header value + } elseif (preg_match('!^([^\x00-\x1f\x7f-\xff()<>@,;:\\\\"/\[\]?={}\s]+):(.+)$!', $headerLine, $m)) { + $name = strtolower($m[1]); + $value = trim($m[2]); + if (empty($this->headers[$name])) { + $this->headers[$name] = $value; + } else { + if (!is_array($this->headers[$name])) { + $this->headers[$name] = array($this->headers[$name]); + } + $this->headers[$name][] = $value; + } + $this->lastHeader = $name; + + // continuation of a previous header + } elseif (preg_match('!^\s+(.+)$!', $headerLine, $m) && $this->lastHeader) { + if (!is_array($this->headers[$this->lastHeader])) { + $this->headers[$this->lastHeader] .= ' ' . trim($m[1]); + } else { + $key = count($this->headers[$this->lastHeader]) - 1; + $this->headers[$this->lastHeader][$key] .= ' ' . trim($m[1]); + } + } + } + + /** + * Parses a Set-Cookie header to fill $cookies array + * + * @param string value of Set-Cookie header + * @link http://web.archive.org/web/20080331104521/http://cgi.netscape.com/newsref/std/cookie_spec.html + */ + protected function parseCookie($cookieString) + { + $cookie = array( + 'expires' => null, + 'domain' => null, + 'path' => null, + 'secure' => false + ); + + // Only a name=value pair + if (!strpos($cookieString, ';')) { + $pos = strpos($cookieString, '='); + $cookie['name'] = trim(substr($cookieString, 0, $pos)); + $cookie['value'] = trim(substr($cookieString, $pos + 1)); + + // Some optional parameters are supplied + } else { + $elements = explode(';', $cookieString); + $pos = strpos($elements[0], '='); + $cookie['name'] = trim(substr($elements[0], 0, $pos)); + $cookie['value'] = trim(substr($elements[0], $pos + 1)); + + for ($i = 1; $i < count($elements); $i++) { + if (false === strpos($elements[$i], '=')) { + $elName = trim($elements[$i]); + $elValue = null; + } else { + list ($elName, $elValue) = array_map('trim', explode('=', $elements[$i])); + } + $elName = strtolower($elName); + if ('secure' == $elName) { + $cookie['secure'] = true; + } elseif ('expires' == $elName) { + $cookie['expires'] = str_replace('"', '', $elValue); + } elseif ('path' == $elName || 'domain' == $elName) { + $cookie[$elName] = urldecode($elValue); + } else { + $cookie[$elName] = $elValue; + } + } + } + $this->cookies[] = $cookie; + } + + /** + * Appends a string to the response body + * @param string + */ + public function appendBody($bodyChunk) + { + $this->body .= $bodyChunk; + } + + /** + * Returns the status code + * @return integer + */ + public function getStatus() + { + return $this->code; + } + + /** + * Returns the reason phrase + * @return string + */ + public function getReasonPhrase() + { + return $this->reasonPhrase; + } + + /** + * Whether response is a redirect that can be automatically handled by HTTP_Request2 + * @return bool + */ + public function isRedirect() + { + return in_array($this->code, array(300, 301, 302, 303, 307)) + && isset($this->headers['location']); + } + + /** + * Returns either the named header or all response headers + * + * @param string Name of header to return + * @return string|array Value of $headerName header (null if header is + * not present), array of all response headers if + * $headerName is null + */ + public function getHeader($headerName = null) + { + if (null === $headerName) { + return $this->headers; + } else { + $headerName = strtolower($headerName); + return isset($this->headers[$headerName])? $this->headers[$headerName]: null; + } + } + + /** + * Returns cookies set in response + * + * @return array + */ + public function getCookies() + { + return $this->cookies; + } + + /** + * Returns the body of the response + * + * @return string + * @throws HTTP_Request2_Exception if body cannot be decoded + */ + public function getBody() + { + if (!$this->bodyEncoded || + !in_array(strtolower($this->getHeader('content-encoding')), array('gzip', 'deflate')) + ) { + return $this->body; + + } else { + if (extension_loaded('mbstring') && (2 & ini_get('mbstring.func_overload'))) { + $oldEncoding = mb_internal_encoding(); + mb_internal_encoding('iso-8859-1'); + } + + try { + switch (strtolower($this->getHeader('content-encoding'))) { + case 'gzip': + $decoded = self::decodeGzip($this->body); + break; + case 'deflate': + $decoded = self::decodeDeflate($this->body); + } + } catch (Exception $e) { + } + + if (!empty($oldEncoding)) { + mb_internal_encoding($oldEncoding); + } + if (!empty($e)) { + throw $e; + } + return $decoded; + } + } + + /** + * Get the HTTP version of the response + * + * @return string + */ + public function getVersion() + { + return $this->version; + } + + /** + * Decodes the message-body encoded by gzip + * + * The real decoding work is done by gzinflate() built-in function, this + * method only parses the header and checks data for compliance with + * RFC 1952 + * + * @param string gzip-encoded data + * @return string decoded data + * @throws HTTP_Request2_Exception + * @link http://tools.ietf.org/html/rfc1952 + */ + public static function decodeGzip($data) + { + $length = strlen($data); + // If it doesn't look like gzip-encoded data, don't bother + if (18 > $length || strcmp(substr($data, 0, 2), "\x1f\x8b")) { + return $data; + } + if (!function_exists('gzinflate')) { + throw new HTTP_Request2_Exception('Unable to decode body: gzip extension not available'); + } + $method = ord(substr($data, 2, 1)); + if (8 != $method) { + throw new HTTP_Request2_Exception('Error parsing gzip header: unknown compression method'); + } + $flags = ord(substr($data, 3, 1)); + if ($flags & 224) { + throw new HTTP_Request2_Exception('Error parsing gzip header: reserved bits are set'); + } + + // header is 10 bytes minimum. may be longer, though. + $headerLength = 10; + // extra fields, need to skip 'em + if ($flags & 4) { + if ($length - $headerLength - 2 < 8) { + throw new HTTP_Request2_Exception('Error parsing gzip header: data too short'); + } + $extraLength = unpack('v', substr($data, 10, 2)); + if ($length - $headerLength - 2 - $extraLength[1] < 8) { + throw new HTTP_Request2_Exception('Error parsing gzip header: data too short'); + } + $headerLength += $extraLength[1] + 2; + } + // file name, need to skip that + if ($flags & 8) { + if ($length - $headerLength - 1 < 8) { + throw new HTTP_Request2_Exception('Error parsing gzip header: data too short'); + } + $filenameLength = strpos(substr($data, $headerLength), chr(0)); + if (false === $filenameLength || $length - $headerLength - $filenameLength - 1 < 8) { + throw new HTTP_Request2_Exception('Error parsing gzip header: data too short'); + } + $headerLength += $filenameLength + 1; + } + // comment, need to skip that also + if ($flags & 16) { + if ($length - $headerLength - 1 < 8) { + throw new HTTP_Request2_Exception('Error parsing gzip header: data too short'); + } + $commentLength = strpos(substr($data, $headerLength), chr(0)); + if (false === $commentLength || $length - $headerLength - $commentLength - 1 < 8) { + throw new HTTP_Request2_Exception('Error parsing gzip header: data too short'); + } + $headerLength += $commentLength + 1; + } + // have a CRC for header. let's check + if ($flags & 2) { + if ($length - $headerLength - 2 < 8) { + throw new HTTP_Request2_Exception('Error parsing gzip header: data too short'); + } + $crcReal = 0xffff & crc32(substr($data, 0, $headerLength)); + $crcStored = unpack('v', substr($data, $headerLength, 2)); + if ($crcReal != $crcStored[1]) { + throw new HTTP_Request2_Exception('Header CRC check failed'); + } + $headerLength += 2; + } + // unpacked data CRC and size at the end of encoded data + $tmp = unpack('V2', substr($data, -8)); + $dataCrc = $tmp[1]; + $dataSize = $tmp[2]; + + // finally, call the gzinflate() function + // don't pass $dataSize to gzinflate, see bugs #13135, #14370 + $unpacked = gzinflate(substr($data, $headerLength, -8)); + if (false === $unpacked) { + throw new HTTP_Request2_Exception('gzinflate() call failed'); + } elseif ($dataSize != strlen($unpacked)) { + throw new HTTP_Request2_Exception('Data size check failed'); + } elseif ((0xffffffff & $dataCrc) != (0xffffffff & crc32($unpacked))) { + throw new HTTP_Request2_Exception('Data CRC check failed'); + } + return $unpacked; + } + + /** + * Decodes the message-body encoded by deflate + * + * @param string deflate-encoded data + * @return string decoded data + * @throws HTTP_Request2_Exception + */ + public static function decodeDeflate($data) + { + if (!function_exists('gzuncompress')) { + throw new HTTP_Request2_Exception('Unable to decode body: gzip extension not available'); + } + // RFC 2616 defines 'deflate' encoding as zlib format from RFC 1950, + // while many applications send raw deflate stream from RFC 1951. + // We should check for presence of zlib header and use gzuncompress() or + // gzinflate() as needed. See bug #15305 + $header = unpack('n', substr($data, 0, 2)); + return (0 == $header[1] % 31)? gzuncompress($data): gzinflate($data); + } +} ?> \ No newline at end of file diff --git a/libs/PEAR/HTTP/Request.php b/libs/PEAR/HTTP/Request.php index 67062ccd6..96fc2e5ba 100644 --- a/libs/PEAR/HTTP/Request.php +++ b/libs/PEAR/HTTP/Request.php @@ -1,1461 +1,1461 @@ - - * @author Alexey Borzov - * @copyright 2002-2007 Richard Heyes - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Request.php,v 1.55 2007/05/18 19:20:12 avb Exp $ - * @link http://pear.php.net/package/HTTP_Request/ - */ - -/** - * PEAR and PEAR_Error classes (for error handling) - */ -require_once 'PEAR.php'; -/** - * Socket class - */ -require_once 'Net/Socket.php'; -/** - * URL handling class - */ -require_once 'Net/URL.php'; - -/**#@+ - * Constants for HTTP request methods - */ -define('HTTP_REQUEST_METHOD_GET', 'GET', true); -define('HTTP_REQUEST_METHOD_HEAD', 'HEAD', true); -define('HTTP_REQUEST_METHOD_POST', 'POST', true); -define('HTTP_REQUEST_METHOD_PUT', 'PUT', true); -define('HTTP_REQUEST_METHOD_DELETE', 'DELETE', true); -define('HTTP_REQUEST_METHOD_OPTIONS', 'OPTIONS', true); -define('HTTP_REQUEST_METHOD_TRACE', 'TRACE', true); -/**#@-*/ - -/**#@+ - * Constants for HTTP protocol versions - */ -define('HTTP_REQUEST_HTTP_VER_1_0', '1.0', true); -define('HTTP_REQUEST_HTTP_VER_1_1', '1.1', true); -/**#@-*/ - -if (extension_loaded('mbstring') && (2 & ini_get('mbstring.func_overload'))) { - /** - * Whether string functions are overloaded by their mbstring equivalents - */ - define('HTTP_REQUEST_MBSTRING', true); -} else { - /** - * @ignore - */ - define('HTTP_REQUEST_MBSTRING', false); -} - -/** - * Class for performing HTTP requests - * - * Simple example (fetches yahoo.com and displays it): - * - * $a = &new HTTP_Request('http://www.yahoo.com/'); - * $a->sendRequest(); - * echo $a->getResponseBody(); - * - * - * @category HTTP - * @package HTTP_Request - * @author Richard Heyes - * @author Alexey Borzov - * @version Release: 1.4.1 - */ -class HTTP_Request -{ - /**#@+ - * @access private - */ - /** - * Instance of Net_URL - * @var Net_URL - */ - var $_url; - - /** - * Type of request - * @var string - */ - var $_method; - - /** - * HTTP Version - * @var string - */ - var $_http; - - /** - * Request headers - * @var array - */ - var $_requestHeaders; - - /** - * Basic Auth Username - * @var string - */ - var $_user; - - /** - * Basic Auth Password - * @var string - */ - var $_pass; - - /** - * Socket object - * @var Net_Socket - */ - var $_sock; - - /** - * Proxy server - * @var string - */ - var $_proxy_host; - - /** - * Proxy port - * @var integer - */ - var $_proxy_port; - - /** - * Proxy username - * @var string - */ - var $_proxy_user; - - /** - * Proxy password - * @var string - */ - var $_proxy_pass; - - /** - * Post data - * @var array - */ - var $_postData; - - /** - * Request body - * @var string - */ - var $_body; - - /** - * A list of methods that MUST NOT have a request body, per RFC 2616 - * @var array - */ - var $_bodyDisallowed = array('TRACE'); - - /** - * Files to post - * @var array - */ - var $_postFiles = array(); - - /** - * Connection timeout. - * @var float - */ - var $_timeout; - - /** - * HTTP_Response object - * @var HTTP_Response - */ - var $_response; - - /** - * Whether to allow redirects - * @var boolean - */ - var $_allowRedirects; - - /** - * Maximum redirects allowed - * @var integer - */ - var $_maxRedirects; - - /** - * Current number of redirects - * @var integer - */ - var $_redirects; - - /** - * Whether to append brackets [] to array variables - * @var bool - */ - var $_useBrackets = true; - - /** - * Attached listeners - * @var array - */ - var $_listeners = array(); - - /** - * Whether to save response body in response object property - * @var bool - */ - var $_saveBody = true; - - /** - * Timeout for reading from socket (array(seconds, microseconds)) - * @var array - */ - var $_readTimeout = null; - - /** - * Options to pass to Net_Socket::connect. See stream_context_create - * @var array - */ - var $_socketOptions = null; - /**#@-*/ - - /** - * Constructor - * - * Sets up the object - * @param string The url to fetch/access - * @param array Associative array of parameters which can have the following keys: - *
    - *
  • method - Method to use, GET, POST etc (string)
  • - *
  • http - HTTP Version to use, 1.0 or 1.1 (string)
  • - *
  • user - Basic Auth username (string)
  • - *
  • pass - Basic Auth password (string)
  • - *
  • proxy_host - Proxy server host (string)
  • - *
  • proxy_port - Proxy server port (integer)
  • - *
  • proxy_user - Proxy auth username (string)
  • - *
  • proxy_pass - Proxy auth password (string)
  • - *
  • timeout - Connection timeout in seconds (float)
  • - *
  • allowRedirects - Whether to follow redirects or not (bool)
  • - *
  • maxRedirects - Max number of redirects to follow (integer)
  • - *
  • useBrackets - Whether to append [] to array variable names (bool)
  • - *
  • saveBody - Whether to save response body in response object property (bool)
  • - *
  • readTimeout - Timeout for reading / writing data over the socket (array (seconds, microseconds))
  • - *
  • socketOptions - Options to pass to Net_Socket object (array)
  • - *
- * @access public - */ - function HTTP_Request($url = '', $params = array()) - { - $this->_method = HTTP_REQUEST_METHOD_GET; - $this->_http = HTTP_REQUEST_HTTP_VER_1_1; - $this->_requestHeaders = array(); - $this->_postData = array(); - $this->_body = null; - - $this->_user = null; - $this->_pass = null; - - $this->_proxy_host = null; - $this->_proxy_port = null; - $this->_proxy_user = null; - $this->_proxy_pass = null; - - $this->_allowRedirects = false; - $this->_maxRedirects = 3; - $this->_redirects = 0; - - $this->_timeout = null; - $this->_response = null; - - foreach ($params as $key => $value) { - $this->{'_' . $key} = $value; - } - - if (!empty($url)) { - $this->setURL($url); - } - - // Default useragent - $this->addHeader('User-Agent', 'PEAR HTTP_Request class ( http://pear.php.net/ )'); - - // We don't do keep-alives by default - $this->addHeader('Connection', 'close'); - - // Basic authentication - if (!empty($this->_user)) { - $this->addHeader('Authorization', 'Basic ' . base64_encode($this->_user . ':' . $this->_pass)); - } - - // Proxy authentication (see bug #5913) - if (!empty($this->_proxy_user)) { - $this->addHeader('Proxy-Authorization', 'Basic ' . base64_encode($this->_proxy_user . ':' . $this->_proxy_pass)); - } - - // Use gzip encoding if possible - if (HTTP_REQUEST_HTTP_VER_1_1 == $this->_http && extension_loaded('zlib')) { - $this->addHeader('Accept-Encoding', 'gzip'); - } - } - - /** - * Generates a Host header for HTTP/1.1 requests - * - * @access private - * @return string - */ - function _generateHostHeader() - { - if ($this->_url->port != 80 AND strcasecmp($this->_url->protocol, 'http') == 0) { - $host = $this->_url->host . ':' . $this->_url->port; - - } elseif ($this->_url->port != 443 AND strcasecmp($this->_url->protocol, 'https') == 0) { - $host = $this->_url->host . ':' . $this->_url->port; - - } elseif ($this->_url->port == 443 AND strcasecmp($this->_url->protocol, 'https') == 0 AND strpos($this->_url->url, ':443') !== false) { - $host = $this->_url->host . ':' . $this->_url->port; - - } else { - $host = $this->_url->host; - } - - return $host; - } - - /** - * Resets the object to its initial state (DEPRECATED). - * Takes the same parameters as the constructor. - * - * @param string $url The url to be requested - * @param array $params Associative array of parameters - * (see constructor for details) - * @access public - * @deprecated deprecated since 1.2, call the constructor if this is necessary - */ - function reset($url, $params = array()) - { - $this->HTTP_Request($url, $params); - } - - /** - * Sets the URL to be requested - * - * @param string The url to be requested - * @access public - */ - function setURL($url) - { - $this->_url = &new Net_URL($url, $this->_useBrackets); - - if (!empty($this->_url->user) || !empty($this->_url->pass)) { - $this->setBasicAuth($this->_url->user, $this->_url->pass); - } - - if (HTTP_REQUEST_HTTP_VER_1_1 == $this->_http) { - $this->addHeader('Host', $this->_generateHostHeader()); - } - - // set '/' instead of empty path rather than check later (see bug #8662) - if (empty($this->_url->path)) { - $this->_url->path = '/'; - } - } - - /** - * Returns the current request URL - * - * @return string Current request URL - * @access public - */ - function getUrl() - { - return empty($this->_url)? '': $this->_url->getUrl(); - } - - /** - * Sets a proxy to be used - * - * @param string Proxy host - * @param int Proxy port - * @param string Proxy username - * @param string Proxy password - * @access public - */ - function setProxy($host, $port = 8080, $user = null, $pass = null) - { - $this->_proxy_host = $host; - $this->_proxy_port = $port; - $this->_proxy_user = $user; - $this->_proxy_pass = $pass; - - if (!empty($user)) { - $this->addHeader('Proxy-Authorization', 'Basic ' . base64_encode($user . ':' . $pass)); - } - } - - /** - * Sets basic authentication parameters - * - * @param string Username - * @param string Password - */ - function setBasicAuth($user, $pass) - { - $this->_user = $user; - $this->_pass = $pass; - - $this->addHeader('Authorization', 'Basic ' . base64_encode($user . ':' . $pass)); - } - - /** - * Sets the method to be used, GET, POST etc. - * - * @param string Method to use. Use the defined constants for this - * @access public - */ - function setMethod($method) - { - $this->_method = $method; - } - - /** - * Sets the HTTP version to use, 1.0 or 1.1 - * - * @param string Version to use. Use the defined constants for this - * @access public - */ - function setHttpVer($http) - { - $this->_http = $http; - } - - /** - * Adds a request header - * - * @param string Header name - * @param string Header value - * @access public - */ - function addHeader($name, $value) - { - $this->_requestHeaders[strtolower($name)] = $value; - } - - /** - * Removes a request header - * - * @param string Header name to remove - * @access public - */ - function removeHeader($name) - { - if (isset($this->_requestHeaders[strtolower($name)])) { - unset($this->_requestHeaders[strtolower($name)]); - } - } - - /** - * Adds a querystring parameter - * - * @param string Querystring parameter name - * @param string Querystring parameter value - * @param bool Whether the value is already urlencoded or not, default = not - * @access public - */ - function addQueryString($name, $value, $preencoded = false) - { - $this->_url->addQueryString($name, $value, $preencoded); - } - - /** - * Sets the querystring to literally what you supply - * - * @param string The querystring data. Should be of the format foo=bar&x=y etc - * @param bool Whether data is already urlencoded or not, default = already encoded - * @access public - */ - function addRawQueryString($querystring, $preencoded = true) - { - $this->_url->addRawQueryString($querystring, $preencoded); - } - - /** - * Adds postdata items - * - * @param string Post data name - * @param string Post data value - * @param bool Whether data is already urlencoded or not, default = not - * @access public - */ - function addPostData($name, $value, $preencoded = false) - { - if ($preencoded) { - $this->_postData[$name] = $value; - } else { - $this->_postData[$name] = $this->_arrayMapRecursive('urlencode', $value); - } - } - - /** - * Recursively applies the callback function to the value - * - * @param mixed Callback function - * @param mixed Value to process - * @access private - * @return mixed Processed value - */ - function _arrayMapRecursive($callback, $value) - { - if (!is_array($value)) { - return call_user_func($callback, $value); - } else { - $map = array(); - foreach ($value as $k => $v) { - $map[$k] = $this->_arrayMapRecursive($callback, $v); - } - return $map; - } - } - - /** - * Adds a file to upload - * - * This also changes content-type to 'multipart/form-data' for proper upload - * - * @access public - * @param string name of file-upload field - * @param mixed file name(s) - * @param mixed content-type(s) of file(s) being uploaded - * @return bool true on success - * @throws PEAR_Error - */ - function addFile($inputName, $fileName, $contentType = 'application/octet-stream') - { - if (!is_array($fileName) && !is_readable($fileName)) { - return PEAR::raiseError("File '{$fileName}' is not readable"); - } elseif (is_array($fileName)) { - foreach ($fileName as $name) { - if (!is_readable($name)) { - return PEAR::raiseError("File '{$name}' is not readable"); - } - } - } - $this->addHeader('Content-Type', 'multipart/form-data'); - $this->_postFiles[$inputName] = array( - 'name' => $fileName, - 'type' => $contentType - ); - return true; - } - - /** - * Adds raw postdata (DEPRECATED) - * - * @param string The data - * @param bool Whether data is preencoded or not, default = already encoded - * @access public - * @deprecated deprecated since 1.3.0, method setBody() should be used instead - */ - function addRawPostData($postdata, $preencoded = true) - { - $this->_body = $preencoded ? $postdata : urlencode($postdata); - } - - /** - * Sets the request body (for POST, PUT and similar requests) - * - * @param string Request body - * @access public - */ - function setBody($body) - { - $this->_body = $body; - } - - /** - * Clears any postdata that has been added (DEPRECATED). - * - * Useful for multiple request scenarios. - * - * @access public - * @deprecated deprecated since 1.2 - */ - function clearPostData() - { - $this->_postData = null; - } - - /** - * Appends a cookie to "Cookie:" header - * - * @param string $name cookie name - * @param string $value cookie value - * @access public - */ - function addCookie($name, $value) - { - $cookies = isset($this->_requestHeaders['cookie']) ? $this->_requestHeaders['cookie']. '; ' : ''; - $this->addHeader('Cookie', $cookies . $name . '=' . $value); - } - - /** - * Clears any cookies that have been added (DEPRECATED). - * - * Useful for multiple request scenarios - * - * @access public - * @deprecated deprecated since 1.2 - */ - function clearCookies() - { - $this->removeHeader('Cookie'); - } - - /** - * Sends the request - * - * @access public - * @param bool Whether to store response body in Response object property, - * set this to false if downloading a LARGE file and using a Listener - * @return mixed PEAR error on error, true otherwise - */ - function sendRequest($saveBody = true) - { - if (!is_a($this->_url, 'Net_URL')) { - return PEAR::raiseError('No URL given.'); - } - - $host = isset($this->_proxy_host) ? $this->_proxy_host : $this->_url->host; - $port = isset($this->_proxy_port) ? $this->_proxy_port : $this->_url->port; - - // 4.3.0 supports SSL connections using OpenSSL. The function test determines - // we running on at least 4.3.0 - if (strcasecmp($this->_url->protocol, 'https') == 0 AND function_exists('file_get_contents') AND extension_loaded('openssl')) { - if (isset($this->_proxy_host)) { - return PEAR::raiseError('HTTPS proxies are not supported.'); - } - $host = 'ssl://' . $host; - } - - // magic quotes may fuck up file uploads and chunked response processing - $magicQuotes = ini_get('magic_quotes_runtime'); - ini_set('magic_quotes_runtime', false); - - // RFC 2068, section 19.7.1: A client MUST NOT send the Keep-Alive - // connection token to a proxy server... - if (isset($this->_proxy_host) && !empty($this->_requestHeaders['connection']) && - 'Keep-Alive' == $this->_requestHeaders['connection']) - { - $this->removeHeader('connection'); - } - - $keepAlive = (HTTP_REQUEST_HTTP_VER_1_1 == $this->_http && empty($this->_requestHeaders['connection'])) || - (!empty($this->_requestHeaders['connection']) && 'Keep-Alive' == $this->_requestHeaders['connection']); - $sockets = &PEAR::getStaticProperty('HTTP_Request', 'sockets'); - $sockKey = $host . ':' . $port; - unset($this->_sock); - - // There is a connected socket in the "static" property? - if ($keepAlive && !empty($sockets[$sockKey]) && - !empty($sockets[$sockKey]->fp)) - { - $this->_sock =& $sockets[$sockKey]; - $err = null; - } else { - $this->_notify('connect'); - $this->_sock =& new Net_Socket(); - $err = $this->_sock->connect($host, $port, null, $this->_timeout, $this->_socketOptions); - } - PEAR::isError($err) or $err = $this->_sock->write($this->_buildRequest()); - - if (!PEAR::isError($err)) { - if (!empty($this->_readTimeout)) { - $this->_sock->setTimeout($this->_readTimeout[0], $this->_readTimeout[1]); - } - - $this->_notify('sentRequest'); - - // Read the response - $this->_response = &new HTTP_Response($this->_sock, $this->_listeners); - $err = $this->_response->process( - $this->_saveBody && $saveBody, - HTTP_REQUEST_METHOD_HEAD != $this->_method - ); - - if ($keepAlive) { - $keepAlive = (isset($this->_response->_headers['content-length']) - || (isset($this->_response->_headers['transfer-encoding']) - && strtolower($this->_response->_headers['transfer-encoding']) == 'chunked')); - if ($keepAlive) { - if (isset($this->_response->_headers['connection'])) { - $keepAlive = strtolower($this->_response->_headers['connection']) == 'keep-alive'; - } else { - $keepAlive = 'HTTP/'.HTTP_REQUEST_HTTP_VER_1_1 == $this->_response->_protocol; - } - } - } - } - - ini_set('magic_quotes_runtime', $magicQuotes); - - if (PEAR::isError($err)) { - return $err; - } - - if (!$keepAlive) { - $this->disconnect(); - // Store the connected socket in "static" property - } elseif (empty($sockets[$sockKey]) || empty($sockets[$sockKey]->fp)) { - $sockets[$sockKey] =& $this->_sock; - } - - // Check for redirection - if ( $this->_allowRedirects - AND $this->_redirects <= $this->_maxRedirects - AND $this->getResponseCode() > 300 - AND $this->getResponseCode() < 399 - AND !empty($this->_response->_headers['location'])) { - - - $redirect = $this->_response->_headers['location']; - - // Absolute URL - if (preg_match('/^https?:\/\//i', $redirect)) { - $this->_url = &new Net_URL($redirect); - $this->addHeader('Host', $this->_generateHostHeader()); - // Absolute path - } elseif ($redirect{0} == '/') { - $this->_url->path = $redirect; - - // Relative path - } elseif (substr($redirect, 0, 3) == '../' OR substr($redirect, 0, 2) == './') { - if (substr($this->_url->path, -1) == '/') { - $redirect = $this->_url->path . $redirect; - } else { - $redirect = dirname($this->_url->path) . '/' . $redirect; - } - $redirect = Net_URL::resolvePath($redirect); - $this->_url->path = $redirect; - - // Filename, no path - } else { - if (substr($this->_url->path, -1) == '/') { - $redirect = $this->_url->path . $redirect; - } else { - $redirect = dirname($this->_url->path) . '/' . $redirect; - } - $this->_url->path = $redirect; - } - - $this->_redirects++; - return $this->sendRequest($saveBody); - - // Too many redirects - } elseif ($this->_allowRedirects AND $this->_redirects > $this->_maxRedirects) { - return PEAR::raiseError('Too many redirects'); - } - - return true; - } - - /** - * Disconnect the socket, if connected. Only useful if using Keep-Alive. - * - * @access public - */ - function disconnect() - { - if (!empty($this->_sock) && !empty($this->_sock->fp)) { - $this->_notify('disconnect'); - $this->_sock->disconnect(); - } - } - - /** - * Returns the response code - * - * @access public - * @return mixed Response code, false if not set - */ - function getResponseCode() - { - return isset($this->_response->_code) ? $this->_response->_code : false; - } - - /** - * Returns either the named header or all if no name given - * - * @access public - * @param string The header name to return, do not set to get all headers - * @return mixed either the value of $headername (false if header is not present) - * or an array of all headers - */ - function getResponseHeader($headername = null) - { - if (!isset($headername)) { - return isset($this->_response->_headers)? $this->_response->_headers: array(); - } else { - $headername = strtolower($headername); - return isset($this->_response->_headers[$headername]) ? $this->_response->_headers[$headername] : false; - } - } - - /** - * Returns the body of the response - * - * @access public - * @return mixed response body, false if not set - */ - function getResponseBody() - { - return isset($this->_response->_body) ? $this->_response->_body : false; - } - - /** - * Returns cookies set in response - * - * @access public - * @return mixed array of response cookies, false if none are present - */ - function getResponseCookies() - { - return isset($this->_response->_cookies) ? $this->_response->_cookies : false; - } - - /** - * Builds the request string - * - * @access private - * @return string The request string - */ - function _buildRequest() - { - $separator = ini_get('arg_separator.output'); - ini_set('arg_separator.output', '&'); - $querystring = ($querystring = $this->_url->getQueryString()) ? '?' . $querystring : ''; - ini_set('arg_separator.output', $separator); - - $host = isset($this->_proxy_host) ? $this->_url->protocol . '://' . $this->_url->host : ''; - $port = (isset($this->_proxy_host) AND $this->_url->port != 80) ? ':' . $this->_url->port : ''; - $path = $this->_url->path . $querystring; - $url = $host . $port . $path; - - $request = $this->_method . ' ' . $url . ' HTTP/' . $this->_http . "\r\n"; - - if (in_array($this->_method, $this->_bodyDisallowed) || - (empty($this->_body) && (HTTP_REQUEST_METHOD_POST != $this->_method || - (empty($this->_postData) && empty($this->_postFiles))))) - { - $this->removeHeader('Content-Type'); - } else { - if (empty($this->_requestHeaders['content-type'])) { - // Add default content-type - $this->addHeader('Content-Type', 'application/x-www-form-urlencoded'); - } elseif ('multipart/form-data' == $this->_requestHeaders['content-type']) { - $boundary = 'HTTP_Request_' . md5(uniqid('request') . microtime()); - $this->addHeader('Content-Type', 'multipart/form-data; boundary=' . $boundary); - } - } - - // Request Headers - if (!empty($this->_requestHeaders)) { - foreach ($this->_requestHeaders as $name => $value) { - $canonicalName = implode('-', array_map('ucfirst', explode('-', $name))); - $request .= $canonicalName . ': ' . $value . "\r\n"; - } - } - - // No post data or wrong method, so simply add a final CRLF - if (in_array($this->_method, $this->_bodyDisallowed) || - (HTTP_REQUEST_METHOD_POST != $this->_method && empty($this->_body))) { - - $request .= "\r\n"; - - // Post data if it's an array - } elseif (HTTP_REQUEST_METHOD_POST == $this->_method && - (!empty($this->_postData) || !empty($this->_postFiles))) { - - // "normal" POST request - if (!isset($boundary)) { - $postdata = implode('&', array_map( - create_function('$a', 'return $a[0] . \'=\' . $a[1];'), - $this->_flattenArray('', $this->_postData) - )); - - // multipart request, probably with file uploads - } else { - $postdata = ''; - if (!empty($this->_postData)) { - $flatData = $this->_flattenArray('', $this->_postData); - foreach ($flatData as $item) { - $postdata .= '--' . $boundary . "\r\n"; - $postdata .= 'Content-Disposition: form-data; name="' . $item[0] . '"'; - $postdata .= "\r\n\r\n" . urldecode($item[1]) . "\r\n"; - } - } - foreach ($this->_postFiles as $name => $value) { - if (is_array($value['name'])) { - $varname = $name . ($this->_useBrackets? '[]': ''); - } else { - $varname = $name; - $value['name'] = array($value['name']); - } - foreach ($value['name'] as $key => $filename) { - $fp = fopen($filename, 'r'); - $data = fread($fp, filesize($filename)); - fclose($fp); - $basename = basename($filename); - $type = is_array($value['type'])? @$value['type'][$key]: $value['type']; - - $postdata .= '--' . $boundary . "\r\n"; - $postdata .= 'Content-Disposition: form-data; name="' . $varname . '"; filename="' . $basename . '"'; - $postdata .= "\r\nContent-Type: " . $type; - $postdata .= "\r\n\r\n" . $data . "\r\n"; - } - } - $postdata .= '--' . $boundary . "--\r\n"; - } - $request .= 'Content-Length: ' . - (HTTP_REQUEST_MBSTRING? mb_strlen($postdata, 'iso-8859-1'): strlen($postdata)) . - "\r\n\r\n"; - $request .= $postdata; - - // Explicitly set request body - } elseif (!empty($this->_body)) { - - $request .= 'Content-Length: ' . - (HTTP_REQUEST_MBSTRING? mb_strlen($this->_body, 'iso-8859-1'): strlen($this->_body)) . - "\r\n\r\n"; - $request .= $this->_body; - } - - return $request; - } - - /** - * Helper function to change the (probably multidimensional) associative array - * into the simple one. - * - * @param string name for item - * @param mixed item's values - * @return array array with the following items: array('item name', 'item value'); - * @access private - */ - function _flattenArray($name, $values) - { - if (!is_array($values)) { - return array(array($name, $values)); - } else { - $ret = array(); - foreach ($values as $k => $v) { - if (empty($name)) { - $newName = $k; - } elseif ($this->_useBrackets) { - $newName = $name . '[' . $k . ']'; - } else { - $newName = $name; - } - $ret = array_merge($ret, $this->_flattenArray($newName, $v)); - } - return $ret; - } - } - - - /** - * Adds a Listener to the list of listeners that are notified of - * the object's events - * - * Events sent by HTTP_Request object - * - 'connect': on connection to server - * - 'sentRequest': after the request was sent - * - 'disconnect': on disconnection from server - * - * Events sent by HTTP_Response object - * - 'gotHeaders': after receiving response headers (headers are passed in $data) - * - 'tick': on receiving a part of response body (the part is passed in $data) - * - 'gzTick': on receiving a gzip-encoded part of response body (ditto) - * - 'gotBody': after receiving the response body (passes the decoded body in $data if it was gzipped) - * - * @param HTTP_Request_Listener listener to attach - * @return boolean whether the listener was successfully attached - * @access public - */ - function attach(&$listener) - { - if (!is_a($listener, 'HTTP_Request_Listener')) { - return false; - } - $this->_listeners[$listener->getId()] =& $listener; - return true; - } - - - /** - * Removes a Listener from the list of listeners - * - * @param HTTP_Request_Listener listener to detach - * @return boolean whether the listener was successfully detached - * @access public - */ - function detach(&$listener) - { - if (!is_a($listener, 'HTTP_Request_Listener') || - !isset($this->_listeners[$listener->getId()])) { - return false; - } - unset($this->_listeners[$listener->getId()]); - return true; - } - - - /** - * Notifies all registered listeners of an event. - * - * @param string Event name - * @param mixed Additional data - * @access private - * @see HTTP_Request::attach() - */ - function _notify($event, $data = null) - { - foreach (array_keys($this->_listeners) as $id) { - $this->_listeners[$id]->update($this, $event, $data); - } - } -} - - -/** - * Response class to complement the Request class - * - * @category HTTP - * @package HTTP_Request - * @author Richard Heyes - * @author Alexey Borzov - * @version Release: 1.4.1 - */ -class HTTP_Response -{ - /** - * Socket object - * @var Net_Socket - */ - var $_sock; - - /** - * Protocol - * @var string - */ - var $_protocol; - - /** - * Return code - * @var string - */ - var $_code; - - /** - * Response headers - * @var array - */ - var $_headers; - - /** - * Cookies set in response - * @var array - */ - var $_cookies; - - /** - * Response body - * @var string - */ - var $_body = ''; - - /** - * Used by _readChunked(): remaining length of the current chunk - * @var string - */ - var $_chunkLength = 0; - - /** - * Attached listeners - * @var array - */ - var $_listeners = array(); - - /** - * Bytes left to read from message-body - * @var null|int - */ - var $_toRead; - - /** - * Constructor - * - * @param Net_Socket socket to read the response from - * @param array listeners attached to request - */ - function HTTP_Response(&$sock, &$listeners) - { - $this->_sock =& $sock; - $this->_listeners =& $listeners; - } - - - /** - * Processes a HTTP response - * - * This extracts response code, headers, cookies and decodes body if it - * was encoded in some way - * - * @access public - * @param bool Whether to store response body in object property, set - * this to false if downloading a LARGE file and using a Listener. - * This is assumed to be true if body is gzip-encoded. - * @param bool Whether the response can actually have a message-body. - * Will be set to false for HEAD requests. - * @throws PEAR_Error - * @return mixed true on success, PEAR_Error in case of malformed response - */ - function process($saveBody = true, $canHaveBody = true) - { - do { - $line = $this->_sock->readLine(); - if (sscanf($line, 'HTTP/%s %s', $http_version, $returncode) != 2) { - return PEAR::raiseError('Malformed response.'); - } else { - $this->_protocol = 'HTTP/' . $http_version; - $this->_code = intval($returncode); - } - while ('' !== ($header = $this->_sock->readLine())) { - $this->_processHeader($header); - } - } while (100 == $this->_code); - - $this->_notify('gotHeaders', $this->_headers); - - // RFC 2616, section 4.4: - // 1. Any response message which "MUST NOT" include a message-body ... - // is always terminated by the first empty line after the header fields - // 3. ... If a message is received with both a - // Transfer-Encoding header field and a Content-Length header field, - // the latter MUST be ignored. - $canHaveBody = $canHaveBody && $this->_code >= 200 && - $this->_code != 204 && $this->_code != 304; - - // If response body is present, read it and decode - $chunked = isset($this->_headers['transfer-encoding']) && ('chunked' == $this->_headers['transfer-encoding']); - $gzipped = isset($this->_headers['content-encoding']) && ('gzip' == $this->_headers['content-encoding']); - $hasBody = false; - if ($canHaveBody && ($chunked || !isset($this->_headers['content-length']) || - 0 != $this->_headers['content-length'])) - { - if ($chunked || !isset($this->_headers['content-length'])) { - $this->_toRead = null; - } else { - $this->_toRead = $this->_headers['content-length']; - } - while (!$this->_sock->eof() && (is_null($this->_toRead) || 0 < $this->_toRead)) { - if ($chunked) { - $data = $this->_readChunked(); - } elseif (is_null($this->_toRead)) { - $data = $this->_sock->read(4096); - } else { - $data = $this->_sock->read(min(4096, $this->_toRead)); - $this->_toRead -= HTTP_REQUEST_MBSTRING? mb_strlen($data, 'iso-8859-1'): strlen($data); - } - if ('' == $data) { - break; - } else { - $hasBody = true; - if ($saveBody || $gzipped) { - $this->_body .= $data; - } - $this->_notify($gzipped? 'gzTick': 'tick', $data); - } - } - } - - if ($hasBody) { - // Uncompress the body if needed - if ($gzipped) { - $body = $this->_decodeGzip($this->_body); - if (PEAR::isError($body)) { - return $body; - } - $this->_body = $body; - $this->_notify('gotBody', $this->_body); - } else { - $this->_notify('gotBody'); - } - } - return true; - } - - - /** - * Processes the response header - * - * @access private - * @param string HTTP header - */ - function _processHeader($header) - { - if (false === strpos($header, ':')) { - return; - } - list($headername, $headervalue) = explode(':', $header, 2); - $headername = strtolower($headername); - $headervalue = ltrim($headervalue); - - if ('set-cookie' != $headername) { - if (isset($this->_headers[$headername])) { - $this->_headers[$headername] .= ',' . $headervalue; - } else { - $this->_headers[$headername] = $headervalue; - } - } else { - $this->_parseCookie($headervalue); - } - } - - - /** - * Parse a Set-Cookie header to fill $_cookies array - * - * @access private - * @param string value of Set-Cookie header - */ - function _parseCookie($headervalue) - { - $cookie = array( - 'expires' => null, - 'domain' => null, - 'path' => null, - 'secure' => false - ); - - // Only a name=value pair - if (!strpos($headervalue, ';')) { - $pos = strpos($headervalue, '='); - $cookie['name'] = trim(substr($headervalue, 0, $pos)); - $cookie['value'] = trim(substr($headervalue, $pos + 1)); - - // Some optional parameters are supplied - } else { - $elements = explode(';', $headervalue); - $pos = strpos($elements[0], '='); - $cookie['name'] = trim(substr($elements[0], 0, $pos)); - $cookie['value'] = trim(substr($elements[0], $pos + 1)); - - for ($i = 1; $i < count($elements); $i++) { - if (false === strpos($elements[$i], '=')) { - $elName = trim($elements[$i]); - $elValue = null; - } else { - list ($elName, $elValue) = array_map('trim', explode('=', $elements[$i])); - } - $elName = strtolower($elName); - if ('secure' == $elName) { - $cookie['secure'] = true; - } elseif ('expires' == $elName) { - $cookie['expires'] = str_replace('"', '', $elValue); - } elseif ('path' == $elName || 'domain' == $elName) { - $cookie[$elName] = urldecode($elValue); - } else { - $cookie[$elName] = $elValue; - } - } - } - $this->_cookies[] = $cookie; - } - - - /** - * Read a part of response body encoded with chunked Transfer-Encoding - * - * @access private - * @return string - */ - function _readChunked() - { - // at start of the next chunk? - if (0 == $this->_chunkLength) { - $line = $this->_sock->readLine(); - if (preg_match('/^([0-9a-f]+)/i', $line, $matches)) { - $this->_chunkLength = hexdec($matches[1]); - // Chunk with zero length indicates the end - if (0 == $this->_chunkLength) { - $this->_sock->readLine(); // make this an eof() - return ''; - } - } else { - return ''; - } - } - $data = $this->_sock->read($this->_chunkLength); - $this->_chunkLength -= HTTP_REQUEST_MBSTRING? mb_strlen($data, 'iso-8859-1'): strlen($data); - if (0 == $this->_chunkLength) { - $this->_sock->readLine(); // Trailing CRLF - } - return $data; - } - - - /** - * Notifies all registered listeners of an event. - * - * @param string Event name - * @param mixed Additional data - * @access private - * @see HTTP_Request::_notify() - */ - function _notify($event, $data = null) - { - foreach (array_keys($this->_listeners) as $id) { - $this->_listeners[$id]->update($this, $event, $data); - } - } - - - /** - * Decodes the message-body encoded by gzip - * - * The real decoding work is done by gzinflate() built-in function, this - * method only parses the header and checks data for compliance with - * RFC 1952 - * - * @access private - * @param string gzip-encoded data - * @return string decoded data - */ - function _decodeGzip($data) - { - if (HTTP_REQUEST_MBSTRING) { - $oldEncoding = mb_internal_encoding(); - mb_internal_encoding('iso-8859-1'); - } - $length = strlen($data); - // If it doesn't look like gzip-encoded data, don't bother - if (18 > $length || strcmp(substr($data, 0, 2), "\x1f\x8b")) { - return $data; - } - $method = ord(substr($data, 2, 1)); - if (8 != $method) { - return PEAR::raiseError('_decodeGzip(): unknown compression method'); - } - $flags = ord(substr($data, 3, 1)); - if ($flags & 224) { - return PEAR::raiseError('_decodeGzip(): reserved bits are set'); - } - - // header is 10 bytes minimum. may be longer, though. - $headerLength = 10; - // extra fields, need to skip 'em - if ($flags & 4) { - if ($length - $headerLength - 2 < 8) { - return PEAR::raiseError('_decodeGzip(): data too short'); - } - $extraLength = unpack('v', substr($data, 10, 2)); - if ($length - $headerLength - 2 - $extraLength[1] < 8) { - return PEAR::raiseError('_decodeGzip(): data too short'); - } - $headerLength += $extraLength[1] + 2; - } - // file name, need to skip that - if ($flags & 8) { - if ($length - $headerLength - 1 < 8) { - return PEAR::raiseError('_decodeGzip(): data too short'); - } - $filenameLength = strpos(substr($data, $headerLength), chr(0)); - if (false === $filenameLength || $length - $headerLength - $filenameLength - 1 < 8) { - return PEAR::raiseError('_decodeGzip(): data too short'); - } - $headerLength += $filenameLength + 1; - } - // comment, need to skip that also - if ($flags & 16) { - if ($length - $headerLength - 1 < 8) { - return PEAR::raiseError('_decodeGzip(): data too short'); - } - $commentLength = strpos(substr($data, $headerLength), chr(0)); - if (false === $commentLength || $length - $headerLength - $commentLength - 1 < 8) { - return PEAR::raiseError('_decodeGzip(): data too short'); - } - $headerLength += $commentLength + 1; - } - // have a CRC for header. let's check - if ($flags & 1) { - if ($length - $headerLength - 2 < 8) { - return PEAR::raiseError('_decodeGzip(): data too short'); - } - $crcReal = 0xffff & crc32(substr($data, 0, $headerLength)); - $crcStored = unpack('v', substr($data, $headerLength, 2)); - if ($crcReal != $crcStored[1]) { - return PEAR::raiseError('_decodeGzip(): header CRC check failed'); - } - $headerLength += 2; - } - // unpacked data CRC and size at the end of encoded data - $tmp = unpack('V2', substr($data, -8)); - $dataCrc = $tmp[1]; - $dataSize = $tmp[2]; - - // finally, call the gzinflate() function - $unpacked = @gzinflate(substr($data, $headerLength, -8), $dataSize); - if (false === $unpacked) { - return PEAR::raiseError('_decodeGzip(): gzinflate() call failed'); - } elseif ($dataSize != strlen($unpacked)) { - return PEAR::raiseError('_decodeGzip(): data size check failed'); - } elseif ((0xffffffff & $dataCrc) != (0xffffffff & crc32($unpacked))) { - return PEAR::raiseError('_decodeGzip(): data CRC check failed'); - } - if (HTTP_REQUEST_MBSTRING) { - mb_internal_encoding($oldEncoding); - } - return $unpacked; - } -} // End class HTTP_Response -?> + + * @author Alexey Borzov + * @copyright 2002-2007 Richard Heyes + * @license http://opensource.org/licenses/bsd-license.php New BSD License + * @version CVS: $Id: Request.php,v 1.55 2007/05/18 19:20:12 avb Exp $ + * @link http://pear.php.net/package/HTTP_Request/ + */ + +/** + * PEAR and PEAR_Error classes (for error handling) + */ +require_once 'PEAR.php'; +/** + * Socket class + */ +require_once 'Net/Socket.php'; +/** + * URL handling class + */ +require_once 'Net/URL.php'; + +/**#@+ + * Constants for HTTP request methods + */ +define('HTTP_REQUEST_METHOD_GET', 'GET', true); +define('HTTP_REQUEST_METHOD_HEAD', 'HEAD', true); +define('HTTP_REQUEST_METHOD_POST', 'POST', true); +define('HTTP_REQUEST_METHOD_PUT', 'PUT', true); +define('HTTP_REQUEST_METHOD_DELETE', 'DELETE', true); +define('HTTP_REQUEST_METHOD_OPTIONS', 'OPTIONS', true); +define('HTTP_REQUEST_METHOD_TRACE', 'TRACE', true); +/**#@-*/ + +/**#@+ + * Constants for HTTP protocol versions + */ +define('HTTP_REQUEST_HTTP_VER_1_0', '1.0', true); +define('HTTP_REQUEST_HTTP_VER_1_1', '1.1', true); +/**#@-*/ + +if (extension_loaded('mbstring') && (2 & ini_get('mbstring.func_overload'))) { + /** + * Whether string functions are overloaded by their mbstring equivalents + */ + define('HTTP_REQUEST_MBSTRING', true); +} else { + /** + * @ignore + */ + define('HTTP_REQUEST_MBSTRING', false); +} + +/** + * Class for performing HTTP requests + * + * Simple example (fetches yahoo.com and displays it): + * + * $a = &new HTTP_Request('http://www.yahoo.com/'); + * $a->sendRequest(); + * echo $a->getResponseBody(); + * + * + * @category HTTP + * @package HTTP_Request + * @author Richard Heyes + * @author Alexey Borzov + * @version Release: 1.4.1 + */ +class HTTP_Request +{ + /**#@+ + * @access private + */ + /** + * Instance of Net_URL + * @var Net_URL + */ + var $_url; + + /** + * Type of request + * @var string + */ + var $_method; + + /** + * HTTP Version + * @var string + */ + var $_http; + + /** + * Request headers + * @var array + */ + var $_requestHeaders; + + /** + * Basic Auth Username + * @var string + */ + var $_user; + + /** + * Basic Auth Password + * @var string + */ + var $_pass; + + /** + * Socket object + * @var Net_Socket + */ + var $_sock; + + /** + * Proxy server + * @var string + */ + var $_proxy_host; + + /** + * Proxy port + * @var integer + */ + var $_proxy_port; + + /** + * Proxy username + * @var string + */ + var $_proxy_user; + + /** + * Proxy password + * @var string + */ + var $_proxy_pass; + + /** + * Post data + * @var array + */ + var $_postData; + + /** + * Request body + * @var string + */ + var $_body; + + /** + * A list of methods that MUST NOT have a request body, per RFC 2616 + * @var array + */ + var $_bodyDisallowed = array('TRACE'); + + /** + * Files to post + * @var array + */ + var $_postFiles = array(); + + /** + * Connection timeout. + * @var float + */ + var $_timeout; + + /** + * HTTP_Response object + * @var HTTP_Response + */ + var $_response; + + /** + * Whether to allow redirects + * @var boolean + */ + var $_allowRedirects; + + /** + * Maximum redirects allowed + * @var integer + */ + var $_maxRedirects; + + /** + * Current number of redirects + * @var integer + */ + var $_redirects; + + /** + * Whether to append brackets [] to array variables + * @var bool + */ + var $_useBrackets = true; + + /** + * Attached listeners + * @var array + */ + var $_listeners = array(); + + /** + * Whether to save response body in response object property + * @var bool + */ + var $_saveBody = true; + + /** + * Timeout for reading from socket (array(seconds, microseconds)) + * @var array + */ + var $_readTimeout = null; + + /** + * Options to pass to Net_Socket::connect. See stream_context_create + * @var array + */ + var $_socketOptions = null; + /**#@-*/ + + /** + * Constructor + * + * Sets up the object + * @param string The url to fetch/access + * @param array Associative array of parameters which can have the following keys: + *
    + *
  • method - Method to use, GET, POST etc (string)
  • + *
  • http - HTTP Version to use, 1.0 or 1.1 (string)
  • + *
  • user - Basic Auth username (string)
  • + *
  • pass - Basic Auth password (string)
  • + *
  • proxy_host - Proxy server host (string)
  • + *
  • proxy_port - Proxy server port (integer)
  • + *
  • proxy_user - Proxy auth username (string)
  • + *
  • proxy_pass - Proxy auth password (string)
  • + *
  • timeout - Connection timeout in seconds (float)
  • + *
  • allowRedirects - Whether to follow redirects or not (bool)
  • + *
  • maxRedirects - Max number of redirects to follow (integer)
  • + *
  • useBrackets - Whether to append [] to array variable names (bool)
  • + *
  • saveBody - Whether to save response body in response object property (bool)
  • + *
  • readTimeout - Timeout for reading / writing data over the socket (array (seconds, microseconds))
  • + *
  • socketOptions - Options to pass to Net_Socket object (array)
  • + *
+ * @access public + */ + function HTTP_Request($url = '', $params = array()) + { + $this->_method = HTTP_REQUEST_METHOD_GET; + $this->_http = HTTP_REQUEST_HTTP_VER_1_1; + $this->_requestHeaders = array(); + $this->_postData = array(); + $this->_body = null; + + $this->_user = null; + $this->_pass = null; + + $this->_proxy_host = null; + $this->_proxy_port = null; + $this->_proxy_user = null; + $this->_proxy_pass = null; + + $this->_allowRedirects = false; + $this->_maxRedirects = 3; + $this->_redirects = 0; + + $this->_timeout = null; + $this->_response = null; + + foreach ($params as $key => $value) { + $this->{'_' . $key} = $value; + } + + if (!empty($url)) { + $this->setURL($url); + } + + // Default useragent + $this->addHeader('User-Agent', 'PEAR HTTP_Request class ( http://pear.php.net/ )'); + + // We don't do keep-alives by default + $this->addHeader('Connection', 'close'); + + // Basic authentication + if (!empty($this->_user)) { + $this->addHeader('Authorization', 'Basic ' . base64_encode($this->_user . ':' . $this->_pass)); + } + + // Proxy authentication (see bug #5913) + if (!empty($this->_proxy_user)) { + $this->addHeader('Proxy-Authorization', 'Basic ' . base64_encode($this->_proxy_user . ':' . $this->_proxy_pass)); + } + + // Use gzip encoding if possible + if (HTTP_REQUEST_HTTP_VER_1_1 == $this->_http && extension_loaded('zlib')) { + $this->addHeader('Accept-Encoding', 'gzip'); + } + } + + /** + * Generates a Host header for HTTP/1.1 requests + * + * @access private + * @return string + */ + function _generateHostHeader() + { + if ($this->_url->port != 80 AND strcasecmp($this->_url->protocol, 'http') == 0) { + $host = $this->_url->host . ':' . $this->_url->port; + + } elseif ($this->_url->port != 443 AND strcasecmp($this->_url->protocol, 'https') == 0) { + $host = $this->_url->host . ':' . $this->_url->port; + + } elseif ($this->_url->port == 443 AND strcasecmp($this->_url->protocol, 'https') == 0 AND strpos($this->_url->url, ':443') !== false) { + $host = $this->_url->host . ':' . $this->_url->port; + + } else { + $host = $this->_url->host; + } + + return $host; + } + + /** + * Resets the object to its initial state (DEPRECATED). + * Takes the same parameters as the constructor. + * + * @param string $url The url to be requested + * @param array $params Associative array of parameters + * (see constructor for details) + * @access public + * @deprecated deprecated since 1.2, call the constructor if this is necessary + */ + function reset($url, $params = array()) + { + $this->HTTP_Request($url, $params); + } + + /** + * Sets the URL to be requested + * + * @param string The url to be requested + * @access public + */ + function setURL($url) + { + $this->_url = &new Net_URL($url, $this->_useBrackets); + + if (!empty($this->_url->user) || !empty($this->_url->pass)) { + $this->setBasicAuth($this->_url->user, $this->_url->pass); + } + + if (HTTP_REQUEST_HTTP_VER_1_1 == $this->_http) { + $this->addHeader('Host', $this->_generateHostHeader()); + } + + // set '/' instead of empty path rather than check later (see bug #8662) + if (empty($this->_url->path)) { + $this->_url->path = '/'; + } + } + + /** + * Returns the current request URL + * + * @return string Current request URL + * @access public + */ + function getUrl() + { + return empty($this->_url)? '': $this->_url->getUrl(); + } + + /** + * Sets a proxy to be used + * + * @param string Proxy host + * @param int Proxy port + * @param string Proxy username + * @param string Proxy password + * @access public + */ + function setProxy($host, $port = 8080, $user = null, $pass = null) + { + $this->_proxy_host = $host; + $this->_proxy_port = $port; + $this->_proxy_user = $user; + $this->_proxy_pass = $pass; + + if (!empty($user)) { + $this->addHeader('Proxy-Authorization', 'Basic ' . base64_encode($user . ':' . $pass)); + } + } + + /** + * Sets basic authentication parameters + * + * @param string Username + * @param string Password + */ + function setBasicAuth($user, $pass) + { + $this->_user = $user; + $this->_pass = $pass; + + $this->addHeader('Authorization', 'Basic ' . base64_encode($user . ':' . $pass)); + } + + /** + * Sets the method to be used, GET, POST etc. + * + * @param string Method to use. Use the defined constants for this + * @access public + */ + function setMethod($method) + { + $this->_method = $method; + } + + /** + * Sets the HTTP version to use, 1.0 or 1.1 + * + * @param string Version to use. Use the defined constants for this + * @access public + */ + function setHttpVer($http) + { + $this->_http = $http; + } + + /** + * Adds a request header + * + * @param string Header name + * @param string Header value + * @access public + */ + function addHeader($name, $value) + { + $this->_requestHeaders[strtolower($name)] = $value; + } + + /** + * Removes a request header + * + * @param string Header name to remove + * @access public + */ + function removeHeader($name) + { + if (isset($this->_requestHeaders[strtolower($name)])) { + unset($this->_requestHeaders[strtolower($name)]); + } + } + + /** + * Adds a querystring parameter + * + * @param string Querystring parameter name + * @param string Querystring parameter value + * @param bool Whether the value is already urlencoded or not, default = not + * @access public + */ + function addQueryString($name, $value, $preencoded = false) + { + $this->_url->addQueryString($name, $value, $preencoded); + } + + /** + * Sets the querystring to literally what you supply + * + * @param string The querystring data. Should be of the format foo=bar&x=y etc + * @param bool Whether data is already urlencoded or not, default = already encoded + * @access public + */ + function addRawQueryString($querystring, $preencoded = true) + { + $this->_url->addRawQueryString($querystring, $preencoded); + } + + /** + * Adds postdata items + * + * @param string Post data name + * @param string Post data value + * @param bool Whether data is already urlencoded or not, default = not + * @access public + */ + function addPostData($name, $value, $preencoded = false) + { + if ($preencoded) { + $this->_postData[$name] = $value; + } else { + $this->_postData[$name] = $this->_arrayMapRecursive('urlencode', $value); + } + } + + /** + * Recursively applies the callback function to the value + * + * @param mixed Callback function + * @param mixed Value to process + * @access private + * @return mixed Processed value + */ + function _arrayMapRecursive($callback, $value) + { + if (!is_array($value)) { + return call_user_func($callback, $value); + } else { + $map = array(); + foreach ($value as $k => $v) { + $map[$k] = $this->_arrayMapRecursive($callback, $v); + } + return $map; + } + } + + /** + * Adds a file to upload + * + * This also changes content-type to 'multipart/form-data' for proper upload + * + * @access public + * @param string name of file-upload field + * @param mixed file name(s) + * @param mixed content-type(s) of file(s) being uploaded + * @return bool true on success + * @throws PEAR_Error + */ + function addFile($inputName, $fileName, $contentType = 'application/octet-stream') + { + if (!is_array($fileName) && !is_readable($fileName)) { + return PEAR::raiseError("File '{$fileName}' is not readable"); + } elseif (is_array($fileName)) { + foreach ($fileName as $name) { + if (!is_readable($name)) { + return PEAR::raiseError("File '{$name}' is not readable"); + } + } + } + $this->addHeader('Content-Type', 'multipart/form-data'); + $this->_postFiles[$inputName] = array( + 'name' => $fileName, + 'type' => $contentType + ); + return true; + } + + /** + * Adds raw postdata (DEPRECATED) + * + * @param string The data + * @param bool Whether data is preencoded or not, default = already encoded + * @access public + * @deprecated deprecated since 1.3.0, method setBody() should be used instead + */ + function addRawPostData($postdata, $preencoded = true) + { + $this->_body = $preencoded ? $postdata : urlencode($postdata); + } + + /** + * Sets the request body (for POST, PUT and similar requests) + * + * @param string Request body + * @access public + */ + function setBody($body) + { + $this->_body = $body; + } + + /** + * Clears any postdata that has been added (DEPRECATED). + * + * Useful for multiple request scenarios. + * + * @access public + * @deprecated deprecated since 1.2 + */ + function clearPostData() + { + $this->_postData = null; + } + + /** + * Appends a cookie to "Cookie:" header + * + * @param string $name cookie name + * @param string $value cookie value + * @access public + */ + function addCookie($name, $value) + { + $cookies = isset($this->_requestHeaders['cookie']) ? $this->_requestHeaders['cookie']. '; ' : ''; + $this->addHeader('Cookie', $cookies . $name . '=' . $value); + } + + /** + * Clears any cookies that have been added (DEPRECATED). + * + * Useful for multiple request scenarios + * + * @access public + * @deprecated deprecated since 1.2 + */ + function clearCookies() + { + $this->removeHeader('Cookie'); + } + + /** + * Sends the request + * + * @access public + * @param bool Whether to store response body in Response object property, + * set this to false if downloading a LARGE file and using a Listener + * @return mixed PEAR error on error, true otherwise + */ + function sendRequest($saveBody = true) + { + if (!is_a($this->_url, 'Net_URL')) { + return PEAR::raiseError('No URL given.'); + } + + $host = isset($this->_proxy_host) ? $this->_proxy_host : $this->_url->host; + $port = isset($this->_proxy_port) ? $this->_proxy_port : $this->_url->port; + + // 4.3.0 supports SSL connections using OpenSSL. The function test determines + // we running on at least 4.3.0 + if (strcasecmp($this->_url->protocol, 'https') == 0 AND function_exists('file_get_contents') AND extension_loaded('openssl')) { + if (isset($this->_proxy_host)) { + return PEAR::raiseError('HTTPS proxies are not supported.'); + } + $host = 'ssl://' . $host; + } + + // magic quotes may fuck up file uploads and chunked response processing + $magicQuotes = ini_get('magic_quotes_runtime'); + ini_set('magic_quotes_runtime', false); + + // RFC 2068, section 19.7.1: A client MUST NOT send the Keep-Alive + // connection token to a proxy server... + if (isset($this->_proxy_host) && !empty($this->_requestHeaders['connection']) && + 'Keep-Alive' == $this->_requestHeaders['connection']) + { + $this->removeHeader('connection'); + } + + $keepAlive = (HTTP_REQUEST_HTTP_VER_1_1 == $this->_http && empty($this->_requestHeaders['connection'])) || + (!empty($this->_requestHeaders['connection']) && 'Keep-Alive' == $this->_requestHeaders['connection']); + $sockets = &PEAR::getStaticProperty('HTTP_Request', 'sockets'); + $sockKey = $host . ':' . $port; + unset($this->_sock); + + // There is a connected socket in the "static" property? + if ($keepAlive && !empty($sockets[$sockKey]) && + !empty($sockets[$sockKey]->fp)) + { + $this->_sock =& $sockets[$sockKey]; + $err = null; + } else { + $this->_notify('connect'); + $this->_sock =& new Net_Socket(); + $err = $this->_sock->connect($host, $port, null, $this->_timeout, $this->_socketOptions); + } + PEAR::isError($err) or $err = $this->_sock->write($this->_buildRequest()); + + if (!PEAR::isError($err)) { + if (!empty($this->_readTimeout)) { + $this->_sock->setTimeout($this->_readTimeout[0], $this->_readTimeout[1]); + } + + $this->_notify('sentRequest'); + + // Read the response + $this->_response = &new HTTP_Response($this->_sock, $this->_listeners); + $err = $this->_response->process( + $this->_saveBody && $saveBody, + HTTP_REQUEST_METHOD_HEAD != $this->_method + ); + + if ($keepAlive) { + $keepAlive = (isset($this->_response->_headers['content-length']) + || (isset($this->_response->_headers['transfer-encoding']) + && strtolower($this->_response->_headers['transfer-encoding']) == 'chunked')); + if ($keepAlive) { + if (isset($this->_response->_headers['connection'])) { + $keepAlive = strtolower($this->_response->_headers['connection']) == 'keep-alive'; + } else { + $keepAlive = 'HTTP/'.HTTP_REQUEST_HTTP_VER_1_1 == $this->_response->_protocol; + } + } + } + } + + ini_set('magic_quotes_runtime', $magicQuotes); + + if (PEAR::isError($err)) { + return $err; + } + + if (!$keepAlive) { + $this->disconnect(); + // Store the connected socket in "static" property + } elseif (empty($sockets[$sockKey]) || empty($sockets[$sockKey]->fp)) { + $sockets[$sockKey] =& $this->_sock; + } + + // Check for redirection + if ( $this->_allowRedirects + AND $this->_redirects <= $this->_maxRedirects + AND $this->getResponseCode() > 300 + AND $this->getResponseCode() < 399 + AND !empty($this->_response->_headers['location'])) { + + + $redirect = $this->_response->_headers['location']; + + // Absolute URL + if (preg_match('/^https?:\/\//i', $redirect)) { + $this->_url = &new Net_URL($redirect); + $this->addHeader('Host', $this->_generateHostHeader()); + // Absolute path + } elseif ($redirect{0} == '/') { + $this->_url->path = $redirect; + + // Relative path + } elseif (substr($redirect, 0, 3) == '../' OR substr($redirect, 0, 2) == './') { + if (substr($this->_url->path, -1) == '/') { + $redirect = $this->_url->path . $redirect; + } else { + $redirect = dirname($this->_url->path) . '/' . $redirect; + } + $redirect = Net_URL::resolvePath($redirect); + $this->_url->path = $redirect; + + // Filename, no path + } else { + if (substr($this->_url->path, -1) == '/') { + $redirect = $this->_url->path . $redirect; + } else { + $redirect = dirname($this->_url->path) . '/' . $redirect; + } + $this->_url->path = $redirect; + } + + $this->_redirects++; + return $this->sendRequest($saveBody); + + // Too many redirects + } elseif ($this->_allowRedirects AND $this->_redirects > $this->_maxRedirects) { + return PEAR::raiseError('Too many redirects'); + } + + return true; + } + + /** + * Disconnect the socket, if connected. Only useful if using Keep-Alive. + * + * @access public + */ + function disconnect() + { + if (!empty($this->_sock) && !empty($this->_sock->fp)) { + $this->_notify('disconnect'); + $this->_sock->disconnect(); + } + } + + /** + * Returns the response code + * + * @access public + * @return mixed Response code, false if not set + */ + function getResponseCode() + { + return isset($this->_response->_code) ? $this->_response->_code : false; + } + + /** + * Returns either the named header or all if no name given + * + * @access public + * @param string The header name to return, do not set to get all headers + * @return mixed either the value of $headername (false if header is not present) + * or an array of all headers + */ + function getResponseHeader($headername = null) + { + if (!isset($headername)) { + return isset($this->_response->_headers)? $this->_response->_headers: array(); + } else { + $headername = strtolower($headername); + return isset($this->_response->_headers[$headername]) ? $this->_response->_headers[$headername] : false; + } + } + + /** + * Returns the body of the response + * + * @access public + * @return mixed response body, false if not set + */ + function getResponseBody() + { + return isset($this->_response->_body) ? $this->_response->_body : false; + } + + /** + * Returns cookies set in response + * + * @access public + * @return mixed array of response cookies, false if none are present + */ + function getResponseCookies() + { + return isset($this->_response->_cookies) ? $this->_response->_cookies : false; + } + + /** + * Builds the request string + * + * @access private + * @return string The request string + */ + function _buildRequest() + { + $separator = ini_get('arg_separator.output'); + ini_set('arg_separator.output', '&'); + $querystring = ($querystring = $this->_url->getQueryString()) ? '?' . $querystring : ''; + ini_set('arg_separator.output', $separator); + + $host = isset($this->_proxy_host) ? $this->_url->protocol . '://' . $this->_url->host : ''; + $port = (isset($this->_proxy_host) AND $this->_url->port != 80) ? ':' . $this->_url->port : ''; + $path = $this->_url->path . $querystring; + $url = $host . $port . $path; + + $request = $this->_method . ' ' . $url . ' HTTP/' . $this->_http . "\r\n"; + + if (in_array($this->_method, $this->_bodyDisallowed) || + (empty($this->_body) && (HTTP_REQUEST_METHOD_POST != $this->_method || + (empty($this->_postData) && empty($this->_postFiles))))) + { + $this->removeHeader('Content-Type'); + } else { + if (empty($this->_requestHeaders['content-type'])) { + // Add default content-type + $this->addHeader('Content-Type', 'application/x-www-form-urlencoded'); + } elseif ('multipart/form-data' == $this->_requestHeaders['content-type']) { + $boundary = 'HTTP_Request_' . md5(uniqid('request') . microtime()); + $this->addHeader('Content-Type', 'multipart/form-data; boundary=' . $boundary); + } + } + + // Request Headers + if (!empty($this->_requestHeaders)) { + foreach ($this->_requestHeaders as $name => $value) { + $canonicalName = implode('-', array_map('ucfirst', explode('-', $name))); + $request .= $canonicalName . ': ' . $value . "\r\n"; + } + } + + // No post data or wrong method, so simply add a final CRLF + if (in_array($this->_method, $this->_bodyDisallowed) || + (HTTP_REQUEST_METHOD_POST != $this->_method && empty($this->_body))) { + + $request .= "\r\n"; + + // Post data if it's an array + } elseif (HTTP_REQUEST_METHOD_POST == $this->_method && + (!empty($this->_postData) || !empty($this->_postFiles))) { + + // "normal" POST request + if (!isset($boundary)) { + $postdata = implode('&', array_map( + create_function('$a', 'return $a[0] . \'=\' . $a[1];'), + $this->_flattenArray('', $this->_postData) + )); + + // multipart request, probably with file uploads + } else { + $postdata = ''; + if (!empty($this->_postData)) { + $flatData = $this->_flattenArray('', $this->_postData); + foreach ($flatData as $item) { + $postdata .= '--' . $boundary . "\r\n"; + $postdata .= 'Content-Disposition: form-data; name="' . $item[0] . '"'; + $postdata .= "\r\n\r\n" . urldecode($item[1]) . "\r\n"; + } + } + foreach ($this->_postFiles as $name => $value) { + if (is_array($value['name'])) { + $varname = $name . ($this->_useBrackets? '[]': ''); + } else { + $varname = $name; + $value['name'] = array($value['name']); + } + foreach ($value['name'] as $key => $filename) { + $fp = fopen($filename, 'r'); + $data = fread($fp, filesize($filename)); + fclose($fp); + $basename = basename($filename); + $type = is_array($value['type'])? @$value['type'][$key]: $value['type']; + + $postdata .= '--' . $boundary . "\r\n"; + $postdata .= 'Content-Disposition: form-data; name="' . $varname . '"; filename="' . $basename . '"'; + $postdata .= "\r\nContent-Type: " . $type; + $postdata .= "\r\n\r\n" . $data . "\r\n"; + } + } + $postdata .= '--' . $boundary . "--\r\n"; + } + $request .= 'Content-Length: ' . + (HTTP_REQUEST_MBSTRING? mb_strlen($postdata, 'iso-8859-1'): strlen($postdata)) . + "\r\n\r\n"; + $request .= $postdata; + + // Explicitly set request body + } elseif (!empty($this->_body)) { + + $request .= 'Content-Length: ' . + (HTTP_REQUEST_MBSTRING? mb_strlen($this->_body, 'iso-8859-1'): strlen($this->_body)) . + "\r\n\r\n"; + $request .= $this->_body; + } + + return $request; + } + + /** + * Helper function to change the (probably multidimensional) associative array + * into the simple one. + * + * @param string name for item + * @param mixed item's values + * @return array array with the following items: array('item name', 'item value'); + * @access private + */ + function _flattenArray($name, $values) + { + if (!is_array($values)) { + return array(array($name, $values)); + } else { + $ret = array(); + foreach ($values as $k => $v) { + if (empty($name)) { + $newName = $k; + } elseif ($this->_useBrackets) { + $newName = $name . '[' . $k . ']'; + } else { + $newName = $name; + } + $ret = array_merge($ret, $this->_flattenArray($newName, $v)); + } + return $ret; + } + } + + + /** + * Adds a Listener to the list of listeners that are notified of + * the object's events + * + * Events sent by HTTP_Request object + * - 'connect': on connection to server + * - 'sentRequest': after the request was sent + * - 'disconnect': on disconnection from server + * + * Events sent by HTTP_Response object + * - 'gotHeaders': after receiving response headers (headers are passed in $data) + * - 'tick': on receiving a part of response body (the part is passed in $data) + * - 'gzTick': on receiving a gzip-encoded part of response body (ditto) + * - 'gotBody': after receiving the response body (passes the decoded body in $data if it was gzipped) + * + * @param HTTP_Request_Listener listener to attach + * @return boolean whether the listener was successfully attached + * @access public + */ + function attach(&$listener) + { + if (!is_a($listener, 'HTTP_Request_Listener')) { + return false; + } + $this->_listeners[$listener->getId()] =& $listener; + return true; + } + + + /** + * Removes a Listener from the list of listeners + * + * @param HTTP_Request_Listener listener to detach + * @return boolean whether the listener was successfully detached + * @access public + */ + function detach(&$listener) + { + if (!is_a($listener, 'HTTP_Request_Listener') || + !isset($this->_listeners[$listener->getId()])) { + return false; + } + unset($this->_listeners[$listener->getId()]); + return true; + } + + + /** + * Notifies all registered listeners of an event. + * + * @param string Event name + * @param mixed Additional data + * @access private + * @see HTTP_Request::attach() + */ + function _notify($event, $data = null) + { + foreach (array_keys($this->_listeners) as $id) { + $this->_listeners[$id]->update($this, $event, $data); + } + } +} + + +/** + * Response class to complement the Request class + * + * @category HTTP + * @package HTTP_Request + * @author Richard Heyes + * @author Alexey Borzov + * @version Release: 1.4.1 + */ +class HTTP_Response +{ + /** + * Socket object + * @var Net_Socket + */ + var $_sock; + + /** + * Protocol + * @var string + */ + var $_protocol; + + /** + * Return code + * @var string + */ + var $_code; + + /** + * Response headers + * @var array + */ + var $_headers; + + /** + * Cookies set in response + * @var array + */ + var $_cookies; + + /** + * Response body + * @var string + */ + var $_body = ''; + + /** + * Used by _readChunked(): remaining length of the current chunk + * @var string + */ + var $_chunkLength = 0; + + /** + * Attached listeners + * @var array + */ + var $_listeners = array(); + + /** + * Bytes left to read from message-body + * @var null|int + */ + var $_toRead; + + /** + * Constructor + * + * @param Net_Socket socket to read the response from + * @param array listeners attached to request + */ + function HTTP_Response(&$sock, &$listeners) + { + $this->_sock =& $sock; + $this->_listeners =& $listeners; + } + + + /** + * Processes a HTTP response + * + * This extracts response code, headers, cookies and decodes body if it + * was encoded in some way + * + * @access public + * @param bool Whether to store response body in object property, set + * this to false if downloading a LARGE file and using a Listener. + * This is assumed to be true if body is gzip-encoded. + * @param bool Whether the response can actually have a message-body. + * Will be set to false for HEAD requests. + * @throws PEAR_Error + * @return mixed true on success, PEAR_Error in case of malformed response + */ + function process($saveBody = true, $canHaveBody = true) + { + do { + $line = $this->_sock->readLine(); + if (sscanf($line, 'HTTP/%s %s', $http_version, $returncode) != 2) { + return PEAR::raiseError('Malformed response.'); + } else { + $this->_protocol = 'HTTP/' . $http_version; + $this->_code = intval($returncode); + } + while ('' !== ($header = $this->_sock->readLine())) { + $this->_processHeader($header); + } + } while (100 == $this->_code); + + $this->_notify('gotHeaders', $this->_headers); + + // RFC 2616, section 4.4: + // 1. Any response message which "MUST NOT" include a message-body ... + // is always terminated by the first empty line after the header fields + // 3. ... If a message is received with both a + // Transfer-Encoding header field and a Content-Length header field, + // the latter MUST be ignored. + $canHaveBody = $canHaveBody && $this->_code >= 200 && + $this->_code != 204 && $this->_code != 304; + + // If response body is present, read it and decode + $chunked = isset($this->_headers['transfer-encoding']) && ('chunked' == $this->_headers['transfer-encoding']); + $gzipped = isset($this->_headers['content-encoding']) && ('gzip' == $this->_headers['content-encoding']); + $hasBody = false; + if ($canHaveBody && ($chunked || !isset($this->_headers['content-length']) || + 0 != $this->_headers['content-length'])) + { + if ($chunked || !isset($this->_headers['content-length'])) { + $this->_toRead = null; + } else { + $this->_toRead = $this->_headers['content-length']; + } + while (!$this->_sock->eof() && (is_null($this->_toRead) || 0 < $this->_toRead)) { + if ($chunked) { + $data = $this->_readChunked(); + } elseif (is_null($this->_toRead)) { + $data = $this->_sock->read(4096); + } else { + $data = $this->_sock->read(min(4096, $this->_toRead)); + $this->_toRead -= HTTP_REQUEST_MBSTRING? mb_strlen($data, 'iso-8859-1'): strlen($data); + } + if ('' == $data) { + break; + } else { + $hasBody = true; + if ($saveBody || $gzipped) { + $this->_body .= $data; + } + $this->_notify($gzipped? 'gzTick': 'tick', $data); + } + } + } + + if ($hasBody) { + // Uncompress the body if needed + if ($gzipped) { + $body = $this->_decodeGzip($this->_body); + if (PEAR::isError($body)) { + return $body; + } + $this->_body = $body; + $this->_notify('gotBody', $this->_body); + } else { + $this->_notify('gotBody'); + } + } + return true; + } + + + /** + * Processes the response header + * + * @access private + * @param string HTTP header + */ + function _processHeader($header) + { + if (false === strpos($header, ':')) { + return; + } + list($headername, $headervalue) = explode(':', $header, 2); + $headername = strtolower($headername); + $headervalue = ltrim($headervalue); + + if ('set-cookie' != $headername) { + if (isset($this->_headers[$headername])) { + $this->_headers[$headername] .= ',' . $headervalue; + } else { + $this->_headers[$headername] = $headervalue; + } + } else { + $this->_parseCookie($headervalue); + } + } + + + /** + * Parse a Set-Cookie header to fill $_cookies array + * + * @access private + * @param string value of Set-Cookie header + */ + function _parseCookie($headervalue) + { + $cookie = array( + 'expires' => null, + 'domain' => null, + 'path' => null, + 'secure' => false + ); + + // Only a name=value pair + if (!strpos($headervalue, ';')) { + $pos = strpos($headervalue, '='); + $cookie['name'] = trim(substr($headervalue, 0, $pos)); + $cookie['value'] = trim(substr($headervalue, $pos + 1)); + + // Some optional parameters are supplied + } else { + $elements = explode(';', $headervalue); + $pos = strpos($elements[0], '='); + $cookie['name'] = trim(substr($elements[0], 0, $pos)); + $cookie['value'] = trim(substr($elements[0], $pos + 1)); + + for ($i = 1; $i < count($elements); $i++) { + if (false === strpos($elements[$i], '=')) { + $elName = trim($elements[$i]); + $elValue = null; + } else { + list ($elName, $elValue) = array_map('trim', explode('=', $elements[$i])); + } + $elName = strtolower($elName); + if ('secure' == $elName) { + $cookie['secure'] = true; + } elseif ('expires' == $elName) { + $cookie['expires'] = str_replace('"', '', $elValue); + } elseif ('path' == $elName || 'domain' == $elName) { + $cookie[$elName] = urldecode($elValue); + } else { + $cookie[$elName] = $elValue; + } + } + } + $this->_cookies[] = $cookie; + } + + + /** + * Read a part of response body encoded with chunked Transfer-Encoding + * + * @access private + * @return string + */ + function _readChunked() + { + // at start of the next chunk? + if (0 == $this->_chunkLength) { + $line = $this->_sock->readLine(); + if (preg_match('/^([0-9a-f]+)/i', $line, $matches)) { + $this->_chunkLength = hexdec($matches[1]); + // Chunk with zero length indicates the end + if (0 == $this->_chunkLength) { + $this->_sock->readLine(); // make this an eof() + return ''; + } + } else { + return ''; + } + } + $data = $this->_sock->read($this->_chunkLength); + $this->_chunkLength -= HTTP_REQUEST_MBSTRING? mb_strlen($data, 'iso-8859-1'): strlen($data); + if (0 == $this->_chunkLength) { + $this->_sock->readLine(); // Trailing CRLF + } + return $data; + } + + + /** + * Notifies all registered listeners of an event. + * + * @param string Event name + * @param mixed Additional data + * @access private + * @see HTTP_Request::_notify() + */ + function _notify($event, $data = null) + { + foreach (array_keys($this->_listeners) as $id) { + $this->_listeners[$id]->update($this, $event, $data); + } + } + + + /** + * Decodes the message-body encoded by gzip + * + * The real decoding work is done by gzinflate() built-in function, this + * method only parses the header and checks data for compliance with + * RFC 1952 + * + * @access private + * @param string gzip-encoded data + * @return string decoded data + */ + function _decodeGzip($data) + { + if (HTTP_REQUEST_MBSTRING) { + $oldEncoding = mb_internal_encoding(); + mb_internal_encoding('iso-8859-1'); + } + $length = strlen($data); + // If it doesn't look like gzip-encoded data, don't bother + if (18 > $length || strcmp(substr($data, 0, 2), "\x1f\x8b")) { + return $data; + } + $method = ord(substr($data, 2, 1)); + if (8 != $method) { + return PEAR::raiseError('_decodeGzip(): unknown compression method'); + } + $flags = ord(substr($data, 3, 1)); + if ($flags & 224) { + return PEAR::raiseError('_decodeGzip(): reserved bits are set'); + } + + // header is 10 bytes minimum. may be longer, though. + $headerLength = 10; + // extra fields, need to skip 'em + if ($flags & 4) { + if ($length - $headerLength - 2 < 8) { + return PEAR::raiseError('_decodeGzip(): data too short'); + } + $extraLength = unpack('v', substr($data, 10, 2)); + if ($length - $headerLength - 2 - $extraLength[1] < 8) { + return PEAR::raiseError('_decodeGzip(): data too short'); + } + $headerLength += $extraLength[1] + 2; + } + // file name, need to skip that + if ($flags & 8) { + if ($length - $headerLength - 1 < 8) { + return PEAR::raiseError('_decodeGzip(): data too short'); + } + $filenameLength = strpos(substr($data, $headerLength), chr(0)); + if (false === $filenameLength || $length - $headerLength - $filenameLength - 1 < 8) { + return PEAR::raiseError('_decodeGzip(): data too short'); + } + $headerLength += $filenameLength + 1; + } + // comment, need to skip that also + if ($flags & 16) { + if ($length - $headerLength - 1 < 8) { + return PEAR::raiseError('_decodeGzip(): data too short'); + } + $commentLength = strpos(substr($data, $headerLength), chr(0)); + if (false === $commentLength || $length - $headerLength - $commentLength - 1 < 8) { + return PEAR::raiseError('_decodeGzip(): data too short'); + } + $headerLength += $commentLength + 1; + } + // have a CRC for header. let's check + if ($flags & 1) { + if ($length - $headerLength - 2 < 8) { + return PEAR::raiseError('_decodeGzip(): data too short'); + } + $crcReal = 0xffff & crc32(substr($data, 0, $headerLength)); + $crcStored = unpack('v', substr($data, $headerLength, 2)); + if ($crcReal != $crcStored[1]) { + return PEAR::raiseError('_decodeGzip(): header CRC check failed'); + } + $headerLength += 2; + } + // unpacked data CRC and size at the end of encoded data + $tmp = unpack('V2', substr($data, -8)); + $dataCrc = $tmp[1]; + $dataSize = $tmp[2]; + + // finally, call the gzinflate() function + $unpacked = @gzinflate(substr($data, $headerLength, -8), $dataSize); + if (false === $unpacked) { + return PEAR::raiseError('_decodeGzip(): gzinflate() call failed'); + } elseif ($dataSize != strlen($unpacked)) { + return PEAR::raiseError('_decodeGzip(): data size check failed'); + } elseif ((0xffffffff & $dataCrc) != (0xffffffff & crc32($unpacked))) { + return PEAR::raiseError('_decodeGzip(): data CRC check failed'); + } + if (HTTP_REQUEST_MBSTRING) { + mb_internal_encoding($oldEncoding); + } + return $unpacked; + } +} // End class HTTP_Response +?> diff --git a/libs/PEAR/HTTP/Request/Listener.php b/libs/PEAR/HTTP/Request/Listener.php index f0408b004..928ac5e68 100644 --- a/libs/PEAR/HTTP/Request/Listener.php +++ b/libs/PEAR/HTTP/Request/Listener.php @@ -1,106 +1,106 @@ - - * @copyright 2002-2007 Richard Heyes - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Listener.php,v 1.3 2007/05/18 10:33:31 avb Exp $ - * @link http://pear.php.net/package/HTTP_Request/ - */ - -/** - * Listener for HTTP_Request and HTTP_Response objects - * - * This class implements the Observer part of a Subject-Observer - * design pattern. - * - * @category HTTP - * @package HTTP_Request - * @author Alexey Borzov - * @version Release: 1.4.1 - */ -class HTTP_Request_Listener -{ - /** - * A listener's identifier - * @var string - */ - var $_id; - - /** - * Constructor, sets the object's identifier - * - * @access public - */ - function HTTP_Request_Listener() - { - $this->_id = md5(uniqid('http_request_', 1)); - } - - - /** - * Returns the listener's identifier - * - * @access public - * @return string - */ - function getId() - { - return $this->_id; - } - - - /** - * This method is called when Listener is notified of an event - * - * @access public - * @param object an object the listener is attached to - * @param string Event name - * @param mixed Additional data - * @abstract - */ - function update(&$subject, $event, $data = null) - { - echo "Notified of event: '$event'\n"; - if (null !== $data) { - echo "Additional data: "; - var_dump($data); - } - } -} -?> + + * @copyright 2002-2007 Richard Heyes + * @license http://opensource.org/licenses/bsd-license.php New BSD License + * @version CVS: $Id: Listener.php,v 1.3 2007/05/18 10:33:31 avb Exp $ + * @link http://pear.php.net/package/HTTP_Request/ + */ + +/** + * Listener for HTTP_Request and HTTP_Response objects + * + * This class implements the Observer part of a Subject-Observer + * design pattern. + * + * @category HTTP + * @package HTTP_Request + * @author Alexey Borzov + * @version Release: 1.4.1 + */ +class HTTP_Request_Listener +{ + /** + * A listener's identifier + * @var string + */ + var $_id; + + /** + * Constructor, sets the object's identifier + * + * @access public + */ + function HTTP_Request_Listener() + { + $this->_id = md5(uniqid('http_request_', 1)); + } + + + /** + * Returns the listener's identifier + * + * @access public + * @return string + */ + function getId() + { + return $this->_id; + } + + + /** + * This method is called when Listener is notified of an event + * + * @access public + * @param object an object the listener is attached to + * @param string Event name + * @param mixed Additional data + * @abstract + */ + function update(&$subject, $event, $data = null) + { + echo "Notified of event: '$event'\n"; + if (null !== $data) { + echo "Additional data: "; + var_dump($data); + } + } +} +?> diff --git a/libs/PEAR/Net/URL.php b/libs/PEAR/Net/URL.php index da48c746b..6331fc0ac 100644 --- a/libs/PEAR/Net/URL.php +++ b/libs/PEAR/Net/URL.php @@ -1,410 +1,410 @@ - | -// +-----------------------------------------------------------------------+ -// -// $Id: URL.php,v 1.36 2004/06/19 18:58:50 richard Exp $ -// -// Net_URL Class - -class Net_URL -{ - /** - * Full url - * @var string - */ - var $url; - - /** - * Protocol - * @var string - */ - var $protocol; - - /** - * Username - * @var string - */ - var $username; - - /** - * Password - * @var string - */ - var $password; - - /** - * Host - * @var string - */ - var $host; - - /** - * Port - * @var integer - */ - var $port; - - /** - * Path - * @var string - */ - var $path; - - /** - * Query string - * @var array - */ - var $querystring; - - /** - * Anchor - * @var string - */ - var $anchor; - - /** - * Whether to use [] - * @var bool - */ - var $useBrackets; - - /** - * PHP4 Constructor - * - * @see __construct() - */ - function Net_URL($url = null, $useBrackets = true) - { - $this->__construct($url, $useBrackets); - } - - /** - * PHP5 Constructor - * - * Parses the given url and stores the various parts - * Defaults are used in certain cases - * - * @param string $url Optional URL - * @param bool $useBrackets Whether to use square brackets when - * multiple querystrings with the same name - * exist - */ - function __construct($url = null, $useBrackets = true) - { - $HTTP_SERVER_VARS = !empty($_SERVER) ? $_SERVER : $GLOBALS['HTTP_SERVER_VARS']; - - $this->useBrackets = $useBrackets; - $this->url = $url; - $this->user = ''; - $this->pass = ''; - $this->host = ''; - $this->port = 80; - $this->path = ''; - $this->querystring = array(); - $this->anchor = ''; - - // Only use defaults if not an absolute URL given - if (!preg_match('/^[a-z0-9]+:\/\//i', $url)) { - - $this->protocol = (@$HTTP_SERVER_VARS['HTTPS'] == 'on' ? 'https' : 'http'); - - /** - * Figure out host/port - */ - if (!empty($HTTP_SERVER_VARS['HTTP_HOST']) AND preg_match('/^(.*)(:([0-9]+))?$/U', $HTTP_SERVER_VARS['HTTP_HOST'], $matches)) { - $host = $matches[1]; - if (!empty($matches[3])) { - $port = $matches[3]; - } else { - $port = $this->getStandardPort($this->protocol); - } - } - - $this->user = ''; - $this->pass = ''; - $this->host = !empty($host) ? $host : (isset($HTTP_SERVER_VARS['SERVER_NAME']) ? $HTTP_SERVER_VARS['SERVER_NAME'] : 'localhost'); - $this->port = !empty($port) ? $port : (isset($HTTP_SERVER_VARS['SERVER_PORT']) ? $HTTP_SERVER_VARS['SERVER_PORT'] : $this->getStandardPort($this->protocol)); - $this->path = !empty($HTTP_SERVER_VARS['PHP_SELF']) ? $HTTP_SERVER_VARS['PHP_SELF'] : '/'; - $this->querystring = isset($HTTP_SERVER_VARS['QUERY_STRING']) ? $this->_parseRawQuerystring($HTTP_SERVER_VARS['QUERY_STRING']) : null; - $this->anchor = ''; - } - - // Parse the url and store the various parts - if (!empty($url)) { - $urlinfo = parse_url($url); - - // Default querystring - $this->querystring = array(); - - foreach ($urlinfo as $key => $value) { - switch ($key) { - case 'scheme': - $this->protocol = $value; - $this->port = $this->getStandardPort($value); - break; - - case 'user': - case 'pass': - case 'host': - case 'port': - $this->$key = $value; - break; - - case 'path': - if ($value{0} == '/') { - $this->path = $value; - } else { - $path = dirname($this->path) == DIRECTORY_SEPARATOR ? '' : dirname($this->path); - $this->path = sprintf('%s/%s', $path, $value); - } - break; - - case 'query': - $this->querystring = $this->_parseRawQueryString($value); - break; - - case 'fragment': - $this->anchor = $value; - break; - } - } - } - } - - /** - * Returns full url - * - * @return string Full url - * @access public - */ - function getURL() - { - $querystring = $this->getQueryString(); - - $this->url = $this->protocol . '://' - . $this->user . (!empty($this->pass) ? ':' : '') - . $this->pass . (!empty($this->user) ? '@' : '') - . $this->host . ($this->port == $this->getStandardPort($this->protocol) ? '' : ':' . $this->port) - . $this->path - . (!empty($querystring) ? '?' . $querystring : '') - . (!empty($this->anchor) ? '#' . $this->anchor : ''); - - return $this->url; - } - - /** - * Adds a querystring item - * - * @param string $name Name of item - * @param string $value Value of item - * @param bool $preencoded Whether value is urlencoded or not, default = not - * @access public - */ - function addQueryString($name, $value, $preencoded = false) - { - if ($preencoded) { - $this->querystring[$name] = $value; - } else { - $this->querystring[$name] = is_array($value) ? array_map('rawurlencode', $value): rawurlencode($value); - } - } - - /** - * Removes a querystring item - * - * @param string $name Name of item - * @access public - */ - function removeQueryString($name) - { - if (isset($this->querystring[$name])) { - unset($this->querystring[$name]); - } - } - - /** - * Sets the querystring to literally what you supply - * - * @param string $querystring The querystring data. Should be of the format foo=bar&x=y etc - * @access public - */ - function addRawQueryString($querystring) - { - $this->querystring = $this->_parseRawQueryString($querystring); - } - - /** - * Returns flat querystring - * - * @return string Querystring - * @access public - */ - function getQueryString() - { - if (!empty($this->querystring)) { - foreach ($this->querystring as $name => $value) { - if (is_array($value)) { - foreach ($value as $k => $v) { - $querystring[] = $this->useBrackets ? sprintf('%s[%s]=%s', $name, $k, $v) : ($name . '=' . $v); - } - } elseif (!is_null($value)) { - $querystring[] = $name . '=' . $value; - } else { - $querystring[] = $name; - } - } - $querystring = implode(ini_get('arg_separator.output'), $querystring); - } else { - $querystring = ''; - } - - return $querystring; - } - - /** - * Parses raw querystring and returns an array of it - * - * @param string $querystring The querystring to parse - * @return array An array of the querystring data - * @access private - */ - function _parseRawQuerystring($querystring) - { - $parts = preg_split('/[' . preg_quote(ini_get('arg_separator.input'), '/') . ']/', $querystring, -1, PREG_SPLIT_NO_EMPTY); - $return = array(); - - foreach ($parts as $part) { - if (strpos($part, '=') !== false) { - $value = substr($part, strpos($part, '=') + 1); - $key = substr($part, 0, strpos($part, '=')); - } else { - $value = null; - $key = $part; - } - if (substr($key, -2) == '[]') { - $key = substr($key, 0, -2); - if (@!is_array($return[$key])) { - $return[$key] = array(); - $return[$key][] = $value; - } else { - $return[$key][] = $value; - } - } elseif (!$this->useBrackets AND !empty($return[$key])) { - $return[$key] = (array)$return[$key]; - $return[$key][] = $value; - } else { - $return[$key] = $value; - } - } - - return $return; - } - - /** - * Resolves //, ../ and ./ from a path and returns - * the result. Eg: - * - * /foo/bar/../boo.php => /foo/boo.php - * /foo/bar/../../boo.php => /boo.php - * /foo/bar/.././/boo.php => /foo/boo.php - * - * This method can also be called statically. - * - * @param string $url URL path to resolve - * @return string The result - */ - function resolvePath($path) - { - $path = explode('/', str_replace('//', '/', $path)); - - for ($i=0; $i 1 OR ($i == 1 AND $path[0] != '') ) ) { - unset($path[$i]); - unset($path[$i-1]); - $path = array_values($path); - $i -= 2; - - } elseif ($path[$i] == '..' AND $i == 1 AND $path[0] == '') { - unset($path[$i]); - $path = array_values($path); - $i--; - - } else { - continue; - } - } - - return implode('/', $path); - } - - /** - * Returns the standard port number for a protocol - * - * @param string $scheme The protocol to lookup - * @return integer Port number or NULL if no scheme matches - * - * @author Philippe Jausions - */ - function getStandardPort($scheme) - { - switch (strtolower($scheme)) { - case 'http': return 80; - case 'https': return 443; - case 'ftp': return 21; - case 'imap': return 143; - case 'imaps': return 993; - case 'pop3': return 110; - case 'pop3s': return 995; - default: return null; - } - } - - /** - * Forces the URL to a particular protocol - * - * @param string $protocol Protocol to force the URL to - * @param integer $port Optional port (standard port is used by default) - */ - function setProtocol($protocol, $port = null) - { - $this->protocol = $protocol; - $this->port = is_null($port) ? $this->getStandardPort() : $port; - } - -} -?> + | +// +-----------------------------------------------------------------------+ +// +// $Id: URL.php,v 1.36 2004/06/19 18:58:50 richard Exp $ +// +// Net_URL Class + +class Net_URL +{ + /** + * Full url + * @var string + */ + var $url; + + /** + * Protocol + * @var string + */ + var $protocol; + + /** + * Username + * @var string + */ + var $username; + + /** + * Password + * @var string + */ + var $password; + + /** + * Host + * @var string + */ + var $host; + + /** + * Port + * @var integer + */ + var $port; + + /** + * Path + * @var string + */ + var $path; + + /** + * Query string + * @var array + */ + var $querystring; + + /** + * Anchor + * @var string + */ + var $anchor; + + /** + * Whether to use [] + * @var bool + */ + var $useBrackets; + + /** + * PHP4 Constructor + * + * @see __construct() + */ + function Net_URL($url = null, $useBrackets = true) + { + $this->__construct($url, $useBrackets); + } + + /** + * PHP5 Constructor + * + * Parses the given url and stores the various parts + * Defaults are used in certain cases + * + * @param string $url Optional URL + * @param bool $useBrackets Whether to use square brackets when + * multiple querystrings with the same name + * exist + */ + function __construct($url = null, $useBrackets = true) + { + $HTTP_SERVER_VARS = !empty($_SERVER) ? $_SERVER : $GLOBALS['HTTP_SERVER_VARS']; + + $this->useBrackets = $useBrackets; + $this->url = $url; + $this->user = ''; + $this->pass = ''; + $this->host = ''; + $this->port = 80; + $this->path = ''; + $this->querystring = array(); + $this->anchor = ''; + + // Only use defaults if not an absolute URL given + if (!preg_match('/^[a-z0-9]+:\/\//i', $url)) { + + $this->protocol = (@$HTTP_SERVER_VARS['HTTPS'] == 'on' ? 'https' : 'http'); + + /** + * Figure out host/port + */ + if (!empty($HTTP_SERVER_VARS['HTTP_HOST']) AND preg_match('/^(.*)(:([0-9]+))?$/U', $HTTP_SERVER_VARS['HTTP_HOST'], $matches)) { + $host = $matches[1]; + if (!empty($matches[3])) { + $port = $matches[3]; + } else { + $port = $this->getStandardPort($this->protocol); + } + } + + $this->user = ''; + $this->pass = ''; + $this->host = !empty($host) ? $host : (isset($HTTP_SERVER_VARS['SERVER_NAME']) ? $HTTP_SERVER_VARS['SERVER_NAME'] : 'localhost'); + $this->port = !empty($port) ? $port : (isset($HTTP_SERVER_VARS['SERVER_PORT']) ? $HTTP_SERVER_VARS['SERVER_PORT'] : $this->getStandardPort($this->protocol)); + $this->path = !empty($HTTP_SERVER_VARS['PHP_SELF']) ? $HTTP_SERVER_VARS['PHP_SELF'] : '/'; + $this->querystring = isset($HTTP_SERVER_VARS['QUERY_STRING']) ? $this->_parseRawQuerystring($HTTP_SERVER_VARS['QUERY_STRING']) : null; + $this->anchor = ''; + } + + // Parse the url and store the various parts + if (!empty($url)) { + $urlinfo = parse_url($url); + + // Default querystring + $this->querystring = array(); + + foreach ($urlinfo as $key => $value) { + switch ($key) { + case 'scheme': + $this->protocol = $value; + $this->port = $this->getStandardPort($value); + break; + + case 'user': + case 'pass': + case 'host': + case 'port': + $this->$key = $value; + break; + + case 'path': + if ($value{0} == '/') { + $this->path = $value; + } else { + $path = dirname($this->path) == DIRECTORY_SEPARATOR ? '' : dirname($this->path); + $this->path = sprintf('%s/%s', $path, $value); + } + break; + + case 'query': + $this->querystring = $this->_parseRawQueryString($value); + break; + + case 'fragment': + $this->anchor = $value; + break; + } + } + } + } + + /** + * Returns full url + * + * @return string Full url + * @access public + */ + function getURL() + { + $querystring = $this->getQueryString(); + + $this->url = $this->protocol . '://' + . $this->user . (!empty($this->pass) ? ':' : '') + . $this->pass . (!empty($this->user) ? '@' : '') + . $this->host . ($this->port == $this->getStandardPort($this->protocol) ? '' : ':' . $this->port) + . $this->path + . (!empty($querystring) ? '?' . $querystring : '') + . (!empty($this->anchor) ? '#' . $this->anchor : ''); + + return $this->url; + } + + /** + * Adds a querystring item + * + * @param string $name Name of item + * @param string $value Value of item + * @param bool $preencoded Whether value is urlencoded or not, default = not + * @access public + */ + function addQueryString($name, $value, $preencoded = false) + { + if ($preencoded) { + $this->querystring[$name] = $value; + } else { + $this->querystring[$name] = is_array($value) ? array_map('rawurlencode', $value): rawurlencode($value); + } + } + + /** + * Removes a querystring item + * + * @param string $name Name of item + * @access public + */ + function removeQueryString($name) + { + if (isset($this->querystring[$name])) { + unset($this->querystring[$name]); + } + } + + /** + * Sets the querystring to literally what you supply + * + * @param string $querystring The querystring data. Should be of the format foo=bar&x=y etc + * @access public + */ + function addRawQueryString($querystring) + { + $this->querystring = $this->_parseRawQueryString($querystring); + } + + /** + * Returns flat querystring + * + * @return string Querystring + * @access public + */ + function getQueryString() + { + if (!empty($this->querystring)) { + foreach ($this->querystring as $name => $value) { + if (is_array($value)) { + foreach ($value as $k => $v) { + $querystring[] = $this->useBrackets ? sprintf('%s[%s]=%s', $name, $k, $v) : ($name . '=' . $v); + } + } elseif (!is_null($value)) { + $querystring[] = $name . '=' . $value; + } else { + $querystring[] = $name; + } + } + $querystring = implode(ini_get('arg_separator.output'), $querystring); + } else { + $querystring = ''; + } + + return $querystring; + } + + /** + * Parses raw querystring and returns an array of it + * + * @param string $querystring The querystring to parse + * @return array An array of the querystring data + * @access private + */ + function _parseRawQuerystring($querystring) + { + $parts = preg_split('/[' . preg_quote(ini_get('arg_separator.input'), '/') . ']/', $querystring, -1, PREG_SPLIT_NO_EMPTY); + $return = array(); + + foreach ($parts as $part) { + if (strpos($part, '=') !== false) { + $value = substr($part, strpos($part, '=') + 1); + $key = substr($part, 0, strpos($part, '=')); + } else { + $value = null; + $key = $part; + } + if (substr($key, -2) == '[]') { + $key = substr($key, 0, -2); + if (@!is_array($return[$key])) { + $return[$key] = array(); + $return[$key][] = $value; + } else { + $return[$key][] = $value; + } + } elseif (!$this->useBrackets AND !empty($return[$key])) { + $return[$key] = (array)$return[$key]; + $return[$key][] = $value; + } else { + $return[$key] = $value; + } + } + + return $return; + } + + /** + * Resolves //, ../ and ./ from a path and returns + * the result. Eg: + * + * /foo/bar/../boo.php => /foo/boo.php + * /foo/bar/../../boo.php => /boo.php + * /foo/bar/.././/boo.php => /foo/boo.php + * + * This method can also be called statically. + * + * @param string $url URL path to resolve + * @return string The result + */ + function resolvePath($path) + { + $path = explode('/', str_replace('//', '/', $path)); + + for ($i=0; $i 1 OR ($i == 1 AND $path[0] != '') ) ) { + unset($path[$i]); + unset($path[$i-1]); + $path = array_values($path); + $i -= 2; + + } elseif ($path[$i] == '..' AND $i == 1 AND $path[0] == '') { + unset($path[$i]); + $path = array_values($path); + $i--; + + } else { + continue; + } + } + + return implode('/', $path); + } + + /** + * Returns the standard port number for a protocol + * + * @param string $scheme The protocol to lookup + * @return integer Port number or NULL if no scheme matches + * + * @author Philippe Jausions + */ + function getStandardPort($scheme) + { + switch (strtolower($scheme)) { + case 'http': return 80; + case 'https': return 443; + case 'ftp': return 21; + case 'imap': return 143; + case 'imaps': return 993; + case 'pop3': return 110; + case 'pop3s': return 995; + default: return null; + } + } + + /** + * Forces the URL to a particular protocol + * + * @param string $protocol Protocol to force the URL to + * @param integer $port Optional port (standard port is used by default) + */ + function setProtocol($protocol, $port = null) + { + $this->protocol = $protocol; + $this->port = is_null($port) ? $this->getStandardPort() : $port; + } + +} +?> diff --git a/libs/ftp.class.php b/libs/ftp.class.php index d49a2efbb..417a3a83b 100644 --- a/libs/ftp.class.php +++ b/libs/ftp.class.php @@ -1,530 +1,530 @@ -debug = false; - $this->umask = 0022; - $this->timeout = 30; - - if (!defined("FTP_BINARY")) { - define("FTP_BINARY", 1); - } - if (!defined("FTP_ASCII")) { - define("FTP_ASCII", 0); - } - - $this->ftp_resp = ""; - } - - /* Public functions */ - function ftp_connect($server, $port = 21) - { - $this->ftp_debug("Trying to ".$server.":".$port." ...\n"); - $this->ftp_sock = @fsockopen($server, $port, $errno, $errstr, $this->timeout); - - if (!$this->ftp_sock || !$this->ftp_ok()) { - $this->ftp_debug("Error : Cannot connect to remote host \"".$server.":".$port."\"\n"); - $this->ftp_debug("Error : fsockopen() ".$errstr." (".$errno.")\n"); - return FALSE; - } - $this->ftp_debug("Connected to remote host \"".$server.":".$port."\"\n"); - - return TRUE; - } - - function ftp_login($user, $pass) - { - $this->ftp_putcmd("USER", $user); - if (!$this->ftp_ok()) { - $this->ftp_debug("Error : USER command failed\n"); - return FALSE; - } - - $this->ftp_putcmd("PASS", $pass); - if (!$this->ftp_ok()) { - $this->ftp_debug("Error : PASS command failed\n"); - return FALSE; - } - $this->ftp_debug("Authentication succeeded\n"); - - return TRUE; - } - - function ftp_pwd() - { - $this->ftp_putcmd("PWD"); - if (!$this->ftp_ok()) { - $this->ftp_debug("Error : PWD command failed\n"); - return FALSE; - } - - return preg_replace("@^[0-9]{3} \"(.+)\" .+\r\n@", "\\1", $this->ftp_resp); - } - - function ftp_size($pathname) - { - $this->ftp_putcmd("SIZE", $pathname); - if (!$this->ftp_ok()) { - $this->ftp_debug("Error : SIZE command failed\n"); - return -1; - } - - return preg_replace("@^[0-9]{3} ([0-9]+)\r\n@", "\\1", $this->ftp_resp); - } - - function ftp_mdtm($pathname) - { - $this->ftp_putcmd("MDTM", $pathname); - if (!$this->ftp_ok()) { - $this->ftp_debug("Error : MDTM command failed\n"); - return -1; - } - $mdtm = preg_replace("@^[0-9]{3} ([0-9]+)\r\n@", "\\1", $this->ftp_resp); - $date = sscanf($mdtm, "%4d%2d%2d%2d%2d%2d"); - $timestamp = mktime($date[3], $date[4], $date[5], $date[1], $date[2], $date[0]); - - return $timestamp; - } - - function ftp_systype() - { - $this->ftp_putcmd("SYST"); - if (!$this->ftp_ok()) { - $this->ftp_debug("Error : SYST command failed\n"); - return FALSE; - } - $DATA = explode(" ", $this->ftp_resp); - - return $DATA[1]; - } - - function ftp_cdup() - { - $this->ftp_putcmd("CDUP"); - $response = $this->ftp_ok(); - if (!$response) { - $this->ftp_debug("Error : CDUP command failed\n"); - } - return $response; - } - - function ftp_chdir($pathname) - { - $this->ftp_putcmd("CWD", $pathname); - $response = $this->ftp_ok(); - if (!$response) { - $this->ftp_debug("Error : CWD command failed\n"); - } - return $response; - } - - function ftp_delete($pathname) - { - $this->ftp_putcmd("DELE", $pathname); - $response = $this->ftp_ok(); - if (!$response) { - $this->ftp_debug("Error : DELE command failed\n"); - } - return $response; - } - - function ftp_rmdir($pathname) - { - $this->ftp_putcmd("RMD", $pathname); - $response = $this->ftp_ok(); - if (!$response) { - $this->ftp_debug("Error : RMD command failed\n"); - } - return $response; - } - - function ftp_mkdir($pathname) - { - $this->ftp_putcmd("MKD", $pathname); - $response = $this->ftp_ok(); - if (!$response) { - $this->ftp_debug("Error : MKD command failed\n"); - } - return $response; - } - - function ftp_file_exists($pathname) - { - if (!($remote_list = $this->ftp_nlist("-a"))) { - $this->ftp_debug("Error : Cannot get remote file list\n"); - return -1; - } - - reset($remote_list); - while (list(,$value) = each($remote_list)) { - if ($value == $pathname) { - $this->ftp_debug("Remote file ".$pathname." exists\n"); - return 1; - } - } - $this->ftp_debug("Remote file ".$pathname." does not exist\n"); - - return 0; - } - - function ftp_rename($from, $to) - { - $this->ftp_putcmd("RNFR", $from); - if (!$this->ftp_ok()) { - $this->ftp_debug("Error : RNFR command failed\n"); - return FALSE; - } - $this->ftp_putcmd("RNTO", $to); - - $response = $this->ftp_ok(); - if (!$response) { - $this->ftp_debug("Error : RNTO command failed\n"); - } - return $response; - } - - function ftp_nlist($arg = "", $pathname = "") - { - if (!($string = $this->ftp_pasv())) { - return FALSE; - } - - if ($arg == "") { - $nlst = "NLST"; - } else { - $nlst = "NLST ".$arg; - } - $this->ftp_putcmd($nlst, $pathname); - - $sock_data = $this->ftp_open_data_connection($string); - if (!$sock_data || !$this->ftp_ok()) { - $this->ftp_debug("Error : Cannot connect to remote host\n"); - $this->ftp_debug("Error : NLST command failed\n"); - return FALSE; - } - $this->ftp_debug("Connected to remote host\n"); - - $list = array(); - while (!feof($sock_data)) { - $list[] = preg_replace("@[\r\n]@", "", fgets($sock_data, 512)); - } - $this->ftp_close_data_connection($sock_data); - $this->ftp_debug(implode("\n", $list)); - - if (!$this->ftp_ok()) { - $this->ftp_debug("Error : NLST command failed\n"); - return FALSE; - } - - return $list; - } - - function ftp_rawlist($pathname = "") - { - if (!($string = $this->ftp_pasv())) { - return FALSE; - } - - $this->ftp_putcmd("LIST", $pathname); - - $sock_data = $this->ftp_open_data_connection($string); - if (!$sock_data || !$this->ftp_ok()) { - $this->ftp_debug("Error : Cannot connect to remote host\n"); - $this->ftp_debug("Error : LIST command failed\n"); - return FALSE; - } - - $this->ftp_debug("Connected to remote host\n"); - - while (!feof($sock_data)) { - $list[] = preg_replace("@[\r\n]@", "", fgets($sock_data, 512)); - } - $this->ftp_debug(implode("\n", $list)); - $this->ftp_close_data_connection($sock_data); - - if (!$this->ftp_ok()) { - $this->ftp_debug("Error : LIST command failed\n"); - return FALSE; - } - - return $list; - } - - function ftp_get($localfile, $remotefile, $mode = 1) - { - umask($this->umask); - - if (@file_exists($localfile)) { - $this->ftp_debug("Warning : local file will be overwritten\n"); - } - - $fp = @fopen($localfile, "w"); - if (!$fp) { - $this->ftp_debug("Error : Cannot create \"".$localfile."\""); - $this->ftp_debug("Error : GET command failed\n"); - return FALSE; - } - - if (!$this->ftp_type($mode)) { - $this->ftp_debug("Error : GET command failed\n"); - return FALSE; - } - - if (!($string = $this->ftp_pasv())) { - $this->ftp_debug("Error : GET command failed\n"); - return FALSE; - } - - $this->ftp_putcmd("RETR", $remotefile); - - $sock_data = $this->ftp_open_data_connection($string); - if (!$sock_data || !$this->ftp_ok()) { - $this->ftp_debug("Error : Cannot connect to remote host\n"); - $this->ftp_debug("Error : GET command failed\n"); - return FALSE; - } - $this->ftp_debug("Connected to remote host\n"); - $this->ftp_debug("Retrieving remote file \"".$remotefile."\" to local file \"".$localfile."\"\n"); - while (!feof($sock_data)) { - fputs($fp, fread($sock_data, 4096)); - } - fclose($fp); - - $this->ftp_close_data_connection($sock_data); - - $response = $this->ftp_ok(); - if (!$response) { - $this->ftp_debug("Error : GET command failed\n"); - } - return $response; - } - - function ftp_put($remotefile, $localfile, $mode = 1) - { - - if (!@file_exists($localfile)) { - $this->ftp_debug("Error : No such file or directory \"".$localfile."\"\n"); - $this->ftp_debug("Error : PUT command failed\n"); - return FALSE; - } - - $fp = @fopen($localfile, "r"); - if (!$fp) { - $this->ftp_debug("Error : Cannot read file \"".$localfile."\"\n"); - $this->ftp_debug("Error : PUT command failed\n"); - return FALSE; - } - - if (!$this->ftp_type($mode)) { - $this->ftp_debug("Error : PUT command failed\n"); - return FALSE; - } - - if (!($string = $this->ftp_pasv())) { - $this->ftp_debug("Error : PUT command failed\n"); - return FALSE; - } - - $this->ftp_putcmd("STOR", $remotefile); - - $sock_data = $this->ftp_open_data_connection($string); - if (!$sock_data || !$this->ftp_ok()) { - $this->ftp_debug("Error : Cannot connect to remote host\n"); - $this->ftp_debug("Error : PUT command failed\n"); - return FALSE; - } - $this->ftp_debug("Connected to remote host\n"); - $this->ftp_debug("Storing local file \"".$localfile."\" to remote file \"".$remotefile."\"\n"); - while (!feof($fp)) { - fputs($sock_data, fread($fp, 4096)); - } - fclose($fp); - - $this->ftp_close_data_connection($sock_data); - - $response = $this->ftp_ok(); - if (!$response) { - $this->ftp_debug("Error : PUT command failed\n"); - } - return $response; - } - - function ftp_site($command) - { - $this->ftp_putcmd("SITE", $command); - $response = $this->ftp_ok(); - if (!$response) { - $this->ftp_debug("Error : SITE command failed\n"); - } - return $response; - } - - function ftp_quit() - { - $this->ftp_putcmd("QUIT"); - if (!$this->ftp_ok() || !fclose($this->ftp_sock)) { - $this->ftp_debug("Error : QUIT command failed\n"); - return FALSE; - } - $this->ftp_debug("Disconnected from remote host\n"); - return TRUE; - } - - /* Private Functions */ - - function ftp_type($mode) - { - if ($mode) { - $type = "I"; //Binary mode - } else { - $type = "A"; //ASCII mode - } - $this->ftp_putcmd("TYPE", $type); - $response = $this->ftp_ok(); - if (!$response) { - $this->ftp_debug("Error : TYPE command failed\n"); - } - return $response; - } - - function ftp_port($ip_port) - { - $this->ftp_putcmd("PORT", $ip_port); - $response = $this->ftp_ok(); - if (!$response) { - $this->ftp_debug("Error : PORT command failed\n"); - } - return $response; - } - - function ftp_pasv() - { - $this->ftp_putcmd("PASV"); - if (!$this->ftp_ok()) { - $this->ftp_debug("Error : PASV command failed\n"); - return FALSE; - } - - $ip_port = preg_replace("@^.+ \\(?([0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]+,[0-9]+)\\)?.*\r\n$@", "\\1", $this->ftp_resp); - return $ip_port; - } - - function ftp_putcmd($cmd, $arg = "") - { - if ($arg != "") { - $cmd = $cmd." ".$arg; - } - - fputs($this->ftp_sock, $cmd."\r\n"); - $this->ftp_debug("> ".$cmd."\n"); - - return TRUE; - } - - function ftp_ok() - { - $this->ftp_resp = ""; - do { - $res = fgets($this->ftp_sock, 512); - $this->ftp_resp .= $res; - } while (substr($res, 3, 1) != " "); - - $this->ftp_debug(str_replace("\r\n", "\n", $this->ftp_resp)); - - if (!preg_match("@^[123]@", $this->ftp_resp)) { - return FALSE; - } - - return TRUE; - } - - function ftp_close_data_connection($sock) - { - $this->ftp_debug("Disconnected from remote host\n"); - return fclose($sock); - } - - function ftp_open_data_connection($ip_port) - { - if (!preg_match("@[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]+,[0-9]+@", $ip_port)) { - $this->ftp_debug("Error : Illegal ip-port format(".$ip_port.")\n"); - return FALSE; - } - - $DATA = explode(",", $ip_port); - $ipaddr = $DATA[0].".".$DATA[1].".".$DATA[2].".".$DATA[3]; - $port = $DATA[4]*256 + $DATA[5]; - $this->ftp_debug("Trying to ".$ipaddr.":".$port." ...\n"); - $data_connection = @fsockopen($ipaddr, $port, $errno, $errstr); - if (!$data_connection) { - $this->ftp_debug("Error : Cannot open data connection to ".$ipaddr.":".$port."\n"); - $this->ftp_debug("Error : ".$errstr." (".$errno.")\n"); - return FALSE; - } - - return $data_connection; - } - - function ftp_debug($message = "") - { - if ($this->debug) { - echo $message; - } - - return TRUE; - } - } -?> +debug = false; + $this->umask = 0022; + $this->timeout = 30; + + if (!defined("FTP_BINARY")) { + define("FTP_BINARY", 1); + } + if (!defined("FTP_ASCII")) { + define("FTP_ASCII", 0); + } + + $this->ftp_resp = ""; + } + + /* Public functions */ + function ftp_connect($server, $port = 21) + { + $this->ftp_debug("Trying to ".$server.":".$port." ...\n"); + $this->ftp_sock = @fsockopen($server, $port, $errno, $errstr, $this->timeout); + + if (!$this->ftp_sock || !$this->ftp_ok()) { + $this->ftp_debug("Error : Cannot connect to remote host \"".$server.":".$port."\"\n"); + $this->ftp_debug("Error : fsockopen() ".$errstr." (".$errno.")\n"); + return FALSE; + } + $this->ftp_debug("Connected to remote host \"".$server.":".$port."\"\n"); + + return TRUE; + } + + function ftp_login($user, $pass) + { + $this->ftp_putcmd("USER", $user); + if (!$this->ftp_ok()) { + $this->ftp_debug("Error : USER command failed\n"); + return FALSE; + } + + $this->ftp_putcmd("PASS", $pass); + if (!$this->ftp_ok()) { + $this->ftp_debug("Error : PASS command failed\n"); + return FALSE; + } + $this->ftp_debug("Authentication succeeded\n"); + + return TRUE; + } + + function ftp_pwd() + { + $this->ftp_putcmd("PWD"); + if (!$this->ftp_ok()) { + $this->ftp_debug("Error : PWD command failed\n"); + return FALSE; + } + + return preg_replace("@^[0-9]{3} \"(.+)\" .+\r\n@", "\\1", $this->ftp_resp); + } + + function ftp_size($pathname) + { + $this->ftp_putcmd("SIZE", $pathname); + if (!$this->ftp_ok()) { + $this->ftp_debug("Error : SIZE command failed\n"); + return -1; + } + + return preg_replace("@^[0-9]{3} ([0-9]+)\r\n@", "\\1", $this->ftp_resp); + } + + function ftp_mdtm($pathname) + { + $this->ftp_putcmd("MDTM", $pathname); + if (!$this->ftp_ok()) { + $this->ftp_debug("Error : MDTM command failed\n"); + return -1; + } + $mdtm = preg_replace("@^[0-9]{3} ([0-9]+)\r\n@", "\\1", $this->ftp_resp); + $date = sscanf($mdtm, "%4d%2d%2d%2d%2d%2d"); + $timestamp = mktime($date[3], $date[4], $date[5], $date[1], $date[2], $date[0]); + + return $timestamp; + } + + function ftp_systype() + { + $this->ftp_putcmd("SYST"); + if (!$this->ftp_ok()) { + $this->ftp_debug("Error : SYST command failed\n"); + return FALSE; + } + $DATA = explode(" ", $this->ftp_resp); + + return $DATA[1]; + } + + function ftp_cdup() + { + $this->ftp_putcmd("CDUP"); + $response = $this->ftp_ok(); + if (!$response) { + $this->ftp_debug("Error : CDUP command failed\n"); + } + return $response; + } + + function ftp_chdir($pathname) + { + $this->ftp_putcmd("CWD", $pathname); + $response = $this->ftp_ok(); + if (!$response) { + $this->ftp_debug("Error : CWD command failed\n"); + } + return $response; + } + + function ftp_delete($pathname) + { + $this->ftp_putcmd("DELE", $pathname); + $response = $this->ftp_ok(); + if (!$response) { + $this->ftp_debug("Error : DELE command failed\n"); + } + return $response; + } + + function ftp_rmdir($pathname) + { + $this->ftp_putcmd("RMD", $pathname); + $response = $this->ftp_ok(); + if (!$response) { + $this->ftp_debug("Error : RMD command failed\n"); + } + return $response; + } + + function ftp_mkdir($pathname) + { + $this->ftp_putcmd("MKD", $pathname); + $response = $this->ftp_ok(); + if (!$response) { + $this->ftp_debug("Error : MKD command failed\n"); + } + return $response; + } + + function ftp_file_exists($pathname) + { + if (!($remote_list = $this->ftp_nlist("-a"))) { + $this->ftp_debug("Error : Cannot get remote file list\n"); + return -1; + } + + reset($remote_list); + while (list(,$value) = each($remote_list)) { + if ($value == $pathname) { + $this->ftp_debug("Remote file ".$pathname." exists\n"); + return 1; + } + } + $this->ftp_debug("Remote file ".$pathname." does not exist\n"); + + return 0; + } + + function ftp_rename($from, $to) + { + $this->ftp_putcmd("RNFR", $from); + if (!$this->ftp_ok()) { + $this->ftp_debug("Error : RNFR command failed\n"); + return FALSE; + } + $this->ftp_putcmd("RNTO", $to); + + $response = $this->ftp_ok(); + if (!$response) { + $this->ftp_debug("Error : RNTO command failed\n"); + } + return $response; + } + + function ftp_nlist($arg = "", $pathname = "") + { + if (!($string = $this->ftp_pasv())) { + return FALSE; + } + + if ($arg == "") { + $nlst = "NLST"; + } else { + $nlst = "NLST ".$arg; + } + $this->ftp_putcmd($nlst, $pathname); + + $sock_data = $this->ftp_open_data_connection($string); + if (!$sock_data || !$this->ftp_ok()) { + $this->ftp_debug("Error : Cannot connect to remote host\n"); + $this->ftp_debug("Error : NLST command failed\n"); + return FALSE; + } + $this->ftp_debug("Connected to remote host\n"); + + $list = array(); + while (!feof($sock_data)) { + $list[] = preg_replace("@[\r\n]@", "", fgets($sock_data, 512)); + } + $this->ftp_close_data_connection($sock_data); + $this->ftp_debug(implode("\n", $list)); + + if (!$this->ftp_ok()) { + $this->ftp_debug("Error : NLST command failed\n"); + return FALSE; + } + + return $list; + } + + function ftp_rawlist($pathname = "") + { + if (!($string = $this->ftp_pasv())) { + return FALSE; + } + + $this->ftp_putcmd("LIST", $pathname); + + $sock_data = $this->ftp_open_data_connection($string); + if (!$sock_data || !$this->ftp_ok()) { + $this->ftp_debug("Error : Cannot connect to remote host\n"); + $this->ftp_debug("Error : LIST command failed\n"); + return FALSE; + } + + $this->ftp_debug("Connected to remote host\n"); + + while (!feof($sock_data)) { + $list[] = preg_replace("@[\r\n]@", "", fgets($sock_data, 512)); + } + $this->ftp_debug(implode("\n", $list)); + $this->ftp_close_data_connection($sock_data); + + if (!$this->ftp_ok()) { + $this->ftp_debug("Error : LIST command failed\n"); + return FALSE; + } + + return $list; + } + + function ftp_get($localfile, $remotefile, $mode = 1) + { + umask($this->umask); + + if (@file_exists($localfile)) { + $this->ftp_debug("Warning : local file will be overwritten\n"); + } + + $fp = @fopen($localfile, "w"); + if (!$fp) { + $this->ftp_debug("Error : Cannot create \"".$localfile."\""); + $this->ftp_debug("Error : GET command failed\n"); + return FALSE; + } + + if (!$this->ftp_type($mode)) { + $this->ftp_debug("Error : GET command failed\n"); + return FALSE; + } + + if (!($string = $this->ftp_pasv())) { + $this->ftp_debug("Error : GET command failed\n"); + return FALSE; + } + + $this->ftp_putcmd("RETR", $remotefile); + + $sock_data = $this->ftp_open_data_connection($string); + if (!$sock_data || !$this->ftp_ok()) { + $this->ftp_debug("Error : Cannot connect to remote host\n"); + $this->ftp_debug("Error : GET command failed\n"); + return FALSE; + } + $this->ftp_debug("Connected to remote host\n"); + $this->ftp_debug("Retrieving remote file \"".$remotefile."\" to local file \"".$localfile."\"\n"); + while (!feof($sock_data)) { + fputs($fp, fread($sock_data, 4096)); + } + fclose($fp); + + $this->ftp_close_data_connection($sock_data); + + $response = $this->ftp_ok(); + if (!$response) { + $this->ftp_debug("Error : GET command failed\n"); + } + return $response; + } + + function ftp_put($remotefile, $localfile, $mode = 1) + { + + if (!@file_exists($localfile)) { + $this->ftp_debug("Error : No such file or directory \"".$localfile."\"\n"); + $this->ftp_debug("Error : PUT command failed\n"); + return FALSE; + } + + $fp = @fopen($localfile, "r"); + if (!$fp) { + $this->ftp_debug("Error : Cannot read file \"".$localfile."\"\n"); + $this->ftp_debug("Error : PUT command failed\n"); + return FALSE; + } + + if (!$this->ftp_type($mode)) { + $this->ftp_debug("Error : PUT command failed\n"); + return FALSE; + } + + if (!($string = $this->ftp_pasv())) { + $this->ftp_debug("Error : PUT command failed\n"); + return FALSE; + } + + $this->ftp_putcmd("STOR", $remotefile); + + $sock_data = $this->ftp_open_data_connection($string); + if (!$sock_data || !$this->ftp_ok()) { + $this->ftp_debug("Error : Cannot connect to remote host\n"); + $this->ftp_debug("Error : PUT command failed\n"); + return FALSE; + } + $this->ftp_debug("Connected to remote host\n"); + $this->ftp_debug("Storing local file \"".$localfile."\" to remote file \"".$remotefile."\"\n"); + while (!feof($fp)) { + fputs($sock_data, fread($fp, 4096)); + } + fclose($fp); + + $this->ftp_close_data_connection($sock_data); + + $response = $this->ftp_ok(); + if (!$response) { + $this->ftp_debug("Error : PUT command failed\n"); + } + return $response; + } + + function ftp_site($command) + { + $this->ftp_putcmd("SITE", $command); + $response = $this->ftp_ok(); + if (!$response) { + $this->ftp_debug("Error : SITE command failed\n"); + } + return $response; + } + + function ftp_quit() + { + $this->ftp_putcmd("QUIT"); + if (!$this->ftp_ok() || !fclose($this->ftp_sock)) { + $this->ftp_debug("Error : QUIT command failed\n"); + return FALSE; + } + $this->ftp_debug("Disconnected from remote host\n"); + return TRUE; + } + + /* Private Functions */ + + function ftp_type($mode) + { + if ($mode) { + $type = "I"; //Binary mode + } else { + $type = "A"; //ASCII mode + } + $this->ftp_putcmd("TYPE", $type); + $response = $this->ftp_ok(); + if (!$response) { + $this->ftp_debug("Error : TYPE command failed\n"); + } + return $response; + } + + function ftp_port($ip_port) + { + $this->ftp_putcmd("PORT", $ip_port); + $response = $this->ftp_ok(); + if (!$response) { + $this->ftp_debug("Error : PORT command failed\n"); + } + return $response; + } + + function ftp_pasv() + { + $this->ftp_putcmd("PASV"); + if (!$this->ftp_ok()) { + $this->ftp_debug("Error : PASV command failed\n"); + return FALSE; + } + + $ip_port = preg_replace("@^.+ \\(?([0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]+,[0-9]+)\\)?.*\r\n$@", "\\1", $this->ftp_resp); + return $ip_port; + } + + function ftp_putcmd($cmd, $arg = "") + { + if ($arg != "") { + $cmd = $cmd." ".$arg; + } + + fputs($this->ftp_sock, $cmd."\r\n"); + $this->ftp_debug("> ".$cmd."\n"); + + return TRUE; + } + + function ftp_ok() + { + $this->ftp_resp = ""; + do { + $res = fgets($this->ftp_sock, 512); + $this->ftp_resp .= $res; + } while (substr($res, 3, 1) != " "); + + $this->ftp_debug(str_replace("\r\n", "\n", $this->ftp_resp)); + + if (!preg_match("@^[123]@", $this->ftp_resp)) { + return FALSE; + } + + return TRUE; + } + + function ftp_close_data_connection($sock) + { + $this->ftp_debug("Disconnected from remote host\n"); + return fclose($sock); + } + + function ftp_open_data_connection($ip_port) + { + if (!preg_match("@[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]+,[0-9]+@", $ip_port)) { + $this->ftp_debug("Error : Illegal ip-port format(".$ip_port.")\n"); + return FALSE; + } + + $DATA = explode(",", $ip_port); + $ipaddr = $DATA[0].".".$DATA[1].".".$DATA[2].".".$DATA[3]; + $port = $DATA[4]*256 + $DATA[5]; + $this->ftp_debug("Trying to ".$ipaddr.":".$port." ...\n"); + $data_connection = @fsockopen($ipaddr, $port, $errno, $errstr); + if (!$data_connection) { + $this->ftp_debug("Error : Cannot open data connection to ".$ipaddr.":".$port."\n"); + $this->ftp_debug("Error : ".$errstr." (".$errno.")\n"); + return FALSE; + } + + return $data_connection; + } + + function ftp_debug($message = "") + { + if ($this->debug) { + echo $message; + } + + return TRUE; + } + } +?> diff --git a/libs/tar.class.php b/libs/tar.class.php index d6d72f4e4..66294278d 100644 --- a/libs/tar.class.php +++ b/libs/tar.class.php @@ -1,558 +1,558 @@ - - -Description: - This class reads and writes Tape-Archive (TAR) Files and Gzip - compressed TAR files, which are mainly used on UNIX systems. - This class works on both windows AND unix systems, and does - NOT rely on external applications!! Woohoo! - -Usage: - Copyright (C) 2002 Josh Barger - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details at: - http://www.gnu.org/copyleft/lesser.html - - If you use this script in your application/website, please - send me an e-mail letting me know about it :) - -Bugs: - Please report any bugs you might find to my e-mail address - at joshb@npt.com. If you have already created a fix/patch - for the bug, please do send it to me so I can incorporate it into my release. - -Version History: - 1.0 04/10/2002 - InitialRelease - - 2.0 04/11/2002 - Merged both tarReader and tarWriter - classes into one - - Added support for gzipped tar files - Remember to name for .tar.gz or .tgz - if you use gzip compression! - :: THIS REQUIRES ZLIB EXTENSION :: - - Added additional comments to - functions to help users - - Added ability to remove files and - directories from archive - 2.1 04/12/2002 - Fixed serious bug in generating tar - - Created another example file - - Added check to make sure ZLIB is - installed before running GZIP - compression on TAR - 2.2 05/07/2002 - Added automatic detection of Gzipped - tar files (Thanks go to J?gen Falch - for the idea) - - Changed "private" functions to have - special function names beginning with - two underscores -======================================================================= -*/ - -class tar { - // Unprocessed Archive Information - var $filename; - var $isGzipped; - var $tar_file; - - // Processed Archive Information - var $files; - var $directories; - var $numFiles; - var $numDirectories; - - - // Class Constructor -- Does nothing... - function tar() { - return true; - } - - - // Computes the unsigned Checksum of a file's header - // to try to ensure valid file - // PRIVATE ACCESS FUNCTION - function __computeUnsignedChecksum($bytestring) { - for($i=0; $i<512; $i++) - $unsigned_chksum += ord($bytestring[$i]); - for($i=0; $i<8; $i++) - $unsigned_chksum -= ord($bytestring[148 + $i]); - $unsigned_chksum += ord(" ") * 8; - - return $unsigned_chksum; - } - - - // Converts a NULL padded string to a non-NULL padded string - // PRIVATE ACCESS FUNCTION - function __parseNullPaddedString($string) { - $position = strpos($string,chr(0)); - return substr($string,0,$position); - } - - - // This function parses the current TAR file - // PRIVATE ACCESS FUNCTION - function __parseTar() { - // Read Files from archive - $tar_length = strlen($this->tar_file); - $main_offset = 0; - while($main_offset < $tar_length) { - // If we read a block of 512 nulls, we are at the end of the archive - if(substr($this->tar_file,$main_offset,512) == str_repeat(chr(0),512)) - break; - - // Parse file name - $file_name = $this->__parseNullPaddedString(substr($this->tar_file,$main_offset,100)); - - // Parse the file mode - $file_mode = substr($this->tar_file,$main_offset + 100,8); - - // Parse the file user ID - $file_uid = octdec(substr($this->tar_file,$main_offset + 108,8)); - - // Parse the file group ID - $file_gid = octdec(substr($this->tar_file,$main_offset + 116,8)); - - // Parse the file size - $file_size = octdec(substr($this->tar_file,$main_offset + 124,12)); - - // Parse the file update time - unix timestamp format - $file_time = octdec(substr($this->tar_file,$main_offset + 136,12)); - - // Parse Checksum - $file_chksum = octdec(substr($this->tar_file,$main_offset + 148,6)); - - // Parse user name - $file_uname = $this->__parseNullPaddedString(substr($this->tar_file,$main_offset + 265,32)); - - // Parse Group name - $file_gname = $this->__parseNullPaddedString(substr($this->tar_file,$main_offset + 297,32)); - - // Make sure our file is valid - if($this->__computeUnsignedChecksum(substr($this->tar_file,$main_offset,512)) != $file_chksum) - return false; - - // Parse File Contents - $file_contents = substr($this->tar_file,$main_offset + 512,$file_size); - - /* ### Unused Header Information ### - $activeFile["typeflag"] = substr($this->tar_file,$main_offset + 156,1); - $activeFile["linkname"] = substr($this->tar_file,$main_offset + 157,100); - $activeFile["magic"] = substr($this->tar_file,$main_offset + 257,6); - $activeFile["version"] = substr($this->tar_file,$main_offset + 263,2); - $activeFile["devmajor"] = substr($this->tar_file,$main_offset + 329,8); - $activeFile["devminor"] = substr($this->tar_file,$main_offset + 337,8); - $activeFile["prefix"] = substr($this->tar_file,$main_offset + 345,155); - $activeFile["endheader"] = substr($this->tar_file,$main_offset + 500,12); - */ - - if($file_size > 0) { - // Increment number of files - $this->numFiles++; - - // Create us a new file in our array - $activeFile = &$this->files[]; - - // Asign Values - $activeFile["name"] = $file_name; - $activeFile["mode"] = $file_mode; - $activeFile["size"] = $file_size; - $activeFile["time"] = $file_time; - $activeFile["user_id"] = $file_uid; - $activeFile["group_id"] = $file_gid; - $activeFile["user_name"] = $file_uname; - $activeFile["group_name"] = $file_gname; - $activeFile["checksum"] = $file_chksum; - $activeFile["file"] = $file_contents; - - } else { - // Increment number of directories - $this->numDirectories++; - - // Create a new directory in our array - $activeDir = &$this->directories[]; - - // Assign values - $activeDir["name"] = $file_name; - $activeDir["mode"] = $file_mode; - $activeDir["time"] = $file_time; - $activeDir["user_id"] = $file_uid; - $activeDir["group_id"] = $file_gid; - $activeDir["user_name"] = $file_uname; - $activeDir["group_name"] = $file_gname; - $activeDir["checksum"] = $file_chksum; - } - - // Move our offset the number of blocks we have processed - $main_offset += 512 + (ceil($file_size / 512) * 512); - } - - return true; - } - - - // Read a non gzipped tar file in for processing - // PRIVATE ACCESS FUNCTION - function __readTar($filename='') { - // Set the filename to load - if(!$filename) - $filename = $this->filename; - - // Read in the TAR file - $fp = fopen($filename,"rb"); - $this->tar_file = fread($fp,filesize($filename)); - fclose($fp); - - if($this->tar_file[0] == chr(31) && $this->tar_file[1] == chr(139) && $this->tar_file[2] == chr(8)) { - if(!function_exists("gzinflate")) - return false; - - $this->isGzipped = TRUE; - - $this->tar_file = gzinflate(substr($this->tar_file,10,-4)); - } - - // Parse the TAR file - $this->__parseTar(); - - return true; - } - - - // Generates a TAR file from the processed data - // PRIVATE ACCESS FUNCTION - function __generateTAR() { - // Clear any data currently in $this->tar_file - unset($this->tar_file); - - // Generate Records for each directory, if we have directories - if($this->numDirectories > 0) { - foreach($this->directories as $key => $information) { - unset($header); - - // Generate tar header for this directory - // Filename, Permissions, UID, GID, size, Time, checksum, typeflag, linkname, magic, version, user name, group name, devmajor, devminor, prefix, end - $header .= str_pad($information["name"],100,chr(0)); - $header .= str_pad(decoct($information["mode"]),7,"0",STR_PAD_LEFT) . chr(0); - $header .= str_pad(decoct($information["user_id"]),7,"0",STR_PAD_LEFT) . chr(0); - $header .= str_pad(decoct($information["group_id"]),7,"0",STR_PAD_LEFT) . chr(0); - $header .= str_pad(decoct(0),11,"0",STR_PAD_LEFT) . chr(0); - $header .= str_pad(decoct($information["time"]),11,"0",STR_PAD_LEFT) . chr(0); - $header .= str_repeat(" ",8); - $header .= "5"; - $header .= str_repeat(chr(0),100); - $header .= str_pad("ustar",6,chr(32)); - $header .= chr(32) . chr(0); - $header .= str_pad("",32,chr(0)); - $header .= str_pad("",32,chr(0)); - $header .= str_repeat(chr(0),8); - $header .= str_repeat(chr(0),8); - $header .= str_repeat(chr(0),155); - $header .= str_repeat(chr(0),12); - - // Compute header checksum - $checksum = str_pad(decoct($this->__computeUnsignedChecksum($header)),6,"0",STR_PAD_LEFT); - for($i=0; $i<6; $i++) { - $header[(148 + $i)] = substr($checksum,$i,1); - } - $header[154] = chr(0); - $header[155] = chr(32); - - // Add new tar formatted data to tar file contents - $this->tar_file .= $header; - } - } - - // Generate Records for each file, if we have files (We should...) - if($this->numFiles > 0) { - foreach($this->files as $key => $information) { - unset($header); - - // Generate the TAR header for this file - // Filename, Permissions, UID, GID, size, Time, checksum, typeflag, linkname, magic, version, user name, group name, devmajor, devminor, prefix, end - $header .= str_pad($information["name"],100,chr(0)); - $header .= str_pad(decoct($information["mode"]),7,"0",STR_PAD_LEFT) . chr(0); - $header .= str_pad(decoct($information["user_id"]),7,"0",STR_PAD_LEFT) . chr(0); - $header .= str_pad(decoct($information["group_id"]),7,"0",STR_PAD_LEFT) . chr(0); - $header .= str_pad(decoct($information["size"]),11,"0",STR_PAD_LEFT) . chr(0); - $header .= str_pad(decoct($information["time"]),11,"0",STR_PAD_LEFT) . chr(0); - $header .= str_repeat(" ",8); - $header .= "0"; - $header .= str_repeat(chr(0),100); - $header .= str_pad("ustar",6,chr(32)); - $header .= chr(32) . chr(0); - $header .= str_pad($information["user_name"],32,chr(0)); // How do I get a file's user name from PHP? - $header .= str_pad($information["group_name"],32,chr(0)); // How do I get a file's group name from PHP? - $header .= str_repeat(chr(0),8); - $header .= str_repeat(chr(0),8); - $header .= str_repeat(chr(0),155); - $header .= str_repeat(chr(0),12); - - // Compute header checksum - $checksum = str_pad(decoct($this->__computeUnsignedChecksum($header)),6,"0",STR_PAD_LEFT); - for($i=0; $i<6; $i++) { - $header[(148 + $i)] = substr($checksum,$i,1); - } - $header[154] = chr(0); - $header[155] = chr(32); - - // Pad file contents to byte count divisible by 512 - $file_contents = str_pad($information["file"],(ceil($information["size"] / 512) * 512),chr(0)); - - // Add new tar formatted data to tar file contents - $this->tar_file .= $header . $file_contents; - } - } - - // Add 512 bytes of NULLs to designate EOF - $this->tar_file .= str_repeat(chr(0),512); - - return true; - } - - - // Open a TAR file - function openTAR($filename) { - // Clear any values from previous tar archives - unset($this->filename); - unset($this->isGzipped); - unset($this->tar_file); - unset($this->files); - unset($this->directories); - unset($this->numFiles); - unset($this->numDirectories); - - // If the tar file doesn't exist... - if(!file_exists($filename)) - return false; - - $this->filename = $filename; - - // Parse this file - $this->__readTar(); - - return true; - } - - - // Appends a tar file to the end of the currently opened tar file - function appendTar($filename) { - // If the tar file doesn't exist... - if(!file_exists($filename)) - return false; - - $this->__readTar($filename); - - return true; - } - - - // Retrieves information about a file in the current tar archive - function getFile($filename) { - if($this->numFiles > 0) { - foreach($this->files as $key => $information) { - if($information["name"] == $filename) - return $information; - } - } - - return false; - } - - - // Retrieves information about a directory in the current tar archive - function getDirectory($dirname) { - if($this->numDirectories > 0) { - foreach($this->directories as $key => $information) { - if($information["name"] == $dirname) - return $information; - } - } - - return false; - } - - - // Check if this tar archive contains a specific file - function containsFile($filename) { - if($this->numFiles > 0) { - foreach($this->files as $key => $information) { - if($information["name"] == $filename) - return true; - } - } - - return false; - } - - - // Check if this tar archive contains a specific directory - function containsDirectory($dirname) { - if($this->numDirectories > 0) { - foreach($this->directories as $key => $information) { - if($information["name"] == $dirname) - return true; - } - } - - return false; - } - - - // Add a directory to this tar archive - function addDirectory($dirname) { - if(!file_exists($dirname)) - return false; - - // Get directory information - $file_information = stat($dirname); - - // Add directory to processed data - $this->numDirectories++; - $activeDir = &$this->directories[]; - $activeDir["name"] = $dirname; - $activeDir["mode"] = $file_information["mode"]; - $activeDir["time"] = $file_information["time"]; - $activeDir["user_id"] = $file_information["uid"]; - $activeDir["group_id"] = $file_information["gid"]; - $activeDir["checksum"] = $checksum; - - return true; - } - - - // Add a file to the tar archive - function addFile($filename,$from=null,$to=null) { - // Make sure the file we are adding exists! - if(!file_exists($filename)) - return false; - - if(filesize($filename)==0) - return false; - - // Make sure there are no other files in the archive that have this same filename - if($this->containsFile($filename)) - return false; - - // Get file information - $file_information = stat($filename); - - // Read in the file's contents - $fp = fopen($filename,"rb"); - $file_contents = fread($fp,filesize($filename)); - fclose($fp); - - if($from && $to){ - $file_contents = str_replace($from,$to,$file_contents); - $file_information["size"] = strlen($file_contents); - } - - // Add file to processed data - $this->numFiles++; - $activeFile = &$this->files[]; - $activeFile["name"] = $filename; - $activeFile["mode"] = $file_information["mode"]; - $activeFile["user_id"] = $file_information["uid"]; - $activeFile["group_id"] = $file_information["gid"]; - $activeFile["size"] = $file_information["size"]; - $activeFile["time"] = $file_information["mtime"]; - $activeFile["checksum"] = $checksum; - $activeFile["user_name"] = ""; - $activeFile["group_name"] = ""; - $activeFile["file"] = $file_contents; - - return true; - } - - - // Remove a file from the tar archive - function removeFile($filename) { - if($this->numFiles > 0) { - foreach($this->files as $key => $information) { - if($information["name"] == $filename) { - $this->numFiles--; - unset($this->files[$key]); - return true; - } - } - } - - return false; - } - - - // Remove a directory from the tar archive - function removeDirectory($dirname) { - if($this->numDirectories > 0) { - foreach($this->directories as $key => $information) { - if($information["name"] == $dirname) { - $this->numDirectories--; - unset($this->directories[$key]); - return true; - } - } - } - - return false; - } - - - // Write the currently loaded tar archive to disk - function saveTar() { - if(!$this->filename) - return false; - - // Write tar to current file using specified gzip compression - $this->toTar($this->filename,$this->isGzipped); - - return true; - } - - - // Saves tar archive to a different file than the current file - function toTar($filename,$useGzip) { - if(!$filename) - return false; - - // Encode processed files into TAR file format - $this->__generateTar(); - - // GZ Compress the data if we need to - if($useGzip) { - // Make sure we have gzip support - if(!function_exists("gzencode")) - return false; - - $file = gzencode($this->tar_file); - } else { - $file = $this->tar_file; - } - - // Write the TAR file - $fp = fopen($filename,"wb"); - fwrite($fp,$file); - fclose($fp); - - return true; - } - - - function toTarStream() { - $this->__generateTar(); - return $this->tar_file; - } -} -?> + + +Description: + This class reads and writes Tape-Archive (TAR) Files and Gzip + compressed TAR files, which are mainly used on UNIX systems. + This class works on both windows AND unix systems, and does + NOT rely on external applications!! Woohoo! + +Usage: + Copyright (C) 2002 Josh Barger + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details at: + http://www.gnu.org/copyleft/lesser.html + + If you use this script in your application/website, please + send me an e-mail letting me know about it :) + +Bugs: + Please report any bugs you might find to my e-mail address + at joshb@npt.com. If you have already created a fix/patch + for the bug, please do send it to me so I can incorporate it into my release. + +Version History: + 1.0 04/10/2002 - InitialRelease + + 2.0 04/11/2002 - Merged both tarReader and tarWriter + classes into one + - Added support for gzipped tar files + Remember to name for .tar.gz or .tgz + if you use gzip compression! + :: THIS REQUIRES ZLIB EXTENSION :: + - Added additional comments to + functions to help users + - Added ability to remove files and + directories from archive + 2.1 04/12/2002 - Fixed serious bug in generating tar + - Created another example file + - Added check to make sure ZLIB is + installed before running GZIP + compression on TAR + 2.2 05/07/2002 - Added automatic detection of Gzipped + tar files (Thanks go to J?gen Falch + for the idea) + - Changed "private" functions to have + special function names beginning with + two underscores +======================================================================= +*/ + +class tar { + // Unprocessed Archive Information + var $filename; + var $isGzipped; + var $tar_file; + + // Processed Archive Information + var $files; + var $directories; + var $numFiles; + var $numDirectories; + + + // Class Constructor -- Does nothing... + function tar() { + return true; + } + + + // Computes the unsigned Checksum of a file's header + // to try to ensure valid file + // PRIVATE ACCESS FUNCTION + function __computeUnsignedChecksum($bytestring) { + for($i=0; $i<512; $i++) + $unsigned_chksum += ord($bytestring[$i]); + for($i=0; $i<8; $i++) + $unsigned_chksum -= ord($bytestring[148 + $i]); + $unsigned_chksum += ord(" ") * 8; + + return $unsigned_chksum; + } + + + // Converts a NULL padded string to a non-NULL padded string + // PRIVATE ACCESS FUNCTION + function __parseNullPaddedString($string) { + $position = strpos($string,chr(0)); + return substr($string,0,$position); + } + + + // This function parses the current TAR file + // PRIVATE ACCESS FUNCTION + function __parseTar() { + // Read Files from archive + $tar_length = strlen($this->tar_file); + $main_offset = 0; + while($main_offset < $tar_length) { + // If we read a block of 512 nulls, we are at the end of the archive + if(substr($this->tar_file,$main_offset,512) == str_repeat(chr(0),512)) + break; + + // Parse file name + $file_name = $this->__parseNullPaddedString(substr($this->tar_file,$main_offset,100)); + + // Parse the file mode + $file_mode = substr($this->tar_file,$main_offset + 100,8); + + // Parse the file user ID + $file_uid = octdec(substr($this->tar_file,$main_offset + 108,8)); + + // Parse the file group ID + $file_gid = octdec(substr($this->tar_file,$main_offset + 116,8)); + + // Parse the file size + $file_size = octdec(substr($this->tar_file,$main_offset + 124,12)); + + // Parse the file update time - unix timestamp format + $file_time = octdec(substr($this->tar_file,$main_offset + 136,12)); + + // Parse Checksum + $file_chksum = octdec(substr($this->tar_file,$main_offset + 148,6)); + + // Parse user name + $file_uname = $this->__parseNullPaddedString(substr($this->tar_file,$main_offset + 265,32)); + + // Parse Group name + $file_gname = $this->__parseNullPaddedString(substr($this->tar_file,$main_offset + 297,32)); + + // Make sure our file is valid + if($this->__computeUnsignedChecksum(substr($this->tar_file,$main_offset,512)) != $file_chksum) + return false; + + // Parse File Contents + $file_contents = substr($this->tar_file,$main_offset + 512,$file_size); + + /* ### Unused Header Information ### + $activeFile["typeflag"] = substr($this->tar_file,$main_offset + 156,1); + $activeFile["linkname"] = substr($this->tar_file,$main_offset + 157,100); + $activeFile["magic"] = substr($this->tar_file,$main_offset + 257,6); + $activeFile["version"] = substr($this->tar_file,$main_offset + 263,2); + $activeFile["devmajor"] = substr($this->tar_file,$main_offset + 329,8); + $activeFile["devminor"] = substr($this->tar_file,$main_offset + 337,8); + $activeFile["prefix"] = substr($this->tar_file,$main_offset + 345,155); + $activeFile["endheader"] = substr($this->tar_file,$main_offset + 500,12); + */ + + if($file_size > 0) { + // Increment number of files + $this->numFiles++; + + // Create us a new file in our array + $activeFile = &$this->files[]; + + // Asign Values + $activeFile["name"] = $file_name; + $activeFile["mode"] = $file_mode; + $activeFile["size"] = $file_size; + $activeFile["time"] = $file_time; + $activeFile["user_id"] = $file_uid; + $activeFile["group_id"] = $file_gid; + $activeFile["user_name"] = $file_uname; + $activeFile["group_name"] = $file_gname; + $activeFile["checksum"] = $file_chksum; + $activeFile["file"] = $file_contents; + + } else { + // Increment number of directories + $this->numDirectories++; + + // Create a new directory in our array + $activeDir = &$this->directories[]; + + // Assign values + $activeDir["name"] = $file_name; + $activeDir["mode"] = $file_mode; + $activeDir["time"] = $file_time; + $activeDir["user_id"] = $file_uid; + $activeDir["group_id"] = $file_gid; + $activeDir["user_name"] = $file_uname; + $activeDir["group_name"] = $file_gname; + $activeDir["checksum"] = $file_chksum; + } + + // Move our offset the number of blocks we have processed + $main_offset += 512 + (ceil($file_size / 512) * 512); + } + + return true; + } + + + // Read a non gzipped tar file in for processing + // PRIVATE ACCESS FUNCTION + function __readTar($filename='') { + // Set the filename to load + if(!$filename) + $filename = $this->filename; + + // Read in the TAR file + $fp = fopen($filename,"rb"); + $this->tar_file = fread($fp,filesize($filename)); + fclose($fp); + + if($this->tar_file[0] == chr(31) && $this->tar_file[1] == chr(139) && $this->tar_file[2] == chr(8)) { + if(!function_exists("gzinflate")) + return false; + + $this->isGzipped = TRUE; + + $this->tar_file = gzinflate(substr($this->tar_file,10,-4)); + } + + // Parse the TAR file + $this->__parseTar(); + + return true; + } + + + // Generates a TAR file from the processed data + // PRIVATE ACCESS FUNCTION + function __generateTAR() { + // Clear any data currently in $this->tar_file + unset($this->tar_file); + + // Generate Records for each directory, if we have directories + if($this->numDirectories > 0) { + foreach($this->directories as $key => $information) { + unset($header); + + // Generate tar header for this directory + // Filename, Permissions, UID, GID, size, Time, checksum, typeflag, linkname, magic, version, user name, group name, devmajor, devminor, prefix, end + $header .= str_pad($information["name"],100,chr(0)); + $header .= str_pad(decoct($information["mode"]),7,"0",STR_PAD_LEFT) . chr(0); + $header .= str_pad(decoct($information["user_id"]),7,"0",STR_PAD_LEFT) . chr(0); + $header .= str_pad(decoct($information["group_id"]),7,"0",STR_PAD_LEFT) . chr(0); + $header .= str_pad(decoct(0),11,"0",STR_PAD_LEFT) . chr(0); + $header .= str_pad(decoct($information["time"]),11,"0",STR_PAD_LEFT) . chr(0); + $header .= str_repeat(" ",8); + $header .= "5"; + $header .= str_repeat(chr(0),100); + $header .= str_pad("ustar",6,chr(32)); + $header .= chr(32) . chr(0); + $header .= str_pad("",32,chr(0)); + $header .= str_pad("",32,chr(0)); + $header .= str_repeat(chr(0),8); + $header .= str_repeat(chr(0),8); + $header .= str_repeat(chr(0),155); + $header .= str_repeat(chr(0),12); + + // Compute header checksum + $checksum = str_pad(decoct($this->__computeUnsignedChecksum($header)),6,"0",STR_PAD_LEFT); + for($i=0; $i<6; $i++) { + $header[(148 + $i)] = substr($checksum,$i,1); + } + $header[154] = chr(0); + $header[155] = chr(32); + + // Add new tar formatted data to tar file contents + $this->tar_file .= $header; + } + } + + // Generate Records for each file, if we have files (We should...) + if($this->numFiles > 0) { + foreach($this->files as $key => $information) { + unset($header); + + // Generate the TAR header for this file + // Filename, Permissions, UID, GID, size, Time, checksum, typeflag, linkname, magic, version, user name, group name, devmajor, devminor, prefix, end + $header .= str_pad($information["name"],100,chr(0)); + $header .= str_pad(decoct($information["mode"]),7,"0",STR_PAD_LEFT) . chr(0); + $header .= str_pad(decoct($information["user_id"]),7,"0",STR_PAD_LEFT) . chr(0); + $header .= str_pad(decoct($information["group_id"]),7,"0",STR_PAD_LEFT) . chr(0); + $header .= str_pad(decoct($information["size"]),11,"0",STR_PAD_LEFT) . chr(0); + $header .= str_pad(decoct($information["time"]),11,"0",STR_PAD_LEFT) . chr(0); + $header .= str_repeat(" ",8); + $header .= "0"; + $header .= str_repeat(chr(0),100); + $header .= str_pad("ustar",6,chr(32)); + $header .= chr(32) . chr(0); + $header .= str_pad($information["user_name"],32,chr(0)); // How do I get a file's user name from PHP? + $header .= str_pad($information["group_name"],32,chr(0)); // How do I get a file's group name from PHP? + $header .= str_repeat(chr(0),8); + $header .= str_repeat(chr(0),8); + $header .= str_repeat(chr(0),155); + $header .= str_repeat(chr(0),12); + + // Compute header checksum + $checksum = str_pad(decoct($this->__computeUnsignedChecksum($header)),6,"0",STR_PAD_LEFT); + for($i=0; $i<6; $i++) { + $header[(148 + $i)] = substr($checksum,$i,1); + } + $header[154] = chr(0); + $header[155] = chr(32); + + // Pad file contents to byte count divisible by 512 + $file_contents = str_pad($information["file"],(ceil($information["size"] / 512) * 512),chr(0)); + + // Add new tar formatted data to tar file contents + $this->tar_file .= $header . $file_contents; + } + } + + // Add 512 bytes of NULLs to designate EOF + $this->tar_file .= str_repeat(chr(0),512); + + return true; + } + + + // Open a TAR file + function openTAR($filename) { + // Clear any values from previous tar archives + unset($this->filename); + unset($this->isGzipped); + unset($this->tar_file); + unset($this->files); + unset($this->directories); + unset($this->numFiles); + unset($this->numDirectories); + + // If the tar file doesn't exist... + if(!file_exists($filename)) + return false; + + $this->filename = $filename; + + // Parse this file + $this->__readTar(); + + return true; + } + + + // Appends a tar file to the end of the currently opened tar file + function appendTar($filename) { + // If the tar file doesn't exist... + if(!file_exists($filename)) + return false; + + $this->__readTar($filename); + + return true; + } + + + // Retrieves information about a file in the current tar archive + function getFile($filename) { + if($this->numFiles > 0) { + foreach($this->files as $key => $information) { + if($information["name"] == $filename) + return $information; + } + } + + return false; + } + + + // Retrieves information about a directory in the current tar archive + function getDirectory($dirname) { + if($this->numDirectories > 0) { + foreach($this->directories as $key => $information) { + if($information["name"] == $dirname) + return $information; + } + } + + return false; + } + + + // Check if this tar archive contains a specific file + function containsFile($filename) { + if($this->numFiles > 0) { + foreach($this->files as $key => $information) { + if($information["name"] == $filename) + return true; + } + } + + return false; + } + + + // Check if this tar archive contains a specific directory + function containsDirectory($dirname) { + if($this->numDirectories > 0) { + foreach($this->directories as $key => $information) { + if($information["name"] == $dirname) + return true; + } + } + + return false; + } + + + // Add a directory to this tar archive + function addDirectory($dirname) { + if(!file_exists($dirname)) + return false; + + // Get directory information + $file_information = stat($dirname); + + // Add directory to processed data + $this->numDirectories++; + $activeDir = &$this->directories[]; + $activeDir["name"] = $dirname; + $activeDir["mode"] = $file_information["mode"]; + $activeDir["time"] = $file_information["time"]; + $activeDir["user_id"] = $file_information["uid"]; + $activeDir["group_id"] = $file_information["gid"]; + $activeDir["checksum"] = $checksum; + + return true; + } + + + // Add a file to the tar archive + function addFile($filename,$from=null,$to=null) { + // Make sure the file we are adding exists! + if(!file_exists($filename)) + return false; + + if(filesize($filename)==0) + return false; + + // Make sure there are no other files in the archive that have this same filename + if($this->containsFile($filename)) + return false; + + // Get file information + $file_information = stat($filename); + + // Read in the file's contents + $fp = fopen($filename,"rb"); + $file_contents = fread($fp,filesize($filename)); + fclose($fp); + + if($from && $to){ + $file_contents = str_replace($from,$to,$file_contents); + $file_information["size"] = strlen($file_contents); + } + + // Add file to processed data + $this->numFiles++; + $activeFile = &$this->files[]; + $activeFile["name"] = $filename; + $activeFile["mode"] = $file_information["mode"]; + $activeFile["user_id"] = $file_information["uid"]; + $activeFile["group_id"] = $file_information["gid"]; + $activeFile["size"] = $file_information["size"]; + $activeFile["time"] = $file_information["mtime"]; + $activeFile["checksum"] = $checksum; + $activeFile["user_name"] = ""; + $activeFile["group_name"] = ""; + $activeFile["file"] = $file_contents; + + return true; + } + + + // Remove a file from the tar archive + function removeFile($filename) { + if($this->numFiles > 0) { + foreach($this->files as $key => $information) { + if($information["name"] == $filename) { + $this->numFiles--; + unset($this->files[$key]); + return true; + } + } + } + + return false; + } + + + // Remove a directory from the tar archive + function removeDirectory($dirname) { + if($this->numDirectories > 0) { + foreach($this->directories as $key => $information) { + if($information["name"] == $dirname) { + $this->numDirectories--; + unset($this->directories[$key]); + return true; + } + } + } + + return false; + } + + + // Write the currently loaded tar archive to disk + function saveTar() { + if(!$this->filename) + return false; + + // Write tar to current file using specified gzip compression + $this->toTar($this->filename,$this->isGzipped); + + return true; + } + + + // Saves tar archive to a different file than the current file + function toTar($filename,$useGzip) { + if(!$filename) + return false; + + // Encode processed files into TAR file format + $this->__generateTar(); + + // GZ Compress the data if we need to + if($useGzip) { + // Make sure we have gzip support + if(!function_exists("gzencode")) + return false; + + $file = gzencode($this->tar_file); + } else { + $file = $this->tar_file; + } + + // Write the TAR file + $fp = fopen($filename,"wb"); + fwrite($fp,$file); + fclose($fp); + + return true; + } + + + function toTarStream() { + $this->__generateTar(); + return $this->tar_file; + } +} +?> diff --git a/m.layouts/default/conf/info.xml b/m.layouts/default/conf/info.xml index 23307bdee..b74d94681 100644 --- a/m.layouts/default/conf/info.xml +++ b/m.layouts/default/conf/info.xml @@ -1,106 +1,106 @@ - - - XE 공식 사이트 모바일 레이아웃 - XE Official Mobile layout - 官方移动版布局 - XE Mobile 官方版面 - XE Resmi Hareketli Yerleşim Düzeni - - XE 공식 모바일 레이아웃입니다. - NHN (developers@xpressengine.com) - - - This layout is the XE Official website layout. - NHN (developers@xpressengine.com) - - - 官方移动版布局。 - NHN (developers@xpressengine.com) - - - XE Mobile 官方網站版面。 - NHN (developers@xpressengine.com) - - - Bu yerleşim düzeni, XE Resmi website yerleşim düzenidir. - NHN (developers@xpressengine.com) - - 0.1 - 2010-08-20 - http://xpressengine.com/ - - - NHN - NHN - NHN - NHN - NHN - - - - 홈페이지 Title - Homepage Title - 网站标题 - 首頁標題 - Anasayfa Başlığı - - - 로고이미지 - ロゴイメージ - LOGO图片 - Logo圖片 - Logo image - Logobildes - Изображения логотипа - Imagen del logotipo - Hình Logo - Logo resmi - 레이아웃의 상단에 표시될 로고이미지를 입력하세요. (세로길이가 28px인 투명 이미지가 가장 어울립니다) - レイアウトの上段に表示されるロゴイメージを入力して下さい。 (縦幅が28pxである透明イメージをお勧めします。。) - 请输入显示在布局顶部的LOGO图片(高度为28px的透明图片为适)。 - 請輸入要顯示在版面上端的 Logo 圖片。(適當高度為 28px 的透明圖片。) - Please input a logo image which will be displayed on the top of layout. (Transparent image with height of 28px is recommended.) - Bitte geben Sie ein Logo das Bild wird auf dem oberen Layout. (Transparent Bild mit einer Höhe von 28px wird empfohlen). - Введите логотип изображение, которое будет отображаться в верхней части формы. (Прозрачный изображение с высотой 28px рекомендуется.) - Ingresar una imagen para logotipo. ( Se recomienda una imagen de fondo transparente con una altura de 28px. - Hãy chọn Logo hiển thị phía trên cùng của giao diện. (Đề nghị: Hình ảnh có nền trong suốt và kích thước 28px.) - Lütfen yerleşim düzeninin üst kısmında gösterilecek bir logo resmi giriniz. (Önerilen resim 28px uzunluğunda, transparan ayarda bir resimdir.) - - - 홈 페이지 URL - ホームページURL - 主页地址 - 主頁網址 - Homepage URL - Homepage URL - Домашняя страница URL - URL de la página web - URL Trang chủ - Anasayfa URLsi - 로고를 클릭시에 이동할 홈 페이지 URL을 입력해 주세요. - ロゴをクリックした時に移動するホームページのURLを入力して下さい。 - 点击网站LOGO时要移动的页面URL。 - 請輸入當用戶按了網站 Logo 後,要前往的頁面網址。 - Please input the URL to redirect when user clicks the logo - 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 - Lütfen kullanıcıların logoya tıkladıklarında yönlendirilecekleri bir URL giriniz - - - - - 상단 메뉴 - 上段用メニュー - 主菜单 - 主選單 - Top menu - Top Menü - Верхнее меню - Menú Principal - Ana Menü - Menu trên - - - + + + XE 공식 사이트 모바일 레이아웃 + XE Official Mobile layout + 官方移动版布局 + XE Mobile 官方版面 + XE Resmi Hareketli Yerleşim Düzeni + + XE 공식 모바일 레이아웃입니다. + NHN (developers@xpressengine.com) + + + This layout is the XE Official website layout. + NHN (developers@xpressengine.com) + + + 官方移动版布局。 + NHN (developers@xpressengine.com) + + + XE Mobile 官方網站版面。 + NHN (developers@xpressengine.com) + + + Bu yerleşim düzeni, XE Resmi website yerleşim düzenidir. + NHN (developers@xpressengine.com) + + 0.1 + 2010-08-20 + http://xpressengine.com/ + + + NHN + NHN + NHN + NHN + NHN + + + + 홈페이지 Title + Homepage Title + 网站标题 + 首頁標題 + Anasayfa Başlığı + + + 로고이미지 + ロゴイメージ + LOGO图片 + Logo圖片 + Logo image + Logobildes + Изображения логотипа + Imagen del logotipo + Hình Logo + Logo resmi + 레이아웃의 상단에 표시될 로고이미지를 입력하세요. (세로길이가 28px인 투명 이미지가 가장 어울립니다) + レイアウトの上段に表示されるロゴイメージを入力して下さい。 (縦幅が28pxである透明イメージをお勧めします。。) + 请输入显示在布局顶部的LOGO图片(高度为28px的透明图片为适)。 + 請輸入要顯示在版面上端的 Logo 圖片。(適當高度為 28px 的透明圖片。) + Please input a logo image which will be displayed on the top of layout. (Transparent image with height of 28px is recommended.) + Bitte geben Sie ein Logo das Bild wird auf dem oberen Layout. (Transparent Bild mit einer Höhe von 28px wird empfohlen). + Введите логотип изображение, которое будет отображаться в верхней части формы. (Прозрачный изображение с высотой 28px рекомендуется.) + Ingresar una imagen para logotipo. ( Se recomienda una imagen de fondo transparente con una altura de 28px. + Hãy chọn Logo hiển thị phía trên cùng của giao diện. (Đề nghị: Hình ảnh có nền trong suốt và kích thước 28px.) + Lütfen yerleşim düzeninin üst kısmında gösterilecek bir logo resmi giriniz. (Önerilen resim 28px uzunluğunda, transparan ayarda bir resimdir.) + + + 홈 페이지 URL + ホームページURL + 主页地址 + 主頁網址 + Homepage URL + Homepage URL + Домашняя страница URL + URL de la página web + URL Trang chủ + Anasayfa URLsi + 로고를 클릭시에 이동할 홈 페이지 URL을 입력해 주세요. + ロゴをクリックした時に移動するホームページのURLを入力して下さい。 + 点击网站LOGO时要移动的页面URL。 + 請輸入當用戶按了網站 Logo 後,要前往的頁面網址。 + Please input the URL to redirect when user clicks the logo + 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 + Lütfen kullanıcıların logoya tıkladıklarında yönlendirilecekleri bir URL giriniz + + + + + 상단 메뉴 + 上段用メニュー + 主菜单 + 主選單 + Top menu + Top Menü + Верхнее меню + Menú Principal + Ana Menü + Menu trên + + + diff --git a/m.layouts/default/layout.html b/m.layouts/default/layout.html index 2aa191d97..799ec13f0 100644 --- a/m.layouts/default/layout.html +++ b/m.layouts/default/layout.html @@ -1,28 +1,28 @@ - -
- -

{$layout_info->index_title}

- -

{$layout_info->index_title}

- -

Mobile XE

- - - -
- - - - -
-{$content} - -

{$layout_info->index_title}

+ +
+ +

{$layout_info->index_title}

+ +

{$layout_info->index_title}

+ +

Mobile XE

+ + + +
+ + + + +
+{$content} + +

{$layout_info->index_title}

diff --git a/m.layouts/default/mx.css b/m.layouts/default/mx.css index 385b5d9b5..63f7692a9 100644 --- a/m.layouts/default/mx.css +++ b/m.layouts/default/mx.css @@ -1,24 +1,24 @@ -@charset "utf-8"; -/* Mobile XE (/m.layouts/default/) */ -body{margin:0;background:#fff;color:#000;word-wrap:break-word} -body,input,textarea,select,button,table{font-family:Tahoma,Geneva,sans-serif} -/* Common */ -.fl{float:left} -.fr{float:right} -/* Header */ -.hd{min-height:28px;line-height:28px;padding:6px;margin:0 0 1px 0;border-bottom:2px solid #8d7de1;background:#444 -webkit-gradient(linear,0% 0%,0% 100%,from(#434343),to(#0d0d0d));background:#444 -moz-linear-gradient(top,#434343,#0d0d0d);background-color:#444;*zoom:1} -.hd:after{content:"";margin:0 -6px;position:relative;top:9px;display:block;clear:both;height:1px;background:#6352d2} -.hd .h1{float:left;display:inline;color:#fff;font-size:24px;margin:0;font-weight:bold} -.hd .h1 a{color:#fff} -.hd .h1 img{border:0} -.hd .mu{display:inline-block;height:26px;line-height:26px;padding:0 10px;font-size:12px;font-weight:bold;color:#fff;text-decoration:none;box-shadow:0 0 1px #000;-webkit-box-shadow:0 0 1px #000;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;background:#1b1b1b -webkit-gradient(linear,0% 0%,0% 100%,from(#777),to(#373737),color-stop(0.5,#323232),color-stop(0.5,#1b1b1b));background:#1b1b1b -moz-linear-gradient(top,#777,#373737);background-color:#1b1b1b} -.hd .mu:after{content:"›";margin:0 0 0 3px;font-size:24px;vertical-align:middle;position:relative;top:-2px} -.hd .muon{cursor:pointer;display:inline-block;height:26px;line-height:26px;padding:0 10px;font-size:12px;font-weight:bold;color:#fff;text-decoration:none;box-shadow:0 0 1px #000;-webkit-box-shadow:0 0 1px #000;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;background:#1b1b1b -webkit-gradient(linear,0% 0%,0% 100%,from(#777),to(#373737),color-stop(0.5,#323232),color-stop(0.5,#1b1b1b));background:#1b1b1b -moz-linear-gradient(top,#777,#373737);background-color:#1b1b1b} -.hd .muon:before{content:"‹";font-weight:bold;font-size:16px;line-height:16px;margin:0 2px 0 0;font-family:Verdana, Geneva, sans-serif} -/* Footer */ -.ft{padding:0;margin:0;list-style:none;background:#868686;overflow:hidden;zoom:1} -.ft:after{content:"";display:block;clear:both} -.ft li{margin:0;padding:0;border:1px solid #9c9a99;border-top:0;border-bottom:0;margin:0 -1px;background:#868686} -.ft a{display:inline-block;padding:0 15px;color:#fff;text-shadow:0 0 2px #000;font-size:12px;font-weight:bold;line-height:32px;text-decoration:none} -/* Copyright */ +@charset "utf-8"; +/* Mobile XE (/m.layouts/default/) */ +body{margin:0;background:#fff;color:#000;word-wrap:break-word} +body,input,textarea,select,button,table{font-family:Tahoma,Geneva,sans-serif} +/* Common */ +.fl{float:left} +.fr{float:right} +/* Header */ +.hd{min-height:28px;line-height:28px;padding:6px;margin:0 0 1px 0;border-bottom:2px solid #8d7de1;background:#444 -webkit-gradient(linear,0% 0%,0% 100%,from(#434343),to(#0d0d0d));background:#444 -moz-linear-gradient(top,#434343,#0d0d0d);background-color:#444;*zoom:1} +.hd:after{content:"";margin:0 -6px;position:relative;top:9px;display:block;clear:both;height:1px;background:#6352d2} +.hd .h1{float:left;display:inline;color:#fff;font-size:24px;margin:0;font-weight:bold} +.hd .h1 a{color:#fff} +.hd .h1 img{border:0} +.hd .mu{display:inline-block;height:26px;line-height:26px;padding:0 10px;font-size:12px;font-weight:bold;color:#fff;text-decoration:none;box-shadow:0 0 1px #000;-webkit-box-shadow:0 0 1px #000;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;background:#1b1b1b -webkit-gradient(linear,0% 0%,0% 100%,from(#777),to(#373737),color-stop(0.5,#323232),color-stop(0.5,#1b1b1b));background:#1b1b1b -moz-linear-gradient(top,#777,#373737);background-color:#1b1b1b} +.hd .mu:after{content:"›";margin:0 0 0 3px;font-size:24px;vertical-align:middle;position:relative;top:-2px} +.hd .muon{cursor:pointer;display:inline-block;height:26px;line-height:26px;padding:0 10px;font-size:12px;font-weight:bold;color:#fff;text-decoration:none;box-shadow:0 0 1px #000;-webkit-box-shadow:0 0 1px #000;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;background:#1b1b1b -webkit-gradient(linear,0% 0%,0% 100%,from(#777),to(#373737),color-stop(0.5,#323232),color-stop(0.5,#1b1b1b));background:#1b1b1b -moz-linear-gradient(top,#777,#373737);background-color:#1b1b1b} +.hd .muon:before{content:"‹";font-weight:bold;font-size:16px;line-height:16px;margin:0 2px 0 0;font-family:Verdana, Geneva, sans-serif} +/* Footer */ +.ft{padding:0;margin:0;list-style:none;background:#868686;overflow:hidden;zoom:1} +.ft:after{content:"";display:block;clear:both} +.ft li{margin:0;padding:0;border:1px solid #9c9a99;border-top:0;border-bottom:0;margin:0 -1px;background:#868686} +.ft a{display:inline-block;padding:0 15px;color:#fff;text-shadow:0 0 2px #000;font-size:12px;font-weight:bold;line-height:32px;text-decoration:none} +/* Copyright */ .cr{margin:0;text-align:center;background:#f2f0ec;color:#494949;font-size:11px;line-height:26px} \ No newline at end of file diff --git a/m.layouts/simpleGray/conf/info.xml b/m.layouts/simpleGray/conf/info.xml index da471b91d..cb36d938f 100644 --- a/m.layouts/simpleGray/conf/info.xml +++ b/m.layouts/simpleGray/conf/info.xml @@ -1,89 +1,89 @@ - - - XE 심플 그레이 레이아웃 - XE simple gray layout - 官方移动版布局 - XE Mobile 官方版面 - XE basit gri yerleşim düzeni - - XE 심플 그레이 레이아웃입니다. - 디자인, 퍼블리싱 : 정찬명 - 레이아웃 제작 : haneul - - - This layout is the XE Official website layout. - Design, HTML/CSS : Chan-Myung Jeong - Layout producer : haneul - - - 官方移动版布局。 - Design, HTML/CSS : Chan-Myung Jeong - Layout producer : haneul - - - 官方移动版布局。 - Design, HTML/CSS : Chan-Myung Jeong - Layout producer : haneul - - - XE Mobile 官方網站版面。 - Design, HTML/CSS : Chan-Myung Jeong - Layout producer : haneul - - 0.1 - 2010-06-10 - http://xpressengine.com - - - NHN - NHN - NHN - NHN - NHN - - - - 홈페이지 Title - Homepage Title - 网站标题 - 首頁標題 - Anasayfa URLsi - - - 홈 페이지 URL - ホームページURL - 主页地址 - 主頁網址 - Homepage URL - Homepage URL - Домашняя страница URL - URL de la página web - URL Trang chủ - Anasayfa URLsi - 로고를 클릭시에 이동할 홈 페이지 URL을 입력해 주세요. - ロゴをクリックした時に移動するホームページのURLを入力して下さい。 - 点击网站LOGO时要移动的页面URL。 - 請輸入當用戶按了網站 Logo 後,要前往的頁面網址。 - Please input the URL to redirect when user clicks the logo - 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 - Lütfen kullanıcıların logoya tıkladıklarında yönlendirilecekleri URL adresini giriniz - - - - - 상단 메뉴 - 上段用メニュー - 主菜单 - 主選單 - Top menu - Top Menü - Верхнее меню - Menú Principal - Ana Menü - Menu trên - - - + + + XE 심플 그레이 레이아웃 + XE simple gray layout + 官方移动版布局 + XE Mobile 官方版面 + XE basit gri yerleşim düzeni + + XE 심플 그레이 레이아웃입니다. + 디자인, 퍼블리싱 : 정찬명 + 레이아웃 제작 : haneul + + + This layout is the XE Official website layout. + Design, HTML/CSS : Chan-Myung Jeong + Layout producer : haneul + + + 官方移动版布局。 + Design, HTML/CSS : Chan-Myung Jeong + Layout producer : haneul + + + 官方移动版布局。 + Design, HTML/CSS : Chan-Myung Jeong + Layout producer : haneul + + + XE Mobile 官方網站版面。 + Design, HTML/CSS : Chan-Myung Jeong + Layout producer : haneul + + 0.1 + 2010-06-10 + http://xpressengine.com + + + NHN + NHN + NHN + NHN + NHN + + + + 홈페이지 Title + Homepage Title + 网站标题 + 首頁標題 + Anasayfa URLsi + + + 홈 페이지 URL + ホームページURL + 主页地址 + 主頁網址 + Homepage URL + Homepage URL + Домашняя страница URL + URL de la página web + URL Trang chủ + Anasayfa URLsi + 로고를 클릭시에 이동할 홈 페이지 URL을 입력해 주세요. + ロゴをクリックした時に移動するホームページのURLを入力して下さい。 + 点击网站LOGO时要移动的页面URL。 + 請輸入當用戶按了網站 Logo 後,要前往的頁面網址。 + Please input the URL to redirect when user clicks the logo + 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 + Lütfen kullanıcıların logoya tıkladıklarında yönlendirilecekleri URL adresini giriniz + + + + + 상단 메뉴 + 上段用メニュー + 主菜单 + 主選單 + Top menu + Top Menü + Верхнее меню + Menú Principal + Ana Menü + Menu trên + + + diff --git a/m.layouts/simpleGray/layout.html b/m.layouts/simpleGray/layout.html index 33828c342..a375244a4 100644 --- a/m.layouts/simpleGray/layout.html +++ b/m.layouts/simpleGray/layout.html @@ -1,18 +1,18 @@ - - -{$content} - -

{$layout_info->index_title}

+ + +{$content} + +

{$layout_info->index_title}

diff --git a/m.layouts/simpleGray/mx.css b/m.layouts/simpleGray/mx.css index 188b12fe7..e4bd8fa4e 100644 --- a/m.layouts/simpleGray/mx.css +++ b/m.layouts/simpleGray/mx.css @@ -1,36 +1,36 @@ -@charset "utf-8"; -/* Mobile XE */ -body{margin:0;background:#fff;color:#000;word-wrap:break-word} -body,input,textarea,select,button,table{font-family:Tahoma, Geneva, sans-serif} -/* Common Class */ -.fl{float:left} -.fr{float:right} -.cb{clear:both} -/* Edge = Header/Footer */ -.eg{position:relative;background:#666;*zoom:1} -.eg:after{content:"";display:block;clear:both} -.eg a{text-decoration:none} -/* Header */ -.hd{padding:10px;border-top:3px solid #444} -.hd .h1{float:left;display:inline;color:#fff;font-size:24px;margin:0;font-weight:bold;text-shadow:0 0 3px #000} -.hd .h1 a{color:#fff} -.hd .bn{font-size:12px} -/* Footer */ -.ft{padding:0 5px;margin:0;list-style:none} -.ft a{display:inline-block;padding:10px;color:#fff;text-shadow:0 0 2px #000;font-size:14px;font-weight:bold} -/* Copyright */ -.cr{margin:0;padding:5px 15px;text-align:center;background:#444;color:#ccc;text-shadow:0 0 2px #000;font-size:12px;font-weight:bold} -/* Search */ -.sh{position:relative;text-align:center} -.sh .itx{width:80%;background:none;border:5px solid #333;margin:10px} -/* Definition */ -.dl{margin:10px} -.dl dt{margin:0;padding:0;font-weight:bold} -.dl dd{margin:0 0 10px 0;padding:0;color:#666} -/* Graph Horizontal */ -.gh{list-style:none;margin:10px;padding:0} -.gh li{position:relative;margin:5px 0} -.gh .bar{position:absolute;z-index:-1;height:100%;width:0;background:#ddd} -.gh em{color:#f60} -/* Button */ -.bn{display:inline-block;padding:5px 10px;font-weight:normal;font-size:14px;border:1px solid #333;background:#eee;color:#000;text-shadow:1px 1px 0 #fff;box-shadow:0 0 3px #333;-moz-box-shadow:0 0 3px #333;-webkit-box-shadow:0 0 3px #333;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;text-decoration:none} +@charset "utf-8"; +/* Mobile XE */ +body{margin:0;background:#fff;color:#000;word-wrap:break-word} +body,input,textarea,select,button,table{font-family:Tahoma, Geneva, sans-serif} +/* Common Class */ +.fl{float:left} +.fr{float:right} +.cb{clear:both} +/* Edge = Header/Footer */ +.eg{position:relative;background:#666;*zoom:1} +.eg:after{content:"";display:block;clear:both} +.eg a{text-decoration:none} +/* Header */ +.hd{padding:10px;border-top:3px solid #444} +.hd .h1{float:left;display:inline;color:#fff;font-size:24px;margin:0;font-weight:bold;text-shadow:0 0 3px #000} +.hd .h1 a{color:#fff} +.hd .bn{font-size:12px} +/* Footer */ +.ft{padding:0 5px;margin:0;list-style:none} +.ft a{display:inline-block;padding:10px;color:#fff;text-shadow:0 0 2px #000;font-size:14px;font-weight:bold} +/* Copyright */ +.cr{margin:0;padding:5px 15px;text-align:center;background:#444;color:#ccc;text-shadow:0 0 2px #000;font-size:12px;font-weight:bold} +/* Search */ +.sh{position:relative;text-align:center} +.sh .itx{width:80%;background:none;border:5px solid #333;margin:10px} +/* Definition */ +.dl{margin:10px} +.dl dt{margin:0;padding:0;font-weight:bold} +.dl dd{margin:0 0 10px 0;padding:0;color:#666} +/* Graph Horizontal */ +.gh{list-style:none;margin:10px;padding:0} +.gh li{position:relative;margin:5px 0} +.gh .bar{position:absolute;z-index:-1;height:100%;width:0;background:#ddd} +.gh em{color:#f60} +/* Button */ +.bn{display:inline-block;padding:5px 10px;font-weight:normal;font-size:14px;border:1px solid #333;background:#eee;color:#000;text-shadow:1px 1px 0 #fff;box-shadow:0 0 3px #333;-moz-box-shadow:0 0 3px #333;-webkit-box-shadow:0 0 3px #333;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;text-decoration:none} diff --git a/modules/addon/addon.admin.controller.php b/modules/addon/addon.admin.controller.php index 49267b4dc..93934cc04 100644 --- a/modules/addon/addon.admin.controller.php +++ b/modules/addon/addon.admin.controller.php @@ -1,102 +1,102 @@ -isActivatedAddon($addon, $site_module_info->site_srl, $type)) $this->doDeactivate($addon, $site_module_info->site_srl, $type); - - // 비활성화 되어 있으면 활성화 시킴 - else $this->doActivate($addon, $site_module_info->site_srl, $type); - } - - $this->makeCacheFile($site_module_info->site_srl, $type); - } - - /** - * @brief 애드온 설정 정보 입력 - **/ - function procAddonAdminSetupAddon() { - $args = Context::getRequestVars(); - $addon_name = $args->addon_name; - unset($args->module); - unset($args->act); - unset($args->addon_name); - unset($args->body); - - $site_module_info = Context::get('site_module_info'); - - $this->doSetup($addon_name, $args, $site_module_info->site_srl); - - $this->makeCacheFile($site_module_info->site_srl, "pc"); - $this->makeCacheFile($site_module_info->site_srl, "mobile"); - } - - - - /** - * @brief 애드온 추가 - * DB에 애드온을 추가함 - **/ - function doInsert($addon, $site_srl = 0) { - $args->addon = $addon; - $args->is_used = 'N'; - if(!$site_srl) return executeQuery('addon.insertAddon', $args); - $args->site_srl = $site_srl; - return executeQuery('addon.insertSiteAddon', $args); - } - - /** - * @brief 애드온 활성화 - * addons라는 테이블에 애드온의 활성화 상태를 on 시켜줌 - **/ - function doActivate($addon, $site_srl = 0, $type = "pc") { - $args->addon = $addon; - if($type == "pc") $args->is_used = 'Y'; - else $args->is_used_m = "Y"; - if(!$site_srl) return executeQuery('addon.updateAddon', $args); - $args->site_srl = $site_srl; - return executeQuery('addon.updateSiteAddon', $args); - } - - /** - * @brief 애드온 비활성화 - * - * addons라는 테이블에 애드온의 이름을 제거하는 것으로 비활성화를 시키게 된다 - **/ - function doDeactivate($addon, $site_srl = 0, $type = "pc") { - $args->addon = $addon; - if($type == "pc") $args->is_used = 'N'; - else $args->is_used_m = 'N'; - if(!$site_srl) return executeQuery('addon.updateAddon', $args); - $args->site_srl = $site_srl; - return executeQuery('addon.updateSiteAddon', $args); - } - - - } -?> +isActivatedAddon($addon, $site_module_info->site_srl, $type)) $this->doDeactivate($addon, $site_module_info->site_srl, $type); + + // 비활성화 되어 있으면 활성화 시킴 + else $this->doActivate($addon, $site_module_info->site_srl, $type); + } + + $this->makeCacheFile($site_module_info->site_srl, $type); + } + + /** + * @brief 애드온 설정 정보 입력 + **/ + function procAddonAdminSetupAddon() { + $args = Context::getRequestVars(); + $addon_name = $args->addon_name; + unset($args->module); + unset($args->act); + unset($args->addon_name); + unset($args->body); + + $site_module_info = Context::get('site_module_info'); + + $this->doSetup($addon_name, $args, $site_module_info->site_srl); + + $this->makeCacheFile($site_module_info->site_srl, "pc"); + $this->makeCacheFile($site_module_info->site_srl, "mobile"); + } + + + + /** + * @brief 애드온 추가 + * DB에 애드온을 추가함 + **/ + function doInsert($addon, $site_srl = 0) { + $args->addon = $addon; + $args->is_used = 'N'; + if(!$site_srl) return executeQuery('addon.insertAddon', $args); + $args->site_srl = $site_srl; + return executeQuery('addon.insertSiteAddon', $args); + } + + /** + * @brief 애드온 활성화 + * addons라는 테이블에 애드온의 활성화 상태를 on 시켜줌 + **/ + function doActivate($addon, $site_srl = 0, $type = "pc") { + $args->addon = $addon; + if($type == "pc") $args->is_used = 'Y'; + else $args->is_used_m = "Y"; + if(!$site_srl) return executeQuery('addon.updateAddon', $args); + $args->site_srl = $site_srl; + return executeQuery('addon.updateSiteAddon', $args); + } + + /** + * @brief 애드온 비활성화 + * + * addons라는 테이블에 애드온의 이름을 제거하는 것으로 비활성화를 시키게 된다 + **/ + function doDeactivate($addon, $site_srl = 0, $type = "pc") { + $args->addon = $addon; + if($type == "pc") $args->is_used = 'N'; + else $args->is_used_m = 'N'; + if(!$site_srl) return executeQuery('addon.updateAddon', $args); + $args->site_srl = $site_srl; + return executeQuery('addon.updateSiteAddon', $args); + } + + + } +?> diff --git a/modules/addon/addon.admin.model.php b/modules/addon/addon.admin.model.php index b6efdaa01..23c9125ac 100644 --- a/modules/addon/addon.admin.model.php +++ b/modules/addon/addon.admin.model.php @@ -1,313 +1,313 @@ -getInsertedAddons($site_srl); - - // 다운받은 애드온과 설치된 애드온의 목록을 구함 - $searched_list = FileHandler::readDir('./addons'); - $searched_count = count($searched_list); - if(!$searched_count) return; - sort($searched_list); - - for($i=0;$i<$searched_count;$i++) { - // 애드온의 이름 - $addon_name = $searched_list[$i]; - if($addon_name == "smartphone") continue; - - // 애드온의 경로 (files/addons가 우선) - $path = $this->getAddonPath($addon_name); - - // 해당 애드온의 정보를 구함 - unset($info); - $info = $this->getAddonInfoXml($addon_name, $site_srl); - - $info->addon = $addon_name; - $info->path = $path; - $info->activated = false; - $info->mactivated = false; - - // DB에 입력되어 있는지 확인 - if(!in_array($addon_name, array_keys($inserted_addons))) { - // DB에 입력되어 있지 않으면 입력 (model에서 이런짓 하는거 싫지만 귀찮아서.. ㅡ.ㅜ) - $oAddonAdminController = &getAdminController('addon'); - $oAddonAdminController->doInsert($addon_name, $site_srl); - - // 활성화 되어 있는지 확인 - } else { - if($inserted_addons[$addon_name]->is_used=='Y') $info->activated = true; - if($inserted_addons[$addon_name]->is_used_m=='Y') $info->mactivated = true; - } - - $list[] = $info; - } - return $list; - } - - /** - * @brief 모듈의 conf/info.xml 을 읽어서 정보를 구함 - **/ - function getAddonInfoXml($addon, $site_srl = 0) { - // 요청된 모듈의 경로를 구한다. 없으면 return - $addon_path = $this->getAddonPath($addon); - if(!$addon_path) return; - - // 현재 선택된 모듈의 스킨의 정보 xml 파일을 읽음 - $xml_file = sprintf("%sconf/info.xml", $addon_path); - if(!file_exists($xml_file)) return; - - $oXmlParser = new XmlParser(); - $tmp_xml_obj = $oXmlParser->loadXmlFile($xml_file); - $xml_obj = $tmp_xml_obj->addon; - - if(!$xml_obj) return; - - - // DB에 설정된 내역을 가져온다 - $db_args->addon = $addon; - if(!$site_srl) $output = executeQuery('addon.getAddonInfo',$db_args); - else { - $db_args->site_srl = $site_srl; - $output = executeQuery('addon.getSiteAddonInfo',$db_args); - } - $extra_vals = unserialize($output->data->extra_vars); - - if($extra_vals->mid_list) { - $addon_info->mid_list = $extra_vals->mid_list; - } else { - $addon_info->mid_list = array(); - } - - - // 애드온 정보 - if($xml_obj->version && $xml_obj->attrs->version == '0.2') { - // addon format v0.2 - sscanf($xml_obj->date->body, '%d-%d-%d', $date_obj->y, $date_obj->m, $date_obj->d); - $addon_info->date = sprintf('%04d%02d%02d', $date_obj->y, $date_obj->m, $date_obj->d); - - $addon_info->addon_name = $addon; - $addon_info->title = $xml_obj->title->body; - $addon_info->description = trim($xml_obj->description->body); - $addon_info->version = $xml_obj->version->body; - $addon_info->homepage = $xml_obj->link->body; - $addon_info->license = $xml_obj->license->body; - $addon_info->license_link = $xml_obj->license->attrs->link; - - if(!is_array($xml_obj->author)) $author_list[] = $xml_obj->author; - else $author_list = $xml_obj->author; - - foreach($author_list as $author) { - unset($author_obj); - $author_obj->name = $author->name->body; - $author_obj->email_address = $author->attrs->email_address; - $author_obj->homepage = $author->attrs->link; - $addon_info->author[] = $author_obj; - } - - // 확장변수를 정리 - if($xml_obj->extra_vars) { - $extra_var_groups = $xml_obj->extra_vars->group; - if(!$extra_var_groups) $extra_var_groups = $xml_obj->extra_vars; - if(!is_array($extra_var_groups)) $extra_var_groups = array($extra_var_groups); - - foreach($extra_var_groups as $group) { - $extra_vars = $group->var; - if(!is_array($group->var)) $extra_vars = array($group->var); - - foreach($extra_vars as $key => $val) { - unset($obj); - if(!$val->attrs->type) { $val->attrs->type = 'text'; } - - $obj->group = $group->title->body; - $obj->name = $val->attrs->name; - $obj->title = $val->title->body; - $obj->type = $val->attrs->type; - $obj->description = $val->description->body; - $obj->value = $extra_vals->{$obj->name}; - if(strpos($obj->value, '|@|') != false) { $obj->value = explode('|@|', $obj->value); } - if($obj->type == 'mid_list' && !is_array($obj->value)) { $obj->value = array($obj->value); } - - // 'select'type에서 option목록을 구한다. - if(is_array($val->options)) { - $option_count = count($val->options); - - for($i = 0; $i < $option_count; $i++) { - $obj->options[$i]->title = $val->options[$i]->title->body; - $obj->options[$i]->value = $val->options[$i]->attrs->value; - } - } else { - $obj->options[0]->title = $val->options[0]->title->body; - $obj->options[0]->value = $val->options[0]->attrs->value; - } - - $addon_info->extra_vars[] = $obj; - } - } - } - - // history - if($xml_obj->history) { - if(!is_array($xml_obj->history)) $history[] = $xml_obj->history; - else $history = $xml_obj->history; - - foreach($history as $item) { - unset($obj); - - if($item->author) { - (!is_array($item->author)) ? $obj->author_list[] = $item->author : $obj->author_list = $item->author; - - foreach($obj->author_list as $author) { - unset($author_obj); - $author_obj->name = $author->name->body; - $author_obj->email_address = $author->attrs->email_address; - $author_obj->homepage = $author->attrs->link; - $obj->author[] = $author_obj; - } - } - - $obj->name = $item->name->body; - $obj->email_address = $item->attrs->email_address; - $obj->homepage = $item->attrs->link; - $obj->version = $item->attrs->version; - $obj->date = $item->attrs->date; - $obj->description = $item->description->body; - - if($item->log) { - (!is_array($item->log)) ? $obj->log[] = $item->log : $obj->log = $item->log; - - foreach($obj->log as $log) { - unset($log_obj); - $log_obj->text = $log->body; - $log_obj->link = $log->attrs->link; - $obj->logs[] = $log_obj; - } - } - - $addon_info->history[] = $obj; - } - } - - - } else { - // addon format 0.1 - $addon_info->addon_name = $addon; - $addon_info->title = $xml_obj->title->body; - $addon_info->description = trim($xml_obj->author->description->body); - $addon_info->version = $xml_obj->attrs->version; - sscanf($xml_obj->author->attrs->date, '%d. %d. %d', $date_obj->y, $date_obj->m, $date_obj->d); - $addon_info->date = sprintf('%04d%02d%02d', $date_obj->y, $date_obj->m, $date_obj->d); - $author_obj->name = $xml_obj->author->name->body; - $author_obj->email_address = $xml_obj->author->attrs->email_address; - $author_obj->homepage = $xml_obj->author->attrs->link; - $addon_info->author[] = $author_obj; - - if($xml_obj->extra_vars) { - // 확장변수를 정리 - $extra_var_groups = $xml_obj->extra_vars->group; - if(!$extra_var_groups) $extra_var_groups = $xml_obj->extra_vars; - if(!is_array($extra_var_groups)) $extra_var_groups = array($extra_var_groups); - foreach($extra_var_groups as $group) { - $extra_vars = $group->var; - if(!is_array($group->var)) $extra_vars = array($group->var); - - foreach($extra_vars as $key => $val) { - unset($obj); - if(!$val->type->body) { $val->type->body = 'text'; } - - $obj->group = $group->title->body; - $obj->name = $val->attrs->name; - $obj->title = $val->title->body; - $obj->type = $val->type->body; - $obj->description = $val->description->body; - $obj->value = $extra_vals->{$obj->name}; - if(strpos($obj->value, '|@|') != false) { $obj->value = explode('|@|', $obj->value); } - if($obj->type == 'mid_list' && !is_array($obj->value)) { $obj->value = array($obj->value); } - - // 'select'type에서 option목록을 구한다. - if(is_array($val->options)) { - $option_count = count($val->options); - - for($i = 0; $i < $option_count; $i++) { - $obj->options[$i]->title = $val->options[$i]->title->body; - $obj->options[$i]->value = $val->options[$i]->value->body; - } - } - - $addon_info->extra_vars[] = $obj; - } - } - } - - } - - - - return $addon_info; - } - - /** - * @brief 활성화된 애드온 목록을 구해옴 - **/ - function getInsertedAddons($site_srl = 0) { - $args->list_order = 'addon'; - if(!$site_srl) $output = executeQuery('addon.getAddons', $args); - else { - $args->site_srl = $site_srl; - $output = executeQuery('addon.getSiteAddons', $args); - } - if(!$output->data) return array(); - if(!is_array($output->data)) $output->data = array($output->data); - - $activated_count = count($output->data); - for($i=0;$i<$activated_count;$i++) { - $addon = $output->data[$i]; - $addon_list[$addon->addon] = $addon; - } - return $addon_list; - } - - /** - * @brief 애드온이 활성화 되어 있는지 체크 - **/ - function isActivatedAddon($addon, $site_srl = 0, $type = "pc") { - $args->addon = $addon; - if(!$site_srl) { - if($type == "pc") $output = executeQuery('addon.getAddonIsActivated', $args); - else $output = executeQuery('addon.getMAddonIsActivated', $args); - } - else { - $args->site_srl = $site_srl; - if($type == "pc") $output = executeQuery('addon.getSiteAddonIsActivated', $args); - else $output = executeQuery('addon.getSiteMAddonIsActivated', $args); - } - if($output->data->count>0) return true; - return false; - } - - } -?> +getInsertedAddons($site_srl); + + // 다운받은 애드온과 설치된 애드온의 목록을 구함 + $searched_list = FileHandler::readDir('./addons'); + $searched_count = count($searched_list); + if(!$searched_count) return; + sort($searched_list); + + for($i=0;$i<$searched_count;$i++) { + // 애드온의 이름 + $addon_name = $searched_list[$i]; + if($addon_name == "smartphone") continue; + + // 애드온의 경로 (files/addons가 우선) + $path = $this->getAddonPath($addon_name); + + // 해당 애드온의 정보를 구함 + unset($info); + $info = $this->getAddonInfoXml($addon_name, $site_srl); + + $info->addon = $addon_name; + $info->path = $path; + $info->activated = false; + $info->mactivated = false; + + // DB에 입력되어 있는지 확인 + if(!in_array($addon_name, array_keys($inserted_addons))) { + // DB에 입력되어 있지 않으면 입력 (model에서 이런짓 하는거 싫지만 귀찮아서.. ㅡ.ㅜ) + $oAddonAdminController = &getAdminController('addon'); + $oAddonAdminController->doInsert($addon_name, $site_srl); + + // 활성화 되어 있는지 확인 + } else { + if($inserted_addons[$addon_name]->is_used=='Y') $info->activated = true; + if($inserted_addons[$addon_name]->is_used_m=='Y') $info->mactivated = true; + } + + $list[] = $info; + } + return $list; + } + + /** + * @brief 모듈의 conf/info.xml 을 읽어서 정보를 구함 + **/ + function getAddonInfoXml($addon, $site_srl = 0) { + // 요청된 모듈의 경로를 구한다. 없으면 return + $addon_path = $this->getAddonPath($addon); + if(!$addon_path) return; + + // 현재 선택된 모듈의 스킨의 정보 xml 파일을 읽음 + $xml_file = sprintf("%sconf/info.xml", $addon_path); + if(!file_exists($xml_file)) return; + + $oXmlParser = new XmlParser(); + $tmp_xml_obj = $oXmlParser->loadXmlFile($xml_file); + $xml_obj = $tmp_xml_obj->addon; + + if(!$xml_obj) return; + + + // DB에 설정된 내역을 가져온다 + $db_args->addon = $addon; + if(!$site_srl) $output = executeQuery('addon.getAddonInfo',$db_args); + else { + $db_args->site_srl = $site_srl; + $output = executeQuery('addon.getSiteAddonInfo',$db_args); + } + $extra_vals = unserialize($output->data->extra_vars); + + if($extra_vals->mid_list) { + $addon_info->mid_list = $extra_vals->mid_list; + } else { + $addon_info->mid_list = array(); + } + + + // 애드온 정보 + if($xml_obj->version && $xml_obj->attrs->version == '0.2') { + // addon format v0.2 + sscanf($xml_obj->date->body, '%d-%d-%d', $date_obj->y, $date_obj->m, $date_obj->d); + $addon_info->date = sprintf('%04d%02d%02d', $date_obj->y, $date_obj->m, $date_obj->d); + + $addon_info->addon_name = $addon; + $addon_info->title = $xml_obj->title->body; + $addon_info->description = trim($xml_obj->description->body); + $addon_info->version = $xml_obj->version->body; + $addon_info->homepage = $xml_obj->link->body; + $addon_info->license = $xml_obj->license->body; + $addon_info->license_link = $xml_obj->license->attrs->link; + + if(!is_array($xml_obj->author)) $author_list[] = $xml_obj->author; + else $author_list = $xml_obj->author; + + foreach($author_list as $author) { + unset($author_obj); + $author_obj->name = $author->name->body; + $author_obj->email_address = $author->attrs->email_address; + $author_obj->homepage = $author->attrs->link; + $addon_info->author[] = $author_obj; + } + + // 확장변수를 정리 + if($xml_obj->extra_vars) { + $extra_var_groups = $xml_obj->extra_vars->group; + if(!$extra_var_groups) $extra_var_groups = $xml_obj->extra_vars; + if(!is_array($extra_var_groups)) $extra_var_groups = array($extra_var_groups); + + foreach($extra_var_groups as $group) { + $extra_vars = $group->var; + if(!is_array($group->var)) $extra_vars = array($group->var); + + foreach($extra_vars as $key => $val) { + unset($obj); + if(!$val->attrs->type) { $val->attrs->type = 'text'; } + + $obj->group = $group->title->body; + $obj->name = $val->attrs->name; + $obj->title = $val->title->body; + $obj->type = $val->attrs->type; + $obj->description = $val->description->body; + $obj->value = $extra_vals->{$obj->name}; + if(strpos($obj->value, '|@|') != false) { $obj->value = explode('|@|', $obj->value); } + if($obj->type == 'mid_list' && !is_array($obj->value)) { $obj->value = array($obj->value); } + + // 'select'type에서 option목록을 구한다. + if(is_array($val->options)) { + $option_count = count($val->options); + + for($i = 0; $i < $option_count; $i++) { + $obj->options[$i]->title = $val->options[$i]->title->body; + $obj->options[$i]->value = $val->options[$i]->attrs->value; + } + } else { + $obj->options[0]->title = $val->options[0]->title->body; + $obj->options[0]->value = $val->options[0]->attrs->value; + } + + $addon_info->extra_vars[] = $obj; + } + } + } + + // history + if($xml_obj->history) { + if(!is_array($xml_obj->history)) $history[] = $xml_obj->history; + else $history = $xml_obj->history; + + foreach($history as $item) { + unset($obj); + + if($item->author) { + (!is_array($item->author)) ? $obj->author_list[] = $item->author : $obj->author_list = $item->author; + + foreach($obj->author_list as $author) { + unset($author_obj); + $author_obj->name = $author->name->body; + $author_obj->email_address = $author->attrs->email_address; + $author_obj->homepage = $author->attrs->link; + $obj->author[] = $author_obj; + } + } + + $obj->name = $item->name->body; + $obj->email_address = $item->attrs->email_address; + $obj->homepage = $item->attrs->link; + $obj->version = $item->attrs->version; + $obj->date = $item->attrs->date; + $obj->description = $item->description->body; + + if($item->log) { + (!is_array($item->log)) ? $obj->log[] = $item->log : $obj->log = $item->log; + + foreach($obj->log as $log) { + unset($log_obj); + $log_obj->text = $log->body; + $log_obj->link = $log->attrs->link; + $obj->logs[] = $log_obj; + } + } + + $addon_info->history[] = $obj; + } + } + + + } else { + // addon format 0.1 + $addon_info->addon_name = $addon; + $addon_info->title = $xml_obj->title->body; + $addon_info->description = trim($xml_obj->author->description->body); + $addon_info->version = $xml_obj->attrs->version; + sscanf($xml_obj->author->attrs->date, '%d. %d. %d', $date_obj->y, $date_obj->m, $date_obj->d); + $addon_info->date = sprintf('%04d%02d%02d', $date_obj->y, $date_obj->m, $date_obj->d); + $author_obj->name = $xml_obj->author->name->body; + $author_obj->email_address = $xml_obj->author->attrs->email_address; + $author_obj->homepage = $xml_obj->author->attrs->link; + $addon_info->author[] = $author_obj; + + if($xml_obj->extra_vars) { + // 확장변수를 정리 + $extra_var_groups = $xml_obj->extra_vars->group; + if(!$extra_var_groups) $extra_var_groups = $xml_obj->extra_vars; + if(!is_array($extra_var_groups)) $extra_var_groups = array($extra_var_groups); + foreach($extra_var_groups as $group) { + $extra_vars = $group->var; + if(!is_array($group->var)) $extra_vars = array($group->var); + + foreach($extra_vars as $key => $val) { + unset($obj); + if(!$val->type->body) { $val->type->body = 'text'; } + + $obj->group = $group->title->body; + $obj->name = $val->attrs->name; + $obj->title = $val->title->body; + $obj->type = $val->type->body; + $obj->description = $val->description->body; + $obj->value = $extra_vals->{$obj->name}; + if(strpos($obj->value, '|@|') != false) { $obj->value = explode('|@|', $obj->value); } + if($obj->type == 'mid_list' && !is_array($obj->value)) { $obj->value = array($obj->value); } + + // 'select'type에서 option목록을 구한다. + if(is_array($val->options)) { + $option_count = count($val->options); + + for($i = 0; $i < $option_count; $i++) { + $obj->options[$i]->title = $val->options[$i]->title->body; + $obj->options[$i]->value = $val->options[$i]->value->body; + } + } + + $addon_info->extra_vars[] = $obj; + } + } + } + + } + + + + return $addon_info; + } + + /** + * @brief 활성화된 애드온 목록을 구해옴 + **/ + function getInsertedAddons($site_srl = 0) { + $args->list_order = 'addon'; + if(!$site_srl) $output = executeQuery('addon.getAddons', $args); + else { + $args->site_srl = $site_srl; + $output = executeQuery('addon.getSiteAddons', $args); + } + if(!$output->data) return array(); + if(!is_array($output->data)) $output->data = array($output->data); + + $activated_count = count($output->data); + for($i=0;$i<$activated_count;$i++) { + $addon = $output->data[$i]; + $addon_list[$addon->addon] = $addon; + } + return $addon_list; + } + + /** + * @brief 애드온이 활성화 되어 있는지 체크 + **/ + function isActivatedAddon($addon, $site_srl = 0, $type = "pc") { + $args->addon = $addon; + if(!$site_srl) { + if($type == "pc") $output = executeQuery('addon.getAddonIsActivated', $args); + else $output = executeQuery('addon.getMAddonIsActivated', $args); + } + else { + $args->site_srl = $site_srl; + if($type == "pc") $output = executeQuery('addon.getSiteAddonIsActivated', $args); + else $output = executeQuery('addon.getSiteMAddonIsActivated', $args); + } + if($output->data->count>0) return true; + return false; + } + + } +?> diff --git a/modules/addon/addon.admin.view.php b/modules/addon/addon.admin.view.php index ed6e3a177..bc4c6c04e 100644 --- a/modules/addon/addon.admin.view.php +++ b/modules/addon/addon.admin.view.php @@ -1,98 +1,98 @@ -setTemplatePath($this->module_path.'tpl'); - } - - /** - * @brief 애드온 관리 메인 페이지 (목록 보여줌) - **/ - function dispAddonAdminIndex() { - $site_module_info = Context::get('site_module_info'); - - // 애드온 목록을 세팅 - $oAddonModel = &getAdminModel('addon'); - $addon_list = $oAddonModel->getAddonList($site_module_info->site_srl); - Context::set('addon_list', $addon_list); - - // 템플릿 패스 및 파일을 지정 - $this->setTemplateFile('addon_list'); - } - - /** - * @biref 애드온 세부 설정 팝업 출력 - **/ - function dispAddonAdminSetup() { - $site_module_info = Context::get('site_module_info'); - - // 요청된 애드온을 구함 - $selected_addon = Context::get('selected_addon'); - - // 요청된 애드온의 정보를 구함 - $oAddonModel = &getAdminModel('addon'); - $addon_info = $oAddonModel->getAddonInfoXml($selected_addon, $site_module_info->site_srl); - Context::set('addon_info', $addon_info); - - // mid 목록을 가져옴 - $oModuleModel = &getModel('module'); - $oModuleAdminModel = &getAdminModel('module'); - - if($site_module_info->site_srl) $args->site_srl = $site_module_info->site_srl; - $mid_list = $oModuleModel->getMidList($args); - - // module_category와 module의 조합 - if(!$site_module_info->site_srl) { - // 모듈 카테고리 목록을 구함 - $module_categories = $oModuleModel->getModuleCategories(); - - if($mid_list) { - foreach($mid_list as $module_srl => $module) { - $module_categories[$module->module_category_srl]->list[$module_srl] = $module; - } - } - } else { - $module_categories[0]->list = $mid_list; - } - - Context::set('mid_list',$module_categories); - - // 레이아웃을 팝업으로 지정 - $this->setLayoutFile('popup_layout'); - - // 템플릿 패스 및 파일을 지정 - $this->setTemplateFile('setup_addon'); - } - - /** - * @brief 애드온의 상세 정보(conf/info.xml)를 팝업 출력 - **/ - function dispAddonAdminInfo() { - $site_module_info = Context::get('site_module_info'); - - // 요청된 애드온을 구함 - $selected_addon = Context::get('selected_addon'); - - // 요청된 애드온의 정보를 구함 - $oAddonModel = &getAdminModel('addon'); - $addon_info = $oAddonModel->getAddonInfoXml($selected_addon, $site_module_info->site_srl); - Context::set('addon_info', $addon_info); - - // 레이아웃을 팝업으로 지정 - $this->setLayoutFile('popup_layout'); - - // 템플릿 패스 및 파일을 지정 - $this->setTemplateFile('addon_info'); - } - - } -?> +setTemplatePath($this->module_path.'tpl'); + } + + /** + * @brief 애드온 관리 메인 페이지 (목록 보여줌) + **/ + function dispAddonAdminIndex() { + $site_module_info = Context::get('site_module_info'); + + // 애드온 목록을 세팅 + $oAddonModel = &getAdminModel('addon'); + $addon_list = $oAddonModel->getAddonList($site_module_info->site_srl); + Context::set('addon_list', $addon_list); + + // 템플릿 패스 및 파일을 지정 + $this->setTemplateFile('addon_list'); + } + + /** + * @biref 애드온 세부 설정 팝업 출력 + **/ + function dispAddonAdminSetup() { + $site_module_info = Context::get('site_module_info'); + + // 요청된 애드온을 구함 + $selected_addon = Context::get('selected_addon'); + + // 요청된 애드온의 정보를 구함 + $oAddonModel = &getAdminModel('addon'); + $addon_info = $oAddonModel->getAddonInfoXml($selected_addon, $site_module_info->site_srl); + Context::set('addon_info', $addon_info); + + // mid 목록을 가져옴 + $oModuleModel = &getModel('module'); + $oModuleAdminModel = &getAdminModel('module'); + + if($site_module_info->site_srl) $args->site_srl = $site_module_info->site_srl; + $mid_list = $oModuleModel->getMidList($args); + + // module_category와 module의 조합 + if(!$site_module_info->site_srl) { + // 모듈 카테고리 목록을 구함 + $module_categories = $oModuleModel->getModuleCategories(); + + if($mid_list) { + foreach($mid_list as $module_srl => $module) { + $module_categories[$module->module_category_srl]->list[$module_srl] = $module; + } + } + } else { + $module_categories[0]->list = $mid_list; + } + + Context::set('mid_list',$module_categories); + + // 레이아웃을 팝업으로 지정 + $this->setLayoutFile('popup_layout'); + + // 템플릿 패스 및 파일을 지정 + $this->setTemplateFile('setup_addon'); + } + + /** + * @brief 애드온의 상세 정보(conf/info.xml)를 팝업 출력 + **/ + function dispAddonAdminInfo() { + $site_module_info = Context::get('site_module_info'); + + // 요청된 애드온을 구함 + $selected_addon = Context::get('selected_addon'); + + // 요청된 애드온의 정보를 구함 + $oAddonModel = &getAdminModel('addon'); + $addon_info = $oAddonModel->getAddonInfoXml($selected_addon, $site_module_info->site_srl); + Context::set('addon_info', $addon_info); + + // 레이아웃을 팝업으로 지정 + $this->setLayoutFile('popup_layout'); + + // 템플릿 패스 및 파일을 지정 + $this->setTemplateFile('addon_info'); + } + + } +?> diff --git a/modules/addon/addon.class.php b/modules/addon/addon.class.php index 7472e19dd..f75dbc47e 100644 --- a/modules/addon/addon.class.php +++ b/modules/addon/addon.class.php @@ -1,71 +1,71 @@ -doInsert('autolink'); - $oAddonController->doInsert('blogapi'); - $oAddonController->doInsert('counter'); - $oAddonController->doInsert('member_communication'); - $oAddonController->doInsert('member_extra_info'); - $oAddonController->doInsert('mobile'); - $oAddonController->doInsert('referer'); - $oAddonController->doInsert('resize_image'); - $oAddonController->doInsert('openid_delegation_id'); - $oAddonController->doInsert('point_level_icon'); - - // 몇가지 애드온을 기본 활성화 상태로 변경 - $oAddonController->doActivate('autolink'); - $oAddonController->doActivate('counter'); - $oAddonController->doActivate('member_communication'); - $oAddonController->doActivate('member_extra_info'); - $oAddonController->doActivate('mobile'); - $oAddonController->doActivate('referer'); - $oAddonController->doActivate('resize_image'); - $oAddonController->makeCacheFile(0); - return new Object(); - } - - /** - * @brief 설치가 이상이 없는지 체크하는 method - **/ - function checkUpdate() { - $oDB = &DB::getInstance(); - if(!$oDB->isColumnExists("addons", "is_used_m")) return true; - if(!$oDB->isColumnExists("addons_site", "is_used_m")) return true; - return false; - } - - /** - * @brief 업데이트 실행 - **/ - function moduleUpdate() { - $oDB = &DB::getInstance(); - if(!$oDB->isColumnExists("addons", "is_used_m")) { - $oDB->addColumn("addons", "is_used_m", "char", 1, "N", true); - } - if(!$oDB->isColumnExists("addons_site", "is_used_m")) { - $oDB->addColumn("addons_site", "is_used_m", "char", 1, "N", true); - } - return new Object(); - } - - /** - * @brief 캐시 파일 재생성 - **/ - function recompileCache() { - FileHandler::removeFilesInDir('./files/cache/addons'); - } - - } -?> +doInsert('autolink'); + $oAddonController->doInsert('blogapi'); + $oAddonController->doInsert('counter'); + $oAddonController->doInsert('member_communication'); + $oAddonController->doInsert('member_extra_info'); + $oAddonController->doInsert('mobile'); + $oAddonController->doInsert('referer'); + $oAddonController->doInsert('resize_image'); + $oAddonController->doInsert('openid_delegation_id'); + $oAddonController->doInsert('point_level_icon'); + + // 몇가지 애드온을 기본 활성화 상태로 변경 + $oAddonController->doActivate('autolink'); + $oAddonController->doActivate('counter'); + $oAddonController->doActivate('member_communication'); + $oAddonController->doActivate('member_extra_info'); + $oAddonController->doActivate('mobile'); + $oAddonController->doActivate('referer'); + $oAddonController->doActivate('resize_image'); + $oAddonController->makeCacheFile(0); + return new Object(); + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + **/ + function checkUpdate() { + $oDB = &DB::getInstance(); + if(!$oDB->isColumnExists("addons", "is_used_m")) return true; + if(!$oDB->isColumnExists("addons_site", "is_used_m")) return true; + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + $oDB = &DB::getInstance(); + if(!$oDB->isColumnExists("addons", "is_used_m")) { + $oDB->addColumn("addons", "is_used_m", "char", 1, "N", true); + } + if(!$oDB->isColumnExists("addons_site", "is_used_m")) { + $oDB->addColumn("addons_site", "is_used_m", "char", 1, "N", true); + } + return new Object(); + } + + /** + * @brief 캐시 파일 재생성 + **/ + function recompileCache() { + FileHandler::removeFilesInDir('./files/cache/addons'); + } + + } +?> diff --git a/modules/addon/addon.controller.php b/modules/addon/addon.controller.php index 7e29d2267..205f377fc 100644 --- a/modules/addon/addon.controller.php +++ b/modules/addon/addon.controller.php @@ -1,185 +1,185 @@ -site_srl; - - $addon_path = _XE_PATH_.'files/cache/addons/'; - - if($site_srl) $addon_file = $addon_path.$site_srl.$type.'.acivated_addons.cache.php'; - else $addon_file = $addon_path.$type.'acivated_addons.cache.php'; - - if($this->addon_file_called) return $addon_file; - $this->addon_file_called = true; - - if(!is_dir($addon_path)) FileHandler::makeDir($addon_path); - if(!file_exists($addon_file)) $this->makeCacheFile($site_srl, $type); - return $addon_file; - } - - - /** - * @brief 애드온 mid 추가 설정 - **/ - function _getMidList($selected_addon, $site_srl = 0) { - - $oAddonAdminModel = &getAdminModel('addon'); - $addon_info = $oAddonAdminModel->getAddonInfoXml($selected_addon, $site_srl); - return $addon_info->mid_list; - } - - - - /** - * @brief 애드온 mid 추가 설정 - **/ - function _setAddMid($selected_addon,$mid, $site_srl=0) { - - // 요청된 애드온의 정보를 구함 - $mid_list = $this->_getMidList($selected_addon, $site_srl); - - $mid_list[] = $mid; - $new_mid_list = array_unique($mid_list); - $this->_setMid($selected_addon,$new_mid_list, $site_srl); - } - - - /** - * @brief 애드온 mid 추가 설정 - **/ - function _setDelMid($selected_addon,$mid,$site_srl=0) { - - // 요청된 애드온의 정보를 구함 - $mid_list = $this->_getMidList($selected_addon,$site_srl); - - $new_mid_list = array(); - if(is_array($mid_list)){ - for($i=0,$c=count($mid_list);$i<$c;$i++){ - if($mid_list[$i] != $mid) $new_mid_list[] = $mid_list[$i]; - } - }else{ - $new_mid_list[] = $mid; - } - - - $this->_setMid($selected_addon,$new_mid_list,$site_srl); - } - - /** - * @brief 애드온 mid 추가 설정 - **/ - function _setMid($selected_addon,$mid_list,$site_srl=0) { - $args->mid_list = join('|@|',$mid_list); - $this->doSetup($selected_addon, $args,$site_srl); - $this->makeCacheFile($site_srl); - } - - - /** - * @brief 애드온 mid 추가 - **/ - function procAddonSetupAddonAddMid() { - $site_module_info = Context::get('site_module_info'); - - $args = Context::getRequestVars(); - $addon_name = $args->addon_name; - $mid = $args->mid; - $this->_setAddMid($addon_name,$mid,$site_module_info->site_srl); - } - - /** - * @brief 애드온 mid 삭제 - **/ - function procAddonSetupAddonDelMid() { - $site_module_info = Context::get('site_module_info'); - - $args = Context::getRequestVars(); - $addon_name = $args->addon_name; - $mid = $args->mid; - - $this->_setDelMid($addon_name,$mid,$site_module_info->site_srl); - } - - /** - * @brief 캐시 파일 생성 - **/ - function makeCacheFile($site_srl = 0, $type = "pc") { - // 모듈에서 애드온을 사용하기 위한 캐시 파일 생성 - $buff = ""; - $oAddonModel = &getAdminModel('addon'); - $addon_list = $oAddonModel->getInsertedAddons($site_srl, $type); - foreach($addon_list as $addon => $val) { - if($val->addon == "smartphone") continue; - if(!is_dir(_XE_PATH_.'addons/'.$addon)) continue; - if(($type == "pc" && $val->is_used != 'Y') || ($type == "mobile" && $val->is_used_m != 'Y')) continue; - - $extra_vars = unserialize($val->extra_vars); - $mid_list = $extra_vars->mid_list; - if(!is_array($mid_list)||!count($mid_list)) $mid_list = null; - $mid_list = base64_encode(serialize($mid_list)); - - if($val->extra_vars) { - unset($extra_vars); - $extra_vars = base64_encode($val->extra_vars); - } - - $buff .= sprintf(' $_ml = unserialize(base64_decode("%s")); if(file_exists("%saddons/%s/%s.addon.php") && (!is_array($_ml) || in_array($_m, $_ml))) { unset($addon_info); $addon_info = unserialize(base64_decode("%s")); $addon_path = "%saddons/%s/"; @include("%saddons/%s/%s.addon.php"); }', $mid_list, _XE_PATH_, $addon, $addon, $extra_vars, _XE_PATH_, $addon, _XE_PATH_, $addon, $addon); - } - - $buff = sprintf('', $buff); - - $addon_path = _XE_PATH_.'files/cache/addons/'; - if(!is_dir($addon_path)) FileHandler::makeDir($addon_path); - - if($site_srl) $addon_file = $addon_path.$site_srl.$type.'.acivated_addons.cache.php'; - else $addon_file = $addon_path.$type.'acivated_addons.cache.php'; - - FileHandler::writeFile($addon_file, $buff); - } - - /** - * @brief 애드온 설정 - **/ - function doSetup($addon, $extra_vars,$site_srl=0) { - if($extra_vars->mid_list) $extra_vars->mid_list = explode('|@|', $extra_vars->mid_list); - $args->addon = $addon; - $args->extra_vars = serialize($extra_vars); - if(!$site_srl) return executeQuery('addon.updateAddon', $args); - $args->site_srl = $site_srl; - return executeQuery('addon.updateSiteAddon', $args); - } - - /** - * @brief 가상 사이트에서의 애드온 정보 제거 - **/ - function removeAddonConfig($site_srl) { - $addon_path = _XE_PATH_.'files/cache/addons/'; - $addon_file = $addon_path.$site_srl.'.acivated_addons.cache.php'; - if(file_exists($addon_file)) FileHandler::removeFile($addon_file); - - $args->site_srl = $site_srl; - executeQuery('addon.deleteSiteAddons', $args); - - - } - - - } -?> +site_srl; + + $addon_path = _XE_PATH_.'files/cache/addons/'; + + if($site_srl) $addon_file = $addon_path.$site_srl.$type.'.acivated_addons.cache.php'; + else $addon_file = $addon_path.$type.'acivated_addons.cache.php'; + + if($this->addon_file_called) return $addon_file; + $this->addon_file_called = true; + + if(!is_dir($addon_path)) FileHandler::makeDir($addon_path); + if(!file_exists($addon_file)) $this->makeCacheFile($site_srl, $type); + return $addon_file; + } + + + /** + * @brief 애드온 mid 추가 설정 + **/ + function _getMidList($selected_addon, $site_srl = 0) { + + $oAddonAdminModel = &getAdminModel('addon'); + $addon_info = $oAddonAdminModel->getAddonInfoXml($selected_addon, $site_srl); + return $addon_info->mid_list; + } + + + + /** + * @brief 애드온 mid 추가 설정 + **/ + function _setAddMid($selected_addon,$mid, $site_srl=0) { + + // 요청된 애드온의 정보를 구함 + $mid_list = $this->_getMidList($selected_addon, $site_srl); + + $mid_list[] = $mid; + $new_mid_list = array_unique($mid_list); + $this->_setMid($selected_addon,$new_mid_list, $site_srl); + } + + + /** + * @brief 애드온 mid 추가 설정 + **/ + function _setDelMid($selected_addon,$mid,$site_srl=0) { + + // 요청된 애드온의 정보를 구함 + $mid_list = $this->_getMidList($selected_addon,$site_srl); + + $new_mid_list = array(); + if(is_array($mid_list)){ + for($i=0,$c=count($mid_list);$i<$c;$i++){ + if($mid_list[$i] != $mid) $new_mid_list[] = $mid_list[$i]; + } + }else{ + $new_mid_list[] = $mid; + } + + + $this->_setMid($selected_addon,$new_mid_list,$site_srl); + } + + /** + * @brief 애드온 mid 추가 설정 + **/ + function _setMid($selected_addon,$mid_list,$site_srl=0) { + $args->mid_list = join('|@|',$mid_list); + $this->doSetup($selected_addon, $args,$site_srl); + $this->makeCacheFile($site_srl); + } + + + /** + * @brief 애드온 mid 추가 + **/ + function procAddonSetupAddonAddMid() { + $site_module_info = Context::get('site_module_info'); + + $args = Context::getRequestVars(); + $addon_name = $args->addon_name; + $mid = $args->mid; + $this->_setAddMid($addon_name,$mid,$site_module_info->site_srl); + } + + /** + * @brief 애드온 mid 삭제 + **/ + function procAddonSetupAddonDelMid() { + $site_module_info = Context::get('site_module_info'); + + $args = Context::getRequestVars(); + $addon_name = $args->addon_name; + $mid = $args->mid; + + $this->_setDelMid($addon_name,$mid,$site_module_info->site_srl); + } + + /** + * @brief 캐시 파일 생성 + **/ + function makeCacheFile($site_srl = 0, $type = "pc") { + // 모듈에서 애드온을 사용하기 위한 캐시 파일 생성 + $buff = ""; + $oAddonModel = &getAdminModel('addon'); + $addon_list = $oAddonModel->getInsertedAddons($site_srl, $type); + foreach($addon_list as $addon => $val) { + if($val->addon == "smartphone") continue; + if(!is_dir(_XE_PATH_.'addons/'.$addon)) continue; + if(($type == "pc" && $val->is_used != 'Y') || ($type == "mobile" && $val->is_used_m != 'Y')) continue; + + $extra_vars = unserialize($val->extra_vars); + $mid_list = $extra_vars->mid_list; + if(!is_array($mid_list)||!count($mid_list)) $mid_list = null; + $mid_list = base64_encode(serialize($mid_list)); + + if($val->extra_vars) { + unset($extra_vars); + $extra_vars = base64_encode($val->extra_vars); + } + + $buff .= sprintf(' $_ml = unserialize(base64_decode("%s")); if(file_exists("%saddons/%s/%s.addon.php") && (!is_array($_ml) || in_array($_m, $_ml))) { unset($addon_info); $addon_info = unserialize(base64_decode("%s")); $addon_path = "%saddons/%s/"; @include("%saddons/%s/%s.addon.php"); }', $mid_list, _XE_PATH_, $addon, $addon, $extra_vars, _XE_PATH_, $addon, _XE_PATH_, $addon, $addon); + } + + $buff = sprintf('', $buff); + + $addon_path = _XE_PATH_.'files/cache/addons/'; + if(!is_dir($addon_path)) FileHandler::makeDir($addon_path); + + if($site_srl) $addon_file = $addon_path.$site_srl.$type.'.acivated_addons.cache.php'; + else $addon_file = $addon_path.$type.'acivated_addons.cache.php'; + + FileHandler::writeFile($addon_file, $buff); + } + + /** + * @brief 애드온 설정 + **/ + function doSetup($addon, $extra_vars,$site_srl=0) { + if($extra_vars->mid_list) $extra_vars->mid_list = explode('|@|', $extra_vars->mid_list); + $args->addon = $addon; + $args->extra_vars = serialize($extra_vars); + if(!$site_srl) return executeQuery('addon.updateAddon', $args); + $args->site_srl = $site_srl; + return executeQuery('addon.updateSiteAddon', $args); + } + + /** + * @brief 가상 사이트에서의 애드온 정보 제거 + **/ + function removeAddonConfig($site_srl) { + $addon_path = _XE_PATH_.'files/cache/addons/'; + $addon_file = $addon_path.$site_srl.'.acivated_addons.cache.php'; + if(file_exists($addon_file)) FileHandler::removeFile($addon_file); + + $args->site_srl = $site_srl; + executeQuery('addon.deleteSiteAddons', $args); + + + } + + + } +?> diff --git a/modules/addon/conf/info.xml b/modules/addon/conf/info.xml index 5deb7c53b..17f4abae8 100644 --- a/modules/addon/conf/info.xml +++ b/modules/addon/conf/info.xml @@ -1,39 +1,39 @@ - - - 애드온 - Addon - Addon - Addon - 插件管理 - アドオン - Additions - Аддон - 附加元件 - Eklenti - 애드온을 등록하거나 사용/미사용을 설정하는 애드온 관리 모듈입니다. - This module is for maintaining addons which can toggle use and disuse states. - Module này dành cho việc bảo trì những Addon đang sử dụng và không sử dụng. - Este Módulo es para agregar Addons, como también el manejo de ellos. - 登录插件或设置启用/禁用插件的管理模块。 - アドオンの「登録、使用・未使用」などを設定する管理モジュールです。 - Ce module est pour les Additions de maintien qui peuvent basculer des états d'utilisation et de désuétude. - Этот модуль служит для управления аддонами, использование которых Вы можете включать и выключать. - 設定附加元件「登錄、啟用、禁用」的管理模組。 - Bu modül, kullanımı değişebilecek veya kullanım dışı kalabilecek eklentileri korumak içindir. - 0.1 - 2007-02-28 - utility - - - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - - + + + 애드온 + Addon + Addon + Addon + 插件管理 + アドオン + Additions + Аддон + 附加元件 + Eklenti + 애드온을 등록하거나 사용/미사용을 설정하는 애드온 관리 모듈입니다. + This module is for maintaining addons which can toggle use and disuse states. + Module này dành cho việc bảo trì những Addon đang sử dụng và không sử dụng. + Este Módulo es para agregar Addons, como también el manejo de ellos. + 登录插件或设置启用/禁用插件的管理模块。 + アドオンの「登録、使用・未使用」などを設定する管理モジュールです。 + Ce module est pour les Additions de maintien qui peuvent basculer des états d'utilisation et de désuétude. + Этот модуль служит для управления аддонами, использование которых Вы можете включать и выключать. + 設定附加元件「登錄、啟用、禁用」的管理模組。 + Bu modül, kullanımı değişebilecek veya kullanım dışı kalabilecek eklentileri korumak içindir. + 0.1 + 2007-02-28 + utility + + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + diff --git a/modules/addon/lang/en.lang.php b/modules/addon/lang/en.lang.php index 9055040d1..cc4f97f90 100644 --- a/modules/addon/lang/en.lang.php +++ b/modules/addon/lang/en.lang.php @@ -1,17 +1,17 @@ -addon = "Addon"; - - $lang->addon_info = 'Summary of this Addon'; - $lang->addon_maker = 'Author of this Addon'; - $lang->addon_license = 'License'; - $lang->addon_history = 'Addon History'; - - $lang->about_addon_mid = "Addons can select targets.
(All targets will be selected when nothing is selected)"; - $lang->about_addon = 'Addons control many actions performed in your site rather than display HTML results.
You can control useful functions simply by toggling ON/OFF switch'; -?> +addon = "Addon"; + + $lang->addon_info = 'Summary of this Addon'; + $lang->addon_maker = 'Author of this Addon'; + $lang->addon_license = 'License'; + $lang->addon_history = 'Addon History'; + + $lang->about_addon_mid = "Addons can select targets.
(All targets will be selected when nothing is selected)"; + $lang->about_addon = 'Addons control many actions performed in your site rather than display HTML results.
You can control useful functions simply by toggling ON/OFF switch'; +?> diff --git a/modules/addon/lang/es.lang.php b/modules/addon/lang/es.lang.php index 47b52c84f..53fe74d64 100644 --- a/modules/addon/lang/es.lang.php +++ b/modules/addon/lang/es.lang.php @@ -1,17 +1,17 @@ -addon = "Addon"; - - $lang->addon_info = 'Información de Addon'; - $lang->addon_maker = 'Autor de Addon'; - $lang->addon_license = 'License'; - $lang->addon_history = 'Historia de Addon '; - - $lang->about_addon_mid = "Add-ons se puede utilizar para especificar el destino.
(Todo gratis, están disponibles en todos los destinos)"; - $lang->about_addon = 'Addon is para controlar las acciones y no para mostrar el resultado en HTML.
Sólo con activar o desactivar el addon que desee, podrá obtener funciones útiles para la administración de tu sitio web.'; -?> +addon = "Addon"; + + $lang->addon_info = 'Información de Addon'; + $lang->addon_maker = 'Autor de Addon'; + $lang->addon_license = 'License'; + $lang->addon_history = 'Historia de Addon '; + + $lang->about_addon_mid = "Add-ons se puede utilizar para especificar el destino.
(Todo gratis, están disponibles en todos los destinos)"; + $lang->about_addon = 'Addon is para controlar las acciones y no para mostrar el resultado en HTML.
Sólo con activar o desactivar el addon que desee, podrá obtener funciones útiles para la administración de tu sitio web.'; +?> diff --git a/modules/addon/lang/fr.lang.php b/modules/addon/lang/fr.lang.php index adff0133d..0decf6c9b 100644 --- a/modules/addon/lang/fr.lang.php +++ b/modules/addon/lang/fr.lang.php @@ -1,17 +1,17 @@ -addon = "Compagnon"; - - $lang->addon_info = 'Le résumé de la Compagnon'; - $lang->addon_maker = 'L\'Auteur de la Compagnon'; - $lang->addon_license = 'Licence'; - $lang->addon_history = 'L\'Histoire de la Compagnon'; - - $lang->about_addon_mid = "On peut choisir des objets dans lesquels la Compagnon soit utilisé.
(Tout sera choisi quand rien n'est choisi.)"; - $lang->about_addon = 'La Compagnon, c\'est pour contrôler les actions plutôt d\'imprimer des résultats de HTML.
Par la Touche à Bascule des compagnons que vous voulez faire marcher ou arrêter, vous pouvez appliquer les fonctions très utiles à administrer votre site Web.'; +addon = "Compagnon"; + + $lang->addon_info = 'Le résumé de la Compagnon'; + $lang->addon_maker = 'L\'Auteur de la Compagnon'; + $lang->addon_license = 'Licence'; + $lang->addon_history = 'L\'Histoire de la Compagnon'; + + $lang->about_addon_mid = "On peut choisir des objets dans lesquels la Compagnon soit utilisé.
(Tout sera choisi quand rien n'est choisi.)"; + $lang->about_addon = 'La Compagnon, c\'est pour contrôler les actions plutôt d\'imprimer des résultats de HTML.
Par la Touche à Bascule des compagnons que vous voulez faire marcher ou arrêter, vous pouvez appliquer les fonctions très utiles à administrer votre site Web.'; ?> \ No newline at end of file diff --git a/modules/addon/lang/jp.lang.php b/modules/addon/lang/jp.lang.php index 724d4e9c0..e5a24a5b5 100644 --- a/modules/addon/lang/jp.lang.php +++ b/modules/addon/lang/jp.lang.php @@ -1,17 +1,17 @@ -addon = 'アドオン'; - - $lang->addon_info = 'アドオン情報'; - $lang->addon_maker = 'アドオン制作者'; - $lang->addon_license = 'ライセンス'; - $lang->addon_history = '変更履歴'; - - $lang->about_addon_mid = 'アドオンが使われる対象を指定します。
(選択なしの場合、全てのモジュールが利用可能対象)'; - $lang->about_addon = 'アドオンは、HTMLの出力をコントロールすると言うより、動作を制御する役割をします。お好みのアドオンを「使用/未使用」に設定するだけで、サイトの運営に有用な機能が利用出来ます。'; -?> +addon = 'アドオン'; + + $lang->addon_info = 'アドオン情報'; + $lang->addon_maker = 'アドオン制作者'; + $lang->addon_license = 'ライセンス'; + $lang->addon_history = '変更履歴'; + + $lang->about_addon_mid = 'アドオンが使われる対象を指定します。
(選択なしの場合、全てのモジュールが利用可能対象)'; + $lang->about_addon = 'アドオンは、HTMLの出力をコントロールすると言うより、動作を制御する役割をします。お好みのアドオンを「使用/未使用」に設定するだけで、サイトの運営に有用な機能が利用出来ます。'; +?> diff --git a/modules/addon/lang/ko.lang.php b/modules/addon/lang/ko.lang.php index 39798220b..78726d981 100644 --- a/modules/addon/lang/ko.lang.php +++ b/modules/addon/lang/ko.lang.php @@ -1,17 +1,17 @@ -addon = '애드온'; - - $lang->addon_info = '애드온 정보'; - $lang->addon_maker = '애드온 제작자'; - $lang->addon_license = '라이선스'; - $lang->addon_history = '변경 이력'; - - $lang->about_addon_mid = '애드온이 사용될 대상을 지정할 수 있습니다.
(모두 해제 시 모든 대상에서 사용 가능합니다.)'; - $lang->about_addon = '애드온은 HTML결과물을 출력하기보다는 동작을 제어하는 역할을 합니다.
원하시는 애드온을 ON/OFF 하시는 것만으로도 사이트 운영에 유용한 기능을 연동할 수 있습니다.'; -?> +addon = '애드온'; + + $lang->addon_info = '애드온 정보'; + $lang->addon_maker = '애드온 제작자'; + $lang->addon_license = '라이선스'; + $lang->addon_history = '변경 이력'; + + $lang->about_addon_mid = '애드온이 사용될 대상을 지정할 수 있습니다.
(모두 해제 시 모든 대상에서 사용 가능합니다.)'; + $lang->about_addon = '애드온은 HTML결과물을 출력하기보다는 동작을 제어하는 역할을 합니다.
원하시는 애드온을 ON/OFF 하시는 것만으로도 사이트 운영에 유용한 기능을 연동할 수 있습니다.'; +?> diff --git a/modules/addon/lang/ru.lang.php b/modules/addon/lang/ru.lang.php index 6e802f1dc..f2738a09b 100644 --- a/modules/addon/lang/ru.lang.php +++ b/modules/addon/lang/ru.lang.php @@ -1,17 +1,17 @@ -addon = "Аддон"; - - $lang->addon_info = 'Информация об аддоне'; - $lang->addon_maker = 'Автор аддона'; - $lang->addon_license = 'License'; - $lang->addon_history = 'История аддона'; - - $lang->about_addon_mid = "애드온이 사용될 대상을 지정할 수 있습니다.
(모두 해제시 모든 대상에서 사용 가능합니다)"; - $lang->about_addon = 'Аддон служит больше для контролирования действий, чем для отображения HTML-результатов.
Простым включением/выключением любых аддонов, Вы можете использовать очень полезные функции для администрирования Вашего веб-сайта'; -?> +addon = "Аддон"; + + $lang->addon_info = 'Информация об аддоне'; + $lang->addon_maker = 'Автор аддона'; + $lang->addon_license = 'License'; + $lang->addon_history = 'История аддона'; + + $lang->about_addon_mid = "애드온이 사용될 대상을 지정할 수 있습니다.
(모두 해제시 모든 대상에서 사용 가능합니다)"; + $lang->about_addon = 'Аддон служит больше для контролирования действий, чем для отображения HTML-результатов.
Простым включением/выключением любых аддонов, Вы можете использовать очень полезные функции для администрирования Вашего веб-сайта'; +?> diff --git a/modules/addon/lang/tr.lang.php b/modules/addon/lang/tr.lang.php index 508344c7f..2a566b476 100644 --- a/modules/addon/lang/tr.lang.php +++ b/modules/addon/lang/tr.lang.php @@ -1,17 +1,17 @@ -addon = "Eklentiler"; - - $lang->addon_info = 'Eklenti Özeti'; - $lang->addon_maker = 'Eklenti Tasarımcısı'; - $lang->addon_license = 'Lisans'; - $lang->addon_history = 'Eklenti Geçmişi'; - - $lang->about_addon_mid = "Eklentiler, hedef seçebilirler.
(Herhangi bir seçim yapılmadığında, tüm hedefler seçilecektir.)"; - $lang->about_addon = 'Eklentiler, HTML sonuçlarını göstermek yerine sitenizde gerçekleştirilen birçok eylemi kontrol ederler, .
Kullanışlı işlevleri, AÇIK/KAPALI anahtarını değiştirerek, kolayca kontrol edebilirsiniz.'; -?> +addon = "Eklentiler"; + + $lang->addon_info = 'Eklenti Özeti'; + $lang->addon_maker = 'Eklenti Tasarımcısı'; + $lang->addon_license = 'Lisans'; + $lang->addon_history = 'Eklenti Geçmişi'; + + $lang->about_addon_mid = "Eklentiler, hedef seçebilirler.
(Herhangi bir seçim yapılmadığında, tüm hedefler seçilecektir.)"; + $lang->about_addon = 'Eklentiler, HTML sonuçlarını göstermek yerine sitenizde gerçekleştirilen birçok eylemi kontrol ederler, .
Kullanışlı işlevleri, AÇIK/KAPALI anahtarını değiştirerek, kolayca kontrol edebilirsiniz.'; +?> diff --git a/modules/addon/lang/vi.lang.php b/modules/addon/lang/vi.lang.php index e9c717b4b..6d0333d2b 100644 --- a/modules/addon/lang/vi.lang.php +++ b/modules/addon/lang/vi.lang.php @@ -1,19 +1,19 @@ -addon = "Addon"; - - $lang->addon_info = 'Thông tin về Addon'; - $lang->addon_maker = 'Tác giả của Addon'; - $lang->addon_license = 'Giấy phép'; - $lang->addon_history = 'Lịch sử'; - - $lang->about_addon_mid = "Addon có thể chọn những vị trí.
(Tất cả những vị trí mà chưa Addon nào sử dụng.)"; - $lang->about_addon = 'Addon có nhiệm vụ hiển thị và kiểm soát kết quả HTML.
Bạn có thể mở hoặc tắt bất cứ Addon nào bạn muốn.'; -?> +addon = "Addon"; + + $lang->addon_info = 'Thông tin về Addon'; + $lang->addon_maker = 'Tác giả của Addon'; + $lang->addon_license = 'Giấy phép'; + $lang->addon_history = 'Lịch sử'; + + $lang->about_addon_mid = "Addon có thể chọn những vị trí.
(Tất cả những vị trí mà chưa Addon nào sử dụng.)"; + $lang->about_addon = 'Addon có nhiệm vụ hiển thị và kiểm soát kết quả HTML.
Bạn có thể mở hoặc tắt bất cứ Addon nào bạn muốn.'; +?> diff --git a/modules/addon/lang/zh-CN.lang.php b/modules/addon/lang/zh-CN.lang.php index 6b8d088bb..9e46ec955 100644 --- a/modules/addon/lang/zh-CN.lang.php +++ b/modules/addon/lang/zh-CN.lang.php @@ -1,17 +1,17 @@ -addon = "插件"; - - $lang->addon_info = '插件信息'; - $lang->addon_maker = '插件作者'; - $lang->addon_license = '版权'; - $lang->addon_history = '更新纪录 '; - - $lang->about_addon_mid = "可以指定使用插件的对象。
(全部解除表示可用在所有对象。)"; - $lang->about_addon = '插件就是对动作(Action)的有效控制来给核心程序提供扩展功能的一种组件。
只需启用/禁用操作,即可为网站提供强大的扩展功能。'; -?> +addon = "插件"; + + $lang->addon_info = '插件信息'; + $lang->addon_maker = '插件作者'; + $lang->addon_license = '版权'; + $lang->addon_history = '更新纪录 '; + + $lang->about_addon_mid = "可以指定使用插件的对象。
(全部解除表示可用在所有对象。)"; + $lang->about_addon = '插件就是对动作(Action)的有效控制来给核心程序提供扩展功能的一种组件。
只需启用/禁用操作,即可为网站提供强大的扩展功能。'; +?> diff --git a/modules/addon/lang/zh-TW.lang.php b/modules/addon/lang/zh-TW.lang.php index e93aea072..dfd4444d7 100644 --- a/modules/addon/lang/zh-TW.lang.php +++ b/modules/addon/lang/zh-TW.lang.php @@ -1,17 +1,17 @@ -addon = "附加元件"; - - $lang->addon_info = '資料'; - $lang->addon_maker = '作者'; - $lang->addon_license = '版權'; - $lang->addon_history = '更新紀錄'; - - $lang->about_addon_mid = "可以指定使用附加元件的目標。
(全部不選取表示可用在所有目標。)"; - $lang->about_addon = '附加元件可擴展程式功能,而不是顯示輸出HTML結果。
『啟用/禁用』附加元件,以增強網站的功能。'; -?> +addon = "附加元件"; + + $lang->addon_info = '資料'; + $lang->addon_maker = '作者'; + $lang->addon_license = '版權'; + $lang->addon_history = '更新紀錄'; + + $lang->about_addon_mid = "可以指定使用附加元件的目標。
(全部不選取表示可用在所有目標。)"; + $lang->about_addon = '附加元件可擴展程式功能,而不是顯示輸出HTML結果。
『啟用/禁用』附加元件,以增強網站的功能。'; +?> diff --git a/modules/admin/admin.admin.controller.php b/modules/admin/admin.admin.controller.php index f7fcb8bb5..bc97df6b0 100644 --- a/modules/admin/admin.admin.controller.php +++ b/modules/admin/admin.admin.controller.php @@ -1,83 +1,83 @@ -getLoggedInfo(); - if($logged_info->is_admin!='Y') return $this->stop("msg_is_not_administrator"); - } - - /** - * @brief Regenerate all cache files - * @return none - **/ - function procAdminRecompileCacheFile() { - // rename cache dir - $temp_cache_dir = './files/cache_'. time(); - FileHandler::rename('./files/cache', $temp_cache_dir); - FileHandler::makeDir('./files/cache'); - - // remove debug files - FileHandler::removeFile(_XE_PATH_.'files/_debug_message.php'); - FileHandler::removeFile(_XE_PATH_.'files/_debug_db_query.php'); - FileHandler::removeFile(_XE_PATH_.'files/_db_slow_query.php'); - - $oModuleModel = &getModel('module'); - $module_list = $oModuleModel->getModuleList(); - - // call recompileCache for each module - foreach($module_list as $module) { - $oModule = null; - $oModule = &getClass($module->module); - if(method_exists($oModule, 'recompileCache')) $oModule->recompileCache(); - } - - // remove cache dir - $tmp_cache_list = FileHandler::readDir('./files','/(^cache_[0-9]+)/'); - if($tmp_cache_list){ - foreach($tmp_cache_list as $tmp_dir){ - if($tmp_dir) FileHandler::removeDir('./files/'.$tmp_dir); - } - } - - $truncated = array(); - $oObjectCacheHandler = &CacheHandler::getInstance(); - $oTemplateCacheHandler = &CacheHandler::getInstance('template'); - - if($oObjectCacheHandler->isSupport()){ - $truncated[] = $oObjectCacheHandler->truncate(); - } - - if($oTemplateCacheHandler->isSupport()){ - $truncated[] = $oTemplateCacheHandler->truncate(); - } - - if(count($truncated) && in_array(false,$truncated)){ - return new Object(-1,'msg_self_restart_cache_engine'); - } - - $this->setMessage('success_updated'); - } - - /** - * @brief Logout - * @return none - **/ - function procAdminLogout() { - $oMemberController = &getController('member'); - $oMemberController->procMemberLogout(); - - header('Location: '.getNotEncodedUrl('', 'module','admin')); - } - } -?> +getLoggedInfo(); + if($logged_info->is_admin!='Y') return $this->stop("msg_is_not_administrator"); + } + + /** + * @brief Regenerate all cache files + * @return none + **/ + function procAdminRecompileCacheFile() { + // rename cache dir + $temp_cache_dir = './files/cache_'. time(); + FileHandler::rename('./files/cache', $temp_cache_dir); + FileHandler::makeDir('./files/cache'); + + // remove debug files + FileHandler::removeFile(_XE_PATH_.'files/_debug_message.php'); + FileHandler::removeFile(_XE_PATH_.'files/_debug_db_query.php'); + FileHandler::removeFile(_XE_PATH_.'files/_db_slow_query.php'); + + $oModuleModel = &getModel('module'); + $module_list = $oModuleModel->getModuleList(); + + // call recompileCache for each module + foreach($module_list as $module) { + $oModule = null; + $oModule = &getClass($module->module); + if(method_exists($oModule, 'recompileCache')) $oModule->recompileCache(); + } + + // remove cache dir + $tmp_cache_list = FileHandler::readDir('./files','/(^cache_[0-9]+)/'); + if($tmp_cache_list){ + foreach($tmp_cache_list as $tmp_dir){ + if($tmp_dir) FileHandler::removeDir('./files/'.$tmp_dir); + } + } + + $truncated = array(); + $oObjectCacheHandler = &CacheHandler::getInstance(); + $oTemplateCacheHandler = &CacheHandler::getInstance('template'); + + if($oObjectCacheHandler->isSupport()){ + $truncated[] = $oObjectCacheHandler->truncate(); + } + + if($oTemplateCacheHandler->isSupport()){ + $truncated[] = $oTemplateCacheHandler->truncate(); + } + + if(count($truncated) && in_array(false,$truncated)){ + return new Object(-1,'msg_self_restart_cache_engine'); + } + + $this->setMessage('success_updated'); + } + + /** + * @brief Logout + * @return none + **/ + function procAdminLogout() { + $oMemberController = &getController('member'); + $oMemberController->procMemberLogout(); + + header('Location: '.getNotEncodedUrl('', 'module','admin')); + } + } +?> diff --git a/modules/admin/admin.admin.view.php b/modules/admin/admin.admin.view.php index c9961939c..ff7d3e896 100644 --- a/modules/admin/admin.admin.view.php +++ b/modules/admin/admin.admin.view.php @@ -1,358 +1,358 @@ -getLoggedInfo(); - if($logged_info->is_admin!='Y') return $this->stop("msg_is_not_administrator"); - - // change into administration layout - $this->setTemplatePath($this->module_path.'tpl'); - $this->setLayoutPath($this->getTemplatePath()); - $this->setLayoutFile('layout.html'); - - $this->loadSideBar(); - - // Retrieve the list of installed modules - - $db_info = Context::getDBInfo(); - - Context::set('time_zone_list', $GLOBALS['time_zone']); - Context::set('time_zone', $GLOBALS['_time_zone']); - Context::set('use_rewrite', $db_info->use_rewrite=='Y'?'Y':'N'); - Context::set('use_sso', $db_info->use_sso=='Y'?'Y':'N'); - Context::set('use_spaceremover', $db_info->use_spaceremover?$db_info->use_spaceremover:'Y'); - Context::set('qmail_compatibility', $db_info->qmail_compatibility=='Y'?'Y':'N'); - Context::set('use_db_session', $db_info->use_db_session=='N'?'N':'Y'); - Context::set('use_mobile_view', $db_info->use_mobile_view =='Y'?'Y':'N'); - Context::set('use_ssl', $db_info->use_ssl?$db_info->use_ssl:"none"); - if($db_info->http_port) Context::set('http_port', $db_info->http_port); - if($db_info->https_port) Context::set('https_port', $db_info->https_port); - - } - - function loadSideBar() - { - $oModuleModel = &getModel('module'); - $installed_module_list = $oModuleModel->getModulesXmlInfo(); - - $installed_modules = $package_modules = array(); - $package_idx = 0; - foreach($installed_module_list as $key => $val) { - if($val->category == 'migration') $val->category = 'system'; - if($val->category == 'interlock') $val->category = 'accessory'; - if($val->category == 'statistics') $val->category = 'accessory'; - - if($val->module == 'admin' || !$val->admin_index_act) continue; - // get action information - $action_spec = $oModuleModel->getModuleActionXml($val->module); - $actions = array(); - if($action_spec->default_index_act) $actions[] = $action_spec->default_index_act; - if($action_spec->admin_index_act) $actions[] = $action_spec->admin_index_act; - if($action_spec->action) foreach($action_spec->action as $k => $v) $actions[] = $k; - - $obj = null; - $obj->category = $val->category; - $obj->title = $val->title; - $obj->description = $val->description; - $obj->index_act = $val->admin_index_act; - if(in_array(Context::get('act'), $actions)) $obj->selected = true; - - // Packages - if($val->category == 'package') { - if($package_idx == 0) $obj->position = "first"; - else $obj->position = "mid"; - $package_modules[] = $obj; - $package_idx ++; - if($obj->selected) Context::set('package_selected',true); - // Modules - } else { - $installed_modules[] = $obj; - } - if($obj->selected) { - Context::set('selected_module_category', $val->category); - Context::set('selected_module_info', $val); - } - } - if(count($package_modules)) $package_modules[count($package_modules)-1]->position = 'end'; - Context::set('package_modules', $package_modules); - Context::set('installed_modules', $installed_modules); - Context::setBrowserTitle("XE Admin Page"); - - // add javascript tooltip plugin - gony - Context::loadJavascriptPlugin('qtip'); - Context::loadJavascriptPlugin('watchinput'); - } - - /** - * @brief Display main administration page - * @return none - **/ - function dispAdminIndex() { - //Retrieve recent news and set them into context - $newest_news_url = sprintf("http://news.xpressengine.com/%s/news.php", Context::getLangType()); - $cache_file = sprintf("%sfiles/cache/newest_news.%s.cache.php", _XE_PATH_,Context::getLangType()); - if(!file_exists($cache_file) || filemtime($cache_file)+ 60*60 < time()) { - // Considering if data cannot be retrieved due to network problem, modify filemtime to prevent trying to reload again when refreshing administration page - // Ensure to access the administration page even though news cannot be displayed - FileHandler::writeFile($cache_file,''); - FileHandler::getRemoteFile($newest_news_url, $cache_file, null, 1, 'GET', 'text/html', array('REQUESTURL'=>getFullUrl(''))); - } - - if(file_exists($cache_file)) { - $oXml = new XmlParser(); - $buff = $oXml->parse(FileHandler::readFile($cache_file)); - - $item = $buff->zbxe_news->item; - if($item) { - if(!is_array($item)) $item = array($item); - - foreach($item as $key => $val) { - $obj = null; - $obj->title = $val->body; - $obj->date = $val->attrs->date; - $obj->url = $val->attrs->url; - $news[] = $obj; - } - Context::set('news', $news); - } - - Context::set('released_version', $buff->zbxe_news->attrs->released_version); - Context::set('download_link', $buff->zbxe_news->attrs->download_link); - } - - // DB Information - $db_info = Context::getDBInfo(); - Context::set('selected_lang', $db_info->lang_type); - - // Current Version and Installed Path - Context::set('current_version', __ZBXE_VERSION__); - Context::set('installed_path', realpath('./')); - - // Get list of modules - $oModuleModel = &getModel('module'); - $module_list = $oModuleModel->getModuleList(); - Context::set('module_list', $module_list); - - // Get list of addons - $oAddonModel = &getAdminModel('addon'); - $addon_list = $oAddonModel->getAddonList(); - Context::set('addon_list', $addon_list); - - // 방문자수 - $time = time(); - $w = date("D"); - while(date("D",$time) != "Sat") { - $time += 60*60*24; - } - $end_time = $time; - $end_date = date("Ymd",$time); - $time -= 60*60*24; - while(date("D",$time)!="Sun") { - $thisWeek[] = date("Ymd",$time); - $time -= 60*60*24; - } - $start_time = $time; - $start_date = date("Ymd",$time-60*60*24*7); - - $args->start_date = $start_date; - $args->end_date = $end_date; - $output = executeQueryArray('admin.getVisitors', $args); - if(count($output->data)) { - foreach($output->data as $key => $val) { - $visitors[$val->regdate] = $val->unique_visitor; - } - } - $output = executeQueryArray('admin.getSiteVisitors', $args); - if(count($output->data)) { - foreach($output->data as $key => $val) { - $visitors[$val->regdate] += $val->unique_visitor; - } - } - $status->week_max = 0; - if(count($visitors)) { - foreach($visitors as $key => $val) { - if($val>$status->week_max) $status->week_max = $val; - } - } - - for($i=$start_time;$i<=$end_time;$i+=60*60*24) { - $status->thisWeekSum += $visitors[date("Ymd",$i)]; - $status->week[date("Y.m.d",$i)]->this = (int)$visitors[date("Ymd",$i)]; - $status->week[date("Y.m.d",$i)]->last = (int)$visitors[date("Ymd",$i-60*60*24*7)]; - } - - // 각종 통계 정보를 구함 - $output = executeQuery('admin.getTotalVisitors'); - $status->total_visitor = $output->data->count; - $output = executeQuery('admin.getTotalSiteVisitors'); - $status->total_visitor += $output->data->count; - $status->visitor = $visitors[date("Ymd")]; - - // 오늘의 댓글 수 - $args->regdate = date("Ymd"); - $output = executeQuery('admin.getTodayCommentCount', $args); - $status->comment_count = $output->data->count; - - // 오늘의 엮인글 수 - $args->regdate = date("Ymd"); - $output = executeQuery('admin.getTodayTrackbackCount', $args); - $status->trackback_count = $output->data->count; - - Context::set('status', $status); - - // Get statistics - $args->date = date("Ymd000000", time()-60*60*24); - $today = date("Ymd"); - - // Member Status - $output = executeQueryArray("admin.getMemberStatus", $args); - if($output->data) { - foreach($output->data as $var) { - if($var->date == $today) { - $status->member->today = $var->count; - } else { - $status->member->yesterday = $var->count; - } - } - } - $output = executeQuery("admin.getMemberCount", $args); - $status->member->total = $output->data->count; - - // Document Status - $output = executeQueryArray("admin.getDocumentStatus", $args); - if($output->data) { - foreach($output->data as $var) { - if($var->date == $today) { - $status->document->today = $var->count; - } else { - $status->document->yesterday = $var->count; - } - } - } - $output = executeQuery("admin.getDocumentCount", $args); - $status->document->total = $output->data->count; - - // Comment Status - $output = executeQueryArray("admin.getCommentStatus", $args); - if($output->data) { - foreach($output->data as $var) { - if($var->date == $today) { - $status->comment->today = $var->count; - } else { - $status->comment->yesterday = $var->count; - } - } - } - $output = executeQuery("admin.getCommentCount", $args); - $status->comment->total = $output->data->count; - - // Trackback Status - $output = executeQueryArray("admin.getTrackbackStatus", $args); - if($output->data) { - foreach($output->data as $var) { - if($var->date == $today) { - $status->trackback->today = $var->count; - } else { - $status->trackback->yesterday = $var->count; - } - } - } - $output = executeQuery("admin.getTrackbackCount", $args); - $status->trackback->total = $output->data->count; - - // Attached files Status - $output = executeQueryArray("admin.getFileStatus", $args); - if($output->data) { - foreach($output->data as $var) { - if($var->date == $today) { - $status->file->today = $var->count; - } else { - $status->file->yesterday = $var->count; - } - } - } - $output = executeQuery("admin.getFileCount", $args); - $status->file->total = $output->data->count; - - // Reported documents Status - $output = executeQueryArray("admin.getDocumentDeclaredStatus", $args); - if($output->data) { - foreach($output->data as $var) { - if($var->date == $today) { - $status->documentDeclared->today = $var->count; - } else { - $status->documentDeclared->yesterday = $var->count; - } - } - } - $output = executeQuery("admin.getDocumentDeclaredCount", $args); - $status->documentDeclared->total = $output->data->count; - - // Reported comments Status - $output = executeQueryArray("admin.getCommentDeclaredStatus", $args); - if($output->data) { - foreach($output->data as $var) { - if($var->date == $today) { - $status->commentDeclared->today = $var->count; - } else { - $status->commentDeclared->yesterday = $var->count; - } - } - } - $output = executeQuery("admin.getCommentDeclaredCount", $args); - $status->commentDeclared->total = $output->data->count; - - $site_args->site_srl = 0; - $output = executeQuery('module.getSiteInfo', $site_args); - Context::set('start_module', $output->data); - - Context::set('status', $status); - Context::set('layout','none'); - $this->setTemplateFile('index'); - } - - /** - * @brief Display Configuration(settings) page - * @return none - **/ - function dispAdminConfig() { - $db_info = Context::getDBInfo(); - - Context::set('sftp_support', function_exists(ssh2_sftp)); - - Context::set('selected_lang', $db_info->lang_type); - - Context::set('default_url', $db_info->default_url); - - Context::set('langs', Context::loadLangSupported()); - - Context::set('lang_selected', Context::loadLangSelected()); - - Context::set('use_mobile_view', $db_info->use_mobile_view=="Y"?'Y':'N'); - - $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); - - Context::set('pwd',$pwd); - Context::set('layout','none'); - $this->setTemplateFile('config'); - } - } -?> +getLoggedInfo(); + if($logged_info->is_admin!='Y') return $this->stop("msg_is_not_administrator"); + + // change into administration layout + $this->setTemplatePath($this->module_path.'tpl'); + $this->setLayoutPath($this->getTemplatePath()); + $this->setLayoutFile('layout.html'); + + $this->loadSideBar(); + + // Retrieve the list of installed modules + + $db_info = Context::getDBInfo(); + + Context::set('time_zone_list', $GLOBALS['time_zone']); + Context::set('time_zone', $GLOBALS['_time_zone']); + Context::set('use_rewrite', $db_info->use_rewrite=='Y'?'Y':'N'); + Context::set('use_sso', $db_info->use_sso=='Y'?'Y':'N'); + Context::set('use_spaceremover', $db_info->use_spaceremover?$db_info->use_spaceremover:'Y'); + Context::set('qmail_compatibility', $db_info->qmail_compatibility=='Y'?'Y':'N'); + Context::set('use_db_session', $db_info->use_db_session=='N'?'N':'Y'); + Context::set('use_mobile_view', $db_info->use_mobile_view =='Y'?'Y':'N'); + Context::set('use_ssl', $db_info->use_ssl?$db_info->use_ssl:"none"); + if($db_info->http_port) Context::set('http_port', $db_info->http_port); + if($db_info->https_port) Context::set('https_port', $db_info->https_port); + + } + + function loadSideBar() + { + $oModuleModel = &getModel('module'); + $installed_module_list = $oModuleModel->getModulesXmlInfo(); + + $installed_modules = $package_modules = array(); + $package_idx = 0; + foreach($installed_module_list as $key => $val) { + if($val->category == 'migration') $val->category = 'system'; + if($val->category == 'interlock') $val->category = 'accessory'; + if($val->category == 'statistics') $val->category = 'accessory'; + + if($val->module == 'admin' || !$val->admin_index_act) continue; + // get action information + $action_spec = $oModuleModel->getModuleActionXml($val->module); + $actions = array(); + if($action_spec->default_index_act) $actions[] = $action_spec->default_index_act; + if($action_spec->admin_index_act) $actions[] = $action_spec->admin_index_act; + if($action_spec->action) foreach($action_spec->action as $k => $v) $actions[] = $k; + + $obj = null; + $obj->category = $val->category; + $obj->title = $val->title; + $obj->description = $val->description; + $obj->index_act = $val->admin_index_act; + if(in_array(Context::get('act'), $actions)) $obj->selected = true; + + // Packages + if($val->category == 'package') { + if($package_idx == 0) $obj->position = "first"; + else $obj->position = "mid"; + $package_modules[] = $obj; + $package_idx ++; + if($obj->selected) Context::set('package_selected',true); + // Modules + } else { + $installed_modules[] = $obj; + } + if($obj->selected) { + Context::set('selected_module_category', $val->category); + Context::set('selected_module_info', $val); + } + } + if(count($package_modules)) $package_modules[count($package_modules)-1]->position = 'end'; + Context::set('package_modules', $package_modules); + Context::set('installed_modules', $installed_modules); + Context::setBrowserTitle("XE Admin Page"); + + // add javascript tooltip plugin - gony + Context::loadJavascriptPlugin('qtip'); + Context::loadJavascriptPlugin('watchinput'); + } + + /** + * @brief Display main administration page + * @return none + **/ + function dispAdminIndex() { + //Retrieve recent news and set them into context + $newest_news_url = sprintf("http://news.xpressengine.com/%s/news.php", Context::getLangType()); + $cache_file = sprintf("%sfiles/cache/newest_news.%s.cache.php", _XE_PATH_,Context::getLangType()); + if(!file_exists($cache_file) || filemtime($cache_file)+ 60*60 < time()) { + // Considering if data cannot be retrieved due to network problem, modify filemtime to prevent trying to reload again when refreshing administration page + // Ensure to access the administration page even though news cannot be displayed + FileHandler::writeFile($cache_file,''); + FileHandler::getRemoteFile($newest_news_url, $cache_file, null, 1, 'GET', 'text/html', array('REQUESTURL'=>getFullUrl(''))); + } + + if(file_exists($cache_file)) { + $oXml = new XmlParser(); + $buff = $oXml->parse(FileHandler::readFile($cache_file)); + + $item = $buff->zbxe_news->item; + if($item) { + if(!is_array($item)) $item = array($item); + + foreach($item as $key => $val) { + $obj = null; + $obj->title = $val->body; + $obj->date = $val->attrs->date; + $obj->url = $val->attrs->url; + $news[] = $obj; + } + Context::set('news', $news); + } + + Context::set('released_version', $buff->zbxe_news->attrs->released_version); + Context::set('download_link', $buff->zbxe_news->attrs->download_link); + } + + // DB Information + $db_info = Context::getDBInfo(); + Context::set('selected_lang', $db_info->lang_type); + + // Current Version and Installed Path + Context::set('current_version', __ZBXE_VERSION__); + Context::set('installed_path', realpath('./')); + + // Get list of modules + $oModuleModel = &getModel('module'); + $module_list = $oModuleModel->getModuleList(); + Context::set('module_list', $module_list); + + // Get list of addons + $oAddonModel = &getAdminModel('addon'); + $addon_list = $oAddonModel->getAddonList(); + Context::set('addon_list', $addon_list); + + // 방문자수 + $time = time(); + $w = date("D"); + while(date("D",$time) != "Sat") { + $time += 60*60*24; + } + $end_time = $time; + $end_date = date("Ymd",$time); + $time -= 60*60*24; + while(date("D",$time)!="Sun") { + $thisWeek[] = date("Ymd",$time); + $time -= 60*60*24; + } + $start_time = $time; + $start_date = date("Ymd",$time-60*60*24*7); + + $args->start_date = $start_date; + $args->end_date = $end_date; + $output = executeQueryArray('admin.getVisitors', $args); + if(count($output->data)) { + foreach($output->data as $key => $val) { + $visitors[$val->regdate] = $val->unique_visitor; + } + } + $output = executeQueryArray('admin.getSiteVisitors', $args); + if(count($output->data)) { + foreach($output->data as $key => $val) { + $visitors[$val->regdate] += $val->unique_visitor; + } + } + $status->week_max = 0; + if(count($visitors)) { + foreach($visitors as $key => $val) { + if($val>$status->week_max) $status->week_max = $val; + } + } + + for($i=$start_time;$i<=$end_time;$i+=60*60*24) { + $status->thisWeekSum += $visitors[date("Ymd",$i)]; + $status->week[date("Y.m.d",$i)]->this = (int)$visitors[date("Ymd",$i)]; + $status->week[date("Y.m.d",$i)]->last = (int)$visitors[date("Ymd",$i-60*60*24*7)]; + } + + // 각종 통계 정보를 구함 + $output = executeQuery('admin.getTotalVisitors'); + $status->total_visitor = $output->data->count; + $output = executeQuery('admin.getTotalSiteVisitors'); + $status->total_visitor += $output->data->count; + $status->visitor = $visitors[date("Ymd")]; + + // 오늘의 댓글 수 + $args->regdate = date("Ymd"); + $output = executeQuery('admin.getTodayCommentCount', $args); + $status->comment_count = $output->data->count; + + // 오늘의 엮인글 수 + $args->regdate = date("Ymd"); + $output = executeQuery('admin.getTodayTrackbackCount', $args); + $status->trackback_count = $output->data->count; + + Context::set('status', $status); + + // Get statistics + $args->date = date("Ymd000000", time()-60*60*24); + $today = date("Ymd"); + + // Member Status + $output = executeQueryArray("admin.getMemberStatus", $args); + if($output->data) { + foreach($output->data as $var) { + if($var->date == $today) { + $status->member->today = $var->count; + } else { + $status->member->yesterday = $var->count; + } + } + } + $output = executeQuery("admin.getMemberCount", $args); + $status->member->total = $output->data->count; + + // Document Status + $output = executeQueryArray("admin.getDocumentStatus", $args); + if($output->data) { + foreach($output->data as $var) { + if($var->date == $today) { + $status->document->today = $var->count; + } else { + $status->document->yesterday = $var->count; + } + } + } + $output = executeQuery("admin.getDocumentCount", $args); + $status->document->total = $output->data->count; + + // Comment Status + $output = executeQueryArray("admin.getCommentStatus", $args); + if($output->data) { + foreach($output->data as $var) { + if($var->date == $today) { + $status->comment->today = $var->count; + } else { + $status->comment->yesterday = $var->count; + } + } + } + $output = executeQuery("admin.getCommentCount", $args); + $status->comment->total = $output->data->count; + + // Trackback Status + $output = executeQueryArray("admin.getTrackbackStatus", $args); + if($output->data) { + foreach($output->data as $var) { + if($var->date == $today) { + $status->trackback->today = $var->count; + } else { + $status->trackback->yesterday = $var->count; + } + } + } + $output = executeQuery("admin.getTrackbackCount", $args); + $status->trackback->total = $output->data->count; + + // Attached files Status + $output = executeQueryArray("admin.getFileStatus", $args); + if($output->data) { + foreach($output->data as $var) { + if($var->date == $today) { + $status->file->today = $var->count; + } else { + $status->file->yesterday = $var->count; + } + } + } + $output = executeQuery("admin.getFileCount", $args); + $status->file->total = $output->data->count; + + // Reported documents Status + $output = executeQueryArray("admin.getDocumentDeclaredStatus", $args); + if($output->data) { + foreach($output->data as $var) { + if($var->date == $today) { + $status->documentDeclared->today = $var->count; + } else { + $status->documentDeclared->yesterday = $var->count; + } + } + } + $output = executeQuery("admin.getDocumentDeclaredCount", $args); + $status->documentDeclared->total = $output->data->count; + + // Reported comments Status + $output = executeQueryArray("admin.getCommentDeclaredStatus", $args); + if($output->data) { + foreach($output->data as $var) { + if($var->date == $today) { + $status->commentDeclared->today = $var->count; + } else { + $status->commentDeclared->yesterday = $var->count; + } + } + } + $output = executeQuery("admin.getCommentDeclaredCount", $args); + $status->commentDeclared->total = $output->data->count; + + $site_args->site_srl = 0; + $output = executeQuery('module.getSiteInfo', $site_args); + Context::set('start_module', $output->data); + + Context::set('status', $status); + Context::set('layout','none'); + $this->setTemplateFile('index'); + } + + /** + * @brief Display Configuration(settings) page + * @return none + **/ + function dispAdminConfig() { + $db_info = Context::getDBInfo(); + + Context::set('sftp_support', function_exists(ssh2_sftp)); + + Context::set('selected_lang', $db_info->lang_type); + + Context::set('default_url', $db_info->default_url); + + Context::set('langs', Context::loadLangSupported()); + + Context::set('lang_selected', Context::loadLangSelected()); + + Context::set('use_mobile_view', $db_info->use_mobile_view=="Y"?'Y':'N'); + + $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); + + Context::set('pwd',$pwd); + Context::set('layout','none'); + $this->setTemplateFile('config'); + } + } +?> diff --git a/modules/admin/admin.class.php b/modules/admin/admin.class.php index 24e43df67..a710474bb 100644 --- a/modules/admin/admin.class.php +++ b/modules/admin/admin.class.php @@ -1,59 +1,59 @@ -read()) { - if(substr($entry,0,11)=='newest_news') FileHandler::removeFile("./files/cache/".$entry); - } - $directory->close(); - } - } -?> +read()) { + if(substr($entry,0,11)=='newest_news') FileHandler::removeFile("./files/cache/".$entry); + } + $directory->close(); + } + } +?> diff --git a/modules/admin/conf/info.xml b/modules/admin/conf/info.xml index 2b55b624e..2faf48870 100644 --- a/modules/admin/conf/info.xml +++ b/modules/admin/conf/info.xml @@ -1,36 +1,36 @@ - - - 관리자 모듈 - Administrator Module - Administrator Module - Módulo del administrador - 管理员模块 - 管理者用モジュール - Модуль администратора - 管理員模組 - Yönetici Modülü - 각 모듈들의 기능을 나열하고 관리자용 레이아웃을 적용하여 관리 기능을 사용할 수 있도록 하는 모듈입니다. - This module shows a list of features of each module, and enables you to use a quite few of managers by applying layout for administrator. - Module này hiển thị thông tin của những Module đã được cài đặt, và cho phép bạn sử dụng quyền của Administrator để thiết lập giao diện. - Este módulo muestra una lista de características de cada módulo, en donde puede activar la función de la administracion aplicando el diseño del administrador. - 列出各模块的功能并使用管理员布局,可以让其使用管理功能的模块。 - 各モジュールの機能を表示し、かつ管理者用のレイアウトを適用させて、管理機能が使用出来るようにします。 - Этот модуль показывает список возможностей каждого модуля, и позволяет Вам использовать несколько менеджеров, применяя лейаут для администратора. - 列出各模組的功能及使用管理員版面,並可使用管理功能的模組。 - Bu modül size, her modülün özelliklerini barındıran bir liste gösterir ve yöneticiler için yerleşim düzeni uygulayarak, yöneticilerin birkaçını kullanma imkanı sunar. - 0.1 - 2007-02-28 - system - - - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - - + + + 관리자 모듈 + Administrator Module + Administrator Module + Módulo del administrador + 管理员模块 + 管理者用モジュール + Модуль администратора + 管理員模組 + Yönetici Modülü + 각 모듈들의 기능을 나열하고 관리자용 레이아웃을 적용하여 관리 기능을 사용할 수 있도록 하는 모듈입니다. + This module shows a list of features of each module, and enables you to use a quite few of managers by applying layout for administrator. + Module này hiển thị thông tin của những Module đã được cài đặt, và cho phép bạn sử dụng quyền của Administrator để thiết lập giao diện. + Este módulo muestra una lista de características de cada módulo, en donde puede activar la función de la administracion aplicando el diseño del administrador. + 列出各模块的功能并使用管理员布局,可以让其使用管理功能的模块。 + 各モジュールの機能を表示し、かつ管理者用のレイアウトを適用させて、管理機能が使用出来るようにします。 + Этот модуль показывает список возможностей каждого модуля, и позволяет Вам использовать несколько менеджеров, применяя лейаут для администратора. + 列出各模組的功能及使用管理員版面,並可使用管理功能的模組。 + Bu modül size, her modülün özelliklerini barındıran bir liste gösterir ve yöneticiler için yerleşim düzeni uygulayarak, yöneticilerin birkaçını kullanma imkanı sunar. + 0.1 + 2007-02-28 + system + + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + diff --git a/modules/admin/lang/en.lang.php b/modules/admin/lang/en.lang.php index fb8b296bc..81b698d57 100644 --- a/modules/admin/lang/en.lang.php +++ b/modules/admin/lang/en.lang.php @@ -1,92 +1,92 @@ -admin_info = 'Administrator Info'; - $lang->admin_index = 'Index Admin Page'; - $lang->control_panel = 'Dashboard'; - $lang->start_module = 'Default Module'; - $lang->about_start_module = 'You can specify default module of the site.'; - - $lang->module_category_title = array( - 'service' => 'Services', - 'member' => 'Members', - 'content' => 'Contents', - 'statistics' => 'Statistics', - 'construction' => 'Construction', - 'utility' => 'Utilities', - 'interlock' => 'Embedded', - 'accessory' => 'Accessories', - 'migration' => 'Data Migration', - 'system' => 'System Setting', - ); - - $lang->newest_news = "Latest News"; - - $lang->env_setup = "Setting"; - $lang->default_url = "Default URL"; - $lang->about_default_url = "If you use a virtual site feature (e.g., cafeXE), input default URL (parent-site's address), then SSO would be enabled, thus connection to documents/modules works properly. "; - - $lang->env_information = "Environment Information"; - $lang->current_version = "Current Version"; - $lang->current_path = "Installed Path"; - $lang->released_version = "Latest Version"; - $lang->about_download_link = "New version of Zerboard XE is now available!\nPlease click the download link to get the latest version."; - - $lang->item_module = "Module List"; - $lang->item_addon = "Addon List"; - $lang->item_widget = "Widget List"; - $lang->item_layout = "Layout List"; - - $lang->module_name = "Module Name"; - $lang->addon_name = "Addon Name"; - $lang->version = "Version"; - $lang->author = "Developer"; - $lang->table_count = "Number of Table"; - $lang->installed_path = "Installed Path"; - - $lang->cmd_shortcut_management = "Edit Menu"; - - $lang->msg_is_not_administrator = 'Administrator Only'; - $lang->msg_manage_module_cannot_delete = 'Shortcuts of module, addon, layout, widget cannot be removed'; - $lang->msg_default_act_is_null = 'Shortcut could not be registered because default admin Action is not set'; - - $lang->welcome_to_xe = 'Welcome to the admin page of XE'; - $lang->about_admin_page = "Admin page is still under development,\nWe will add essential contents by accepting many good suggestions during Closebeta."; - $lang->about_lang_env = "To apply selected language as default language, click on the Save button."; - - $lang->xe_license = 'XE complies with the GPL'; - $lang->about_shortcut = 'You may remove shortcuts of modules which are registered on frequently using module list'; - - $lang->yesterday = "Yesterday"; - $lang->today = "Today"; - - $lang->cmd_lang_select = "Language"; - $lang->about_cmd_lang_select = "Only selected languages will be served."; - $lang->about_recompile_cache = "You can delete useless or invalid cache files."; - $lang->use_ssl = "Use SSL"; - $lang->ssl_options = array( - 'none' => "Never", - 'optional' => "Optional", - 'always' => "Always" - ); - $lang->about_use_ssl = "In case of 'Optional', SSL will be used for actions such as signing up / changing information. And for 'Always', your site will be served only via https."; - $lang->server_ports = "Server Port"; - $lang->about_server_ports = "If your web server does not use 80 for HTTP or 443 for HTTPS port, 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"; - $lang->ftp_get_list = "Get List"; - $lang->ftp_remove_info = 'Remove FTP Info.'; - $lang->msg_ftp_invalid_path = 'Failed to read the specified FTP Path.'; - $lang->msg_self_restart_cache_engine = 'Please restart Memcached or cache daemon.'; - $lang->mobile_view = 'Mobile View'; - $lang->about_mobile_view = 'Mobile View will display the best layout when accessing with smartphones.'; - $lang->autoinstall = 'EasyInstall'; - - $lang->last_week = 'Last week'; - $lang->this_week = 'This week'; -?> +admin_info = 'Administrator Info'; + $lang->admin_index = 'Index Admin Page'; + $lang->control_panel = 'Dashboard'; + $lang->start_module = 'Default Module'; + $lang->about_start_module = 'You can specify default module of the site.'; + + $lang->module_category_title = array( + 'service' => 'Services', + 'member' => 'Members', + 'content' => 'Contents', + 'statistics' => 'Statistics', + 'construction' => 'Construction', + 'utility' => 'Utilities', + 'interlock' => 'Embedded', + 'accessory' => 'Accessories', + 'migration' => 'Data Migration', + 'system' => 'System Setting', + ); + + $lang->newest_news = "Latest News"; + + $lang->env_setup = "Setting"; + $lang->default_url = "Default URL"; + $lang->about_default_url = "If you use a virtual site feature (e.g., cafeXE), input default URL (parent-site's address), then SSO would be enabled, thus connection to documents/modules works properly. "; + + $lang->env_information = "Environment Information"; + $lang->current_version = "Current Version"; + $lang->current_path = "Installed Path"; + $lang->released_version = "Latest Version"; + $lang->about_download_link = "New version of Zerboard XE is now available!\nPlease click the download link to get the latest version."; + + $lang->item_module = "Module List"; + $lang->item_addon = "Addon List"; + $lang->item_widget = "Widget List"; + $lang->item_layout = "Layout List"; + + $lang->module_name = "Module Name"; + $lang->addon_name = "Addon Name"; + $lang->version = "Version"; + $lang->author = "Developer"; + $lang->table_count = "Number of Table"; + $lang->installed_path = "Installed Path"; + + $lang->cmd_shortcut_management = "Edit Menu"; + + $lang->msg_is_not_administrator = 'Administrator Only'; + $lang->msg_manage_module_cannot_delete = 'Shortcuts of module, addon, layout, widget cannot be removed'; + $lang->msg_default_act_is_null = 'Shortcut could not be registered because default admin Action is not set'; + + $lang->welcome_to_xe = 'Welcome to the admin page of XE'; + $lang->about_admin_page = "Admin page is still under development,\nWe will add essential contents by accepting many good suggestions during Closebeta."; + $lang->about_lang_env = "To apply selected language as default language, click on the Save button."; + + $lang->xe_license = 'XE complies with the GPL'; + $lang->about_shortcut = 'You may remove shortcuts of modules which are registered on frequently using module list'; + + $lang->yesterday = "Yesterday"; + $lang->today = "Today"; + + $lang->cmd_lang_select = "Language"; + $lang->about_cmd_lang_select = "Only selected languages will be served."; + $lang->about_recompile_cache = "You can delete useless or invalid cache files."; + $lang->use_ssl = "Use SSL"; + $lang->ssl_options = array( + 'none' => "Never", + 'optional' => "Optional", + 'always' => "Always" + ); + $lang->about_use_ssl = "In case of 'Optional', SSL will be used for actions such as signing up / changing information. And for 'Always', your site will be served only via https."; + $lang->server_ports = "Server Port"; + $lang->about_server_ports = "If your web server does not use 80 for HTTP or 443 for HTTPS port, 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"; + $lang->ftp_get_list = "Get List"; + $lang->ftp_remove_info = 'Remove FTP Info.'; + $lang->msg_ftp_invalid_path = 'Failed to read the specified FTP Path.'; + $lang->msg_self_restart_cache_engine = 'Please restart Memcached or cache daemon.'; + $lang->mobile_view = 'Mobile View'; + $lang->about_mobile_view = 'Mobile View will display the best layout when accessing with smartphones.'; + $lang->autoinstall = 'EasyInstall'; + + $lang->last_week = 'Last week'; + $lang->this_week = 'This week'; +?> diff --git a/modules/admin/lang/es.lang.php b/modules/admin/lang/es.lang.php index 83ec529c3..1bc1f84b2 100644 --- a/modules/admin/lang/es.lang.php +++ b/modules/admin/lang/es.lang.php @@ -1,94 +1,94 @@ -admin_info = 'Administrador de Información'; - $lang->admin_index = 'Índice de la página admin'; - $lang->control_panel = 'Control panel'; - $lang->start_module = 'Módulo de inicio'; - $lang->about_start_module = 'Puede especificar el módulo de inicio por defecto.'; - - $lang->module_category_title = array( - 'service' => 'Service Setting', - 'member' => 'Member Setting', - 'content' => 'Content Setting', - 'statistics' => 'Statistics', - 'construction' => 'Construction', - 'utility' => 'Utility Setting', - 'interlock' => 'Interlock Setting', - 'accessory' => 'Accessories', - 'migration' => 'Data Migration', - 'system' => 'System Setting', - ); - - - $lang->newest_news = "Noticias recientes"; - - $lang->env_setup = "Configuración"; - $lang->default_url = "기본 URL"; - $lang->about_default_url = "XE sitio virtual (cafeXE, etc) tiene que introducir la URL base, al utilizar las capacidades de trabajo virtual y el tema de autenticación sayiteugan / módulos y las conexiones se realizan correctamente. (Ej: http:// dominio / ruta de instalación)"; - - $lang->env_information = "Información Ambiental"; - $lang->current_version = "Versión actual"; - $lang->current_path = "Instalado Sendero"; - $lang->released_version = "Versión más reciente"; - $lang->about_download_link = "La versión más reciente Zerboard XE está disponible.\nPara descargar la versión más reciente, haga clic en enlace de descarga."; - - $lang->item_module = "Lista de Módulos"; - $lang->item_addon = "Lista de Addons"; - $lang->item_widget = "Lista de Widgets"; - $lang->item_layout = "Liasta de Diseños"; - - $lang->module_name = "Nombre del Módulo"; - $lang->addon_name = "Nombre de Addon"; - $lang->version = "Versión"; - $lang->author = "Autor"; - $lang->table_count = "Número de los tableros"; - $lang->installed_path = "Ruta de instalación"; - - $lang->cmd_shortcut_management = "Editar el Menú"; - - $lang->msg_is_not_administrator = 'Sólo se permite el ingreso del administrador.'; - $lang->msg_manage_module_cannot_delete = 'No se puede eliminar acceso directo del Módulo, Addon, Diseño y Widget.'; - $lang->msg_default_act_is_null = 'No se puede registrar acceso directo por no estar determinada la acción del administrador predefinido.'; - - $lang->welcome_to_xe = 'Esta es la página del Administrador de XE'; - $lang->about_admin_page = "La página del Administrador aún está en desarrollo."; - $lang->about_lang_env = "Para aplicar idioma seleccionado conjunto de los usuarios, como por defecto, haga clic en el botón [Guardar] el cambio."; - - - $lang->xe_license = 'XE está bajo la Licencia de GPL'; - $lang->about_shortcut = 'Puede Eliminar los accesos directos de módulos, los cuales fueron registrados en la lista de módulos usados frecuentemente'; - - $lang->yesterday = "Yesterday"; - $lang->today = "Today"; - - $lang->cmd_lang_select = "Selección de Idioma"; - $lang->about_cmd_lang_select = "Seleccione el idioma es sólo el servicio"; - $lang->about_recompile_cache = "Inválido inútil archivo de caché puede organizar jyeotgeona"; - $lang->use_ssl = "Usar SSL"; - $lang->ssl_options = array( - 'none' => "Desactivar", - 'optional' => "Opcionalmente el", - 'always' => "Utilice siempre el" - ); - $lang->about_use_ssl = "Opcionalmente, la composición de suscripción / editar la información y el uso de SSL especificada en la acción es siempre el uso de SSL para todos los servicios que se utilizarán"; - $lang->server_ports = "Especifique el puerto del servidor"; - $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"; - $lang->ftp_get_list = "Get List"; - $lang->ftp_remove_info = 'Remove FTP Info.'; - $lang->msg_ftp_invalid_path = 'Failed to read the specified FTP Path.'; - $lang->msg_self_restart_cache_engine = 'Please restart Memcached or cache daemon.'; - $lang->mobile_view = 'Use Mobile View'; - $lang->about_mobile_view = 'If accessing with a smartphone, display content with mobile layout.'; - $lang->autoinstall = 'EasyInstall'; - - $lang->last_week = 'Last week'; - $lang->this_week = 'This week'; -?> +admin_info = 'Administrador de Información'; + $lang->admin_index = 'Índice de la página admin'; + $lang->control_panel = 'Control panel'; + $lang->start_module = 'Módulo de inicio'; + $lang->about_start_module = 'Puede especificar el módulo de inicio por defecto.'; + + $lang->module_category_title = array( + 'service' => 'Service Setting', + 'member' => 'Member Setting', + 'content' => 'Content Setting', + 'statistics' => 'Statistics', + 'construction' => 'Construction', + 'utility' => 'Utility Setting', + 'interlock' => 'Interlock Setting', + 'accessory' => 'Accessories', + 'migration' => 'Data Migration', + 'system' => 'System Setting', + ); + + + $lang->newest_news = "Noticias recientes"; + + $lang->env_setup = "Configuración"; + $lang->default_url = "기본 URL"; + $lang->about_default_url = "XE sitio virtual (cafeXE, etc) tiene que introducir la URL base, al utilizar las capacidades de trabajo virtual y el tema de autenticación sayiteugan / módulos y las conexiones se realizan correctamente. (Ej: http:// dominio / ruta de instalación)"; + + $lang->env_information = "Información Ambiental"; + $lang->current_version = "Versión actual"; + $lang->current_path = "Instalado Sendero"; + $lang->released_version = "Versión más reciente"; + $lang->about_download_link = "La versión más reciente Zerboard XE está disponible.\nPara descargar la versión más reciente, haga clic en enlace de descarga."; + + $lang->item_module = "Lista de Módulos"; + $lang->item_addon = "Lista de Addons"; + $lang->item_widget = "Lista de Widgets"; + $lang->item_layout = "Liasta de Diseños"; + + $lang->module_name = "Nombre del Módulo"; + $lang->addon_name = "Nombre de Addon"; + $lang->version = "Versión"; + $lang->author = "Autor"; + $lang->table_count = "Número de los tableros"; + $lang->installed_path = "Ruta de instalación"; + + $lang->cmd_shortcut_management = "Editar el Menú"; + + $lang->msg_is_not_administrator = 'Sólo se permite el ingreso del administrador.'; + $lang->msg_manage_module_cannot_delete = 'No se puede eliminar acceso directo del Módulo, Addon, Diseño y Widget.'; + $lang->msg_default_act_is_null = 'No se puede registrar acceso directo por no estar determinada la acción del administrador predefinido.'; + + $lang->welcome_to_xe = 'Esta es la página del Administrador de XE'; + $lang->about_admin_page = "La página del Administrador aún está en desarrollo."; + $lang->about_lang_env = "Para aplicar idioma seleccionado conjunto de los usuarios, como por defecto, haga clic en el botón [Guardar] el cambio."; + + + $lang->xe_license = 'XE está bajo la Licencia de GPL'; + $lang->about_shortcut = 'Puede Eliminar los accesos directos de módulos, los cuales fueron registrados en la lista de módulos usados frecuentemente'; + + $lang->yesterday = "Yesterday"; + $lang->today = "Today"; + + $lang->cmd_lang_select = "Selección de Idioma"; + $lang->about_cmd_lang_select = "Seleccione el idioma es sólo el servicio"; + $lang->about_recompile_cache = "Inválido inútil archivo de caché puede organizar jyeotgeona"; + $lang->use_ssl = "Usar SSL"; + $lang->ssl_options = array( + 'none' => "Desactivar", + 'optional' => "Opcionalmente el", + 'always' => "Utilice siempre el" + ); + $lang->about_use_ssl = "Opcionalmente, la composición de suscripción / editar la información y el uso de SSL especificada en la acción es siempre el uso de SSL para todos los servicios que se utilizarán"; + $lang->server_ports = "Especifique el puerto del servidor"; + $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"; + $lang->ftp_get_list = "Get List"; + $lang->ftp_remove_info = 'Remove FTP Info.'; + $lang->msg_ftp_invalid_path = 'Failed to read the specified FTP Path.'; + $lang->msg_self_restart_cache_engine = 'Please restart Memcached or cache daemon.'; + $lang->mobile_view = 'Use Mobile View'; + $lang->about_mobile_view = 'If accessing with a smartphone, display content with mobile layout.'; + $lang->autoinstall = 'EasyInstall'; + + $lang->last_week = 'Last week'; + $lang->this_week = 'This week'; +?> diff --git a/modules/admin/lang/fr.lang.php b/modules/admin/lang/fr.lang.php index ce6840000..b4e151662 100644 --- a/modules/admin/lang/fr.lang.php +++ b/modules/admin/lang/fr.lang.php @@ -1,93 +1,93 @@ -admin_info = 'Informations d\'Administrateur'; - $lang->admin_index = 'Page de l\'indice pour l\'Administrateur'; - $lang->control_panel = 'Control panel'; - $lang->start_module = 'Start Module'; - $lang->about_start_module = 'Vous pouvez spécifier début module par défaut.'; - - $lang->module_category_title = array( - 'service' => 'Service Setting', - 'member' => 'Member Setting', - 'content' => 'Content Setting', - 'statistics' => 'Statistics', - 'construction' => 'Construction', - 'utility' => 'Utility Setting', - 'interlock' => 'Interlock Setting', - 'accessory' => 'Accessories', - 'migration' => 'Data Migration', - 'system' => 'System Setting', - ); - - $lang->newest_news = "Dernières Nouvelles"; - - $lang->env_setup = "Configuration"; - $lang->default_url = "기본 URL"; - $lang->about_default_url = "XE 가상 사이트(cafeXE등)의 기능을 사용할때 기본 URL을 입력해 주셔야 가상 사이트간 인증 연동이 되고 게시글/모듈등의 연결이 정상적으로 이루어집니다. (ex: http://도메인/설치경로)"; - - - $lang->env_information = "Informations de l'Environnement"; - $lang->current_version = "Version Courante"; - $lang->current_path = "Chemin Installé"; - $lang->released_version = "Dernière Version"; - $lang->about_download_link = "Nouvelle version est disponible.\nPour télécharger la dernière version, cliquez le lien."; - - $lang->item_module = "Liste des Modules"; - $lang->item_addon = "Liste des Compagnons"; - $lang->item_widget = "Liste des Gadgets"; - $lang->item_layout = "Liste des Mises en Pages"; - - $lang->module_name = "Nom de Module"; - $lang->addon_name = "Nom de Compagnon"; - $lang->version = "Version"; - $lang->author = "Auteur"; - $lang->table_count = "Somme de Tables"; - $lang->installed_path = "Chemin Installé"; - - $lang->cmd_shortcut_management = "Editer le Menu"; - - $lang->msg_is_not_administrator = 'Administrateur seulement'; - $lang->msg_manage_module_cannot_delete = 'On ne peut pas supprimer les raccourcis pour les modules, les compagnons, les mises en page ou les gadgets'; - $lang->msg_default_act_is_null = 'on ne peut pas enrégistrer les raccourcis parce que les Actions Par Défaut de l\'Administrateur ne sont pas établies'; - - $lang->welcome_to_xe = 'Bienvenue sur la Page d\'Administration du XE'; - $lang->about_admin_page = "La Page d\'Administration est encore en train de développer,\nNous allons ajouter des contenus essentiels par accepter beauoup de bons suggestions pendant Béta Proche."; - $lang->about_lang_env = "Vous pouvez fixer la Langue Par Défaut par cliquer le boutton [Conserver] au-dessous. Les visiteurs vont voir tous les menus et les messages en langue que vous choisissez."; - - $lang->xe_license = 'XE s\'applique la GPL'; - $lang->about_shortcut = 'Vous pouvez supprimer les raccourcis pour les modules qui sont enrgistrés sur le liste des modules qui sont utilisés fréquemment'; - - $lang->yesterday = "Yesterday"; - $lang->today = "Today"; - - $lang->cmd_lang_select = "langue"; - $lang->about_cmd_lang_select = "La langue choisie seulement sera servie"; - $lang->about_recompile_cache = "Vous pouvez arranger les fichiers inutils ou les fichiers invalides d'antémémoire"; - $lang->use_ssl = "Utiliser SSL"; - $lang->ssl_options = array( - 'none' => "Ne Pas utiliser", - 'optional' => "Optionnel", - 'always' => "Toujours" - ); - $lang->about_use_ssl = "Si l'on choisit 'Optionnel' , on utilise protocole SSL seulement dans quelques services comme inscription ou modification. Si l'on choisit 'Toujours', on utilise protocole SSL dans tous les services."; - $lang->server_ports = "déclarer le port de serveur"; - $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"; - $lang->ftp_get_list = "Get List"; - $lang->ftp_remove_info = 'Remove FTP Info.'; - $lang->msg_ftp_invalid_path = 'Failed to read the specified FTP Path.'; - $lang->msg_self_restart_cache_engine = 'Please restart Memcached or cache daemon.'; - $lang->mobile_view = 'Use Mobile View'; - $lang->about_mobile_view = 'If accessing with a smartphone, display content with mobile layout.'; - $lang->autoinstall = 'EasyInstall'; - - $lang->last_week = 'Last week'; - $lang->this_week = 'This week'; -?> +admin_info = 'Informations d\'Administrateur'; + $lang->admin_index = 'Page de l\'indice pour l\'Administrateur'; + $lang->control_panel = 'Control panel'; + $lang->start_module = 'Start Module'; + $lang->about_start_module = 'Vous pouvez spécifier début module par défaut.'; + + $lang->module_category_title = array( + 'service' => 'Service Setting', + 'member' => 'Member Setting', + 'content' => 'Content Setting', + 'statistics' => 'Statistics', + 'construction' => 'Construction', + 'utility' => 'Utility Setting', + 'interlock' => 'Interlock Setting', + 'accessory' => 'Accessories', + 'migration' => 'Data Migration', + 'system' => 'System Setting', + ); + + $lang->newest_news = "Dernières Nouvelles"; + + $lang->env_setup = "Configuration"; + $lang->default_url = "기본 URL"; + $lang->about_default_url = "XE 가상 사이트(cafeXE등)의 기능을 사용할때 기본 URL을 입력해 주셔야 가상 사이트간 인증 연동이 되고 게시글/모듈등의 연결이 정상적으로 이루어집니다. (ex: http://도메인/설치경로)"; + + + $lang->env_information = "Informations de l'Environnement"; + $lang->current_version = "Version Courante"; + $lang->current_path = "Chemin Installé"; + $lang->released_version = "Dernière Version"; + $lang->about_download_link = "Nouvelle version est disponible.\nPour télécharger la dernière version, cliquez le lien."; + + $lang->item_module = "Liste des Modules"; + $lang->item_addon = "Liste des Compagnons"; + $lang->item_widget = "Liste des Gadgets"; + $lang->item_layout = "Liste des Mises en Pages"; + + $lang->module_name = "Nom de Module"; + $lang->addon_name = "Nom de Compagnon"; + $lang->version = "Version"; + $lang->author = "Auteur"; + $lang->table_count = "Somme de Tables"; + $lang->installed_path = "Chemin Installé"; + + $lang->cmd_shortcut_management = "Editer le Menu"; + + $lang->msg_is_not_administrator = 'Administrateur seulement'; + $lang->msg_manage_module_cannot_delete = 'On ne peut pas supprimer les raccourcis pour les modules, les compagnons, les mises en page ou les gadgets'; + $lang->msg_default_act_is_null = 'on ne peut pas enrégistrer les raccourcis parce que les Actions Par Défaut de l\'Administrateur ne sont pas établies'; + + $lang->welcome_to_xe = 'Bienvenue sur la Page d\'Administration du XE'; + $lang->about_admin_page = "La Page d\'Administration est encore en train de développer,\nNous allons ajouter des contenus essentiels par accepter beauoup de bons suggestions pendant Béta Proche."; + $lang->about_lang_env = "Vous pouvez fixer la Langue Par Défaut par cliquer le boutton [Conserver] au-dessous. Les visiteurs vont voir tous les menus et les messages en langue que vous choisissez."; + + $lang->xe_license = 'XE s\'applique la GPL'; + $lang->about_shortcut = 'Vous pouvez supprimer les raccourcis pour les modules qui sont enrgistrés sur le liste des modules qui sont utilisés fréquemment'; + + $lang->yesterday = "Yesterday"; + $lang->today = "Today"; + + $lang->cmd_lang_select = "langue"; + $lang->about_cmd_lang_select = "La langue choisie seulement sera servie"; + $lang->about_recompile_cache = "Vous pouvez arranger les fichiers inutils ou les fichiers invalides d'antémémoire"; + $lang->use_ssl = "Utiliser SSL"; + $lang->ssl_options = array( + 'none' => "Ne Pas utiliser", + 'optional' => "Optionnel", + 'always' => "Toujours" + ); + $lang->about_use_ssl = "Si l'on choisit 'Optionnel' , on utilise protocole SSL seulement dans quelques services comme inscription ou modification. Si l'on choisit 'Toujours', on utilise protocole SSL dans tous les services."; + $lang->server_ports = "déclarer le port de serveur"; + $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"; + $lang->ftp_get_list = "Get List"; + $lang->ftp_remove_info = 'Remove FTP Info.'; + $lang->msg_ftp_invalid_path = 'Failed to read the specified FTP Path.'; + $lang->msg_self_restart_cache_engine = 'Please restart Memcached or cache daemon.'; + $lang->mobile_view = 'Use Mobile View'; + $lang->about_mobile_view = 'If accessing with a smartphone, display content with mobile layout.'; + $lang->autoinstall = 'EasyInstall'; + + $lang->last_week = 'Last week'; + $lang->this_week = 'This week'; +?> diff --git a/modules/admin/lang/jp.lang.php b/modules/admin/lang/jp.lang.php index e8faa66fe..aa1c8a744 100644 --- a/modules/admin/lang/jp.lang.php +++ b/modules/admin/lang/jp.lang.php @@ -1,93 +1,93 @@ -admin_info = '管理者情報'; - $lang->admin_index = '管理者トップページ'; - $lang->control_panel = 'コントロールパネル'; - $lang->start_module = '初期起動モジュール'; - $lang->about_start_module = 'デフォルトで起動するモジュールを指定することができます。'; - - $lang->module_category_title = array( - 'service' => 'サービス管理', - 'member' => '会員管理', - 'content' => 'コンテンツ管理', - 'statistics' => '統計確認', - 'construction' => 'サイト設定', - 'utility' => '機能設定', - 'interlock' => '連動設定', - 'accessory' => '付加機能設定', - 'migration' => 'データ管理/復元', - 'system' => 'システム管理', - ); - - $lang->newest_news = '最新ニュース'; - - $lang->env_setup = '環境設定'; - $lang->default_url = '基本URL'; - $lang->about_default_url = '複数のバーチャル(Virtual)サイトを運営する場合、どちらからログインしてもバーチャル(Virtual)サイトの間でログイン情報を維持出来るようにするためには、基本になるサイトでのXEをインストールしたurlを登録して下さい。 (例: http://ドメイン/インストールパス)'; - - - $lang->env_information = '環境情報'; - $lang->current_version = 'インストール済みバージョン'; - $lang->current_path = 'インストールパス'; - $lang->released_version = '最新バージョン'; - $lang->about_download_link = "新しいバージョンが配布されています。\n「ダウンロード」リンクをクリックするとダウンロード出来ます。"; - - $lang->item_module = 'モジュールリスト'; - $lang->item_addon = 'アドオンリスト'; - $lang->item_widget = 'ウィジェットリスト'; - $lang->item_layout = 'レイアウトリスト'; - - $lang->module_name = 'モジュール名'; - $lang->addon_name = 'アドオン名'; - $lang->version = 'バージョン'; - $lang->author = '制作者'; - $lang->table_count = 'テーブル数'; - $lang->installed_path = 'インストールパス'; - - $lang->cmd_shortcut_management = 'メニューの編集'; - - $lang->msg_is_not_administrator = '管理者のみアクセス出来ます'; - $lang->msg_manage_module_cannot_delete = 'モジュール、アドオン、ウィジェットのショットカットは削除出来ません。'; - $lang->msg_default_act_is_null = 'デフォルトの管理者のアクションが指定されていないため、ショットカットを登録することが出来ません。'; - - $lang->welcome_to_xe = 'XEの管理者ページです。'; - $lang->about_lang_env = '初めてサイトに訪問したユーザーに対し、上記の選択した言語でサイトを表示させるためには、必ず下記の「保存」ボタンをクリックして適用して下さい。'; - - $lang->xe_license = 'XEのライセンスはGPLです。'; - $lang->about_shortcut = 'よく使用するモジュールに登録されたショートカットは削除出来ます。'; - - $lang->yesterday = '昨日'; - $lang->today = '今日'; - - $lang->cmd_lang_select = '言語選択'; - $lang->about_cmd_lang_select = '選択した言語だけでサービスを行います。'; - $lang->about_recompile_cache = '要らないかごみのキャッシューファイルを整理します。'; - $lang->use_ssl = 'SSL環境設定'; - $lang->ssl_options = array( - 'none' => '使わない', - 'optional' => '部分的に使う', - 'always' => '常に使う' - ); - $lang->about_use_ssl = '「部分的に使う場合」は「会員登録/会員情報変更」など特定のactionでSSLを利用する場合、「常に使う」は全てのサービスがSSLを使う場合に選択します。'; - $lang->server_ports = 'サーバーポート指定'; - $lang->about_server_ports = '一般的に使われているHTTPの80、HTTPSの443以外の他のポートを使うために、ポートを指定して下さい。'; - $lang->use_db_session = 'DBで認証セッション管理'; - $lang->about_db_session = '認証の時に使われるPHPセッションをDBで使う機能です。
ウェブサーバーの負荷が低いサイトではこの機能をオフにすることでむしろサイトのレスポンスが向上されることもあります。
また、この機能をオンにすると、「現在ログイン中の会員」の機能が不可になります。'; - $lang->sftp = "SFTP使用"; - $lang->ftp_get_list = "ディレクトリ目録要請"; - $lang->ftp_remove_info = 'FTP情報削除'; - $lang->msg_ftp_invalid_path = '指定されたFTPパスへのアクセスに失敗しました。'; - $lang->msg_self_restart_cache_engine = 'メムキャッシュドまたはキャッシュデーモンを再起動して下さい。'; - $lang->mobile_view = 'モバイルスキン使用'; - $lang->about_mobile_view = 'スマート携帯などを通じてサイトに接続した場合、モバイル画面に最適化されたレイアウトを使用するように設定します。'; - - $lang->autoinstall = 'イージーインストール'; - - $lang->last_week = '先週'; - $lang->this_week = '今週'; -?> +admin_info = '管理者情報'; + $lang->admin_index = '管理者トップページ'; + $lang->control_panel = 'コントロールパネル'; + $lang->start_module = '初期起動モジュール'; + $lang->about_start_module = 'デフォルトで起動するモジュールを指定することができます。'; + + $lang->module_category_title = array( + 'service' => 'サービス管理', + 'member' => '会員管理', + 'content' => 'コンテンツ管理', + 'statistics' => '統計確認', + 'construction' => 'サイト設定', + 'utility' => '機能設定', + 'interlock' => '連動設定', + 'accessory' => '付加機能設定', + 'migration' => 'データ管理/復元', + 'system' => 'システム管理', + ); + + $lang->newest_news = '最新ニュース'; + + $lang->env_setup = '環境設定'; + $lang->default_url = '基本URL'; + $lang->about_default_url = '複数のバーチャル(Virtual)サイトを運営する場合、どちらからログインしてもバーチャル(Virtual)サイトの間でログイン情報を維持出来るようにするためには、基本になるサイトでのXEをインストールしたurlを登録して下さい。 (例: http://ドメイン/インストールパス)'; + + + $lang->env_information = '環境情報'; + $lang->current_version = 'インストール済みバージョン'; + $lang->current_path = 'インストールパス'; + $lang->released_version = '最新バージョン'; + $lang->about_download_link = "新しいバージョンが配布されています。\n「ダウンロード」リンクをクリックするとダウンロード出来ます。"; + + $lang->item_module = 'モジュールリスト'; + $lang->item_addon = 'アドオンリスト'; + $lang->item_widget = 'ウィジェットリスト'; + $lang->item_layout = 'レイアウトリスト'; + + $lang->module_name = 'モジュール名'; + $lang->addon_name = 'アドオン名'; + $lang->version = 'バージョン'; + $lang->author = '制作者'; + $lang->table_count = 'テーブル数'; + $lang->installed_path = 'インストールパス'; + + $lang->cmd_shortcut_management = 'メニューの編集'; + + $lang->msg_is_not_administrator = '管理者のみアクセス出来ます'; + $lang->msg_manage_module_cannot_delete = 'モジュール、アドオン、ウィジェットのショットカットは削除出来ません。'; + $lang->msg_default_act_is_null = 'デフォルトの管理者のアクションが指定されていないため、ショットカットを登録することが出来ません。'; + + $lang->welcome_to_xe = 'XEの管理者ページです。'; + $lang->about_lang_env = '初めてサイトに訪問したユーザーに対し、上記の選択した言語でサイトを表示させるためには、必ず下記の「保存」ボタンをクリックして適用して下さい。'; + + $lang->xe_license = 'XEのライセンスはGPLです。'; + $lang->about_shortcut = 'よく使用するモジュールに登録されたショートカットは削除出来ます。'; + + $lang->yesterday = '昨日'; + $lang->today = '今日'; + + $lang->cmd_lang_select = '言語選択'; + $lang->about_cmd_lang_select = '選択した言語だけでサービスを行います。'; + $lang->about_recompile_cache = '要らないかごみのキャッシューファイルを整理します。'; + $lang->use_ssl = 'SSL環境設定'; + $lang->ssl_options = array( + 'none' => '使わない', + 'optional' => '部分的に使う', + 'always' => '常に使う' + ); + $lang->about_use_ssl = '「部分的に使う場合」は「会員登録/会員情報変更」など特定のactionでSSLを利用する場合、「常に使う」は全てのサービスがSSLを使う場合に選択します。'; + $lang->server_ports = 'サーバーポート指定'; + $lang->about_server_ports = '一般的に使われているHTTPの80、HTTPSの443以外の他のポートを使うために、ポートを指定して下さい。'; + $lang->use_db_session = 'DBで認証セッション管理'; + $lang->about_db_session = '認証の時に使われるPHPセッションをDBで使う機能です。
ウェブサーバーの負荷が低いサイトではこの機能をオフにすることでむしろサイトのレスポンスが向上されることもあります。
また、この機能をオンにすると、「現在ログイン中の会員」の機能が不可になります。'; + $lang->sftp = "SFTP使用"; + $lang->ftp_get_list = "ディレクトリ目録要請"; + $lang->ftp_remove_info = 'FTP情報削除'; + $lang->msg_ftp_invalid_path = '指定されたFTPパスへのアクセスに失敗しました。'; + $lang->msg_self_restart_cache_engine = 'メムキャッシュドまたはキャッシュデーモンを再起動して下さい。'; + $lang->mobile_view = 'モバイルスキン使用'; + $lang->about_mobile_view = 'スマート携帯などを通じてサイトに接続した場合、モバイル画面に最適化されたレイアウトを使用するように設定します。'; + + $lang->autoinstall = 'イージーインストール'; + + $lang->last_week = '先週'; + $lang->this_week = '今週'; +?> diff --git a/modules/admin/lang/ko.lang.php b/modules/admin/lang/ko.lang.php index 04109ef36..46a2532f2 100644 --- a/modules/admin/lang/ko.lang.php +++ b/modules/admin/lang/ko.lang.php @@ -1,93 +1,93 @@ -admin_info = '관리자 정보'; - $lang->admin_index = '관리자 초기 페이지'; - $lang->control_panel = '제어판'; - $lang->start_module = '시작 모듈'; - $lang->about_start_module = '사이트 접속 시 기본으로 호출될 모듈을 지정할 수 있습니다.'; - - $lang->module_category_title = array( - 'service' => '서비스 관리', - 'member' => '회원 관리', - 'content' => '정보 관리', - 'statistics' => '통계 열람', - 'construction' => '사이트 설정', - 'utility' => '기능 설정', - 'interlock' => '연동 설정', - 'accessory' => '부가 기능 설정', - 'migration' => '데이터 관리/복원', - 'system' => '시스템 관리', - ); - - $lang->newest_news = '최신 소식'; - - $lang->env_setup = '환경 설정'; - $lang->default_url = '기본 URL'; - $lang->about_default_url = 'XE 가상 사이트(cafeXE 등)의 기능을 사용할 때 기본 URL을 입력하셔야 가상 사이트간 인증 연동이 되고 게시글, 모듈 등의 연결이 정상적으로 이루어집니다. (예: http://도메인/설치경로)'; - - - $lang->env_information = '환경 정보'; - $lang->current_version = '설치된 버전'; - $lang->current_path = '설치된 경로'; - $lang->released_version = '최신 버전'; - $lang->about_download_link = "최신 버전이 배포되었습니다.\ndownload 링크를 클릭하시면 다운 받으실 수 있습니다."; - - $lang->item_module = '모듈 목록'; - $lang->item_addon = '애드온 목록'; - $lang->item_widget = '위젯 목록'; - $lang->item_layout = '레이아웃 목록'; - - $lang->module_name = '모듈 이름'; - $lang->addon_name = '애드온 이름'; - $lang->version = '버전'; - $lang->author = '제작자'; - $lang->table_count = '테이블 수'; - $lang->installed_path = '설치 경로'; - - $lang->cmd_shortcut_management = '메뉴 편집하기'; - - $lang->msg_is_not_administrator = '관리자만 접속이 가능합니다.'; - $lang->msg_manage_module_cannot_delete = '모듈, 애드온, 레이아웃, 위젯 모듈의 바로가기는 삭제 불가능합니다.'; - $lang->msg_default_act_is_null = '기본 관리자 Action이 지정되어 있지 않아 바로가기 등록을 할 수 없습니다.'; - - $lang->welcome_to_xe = 'XE 관리자'; - $lang->about_lang_env = '처음 방문하는 사용자들의 언어 설정을 동일하게 하려면, 원하는 언어로 변경 후 아래 [저장] 버튼을 클릭하시면 됩니다.'; - - $lang->xe_license = 'XE는 GPL을 따릅니다.'; - $lang->about_shortcut = '자주 사용하는 모듈에 등록된 모듈의 바로가기를 삭제할 수 있습니다.'; - - $lang->yesterday = '어제'; - $lang->today = '오늘'; - - $lang->cmd_lang_select = '언어선택'; - $lang->about_cmd_lang_select = '선택된 언어들만 서비스 됩니다.'; - $lang->about_recompile_cache = '쓸모 없어졌거나 잘못된 캐시파일들을 정리할 수 있습니다.'; - $lang->use_ssl = 'SSL 사용'; - $lang->ssl_options = array( - 'none' => '사용 안함', - 'optional' => '선택적으로', - 'always' => '항상 사용' - ); - $lang->about_use_ssl = '\'선택적으로\'는 회원가입, 정보수정 등의 지정된 action에서 SSL을 사용하고 \'항상 사용\'은 모든 서비스에 SSL을 사용 합니다.'; - $lang->server_ports = '서버포트지정'; - $lang->about_server_ports = 'HTTP는 80, HTTPS는 443 이 아닌, 다른 포트를 사용할 경우에 포트를 지정해 주어야 합니다.'; - $lang->use_db_session = '인증 세션 DB 사용'; - $lang->about_db_session = '인증 시 사용되는 PHP 세션을 DB로 사용하는 기능입니다.
웹서버의 사용률이 낮은 사이트에서는 비활성화시 사이트 응답 속도가 향상될 수 있습니다.
단 현재 접속자를 구할 수 없어 관련된 기능을 사용할 수 없게 됩니다.'; - $lang->sftp = 'SFTP 사용'; - $lang->ftp_get_list = '목록 가져오기'; - $lang->ftp_remove_info = 'FTP 정보 삭제'; - $lang->msg_ftp_invalid_path = 'FTP Path를 읽을 수 없습니다.'; - $lang->msg_self_restart_cache_engine = 'Memcached 또는 캐쉬데몬을 재시작 해주세요.'; - $lang->mobile_view = '모바일 뷰 사용'; - $lang->about_mobile_view = '스마트폰 등을 이용하여 접속할 때 모바일 화면에 최적화된 레이아웃을 이용하도록 합니다.'; - - $lang->autoinstall = '쉬운 설치'; - - $lang->last_week = '지난 주'; - $lang->this_week = '이번 주'; -?> +admin_info = '관리자 정보'; + $lang->admin_index = '관리자 초기 페이지'; + $lang->control_panel = '제어판'; + $lang->start_module = '시작 모듈'; + $lang->about_start_module = '사이트 접속 시 기본으로 호출될 모듈을 지정할 수 있습니다.'; + + $lang->module_category_title = array( + 'service' => '서비스 관리', + 'member' => '회원 관리', + 'content' => '정보 관리', + 'statistics' => '통계 열람', + 'construction' => '사이트 설정', + 'utility' => '기능 설정', + 'interlock' => '연동 설정', + 'accessory' => '부가 기능 설정', + 'migration' => '데이터 관리/복원', + 'system' => '시스템 관리', + ); + + $lang->newest_news = '최신 소식'; + + $lang->env_setup = '환경 설정'; + $lang->default_url = '기본 URL'; + $lang->about_default_url = 'XE 가상 사이트(cafeXE 등)의 기능을 사용할 때 기본 URL을 입력하셔야 가상 사이트간 인증 연동이 되고 게시글, 모듈 등의 연결이 정상적으로 이루어집니다. (예: http://도메인/설치경로)'; + + + $lang->env_information = '환경 정보'; + $lang->current_version = '설치된 버전'; + $lang->current_path = '설치된 경로'; + $lang->released_version = '최신 버전'; + $lang->about_download_link = "최신 버전이 배포되었습니다.\ndownload 링크를 클릭하시면 다운 받으실 수 있습니다."; + + $lang->item_module = '모듈 목록'; + $lang->item_addon = '애드온 목록'; + $lang->item_widget = '위젯 목록'; + $lang->item_layout = '레이아웃 목록'; + + $lang->module_name = '모듈 이름'; + $lang->addon_name = '애드온 이름'; + $lang->version = '버전'; + $lang->author = '제작자'; + $lang->table_count = '테이블 수'; + $lang->installed_path = '설치 경로'; + + $lang->cmd_shortcut_management = '메뉴 편집하기'; + + $lang->msg_is_not_administrator = '관리자만 접속이 가능합니다.'; + $lang->msg_manage_module_cannot_delete = '모듈, 애드온, 레이아웃, 위젯 모듈의 바로가기는 삭제 불가능합니다.'; + $lang->msg_default_act_is_null = '기본 관리자 Action이 지정되어 있지 않아 바로가기 등록을 할 수 없습니다.'; + + $lang->welcome_to_xe = 'XE 관리자'; + $lang->about_lang_env = '처음 방문하는 사용자들의 언어 설정을 동일하게 하려면, 원하는 언어로 변경 후 아래 [저장] 버튼을 클릭하시면 됩니다.'; + + $lang->xe_license = 'XE는 GPL을 따릅니다.'; + $lang->about_shortcut = '자주 사용하는 모듈에 등록된 모듈의 바로가기를 삭제할 수 있습니다.'; + + $lang->yesterday = '어제'; + $lang->today = '오늘'; + + $lang->cmd_lang_select = '언어선택'; + $lang->about_cmd_lang_select = '선택된 언어들만 서비스 됩니다.'; + $lang->about_recompile_cache = '쓸모 없어졌거나 잘못된 캐시파일들을 정리할 수 있습니다.'; + $lang->use_ssl = 'SSL 사용'; + $lang->ssl_options = array( + 'none' => '사용 안함', + 'optional' => '선택적으로', + 'always' => '항상 사용' + ); + $lang->about_use_ssl = '\'선택적으로\'는 회원가입, 정보수정 등의 지정된 action에서 SSL을 사용하고 \'항상 사용\'은 모든 서비스에 SSL을 사용 합니다.'; + $lang->server_ports = '서버포트지정'; + $lang->about_server_ports = 'HTTP는 80, HTTPS는 443 이 아닌, 다른 포트를 사용할 경우에 포트를 지정해 주어야 합니다.'; + $lang->use_db_session = '인증 세션 DB 사용'; + $lang->about_db_session = '인증 시 사용되는 PHP 세션을 DB로 사용하는 기능입니다.
웹서버의 사용률이 낮은 사이트에서는 비활성화시 사이트 응답 속도가 향상될 수 있습니다.
단 현재 접속자를 구할 수 없어 관련된 기능을 사용할 수 없게 됩니다.'; + $lang->sftp = 'SFTP 사용'; + $lang->ftp_get_list = '목록 가져오기'; + $lang->ftp_remove_info = 'FTP 정보 삭제'; + $lang->msg_ftp_invalid_path = 'FTP Path를 읽을 수 없습니다.'; + $lang->msg_self_restart_cache_engine = 'Memcached 또는 캐쉬데몬을 재시작 해주세요.'; + $lang->mobile_view = '모바일 뷰 사용'; + $lang->about_mobile_view = '스마트폰 등을 이용하여 접속할 때 모바일 화면에 최적화된 레이아웃을 이용하도록 합니다.'; + + $lang->autoinstall = '쉬운 설치'; + + $lang->last_week = '지난 주'; + $lang->this_week = '이번 주'; +?> diff --git a/modules/admin/lang/ru.lang.php b/modules/admin/lang/ru.lang.php index 32d906621..bf250781e 100644 --- a/modules/admin/lang/ru.lang.php +++ b/modules/admin/lang/ru.lang.php @@ -1,91 +1,91 @@ -admin_info = 'Информация администратора'; - $lang->admin_index = 'Индексная страница администратора'; - $lang->control_panel = 'Контрольная панель'; - $lang->start_module = 'Стартовый модуль'; - $lang->about_start_module = 'Вы можете указать модуль запуска по умолчанию.'; - - $lang->module_category_title = array( - 'service' => 'Service Setting', - 'member' => 'Member Setting', - 'content' => 'Content Setting', - 'statistics' => 'Statistics', - 'construction' => 'Construction', - 'utility' => 'Utility Setting', - 'interlock' => 'Interlock Setting', - 'accessory' => 'Accessories', - 'migration' => 'Data Migration', - 'system' => 'System Setting', - ); - - $lang->newest_news = 'Последние новости'; - - $lang->env_setup = 'Настройка'; - $lang->default_url = 'Основной URL'; - $lang->about_default_url = 'If you use a virtual site feature (e.g., cafeXE), input default URL (parent-sites address), then SSO would be enabled, thus connection to documents/modules works properly'; - - $lang->env_information = 'Информация окружения'; - $lang->current_version = 'Текущая версия'; - $lang->current_path = 'Текущий путь'; - $lang->released_version = 'Последняя версия'; - $lang->about_download_link = 'Новая версия XE доступна.\nЧтобы скачать последнюю версию, нажмите ссылку закачки'; - - $lang->item_module = 'Список модулей'; - $lang->item_addon = 'Список аддонов'; - $lang->item_widget = 'Список виджетов'; - $lang->item_layout = 'Список лейаутов'; - - $lang->module_name = 'Имя модуля'; - $lang->addon_name = 'Имя аддона'; - $lang->version = 'Версия'; - $lang->author = 'Разработчик'; - $lang->table_count = 'Номер таблицы'; - $lang->installed_path = 'Путь установки'; - - $lang->cmd_shortcut_management = 'Редактировать меню'; - - $lang->msg_is_not_administrator = 'Только для администраторов!'; - $lang->msg_manage_module_cannot_delete = 'Ярлыки модулей, аддонов, лейаутов, виджетов не могут быть удалены'; - $lang->msg_default_act_is_null = 'Ярлык не может быть зарегистрирован, поскольку стандартное административное действие не установлено'; - - $lang->welcome_to_xe = 'Добро пожаловать на страницу администратора XE'; - $lang->about_lang_env = 'Чтобы применить выбранный язык для пользователей как страндартный, нажмите кнопку Сохранить [Save] после изменения'; - - $lang->xe_license = 'XE подчиняется Стандартной Общественной Лицензии GPL'; - $lang->about_shortcut = 'Вы можете удалить ярлыки модулей, зарегистрированных в списке часто используемых модулей'; - - $lang->yesterday = 'Вчера'; - $lang->today = 'Сегодня'; - - $lang->cmd_lang_select = 'Выбор языка'; - $lang->about_cmd_lang_select = 'Возможно использование только выбранных языков'; - $lang->about_recompile_cache = 'You can delete useless or invalid cache files'; - $lang->use_ssl = 'Использовать SSL'; - $lang->ssl_options = array( - 'none' => 'Никогда', - 'optional' => 'На выбор', - 'always' => 'Всегда' - ); - $lang->about_use_ssl = 'In case of "Optional", SSL will be used for actions such as signing up / changing information. And for "Always", your site will be served only via https'; - $lang->server_ports = 'Server Port'; - $lang->about_server_ports = 'If your web server does not use 80 for HTTP or 443 for HTTPS port, 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'; - $lang->ftp_get_list = 'Get List'; - $lang->ftp_remove_info = 'Remove FTP Info'; - $lang->msg_ftp_invalid_path = 'Failed to read the specified FTP Path.'; - $lang->msg_self_restart_cache_engine = 'Please restart Memcached or cache daemon.'; - $lang->mobile_view = 'Use Mobile View'; - $lang->about_mobile_view = 'If accessing with a smartphone, display content with mobile layout.'; - $lang->autoinstall = 'EasyInstall'; - - $lang->last_week = 'Last week'; - $lang->this_week = 'This week'; -?> +admin_info = 'Информация администратора'; + $lang->admin_index = 'Индексная страница администратора'; + $lang->control_panel = 'Контрольная панель'; + $lang->start_module = 'Стартовый модуль'; + $lang->about_start_module = 'Вы можете указать модуль запуска по умолчанию.'; + + $lang->module_category_title = array( + 'service' => 'Service Setting', + 'member' => 'Member Setting', + 'content' => 'Content Setting', + 'statistics' => 'Statistics', + 'construction' => 'Construction', + 'utility' => 'Utility Setting', + 'interlock' => 'Interlock Setting', + 'accessory' => 'Accessories', + 'migration' => 'Data Migration', + 'system' => 'System Setting', + ); + + $lang->newest_news = 'Последние новости'; + + $lang->env_setup = 'Настройка'; + $lang->default_url = 'Основной URL'; + $lang->about_default_url = 'If you use a virtual site feature (e.g., cafeXE), input default URL (parent-sites address), then SSO would be enabled, thus connection to documents/modules works properly'; + + $lang->env_information = 'Информация окружения'; + $lang->current_version = 'Текущая версия'; + $lang->current_path = 'Текущий путь'; + $lang->released_version = 'Последняя версия'; + $lang->about_download_link = 'Новая версия XE доступна.\nЧтобы скачать последнюю версию, нажмите ссылку закачки'; + + $lang->item_module = 'Список модулей'; + $lang->item_addon = 'Список аддонов'; + $lang->item_widget = 'Список виджетов'; + $lang->item_layout = 'Список лейаутов'; + + $lang->module_name = 'Имя модуля'; + $lang->addon_name = 'Имя аддона'; + $lang->version = 'Версия'; + $lang->author = 'Разработчик'; + $lang->table_count = 'Номер таблицы'; + $lang->installed_path = 'Путь установки'; + + $lang->cmd_shortcut_management = 'Редактировать меню'; + + $lang->msg_is_not_administrator = 'Только для администраторов!'; + $lang->msg_manage_module_cannot_delete = 'Ярлыки модулей, аддонов, лейаутов, виджетов не могут быть удалены'; + $lang->msg_default_act_is_null = 'Ярлык не может быть зарегистрирован, поскольку стандартное административное действие не установлено'; + + $lang->welcome_to_xe = 'Добро пожаловать на страницу администратора XE'; + $lang->about_lang_env = 'Чтобы применить выбранный язык для пользователей как страндартный, нажмите кнопку Сохранить [Save] после изменения'; + + $lang->xe_license = 'XE подчиняется Стандартной Общественной Лицензии GPL'; + $lang->about_shortcut = 'Вы можете удалить ярлыки модулей, зарегистрированных в списке часто используемых модулей'; + + $lang->yesterday = 'Вчера'; + $lang->today = 'Сегодня'; + + $lang->cmd_lang_select = 'Выбор языка'; + $lang->about_cmd_lang_select = 'Возможно использование только выбранных языков'; + $lang->about_recompile_cache = 'You can delete useless or invalid cache files'; + $lang->use_ssl = 'Использовать SSL'; + $lang->ssl_options = array( + 'none' => 'Никогда', + 'optional' => 'На выбор', + 'always' => 'Всегда' + ); + $lang->about_use_ssl = 'In case of "Optional", SSL will be used for actions such as signing up / changing information. And for "Always", your site will be served only via https'; + $lang->server_ports = 'Server Port'; + $lang->about_server_ports = 'If your web server does not use 80 for HTTP or 443 for HTTPS port, 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'; + $lang->ftp_get_list = 'Get List'; + $lang->ftp_remove_info = 'Remove FTP Info'; + $lang->msg_ftp_invalid_path = 'Failed to read the specified FTP Path.'; + $lang->msg_self_restart_cache_engine = 'Please restart Memcached or cache daemon.'; + $lang->mobile_view = 'Use Mobile View'; + $lang->about_mobile_view = 'If accessing with a smartphone, display content with mobile layout.'; + $lang->autoinstall = 'EasyInstall'; + + $lang->last_week = 'Last week'; + $lang->this_week = 'This week'; +?> diff --git a/modules/admin/lang/tr.lang.php b/modules/admin/lang/tr.lang.php index 5a887d3b5..c7f5e81a3 100644 --- a/modules/admin/lang/tr.lang.php +++ b/modules/admin/lang/tr.lang.php @@ -1,92 +1,92 @@ -admin_info = 'Yönetici Bilgisi'; - $lang->admin_index = 'Indeks Yönetici Sayfası'; - $lang->control_panel = 'Dashboard'; - $lang->start_module = 'Varsayılan Modül'; - $lang->about_start_module = 'Sitenin varsayılan modülünü belirleyebilirsiniz.'; - - $lang->module_category_title = array( - 'service' => 'Hizmetler', - 'member' => 'Yöneticiler', - 'content' => 'İçerikler', - 'statistics' => 'İstatistikler', - 'construction' => 'Yapı', - 'utility' => 'Yardımcı Uygulamalar', - 'interlock' => 'Gömülü', - 'accessory' => 'Donatılar', - 'migration' => 'Veri Geçişi', - 'system' => 'Sistem Ayarları', - ); - - $lang->newest_news = "Son Gelişmeler"; - - $lang->env_setup = "Ayarlar"; - $lang->default_url = "Varsayılan URL"; - $lang->about_default_url = "Eğer sanal site özelliği kullanıyorsanız (örneğin, cafeXE), varsayılan URL girdisini yapınız (üst-sitenin adresi), SSO etkinleştirilecektir, böylece belgelere/modüllere sağlanan bağlantı uygun bir şekilde çalışacaktır. "; - - $lang->env_information = "Ortam Bilgisi"; - $lang->current_version = "Güncel Sürüm"; - $lang->current_path = "Yükleme Yolu"; - $lang->released_version = "Son Sürüm"; - $lang->about_download_link = "Zeroboard XE'nin yeni sürümü yayımlandı!\nLütfen son sürümü için indirme linkine tıklayınız."; - - $lang->item_module = "Modül Listesi"; - $lang->item_addon = "Eklenti Listesi"; - $lang->item_widget = "Widget Listesi"; - $lang->item_layout = "Yerleşim Düzeni Listesi"; - - $lang->module_name = "Modül İsmi"; - $lang->addon_name = "Eklenti İsmi"; - $lang->version = "Sürüm"; - $lang->author = "Geliştirici"; - $lang->table_count = "Tablo Numarası"; - $lang->installed_path = "Yükleme Yolu"; - - $lang->cmd_shortcut_management = "Menü Düzenle"; - - $lang->msg_is_not_administrator = 'Sadece Yöneticiler'; - $lang->msg_manage_module_cannot_delete = 'Modüllerin, eklentilerin, yerleşim düzenlerinin, widgetların kısayolları silinemez.'; - $lang->msg_default_act_is_null = 'Kısayol varsayılan yönetici eylemi ayarlanmadığından kayıt edilemiyor.'; - - $lang->welcome_to_xe = 'XE Yönetici Sayfasına Hoşgeldiniz'; - $lang->about_admin_page = "Yönetici sayfası hâla geliştirilmektedir,\nClosebeta sürecinde birçok iyi öneriyi kabul ederek gerekli içerikleri ekleyeceğiz."; - $lang->about_lang_env = "Seçilen dili varsayılan dil olarak uygulamak için, lütfen Kaydet tuşuna basınız."; - - $lang->xe_license = 'XE GPL ile uyumludur'; - $lang->about_shortcut = 'Sık kullanılan modüller listesine kaydedilmiş modüllerin kısayollarını silebilirsiniz.'; - - $lang->yesterday = "Dün"; - $lang->today = "Bugün"; - - $lang->cmd_lang_select = "Dil"; - $lang->about_cmd_lang_select = "Sadece seçili dillerde hizmet verecektir."; - $lang->about_recompile_cache = "Gereksiz veya geçersiz önbellek dosyalarını silebilirsiniz."; - $lang->use_ssl = "SSL Kullan"; - $lang->ssl_options = array( - 'none' => "Hiçbir zaman", - 'optional' => "İsteğe Bağlı", - 'always' => "Her zaman" - ); - $lang->about_use_ssl = "'İsteği Bağlı' seçiminde; SSL, kayıt olma/bilgi değiştirme gibi eylemler için kullanılacaktır. 'Her zaman' seçiminde, siteniz sadece http yoluyla hizmet verecektir."; - $lang->server_ports = "Sunucu Bağlantı Noktası (port)"; - $lang->about_server_ports = "Eğer web sunucunuz, HTTP bağlantı noktaları için 80 ya da HTTPS 443 portunu kullanmıyorsa, sunucu bağlantı noktalarını belirtmeniz gerekmektedir."; - $lang->use_db_session = 'Oturum Veritabanı Kullanımı'; - $lang->about_db_session = 'Yetersiz web sunucusu kullanımı olan websiteleri için, bu özellik devredışı bırakıldığı zaman daha hızlı bir tepki beklenebilir.
Ancak oturum veritabanı, mevcut kullanıcılar için veritabanını erişilemez hâle getirecektir ve ilgili işler kullanılamaz hale gelecektir.'; - $lang->sftp = "SFTP Kullan"; - $lang->ftp_get_list = "Listeyi Al"; - $lang->ftp_remove_info = 'FTP Bilgisini Sil.'; - $lang->msg_ftp_invalid_path = 'Belirtilen FTP Yolunu okuma işlemi başarız oldu.'; - $lang->msg_self_restart_cache_engine = 'Lütfen önbellek geri plan yordamını veya Memcached\' ı yeniden başlatınız.'; - $lang->mobile_view = 'Hareketli Görünümü'; - $lang->about_mobile_view = 'Hareketli görünümü, mobil cihazlarla giriş yapılırken, mobil cihazlara uygun en iyi yerleşim düzenini göstermek içindir.'; - $lang->autoinstall = 'KolayKurulum'; - - $lang->last_week = 'Geçen Hafta'; - $lang->this_week = 'Bu Hafta'; -?> +admin_info = 'Yönetici Bilgisi'; + $lang->admin_index = 'Indeks Yönetici Sayfası'; + $lang->control_panel = 'Dashboard'; + $lang->start_module = 'Varsayılan Modül'; + $lang->about_start_module = 'Sitenin varsayılan modülünü belirleyebilirsiniz.'; + + $lang->module_category_title = array( + 'service' => 'Hizmetler', + 'member' => 'Yöneticiler', + 'content' => 'İçerikler', + 'statistics' => 'İstatistikler', + 'construction' => 'Yapı', + 'utility' => 'Yardımcı Uygulamalar', + 'interlock' => 'Gömülü', + 'accessory' => 'Donatılar', + 'migration' => 'Veri Geçişi', + 'system' => 'Sistem Ayarları', + ); + + $lang->newest_news = "Son Gelişmeler"; + + $lang->env_setup = "Ayarlar"; + $lang->default_url = "Varsayılan URL"; + $lang->about_default_url = "Eğer sanal site özelliği kullanıyorsanız (örneğin, cafeXE), varsayılan URL girdisini yapınız (üst-sitenin adresi), SSO etkinleştirilecektir, böylece belgelere/modüllere sağlanan bağlantı uygun bir şekilde çalışacaktır. "; + + $lang->env_information = "Ortam Bilgisi"; + $lang->current_version = "Güncel Sürüm"; + $lang->current_path = "Yükleme Yolu"; + $lang->released_version = "Son Sürüm"; + $lang->about_download_link = "Zeroboard XE'nin yeni sürümü yayımlandı!\nLütfen son sürümü için indirme linkine tıklayınız."; + + $lang->item_module = "Modül Listesi"; + $lang->item_addon = "Eklenti Listesi"; + $lang->item_widget = "Widget Listesi"; + $lang->item_layout = "Yerleşim Düzeni Listesi"; + + $lang->module_name = "Modül İsmi"; + $lang->addon_name = "Eklenti İsmi"; + $lang->version = "Sürüm"; + $lang->author = "Geliştirici"; + $lang->table_count = "Tablo Numarası"; + $lang->installed_path = "Yükleme Yolu"; + + $lang->cmd_shortcut_management = "Menü Düzenle"; + + $lang->msg_is_not_administrator = 'Sadece Yöneticiler'; + $lang->msg_manage_module_cannot_delete = 'Modüllerin, eklentilerin, yerleşim düzenlerinin, widgetların kısayolları silinemez.'; + $lang->msg_default_act_is_null = 'Kısayol varsayılan yönetici eylemi ayarlanmadığından kayıt edilemiyor.'; + + $lang->welcome_to_xe = 'XE Yönetici Sayfasına Hoşgeldiniz'; + $lang->about_admin_page = "Yönetici sayfası hâla geliştirilmektedir,\nClosebeta sürecinde birçok iyi öneriyi kabul ederek gerekli içerikleri ekleyeceğiz."; + $lang->about_lang_env = "Seçilen dili varsayılan dil olarak uygulamak için, lütfen Kaydet tuşuna basınız."; + + $lang->xe_license = 'XE GPL ile uyumludur'; + $lang->about_shortcut = 'Sık kullanılan modüller listesine kaydedilmiş modüllerin kısayollarını silebilirsiniz.'; + + $lang->yesterday = "Dün"; + $lang->today = "Bugün"; + + $lang->cmd_lang_select = "Dil"; + $lang->about_cmd_lang_select = "Sadece seçili dillerde hizmet verecektir."; + $lang->about_recompile_cache = "Gereksiz veya geçersiz önbellek dosyalarını silebilirsiniz."; + $lang->use_ssl = "SSL Kullan"; + $lang->ssl_options = array( + 'none' => "Hiçbir zaman", + 'optional' => "İsteğe Bağlı", + 'always' => "Her zaman" + ); + $lang->about_use_ssl = "'İsteği Bağlı' seçiminde; SSL, kayıt olma/bilgi değiştirme gibi eylemler için kullanılacaktır. 'Her zaman' seçiminde, siteniz sadece http yoluyla hizmet verecektir."; + $lang->server_ports = "Sunucu Bağlantı Noktası (port)"; + $lang->about_server_ports = "Eğer web sunucunuz, HTTP bağlantı noktaları için 80 ya da HTTPS 443 portunu kullanmıyorsa, sunucu bağlantı noktalarını belirtmeniz gerekmektedir."; + $lang->use_db_session = 'Oturum Veritabanı Kullanımı'; + $lang->about_db_session = 'Yetersiz web sunucusu kullanımı olan websiteleri için, bu özellik devredışı bırakıldığı zaman daha hızlı bir tepki beklenebilir.
Ancak oturum veritabanı, mevcut kullanıcılar için veritabanını erişilemez hâle getirecektir ve ilgili işler kullanılamaz hale gelecektir.'; + $lang->sftp = "SFTP Kullan"; + $lang->ftp_get_list = "Listeyi Al"; + $lang->ftp_remove_info = 'FTP Bilgisini Sil.'; + $lang->msg_ftp_invalid_path = 'Belirtilen FTP Yolunu okuma işlemi başarız oldu.'; + $lang->msg_self_restart_cache_engine = 'Lütfen önbellek geri plan yordamını veya Memcached\' ı yeniden başlatınız.'; + $lang->mobile_view = 'Hareketli Görünümü'; + $lang->about_mobile_view = 'Hareketli görünümü, mobil cihazlarla giriş yapılırken, mobil cihazlara uygun en iyi yerleşim düzenini göstermek içindir.'; + $lang->autoinstall = 'KolayKurulum'; + + $lang->last_week = 'Geçen Hafta'; + $lang->this_week = 'Bu Hafta'; +?> diff --git a/modules/admin/lang/vi.lang.php b/modules/admin/lang/vi.lang.php index 22cba1de4..15ee2774c 100644 --- a/modules/admin/lang/vi.lang.php +++ b/modules/admin/lang/vi.lang.php @@ -1,95 +1,95 @@ -admin_info = 'Thông tin Administrator'; - $lang->admin_index = 'Trang chủ Admin'; - $lang->control_panel = 'Bảng điều khiển'; - $lang->start_module = 'Module trang chủ'; - $lang->about_start_module = 'Bạn có thể chọn một Module và đặt là trang chủ của Website.'; - - $lang->module_category_title = array( - 'service' => 'Thiết lập dịch vụ', - 'member' => 'Thiết lập thành viên', - 'content' => 'Thiết lập nội dung', - 'statistics' => 'Thống kê', - 'construction' => 'Xây dựng giao diện', - 'utility' => 'Thiết lập tiện ích', - 'interlock' => 'Tiện ích nâng cao', - 'accessory' => 'Dịch vụ phụ', - 'migration' => 'Chuyển đổi dữ liệu', - 'system' => 'Thiết lập hệ thống', - ); - - $lang->newest_news = "Tin mới nhất"; - - $lang->env_setup = "Thiết lập "; - $lang->default_url = "URL mặc định"; - $lang->about_default_url = "Nếu bạn sử dụng tính năng trang Web ảo (Ví dụ: PlanetXE, cafeXE), hãy chọn URL mặc định (địa chỉ trang chủ), khi khi kích hoạt SSO với thư mục hay Module làm việc."; - - $lang->env_information = "Thông tin"; - $lang->current_version = "Phiên bản"; - $lang->current_path = "Thư mục cài đặt"; - $lang->released_version = "Phiên bản mới nhất"; - $lang->about_download_link = "Đã có phiên bản mới nhất của XE.\n Hãy bấm vào Link để Download."; - - $lang->item_module = "Danh sách Module"; - $lang->item_addon = "Danh sách Addon"; - $lang->item_widget = "Danh sách Widget"; - $lang->item_layout = "Danh sách Layout"; - - $lang->module_name = "Tên Module"; - $lang->addon_name = "Tên Addon"; - $lang->version = "Phiên bản"; - $lang->author = "Thiết kế"; - $lang->table_count = "Table"; - $lang->installed_path = "Thư mục đã cài đặt"; - - $lang->cmd_shortcut_management = "Sửa Menu"; - - $lang->msg_is_not_administrator = 'Dành riêng Administrator'; - $lang->msg_manage_module_cannot_delete = 'Không thể xóa những phím tắt của Module, Addon, Layout, Widget.'; - $lang->msg_default_act_is_null = 'Phím tắt đã không được tạo, bởi vì bạn không được đặt quyền là quản lý toàn diện.'; - - $lang->welcome_to_xe = 'Chào mừng bạn đến với trang quản lý của XE!'; - $lang->about_admin_page = "Trang Admin này vẫn đang được phát triển,\n Chúng tôi sẽ thêm vào những nội dung chủ yếu từ những ý kiến của người sử dụng."; - $lang->about_lang_env = "Để hiển thị ngôn ngữ đã chọn là mặc định. Hãy bấm [Lưu] phía dưới để lưu lại."; - - $lang->xe_license = 'XE sử dụng giấy phép GPL'; - $lang->about_shortcut = 'Bạn có thể loại bỏ phím tắt của Module được sử dụng thường xuyên trên danh sách.'; - - $lang->yesterday = "Hôm qua"; - $lang->today = "Hôm nay"; - - $lang->cmd_lang_select = "Ngôn ngữ"; - $lang->about_cmd_lang_select = "Chỉ chọn được những ngôn ngữ có sẵn."; - $lang->about_recompile_cache = "Bạn có thể sắp xếp lại File Cache cho những việc đã làm hoặc bị lỗi."; - $lang->use_ssl = "Sử dụng SSL"; - $lang->ssl_options = array( - 'none' => "Không sử dụng", - 'optional' => "Tùy chỉnh", - 'always' => "Luôn luôn" - ); - $lang->about_use_ssl = "Nếu bạn chọn 'Tùy chỉnh', SSL sẽ sử dụng và những công việc như đăng kí, sửa thông tin thành viên, .
Chỉ chọn 'Luôn luôn' khi Website của bạn đang chạy trên Server có hỗ trợ https."; - $lang->server_ports = "Cổng kết nối"; - $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 = "Sử dụng SFTP"; - $lang->ftp_get_list = "Nhận danh sách"; - $lang->ftp_remove_info = 'Xóa thông tin FTP.'; - $lang->msg_ftp_invalid_path = 'Không tìm thấy thông tin của thư mục bạn đã nhập trên FTP.'; - $lang->msg_self_restart_cache_engine = 'Hãy thiết lập lại bộ nhớ Cache hoặc Deamon Cache.'; - $lang->mobile_view = 'Xem bằng di động'; - $lang->about_mobile_view = 'Nếu truy cập bằng thiết bị di động, nội dung sẽ được bố trí theo từng loại thiết bị.'; - $lang->autoinstall = 'Cập nhật tự động'; - - $lang->last_week = 'Last week'; - $lang->this_week = 'This week'; -?> +admin_info = 'Thông tin Administrator'; + $lang->admin_index = 'Trang chủ Admin'; + $lang->control_panel = 'Bảng điều khiển'; + $lang->start_module = 'Module trang chủ'; + $lang->about_start_module = 'Bạn có thể chọn một Module và đặt là trang chủ của Website.'; + + $lang->module_category_title = array( + 'service' => 'Thiết lập dịch vụ', + 'member' => 'Thiết lập thành viên', + 'content' => 'Thiết lập nội dung', + 'statistics' => 'Thống kê', + 'construction' => 'Xây dựng giao diện', + 'utility' => 'Thiết lập tiện ích', + 'interlock' => 'Tiện ích nâng cao', + 'accessory' => 'Dịch vụ phụ', + 'migration' => 'Chuyển đổi dữ liệu', + 'system' => 'Thiết lập hệ thống', + ); + + $lang->newest_news = "Tin mới nhất"; + + $lang->env_setup = "Thiết lập "; + $lang->default_url = "URL mặc định"; + $lang->about_default_url = "Nếu bạn sử dụng tính năng trang Web ảo (Ví dụ: PlanetXE, cafeXE), hãy chọn URL mặc định (địa chỉ trang chủ), khi khi kích hoạt SSO với thư mục hay Module làm việc."; + + $lang->env_information = "Thông tin"; + $lang->current_version = "Phiên bản"; + $lang->current_path = "Thư mục cài đặt"; + $lang->released_version = "Phiên bản mới nhất"; + $lang->about_download_link = "Đã có phiên bản mới nhất của XE.\n Hãy bấm vào Link để Download."; + + $lang->item_module = "Danh sách Module"; + $lang->item_addon = "Danh sách Addon"; + $lang->item_widget = "Danh sách Widget"; + $lang->item_layout = "Danh sách Layout"; + + $lang->module_name = "Tên Module"; + $lang->addon_name = "Tên Addon"; + $lang->version = "Phiên bản"; + $lang->author = "Thiết kế"; + $lang->table_count = "Table"; + $lang->installed_path = "Thư mục đã cài đặt"; + + $lang->cmd_shortcut_management = "Sửa Menu"; + + $lang->msg_is_not_administrator = 'Dành riêng Administrator'; + $lang->msg_manage_module_cannot_delete = 'Không thể xóa những phím tắt của Module, Addon, Layout, Widget.'; + $lang->msg_default_act_is_null = 'Phím tắt đã không được tạo, bởi vì bạn không được đặt quyền là quản lý toàn diện.'; + + $lang->welcome_to_xe = 'Chào mừng bạn đến với trang quản lý của XE!'; + $lang->about_admin_page = "Trang Admin này vẫn đang được phát triển,\n Chúng tôi sẽ thêm vào những nội dung chủ yếu từ những ý kiến của người sử dụng."; + $lang->about_lang_env = "Để hiển thị ngôn ngữ đã chọn là mặc định. Hãy bấm [Lưu] phía dưới để lưu lại."; + + $lang->xe_license = 'XE sử dụng giấy phép GPL'; + $lang->about_shortcut = 'Bạn có thể loại bỏ phím tắt của Module được sử dụng thường xuyên trên danh sách.'; + + $lang->yesterday = "Hôm qua"; + $lang->today = "Hôm nay"; + + $lang->cmd_lang_select = "Ngôn ngữ"; + $lang->about_cmd_lang_select = "Chỉ chọn được những ngôn ngữ có sẵn."; + $lang->about_recompile_cache = "Bạn có thể sắp xếp lại File Cache cho những việc đã làm hoặc bị lỗi."; + $lang->use_ssl = "Sử dụng SSL"; + $lang->ssl_options = array( + 'none' => "Không sử dụng", + 'optional' => "Tùy chỉnh", + 'always' => "Luôn luôn" + ); + $lang->about_use_ssl = "Nếu bạn chọn 'Tùy chỉnh', SSL sẽ sử dụng và những công việc như đăng kí, sửa thông tin thành viên, .
Chỉ chọn 'Luôn luôn' khi Website của bạn đang chạy trên Server có hỗ trợ https."; + $lang->server_ports = "Cổng kết nối"; + $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 = "Sử dụng SFTP"; + $lang->ftp_get_list = "Nhận danh sách"; + $lang->ftp_remove_info = 'Xóa thông tin FTP.'; + $lang->msg_ftp_invalid_path = 'Không tìm thấy thông tin của thư mục bạn đã nhập trên FTP.'; + $lang->msg_self_restart_cache_engine = 'Hãy thiết lập lại bộ nhớ Cache hoặc Deamon Cache.'; + $lang->mobile_view = 'Xem bằng di động'; + $lang->about_mobile_view = 'Nếu truy cập bằng thiết bị di động, nội dung sẽ được bố trí theo từng loại thiết bị.'; + $lang->autoinstall = 'Cập nhật tự động'; + + $lang->last_week = 'Last week'; + $lang->this_week = 'This week'; +?> diff --git a/modules/admin/lang/zh-CN.lang.php b/modules/admin/lang/zh-CN.lang.php index 4112797e7..c5afe80a8 100644 --- a/modules/admin/lang/zh-CN.lang.php +++ b/modules/admin/lang/zh-CN.lang.php @@ -1,92 +1,92 @@ -admin_info = '管理员信息'; - $lang->admin_index = '管理首页'; - $lang->control_panel = '控制面板'; - $lang->start_module = '首页模块'; - $lang->about_start_module = '可指定用户访问网站时的默认首页模块。'; - - $lang->module_category_title = array( - 'service' => '应用管理', - 'member' => '用户管理', - 'content' => '资源管理', - 'statistics' => '统计管理', - 'construction' => '界面管理', - 'utility' => '扩展管理', - 'interlock' => '辅助联动', - 'accessory' => '附加功能', - 'migration' => '数据导入', - 'system' => '系统管理', - ); - - $lang->newest_news = "最新消息"; - - $lang->env_setup = "系统设置"; - $lang->default_url = "XE通行证"; - $lang->about_default_url = "请输入默认站点的XE安装地址(ex: http://域名/xe)。
说明:简单的说,就是绑定帐号系统。只需要登录一次,就可以在用站点模块生成的多个子站点中随意漫游。"; - - - $lang->env_information = "系统信息"; - $lang->current_version = "安装版本"; - $lang->current_path = "安装路径"; - $lang->released_version = "最新版本"; - $lang->about_download_link = "官方网站已发布最新版本XE。\n请点击[下载]链接下载最新版本。"; - - $lang->item_module = "模块目录"; - $lang->item_addon = "插件目录"; - $lang->item_widget = "控件目录"; - $lang->item_layout = "布局目录"; - - $lang->module_name = "模块名称"; - $lang->addon_name = "插件名称"; - $lang->version = "版本"; - $lang->author = "作者"; - $lang->table_count = "表格数"; - $lang->installed_path = "安装路径"; - - $lang->cmd_shortcut_management = "编辑菜单"; - - $lang->msg_is_not_administrator = '只允许管理员访问'; - $lang->msg_manage_module_cannot_delete = '模块,插件,布局,控件模块的快捷菜单是不能删除的。'; - $lang->msg_default_act_is_null = '没有指定默认管理员的动作,是不能添加到快捷菜单的。'; - - $lang->welcome_to_xe = 'XE 管理页面'; - $lang->about_lang_env = "可以设置显示给首次访问者的同一语言环境。修改语言环境后请点击 [保存] 按钮进行保存。"; - - $lang->xe_license = 'XE遵循 GPL协议'; - $lang->about_shortcut = '可以删除添加到常用模块中的快捷菜单。'; - - $lang->yesterday = "Yesterday"; - $lang->today = "Today"; - - $lang->cmd_lang_select = "多国语言支持"; - $lang->about_cmd_lang_select = "请选择要使用的语言。"; - $lang->about_recompile_cache = "整理无用的或错误的缓冲文件。"; - $lang->use_ssl = "SSL使用"; - $lang->ssl_options = array( - 'none' => "不使用", - 'optional' => "选择性", - 'always' => "使用" - ); - $lang->about_use_ssl = "选择性使用选项应用于新用户注册/修改用户信息等已指定的action当中,使用选项应用于所有服务。"; - $lang->server_ports = "指定服务器端口"; - $lang->about_server_ports = "使用除HTTP(80), HTTPS(443)以外的端口时,必须得指定该服务器端口号。"; - $lang->use_db_session = 'DB储存认证会话'; - $lang->about_db_session = '用DB储存认证时的PHP会话。
服务器使用率较少的网站建议不要勾选此项(可提高网站访问速度)。
只是无法统计在线会员。'; - $lang->sftp = '使用sSFTP'; - $lang->ftp_get_list = '载入列表'; - $lang->ftp_remove_info = '删除FTP信息'; - $lang->msg_ftp_invalid_path = '无法读取FTP路径。'; - $lang->msg_self_restart_cache_engine = '请重新启动Memcached或CacheDaemon。'; - $lang->mobile_view = '开启移动版'; - $lang->about_mobile_view = '为智能手机访问网站,提供最佳视觉效果。'; - $lang->autoinstall = '安装·更新'; - - $lang->last_week = 'Last week'; - $lang->this_week = 'This week'; -?> +admin_info = '管理员信息'; + $lang->admin_index = '管理首页'; + $lang->control_panel = '控制面板'; + $lang->start_module = '首页模块'; + $lang->about_start_module = '可指定用户访问网站时的默认首页模块。'; + + $lang->module_category_title = array( + 'service' => '应用管理', + 'member' => '用户管理', + 'content' => '资源管理', + 'statistics' => '统计管理', + 'construction' => '界面管理', + 'utility' => '扩展管理', + 'interlock' => '辅助联动', + 'accessory' => '附加功能', + 'migration' => '数据导入', + 'system' => '系统管理', + ); + + $lang->newest_news = "最新消息"; + + $lang->env_setup = "系统设置"; + $lang->default_url = "XE通行证"; + $lang->about_default_url = "请输入默认站点的XE安装地址(ex: http://域名/xe)。
说明:简单的说,就是绑定帐号系统。只需要登录一次,就可以在用站点模块生成的多个子站点中随意漫游。"; + + + $lang->env_information = "系统信息"; + $lang->current_version = "安装版本"; + $lang->current_path = "安装路径"; + $lang->released_version = "最新版本"; + $lang->about_download_link = "官方网站已发布最新版本XE。\n请点击[下载]链接下载最新版本。"; + + $lang->item_module = "模块目录"; + $lang->item_addon = "插件目录"; + $lang->item_widget = "控件目录"; + $lang->item_layout = "布局目录"; + + $lang->module_name = "模块名称"; + $lang->addon_name = "插件名称"; + $lang->version = "版本"; + $lang->author = "作者"; + $lang->table_count = "表格数"; + $lang->installed_path = "安装路径"; + + $lang->cmd_shortcut_management = "编辑菜单"; + + $lang->msg_is_not_administrator = '只允许管理员访问'; + $lang->msg_manage_module_cannot_delete = '模块,插件,布局,控件模块的快捷菜单是不能删除的。'; + $lang->msg_default_act_is_null = '没有指定默认管理员的动作,是不能添加到快捷菜单的。'; + + $lang->welcome_to_xe = 'XE 管理页面'; + $lang->about_lang_env = "可以设置显示给首次访问者的同一语言环境。修改语言环境后请点击 [保存] 按钮进行保存。"; + + $lang->xe_license = 'XE遵循 GPL协议'; + $lang->about_shortcut = '可以删除添加到常用模块中的快捷菜单。'; + + $lang->yesterday = "Yesterday"; + $lang->today = "Today"; + + $lang->cmd_lang_select = "多国语言支持"; + $lang->about_cmd_lang_select = "请选择要使用的语言。"; + $lang->about_recompile_cache = "整理无用的或错误的缓冲文件。"; + $lang->use_ssl = "SSL使用"; + $lang->ssl_options = array( + 'none' => "不使用", + 'optional' => "选择性", + 'always' => "使用" + ); + $lang->about_use_ssl = "选择性使用选项应用于新用户注册/修改用户信息等已指定的action当中,使用选项应用于所有服务。"; + $lang->server_ports = "指定服务器端口"; + $lang->about_server_ports = "使用除HTTP(80), HTTPS(443)以外的端口时,必须得指定该服务器端口号。"; + $lang->use_db_session = 'DB储存认证会话'; + $lang->about_db_session = '用DB储存认证时的PHP会话。
服务器使用率较少的网站建议不要勾选此项(可提高网站访问速度)。
只是无法统计在线会员。'; + $lang->sftp = '使用sSFTP'; + $lang->ftp_get_list = '载入列表'; + $lang->ftp_remove_info = '删除FTP信息'; + $lang->msg_ftp_invalid_path = '无法读取FTP路径。'; + $lang->msg_self_restart_cache_engine = '请重新启动Memcached或CacheDaemon。'; + $lang->mobile_view = '开启移动版'; + $lang->about_mobile_view = '为智能手机访问网站,提供最佳视觉效果。'; + $lang->autoinstall = '安装·更新'; + + $lang->last_week = 'Last week'; + $lang->this_week = 'This week'; +?> diff --git a/modules/admin/lang/zh-TW.lang.php b/modules/admin/lang/zh-TW.lang.php index 7c3f39d46..80cae5742 100644 --- a/modules/admin/lang/zh-TW.lang.php +++ b/modules/admin/lang/zh-TW.lang.php @@ -1,92 +1,92 @@ -admin_info = '管理員資訊'; - $lang->admin_index = '管理頁面'; - $lang->control_panel = '控制介面'; - $lang->start_module = '預設首頁'; - $lang->about_start_module = '可將所選擇的模組作為預設首頁。'; - - $lang->module_category_title = array( - 'service' => '服務設定', - 'member' => '會員管理', - 'content' => '內容管理', - 'statistics' => '統計資料', - 'construction' => '界面設定', - 'utility' => '擴充功能', - 'interlock' => '連動設定', - 'accessory' => '附加功能管理', - 'migration' => '資料轉換', - 'system' => '系統管理', - ); - - $lang->newest_news = "最新消息"; - - $lang->env_setup = "系統設置"; - $lang->default_url = "預設網址"; - $lang->about_default_url = "XE虛擬網站必須要先輸入預設的網址確保虛擬網站的運作,請輸入預設程式安裝路徑。
(例: http://網域名稱/安裝路徑)"; - - - $lang->env_information = "系統資訊"; - $lang->current_version = "安裝版本"; - $lang->current_path = "安裝路徑"; - $lang->released_version = "最新版本"; - $lang->about_download_link = "官方網站已發佈最新版本。\n請按[下載]下載最新版本。"; - - $lang->item_module = "模組列表"; - $lang->item_addon = "元件列表"; - $lang->item_widget = "Widget列表"; - $lang->item_layout = "版面列表"; - - $lang->module_name = "模組名稱"; - $lang->addon_name = "元件名稱"; - $lang->version = "版本"; - $lang->author = "作者"; - $lang->table_count = "表格數"; - $lang->installed_path = "安裝路徑"; - - $lang->cmd_shortcut_management = "編輯選單"; - - $lang->msg_is_not_administrator = '只有管理員才可以檢視'; - $lang->msg_manage_module_cannot_delete = '模組,附加元件,版面設計,Widget的快速選單是無法刪除的。'; - $lang->msg_default_act_is_null = '沒有指定預設管理員的動作,是無法新增到快速選單的。'; - - $lang->welcome_to_xe = 'XE管理頁面'; - $lang->about_lang_env = "請選擇預設語言。選擇完畢後,請按[儲存]按鈕。"; - - $lang->xe_license = 'XE遵循 GPL 協議'; - $lang->about_shortcut = '可以刪除新增到常用模組中的快速選單。'; - - $lang->yesterday = "昨天"; - $lang->today = "今天"; - - $lang->cmd_lang_select = "選擇語言"; - $lang->about_cmd_lang_select = "只提供所選擇的語言服務"; - $lang->about_recompile_cache = "可有效的整理錯誤的暫存檔"; - $lang->use_ssl = "SSL功能"; - $lang->ssl_options = array( - 'none' => "關閉", - 'optional' => "手動", - 'always' => "開啟" - ); - $lang->about_use_ssl = "選擇手動時,在會員註冊或修改資料等動作時才會使用 SSL 功能。
選擇開啟時,所有的服務都會使用 SSL 功能。"; - $lang->server_ports = "主機埠口"; - $lang->about_server_ports = "HTTP、HTTPS預設埠口分別是『80』、『443』
如果想使用其他的埠口的話,請自行設定。"; - $lang->use_db_session = 'DB session認證'; - $lang->about_db_session = '使用 PHP session 進行 DB 認證。
關閉此功能對於負荷較低的網站可提高效率。
使用此功能會無法統計線上人數。'; - $lang->sftp = "使用 SFTP"; - $lang->ftp_get_list = "取得列表"; - $lang->ftp_remove_info = '移除 FTP 資料'; - $lang->msg_ftp_invalid_path = '指定的 FTP 路徑讀取失敗。'; - $lang->msg_self_restart_cache_engine = '請重新啟動 Memcached 快取程式。'; - $lang->mobile_view = '手機瀏覽'; - $lang->about_mobile_view = '使用手機瀏覽時將會顯示最適當的畫面。'; - $lang->autoinstall = '自動安裝'; - - $lang->last_week = '上週'; - $lang->this_week = '本週'; -?> +admin_info = '管理員資訊'; + $lang->admin_index = '管理頁面'; + $lang->control_panel = '控制介面'; + $lang->start_module = '預設首頁'; + $lang->about_start_module = '可將所選擇的模組作為預設首頁。'; + + $lang->module_category_title = array( + 'service' => '服務設定', + 'member' => '會員管理', + 'content' => '內容管理', + 'statistics' => '統計資料', + 'construction' => '界面設定', + 'utility' => '擴充功能', + 'interlock' => '連動設定', + 'accessory' => '附加功能管理', + 'migration' => '資料轉換', + 'system' => '系統管理', + ); + + $lang->newest_news = "最新消息"; + + $lang->env_setup = "系統設置"; + $lang->default_url = "預設網址"; + $lang->about_default_url = "XE虛擬網站必須要先輸入預設的網址確保虛擬網站的運作,請輸入預設程式安裝路徑。
(例: http://網域名稱/安裝路徑)"; + + + $lang->env_information = "系統資訊"; + $lang->current_version = "安裝版本"; + $lang->current_path = "安裝路徑"; + $lang->released_version = "最新版本"; + $lang->about_download_link = "官方網站已發佈最新版本。\n請按[下載]下載最新版本。"; + + $lang->item_module = "模組列表"; + $lang->item_addon = "元件列表"; + $lang->item_widget = "Widget列表"; + $lang->item_layout = "版面列表"; + + $lang->module_name = "模組名稱"; + $lang->addon_name = "元件名稱"; + $lang->version = "版本"; + $lang->author = "作者"; + $lang->table_count = "表格數"; + $lang->installed_path = "安裝路徑"; + + $lang->cmd_shortcut_management = "編輯選單"; + + $lang->msg_is_not_administrator = '只有管理員才可以檢視'; + $lang->msg_manage_module_cannot_delete = '模組,附加元件,版面設計,Widget的快速選單是無法刪除的。'; + $lang->msg_default_act_is_null = '沒有指定預設管理員的動作,是無法新增到快速選單的。'; + + $lang->welcome_to_xe = 'XE管理頁面'; + $lang->about_lang_env = "請選擇預設語言。選擇完畢後,請按[儲存]按鈕。"; + + $lang->xe_license = 'XE遵循 GPL 協議'; + $lang->about_shortcut = '可以刪除新增到常用模組中的快速選單。'; + + $lang->yesterday = "昨天"; + $lang->today = "今天"; + + $lang->cmd_lang_select = "選擇語言"; + $lang->about_cmd_lang_select = "只提供所選擇的語言服務"; + $lang->about_recompile_cache = "可有效的整理錯誤的暫存檔"; + $lang->use_ssl = "SSL功能"; + $lang->ssl_options = array( + 'none' => "關閉", + 'optional' => "手動", + 'always' => "開啟" + ); + $lang->about_use_ssl = "選擇手動時,在會員註冊或修改資料等動作時才會使用 SSL 功能。
選擇開啟時,所有的服務都會使用 SSL 功能。"; + $lang->server_ports = "主機埠口"; + $lang->about_server_ports = "HTTP、HTTPS預設埠口分別是『80』、『443』
如果想使用其他的埠口的話,請自行設定。"; + $lang->use_db_session = 'DB session認證'; + $lang->about_db_session = '使用 PHP session 進行 DB 認證。
關閉此功能對於負荷較低的網站可提高效率。
使用此功能會無法統計線上人數。'; + $lang->sftp = "使用 SFTP"; + $lang->ftp_get_list = "取得列表"; + $lang->ftp_remove_info = '移除 FTP 資料'; + $lang->msg_ftp_invalid_path = '指定的 FTP 路徑讀取失敗。'; + $lang->msg_self_restart_cache_engine = '請重新啟動 Memcached 快取程式。'; + $lang->mobile_view = '手機瀏覽'; + $lang->about_mobile_view = '使用手機瀏覽時將會顯示最適當的畫面。'; + $lang->autoinstall = '自動安裝'; + + $lang->last_week = '上週'; + $lang->this_week = '本週'; +?> diff --git a/modules/admin/tpl/_footer.html b/modules/admin/tpl/_footer.html index f6784b0b7..02eaa22f6 100644 --- a/modules/admin/tpl/_footer.html +++ b/modules/admin/tpl/_footer.html @@ -1,6 +1,6 @@ -
-
- -
+ +
+ + diff --git a/modules/admin/tpl/_header.html b/modules/admin/tpl/_header.html index 74cd6a50e..a5c75ef79 100644 --- a/modules/admin/tpl/_header.html +++ b/modules/admin/tpl/_header.html @@ -1,60 +1,60 @@ - - -
- -
-
-
-
- -
- - -
- - -
-
-
+ + +
+ +
+
+
+
+ +
+ + +
+ + +
+
+
diff --git a/modules/admin/tpl/css/font.css b/modules/admin/tpl/css/font.css index 4175d6a71..ba60a9aaa 100755 --- a/modules/admin/tpl/css/font.css +++ b/modules/admin/tpl/css/font.css @@ -1,60 +1,60 @@ -@charset "utf-8"; -/* NHN (developers@xpressengine.com) */ - -#xeAdmin{ font-family:Sans-serif;} - -#xeAdmin a{ text-decoration:none !important;} -#xeAdmin a:hover, -#xeAdmin a:active, -#xeAdmin a:focus{ text-decoration:underline !important;} - -#xeAdmin h1.xeAdmin a{ text-decoration:none !important; font-family:Arial; font-size:16px; color:#fff; margin:0; padding:0;} -#xeAdmin table th{ color:#666;} -#xeAdmin table th a { color:#666;} -#xeAdmin table td{ color:#767676;} -#xeAdmin table td a { color:#767676;} -#xeAdmin caption{ font-size:11px; font-family:Tahoma; color:#767676;} -#xeAdmin div.summary { font-size:11px; font-family:Tahoma; color:#767676;} -#xeAdmin div.summary strong { font-weight:normal; } -#xeAdmin button.text{ font-size:12px;} -#xeAdmin em, -#xeAdmin address{ font-style:normal;} -#xeAdmin select{ font-size:12px;} -#xeAdmin input{ font-size:12px;} -#xeAdmin .buttonTypeGo{ padding:0; cursor:pointer;} - -#xeAdmin .footer address{ font:10px Tahoma;} -#xeAdmin .footer address a{ color:#777e86; } -#xeAdmin .gnb li a { color:#777e86; font-size:11px; font-family:Tahoma;} -#adminLang li a{ font-size:12px;} -#xeAdmin .lnb li, -#xeAdmin .lnb li a{ color:#fff; font-size:14px; font-family:Dotum, Tahoma;} - -#xeAdmin .path{ color:#ccc; font-size:11px;} -#xeAdmin .path a{ color:#767676; font-size:11px; font-family:Dotum, Sans-serif;} - -.e1 .navigation li a{ color:#000; text-decoration:none;} -.e1 .navigation li ul li a{ color:#767676;} -.e1 .navigation li ul li.active a{ font-weight:bold; color:#666;} - -.e2 .section h2.xeAdmin { font-size:12px; margin:0; padding:0;} -.e2 .section h2.xeAdmin .date{ font:Tahoma; color:#999;} - -.e2 table tbody th{ font-weight:normal; font-family:Dotum;} - -.e2 .notice li a{ color:#666; } -.e2 .notice li .date{ color:#767676; font:10px Tahoma;} - -.localNavigation li a{ text-decoration:none !important; color:#666;} -.localNavigation li.active a{ font-weight:bold; color:#1e6aac;} - -#xeAdmin h2.xeAdmin { font-size:12px;} -#xeAdmin h3.xeAdmin { font-size:12px; color:#666; margin:0; padding:0;} -#xeAdmin p.summary{ color:#767676;} -#xeAdmin p.summary a { text-decoration:none; color:#767676; } -#xeAdmin p.summary.red { color:#A54D4D; } -#xeAdmin p.summary.red a { text-decoration:none; color:#A54D4D; } -#xeAdmin div.infoText { color:#767676;} -#xeAdmin div.infoText p.warning{ margin:0 0 10px 0; padding:0 0 0 25px; background:url(../img/iconWarning.gif) no-repeat left top;} -#xeAdmin div.infoText p.update{ margin:0 0 10px 0; padding:0 0 0 25px; background:url(../img/iconRefresh.gif) no-repeat left top;} -#xeAdmin .buttonAction{} +@charset "utf-8"; +/* NHN (developers@xpressengine.com) */ + +#xeAdmin{ font-family:Sans-serif;} + +#xeAdmin a{ text-decoration:none !important;} +#xeAdmin a:hover, +#xeAdmin a:active, +#xeAdmin a:focus{ text-decoration:underline !important;} + +#xeAdmin h1.xeAdmin a{ text-decoration:none !important; font-family:Arial; font-size:16px; color:#fff; margin:0; padding:0;} +#xeAdmin table th{ color:#666;} +#xeAdmin table th a { color:#666;} +#xeAdmin table td{ color:#767676;} +#xeAdmin table td a { color:#767676;} +#xeAdmin caption{ font-size:11px; font-family:Tahoma; color:#767676;} +#xeAdmin div.summary { font-size:11px; font-family:Tahoma; color:#767676;} +#xeAdmin div.summary strong { font-weight:normal; } +#xeAdmin button.text{ font-size:12px;} +#xeAdmin em, +#xeAdmin address{ font-style:normal;} +#xeAdmin select{ font-size:12px;} +#xeAdmin input{ font-size:12px;} +#xeAdmin .buttonTypeGo{ padding:0; cursor:pointer;} + +#xeAdmin .footer address{ font:10px Tahoma;} +#xeAdmin .footer address a{ color:#777e86; } +#xeAdmin .gnb li a { color:#777e86; font-size:11px; font-family:Tahoma;} +#adminLang li a{ font-size:12px;} +#xeAdmin .lnb li, +#xeAdmin .lnb li a{ color:#fff; font-size:14px; font-family:Dotum, Tahoma;} + +#xeAdmin .path{ color:#ccc; font-size:11px;} +#xeAdmin .path a{ color:#767676; font-size:11px; font-family:Dotum, Sans-serif;} + +.e1 .navigation li a{ color:#000; text-decoration:none;} +.e1 .navigation li ul li a{ color:#767676;} +.e1 .navigation li ul li.active a{ font-weight:bold; color:#666;} + +.e2 .section h2.xeAdmin { font-size:12px; margin:0; padding:0;} +.e2 .section h2.xeAdmin .date{ font:Tahoma; color:#999;} + +.e2 table tbody th{ font-weight:normal; font-family:Dotum;} + +.e2 .notice li a{ color:#666; } +.e2 .notice li .date{ color:#767676; font:10px Tahoma;} + +.localNavigation li a{ text-decoration:none !important; color:#666;} +.localNavigation li.active a{ font-weight:bold; color:#1e6aac;} + +#xeAdmin h2.xeAdmin { font-size:12px;} +#xeAdmin h3.xeAdmin { font-size:12px; color:#666; margin:0; padding:0;} +#xeAdmin p.summary{ color:#767676;} +#xeAdmin p.summary a { text-decoration:none; color:#767676; } +#xeAdmin p.summary.red { color:#A54D4D; } +#xeAdmin p.summary.red a { text-decoration:none; color:#A54D4D; } +#xeAdmin div.infoText { color:#767676;} +#xeAdmin div.infoText p.warning{ margin:0 0 10px 0; padding:0 0 0 25px; background:url(../img/iconWarning.gif) no-repeat left top;} +#xeAdmin div.infoText p.update{ margin:0 0 10px 0; padding:0 0 0 25px; background:url(../img/iconRefresh.gif) no-repeat left top;} +#xeAdmin .buttonAction{} diff --git a/modules/admin/tpl/css/layout.css b/modules/admin/tpl/css/layout.css index 3cd75b92a..18dd2d017 100755 --- a/modules/admin/tpl/css/layout.css +++ b/modules/admin/tpl/css/layout.css @@ -1,47 +1,47 @@ -@charset "utf-8"; - -/* NHN (developers@xpressengine.com) */ - -#xeAdmin .header{ position:relative; height:62px; padding:10px 15px 10px 30px; background:url(../img/bgHeader.gif) repeat-x; z-index:10;} -#xeAdmin .footer{ height:26px; padding-top:10px; background:url(../img/bgFooter.gif) repeat-x; text-align:center;} -#xeAdmin .gnb{ position:relative; float:right; white-space:nowrap; clear:right; margin:0; padding:0;} -#xeAdmin .gnb li{ position:relative; float:left; margin:0 15px 0 0; padding:0;list-style:none;} - -#xeAdmin .gnb #adminLang { position:absolute; top:18px; right:0; display:none; background:#fff; margin:0; padding:5px; border:1px solid #ddd; z-index:999;} -#xeAdmin .gnb #adminLang li{ float:none; margin:0;} - -.body{ position:relative; margin:0; padding:0 0 0 200px; background:url(../img/lineBody.gif) repeat-y 180px 0; *zoom:1;} -.body:after {content:""; display:block; clear:both;} -.c .body { padding:20px; background:none; } -.ece .body {padding-right:340px;} -.ec .body {padding-right:20px;} -.extension{ position:relative;} -.body .e1 { float:left; width:180px; margin-right:-180px; left:-200px;} -.content { position:relative; width:100%; margin-right:-100%; float:left; padding:0;} -.ec .content { padding-top:10px; } -.c .e1, .c .e2 { display:none; } -.ece .e2 { width:300px; float:right; right:-320px; border-left:1px solid #ddd; padding-bottom:20px;} -.ec .e2 { display:none;} - -#xeAdmin .lnb { position:relative; left:-3px; float:left; clear:left; margin:5px 0 0 0; padding:0;} -#xeAdmin .lnb li, -#xeAdmin .lnb li a{ position:relative; float:left; background:url(../img/buttonLNB.gif) no-repeat; white-space:nowrap;} -#xeAdmin .lnb li{ margin:0 1px 0 0; padding:0;list-style:none; background-position:0 0;} -#xeAdmin .lnb li a{ left:1px; height:30px; padding:10px 15px 0 15px; text-decoration:none !important; background-position:right 0;} -#xeAdmin .lnb li.core{ margin-right:6px; background-position:0 -50px;} -#xeAdmin .lnb li.core a{ padding-right:20px; left:5px; background-position:right -50px;} -#xeAdmin .lnb li.first{ background-position:0 -50px; margin-right:5px;} -#xeAdmin .lnb li.first a{ left:5px;} -#xeAdmin .lnb li.end{} -#xeAdmin .lnb li.end a{ padding-right:20px; background-position:right -50px;} - -#xeAdmin .lnb li.core.selected { background-position:0 -150px;} -#xeAdmin .lnb li.core.selected a{ background-position:right -150px;} -#xeAdmin .lnb li.first.selected { background-position:0 -150px;} -#xeAdmin .lnb li.first.selected a{ background-position:right -100px;} -#xeAdmin .lnb li.mid.selected { background-position:0 -100px;} -#xeAdmin .lnb li.mid.selected a{ background-position:right -100px;} -#xeAdmin .lnb li.end.selected { background-position:0 -100px;} -#xeAdmin .lnb li.end.selected a{ background-position:right -150px;} - -#xeAdmin .path{ padding:0 0 0 25px; margin:0 0 20px 0; background:url(../img/iconPath.gif) no-repeat left center;} +@charset "utf-8"; + +/* NHN (developers@xpressengine.com) */ + +#xeAdmin .header{ position:relative; height:62px; padding:10px 15px 10px 30px; background:url(../img/bgHeader.gif) repeat-x; z-index:10;} +#xeAdmin .footer{ height:26px; padding-top:10px; background:url(../img/bgFooter.gif) repeat-x; text-align:center;} +#xeAdmin .gnb{ position:relative; float:right; white-space:nowrap; clear:right; margin:0; padding:0;} +#xeAdmin .gnb li{ position:relative; float:left; margin:0 15px 0 0; padding:0;list-style:none;} + +#xeAdmin .gnb #adminLang { position:absolute; top:18px; right:0; display:none; background:#fff; margin:0; padding:5px; border:1px solid #ddd; z-index:999;} +#xeAdmin .gnb #adminLang li{ float:none; margin:0;} + +.body{ position:relative; margin:0; padding:0 0 0 200px; background:url(../img/lineBody.gif) repeat-y 180px 0; *zoom:1;} +.body:after {content:""; display:block; clear:both;} +.c .body { padding:20px; background:none; } +.ece .body {padding-right:340px;} +.ec .body {padding-right:20px;} +.extension{ position:relative;} +.body .e1 { float:left; width:180px; margin-right:-180px; left:-200px;} +.content { position:relative; width:100%; margin-right:-100%; float:left; padding:0;} +.ec .content { padding-top:10px; } +.c .e1, .c .e2 { display:none; } +.ece .e2 { width:300px; float:right; right:-320px; border-left:1px solid #ddd; padding-bottom:20px;} +.ec .e2 { display:none;} + +#xeAdmin .lnb { position:relative; left:-3px; float:left; clear:left; margin:5px 0 0 0; padding:0;} +#xeAdmin .lnb li, +#xeAdmin .lnb li a{ position:relative; float:left; background:url(../img/buttonLNB.gif) no-repeat; white-space:nowrap;} +#xeAdmin .lnb li{ margin:0 1px 0 0; padding:0;list-style:none; background-position:0 0;} +#xeAdmin .lnb li a{ left:1px; height:30px; padding:10px 15px 0 15px; text-decoration:none !important; background-position:right 0;} +#xeAdmin .lnb li.core{ margin-right:6px; background-position:0 -50px;} +#xeAdmin .lnb li.core a{ padding-right:20px; left:5px; background-position:right -50px;} +#xeAdmin .lnb li.first{ background-position:0 -50px; margin-right:5px;} +#xeAdmin .lnb li.first a{ left:5px;} +#xeAdmin .lnb li.end{} +#xeAdmin .lnb li.end a{ padding-right:20px; background-position:right -50px;} + +#xeAdmin .lnb li.core.selected { background-position:0 -150px;} +#xeAdmin .lnb li.core.selected a{ background-position:right -150px;} +#xeAdmin .lnb li.first.selected { background-position:0 -150px;} +#xeAdmin .lnb li.first.selected a{ background-position:right -100px;} +#xeAdmin .lnb li.mid.selected { background-position:0 -100px;} +#xeAdmin .lnb li.mid.selected a{ background-position:right -100px;} +#xeAdmin .lnb li.end.selected { background-position:0 -100px;} +#xeAdmin .lnb li.end.selected a{ background-position:right -150px;} + +#xeAdmin .path{ padding:0 0 0 25px; margin:0 0 20px 0; background:url(../img/iconPath.gif) no-repeat left center;} diff --git a/modules/admin/tpl/css/pagination.css b/modules/admin/tpl/css/pagination.css index 0ba0ff1b0..315223db3 100755 --- a/modules/admin/tpl/css/pagination.css +++ b/modules/admin/tpl/css/pagination.css @@ -1,85 +1,85 @@ -@charset "utf-8"; -/* NHN (developers@xpressengine.com) */ - -/* Pagination Reset */ -#xeAdmin .pagination{ padding:15px 0; margin:0; text-align:center; clear:both; } -#xeAdmin .pagination *{ margin:0; padding:0;} -#xeAdmin .pagination img{ border:0;} -#xeAdmin .pagination a, -#xeAdmin .pagination strong{ position:relative; display:inline-block; text-decoration:none; line-height:normal; color:#333; font-family:Tahoma, Sans-serif; vertical-align:middle;} -#xeAdmin .pagination a:hover, -#xeAdmin .pagination a:active, -#xeAdmin .pagination a:focus{ background-color:#f4f4f4 !important; } -#xeAdmin .pagination strong{ color:#ff6600 !important;} -#xeAdmin .pagination a.prev, -#xeAdmin .pagination a.prevEnd, -#xeAdmin .pagination a.next, -#xeAdmin .pagination a.nextEnd{ font-weight:normal !important; border:none !important; margin:0 !important; white-space:nowrap; } - -/* Pagination A1 */ -#xeAdmin .pagination.a1 a, -#xeAdmin .pagination.a1 strong{ margin:0 -4px; padding:1px 10px 1px 8px; border:none; border-left:1px solid #ccc; border-right:1px solid #ddd; font-weight:bold; font-size:12px; background:#fff;} -#xeAdmin .pagination.a1 a.prev{ padding-left:10px; background:#fff url(../img/arrowPrevA1.gif) no-repeat left center; } -#xeAdmin .pagination.a1 a.prevEnd{ padding-left:15px; background:#fff url(../img/arrowPrevEndA1.gif) no-repeat left center; } -#xeAdmin .pagination.a1 a.next{ padding-right:10px; background:#fff url(../img/arrowNextA1.gif) no-repeat right center; } -#xeAdmin .pagination.a1 a.nextEnd{ padding-right:15px; background:#fff url(../img/arrowNextEndA1.gif) no-repeat right center; } - -/* Pagination A2 */ -#xeAdmin .pagination.a2 a, -#xeAdmin .pagination.a2 strong{ margin:0 -4px; padding:0 10px 0 8px; font-weight:bold; font-size:11px; border:none; border-left:1px solid #ddd; border-right:1px solid #ccc; background:#fff; } -#xeAdmin .pagination.a2 a.prev{ padding-left:10px; background:#fff url(../img/arrowPrevA1.gif) no-repeat left center; } -#xeAdmin .pagination.a2 a.prevEnd{ padding-left:15px; background:#fff url(../img/arrowPrevEndA1.gif) no-repeat left center; } -#xeAdmin .pagination.a2 a.next{ padding-right:10px; background:#fff url(../img/arrowNextA1.gif) no-repeat right center; } -#xeAdmin .pagination.a2 a.nextEnd{ padding-right:15px; background:#fff url(../img/arrowNextEndA1.gif) no-repeat right center; } - -/* Pagination B1 */ -#xeAdmin .pagination.b1 a, -#xeAdmin .pagination.b1 strong{ margin:0 -2px; padding:2px 8px; font-weight:bold; font-size:12px;} -#xeAdmin .pagination.b1 a.prev, -#xeAdmin .pagination.b1 a.prevEnd{ padding-left:16px; background:url(../img/arrowPrevB1.gif) no-repeat left center; } -#xeAdmin .pagination.b1 a.next, -#xeAdmin .pagination.b1 a.nextEnd{ padding-right:16px; background:url(../img/arrowNextB1.gif) no-repeat right center; } - -/* Pagination B2 */ -#xeAdmin .pagination.b2 a, -#xeAdmin .pagination.b2 strong{ margin:0 -2px; padding:2px 6px; font-size:11px;} -#xeAdmin .pagination.b2 a.prev, -#xeAdmin .pagination.b2 a.prevEnd{ padding-left:12px; background:url(../img/arrowPrevB1.gif) no-repeat left center; } -#xeAdmin .pagination.b2 a.next, -#xeAdmin .pagination.b2 a.nextEnd{ padding-right:12px; background:url(../img/arrowNextB1.gif) no-repeat right center; } - -/* Pagination C1 */ -#xeAdmin .pagination.c1 a, -#xeAdmin .pagination.c1 strong{ margin:0 -2px; padding:2px 4px; font-size:12px;} -#xeAdmin .pagination.c1 a.prev, -#xeAdmin .pagination.c1 a.prevEnd, -#xeAdmin .pagination.c1 a.next, -#xeAdmin .pagination.c1 a.nextEnd{ display:inline-block; width:13px; height:14px; padding:3px 4px; margin:0;} -#xeAdmin .pagination.c1 a.prev, -#xeAdmin .pagination.c1 a.prevEnd{ background:url(../img/arrowPrevC1.gif) no-repeat center;} -#xeAdmin .pagination.c1 a.next, -#xeAdmin .pagination.c1 a.nextEnd{ background:url(../img/arrowNextC1.gif) no-repeat center;} -#xeAdmin .pagination.c1 a.prev span, -#xeAdmin .pagination.c1 a.prevEnd span, -#xeAdmin .pagination.c1 a.next span, -#xeAdmin .pagination.c1 a.nextEnd span{ position:absolute; width:0; height:0; overflow:hidden; visibility:hidden;} - -/* Pagination C2 */ -#xeAdmin .pagination.c2 a, -#xeAdmin .pagination.c2 strong{ margin:0 -2px; padding:2px 4px; font-size:11px;} -#xeAdmin .pagination.c2 a.prev, -#xeAdmin .pagination.c2 a.prevEnd, -#xeAdmin .pagination.c2 a.next, -#xeAdmin .pagination.c2 a.nextEnd{ display:inline-block; width:13px; height:14px; padding:3px 4px; margin:0;} -#xeAdmin .pagination.c2 a.prev, -#xeAdmin .pagination.c2 a.prevEnd{ background:url(../img/arrowPrevC1.gif) no-repeat center;} -#xeAdmin .pagination.c2 a.next, -#xeAdmin .pagination.c2 a.nextEnd{ background:url(../img/arrowNextC1.gif) no-repeat center;} -#xeAdmin .pagination.c2 a.prev span, -#xeAdmin .pagination.c2 a.prevEnd span, -#xeAdmin .pagination.c2 a.next span, -#xeAdmin .pagination.c2 a.nextEnd span{ position:absolute; width:0; height:0; overflow:hidden; visibility:hidden;} - - - - +@charset "utf-8"; +/* NHN (developers@xpressengine.com) */ + +/* Pagination Reset */ +#xeAdmin .pagination{ padding:15px 0; margin:0; text-align:center; clear:both; } +#xeAdmin .pagination *{ margin:0; padding:0;} +#xeAdmin .pagination img{ border:0;} +#xeAdmin .pagination a, +#xeAdmin .pagination strong{ position:relative; display:inline-block; text-decoration:none; line-height:normal; color:#333; font-family:Tahoma, Sans-serif; vertical-align:middle;} +#xeAdmin .pagination a:hover, +#xeAdmin .pagination a:active, +#xeAdmin .pagination a:focus{ background-color:#f4f4f4 !important; } +#xeAdmin .pagination strong{ color:#ff6600 !important;} +#xeAdmin .pagination a.prev, +#xeAdmin .pagination a.prevEnd, +#xeAdmin .pagination a.next, +#xeAdmin .pagination a.nextEnd{ font-weight:normal !important; border:none !important; margin:0 !important; white-space:nowrap; } + +/* Pagination A1 */ +#xeAdmin .pagination.a1 a, +#xeAdmin .pagination.a1 strong{ margin:0 -4px; padding:1px 10px 1px 8px; border:none; border-left:1px solid #ccc; border-right:1px solid #ddd; font-weight:bold; font-size:12px; background:#fff;} +#xeAdmin .pagination.a1 a.prev{ padding-left:10px; background:#fff url(../img/arrowPrevA1.gif) no-repeat left center; } +#xeAdmin .pagination.a1 a.prevEnd{ padding-left:15px; background:#fff url(../img/arrowPrevEndA1.gif) no-repeat left center; } +#xeAdmin .pagination.a1 a.next{ padding-right:10px; background:#fff url(../img/arrowNextA1.gif) no-repeat right center; } +#xeAdmin .pagination.a1 a.nextEnd{ padding-right:15px; background:#fff url(../img/arrowNextEndA1.gif) no-repeat right center; } + +/* Pagination A2 */ +#xeAdmin .pagination.a2 a, +#xeAdmin .pagination.a2 strong{ margin:0 -4px; padding:0 10px 0 8px; font-weight:bold; font-size:11px; border:none; border-left:1px solid #ddd; border-right:1px solid #ccc; background:#fff; } +#xeAdmin .pagination.a2 a.prev{ padding-left:10px; background:#fff url(../img/arrowPrevA1.gif) no-repeat left center; } +#xeAdmin .pagination.a2 a.prevEnd{ padding-left:15px; background:#fff url(../img/arrowPrevEndA1.gif) no-repeat left center; } +#xeAdmin .pagination.a2 a.next{ padding-right:10px; background:#fff url(../img/arrowNextA1.gif) no-repeat right center; } +#xeAdmin .pagination.a2 a.nextEnd{ padding-right:15px; background:#fff url(../img/arrowNextEndA1.gif) no-repeat right center; } + +/* Pagination B1 */ +#xeAdmin .pagination.b1 a, +#xeAdmin .pagination.b1 strong{ margin:0 -2px; padding:2px 8px; font-weight:bold; font-size:12px;} +#xeAdmin .pagination.b1 a.prev, +#xeAdmin .pagination.b1 a.prevEnd{ padding-left:16px; background:url(../img/arrowPrevB1.gif) no-repeat left center; } +#xeAdmin .pagination.b1 a.next, +#xeAdmin .pagination.b1 a.nextEnd{ padding-right:16px; background:url(../img/arrowNextB1.gif) no-repeat right center; } + +/* Pagination B2 */ +#xeAdmin .pagination.b2 a, +#xeAdmin .pagination.b2 strong{ margin:0 -2px; padding:2px 6px; font-size:11px;} +#xeAdmin .pagination.b2 a.prev, +#xeAdmin .pagination.b2 a.prevEnd{ padding-left:12px; background:url(../img/arrowPrevB1.gif) no-repeat left center; } +#xeAdmin .pagination.b2 a.next, +#xeAdmin .pagination.b2 a.nextEnd{ padding-right:12px; background:url(../img/arrowNextB1.gif) no-repeat right center; } + +/* Pagination C1 */ +#xeAdmin .pagination.c1 a, +#xeAdmin .pagination.c1 strong{ margin:0 -2px; padding:2px 4px; font-size:12px;} +#xeAdmin .pagination.c1 a.prev, +#xeAdmin .pagination.c1 a.prevEnd, +#xeAdmin .pagination.c1 a.next, +#xeAdmin .pagination.c1 a.nextEnd{ display:inline-block; width:13px; height:14px; padding:3px 4px; margin:0;} +#xeAdmin .pagination.c1 a.prev, +#xeAdmin .pagination.c1 a.prevEnd{ background:url(../img/arrowPrevC1.gif) no-repeat center;} +#xeAdmin .pagination.c1 a.next, +#xeAdmin .pagination.c1 a.nextEnd{ background:url(../img/arrowNextC1.gif) no-repeat center;} +#xeAdmin .pagination.c1 a.prev span, +#xeAdmin .pagination.c1 a.prevEnd span, +#xeAdmin .pagination.c1 a.next span, +#xeAdmin .pagination.c1 a.nextEnd span{ position:absolute; width:0; height:0; overflow:hidden; visibility:hidden;} + +/* Pagination C2 */ +#xeAdmin .pagination.c2 a, +#xeAdmin .pagination.c2 strong{ margin:0 -2px; padding:2px 4px; font-size:11px;} +#xeAdmin .pagination.c2 a.prev, +#xeAdmin .pagination.c2 a.prevEnd, +#xeAdmin .pagination.c2 a.next, +#xeAdmin .pagination.c2 a.nextEnd{ display:inline-block; width:13px; height:14px; padding:3px 4px; margin:0;} +#xeAdmin .pagination.c2 a.prev, +#xeAdmin .pagination.c2 a.prevEnd{ background:url(../img/arrowPrevC1.gif) no-repeat center;} +#xeAdmin .pagination.c2 a.next, +#xeAdmin .pagination.c2 a.nextEnd{ background:url(../img/arrowNextC1.gif) no-repeat center;} +#xeAdmin .pagination.c2 a.prev span, +#xeAdmin .pagination.c2 a.prevEnd span, +#xeAdmin .pagination.c2 a.next span, +#xeAdmin .pagination.c2 a.nextEnd span{ position:absolute; width:0; height:0; overflow:hidden; visibility:hidden;} + + + + diff --git a/modules/admin/tpl/index.html b/modules/admin/tpl/index.html index 39108db6f..2cea55870 100644 --- a/modules/admin/tpl/index.html +++ b/modules/admin/tpl/index.html @@ -1,314 +1,314 @@ - - - - - - - - - -
- -
-

{$lang->admin_index}

-
- - - -
-
-

TODAY {date('Y.m.d')}

-
-
{$lang->today_visitor}
- -
- - - - - - - - - - - - - - {$status->visitor} - - - -
-
-
-
{$lang->today_comments}
-
- - - - - - - - - - - - - - {$status->comment->today} - - - -
-
-
-
{$lang->today_trackbacks}
-
- - - - - - - - - - - - - - {$status->trackback->today} - - - -
-
-
- - - - - - - - - - - - - - - - - - - - - -
{$lang->member}{number_format($status->member->total)} (+{number_format($status->member->today)})
{$lang->document}{number_format($status->document->total)} (+{number_format($status->document->today)},-{number_format($status->documentDeclared->total)})
{$lang->comment}{number_format($status->comment->total)} (+{number_format($status->comment->today)},-{number_format($status->commentDeclared->total)})
{$lang->trackback}{number_format($status->trackback->total)} (+{number_format($status->trackback->today)})
{$lang->file}{number_format($status->file->total)} (+{number_format($status->file->today)})
-
-
- - - - - - - - - -
- - - -
- -

{$lang->counter} {date("Y.m.d")}

-
-
-
{$lang->yesterday}
-
{$lang->last_week}
-
{$lang->today}
-
{$lang->this_week}
- -
-
-
{$lang->today}
-
{number_format($status->visitor)}
-
{$lang->this_week}
-
{number_format($status->thisWeekSum)}
-
{$lang->total}
-
{number_format($status->total_visitor)}
-
-
- -
-
{$key}{$key}
-
{$lang->last_week}:{number_format($val->last)}
-
{$lang->this_week}:{number_format($val->this)}
- -
- -
-
-
- - -
-

{$lang->env_information} {$lang->cmd_setup}

- -

{nl2br($lang->about_download_link)} [{$lang->cmd_download}]

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
{$lang->current_version}
- {$current_version} [{$lang->cmd_view}] -
{$lang->current_path}
{$installed_path}/
{$lang->start_module}
{$start_module->browser_title}
{$lang->time_zone}
{substr($val,1,10)}
{$lang->use_rewrite}
{$lang->use}{$lang->notuse}
{$lang->use_sso}
{$lang->use}{$lang->notuse}
{$lang->mobile_view}
{$lang->use}{$lang->notuse}
Language
{$val}
{$lang->qmail_compatibility}
{$lang->use}{$lang->notuse}
{$lang->use_db_session}
{$lang->use}{$lang->notuse}
-
-
- -
-
-
- - -
-
- - {@$_show_modules = false; } - - - {@$_show_modules = true; } - - - -
- - - - - - - - - - - - - - -
{$lang->module}
{$val->title} ({$val->module}) - - {$lang->cmd_install} - - {$lang->cmd_update} - -   - -
-
- - - -
- - - - - - - - - - - - -
{$lang->newest_news}
{cut_str($val->title,36)}{zdate($val->date,"y-m-d")}
-
- - -
-
- -
- - - - - - - - - - - - - - - - - - - -
{$lang->addon}{$lang->cmd_setup}PCMobile
{cut_str($val->title,24)}{$lang->cmd_setup} - - {$lang->use} - - {$lang->notuse} - - - - {$lang->use} - - {$lang->notuse} - -
-
-
- - + + + + + + + + + +
+ +
+

{$lang->admin_index}

+
+ + + +
+
+

TODAY {date('Y.m.d')}

+
+
{$lang->today_visitor}
+ +
+ + + + + + + + + + + + + + {$status->visitor} + + + +
+
+
+
{$lang->today_comments}
+
+ + + + + + + + + + + + + + {$status->comment->today} + + + +
+
+
+
{$lang->today_trackbacks}
+
+ + + + + + + + + + + + + + {$status->trackback->today} + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + +
{$lang->member}{number_format($status->member->total)} (+{number_format($status->member->today)})
{$lang->document}{number_format($status->document->total)} (+{number_format($status->document->today)},-{number_format($status->documentDeclared->total)})
{$lang->comment}{number_format($status->comment->total)} (+{number_format($status->comment->today)},-{number_format($status->commentDeclared->total)})
{$lang->trackback}{number_format($status->trackback->total)} (+{number_format($status->trackback->today)})
{$lang->file}{number_format($status->file->total)} (+{number_format($status->file->today)})
+
+
+ + + + + + + + + +
+ + + +
+ +

{$lang->counter} {date("Y.m.d")}

+
+
+
{$lang->yesterday}
+
{$lang->last_week}
+
{$lang->today}
+
{$lang->this_week}
+ +
+
+
{$lang->today}
+
{number_format($status->visitor)}
+
{$lang->this_week}
+
{number_format($status->thisWeekSum)}
+
{$lang->total}
+
{number_format($status->total_visitor)}
+
+
+ +
+
{$key}{$key}
+
{$lang->last_week}:{number_format($val->last)}
+
{$lang->this_week}:{number_format($val->this)}
+ +
+ +
+
+
+ + +
+

{$lang->env_information} {$lang->cmd_setup}

+ +

{nl2br($lang->about_download_link)} [{$lang->cmd_download}]

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang->current_version}
+ {$current_version} [{$lang->cmd_view}] +
{$lang->current_path}
{$installed_path}/
{$lang->start_module}
{$start_module->browser_title}
{$lang->time_zone}
{substr($val,1,10)}
{$lang->use_rewrite}
{$lang->use}{$lang->notuse}
{$lang->use_sso}
{$lang->use}{$lang->notuse}
{$lang->mobile_view}
{$lang->use}{$lang->notuse}
Language
{$val}
{$lang->qmail_compatibility}
{$lang->use}{$lang->notuse}
{$lang->use_db_session}
{$lang->use}{$lang->notuse}
+
+
+ +
+
+
+ + +
+
+ + {@$_show_modules = false; } + + + {@$_show_modules = true; } + + + +
+ + + + + + + + + + + + + + +
{$lang->module}
{$val->title} ({$val->module}) + + {$lang->cmd_install} + + {$lang->cmd_update} + +   + +
+
+ + + +
+ + + + + + + + + + + + +
{$lang->newest_news}
{cut_str($val->title,36)}{zdate($val->date,"y-m-d")}
+
+ + +
+
+ +
+ + + + + + + + + + + + + + + + + + + +
{$lang->addon}{$lang->cmd_setup}PCMobile
{cut_str($val->title,24)}{$lang->cmd_setup} + + {$lang->use} + + {$lang->notuse} + + + + {$lang->use} + + {$lang->notuse} + +
+
+
+ + diff --git a/modules/admin/tpl/js/admin.js b/modules/admin/tpl/js/admin.js index 322232010..940112377 100644 --- a/modules/admin/tpl/js/admin.js +++ b/modules/admin/tpl/js/admin.js @@ -1,157 +1,157 @@ -/** - * @file admin.js - * @author NHN (developers@xpressengine.com) - * @brief admin 모듈의 javascript - **/ - -// 캐시파일 모두 재 생성 -function doRecompileCacheFile() { - exec_xml("admin","procAdminRecompileCacheFile", new Array(), completeMessage); -} - -// 모듈 목록 오픈 -function toggleModuleMenu(category) { - jQuery('#module_'+category).toggleClass('close'); - - var arr = new Array(); - jQuery('ul.navigation > li').each(function(){ - var o = jQuery(this); - if(!o.hasClass('close')) return; - var idx = o.attr('id').replace(/^module_/,''); - arr.push(idx); - }); - var expire= new Date(); - expire.setTime(expire.getTime()+(7000*24*3600000)); - xSetCookie('XEAM',arr.join(','),expire,'/'); -} - -// 메인 모듈/ 애드온 토글 -function toggleModuleAddon(target) { - var b = (target == 'module'); - - jQuery('#moduleOn').attr('class', b?'on':''); - jQuery('#addonOn').attr('class', b?'':'on'); - jQuery('#xeModules')[b?'show':'hide'](); - jQuery('#xeAddons')[b?'hide':'show'](); -} - -// toggle language list -function toggleAdminLang() { - jQuery('#adminLang').toggleClass('open'); -} - -// string to regex(초성검색용) -function str2regex(str) { - // control chars - str = str.replace(/([\[\]\{\}\(\)\*\-\+\!\?\^\|\\])/g, '\\$1'); - - // find consonants and replace it - str = str.replace(/[ㄱ-ㅎ]/g, function(c){ - var c_order = 'ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ'.indexOf(c); - var ch_first = String.fromCharCode(0xAC00 + c_order*21*28 + 0 + 0); - var ch_last = String.fromCharCode(0xAC00 + c_order*21*28 + 20*28 + 27); - - return '['+ch_first+'-'+ch_last+']'; - }); - - return new RegExp(str, 'ig'); -} - -jQuery(function($){ - // paint table rows - jQuery("table.rowTable tr").attr('class','').filter(":nth-child(even)").attr('class','bg1'); - - // set menu tooltip - taggon - $('ul.navigation:first > li').each(function(){ - var texts = []; - $(this).find('li').each(function(){ - texts.push($(this).text()); - }); - - if (!texts.length) return true; - - $(this).find('>a').qtip({ - content : texts.join(', '), - position : { - corner : { - target:'rightMiddle', - tooltip:'leftMiddle' - }, - adjust : { - x : -30 - } - }, - style : { - name : 'cream', - tip : true, - textAlign : 'center', - padding : 5, - border : { - radius : 2 - } - } - }); - }); - - // menu search - var nav = $('#search_nav + ul.navigation'); - var inp = $('#search_nav input[type=text]:first'); - var btn = $('#search_nav button:first'); - var result = $('
    '); - - if(inp.length == 0) return; - - nav.after( result.hide() ); - - inp.keydown(function(event){ - if (event.keyCode == 27) { // ESC - $(this).val(''); - if ($.browser.msie) $(this).keypress(); - } - }) - .watch_input({ - oninput : function() { - var str = $.trim( $(this).val() ); - - if (str.length == 0) { - nav.show(); - result.hide(); - btn.removeClass('close'); - return false; - } - - // remove all sub nodes - result.empty(); - - var regex = str2regex(str); - nav.find('li li > a').each(function(){ - var text = $(this).text(); - - if (regex.exec(text) != null) { - $(this).parent().clone().appendTo(result); - } - - // fix regular expression bug - regex.exec(''); - }); - - nav.hide(); - result.show(); - btn.addClass('close'); - } - }); - - // cancel search - btn.click(function(){ - if ($(this).hasClass('close')) { - $(this).removeClass('close'); - - inp.focus(); - inp.val(''); - inp.keydown(); - } - - return false; - }); - -}); +/** + * @file admin.js + * @author NHN (developers@xpressengine.com) + * @brief admin 모듈의 javascript + **/ + +// 캐시파일 모두 재 생성 +function doRecompileCacheFile() { + exec_xml("admin","procAdminRecompileCacheFile", new Array(), completeMessage); +} + +// 모듈 목록 오픈 +function toggleModuleMenu(category) { + jQuery('#module_'+category).toggleClass('close'); + + var arr = new Array(); + jQuery('ul.navigation > li').each(function(){ + var o = jQuery(this); + if(!o.hasClass('close')) return; + var idx = o.attr('id').replace(/^module_/,''); + arr.push(idx); + }); + var expire= new Date(); + expire.setTime(expire.getTime()+(7000*24*3600000)); + xSetCookie('XEAM',arr.join(','),expire,'/'); +} + +// 메인 모듈/ 애드온 토글 +function toggleModuleAddon(target) { + var b = (target == 'module'); + + jQuery('#moduleOn').attr('class', b?'on':''); + jQuery('#addonOn').attr('class', b?'':'on'); + jQuery('#xeModules')[b?'show':'hide'](); + jQuery('#xeAddons')[b?'hide':'show'](); +} + +// toggle language list +function toggleAdminLang() { + jQuery('#adminLang').toggleClass('open'); +} + +// string to regex(초성검색용) +function str2regex(str) { + // control chars + str = str.replace(/([\[\]\{\}\(\)\*\-\+\!\?\^\|\\])/g, '\\$1'); + + // find consonants and replace it + str = str.replace(/[ㄱ-ㅎ]/g, function(c){ + var c_order = 'ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ'.indexOf(c); + var ch_first = String.fromCharCode(0xAC00 + c_order*21*28 + 0 + 0); + var ch_last = String.fromCharCode(0xAC00 + c_order*21*28 + 20*28 + 27); + + return '['+ch_first+'-'+ch_last+']'; + }); + + return new RegExp(str, 'ig'); +} + +jQuery(function($){ + // paint table rows + jQuery("table.rowTable tr").attr('class','').filter(":nth-child(even)").attr('class','bg1'); + + // set menu tooltip - taggon + $('ul.navigation:first > li').each(function(){ + var texts = []; + $(this).find('li').each(function(){ + texts.push($(this).text()); + }); + + if (!texts.length) return true; + + $(this).find('>a').qtip({ + content : texts.join(', '), + position : { + corner : { + target:'rightMiddle', + tooltip:'leftMiddle' + }, + adjust : { + x : -30 + } + }, + style : { + name : 'cream', + tip : true, + textAlign : 'center', + padding : 5, + border : { + radius : 2 + } + } + }); + }); + + // menu search + var nav = $('#search_nav + ul.navigation'); + var inp = $('#search_nav input[type=text]:first'); + var btn = $('#search_nav button:first'); + var result = $('
      '); + + if(inp.length == 0) return; + + nav.after( result.hide() ); + + inp.keydown(function(event){ + if (event.keyCode == 27) { // ESC + $(this).val(''); + if ($.browser.msie) $(this).keypress(); + } + }) + .watch_input({ + oninput : function() { + var str = $.trim( $(this).val() ); + + if (str.length == 0) { + nav.show(); + result.hide(); + btn.removeClass('close'); + return false; + } + + // remove all sub nodes + result.empty(); + + var regex = str2regex(str); + nav.find('li li > a').each(function(){ + var text = $(this).text(); + + if (regex.exec(text) != null) { + $(this).parent().clone().appendTo(result); + } + + // fix regular expression bug + regex.exec(''); + }); + + nav.hide(); + result.show(); + btn.addClass('close'); + } + }); + + // cancel search + btn.click(function(){ + if ($(this).hasClass('close')) { + $(this).removeClass('close'); + + inp.focus(); + inp.val(''); + inp.keydown(); + } + + return false; + }); + +}); diff --git a/modules/admin/tpl/layout.html b/modules/admin/tpl/layout.html index 0873f9da2..91747e431 100644 --- a/modules/admin/tpl/layout.html +++ b/modules/admin/tpl/layout.html @@ -1,19 +1,19 @@ - - - - - + + + + + diff --git a/modules/autoinstall/autoinstall.admin.controller.php b/modules/autoinstall/autoinstall.admin.controller.php index 0a79006ff..7541ac768 100644 --- a/modules/autoinstall/autoinstall.admin.controller.php +++ b/modules/autoinstall/autoinstall.admin.controller.php @@ -1,243 +1,243 @@ -download_path); - } - - function procAutoinstallAdminUpdateinfo() - { - $oModel = &getModel('autoinstall'); - $item = $oModel->getLatestPackage(); - if($item) - { - $params["updatedate"] = $item->updatedate; - } - - $params["act"] = "getResourceapiUpdate"; - $body = XmlGenerater::generate($params); - $buff = FileHandler::getRemoteResource($this->uri, $body, 3, "POST", "application/xml"); - $xml = new XmlParser(); - $xmlDoc = $xml->parse($buff); - $this->updateCategory($xmlDoc); - $this->updatePackages($xmlDoc); - $this->checkInstalled(); - - $this->setMessage("success_updated"); - } - - function checkInstalled() - { - executeQuery("autoinstall.deleteInstalledPackage"); - $oModel =& getModel('autoinstall'); - $packages = $oModel->getPackages(); - foreach($packages as $package) - { - $real_path = FileHandler::getRealPath($package->path); - if(!file_exists($real_path)) { - continue; - } - - $type = $oModel->getTypeFromPath($package->path); - if($type == "core") - { - $version = __ZBXE_VERSION__; - } - else - { - $config_file = null; - switch($type) - { - case "m.layout": - $type = "layout"; - case "module": - case "addon": - case "layout": - case "widget": - $config_file = "/conf/info.xml"; - break; - case "component": - $config_file = "/info.xml"; - break; - case "style": - case "m.skin": - $type = "skin"; - case "skin": - case "widgetstyle": - $config_file = "/skin.xml"; - break; - case "drcomponent": - $config_file = "/info.xml"; - $type = "component"; - break; - } - if(!$config_file) continue; - $xml = new XmlParser(); - $xmlDoc = $xml->loadXmlFile($real_path.$config_file); - if(!$xmlDoc) continue; - $version = $xmlDoc->{$type}->version->body; - } - - $args = null; - $args->package_srl = $package->package_srl; - $args->version = $package->version; - $args->current_version = $version; - if(version_compare($args->version, $args->current_version, ">")) - { - $args->need_update="Y"; - } - else - { - $args->need_update="N"; - } - - $output = executeQuery("autoinstall.insertInstalledPackage", $args); - } - } - - function procAutoinstallAdminPackageinstall() - { - @set_time_limit(0); - $package_srls = Context::get('package_srl'); - $oModel =& getModel('autoinstall'); - $packages = explode(',', $package_srls); - $ftp_info = Context::getFTPInfo(); - if(!$_SESSION['ftp_password']) - { - $ftp_password = Context::get('ftp_password'); - } - else - { - $ftp_password = $_SESSION['ftp_password']; - } - - foreach($packages as $package_srl) - { - $package = $oModel->getPackage($package_srl); - if($ftp_info->sftp && $ftp_info->sftp == 'Y') - { - $oModuleInstaller = new SFTPModuleInstaller($package); - } - else if(function_exists(ftp_connect)) - { - $oModuleInstaller = new PHPFTPModuleInstaller($package); - } - else - { - $oModuleInstaller = new FTPModuleInstaller($package); - } - - $oModuleInstaller->setPassword($ftp_password); - $output = $oModuleInstaller->install(); - if(!$output->toBool()) return $output; - } - $this->setMessage('success_installed'); - } - - function updatePackages(&$xmlDoc) - { - $oModel =& getModel('autoinstall'); - if(!$xmlDoc->response->packages->item) return; - if(!is_array($xmlDoc->response->packages->item)) - { - $xmlDoc->response->packages->item = array($xmlDoc->response->packages->item); - } - $targets = array('package_srl', 'updatedate', 'latest_item_srl', 'path', 'version', 'category_srl'); - foreach($xmlDoc->response->packages->item as $item) - { - $args = null; - foreach($targets as $target) - { - $args->{$target} = $item->{$target}->body; - } - if($oModel->getPackage($args->package_srl)) - { - $output = executeQuery("autoinstall.updatePackage", $args); - } - else - { - $output = executeQuery("autoinstall.insertPackage", $args); - if(!$output->toBool()) - { - $output = executeQuery("autoinstall.deletePackage", $args); - $output = executeQuery("autoinstall.insertPackage", $args); - } - } - } - } - - function updateCategory(&$xmlDoc) - { - executeQuery("autoinstall.deleteCategory", $args); - $oModel =& getModel('autoinstall'); - if(!is_array($xmlDoc->response->categorylist->item)) - { - $xmlDoc->response->categorylist->item = array($xmlDoc->response->categorylist->item); - } - foreach($xmlDoc->response->categorylist->item as $item) - { - $args = null; - $args->category_srl = $item->category_srl->body; - $args->parent_srl = $item->parent_srl->body; - $args->title = $item->title->body; - executeQuery("autoinstall.insertCategory", $args); - } - } - - function procAutoinstallAdminUninstallPackage() - { - $package_srl = Context::get('package_srl'); - $oModel =& getModel('autoinstall'); - $package = $oModel->getPackage($package_srl); - $path = $package->path; - - if(!$_SESSION['ftp_password']) - { - $ftp_password = Context::get('ftp_password'); - } - else - { - $ftp_password = $_SESSION['ftp_password']; - } - $ftp_info = Context::getFTPInfo(); - - if($ftp_info->sftp && $ftp_info->sftp == 'Y') - { - $oModuleInstaller = new SFTPModuleInstaller($package); - } - else if(function_exists(ftp_connect)) - { - $oModuleInstaller = new PHPFTPModuleInstaller($package); - } - else - { - $oModuleInstaller = new FTPModuleInstaller($package); - } - - $oModuleInstaller->setPassword($ftp_password); - $output = $oModuleInstaller->uninstall(); - if(!$output->toBool()) return $output; - - $this->setMessage('success_deleted'); - } - } -?> +download_path); + } + + function procAutoinstallAdminUpdateinfo() + { + $oModel = &getModel('autoinstall'); + $item = $oModel->getLatestPackage(); + if($item) + { + $params["updatedate"] = $item->updatedate; + } + + $params["act"] = "getResourceapiUpdate"; + $body = XmlGenerater::generate($params); + $buff = FileHandler::getRemoteResource($this->uri, $body, 3, "POST", "application/xml"); + $xml = new XmlParser(); + $xmlDoc = $xml->parse($buff); + $this->updateCategory($xmlDoc); + $this->updatePackages($xmlDoc); + $this->checkInstalled(); + + $this->setMessage("success_updated"); + } + + function checkInstalled() + { + executeQuery("autoinstall.deleteInstalledPackage"); + $oModel =& getModel('autoinstall'); + $packages = $oModel->getPackages(); + foreach($packages as $package) + { + $real_path = FileHandler::getRealPath($package->path); + if(!file_exists($real_path)) { + continue; + } + + $type = $oModel->getTypeFromPath($package->path); + if($type == "core") + { + $version = __ZBXE_VERSION__; + } + else + { + $config_file = null; + switch($type) + { + case "m.layout": + $type = "layout"; + case "module": + case "addon": + case "layout": + case "widget": + $config_file = "/conf/info.xml"; + break; + case "component": + $config_file = "/info.xml"; + break; + case "style": + case "m.skin": + $type = "skin"; + case "skin": + case "widgetstyle": + $config_file = "/skin.xml"; + break; + case "drcomponent": + $config_file = "/info.xml"; + $type = "component"; + break; + } + if(!$config_file) continue; + $xml = new XmlParser(); + $xmlDoc = $xml->loadXmlFile($real_path.$config_file); + if(!$xmlDoc) continue; + $version = $xmlDoc->{$type}->version->body; + } + + $args = null; + $args->package_srl = $package->package_srl; + $args->version = $package->version; + $args->current_version = $version; + if(version_compare($args->version, $args->current_version, ">")) + { + $args->need_update="Y"; + } + else + { + $args->need_update="N"; + } + + $output = executeQuery("autoinstall.insertInstalledPackage", $args); + } + } + + function procAutoinstallAdminPackageinstall() + { + @set_time_limit(0); + $package_srls = Context::get('package_srl'); + $oModel =& getModel('autoinstall'); + $packages = explode(',', $package_srls); + $ftp_info = Context::getFTPInfo(); + if(!$_SESSION['ftp_password']) + { + $ftp_password = Context::get('ftp_password'); + } + else + { + $ftp_password = $_SESSION['ftp_password']; + } + + foreach($packages as $package_srl) + { + $package = $oModel->getPackage($package_srl); + if($ftp_info->sftp && $ftp_info->sftp == 'Y') + { + $oModuleInstaller = new SFTPModuleInstaller($package); + } + else if(function_exists(ftp_connect)) + { + $oModuleInstaller = new PHPFTPModuleInstaller($package); + } + else + { + $oModuleInstaller = new FTPModuleInstaller($package); + } + + $oModuleInstaller->setPassword($ftp_password); + $output = $oModuleInstaller->install(); + if(!$output->toBool()) return $output; + } + $this->setMessage('success_installed'); + } + + function updatePackages(&$xmlDoc) + { + $oModel =& getModel('autoinstall'); + if(!$xmlDoc->response->packages->item) return; + if(!is_array($xmlDoc->response->packages->item)) + { + $xmlDoc->response->packages->item = array($xmlDoc->response->packages->item); + } + $targets = array('package_srl', 'updatedate', 'latest_item_srl', 'path', 'version', 'category_srl'); + foreach($xmlDoc->response->packages->item as $item) + { + $args = null; + foreach($targets as $target) + { + $args->{$target} = $item->{$target}->body; + } + if($oModel->getPackage($args->package_srl)) + { + $output = executeQuery("autoinstall.updatePackage", $args); + } + else + { + $output = executeQuery("autoinstall.insertPackage", $args); + if(!$output->toBool()) + { + $output = executeQuery("autoinstall.deletePackage", $args); + $output = executeQuery("autoinstall.insertPackage", $args); + } + } + } + } + + function updateCategory(&$xmlDoc) + { + executeQuery("autoinstall.deleteCategory", $args); + $oModel =& getModel('autoinstall'); + if(!is_array($xmlDoc->response->categorylist->item)) + { + $xmlDoc->response->categorylist->item = array($xmlDoc->response->categorylist->item); + } + foreach($xmlDoc->response->categorylist->item as $item) + { + $args = null; + $args->category_srl = $item->category_srl->body; + $args->parent_srl = $item->parent_srl->body; + $args->title = $item->title->body; + executeQuery("autoinstall.insertCategory", $args); + } + } + + function procAutoinstallAdminUninstallPackage() + { + $package_srl = Context::get('package_srl'); + $oModel =& getModel('autoinstall'); + $package = $oModel->getPackage($package_srl); + $path = $package->path; + + if(!$_SESSION['ftp_password']) + { + $ftp_password = Context::get('ftp_password'); + } + else + { + $ftp_password = $_SESSION['ftp_password']; + } + $ftp_info = Context::getFTPInfo(); + + if($ftp_info->sftp && $ftp_info->sftp == 'Y') + { + $oModuleInstaller = new SFTPModuleInstaller($package); + } + else if(function_exists(ftp_connect)) + { + $oModuleInstaller = new PHPFTPModuleInstaller($package); + } + else + { + $oModuleInstaller = new FTPModuleInstaller($package); + } + + $oModuleInstaller->setPassword($ftp_password); + $output = $oModuleInstaller->uninstall(); + if(!$output->toBool()) return $output; + + $this->setMessage('success_deleted'); + } + } +?> diff --git a/modules/autoinstall/autoinstall.admin.view.php b/modules/autoinstall/autoinstall.admin.view.php index 9b594c560..2917987e7 100644 --- a/modules/autoinstall/autoinstall.admin.view.php +++ b/modules/autoinstall/autoinstall.admin.view.php @@ -1,319 +1,319 @@ -module_path); - Context::set('original_site', $this->original_site); - Context::set('uri', $this->uri); - $this->setTemplatePath($template_path); - - $ftp_info = Context::getFTPInfo(); - if(!$ftp_info->ftp_root_path) Context::set('show_ftp_note', true); - else $this->ftp_set = true; - - - $this->dispCategory(); - $oModel = &getModel('autoinstall'); - Context::set('tCount', $oModel->getPackageCount(null)); - Context::set('iCount', $oModel->getInstalledPackageCount()); - } - - function rearrange(&$item, &$targets) - { - $ret = null; - foreach($targets as $target) - { - $ret->{$target} = $item->{$target}->body; - } - return $ret; - } - - function rearranges($items, $packages = null) - { - if(!is_array($items)) $items = array($items); - $item_list = array(); - $targets = array('category_srl', 'package_srl', 'item_screenshot_url', 'package_voted', 'package_voter', 'package_description', 'package_downloaded', 'item_regdate', 'title', 'item_version', 'package_star', 'depfrom'); - $targetpackages = array(); - foreach($items as $item) - { - $targetpackages[$item->package_srl->body] = 0; - } - $oModel = &getModel('autoinstall'); - if($package == null) - $packages = $oModel->getInstalledPackages(array_keys($targetpackages)); - $depto = array(); - foreach($items as $item) - { - $v = $this->rearrange($item, $targets); - if($packages[$v->package_srl]) - { - $v->current_version = $packages[$v->package_srl]->current_version; - $v->need_update = $packages[$v->package_srl]->need_update; - $v->type = $oModel->getTypeFromPath($packages[$v->package_srl]->path); - if($this->ftp_set && $v->depfrom) { - $depfrom = explode("," , $v->depfrom); - foreach($depfrom as $package_srl) - { - $depto[$package_srl][] = $v->package_srl; - } - } - if($v->type == "core") $v->avail_remove = false; - else if($v->type == "module") { - $v->avail_remove = $oModel->checkRemovable($packages[$v->package_srl]->path); - } - else $v->avail_remove = true; - } - $item_list[$v->package_srl] = $v; - } - - if(count($depto) > 0) - { - $installed = $oModel->getInstalledPackages(implode(",", array_keys($depto))); - foreach($installed as $key=>$val) - { - $path = $val->path; - $type = $oModel->getTypeFromPath($path); - if(!$type || $type == "core") continue; - $config_file = $oModel->getConfigFilePath($type); - if(!$config_file) continue; - - $xml = new XmlParser(); - $xmlDoc = $xml->loadXmlFile(FileHandler::getRealPath($path).$config_file); - if(!$xmlDoc) continue; - if($type == "drcomponent") $type = "component"; - if($type == "style" || $type == "m.skin") $type = "skin"; - if($type == "m.layout") $type = "layout"; - $title = $xmlDoc->{$type}->title->body; - $installed[$key]->title = $title; - } - Context::set('installed', $installed); - foreach($installed as $key=>$val) - { - foreach($depto[$key] as $package_srl) - { - $item_list[$package_srl]->avail_remove = false; - $item_list[$package_srl]->deps[] = $key; - } - } - } - - return $item_list; - } - - function dispAutoinstallAdminInstalledPackages() - { - $page = Context::get('page'); - if(!$page) $page = 1; - Context::set('page', $page); - $oModel = &getModel('autoinstall'); - $output = $oModel->getInstalledPackageList($page); - $package_list = $output->data; - - $params["act"] = "getResourceapiPackages"; - $params["package_srls"] = implode(",", array_keys($package_list)); - $body = XmlGenerater::generate($params); - $buff = FileHandler::getRemoteResource($this->uri, $body, 3, "POST", "application/xml"); - $xml_lUpdate = new XmlParser(); - $xmlDoc = $xml_lUpdate->parse($buff); - if($xmlDoc && $xmlDoc->response->packagelist->item) - { - $item_list = $this->rearranges($xmlDoc->response->packagelist->item, $package_list); - $res = array(); - foreach($package_list as $package_srl => $package) - { - $res[] = $item_list[$package_srl]; - } - Context::set('item_list', $res); - } - Context::set('page_navigation', $output->page_navigation); - - $this->setTemplateFile('index'); - } - - function dispAutoinstallAdminInstall() { - $package_srl = Context::get('package_srl'); - if(!$package_srl) return $this->dispAutoinstallAdminIndex(); - - $params["act"] = "getResourceapiInstallInfo"; - $params["package_srl"] = $package_srl; - $xmlDoc = XmlGenerater::getXmlDoc($params); - $oModel = &getModel('autoinstall'); - - $targetpackages = array(); - if($xmlDoc) - { - $xmlPackage =& $xmlDoc->response->package; - $package->package_srl = $xmlPackage->package_srl->body; - $package->title = $xmlPackage->title->body; - $package->package_description = $xmlPackage->package_description->body; - $package->version = $xmlPackage->version->body; - $package->path = $xmlPackage->path->body; - if($xmlPackage->depends) - { - if(!is_array($xmlPackage->depends->item)) $xmlPackage->depends->item = array($xmlPackage->depends->item); - $package->depends = array(); - foreach($xmlPackage->depends->item as $item) - { - $dep_item = null; - $dep_item->package_srl = $item->package_srl->body; - $dep_item->title = $item->title->body; - $dep_item->version = $item->version->body; - $dep_item->path = $item->path->body; - $package->depends[] = $dep_item; - $targetpackages[$dep_item->package_srl] = 1; - } - $packages = $oModel->getInstalledPackages(array_keys($targetpackages)); - $package->deplist = ""; - foreach($package->depends as $key => $dep) - { - if(!$packages[$dep->package_srl]) { - $package->depends[$key]->installed = false; - $package->package_srl .= ",". $dep->package_srl; - } - else { - $package->depends[$key]->installed = true; - $package->depends[$key]->cur_version = $packages[$dep->package_srl]->current_version; - if(version_compare($dep->version, $packages[$dep->package_srl]->current_version, ">")) - { - $package->depends[$key]->need_update = true; - $package->package_srl .= ",". $dep->package_srl; - } - else - { - $package->need_update = false; - } - } - } - } - $installedPackage = $oModel->getInstalledPackage($package_srl); - if($installedPackage) { - $package->installed = true; - $package->cur_version = $installedPackage->current_version; - $package->need_update = version_compare($package->version, $installedPackage->current_version, ">"); - } - - Context::set("package", $package); - } - if(!$_SESSION['ftp_password']) - { - Context::set('need_password', true); - } - $this->setTemplateFile('install'); - } - - function dispAutoinstallAdminIndex() { - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('autoinstall'); - $ftp_info = Context::getFTPInfo(); - if(!$ftp_info->ftp_root_path) Context::set('show_ftp_note', true); - - $this->setTemplateFile('index'); - - $params = array(); - $params["act"] = "getResourceapiLastupdate"; - $body = XmlGenerater::generate($params); - $buff = FileHandler::getRemoteResource($this->uri, $body, 3, "POST", "application/xml"); - $xml_lUpdate = new XmlParser(); - $lUpdateDoc = $xml_lUpdate->parse($buff); - $updateDate = $lUpdateDoc->response->updatedate->body; - - $oModel = &getModel('autoinstall'); - $item = $oModel->getLatestPackage(); - if(!$item || $item->updatedate < $updateDate || count($this->categories) < 1) - { - Context::set('need_update', true); - return; - } - - - $page = Context::get('page'); - if(!$page) $page = 1; - Context::set('page', $page); - - $order_type = Context::get('order_type'); - if(!in_array($order_type, array('asc', 'desc'))) $order_type = 'desc'; - Context::set('order_type', $order_type); - - $order_target = Context::get('order_target'); - if(!in_array($order_target, array('newest', 'download', 'popular'))) $order_target = 'newest'; - Context::set('order_target', $order_target); - - $search_keyword = Context::get('search_keyword'); - - $childrenList = Context::get('childrenList'); - $category_srl = Context::get('category_srl'); - if($childrenList) $params["category_srl"] = $childrenList; - else if($category_srl) $params["category_srl"] = $category_srl; - - $params["act"] = "getResourceapiPackagelist"; - $params["order_target"] = $order_target; - $params["order_type"] = $order_type; - $params["page"] = $page; - if($search_keyword) - { - $params["search_keyword"] = $search_keyword; - } - $xmlDoc = XmlGenerater::getXmlDoc($params); - if($xmlDoc && $xmlDoc->response->packagelist->item) - { - $item_list = $this->rearranges($xmlDoc->response->packagelist->item); - Context::set('item_list', $item_list); - $array = array('total_count', 'total_page', 'cur_page', 'page_count', 'first_page', 'last_page'); - $page_nav = $this->rearrange($xmlDoc->response->page_navigation, $array); - $page_navigation = new PageHandler($page_nav->total_count, $page_nav->total_page, $page_nav->cur_page, $page_nav->page_count); - Context::set('page_navigation', $page_navigation); - } - - } - - function dispCategory() - { - $oModel = &getModel('autoinstall'); - $this->categories = &$oModel->getCategoryList(); - Context::set('categories', $this->categories); - } - - function dispAutoinstallAdminUninstall() - { - $package_srl = Context::get('package_srl'); - if(!$package_srl) return $this->dispAutoinstallAdminIndex(); - $oModel =& getModel('autoinstall'); - $installedPackage = $oModel->getInstalledPackage($package_srl); - if(!$installedPackage) return $this->dispAutoinstallAdminInstalledPackages(); - - if(!$_SESSION['ftp_password']) - { - Context::set('need_password', true); - } - $installedPackage = $oModel->getPackage($package_srl); - $path = $installedPackage->path; - $type = $oModel->getTypeFromPath($path); - if(!$type || $type == "core") $this->stop("msg_invalid_request"); - $config_file = $oModel->getConfigFilePath($type); - if(!$config_file) $this->stop("msg_invalid_request"); - - $xml = new XmlParser(); - $xmlDoc = $xml->loadXmlFile(FileHandler::getRealPath($path).$config_file); - if(!$xmlDoc) $this->stop("msg_invalid_request"); - if($type == "drcomponent") $type = "component"; - if($type == "style") $type = "skin"; - $title = $xmlDoc->{$type}->title->body; - $installedPackage->title = $title; - $installedPackage->type = $type; - Context::set('package', $installedPackage); - - $this->setTemplateFile('uninstall'); - Context::addJsFilter($this->module_path.'tpl/filter', 'uninstall_package.xml'); - } - } -?> +module_path); + Context::set('original_site', $this->original_site); + Context::set('uri', $this->uri); + $this->setTemplatePath($template_path); + + $ftp_info = Context::getFTPInfo(); + if(!$ftp_info->ftp_root_path) Context::set('show_ftp_note', true); + else $this->ftp_set = true; + + + $this->dispCategory(); + $oModel = &getModel('autoinstall'); + Context::set('tCount', $oModel->getPackageCount(null)); + Context::set('iCount', $oModel->getInstalledPackageCount()); + } + + function rearrange(&$item, &$targets) + { + $ret = null; + foreach($targets as $target) + { + $ret->{$target} = $item->{$target}->body; + } + return $ret; + } + + function rearranges($items, $packages = null) + { + if(!is_array($items)) $items = array($items); + $item_list = array(); + $targets = array('category_srl', 'package_srl', 'item_screenshot_url', 'package_voted', 'package_voter', 'package_description', 'package_downloaded', 'item_regdate', 'title', 'item_version', 'package_star', 'depfrom'); + $targetpackages = array(); + foreach($items as $item) + { + $targetpackages[$item->package_srl->body] = 0; + } + $oModel = &getModel('autoinstall'); + if($package == null) + $packages = $oModel->getInstalledPackages(array_keys($targetpackages)); + $depto = array(); + foreach($items as $item) + { + $v = $this->rearrange($item, $targets); + if($packages[$v->package_srl]) + { + $v->current_version = $packages[$v->package_srl]->current_version; + $v->need_update = $packages[$v->package_srl]->need_update; + $v->type = $oModel->getTypeFromPath($packages[$v->package_srl]->path); + if($this->ftp_set && $v->depfrom) { + $depfrom = explode("," , $v->depfrom); + foreach($depfrom as $package_srl) + { + $depto[$package_srl][] = $v->package_srl; + } + } + if($v->type == "core") $v->avail_remove = false; + else if($v->type == "module") { + $v->avail_remove = $oModel->checkRemovable($packages[$v->package_srl]->path); + } + else $v->avail_remove = true; + } + $item_list[$v->package_srl] = $v; + } + + if(count($depto) > 0) + { + $installed = $oModel->getInstalledPackages(implode(",", array_keys($depto))); + foreach($installed as $key=>$val) + { + $path = $val->path; + $type = $oModel->getTypeFromPath($path); + if(!$type || $type == "core") continue; + $config_file = $oModel->getConfigFilePath($type); + if(!$config_file) continue; + + $xml = new XmlParser(); + $xmlDoc = $xml->loadXmlFile(FileHandler::getRealPath($path).$config_file); + if(!$xmlDoc) continue; + if($type == "drcomponent") $type = "component"; + if($type == "style" || $type == "m.skin") $type = "skin"; + if($type == "m.layout") $type = "layout"; + $title = $xmlDoc->{$type}->title->body; + $installed[$key]->title = $title; + } + Context::set('installed', $installed); + foreach($installed as $key=>$val) + { + foreach($depto[$key] as $package_srl) + { + $item_list[$package_srl]->avail_remove = false; + $item_list[$package_srl]->deps[] = $key; + } + } + } + + return $item_list; + } + + function dispAutoinstallAdminInstalledPackages() + { + $page = Context::get('page'); + if(!$page) $page = 1; + Context::set('page', $page); + $oModel = &getModel('autoinstall'); + $output = $oModel->getInstalledPackageList($page); + $package_list = $output->data; + + $params["act"] = "getResourceapiPackages"; + $params["package_srls"] = implode(",", array_keys($package_list)); + $body = XmlGenerater::generate($params); + $buff = FileHandler::getRemoteResource($this->uri, $body, 3, "POST", "application/xml"); + $xml_lUpdate = new XmlParser(); + $xmlDoc = $xml_lUpdate->parse($buff); + if($xmlDoc && $xmlDoc->response->packagelist->item) + { + $item_list = $this->rearranges($xmlDoc->response->packagelist->item, $package_list); + $res = array(); + foreach($package_list as $package_srl => $package) + { + $res[] = $item_list[$package_srl]; + } + Context::set('item_list', $res); + } + Context::set('page_navigation', $output->page_navigation); + + $this->setTemplateFile('index'); + } + + function dispAutoinstallAdminInstall() { + $package_srl = Context::get('package_srl'); + if(!$package_srl) return $this->dispAutoinstallAdminIndex(); + + $params["act"] = "getResourceapiInstallInfo"; + $params["package_srl"] = $package_srl; + $xmlDoc = XmlGenerater::getXmlDoc($params); + $oModel = &getModel('autoinstall'); + + $targetpackages = array(); + if($xmlDoc) + { + $xmlPackage =& $xmlDoc->response->package; + $package->package_srl = $xmlPackage->package_srl->body; + $package->title = $xmlPackage->title->body; + $package->package_description = $xmlPackage->package_description->body; + $package->version = $xmlPackage->version->body; + $package->path = $xmlPackage->path->body; + if($xmlPackage->depends) + { + if(!is_array($xmlPackage->depends->item)) $xmlPackage->depends->item = array($xmlPackage->depends->item); + $package->depends = array(); + foreach($xmlPackage->depends->item as $item) + { + $dep_item = null; + $dep_item->package_srl = $item->package_srl->body; + $dep_item->title = $item->title->body; + $dep_item->version = $item->version->body; + $dep_item->path = $item->path->body; + $package->depends[] = $dep_item; + $targetpackages[$dep_item->package_srl] = 1; + } + $packages = $oModel->getInstalledPackages(array_keys($targetpackages)); + $package->deplist = ""; + foreach($package->depends as $key => $dep) + { + if(!$packages[$dep->package_srl]) { + $package->depends[$key]->installed = false; + $package->package_srl .= ",". $dep->package_srl; + } + else { + $package->depends[$key]->installed = true; + $package->depends[$key]->cur_version = $packages[$dep->package_srl]->current_version; + if(version_compare($dep->version, $packages[$dep->package_srl]->current_version, ">")) + { + $package->depends[$key]->need_update = true; + $package->package_srl .= ",". $dep->package_srl; + } + else + { + $package->need_update = false; + } + } + } + } + $installedPackage = $oModel->getInstalledPackage($package_srl); + if($installedPackage) { + $package->installed = true; + $package->cur_version = $installedPackage->current_version; + $package->need_update = version_compare($package->version, $installedPackage->current_version, ">"); + } + + Context::set("package", $package); + } + if(!$_SESSION['ftp_password']) + { + Context::set('need_password', true); + } + $this->setTemplateFile('install'); + } + + function dispAutoinstallAdminIndex() { + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('autoinstall'); + $ftp_info = Context::getFTPInfo(); + if(!$ftp_info->ftp_root_path) Context::set('show_ftp_note', true); + + $this->setTemplateFile('index'); + + $params = array(); + $params["act"] = "getResourceapiLastupdate"; + $body = XmlGenerater::generate($params); + $buff = FileHandler::getRemoteResource($this->uri, $body, 3, "POST", "application/xml"); + $xml_lUpdate = new XmlParser(); + $lUpdateDoc = $xml_lUpdate->parse($buff); + $updateDate = $lUpdateDoc->response->updatedate->body; + + $oModel = &getModel('autoinstall'); + $item = $oModel->getLatestPackage(); + if(!$item || $item->updatedate < $updateDate || count($this->categories) < 1) + { + Context::set('need_update', true); + return; + } + + + $page = Context::get('page'); + if(!$page) $page = 1; + Context::set('page', $page); + + $order_type = Context::get('order_type'); + if(!in_array($order_type, array('asc', 'desc'))) $order_type = 'desc'; + Context::set('order_type', $order_type); + + $order_target = Context::get('order_target'); + if(!in_array($order_target, array('newest', 'download', 'popular'))) $order_target = 'newest'; + Context::set('order_target', $order_target); + + $search_keyword = Context::get('search_keyword'); + + $childrenList = Context::get('childrenList'); + $category_srl = Context::get('category_srl'); + if($childrenList) $params["category_srl"] = $childrenList; + else if($category_srl) $params["category_srl"] = $category_srl; + + $params["act"] = "getResourceapiPackagelist"; + $params["order_target"] = $order_target; + $params["order_type"] = $order_type; + $params["page"] = $page; + if($search_keyword) + { + $params["search_keyword"] = $search_keyword; + } + $xmlDoc = XmlGenerater::getXmlDoc($params); + if($xmlDoc && $xmlDoc->response->packagelist->item) + { + $item_list = $this->rearranges($xmlDoc->response->packagelist->item); + Context::set('item_list', $item_list); + $array = array('total_count', 'total_page', 'cur_page', 'page_count', 'first_page', 'last_page'); + $page_nav = $this->rearrange($xmlDoc->response->page_navigation, $array); + $page_navigation = new PageHandler($page_nav->total_count, $page_nav->total_page, $page_nav->cur_page, $page_nav->page_count); + Context::set('page_navigation', $page_navigation); + } + + } + + function dispCategory() + { + $oModel = &getModel('autoinstall'); + $this->categories = &$oModel->getCategoryList(); + Context::set('categories', $this->categories); + } + + function dispAutoinstallAdminUninstall() + { + $package_srl = Context::get('package_srl'); + if(!$package_srl) return $this->dispAutoinstallAdminIndex(); + $oModel =& getModel('autoinstall'); + $installedPackage = $oModel->getInstalledPackage($package_srl); + if(!$installedPackage) return $this->dispAutoinstallAdminInstalledPackages(); + + if(!$_SESSION['ftp_password']) + { + Context::set('need_password', true); + } + $installedPackage = $oModel->getPackage($package_srl); + $path = $installedPackage->path; + $type = $oModel->getTypeFromPath($path); + if(!$type || $type == "core") $this->stop("msg_invalid_request"); + $config_file = $oModel->getConfigFilePath($type); + if(!$config_file) $this->stop("msg_invalid_request"); + + $xml = new XmlParser(); + $xmlDoc = $xml->loadXmlFile(FileHandler::getRealPath($path).$config_file); + if(!$xmlDoc) $this->stop("msg_invalid_request"); + if($type == "drcomponent") $type = "component"; + if($type == "style") $type = "skin"; + $title = $xmlDoc->{$type}->title->body; + $installedPackage->title = $title; + $installedPackage->type = $type; + Context::set('package', $installedPackage); + + $this->setTemplateFile('uninstall'); + Context::addJsFilter($this->module_path.'tpl/filter', 'uninstall_package.xml'); + } + } +?> diff --git a/modules/autoinstall/autoinstall.class.php b/modules/autoinstall/autoinstall.class.php index a253e3719..5fc257d1c 100644 --- a/modules/autoinstall/autoinstall.class.php +++ b/modules/autoinstall/autoinstall.class.php @@ -1,87 +1,87 @@ -'; - if(!is_array($params)) return null; - $params["module"] = "resourceapi"; - foreach($params as $key => $val) - { - $xmlDoc .= sprintf("<%s>", $key, $val, $key); - } - $xmlDoc .= ""; - return $xmlDoc; - } - - function getXmlDoc(&$params) - { - $body = XmlGenerater::generate($params); - $buff = FileHandler::getRemoteResource($this->uri, $body, 3, "POST", "application/xml"); - if(!$buff) return; - $xml = new XmlParser(); - $xmlDoc = $xml->parse($buff); - return $xmlDoc; - } - } - - class autoinstall extends ModuleObject { - var $uri = "http://download.xpressengine.com/"; - var $original_site = "http://www.xpressengine.com/"; - var $tmp_dir = './files/cache/autoinstall/'; - - /** - * @brief 설치시 추가 작업이 필요할시 구현 - **/ - function moduleInstall() { - } - - /** - * @brief 설치가 이상이 없는지 체크하는 method - **/ - function checkUpdate() { - $oDB =& DB::getInstance(); - if(!file_exists(FileHandler::getRealPath("./modules/autoinstall/schemas/autoinstall_installed_packages.xml")) - && $oDB->isTableExists("autoinstall_installed_packages")) - { - return true; - } - if(!file_exists(FileHandler::getRealPath("./modules/autoinstall/schemas/autoinstall_remote_categories.xml")) - && $oDB->isTableExists("autoinstall_remote_categories")) - { - return true; - } - - return false; - } - - /** - * @brief 업데이트 실행 - **/ - function moduleUpdate() { - $oDB =& DB::getInstance(); - if(!file_exists(FileHandler::getRealPath("./modules/autoinstall/schemas/autoinstall_installed_packages.xml")) - && $oDB->isTableExists("autoinstall_installed_packages")) - { - $oDB->dropTable("autoinstall_installed_packages"); - } - if(!file_exists(FileHandler::getRealPath("./modules/autoinstall/schemas/autoinstall_remote_categories.xml")) - && $oDB->isTableExists("autoinstall_remote_categories")) - { - $oDB->dropTable("autoinstall_remote_categories"); - } - return new Object(0, 'success_updated'); - } - - /** - * @brief 캐시 파일 재생성 - **/ - function recompileCache() { - } - } -?> +'; + if(!is_array($params)) return null; + $params["module"] = "resourceapi"; + foreach($params as $key => $val) + { + $xmlDoc .= sprintf("<%s>", $key, $val, $key); + } + $xmlDoc .= ""; + return $xmlDoc; + } + + function getXmlDoc(&$params) + { + $body = XmlGenerater::generate($params); + $buff = FileHandler::getRemoteResource($this->uri, $body, 3, "POST", "application/xml"); + if(!$buff) return; + $xml = new XmlParser(); + $xmlDoc = $xml->parse($buff); + return $xmlDoc; + } + } + + class autoinstall extends ModuleObject { + var $uri = "http://download.xpressengine.com/"; + var $original_site = "http://www.xpressengine.com/"; + var $tmp_dir = './files/cache/autoinstall/'; + + /** + * @brief 설치시 추가 작업이 필요할시 구현 + **/ + function moduleInstall() { + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + **/ + function checkUpdate() { + $oDB =& DB::getInstance(); + if(!file_exists(FileHandler::getRealPath("./modules/autoinstall/schemas/autoinstall_installed_packages.xml")) + && $oDB->isTableExists("autoinstall_installed_packages")) + { + return true; + } + if(!file_exists(FileHandler::getRealPath("./modules/autoinstall/schemas/autoinstall_remote_categories.xml")) + && $oDB->isTableExists("autoinstall_remote_categories")) + { + return true; + } + + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + $oDB =& DB::getInstance(); + if(!file_exists(FileHandler::getRealPath("./modules/autoinstall/schemas/autoinstall_installed_packages.xml")) + && $oDB->isTableExists("autoinstall_installed_packages")) + { + $oDB->dropTable("autoinstall_installed_packages"); + } + if(!file_exists(FileHandler::getRealPath("./modules/autoinstall/schemas/autoinstall_remote_categories.xml")) + && $oDB->isTableExists("autoinstall_remote_categories")) + { + $oDB->dropTable("autoinstall_remote_categories"); + } + return new Object(0, 'success_updated'); + } + + /** + * @brief 캐시 파일 재생성 + **/ + function recompileCache() { + } + } +?> diff --git a/modules/autoinstall/autoinstall.model.php b/modules/autoinstall/autoinstall.model.php index 3a001ca47..8813d98b3 100644 --- a/modules/autoinstall/autoinstall.model.php +++ b/modules/autoinstall/autoinstall.model.php @@ -1,185 +1,185 @@ -category_srl = $category_srl; - $output = executeQueryArray("autoinstall.getCategory", $args); - if(!$output->data) return null; - return array_shift($output->data); - } - - function getPackages() - { - $output = executeQueryArray("autoinstall.getPackages"); - if(!$output->data) return array(); - return $output->data; - } - - function getInstalledPackage($package_srl) - { - $args->package_srl = $package_srl; - $output = executeQueryArray("autoinstall.getInstalledPackage", $args); - if(!$output->data) return null; - return array_shift($output->data); - } - - function getPackage($package_srl) - { - $args->package_srl = $package_srl; - $output = executeQueryArray("autoinstall.getPackage", $args); - if(!$output->data) return null; - return array_shift($output->data); - } - - function getCategoryList() - { - $output = executeQueryArray("autoinstall.getCategories"); - if(!$output->toBool() || !$output->data) return array(); - - $categoryList = array(); - foreach($output->data as $category) - { - $category->children = array(); - $categoryList[$category->category_srl] = $category; - } - - $depth0 = array(); - foreach($categoryList as $key => $category) - { - if($category->parent_srl) - { - $categoryList[$category->parent_srl]->children[] =& $categoryList[$key]; - } - else - { - $depth0[] = $key; - } - } - $resultList = array(); - foreach($depth0 as $category_srl) - { - $this->setDepth($categoryList[$category_srl], 0, $categoryList, $resultList); - } - return $resultList; - } - - function getPackageCount($category_srl) - { - $args->category_srl = $category_srl; - $output = executeQuery("autoinstall.getPackageCount", $args); - if(!$output->data) return 0; - return $output->data->count; - } - - function getInstalledPackageCount() - { - $output = executeQuery("autoinstall.getInstalledPackageCount", $args); - if(!$output->data) return 0; - return $output->data->count; - } - - function setDepth(&$item, $depth, &$list, &$resultList) - { - $resultList[$item->category_srl] =& $item; - $item->depth = $depth; - $siblingList = $item->category_srl; - foreach($item->children as $child) - { - $siblingList .= ",".$this->setDepth($list[$child->category_srl], $depth+1, $list, $resultList); - } - if(count($item->children) < 1) - { - $item->nPackages = $this->getPackageCount($item->category_srl); - } - $item->childrenList = $siblingList; - return $siblingList; - } - - function getLatestPackage() { - $output = executeQueryArray("autoinstall.getLatestPackage"); - if(!$output->data) return null; - return array_shift($output->data); - } - - function getInstalledPackages($package_list) { - $args->package_list = $package_list; - $output = executeQueryArray("autoinstall.getInstalledPackages", $args); - $result = array(); - if(!$output->data) return $result; - foreach($output->data as $value) - { - $result[$value->package_srl] = $value; - } - return $result; - } - - function getInstalledPackageList($page) - { - $args->page = $page; - $output = executeQueryArray("autoinstall.getInstalledPackageList", $args); - $res = array(); - foreach($output->data as $val) - { - $res[$val->package_srl] = $val; - } - $output->data = $res; - return $output; - } - - function getTypeFromPath($path) - { - if(!$path) return null; - if($path == ".") return "core"; - $path_array = explode("/", $path); - $target_name = array_pop($path_array); - $type = substr(array_pop($path_array), 0, -1); - return $type; - } - - function getConfigFilePath($type) - { - $config_file = null; - switch($type) - { - case "m.layout": - case "module": - case "addon": - case "layout": - case "widget": - $config_file = "/conf/info.xml"; - break; - case "component": - $config_file = "/info.xml"; - break; - case "m.skin": - case "skin": - case "widgetstyle": - case "style": - $config_file = "/skin.xml"; - break; - case "drcomponent": - $config_file = "/info.xml"; - break; - } - return $config_file; - } - - function checkRemovable($path) - { - $path_array = explode("/", $path); - $target_name = array_pop($path_array); - $oModule =& getModule($target_name, "class"); - if(!$oModule) return false; - if(method_exists($oModule, "moduleUninstall")) return true; - else return false; - } - - } -?> +category_srl = $category_srl; + $output = executeQueryArray("autoinstall.getCategory", $args); + if(!$output->data) return null; + return array_shift($output->data); + } + + function getPackages() + { + $output = executeQueryArray("autoinstall.getPackages"); + if(!$output->data) return array(); + return $output->data; + } + + function getInstalledPackage($package_srl) + { + $args->package_srl = $package_srl; + $output = executeQueryArray("autoinstall.getInstalledPackage", $args); + if(!$output->data) return null; + return array_shift($output->data); + } + + function getPackage($package_srl) + { + $args->package_srl = $package_srl; + $output = executeQueryArray("autoinstall.getPackage", $args); + if(!$output->data) return null; + return array_shift($output->data); + } + + function getCategoryList() + { + $output = executeQueryArray("autoinstall.getCategories"); + if(!$output->toBool() || !$output->data) return array(); + + $categoryList = array(); + foreach($output->data as $category) + { + $category->children = array(); + $categoryList[$category->category_srl] = $category; + } + + $depth0 = array(); + foreach($categoryList as $key => $category) + { + if($category->parent_srl) + { + $categoryList[$category->parent_srl]->children[] =& $categoryList[$key]; + } + else + { + $depth0[] = $key; + } + } + $resultList = array(); + foreach($depth0 as $category_srl) + { + $this->setDepth($categoryList[$category_srl], 0, $categoryList, $resultList); + } + return $resultList; + } + + function getPackageCount($category_srl) + { + $args->category_srl = $category_srl; + $output = executeQuery("autoinstall.getPackageCount", $args); + if(!$output->data) return 0; + return $output->data->count; + } + + function getInstalledPackageCount() + { + $output = executeQuery("autoinstall.getInstalledPackageCount", $args); + if(!$output->data) return 0; + return $output->data->count; + } + + function setDepth(&$item, $depth, &$list, &$resultList) + { + $resultList[$item->category_srl] =& $item; + $item->depth = $depth; + $siblingList = $item->category_srl; + foreach($item->children as $child) + { + $siblingList .= ",".$this->setDepth($list[$child->category_srl], $depth+1, $list, $resultList); + } + if(count($item->children) < 1) + { + $item->nPackages = $this->getPackageCount($item->category_srl); + } + $item->childrenList = $siblingList; + return $siblingList; + } + + function getLatestPackage() { + $output = executeQueryArray("autoinstall.getLatestPackage"); + if(!$output->data) return null; + return array_shift($output->data); + } + + function getInstalledPackages($package_list) { + $args->package_list = $package_list; + $output = executeQueryArray("autoinstall.getInstalledPackages", $args); + $result = array(); + if(!$output->data) return $result; + foreach($output->data as $value) + { + $result[$value->package_srl] = $value; + } + return $result; + } + + function getInstalledPackageList($page) + { + $args->page = $page; + $output = executeQueryArray("autoinstall.getInstalledPackageList", $args); + $res = array(); + foreach($output->data as $val) + { + $res[$val->package_srl] = $val; + } + $output->data = $res; + return $output; + } + + function getTypeFromPath($path) + { + if(!$path) return null; + if($path == ".") return "core"; + $path_array = explode("/", $path); + $target_name = array_pop($path_array); + $type = substr(array_pop($path_array), 0, -1); + return $type; + } + + function getConfigFilePath($type) + { + $config_file = null; + switch($type) + { + case "m.layout": + case "module": + case "addon": + case "layout": + case "widget": + $config_file = "/conf/info.xml"; + break; + case "component": + $config_file = "/info.xml"; + break; + case "m.skin": + case "skin": + case "widgetstyle": + case "style": + $config_file = "/skin.xml"; + break; + case "drcomponent": + $config_file = "/info.xml"; + break; + } + return $config_file; + } + + function checkRemovable($path) + { + $path_array = explode("/", $path); + $target_name = array_pop($path_array); + $oModule =& getModule($target_name, "class"); + if(!$oModule) return false; + if(method_exists($oModule, "moduleUninstall")) return true; + else return false; + } + + } +?> diff --git a/modules/autoinstall/autoinstall.view.php b/modules/autoinstall/autoinstall.view.php index a925b30a8..6aa3830a7 100644 --- a/modules/autoinstall/autoinstall.view.php +++ b/modules/autoinstall/autoinstall.view.php @@ -1,26 +1,26 @@ -install($file, $checksum); - return $output; - } - } -?> +install($file, $checksum); + return $output; + } + } +?> diff --git a/modules/autoinstall/conf/info.xml b/modules/autoinstall/conf/info.xml index bdddf4b8f..25e8b6521 100644 --- a/modules/autoinstall/conf/info.xml +++ b/modules/autoinstall/conf/info.xml @@ -1,30 +1,30 @@ - - - 쉬운 설치 - EasyInstaller - Cài đặt tự động - 自動安裝 - 安装·更新 - イージーインストール - KolayKurulum - 관리자 모드에서 클릭으로 모듈/스킨/레이아웃/위젯/위젯스타일 등을 설치하는 모듈입니다. - 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. - 可以藉由此模組安裝、更新程式包括模組、面板、版面等。 - Bu modül ile modüller, dış görünümler, yerleşim düzenleri.. gibi kendi programlarınızı, www.xpressengine.com adresinden tek bir tık ile kurup-düzenleyebilirsiniz. - 很方便的在线安装/更新XE相关模块(模块/皮肤/布局/控件/控件样式等)。 - 管理者モードにてクリックだけで、モジュール/スキン/レイアウト/ウィジェット/ウィジェットスタイルのインストールを可能にするモジュールです。 - Bu modülle; modüller, dış görünümler, yerleşim düzenleri vs. gibi programlarınızı www.xpressengine.com adresinden tek tıkla kurabilir ve sürümlerini yükseltebilirsiniz. - 0.3 - 2009-11-11 - system - - NHN - NHN - NHN - NHN - NHN - NHN - NHN - - + + + 쉬운 설치 + EasyInstaller + Cài đặt tự động + 自動安裝 + 安装·更新 + イージーインストール + KolayKurulum + 관리자 모드에서 클릭으로 모듈/스킨/레이아웃/위젯/위젯스타일 등을 설치하는 모듈입니다. + 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. + 可以藉由此模組安裝、更新程式包括模組、面板、版面等。 + Bu modül ile modüller, dış görünümler, yerleşim düzenleri.. gibi kendi programlarınızı, www.xpressengine.com adresinden tek bir tık ile kurup-düzenleyebilirsiniz. + 很方便的在线安装/更新XE相关模块(模块/皮肤/布局/控件/控件样式等)。 + 管理者モードにてクリックだけで、モジュール/スキン/レイアウト/ウィジェット/ウィジェットスタイルのインストールを可能にするモジュールです。 + Bu modülle; modüller, dış görünümler, yerleşim düzenleri vs. gibi programlarınızı www.xpressengine.com adresinden tek tıkla kurabilir ve sürümlerini yükseltebilirsiniz. + 0.3 + 2009-11-11 + system + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + diff --git a/modules/autoinstall/lang/en.lang.php b/modules/autoinstall/lang/en.lang.php index 128114de0..356e5e787 100644 --- a/modules/autoinstall/lang/en.lang.php +++ b/modules/autoinstall/lang/en.lang.php @@ -1,35 +1,35 @@ -autoinstall = 'EasyInstall'; - $lang->about_autoinstall = 'EasyInstall module will help you install/upgrade programs(skins) for XE.'; - $lang->package_update = 'Recent Update'; - $lang->package_downloaded_count = 'Download Count'; - $lang->need_update = "Please update package list first."; - - $lang->order_newest = "Newest"; - $lang->order_popular = "Popular"; - $lang->order_download = "Download"; - $lang->success_installed = "Successfully Installed"; - $lang->view_all_package = "View All"; - $lang->description_ftp_note = "If FTP configuration is not set, installation would not work. Please configure FTP information"; - $lang->description_update = "If you have upgraded or installed programs without EasyInstall module, please press update button to renew new information."; - $lang->install = "Install"; - $lang->update = "Update"; - $lang->current_version = "Version"; - $lang->depending_programs = "This program is depending on "; - $lang->require_update = "Update is required."; - $lang->require_installation = "Installation is required."; - $lang->description_install = "EasyInstall will also install/update all other programs which this program is depending on"; - $lang->description_download = "If FTP is unavailable, you should manually 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"; - $lang->view_installed_packages = "Installed Packages"; - $lang->msg_ftp_password_input = "Please input FTP password."; - $lang->dependant_list = "Dependant package list of current package"; - $lang->description_uninstall = "Package will be uninstalled. For modules, all data will be deleted."; -?> +autoinstall = 'EasyInstall'; + $lang->about_autoinstall = 'EasyInstall module will help you install/upgrade programs(skins) for XE.'; + $lang->package_update = 'Recent Update'; + $lang->package_downloaded_count = 'Download Count'; + $lang->need_update = "Please update package list first."; + + $lang->order_newest = "Newest"; + $lang->order_popular = "Popular"; + $lang->order_download = "Download"; + $lang->success_installed = "Successfully Installed"; + $lang->view_all_package = "View All"; + $lang->description_ftp_note = "If FTP configuration is not set, installation would not work. Please configure FTP information"; + $lang->description_update = "If you have upgraded or installed programs without EasyInstall module, please press update button to renew new information."; + $lang->install = "Install"; + $lang->update = "Update"; + $lang->current_version = "Version"; + $lang->depending_programs = "This program is depending on "; + $lang->require_update = "Update is required."; + $lang->require_installation = "Installation is required."; + $lang->description_install = "EasyInstall will also install/update all other programs which this program is depending on"; + $lang->description_download = "If FTP is unavailable, you should manually 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"; + $lang->view_installed_packages = "Installed Packages"; + $lang->msg_ftp_password_input = "Please input FTP password."; + $lang->dependant_list = "Dependant package list of current package"; + $lang->description_uninstall = "Package will be uninstalled. For modules, all data will be deleted."; +?> diff --git a/modules/autoinstall/lang/jp.lang.php b/modules/autoinstall/lang/jp.lang.php index 0dfc76b35..8abab4e3f 100644 --- a/modules/autoinstall/lang/jp.lang.php +++ b/modules/autoinstall/lang/jp.lang.php @@ -1,35 +1,35 @@ -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の利用が出来ない場合は、直接ダウンロードし、サーバー上の該当パスにてインストールして下さい。 (一つ上階層にて解凍します。 ./modules/board の場合 ./modulesにて tarを解凍して下さい。)"; - $lang->path = "インストールパス"; - $lang->cmd_download = "ダウンロード"; - $lang->view_installed_packages = "インストールされたパッケージ"; - $lang->msg_ftp_password_input = "FTPパスワードを入力して下さい。"; - $lang->dependant_list = "このパッケージに依存するパッケージのリスト"; - $lang->description_uninstall = "パッケージを削除します。モジュールの場合、すべてのデータを失います。"; -?> +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の利用が出来ない場合は、直接ダウンロードし、サーバー上の該当パスにてインストールして下さい。 (一つ上階層にて解凍します。 ./modules/board の場合 ./modulesにて tarを解凍して下さい。)"; + $lang->path = "インストールパス"; + $lang->cmd_download = "ダウンロード"; + $lang->view_installed_packages = "インストールされたパッケージ"; + $lang->msg_ftp_password_input = "FTPパスワードを入力して下さい。"; + $lang->dependant_list = "このパッケージに依存するパッケージのリスト"; + $lang->description_uninstall = "パッケージを削除します。モジュールの場合、すべてのデータを失います。"; +?> diff --git a/modules/autoinstall/lang/ko.lang.php b/modules/autoinstall/lang/ko.lang.php index 197eb0a66..ec59e7ca5 100644 --- a/modules/autoinstall/lang/ko.lang.php +++ b/modules/autoinstall/lang/ko.lang.php @@ -1,35 +1,35 @@ -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 = "설치경로"; - $lang->cmd_download = "다운로드"; - $lang->view_installed_packages = "설치된 패키지"; - $lang->msg_ftp_password_input = "FTP 비밀번호를 입력해주세요"; - $lang->dependant_list = "이 패키지에 의존하는 패키지 목록"; - $lang->description_uninstall = "패키지를 삭제합니다. 모듈의 경우 모든 데이터가 사라집니다."; -?> +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 = "설치경로"; + $lang->cmd_download = "다운로드"; + $lang->view_installed_packages = "설치된 패키지"; + $lang->msg_ftp_password_input = "FTP 비밀번호를 입력해주세요"; + $lang->dependant_list = "이 패키지에 의존하는 패키지 목록"; + $lang->description_uninstall = "패키지를 삭제합니다. 모듈의 경우 모든 데이터가 사라집니다."; +?> diff --git a/modules/autoinstall/lang/ru.lang.php b/modules/autoinstall/lang/ru.lang.php index 0a15c9cdb..c80d3900e 100644 --- a/modules/autoinstall/lang/ru.lang.php +++ b/modules/autoinstall/lang/ru.lang.php @@ -1,35 +1,35 @@ -autoinstall = 'EasyInstall'; - $lang->about_autoinstall = 'EasyInstall module will help you install/upgrade programs(skins) for XE.'; - $lang->package_update = 'Recent Update'; - $lang->package_downloaded_count = 'Download Count'; - $lang->need_update = 'Please update package list first.'; - - $lang->order_newest = 'Ӭ'; - $lang->order_popular = 'ݬ߬'; - $lang->order_download = 'ܬѬѬ'; - $lang->success_installed = 'Ѭ߬Ӭݬ֬߬ ֬߬'; - $lang->view_all_package = 'ܬѬ٬Ѭ Ӭ'; - $lang->description_ftp_note = 'If FTP configuration is not set, installation would not work. Please configure FTP information'; - $lang->description_update = 'If you have upgraded or installed programs without EasyInstall module, please press update button to renew new information'; - $lang->install = '߬ѬݬݬڬӬѬ'; - $lang->update = 'Ҭ߬Ӭڬ'; - $lang->current_version = 'Version'; - $lang->depending_programs = 'This program is depending on'; - $lang->require_update = 'Update is required'; - $lang->require_installation = 'Installation is required'; - $lang->description_install = 'EasyInstall will also install/update all other programs which this program is depending on'; - $lang->description_download = 'If FTP is unavailable, you should manually 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'; - $lang->view_installed_packages = 'Installed Packages'; - $lang->msg_ftp_password_input = 'Please input FTP password'; - $lang->dependant_list = " Ű ϴ Ű "; - $lang->description_uninstall = "Ű մϴ. Ͱ ϴ."; -?> +autoinstall = 'EasyInstall'; + $lang->about_autoinstall = 'EasyInstall module will help you install/upgrade programs(skins) for XE.'; + $lang->package_update = 'Recent Update'; + $lang->package_downloaded_count = 'Download Count'; + $lang->need_update = 'Please update package list first.'; + + $lang->order_newest = 'Ӭ'; + $lang->order_popular = 'ݬ߬'; + $lang->order_download = 'ܬѬѬ'; + $lang->success_installed = 'Ѭ߬Ӭݬ֬߬ ֬߬'; + $lang->view_all_package = 'ܬѬ٬Ѭ Ӭ'; + $lang->description_ftp_note = 'If FTP configuration is not set, installation would not work. Please configure FTP information'; + $lang->description_update = 'If you have upgraded or installed programs without EasyInstall module, please press update button to renew new information'; + $lang->install = '߬ѬݬݬڬӬѬ'; + $lang->update = 'Ҭ߬Ӭڬ'; + $lang->current_version = 'Version'; + $lang->depending_programs = 'This program is depending on'; + $lang->require_update = 'Update is required'; + $lang->require_installation = 'Installation is required'; + $lang->description_install = 'EasyInstall will also install/update all other programs which this program is depending on'; + $lang->description_download = 'If FTP is unavailable, you should manually 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'; + $lang->view_installed_packages = 'Installed Packages'; + $lang->msg_ftp_password_input = 'Please input FTP password'; + $lang->dependant_list = " Ű ϴ Ű "; + $lang->description_uninstall = "Ű մϴ. Ͱ ϴ."; +?> diff --git a/modules/autoinstall/lang/tr.lang.php b/modules/autoinstall/lang/tr.lang.php index ceaeb7009..b3590a1a2 100644 --- a/modules/autoinstall/lang/tr.lang.php +++ b/modules/autoinstall/lang/tr.lang.php @@ -1,35 +1,35 @@ -autoinstall = 'KolayKurulum'; - $lang->about_autoinstall = 'KolayKurulum modülü size programların(dış görünüm), XE\'ye kurulumunda ve sürüm yükseltmesinde yardımcı olacaktır.'; - $lang->package_update = 'Son Güncellemeler'; - $lang->package_downloaded_count = 'İndirme Sayısı'; - $lang->need_update = "Lütfen önce paket listesini güncelleyiniz."; - - $lang->order_newest = "En Yeniler"; - $lang->order_popular = "Popüler"; - $lang->order_download = "İndirme"; - $lang->success_installed = "Başarıyla Kuruldu"; - $lang->view_all_package = "Tümünü Göster"; - $lang->description_ftp_note = "Eğer FTP düzeni ayarlanmadıysa, kurulum çalışmayacaktır.Lütfen FTP bilgisini yapılandırınız."; - $lang->description_update = "Eğer KolayKurulum modülünü kullanmadan programları kurduysanız ya da güncelleştirdiyseniz, lütfen yeni bilgiyi uyarlamak için güncelleştir tuşuna basınız."; - $lang->install = "Kurulum"; - $lang->update = "Güncelle"; - $lang->current_version = "Sürüm"; - $lang->depending_programs = "Bu program için aşağıdaki program(lar) gereklidir : "; - $lang->require_update = "Güncelleme gerekmektedir."; - $lang->require_installation = "Kurulum gerekmektedir."; - $lang->description_install = "KolayKurulum, bu program için gerekli olan tüm diğer programları kurup/güncelleştirecektir."; - $lang->description_download = "Eğer FTP kullanılamaz durumduysa, indirmeyi kendiniz yapmanız ve dosyaları hedef dizine çıkartmanız gerekmektedir. (eğer hedef yol ./modules/board ise, çıkarma işlemini ./modules yoluna yapınız)"; - $lang->path = "Yol"; - $lang->cmd_download = "İndirme"; - $lang->view_installed_packages = "Kurulmuş Paketler"; - $lang->msg_ftp_password_input = "Lütfen FTP şifresini giriniz."; - $lang->dependant_list = "Mevcut pakete bağlı paket listesi"; - $lang->description_uninstall = "Paket kaldırılacaktır. Modüller için, tüm veriler silinecektir."; -?> +autoinstall = 'KolayKurulum'; + $lang->about_autoinstall = 'KolayKurulum modülü size programların(dış görünüm), XE\'ye kurulumunda ve sürüm yükseltmesinde yardımcı olacaktır.'; + $lang->package_update = 'Son Güncellemeler'; + $lang->package_downloaded_count = 'İndirme Sayısı'; + $lang->need_update = "Lütfen önce paket listesini güncelleyiniz."; + + $lang->order_newest = "En Yeniler"; + $lang->order_popular = "Popüler"; + $lang->order_download = "İndirme"; + $lang->success_installed = "Başarıyla Kuruldu"; + $lang->view_all_package = "Tümünü Göster"; + $lang->description_ftp_note = "Eğer FTP düzeni ayarlanmadıysa, kurulum çalışmayacaktır.Lütfen FTP bilgisini yapılandırınız."; + $lang->description_update = "Eğer KolayKurulum modülünü kullanmadan programları kurduysanız ya da güncelleştirdiyseniz, lütfen yeni bilgiyi uyarlamak için güncelleştir tuşuna basınız."; + $lang->install = "Kurulum"; + $lang->update = "Güncelle"; + $lang->current_version = "Sürüm"; + $lang->depending_programs = "Bu program için aşağıdaki program(lar) gereklidir : "; + $lang->require_update = "Güncelleme gerekmektedir."; + $lang->require_installation = "Kurulum gerekmektedir."; + $lang->description_install = "KolayKurulum, bu program için gerekli olan tüm diğer programları kurup/güncelleştirecektir."; + $lang->description_download = "Eğer FTP kullanılamaz durumduysa, indirmeyi kendiniz yapmanız ve dosyaları hedef dizine çıkartmanız gerekmektedir. (eğer hedef yol ./modules/board ise, çıkarma işlemini ./modules yoluna yapınız)"; + $lang->path = "Yol"; + $lang->cmd_download = "İndirme"; + $lang->view_installed_packages = "Kurulmuş Paketler"; + $lang->msg_ftp_password_input = "Lütfen FTP şifresini giriniz."; + $lang->dependant_list = "Mevcut pakete bağlı paket listesi"; + $lang->description_uninstall = "Paket kaldırılacaktır. Modüller için, tüm veriler silinecektir."; +?> diff --git a/modules/autoinstall/lang/vi.lang.php b/modules/autoinstall/lang/vi.lang.php index 643dac247..c7cad465a 100644 --- a/modules/autoinstall/lang/vi.lang.php +++ b/modules/autoinstall/lang/vi.lang.php @@ -1,35 +1,35 @@ -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"; - $lang->cmd_download = "Download"; - $lang->view_installed_packages = "Những gói đã cài đặt"; - $lang->msg_ftp_password_input = "Hãy nhập mật khẩu của FTP."; - $lang->dependant_list = "Gói cài đặt này phụ thuộc vào các gói khác trong danh sách"; - $lang->description_uninstall = "Loại bỏ gói cài đặt. Tất cả dữ liệu của các gói sẽ đồng thời bị xóa."; -?> +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"; + $lang->cmd_download = "Download"; + $lang->view_installed_packages = "Những gói đã cài đặt"; + $lang->msg_ftp_password_input = "Hãy nhập mật khẩu của FTP."; + $lang->dependant_list = "Gói cài đặt này phụ thuộc vào các gói khác trong danh sách"; + $lang->description_uninstall = "Loại bỏ gói cài đặt. Tất cả dữ liệu của các gói sẽ đồng thời bị xóa."; +?> diff --git a/modules/autoinstall/lang/zh-CN.lang.php b/modules/autoinstall/lang/zh-CN.lang.php index 87b3d94bd..3a7bde60f 100644 --- a/modules/autoinstall/lang/zh-CN.lang.php +++ b/modules/autoinstall/lang/zh-CN.lang.php @@ -1,35 +1,35 @@ -autoinstall = '安装·更新'; - $lang->about_autoinstall = '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设置,否则将无法在线安装(更新)相关模块。"; - $lang->description_update = "新安装(更新)模块的版本信息,点击Update按钮后才能正常显示。"; - $lang->install = "安装"; - $lang->update = "更新"; - $lang->current_version = "现用版本"; - $lang->depending_programs = "联动插件/控件"; - $lang->require_update = "需要更新"; - $lang->require_installation = "需要安装"; - $lang->description_install = "安装时,与其联动的插件/控件也会同时被安装(更新)。"; - $lang->description_download = "无法使用FTP时,需得自行下载安装到指定路径。"; - $lang->path = "安装路径"; - $lang->cmd_download = "下载"; - $lang->view_installed_packages = "已安装的数据包"; - $lang->msg_ftp_password_input = "请输入FTP密码。"; - $lang->dependant_list = "联动数据包列表"; - $lang->description_uninstall = "确定要删除此数据包吗?如果此数据包为模块,模块中的数据将会全部消失。"; -?> +autoinstall = '安装·更新'; + $lang->about_autoinstall = '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设置,否则将无法在线安装(更新)相关模块。"; + $lang->description_update = "新安装(更新)模块的版本信息,点击Update按钮后才能正常显示。"; + $lang->install = "安装"; + $lang->update = "更新"; + $lang->current_version = "现用版本"; + $lang->depending_programs = "联动插件/控件"; + $lang->require_update = "需要更新"; + $lang->require_installation = "需要安装"; + $lang->description_install = "安装时,与其联动的插件/控件也会同时被安装(更新)。"; + $lang->description_download = "无法使用FTP时,需得自行下载安装到指定路径。"; + $lang->path = "安装路径"; + $lang->cmd_download = "下载"; + $lang->view_installed_packages = "已安装的数据包"; + $lang->msg_ftp_password_input = "请输入FTP密码。"; + $lang->dependant_list = "联动数据包列表"; + $lang->description_uninstall = "确定要删除此数据包吗?如果此数据包为模块,模块中的数据将会全部消失。"; +?> diff --git a/modules/autoinstall/lang/zh-TW.lang.php b/modules/autoinstall/lang/zh-TW.lang.php index 00b23e5d0..208226a06 100644 --- a/modules/autoinstall/lang/zh-TW.lang.php +++ b/modules/autoinstall/lang/zh-TW.lang.php @@ -1,35 +1,35 @@ -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 設定好,否則無法執行自動安裝功能。"; - $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 無法使用的話,必須要手動下載並解壓縮到目標路徑。(假設目標路徑為 ./modules/board 的話,將檔案解壓縮到 ./modules就可以了)"; - $lang->path = "路徑"; - $lang->cmd_download = "下載"; - $lang->view_installed_packages = "已安裝程式"; - $lang->msg_ftp_password_input = "請輸入 FTP 密碼"; - $lang->dependant_list = "與此程式相關程式列表"; - $lang->description_uninstall = "移除模組,所有資料將會被刪除。"; -?> +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 設定好,否則無法執行自動安裝功能。"; + $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 無法使用的話,必須要手動下載並解壓縮到目標路徑。(假設目標路徑為 ./modules/board 的話,將檔案解壓縮到 ./modules就可以了)"; + $lang->path = "路徑"; + $lang->cmd_download = "下載"; + $lang->view_installed_packages = "已安裝程式"; + $lang->msg_ftp_password_input = "請輸入 FTP 密碼"; + $lang->dependant_list = "與此程式相關程式列表"; + $lang->description_uninstall = "移除模組,所有資料將會被刪除。"; +?> diff --git a/modules/autoinstall/tpl/css/autoinstall.css b/modules/autoinstall/tpl/css/autoinstall.css index 776413188..5ad21f400 100644 --- a/modules/autoinstall/tpl/css/autoinstall.css +++ b/modules/autoinstall/tpl/css/autoinstall.css @@ -1,59 +1,59 @@ -@charset "utf-8"; -/* NHN (developers@xpressengine.com) */ -.install{ border-top:1px solid #ddd; *zoom:1;} -.install:after{ content:""; display:block; clear:both;} - -.aside { width:180px; float:left; margin-right:30px; padding-bottom:30px; } - -.aside .categoryBox { background-color:#F8F8F8; padding:10px; width:160px; overflow:hidden; } -.aside .categoryBox h3 { padding:0 0 10px 0; margin:0 0 10px 0; white-space:nowrap; overflow:hidden; color:#48494E; font-size:11px; font-weight:normal;} -.aside .categoryBox .bottomLine {background:transparent url(../img/hrE1.gif) repeat-x scroll left bottom;} -.aside .categoryBox .topLine {background:transparent url(../img/hrE1.gif) repeat-x scroll left top;} -.aside .categoryBox h3 a { color:#48494E; font-size:12px; font-weight:bold; text-decoration:none; } -.aside .categoryBox ul.category { margin:10px 0 0 0; padding:0; list-style:none; } -.aside .categoryBox ul.category li { margin:0 0 10px 10px; } -.aside .categoryBox ul.category li a.selected { font-weight:bold; color:#2893BB; } -.aside .categoryBox ul.category li a { text-decoration:none; color:#7B7575; } -.aside .categoryBox ul.category li span { font-family:verdana; font-size:10px; color:#999; } - -.aside .categoryBox ul.resourceManage { margin:0; padding:10px 0 0 0; list-style:none; background:transparent url(../img/hrE1.gif) repeat-x scroll left top; } -.aside .categoryBox ul.resourceManage li { background:url(../img/btnManage.gif) no-repeat 2px 2px; padding-left:14px; white-space:nowrap; overflow:hidden; margin-bottom:10px; } -.aside .categoryBox ul.resourceManage li a { text-decoration:none; color:#747474; } -.aside .categoryBox ul.resourceManage li a.selected { font-weight:bold; } - -.aside .searchBox { padding:10px 0; text-align:center; } -.aside .searchBox input.input { border:1px solid #ddd; width:120px; height:16px;} -.aside .searchBox input.submit { vertical-align:middle; } - -.install .content { position:relative; *zoom:1; overflow:hidden; width:auto; float:none; margin:0;} - -.updateList, -.updateList th, -.updateList td{ border:0; vertical-align:top; text-align:left; padding:10px 0;} -.updateList {width:100%; height:100px; table-layout:fixed;} -.updateList th, -.updateList td{ border-bottom:1px dotted #ddd;} -.updateList th img { border:1px solid #ccc; padding:2px; overflow:hidden; *zoom:1; } -.updateList td { padding:10px 0 0 0;} -.updateList td .title{ position:relative;} -.updateList td .title h3 { padding:0; margin:0 0 5px 0; font-size:12px;} -.updateList td .title a {text-decoration:none; color:#333 !important; } -.updateList td .title .buttons{ position:absolute; top:0; right:0;} -.updateList td .info p{ margin:0 0 5px 0; line-height:1.5;} -.updateList td .info p.desc{ margin:0 100px 10px 0;} -.updateList td .info p.meta{ font-size:11px;} -.updateList td .info p.meta span{ display:inline-block; line-height:1; padding:0 5px 0 9px;} -.updateList td .info p.meta .reputation{ padding:0 5px 0 0;} -.updateList td .info p.meta .reputation img{ float:left; margin:-1px 0 0 0;} -.updateList td .info p.meta .reputation span{ padding:0 0 0 5px;} -.updateList td .info p.meta .lastUpdate{ border-left:1px solid #ddd;} -.updateList td .info p.meta .download{ border-left:1px solid #ddd;} - -ul.listOrder { position:relative; overflow:hidden; margin:0; padding:10px 0; text-align:left; background:transparent url(../img/hrE1.gif) repeat-x scroll left bottom;} -ul.listOrder.asc li.arrow { background:url(../img/arrUp.gif) no-repeat right 2px; padding-right:10px; } -ul.listOrder.desc li.arrow { background:url(../img/arrDown.gif) no-repeat right 2px; padding-right:10px; } -ul.listOrder li { position:relative; left:-1px; display:inline; margin:0; padding:0 5px 0 9px; border-left:1px solid #ddd;} -ul.listOrder li.arrow a { text-decoration:none; font-weight:bold; color:#2893BB; } -ul.listOrder li a { text-decoration:none; color:#7B7575; } - -p.caution strong { font-size: 1.2em; font-weight: bold; color: red; } +@charset "utf-8"; +/* NHN (developers@xpressengine.com) */ +.install{ border-top:1px solid #ddd; *zoom:1;} +.install:after{ content:""; display:block; clear:both;} + +.aside { width:180px; float:left; margin-right:30px; padding-bottom:30px; } + +.aside .categoryBox { background-color:#F8F8F8; padding:10px; width:160px; overflow:hidden; } +.aside .categoryBox h3 { padding:0 0 10px 0; margin:0 0 10px 0; white-space:nowrap; overflow:hidden; color:#48494E; font-size:11px; font-weight:normal;} +.aside .categoryBox .bottomLine {background:transparent url(../img/hrE1.gif) repeat-x scroll left bottom;} +.aside .categoryBox .topLine {background:transparent url(../img/hrE1.gif) repeat-x scroll left top;} +.aside .categoryBox h3 a { color:#48494E; font-size:12px; font-weight:bold; text-decoration:none; } +.aside .categoryBox ul.category { margin:10px 0 0 0; padding:0; list-style:none; } +.aside .categoryBox ul.category li { margin:0 0 10px 10px; } +.aside .categoryBox ul.category li a.selected { font-weight:bold; color:#2893BB; } +.aside .categoryBox ul.category li a { text-decoration:none; color:#7B7575; } +.aside .categoryBox ul.category li span { font-family:verdana; font-size:10px; color:#999; } + +.aside .categoryBox ul.resourceManage { margin:0; padding:10px 0 0 0; list-style:none; background:transparent url(../img/hrE1.gif) repeat-x scroll left top; } +.aside .categoryBox ul.resourceManage li { background:url(../img/btnManage.gif) no-repeat 2px 2px; padding-left:14px; white-space:nowrap; overflow:hidden; margin-bottom:10px; } +.aside .categoryBox ul.resourceManage li a { text-decoration:none; color:#747474; } +.aside .categoryBox ul.resourceManage li a.selected { font-weight:bold; } + +.aside .searchBox { padding:10px 0; text-align:center; } +.aside .searchBox input.input { border:1px solid #ddd; width:120px; height:16px;} +.aside .searchBox input.submit { vertical-align:middle; } + +.install .content { position:relative; *zoom:1; overflow:hidden; width:auto; float:none; margin:0;} + +.updateList, +.updateList th, +.updateList td{ border:0; vertical-align:top; text-align:left; padding:10px 0;} +.updateList {width:100%; height:100px; table-layout:fixed;} +.updateList th, +.updateList td{ border-bottom:1px dotted #ddd;} +.updateList th img { border:1px solid #ccc; padding:2px; overflow:hidden; *zoom:1; } +.updateList td { padding:10px 0 0 0;} +.updateList td .title{ position:relative;} +.updateList td .title h3 { padding:0; margin:0 0 5px 0; font-size:12px;} +.updateList td .title a {text-decoration:none; color:#333 !important; } +.updateList td .title .buttons{ position:absolute; top:0; right:0;} +.updateList td .info p{ margin:0 0 5px 0; line-height:1.5;} +.updateList td .info p.desc{ margin:0 100px 10px 0;} +.updateList td .info p.meta{ font-size:11px;} +.updateList td .info p.meta span{ display:inline-block; line-height:1; padding:0 5px 0 9px;} +.updateList td .info p.meta .reputation{ padding:0 5px 0 0;} +.updateList td .info p.meta .reputation img{ float:left; margin:-1px 0 0 0;} +.updateList td .info p.meta .reputation span{ padding:0 0 0 5px;} +.updateList td .info p.meta .lastUpdate{ border-left:1px solid #ddd;} +.updateList td .info p.meta .download{ border-left:1px solid #ddd;} + +ul.listOrder { position:relative; overflow:hidden; margin:0; padding:10px 0; text-align:left; background:transparent url(../img/hrE1.gif) repeat-x scroll left bottom;} +ul.listOrder.asc li.arrow { background:url(../img/arrUp.gif) no-repeat right 2px; padding-right:10px; } +ul.listOrder.desc li.arrow { background:url(../img/arrDown.gif) no-repeat right 2px; padding-right:10px; } +ul.listOrder li { position:relative; left:-1px; display:inline; margin:0; padding:0 5px 0 9px; border-left:1px solid #ddd;} +ul.listOrder li.arrow a { text-decoration:none; font-weight:bold; color:#2893BB; } +ul.listOrder li a { text-decoration:none; color:#7B7575; } + +p.caution strong { font-size: 1.2em; font-weight: bold; color: red; } diff --git a/modules/autoinstall/tpl/index.html b/modules/autoinstall/tpl/index.html index f4106888d..82bfb6d1e 100644 --- a/modules/autoinstall/tpl/index.html +++ b/modules/autoinstall/tpl/index.html @@ -1,21 +1,21 @@ - - - -
      - -

      {$lang->description_ftp_note} FTP Setup

      - - -

      {$lang->need_update}

      - -

      {$lang->description_update}

      - -

      -
      - -
      - - - - -
      + + + +
      + +

      {$lang->description_ftp_note} FTP Setup

      + + +

      {$lang->need_update}

      + +

      {$lang->description_update}

      + +

      +
      + +
      + + + + +
      diff --git a/modules/autoinstall/tpl/install.html b/modules/autoinstall/tpl/install.html index df1bac164..b218c6b65 100644 --- a/modules/autoinstall/tpl/install.html +++ b/modules/autoinstall/tpl/install.html @@ -1,30 +1,30 @@ - - - -
      -

      {$package->title} ver. {$package->version} ( {$lang->current_version}: {$package->cur_version} ({$lang->require_update}) {$lang->require_installation} )

      - -
      -
      {$lang->depending_programs} :
      -
      {$dep->title} ver. {$dep->version} - - {$lang->current_version}: {$dep->cur_version} ({$lang->require_update}) {$lang->require_installation} - {$lang->cmd_download} ({$lang->path} : {$dep->path}) -
      -
      - - - - -

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

      -

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

      -

      {$lang->cmd_download}

      - -

      {$lang->description_install}.

      - -

      - -

      {$package->installed?$lang->update:$lang->install}

      - - - -
      + + + +
      +

      {$package->title} ver. {$package->version} ( {$lang->current_version}: {$package->cur_version} ({$lang->require_update}) {$lang->require_installation} )

      + +
      +
      {$lang->depending_programs} :
      +
      {$dep->title} ver. {$dep->version} - + {$lang->current_version}: {$dep->cur_version} ({$lang->require_update}) {$lang->require_installation} + {$lang->cmd_download} ({$lang->path} : {$dep->path}) +
      +
      + + + + +

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

      +

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

      +

      {$lang->cmd_download}

      + +

      {$lang->description_install}.

      + +

      + +

      {$package->installed?$lang->update:$lang->install}

      + + + +
      diff --git a/modules/autoinstall/tpl/leftBox.html b/modules/autoinstall/tpl/leftBox.html index ca4964a71..19b315125 100644 --- a/modules/autoinstall/tpl/leftBox.html +++ b/modules/autoinstall/tpl/leftBox.html @@ -1,50 +1,50 @@ -
      -
      -

      {$lang->view_all_package} ({$tCount})

      - {@ $_pDepth = 0;} - -
        - - - -
      - - - {@ $_pDepth = $val->depth} - -
    • - - category_srl == $category_srl)--> class="selected">{$val->title} - - category_srl == $category_srl)--> class="selected">{$val->title} - - - ({$val->nPackages}) - - - {@$_pDepth++} -
        - - - - - -
      - -
    • -
    - -
    -

    {$lang->view_installed_packages} ({$iCount})

    - -
- -
+
+
+

{$lang->view_all_package} ({$tCount})

+ {@ $_pDepth = 0;} + +
    + + + +
+ + + {@ $_pDepth = $val->depth} + +
  • + + category_srl == $category_srl)--> class="selected">{$val->title} + + category_srl == $category_srl)--> class="selected">{$val->title} + + + ({$val->nPackages}) + + + {@$_pDepth++} +
      + + + + + +
    + +
  • + + +
    +

    {$lang->view_installed_packages} ({$iCount})

    + +
    + +
    diff --git a/modules/autoinstall/tpl/list.html b/modules/autoinstall/tpl/list.html index a7c2343b3..6199eb5fe 100644 --- a/modules/autoinstall/tpl/list.html +++ b/modules/autoinstall/tpl/list.html @@ -1,96 +1,96 @@ -
    - -
      - - {@$_order_type = 'asc'}{@$_order_type = 'desc'} - - {@$_order_type = 'desc'} - -
    • class="arrow">{$lang->order_newest}
    • - - {@$_order_type = 'asc'}{@$_order_type = 'desc'} - - {@$_order_type = 'desc'} - -
    • class="arrow">{$lang->order_download}
    • - - {@$_order_type = 'asc'}{@$_order_type = 'desc'} - - {@$_order_type = 'desc'} - -
    • class="arrow">{$lang->order_popular}
    • -
    - - - - - - - {@ $target_url = $original_site."?mid=download&package_srl=".$val->package_srl; } - - - - -
    -
    -

    - - [{$categories[$val->category_srl]->title}] - - {htmlspecialchars($val->title)} ver. {htmlspecialchars($val->item_version)} -

    - -

    {$lang->current_version} : {$val->current_version} - -
    - {$lang->dependant_list} : - - {$installed[$package_srl]->title}. - - -

    - - - - -
    -
    -

    {cut_str(htmlspecialchars($val->package_description),200)}

    -

    - - - - - - - - - {sprintf("%0.1f",$val->package_voted/$val->package_voter*2)}/{number_format($val->package_voter)} - - {$lang->package_update} {zdate($val->item_regdate, "Y-m-d H:i")} - {$lang->package_downloaded_count} : {number_format($val->package_downloaded)} -

    -
    -
    - - -
    +
    + +
      + + {@$_order_type = 'asc'}{@$_order_type = 'desc'} + + {@$_order_type = 'desc'} + +
    • class="arrow">{$lang->order_newest}
    • + + {@$_order_type = 'asc'}{@$_order_type = 'desc'} + + {@$_order_type = 'desc'} + +
    • class="arrow">{$lang->order_download}
    • + + {@$_order_type = 'asc'}{@$_order_type = 'desc'} + + {@$_order_type = 'desc'} + +
    • class="arrow">{$lang->order_popular}
    • +
    + + + + + + + {@ $target_url = $original_site."?mid=download&package_srl=".$val->package_srl; } + + + + +
    +
    +

    + + [{$categories[$val->category_srl]->title}] + + {htmlspecialchars($val->title)} ver. {htmlspecialchars($val->item_version)} +

    + +

    {$lang->current_version} : {$val->current_version} + +
    + {$lang->dependant_list} : + + {$installed[$package_srl]->title}. + + +

    + + + + +
    +
    +

    {cut_str(htmlspecialchars($val->package_description),200)}

    +

    + + + + + + + + + {sprintf("%0.1f",$val->package_voted/$val->package_voter*2)}/{number_format($val->package_voter)} + + {$lang->package_update} {zdate($val->item_regdate, "Y-m-d H:i")} + {$lang->package_downloaded_count} : {number_format($val->package_downloaded)} +

    +
    +
    + + +
    diff --git a/modules/comment/comment.admin.controller.php b/modules/comment/comment.admin.controller.php index 31081b7b5..c52dc2b6a 100644 --- a/modules/comment/comment.admin.controller.php +++ b/modules/comment/comment.admin.controller.php @@ -1,72 +1,72 @@ -stop('msg_cart_is_null'); - $comment_srl_list= explode('|@|', $cart); - $comment_count = count($comment_srl_list); - if(!$comment_count) return $this->stop('msg_cart_is_null'); - - $oCommentController = &getController('comment'); - - $deleted_count = 0; - - // 글삭제 - for($i=0;$i<$comment_count;$i++) { - $comment_srl = trim($comment_srl_list[$i]); - if(!$comment_srl) continue; - - $output = $oCommentController->deleteComment($comment_srl, true); - if(!$output->toBool()) continue; - - $deleted_count ++; - } - - $this->setMessage( sprintf(Context::getLang('msg_checked_comment_is_deleted'), $deleted_count) ); - } - - /** - * @brief 신고대상을 취소 시킴 - **/ - function procCommentAdminCancelDeclare() { - $comment_srl = trim(Context::get('comment_srl')); - - if($comment_srl) { - $args->comment_srl = $comment_srl; - $output = executeQuery('comment.deleteDeclaredComments', $args); - if(!$output->toBool()) return $output; - } - } - - /** - * @brief 특정 모듈의 모든 댓글 삭제 - **/ - function deleteModuleComments($module_srl) { - $args->module_srl = $module_srl; - $output = executeQuery('comment.deleteModuleComments', $args); - if(!$output->toBool()) return $output; - - $output = executeQuery('comment.deleteModuleCommentsList', $args); - return $output; - } - - } -?> +stop('msg_cart_is_null'); + $comment_srl_list= explode('|@|', $cart); + $comment_count = count($comment_srl_list); + if(!$comment_count) return $this->stop('msg_cart_is_null'); + + $oCommentController = &getController('comment'); + + $deleted_count = 0; + + // 글삭제 + for($i=0;$i<$comment_count;$i++) { + $comment_srl = trim($comment_srl_list[$i]); + if(!$comment_srl) continue; + + $output = $oCommentController->deleteComment($comment_srl, true); + if(!$output->toBool()) continue; + + $deleted_count ++; + } + + $this->setMessage( sprintf(Context::getLang('msg_checked_comment_is_deleted'), $deleted_count) ); + } + + /** + * @brief 신고대상을 취소 시킴 + **/ + function procCommentAdminCancelDeclare() { + $comment_srl = trim(Context::get('comment_srl')); + + if($comment_srl) { + $args->comment_srl = $comment_srl; + $output = executeQuery('comment.deleteDeclaredComments', $args); + if(!$output->toBool()) return $output; + } + } + + /** + * @brief 특정 모듈의 모든 댓글 삭제 + **/ + function deleteModuleComments($module_srl) { + $args->module_srl = $module_srl; + $output = executeQuery('comment.deleteModuleComments', $args); + if(!$output->toBool()) return $output; + + $output = executeQuery('comment.deleteModuleCommentsList', $args); + return $output; + } + + } +?> diff --git a/modules/comment/comment.admin.view.php b/modules/comment/comment.admin.view.php index 2cb520bea..0a5b10a74 100644 --- a/modules/comment/comment.admin.view.php +++ b/modules/comment/comment.admin.view.php @@ -1,83 +1,83 @@ -page = Context::get('page'); ///< 페이지 - $args->list_count = 30; ///< 한페이지에 보여줄 글 수 - $args->page_count = 10; ///< 페이지 네비게이션에 나타날 페이지의 수 - - $args->sort_index = 'list_order'; ///< 소팅 값 - - $args->module_srl = Context::get('module_srl'); - - // 목록 구함, comment->getCommentList 에서 걍 알아서 다 해버리는 구조이다... (아.. 이거 나쁜 버릇인데.. ㅡ.ㅜ 어쩔수 없다) - $oCommentModel = &getModel('comment'); - $output = $oCommentModel->getTotalCommentList($args); - - // 템플릿에 쓰기 위해서 comment_model::getTotalCommentList() 의 return object에 있는 값들을 세팅 - Context::set('total_count', $output->total_count); - Context::set('total_page', $output->total_page); - Context::set('page', $output->page); - Context::set('comment_list', $output->data); - Context::set('page_navigation', $output->page_navigation); - - // 템플릿 지정 - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('comment_list'); - } - - /** - * @brief 관리자 페이지의 신고 목록 보기 - **/ - function dispCommentAdminDeclared() { - // 목록을 구하기 위한 옵션 - $args->page = Context::get('page'); ///< 페이지 - $args->list_count = 30; ///< 한페이지에 보여줄 글 수 - $args->page_count = 10; ///< 페이지 네비게이션에 나타날 페이지의 수 - - $args->sort_index = 'comment_declared.declared_count'; ///< 소팅 값 - $args->order_type = 'desc'; ///< 소팅 정렬 값 - - // 목록을 구함 - $declared_output = executeQuery('comment.getDeclaredList', $args); - - if($declared_output->data && count($declared_output->data)) { - $comment_list = array(); - - $oCommentModel = &getModel('comment'); - foreach($declared_output->data as $key => $comment) { - $comment_list[$key] = new commentItem(); - $comment_list[$key]->setAttribute($comment); - } - $declared_output->data = $comment_list; - } - - // 템플릿에 쓰기 위해서 comment_model::getCommentList() 의 return object에 있는 값들을 세팅 - Context::set('total_count', $declared_output->total_count); - Context::set('total_page', $declared_output->total_page); - Context::set('page', $declared_output->page); - Context::set('comment_list', $declared_output->data); - Context::set('page_navigation', $declared_output->page_navigation); - - // 템플릿 지정 - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('declared_list'); - } - } -?> +page = Context::get('page'); ///< 페이지 + $args->list_count = 30; ///< 한페이지에 보여줄 글 수 + $args->page_count = 10; ///< 페이지 네비게이션에 나타날 페이지의 수 + + $args->sort_index = 'list_order'; ///< 소팅 값 + + $args->module_srl = Context::get('module_srl'); + + // 목록 구함, comment->getCommentList 에서 걍 알아서 다 해버리는 구조이다... (아.. 이거 나쁜 버릇인데.. ㅡ.ㅜ 어쩔수 없다) + $oCommentModel = &getModel('comment'); + $output = $oCommentModel->getTotalCommentList($args); + + // 템플릿에 쓰기 위해서 comment_model::getTotalCommentList() 의 return object에 있는 값들을 세팅 + Context::set('total_count', $output->total_count); + Context::set('total_page', $output->total_page); + Context::set('page', $output->page); + Context::set('comment_list', $output->data); + Context::set('page_navigation', $output->page_navigation); + + // 템플릿 지정 + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('comment_list'); + } + + /** + * @brief 관리자 페이지의 신고 목록 보기 + **/ + function dispCommentAdminDeclared() { + // 목록을 구하기 위한 옵션 + $args->page = Context::get('page'); ///< 페이지 + $args->list_count = 30; ///< 한페이지에 보여줄 글 수 + $args->page_count = 10; ///< 페이지 네비게이션에 나타날 페이지의 수 + + $args->sort_index = 'comment_declared.declared_count'; ///< 소팅 값 + $args->order_type = 'desc'; ///< 소팅 정렬 값 + + // 목록을 구함 + $declared_output = executeQuery('comment.getDeclaredList', $args); + + if($declared_output->data && count($declared_output->data)) { + $comment_list = array(); + + $oCommentModel = &getModel('comment'); + foreach($declared_output->data as $key => $comment) { + $comment_list[$key] = new commentItem(); + $comment_list[$key]->setAttribute($comment); + } + $declared_output->data = $comment_list; + } + + // 템플릿에 쓰기 위해서 comment_model::getCommentList() 의 return object에 있는 값들을 세팅 + Context::set('total_count', $declared_output->total_count); + Context::set('total_page', $declared_output->total_page); + Context::set('page', $declared_output->page); + Context::set('comment_list', $declared_output->data); + Context::set('page_navigation', $declared_output->page_navigation); + + // 템플릿 지정 + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('declared_list'); + } + } +?> diff --git a/modules/comment/comment.class.php b/modules/comment/comment.class.php index 260d3b1a1..b17b44d62 100644 --- a/modules/comment/comment.class.php +++ b/modules/comment/comment.class.php @@ -1,105 +1,105 @@ -insertTrigger('document.deleteDocument', 'comment', 'controller', 'triggerDeleteDocumentComments', 'after'); - - // 2007. 10. 17 모듈이 삭제될때 등록된 댓글도 모두 삭제하는 트리거 추가 - $oModuleController->insertTrigger('module.deleteModule', 'comment', 'controller', 'triggerDeleteModuleComments', 'after'); - - // 2008. 02. 22 모듈의 추가 설정에서 댓글 추가 설정 추가 - $oModuleController->insertTrigger('module.dispAdditionSetup', 'comment', 'view', 'triggerDispCommentAdditionSetup', 'before'); - - return new Object(); - } - - /** - * @brief 설치가 이상이 없는지 체크하는 method - **/ - function checkUpdate() { - $oDB = &DB::getInstance(); - $oModuleModel = &getModel('module'); - - // 2007. 10. 17 게시글이 삭제될때 댓글도 삭제되도록 trigger 등록 - if(!$oModuleModel->getTrigger('document.deleteDocument', 'comment', 'controller', 'triggerDeleteDocumentComments', 'after')) return true; - - // 2007. 10. 17 모듈이 삭제될때 등록된 댓글도 모두 삭제하는 트리거 추가 - if(!$oModuleModel->getTrigger('module.deleteModule', 'comment', 'controller', 'triggerDeleteModuleComments', 'after')) return true; - - // 2007. 10. 23 댓글에도 추천/ 알림 기능을 위한 컬럼 추가 - if(!$oDB->isColumnExists("comments","voted_count")) return true; - if(!$oDB->isColumnExists("comments","notify_message")) return true; - - // 2008. 02. 22 모듈의 추가 설정에서 댓글 추가 설정 추가 - if(!$oModuleModel->getTrigger('module.dispAdditionSetup', 'comment', 'view', 'triggerDispCommentAdditionSetup', 'before')) return true; - - // 2008. 05. 14 blamed count 컬럼 추가 - if(!$oDB->isColumnExists("comments", "blamed_count")) return true; - if(!$oDB->isColumnExists("comment_voted_log", "point")) return true; - - return false; - } - - /** - * @brief 업데이트 실행 - **/ - function moduleUpdate() { - $oDB = &DB::getInstance(); - $oModuleModel = &getModel('module'); - $oModuleController = &getController('module'); - - // 2007. 10. 17 게시글이 삭제될때 댓글도 삭제되도록 trigger 등록 - if(!$oModuleModel->getTrigger('document.deleteDocument', 'comment', 'controller', 'triggerDeleteDocumentComments', 'after')) - $oModuleController->insertTrigger('document.deleteDocument', 'comment', 'controller', 'triggerDeleteDocumentComments', 'after'); - - // 2007. 10. 17 모듈이 삭제될때 등록된 댓글도 모두 삭제하는 트리거 추가 - if(!$oModuleModel->getTrigger('module.deleteModule', 'comment', 'controller', 'triggerDeleteModuleComments', 'after')) - $oModuleController->insertTrigger('module.deleteModule', 'comment', 'controller', 'triggerDeleteModuleComments', 'after'); - - // 2007. 10. 23 댓글에도 추천/ 알림 기능을 위한 컬럼 추가 - if(!$oDB->isColumnExists("comments","voted_count")) { - $oDB->addColumn("comments","voted_count", "number","11"); - $oDB->addIndex("comments","idx_voted_count", array("voted_count")); - } - - if(!$oDB->isColumnExists("comments","notify_message")) { - $oDB->addColumn("comments","notify_message", "char","1"); - } - - // 2008. 02. 22 모듈의 추가 설정에서 댓글 추가 설정 추가 - if(!$oModuleModel->getTrigger('module.dispAdditionSetup', 'comment', 'view', 'triggerDispCommentAdditionSetup', 'before')) - $oModuleController->insertTrigger('module.dispAdditionSetup', 'comment', 'view', 'triggerDispCommentAdditionSetup', 'before'); - - // 2008. 05. 14 blamed count 컬럼 추가 - if(!$oDB->isColumnExists("comments", "blamed_count")) { - $oDB->addColumn('comments', 'blamed_count', 'number', 11, 0, true); - $oDB->addIndex('comments', 'idx_blamed_count', array('blamed_count')); - } - if(!$oDB->isColumnExists("comment_voted_log", "point")) - $oDB->addColumn('comment_voted_log', 'point', 'number', 11, 0, true); - - return new Object(0, 'success_updated'); - } - - /** - * @brief 캐시 파일 재생성 - **/ - function recompileCache() { - } - } -?> +insertTrigger('document.deleteDocument', 'comment', 'controller', 'triggerDeleteDocumentComments', 'after'); + + // 2007. 10. 17 모듈이 삭제될때 등록된 댓글도 모두 삭제하는 트리거 추가 + $oModuleController->insertTrigger('module.deleteModule', 'comment', 'controller', 'triggerDeleteModuleComments', 'after'); + + // 2008. 02. 22 모듈의 추가 설정에서 댓글 추가 설정 추가 + $oModuleController->insertTrigger('module.dispAdditionSetup', 'comment', 'view', 'triggerDispCommentAdditionSetup', 'before'); + + return new Object(); + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + **/ + function checkUpdate() { + $oDB = &DB::getInstance(); + $oModuleModel = &getModel('module'); + + // 2007. 10. 17 게시글이 삭제될때 댓글도 삭제되도록 trigger 등록 + if(!$oModuleModel->getTrigger('document.deleteDocument', 'comment', 'controller', 'triggerDeleteDocumentComments', 'after')) return true; + + // 2007. 10. 17 모듈이 삭제될때 등록된 댓글도 모두 삭제하는 트리거 추가 + if(!$oModuleModel->getTrigger('module.deleteModule', 'comment', 'controller', 'triggerDeleteModuleComments', 'after')) return true; + + // 2007. 10. 23 댓글에도 추천/ 알림 기능을 위한 컬럼 추가 + if(!$oDB->isColumnExists("comments","voted_count")) return true; + if(!$oDB->isColumnExists("comments","notify_message")) return true; + + // 2008. 02. 22 모듈의 추가 설정에서 댓글 추가 설정 추가 + if(!$oModuleModel->getTrigger('module.dispAdditionSetup', 'comment', 'view', 'triggerDispCommentAdditionSetup', 'before')) return true; + + // 2008. 05. 14 blamed count 컬럼 추가 + if(!$oDB->isColumnExists("comments", "blamed_count")) return true; + if(!$oDB->isColumnExists("comment_voted_log", "point")) return true; + + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + $oDB = &DB::getInstance(); + $oModuleModel = &getModel('module'); + $oModuleController = &getController('module'); + + // 2007. 10. 17 게시글이 삭제될때 댓글도 삭제되도록 trigger 등록 + if(!$oModuleModel->getTrigger('document.deleteDocument', 'comment', 'controller', 'triggerDeleteDocumentComments', 'after')) + $oModuleController->insertTrigger('document.deleteDocument', 'comment', 'controller', 'triggerDeleteDocumentComments', 'after'); + + // 2007. 10. 17 모듈이 삭제될때 등록된 댓글도 모두 삭제하는 트리거 추가 + if(!$oModuleModel->getTrigger('module.deleteModule', 'comment', 'controller', 'triggerDeleteModuleComments', 'after')) + $oModuleController->insertTrigger('module.deleteModule', 'comment', 'controller', 'triggerDeleteModuleComments', 'after'); + + // 2007. 10. 23 댓글에도 추천/ 알림 기능을 위한 컬럼 추가 + if(!$oDB->isColumnExists("comments","voted_count")) { + $oDB->addColumn("comments","voted_count", "number","11"); + $oDB->addIndex("comments","idx_voted_count", array("voted_count")); + } + + if(!$oDB->isColumnExists("comments","notify_message")) { + $oDB->addColumn("comments","notify_message", "char","1"); + } + + // 2008. 02. 22 모듈의 추가 설정에서 댓글 추가 설정 추가 + if(!$oModuleModel->getTrigger('module.dispAdditionSetup', 'comment', 'view', 'triggerDispCommentAdditionSetup', 'before')) + $oModuleController->insertTrigger('module.dispAdditionSetup', 'comment', 'view', 'triggerDispCommentAdditionSetup', 'before'); + + // 2008. 05. 14 blamed count 컬럼 추가 + if(!$oDB->isColumnExists("comments", "blamed_count")) { + $oDB->addColumn('comments', 'blamed_count', 'number', 11, 0, true); + $oDB->addIndex('comments', 'idx_blamed_count', array('blamed_count')); + } + if(!$oDB->isColumnExists("comment_voted_log", "point")) + $oDB->addColumn('comment_voted_log', 'point', 'number', 11, 0, true); + + return new Object(0, 'success_updated'); + } + + /** + * @brief 캐시 파일 재생성 + **/ + function recompileCache() { + } + } +?> diff --git a/modules/comment/comment.controller.php b/modules/comment/comment.controller.php index 83a9cef65..9e84d6ac0 100644 --- a/modules/comment/comment.controller.php +++ b/modules/comment/comment.controller.php @@ -1,642 +1,642 @@ -getComment($comment_srl, false, false); - $module_srl = $oComment->get('module_srl'); - if(!$module_srl) return new Object(-1, 'msg_invalid_request'); - - $oModuleModel = &getModel('module'); - $comment_config = $oModuleModel->getModulePartConfig('comment',$module_srl); - if($comment_config->use_vote_up=='N') return new Object(-1, 'msg_invalid_request'); - - $point = 1; - return $this->updateVotedCount($comment_srl, $point); - } - - /** - * @brief 댓글의 추천을 처리하는 action (Down) - **/ - function procCommentVoteDown() { - if(!Context::get('is_logged')) return new Object(-1, 'msg_invalid_request'); - - $comment_srl = Context::get('target_srl'); - if(!$comment_srl) return new Object(-1, 'msg_invalid_request'); - - $oCommentModel = &getModel('comment'); - $oComment = $oCommentModel->getComment($comment_srl, false, false); - $module_srl = $oComment->get('module_srl'); - if(!$module_srl) return new Object(-1, 'msg_invalid_request'); - - $oModuleModel = &getModel('module'); - $comment_config = $oModuleModel->getModulePartConfig('comment',$module_srl); - if($comment_config->use_vote_down=='N') return new Object(-1, 'msg_invalid_request'); - - $point = -1; - return $this->updateVotedCount($comment_srl, $point); - } - - /** - * @brief 댓글이 신고될 경우 호출되는 action - **/ - function procCommentDeclare() { - if(!Context::get('is_logged')) return new Object(-1, 'msg_invalid_request'); - - $comment_srl = Context::get('target_srl'); - if(!$comment_srl) return new Object(-1, 'msg_invalid_request'); - - return $this->declaredComment($comment_srl); - } - - /** - * @brief document삭제시 해당 document의 댓글을 삭제하는 trigger - **/ - function triggerDeleteDocumentComments(&$obj) { - $document_srl = $obj->document_srl; - if(!$document_srl) return new Object(); - - return $this->deleteComments($document_srl, true); - } - - /** - * @brief module 삭제시 해당 댓글을 모두 삭제하는 trigger - **/ - function triggerDeleteModuleComments(&$obj) { - $module_srl = $obj->module_srl; - if(!$module_srl) return new Object(); - - $oCommentController = &getAdminController('comment'); - return $oCommentController->deleteModuleComments($module_srl); - } - - /** - * @brief 코멘트의 권한 부여 - * 세션값으로 현 접속상태에서만 사용 가능 - **/ - function addGrant($comment_srl) { - $_SESSION['own_comment'][$comment_srl] = true; - } - - /** - * @brief 댓글 입력 - **/ - function insertComment($obj, $manual_inserted = false) { - $obj->__isupdate = false; - // trigger 호출 (before) - $output = ModuleHandler::triggerCall('comment.insertComment', 'before', $obj); - if(!$output->toBool()) return $output; - - // document_srl에 해당하는 글이 있는지 확인 - $document_srl = $obj->document_srl; - if(!$document_srl) return new Object(-1,'msg_invalid_document'); - - // document model 객체 생성 - $oDocumentModel = &getModel('document'); - - // even for manual_inserted if password exists, md5 it. - if($obj->password) $obj->password = md5($obj->password); - // 원본글을 가져옴 - if(!$manual_inserted) { - $oDocument = $oDocumentModel->getDocument($document_srl); - - if($document_srl != $oDocument->document_srl) return new Object(-1,'msg_invalid_document'); - if($oDocument->isLocked()) return new Object(-1,'msg_invalid_request'); - - if($obj->homepage && !preg_match('/^[a-z]+:\/\//i',$obj->homepage)) $obj->homepage = 'http://'.$obj->homepage; - - // 로그인 된 회원일 경우 회원의 정보를 입력 - if(Context::get('is_logged')) { - $logged_info = Context::get('logged_info'); - $obj->member_srl = $logged_info->member_srl; - $obj->user_id = $logged_info->user_id; - $obj->user_name = $logged_info->user_name; - $obj->nick_name = $logged_info->nick_name; - $obj->email_address = $logged_info->email_address; - $obj->homepage = $logged_info->homepage; - } - } - - // 로그인정보가 없고 사용자 이름이 없으면 오류 표시 - if(!$logged_info->member_srl && !$obj->nick_name) return new Object(-1,'msg_invalid_request'); - - if(!$obj->comment_srl) $obj->comment_srl = getNextSequence(); - - // 순서를 정함 - $obj->list_order = getNextSequence() * -1; - - // 내용에서 XE만의 태그를 삭제 - $obj->content = preg_replace('!<\!--(Before|After)(Document|Comment)\(([0-9]+),([0-9]+)\)-->!is', '', $obj->content); - if(Mobile::isFromMobilePhone()) - { - $obj->content = nl2br(htmlspecialchars($obj->content)); - } - if(!$obj->regdate) $obj->regdate = date("YmdHis"); - - // 세션에서 최고 관리자가 아니면 iframe, script 제거 - if($logged_info->is_admin != 'Y') $obj->content = removeHackTag($obj->content); - - if(!$obj->notify_message) $obj->notify_message = 'N'; - if(!$obj->is_secret) $obj->is_secret = 'N'; - - // begin transaction - $oDB = &DB::getInstance(); - $oDB->begin(); - - // 댓글 목록 부분을 먼저 입력 - $list_args->comment_srl = $obj->comment_srl; - $list_args->document_srl = $obj->document_srl; - $list_args->module_srl = $obj->module_srl; - $list_args->regdate = $obj->regdate; - - // 부모댓글이 없으면 바로 데이터를 설정 - if(!$obj->parent_srl) { - $list_args->head = $list_args->arrange = $obj->comment_srl; - $list_args->depth = 0; - - // 부모댓글이 있으면 부모글의 정보를 구해옴 - } else { - // 부모댓글의 정보를 구함 - $parent_args->comment_srl = $obj->parent_srl; - $parent_output = executeQuery('comment.getCommentListItem', $parent_args); - - // 부모댓글이 존재하지 않으면 return - if(!$parent_output->toBool() || !$parent_output->data) return; - $parent = $parent_output->data; - - $list_args->head = $parent->head; - $list_args->depth = $parent->depth+1; - - // depth가 2단계 미만이면 별도의 update문 없이 insert만으로 쓰레드 정리 - if($list_args->depth<2) { - $list_args->arrange = $obj->comment_srl; - - // depth가 2단계 이상이면 반업데이트 실행 - } else { - // 부모 댓글과 같은 head를 가지고 depth가 같거나 작은 댓글중 제일 위 댓글을 구함 - $p_args->head = $parent->head; - $p_args->arrange = $parent->arrange; - $p_args->depth = $parent->depth; - $output = executeQuery('comment.getCommentParentNextSibling', $p_args); - - if($output->data->arrange) { - $list_args->arrange = $output->data->arrange; - $output = executeQuery('comment.updateCommentListArrange', $list_args); - } else { - $list_args->arrange = $obj->comment_srl; - } - - } - } - - $output = executeQuery('comment.insertCommentList', $list_args); - if(!$output->toBool()) return $output; - - // 댓글 본문을 입력 - $output = executeQuery('comment.insertComment', $obj); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - // comment model객체 생성 - $oCommentModel = &getModel('comment'); - - // 해당 글의 전체 댓글 수를 구해옴 - $comment_count = $oCommentModel->getCommentCount($document_srl); - - // document의 controller 객체 생성 - $oDocumentController = &getController('document'); - - // 해당글의 댓글 수를 업데이트 - $output = $oDocumentController->updateCommentCount($document_srl, $comment_count, $obj->nick_name, true); - - // 댓글의 권한을 부여 - $this->addGrant($obj->comment_srl); - - - // trigger 호출 (after) - if($output->toBool()) { - $trigger_output = ModuleHandler::triggerCall('comment.insertComment', 'after', $obj); - if(!$trigger_output->toBool()) { - $oDB->rollback(); - return $trigger_output; - } - } - - // commit - $oDB->commit(); - - if(!$manual_inserted) { - // 원본글에 알림(notify_message)가 설정되어 있으면 메세지 보냄 - $oDocument->notify(Context::getLang('comment'), $obj->content); - - // 원본 댓글이 있고 원본 댓글에 알림(notify_message)가 있으면 메세지 보냄 - if($obj->parent_srl) { - $oParent = $oCommentModel->getComment($obj->parent_srl); - if ($oParent->get('member_srl') != $oDocument->get('member_srl')) { - $oParent->notify(Context::getLang('comment'), $obj->content); - } - } - } - - - $output->add('comment_srl', $obj->comment_srl); - return $output; - } - - /** - * @brief 댓글 수정 - **/ - function updateComment($obj, $is_admin = false) { - $obj->__isupdate = true; - // trigger 호출 (before) - $output = ModuleHandler::triggerCall('comment.updateComment', 'before', $obj); - if(!$output->toBool()) return $output; - - // comment model 객체 생성 - $oCommentModel = &getModel('comment'); - - // 원본 데이터를 가져옴 - $source_obj = $oCommentModel->getComment($obj->comment_srl); - if(!$source_obj->getMemberSrl()) { - $obj->member_srl = $source_obj->get('member_srl'); - $obj->user_name = $source_obj->get('user_name'); - $obj->nick_name = $source_obj->get('nick_name'); - $obj->email_address = $source_obj->get('email_address'); - $obj->homepage = $source_obj->get('homepage'); - } - - // 권한이 있는지 확인 - if(!$is_admin && !$source_obj->isGranted()) return new Object(-1, 'msg_not_permitted'); - - if($obj->password) $obj->password = md5($obj->password); - if($obj->homepage && !preg_match('/^[a-z]+:\/\//i',$obj->homepage)) $obj->homepage = 'http://'.$obj->homepage; - - // 로그인 되어 있고 작성자와 수정자가 동일하면 수정자의 정보를 세팅 - if(Context::get('is_logged')) { - $logged_info = Context::get('logged_info'); - if($source_obj->member_srl == $logged_info->member_srl) { - $obj->member_srl = $logged_info->member_srl; - $obj->user_name = $logged_info->user_name; - $obj->nick_name = $logged_info->nick_name; - $obj->email_address = $logged_info->email_address; - $obj->homepage = $logged_info->homepage; - } - } - - // 로그인한 유저가 작성한 글인데 nick_name이 없을 경우 - if($source_obj->get('member_srl')&& !$obj->nick_name) { - $obj->member_srl = $source_obj->get('member_srl'); - $obj->user_name = $source_obj->get('user_name'); - $obj->nick_name = $source_obj->get('nick_name'); - $obj->email_address = $source_obj->get('email_address'); - $obj->homepage = $source_obj->get('homepage'); - } - - - if(!$obj->content) $obj->content = $source_obj->get('content'); - - // 내용에서 XE만의 태그를 삭제 - $obj->content = preg_replace('!<\!--(Before|After)(Document|Comment)\(([0-9]+),([0-9]+)\)-->!is', '', $obj->content); - - // 세션에서 최고 관리자가 아니면 iframe, script 제거 - if($logged_info->is_admin != 'Y') $obj->content = removeHackTag($obj->content); - - // begin transaction - $oDB = &DB::getInstance(); - $oDB->begin(); - - // 업데이트 - $output = executeQuery('comment.updateComment', $obj); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - // trigger 호출 (after) - if($output->toBool()) { - $trigger_output = ModuleHandler::triggerCall('comment.updateComment', 'after', $obj); - if(!$trigger_output->toBool()) { - $oDB->rollback(); - return $trigger_output; - } - } - - // commit - $oDB->commit(); - - $output->add('comment_srl', $obj->comment_srl); - return $output; - } - - /** - * @brief 댓글 삭제 - **/ - function deleteComment($comment_srl, $is_admin = false) { - - // comment model 객체 생성 - $oCommentModel = &getModel('comment'); - - // 기존 댓글이 있는지 확인 - $comment = $oCommentModel->getComment($comment_srl); - if($comment->comment_srl != $comment_srl) return new Object(-1, 'msg_invalid_request'); - $document_srl = $comment->document_srl; - - // trigger 호출 (before) - $output = ModuleHandler::triggerCall('comment.deleteComment', 'before', $comment); - if(!$output->toBool()) return $output; - - // 해당 댓글에 child가 있는지 확인 - $child_count = $oCommentModel->getChildCommentCount($comment_srl); - if($child_count>0) return new Object(-1, 'fail_to_delete_have_children'); - - // 권한이 있는지 확인 - if(!$is_admin && !$comment->isGranted()) return new Object(-1, 'msg_not_permitted'); - - // begin transaction - $oDB = &DB::getInstance(); - $oDB->begin(); - - // 삭제 - $args->comment_srl = $comment_srl; - $output = executeQuery('comment.deleteComment', $args); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - $output = executeQuery('comment.deleteCommentList', $args); - - // 댓글 수를 구해서 업데이트 - $comment_count = $oCommentModel->getCommentCount($document_srl); - - // document의 controller 객체 생성 - $oDocumentController = &getController('document'); - - // 해당글의 댓글 수를 업데이트 - $output = $oDocumentController->updateCommentCount($document_srl, $comment_count, null, false); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - // trigger 호출 (after) - if($output->toBool()) { - $trigger_output = ModuleHandler::triggerCall('comment.deleteComment', 'after', $comment); - if(!$trigger_output->toBool()) { - $oDB->rollback(); - return $trigger_output; - } - } - - // commit - $oDB->commit(); - - $output->add('document_srl', $document_srl); - return $output; - } - - /** - * @brief 특정 글의 모든 댓글 삭제 - **/ - function deleteComments($document_srl) { - // document model객체 생성 - $oDocumentModel = &getModel('document'); - $oCommentModel = &getModel('comment'); - - // 권한이 있는지 확인 - $oDocument = $oDocumentModel->getDocument($document_srl); - if(!$oDocument->isExists() || !$oDocument->isGranted()) return new Object(-1, 'msg_not_permitted'); - - // 댓글 목록을 가져와서 일단 trigger만 실행 (일괄 삭제를 해야 하기에 최대한 처리 비용을 줄이기 위한 방법) - $args->document_srl = $document_srl; - $comments = executeQueryArray('comment.getAllComments',$args); - if($comments->data) { - foreach($comments->data as $key => $comment) { - // trigger 호출 (before) - $output = ModuleHandler::triggerCall('comment.deleteComment', 'before', $comment); - if(!$output->toBool()) continue; - - // trigger 호출 (after) - $output = ModuleHandler::triggerCall('comment.deleteComment', 'after', $comment); - if(!$output->toBool()) continue; - } - } - - // 댓글 본문 삭제 - $args->document_srl = $document_srl; - $output = executeQuery('comment.deleteComments', $args); - if(!$output->toBool()) return $output; - - // 댓글 목록 삭제 - $output = executeQuery('comment.deleteCommentsList', $args); - - return $output; - } - - /** - * @brief 해당 comment의 추천수 증가 - **/ - function updateVotedCount($comment_srl, $point = 1) { - if($point > 0) { - $failed_voted = 'failed_voted'; - $success_message = 'success_voted'; - } else { - $failed_voted = 'failed_blamed'; - $success_message = 'success_blamed'; - } - - // 세션 정보에 추천 정보가 있으면 중단 - if($_SESSION['voted_comment'][$comment_srl]) return new Object(-1, $failed_voted); - - $oCommentModel = &getModel('comment'); - $oComment = $oCommentModel->getComment($comment_srl, false, false); - - // 글의 작성 ip와 현재 접속자의 ip가 동일하면 패스 - if($oComment->get('ipaddress') == $_SERVER['REMOTE_ADDR']) { - $_SESSION['voted_comment'][$comment_srl] = true; - return new Object(-1, $failed_voted); - } - - // comment의 작성자가 회원일때 조사 - if($oComment->get('member_srl')) { - $oMemberModel = &getModel('member'); - $member_srl = $oMemberModel->getLoggedMemberSrl(); - - // 글쓴이와 현재 로그인 사용자의 정보가 일치하면 읽었다고 생각하고 세션 등록후 패스 - if($member_srl && $member_srl == $oComment->get('member_srl')) { - $_SESSION['voted_comment'][$comment_srl] = true; - return new Object(-1, $failed_voted); - } - } - - // 로그인 사용자이면 member_srl, 비회원이면 ipaddress로 판단 - if($member_srl) { - $args->member_srl = $member_srl; - } else { - $args->ipaddress = $_SERVER['REMOTE_ADDR']; - } - $args->comment_srl = $comment_srl; - $output = executeQuery('comment.getCommentVotedLogInfo', $args); - - // 로그 정보에 추천 로그가 있으면 세션 등록후 패스 - if($output->data->count) { - $_SESSION['voted_comment'][$comment_srl] = true; - return new Object(-1, $failed_voted); - } - - // 추천수 업데이트 - if($point < 0) { - $args->blamed_count = $oComment->get('blamed_count') + $point; - $output = executeQuery('comment.updateBlamedCount', $args); - } else { - $args->voted_count = $oComment->get('voted_count') + $point; - $output = executeQuery('comment.updateVotedCount', $args); - } - - // 로그 남기기 - $args->point = $point; - $output = executeQuery('comment.insertCommentVotedLog', $args); - - // 세션 정보에 남김 - $_SESSION['voted_comment'][$comment_srl] = true; - - // 결과 리턴 - return new Object(0, $success_message); - } - - /** - * @brief 댓글 신고 - **/ - function declaredComment($comment_srl) { - // 세션 정보에 신고 정보가 있으면 중단 - if($_SESSION['declared_comment'][$comment_srl]) return new Object(-1, 'failed_declared'); - - // 이미 신고되었는지 검사 - $args->comment_srl = $comment_srl; - $output = executeQuery('comment.getDeclaredComment', $args); - if(!$output->toBool()) return $output; - - // 문서 원본을 가져옴 - $oCommentModel = &getModel('comment'); - $oComment = $oCommentModel->getComment($comment_srl, false, false); - - // 글의 작성 ip와 현재 접속자의 ip가 동일하면 패스 - if($oComment->get('ipaddress') == $_SERVER['REMOTE_ADDR']) { - $_SESSION['declared_comment'][$comment_srl] = true; - return new Object(-1, 'failed_declared'); - } - - // comment의 작성자가 회원일때 조사 - if($oComment->get('member_srl')) { - // member model 객체 생성 - $oMemberModel = &getModel('member'); - $member_srl = $oMemberModel->getLoggedMemberSrl(); - - // 글쓴이와 현재 로그인 사용자의 정보가 일치하면 읽었다고 생각하고 세션 등록후 패스 - if($member_srl && $member_srl == $oComment->get('member_srl')) { - $_SESSION['declared_comment'][$comment_srl] = true; - return new Object(-1, 'failed_declared'); - } - } - - // 로그인 사용자이면 member_srl, 비회원이면 ipaddress로 판단 - if($member_srl) { - $args->member_srl = $member_srl; - } else { - $args->ipaddress = $_SERVER['REMOTE_ADDR']; - } - $args->comment_srl = $comment_srl; - $output = executeQuery('comment.getCommentDeclaredLogInfo', $args); - - // 로그 정보에 신고 로그가 있으면 세션 등록후 패스 - if($output->data->count) { - $_SESSION['declared_comment'][$comment_srl] = true; - return new Object(-1, 'failed_declared'); - } - - // 신고글 추가 - if($output->data->declared_count > 0) $output = executeQuery('comment.updateDeclaredComment', $args); - else $output = executeQuery('comment.insertDeclaredComment', $args); - if(!$output->toBool()) return $output; - - // 로그 남기기 - $output = executeQuery('comment.insertCommentDeclaredLog', $args); - - // 세션 정보에 남김 - $_SESSION['declared_comment'][$comment_srl] = true; - - $this->setMessage('success_declared'); - } - - /** - * @brief 댓글의 이 댓글을.. 클릭시 나타나는 팝업 메뉴를 추가하는 method - **/ - function addCommentPopupMenu($url, $str, $icon = '', $target = 'self') { - $comment_popup_menu_list = Context::get('comment_popup_menu_list'); - if(!is_array($comment_popup_menu_list)) $comment_popup_menu_list = array(); - - $obj->url = $url; - $obj->str = $str; - $obj->icon = $icon; - $obj->target = $target; - $comment_popup_menu_list[] = $obj; - - Context::set('comment_popup_menu_list', $comment_popup_menu_list); - } - - /** - * @brief 댓글의 모듈별 추가 확장 폼을 저장 - **/ - function procCommentInsertModuleConfig() { - $module_srl = Context::get('target_module_srl'); - if(preg_match('/^([0-9,]+)$/',$module_srl)) $module_srl = explode(',',$module_srl); - else $module_srl = array($module_srl); - - $comment_config->comment_count = (int)Context::get('comment_count'); - if(!$comment_config->comment_count) $comment_config->comment_count = 50; - - $comment_config->use_vote_up = Context::get('use_vote_up'); - if(!$comment_config->use_vote_up) $comment_config->use_vote_up = 'Y'; - - $comment_config->use_vote_down = Context::get('use_vote_down'); - if(!$comment_config->use_vote_down) $comment_config->use_vote_down = 'Y'; - - for($i=0;$isetCommentModuleConfig($srl,$comment_config); - } - - $this->setError(-1); - $this->setMessage('success_updated'); - } - - function setCommentModuleConfig($srl, $comment_config){ - $oModuleController = &getController('module'); - $oModuleController->insertModulePartConfig('comment',$srl,$comment_config); - return new Object(); - } - } -?> +getComment($comment_srl, false, false); + $module_srl = $oComment->get('module_srl'); + if(!$module_srl) return new Object(-1, 'msg_invalid_request'); + + $oModuleModel = &getModel('module'); + $comment_config = $oModuleModel->getModulePartConfig('comment',$module_srl); + if($comment_config->use_vote_up=='N') return new Object(-1, 'msg_invalid_request'); + + $point = 1; + return $this->updateVotedCount($comment_srl, $point); + } + + /** + * @brief 댓글의 추천을 처리하는 action (Down) + **/ + function procCommentVoteDown() { + if(!Context::get('is_logged')) return new Object(-1, 'msg_invalid_request'); + + $comment_srl = Context::get('target_srl'); + if(!$comment_srl) return new Object(-1, 'msg_invalid_request'); + + $oCommentModel = &getModel('comment'); + $oComment = $oCommentModel->getComment($comment_srl, false, false); + $module_srl = $oComment->get('module_srl'); + if(!$module_srl) return new Object(-1, 'msg_invalid_request'); + + $oModuleModel = &getModel('module'); + $comment_config = $oModuleModel->getModulePartConfig('comment',$module_srl); + if($comment_config->use_vote_down=='N') return new Object(-1, 'msg_invalid_request'); + + $point = -1; + return $this->updateVotedCount($comment_srl, $point); + } + + /** + * @brief 댓글이 신고될 경우 호출되는 action + **/ + function procCommentDeclare() { + if(!Context::get('is_logged')) return new Object(-1, 'msg_invalid_request'); + + $comment_srl = Context::get('target_srl'); + if(!$comment_srl) return new Object(-1, 'msg_invalid_request'); + + return $this->declaredComment($comment_srl); + } + + /** + * @brief document삭제시 해당 document의 댓글을 삭제하는 trigger + **/ + function triggerDeleteDocumentComments(&$obj) { + $document_srl = $obj->document_srl; + if(!$document_srl) return new Object(); + + return $this->deleteComments($document_srl, true); + } + + /** + * @brief module 삭제시 해당 댓글을 모두 삭제하는 trigger + **/ + function triggerDeleteModuleComments(&$obj) { + $module_srl = $obj->module_srl; + if(!$module_srl) return new Object(); + + $oCommentController = &getAdminController('comment'); + return $oCommentController->deleteModuleComments($module_srl); + } + + /** + * @brief 코멘트의 권한 부여 + * 세션값으로 현 접속상태에서만 사용 가능 + **/ + function addGrant($comment_srl) { + $_SESSION['own_comment'][$comment_srl] = true; + } + + /** + * @brief 댓글 입력 + **/ + function insertComment($obj, $manual_inserted = false) { + $obj->__isupdate = false; + // trigger 호출 (before) + $output = ModuleHandler::triggerCall('comment.insertComment', 'before', $obj); + if(!$output->toBool()) return $output; + + // document_srl에 해당하는 글이 있는지 확인 + $document_srl = $obj->document_srl; + if(!$document_srl) return new Object(-1,'msg_invalid_document'); + + // document model 객체 생성 + $oDocumentModel = &getModel('document'); + + // even for manual_inserted if password exists, md5 it. + if($obj->password) $obj->password = md5($obj->password); + // 원본글을 가져옴 + if(!$manual_inserted) { + $oDocument = $oDocumentModel->getDocument($document_srl); + + if($document_srl != $oDocument->document_srl) return new Object(-1,'msg_invalid_document'); + if($oDocument->isLocked()) return new Object(-1,'msg_invalid_request'); + + if($obj->homepage && !preg_match('/^[a-z]+:\/\//i',$obj->homepage)) $obj->homepage = 'http://'.$obj->homepage; + + // 로그인 된 회원일 경우 회원의 정보를 입력 + if(Context::get('is_logged')) { + $logged_info = Context::get('logged_info'); + $obj->member_srl = $logged_info->member_srl; + $obj->user_id = $logged_info->user_id; + $obj->user_name = $logged_info->user_name; + $obj->nick_name = $logged_info->nick_name; + $obj->email_address = $logged_info->email_address; + $obj->homepage = $logged_info->homepage; + } + } + + // 로그인정보가 없고 사용자 이름이 없으면 오류 표시 + if(!$logged_info->member_srl && !$obj->nick_name) return new Object(-1,'msg_invalid_request'); + + if(!$obj->comment_srl) $obj->comment_srl = getNextSequence(); + + // 순서를 정함 + $obj->list_order = getNextSequence() * -1; + + // 내용에서 XE만의 태그를 삭제 + $obj->content = preg_replace('!<\!--(Before|After)(Document|Comment)\(([0-9]+),([0-9]+)\)-->!is', '', $obj->content); + if(Mobile::isFromMobilePhone()) + { + $obj->content = nl2br(htmlspecialchars($obj->content)); + } + if(!$obj->regdate) $obj->regdate = date("YmdHis"); + + // 세션에서 최고 관리자가 아니면 iframe, script 제거 + if($logged_info->is_admin != 'Y') $obj->content = removeHackTag($obj->content); + + if(!$obj->notify_message) $obj->notify_message = 'N'; + if(!$obj->is_secret) $obj->is_secret = 'N'; + + // begin transaction + $oDB = &DB::getInstance(); + $oDB->begin(); + + // 댓글 목록 부분을 먼저 입력 + $list_args->comment_srl = $obj->comment_srl; + $list_args->document_srl = $obj->document_srl; + $list_args->module_srl = $obj->module_srl; + $list_args->regdate = $obj->regdate; + + // 부모댓글이 없으면 바로 데이터를 설정 + if(!$obj->parent_srl) { + $list_args->head = $list_args->arrange = $obj->comment_srl; + $list_args->depth = 0; + + // 부모댓글이 있으면 부모글의 정보를 구해옴 + } else { + // 부모댓글의 정보를 구함 + $parent_args->comment_srl = $obj->parent_srl; + $parent_output = executeQuery('comment.getCommentListItem', $parent_args); + + // 부모댓글이 존재하지 않으면 return + if(!$parent_output->toBool() || !$parent_output->data) return; + $parent = $parent_output->data; + + $list_args->head = $parent->head; + $list_args->depth = $parent->depth+1; + + // depth가 2단계 미만이면 별도의 update문 없이 insert만으로 쓰레드 정리 + if($list_args->depth<2) { + $list_args->arrange = $obj->comment_srl; + + // depth가 2단계 이상이면 반업데이트 실행 + } else { + // 부모 댓글과 같은 head를 가지고 depth가 같거나 작은 댓글중 제일 위 댓글을 구함 + $p_args->head = $parent->head; + $p_args->arrange = $parent->arrange; + $p_args->depth = $parent->depth; + $output = executeQuery('comment.getCommentParentNextSibling', $p_args); + + if($output->data->arrange) { + $list_args->arrange = $output->data->arrange; + $output = executeQuery('comment.updateCommentListArrange', $list_args); + } else { + $list_args->arrange = $obj->comment_srl; + } + + } + } + + $output = executeQuery('comment.insertCommentList', $list_args); + if(!$output->toBool()) return $output; + + // 댓글 본문을 입력 + $output = executeQuery('comment.insertComment', $obj); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // comment model객체 생성 + $oCommentModel = &getModel('comment'); + + // 해당 글의 전체 댓글 수를 구해옴 + $comment_count = $oCommentModel->getCommentCount($document_srl); + + // document의 controller 객체 생성 + $oDocumentController = &getController('document'); + + // 해당글의 댓글 수를 업데이트 + $output = $oDocumentController->updateCommentCount($document_srl, $comment_count, $obj->nick_name, true); + + // 댓글의 권한을 부여 + $this->addGrant($obj->comment_srl); + + + // trigger 호출 (after) + if($output->toBool()) { + $trigger_output = ModuleHandler::triggerCall('comment.insertComment', 'after', $obj); + if(!$trigger_output->toBool()) { + $oDB->rollback(); + return $trigger_output; + } + } + + // commit + $oDB->commit(); + + if(!$manual_inserted) { + // 원본글에 알림(notify_message)가 설정되어 있으면 메세지 보냄 + $oDocument->notify(Context::getLang('comment'), $obj->content); + + // 원본 댓글이 있고 원본 댓글에 알림(notify_message)가 있으면 메세지 보냄 + if($obj->parent_srl) { + $oParent = $oCommentModel->getComment($obj->parent_srl); + if ($oParent->get('member_srl') != $oDocument->get('member_srl')) { + $oParent->notify(Context::getLang('comment'), $obj->content); + } + } + } + + + $output->add('comment_srl', $obj->comment_srl); + return $output; + } + + /** + * @brief 댓글 수정 + **/ + function updateComment($obj, $is_admin = false) { + $obj->__isupdate = true; + // trigger 호출 (before) + $output = ModuleHandler::triggerCall('comment.updateComment', 'before', $obj); + if(!$output->toBool()) return $output; + + // comment model 객체 생성 + $oCommentModel = &getModel('comment'); + + // 원본 데이터를 가져옴 + $source_obj = $oCommentModel->getComment($obj->comment_srl); + if(!$source_obj->getMemberSrl()) { + $obj->member_srl = $source_obj->get('member_srl'); + $obj->user_name = $source_obj->get('user_name'); + $obj->nick_name = $source_obj->get('nick_name'); + $obj->email_address = $source_obj->get('email_address'); + $obj->homepage = $source_obj->get('homepage'); + } + + // 권한이 있는지 확인 + if(!$is_admin && !$source_obj->isGranted()) return new Object(-1, 'msg_not_permitted'); + + if($obj->password) $obj->password = md5($obj->password); + if($obj->homepage && !preg_match('/^[a-z]+:\/\//i',$obj->homepage)) $obj->homepage = 'http://'.$obj->homepage; + + // 로그인 되어 있고 작성자와 수정자가 동일하면 수정자의 정보를 세팅 + if(Context::get('is_logged')) { + $logged_info = Context::get('logged_info'); + if($source_obj->member_srl == $logged_info->member_srl) { + $obj->member_srl = $logged_info->member_srl; + $obj->user_name = $logged_info->user_name; + $obj->nick_name = $logged_info->nick_name; + $obj->email_address = $logged_info->email_address; + $obj->homepage = $logged_info->homepage; + } + } + + // 로그인한 유저가 작성한 글인데 nick_name이 없을 경우 + if($source_obj->get('member_srl')&& !$obj->nick_name) { + $obj->member_srl = $source_obj->get('member_srl'); + $obj->user_name = $source_obj->get('user_name'); + $obj->nick_name = $source_obj->get('nick_name'); + $obj->email_address = $source_obj->get('email_address'); + $obj->homepage = $source_obj->get('homepage'); + } + + + if(!$obj->content) $obj->content = $source_obj->get('content'); + + // 내용에서 XE만의 태그를 삭제 + $obj->content = preg_replace('!<\!--(Before|After)(Document|Comment)\(([0-9]+),([0-9]+)\)-->!is', '', $obj->content); + + // 세션에서 최고 관리자가 아니면 iframe, script 제거 + if($logged_info->is_admin != 'Y') $obj->content = removeHackTag($obj->content); + + // begin transaction + $oDB = &DB::getInstance(); + $oDB->begin(); + + // 업데이트 + $output = executeQuery('comment.updateComment', $obj); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // trigger 호출 (after) + if($output->toBool()) { + $trigger_output = ModuleHandler::triggerCall('comment.updateComment', 'after', $obj); + if(!$trigger_output->toBool()) { + $oDB->rollback(); + return $trigger_output; + } + } + + // commit + $oDB->commit(); + + $output->add('comment_srl', $obj->comment_srl); + return $output; + } + + /** + * @brief 댓글 삭제 + **/ + function deleteComment($comment_srl, $is_admin = false) { + + // comment model 객체 생성 + $oCommentModel = &getModel('comment'); + + // 기존 댓글이 있는지 확인 + $comment = $oCommentModel->getComment($comment_srl); + if($comment->comment_srl != $comment_srl) return new Object(-1, 'msg_invalid_request'); + $document_srl = $comment->document_srl; + + // trigger 호출 (before) + $output = ModuleHandler::triggerCall('comment.deleteComment', 'before', $comment); + if(!$output->toBool()) return $output; + + // 해당 댓글에 child가 있는지 확인 + $child_count = $oCommentModel->getChildCommentCount($comment_srl); + if($child_count>0) return new Object(-1, 'fail_to_delete_have_children'); + + // 권한이 있는지 확인 + if(!$is_admin && !$comment->isGranted()) return new Object(-1, 'msg_not_permitted'); + + // begin transaction + $oDB = &DB::getInstance(); + $oDB->begin(); + + // 삭제 + $args->comment_srl = $comment_srl; + $output = executeQuery('comment.deleteComment', $args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + $output = executeQuery('comment.deleteCommentList', $args); + + // 댓글 수를 구해서 업데이트 + $comment_count = $oCommentModel->getCommentCount($document_srl); + + // document의 controller 객체 생성 + $oDocumentController = &getController('document'); + + // 해당글의 댓글 수를 업데이트 + $output = $oDocumentController->updateCommentCount($document_srl, $comment_count, null, false); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // trigger 호출 (after) + if($output->toBool()) { + $trigger_output = ModuleHandler::triggerCall('comment.deleteComment', 'after', $comment); + if(!$trigger_output->toBool()) { + $oDB->rollback(); + return $trigger_output; + } + } + + // commit + $oDB->commit(); + + $output->add('document_srl', $document_srl); + return $output; + } + + /** + * @brief 특정 글의 모든 댓글 삭제 + **/ + function deleteComments($document_srl) { + // document model객체 생성 + $oDocumentModel = &getModel('document'); + $oCommentModel = &getModel('comment'); + + // 권한이 있는지 확인 + $oDocument = $oDocumentModel->getDocument($document_srl); + if(!$oDocument->isExists() || !$oDocument->isGranted()) return new Object(-1, 'msg_not_permitted'); + + // 댓글 목록을 가져와서 일단 trigger만 실행 (일괄 삭제를 해야 하기에 최대한 처리 비용을 줄이기 위한 방법) + $args->document_srl = $document_srl; + $comments = executeQueryArray('comment.getAllComments',$args); + if($comments->data) { + foreach($comments->data as $key => $comment) { + // trigger 호출 (before) + $output = ModuleHandler::triggerCall('comment.deleteComment', 'before', $comment); + if(!$output->toBool()) continue; + + // trigger 호출 (after) + $output = ModuleHandler::triggerCall('comment.deleteComment', 'after', $comment); + if(!$output->toBool()) continue; + } + } + + // 댓글 본문 삭제 + $args->document_srl = $document_srl; + $output = executeQuery('comment.deleteComments', $args); + if(!$output->toBool()) return $output; + + // 댓글 목록 삭제 + $output = executeQuery('comment.deleteCommentsList', $args); + + return $output; + } + + /** + * @brief 해당 comment의 추천수 증가 + **/ + function updateVotedCount($comment_srl, $point = 1) { + if($point > 0) { + $failed_voted = 'failed_voted'; + $success_message = 'success_voted'; + } else { + $failed_voted = 'failed_blamed'; + $success_message = 'success_blamed'; + } + + // 세션 정보에 추천 정보가 있으면 중단 + if($_SESSION['voted_comment'][$comment_srl]) return new Object(-1, $failed_voted); + + $oCommentModel = &getModel('comment'); + $oComment = $oCommentModel->getComment($comment_srl, false, false); + + // 글의 작성 ip와 현재 접속자의 ip가 동일하면 패스 + if($oComment->get('ipaddress') == $_SERVER['REMOTE_ADDR']) { + $_SESSION['voted_comment'][$comment_srl] = true; + return new Object(-1, $failed_voted); + } + + // comment의 작성자가 회원일때 조사 + if($oComment->get('member_srl')) { + $oMemberModel = &getModel('member'); + $member_srl = $oMemberModel->getLoggedMemberSrl(); + + // 글쓴이와 현재 로그인 사용자의 정보가 일치하면 읽었다고 생각하고 세션 등록후 패스 + if($member_srl && $member_srl == $oComment->get('member_srl')) { + $_SESSION['voted_comment'][$comment_srl] = true; + return new Object(-1, $failed_voted); + } + } + + // 로그인 사용자이면 member_srl, 비회원이면 ipaddress로 판단 + if($member_srl) { + $args->member_srl = $member_srl; + } else { + $args->ipaddress = $_SERVER['REMOTE_ADDR']; + } + $args->comment_srl = $comment_srl; + $output = executeQuery('comment.getCommentVotedLogInfo', $args); + + // 로그 정보에 추천 로그가 있으면 세션 등록후 패스 + if($output->data->count) { + $_SESSION['voted_comment'][$comment_srl] = true; + return new Object(-1, $failed_voted); + } + + // 추천수 업데이트 + if($point < 0) { + $args->blamed_count = $oComment->get('blamed_count') + $point; + $output = executeQuery('comment.updateBlamedCount', $args); + } else { + $args->voted_count = $oComment->get('voted_count') + $point; + $output = executeQuery('comment.updateVotedCount', $args); + } + + // 로그 남기기 + $args->point = $point; + $output = executeQuery('comment.insertCommentVotedLog', $args); + + // 세션 정보에 남김 + $_SESSION['voted_comment'][$comment_srl] = true; + + // 결과 리턴 + return new Object(0, $success_message); + } + + /** + * @brief 댓글 신고 + **/ + function declaredComment($comment_srl) { + // 세션 정보에 신고 정보가 있으면 중단 + if($_SESSION['declared_comment'][$comment_srl]) return new Object(-1, 'failed_declared'); + + // 이미 신고되었는지 검사 + $args->comment_srl = $comment_srl; + $output = executeQuery('comment.getDeclaredComment', $args); + if(!$output->toBool()) return $output; + + // 문서 원본을 가져옴 + $oCommentModel = &getModel('comment'); + $oComment = $oCommentModel->getComment($comment_srl, false, false); + + // 글의 작성 ip와 현재 접속자의 ip가 동일하면 패스 + if($oComment->get('ipaddress') == $_SERVER['REMOTE_ADDR']) { + $_SESSION['declared_comment'][$comment_srl] = true; + return new Object(-1, 'failed_declared'); + } + + // comment의 작성자가 회원일때 조사 + if($oComment->get('member_srl')) { + // member model 객체 생성 + $oMemberModel = &getModel('member'); + $member_srl = $oMemberModel->getLoggedMemberSrl(); + + // 글쓴이와 현재 로그인 사용자의 정보가 일치하면 읽었다고 생각하고 세션 등록후 패스 + if($member_srl && $member_srl == $oComment->get('member_srl')) { + $_SESSION['declared_comment'][$comment_srl] = true; + return new Object(-1, 'failed_declared'); + } + } + + // 로그인 사용자이면 member_srl, 비회원이면 ipaddress로 판단 + if($member_srl) { + $args->member_srl = $member_srl; + } else { + $args->ipaddress = $_SERVER['REMOTE_ADDR']; + } + $args->comment_srl = $comment_srl; + $output = executeQuery('comment.getCommentDeclaredLogInfo', $args); + + // 로그 정보에 신고 로그가 있으면 세션 등록후 패스 + if($output->data->count) { + $_SESSION['declared_comment'][$comment_srl] = true; + return new Object(-1, 'failed_declared'); + } + + // 신고글 추가 + if($output->data->declared_count > 0) $output = executeQuery('comment.updateDeclaredComment', $args); + else $output = executeQuery('comment.insertDeclaredComment', $args); + if(!$output->toBool()) return $output; + + // 로그 남기기 + $output = executeQuery('comment.insertCommentDeclaredLog', $args); + + // 세션 정보에 남김 + $_SESSION['declared_comment'][$comment_srl] = true; + + $this->setMessage('success_declared'); + } + + /** + * @brief 댓글의 이 댓글을.. 클릭시 나타나는 팝업 메뉴를 추가하는 method + **/ + function addCommentPopupMenu($url, $str, $icon = '', $target = 'self') { + $comment_popup_menu_list = Context::get('comment_popup_menu_list'); + if(!is_array($comment_popup_menu_list)) $comment_popup_menu_list = array(); + + $obj->url = $url; + $obj->str = $str; + $obj->icon = $icon; + $obj->target = $target; + $comment_popup_menu_list[] = $obj; + + Context::set('comment_popup_menu_list', $comment_popup_menu_list); + } + + /** + * @brief 댓글의 모듈별 추가 확장 폼을 저장 + **/ + function procCommentInsertModuleConfig() { + $module_srl = Context::get('target_module_srl'); + if(preg_match('/^([0-9,]+)$/',$module_srl)) $module_srl = explode(',',$module_srl); + else $module_srl = array($module_srl); + + $comment_config->comment_count = (int)Context::get('comment_count'); + if(!$comment_config->comment_count) $comment_config->comment_count = 50; + + $comment_config->use_vote_up = Context::get('use_vote_up'); + if(!$comment_config->use_vote_up) $comment_config->use_vote_up = 'Y'; + + $comment_config->use_vote_down = Context::get('use_vote_down'); + if(!$comment_config->use_vote_down) $comment_config->use_vote_down = 'Y'; + + for($i=0;$isetCommentModuleConfig($srl,$comment_config); + } + + $this->setError(-1); + $this->setMessage('success_updated'); + } + + function setCommentModuleConfig($srl, $comment_config){ + $oModuleController = &getController('module'); + $oModuleController->insertModulePartConfig('comment',$srl,$comment_config); + return new Object(); + } + } +?> diff --git a/modules/comment/comment.model.php b/modules/comment/comment.model.php index fe5295b20..23655f76b 100644 --- a/modules/comment/comment.model.php +++ b/modules/comment/comment.model.php @@ -1,468 +1,468 @@ -member_srl) { - - $oCommentModel = &getModel('comment'); - $oComment = $oCommentModel->getComment($comment_srl, false, false); - $module_srl = $oComment->get('module_srl'); - $member_srl = $oComment->get('member_srl'); - - $oModuleModel = &getModel('module'); - $comment_config = $oModuleModel->getModulePartConfig('document',$module_srl); - if($comment_config->use_vote_up!='N' && $member_srl!=$logged_info->member_srl){ - // 추천 버튼 추가 - $url = sprintf("doCallModuleAction('comment','procCommentVoteUp','%s')", $comment_srl); - $oCommentController->addCommentPopupMenu($url,'cmd_vote','./modules/document/tpl/icons/vote_up.gif','javascript'); - } - if($comment_config->use_vote_down!='N' && $member_srl!=$logged_info->member_srl){ - // 비추천 버튼 추가 - $url = sprintf("doCallModuleAction('comment','procCommentVoteDown','%s')", $comment_srl); - $oCommentController->addCommentPopupMenu($url,'cmd_vote_down','./modules/document/tpl/icons/vote_down.gif','javascript'); - } - - // 신고 기능 추가 - $url = sprintf("doCallModuleAction('comment','procCommentDeclare','%s')", $comment_srl); - $oCommentController->addCommentPopupMenu($url,'cmd_declare','./modules/document/tpl/icons/declare.gif','javascript'); - } - - // trigger 호출 (after) - ModuleHandler::triggerCall('comment.getCommentMenu', 'after', $menu_list); - - // 관리자일 경우 ip로 글 찾기 - if($logged_info->is_admin == 'Y') { - $oCommentModel = &getModel('comment'); - $oComment = $oCommentModel->getComment($comment_srl); - - if($oComment->isExists()) { - // ip주소에 해당하는 글 찾기 - $url = getUrl('','module','admin','act','dispCommentAdminList','search_target','ipaddress','search_keyword',$oComment->get('ipaddress')); - $icon_path = './modules/member/tpl/images/icon_management.gif'; - $oCommentController->addCommentPopupMenu($url,'cmd_search_by_ipaddress',$icon_path,'TraceByIpaddress'); - - $url = sprintf("var params = new Array(); params['ipaddress']='%s'; exec_xml('spamfilter', 'procSpamfilterAdminInsertDeniedIP', params, completeCallModuleAction)", $oComment-> getIpAddress()); - $oCommentController->addCommentPopupMenu($url,'cmd_add_ip_to_spamfilter','./modules/document/tpl/icons/declare.gif','javascript'); - } - } - - // 팝업메뉴의 언어 변경 - $menus = Context::get('comment_popup_menu_list'); - $menus_count = count($menus); - for($i=0;$i<$menus_count;$i++) { - $menus[$i]->str = Context::getLang($menus[$i]->str); - } - - // 최종적으로 정리된 팝업메뉴 목록을 구함 - $this->add('menus', $menus); - } - - - /** - * @brief comment_srl에 권한이 있는지 체크 - * - * 세션 정보만 이용 - **/ - function isGranted($comment_srl) { - return $_SESSION['own_comment'][$comment_srl]; - } - - /** - * @brief 자식 답글의 갯수 리턴 - **/ - function getChildCommentCount($comment_srl) { - $args->comment_srl = $comment_srl; - $output = executeQuery('comment.getChildCommentCount', $args); - return (int)$output->data->count; - } - - /** - * @brief 댓글 가져오기 - **/ - function getComment($comment_srl=0, $is_admin = false) { - $oComment = new commentItem($comment_srl); - if($is_admin) $oComment->setGrant(); - - return $oComment; - } - - /** - * @brief 여러개의 댓글들을 가져옴 (페이징 아님) - **/ - function getComments($comment_srl_list) { - if(is_array($comment_srl_list)) $comment_srls = implode(',',$comment_srl_list); - - // DB에서 가져옴 - $args->comment_srls = $comment_srls; - $output = executeQuery('comment.getComments', $args); - if(!$output->toBool()) return; - $comment_list = $output->data; - if(!$comment_list) return; - if(!is_array($comment_list)) $comment_list = array($comment_list); - - $comment_count = count($comment_list); - foreach($comment_list as $key => $attribute) { - if(!$attribute->comment_srl) continue; - $oComment = null; - $oComment = new commentItem(); - $oComment->setAttribute($attribute); - if($is_admin) $oComment->setGrant(); - - $result[$attribute->comment_srl] = $oComment; - } - return $result; - } - - /** - * @brief document_srl 에 해당하는 댓글의 전체 갯수를 가져옴 - **/ - function getCommentCount($document_srl) { - $args->document_srl = $document_srl; - $output = executeQuery('comment.getCommentCount', $args); - $total_count = $output->data->count; - return (int)$total_count; - } - - - /** - * @brief module_srl 에 해당하는 댓글의 전체 갯수를 가져옴 - **/ - function getCommentAllCount($module_srl) { - $args->module_srl = $module_srl; - $output = executeQuery('comment.getCommentCount', $args); - $total_count = $output->data->count; - - return (int)$total_count; - } - - - /** - * @brief mid 에 해당하는 댓글을 가져옴 - **/ - function getNewestCommentList($obj) { - if($obj->mid) { - $oModuleModel = &getModel('module'); - $obj->module_srl = $oModuleModel->getModuleSrlByMid($obj->mid); - unset($obj->mid); - } - - // 넘어온 module_srl은 array일 수도 있기에 array인지를 체크 - if(is_array($obj->module_srl)) $args->module_srl = implode(',', $obj->module_srl); - else $args->module_srl = $obj->module_srl; - $args->list_count = $obj->list_count; - - $output = executeQuery('comment.getNewestCommentList', $args); - if(!$output->toBool()) return $output; - - $comment_list = $output->data; - if($comment_list) { - if(!is_array($comment_list)) $comment_list = array($comment_list); - $comment_count = count($comment_list); - foreach($comment_list as $key => $attribute) { - if(!$attribute->comment_srl) continue; - $oComment = null; - $oComment = new commentItem(); - $oComment->setAttribute($attribute); - - $result[$key] = $oComment; - } - $output->data = $result; - } - return $result; - } - - /** - * @brief document_srl에 해당하는 문서의 댓글 목록을 가져옴 - **/ - function getCommentList($document_srl, $page = 0, $is_admin = false, $count = 0) { - // 해당 문서의 모듈에 해당하는 댓글 수를 구함 - $oDocumentModel = &getModel('document'); - $oDocument = $oDocumentModel->getDocument($document_srl); - - // 문서가 존재하지 않으면 return~ - if(!$oDocument->isExists()) return; - - // 댓글수가 없으면 return~ - if($oDocument->getCommentCount()<1) return; - - // 정해진 댓글수에 따른 댓글 목록 구함 - $module_srl = $oDocument->get('module_srl'); - - if(!$count) { - $comment_config = $this->getCommentConfig($module_srl); - $comment_count = $comment_config->comment_count; - if(!$comment_count) $comment_count = 50; - } else { - $comment_count = $count; - } - - // 페이지가 없으면 제일 뒤 페이지를 구함 - if(!$page) $page = (int)( ($oDocument->getCommentCount()-1) / $comment_count) + 1; - - // 정해진 수에 따라 목록을 구해옴 - $args->document_srl = $document_srl; - $args->list_count = $comment_count; - $args->page = $page; - $args->page_count = 10; - $output = executeQueryArray('comment.getCommentPageList', $args); - - // 쿼리 결과에서 오류가 생기면 그냥 return - if(!$output->toBool()) return; - - // 만약 구해온 결과값이 저장된 댓글수와 다르다면 기존의 데이터로 판단하고 댓글 목록 테이블에 데이터 입력 - if(!$output->data) { - $this->fixCommentList($oDocument->get('module_srl'), $document_srl); - $output = executeQueryArray('comment.getCommentPageList', $args); - if(!$output->toBool()) return; - } - - return $output; - } - - /** - * @brief document_srl에 해당하는 댓글 목록을 갱신 - * 정식버전 이전에 사용되던 데이터를 위한 처리 - **/ - function fixCommentList($module_srl, $document_srl) { - // 일괄 작업이라서 lock 파일을 생성하여 중복 작업이 되지 않도록 한다 - $lock_file = "./files/cache/tmp/lock.".$document_srl; - if(file_exists($lock_file) && filemtime($lock_file)+60*60*10document_srl = $document_srl; - $args->list_order = 'list_order'; - $output = executeQuery('comment.getCommentList', $args); - if(!$output->toBool()) return $output; - - $source_list = $output->data; - if(!is_array($source_list)) $source_list = array($source_list); - - // 댓글를 계층형 구조로 정렬 - $comment_count = count($source_list); - - $root = NULL; - $list = NULL; - $comment_list = array(); - - // 로그인 사용자의 경우 로그인 정보를 일단 구해 놓음 - $logged_info = Context::get('logged_info'); - - - // loop를 돌면서 코멘트의 계층 구조 만듬 - for($i=$comment_count-1;$i>=0;$i--) { - $comment_srl = $source_list[$i]->comment_srl; - $parent_srl = $source_list[$i]->parent_srl; - if(!$comment_srl) continue; - - // 목록을 만듬 - $list[$comment_srl] = $source_list[$i]; - - if($parent_srl) { - $list[$parent_srl]->child[] = &$list[$comment_srl]; - } else { - $root->child[] = &$list[$comment_srl]; - } - } - $this->_arrangeComment($comment_list, $root->child, 0, null); - - // 구해진 값을 db에 입력함 - if(count($comment_list)) { - foreach($comment_list as $comment_srl => $item) { - $comment_args = null; - $comment_args->comment_srl = $comment_srl; - $comment_args->document_srl = $document_srl; - $comment_args->head = $item->head; - $comment_args->arrange = $item->arrange; - $comment_args->module_srl = $module_srl; - $comment_args->regdate = $item->regdate; - $comment_args->depth = $item->depth; - - executeQuery('comment.insertCommentList', $comment_args); - } - } - - // 성공시 lock파일 제거 - FileHandler::removeFile($lock_file); - } - - /** - * @brief 댓글을 계층형으로 재배치 - **/ - function _arrangeComment(&$comment_list, $list, $depth, $parent = null) { - if(!count($list)) return; - foreach($list as $key => $val) { - - if($parent) $val->head = $parent->head; - else $val->head = $val->comment_srl; - $val->arrange = count($comment_list)+1; - - if($val->child) { - $val->depth = $depth; - $comment_list[$val->comment_srl] = $val; - $this->_arrangeComment($comment_list,$val->child,$depth+1, $val); - unset($val->child); - } else { - $val->depth = $depth; - $comment_list[$val->comment_srl] = $val; - } - } - } - - /** - * @brief 모든 댓글를 시간 역순으로 가져옴 (관리자용) - **/ - function getTotalCommentList($obj) { - $query_id = 'comment.getTotalCommentList'; - - // 변수 설정 - $args->sort_index = 'list_order'; - $args->page = $obj->page?$obj->page:1; - $args->list_count = $obj->list_count?$obj->list_count:20; - $args->page_count = $obj->page_count?$obj->page_count:10; - $args->s_module_srl = $obj->module_srl; - $args->exclude_module_srl = $obj->exclude_module_srl; - - // 검색 옵션 정리 - $search_target = $obj->search_target?$obj->search_target:trim(Context::get('search_target')); - $search_keyword = $obj->search_keyword?$obj->search_keyword:trim(Context::get('search_keyword')); - if($search_target && $search_keyword) { - switch($search_target) { - case 'content' : - if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); - $args->s_content = $search_keyword; - break; - case 'user_id' : - if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); - $args->s_user_id = $search_keyword; - $query_id = 'comment.getTotalCommentListWithinMember'; - $args->sort_index = 'comments.list_order'; - break; - case 'user_name' : - if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); - $args->s_user_name = $search_keyword; - break; - case 'nick_name' : - if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); - $args->s_nick_name = $search_keyword; - break; - case 'email_address' : - if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); - $args->s_email_address = $search_keyword; - break; - case 'homepage' : - if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); - $args->s_homepage = $search_keyword; - break; - case 'regdate' : - $args->s_regdate = $search_keyword; - break; - case 'last_update' : - $args->s_last_upate = $search_keyword; - break; - case 'ipaddress' : - $args->s_ipaddress= $search_keyword; - break; - case 'member_srl' : - $args->{"s_".$search_target} = (int)$search_keyword; - break; - } - } - - // comment.getTotalCommentList 쿼리 실행 - $output = executeQueryArray($query_id, $args); - - // 결과가 없거나 오류 발생시 그냥 return - if(!$output->toBool()||!count($output->data)) return $output; - foreach($output->data as $key => $val) { - unset($_oComment); - $_oComment = new CommentItem(0); - $_oComment->setAttribute($val); - $output->data[$key] = $_oComment; - } - - return $output; - } - - /** - * @brief 모듈별 댓글 설정을 return - **/ - function getCommentConfig($module_srl) { - $oModuleModel = &getModel('module'); - $comment_config = $oModuleModel->getModulePartConfig('comment', $module_srl); - if(!isset($comment_config->comment_count)) $comment_config->comment_count = 50; - return $comment_config; - } - - function getCommentVotedMemberList() - { - $comment_srl = Context::get('comment_srl'); - if(!$comment_srl) return new Object(-1,'msg_invalid_request'); - - $point = Context::get('point'); - if($point != -1) $point = 1; - - $oCommentModel = &getModel('comment'); - $oComment = $oCommentModel->getComment($comment_srl, false, false); - $module_srl = $oComment->get('module_srl'); - if(!$module_srl) return new Object(-1, 'msg_invalid_request'); - - $oModuleModel = &getModel('module'); - $comment_config = $oModuleModel->getModulePartConfig('comment',$module_srl); - if($point == -1){ - if($comment_config->use_vote_down!='S') return new Object(-1, 'msg_invalid_request'); - $args->below_point = 0; - }else{ - if($comment_config->use_vote_up!='S') return new Object(-1, 'msg_invalid_request'); - $args->more_point = 0; - } - - $args->comment_srl = $comment_srl; - $output = executeQueryArray('comment.getVotedMemberList',$args); - if(!$output->toBool()) return $output; - - $oMemberModel = &getModel('member'); - if($output->data){ - foreach($output->data as $k => $d){ - $profile_image = $oMemberModel->getProfileImage($d->member_srl); - $output->data[$k]->src = $profile_image->src; - } - } - - $this->add('voted_member_list',$output->data); - } - } -?> +member_srl) { + + $oCommentModel = &getModel('comment'); + $oComment = $oCommentModel->getComment($comment_srl, false, false); + $module_srl = $oComment->get('module_srl'); + $member_srl = $oComment->get('member_srl'); + + $oModuleModel = &getModel('module'); + $comment_config = $oModuleModel->getModulePartConfig('document',$module_srl); + if($comment_config->use_vote_up!='N' && $member_srl!=$logged_info->member_srl){ + // 추천 버튼 추가 + $url = sprintf("doCallModuleAction('comment','procCommentVoteUp','%s')", $comment_srl); + $oCommentController->addCommentPopupMenu($url,'cmd_vote','./modules/document/tpl/icons/vote_up.gif','javascript'); + } + if($comment_config->use_vote_down!='N' && $member_srl!=$logged_info->member_srl){ + // 비추천 버튼 추가 + $url = sprintf("doCallModuleAction('comment','procCommentVoteDown','%s')", $comment_srl); + $oCommentController->addCommentPopupMenu($url,'cmd_vote_down','./modules/document/tpl/icons/vote_down.gif','javascript'); + } + + // 신고 기능 추가 + $url = sprintf("doCallModuleAction('comment','procCommentDeclare','%s')", $comment_srl); + $oCommentController->addCommentPopupMenu($url,'cmd_declare','./modules/document/tpl/icons/declare.gif','javascript'); + } + + // trigger 호출 (after) + ModuleHandler::triggerCall('comment.getCommentMenu', 'after', $menu_list); + + // 관리자일 경우 ip로 글 찾기 + if($logged_info->is_admin == 'Y') { + $oCommentModel = &getModel('comment'); + $oComment = $oCommentModel->getComment($comment_srl); + + if($oComment->isExists()) { + // ip주소에 해당하는 글 찾기 + $url = getUrl('','module','admin','act','dispCommentAdminList','search_target','ipaddress','search_keyword',$oComment->get('ipaddress')); + $icon_path = './modules/member/tpl/images/icon_management.gif'; + $oCommentController->addCommentPopupMenu($url,'cmd_search_by_ipaddress',$icon_path,'TraceByIpaddress'); + + $url = sprintf("var params = new Array(); params['ipaddress']='%s'; exec_xml('spamfilter', 'procSpamfilterAdminInsertDeniedIP', params, completeCallModuleAction)", $oComment-> getIpAddress()); + $oCommentController->addCommentPopupMenu($url,'cmd_add_ip_to_spamfilter','./modules/document/tpl/icons/declare.gif','javascript'); + } + } + + // 팝업메뉴의 언어 변경 + $menus = Context::get('comment_popup_menu_list'); + $menus_count = count($menus); + for($i=0;$i<$menus_count;$i++) { + $menus[$i]->str = Context::getLang($menus[$i]->str); + } + + // 최종적으로 정리된 팝업메뉴 목록을 구함 + $this->add('menus', $menus); + } + + + /** + * @brief comment_srl에 권한이 있는지 체크 + * + * 세션 정보만 이용 + **/ + function isGranted($comment_srl) { + return $_SESSION['own_comment'][$comment_srl]; + } + + /** + * @brief 자식 답글의 갯수 리턴 + **/ + function getChildCommentCount($comment_srl) { + $args->comment_srl = $comment_srl; + $output = executeQuery('comment.getChildCommentCount', $args); + return (int)$output->data->count; + } + + /** + * @brief 댓글 가져오기 + **/ + function getComment($comment_srl=0, $is_admin = false) { + $oComment = new commentItem($comment_srl); + if($is_admin) $oComment->setGrant(); + + return $oComment; + } + + /** + * @brief 여러개의 댓글들을 가져옴 (페이징 아님) + **/ + function getComments($comment_srl_list) { + if(is_array($comment_srl_list)) $comment_srls = implode(',',$comment_srl_list); + + // DB에서 가져옴 + $args->comment_srls = $comment_srls; + $output = executeQuery('comment.getComments', $args); + if(!$output->toBool()) return; + $comment_list = $output->data; + if(!$comment_list) return; + if(!is_array($comment_list)) $comment_list = array($comment_list); + + $comment_count = count($comment_list); + foreach($comment_list as $key => $attribute) { + if(!$attribute->comment_srl) continue; + $oComment = null; + $oComment = new commentItem(); + $oComment->setAttribute($attribute); + if($is_admin) $oComment->setGrant(); + + $result[$attribute->comment_srl] = $oComment; + } + return $result; + } + + /** + * @brief document_srl 에 해당하는 댓글의 전체 갯수를 가져옴 + **/ + function getCommentCount($document_srl) { + $args->document_srl = $document_srl; + $output = executeQuery('comment.getCommentCount', $args); + $total_count = $output->data->count; + return (int)$total_count; + } + + + /** + * @brief module_srl 에 해당하는 댓글의 전체 갯수를 가져옴 + **/ + function getCommentAllCount($module_srl) { + $args->module_srl = $module_srl; + $output = executeQuery('comment.getCommentCount', $args); + $total_count = $output->data->count; + + return (int)$total_count; + } + + + /** + * @brief mid 에 해당하는 댓글을 가져옴 + **/ + function getNewestCommentList($obj) { + if($obj->mid) { + $oModuleModel = &getModel('module'); + $obj->module_srl = $oModuleModel->getModuleSrlByMid($obj->mid); + unset($obj->mid); + } + + // 넘어온 module_srl은 array일 수도 있기에 array인지를 체크 + if(is_array($obj->module_srl)) $args->module_srl = implode(',', $obj->module_srl); + else $args->module_srl = $obj->module_srl; + $args->list_count = $obj->list_count; + + $output = executeQuery('comment.getNewestCommentList', $args); + if(!$output->toBool()) return $output; + + $comment_list = $output->data; + if($comment_list) { + if(!is_array($comment_list)) $comment_list = array($comment_list); + $comment_count = count($comment_list); + foreach($comment_list as $key => $attribute) { + if(!$attribute->comment_srl) continue; + $oComment = null; + $oComment = new commentItem(); + $oComment->setAttribute($attribute); + + $result[$key] = $oComment; + } + $output->data = $result; + } + return $result; + } + + /** + * @brief document_srl에 해당하는 문서의 댓글 목록을 가져옴 + **/ + function getCommentList($document_srl, $page = 0, $is_admin = false, $count = 0) { + // 해당 문서의 모듈에 해당하는 댓글 수를 구함 + $oDocumentModel = &getModel('document'); + $oDocument = $oDocumentModel->getDocument($document_srl); + + // 문서가 존재하지 않으면 return~ + if(!$oDocument->isExists()) return; + + // 댓글수가 없으면 return~ + if($oDocument->getCommentCount()<1) return; + + // 정해진 댓글수에 따른 댓글 목록 구함 + $module_srl = $oDocument->get('module_srl'); + + if(!$count) { + $comment_config = $this->getCommentConfig($module_srl); + $comment_count = $comment_config->comment_count; + if(!$comment_count) $comment_count = 50; + } else { + $comment_count = $count; + } + + // 페이지가 없으면 제일 뒤 페이지를 구함 + if(!$page) $page = (int)( ($oDocument->getCommentCount()-1) / $comment_count) + 1; + + // 정해진 수에 따라 목록을 구해옴 + $args->document_srl = $document_srl; + $args->list_count = $comment_count; + $args->page = $page; + $args->page_count = 10; + $output = executeQueryArray('comment.getCommentPageList', $args); + + // 쿼리 결과에서 오류가 생기면 그냥 return + if(!$output->toBool()) return; + + // 만약 구해온 결과값이 저장된 댓글수와 다르다면 기존의 데이터로 판단하고 댓글 목록 테이블에 데이터 입력 + if(!$output->data) { + $this->fixCommentList($oDocument->get('module_srl'), $document_srl); + $output = executeQueryArray('comment.getCommentPageList', $args); + if(!$output->toBool()) return; + } + + return $output; + } + + /** + * @brief document_srl에 해당하는 댓글 목록을 갱신 + * 정식버전 이전에 사용되던 데이터를 위한 처리 + **/ + function fixCommentList($module_srl, $document_srl) { + // 일괄 작업이라서 lock 파일을 생성하여 중복 작업이 되지 않도록 한다 + $lock_file = "./files/cache/tmp/lock.".$document_srl; + if(file_exists($lock_file) && filemtime($lock_file)+60*60*10document_srl = $document_srl; + $args->list_order = 'list_order'; + $output = executeQuery('comment.getCommentList', $args); + if(!$output->toBool()) return $output; + + $source_list = $output->data; + if(!is_array($source_list)) $source_list = array($source_list); + + // 댓글를 계층형 구조로 정렬 + $comment_count = count($source_list); + + $root = NULL; + $list = NULL; + $comment_list = array(); + + // 로그인 사용자의 경우 로그인 정보를 일단 구해 놓음 + $logged_info = Context::get('logged_info'); + + + // loop를 돌면서 코멘트의 계층 구조 만듬 + for($i=$comment_count-1;$i>=0;$i--) { + $comment_srl = $source_list[$i]->comment_srl; + $parent_srl = $source_list[$i]->parent_srl; + if(!$comment_srl) continue; + + // 목록을 만듬 + $list[$comment_srl] = $source_list[$i]; + + if($parent_srl) { + $list[$parent_srl]->child[] = &$list[$comment_srl]; + } else { + $root->child[] = &$list[$comment_srl]; + } + } + $this->_arrangeComment($comment_list, $root->child, 0, null); + + // 구해진 값을 db에 입력함 + if(count($comment_list)) { + foreach($comment_list as $comment_srl => $item) { + $comment_args = null; + $comment_args->comment_srl = $comment_srl; + $comment_args->document_srl = $document_srl; + $comment_args->head = $item->head; + $comment_args->arrange = $item->arrange; + $comment_args->module_srl = $module_srl; + $comment_args->regdate = $item->regdate; + $comment_args->depth = $item->depth; + + executeQuery('comment.insertCommentList', $comment_args); + } + } + + // 성공시 lock파일 제거 + FileHandler::removeFile($lock_file); + } + + /** + * @brief 댓글을 계층형으로 재배치 + **/ + function _arrangeComment(&$comment_list, $list, $depth, $parent = null) { + if(!count($list)) return; + foreach($list as $key => $val) { + + if($parent) $val->head = $parent->head; + else $val->head = $val->comment_srl; + $val->arrange = count($comment_list)+1; + + if($val->child) { + $val->depth = $depth; + $comment_list[$val->comment_srl] = $val; + $this->_arrangeComment($comment_list,$val->child,$depth+1, $val); + unset($val->child); + } else { + $val->depth = $depth; + $comment_list[$val->comment_srl] = $val; + } + } + } + + /** + * @brief 모든 댓글를 시간 역순으로 가져옴 (관리자용) + **/ + function getTotalCommentList($obj) { + $query_id = 'comment.getTotalCommentList'; + + // 변수 설정 + $args->sort_index = 'list_order'; + $args->page = $obj->page?$obj->page:1; + $args->list_count = $obj->list_count?$obj->list_count:20; + $args->page_count = $obj->page_count?$obj->page_count:10; + $args->s_module_srl = $obj->module_srl; + $args->exclude_module_srl = $obj->exclude_module_srl; + + // 검색 옵션 정리 + $search_target = $obj->search_target?$obj->search_target:trim(Context::get('search_target')); + $search_keyword = $obj->search_keyword?$obj->search_keyword:trim(Context::get('search_keyword')); + if($search_target && $search_keyword) { + switch($search_target) { + case 'content' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_content = $search_keyword; + break; + case 'user_id' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_user_id = $search_keyword; + $query_id = 'comment.getTotalCommentListWithinMember'; + $args->sort_index = 'comments.list_order'; + break; + case 'user_name' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_user_name = $search_keyword; + break; + case 'nick_name' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_nick_name = $search_keyword; + break; + case 'email_address' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_email_address = $search_keyword; + break; + case 'homepage' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_homepage = $search_keyword; + break; + case 'regdate' : + $args->s_regdate = $search_keyword; + break; + case 'last_update' : + $args->s_last_upate = $search_keyword; + break; + case 'ipaddress' : + $args->s_ipaddress= $search_keyword; + break; + case 'member_srl' : + $args->{"s_".$search_target} = (int)$search_keyword; + break; + } + } + + // comment.getTotalCommentList 쿼리 실행 + $output = executeQueryArray($query_id, $args); + + // 결과가 없거나 오류 발생시 그냥 return + if(!$output->toBool()||!count($output->data)) return $output; + foreach($output->data as $key => $val) { + unset($_oComment); + $_oComment = new CommentItem(0); + $_oComment->setAttribute($val); + $output->data[$key] = $_oComment; + } + + return $output; + } + + /** + * @brief 모듈별 댓글 설정을 return + **/ + function getCommentConfig($module_srl) { + $oModuleModel = &getModel('module'); + $comment_config = $oModuleModel->getModulePartConfig('comment', $module_srl); + if(!isset($comment_config->comment_count)) $comment_config->comment_count = 50; + return $comment_config; + } + + function getCommentVotedMemberList() + { + $comment_srl = Context::get('comment_srl'); + if(!$comment_srl) return new Object(-1,'msg_invalid_request'); + + $point = Context::get('point'); + if($point != -1) $point = 1; + + $oCommentModel = &getModel('comment'); + $oComment = $oCommentModel->getComment($comment_srl, false, false); + $module_srl = $oComment->get('module_srl'); + if(!$module_srl) return new Object(-1, 'msg_invalid_request'); + + $oModuleModel = &getModel('module'); + $comment_config = $oModuleModel->getModulePartConfig('comment',$module_srl); + if($point == -1){ + if($comment_config->use_vote_down!='S') return new Object(-1, 'msg_invalid_request'); + $args->below_point = 0; + }else{ + if($comment_config->use_vote_up!='S') return new Object(-1, 'msg_invalid_request'); + $args->more_point = 0; + } + + $args->comment_srl = $comment_srl; + $output = executeQueryArray('comment.getVotedMemberList',$args); + if(!$output->toBool()) return $output; + + $oMemberModel = &getModel('member'); + if($output->data){ + foreach($output->data as $k => $d){ + $profile_image = $oMemberModel->getProfileImage($d->member_srl); + $output->data[$k]->src = $profile_image->src; + } + } + + $this->add('voted_member_list',$output->data); + } + } +?> diff --git a/modules/comment/comment.view.php b/modules/comment/comment.view.php index 9885cbe8f..9dd377efc 100644 --- a/modules/comment/comment.view.php +++ b/modules/comment/comment.view.php @@ -1,48 +1,48 @@ -module_srl; - if(!$current_module_srl) return new Object(); - } - - // 댓글 설정을 구함 - $oCommentModel = &getModel('comment'); - $comment_config = $oCommentModel->getCommentConfig($current_module_srl); - Context::set('comment_config', $comment_config); - - // 그룹 목록을 구함 - $oMemberModel = &getModel('member'); - $group_list = $oMemberModel->getGroups(); - Context::set('group_list', $group_list); - - // 템플릿 파일 지정 - $oTemplate = &TemplateHandler::getInstance(); - $tpl = $oTemplate->compile($this->module_path.'tpl', 'comment_module_config'); - $obj .= $tpl; - - return new Object(); - } - } -?> +module_srl; + if(!$current_module_srl) return new Object(); + } + + // 댓글 설정을 구함 + $oCommentModel = &getModel('comment'); + $comment_config = $oCommentModel->getCommentConfig($current_module_srl); + Context::set('comment_config', $comment_config); + + // 그룹 목록을 구함 + $oMemberModel = &getModel('member'); + $group_list = $oMemberModel->getGroups(); + Context::set('group_list', $group_list); + + // 템플릿 파일 지정 + $oTemplate = &TemplateHandler::getInstance(); + $tpl = $oTemplate->compile($this->module_path.'tpl', 'comment_module_config'); + $obj .= $tpl; + + return new Object(); + } + } +?> diff --git a/modules/comment/conf/info.xml b/modules/comment/conf/info.xml index 39d9b01b3..624c279fc 100644 --- a/modules/comment/conf/info.xml +++ b/modules/comment/conf/info.xml @@ -1,36 +1,36 @@ - - - 댓글 - コメント - 评论管理 - Comment - Bình luận - Commentarios - Комментарии - 評論 - Yorum - 게시판이나 블로그등의 댓글을 관리하는 모듈입니다. - 掲示板やブログなどのコメントを管理するモジュールです。 - 管理版面或博客评论的模块。 - Module for managing board/blog's comments - Module quản lý bình luận của bài viết và sổ lưu niệm - Es el módulo para manejar commentarios en blog o boletínes. - Модуль для управления комментариями форума/блога. - 管理討論板或部落格評論的模組。 - Pano ve blog yorumlarını yönetme modülü - 0.1 - 2007-02-28 - content - - - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - - + + + 댓글 + コメント + 评论管理 + Comment + Bình luận + Commentarios + Комментарии + 評論 + Yorum + 게시판이나 블로그등의 댓글을 관리하는 모듈입니다. + 掲示板やブログなどのコメントを管理するモジュールです。 + 管理版面或博客评论的模块。 + Module for managing board/blog's comments + Module quản lý bình luận của bài viết và sổ lưu niệm + Es el módulo para manejar commentarios en blog o boletínes. + Модуль для управления комментариями форума/блога. + 管理討論板或部落格評論的模組。 + Pano ve blog yorumlarını yönetme modülü + 0.1 + 2007-02-28 + content + + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + diff --git a/modules/comment/lang/en.lang.php b/modules/comment/lang/en.lang.php index c201816e2..f86fc1d85 100644 --- a/modules/comment/lang/en.lang.php +++ b/modules/comment/lang/en.lang.php @@ -1,33 +1,33 @@ -cmd_comment_do = 'I want to'; - - $lang->comment_list = 'Comments List'; - $lang->cmd_delete_checked_comment = 'Delete selected item'; - - $lang->comment_count = 'Number of Comments'; - $lang->about_comment_count = 'Display the comments as much as user inputs the number and it will be moved to the List if the comments are over its number.'; - - $lang->msg_cart_is_null = 'Please select an article to delete'; - $lang->msg_checked_comment_is_deleted = '%d comment(s) is(are) successfully deleted.'; - - $lang->search_target_list = array( - 'content' => 'Content', - 'user_id' => 'ID', - 'user_name' => 'Name', - 'nick_name' => 'Nickname', - 'member_srl' => 'Member Serial', - 'email_address' => 'Email', - 'homepage' => 'Homepage', - 'regdate' => 'Date', - 'last_update' => 'Last update', - 'ipaddress' => 'IP Address', - ); - - $lang->no_text_comment = 'No text in this comment.'; -?> +cmd_comment_do = 'I want to'; + + $lang->comment_list = 'Comments List'; + $lang->cmd_delete_checked_comment = 'Delete selected item'; + + $lang->comment_count = 'Number of Comments'; + $lang->about_comment_count = 'Display the comments as much as user inputs the number and it will be moved to the List if the comments are over its number.'; + + $lang->msg_cart_is_null = 'Please select an article to delete'; + $lang->msg_checked_comment_is_deleted = '%d comment(s) is(are) successfully deleted.'; + + $lang->search_target_list = array( + 'content' => 'Content', + 'user_id' => 'ID', + 'user_name' => 'Name', + 'nick_name' => 'Nickname', + 'member_srl' => 'Member Serial', + 'email_address' => 'Email', + 'homepage' => 'Homepage', + 'regdate' => 'Date', + 'last_update' => 'Last update', + 'ipaddress' => 'IP Address', + ); + + $lang->no_text_comment = 'No text in this comment.'; +?> diff --git a/modules/comment/lang/es.lang.php b/modules/comment/lang/es.lang.php index 4240bb704..539ec1be8 100644 --- a/modules/comment/lang/es.lang.php +++ b/modules/comment/lang/es.lang.php @@ -1,33 +1,33 @@ -cmd_comment_do = 'Usted ...'; - - $lang->comment_list = 'Comentarios Lista'; - $lang->cmd_delete_checked_comment = 'Eliminar lo seleccionado' ; - - $lang->comment_count = '댓글 수'; - $lang->about_comment_count = '댓글을 정해진 수 만큼만 표시하고 그 이상일 경우 목록으로 이동할 수 있게 합니다.'; - - $lang->msg_cart_is_null = 'Selecciona el commentario que desea eliminar'; - $lang->msg_checked_comment_is_deleted = '%d comentario eliminado correctamente.'; - - $lang->search_target_list = array( - 'content' => 'Contenido', - 'user_id' => 'ID', - 'user_name' => 'Nombre', - 'nick_name' => 'Apodo', - 'member_srl' => 'Member Serial', - 'email_address' => 'Correo Electrónico', - 'homepage' => 'Página web', - 'regdate' => 'Fecha del registro', - 'last_update' => 'Ultima actualización', - 'ipaddress' => 'Dirección IP', - ); - - $lang->no_text_comment = 'No text in this comment.'; -?> +cmd_comment_do = 'Usted ...'; + + $lang->comment_list = 'Comentarios Lista'; + $lang->cmd_delete_checked_comment = 'Eliminar lo seleccionado' ; + + $lang->comment_count = '댓글 수'; + $lang->about_comment_count = '댓글을 정해진 수 만큼만 표시하고 그 이상일 경우 목록으로 이동할 수 있게 합니다.'; + + $lang->msg_cart_is_null = 'Selecciona el commentario que desea eliminar'; + $lang->msg_checked_comment_is_deleted = '%d comentario eliminado correctamente.'; + + $lang->search_target_list = array( + 'content' => 'Contenido', + 'user_id' => 'ID', + 'user_name' => 'Nombre', + 'nick_name' => 'Apodo', + 'member_srl' => 'Member Serial', + 'email_address' => 'Correo Electrónico', + 'homepage' => 'Página web', + 'regdate' => 'Fecha del registro', + 'last_update' => 'Ultima actualización', + 'ipaddress' => 'Dirección IP', + ); + + $lang->no_text_comment = 'No text in this comment.'; +?> diff --git a/modules/comment/lang/fr.lang.php b/modules/comment/lang/fr.lang.php index 39960e0be..b6b5a88be 100644 --- a/modules/comment/lang/fr.lang.php +++ b/modules/comment/lang/fr.lang.php @@ -1,34 +1,34 @@ - - * @brief Paquet du langage en français pour le module de Commentaire - **/ - - $lang->cmd_comment_do = 'Vous voudriez...'; - - $lang->comment_list = 'Liste des Commentaires'; - $lang->cmd_toggle_checked_comment = 'Renverser les choisis'; - $lang->cmd_delete_checked_comment = 'Supprimer les choisis'; - - $lang->comment_count = 'Limite de Commentaires'; - $lang->about_comment_count = 'Quand il y a plus de commentaires, ils seront bougés sur le liste.'; - - $lang->msg_cart_is_null = 'Choisissez un article à supprimer, S.V.P.'; - $lang->msg_checked_comment_is_deleted = '%d commentaire(s) est(sont) supprimé(s) avec succés.'; - - $lang->search_target_list = array( - 'content' => 'Contenu', - 'user_id' => 'Compte', - 'user_name' => 'Nom', - 'nick_name' => 'Surnom', - 'member_srl' => 'Numéro de Série du Membre', - 'email_address' => 'Mél', - 'homepage' => 'Page d\'Accueil', - 'regdate' => 'Jour', - 'last_update' => 'Mise à Jour', - 'ipaddress' => 'Adresse IP', - ); - - $lang->no_text_comment = 'No text in this comment.'; -?> + + * @brief Paquet du langage en français pour le module de Commentaire + **/ + + $lang->cmd_comment_do = 'Vous voudriez...'; + + $lang->comment_list = 'Liste des Commentaires'; + $lang->cmd_toggle_checked_comment = 'Renverser les choisis'; + $lang->cmd_delete_checked_comment = 'Supprimer les choisis'; + + $lang->comment_count = 'Limite de Commentaires'; + $lang->about_comment_count = 'Quand il y a plus de commentaires, ils seront bougés sur le liste.'; + + $lang->msg_cart_is_null = 'Choisissez un article à supprimer, S.V.P.'; + $lang->msg_checked_comment_is_deleted = '%d commentaire(s) est(sont) supprimé(s) avec succés.'; + + $lang->search_target_list = array( + 'content' => 'Contenu', + 'user_id' => 'Compte', + 'user_name' => 'Nom', + 'nick_name' => 'Surnom', + 'member_srl' => 'Numéro de Série du Membre', + 'email_address' => 'Mél', + 'homepage' => 'Page d\'Accueil', + 'regdate' => 'Jour', + 'last_update' => 'Mise à Jour', + 'ipaddress' => 'Adresse IP', + ); + + $lang->no_text_comment = 'No text in this comment.'; +?> diff --git a/modules/comment/lang/jp.lang.php b/modules/comment/lang/jp.lang.php index 05c55c038..925f6ab95 100644 --- a/modules/comment/lang/jp.lang.php +++ b/modules/comment/lang/jp.lang.php @@ -1,34 +1,34 @@ -cmd_comment_do = 'このコメントを…'; - - $lang->comment_list = 'コメントリスト'; - $lang->cmd_toggle_checked_comment = '選択項目の反転'; - $lang->cmd_delete_checked_comment = '選択項目削除'; - - $lang->comment_count = 'コメント数'; - $lang->about_comment_count = 'コメントを指定した数だけ表示し、それ以上はリスト化します。'; - - $lang->msg_cart_is_null = '削除するコメントを選択して下さい。'; - $lang->msg_checked_comment_is_deleted = '%d個のコメントを削除しました。'; - - $lang->search_target_list = array( - 'content' => '内容', - 'user_id' => 'ユーザID', - 'user_name' => '名前', - 'nick_name' => 'ニックネーム', - 'member_srl' => '会員番号', - 'email_address' => 'メールアドレス', - 'homepage' => 'ホームページURL', - 'regdate' => '登録日', - 'last_update' => '最終更新日 ', - 'ipaddress' => 'IPアドレス', - ); - - $lang->no_text_comment = 'No text in this comment.'; -?> +cmd_comment_do = 'このコメントを…'; + + $lang->comment_list = 'コメントリスト'; + $lang->cmd_toggle_checked_comment = '選択項目の反転'; + $lang->cmd_delete_checked_comment = '選択項目削除'; + + $lang->comment_count = 'コメント数'; + $lang->about_comment_count = 'コメントを指定した数だけ表示し、それ以上はリスト化します。'; + + $lang->msg_cart_is_null = '削除するコメントを選択して下さい。'; + $lang->msg_checked_comment_is_deleted = '%d個のコメントを削除しました。'; + + $lang->search_target_list = array( + 'content' => '内容', + 'user_id' => 'ユーザID', + 'user_name' => '名前', + 'nick_name' => 'ニックネーム', + 'member_srl' => '会員番号', + 'email_address' => 'メールアドレス', + 'homepage' => 'ホームページURL', + 'regdate' => '登録日', + 'last_update' => '最終更新日 ', + 'ipaddress' => 'IPアドレス', + ); + + $lang->no_text_comment = 'No text in this comment.'; +?> diff --git a/modules/comment/lang/ko.lang.php b/modules/comment/lang/ko.lang.php index 1c29e83c9..19d9240cf 100644 --- a/modules/comment/lang/ko.lang.php +++ b/modules/comment/lang/ko.lang.php @@ -1,34 +1,34 @@ -cmd_comment_do = '이 댓글을...'; - - $lang->comment_list = '댓글 목록'; - $lang->cmd_toggle_checked_comment = '선택항목 반전'; - $lang->cmd_delete_checked_comment = '선택항목 삭제'; - - $lang->comment_count = '댓글 수'; - $lang->about_comment_count = '댓글을 정해진 수 만큼만 표시하고 그 이상일 경우 목록으로 이동할 수 있게 합니다.'; - - $lang->msg_cart_is_null = '삭제할 글을 선택해주세요.'; - $lang->msg_checked_comment_is_deleted = '%d개의 댓글이 삭제되었습니다.'; - - $lang->search_target_list = array( - 'content' => '내용', - 'user_id' => '아이디', - 'user_name' => '이름', - 'nick_name' => '닉네임', - 'member_srl' => '회원 번호', - 'email_address' => '이메일 주소', - 'homepage' => '홈페이지', - 'regdate' => '등록일', - 'last_update' => '최근수정일 ', - 'ipaddress' => 'IP 주소', - ); - - $lang->no_text_comment = '텍스트가 없는 댓글입니다.'; -?> +cmd_comment_do = '이 댓글을...'; + + $lang->comment_list = '댓글 목록'; + $lang->cmd_toggle_checked_comment = '선택항목 반전'; + $lang->cmd_delete_checked_comment = '선택항목 삭제'; + + $lang->comment_count = '댓글 수'; + $lang->about_comment_count = '댓글을 정해진 수 만큼만 표시하고 그 이상일 경우 목록으로 이동할 수 있게 합니다.'; + + $lang->msg_cart_is_null = '삭제할 글을 선택해주세요.'; + $lang->msg_checked_comment_is_deleted = '%d개의 댓글이 삭제되었습니다.'; + + $lang->search_target_list = array( + 'content' => '내용', + 'user_id' => '아이디', + 'user_name' => '이름', + 'nick_name' => '닉네임', + 'member_srl' => '회원 번호', + 'email_address' => '이메일 주소', + 'homepage' => '홈페이지', + 'regdate' => '등록일', + 'last_update' => '최근수정일 ', + 'ipaddress' => 'IP 주소', + ); + + $lang->no_text_comment = '텍스트가 없는 댓글입니다.'; +?> diff --git a/modules/comment/lang/ru.lang.php b/modules/comment/lang/ru.lang.php index 331c41b70..cba37eb9c 100644 --- a/modules/comment/lang/ru.lang.php +++ b/modules/comment/lang/ru.lang.php @@ -1,34 +1,34 @@ -cmd_comment_do = 'Эту запись...'; - - $lang->comment_list = 'Список записей'; - $lang->cmd_toggle_checked_comment = 'Изменить выбранное'; - $lang->cmd_delete_checked_comment = 'Удалить выбранное'; - - $lang->comment_count = 'Количество ответов'; - $lang->about_comment_count = 'Отображается указанное количество ответов, после превышения этого количества производится переход к списку.'; - - $lang->msg_cart_is_null = 'Пожалуйста, выберите записи для удаления.'; - $lang->msg_checked_comment_is_deleted = '%d записьуспешно удалена'; - - $lang->search_target_list = array( - 'content' => 'Содержание', - 'user_id' => 'ID', - 'user_name' => 'Имя', - 'nick_name' => 'Ник', - 'member_srl' => 'Номер пользователя', - 'email_address' => 'Email адрес', - 'homepage' => 'Домашняя страница', - 'regdate' => 'Дата регистрации', - 'last_update' => 'Дата последнего обновления', - 'ipaddress' => 'IP-адрес', - ); - - $lang->no_text_comment = 'No text in this comment.'; -?> +cmd_comment_do = 'Эту запись...'; + + $lang->comment_list = 'Список записей'; + $lang->cmd_toggle_checked_comment = 'Изменить выбранное'; + $lang->cmd_delete_checked_comment = 'Удалить выбранное'; + + $lang->comment_count = 'Количество ответов'; + $lang->about_comment_count = 'Отображается указанное количество ответов, после превышения этого количества производится переход к списку.'; + + $lang->msg_cart_is_null = 'Пожалуйста, выберите записи для удаления.'; + $lang->msg_checked_comment_is_deleted = '%d записьуспешно удалена'; + + $lang->search_target_list = array( + 'content' => 'Содержание', + 'user_id' => 'ID', + 'user_name' => 'Имя', + 'nick_name' => 'Ник', + 'member_srl' => 'Номер пользователя', + 'email_address' => 'Email адрес', + 'homepage' => 'Домашняя страница', + 'regdate' => 'Дата регистрации', + 'last_update' => 'Дата последнего обновления', + 'ipaddress' => 'IP-адрес', + ); + + $lang->no_text_comment = 'No text in this comment.'; +?> diff --git a/modules/comment/lang/tr.lang.php b/modules/comment/lang/tr.lang.php index 56042e612..0db6a0b8e 100644 --- a/modules/comment/lang/tr.lang.php +++ b/modules/comment/lang/tr.lang.php @@ -1,33 +1,33 @@ -cmd_comment_do = 'Şunu yap'; - - $lang->comment_list = 'Yorum Listesi'; - $lang->cmd_delete_checked_comment = 'Seçili parçayı sil'; - - $lang->comment_count = 'Yorum Sayısı'; - $lang->about_comment_count = 'Yorumları, kullanıcının girdiği rakam kadar gösterin. Eğer yorum sayısı belirlenen sayıyı aşarsa, yorum Liste\'ye taşınır.'; - - $lang->msg_cart_is_null = 'Lütfen silinecek makaleyi seçiniz'; - $lang->msg_checked_comment_is_deleted = '%d yorum başarıyla silindi.'; - - $lang->search_target_list = array( - 'content' => 'İçerik', - 'user_id' => 'ID', - 'user_name' => 'İsim', - 'nick_name' => 'Takma Ad', - 'member_srl' => 'Üye Dizisi', - 'email_address' => 'E-posta', - 'homepage' => 'Anasayfa', - 'regdate' => 'Tarih', - 'last_update' => 'Son Güncelleştirme', - 'ipaddress' => 'IP Adresi', - ); - - $lang->no_text_comment = 'Bu yorumda herhangi bir metin yok.'; -?> +cmd_comment_do = 'Şunu yap'; + + $lang->comment_list = 'Yorum Listesi'; + $lang->cmd_delete_checked_comment = 'Seçili parçayı sil'; + + $lang->comment_count = 'Yorum Sayısı'; + $lang->about_comment_count = 'Yorumları, kullanıcının girdiği rakam kadar gösterin. Eğer yorum sayısı belirlenen sayıyı aşarsa, yorum Liste\'ye taşınır.'; + + $lang->msg_cart_is_null = 'Lütfen silinecek makaleyi seçiniz'; + $lang->msg_checked_comment_is_deleted = '%d yorum başarıyla silindi.'; + + $lang->search_target_list = array( + 'content' => 'İçerik', + 'user_id' => 'ID', + 'user_name' => 'İsim', + 'nick_name' => 'Takma Ad', + 'member_srl' => 'Üye Dizisi', + 'email_address' => 'E-posta', + 'homepage' => 'Anasayfa', + 'regdate' => 'Tarih', + 'last_update' => 'Son Güncelleştirme', + 'ipaddress' => 'IP Adresi', + ); + + $lang->no_text_comment = 'Bu yorumda herhangi bir metin yok.'; +?> diff --git a/modules/comment/lang/vi.lang.php b/modules/comment/lang/vi.lang.php index a8c2629b5..8e5055db0 100644 --- a/modules/comment/lang/vi.lang.php +++ b/modules/comment/lang/vi.lang.php @@ -1,35 +1,35 @@ -cmd_comment_do = 'Bình chọn / Phê bình'; - - $lang->comment_list = 'Danh sách bình luận'; - $lang->cmd_delete_checked_comment = 'Xóa những bình luận đã chọn'; - - $lang->comment_count = 'Số bình luận'; - $lang->about_comment_count = 'Hiển thị số bình luận được gửi, và nó sẽ tạo một danh sách nếu có nhiều bình luận.'; - - $lang->msg_cart_is_null = 'Xin hãy chọn một bài viết để xóa.'; - $lang->msg_checked_comment_is_deleted = '%d bình luận đã được xóa.'; - - $lang->search_target_list = array( - 'content' => 'Nội dung', - 'user_id' => 'ID người gửi', - 'user_name' => 'Tên', - 'nick_name' => 'Nickname', - 'member_srl' => 'Mã số người gửi', - 'email_address' => 'Email', - 'homepage' => 'Trang chủ', - 'regdate' => 'Ngày', - 'last_update' => 'Cập nhật lần cuối', - 'ipaddress' => 'IP', - ); - - $lang->no_text_comment = 'No text in this comment.'; -?> +cmd_comment_do = 'Bình chọn / Phê bình'; + + $lang->comment_list = 'Danh sách bình luận'; + $lang->cmd_delete_checked_comment = 'Xóa những bình luận đã chọn'; + + $lang->comment_count = 'Số bình luận'; + $lang->about_comment_count = 'Hiển thị số bình luận được gửi, và nó sẽ tạo một danh sách nếu có nhiều bình luận.'; + + $lang->msg_cart_is_null = 'Xin hãy chọn một bài viết để xóa.'; + $lang->msg_checked_comment_is_deleted = '%d bình luận đã được xóa.'; + + $lang->search_target_list = array( + 'content' => 'Nội dung', + 'user_id' => 'ID người gửi', + 'user_name' => 'Tên', + 'nick_name' => 'Nickname', + 'member_srl' => 'Mã số người gửi', + 'email_address' => 'Email', + 'homepage' => 'Trang chủ', + 'regdate' => 'Ngày', + 'last_update' => 'Cập nhật lần cuối', + 'ipaddress' => 'IP', + ); + + $lang->no_text_comment = 'No text in this comment.'; +?> diff --git a/modules/comment/lang/zh-CN.lang.php b/modules/comment/lang/zh-CN.lang.php index b2cdf02ac..ae00078ad 100644 --- a/modules/comment/lang/zh-CN.lang.php +++ b/modules/comment/lang/zh-CN.lang.php @@ -1,34 +1,34 @@ -cmd_comment_do = '将把此评论..'; - - $lang->comment_list = '评论列表'; - $lang->cmd_toggle_checked_comment = '反选'; - $lang->cmd_delete_checked_comment = '删除所选'; - - $lang->comment_count = '每页评论数'; - $lang->about_comment_count = '可以指定要显示的每页评论数。'; - - $lang->msg_cart_is_null = '请选择要删除的评论。'; - $lang->msg_checked_comment_is_deleted = '已删除%d个评论。'; - - $lang->search_target_list = array( - 'content' => '内容', - 'user_id' => 'I D', - 'user_name' => '姓名', - 'nick_name' => '昵称', - 'member_srl' => '会员编号', - 'email_address' => '电子信箱', - 'homepage' => '主页', - 'regdate' => '日期', - 'last_update' => '最后更新 ', - 'ipaddress' => 'IP 地址', - ); - - $lang->no_text_comment = 'No text in this comment.'; -?> +cmd_comment_do = '将把此评论..'; + + $lang->comment_list = '评论列表'; + $lang->cmd_toggle_checked_comment = '反选'; + $lang->cmd_delete_checked_comment = '删除所选'; + + $lang->comment_count = '每页评论数'; + $lang->about_comment_count = '可以指定要显示的每页评论数。'; + + $lang->msg_cart_is_null = '请选择要删除的评论。'; + $lang->msg_checked_comment_is_deleted = '已删除%d个评论。'; + + $lang->search_target_list = array( + 'content' => '内容', + 'user_id' => 'I D', + 'user_name' => '姓名', + 'nick_name' => '昵称', + 'member_srl' => '会员编号', + 'email_address' => '电子信箱', + 'homepage' => '主页', + 'regdate' => '日期', + 'last_update' => '最后更新 ', + 'ipaddress' => 'IP 地址', + ); + + $lang->no_text_comment = 'No text in this comment.'; +?> diff --git a/modules/comment/lang/zh-TW.lang.php b/modules/comment/lang/zh-TW.lang.php index 0048e4675..213b23fb6 100644 --- a/modules/comment/lang/zh-TW.lang.php +++ b/modules/comment/lang/zh-TW.lang.php @@ -1,34 +1,34 @@ -cmd_comment_do = '將此評論..'; - - $lang->comment_list = '評論列表'; - $lang->cmd_toggle_checked_comment = '反選'; - $lang->cmd_delete_checked_comment = '刪除所選'; - - $lang->comment_count = '每頁評論數'; - $lang->about_comment_count = '可以指定要顯示的每頁評論數。'; - - $lang->msg_cart_is_null = '請選擇要刪除的評論。'; - $lang->msg_checked_comment_is_deleted = '已刪除%d個評論。'; - - $lang->search_target_list = array( - 'content' => '內容', - 'user_id' => '帳號', - 'user_name' => '姓名', - 'nick_name' => '暱稱', - 'member_srl' => '會員編號', - 'email_address' => '電子信箱', - 'homepage' => '主頁', - 'regdate' => '日期', - 'last_update' => '最後更新', - 'ipaddress' => 'IP位址', - ); - - $lang->no_text_comment = 'No text in this comment.'; -?> +cmd_comment_do = '將此評論..'; + + $lang->comment_list = '評論列表'; + $lang->cmd_toggle_checked_comment = '反選'; + $lang->cmd_delete_checked_comment = '刪除所選'; + + $lang->comment_count = '每頁評論數'; + $lang->about_comment_count = '可以指定要顯示的每頁評論數。'; + + $lang->msg_cart_is_null = '請選擇要刪除的評論。'; + $lang->msg_checked_comment_is_deleted = '已刪除%d個評論。'; + + $lang->search_target_list = array( + 'content' => '內容', + 'user_id' => '帳號', + 'user_name' => '姓名', + 'nick_name' => '暱稱', + 'member_srl' => '會員編號', + 'email_address' => '電子信箱', + 'homepage' => '主頁', + 'regdate' => '日期', + 'last_update' => '最後更新', + 'ipaddress' => 'IP位址', + ); + + $lang->no_text_comment = 'No text in this comment.'; +?> diff --git a/modules/comment/tpl/comment_list.html b/modules/comment/tpl/comment_list.html index 5a27b14f6..bba19cf53 100644 --- a/modules/comment/tpl/comment_list.html +++ b/modules/comment/tpl/comment_list.html @@ -1,75 +1,75 @@ - - - - -
    -
    - - - -
    - - - - {$lang->cmd_cancel} -
    -
    -
    - -
    - - - - - - - - - - - - - - - - - - - - - {@ $comment = cut_str(trim(htmlspecialchars(strip_tags($val->content))), 200, '...')} - - - - - - - - - - -
    Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
    {$lang->no}
    {$lang->comment}
    {$lang->nick_name}
    {$lang->date}
    {$lang->ipaddress}
    {$no}{$comment}{$lang->no_text_comment}{htmlspecialchars($val->nick_name)}{(zdate($val->regdate,"Y-m-d\nH:i:s"))}{$val->ipaddress}
    - -
    - - - - + + + + +
    +
    + + + +
    + + + + {$lang->cmd_cancel} +
    +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + {@ $comment = cut_str(trim(htmlspecialchars(strip_tags($val->content))), 200, '...')} + + + + + + + + + + +
    Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
    {$lang->no}
    {$lang->comment}
    {$lang->nick_name}
    {$lang->date}
    {$lang->ipaddress}
    {$no}{$comment}{$lang->no_text_comment}{htmlspecialchars($val->nick_name)}{(zdate($val->regdate,"Y-m-d\nH:i:s"))}{$val->ipaddress}
    + +
    + + + + diff --git a/modules/comment/tpl/declared_list.html b/modules/comment/tpl/declared_list.html index aaa6990a5..9dbe1b7be 100644 --- a/modules/comment/tpl/declared_list.html +++ b/modules/comment/tpl/declared_list.html @@ -1,55 +1,55 @@ - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
    {$lang->comment}
    {$lang->user_name}
    {$lang->date}
    {$lang->cmd_declare}
    {$lang->ipaddress}
    {$no} {$oComment->getSummary(100)}{$oComment->getNickName()}{$oComment->getRegdate("Y-m-d")}{$oComment->get('declared_count')}{$oComment->get('ipaddress')}
    - {$lang->cmd_cancel_declare} - {$lang->cmd_select_all} - {$lang->cmd_reverse_all} - -
    -
    - - -
    - + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
    {$lang->comment}
    {$lang->user_name}
    {$lang->date}
    {$lang->cmd_declare}
    {$lang->ipaddress}
    {$no} {$oComment->getSummary(100)}{$oComment->getNickName()}{$oComment->getRegdate("Y-m-d")}{$oComment->get('declared_count')}{$oComment->get('ipaddress')}
    + {$lang->cmd_cancel_declare} + {$lang->cmd_select_all} + {$lang->cmd_reverse_all} + +
    +
    + + +
    + diff --git a/modules/communication/communication.admin.controller.php b/modules/communication/communication.admin.controller.php index 9dfdf0c11..45b514919 100644 --- a/modules/communication/communication.admin.controller.php +++ b/modules/communication/communication.admin.controller.php @@ -1,35 +1,35 @@ -skin) $args->skin = "default"; - if(!$args->colorset) $args->colorset = "white"; - if(!$args->editor_skin) $args->editor_skin = "default"; - - // module Controller 객체 생성하여 입력 - $oModuleController = &getController('module'); - $output = $oModuleController->insertModuleConfig('communication',$args); - - return $output; - } - - } -?> +skin) $args->skin = "default"; + if(!$args->colorset) $args->colorset = "white"; + if(!$args->editor_skin) $args->editor_skin = "default"; + + // module Controller 객체 생성하여 입력 + $oModuleController = &getController('module'); + $output = $oModuleController->insertModuleConfig('communication',$args); + + return $output; + } + + } +?> diff --git a/modules/communication/communication.admin.model.php b/modules/communication/communication.admin.model.php index 6fbc91ecf..594bc75e2 100644 --- a/modules/communication/communication.admin.model.php +++ b/modules/communication/communication.admin.model.php @@ -1,40 +1,40 @@ -loadSkinInfo($this->module_path, $skin); - Context::set('skin_info', $skin_info); - - $oModuleModel = &getModel('module'); - $communication_config = $oModuleModel->getModuleConfig('communication'); - if(!$communication_config->colorset) $communication_config->colorset = "white"; - Context::set('communication_config', $communication_config); - - $oTemplate = &TemplateHandler::getInstance(); - $tpl = $oTemplate->compile($this->module_path.'tpl', 'colorset_list'); - } - - $this->add('tpl', $tpl); - } - - } -?> +loadSkinInfo($this->module_path, $skin); + Context::set('skin_info', $skin_info); + + $oModuleModel = &getModel('module'); + $communication_config = $oModuleModel->getModuleConfig('communication'); + if(!$communication_config->colorset) $communication_config->colorset = "white"; + Context::set('communication_config', $communication_config); + + $oTemplate = &TemplateHandler::getInstance(); + $tpl = $oTemplate->compile($this->module_path.'tpl', 'colorset_list'); + } + + $this->add('tpl', $tpl); + } + + } +?> diff --git a/modules/communication/communication.admin.view.php b/modules/communication/communication.admin.view.php index 5b893a025..9dbc01a65 100644 --- a/modules/communication/communication.admin.view.php +++ b/modules/communication/communication.admin.view.php @@ -1,40 +1,40 @@ -getConfig() ); - - // 에디터 스킨 목록을 구함 - Context::set('editor_skin_list', $oEditorModel->getEditorSkinList() ); - - // 커뮤니케이션 스킨 목록을 구함 - Context::set('communication_skin_list', $oModuleModel->getSkins($this->module_path) ); - - // template 지정 - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('index'); - } - - } -?> +getConfig() ); + + // 에디터 스킨 목록을 구함 + Context::set('editor_skin_list', $oEditorModel->getEditorSkinList() ); + + // 커뮤니케이션 스킨 목록을 구함 + Context::set('communication_skin_list', $oModuleModel->getSkins($this->module_path) ); + + // template 지정 + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('index'); + } + + } +?> diff --git a/modules/communication/communication.class.php b/modules/communication/communication.class.php index caec94eb5..57c0fca58 100644 --- a/modules/communication/communication.class.php +++ b/modules/communication/communication.class.php @@ -1,42 +1,42 @@ - + diff --git a/modules/communication/communication.controller.php b/modules/communication/communication.controller.php index 15ebfa1af..1360d6cec 100644 --- a/modules/communication/communication.controller.php +++ b/modules/communication/communication.controller.php @@ -1,418 +1,418 @@ -allow_message = Context::get('allow_message'); - if(!in_array($args->allow_message, array('Y','N','F'))) $args->allow_message = 'Y'; - - $logged_info = Context::get('logged_info'); - $args->member_srl = $logged_info->member_srl; - - $output = executeQuery('communication.updateAllowMessage', $args); - - return $output; - } - - /** - * @brief 쪽지 발송 - **/ - function procCommunicationSendMessage() { - // 로그인 정보 체크 - if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); - $logged_info = Context::get('logged_info'); - - // 변수 검사 - $receiver_srl = Context::get('receiver_srl'); - if(!$receiver_srl) return new Object(-1, 'msg_not_exists_member'); - - $title = trim(Context::get('title')); - if(!$title) return new Object(-1, 'msg_title_is_null'); - - $content = trim(Context::get('content')); - if(!$content) return new Object(-1, 'msg_content_is_null'); - - $send_mail = Context::get('send_mail'); - if($send_mail != 'Y') $send_mail = 'N'; - - // 받을 회원이 있는지에 대한 검사 - $oMemberModel = &getModel('member'); - $oCommunicationModel = &getModel('communication'); - $receiver_member_info = $oMemberModel->getMemberInfoByMemberSrl($receiver_srl); - if($receiver_member_info->member_srl != $receiver_srl) return new Object(-1, 'msg_not_exists_member'); - - // 받을 회원의 쪽지 수신여부 검사 (최고관리자이면 패스) - if($logged_info->is_admin != 'Y') { - if($receiver_member_info->allow_message == 'F') { - if(!$oCommunicationModel->isFriend($receiver_member_info->member_srl)) return new object(-1, 'msg_allow_message_to_friend'); - } elseif($receiver_member_info->allow_messge == 'N') { - return new object(-1, 'msg_disallow_message'); - } - } - - // 쪽지 발송 - $output = $this->sendMessage($logged_info->member_srl, $receiver_srl, $title, $content); - - // 메일로도 발송 - if($output->toBool() && $send_mail == 'Y') { - $view_url = Context::getRequestUri(); - $content = sprintf("%s

    From : %s",$content, $view_url, $view_url); - $oMail = new Mail(); - $oMail->setTitle($title); - $oMail->setContent($content); - $oMail->setSender($logged_info->user_name, $logged_info->email_address); - $oMail->setReceiptor($receiver_member_info->user_name, $receiver_member_info->email_address); - $oMail->send(); - } - - return $output; - } - - function sendMessage($sender_srl, $receiver_srl, $title, $content, $sender_log = true) { - $content = removeHackTag($content); - $title = htmlspecialchars($title); - - // 보내는 사용자의 쪽지함에 넣을 쪽지 - $sender_args->sender_srl = $sender_srl; - $sender_args->receiver_srl = $receiver_srl; - $sender_args->message_type = 'S'; - $sender_args->title = $title; - $sender_args->content = $content; - $sender_args->readed = 'N'; - $sender_args->regdate = date("YmdHis"); - $sender_args->related_srl = getNextSequence(); - $sender_args->message_srl = getNextSequence(); - $sender_args->list_order = getNextSequence()*-1; - - // 받는 회원의 쪽지함에 넣을 쪽지 - $receiver_args->message_srl = $sender_args->related_srl; - $receiver_args->related_srl = 0; - $receiver_args->list_order = $sender_args->related_srl*-1; - $receiver_args->sender_srl = $sender_srl; - if(!$receiver_args->sender_srl) $receiver_args->sender_srl = $receiver_srl; - $receiver_args->receiver_srl = $receiver_srl; - $receiver_args->message_type = 'R'; - $receiver_args->title = $title; - $receiver_args->content = $content; - $receiver_args->readed = 'N'; - $receiver_args->regdate = date("YmdHis"); - - $oDB = &DB::getInstance(); - $oDB->begin(); - - // 발송하는 회원의 쪽지함에 넣을 쪽지 - if($sender_srl && $sender_log) { - $output = executeQuery('communication.sendMessage', $sender_args); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - } - - // 받을 회원의 쪽지함에 넣을 쪽지 - $output = executeQuery('communication.sendMessage', $receiver_args); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - // 받는 회원의 쪽지 발송 플래그 생성 (파일로 생성) - $flag_path = './files/member_extra_info/new_message_flags/'.getNumberingPath($receiver_srl); - FileHandler::makeDir($flag_path); - $flag_file = sprintf('%s%s', $flag_path, $receiver_srl); - $flag_count = FileHandler::readFile($flag_file); - FileHandler::writeFile($flag_file, ++$flag_count); - - $oDB->commit(); - - return new Object(0,'success_sended'); - } - - /** - * @brief 특정 쪽지를 보관함으로 보냄 - **/ - function procCommunicationStoreMessage() { - // 로그인 정보 체크 - if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); - $logged_info = Context::get('logged_info'); - - // 변수 체크 - $message_srl = Context::get('message_srl'); - if(!$message_srl) return new Object(-1,'msg_invalid_request'); - - // 쪽지를 가져옴 - $oCommunicationModel = &getModel('communication'); - $message = $oCommunicationModel->getSelectedMessage($message_srl); - if(!$message || $message->message_type != 'R') return new Object(-1,'msg_invalid_request'); - - $args->message_srl = $message_srl; - $args->receiver_srl = $logged_info->member_srl; - $output = executeQuery('communication.setMessageStored', $args); - if(!$output->toBool()) return $output; - - $this->setMessage('success_registed'); - } - - /** - * @brief 쪽지 삭제 - **/ - function procCommunicationDeleteMessage() { - // 로그인 정보 체크 - if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); - $logged_info = Context::get('logged_info'); - $member_srl = $logged_info->member_srl; - - // 변수 체크 - $message_srl = Context::get('message_srl'); - if(!$message_srl) return new Object(-1,'msg_invalid_request'); - - // 쪽지를 가져옴 - $oCommunicationModel = &getModel('communication'); - $message = $oCommunicationModel->getSelectedMessage($message_srl); - if(!$message) return new Object(-1,'msg_invalid_request'); - - // 발송인+type=S or 수신인+type=R 검사 - if($message->sender_srl == $member_srl && $message->message_type == 'S') { - if(!$message_srl) return new Object(-1, 'msg_invalid_request'); - } elseif($message->receiver_srl == $member_srl && $message->message_type == 'R') { - if(!$message_srl) return new Object(-1, 'msg_invalid_request'); - } - - // 삭제 - $args->message_srl = $message_srl; - $output = executeQuery('communication.deleteMessage', $args); - if(!$output->toBool()) return $output; - - $this->setMessage('success_deleted'); - } - - /** - * @brief 선택된 다수의 쪽지 삭제 - **/ - function procCommunicationDeleteMessages() { - // 로그인 정보 체크 - if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); - $logged_info = Context::get('logged_info'); - $member_srl = $logged_info->member_srl; - - // 변수 체크 - $message_srl_list = trim(Context::get('message_srl_list')); - if(!$message_srl_list) return new Object(-1, 'msg_cart_is_null'); - - $message_srl_list = explode('|@|', $message_srl_list); - if(!count($message_srl_list)) return new Object(-1, 'msg_cart_is_null'); - - $message_type = Context::get('message_type'); - if(!$message_type || !in_array($message_type, array('R','S','T'))) return new Object(-1, 'msg_invalid_request'); - - $message_count = count($message_srl_list); - $target = array(); - for($i=0;$i<$message_count;$i++) { - $message_srl = (int)trim($message_srl_list[$i]); - if(!$message_srl) continue; - $target[] = $message_srl; - } - if(!count($target)) return new Object(-1,'msg_cart_is_null'); - - // 삭제 - $args->message_srls = implode(',',$target); - $args->message_type = $message_type; - - if($message_type == 'S') $args->sender_srl = $member_srl; - else $args->receiver_srl = $member_srl; - - $output = executeQuery('communication.deleteMessages', $args); - if(!$output->toBool()) return $output; - - $this->setMessage('success_deleted'); - } - - /** - * @brief 친구 추가 - **/ - function procCommunicationAddFriend() { - // 로그인 정보 체크 - if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); - $logged_info = Context::get('logged_info'); - - $target_srl = (int)trim(Context::get('target_srl')); - if(!$target_srl) return new Object(-1,'msg_invalid_request'); - - // 변수 정리 - $args->friend_srl = getNextSequence(); - $args->list_order = $args->friend_srl * -1; - $args->friend_group_srl = Context::get('friend_group_srl'); - $args->member_srl = $logged_info->member_srl; - $args->target_srl = $target_srl; - $output = executeQuery('communication.addFriend', $args); - if(!$output->toBool()) return $output; - - $this->add('member_srl', $target_srl); - $this->setMessage('success_registed'); - } - - /** - * @brief 등록된 친구의 그룹 이동 - **/ - function procCommunicationMoveFriend() { - // 로그인 정보 체크 - if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); - $logged_info = Context::get('logged_info'); - - // 변수 체크 - $friend_srl_list = trim(Context::get('friend_srl_list')); - if(!$friend_srl_list) return new Object(-1, 'msg_cart_is_null'); - - $friend_srl_list = explode('|@|', $friend_srl_list); - if(!count($friend_srl_list)) return new Object(-1, 'msg_cart_is_null'); - - $friend_count = count($friend_srl_list); - $target = array(); - for($i=0;$i<$friend_count;$i++) { - $friend_srl = (int)trim($friend_srl_list[$i]); - if(!$friend_srl) continue; - $target[] = $friend_srl; - } - if(!count($target)) return new Object(-1,'msg_cart_is_null'); - - // 변수 정리 - $args->friend_srls = implode(',',$target); - $args->member_srl = $logged_info->member_srl; - $args->friend_group_srl = Context::get('target_friend_group_srl'); - - $output = executeQuery('communication.moveFriend', $args); - if(!$output->toBool()) return $output; - - $this->setMessage('success_moved'); - } - - /** - * @brief 친구 삭제 - **/ - function procCommunicationDeleteFriend() { - // 로그인 정보 체크 - if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); - $logged_info = Context::get('logged_info'); - $member_srl = $logged_info->member_srl; - - // 변수 체크 - $friend_srl_list = trim(Context::get('friend_srl_list')); - if(!$friend_srl_list) return new Object(-1, 'msg_cart_is_null'); - - $friend_srl_list = explode('|@|', $friend_srl_list); - if(!count($friend_srl_list)) return new Object(-1, 'msg_cart_is_null'); - - $friend_count = count($friend_srl_list); - $target = array(); - for($i=0;$i<$friend_count;$i++) { - $friend_srl = (int)trim($friend_srl_list[$i]); - if(!$friend_srl) continue; - $target[] = $friend_srl; - } - if(!count($target)) return new Object(-1,'msg_cart_is_null'); - - // 삭제 - $args->friend_srls = implode(',',$target); - $args->member_srl = $logged_info->member_srl; - $output = executeQuery('communication.deleteFriend', $args); - if(!$output->toBool()) return $output; - - $this->setMessage('success_deleted'); - } - - /** - * @brief 친구 그룹 추가 - **/ - function procCommunicationAddFriendGroup() { - // 로그인 정보 체크 - if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); - $logged_info = Context::get('logged_info'); - - // 변수 정리 - $args->friend_group_srl = trim(Context::get('friend_group_srl')); - $args->member_srl = $logged_info->member_srl; - $args->title = Context::get('title'); - $args->title = htmlspecialchars($args->title); - if(!$args->title) return new Object(-1, 'msg_invalid_request'); - - // friend_group_srl이 있으면 수정 - if($args->friend_group_srl) { - $output = executeQuery('communication.renameFriendGroup', $args); - $msg_code = 'success_updated'; - - // 아니면 입력 - } else { - $output = executeQuery('communication.addFriendGroup', $args); - $msg_code = 'success_registed'; - } - - if(!$output->toBool()) return $output; - - $this->setMessage($msg_code); - } - - /** - * @brief 친구 그룹 이름 변경 - **/ - function procCommunicationRenameFriendGroup() { - // 로그인 정보 체크 - if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); - $logged_info = Context::get('logged_info'); - - // 변수 정리 - $args->friend_group_srl= Context::get('friend_group_srl'); - $args->member_srl = $logged_info->member_srl; - $args->title = Context::get('title'); - $args->title = htmlspecialchars($args->title); - if(!$args->title) return new Object(-1, 'msg_invalid_request'); - - $output = executeQuery('communication.renameFriendGroup', $args); - if(!$output->toBool()) return $output; - - $this->setMessage('success_updated'); - } - - /** - * @brief 친구 그룹 삭제 - **/ - function procCommunicationDeleteFriendGroup() { - // 로그인 정보 체크 - if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); - $logged_info = Context::get('logged_info'); - - // 변수 정리 - $args->friend_group_srl = Context::get('friend_group_srl'); - $args->member_srl = $logged_info->member_srl; - $output = executeQuery('communication.deleteFriendGroup', $args); - if(!$output->toBool()) return $output; - - $this->setMessage('success_deleted'); - } - - /** - * @brief 특정 쪽지의 상태를 읽은 상태로 변경 - **/ - function setMessageReaded($message_srl) { - $args->message_srl = $message_srl; - $args->related_srl = $message_srl; - return executeQuery('communication.setMessageReaded', $args); - } - - } -?> +allow_message = Context::get('allow_message'); + if(!in_array($args->allow_message, array('Y','N','F'))) $args->allow_message = 'Y'; + + $logged_info = Context::get('logged_info'); + $args->member_srl = $logged_info->member_srl; + + $output = executeQuery('communication.updateAllowMessage', $args); + + return $output; + } + + /** + * @brief 쪽지 발송 + **/ + function procCommunicationSendMessage() { + // 로그인 정보 체크 + if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); + $logged_info = Context::get('logged_info'); + + // 변수 검사 + $receiver_srl = Context::get('receiver_srl'); + if(!$receiver_srl) return new Object(-1, 'msg_not_exists_member'); + + $title = trim(Context::get('title')); + if(!$title) return new Object(-1, 'msg_title_is_null'); + + $content = trim(Context::get('content')); + if(!$content) return new Object(-1, 'msg_content_is_null'); + + $send_mail = Context::get('send_mail'); + if($send_mail != 'Y') $send_mail = 'N'; + + // 받을 회원이 있는지에 대한 검사 + $oMemberModel = &getModel('member'); + $oCommunicationModel = &getModel('communication'); + $receiver_member_info = $oMemberModel->getMemberInfoByMemberSrl($receiver_srl); + if($receiver_member_info->member_srl != $receiver_srl) return new Object(-1, 'msg_not_exists_member'); + + // 받을 회원의 쪽지 수신여부 검사 (최고관리자이면 패스) + if($logged_info->is_admin != 'Y') { + if($receiver_member_info->allow_message == 'F') { + if(!$oCommunicationModel->isFriend($receiver_member_info->member_srl)) return new object(-1, 'msg_allow_message_to_friend'); + } elseif($receiver_member_info->allow_messge == 'N') { + return new object(-1, 'msg_disallow_message'); + } + } + + // 쪽지 발송 + $output = $this->sendMessage($logged_info->member_srl, $receiver_srl, $title, $content); + + // 메일로도 발송 + if($output->toBool() && $send_mail == 'Y') { + $view_url = Context::getRequestUri(); + $content = sprintf("%s

    From : %s",$content, $view_url, $view_url); + $oMail = new Mail(); + $oMail->setTitle($title); + $oMail->setContent($content); + $oMail->setSender($logged_info->user_name, $logged_info->email_address); + $oMail->setReceiptor($receiver_member_info->user_name, $receiver_member_info->email_address); + $oMail->send(); + } + + return $output; + } + + function sendMessage($sender_srl, $receiver_srl, $title, $content, $sender_log = true) { + $content = removeHackTag($content); + $title = htmlspecialchars($title); + + // 보내는 사용자의 쪽지함에 넣을 쪽지 + $sender_args->sender_srl = $sender_srl; + $sender_args->receiver_srl = $receiver_srl; + $sender_args->message_type = 'S'; + $sender_args->title = $title; + $sender_args->content = $content; + $sender_args->readed = 'N'; + $sender_args->regdate = date("YmdHis"); + $sender_args->related_srl = getNextSequence(); + $sender_args->message_srl = getNextSequence(); + $sender_args->list_order = getNextSequence()*-1; + + // 받는 회원의 쪽지함에 넣을 쪽지 + $receiver_args->message_srl = $sender_args->related_srl; + $receiver_args->related_srl = 0; + $receiver_args->list_order = $sender_args->related_srl*-1; + $receiver_args->sender_srl = $sender_srl; + if(!$receiver_args->sender_srl) $receiver_args->sender_srl = $receiver_srl; + $receiver_args->receiver_srl = $receiver_srl; + $receiver_args->message_type = 'R'; + $receiver_args->title = $title; + $receiver_args->content = $content; + $receiver_args->readed = 'N'; + $receiver_args->regdate = date("YmdHis"); + + $oDB = &DB::getInstance(); + $oDB->begin(); + + // 발송하는 회원의 쪽지함에 넣을 쪽지 + if($sender_srl && $sender_log) { + $output = executeQuery('communication.sendMessage', $sender_args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + } + + // 받을 회원의 쪽지함에 넣을 쪽지 + $output = executeQuery('communication.sendMessage', $receiver_args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // 받는 회원의 쪽지 발송 플래그 생성 (파일로 생성) + $flag_path = './files/member_extra_info/new_message_flags/'.getNumberingPath($receiver_srl); + FileHandler::makeDir($flag_path); + $flag_file = sprintf('%s%s', $flag_path, $receiver_srl); + $flag_count = FileHandler::readFile($flag_file); + FileHandler::writeFile($flag_file, ++$flag_count); + + $oDB->commit(); + + return new Object(0,'success_sended'); + } + + /** + * @brief 특정 쪽지를 보관함으로 보냄 + **/ + function procCommunicationStoreMessage() { + // 로그인 정보 체크 + if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); + $logged_info = Context::get('logged_info'); + + // 변수 체크 + $message_srl = Context::get('message_srl'); + if(!$message_srl) return new Object(-1,'msg_invalid_request'); + + // 쪽지를 가져옴 + $oCommunicationModel = &getModel('communication'); + $message = $oCommunicationModel->getSelectedMessage($message_srl); + if(!$message || $message->message_type != 'R') return new Object(-1,'msg_invalid_request'); + + $args->message_srl = $message_srl; + $args->receiver_srl = $logged_info->member_srl; + $output = executeQuery('communication.setMessageStored', $args); + if(!$output->toBool()) return $output; + + $this->setMessage('success_registed'); + } + + /** + * @brief 쪽지 삭제 + **/ + function procCommunicationDeleteMessage() { + // 로그인 정보 체크 + if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); + $logged_info = Context::get('logged_info'); + $member_srl = $logged_info->member_srl; + + // 변수 체크 + $message_srl = Context::get('message_srl'); + if(!$message_srl) return new Object(-1,'msg_invalid_request'); + + // 쪽지를 가져옴 + $oCommunicationModel = &getModel('communication'); + $message = $oCommunicationModel->getSelectedMessage($message_srl); + if(!$message) return new Object(-1,'msg_invalid_request'); + + // 발송인+type=S or 수신인+type=R 검사 + if($message->sender_srl == $member_srl && $message->message_type == 'S') { + if(!$message_srl) return new Object(-1, 'msg_invalid_request'); + } elseif($message->receiver_srl == $member_srl && $message->message_type == 'R') { + if(!$message_srl) return new Object(-1, 'msg_invalid_request'); + } + + // 삭제 + $args->message_srl = $message_srl; + $output = executeQuery('communication.deleteMessage', $args); + if(!$output->toBool()) return $output; + + $this->setMessage('success_deleted'); + } + + /** + * @brief 선택된 다수의 쪽지 삭제 + **/ + function procCommunicationDeleteMessages() { + // 로그인 정보 체크 + if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); + $logged_info = Context::get('logged_info'); + $member_srl = $logged_info->member_srl; + + // 변수 체크 + $message_srl_list = trim(Context::get('message_srl_list')); + if(!$message_srl_list) return new Object(-1, 'msg_cart_is_null'); + + $message_srl_list = explode('|@|', $message_srl_list); + if(!count($message_srl_list)) return new Object(-1, 'msg_cart_is_null'); + + $message_type = Context::get('message_type'); + if(!$message_type || !in_array($message_type, array('R','S','T'))) return new Object(-1, 'msg_invalid_request'); + + $message_count = count($message_srl_list); + $target = array(); + for($i=0;$i<$message_count;$i++) { + $message_srl = (int)trim($message_srl_list[$i]); + if(!$message_srl) continue; + $target[] = $message_srl; + } + if(!count($target)) return new Object(-1,'msg_cart_is_null'); + + // 삭제 + $args->message_srls = implode(',',$target); + $args->message_type = $message_type; + + if($message_type == 'S') $args->sender_srl = $member_srl; + else $args->receiver_srl = $member_srl; + + $output = executeQuery('communication.deleteMessages', $args); + if(!$output->toBool()) return $output; + + $this->setMessage('success_deleted'); + } + + /** + * @brief 친구 추가 + **/ + function procCommunicationAddFriend() { + // 로그인 정보 체크 + if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); + $logged_info = Context::get('logged_info'); + + $target_srl = (int)trim(Context::get('target_srl')); + if(!$target_srl) return new Object(-1,'msg_invalid_request'); + + // 변수 정리 + $args->friend_srl = getNextSequence(); + $args->list_order = $args->friend_srl * -1; + $args->friend_group_srl = Context::get('friend_group_srl'); + $args->member_srl = $logged_info->member_srl; + $args->target_srl = $target_srl; + $output = executeQuery('communication.addFriend', $args); + if(!$output->toBool()) return $output; + + $this->add('member_srl', $target_srl); + $this->setMessage('success_registed'); + } + + /** + * @brief 등록된 친구의 그룹 이동 + **/ + function procCommunicationMoveFriend() { + // 로그인 정보 체크 + if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); + $logged_info = Context::get('logged_info'); + + // 변수 체크 + $friend_srl_list = trim(Context::get('friend_srl_list')); + if(!$friend_srl_list) return new Object(-1, 'msg_cart_is_null'); + + $friend_srl_list = explode('|@|', $friend_srl_list); + if(!count($friend_srl_list)) return new Object(-1, 'msg_cart_is_null'); + + $friend_count = count($friend_srl_list); + $target = array(); + for($i=0;$i<$friend_count;$i++) { + $friend_srl = (int)trim($friend_srl_list[$i]); + if(!$friend_srl) continue; + $target[] = $friend_srl; + } + if(!count($target)) return new Object(-1,'msg_cart_is_null'); + + // 변수 정리 + $args->friend_srls = implode(',',$target); + $args->member_srl = $logged_info->member_srl; + $args->friend_group_srl = Context::get('target_friend_group_srl'); + + $output = executeQuery('communication.moveFriend', $args); + if(!$output->toBool()) return $output; + + $this->setMessage('success_moved'); + } + + /** + * @brief 친구 삭제 + **/ + function procCommunicationDeleteFriend() { + // 로그인 정보 체크 + if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); + $logged_info = Context::get('logged_info'); + $member_srl = $logged_info->member_srl; + + // 변수 체크 + $friend_srl_list = trim(Context::get('friend_srl_list')); + if(!$friend_srl_list) return new Object(-1, 'msg_cart_is_null'); + + $friend_srl_list = explode('|@|', $friend_srl_list); + if(!count($friend_srl_list)) return new Object(-1, 'msg_cart_is_null'); + + $friend_count = count($friend_srl_list); + $target = array(); + for($i=0;$i<$friend_count;$i++) { + $friend_srl = (int)trim($friend_srl_list[$i]); + if(!$friend_srl) continue; + $target[] = $friend_srl; + } + if(!count($target)) return new Object(-1,'msg_cart_is_null'); + + // 삭제 + $args->friend_srls = implode(',',$target); + $args->member_srl = $logged_info->member_srl; + $output = executeQuery('communication.deleteFriend', $args); + if(!$output->toBool()) return $output; + + $this->setMessage('success_deleted'); + } + + /** + * @brief 친구 그룹 추가 + **/ + function procCommunicationAddFriendGroup() { + // 로그인 정보 체크 + if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); + $logged_info = Context::get('logged_info'); + + // 변수 정리 + $args->friend_group_srl = trim(Context::get('friend_group_srl')); + $args->member_srl = $logged_info->member_srl; + $args->title = Context::get('title'); + $args->title = htmlspecialchars($args->title); + if(!$args->title) return new Object(-1, 'msg_invalid_request'); + + // friend_group_srl이 있으면 수정 + if($args->friend_group_srl) { + $output = executeQuery('communication.renameFriendGroup', $args); + $msg_code = 'success_updated'; + + // 아니면 입력 + } else { + $output = executeQuery('communication.addFriendGroup', $args); + $msg_code = 'success_registed'; + } + + if(!$output->toBool()) return $output; + + $this->setMessage($msg_code); + } + + /** + * @brief 친구 그룹 이름 변경 + **/ + function procCommunicationRenameFriendGroup() { + // 로그인 정보 체크 + if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); + $logged_info = Context::get('logged_info'); + + // 변수 정리 + $args->friend_group_srl= Context::get('friend_group_srl'); + $args->member_srl = $logged_info->member_srl; + $args->title = Context::get('title'); + $args->title = htmlspecialchars($args->title); + if(!$args->title) return new Object(-1, 'msg_invalid_request'); + + $output = executeQuery('communication.renameFriendGroup', $args); + if(!$output->toBool()) return $output; + + $this->setMessage('success_updated'); + } + + /** + * @brief 친구 그룹 삭제 + **/ + function procCommunicationDeleteFriendGroup() { + // 로그인 정보 체크 + if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); + $logged_info = Context::get('logged_info'); + + // 변수 정리 + $args->friend_group_srl = Context::get('friend_group_srl'); + $args->member_srl = $logged_info->member_srl; + $output = executeQuery('communication.deleteFriendGroup', $args); + if(!$output->toBool()) return $output; + + $this->setMessage('success_deleted'); + } + + /** + * @brief 특정 쪽지의 상태를 읽은 상태로 변경 + **/ + function setMessageReaded($message_srl) { + $args->message_srl = $message_srl; + $args->related_srl = $message_srl; + return executeQuery('communication.setMessageReaded', $args); + } + + } +?> diff --git a/modules/communication/communication.model.php b/modules/communication/communication.model.php index f24a6974b..bf93c4206 100644 --- a/modules/communication/communication.model.php +++ b/modules/communication/communication.model.php @@ -1,189 +1,189 @@ -getModuleConfig('communication'); - - if(!$communication_config->skin) $communication_config->skin = 'default'; - if(!$communication_config->colorset) $communication_config->colorset = 'white'; - if(!$communication_config->editor_skin) $communication_config->editor_skin = 'default'; - - return $communication_config; - } - - /** - * @brief 쪽지 내용을 가져옴 - **/ - function getSelectedMessage($message_srl) { - $logged_info = Context::get('logged_info'); - - $args->message_srl = $message_srl; - $output = executeQuery('communication.getMessage',$args); - $message = $output->data; - if(!$message) return ; - - // 보낸 쪽지일 경우 받는 사람 정보를 구함 - $oMemberModel = &getModel('member'); - if($message->sender_srl == $logged_info->member_srl && $message->message_type == 'S') $member_info = $oMemberModel->getMemberInfoByMemberSrl($message->receiver_srl); - - // 보관/받은 쪽지일 경우 보낸 사람 정보를 구함 - else $member_info = $oMemberModel->getMemberInfoByMemberSrl($message->sender_srl); - - if($member_info) { - foreach($member_info as $key => $val) { - if($key != 'regdate') $message->{$key} = $val; - } - } - - // 받은 쪽지이고 아직 읽지 않았을 경우 읽은 상태로 변경 - if($message->message_type == 'R' && $message->readed != 'Y') { - $oCommunicationController = &getController('communication'); - $oCommunicationController->setMessageReaded($message_srl); - } - - - return $message; - } - - /** - * @brief 새 쪽지를 가져옴 - **/ - function getNewMessage() { - $logged_info = Context::get('logged_info'); - $args->receiver_srl = $logged_info->member_srl; - $args->readed = 'N'; - - $output = executeQuery('communication.getNewMessage', $args); - if(!count($output->data)) return; - $message = array_pop($output->data); - - $oCommunicationController = &getController('communication'); - $oCommunicationController->setMessageReaded($message->message_srl); - - return $message; - } - - /** - * @brief 쪽지 목록 가져오기 - * type = R : 받은 쪽지 - * type = S : 보낸 쪽지 - * type = T : 보관함 - **/ - function getMessages($message_type = "R") { - $logged_info = Context::get('logged_info'); - - switch($message_type) { - case 'R' : - $args->member_srl = $logged_info->member_srl; - $args->message_type = 'R'; - $query_id = 'communication.getReceivedMessages'; - break; - case 'T' : - $args->member_srl = $logged_info->member_srl; - $args->message_type = 'T'; - $query_id = 'communication.getStoredMessages'; - break; - default : - $args->member_srl = $logged_info->member_srl; - $args->message_type = 'S'; - $query_id = 'communication.getSendedMessages'; - break; - - } - - // 기타 변수들 정리 - $args->sort_index = 'message.list_order'; - $args->page = Context::get('page'); - $args->list_count = 20; - $args->page_count = 10; - return executeQuery($query_id, $args); - } - - /** - * @brief 친구 목록 가져오기 - **/ - function getFriends($friend_group_srl = 0) { - $logged_info = Context::get('logged_info'); - - $args->friend_group_srl = $friend_group_srl; - $args->member_srl = $logged_info->member_srl; - - // 기타 변수들 정리 - $args->page = Context::get('page'); - $args->sort_index = 'friend.list_order'; - $args->list_count = 10; - $args->page_count = 10; - $output = executeQuery('communication.getFriends', $args); - return $output; - } - - /** - * @brief 이미 친구로 등록되었는지 검사 - **/ - function isAddedFriend($member_srl) { - $logged_info = Context::get('logged_info'); - - $args->member_srl = $logged_info->member_srl; - $args->target_srl = $member_srl; - $output = executeQuery('communication.isAddedFriend', $args); - return $output->data->count; - } - - /** - * @brief 특정 친구 그룹 가져오기 - **/ - function getFriendGroupInfo($friend_group_srl) { - $logged_info = Context::get('logged_info'); - - $args->member_srl = $logged_info->member_srl; - $args->friend_group_srl = $friend_group_srl; - - $output = executeQuery('communication.getFriendGroup', $args); - return $output->data; - } - - /** - * @brief 그룹 목록 가져오기 - **/ - function getFriendGroups() { - $logged_info = Context::get('logged_info'); - $args->member_srl = $logged_info->member_srl; - - $output = executeQuery('communication.getFriendGroups', $args); - $group_list = $output->data; - if(!$group_list) return; - - if(!is_array($group_list)) $group_list = array($group_list); - return $group_list; - } - - /** - * @brief 특정 회원의 친구 목록에 포함되어 있는지를 확인 - **/ - function isFriend($target_srl) { - $logged_info = Context::get('logged_info'); - - $args->member_srl = $target_srl; - $args->target_srl = $logged_info->member_srl; - $output = executeQuery('communication.isAddedFriend', $args); - if($output->data->count) return true; - return false; - } - } -?> +getModuleConfig('communication'); + + if(!$communication_config->skin) $communication_config->skin = 'default'; + if(!$communication_config->colorset) $communication_config->colorset = 'white'; + if(!$communication_config->editor_skin) $communication_config->editor_skin = 'default'; + + return $communication_config; + } + + /** + * @brief 쪽지 내용을 가져옴 + **/ + function getSelectedMessage($message_srl) { + $logged_info = Context::get('logged_info'); + + $args->message_srl = $message_srl; + $output = executeQuery('communication.getMessage',$args); + $message = $output->data; + if(!$message) return ; + + // 보낸 쪽지일 경우 받는 사람 정보를 구함 + $oMemberModel = &getModel('member'); + if($message->sender_srl == $logged_info->member_srl && $message->message_type == 'S') $member_info = $oMemberModel->getMemberInfoByMemberSrl($message->receiver_srl); + + // 보관/받은 쪽지일 경우 보낸 사람 정보를 구함 + else $member_info = $oMemberModel->getMemberInfoByMemberSrl($message->sender_srl); + + if($member_info) { + foreach($member_info as $key => $val) { + if($key != 'regdate') $message->{$key} = $val; + } + } + + // 받은 쪽지이고 아직 읽지 않았을 경우 읽은 상태로 변경 + if($message->message_type == 'R' && $message->readed != 'Y') { + $oCommunicationController = &getController('communication'); + $oCommunicationController->setMessageReaded($message_srl); + } + + + return $message; + } + + /** + * @brief 새 쪽지를 가져옴 + **/ + function getNewMessage() { + $logged_info = Context::get('logged_info'); + $args->receiver_srl = $logged_info->member_srl; + $args->readed = 'N'; + + $output = executeQuery('communication.getNewMessage', $args); + if(!count($output->data)) return; + $message = array_pop($output->data); + + $oCommunicationController = &getController('communication'); + $oCommunicationController->setMessageReaded($message->message_srl); + + return $message; + } + + /** + * @brief 쪽지 목록 가져오기 + * type = R : 받은 쪽지 + * type = S : 보낸 쪽지 + * type = T : 보관함 + **/ + function getMessages($message_type = "R") { + $logged_info = Context::get('logged_info'); + + switch($message_type) { + case 'R' : + $args->member_srl = $logged_info->member_srl; + $args->message_type = 'R'; + $query_id = 'communication.getReceivedMessages'; + break; + case 'T' : + $args->member_srl = $logged_info->member_srl; + $args->message_type = 'T'; + $query_id = 'communication.getStoredMessages'; + break; + default : + $args->member_srl = $logged_info->member_srl; + $args->message_type = 'S'; + $query_id = 'communication.getSendedMessages'; + break; + + } + + // 기타 변수들 정리 + $args->sort_index = 'message.list_order'; + $args->page = Context::get('page'); + $args->list_count = 20; + $args->page_count = 10; + return executeQuery($query_id, $args); + } + + /** + * @brief 친구 목록 가져오기 + **/ + function getFriends($friend_group_srl = 0) { + $logged_info = Context::get('logged_info'); + + $args->friend_group_srl = $friend_group_srl; + $args->member_srl = $logged_info->member_srl; + + // 기타 변수들 정리 + $args->page = Context::get('page'); + $args->sort_index = 'friend.list_order'; + $args->list_count = 10; + $args->page_count = 10; + $output = executeQuery('communication.getFriends', $args); + return $output; + } + + /** + * @brief 이미 친구로 등록되었는지 검사 + **/ + function isAddedFriend($member_srl) { + $logged_info = Context::get('logged_info'); + + $args->member_srl = $logged_info->member_srl; + $args->target_srl = $member_srl; + $output = executeQuery('communication.isAddedFriend', $args); + return $output->data->count; + } + + /** + * @brief 특정 친구 그룹 가져오기 + **/ + function getFriendGroupInfo($friend_group_srl) { + $logged_info = Context::get('logged_info'); + + $args->member_srl = $logged_info->member_srl; + $args->friend_group_srl = $friend_group_srl; + + $output = executeQuery('communication.getFriendGroup', $args); + return $output->data; + } + + /** + * @brief 그룹 목록 가져오기 + **/ + function getFriendGroups() { + $logged_info = Context::get('logged_info'); + $args->member_srl = $logged_info->member_srl; + + $output = executeQuery('communication.getFriendGroups', $args); + $group_list = $output->data; + if(!$group_list) return; + + if(!is_array($group_list)) $group_list = array($group_list); + return $group_list; + } + + /** + * @brief 특정 회원의 친구 목록에 포함되어 있는지를 확인 + **/ + function isFriend($target_srl) { + $logged_info = Context::get('logged_info'); + + $args->member_srl = $target_srl; + $args->target_srl = $logged_info->member_srl; + $output = executeQuery('communication.isAddedFriend', $args); + if($output->data->count) return true; + return false; + } + } +?> diff --git a/modules/communication/communication.view.php b/modules/communication/communication.view.php index 58c9f17ac..6213523e5 100644 --- a/modules/communication/communication.view.php +++ b/modules/communication/communication.view.php @@ -1,228 +1,228 @@ -communication_config = $oCommunicationModel->getConfig(); - $skin = $this->communication_config->skin; - - Context::set('communication_config', $this->communication_config); - - $tpl_path = sprintf('%sskins/%s', $this->module_path, $skin); - $this->setTemplatePath($tpl_path); - } - - /** - * @brief 쪽지함 출력 - **/ - function dispCommunicationMessages() { - // 로그인이 되어 있지 않으면 오류 표시 - if(!Context::get('is_logged')) return $this->stop('msg_not_logged'); - $logged_info = Context::get('logged_info'); - - // 변수 설정 - $message_srl = Context::get('message_srl'); - $message_type = Context::get('message_type'); - if(!in_array($message_type, array('R','S','T'))) { - $message_type = 'R'; - Context::set('message_type', $message_type); - } - - $oCommunicationModel = &getModel('communication'); - - // message_srl이 있으면 내용 추출 - if($message_srl) { - $message = $oCommunicationModel->getSelectedMessage($message_srl); - if($message->message_srl == $message_srl && ($message->receiver_srl == $logged_info->member_srl || $message->sender_srl == $logged_info->member_srl) ) { - stripEmbedTagForAdmin($message->content, $message->sender_srl); - Context::set('message', $message); - } - } - - // 목록 추출 - $output = $oCommunicationModel->getMessages($message_type); - - // 템플릿에 쓰기 위해서 context::set - Context::set('total_count', $output->total_count); - Context::set('total_page', $output->total_page); - Context::set('page', $output->page); - Context::set('message_list', $output->data); - Context::set('page_navigation', $output->page_navigation); - - $this->setTemplateFile('messages'); - } - - /** - * @brief 새 쪽지 보여줌 - **/ - function dispCommunicationNewMessage() { - $this->setLayoutFile('popup_layout'); - - // 로그인이 되어 있지 않으면 오류 표시 - if(!Context::get('is_logged')) return $this->stop('msg_not_logged'); - $logged_info = Context::get('logged_info'); - - $oCommunicationModel = &getModel('communication'); - - // 새 쪽지를 가져옴 - $message = $oCommunicationModel->getNewMessage(); - if($message) { - stripEmbedTagForAdmin($message->content, $message->sender_srl); - Context::set('message', $message); - } - - // 플래그 삭제 - $flag_path = './files/communication_extra_info/new_message_flags/'.getNumberingPath($logged_info->member_srl); - $flag_file = sprintf('%s%s', $flag_path, $logged_info->member_srl); - FileHandler::removeFile($flag_file); - - $this->setTemplateFile('new_message'); - } - - /** - * @brief 쪽지 발송 출력 - **/ - function dispCommunicationSendMessage() { - $this->setLayoutFile("popup_layout"); - $oCommunicationModel = &getModel('communication'); - $oMemberModel = &getModel('member'); - - // 로그인이 되어 있지 않으면 오류 표시 - if(!Context::get('is_logged')) return $this->stop('msg_not_logged'); - $logged_info = Context::get('logged_info'); - - // 쪽지 받을 사용자 정보 구함 - $receiver_srl = Context::get('receiver_srl'); - if(!$receiver_srl || $logged_info->member_srl == $receiver_srl) return $this->stop('msg_not_logged'); - - // 답글 쪽지일 경우 원본 메세지의 글번호를 구함 - $message_srl = Context::get('message_srl'); - if($message_srl) { - $source_message = $oCommunicationModel->getSelectedMessage($message_srl); - if($source_message->message_srl == $message_srl && $source_message->sender_srl == $receiver_srl) { - $source_message->title = "[re] ".$source_message->title; - $source_message->content = "\r\n
    \r\n
    ".trim($source_message->content)."
    "; - Context::set('source_message', $source_message); - } - } - - $receiver_info = $oMemberModel->getMemberInfoByMemberSrl($receiver_srl); - Context::set('receiver_info', $receiver_info); - - // 에디터 모듈의 getEditor를 호출하여 서명용으로 세팅 - $oEditorModel = &getModel('editor'); - $option->primary_key_name = 'receiver_srl'; - $option->content_key_name = 'content'; - $option->allow_fileupload = false; - $option->enable_autosave = false; - $option->enable_default_component = true;// false; - $option->enable_component = false; - $option->resizable = false; - $option->disable_html = true; - $option->height = 300; - $option->skin = $this->communication_config->editor_skin; - $option->colorset = $this->communication_config->editor_colorset; - $editor = $oEditorModel->getEditor($logged_info->member_srl, $option); - Context::set('editor', $editor); - - $this->setTemplateFile('send_message'); - } - - /** - * @brief 친구 목록 보기 - **/ - function dispCommunicationFriend() { - // 로그인이 되어 있지 않으면 오류 표시 - if(!Context::get('is_logged')) return $this->stop('msg_not_logged'); - - $oCommunicationModel = &getModel('communication'); - - // 그룹 목록을 가져옴 - $tmp_group_list = $oCommunicationModel->getFriendGroups(); - $group_count = count($tmp_group_list); - for($i=0;$i<$group_count;$i++) $friend_group_list[$tmp_group_list[$i]->friend_group_srl] = $tmp_group_list[$i]; - Context::set('friend_group_list', $friend_group_list); - - // 친구 목록을 가져옴 - $friend_group_srl = Context::get('friend_group_srl'); - $output = $oCommunicationModel->getFriends($friend_group_srl); - $friend_count = count($output->data); - if($friend_count) { - foreach($output->data as $key => $val) { - $group_srl = $val->friend_group_srl; - $group_title = $friend_group_list[$group_srl]->title; - if(!$group_title) $group_title = Context::get('default_friend_group'); - $output->data[$key]->group_title = $group_title; - } - } - - // 템플릿에 쓰기 위해서 context::set - Context::set('total_count', $output->total_count); - Context::set('total_page', $output->total_page); - Context::set('page', $output->page); - Context::set('friend_list', $output->data); - Context::set('page_navigation', $output->page_navigation); - - $this->setTemplateFile('friends'); - } - - /** - * @brief 친구 추가 - **/ - function dispCommunicationAddFriend() { - $this->setLayoutFile("popup_layout"); - - // 로그인이 되어 있지 않으면 오류 표시 - if(!Context::get('is_logged')) return $this->stop('msg_not_logged'); - $logged_info = Context::get('logged_info'); - - $target_srl = Context::get('target_srl'); - if(!$target_srl) return $this->stop('msg_invalid_request'); - - // 대상 회원의 정보를 구함 - $oMemberModel = &getModel('member'); - $oCommunicationModel = &getModel('communication'); - $communication_info = $oMemberModel->getMemberInfoByMemberSrl($target_srl); - if($communication_info->member_srl != $target_srl) return $this->stop('msg_invalid_request'); - Context::set('target_info', $communication_info); - - // 그룹의 목록을 구함 - $friend_group_list = $oCommunicationModel->getFriendGroups(); - Context::set('friend_group_list', $friend_group_list); - - $this->setTemplateFile('add_friend'); - } - - /** - * @brief 친구 그룹 추가 - **/ - function dispCommunicationAddFriendGroup() { - $this->setLayoutFile("popup_layout"); - - // 로그인이 되어 있지 않으면 오류 표시 - if(!Context::get('is_logged')) return $this->stop('msg_not_logged'); - $logged_info = Context::get('logged_info'); - - // 그룹 번호가 넘어오면 수정모드로.. - $friend_group_srl = Context::get('friend_group_srl'); - if($friend_group_srl) { - $oCommunicationModel = &getModel('communication'); - $friend_group = $oCommunicationModel->getFriendGroupInfo($friend_group_srl); - if($friend_group->friend_group_srl == $friend_group_srl) Context::set('friend_group', $friend_group); - } - - $this->setTemplateFile('add_friend_group'); - } - - } -?> +communication_config = $oCommunicationModel->getConfig(); + $skin = $this->communication_config->skin; + + Context::set('communication_config', $this->communication_config); + + $tpl_path = sprintf('%sskins/%s', $this->module_path, $skin); + $this->setTemplatePath($tpl_path); + } + + /** + * @brief 쪽지함 출력 + **/ + function dispCommunicationMessages() { + // 로그인이 되어 있지 않으면 오류 표시 + if(!Context::get('is_logged')) return $this->stop('msg_not_logged'); + $logged_info = Context::get('logged_info'); + + // 변수 설정 + $message_srl = Context::get('message_srl'); + $message_type = Context::get('message_type'); + if(!in_array($message_type, array('R','S','T'))) { + $message_type = 'R'; + Context::set('message_type', $message_type); + } + + $oCommunicationModel = &getModel('communication'); + + // message_srl이 있으면 내용 추출 + if($message_srl) { + $message = $oCommunicationModel->getSelectedMessage($message_srl); + if($message->message_srl == $message_srl && ($message->receiver_srl == $logged_info->member_srl || $message->sender_srl == $logged_info->member_srl) ) { + stripEmbedTagForAdmin($message->content, $message->sender_srl); + Context::set('message', $message); + } + } + + // 목록 추출 + $output = $oCommunicationModel->getMessages($message_type); + + // 템플릿에 쓰기 위해서 context::set + Context::set('total_count', $output->total_count); + Context::set('total_page', $output->total_page); + Context::set('page', $output->page); + Context::set('message_list', $output->data); + Context::set('page_navigation', $output->page_navigation); + + $this->setTemplateFile('messages'); + } + + /** + * @brief 새 쪽지 보여줌 + **/ + function dispCommunicationNewMessage() { + $this->setLayoutFile('popup_layout'); + + // 로그인이 되어 있지 않으면 오류 표시 + if(!Context::get('is_logged')) return $this->stop('msg_not_logged'); + $logged_info = Context::get('logged_info'); + + $oCommunicationModel = &getModel('communication'); + + // 새 쪽지를 가져옴 + $message = $oCommunicationModel->getNewMessage(); + if($message) { + stripEmbedTagForAdmin($message->content, $message->sender_srl); + Context::set('message', $message); + } + + // 플래그 삭제 + $flag_path = './files/communication_extra_info/new_message_flags/'.getNumberingPath($logged_info->member_srl); + $flag_file = sprintf('%s%s', $flag_path, $logged_info->member_srl); + FileHandler::removeFile($flag_file); + + $this->setTemplateFile('new_message'); + } + + /** + * @brief 쪽지 발송 출력 + **/ + function dispCommunicationSendMessage() { + $this->setLayoutFile("popup_layout"); + $oCommunicationModel = &getModel('communication'); + $oMemberModel = &getModel('member'); + + // 로그인이 되어 있지 않으면 오류 표시 + if(!Context::get('is_logged')) return $this->stop('msg_not_logged'); + $logged_info = Context::get('logged_info'); + + // 쪽지 받을 사용자 정보 구함 + $receiver_srl = Context::get('receiver_srl'); + if(!$receiver_srl || $logged_info->member_srl == $receiver_srl) return $this->stop('msg_not_logged'); + + // 답글 쪽지일 경우 원본 메세지의 글번호를 구함 + $message_srl = Context::get('message_srl'); + if($message_srl) { + $source_message = $oCommunicationModel->getSelectedMessage($message_srl); + if($source_message->message_srl == $message_srl && $source_message->sender_srl == $receiver_srl) { + $source_message->title = "[re] ".$source_message->title; + $source_message->content = "\r\n
    \r\n
    ".trim($source_message->content)."
    "; + Context::set('source_message', $source_message); + } + } + + $receiver_info = $oMemberModel->getMemberInfoByMemberSrl($receiver_srl); + Context::set('receiver_info', $receiver_info); + + // 에디터 모듈의 getEditor를 호출하여 서명용으로 세팅 + $oEditorModel = &getModel('editor'); + $option->primary_key_name = 'receiver_srl'; + $option->content_key_name = 'content'; + $option->allow_fileupload = false; + $option->enable_autosave = false; + $option->enable_default_component = true;// false; + $option->enable_component = false; + $option->resizable = false; + $option->disable_html = true; + $option->height = 300; + $option->skin = $this->communication_config->editor_skin; + $option->colorset = $this->communication_config->editor_colorset; + $editor = $oEditorModel->getEditor($logged_info->member_srl, $option); + Context::set('editor', $editor); + + $this->setTemplateFile('send_message'); + } + + /** + * @brief 친구 목록 보기 + **/ + function dispCommunicationFriend() { + // 로그인이 되어 있지 않으면 오류 표시 + if(!Context::get('is_logged')) return $this->stop('msg_not_logged'); + + $oCommunicationModel = &getModel('communication'); + + // 그룹 목록을 가져옴 + $tmp_group_list = $oCommunicationModel->getFriendGroups(); + $group_count = count($tmp_group_list); + for($i=0;$i<$group_count;$i++) $friend_group_list[$tmp_group_list[$i]->friend_group_srl] = $tmp_group_list[$i]; + Context::set('friend_group_list', $friend_group_list); + + // 친구 목록을 가져옴 + $friend_group_srl = Context::get('friend_group_srl'); + $output = $oCommunicationModel->getFriends($friend_group_srl); + $friend_count = count($output->data); + if($friend_count) { + foreach($output->data as $key => $val) { + $group_srl = $val->friend_group_srl; + $group_title = $friend_group_list[$group_srl]->title; + if(!$group_title) $group_title = Context::get('default_friend_group'); + $output->data[$key]->group_title = $group_title; + } + } + + // 템플릿에 쓰기 위해서 context::set + Context::set('total_count', $output->total_count); + Context::set('total_page', $output->total_page); + Context::set('page', $output->page); + Context::set('friend_list', $output->data); + Context::set('page_navigation', $output->page_navigation); + + $this->setTemplateFile('friends'); + } + + /** + * @brief 친구 추가 + **/ + function dispCommunicationAddFriend() { + $this->setLayoutFile("popup_layout"); + + // 로그인이 되어 있지 않으면 오류 표시 + if(!Context::get('is_logged')) return $this->stop('msg_not_logged'); + $logged_info = Context::get('logged_info'); + + $target_srl = Context::get('target_srl'); + if(!$target_srl) return $this->stop('msg_invalid_request'); + + // 대상 회원의 정보를 구함 + $oMemberModel = &getModel('member'); + $oCommunicationModel = &getModel('communication'); + $communication_info = $oMemberModel->getMemberInfoByMemberSrl($target_srl); + if($communication_info->member_srl != $target_srl) return $this->stop('msg_invalid_request'); + Context::set('target_info', $communication_info); + + // 그룹의 목록을 구함 + $friend_group_list = $oCommunicationModel->getFriendGroups(); + Context::set('friend_group_list', $friend_group_list); + + $this->setTemplateFile('add_friend'); + } + + /** + * @brief 친구 그룹 추가 + **/ + function dispCommunicationAddFriendGroup() { + $this->setLayoutFile("popup_layout"); + + // 로그인이 되어 있지 않으면 오류 표시 + if(!Context::get('is_logged')) return $this->stop('msg_not_logged'); + $logged_info = Context::get('logged_info'); + + // 그룹 번호가 넘어오면 수정모드로.. + $friend_group_srl = Context::get('friend_group_srl'); + if($friend_group_srl) { + $oCommunicationModel = &getModel('communication'); + $friend_group = $oCommunicationModel->getFriendGroupInfo($friend_group_srl); + if($friend_group->friend_group_srl == $friend_group_srl) Context::set('friend_group', $friend_group); + } + + $this->setTemplateFile('add_friend_group'); + } + + } +?> diff --git a/modules/communication/conf/info.xml b/modules/communication/conf/info.xml index 58b560547..68819bc8b 100644 --- a/modules/communication/conf/info.xml +++ b/modules/communication/conf/info.xml @@ -1,33 +1,33 @@ - - - 커뮤니케이션 - コミュニケーション - 会员交流 - Communication - Communication - Liên lạc - 交流 - İletişim - 회원들간의 쪽지, 친구기능을 담당하는 모듈입니다. - 会員間にメッセージや友達管理などコミュニティ機能を提供します。 - 管理在线会员间短信息及好友功能的模块。 - This module is for managing message, friend functions. - Module quản lý tin nhắn và bạn bè. - This module is for managing message, friend functions. - 管理線上會員間短訊及好友功能的模組。 - Bu modül mesaj ve arkadaşlık özelliklerini yönetmek içindir. - 0.1 - 2008-05-30 - member - - - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - - + + + 커뮤니케이션 + コミュニケーション + 会员交流 + Communication + Communication + Liên lạc + 交流 + İletişim + 회원들간의 쪽지, 친구기능을 담당하는 모듈입니다. + 会員間にメッセージや友達管理などコミュニティ機能を提供します。 + 管理在线会员间短信息及好友功能的模块。 + This module is for managing message, friend functions. + Module quản lý tin nhắn và bạn bè. + This module is for managing message, friend functions. + 管理線上會員間短訊及好友功能的模組。 + Bu modül mesaj ve arkadaşlık özelliklerini yönetmek içindir. + 0.1 + 2008-05-30 + member + + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + diff --git a/modules/communication/lang/en.lang.php b/modules/communication/lang/en.lang.php index 8ddeddf7c..0baaab31e 100644 --- a/modules/communication/lang/en.lang.php +++ b/modules/communication/lang/en.lang.php @@ -1,48 +1,48 @@ -communication = 'Communication'; - $lang->about_communication = 'Communication module is for communications between members with messages or friends.'; - - $lang->allow_message = 'Receive Messages'; - $lang->allow_message_type = array( - 'Y' => 'Receive All', - 'N' => 'Reject All', - 'F' => 'Only Friends', - ); - - $lang->message_box = array( - 'R' => 'Received', - 'S' => 'Sent', - 'T' => 'Mailbox', - ); - $lang->readed_date = "Read Date"; - - $lang->sender = 'Sender'; - $lang->receiver = 'Receiver'; - $lang->friend_group = 'Friend Group'; - $lang->default_friend_group = 'Unassigned Group'; - - $lang->cmd_send_message = 'Send Message'; - $lang->cmd_reply_message = 'Reply Message'; - $lang->cmd_view_friend = 'Friends'; - $lang->cmd_add_friend = 'Add Friend'; - $lang->cmd_view_message_box = 'Message Box'; - $lang->cmd_store = "Save"; - $lang->cmd_add_friend_group = 'Add Friend Group'; - $lang->cmd_rename_friend_group = 'Modify Friend Group Name'; - - $lang->msg_no_message = 'There is no message'; - $lang->message_received = 'You have a new message'; - - $lang->msg_title_is_null = 'Please input the title of message'; - $lang->msg_content_is_null = 'Please input the content'; - $lang->msg_allow_message_to_friend = "Failed to send because receiver only allows friends' messages"; - $lang->msg_disallow_message = 'Failed to send because receiver rejects message reception'; - - $lang->about_allow_message = 'You can decide message reception'; -?> +communication = 'Communication'; + $lang->about_communication = 'Communication module is for communications between members with messages or friends.'; + + $lang->allow_message = 'Receive Messages'; + $lang->allow_message_type = array( + 'Y' => 'Receive All', + 'N' => 'Reject All', + 'F' => 'Only Friends', + ); + + $lang->message_box = array( + 'R' => 'Received', + 'S' => 'Sent', + 'T' => 'Mailbox', + ); + $lang->readed_date = "Read Date"; + + $lang->sender = 'Sender'; + $lang->receiver = 'Receiver'; + $lang->friend_group = 'Friend Group'; + $lang->default_friend_group = 'Unassigned Group'; + + $lang->cmd_send_message = 'Send Message'; + $lang->cmd_reply_message = 'Reply Message'; + $lang->cmd_view_friend = 'Friends'; + $lang->cmd_add_friend = 'Add Friend'; + $lang->cmd_view_message_box = 'Message Box'; + $lang->cmd_store = "Save"; + $lang->cmd_add_friend_group = 'Add Friend Group'; + $lang->cmd_rename_friend_group = 'Modify Friend Group Name'; + + $lang->msg_no_message = 'There is no message'; + $lang->message_received = 'You have a new message'; + + $lang->msg_title_is_null = 'Please input the title of message'; + $lang->msg_content_is_null = 'Please input the content'; + $lang->msg_allow_message_to_friend = "Failed to send because receiver only allows friends' messages"; + $lang->msg_disallow_message = 'Failed to send because receiver rejects message reception'; + + $lang->about_allow_message = 'You can decide message reception'; +?> diff --git a/modules/communication/lang/es.lang.php b/modules/communication/lang/es.lang.php index d70c6d4f5..620fe1f15 100644 --- a/modules/communication/lang/es.lang.php +++ b/modules/communication/lang/es.lang.php @@ -1,49 +1,49 @@ -communication = 'Communication'; - $lang->about_communication = '회원간의 쪽지나 친구 관리등 커뮤니케이션 기능을 수행하는 모듈입니다'; - - $lang->allow_message = 'Permitir la recepción del mensaje'; - $lang->allow_message_type = array( - 'Y' => 'Recibir todo', - 'N' => 'Rechazar', - 'F' => 'Sólo amigos', - ); - - $lang->message_box = array( - 'R' => 'Recibido', - 'S' => 'Enviado', - 'T' => 'Buzon de Email', - ); - - $lang->readed_date = "Fecha Leído"; - - $lang->sender = 'Remitente'; - $lang->receiver = 'Receptor'; - $lang->friend_group = 'Grupo de amigos'; - $lang->default_friend_group = 'Grupo desasignado'; - - $lang->cmd_send_message = 'Enviar Mensaje'; - $lang->cmd_reply_message = 'Responder el mensaje'; - $lang->cmd_view_friend = 'Amigos'; - $lang->cmd_add_friend = 'Registrar como Amigo'; - $lang->cmd_view_message_box = 'Buzón de mensajes'; - $lang->cmd_store = "Guardar"; - $lang->cmd_add_friend_group = 'agregar grupo de amigos'; - $lang->cmd_rename_friend_group = 'Cambiar el nombre del grupo de amigos'; - - $lang->msg_no_message = 'No hay mensajes'; - $lang->message_received = 'Usted ha recibido un mensaje'; - - $lang->msg_title_is_null = 'Por favor ingresar el título de la nota'; - $lang->msg_content_is_null = 'Por favor ingresar el contenido'; - $lang->msg_allow_message_to_friend = "Falló el envío por permitir sólo mensajes de sus amigos"; - $lang->msg_disallow_message = 'Falló el envío por ser usuario rechazado para recibir mensajes'; - - $lang->about_allow_message = 'Usted puede decidir la recepción del mensaje'; -?> +communication = 'Communication'; + $lang->about_communication = '회원간의 쪽지나 친구 관리등 커뮤니케이션 기능을 수행하는 모듈입니다'; + + $lang->allow_message = 'Permitir la recepción del mensaje'; + $lang->allow_message_type = array( + 'Y' => 'Recibir todo', + 'N' => 'Rechazar', + 'F' => 'Sólo amigos', + ); + + $lang->message_box = array( + 'R' => 'Recibido', + 'S' => 'Enviado', + 'T' => 'Buzon de Email', + ); + + $lang->readed_date = "Fecha Leído"; + + $lang->sender = 'Remitente'; + $lang->receiver = 'Receptor'; + $lang->friend_group = 'Grupo de amigos'; + $lang->default_friend_group = 'Grupo desasignado'; + + $lang->cmd_send_message = 'Enviar Mensaje'; + $lang->cmd_reply_message = 'Responder el mensaje'; + $lang->cmd_view_friend = 'Amigos'; + $lang->cmd_add_friend = 'Registrar como Amigo'; + $lang->cmd_view_message_box = 'Buzón de mensajes'; + $lang->cmd_store = "Guardar"; + $lang->cmd_add_friend_group = 'agregar grupo de amigos'; + $lang->cmd_rename_friend_group = 'Cambiar el nombre del grupo de amigos'; + + $lang->msg_no_message = 'No hay mensajes'; + $lang->message_received = 'Usted ha recibido un mensaje'; + + $lang->msg_title_is_null = 'Por favor ingresar el título de la nota'; + $lang->msg_content_is_null = 'Por favor ingresar el contenido'; + $lang->msg_allow_message_to_friend = "Falló el envío por permitir sólo mensajes de sus amigos"; + $lang->msg_disallow_message = 'Falló el envío por ser usuario rechazado para recibir mensajes'; + + $lang->about_allow_message = 'Usted puede decidir la recepción del mensaje'; +?> diff --git a/modules/communication/lang/fr.lang.php b/modules/communication/lang/fr.lang.php index c1a3b88aa..9170d28b1 100644 --- a/modules/communication/lang/fr.lang.php +++ b/modules/communication/lang/fr.lang.php @@ -1,48 +1,48 @@ -communication = 'Communication'; - $lang->about_communication = 'Ce module exécute des fonctions communicatives comme Messages ou Amis'; - - $lang->allow_message = 'Recevoir les Messages'; - $lang->allow_message_type = array( - 'Y' => 'Recevoir tout', - 'N' => 'Refuser tout', - 'F' => 'Amis seulement', - ); - - $lang->message_box = array( - 'R' => 'Reçu', - 'S' => 'Envoyé', - 'T' => 'Boîte aux Lettres', - ); - $lang->readed_date = "Jour lu"; - - $lang->sender = 'Envoyeur'; - $lang->receiver = 'Receveur'; - $lang->friend_group = 'Groupe des Amis'; - $lang->default_friend_group = 'Groupe pas assigné '; - - $lang->cmd_send_message = 'Envoyer un Message'; - $lang->cmd_reply_message = 'Répondre à un Message'; - $lang->cmd_view_friend = 'Amis'; - $lang->cmd_add_friend = 'Inscrire des Amis'; - $lang->cmd_view_message_box = 'Lire des Messages'; - $lang->cmd_store = "Conserver"; - $lang->cmd_add_friend_group = 'Ajouter un Groupe des Amis'; - $lang->cmd_rename_friend_group = 'Modifier le Nom du Groupe des Amis'; - - $lang->msg_no_message = 'Nul Message'; - $lang->message_received = 'Nouveau message'; - - $lang->msg_title_is_null = 'Entrez le titre du message, S.V.P.'; - $lang->msg_content_is_null = 'Entrez le contenu, S.V.P.'; - $lang->msg_allow_message_to_friend = "Echoué à envoyer parce que le receveur permet seulement les messages des Amis."; - $lang->msg_disallow_message = 'Echoué à envoyer parce que le receveur refuse la réception des messages'; - - $lang->about_allow_message = 'Vous pouvez refuser la réception des messages'; -?> +communication = 'Communication'; + $lang->about_communication = 'Ce module exécute des fonctions communicatives comme Messages ou Amis'; + + $lang->allow_message = 'Recevoir les Messages'; + $lang->allow_message_type = array( + 'Y' => 'Recevoir tout', + 'N' => 'Refuser tout', + 'F' => 'Amis seulement', + ); + + $lang->message_box = array( + 'R' => 'Reçu', + 'S' => 'Envoyé', + 'T' => 'Boîte aux Lettres', + ); + $lang->readed_date = "Jour lu"; + + $lang->sender = 'Envoyeur'; + $lang->receiver = 'Receveur'; + $lang->friend_group = 'Groupe des Amis'; + $lang->default_friend_group = 'Groupe pas assigné '; + + $lang->cmd_send_message = 'Envoyer un Message'; + $lang->cmd_reply_message = 'Répondre à un Message'; + $lang->cmd_view_friend = 'Amis'; + $lang->cmd_add_friend = 'Inscrire des Amis'; + $lang->cmd_view_message_box = 'Lire des Messages'; + $lang->cmd_store = "Conserver"; + $lang->cmd_add_friend_group = 'Ajouter un Groupe des Amis'; + $lang->cmd_rename_friend_group = 'Modifier le Nom du Groupe des Amis'; + + $lang->msg_no_message = 'Nul Message'; + $lang->message_received = 'Nouveau message'; + + $lang->msg_title_is_null = 'Entrez le titre du message, S.V.P.'; + $lang->msg_content_is_null = 'Entrez le contenu, S.V.P.'; + $lang->msg_allow_message_to_friend = "Echoué à envoyer parce que le receveur permet seulement les messages des Amis."; + $lang->msg_disallow_message = 'Echoué à envoyer parce que le receveur refuse la réception des messages'; + + $lang->about_allow_message = 'Vous pouvez refuser la réception des messages'; +?> diff --git a/modules/communication/lang/jp.lang.php b/modules/communication/lang/jp.lang.php index be4a29728..06ba9f4f0 100644 --- a/modules/communication/lang/jp.lang.php +++ b/modules/communication/lang/jp.lang.php @@ -1,48 +1,48 @@ -communication = 'コミュニケーション'; - $lang->about_communication = '会員間にメッセージや友達管理などコミュニティ機能を提供するモジュールです。'; - - $lang->allow_message = 'メッセージの受信'; - $lang->allow_message_type = array( - 'Y' => '全て受信', - 'N' => '全て受信しない', - 'F' => '友達からのみ受信する', - ); - - $lang->message_box = array( - 'R' => 'メッセージ受信箱', - 'S' => 'メッセージ送信箱', - 'T' => '保存箱', - ); - - $lang->readed_date = '開封時間'; - - $lang->sender = '送信者'; - $lang->receiver = '受信者'; - $lang->friend_group = '友達グループ'; - $lang->default_friend_group = 'グループ未指定'; - - $lang->cmd_send_message = 'メッセージ送信'; - $lang->cmd_reply_message = 'メッセージ返信'; - $lang->cmd_view_friend = '友達リスト'; - $lang->cmd_add_friend = '友達登録'; - $lang->cmd_view_message_box = 'メッセージ'; - $lang->cmd_store = '保存'; - $lang->cmd_add_friend_group = '友達グループ追加'; - $lang->cmd_rename_friend_group = '友達グループ名変更'; - - $lang->msg_no_message = 'メッセージがありません。'; - $lang->message_received = 'メッセージが届きました。'; - - $lang->msg_title_is_null = 'メッセージのタイトルを入力して下さい。'; - $lang->msg_content_is_null = '内容を入力して下さい。'; - $lang->msg_allow_message_to_friend = '友達からのみメッセージを受信出来るように設定したユーザであるため、送信出来ませんでした。'; - $lang->msg_disallow_message = 'メッセージの受信を拒否している受信者であるため、送信出来ませんでした。'; - $lang->about_allow_message = 'メッセージを受信するかを設定します。'; -?> +communication = 'コミュニケーション'; + $lang->about_communication = '会員間にメッセージや友達管理などコミュニティ機能を提供するモジュールです。'; + + $lang->allow_message = 'メッセージの受信'; + $lang->allow_message_type = array( + 'Y' => '全て受信', + 'N' => '全て受信しない', + 'F' => '友達からのみ受信する', + ); + + $lang->message_box = array( + 'R' => 'メッセージ受信箱', + 'S' => 'メッセージ送信箱', + 'T' => '保存箱', + ); + + $lang->readed_date = '開封時間'; + + $lang->sender = '送信者'; + $lang->receiver = '受信者'; + $lang->friend_group = '友達グループ'; + $lang->default_friend_group = 'グループ未指定'; + + $lang->cmd_send_message = 'メッセージ送信'; + $lang->cmd_reply_message = 'メッセージ返信'; + $lang->cmd_view_friend = '友達リスト'; + $lang->cmd_add_friend = '友達登録'; + $lang->cmd_view_message_box = 'メッセージ'; + $lang->cmd_store = '保存'; + $lang->cmd_add_friend_group = '友達グループ追加'; + $lang->cmd_rename_friend_group = '友達グループ名変更'; + + $lang->msg_no_message = 'メッセージがありません。'; + $lang->message_received = 'メッセージが届きました。'; + + $lang->msg_title_is_null = 'メッセージのタイトルを入力して下さい。'; + $lang->msg_content_is_null = '内容を入力して下さい。'; + $lang->msg_allow_message_to_friend = '友達からのみメッセージを受信出来るように設定したユーザであるため、送信出来ませんでした。'; + $lang->msg_disallow_message = 'メッセージの受信を拒否している受信者であるため、送信出来ませんでした。'; + $lang->about_allow_message = 'メッセージを受信するかを設定します。'; +?> diff --git a/modules/communication/lang/ko.lang.php b/modules/communication/lang/ko.lang.php index 35186374e..1c0841fad 100644 --- a/modules/communication/lang/ko.lang.php +++ b/modules/communication/lang/ko.lang.php @@ -1,48 +1,48 @@ -communication = '커뮤니케이션'; - $lang->about_communication = '회원 간의 쪽지나 친구 관리 등 커뮤니케이션 기능을 수행하는 모듈입니다.'; - - $lang->allow_message = '쪽지 수신 허용'; - $lang->allow_message_type = array( - 'Y' => '전체 수신', - 'N' => '거부', - 'F' => '친구만 허용', - ); - - $lang->message_box = array( - 'R' => '받은 쪽지함', - 'S' => '보낸 쪽지함', - 'T' => '보관함', - ); - - $lang->readed_date = '읽은 시간'; - - $lang->sender = '보낸이'; - $lang->receiver = '받는이'; - $lang->friend_group = '친구 그룹'; - $lang->default_friend_group = '그룹 미지정'; - - $lang->cmd_send_message = '쪽지 보내기'; - $lang->cmd_reply_message = '쪽지 답장'; - $lang->cmd_view_friend = '친구 보기'; - $lang->cmd_add_friend = '친구 등록'; - $lang->cmd_view_message_box = '쪽지함 보기'; - $lang->cmd_store = '보관'; - $lang->cmd_add_friend_group = '친구 그룹 추가'; - $lang->cmd_rename_friend_group = '친구 그룹 이름 변경'; - - $lang->msg_no_message = '쪽지가 없습니다.'; - $lang->message_received = '쪽지가 왔습니다.'; - - $lang->msg_title_is_null = '쪽지 제목을 입력해주세요.'; - $lang->msg_content_is_null = '내용을 입력해주세요.'; - $lang->msg_allow_message_to_friend = '친구에게만 쪽지 발송을 허용한 사용자라서 쪽지 발송을 하지 못했습니다.'; - $lang->msg_disallow_message = '쪽지 수신을 거부한 사용자라서 쪽지 발송을 하지 못했습니다.'; - $lang->about_allow_message = '쪽지 수신 여부를 결정할 수 있습니다.'; -?> +communication = '커뮤니케이션'; + $lang->about_communication = '회원 간의 쪽지나 친구 관리 등 커뮤니케이션 기능을 수행하는 모듈입니다.'; + + $lang->allow_message = '쪽지 수신 허용'; + $lang->allow_message_type = array( + 'Y' => '전체 수신', + 'N' => '거부', + 'F' => '친구만 허용', + ); + + $lang->message_box = array( + 'R' => '받은 쪽지함', + 'S' => '보낸 쪽지함', + 'T' => '보관함', + ); + + $lang->readed_date = '읽은 시간'; + + $lang->sender = '보낸이'; + $lang->receiver = '받는이'; + $lang->friend_group = '친구 그룹'; + $lang->default_friend_group = '그룹 미지정'; + + $lang->cmd_send_message = '쪽지 보내기'; + $lang->cmd_reply_message = '쪽지 답장'; + $lang->cmd_view_friend = '친구 보기'; + $lang->cmd_add_friend = '친구 등록'; + $lang->cmd_view_message_box = '쪽지함 보기'; + $lang->cmd_store = '보관'; + $lang->cmd_add_friend_group = '친구 그룹 추가'; + $lang->cmd_rename_friend_group = '친구 그룹 이름 변경'; + + $lang->msg_no_message = '쪽지가 없습니다.'; + $lang->message_received = '쪽지가 왔습니다.'; + + $lang->msg_title_is_null = '쪽지 제목을 입력해주세요.'; + $lang->msg_content_is_null = '내용을 입력해주세요.'; + $lang->msg_allow_message_to_friend = '친구에게만 쪽지 발송을 허용한 사용자라서 쪽지 발송을 하지 못했습니다.'; + $lang->msg_disallow_message = '쪽지 수신을 거부한 사용자라서 쪽지 발송을 하지 못했습니다.'; + $lang->about_allow_message = '쪽지 수신 여부를 결정할 수 있습니다.'; +?> diff --git a/modules/communication/lang/ru.lang.php b/modules/communication/lang/ru.lang.php index e85546a84..a4709dcd4 100644 --- a/modules/communication/lang/ru.lang.php +++ b/modules/communication/lang/ru.lang.php @@ -1,49 +1,49 @@ -communication = 'Общение'; - $lang->about_communication = 'Модуль для общения между пользователями'; - - $lang->allow_message = 'Получать сообщения'; - $lang->allow_message_type = array( - 'Y' => 'Принимать все', - 'N' => 'Отклонять все', - 'F' => 'Принимать только от друзей', - ); - - - $lang->message_box = array( - 'R' => 'Полученные', - 'S' => 'Отправленные', - 'T' => 'Почтовый ящик', - ); - - $lang->readed_date = "Дата прочтения сообщения"; - - $lang->sender = 'Отправитель'; - $lang->receiver = 'Получатель'; - $lang->friend_group = 'Группа Друзья'; - $lang->default_friend_group = 'Незарегистрированная группа'; - - $lang->cmd_send_message = 'Отправить сообщение'; - $lang->cmd_reply_message = 'Ответить'; - $lang->cmd_view_friend = 'Друзья'; - $lang->cmd_add_friend = 'Добавить в друзья'; - $lang->cmd_view_message_box = 'Личные сообщений'; - $lang->cmd_store = "Сохранить"; - $lang->cmd_add_friend_group = 'Добавить в группу друзей'; - $lang->cmd_rename_friend_group = 'Изменить имя группы друзей'; - - $lang->msg_no_message = 'Сообщений нет'; - $lang->message_received = 'У Вас новое сообщение'; - - $lang->msg_title_is_null = 'Пожалуйста, введите тему сообщения'; - $lang->msg_content_is_null = 'Пожалуйста, введите содержание'; - $lang->msg_allow_message_to_friend = "Сообщение не отправлено, поскольку являетесь пользователем, имеющим право посылать сообщения только друзьям"; - $lang->msg_disallow_message = 'Сообщение не отправлено, поскольку получатель запретил прием сообщений'; - $lang->about_allow_message = 'Вы можете установить режим принятия сообщений'; -?> +communication = 'Общение'; + $lang->about_communication = 'Модуль для общения между пользователями'; + + $lang->allow_message = 'Получать сообщения'; + $lang->allow_message_type = array( + 'Y' => 'Принимать все', + 'N' => 'Отклонять все', + 'F' => 'Принимать только от друзей', + ); + + + $lang->message_box = array( + 'R' => 'Полученные', + 'S' => 'Отправленные', + 'T' => 'Почтовый ящик', + ); + + $lang->readed_date = "Дата прочтения сообщения"; + + $lang->sender = 'Отправитель'; + $lang->receiver = 'Получатель'; + $lang->friend_group = 'Группа Друзья'; + $lang->default_friend_group = 'Незарегистрированная группа'; + + $lang->cmd_send_message = 'Отправить сообщение'; + $lang->cmd_reply_message = 'Ответить'; + $lang->cmd_view_friend = 'Друзья'; + $lang->cmd_add_friend = 'Добавить в друзья'; + $lang->cmd_view_message_box = 'Личные сообщений'; + $lang->cmd_store = "Сохранить"; + $lang->cmd_add_friend_group = 'Добавить в группу друзей'; + $lang->cmd_rename_friend_group = 'Изменить имя группы друзей'; + + $lang->msg_no_message = 'Сообщений нет'; + $lang->message_received = 'У Вас новое сообщение'; + + $lang->msg_title_is_null = 'Пожалуйста, введите тему сообщения'; + $lang->msg_content_is_null = 'Пожалуйста, введите содержание'; + $lang->msg_allow_message_to_friend = "Сообщение не отправлено, поскольку являетесь пользователем, имеющим право посылать сообщения только друзьям"; + $lang->msg_disallow_message = 'Сообщение не отправлено, поскольку получатель запретил прием сообщений'; + $lang->about_allow_message = 'Вы можете установить режим принятия сообщений'; +?> diff --git a/modules/communication/lang/tr.lang.php b/modules/communication/lang/tr.lang.php index 62607e379..f8c326cbe 100644 --- a/modules/communication/lang/tr.lang.php +++ b/modules/communication/lang/tr.lang.php @@ -1,48 +1,48 @@ -communication = 'İletişim'; - $lang->about_communication = 'İletişim modülü; üyelerin, mesajlaşması ve arkadaşlarıyla iletişimleri için kullanılan modüldür.'; - - $lang->allow_message = 'Receive Messages'; - $lang->allow_message_type = array( - 'Y' => 'Hepsini Al', - 'N' => 'Hepsini Geri Çevir', - 'F' => 'Sadece Arkadaşlar', - ); - - $lang->message_box = array( - 'R' => 'Gelen', - 'S' => 'Gönderilmiş', - 'T' => 'PostaKutusu', - ); - $lang->readed_date = "Okuma Tarihi"; - - $lang->sender = 'Gönderen'; - $lang->receiver = 'Alıcı'; - $lang->friend_group = 'Arkadaş Grubu'; - $lang->default_friend_group = 'Atanmamış Grup'; - - $lang->cmd_send_message = 'Mesaj Gönder'; - $lang->cmd_reply_message = 'Mesajı Yanıtla'; - $lang->cmd_view_friend = 'Arkadaşlar'; - $lang->cmd_add_friend = 'Arkadaş Ekle'; - $lang->cmd_view_message_box = 'Mesaj Kutusu'; - $lang->cmd_store = "Kaydet"; - $lang->cmd_add_friend_group = 'Arkadaş Grubu Ekle'; - $lang->cmd_rename_friend_group = 'Arkadaş Grubu İsmini Düzenle'; - - $lang->msg_no_message = 'Mesaj yok'; - $lang->message_received = 'Yeni bir mesajınız var'; - - $lang->msg_title_is_null = 'Lütfen mesaj başlığı giriniz'; - $lang->msg_content_is_null = 'Lütfen içeriği giriniz'; - $lang->msg_allow_message_to_friend = "Alıcı yalnızca arkadaşlarından gelen mesajları kabul ettiği için mesaj gönderilemedi"; - $lang->msg_disallow_message = 'Alıcı mesaj alımını kapattığı için mesaj gönderilemedi'; - - $lang->about_allow_message = 'Mesaj alımını belirleyebilirsiniz'; -?> +communication = 'İletişim'; + $lang->about_communication = 'İletişim modülü; üyelerin, mesajlaşması ve arkadaşlarıyla iletişimleri için kullanılan modüldür.'; + + $lang->allow_message = 'Receive Messages'; + $lang->allow_message_type = array( + 'Y' => 'Hepsini Al', + 'N' => 'Hepsini Geri Çevir', + 'F' => 'Sadece Arkadaşlar', + ); + + $lang->message_box = array( + 'R' => 'Gelen', + 'S' => 'Gönderilmiş', + 'T' => 'PostaKutusu', + ); + $lang->readed_date = "Okuma Tarihi"; + + $lang->sender = 'Gönderen'; + $lang->receiver = 'Alıcı'; + $lang->friend_group = 'Arkadaş Grubu'; + $lang->default_friend_group = 'Atanmamış Grup'; + + $lang->cmd_send_message = 'Mesaj Gönder'; + $lang->cmd_reply_message = 'Mesajı Yanıtla'; + $lang->cmd_view_friend = 'Arkadaşlar'; + $lang->cmd_add_friend = 'Arkadaş Ekle'; + $lang->cmd_view_message_box = 'Mesaj Kutusu'; + $lang->cmd_store = "Kaydet"; + $lang->cmd_add_friend_group = 'Arkadaş Grubu Ekle'; + $lang->cmd_rename_friend_group = 'Arkadaş Grubu İsmini Düzenle'; + + $lang->msg_no_message = 'Mesaj yok'; + $lang->message_received = 'Yeni bir mesajınız var'; + + $lang->msg_title_is_null = 'Lütfen mesaj başlığı giriniz'; + $lang->msg_content_is_null = 'Lütfen içeriği giriniz'; + $lang->msg_allow_message_to_friend = "Alıcı yalnızca arkadaşlarından gelen mesajları kabul ettiği için mesaj gönderilemedi"; + $lang->msg_disallow_message = 'Alıcı mesaj alımını kapattığı için mesaj gönderilemedi'; + + $lang->about_allow_message = 'Mesaj alımını belirleyebilirsiniz'; +?> diff --git a/modules/communication/lang/vi.lang.php b/modules/communication/lang/vi.lang.php index ef9514c86..3365acc03 100644 --- a/modules/communication/lang/vi.lang.php +++ b/modules/communication/lang/vi.lang.php @@ -1,50 +1,50 @@ -communication = 'Thông báo'; - $lang->about_communication = 'Module này thực hiện chức năng giao tiếp, tin nhắn hay bạn bè.'; - - $lang->allow_message = 'Nhận tin nhắn'; - $lang->allow_message_type = array( - 'Y' => 'Nhận tất cả', - 'N' => 'Từ chối tất cả', - 'F' => 'Chỉ bạn bè', - ); - - $lang->message_box = array( - 'R' => 'Đã nhận', - 'S' => 'Gửi', - 'T' => 'Hòm thư', - ); - $lang->readed_date = "Ngày đọc"; - - $lang->sender = 'Người gửi'; - $lang->receiver = 'Người nhận'; - $lang->friend_group = 'Nhóm bạn'; - $lang->default_friend_group = 'Nhóm mặc định'; - - $lang->cmd_send_message = 'Gửi tin nhắn'; - $lang->cmd_reply_message = 'Trả lời tin nhắn'; - $lang->cmd_view_friend = 'Bạn bè'; - $lang->cmd_add_friend = 'Thêm bạn'; - $lang->cmd_view_message_box = 'Hộp tin nhắn'; - $lang->cmd_store = "Lưu"; - $lang->cmd_add_friend_group = 'Thêm nhóm bạn'; - $lang->cmd_rename_friend_group = 'Sử tên nhóm'; - - $lang->msg_no_message = 'Không có tin nhắn nào.'; - $lang->message_received = 'Bạn có tin nhắn mới.'; - - $lang->msg_title_is_null = 'Xin vui lòng nhập tiêu đề của tin nhắn.'; - $lang->msg_content_is_null = 'Xin vui lòng nhập nội dung.'; - $lang->msg_allow_message_to_friend = "Không thể gửi vì người nhận chỉ chấp nhận những tin nhắn từ bạn bè của họ."; - $lang->msg_disallow_message = 'Không thể gửi vì người nhận đã từ chối nhận tin nhắn.'; - - $lang->about_allow_message = 'Bạn có thể đồng ý nhận tin nhắn.'; -?> +communication = 'Thông báo'; + $lang->about_communication = 'Module này thực hiện chức năng giao tiếp, tin nhắn hay bạn bè.'; + + $lang->allow_message = 'Nhận tin nhắn'; + $lang->allow_message_type = array( + 'Y' => 'Nhận tất cả', + 'N' => 'Từ chối tất cả', + 'F' => 'Chỉ bạn bè', + ); + + $lang->message_box = array( + 'R' => 'Đã nhận', + 'S' => 'Gửi', + 'T' => 'Hòm thư', + ); + $lang->readed_date = "Ngày đọc"; + + $lang->sender = 'Người gửi'; + $lang->receiver = 'Người nhận'; + $lang->friend_group = 'Nhóm bạn'; + $lang->default_friend_group = 'Nhóm mặc định'; + + $lang->cmd_send_message = 'Gửi tin nhắn'; + $lang->cmd_reply_message = 'Trả lời tin nhắn'; + $lang->cmd_view_friend = 'Bạn bè'; + $lang->cmd_add_friend = 'Thêm bạn'; + $lang->cmd_view_message_box = 'Hộp tin nhắn'; + $lang->cmd_store = "Lưu"; + $lang->cmd_add_friend_group = 'Thêm nhóm bạn'; + $lang->cmd_rename_friend_group = 'Sử tên nhóm'; + + $lang->msg_no_message = 'Không có tin nhắn nào.'; + $lang->message_received = 'Bạn có tin nhắn mới.'; + + $lang->msg_title_is_null = 'Xin vui lòng nhập tiêu đề của tin nhắn.'; + $lang->msg_content_is_null = 'Xin vui lòng nhập nội dung.'; + $lang->msg_allow_message_to_friend = "Không thể gửi vì người nhận chỉ chấp nhận những tin nhắn từ bạn bè của họ."; + $lang->msg_disallow_message = 'Không thể gửi vì người nhận đã từ chối nhận tin nhắn.'; + + $lang->about_allow_message = 'Bạn có thể đồng ý nhận tin nhắn.'; +?> diff --git a/modules/communication/lang/zh-CN.lang.php b/modules/communication/lang/zh-CN.lang.php index e587513eb..dbe9476c0 100644 --- a/modules/communication/lang/zh-CN.lang.php +++ b/modules/communication/lang/zh-CN.lang.php @@ -1,49 +1,49 @@ -communication = '会员交流'; - $lang->about_communication = '管理在线会员间短信息及好友功能的模块。'; - - $lang->allow_message = '接收短消息'; - $lang->allow_message_type = array( - 'Y' => '全部接收', - 'N' => '拒收', - 'F' => '只允许好友', - ); - - $lang->message_box = array( - 'R' => '收件箱', - 'S' => '发件箱', - 'T' => '保管箱', - ); - - $lang->readed_date = "阅读日期"; - - $lang->sender = '寄件人'; - $lang->receiver = '收件人'; - $lang->friend_group = '好友组'; - $lang->default_friend_group = '组未指定'; - - $lang->cmd_send_message = '发送短消息'; - $lang->cmd_reply_message = '回复短消息'; - $lang->cmd_view_friend = '我的好友'; - $lang->cmd_add_friend = '加为好友'; - $lang->cmd_view_message_box = '短信箱'; - $lang->cmd_store = "保管"; - $lang->cmd_add_friend_group = '添加好友组'; - $lang->cmd_rename_friend_group = '修改好友组名称'; - - $lang->msg_no_message = '没有短消息。'; - $lang->message_received = '您有新消息。'; - - $lang->msg_title_is_null = '请输入短消息标题。'; - $lang->msg_content_is_null = '请输入内容。'; - $lang->msg_allow_message_to_friend = '因其为只允许接收好友短消息的用户,所以不能发送短消息。'; - $lang->msg_disallow_message = '因其为拒绝接收短消息的用户,所以不能发送短消息。'; - - $lang->about_allow_message = '可以选择短消息接收与否。'; -?> +communication = '会员交流'; + $lang->about_communication = '管理在线会员间短信息及好友功能的模块。'; + + $lang->allow_message = '接收短消息'; + $lang->allow_message_type = array( + 'Y' => '全部接收', + 'N' => '拒收', + 'F' => '只允许好友', + ); + + $lang->message_box = array( + 'R' => '收件箱', + 'S' => '发件箱', + 'T' => '保管箱', + ); + + $lang->readed_date = "阅读日期"; + + $lang->sender = '寄件人'; + $lang->receiver = '收件人'; + $lang->friend_group = '好友组'; + $lang->default_friend_group = '组未指定'; + + $lang->cmd_send_message = '发送短消息'; + $lang->cmd_reply_message = '回复短消息'; + $lang->cmd_view_friend = '我的好友'; + $lang->cmd_add_friend = '加为好友'; + $lang->cmd_view_message_box = '短信箱'; + $lang->cmd_store = "保管"; + $lang->cmd_add_friend_group = '添加好友组'; + $lang->cmd_rename_friend_group = '修改好友组名称'; + + $lang->msg_no_message = '没有短消息。'; + $lang->message_received = '您有新消息。'; + + $lang->msg_title_is_null = '请输入短消息标题。'; + $lang->msg_content_is_null = '请输入内容。'; + $lang->msg_allow_message_to_friend = '因其为只允许接收好友短消息的用户,所以不能发送短消息。'; + $lang->msg_disallow_message = '因其为拒绝接收短消息的用户,所以不能发送短消息。'; + + $lang->about_allow_message = '可以选择短消息接收与否。'; +?> diff --git a/modules/communication/lang/zh-TW.lang.php b/modules/communication/lang/zh-TW.lang.php index 2b62b46c9..c8fc99469 100644 --- a/modules/communication/lang/zh-TW.lang.php +++ b/modules/communication/lang/zh-TW.lang.php @@ -1,48 +1,48 @@ -communication = '交流'; - $lang->about_communication = '管理短訊息及好友功能的模組。'; - - $lang->allow_message = '接收短訊息'; - $lang->allow_message_type = array( - 'Y' => '全部接收', - 'N' => '全部拒收', - 'F' => '只允許好友', - ); - - $lang->message_box = array( - 'R' => '收信箱', - 'S' => '寄信箱', - 'T' => '儲存箱', - ); - - $lang->readed_date = "閱讀日期"; - - $lang->sender = '寄件人'; - $lang->receiver = '收件人'; - $lang->friend_group = '好友群組'; - $lang->default_friend_group = '群組未指定'; - - $lang->cmd_send_message = '發送短訊息'; - $lang->cmd_reply_message = '回覆短訊息'; - $lang->cmd_view_friend = '檢視好友'; - $lang->cmd_add_friend = '加為好友'; - $lang->cmd_view_message_box = '檢視短訊箱'; - $lang->cmd_store = "儲存"; - $lang->cmd_add_friend_group = '新增好友群組'; - $lang->cmd_rename_friend_group = '修改好友群組名稱'; - - $lang->msg_no_message = '沒有短訊息。'; - $lang->message_received = '您有新訊息。'; - - $lang->msg_title_is_null = '請輸入短訊息標題。'; - $lang->msg_content_is_null = '請輸入內容。'; - $lang->msg_allow_message_to_friend = '只允許接收好友短訊息的用戶,不能發送短訊息。'; - $lang->msg_disallow_message = '拒絕接收短訊息的用戶,不能發送短訊息。'; - $lang->about_allow_message = '可選擇是否接收短訊息。'; -?> +communication = '交流'; + $lang->about_communication = '管理短訊息及好友功能的模組。'; + + $lang->allow_message = '接收短訊息'; + $lang->allow_message_type = array( + 'Y' => '全部接收', + 'N' => '全部拒收', + 'F' => '只允許好友', + ); + + $lang->message_box = array( + 'R' => '收信箱', + 'S' => '寄信箱', + 'T' => '儲存箱', + ); + + $lang->readed_date = "閱讀日期"; + + $lang->sender = '寄件人'; + $lang->receiver = '收件人'; + $lang->friend_group = '好友群組'; + $lang->default_friend_group = '群組未指定'; + + $lang->cmd_send_message = '發送短訊息'; + $lang->cmd_reply_message = '回覆短訊息'; + $lang->cmd_view_friend = '檢視好友'; + $lang->cmd_add_friend = '加為好友'; + $lang->cmd_view_message_box = '檢視短訊箱'; + $lang->cmd_store = "儲存"; + $lang->cmd_add_friend_group = '新增好友群組'; + $lang->cmd_rename_friend_group = '修改好友群組名稱'; + + $lang->msg_no_message = '沒有短訊息。'; + $lang->message_received = '您有新訊息。'; + + $lang->msg_title_is_null = '請輸入短訊息標題。'; + $lang->msg_content_is_null = '請輸入內容。'; + $lang->msg_allow_message_to_friend = '只允許接收好友短訊息的用戶,不能發送短訊息。'; + $lang->msg_disallow_message = '拒絕接收短訊息的用戶,不能發送短訊息。'; + $lang->about_allow_message = '可選擇是否接收短訊息。'; +?> diff --git a/modules/communication/skins/default/friends.html b/modules/communication/skins/default/friends.html index d8931181e..e00b4e7a8 100644 --- a/modules/communication/skins/default/friends.html +++ b/modules/communication/skins/default/friends.html @@ -1,86 +1,86 @@ - - - - - - -
    - -

    {$member_title = $lang->cmd_view_friend } ({$total_count})

    - -
    - -
    - - {$lang->cmd_modify} - {$lang->cmd_delete} - {$lang->cmd_add_friend_group} -
    - -
    - {$lang->cmd_move} -
    - - - - - - - - - - - - - - - - - - - -
    {$lang->friend_group}
    {$lang->nick_name}
    {$lang->regdate}
    {$val->group_title?$val->group_title:" "}{$val->nick_name}{zdate($val->regdate,"Y-m-d")}
    - - {$lang->cmd_move} - - {$lang->cmd_back} -
    - - - - - -
    - - - -
    - -
    -
    - - - + + + + + + +
    + +

    {$member_title = $lang->cmd_view_friend } ({$total_count})

    + +
    + +
    + + {$lang->cmd_modify} + {$lang->cmd_delete} + {$lang->cmd_add_friend_group} +
    + +
    + {$lang->cmd_move} +
    + + + + + + + + + + + + + + + + + + + +
    {$lang->friend_group}
    {$lang->nick_name}
    {$lang->regdate}
    {$val->group_title?$val->group_title:" "}{$val->nick_name}{zdate($val->regdate,"Y-m-d")}
    + + {$lang->cmd_move} + + {$lang->cmd_back} +
    + + + + + +
    + + + +
    + +
    +
    + + + diff --git a/modules/communication/skins/default/messages.html b/modules/communication/skins/default/messages.html index fefb2d320..b30004286 100644 --- a/modules/communication/skins/default/messages.html +++ b/modules/communication/skins/default/messages.html @@ -1,123 +1,123 @@ - - - - -
    -
    - - -
    - - -
    -

    - - -

    -
    - - - - - - - - - - - - - - - - -
    {$message->title}
    - {$message->nick_name} - {zdate($message->regdate, "Y.m.d H:i:s")} -
    -
    {$message->content}
    -
    - - {$lang->cmd_reply_message} - - - {$lang->cmd_store} - - {$lang->cmd_delete} -
    - - -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    - - {$lang->title} -
    - - {$lang->receiver} - - {$lang->sender} - -
    {$lang->regdate}
    - - - {$val->title} - - {$val->title} - - -
    {$val->nick_name}
    -
    {zdate($val->regdate,"Y-m-d")}
    -
    {zdate($val->readed_date,"Y-m-d H:i:s")}
    -
    - -
    - -
    - - - -
    - - + + + + +
    +
    + + +
    + + +
    +

    + + +

    +
    + + + + + + + + + + + + + + + + +
    {$message->title}
    + {$message->nick_name} + {zdate($message->regdate, "Y.m.d H:i:s")} +
    +
    {$message->content}
    +
    + + {$lang->cmd_reply_message} + + + {$lang->cmd_store} + + {$lang->cmd_delete} +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + + {$lang->title} +
    + + {$lang->receiver} + + {$lang->sender} + +
    {$lang->regdate}
    + + + {$val->title} + + {$val->title} + + +
    {$val->nick_name}
    +
    {zdate($val->regdate,"Y-m-d")}
    +
    {zdate($val->readed_date,"Y-m-d H:i:s")}
    +
    + +
    + +
    + + + +
    + + diff --git a/modules/communication/skins/default/skin.xml b/modules/communication/skins/default/skin.xml index ed3560255..14c240e70 100644 --- a/modules/communication/skins/default/skin.xml +++ b/modules/communication/skins/default/skin.xml @@ -1,122 +1,122 @@ - - - 기본 스킨 - 默认皮肤 - 基本スキン - Default Skin - Skin Mặc định - Por defecto piel - 기본 스킨 - 預設面板 - Varsayılan Dış Görünüm - - NHN (developers@xpressengine.com) - - - NHN (developers@xpressengine.com) - - - NHN (developers@xpressengine.com) - - - NHN (developers@xpressengine.com) - - - NHN (developers@xpressengine.com) - - - NHN (developers@xpressengine.com) - - - NHN (developers@xpressengine.com) - - - NHN (developers@xpressengine.com) - - - NHN (developers@xpressengine.com) - - 0.1 - 2008-05-28 - - - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - - - - - 기본 - 默认 - デフォルト - default - Mặc định - Por defecto - умолчанию - 預設 - varsayılan - - - 청록색 - 青緑 - 青绿色 - cyan - Cyan - Cian - бирюзовый - 青綠色 - Deniz Mavisi - - - 초록색 - - 绿色 - green - Green - Verde - зеленый - 綠色 - Yeşil - - - 빨간색 - - 红色 - red - Red - Roja - красный - 紅色 - Kırmızı - - - 보라색 - - 紫色 - purple - Purple - Púrpura - Лиловый - 紫色 - Mor - - - 검은색 - - Black - Black - Черного - Negro - 黑色 - 黑色 - Siyah - - - + + + 기본 스킨 + 默认皮肤 + 基本スキン + Default Skin + Skin Mặc định + Por defecto piel + 기본 스킨 + 預設面板 + Varsayılan Dış Görünüm + + NHN (developers@xpressengine.com) + + + NHN (developers@xpressengine.com) + + + NHN (developers@xpressengine.com) + + + NHN (developers@xpressengine.com) + + + NHN (developers@xpressengine.com) + + + NHN (developers@xpressengine.com) + + + NHN (developers@xpressengine.com) + + + NHN (developers@xpressengine.com) + + + NHN (developers@xpressengine.com) + + 0.1 + 2008-05-28 + + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + + + + 기본 + 默认 + デフォルト + default + Mặc định + Por defecto + умолчанию + 預設 + varsayılan + + + 청록색 + 青緑 + 青绿色 + cyan + Cyan + Cian + бирюзовый + 青綠色 + Deniz Mavisi + + + 초록색 + + 绿色 + green + Green + Verde + зеленый + 綠色 + Yeşil + + + 빨간색 + + 红色 + red + Red + Roja + красный + 紅色 + Kırmızı + + + 보라색 + + 紫色 + purple + Purple + Púrpura + Лиловый + 紫色 + Mor + + + 검은색 + + Black + Black + Черного + Negro + 黑色 + 黑色 + Siyah + + + diff --git a/modules/counter/conf/info.xml b/modules/counter/conf/info.xml index c3c3c2529..2b610bf04 100644 --- a/modules/counter/conf/info.xml +++ b/modules/counter/conf/info.xml @@ -1,36 +1,36 @@ - - - 접속통계 - 访问统计 - Counter - Counter - Contador - アクセスカウンター - Базовый счетчик - 基本統計 - Sayaç - 기본 접속 통계 프로그램입니다. - 默认访问统计程序。 - Basic connection statistics program. - Chương trình thống kê kết nối cơ bản. - Programa básico para la estadística de la conección. - デフォルトアクセス統計のプログラムです。 - Базовая программа статистики подключений. - 預設的統計程式。 - Temel bağlantı istatistik programı. - 0.1 - 2007-02-28 - statistics - - - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - - + + + 접속통계 + 访问统计 + Counter + Counter + Contador + アクセスカウンター + Базовый счетчик + 基本統計 + Sayaç + 기본 접속 통계 프로그램입니다. + 默认访问统计程序。 + Basic connection statistics program. + Chương trình thống kê kết nối cơ bản. + Programa básico para la estadística de la conección. + デフォルトアクセス統計のプログラムです。 + Базовая программа статистики подключений. + 預設的統計程式。 + Temel bağlantı istatistik programı. + 0.1 + 2007-02-28 + statistics + + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + diff --git a/modules/counter/counter.admin.view.php b/modules/counter/counter.admin.view.php index 8ef40d49e..92851917c 100644 --- a/modules/counter/counter.admin.view.php +++ b/modules/counter/counter.admin.view.php @@ -1,50 +1,50 @@ -setTemplatePath($this->module_path.'tpl'); - } - - /** - * @brief 관리자 페이지 초기화면 - **/ - function dispCounterAdminIndex() { - // 정해진 일자가 없으면 오늘자로 설정 - $selected_date = Context::get('selected_date'); - if(!$selected_date) $selected_date = date("Ymd"); - Context::set('selected_date', $selected_date); - - // counter model 객체 생성 - $oCounterModel = &getModel('counter'); - - // 전체 카운터 및 지정된 일자의 현황 가져오기 - $site_module_info = Context::get('site_module_info'); - $status = $oCounterModel->getStatus(array(0,$selected_date),$site_module_info->site_srl); - Context::set('total_counter', $status[0]); - Context::set('selected_day_counter', $status[$selected_date]); - - // 시간, 일, 월, 년도별로 데이터 가져오기 - $type = Context::get('type'); - if(!$type) { - $type = 'day'; - Context::set('type',$type); - } - $detail_status = $oCounterModel->getHourlyStatus($type, $selected_date, $site_module_info->site_srl); - Context::set('detail_status', $detail_status); - - // 표시 - $this->setTemplateFile('index'); - } - - } -?> +setTemplatePath($this->module_path.'tpl'); + } + + /** + * @brief 관리자 페이지 초기화면 + **/ + function dispCounterAdminIndex() { + // 정해진 일자가 없으면 오늘자로 설정 + $selected_date = Context::get('selected_date'); + if(!$selected_date) $selected_date = date("Ymd"); + Context::set('selected_date', $selected_date); + + // counter model 객체 생성 + $oCounterModel = &getModel('counter'); + + // 전체 카운터 및 지정된 일자의 현황 가져오기 + $site_module_info = Context::get('site_module_info'); + $status = $oCounterModel->getStatus(array(0,$selected_date),$site_module_info->site_srl); + Context::set('total_counter', $status[0]); + Context::set('selected_day_counter', $status[$selected_date]); + + // 시간, 일, 월, 년도별로 데이터 가져오기 + $type = Context::get('type'); + if(!$type) { + $type = 'day'; + Context::set('type',$type); + } + $detail_status = $oCounterModel->getHourlyStatus($type, $selected_date, $site_module_info->site_srl); + Context::set('detail_status', $detail_status); + + // 표시 + $this->setTemplateFile('index'); + } + + } +?> diff --git a/modules/counter/counter.class.php b/modules/counter/counter.class.php index a6f9a9b72..39bbe0c95 100644 --- a/modules/counter/counter.class.php +++ b/modules/counter/counter.class.php @@ -1,55 +1,55 @@ -insertTotalStatus(); - - // 오늘자 row입력 - //$oCounterController->insertTodayStatus(); - - return new Object(); - } - - /** - * @brief 설치가 이상이 없는지 체크하는 method - **/ - function checkUpdate() { - // 카운터에 site_srl추가 - $oDB = &DB::getInstance(); - if(!$oDB->isColumnExists('counter_log', 'site_srl')) return true; - if(!$oDB->isIndexExists('counter_log','idx_site_counter_log')) return true; - - return false; - } - - /** - * @brief 업데이트 실행 - **/ - function moduleUpdate() { - // 카운터에 site_srl추가 - $oDB = &DB::getInstance(); - if(!$oDB->isColumnExists('counter_log', 'site_srl')) $oDB->addColumn('counter_log','site_srl','number',11,0,true); - if(!$oDB->isIndexExists('counter_log','idx_site_counter_log')) $oDB->addIndex('counter_log','idx_site_counter_log',array('site_srl','ipaddress'),false); - - return new Object(0, 'success_updated'); - } - - /** - * @brief 캐시 파일 재생성 - **/ - function recompileCache() { - } - } -?> +insertTotalStatus(); + + // 오늘자 row입력 + //$oCounterController->insertTodayStatus(); + + return new Object(); + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + **/ + function checkUpdate() { + // 카운터에 site_srl추가 + $oDB = &DB::getInstance(); + if(!$oDB->isColumnExists('counter_log', 'site_srl')) return true; + if(!$oDB->isIndexExists('counter_log','idx_site_counter_log')) return true; + + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + // 카운터에 site_srl추가 + $oDB = &DB::getInstance(); + if(!$oDB->isColumnExists('counter_log', 'site_srl')) $oDB->addColumn('counter_log','site_srl','number',11,0,true); + if(!$oDB->isIndexExists('counter_log','idx_site_counter_log')) $oDB->addIndex('counter_log','idx_site_counter_log',array('site_srl','ipaddress'),false); + + return new Object(0, 'success_updated'); + } + + /** + * @brief 캐시 파일 재생성 + **/ + function recompileCache() { + } + } +?> diff --git a/modules/counter/counter.controller.php b/modules/counter/counter.controller.php index 19708a8a6..cb013787e 100644 --- a/modules/counter/counter.controller.php +++ b/modules/counter/counter.controller.php @@ -1,145 +1,145 @@ -begin(); - - $site_module_info = Context::get('site_module_info'); - $site_srl = (int)$site_module_info->site_srl; - - // 로그를 검사 - $oCounterModel = &getModel('counter'); - - // 오늘자 row가 있는지 체크하여 없으면 등록 - if(!$oCounterModel->isInsertedTodayStatus($site_srl)) { - $this->insertTodayStatus(0,$site_srl); - - // 기존 row가 있으면 사용자 체크 - } else { - - // 등록되어 있지 않은 아이피일 경우 - if(!$oCounterModel->isLogged($site_srl)) { - // 로그 등록 - $this->insertLog($site_srl); - - // unique 및 pageview 등록 - $this->insertUniqueVisitor($site_srl); - } else { - // pageview 등록 - $this->insertPageView($site_srl); - } - } - - $oDB->commit(); - } - - /** - * @brief 로그 등록 - **/ - function insertLog($site_srl=0) { - $args->regdate = date("YmdHis"); - $args->user_agent = substr ($_SERVER['HTTP_USER_AGENT'], 0, 250); - $args->site_srl = $site_srl; - return executeQuery('counter.insertCounterLog', $args); - } - - /** - * @brief unique visitor 등록 - **/ - function insertUniqueVisitor($site_srl=0) { - if($site_srl) { - $args->regdate = '0'; - $args->site_srl = $site_srl; - $output = executeQuery('counter.updateSiteCounterUnique', $args); - $args->regdate = date('Ymd'); - $output = executeQuery('counter.updateSiteCounterUnique', $args); - } else { - $args->regdate = '0'; - $output = executeQuery('counter.updateCounterUnique', $args); - $args->regdate = date('Ymd'); - $output = executeQuery('counter.updateCounterUnique', $args); - } - } - - /** - * @brief pageview 등록 - **/ - function insertPageView($site_srl=0) { - if($site_srl) { - $args->regdate = '0'; - $args->site_srl = $site_srl; - executeQuery('counter.updateSiteCounterPageview', $args); - $args->regdate = date('Ymd'); - executeQuery('counter.updateSiteCounterPageview', $args); - } else { - $args->regdate = '0'; - executeQuery('counter.updateCounterPageview', $args); - $args->regdate = date('Ymd'); - executeQuery('counter.updateCounterPageview', $args); - } - } - - /** - * @brief 전체 카운터 status 추가 - **/ - function insertTotalStatus($site_srl=0) { - $args->regdate = 0; - if($site_srl) { - $args->site_srl = $site_srl; - executeQuery('counter.insertSiteTodayStatus', $args); - } else { - executeQuery('counter.insertTodayStatus', $args); - } - } - - /** - * @brief 오늘자 카운터 status 추가 - **/ - function insertTodayStatus($regdate = 0, $site_srl=0) { - if($regdate) $args->regdate = $regdate; - else $args->regdate = date("Ymd"); - if($site_srl) { - $args->site_srl = $site_srl; - $query_id = 'counter.insertSiteTodayStatus'; - - $u_args->site_srl = $site_srl; ///< 일별 row입력시 전체 row (regdate=0)도 같이 입력 시도 - executeQuery($query_id, $u_args); - } else { - $query_id = 'counter.insertTodayStatus'; - executeQuery($query_id); ///< 일별 row입력시 전체 row (regdate=0)도 같이 입력 시도 - } - $output = executeQuery($query_id, $args); - - // 로그 등록 - $this->insertLog($site_srl); - - // unique 및 pageview 등록 - $this->insertUniqueVisitor($site_srl); - } - - /** - * @brief 특정 가상 사이트의 카운터 로그 삭제 - **/ - function deleteSiteCounterLogs($site_srl) { - $args->site_srl = $site_srl; - executeQuery('counter.deleteSiteCounter',$args); - executeQuery('counter.deleteSiteCounterLog',$args); - } - } -?> +begin(); + + $site_module_info = Context::get('site_module_info'); + $site_srl = (int)$site_module_info->site_srl; + + // 로그를 검사 + $oCounterModel = &getModel('counter'); + + // 오늘자 row가 있는지 체크하여 없으면 등록 + if(!$oCounterModel->isInsertedTodayStatus($site_srl)) { + $this->insertTodayStatus(0,$site_srl); + + // 기존 row가 있으면 사용자 체크 + } else { + + // 등록되어 있지 않은 아이피일 경우 + if(!$oCounterModel->isLogged($site_srl)) { + // 로그 등록 + $this->insertLog($site_srl); + + // unique 및 pageview 등록 + $this->insertUniqueVisitor($site_srl); + } else { + // pageview 등록 + $this->insertPageView($site_srl); + } + } + + $oDB->commit(); + } + + /** + * @brief 로그 등록 + **/ + function insertLog($site_srl=0) { + $args->regdate = date("YmdHis"); + $args->user_agent = substr ($_SERVER['HTTP_USER_AGENT'], 0, 250); + $args->site_srl = $site_srl; + return executeQuery('counter.insertCounterLog', $args); + } + + /** + * @brief unique visitor 등록 + **/ + function insertUniqueVisitor($site_srl=0) { + if($site_srl) { + $args->regdate = '0'; + $args->site_srl = $site_srl; + $output = executeQuery('counter.updateSiteCounterUnique', $args); + $args->regdate = date('Ymd'); + $output = executeQuery('counter.updateSiteCounterUnique', $args); + } else { + $args->regdate = '0'; + $output = executeQuery('counter.updateCounterUnique', $args); + $args->regdate = date('Ymd'); + $output = executeQuery('counter.updateCounterUnique', $args); + } + } + + /** + * @brief pageview 등록 + **/ + function insertPageView($site_srl=0) { + if($site_srl) { + $args->regdate = '0'; + $args->site_srl = $site_srl; + executeQuery('counter.updateSiteCounterPageview', $args); + $args->regdate = date('Ymd'); + executeQuery('counter.updateSiteCounterPageview', $args); + } else { + $args->regdate = '0'; + executeQuery('counter.updateCounterPageview', $args); + $args->regdate = date('Ymd'); + executeQuery('counter.updateCounterPageview', $args); + } + } + + /** + * @brief 전체 카운터 status 추가 + **/ + function insertTotalStatus($site_srl=0) { + $args->regdate = 0; + if($site_srl) { + $args->site_srl = $site_srl; + executeQuery('counter.insertSiteTodayStatus', $args); + } else { + executeQuery('counter.insertTodayStatus', $args); + } + } + + /** + * @brief 오늘자 카운터 status 추가 + **/ + function insertTodayStatus($regdate = 0, $site_srl=0) { + if($regdate) $args->regdate = $regdate; + else $args->regdate = date("Ymd"); + if($site_srl) { + $args->site_srl = $site_srl; + $query_id = 'counter.insertSiteTodayStatus'; + + $u_args->site_srl = $site_srl; ///< 일별 row입력시 전체 row (regdate=0)도 같이 입력 시도 + executeQuery($query_id, $u_args); + } else { + $query_id = 'counter.insertTodayStatus'; + executeQuery($query_id); ///< 일별 row입력시 전체 row (regdate=0)도 같이 입력 시도 + } + $output = executeQuery($query_id, $args); + + // 로그 등록 + $this->insertLog($site_srl); + + // unique 및 pageview 등록 + $this->insertUniqueVisitor($site_srl); + } + + /** + * @brief 특정 가상 사이트의 카운터 로그 삭제 + **/ + function deleteSiteCounterLogs($site_srl) { + $args->site_srl = $site_srl; + executeQuery('counter.deleteSiteCounter',$args); + executeQuery('counter.deleteSiteCounterLog',$args); + } + } +?> diff --git a/modules/counter/counter.model.php b/modules/counter/counter.model.php index bcdc3a7ac..7d137c32c 100644 --- a/modules/counter/counter.model.php +++ b/modules/counter/counter.model.php @@ -1,201 +1,201 @@ -regdate = date("Ymd"); - $args->ipaddress = $_SERVER['REMOTE_ADDR']; - $args->site_srl = $site_srl; - $output = executeQuery('counter.getCounterLog', $args); - return $output->data->count?true:false; - } - - /** - * @brief 오늘자 카운터 현황 row 있는지 체크 - **/ - function isInsertedTodayStatus($site_srl=0) { - $args->regdate = date("Ymd"); - if($site_srl) { - $args->site_srl = $site_srl; - $output = executeQuery('counter.getSiteTodayStatus', $args); - } else { - $output = executeQuery('counter.getTodayStatus', $args); - } - return $output->data->count?true:false; - } - - /** - * @brief 특정 일의 접속 통계를 가져옴 - **/ - function getStatus($selected_date, $site_srl=0) { - // 여러개의 날짜 로그를 가져올 경우 - if(is_array($selected_date)) { - $date_count = count($selected_date); - $args->regdate = implode(',',$selected_date); - - // 단일 날짜의 로그를 가져올 경우 - } else { - if(strlen($selected_date)==8) $selected_date = $selected_date; - $args->regdate = $selected_date; - } - - if($site_srl) { - $args->site_srl = $site_srl; - $output = executeQuery('counter.getSiteCounterStatusDays', $args); - } else { - $output = executeQuery('counter.getCounterStatusDays', $args); - } - $status = $output->data; - - if(!is_array($selected_date)) return $status; - - if(!is_array($status)) $status = array($status); - unset($output); - - foreach($status as $key => $val) { - $output[substr($val->regdate,0,8)] = $val; - } - return $output; - } - - /** - * @brief 지정된 일자의 시간대별 로그 가져오기 - **/ - function getHourlyStatus($type='hour', $selected_date, $site_srl=0) { - $max = 0; - $sum = 0; - switch($type) { - case 'year' : - // 카운터 시작일 구함 - if($site_srl) { - $args->site_srl = $site_srl; - $output = executeQuery('counter.getSiteStartLogDate', $args); - } else { - $output = executeQuery('counter.getStartLogDate'); - } - $start_year = substr($output->data->regdate,0,4); - if(!$start_year) $start_year = date("Y"); - for($i=$start_year;$i<=date("Y");$i++) { - unset($args); - $args->start_date = sprintf('%04d0000', $i); - $args->end_date = sprintf('%04d1231', $i); - if($site_srl) { - $args->site_srl = $site_srl; - $output = executeQuery('counter.getSiteCounterStatus', $args); - } else { - $output = executeQuery('counter.getCounterStatus', $args); - } - $count = (int)$output->data->unique_visitor; - $status->list[$i] = $count; - if($count>$max) $max = $count; - $sum += $count; - } - break; - case 'week' : - $time = strtotime($selected_date); - $w = date("D"); - while(date("D",$time) != "Sun") { - $time += 60*60*24; - } - $time -= 60*60*24; - while(date("D",$time)!="Sun") { - $thisWeek[] = date("Ymd",$time); - $time -= 60*60*24; - } - $thisWeek[] = date("Ymd",$time); - asort($thisWeek); - foreach($thisWeek as $day) { - unset($args); - $args->start_date = $day; - $args->end_date = $day; - if($site_srl) { - $args->site_srl = $site_srl; - $output = executeQuery('counter.getSiteCounterStatus', $args); - } else { - $output = executeQuery('counter.getCounterStatus', $args); - } - $count = (int)$output->data->unique_visitor; - $status->list[$day] = (int)$count; - if($count>$max) $max = $count; - $sum += $count; - } - break; - case 'month' : - $year = substr($selected_date, 0, 4); - for($i=1;$i<=12;$i++) { - unset($args); - $args->start_date = sprintf('%04d%02d00', $year, $i); - $args->end_date = sprintf('%04d%02d31', $year, $i); - if($site_srl) { - $args->site_srl = $site_srl; - $output = executeQuery('counter.getSiteCounterStatus', $args); - } else { - $output = executeQuery('counter.getCounterStatus', $args); - } - $count = (int)$output->data->unique_visitor; - $status->list[$i] = (int)$count; - if($count>$max) $max = $count; - $sum += $count; - } - break; - case 'hour' : - for($i=0;$i<24;$i++) { - unset($args); - $args->start_date = sprintf('%08d%02d0000', $selected_date, $i); - $args->end_date = sprintf('%08d%02d5959', $selected_date, $i); - if($site_srl) { - $args->site_srl = $site_srl; - $output = executeQuery('counter.getSiteCounterLogStatus', $args); - } else { - $args->site_srl = 0; - $output = executeQuery('counter.getCounterLogStatus', $args); - } - $count = (int)$output->data->count; - $status->list[$i] = $count; - if($count>$max) $max = $count; - $sum += $count; - } - break; - default : - $year = substr($selected_date, 0, 4); - $month = substr($selected_date, 4, 2); - $end_day = date('t', mktime(0,0,0,$month,1,$year)); - for($i=1;$i<=$end_day;$i++) { - unset($args); - $args->start_date = sprintf('%04d%02d%02d', $year, $month, $i); - $args->end_date = sprintf('%04d%02d%02d', $year, $month, $i); - if($site_srl) { - $args->site_srl = $site_srl; - $output = executeQuery('counter.getSiteCounterStatus', $args); - } else { - $output = executeQuery('counter.getCounterStatus', $args); - } - $count = (int)$output->data->unique_visitor; - $status->list[$i] = $count; - if($count>$max) $max = $count; - $sum += $count; - } - break; - } - - $status->max = $max; - $status->sum = $sum; - return $status; - } - - } -?> +regdate = date("Ymd"); + $args->ipaddress = $_SERVER['REMOTE_ADDR']; + $args->site_srl = $site_srl; + $output = executeQuery('counter.getCounterLog', $args); + return $output->data->count?true:false; + } + + /** + * @brief 오늘자 카운터 현황 row 있는지 체크 + **/ + function isInsertedTodayStatus($site_srl=0) { + $args->regdate = date("Ymd"); + if($site_srl) { + $args->site_srl = $site_srl; + $output = executeQuery('counter.getSiteTodayStatus', $args); + } else { + $output = executeQuery('counter.getTodayStatus', $args); + } + return $output->data->count?true:false; + } + + /** + * @brief 특정 일의 접속 통계를 가져옴 + **/ + function getStatus($selected_date, $site_srl=0) { + // 여러개의 날짜 로그를 가져올 경우 + if(is_array($selected_date)) { + $date_count = count($selected_date); + $args->regdate = implode(',',$selected_date); + + // 단일 날짜의 로그를 가져올 경우 + } else { + if(strlen($selected_date)==8) $selected_date = $selected_date; + $args->regdate = $selected_date; + } + + if($site_srl) { + $args->site_srl = $site_srl; + $output = executeQuery('counter.getSiteCounterStatusDays', $args); + } else { + $output = executeQuery('counter.getCounterStatusDays', $args); + } + $status = $output->data; + + if(!is_array($selected_date)) return $status; + + if(!is_array($status)) $status = array($status); + unset($output); + + foreach($status as $key => $val) { + $output[substr($val->regdate,0,8)] = $val; + } + return $output; + } + + /** + * @brief 지정된 일자의 시간대별 로그 가져오기 + **/ + function getHourlyStatus($type='hour', $selected_date, $site_srl=0) { + $max = 0; + $sum = 0; + switch($type) { + case 'year' : + // 카운터 시작일 구함 + if($site_srl) { + $args->site_srl = $site_srl; + $output = executeQuery('counter.getSiteStartLogDate', $args); + } else { + $output = executeQuery('counter.getStartLogDate'); + } + $start_year = substr($output->data->regdate,0,4); + if(!$start_year) $start_year = date("Y"); + for($i=$start_year;$i<=date("Y");$i++) { + unset($args); + $args->start_date = sprintf('%04d0000', $i); + $args->end_date = sprintf('%04d1231', $i); + if($site_srl) { + $args->site_srl = $site_srl; + $output = executeQuery('counter.getSiteCounterStatus', $args); + } else { + $output = executeQuery('counter.getCounterStatus', $args); + } + $count = (int)$output->data->unique_visitor; + $status->list[$i] = $count; + if($count>$max) $max = $count; + $sum += $count; + } + break; + case 'week' : + $time = strtotime($selected_date); + $w = date("D"); + while(date("D",$time) != "Sun") { + $time += 60*60*24; + } + $time -= 60*60*24; + while(date("D",$time)!="Sun") { + $thisWeek[] = date("Ymd",$time); + $time -= 60*60*24; + } + $thisWeek[] = date("Ymd",$time); + asort($thisWeek); + foreach($thisWeek as $day) { + unset($args); + $args->start_date = $day; + $args->end_date = $day; + if($site_srl) { + $args->site_srl = $site_srl; + $output = executeQuery('counter.getSiteCounterStatus', $args); + } else { + $output = executeQuery('counter.getCounterStatus', $args); + } + $count = (int)$output->data->unique_visitor; + $status->list[$day] = (int)$count; + if($count>$max) $max = $count; + $sum += $count; + } + break; + case 'month' : + $year = substr($selected_date, 0, 4); + for($i=1;$i<=12;$i++) { + unset($args); + $args->start_date = sprintf('%04d%02d00', $year, $i); + $args->end_date = sprintf('%04d%02d31', $year, $i); + if($site_srl) { + $args->site_srl = $site_srl; + $output = executeQuery('counter.getSiteCounterStatus', $args); + } else { + $output = executeQuery('counter.getCounterStatus', $args); + } + $count = (int)$output->data->unique_visitor; + $status->list[$i] = (int)$count; + if($count>$max) $max = $count; + $sum += $count; + } + break; + case 'hour' : + for($i=0;$i<24;$i++) { + unset($args); + $args->start_date = sprintf('%08d%02d0000', $selected_date, $i); + $args->end_date = sprintf('%08d%02d5959', $selected_date, $i); + if($site_srl) { + $args->site_srl = $site_srl; + $output = executeQuery('counter.getSiteCounterLogStatus', $args); + } else { + $args->site_srl = 0; + $output = executeQuery('counter.getCounterLogStatus', $args); + } + $count = (int)$output->data->count; + $status->list[$i] = $count; + if($count>$max) $max = $count; + $sum += $count; + } + break; + default : + $year = substr($selected_date, 0, 4); + $month = substr($selected_date, 4, 2); + $end_day = date('t', mktime(0,0,0,$month,1,$year)); + for($i=1;$i<=$end_day;$i++) { + unset($args); + $args->start_date = sprintf('%04d%02d%02d', $year, $month, $i); + $args->end_date = sprintf('%04d%02d%02d', $year, $month, $i); + if($site_srl) { + $args->site_srl = $site_srl; + $output = executeQuery('counter.getSiteCounterStatus', $args); + } else { + $output = executeQuery('counter.getCounterStatus', $args); + } + $count = (int)$output->data->unique_visitor; + $status->list[$i] = $count; + if($count>$max) $max = $count; + $sum += $count; + } + break; + } + + $status->max = $max; + $status->sum = $sum; + return $status; + } + + } +?> diff --git a/modules/counter/lang/en.lang.php b/modules/counter/lang/en.lang.php index be9fe5756..0b07aca29 100644 --- a/modules/counter/lang/en.lang.php +++ b/modules/counter/lang/en.lang.php @@ -1,25 +1,25 @@ -counter = "Counter"; - $lang->cmd_select_date = 'Select Date'; - $lang->cmd_select_counter_type = array( - 'hour' => 'By Hour', - 'day' => 'By Day', - 'month' => 'By Month', - 'year' => 'By Year', - ); - - $lang->total_counter = 'Total Status'; - $lang->selected_day_counter = 'Status of Selected Day'; - - $lang->unique_visitor = 'Visitors'; - $lang->pageview = 'Pageview'; - - $lang->today = 'today'; - $lang->yesterday = 'yesterday'; -?> +counter = "Counter"; + $lang->cmd_select_date = 'Select Date'; + $lang->cmd_select_counter_type = array( + 'hour' => 'By Hour', + 'day' => 'By Day', + 'month' => 'By Month', + 'year' => 'By Year', + ); + + $lang->total_counter = 'Total Status'; + $lang->selected_day_counter = 'Status of Selected Day'; + + $lang->unique_visitor = 'Visitors'; + $lang->pageview = 'Pageview'; + + $lang->today = 'today'; + $lang->yesterday = 'yesterday'; +?> diff --git a/modules/counter/lang/es.lang.php b/modules/counter/lang/es.lang.php index 9e5b3df5e..a66f2bbbb 100644 --- a/modules/counter/lang/es.lang.php +++ b/modules/counter/lang/es.lang.php @@ -1,25 +1,25 @@ -counter = "Contador"; - $lang->cmd_select_date = 'Selecciona la fecha'; - $lang->cmd_select_counter_type = array( - 'hour' => 'por hora', - 'day' => 'por día', - 'month' => 'por mes', - 'year' => 'por año', - ); - - $lang->total_counter = 'Estado actual Total'; - $lang->selected_day_counter = 'Estado actual del día seleccionado'; - - $lang->unique_visitor = 'visitante'; - $lang->pageview = 'Ver página'; - - $lang->today = 'today'; - $lang->yesterday = 'yesterday'; -?> +counter = "Contador"; + $lang->cmd_select_date = 'Selecciona la fecha'; + $lang->cmd_select_counter_type = array( + 'hour' => 'por hora', + 'day' => 'por día', + 'month' => 'por mes', + 'year' => 'por año', + ); + + $lang->total_counter = 'Estado actual Total'; + $lang->selected_day_counter = 'Estado actual del día seleccionado'; + + $lang->unique_visitor = 'visitante'; + $lang->pageview = 'Ver página'; + + $lang->today = 'today'; + $lang->yesterday = 'yesterday'; +?> diff --git a/modules/counter/lang/fr.lang.php b/modules/counter/lang/fr.lang.php index 5aad22fa2..a823bba59 100644 --- a/modules/counter/lang/fr.lang.php +++ b/modules/counter/lang/fr.lang.php @@ -1,25 +1,25 @@ - - * @brief Paquet du langage en français pour le module de Comppteur - **/ - - $lang->counter = "Coumpteur"; - $lang->cmd_select_date = 'Choisir un Jour'; - $lang->cmd_select_counter_type = array( - 'hour' => 'Par Heure', - 'day' => 'Par Jour', - 'month' => 'Par Mois', - 'year' => 'Par Année', - ); - - $lang->total_counter = 'Statut Total'; - $lang->selected_day_counter = 'Statut Journal'; - - $lang->unique_visitor = 'Visiteurs'; - $lang->pageview = 'Vues'; - - $lang->today = 'today'; - $lang->yesterday = 'yesterday'; -?> + + * @brief Paquet du langage en français pour le module de Comppteur + **/ + + $lang->counter = "Coumpteur"; + $lang->cmd_select_date = 'Choisir un Jour'; + $lang->cmd_select_counter_type = array( + 'hour' => 'Par Heure', + 'day' => 'Par Jour', + 'month' => 'Par Mois', + 'year' => 'Par Année', + ); + + $lang->total_counter = 'Statut Total'; + $lang->selected_day_counter = 'Statut Journal'; + + $lang->unique_visitor = 'Visiteurs'; + $lang->pageview = 'Vues'; + + $lang->today = 'today'; + $lang->yesterday = 'yesterday'; +?> diff --git a/modules/counter/lang/jp.lang.php b/modules/counter/lang/jp.lang.php index e0e4807b7..feb899ea7 100644 --- a/modules/counter/lang/jp.lang.php +++ b/modules/counter/lang/jp.lang.php @@ -1,25 +1,25 @@ -counter = 'カウンター'; - $lang->cmd_select_date = '日付選択'; - $lang->cmd_select_counter_type = array( - 'hour' => '時間帯別', - 'day' => '日別', - 'month' => '月別', - 'year' => '年度別', - ); - - $lang->total_counter = 'トータル'; - $lang->selected_day_counter = '選択日の情報'; - - $lang->unique_visitor = '訪問者'; - $lang->pageview = 'ページビュー'; - - $lang->today = '今日'; - $lang->yesterday = '昨日'; -?> +counter = 'カウンター'; + $lang->cmd_select_date = '日付選択'; + $lang->cmd_select_counter_type = array( + 'hour' => '時間帯別', + 'day' => '日別', + 'month' => '月別', + 'year' => '年度別', + ); + + $lang->total_counter = 'トータル'; + $lang->selected_day_counter = '選択日の情報'; + + $lang->unique_visitor = '訪問者'; + $lang->pageview = 'ページビュー'; + + $lang->today = '今日'; + $lang->yesterday = '昨日'; +?> diff --git a/modules/counter/lang/ko.lang.php b/modules/counter/lang/ko.lang.php index b8dca9adb..521900a6d 100644 --- a/modules/counter/lang/ko.lang.php +++ b/modules/counter/lang/ko.lang.php @@ -1,25 +1,25 @@ -counter = '접속 통계'; - $lang->cmd_select_date = '날짜 선택'; - $lang->cmd_select_counter_type = array( - 'hour' => '시간대별', - 'day' => '일별', - 'month' => '월별', - 'year' => '연도별', - ); - - $lang->total_counter = '전체현황'; - $lang->selected_day_counter = '선택일 현황'; - - $lang->unique_visitor = '방문자'; - $lang->pageview = '페이지뷰'; - - $lang->today = '오늘'; - $lang->yesterday = '어제'; -?> +counter = '접속 통계'; + $lang->cmd_select_date = '날짜 선택'; + $lang->cmd_select_counter_type = array( + 'hour' => '시간대별', + 'day' => '일별', + 'month' => '월별', + 'year' => '연도별', + ); + + $lang->total_counter = '전체현황'; + $lang->selected_day_counter = '선택일 현황'; + + $lang->unique_visitor = '방문자'; + $lang->pageview = '페이지뷰'; + + $lang->today = '오늘'; + $lang->yesterday = '어제'; +?> diff --git a/modules/counter/lang/ru.lang.php b/modules/counter/lang/ru.lang.php index 4bec4020b..107662ef3 100644 --- a/modules/counter/lang/ru.lang.php +++ b/modules/counter/lang/ru.lang.php @@ -1,25 +1,25 @@ -counter = "Счетчик посетителей"; - $lang->cmd_select_date = 'Выберите дату'; - $lang->cmd_select_counter_type = array( - 'hour' => 'По часам', - 'day' => 'По дням', - 'month' => 'По месяцам', - 'year' => 'По годам', - ); - - $lang->total_counter = 'Общее состояние'; - $lang->selected_day_counter = 'Состояние на выбранный день'; - - $lang->unique_visitor = 'Посетителей'; - $lang->pageview = 'Просмотров страниц'; - - $lang->today = 'Сегодня'; - $lang->yesterday = 'Вчера'; -?> +counter = "Счетчик посетителей"; + $lang->cmd_select_date = 'Выберите дату'; + $lang->cmd_select_counter_type = array( + 'hour' => 'По часам', + 'day' => 'По дням', + 'month' => 'По месяцам', + 'year' => 'По годам', + ); + + $lang->total_counter = 'Общее состояние'; + $lang->selected_day_counter = 'Состояние на выбранный день'; + + $lang->unique_visitor = 'Посетителей'; + $lang->pageview = 'Просмотров страниц'; + + $lang->today = 'Сегодня'; + $lang->yesterday = 'Вчера'; +?> diff --git a/modules/counter/lang/tr.lang.php b/modules/counter/lang/tr.lang.php index 69aa1c8aa..c22243171 100644 --- a/modules/counter/lang/tr.lang.php +++ b/modules/counter/lang/tr.lang.php @@ -1,25 +1,25 @@ -counter = "Sayaç"; - $lang->cmd_select_date = 'Tarih Seç'; - $lang->cmd_select_counter_type = array( - 'hour' => 'Saate Göre', - 'day' => 'Güne Göre', - 'month' => 'Aya Göre', - 'year' => 'Yıla Göre', - ); - - $lang->total_counter = 'Genel Durum'; - $lang->selected_day_counter = 'Seçilen Günün Durumu'; - - $lang->unique_visitor = 'Ziyaretçiler'; - $lang->pageview = 'Sayfa Gösterimi'; - - $lang->today = 'bugün'; - $lang->yesterday = 'dün'; -?> +counter = "Sayaç"; + $lang->cmd_select_date = 'Tarih Seç'; + $lang->cmd_select_counter_type = array( + 'hour' => 'Saate Göre', + 'day' => 'Güne Göre', + 'month' => 'Aya Göre', + 'year' => 'Yıla Göre', + ); + + $lang->total_counter = 'Genel Durum'; + $lang->selected_day_counter = 'Seçilen Günün Durumu'; + + $lang->unique_visitor = 'Ziyaretçiler'; + $lang->pageview = 'Sayfa Gösterimi'; + + $lang->today = 'bugün'; + $lang->yesterday = 'dün'; +?> diff --git a/modules/counter/lang/vi.lang.php b/modules/counter/lang/vi.lang.php index aa74830fa..56f52ba7d 100644 --- a/modules/counter/lang/vi.lang.php +++ b/modules/counter/lang/vi.lang.php @@ -1,27 +1,27 @@ -counter = "Lượt truy cập"; - $lang->cmd_select_date = 'Chọn ngày'; - $lang->cmd_select_counter_type = array( - 'hour' => 'Theo giờ', - 'day' => 'Theo ngày', - 'month' => 'Theo tháng', - 'year' => 'Theo năm', - ); - - $lang->total_counter = 'Tổng số lượt truy cập'; - $lang->selected_day_counter = 'Số truy cập trong ngày'; - - $lang->unique_visitor = 'Số lượt xem'; - $lang->pageview = 'Số trang'; - - $lang->today = 'Hôm nay'; - $lang->yesterday = 'Hôm qua'; -?> +counter = "Lượt truy cập"; + $lang->cmd_select_date = 'Chọn ngày'; + $lang->cmd_select_counter_type = array( + 'hour' => 'Theo giờ', + 'day' => 'Theo ngày', + 'month' => 'Theo tháng', + 'year' => 'Theo năm', + ); + + $lang->total_counter = 'Tổng số lượt truy cập'; + $lang->selected_day_counter = 'Số truy cập trong ngày'; + + $lang->unique_visitor = 'Số lượt xem'; + $lang->pageview = 'Số trang'; + + $lang->today = 'Hôm nay'; + $lang->yesterday = 'Hôm qua'; +?> diff --git a/modules/counter/lang/zh-CN.lang.php b/modules/counter/lang/zh-CN.lang.php index 79459993e..948db9047 100644 --- a/modules/counter/lang/zh-CN.lang.php +++ b/modules/counter/lang/zh-CN.lang.php @@ -1,25 +1,25 @@ -counter = "访问统计"; - $lang->cmd_select_date = '选择日期'; - $lang->cmd_select_counter_type = array( - 'hour' => '按时', - 'day' => '按天', - 'month' => '按月', - 'year' => '按年', - ); - - $lang->total_counter = '总揽'; - $lang->selected_day_counter = '指定日概况'; - - $lang->unique_visitor = '访问者'; - $lang->pageview = '页面浏览'; - - $lang->today = '今日'; - $lang->yesterday = '昨日'; -?> +counter = "访问统计"; + $lang->cmd_select_date = '选择日期'; + $lang->cmd_select_counter_type = array( + 'hour' => '按时', + 'day' => '按天', + 'month' => '按月', + 'year' => '按年', + ); + + $lang->total_counter = '总揽'; + $lang->selected_day_counter = '指定日概况'; + + $lang->unique_visitor = '访问者'; + $lang->pageview = '页面浏览'; + + $lang->today = '今日'; + $lang->yesterday = '昨日'; +?> diff --git a/modules/counter/lang/zh-TW.lang.php b/modules/counter/lang/zh-TW.lang.php index 7b516a7a3..1eee95142 100644 --- a/modules/counter/lang/zh-TW.lang.php +++ b/modules/counter/lang/zh-TW.lang.php @@ -1,25 +1,25 @@ -counter = "訪問統計"; - $lang->cmd_select_date = '選擇日期'; - $lang->cmd_select_counter_type = array( - 'hour' => '按時', - 'day' => '按天', - 'month' => '按月', - 'year' => '按年', - ); - - $lang->total_counter = '總共'; - $lang->selected_day_counter = '指定日概況'; - - $lang->unique_visitor = '訪問者'; - $lang->pageview = '頁面瀏覽'; - - $lang->today = '今天'; - $lang->yesterday = '昨天'; -?> +counter = "訪問統計"; + $lang->cmd_select_date = '選擇日期'; + $lang->cmd_select_counter_type = array( + 'hour' => '按時', + 'day' => '按天', + 'month' => '按月', + 'year' => '按年', + ); + + $lang->total_counter = '總共'; + $lang->selected_day_counter = '指定日概況'; + + $lang->unique_visitor = '訪問者'; + $lang->pageview = '頁面瀏覽'; + + $lang->today = '今天'; + $lang->yesterday = '昨天'; +?> diff --git a/modules/document/conf/info.xml b/modules/document/conf/info.xml index 904703404..051dd99a8 100644 --- a/modules/document/conf/info.xml +++ b/modules/document/conf/info.xml @@ -1,36 +1,36 @@ - - - 문서 - Document - Bài viết - Documento - 主题管理 - ドキュメント - Документы - 主題 - Belge - 게시판, 블로그등의 모듈에서 사용되는 문서를 관리하는 모듈입니다. - Module for managing documents used in board, blog, etc. - Module quản lý bài viết trên Board, Sổ lưu niệm và những mục khác. - Módulo para manejar los documentos en blog y en los tableros. - 管理版面,博客等处主题的模块。 - 掲示板、ブログなどのモジュールで使用されるドキュメント(書き込み)を管理します。 - Модуль для управления документами в форуме, блоге и прочее. - 管理討論板,部落格等主題的模組。 - Panoda, blogda, vb., kullanılan belgeleri yönetmek için olan modüldür. - 0.1 - 2007-02-28 - content - - - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - - + + + 문서 + Document + Bài viết + Documento + 主题管理 + ドキュメント + Документы + 主題 + Belge + 게시판, 블로그등의 모듈에서 사용되는 문서를 관리하는 모듈입니다. + Module for managing documents used in board, blog, etc. + Module quản lý bài viết trên Board, Sổ lưu niệm và những mục khác. + Módulo para manejar los documentos en blog y en los tableros. + 管理版面,博客等处主题的模块。 + 掲示板、ブログなどのモジュールで使用されるドキュメント(書き込み)を管理します。 + Модуль для управления документами в форуме, блоге и прочее. + 管理討論板,部落格等主題的模組。 + Panoda, blogda, vb., kullanılan belgeleri yönetmek için olan modüldür. + 0.1 + 2007-02-28 + content + + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + diff --git a/modules/document/document.admin.model.php b/modules/document/document.admin.model.php index 9a86e5799..98d2ddfc1 100644 --- a/modules/document/document.admin.model.php +++ b/modules/document/document.admin.model.php @@ -1,87 +1,87 @@ -sort_index, array('list_order','delete_date','title'))) $obj->sort_index = 'list_order'; - if (!in_array($obj->order_type, array('desc','asc'))) $obj->order_type = 'asc'; - - // module_srl 대신 mid가 넘어왔을 경우는 직접 module_srl을 구해줌 - if ($obj->mid) { - $oModuleModel = &getModel('module'); - $obj->module_srl = $oModuleModel->getModuleSrlByMid($obj->mid); - unset($obj->mid); - } - - // 넘어온 module_srl은 array일 수도 있기에 array인지를 체크 - if (is_array($obj->module_srl)) $args->module_srl = implode(',', $obj->module_srl); - else $args->module_srl = $obj->module_srl; - - // 변수 체크 - $args->sort_index = $obj->sort_index; - $args->order_type = $obj->order_type; - $args->page = $obj->page?$obj->page:1; - $args->list_count = $obj->list_count?$obj->list_count:20; - $args->page_count = $obj->page_count?$obj->page_count:10; - $args->member_srl = $obj->member_srl; - - // query_id 지정 - $query_id = 'document.getTrashList'; - - // query 실행 - $output = executeQueryArray($query_id, $args); - - // 결과가 없거나 오류 발생시 그냥 return - if (!$output->toBool() || !count($output->data)) return $output; - - $idx = 0; - $data = $output->data; - unset($output->data); - - $keys = array_keys($data); - $virtual_number = $keys[0]; - - foreach($data as $key => $attribute) { - $oDocument = null; - $oDocument = new documentItem(); - $oDocument->setAttribute($attribute, false); - if ($is_admin) $oDocument->setGrant(); - - $output->data[$virtual_number] = $oDocument; - $virtual_number--; - } - - return $output; - } - - /** - * @brief trash_srl값을 가지는 휴지통 문서를 가져옴 - **/ - function getDocumentTrash($trash_srl) { - $args->trash_srl = $trash_srl; - $output = executeQuery('document.getTrash', $args); - - $node = $output->data; - if (!$node) return; - - return $node; - } - - } -?> +sort_index, array('list_order','delete_date','title'))) $obj->sort_index = 'list_order'; + if (!in_array($obj->order_type, array('desc','asc'))) $obj->order_type = 'asc'; + + // module_srl 대신 mid가 넘어왔을 경우는 직접 module_srl을 구해줌 + if ($obj->mid) { + $oModuleModel = &getModel('module'); + $obj->module_srl = $oModuleModel->getModuleSrlByMid($obj->mid); + unset($obj->mid); + } + + // 넘어온 module_srl은 array일 수도 있기에 array인지를 체크 + if (is_array($obj->module_srl)) $args->module_srl = implode(',', $obj->module_srl); + else $args->module_srl = $obj->module_srl; + + // 변수 체크 + $args->sort_index = $obj->sort_index; + $args->order_type = $obj->order_type; + $args->page = $obj->page?$obj->page:1; + $args->list_count = $obj->list_count?$obj->list_count:20; + $args->page_count = $obj->page_count?$obj->page_count:10; + $args->member_srl = $obj->member_srl; + + // query_id 지정 + $query_id = 'document.getTrashList'; + + // query 실행 + $output = executeQueryArray($query_id, $args); + + // 결과가 없거나 오류 발생시 그냥 return + if (!$output->toBool() || !count($output->data)) return $output; + + $idx = 0; + $data = $output->data; + unset($output->data); + + $keys = array_keys($data); + $virtual_number = $keys[0]; + + foreach($data as $key => $attribute) { + $oDocument = null; + $oDocument = new documentItem(); + $oDocument->setAttribute($attribute, false); + if ($is_admin) $oDocument->setGrant(); + + $output->data[$virtual_number] = $oDocument; + $virtual_number--; + } + + return $output; + } + + /** + * @brief trash_srl값을 가지는 휴지통 문서를 가져옴 + **/ + function getDocumentTrash($trash_srl) { + $args->trash_srl = $trash_srl; + $output = executeQuery('document.getTrash', $args); + + $node = $output->data; + if (!$node) return; + + return $node; + } + + } +?> diff --git a/modules/document/document.admin.view.php b/modules/document/document.admin.view.php index 7852f4951..8448c406f 100644 --- a/modules/document/document.admin.view.php +++ b/modules/document/document.admin.view.php @@ -1,159 +1,159 @@ -page = Context::get('page'); ///< 페이지 - $args->list_count = 30; ///< 한페이지에 보여줄 글 수 - $args->page_count = 10; ///< 페이지 네비게이션에 나타날 페이지의 수 - - $args->search_target = Context::get('search_target'); ///< 검색 대상 (title, contents...) - $args->search_keyword = Context::get('search_keyword'); ///< 검색어 - - $args->sort_index = 'list_order'; ///< 소팅 값 - - $args->module_srl = Context::get('module_srl'); - - // 목록 구함, document->getDocumentList 에서 걍 알아서 다 해버리는 구조이다... (아.. 이거 나쁜 버릇인데.. ㅡ.ㅜ 어쩔수 없다) - $oDocumentModel = &getModel('document'); - $output = $oDocumentModel->getDocumentList($args); - - // 템플릿에 쓰기 위해서 document_model::getDocumentList() 의 return object에 있는 값들을 세팅 - Context::set('total_count', $output->total_count); - Context::set('total_page', $output->total_page); - Context::set('page', $output->page); - Context::set('document_list', $output->data); - Context::set('page_navigation', $output->page_navigation); - - // 템플릿에서 사용할 검색옵션 세팅 - $count_search_option = count($this->search_option); - for($i=0;$i<$count_search_option;$i++) { - $search_option[$this->search_option[$i]] = Context::getLang($this->search_option[$i]); - } - Context::set('search_option', $search_option); - - // 템플릿 지정 - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('document_list'); - } - - /** - * @brief 문서 모듈 설정 - **/ - function dispDocumentAdminConfig() { - $oDocumentModel = &getModel('document'); - $config = $oDocumentModel->getDocumentConfig(); - Context::set('config',$config); - - // 템플릿 파일 지정 - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('document_config'); - } - - /** - * @brief 관리자 페이지의 신고 목록 보기 - **/ - function dispDocumentAdminDeclared() { - // 목록을 구하기 위한 옵션 - $args->page = Context::get('page'); ///< 페이지 - $args->list_count = 30; ///< 한페이지에 보여줄 글 수 - $args->page_count = 10; ///< 페이지 네비게이션에 나타날 페이지의 수 - - $args->sort_index = 'document_declared.declared_count'; ///< 소팅 값 - $args->order_type = 'desc'; ///< 소팅 정렬 값 - - // 목록을 구함 - $declared_output = executeQuery('document.getDeclaredList', $args); - - if($declared_output->data && count($declared_output->data)) { - $document_list = array(); - - $oDocumentModel = &getModel('document'); - foreach($declared_output->data as $key => $document) { - $document_list[$key] = new documentItem(); - $document_list[$key]->setAttribute($document); - } - $declared_output->data = $document_list; - } - - // 템플릿에 쓰기 위해서 document_model::getDocumentList() 의 return object에 있는 값들을 세팅 - Context::set('total_count', $declared_output->total_count); - Context::set('total_page', $declared_output->total_page); - Context::set('page', $declared_output->page); - Context::set('document_list', $declared_output->data); - Context::set('page_navigation', $declared_output->page_navigation); - - // 템플릿 지정 - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('declared_list'); - } - - function dispDocumentAdminAlias() { - $args->document_srl = Context::get('document_srl'); - if(!$args->document_srl) return $this->dispDocumentAdminList(); - - $oModel = &getModel('document'); - $oDocument = $oModel->getDocument($args->document_srl); - if(!$oDocument->isExists()) return $this->dispDocumentAdminList(); - Context::set('oDocument', $oDocument); - - $output = executeQueryArray('document.getAliases', $args); - if(!$output->data) - { - $aliases = array(); - } - else - { - $aliases = $output->data; - } - - - Context::set('aliases', $aliases); - - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('document_alias'); - } - - function dispDocumentAdminTrashList() { - // 목록을 구하기 위한 옵션 - $args->page = Context::get('page'); ///< 페이지 - $args->list_count = 30; ///< 한페이지에 보여줄 글 수 - $args->page_count = 10; ///< 페이지 네비게이션에 나타날 페이지의 수 - - $args->sort_index = 'list_order'; ///< 소팅 값 - $args->order_type = 'desc'; ///< 소팅 정렬 값 - - $args->module_srl = Context::get('module_srl'); - - // 목록을 구함 - $oDocumentAdminModel = &getAdminModel('document'); - $output = $oDocumentAdminModel->getDocumentTrashList($args); - - // 템플릿에 쓰기 위해서 document_admin_model::getDocumentTrashList() 의 return object에 있는 값들을 세팅 - Context::set('total_count', $output->total_count); - Context::set('total_page', $output->total_page); - Context::set('page', $output->page); - Context::set('document_list', $output->data); - Context::set('page_navigation', $output->page_navigation); - - // 템플릿 지정 - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('document_trash_list'); - } - } -?> +page = Context::get('page'); ///< 페이지 + $args->list_count = 30; ///< 한페이지에 보여줄 글 수 + $args->page_count = 10; ///< 페이지 네비게이션에 나타날 페이지의 수 + + $args->search_target = Context::get('search_target'); ///< 검색 대상 (title, contents...) + $args->search_keyword = Context::get('search_keyword'); ///< 검색어 + + $args->sort_index = 'list_order'; ///< 소팅 값 + + $args->module_srl = Context::get('module_srl'); + + // 목록 구함, document->getDocumentList 에서 걍 알아서 다 해버리는 구조이다... (아.. 이거 나쁜 버릇인데.. ㅡ.ㅜ 어쩔수 없다) + $oDocumentModel = &getModel('document'); + $output = $oDocumentModel->getDocumentList($args); + + // 템플릿에 쓰기 위해서 document_model::getDocumentList() 의 return object에 있는 값들을 세팅 + Context::set('total_count', $output->total_count); + Context::set('total_page', $output->total_page); + Context::set('page', $output->page); + Context::set('document_list', $output->data); + Context::set('page_navigation', $output->page_navigation); + + // 템플릿에서 사용할 검색옵션 세팅 + $count_search_option = count($this->search_option); + for($i=0;$i<$count_search_option;$i++) { + $search_option[$this->search_option[$i]] = Context::getLang($this->search_option[$i]); + } + Context::set('search_option', $search_option); + + // 템플릿 지정 + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('document_list'); + } + + /** + * @brief 문서 모듈 설정 + **/ + function dispDocumentAdminConfig() { + $oDocumentModel = &getModel('document'); + $config = $oDocumentModel->getDocumentConfig(); + Context::set('config',$config); + + // 템플릿 파일 지정 + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('document_config'); + } + + /** + * @brief 관리자 페이지의 신고 목록 보기 + **/ + function dispDocumentAdminDeclared() { + // 목록을 구하기 위한 옵션 + $args->page = Context::get('page'); ///< 페이지 + $args->list_count = 30; ///< 한페이지에 보여줄 글 수 + $args->page_count = 10; ///< 페이지 네비게이션에 나타날 페이지의 수 + + $args->sort_index = 'document_declared.declared_count'; ///< 소팅 값 + $args->order_type = 'desc'; ///< 소팅 정렬 값 + + // 목록을 구함 + $declared_output = executeQuery('document.getDeclaredList', $args); + + if($declared_output->data && count($declared_output->data)) { + $document_list = array(); + + $oDocumentModel = &getModel('document'); + foreach($declared_output->data as $key => $document) { + $document_list[$key] = new documentItem(); + $document_list[$key]->setAttribute($document); + } + $declared_output->data = $document_list; + } + + // 템플릿에 쓰기 위해서 document_model::getDocumentList() 의 return object에 있는 값들을 세팅 + Context::set('total_count', $declared_output->total_count); + Context::set('total_page', $declared_output->total_page); + Context::set('page', $declared_output->page); + Context::set('document_list', $declared_output->data); + Context::set('page_navigation', $declared_output->page_navigation); + + // 템플릿 지정 + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('declared_list'); + } + + function dispDocumentAdminAlias() { + $args->document_srl = Context::get('document_srl'); + if(!$args->document_srl) return $this->dispDocumentAdminList(); + + $oModel = &getModel('document'); + $oDocument = $oModel->getDocument($args->document_srl); + if(!$oDocument->isExists()) return $this->dispDocumentAdminList(); + Context::set('oDocument', $oDocument); + + $output = executeQueryArray('document.getAliases', $args); + if(!$output->data) + { + $aliases = array(); + } + else + { + $aliases = $output->data; + } + + + Context::set('aliases', $aliases); + + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('document_alias'); + } + + function dispDocumentAdminTrashList() { + // 목록을 구하기 위한 옵션 + $args->page = Context::get('page'); ///< 페이지 + $args->list_count = 30; ///< 한페이지에 보여줄 글 수 + $args->page_count = 10; ///< 페이지 네비게이션에 나타날 페이지의 수 + + $args->sort_index = 'list_order'; ///< 소팅 값 + $args->order_type = 'desc'; ///< 소팅 정렬 값 + + $args->module_srl = Context::get('module_srl'); + + // 목록을 구함 + $oDocumentAdminModel = &getAdminModel('document'); + $output = $oDocumentAdminModel->getDocumentTrashList($args); + + // 템플릿에 쓰기 위해서 document_admin_model::getDocumentTrashList() 의 return object에 있는 값들을 세팅 + Context::set('total_count', $output->total_count); + Context::set('total_page', $output->total_page); + Context::set('page', $output->page); + Context::set('document_list', $output->data); + Context::set('page_navigation', $output->page_navigation); + + // 템플릿 지정 + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('document_trash_list'); + } + } +?> diff --git a/modules/document/document.class.php b/modules/document/document.class.php index c3797d5ad..b51d0ed12 100644 --- a/modules/document/document.class.php +++ b/modules/document/document.class.php @@ -1,262 +1,262 @@ -addIndex("documents","idx_module_list_order", array("module_srl","list_order")); - $oDB->addIndex("documents","idx_module_update_order", array("module_srl","update_order")); - $oDB->addIndex("documents","idx_module_readed_count", array("module_srl","readed_count")); - $oDB->addIndex("documents","idx_module_voted_count", array("module_srl","voted_count")); - $oDB->addIndex("documents","idx_module_notice", array("module_srl","is_notice")); - $oDB->addIndex("documents","idx_module_document_srl", array("module_srl","document_srl")); - $oDB->addIndex("documents","idx_module_blamed_count", array("module_srl","blamed_count")); - $oDB->addIndex("document_aliases", "idx_module_title", array("module_srl","alias_title"), true); - $oDB->addIndex("document_extra_vars", "unique_extra_vars", array("module_srl","document_srl","var_idx","lang_code"), true); - - // 2007. 10. 17 모듈이 삭제될때 등록된 글도 모두 삭제하는 트리거 추가 - $oModuleController->insertTrigger('module.deleteModule', 'document', 'controller', 'triggerDeleteModuleDocuments', 'after'); - - // 2009. 01. 29 Added a trigger for additional setup - $oModuleController->insertTrigger('module.dispAdditionSetup', 'document', 'view', 'triggerDispDocumentAdditionSetup', 'before'); - - return new Object(); - } - - /** - * @brief 설치가 이상이 없는지 체크하는 method - **/ - function checkUpdate() { - $oDB = &DB::getInstance(); - $oModuleModel = &getModel('module'); - - /** - * 2007. 7. 25 : 알림 필드(notify_message) 추가 - **/ - if(!$oDB->isColumnExists("documents","notify_message")) return true; - - /** - * 2007. 8. 23 : document테이블에 결합 인덱스 적용 - **/ - if(!$oDB->isIndexExists("documents","idx_module_list_order")) return true; - if(!$oDB->isIndexExists("documents","idx_module_update_order")) return true; - if(!$oDB->isIndexExists("documents","idx_module_readed_count")) return true; - if(!$oDB->isIndexExists("documents","idx_module_voted_count")) return true; - - // 2007. 10. 17 모듈이 삭제될때 등록된 글도 모두 삭제하는 트리거 추가 - if(!$oModuleModel->getTrigger('module.deleteModule', 'document', 'controller', 'triggerDeleteModuleDocuments', 'after')) return true; - - // 2007. 10. 25 문서 분류에 parent_srl, expand를 추가 - if(!$oDB->isColumnExists("document_categories","parent_srl")) return true; - if(!$oDB->isColumnExists("document_categories","expand")) return true; - if(!$oDB->isColumnExists("document_categories","group_srls")) return true; - - // 2007. 11. 20 게시글에 module_srl + is_notice 복합인덱스 만들기 - if(!$oDB->isIndexExists("documents","idx_module_notice")) return true; - - // 2008. 02. 18 게시글에 module_srl + document_srl 복합인덱스 만들기 (manian님 확인) - if(!$oDB->isIndexExists("documents","idx_module_document_srl")) return true; - - /** - * 2007. 12. 03 : 확장변수(extra_vars) 컬럼이 없을 경우 추가 - **/ - if(!$oDB->isColumnExists("documents","extra_vars")) return true; - - // 2008. 04. 23 blamed count 컬럼 추가 - if(!$oDB->isColumnExists("documents", "blamed_count")) return true; - if(!$oDB->isIndexExists("documents","idx_module_blamed_count")) return true; - if(!$oDB->isColumnExists("document_voted_log", "point")) return true; - - // 2008-12-15 문서 분류에 color를 추가 - if(!$oDB->isColumnExists("document_categories", "color")) return true; - - /** - * 2009. 01. 29 : 확장변수 값 테이블에 lang_code가 없을 경우 추가 - **/ - if(!$oDB->isColumnExists("document_extra_vars","lang_code")) return true; - - if(!$oModuleModel->getTrigger('module.dispAdditionSetup', 'document', 'view', 'triggerDispDocumentAdditionSetup', 'before')) return true; - - // 2009. 03. 09 documents에 lang_code 컬럼 추가 - if(!$oDB->isColumnExists("documents","lang_code")) return true; - - // 2009. 03. 11 확장변수 값 테이블의 인덱스 점검 - if(!$oDB->isIndexExists("document_extra_vars", "unique_extra_vars")) return true; - - /** - * 2009. 03. 19 : 확장변수 값 테이블에 eid가 없을 경우 추가 - **/ - if(!$oDB->isColumnExists("document_extra_keys","eid")) return true; - if(!$oDB->isColumnExists("document_extra_vars","eid")) return true; - - // 2011. 03. 30 Cubrid index 추가 요청 - if(!$oDB->isIndexExists("document_extra_vars", "idx_document_list_order")) return true; - - return false; - } - - /** - * @brief 업데이트 실행 - **/ - function moduleUpdate() { - $oDB = &DB::getInstance(); - $oModuleModel = &getModel('module'); - $oModuleController = &getController('module'); - - /** - * 2007. 7. 25 : 알림 필드(notify_message) 추가 - **/ - if(!$oDB->isColumnExists("documents","notify_message")) { - $oDB->addColumn('documents',"notify_message","char",1); - } - - /** - * 2007. 8. 23 : document테이블에 결합 인덱스 적용 - **/ - if(!$oDB->isIndexExists("documents","idx_module_list_order")) { - $oDB->addIndex("documents","idx_module_list_order", array("module_srl","list_order")); - } - - if(!$oDB->isIndexExists("documents","idx_module_update_order")) { - $oDB->addIndex("documents","idx_module_update_order", array("module_srl","update_order")); - } - - if(!$oDB->isIndexExists("documents","idx_module_readed_count")) { - $oDB->addIndex("documents","idx_module_readed_count", array("module_srl","readed_count")); - } - - if(!$oDB->isIndexExists("documents","idx_module_voted_count")) { - $oDB->addIndex("documents","idx_module_voted_count", array("module_srl","voted_count")); - } - - // 2007. 10. 17 모듈이 삭제될때 등록된 글도 모두 삭제하는 트리거 추가 - if(!$oModuleModel->getTrigger('module.deleteModule', 'document', 'controller', 'triggerDeleteModuleDocuments', 'after')) - $oModuleController->insertTrigger('module.deleteModule', 'document', 'controller', 'triggerDeleteModuleDocuments', 'after'); - - // 2007. 10. 25 문서 분류에 parent_srl, expand를 추가 - if(!$oDB->isColumnExists("document_categories","parent_srl")) $oDB->addColumn('document_categories',"parent_srl","number",12,0); - if(!$oDB->isColumnExists("document_categories","expand")) $oDB->addColumn('document_categories',"expand","char",1,"N"); - if(!$oDB->isColumnExists("document_categories","group_srls")) $oDB->addColumn('document_categories',"group_srls","text"); - - // 2007. 11. 20 게시글에 module_srl + is_notice 복합인덱스 만들기 - if(!$oDB->isIndexExists("documents","idx_module_notice")) $oDB->addIndex("documents","idx_module_notice", array("module_srl","is_notice")); - - /** - * 2007. 12. 03 : 확장변수(extra_vars) 컬럼이 없을 경우 추가 - **/ - if(!$oDB->isColumnExists("documents","extra_vars")) $oDB->addColumn('documents','extra_vars','text'); - - /** - * 2008. 02. 18 게시글에 module_srl + document_srl 복합인덱스 만들기 (manian님 확인) - **/ - if(!$oDB->isIndexExists("documents","idx_module_document_srl")) $oDB->addIndex("documents","idx_module_document_srl", array("module_srl","document_srl")); - - // 2008. 04. 23 blamed count 컬럼 추가 - if(!$oDB->isColumnExists("documents", "blamed_count")) { - $oDB->addColumn('documents', 'blamed_count', 'number', 11, 0, true); - $oDB->addIndex('documents', 'idx_blamed_count', array('blamed_count')); - } - - if(!$oDB->isIndexExists("documents","idx_module_blamed_count")) { - $oDB->addIndex('documents', 'idx_module_blamed_count', array('module_srl', 'blamed_count')); - } - - if(!$oDB->isColumnExists("document_voted_log", "point")) - $oDB->addColumn('document_voted_log', 'point', 'number', 11, 0, true); - - - if(!$oDB->isColumnExists("document_categories","color")) $oDB->addColumn('document_categories',"color","char",7); - - /** - * 2009. 01. 29 : 확장변수 값 테이블에 lang_code가 없을 경우 추가 - **/ - if(!$oDB->isColumnExists("document_extra_vars","lang_code")) $oDB->addColumn('document_extra_vars',"lang_code","varchar",10); - - // 2009. 01. 29 Added a trigger for additional setup - if(!$oModuleModel->getTrigger('module.dispAdditionSetup', 'document', 'view', 'triggerDispDocumentAdditionSetup', 'before')) - $oModuleController->insertTrigger('module.dispAdditionSetup', 'document', 'view', 'triggerDispDocumentAdditionSetup', 'before'); - - // 2009. 03. 09 documents에 lang_code 컬럼 추가 - if(!$oDB->isColumnExists("documents","lang_code")) { - $db_info = Context::getDBInfo(); - $oDB->addColumn('documents',"lang_code","varchar",10, $db_info->lang_code); - $obj->lang_code = $db_info->lang_type; - executeQuery('document.updateDocumentsLangCode', $obj); - } - - // 2009. 03. 11 확장변수 값 테이블의 인덱스 점검 - if(!$oDB->isIndexExists("document_extra_vars", "unique_extra_vars")) { - $oDB->addIndex("document_extra_vars", "unique_extra_vars", array("module_srl","document_srl","var_idx","lang_code"), true); - } - - if($oDB->isIndexExists("document_extra_vars", "unique_module_vars")) { - $oDB->dropIndex("document_extra_vars", "unique_module_vars", true); - } - - /** - * 2009. 03. 19 : 확장변수 값 테이블에 eid 없을 경우 추가 - * 2009. 04. 12 : eid를 등록할 때 다른 필드 값이 변경되는 문제 수정 #17922959 - **/ - if(!$oDB->isColumnExists("document_extra_keys","eid")) { - $oDB->addColumn("document_extra_keys","eid","varchar",40); - - $output = executeQuery('document.getGroupsExtraKeys', $obj); - if($output->toBool() && $output->data && count($output->data)) { - foreach($output->data as $extra_keys) { - $args->module_srl = $extra_keys->module_srl; - $args->var_idx = $extra_keys->idx; - $args->new_eid = "extra_vars".$extra_keys->idx; - $output = executeQuery('document.updateDocumentExtraKeyEid', $args); - } - } - } - - if(!$oDB->isColumnExists("document_extra_vars","eid")) { - $oDB->addColumn("document_extra_vars","eid","varchar",40); - $obj->var_idx = '-1,-2'; - $output = executeQuery('document.getGroupsExtraVars', $obj); - if($output->toBool() && $output->data && count($output->data)) { - foreach($output->data as $extra_vars) { - $args->module_srl = $extra_vars->module_srl; - $args->var_idx = $extra_vars->idx; - $args->new_eid = "extra_vars".$extra_vars->idx; - $output = executeQuery('document.updateDocumentExtraVarEid', $args); - } - } - } - - // 2011. 03. 30 Cubrid index 추가 요청 - if(!$oDB->isIndexExists("document_extra_vars", "idx_document_list_order")) { - $oDB->addIndex("document_extra_vars", "idx_document_list_order", array("document_srl","module_srl","var_idx"), false); - } - - return new Object(0,'success_updated'); - - } - - /** - * @brief 캐시 파일 재생성 - **/ - function recompileCache() { - // 게시글 분류 캐시 파일 삭제 - FileHandler::removeFilesInDir(_XE_PATH_."files/cache/document_category"); - } - - } -?> +addIndex("documents","idx_module_list_order", array("module_srl","list_order")); + $oDB->addIndex("documents","idx_module_update_order", array("module_srl","update_order")); + $oDB->addIndex("documents","idx_module_readed_count", array("module_srl","readed_count")); + $oDB->addIndex("documents","idx_module_voted_count", array("module_srl","voted_count")); + $oDB->addIndex("documents","idx_module_notice", array("module_srl","is_notice")); + $oDB->addIndex("documents","idx_module_document_srl", array("module_srl","document_srl")); + $oDB->addIndex("documents","idx_module_blamed_count", array("module_srl","blamed_count")); + $oDB->addIndex("document_aliases", "idx_module_title", array("module_srl","alias_title"), true); + $oDB->addIndex("document_extra_vars", "unique_extra_vars", array("module_srl","document_srl","var_idx","lang_code"), true); + + // 2007. 10. 17 모듈이 삭제될때 등록된 글도 모두 삭제하는 트리거 추가 + $oModuleController->insertTrigger('module.deleteModule', 'document', 'controller', 'triggerDeleteModuleDocuments', 'after'); + + // 2009. 01. 29 Added a trigger for additional setup + $oModuleController->insertTrigger('module.dispAdditionSetup', 'document', 'view', 'triggerDispDocumentAdditionSetup', 'before'); + + return new Object(); + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + **/ + function checkUpdate() { + $oDB = &DB::getInstance(); + $oModuleModel = &getModel('module'); + + /** + * 2007. 7. 25 : 알림 필드(notify_message) 추가 + **/ + if(!$oDB->isColumnExists("documents","notify_message")) return true; + + /** + * 2007. 8. 23 : document테이블에 결합 인덱스 적용 + **/ + if(!$oDB->isIndexExists("documents","idx_module_list_order")) return true; + if(!$oDB->isIndexExists("documents","idx_module_update_order")) return true; + if(!$oDB->isIndexExists("documents","idx_module_readed_count")) return true; + if(!$oDB->isIndexExists("documents","idx_module_voted_count")) return true; + + // 2007. 10. 17 모듈이 삭제될때 등록된 글도 모두 삭제하는 트리거 추가 + if(!$oModuleModel->getTrigger('module.deleteModule', 'document', 'controller', 'triggerDeleteModuleDocuments', 'after')) return true; + + // 2007. 10. 25 문서 분류에 parent_srl, expand를 추가 + if(!$oDB->isColumnExists("document_categories","parent_srl")) return true; + if(!$oDB->isColumnExists("document_categories","expand")) return true; + if(!$oDB->isColumnExists("document_categories","group_srls")) return true; + + // 2007. 11. 20 게시글에 module_srl + is_notice 복합인덱스 만들기 + if(!$oDB->isIndexExists("documents","idx_module_notice")) return true; + + // 2008. 02. 18 게시글에 module_srl + document_srl 복합인덱스 만들기 (manian님 확인) + if(!$oDB->isIndexExists("documents","idx_module_document_srl")) return true; + + /** + * 2007. 12. 03 : 확장변수(extra_vars) 컬럼이 없을 경우 추가 + **/ + if(!$oDB->isColumnExists("documents","extra_vars")) return true; + + // 2008. 04. 23 blamed count 컬럼 추가 + if(!$oDB->isColumnExists("documents", "blamed_count")) return true; + if(!$oDB->isIndexExists("documents","idx_module_blamed_count")) return true; + if(!$oDB->isColumnExists("document_voted_log", "point")) return true; + + // 2008-12-15 문서 분류에 color를 추가 + if(!$oDB->isColumnExists("document_categories", "color")) return true; + + /** + * 2009. 01. 29 : 확장변수 값 테이블에 lang_code가 없을 경우 추가 + **/ + if(!$oDB->isColumnExists("document_extra_vars","lang_code")) return true; + + if(!$oModuleModel->getTrigger('module.dispAdditionSetup', 'document', 'view', 'triggerDispDocumentAdditionSetup', 'before')) return true; + + // 2009. 03. 09 documents에 lang_code 컬럼 추가 + if(!$oDB->isColumnExists("documents","lang_code")) return true; + + // 2009. 03. 11 확장변수 값 테이블의 인덱스 점검 + if(!$oDB->isIndexExists("document_extra_vars", "unique_extra_vars")) return true; + + /** + * 2009. 03. 19 : 확장변수 값 테이블에 eid가 없을 경우 추가 + **/ + if(!$oDB->isColumnExists("document_extra_keys","eid")) return true; + if(!$oDB->isColumnExists("document_extra_vars","eid")) return true; + + // 2011. 03. 30 Cubrid index 추가 요청 + if(!$oDB->isIndexExists("document_extra_vars", "idx_document_list_order")) return true; + + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + $oDB = &DB::getInstance(); + $oModuleModel = &getModel('module'); + $oModuleController = &getController('module'); + + /** + * 2007. 7. 25 : 알림 필드(notify_message) 추가 + **/ + if(!$oDB->isColumnExists("documents","notify_message")) { + $oDB->addColumn('documents',"notify_message","char",1); + } + + /** + * 2007. 8. 23 : document테이블에 결합 인덱스 적용 + **/ + if(!$oDB->isIndexExists("documents","idx_module_list_order")) { + $oDB->addIndex("documents","idx_module_list_order", array("module_srl","list_order")); + } + + if(!$oDB->isIndexExists("documents","idx_module_update_order")) { + $oDB->addIndex("documents","idx_module_update_order", array("module_srl","update_order")); + } + + if(!$oDB->isIndexExists("documents","idx_module_readed_count")) { + $oDB->addIndex("documents","idx_module_readed_count", array("module_srl","readed_count")); + } + + if(!$oDB->isIndexExists("documents","idx_module_voted_count")) { + $oDB->addIndex("documents","idx_module_voted_count", array("module_srl","voted_count")); + } + + // 2007. 10. 17 모듈이 삭제될때 등록된 글도 모두 삭제하는 트리거 추가 + if(!$oModuleModel->getTrigger('module.deleteModule', 'document', 'controller', 'triggerDeleteModuleDocuments', 'after')) + $oModuleController->insertTrigger('module.deleteModule', 'document', 'controller', 'triggerDeleteModuleDocuments', 'after'); + + // 2007. 10. 25 문서 분류에 parent_srl, expand를 추가 + if(!$oDB->isColumnExists("document_categories","parent_srl")) $oDB->addColumn('document_categories',"parent_srl","number",12,0); + if(!$oDB->isColumnExists("document_categories","expand")) $oDB->addColumn('document_categories',"expand","char",1,"N"); + if(!$oDB->isColumnExists("document_categories","group_srls")) $oDB->addColumn('document_categories',"group_srls","text"); + + // 2007. 11. 20 게시글에 module_srl + is_notice 복합인덱스 만들기 + if(!$oDB->isIndexExists("documents","idx_module_notice")) $oDB->addIndex("documents","idx_module_notice", array("module_srl","is_notice")); + + /** + * 2007. 12. 03 : 확장변수(extra_vars) 컬럼이 없을 경우 추가 + **/ + if(!$oDB->isColumnExists("documents","extra_vars")) $oDB->addColumn('documents','extra_vars','text'); + + /** + * 2008. 02. 18 게시글에 module_srl + document_srl 복합인덱스 만들기 (manian님 확인) + **/ + if(!$oDB->isIndexExists("documents","idx_module_document_srl")) $oDB->addIndex("documents","idx_module_document_srl", array("module_srl","document_srl")); + + // 2008. 04. 23 blamed count 컬럼 추가 + if(!$oDB->isColumnExists("documents", "blamed_count")) { + $oDB->addColumn('documents', 'blamed_count', 'number', 11, 0, true); + $oDB->addIndex('documents', 'idx_blamed_count', array('blamed_count')); + } + + if(!$oDB->isIndexExists("documents","idx_module_blamed_count")) { + $oDB->addIndex('documents', 'idx_module_blamed_count', array('module_srl', 'blamed_count')); + } + + if(!$oDB->isColumnExists("document_voted_log", "point")) + $oDB->addColumn('document_voted_log', 'point', 'number', 11, 0, true); + + + if(!$oDB->isColumnExists("document_categories","color")) $oDB->addColumn('document_categories',"color","char",7); + + /** + * 2009. 01. 29 : 확장변수 값 테이블에 lang_code가 없을 경우 추가 + **/ + if(!$oDB->isColumnExists("document_extra_vars","lang_code")) $oDB->addColumn('document_extra_vars',"lang_code","varchar",10); + + // 2009. 01. 29 Added a trigger for additional setup + if(!$oModuleModel->getTrigger('module.dispAdditionSetup', 'document', 'view', 'triggerDispDocumentAdditionSetup', 'before')) + $oModuleController->insertTrigger('module.dispAdditionSetup', 'document', 'view', 'triggerDispDocumentAdditionSetup', 'before'); + + // 2009. 03. 09 documents에 lang_code 컬럼 추가 + if(!$oDB->isColumnExists("documents","lang_code")) { + $db_info = Context::getDBInfo(); + $oDB->addColumn('documents',"lang_code","varchar",10, $db_info->lang_code); + $obj->lang_code = $db_info->lang_type; + executeQuery('document.updateDocumentsLangCode', $obj); + } + + // 2009. 03. 11 확장변수 값 테이블의 인덱스 점검 + if(!$oDB->isIndexExists("document_extra_vars", "unique_extra_vars")) { + $oDB->addIndex("document_extra_vars", "unique_extra_vars", array("module_srl","document_srl","var_idx","lang_code"), true); + } + + if($oDB->isIndexExists("document_extra_vars", "unique_module_vars")) { + $oDB->dropIndex("document_extra_vars", "unique_module_vars", true); + } + + /** + * 2009. 03. 19 : 확장변수 값 테이블에 eid 없을 경우 추가 + * 2009. 04. 12 : eid를 등록할 때 다른 필드 값이 변경되는 문제 수정 #17922959 + **/ + if(!$oDB->isColumnExists("document_extra_keys","eid")) { + $oDB->addColumn("document_extra_keys","eid","varchar",40); + + $output = executeQuery('document.getGroupsExtraKeys', $obj); + if($output->toBool() && $output->data && count($output->data)) { + foreach($output->data as $extra_keys) { + $args->module_srl = $extra_keys->module_srl; + $args->var_idx = $extra_keys->idx; + $args->new_eid = "extra_vars".$extra_keys->idx; + $output = executeQuery('document.updateDocumentExtraKeyEid', $args); + } + } + } + + if(!$oDB->isColumnExists("document_extra_vars","eid")) { + $oDB->addColumn("document_extra_vars","eid","varchar",40); + $obj->var_idx = '-1,-2'; + $output = executeQuery('document.getGroupsExtraVars', $obj); + if($output->toBool() && $output->data && count($output->data)) { + foreach($output->data as $extra_vars) { + $args->module_srl = $extra_vars->module_srl; + $args->var_idx = $extra_vars->idx; + $args->new_eid = "extra_vars".$extra_vars->idx; + $output = executeQuery('document.updateDocumentExtraVarEid', $args); + } + } + } + + // 2011. 03. 30 Cubrid index 추가 요청 + if(!$oDB->isIndexExists("document_extra_vars", "idx_document_list_order")) { + $oDB->addIndex("document_extra_vars", "idx_document_list_order", array("document_srl","module_srl","var_idx"), false); + } + + return new Object(0,'success_updated'); + + } + + /** + * @brief 캐시 파일 재생성 + **/ + function recompileCache() { + // 게시글 분류 캐시 파일 삭제 + FileHandler::removeFilesInDir(_XE_PATH_."files/cache/document_category"); + } + + } +?> diff --git a/modules/document/document.model.php b/modules/document/document.model.php index 4b4673e7a..a43c7c405 100644 --- a/modules/document/document.model.php +++ b/modules/document/document.model.php @@ -1,1101 +1,1101 @@ - $val) { - if(!$val->document_srl || $checked_documents[$val->document_srl]) continue; - $checked_documents[$val->document_srl] = true; - $document_srls[] = $val->document_srl; - } - - // 검출된 문서 번호가 없으면 return - if(!count($document_srls)) return; - - // 확장변수 미지정된 문서에 대해서 일단 현재 접속자의 언어코드로 확장변수를 검색 - $obj->document_srl = implode(',',$document_srls); - $output = executeQueryArray('document.getDocumentExtraVars', $obj); - if($output->toBool() && $output->data) { - foreach($output->data as $key => $val) { - if(!isset($val->value)) continue; - if(!$extra_vars[$val->module_srl][$val->document_srl][$val->var_idx][0]) $extra_vars[$val->module_srl][$val->document_srl][$val->var_idx][0] = trim($val->value); - $extra_vars[$val->document_srl][$val->var_idx][$val->lang_code] = trim($val->value); - } - } - - $user_lang_code = Context::getLangType(); - for($i=0,$c=count($document_srls);$i<$c;$i++) { - $document_srl = $document_srls[$i]; - unset($vars); - - if(!$GLOBALS['XE_DOCUMENT_LIST'][$document_srl] || !is_object($GLOBALS['XE_DOCUMENT_LIST'][$document_srl]) || !$GLOBALS['XE_DOCUMENT_LIST'][$document_srl]->isExists()) continue; - - $module_srl = $GLOBALS['XE_DOCUMENT_LIST'][$document_srl]->get('module_srl'); - $extra_keys = $this->getExtraKeys($module_srl); - $vars = $extra_vars[$document_srl]; - $document_lang_code = $GLOBALS['XE_DOCUMENT_LIST'][$document_srl]->get('lang_code'); - - // 확장변수 처리 - if(count($extra_keys)) { - foreach($extra_keys as $idx => $key) { - $val = $vars[$idx]; - if(isset($val[$user_lang_code])) $v = $val[$user_lang_code]; - else if(isset($val[$document_lang_code])) $v = $val[$document_lang_code]; - else if(isset($val[0])) $v = $val[0]; - else $v = null; - $extra_keys[$idx]->value = $v; - } - } - - unset($evars); - $evars = new ExtraVar($module_srl); - $evars->setExtraVarKeys($extra_keys); - - // 제목 처리 - if($vars[-1][$user_lang_code]) $GLOBALS['XE_DOCUMENT_LIST'][$document_srl]->add('title',$vars[-1][$user_lang_code]); - - // 내용 처리 - if($vars[-2][$user_lang_code]) $GLOBALS['XE_DOCUMENT_LIST'][$document_srl]->add('content',$vars[-2][$user_lang_code]); - - if($vars[-1][$user_lang_code] || $vars[-2][$user_lang_code]){ - unset($checked_documents[$document_srl]); - } - - $GLOBALS['XE_EXTRA_VARS'][$document_srl] = $evars->getExtraVars(); - } - } - - /** - * @brief 문서 가져오기 - **/ - function getDocument($document_srl=0, $is_admin = false, $load_extra_vars=true) { - if(!$document_srl) return new documentItem(); - - if(!isset($GLOBALS['XE_DOCUMENT_LIST'][$document_srl])) { - $oDocument = new documentItem($document_srl, $load_extra_vars); - $GLOBALS['XE_DOCUMENT_LIST'][$document_srl] = $oDocument; - if($load_extra_vars) $this->setToAllDocumentExtraVars(); - } - if($is_admin) $GLOBALS['XE_DOCUMENT_LIST'][$document_srl]->setGrant(); - - return $GLOBALS['XE_DOCUMENT_LIST'][$document_srl]; - } - - /** - * @brief 여러개의 문서들을 가져옴 (페이징 아님) - **/ - function getDocuments($document_srls, $is_admin = false, $load_extra_vars=true) { - if(is_array($document_srls)) { - $list_count = count($document_srls); - $document_srls = implode(',',$document_srls); - } else { - $list_count = 1; - } - $args->document_srls = $document_srls; - $args->list_count = $list_count; - $args->order_type = 'asc'; - - $output = executeQuery('document.getDocuments', $args); - $document_list = $output->data; - if(!$document_list) return; - if(!is_array($document_list)) $document_list = array($document_list); - - $document_count = count($document_list); - foreach($document_list as $key => $attribute) { - $document_srl = $attribute->document_srl; - if(!$document_srl) continue; - - if(!$GLOBALS['XE_DOCUMENT_LIST'][$document_srl]) { - $oDocument = null; - $oDocument = new documentItem(); - $oDocument->setAttribute($attribute, false); - if($is_admin) $oDocument->setGrant(); - $GLOBALS['XE_DOCUMENT_LIST'][$document_srl] = $oDocument; - } - - $result[$attribute->document_srl] = $GLOBALS['XE_DOCUMENT_LIST'][$document_srl]; - } - - if($load_extra_vars) $this->setToAllDocumentExtraVars(); - - $output = null; - if(count($result)) { - foreach($result as $document_srl => $val) { - $output[$document_srl] = $GLOBALS['XE_DOCUMENT_LIST'][$document_srl]; - } - } - - return $output; - } - - /** - * @brief module_srl값을 가지는 문서의 목록을 가져옴 - **/ - function getDocumentList($obj, $except_notice = false, $load_extra_vars=true) { - // 정렬 대상과 순서 체크 - if(!in_array($obj->sort_index, array('list_order','regdate','last_update','update_order','readed_count','voted_count','comment_count','trackback_count','uploaded_count','title','category_srl'))) $obj->sort_index = 'list_order'; - if(!in_array($obj->order_type, array('desc','asc'))) $obj->order_type = 'asc'; - - // module_srl 대신 mid가 넘어왔을 경우는 직접 module_srl을 구해줌 - if($obj->mid) { - $oModuleModel = &getModel('module'); - $obj->module_srl = $oModuleModel->getModuleSrlByMid($obj->mid); - unset($obj->mid); - } - - // 넘어온 module_srl은 array일 수도 있기에 array인지를 체크 - if(is_array($obj->module_srl)) $args->module_srl = implode(',', $obj->module_srl); - else $args->module_srl = $obj->module_srl; - - // 제외 module_srl에 대한 검사 - if(is_array($obj->exclude_module_srl)) $args->exclude_module_srl = implode(',', $obj->exclude_module_srl); - else $args->exclude_module_srl = $obj->exclude_module_srl; - - // 변수 체크 - $args->category_srl = $obj->category_srl?$obj->category_srl:null; - $args->sort_index = $obj->sort_index; - $args->order_type = $obj->order_type; - $args->page = $obj->page?$obj->page:1; - $args->list_count = $obj->list_count?$obj->list_count:20; - $args->page_count = $obj->page_count?$obj->page_count:10; - $args->start_date = $obj->start_date?$obj->start_date:null; - $args->end_date = $obj->end_date?$obj->end_date:null; - $args->member_srl = $obj->member_srl; - - // 카테고리가 선택되어 있으면 하부 카테고리까지 모두 조건에 추가 - if($args->category_srl) { - $category_list = $this->getCategoryList($args->module_srl); - $category_info = $category_list[$args->category_srl]; - $category_info->childs[] = $args->category_srl; - $args->category_srl = implode(',',$category_info->childs); - } - - // 기본으로 사용할 query id 지정 (몇가지 검색 옵션에 따라 query id가 변경됨) - $query_id = 'document.getDocumentList'; - - // 내용검색일 경우 document division을 지정하여 검색하기 위한 처리 - $use_division = false; - - // 검색 옵션 정리 - $searchOpt->search_target = $obj->search_target; - $searchOpt->search_keyword = $obj->search_keyword; - $this->_setSearchOption($searchOpt, &$args, &$query_id, &$use_division); - - /** - * division은 list_order의 asc 정렬일때만 사용할 수 있음 - **/ - if($args->sort_index != 'list_order' || $args->order_type != 'asc') $use_division = false; - - /** - * 만약 use_division이 true일 경우 document division을 이용하도록 변경 - **/ - if($use_division) { - // 시작 division - $division = (int)Context::get('division'); - - // division값이 없다면 제일 상위 - if(!$division) { - $division_args->module_srl = $args->module_srl; - $division_args->exclude_module_srl = $args->exclude_module_srl; - $division_args->list_count = 1; - $division_args->sort_index = $args->sort_index; - $division_args->order_type = $args->order_type; - $output = executeQuery("document.getDocumentList", $division_args); - if($output->data) { - $item = array_pop($output->data); - $division = $item->list_order; - } - $division_args = null; - } - - // 마지막 division - $last_division = (int)Context::get('last_division'); - - // 지정된 division에서부터 5000개 후의 division값을 구함 - if(!$last_division) { - $last_division_args->module_srl = $args->module_srl; - $last_division_args->exclude_module_srl = $args->exclude_module_srl; - $last_division_args->list_count = 1; - $last_division_args->sort_index = $args->sort_index; - $last_division_args->order_type = $args->order_type; - $last_division_args->list_order = $division; - $last_division_args->page = 5001; - $output = executeQuery("document.getDocumentDivision", $last_division_args); - if($output->data) { - $item = array_pop($output->data); - $last_division = $item->list_order; - } - - } - - // last_division 이후로 글이 있는지 확인 - if($last_division) { - $last_division_args = null; - $last_division_args->module_srl = $args->module_srl; - $last_division_args->exclude_module_srl = $args->exclude_module_srl; - $last_division_args->list_order = $last_division; - $output = executeQuery("document.getDocumentDivisionCount", $last_division_args); - if($output->data->count<1) $last_division = null; - } - - $args->division = $division; - $args->last_division = $last_division; - Context::set('division', $division); - Context::set('last_division', $last_division); - } - - // document.getDocumentList 쿼리 실행 - // 만약 query_id가 getDocumentListWithinComment 또는 getDocumentListWithinTag일 경우 group by 절 사용 때문에 쿼리를 한번더 수행 - if(in_array($query_id, array('document.getDocumentListWithinComment', 'document.getDocumentListWithinTag'))) { - $group_args = clone($args); - $group_args->sort_index = 'documents.'.$args->sort_index; - $output = executeQueryArray($query_id, $group_args); - if(!$output->toBool()||!count($output->data)) return $output; - - foreach($output->data as $key => $val) { - if($val->document_srl) $target_srls[] = $val->document_srl; - } - - $page_navigation = $output->page_navigation; - $keys = array_keys($output->data); - $virtual_number = $keys[0]; - - $target_args->document_srls = implode(',',$target_srls); - $target_args->list_order = $args->sort_index; - $target_args->order_type = $args->order_type; - $target_args->list_count = $args->list_count; - $target_args->page = 1; - $output = executeQueryArray('document.getDocuments', $target_args); - $output->page_navigation = $page_navigation; - $output->total_count = $page_navigation->total_count; - $output->total_page = $page_navigation->total_page; - $output->page = $page_navigation->cur_page; - } else { - $output = executeQueryArray($query_id, $args); - } - - // 결과가 없거나 오류 발생시 그냥 return - if(!$output->toBool()||!count($output->data)) return $output; - - $idx = 0; - $data = $output->data; - unset($output->data); - - if(!isset($virtual_number)) - { - $keys = array_keys($data); - $virtual_number = $keys[0]; - } - - if($except_notice) { - foreach($data as $key => $attribute) { - if($attribute->is_notice == 'Y') $virtual_number --; - } - } - - foreach($data as $key => $attribute) { - if($except_notice && $attribute->is_notice == 'Y') continue; - $document_srl = $attribute->document_srl; - if(!$GLOBALS['XE_DOCUMENT_LIST'][$document_srl]) { - $oDocument = null; - $oDocument = new documentItem(); - $oDocument->setAttribute($attribute, false); - if($is_admin) $oDocument->setGrant(); - $GLOBALS['XE_DOCUMENT_LIST'][$document_srl] = $oDocument; - } - - $output->data[$virtual_number] = $GLOBALS['XE_DOCUMENT_LIST'][$document_srl]; - $virtual_number --; - - } - - if($load_extra_vars) $this->setToAllDocumentExtraVars(); - - if(count($output->data)) { - foreach($output->data as $number => $document) { - $output->data[$number] = $GLOBALS['XE_DOCUMENT_LIST'][$document->document_srl]; - } - } - - return $output; - } - - /** - * @brief module_srl값을 가지는 문서의 공지사항만 가져옴 - **/ - function getNoticeList($obj) { - $args->module_srl = $obj->module_srl; - $output = executeQueryArray('document.getNoticeList', $args); - if(!$output->toBool()||!$output->data) return; - - foreach($output->data as $key => $val) { - $document_srl = $val->document_srl; - if(!$document_srl) continue; - - if(!$GLOBALS['XE_DOCUMENT_LIST'][$document_srl]) { - $oDocument = null; - $oDocument = new documentItem(); - $oDocument->setAttribute($val, false); - $GLOBALS['XE_DOCUMENT_LIST'][$document_srl] = $oDocument; - } - $result->data[$document_srl] = $GLOBALS['XE_DOCUMENT_LIST'][$document_srl]; - } - $this->setToAllDocumentExtraVars(); - - foreach($result->data as $document_srl => $val) { - $result->data[$document_srl] = $GLOBALS['XE_DOCUMENT_LIST'][$document_srl]; - } - - return $result; - } - - /** - * @brief document의 확장 변수 키값을 가져오는 함수 - * $form_include : 글 작성시에 필요한 확장변수의 input form 추가 여부 - **/ - function getExtraKeys($module_srl) { - if(is_null($GLOBALS['XE_EXTRA_KEYS'][$module_srl])) { - $oExtraVar = &ExtraVar::getInstance($module_srl); - $obj->module_srl = $module_srl; - $obj->sort_index = 'var_idx'; - $obj->order = 'asc'; - $output = executeQueryArray('document.getDocumentExtraKeys', $obj); - $oExtraVar->setExtraVarKeys($output->data); - $keys = $oExtraVar->getExtraVars(); - if(!$keys) $keys = array(); - $GLOBALS['XE_EXTRA_KEYS'][$module_srl] = $keys; - } - - return $GLOBALS['XE_EXTRA_KEYS'][$module_srl]; - } - - /** - * @brief 특정 document의 확장 변수 값을 가져오는 함수 - **/ - function getExtraVars($module_srl, $document_srl) { - if(!isset($GLOBALS['XE_EXTRA_VARS'][$document_srl])) { - // 확장변수 값을 추출하여 세팅 - $oDocument = $this->getDocument($document_srl, false); - $GLOBALS['XE_DOCUMENT_LIST'][$document_srl] = $oDocument; - $this->setToAllDocumentExtraVars(); - } - if(is_array($GLOBALS['XE_EXTRA_VARS'][$document_srl])) ksort($GLOBALS['XE_EXTRA_VARS'][$document_srl]); - return $GLOBALS['XE_EXTRA_VARS'][$document_srl]; - } - - /** - * @brief 선택된 게시물의 팝업메뉴 표시 - * - * 인쇄, 스크랩, 추천, 비추천, 신고 기능 추가 - **/ - function getDocumentMenu() { - - // 요청된 게시물 번호와 현재 로그인 정보 구함 - $document_srl = Context::get('target_srl'); - $mid = Context::get('cur_mid'); - $logged_info = Context::get('logged_info'); - $act = Context::get('cur_act'); - - // menu_list 에 "표시할글,target,url" 을 배열로 넣는다 - $menu_list = array(); - - // trigger 호출 - ModuleHandler::triggerCall('document.getDocumentMenu', 'before', $menu_list); - - $oDocumentController = &getController('document'); - - // 회원이어야만 가능한 기능 - if($logged_info->member_srl) { - - $oDocumentModel = &getModel('document'); - $oDocument = $oDocumentModel->getDocument($document_srl, false, false); - $module_srl = $oDocument->get('module_srl'); - $member_srl = $oDocument->get('member_srl'); - if(!$module_srl) return new Object(-1, 'msg_invalid_request'); - - $oModuleModel = &getModel('module'); - $document_config = $oModuleModel->getModulePartConfig('document',$module_srl); - if($document_config->use_vote_up!='N' && $member_srl!=$logged_info->member_srl){ - // 추천 버튼 추가 - $url = sprintf("doCallModuleAction('document','procDocumentVoteUp','%s')", $document_srl); - $oDocumentController->addDocumentPopupMenu($url,'cmd_vote','./modules/document/tpl/icons/vote_up.gif','javascript'); - } - - if($document_config->use_vote_down!='N' && $member_srl!=$logged_info->member_srl){ - // 비추천 버튼 추가 - $url= sprintf("doCallModuleAction('document','procDocumentVoteDown','%s')", $document_srl); - $oDocumentController->addDocumentPopupMenu($url,'cmd_vote_down','./modules/document/tpl/icons/vote_down.gif','javascript'); - } - - // 신고 기능 추가 - $url = sprintf("doCallModuleAction('document','procDocumentDeclare','%s')", $document_srl); - $oDocumentController->addDocumentPopupMenu($url,'cmd_declare','./modules/document/tpl/icons/declare.gif','javascript'); - - // 스크랩 버튼 추가 - $url = sprintf("doCallModuleAction('member','procMemberScrapDocument','%s')", $document_srl); - $oDocumentController->addDocumentPopupMenu($url,'cmd_scrap','./modules/document/tpl/icons/scrap.gif','javascript'); - } - - // 인쇄 버튼 추가 - $url = getUrl('','module','document','act','dispDocumentPrint','document_srl',$document_srl); - $oDocumentController->addDocumentPopupMenu($url,'cmd_print','./modules/document/tpl/icons/print.gif','printDocument'); - - // trigger 호출 (after) - ModuleHandler::triggerCall('document.getDocumentMenu', 'after', $menu_list); - - // 관리자일 경우 ip로 글 찾기 - if($logged_info->is_admin == 'Y') { - $oDocumentModel = &getModel('document'); - $oDocument = $oDocumentModel->getDocument($document_srl); - - if($oDocument->isExists()) { - // ip주소에 해당하는 글 찾기 - $url = getUrl('','module','admin','act','dispDocumentAdminList','search_target','ipaddress','search_keyword',$oDocument->get('ipaddress')); - $icon_path = './modules/member/tpl/images/icon_management.gif'; - $oDocumentController->addDocumentPopupMenu($url,'cmd_search_by_ipaddress',$icon_path,'TraceByIpaddress'); - - $url = sprintf("var params = new Array(); params['ipaddress']='%s'; exec_xml('spamfilter', 'procSpamfilterAdminInsertDeniedIP', params, completeCallModuleAction)", $oDocument-> getIpAddress()); - $oDocumentController->addDocumentPopupMenu($url,'cmd_add_ip_to_spamfilter','./modules/document/tpl/icons/declare.gif','javascript'); - } - } - - // 팝업메뉴의 언어 변경 - $menus = Context::get('document_popup_menu_list'); - $menus_count = count($menus); - for($i=0;$i<$menus_count;$i++) { - $menus[$i]->str = Context::getLang($menus[$i]->str); - } - - // 최종적으로 정리된 팝업메뉴 목록을 구함 - $this->add('menus', $menus); - } - - /** - * @brief module_srl에 해당하는 문서의 전체 갯수를 가져옴 - **/ - function getDocumentCount($module_srl, $search_obj = NULL) { - // 검색 옵션 추가 - $args->module_srl = $module_srl; - $args->s_title = $search_obj->s_title; - $args->s_content = $search_obj->s_content; - $args->s_user_name = $search_obj->s_user_name; - $args->s_member_srl = $search_obj->s_member_srl; - $args->s_ipaddress = $search_obj->s_ipaddress; - $args->s_regdate = $search_obj->s_regdate; - $args->category_srl = $search_obj->category_srl; - - $output = executeQuery('document.getDocumentCount', $args); - - // 전체 갯수를 return - $total_count = $output->data->count; - return (int)$total_count; - } - /** - * @brief 해당 document의 page 가져오기, module_srl이 없으면 전체에서.. - **/ - function getDocumentPage($oDocument, $opt) { - // 정렬 형식에 따라서 query args 변경 - switch($opt->sort_index) { - case 'update_order' : - if($opt->order_type == 'desc') $args->rev_update_order = $oDocument->get('update_order'); - else $args->update_order = $oDocument->get('update_order'); - break; - case 'regdate' : - if($opt->order_type == 'asc') $args->rev_regdate = $oDocument->get('regdate'); - else $args->regdate = $oDocument->get('regdate'); - break; - case 'voted_count' : - case 'readed_count' : - case 'comment_count' : - case 'title' : - return 1; - break; - default : - if($opt->order_type == 'desc') $args->rev_list_order = $oDocument->get('list_order'); - else $args->list_order = $oDocument->get('list_order'); - break; - } - $args->module_srl = $oDocument->get('module_srl'); - $args->sort_index = $opt->sort_index; - $args->order_type = $opt->order_type; - - // 검색 옵션 정리 - $searchOpt->search_target = $opt->search_target; - $searchOpt->search_keyword = $opt->search_keyword; - $this->_setSearchOption($searchOpt, &$args, &$query_id, &$use_division); - - // 전체 갯수를 구한후 해당 글의 페이지를 검색 - $output = executeQuery('document.getDocumentPage', $args); - $count = $output->data->count; - $page = (int)(($count-1)/$opt->list_count)+1; - return $page; - } - - /** - * @brief 카테고리의 정보를 가져옴 - **/ - function getCategory($category_srl) { - $args->category_srl = $category_srl; - $output = executeQuery('document.getCategory', $args); - - $node = $output->data; - if(!$node) return; - - if($node->group_srls) { - $group_srls = explode(',',$node->group_srls); - unset($node->group_srls); - $node->group_srls = $group_srls; - } else { - unset($node->group_srls); - $node->group_srls = array(); - } - return $node; - } - - /** - * @brief 특정 카테고리에 child가 있는지 체크 - **/ - function getCategoryChlidCount($category_srl) { - $args->category_srl = $category_srl; - $output = executeQuery('document.getChildCategoryCount',$args); - if($output->data->count > 0) return true; - return false; - } - - /** - * @brief 특정 모듈의 카테고리 목록을 가져옴 - * 속도나 여러가지 상황을 고려해서 카테고리 목록은 php로 생성된 script를 include하여 사용하는 것을 원칙으로 함 - **/ - function getCategoryList($module_srl) { - // 대상 모듈의 카테고리 파일을 불러옴 - $filename = sprintf("./files/cache/document_category/%s.php", $module_srl); - - // 대상 파일이 없으면 카테고리 캐시 파일을 재생성 - if(!file_exists($filename)) { - $oDocumentController = &getController('document'); - if(!$oDocumentController->makeCategoryFile($module_srl)) return array(); - } - - @include($filename); - - // 카테고리의 정리 - $document_category = array(); - $this->_arrangeCategory($document_category, $menu->list, 0); - return $document_category; - } - - /** - * @brief 카테고리를 1차 배열 형식으로 변경하는 내부 method - **/ - function _arrangeCategory(&$document_category, $list, $depth) { - if(!count($list)) return; - $idx = 0; - $list_order = array(); - foreach($list as $key => $val) { - $obj = null; - $obj->mid = $val['mid']; - $obj->module_srl = $val['module_srl']; - $obj->category_srl = $val['category_srl']; - $obj->parent_srl = $val['parent_srl']; - $obj->title = $obj->text = $val['text']; - $obj->expand = $val['expand']=='Y'?true:false; - $obj->color = $val['color']; - $obj->document_count = $val['document_count']; - $obj->depth = $depth; - $obj->child_count = 0; - $obj->childs = array(); - $obj->grant = $val['grant']; - - if(Context::get('mid') == $obj->mid && Context::get('category') == $obj->category_srl) $selected = true; - else $selected = false; - - $obj->selected = $selected; - - $list_order[$idx++] = $obj->category_srl; - - // 부모 카테고리가 있으면 자식노드들의 데이터를 적용 - if($obj->parent_srl) { - - $parent_srl = $obj->parent_srl; - $document_count = $obj->document_count; - $expand = $obj->expand; - if($selected) $expand = true; - - while($parent_srl) { - $document_category[$parent_srl]->document_count += $document_count; - $document_category[$parent_srl]->childs[] = $obj->category_srl; - $document_category[$parent_srl]->child_count = count($document_category[$parent_srl]->childs); - if($expand) $document_category[$parent_srl]->expand = $expand; - - $parent_srl = $document_category[$parent_srl]->parent_srl; - } - } - - $document_category[$key] = $obj; - - if(count($val['list'])) $this->_arrangeCategory($document_category, $val['list'], $depth+1); - } - $document_category[$list_order[0]]->first = true; - $document_category[$list_order[count($list_order)-1]]->last = true; - } - - /** - * @brief 카테고리에 속한 문서의 갯수를 구함 - **/ - function getCategoryDocumentCount($module_srl, $category_srl) { - $args->module_srl = $module_srl; - $args->category_srl = $category_srl; - $output = executeQuery('document.getCategoryDocumentCount', $args); - return (int)$output->data->count; - } - - /** - * @brief 문서 category정보의 xml 캐시 파일을 return - **/ - function getCategoryXmlFile($module_srl) { - $xml_file = sprintf('files/cache/document_category/%s.xml.php',$module_srl); - if(!file_exists($xml_file)) { - $oDocumentController = &getController('document'); - $oDocumentController->makeCategoryFile($module_srl); - } - return $xml_file; - } - - /** - * @brief 문서 category정보의 php 캐시 파일을 return - **/ - function getCategoryPhpFile($module_srl) { - $php_file = sprintf('files/cache/document_category/%s.php',$module_srl); - if(!file_exists($php_file)) { - $oDocumentController = &getController('document'); - $oDocumentController->makeCategoryFile($module_srl); - } - return $php_file; - } - - /** - * @brief 월별 글 보관현황을 가져옴 - **/ - function getMonthlyArchivedList($obj) { - if($obj->mid) { - $oModuleModel = &getModel('module'); - $obj->module_srl = $oModuleModel->getModuleSrlByMid($obj->mid); - unset($obj->mid); - } - - // 넘어온 module_srl은 array일 수도 있기에 array인지를 체크 - if(is_array($obj->module_srl)) $args->module_srl = implode(',', $obj->module_srl); - else $args->module_srl = $obj->module_srl; - - $output = executeQuery('document.getMonthlyArchivedList', $args); - if(!$output->toBool()||!$output->data) return $output; - - if(!is_array($output->data)) $output->data = array($output->data); - - return $output; - } - - /** - * @brief 특정달의 일별 글 현황을 가져옴 - **/ - function getDailyArchivedList($obj) { - if($obj->mid) { - $oModuleModel = &getModel('module'); - $obj->module_srl = $oModuleModel->getModuleSrlByMid($obj->mid); - unset($obj->mid); - } - - // 넘어온 module_srl은 array일 수도 있기에 array인지를 체크 - if(is_array($obj->module_srl)) $args->module_srl = implode(',', $obj->module_srl); - else $args->module_srl = $obj->module_srl; - $args->regdate = $obj->regdate; - - $output = executeQuery('document.getDailyArchivedList', $args); - if(!$output->toBool()) return $output; - - if(!is_array($output->data)) $output->data = array($output->data); - - return $output; - } - - /** - * @brief 특정 모듈의 분류를 구함 - **/ - function getDocumentCategories() { - if(!Context::get('is_logged')) return new Object(-1,'msg_not_permitted'); - $module_srl = Context::get('module_srl'); - $categories= $this->getCategoryList($module_srl); - $lang = Context::get('lang'); - - // 분류 없음 추가 - $output = "0,0,{$lang->none_category}\n"; - if($categories){ - foreach($categories as $category_srl => $category) { - $output .= sprintf("%d,%d,%s\n",$category_srl, $category->depth,$category->title); - } - } - $this->add('categories', $output); - } - - /** - * @brief 문서 설정 정보를 구함 - **/ - function getDocumentConfig() { - if(!$GLOBALS['__document_config__']) { - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('document'); - if(!$config->thumbnail_type) $config->thumbnail_type = 'crop'; - $GLOBALS['__document_config__'] = $config; - } - return $GLOBALS['__document_config__']; - } - - /** - * @brief 공통 :: 모듈의 확장 변수 관리 - * 모듈의 확장변수 관리는 모든 모듈에서 document module instance를 이용할때 사용할 수 있음 - **/ - function getExtraVarsHTML($module_srl) { - // 기존의 extra_keys 가져옴 - $extra_keys = $this->getExtraKeys($module_srl); - Context::set('extra_keys', $extra_keys); - - // grant 정보를 추출 - $oTemplate = &TemplateHandler::getInstance(); - return $oTemplate->compile($this->module_path.'tpl', 'extra_keys'); - } - - /** - * @brief 공통 :: 모듈의 카테고리 변수 관리 - **/ - function getCategoryHTML($module_srl) { - $category_xml_file = $this->getCategoryXmlFile($module_srl); - - Context::set('category_xml_file', $category_xml_file); - - Context::loadJavascriptPlugin('ui.tree'); - // grant 정보를 추출 - $oTemplate = &TemplateHandler::getInstance(); - return $oTemplate->compile($this->module_path.'tpl', 'category_list'); - } - - /** - * @brief 특정 카테고리의 정보를 이용하여 템플릿을 구한후 return - * 관리자 페이지에서 특정 메뉴의 정보를 추가하기 위해 서버에서 tpl을 컴파일 한후 컴파일 된 html을 직접 return - **/ - function getDocumentCategoryTplInfo() { - $oModuleModel = &getModel('module'); - $oMemberModel = &getModel('member'); - - // 해당 메뉴의 정보를 가져오기 위한 변수 설정 - $module_srl = Context::get('module_srl'); - $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); - - // 권한 체크 - $grant = $oModuleModel->getGrant($module_info, Context::get('logged_info')); - if(!$grant->manager) return new Object(-1,'msg_not_permitted'); - - $category_srl = Context::get('category_srl'); - $parent_srl = Context::get('parent_srl'); - - // 회원 그룹의 목록을 가져옴 - $group_list = $oMemberModel->getGroups($module_info->site_srl); - Context::set('group_list', $group_list); - - // parent_srl이 있고 category_srl 이 없으면 하부 메뉴 추가임 - if(!$category_srl && $parent_srl) { - // 상위 메뉴의 정보를 가져옴 - $parent_info = $this->getCategory($parent_srl); - - // 추가하려는 메뉴의 기본 변수 설정 - $category_info->category_srl = getNextSequence(); - $category_info->parent_srl = $parent_srl; - $category_info->parent_category_title = $parent_info->title; - - // root에 메뉴 추가하거나 기존 메뉴의 수정일 경우 - } else { - // category_srl 이 있으면 해당 메뉴의 정보를 가져온다 - if($category_srl) $category_info = $this->getCategory($category_srl); - - // 찾아진 값이 없다면 신규 메뉴 추가로 보고 category_srl값만 구해줌 - if(!$category_info->category_srl) { - $category_info->category_srl = getNextSequence(); - } - } - - - $category_info->title = htmlspecialchars($category_info->title); - Context::set('category_info', $category_info); - - // template 파일을 직접 컴파일한후 tpl변수에 담아서 return한다. - $oTemplate = &TemplateHandler::getInstance(); - $tpl = $oTemplate->compile('./modules/document/tpl', 'category_info'); - $tpl = str_replace("\n",'',$tpl); - - // 사용자 정의 언어 변경 - $oModuleController = &getController('module'); - $oModuleController->replaceDefinedLangCode($tpl); - - // return 할 변수 설정 - $this->add('tpl', $tpl); - } - - - function getDocumentSrlByAlias($mid, $alias) - { - if(!$mid || !$alias) return null; - $site_module_info = Context::get('site_module_info'); - $args->mid = $mid; - $args->alias_title = $alias; - $args->site_srl = $site_module_info->site_srl; - $output = executeQuery('document.getDocumentSrlByAlias', $args); - if(!$output->data) return null; - else return $output->data->document_srl; - } - - function getAlias($document_srl){ - if(!$document_srl) return null; - $args->document_srl = $document_srl; - $output = executeQueryArray('document.getAliases', $args); - - if(!$output->data) return null; - else return $output->data[0]->alias_title; - } - - function getHistories($document_srl, $list_count, $page) - { - $args->list_count = $list_count; - $args->page = $page; - $args->document_srl = $document_srl; - $output = executeQueryArray('document.getHistories', $args); - return $output; - } - - function getHistory($history_srl) - { - $args->history_srl = $history_srl; - $output = executeQuery('document.getHistory', $args); - return $output->data; - } - - /** - * @brief module_srl값을 가지는 문서의 목록을 가져옴 - **/ - function getTrashList($obj) { - - // 변수 체크 - $args->category_srl = $obj->category_srl?$obj->category_srl:null; - $args->sort_index = $obj->sort_index; - $args->order_type = $obj->order_type?$obj->order_type:'desc'; - $args->page = $obj->page?$obj->page:1; - $args->list_count = $obj->list_count?$obj->list_count:20; - $args->page_count = $obj->page_count?$obj->page_count:10; - - - // 검색 옵션 정리 - $search_target = $obj->search_target; - $search_keyword = $obj->search_keyword; - if($search_target && $search_keyword) { - switch($search_target) { - case 'title' : - case 'content' : - if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); - $args->{"s_".$search_target} = $search_keyword; - $use_division = true; - break; - case 'title_content' : - if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); - $args->s_title = $search_keyword; - $args->s_content = $search_keyword; - break; - case 'user_id' : - if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); - $args->s_user_id = $search_keyword; - $args->sort_index = 'documents.'.$args->sort_index; - break; - case 'user_name' : - case 'nick_name' : - case 'email_address' : - case 'homepage' : - if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); - $args->{"s_".$search_target} = $search_keyword; - break; - case 'is_notice' : - case 'is_secret' : - if($search_keyword=='N') $args->{"s_".$search_target} = 'N'; - elseif($search_keyword=='Y') $args->{"s_".$search_target} = 'Y'; - else $args->{"s_".$search_target} = ''; - break; - case 'member_srl' : - case 'readed_count' : - case 'voted_count' : - case 'comment_count' : - case 'trackback_count' : - case 'uploaded_count' : - $args->{"s_".$search_target} = (int)$search_keyword; - break; - case 'regdate' : - case 'last_update' : - case 'ipaddress' : - case 'tag' : - $args->{"s_".$search_target} = $search_keyword; - break; - } - } - - - $output = executeQueryArray('document.getTrashList', $args); - if($output->data){ - foreach($output->data as $key => $attribute) { - $oDocument = null; - $oDocument = new documentItem(); - $oDocument->setAttribute($attribute, false); - $attribute = $oDocument; - } - } - return $output; - } - - function getDocumentVotedMemberList() - { - $document_srl = Context::get('document_srl'); - if(!$document_srl) return new Object(-1,'msg_invalid_request'); - - $point = Context::get('point'); - if($point != -1) $point = 1; - - $oDocumentModel = &getModel('document'); - $oDocument = $oDocumentModel->getDocument($document_srl, false, false); - $module_srl = $oDocument->get('module_srl'); - if(!$module_srl) return new Object(-1, 'msg_invalid_request'); - - $oModuleModel = &getModel('module'); - $document_config = $oModuleModel->getModulePartConfig('document',$module_srl); - if($point == -1){ - if($document_config->use_vote_down!='S') return new Object(-1, 'msg_invalid_request'); - $args->below_point = 0; - }else{ - if($document_config->use_vote_up!='S') return new Object(-1, 'msg_invalid_request'); - $args->more_point = 0; - } - - $args->document_srl = $document_srl; - - $output = executeQueryArray('document.getVotedMemberList',$args); - if(!$output->toBool()) return $output; - - $oMemberModel = &getModel('member'); - if($output->data){ - foreach($output->data as $k => $d){ - $profile_image = $oMemberModel->getProfileImage($d->member_srl); - $output->data[$k]->src = $profile_image->src; - } - } - - $this->add('voted_member_list',$output->data); - } - - /** - * @brief 게시물 목록의 검색 옵션을 Setting함(2011.03.08 - cherryfilter) - * page변수가 없는 상태에서 page 값을 알아오는 method(getDocumentPage)는 검색하지 않은 값을 return해서 검색한 값을 가져오도록 검색옵션이 추가 됨. - * 검색옵션의 중복으로 인해 private method로 별도 분리 - **/ - function _setSearchOption($searchOpt, &$args, &$query_id, &$use_division) - { - $search_target = $searchOpt->search_target; - $search_keyword = $searchOpt->search_keyword; - - if($search_target && $search_keyword) { - switch($search_target) { - case 'title' : - case 'content' : - if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); - $args->{"s_".$search_target} = $search_keyword; - $use_division = true; - break; - case 'title_content' : - if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); - $args->s_title = $search_keyword; - $args->s_content = $search_keyword; - $use_division = true; - break; - case 'user_id' : - if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); - $args->s_user_id = $search_keyword; - $args->sort_index = 'documents.'.$args->sort_index; - break; - case 'user_name' : - case 'nick_name' : - case 'email_address' : - case 'homepage' : - if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); - $args->{"s_".$search_target} = $search_keyword; - break; - case 'is_notice' : - case 'is_secret' : - if($search_keyword=='N') $args->{"s_".$search_target} = 'N'; - elseif($search_keyword=='Y') $args->{"s_".$search_target} = 'Y'; - else $args->{"s_".$search_target} = ''; - break; - case 'member_srl' : - case 'readed_count' : - case 'voted_count' : - case 'comment_count' : - case 'trackback_count' : - case 'uploaded_count' : - $args->{"s_".$search_target} = (int)$search_keyword; - break; - case 'regdate' : - case 'last_update' : - case 'ipaddress' : - $args->{"s_".$search_target} = $search_keyword; - break; - case 'comment' : - $args->s_comment = $search_keyword; - $query_id = 'document.getDocumentListWithinComment'; - $use_division = true; - break; - case 'tag' : - $args->s_tags = str_replace(' ','%',$search_keyword); - $query_id = 'document.getDocumentListWithinTag'; - break; - default : - if(strpos($search_target,'extra_vars')!==false) { - $args->var_idx = substr($search_target, strlen('extra_vars')); - $args->var_value = str_replace(' ','%',$search_keyword); - $args->sort_index = 'documents.'.$args->sort_index; - $query_id = 'document.getDocumentListWithExtraVars'; - } - break; - } - } - } - } -?> + $val) { + if(!$val->document_srl || $checked_documents[$val->document_srl]) continue; + $checked_documents[$val->document_srl] = true; + $document_srls[] = $val->document_srl; + } + + // 검출된 문서 번호가 없으면 return + if(!count($document_srls)) return; + + // 확장변수 미지정된 문서에 대해서 일단 현재 접속자의 언어코드로 확장변수를 검색 + $obj->document_srl = implode(',',$document_srls); + $output = executeQueryArray('document.getDocumentExtraVars', $obj); + if($output->toBool() && $output->data) { + foreach($output->data as $key => $val) { + if(!isset($val->value)) continue; + if(!$extra_vars[$val->module_srl][$val->document_srl][$val->var_idx][0]) $extra_vars[$val->module_srl][$val->document_srl][$val->var_idx][0] = trim($val->value); + $extra_vars[$val->document_srl][$val->var_idx][$val->lang_code] = trim($val->value); + } + } + + $user_lang_code = Context::getLangType(); + for($i=0,$c=count($document_srls);$i<$c;$i++) { + $document_srl = $document_srls[$i]; + unset($vars); + + if(!$GLOBALS['XE_DOCUMENT_LIST'][$document_srl] || !is_object($GLOBALS['XE_DOCUMENT_LIST'][$document_srl]) || !$GLOBALS['XE_DOCUMENT_LIST'][$document_srl]->isExists()) continue; + + $module_srl = $GLOBALS['XE_DOCUMENT_LIST'][$document_srl]->get('module_srl'); + $extra_keys = $this->getExtraKeys($module_srl); + $vars = $extra_vars[$document_srl]; + $document_lang_code = $GLOBALS['XE_DOCUMENT_LIST'][$document_srl]->get('lang_code'); + + // 확장변수 처리 + if(count($extra_keys)) { + foreach($extra_keys as $idx => $key) { + $val = $vars[$idx]; + if(isset($val[$user_lang_code])) $v = $val[$user_lang_code]; + else if(isset($val[$document_lang_code])) $v = $val[$document_lang_code]; + else if(isset($val[0])) $v = $val[0]; + else $v = null; + $extra_keys[$idx]->value = $v; + } + } + + unset($evars); + $evars = new ExtraVar($module_srl); + $evars->setExtraVarKeys($extra_keys); + + // 제목 처리 + if($vars[-1][$user_lang_code]) $GLOBALS['XE_DOCUMENT_LIST'][$document_srl]->add('title',$vars[-1][$user_lang_code]); + + // 내용 처리 + if($vars[-2][$user_lang_code]) $GLOBALS['XE_DOCUMENT_LIST'][$document_srl]->add('content',$vars[-2][$user_lang_code]); + + if($vars[-1][$user_lang_code] || $vars[-2][$user_lang_code]){ + unset($checked_documents[$document_srl]); + } + + $GLOBALS['XE_EXTRA_VARS'][$document_srl] = $evars->getExtraVars(); + } + } + + /** + * @brief 문서 가져오기 + **/ + function getDocument($document_srl=0, $is_admin = false, $load_extra_vars=true) { + if(!$document_srl) return new documentItem(); + + if(!isset($GLOBALS['XE_DOCUMENT_LIST'][$document_srl])) { + $oDocument = new documentItem($document_srl, $load_extra_vars); + $GLOBALS['XE_DOCUMENT_LIST'][$document_srl] = $oDocument; + if($load_extra_vars) $this->setToAllDocumentExtraVars(); + } + if($is_admin) $GLOBALS['XE_DOCUMENT_LIST'][$document_srl]->setGrant(); + + return $GLOBALS['XE_DOCUMENT_LIST'][$document_srl]; + } + + /** + * @brief 여러개의 문서들을 가져옴 (페이징 아님) + **/ + function getDocuments($document_srls, $is_admin = false, $load_extra_vars=true) { + if(is_array($document_srls)) { + $list_count = count($document_srls); + $document_srls = implode(',',$document_srls); + } else { + $list_count = 1; + } + $args->document_srls = $document_srls; + $args->list_count = $list_count; + $args->order_type = 'asc'; + + $output = executeQuery('document.getDocuments', $args); + $document_list = $output->data; + if(!$document_list) return; + if(!is_array($document_list)) $document_list = array($document_list); + + $document_count = count($document_list); + foreach($document_list as $key => $attribute) { + $document_srl = $attribute->document_srl; + if(!$document_srl) continue; + + if(!$GLOBALS['XE_DOCUMENT_LIST'][$document_srl]) { + $oDocument = null; + $oDocument = new documentItem(); + $oDocument->setAttribute($attribute, false); + if($is_admin) $oDocument->setGrant(); + $GLOBALS['XE_DOCUMENT_LIST'][$document_srl] = $oDocument; + } + + $result[$attribute->document_srl] = $GLOBALS['XE_DOCUMENT_LIST'][$document_srl]; + } + + if($load_extra_vars) $this->setToAllDocumentExtraVars(); + + $output = null; + if(count($result)) { + foreach($result as $document_srl => $val) { + $output[$document_srl] = $GLOBALS['XE_DOCUMENT_LIST'][$document_srl]; + } + } + + return $output; + } + + /** + * @brief module_srl값을 가지는 문서의 목록을 가져옴 + **/ + function getDocumentList($obj, $except_notice = false, $load_extra_vars=true) { + // 정렬 대상과 순서 체크 + if(!in_array($obj->sort_index, array('list_order','regdate','last_update','update_order','readed_count','voted_count','comment_count','trackback_count','uploaded_count','title','category_srl'))) $obj->sort_index = 'list_order'; + if(!in_array($obj->order_type, array('desc','asc'))) $obj->order_type = 'asc'; + + // module_srl 대신 mid가 넘어왔을 경우는 직접 module_srl을 구해줌 + if($obj->mid) { + $oModuleModel = &getModel('module'); + $obj->module_srl = $oModuleModel->getModuleSrlByMid($obj->mid); + unset($obj->mid); + } + + // 넘어온 module_srl은 array일 수도 있기에 array인지를 체크 + if(is_array($obj->module_srl)) $args->module_srl = implode(',', $obj->module_srl); + else $args->module_srl = $obj->module_srl; + + // 제외 module_srl에 대한 검사 + if(is_array($obj->exclude_module_srl)) $args->exclude_module_srl = implode(',', $obj->exclude_module_srl); + else $args->exclude_module_srl = $obj->exclude_module_srl; + + // 변수 체크 + $args->category_srl = $obj->category_srl?$obj->category_srl:null; + $args->sort_index = $obj->sort_index; + $args->order_type = $obj->order_type; + $args->page = $obj->page?$obj->page:1; + $args->list_count = $obj->list_count?$obj->list_count:20; + $args->page_count = $obj->page_count?$obj->page_count:10; + $args->start_date = $obj->start_date?$obj->start_date:null; + $args->end_date = $obj->end_date?$obj->end_date:null; + $args->member_srl = $obj->member_srl; + + // 카테고리가 선택되어 있으면 하부 카테고리까지 모두 조건에 추가 + if($args->category_srl) { + $category_list = $this->getCategoryList($args->module_srl); + $category_info = $category_list[$args->category_srl]; + $category_info->childs[] = $args->category_srl; + $args->category_srl = implode(',',$category_info->childs); + } + + // 기본으로 사용할 query id 지정 (몇가지 검색 옵션에 따라 query id가 변경됨) + $query_id = 'document.getDocumentList'; + + // 내용검색일 경우 document division을 지정하여 검색하기 위한 처리 + $use_division = false; + + // 검색 옵션 정리 + $searchOpt->search_target = $obj->search_target; + $searchOpt->search_keyword = $obj->search_keyword; + $this->_setSearchOption($searchOpt, &$args, &$query_id, &$use_division); + + /** + * division은 list_order의 asc 정렬일때만 사용할 수 있음 + **/ + if($args->sort_index != 'list_order' || $args->order_type != 'asc') $use_division = false; + + /** + * 만약 use_division이 true일 경우 document division을 이용하도록 변경 + **/ + if($use_division) { + // 시작 division + $division = (int)Context::get('division'); + + // division값이 없다면 제일 상위 + if(!$division) { + $division_args->module_srl = $args->module_srl; + $division_args->exclude_module_srl = $args->exclude_module_srl; + $division_args->list_count = 1; + $division_args->sort_index = $args->sort_index; + $division_args->order_type = $args->order_type; + $output = executeQuery("document.getDocumentList", $division_args); + if($output->data) { + $item = array_pop($output->data); + $division = $item->list_order; + } + $division_args = null; + } + + // 마지막 division + $last_division = (int)Context::get('last_division'); + + // 지정된 division에서부터 5000개 후의 division값을 구함 + if(!$last_division) { + $last_division_args->module_srl = $args->module_srl; + $last_division_args->exclude_module_srl = $args->exclude_module_srl; + $last_division_args->list_count = 1; + $last_division_args->sort_index = $args->sort_index; + $last_division_args->order_type = $args->order_type; + $last_division_args->list_order = $division; + $last_division_args->page = 5001; + $output = executeQuery("document.getDocumentDivision", $last_division_args); + if($output->data) { + $item = array_pop($output->data); + $last_division = $item->list_order; + } + + } + + // last_division 이후로 글이 있는지 확인 + if($last_division) { + $last_division_args = null; + $last_division_args->module_srl = $args->module_srl; + $last_division_args->exclude_module_srl = $args->exclude_module_srl; + $last_division_args->list_order = $last_division; + $output = executeQuery("document.getDocumentDivisionCount", $last_division_args); + if($output->data->count<1) $last_division = null; + } + + $args->division = $division; + $args->last_division = $last_division; + Context::set('division', $division); + Context::set('last_division', $last_division); + } + + // document.getDocumentList 쿼리 실행 + // 만약 query_id가 getDocumentListWithinComment 또는 getDocumentListWithinTag일 경우 group by 절 사용 때문에 쿼리를 한번더 수행 + if(in_array($query_id, array('document.getDocumentListWithinComment', 'document.getDocumentListWithinTag'))) { + $group_args = clone($args); + $group_args->sort_index = 'documents.'.$args->sort_index; + $output = executeQueryArray($query_id, $group_args); + if(!$output->toBool()||!count($output->data)) return $output; + + foreach($output->data as $key => $val) { + if($val->document_srl) $target_srls[] = $val->document_srl; + } + + $page_navigation = $output->page_navigation; + $keys = array_keys($output->data); + $virtual_number = $keys[0]; + + $target_args->document_srls = implode(',',$target_srls); + $target_args->list_order = $args->sort_index; + $target_args->order_type = $args->order_type; + $target_args->list_count = $args->list_count; + $target_args->page = 1; + $output = executeQueryArray('document.getDocuments', $target_args); + $output->page_navigation = $page_navigation; + $output->total_count = $page_navigation->total_count; + $output->total_page = $page_navigation->total_page; + $output->page = $page_navigation->cur_page; + } else { + $output = executeQueryArray($query_id, $args); + } + + // 결과가 없거나 오류 발생시 그냥 return + if(!$output->toBool()||!count($output->data)) return $output; + + $idx = 0; + $data = $output->data; + unset($output->data); + + if(!isset($virtual_number)) + { + $keys = array_keys($data); + $virtual_number = $keys[0]; + } + + if($except_notice) { + foreach($data as $key => $attribute) { + if($attribute->is_notice == 'Y') $virtual_number --; + } + } + + foreach($data as $key => $attribute) { + if($except_notice && $attribute->is_notice == 'Y') continue; + $document_srl = $attribute->document_srl; + if(!$GLOBALS['XE_DOCUMENT_LIST'][$document_srl]) { + $oDocument = null; + $oDocument = new documentItem(); + $oDocument->setAttribute($attribute, false); + if($is_admin) $oDocument->setGrant(); + $GLOBALS['XE_DOCUMENT_LIST'][$document_srl] = $oDocument; + } + + $output->data[$virtual_number] = $GLOBALS['XE_DOCUMENT_LIST'][$document_srl]; + $virtual_number --; + + } + + if($load_extra_vars) $this->setToAllDocumentExtraVars(); + + if(count($output->data)) { + foreach($output->data as $number => $document) { + $output->data[$number] = $GLOBALS['XE_DOCUMENT_LIST'][$document->document_srl]; + } + } + + return $output; + } + + /** + * @brief module_srl값을 가지는 문서의 공지사항만 가져옴 + **/ + function getNoticeList($obj) { + $args->module_srl = $obj->module_srl; + $output = executeQueryArray('document.getNoticeList', $args); + if(!$output->toBool()||!$output->data) return; + + foreach($output->data as $key => $val) { + $document_srl = $val->document_srl; + if(!$document_srl) continue; + + if(!$GLOBALS['XE_DOCUMENT_LIST'][$document_srl]) { + $oDocument = null; + $oDocument = new documentItem(); + $oDocument->setAttribute($val, false); + $GLOBALS['XE_DOCUMENT_LIST'][$document_srl] = $oDocument; + } + $result->data[$document_srl] = $GLOBALS['XE_DOCUMENT_LIST'][$document_srl]; + } + $this->setToAllDocumentExtraVars(); + + foreach($result->data as $document_srl => $val) { + $result->data[$document_srl] = $GLOBALS['XE_DOCUMENT_LIST'][$document_srl]; + } + + return $result; + } + + /** + * @brief document의 확장 변수 키값을 가져오는 함수 + * $form_include : 글 작성시에 필요한 확장변수의 input form 추가 여부 + **/ + function getExtraKeys($module_srl) { + if(is_null($GLOBALS['XE_EXTRA_KEYS'][$module_srl])) { + $oExtraVar = &ExtraVar::getInstance($module_srl); + $obj->module_srl = $module_srl; + $obj->sort_index = 'var_idx'; + $obj->order = 'asc'; + $output = executeQueryArray('document.getDocumentExtraKeys', $obj); + $oExtraVar->setExtraVarKeys($output->data); + $keys = $oExtraVar->getExtraVars(); + if(!$keys) $keys = array(); + $GLOBALS['XE_EXTRA_KEYS'][$module_srl] = $keys; + } + + return $GLOBALS['XE_EXTRA_KEYS'][$module_srl]; + } + + /** + * @brief 특정 document의 확장 변수 값을 가져오는 함수 + **/ + function getExtraVars($module_srl, $document_srl) { + if(!isset($GLOBALS['XE_EXTRA_VARS'][$document_srl])) { + // 확장변수 값을 추출하여 세팅 + $oDocument = $this->getDocument($document_srl, false); + $GLOBALS['XE_DOCUMENT_LIST'][$document_srl] = $oDocument; + $this->setToAllDocumentExtraVars(); + } + if(is_array($GLOBALS['XE_EXTRA_VARS'][$document_srl])) ksort($GLOBALS['XE_EXTRA_VARS'][$document_srl]); + return $GLOBALS['XE_EXTRA_VARS'][$document_srl]; + } + + /** + * @brief 선택된 게시물의 팝업메뉴 표시 + * + * 인쇄, 스크랩, 추천, 비추천, 신고 기능 추가 + **/ + function getDocumentMenu() { + + // 요청된 게시물 번호와 현재 로그인 정보 구함 + $document_srl = Context::get('target_srl'); + $mid = Context::get('cur_mid'); + $logged_info = Context::get('logged_info'); + $act = Context::get('cur_act'); + + // menu_list 에 "표시할글,target,url" 을 배열로 넣는다 + $menu_list = array(); + + // trigger 호출 + ModuleHandler::triggerCall('document.getDocumentMenu', 'before', $menu_list); + + $oDocumentController = &getController('document'); + + // 회원이어야만 가능한 기능 + if($logged_info->member_srl) { + + $oDocumentModel = &getModel('document'); + $oDocument = $oDocumentModel->getDocument($document_srl, false, false); + $module_srl = $oDocument->get('module_srl'); + $member_srl = $oDocument->get('member_srl'); + if(!$module_srl) return new Object(-1, 'msg_invalid_request'); + + $oModuleModel = &getModel('module'); + $document_config = $oModuleModel->getModulePartConfig('document',$module_srl); + if($document_config->use_vote_up!='N' && $member_srl!=$logged_info->member_srl){ + // 추천 버튼 추가 + $url = sprintf("doCallModuleAction('document','procDocumentVoteUp','%s')", $document_srl); + $oDocumentController->addDocumentPopupMenu($url,'cmd_vote','./modules/document/tpl/icons/vote_up.gif','javascript'); + } + + if($document_config->use_vote_down!='N' && $member_srl!=$logged_info->member_srl){ + // 비추천 버튼 추가 + $url= sprintf("doCallModuleAction('document','procDocumentVoteDown','%s')", $document_srl); + $oDocumentController->addDocumentPopupMenu($url,'cmd_vote_down','./modules/document/tpl/icons/vote_down.gif','javascript'); + } + + // 신고 기능 추가 + $url = sprintf("doCallModuleAction('document','procDocumentDeclare','%s')", $document_srl); + $oDocumentController->addDocumentPopupMenu($url,'cmd_declare','./modules/document/tpl/icons/declare.gif','javascript'); + + // 스크랩 버튼 추가 + $url = sprintf("doCallModuleAction('member','procMemberScrapDocument','%s')", $document_srl); + $oDocumentController->addDocumentPopupMenu($url,'cmd_scrap','./modules/document/tpl/icons/scrap.gif','javascript'); + } + + // 인쇄 버튼 추가 + $url = getUrl('','module','document','act','dispDocumentPrint','document_srl',$document_srl); + $oDocumentController->addDocumentPopupMenu($url,'cmd_print','./modules/document/tpl/icons/print.gif','printDocument'); + + // trigger 호출 (after) + ModuleHandler::triggerCall('document.getDocumentMenu', 'after', $menu_list); + + // 관리자일 경우 ip로 글 찾기 + if($logged_info->is_admin == 'Y') { + $oDocumentModel = &getModel('document'); + $oDocument = $oDocumentModel->getDocument($document_srl); + + if($oDocument->isExists()) { + // ip주소에 해당하는 글 찾기 + $url = getUrl('','module','admin','act','dispDocumentAdminList','search_target','ipaddress','search_keyword',$oDocument->get('ipaddress')); + $icon_path = './modules/member/tpl/images/icon_management.gif'; + $oDocumentController->addDocumentPopupMenu($url,'cmd_search_by_ipaddress',$icon_path,'TraceByIpaddress'); + + $url = sprintf("var params = new Array(); params['ipaddress']='%s'; exec_xml('spamfilter', 'procSpamfilterAdminInsertDeniedIP', params, completeCallModuleAction)", $oDocument-> getIpAddress()); + $oDocumentController->addDocumentPopupMenu($url,'cmd_add_ip_to_spamfilter','./modules/document/tpl/icons/declare.gif','javascript'); + } + } + + // 팝업메뉴의 언어 변경 + $menus = Context::get('document_popup_menu_list'); + $menus_count = count($menus); + for($i=0;$i<$menus_count;$i++) { + $menus[$i]->str = Context::getLang($menus[$i]->str); + } + + // 최종적으로 정리된 팝업메뉴 목록을 구함 + $this->add('menus', $menus); + } + + /** + * @brief module_srl에 해당하는 문서의 전체 갯수를 가져옴 + **/ + function getDocumentCount($module_srl, $search_obj = NULL) { + // 검색 옵션 추가 + $args->module_srl = $module_srl; + $args->s_title = $search_obj->s_title; + $args->s_content = $search_obj->s_content; + $args->s_user_name = $search_obj->s_user_name; + $args->s_member_srl = $search_obj->s_member_srl; + $args->s_ipaddress = $search_obj->s_ipaddress; + $args->s_regdate = $search_obj->s_regdate; + $args->category_srl = $search_obj->category_srl; + + $output = executeQuery('document.getDocumentCount', $args); + + // 전체 갯수를 return + $total_count = $output->data->count; + return (int)$total_count; + } + /** + * @brief 해당 document의 page 가져오기, module_srl이 없으면 전체에서.. + **/ + function getDocumentPage($oDocument, $opt) { + // 정렬 형식에 따라서 query args 변경 + switch($opt->sort_index) { + case 'update_order' : + if($opt->order_type == 'desc') $args->rev_update_order = $oDocument->get('update_order'); + else $args->update_order = $oDocument->get('update_order'); + break; + case 'regdate' : + if($opt->order_type == 'asc') $args->rev_regdate = $oDocument->get('regdate'); + else $args->regdate = $oDocument->get('regdate'); + break; + case 'voted_count' : + case 'readed_count' : + case 'comment_count' : + case 'title' : + return 1; + break; + default : + if($opt->order_type == 'desc') $args->rev_list_order = $oDocument->get('list_order'); + else $args->list_order = $oDocument->get('list_order'); + break; + } + $args->module_srl = $oDocument->get('module_srl'); + $args->sort_index = $opt->sort_index; + $args->order_type = $opt->order_type; + + // 검색 옵션 정리 + $searchOpt->search_target = $opt->search_target; + $searchOpt->search_keyword = $opt->search_keyword; + $this->_setSearchOption($searchOpt, &$args, &$query_id, &$use_division); + + // 전체 갯수를 구한후 해당 글의 페이지를 검색 + $output = executeQuery('document.getDocumentPage', $args); + $count = $output->data->count; + $page = (int)(($count-1)/$opt->list_count)+1; + return $page; + } + + /** + * @brief 카테고리의 정보를 가져옴 + **/ + function getCategory($category_srl) { + $args->category_srl = $category_srl; + $output = executeQuery('document.getCategory', $args); + + $node = $output->data; + if(!$node) return; + + if($node->group_srls) { + $group_srls = explode(',',$node->group_srls); + unset($node->group_srls); + $node->group_srls = $group_srls; + } else { + unset($node->group_srls); + $node->group_srls = array(); + } + return $node; + } + + /** + * @brief 특정 카테고리에 child가 있는지 체크 + **/ + function getCategoryChlidCount($category_srl) { + $args->category_srl = $category_srl; + $output = executeQuery('document.getChildCategoryCount',$args); + if($output->data->count > 0) return true; + return false; + } + + /** + * @brief 특정 모듈의 카테고리 목록을 가져옴 + * 속도나 여러가지 상황을 고려해서 카테고리 목록은 php로 생성된 script를 include하여 사용하는 것을 원칙으로 함 + **/ + function getCategoryList($module_srl) { + // 대상 모듈의 카테고리 파일을 불러옴 + $filename = sprintf("./files/cache/document_category/%s.php", $module_srl); + + // 대상 파일이 없으면 카테고리 캐시 파일을 재생성 + if(!file_exists($filename)) { + $oDocumentController = &getController('document'); + if(!$oDocumentController->makeCategoryFile($module_srl)) return array(); + } + + @include($filename); + + // 카테고리의 정리 + $document_category = array(); + $this->_arrangeCategory($document_category, $menu->list, 0); + return $document_category; + } + + /** + * @brief 카테고리를 1차 배열 형식으로 변경하는 내부 method + **/ + function _arrangeCategory(&$document_category, $list, $depth) { + if(!count($list)) return; + $idx = 0; + $list_order = array(); + foreach($list as $key => $val) { + $obj = null; + $obj->mid = $val['mid']; + $obj->module_srl = $val['module_srl']; + $obj->category_srl = $val['category_srl']; + $obj->parent_srl = $val['parent_srl']; + $obj->title = $obj->text = $val['text']; + $obj->expand = $val['expand']=='Y'?true:false; + $obj->color = $val['color']; + $obj->document_count = $val['document_count']; + $obj->depth = $depth; + $obj->child_count = 0; + $obj->childs = array(); + $obj->grant = $val['grant']; + + if(Context::get('mid') == $obj->mid && Context::get('category') == $obj->category_srl) $selected = true; + else $selected = false; + + $obj->selected = $selected; + + $list_order[$idx++] = $obj->category_srl; + + // 부모 카테고리가 있으면 자식노드들의 데이터를 적용 + if($obj->parent_srl) { + + $parent_srl = $obj->parent_srl; + $document_count = $obj->document_count; + $expand = $obj->expand; + if($selected) $expand = true; + + while($parent_srl) { + $document_category[$parent_srl]->document_count += $document_count; + $document_category[$parent_srl]->childs[] = $obj->category_srl; + $document_category[$parent_srl]->child_count = count($document_category[$parent_srl]->childs); + if($expand) $document_category[$parent_srl]->expand = $expand; + + $parent_srl = $document_category[$parent_srl]->parent_srl; + } + } + + $document_category[$key] = $obj; + + if(count($val['list'])) $this->_arrangeCategory($document_category, $val['list'], $depth+1); + } + $document_category[$list_order[0]]->first = true; + $document_category[$list_order[count($list_order)-1]]->last = true; + } + + /** + * @brief 카테고리에 속한 문서의 갯수를 구함 + **/ + function getCategoryDocumentCount($module_srl, $category_srl) { + $args->module_srl = $module_srl; + $args->category_srl = $category_srl; + $output = executeQuery('document.getCategoryDocumentCount', $args); + return (int)$output->data->count; + } + + /** + * @brief 문서 category정보의 xml 캐시 파일을 return + **/ + function getCategoryXmlFile($module_srl) { + $xml_file = sprintf('files/cache/document_category/%s.xml.php',$module_srl); + if(!file_exists($xml_file)) { + $oDocumentController = &getController('document'); + $oDocumentController->makeCategoryFile($module_srl); + } + return $xml_file; + } + + /** + * @brief 문서 category정보의 php 캐시 파일을 return + **/ + function getCategoryPhpFile($module_srl) { + $php_file = sprintf('files/cache/document_category/%s.php',$module_srl); + if(!file_exists($php_file)) { + $oDocumentController = &getController('document'); + $oDocumentController->makeCategoryFile($module_srl); + } + return $php_file; + } + + /** + * @brief 월별 글 보관현황을 가져옴 + **/ + function getMonthlyArchivedList($obj) { + if($obj->mid) { + $oModuleModel = &getModel('module'); + $obj->module_srl = $oModuleModel->getModuleSrlByMid($obj->mid); + unset($obj->mid); + } + + // 넘어온 module_srl은 array일 수도 있기에 array인지를 체크 + if(is_array($obj->module_srl)) $args->module_srl = implode(',', $obj->module_srl); + else $args->module_srl = $obj->module_srl; + + $output = executeQuery('document.getMonthlyArchivedList', $args); + if(!$output->toBool()||!$output->data) return $output; + + if(!is_array($output->data)) $output->data = array($output->data); + + return $output; + } + + /** + * @brief 특정달의 일별 글 현황을 가져옴 + **/ + function getDailyArchivedList($obj) { + if($obj->mid) { + $oModuleModel = &getModel('module'); + $obj->module_srl = $oModuleModel->getModuleSrlByMid($obj->mid); + unset($obj->mid); + } + + // 넘어온 module_srl은 array일 수도 있기에 array인지를 체크 + if(is_array($obj->module_srl)) $args->module_srl = implode(',', $obj->module_srl); + else $args->module_srl = $obj->module_srl; + $args->regdate = $obj->regdate; + + $output = executeQuery('document.getDailyArchivedList', $args); + if(!$output->toBool()) return $output; + + if(!is_array($output->data)) $output->data = array($output->data); + + return $output; + } + + /** + * @brief 특정 모듈의 분류를 구함 + **/ + function getDocumentCategories() { + if(!Context::get('is_logged')) return new Object(-1,'msg_not_permitted'); + $module_srl = Context::get('module_srl'); + $categories= $this->getCategoryList($module_srl); + $lang = Context::get('lang'); + + // 분류 없음 추가 + $output = "0,0,{$lang->none_category}\n"; + if($categories){ + foreach($categories as $category_srl => $category) { + $output .= sprintf("%d,%d,%s\n",$category_srl, $category->depth,$category->title); + } + } + $this->add('categories', $output); + } + + /** + * @brief 문서 설정 정보를 구함 + **/ + function getDocumentConfig() { + if(!$GLOBALS['__document_config__']) { + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('document'); + if(!$config->thumbnail_type) $config->thumbnail_type = 'crop'; + $GLOBALS['__document_config__'] = $config; + } + return $GLOBALS['__document_config__']; + } + + /** + * @brief 공통 :: 모듈의 확장 변수 관리 + * 모듈의 확장변수 관리는 모든 모듈에서 document module instance를 이용할때 사용할 수 있음 + **/ + function getExtraVarsHTML($module_srl) { + // 기존의 extra_keys 가져옴 + $extra_keys = $this->getExtraKeys($module_srl); + Context::set('extra_keys', $extra_keys); + + // grant 정보를 추출 + $oTemplate = &TemplateHandler::getInstance(); + return $oTemplate->compile($this->module_path.'tpl', 'extra_keys'); + } + + /** + * @brief 공통 :: 모듈의 카테고리 변수 관리 + **/ + function getCategoryHTML($module_srl) { + $category_xml_file = $this->getCategoryXmlFile($module_srl); + + Context::set('category_xml_file', $category_xml_file); + + Context::loadJavascriptPlugin('ui.tree'); + // grant 정보를 추출 + $oTemplate = &TemplateHandler::getInstance(); + return $oTemplate->compile($this->module_path.'tpl', 'category_list'); + } + + /** + * @brief 특정 카테고리의 정보를 이용하여 템플릿을 구한후 return + * 관리자 페이지에서 특정 메뉴의 정보를 추가하기 위해 서버에서 tpl을 컴파일 한후 컴파일 된 html을 직접 return + **/ + function getDocumentCategoryTplInfo() { + $oModuleModel = &getModel('module'); + $oMemberModel = &getModel('member'); + + // 해당 메뉴의 정보를 가져오기 위한 변수 설정 + $module_srl = Context::get('module_srl'); + $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); + + // 권한 체크 + $grant = $oModuleModel->getGrant($module_info, Context::get('logged_info')); + if(!$grant->manager) return new Object(-1,'msg_not_permitted'); + + $category_srl = Context::get('category_srl'); + $parent_srl = Context::get('parent_srl'); + + // 회원 그룹의 목록을 가져옴 + $group_list = $oMemberModel->getGroups($module_info->site_srl); + Context::set('group_list', $group_list); + + // parent_srl이 있고 category_srl 이 없으면 하부 메뉴 추가임 + if(!$category_srl && $parent_srl) { + // 상위 메뉴의 정보를 가져옴 + $parent_info = $this->getCategory($parent_srl); + + // 추가하려는 메뉴의 기본 변수 설정 + $category_info->category_srl = getNextSequence(); + $category_info->parent_srl = $parent_srl; + $category_info->parent_category_title = $parent_info->title; + + // root에 메뉴 추가하거나 기존 메뉴의 수정일 경우 + } else { + // category_srl 이 있으면 해당 메뉴의 정보를 가져온다 + if($category_srl) $category_info = $this->getCategory($category_srl); + + // 찾아진 값이 없다면 신규 메뉴 추가로 보고 category_srl값만 구해줌 + if(!$category_info->category_srl) { + $category_info->category_srl = getNextSequence(); + } + } + + + $category_info->title = htmlspecialchars($category_info->title); + Context::set('category_info', $category_info); + + // template 파일을 직접 컴파일한후 tpl변수에 담아서 return한다. + $oTemplate = &TemplateHandler::getInstance(); + $tpl = $oTemplate->compile('./modules/document/tpl', 'category_info'); + $tpl = str_replace("\n",'',$tpl); + + // 사용자 정의 언어 변경 + $oModuleController = &getController('module'); + $oModuleController->replaceDefinedLangCode($tpl); + + // return 할 변수 설정 + $this->add('tpl', $tpl); + } + + + function getDocumentSrlByAlias($mid, $alias) + { + if(!$mid || !$alias) return null; + $site_module_info = Context::get('site_module_info'); + $args->mid = $mid; + $args->alias_title = $alias; + $args->site_srl = $site_module_info->site_srl; + $output = executeQuery('document.getDocumentSrlByAlias', $args); + if(!$output->data) return null; + else return $output->data->document_srl; + } + + function getAlias($document_srl){ + if(!$document_srl) return null; + $args->document_srl = $document_srl; + $output = executeQueryArray('document.getAliases', $args); + + if(!$output->data) return null; + else return $output->data[0]->alias_title; + } + + function getHistories($document_srl, $list_count, $page) + { + $args->list_count = $list_count; + $args->page = $page; + $args->document_srl = $document_srl; + $output = executeQueryArray('document.getHistories', $args); + return $output; + } + + function getHistory($history_srl) + { + $args->history_srl = $history_srl; + $output = executeQuery('document.getHistory', $args); + return $output->data; + } + + /** + * @brief module_srl값을 가지는 문서의 목록을 가져옴 + **/ + function getTrashList($obj) { + + // 변수 체크 + $args->category_srl = $obj->category_srl?$obj->category_srl:null; + $args->sort_index = $obj->sort_index; + $args->order_type = $obj->order_type?$obj->order_type:'desc'; + $args->page = $obj->page?$obj->page:1; + $args->list_count = $obj->list_count?$obj->list_count:20; + $args->page_count = $obj->page_count?$obj->page_count:10; + + + // 검색 옵션 정리 + $search_target = $obj->search_target; + $search_keyword = $obj->search_keyword; + if($search_target && $search_keyword) { + switch($search_target) { + case 'title' : + case 'content' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->{"s_".$search_target} = $search_keyword; + $use_division = true; + break; + case 'title_content' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_title = $search_keyword; + $args->s_content = $search_keyword; + break; + case 'user_id' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_user_id = $search_keyword; + $args->sort_index = 'documents.'.$args->sort_index; + break; + case 'user_name' : + case 'nick_name' : + case 'email_address' : + case 'homepage' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->{"s_".$search_target} = $search_keyword; + break; + case 'is_notice' : + case 'is_secret' : + if($search_keyword=='N') $args->{"s_".$search_target} = 'N'; + elseif($search_keyword=='Y') $args->{"s_".$search_target} = 'Y'; + else $args->{"s_".$search_target} = ''; + break; + case 'member_srl' : + case 'readed_count' : + case 'voted_count' : + case 'comment_count' : + case 'trackback_count' : + case 'uploaded_count' : + $args->{"s_".$search_target} = (int)$search_keyword; + break; + case 'regdate' : + case 'last_update' : + case 'ipaddress' : + case 'tag' : + $args->{"s_".$search_target} = $search_keyword; + break; + } + } + + + $output = executeQueryArray('document.getTrashList', $args); + if($output->data){ + foreach($output->data as $key => $attribute) { + $oDocument = null; + $oDocument = new documentItem(); + $oDocument->setAttribute($attribute, false); + $attribute = $oDocument; + } + } + return $output; + } + + function getDocumentVotedMemberList() + { + $document_srl = Context::get('document_srl'); + if(!$document_srl) return new Object(-1,'msg_invalid_request'); + + $point = Context::get('point'); + if($point != -1) $point = 1; + + $oDocumentModel = &getModel('document'); + $oDocument = $oDocumentModel->getDocument($document_srl, false, false); + $module_srl = $oDocument->get('module_srl'); + if(!$module_srl) return new Object(-1, 'msg_invalid_request'); + + $oModuleModel = &getModel('module'); + $document_config = $oModuleModel->getModulePartConfig('document',$module_srl); + if($point == -1){ + if($document_config->use_vote_down!='S') return new Object(-1, 'msg_invalid_request'); + $args->below_point = 0; + }else{ + if($document_config->use_vote_up!='S') return new Object(-1, 'msg_invalid_request'); + $args->more_point = 0; + } + + $args->document_srl = $document_srl; + + $output = executeQueryArray('document.getVotedMemberList',$args); + if(!$output->toBool()) return $output; + + $oMemberModel = &getModel('member'); + if($output->data){ + foreach($output->data as $k => $d){ + $profile_image = $oMemberModel->getProfileImage($d->member_srl); + $output->data[$k]->src = $profile_image->src; + } + } + + $this->add('voted_member_list',$output->data); + } + + /** + * @brief 게시물 목록의 검색 옵션을 Setting함(2011.03.08 - cherryfilter) + * page변수가 없는 상태에서 page 값을 알아오는 method(getDocumentPage)는 검색하지 않은 값을 return해서 검색한 값을 가져오도록 검색옵션이 추가 됨. + * 검색옵션의 중복으로 인해 private method로 별도 분리 + **/ + function _setSearchOption($searchOpt, &$args, &$query_id, &$use_division) + { + $search_target = $searchOpt->search_target; + $search_keyword = $searchOpt->search_keyword; + + if($search_target && $search_keyword) { + switch($search_target) { + case 'title' : + case 'content' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->{"s_".$search_target} = $search_keyword; + $use_division = true; + break; + case 'title_content' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_title = $search_keyword; + $args->s_content = $search_keyword; + $use_division = true; + break; + case 'user_id' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_user_id = $search_keyword; + $args->sort_index = 'documents.'.$args->sort_index; + break; + case 'user_name' : + case 'nick_name' : + case 'email_address' : + case 'homepage' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->{"s_".$search_target} = $search_keyword; + break; + case 'is_notice' : + case 'is_secret' : + if($search_keyword=='N') $args->{"s_".$search_target} = 'N'; + elseif($search_keyword=='Y') $args->{"s_".$search_target} = 'Y'; + else $args->{"s_".$search_target} = ''; + break; + case 'member_srl' : + case 'readed_count' : + case 'voted_count' : + case 'comment_count' : + case 'trackback_count' : + case 'uploaded_count' : + $args->{"s_".$search_target} = (int)$search_keyword; + break; + case 'regdate' : + case 'last_update' : + case 'ipaddress' : + $args->{"s_".$search_target} = $search_keyword; + break; + case 'comment' : + $args->s_comment = $search_keyword; + $query_id = 'document.getDocumentListWithinComment'; + $use_division = true; + break; + case 'tag' : + $args->s_tags = str_replace(' ','%',$search_keyword); + $query_id = 'document.getDocumentListWithinTag'; + break; + default : + if(strpos($search_target,'extra_vars')!==false) { + $args->var_idx = substr($search_target, strlen('extra_vars')); + $args->var_value = str_replace(' ','%',$search_keyword); + $args->sort_index = 'documents.'.$args->sort_index; + $query_id = 'document.getDocumentListWithExtraVars'; + } + break; + } + } + } + } +?> diff --git a/modules/document/document.view.php b/modules/document/document.view.php index 4e2e3fb81..a88b17986 100644 --- a/modules/document/document.view.php +++ b/modules/document/document.view.php @@ -1,121 +1,121 @@ -getModuleInfoByDocumentSrl($document_srl); - - // document 객체를 생성. 기본 데이터 구조의 경우 document모듈만 쓰면 만사 해결.. -_-; - $oDocumentModel = &getModel('document'); - - // 선택된 문서 표시를 위한 객체 생성 - $oDocument = $oDocumentModel->getDocument($document_srl, $this->grant->manager); - if(!$oDocument->isExists()) return new Object(-1,'msg_invalid_request'); - - // 권한 체크 - if(!$oDocument->isAccessible()) return new Object(-1,'msg_not_permitted'); - - // 모듈 정보 세팅 - Context::set('module_info', $module_info); - - // 브라우저 타이틀 설정 - Context::setBrowserTitle($oDocument->getTitleText()); - Context::set('oDocument', $oDocument); - - Context::set('layout','none'); - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('print_page'); - } - - /** - * @brief 미리 보기 - **/ - function dispDocumentPreview() { - Context::set('layout','none'); - - $content = Context::get('content'); - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('preview_page'); - } - - /** - * @brief 관리자가 선택한 문서에 대한 관리 - **/ - function dispDocumentManageDocument() { - if(!Context::get('is_logged')) return new Object(-1,'msg_not_permitted'); - - // 선택한 목록을 세션에서 가져옴 - $flag_list = $_SESSION['document_management']; - if(count($flag_list)) { - foreach($flag_list as $key => $val) { - if(!is_bool($val)) continue; - $document_srl_list[] = $key; - } - } - - if(count($document_srl_list)) { - $oDocumentModel = &getModel('document'); - $document_list = $oDocumentModel->getDocuments($document_srl_list, $this->grant->is_admin); - Context::set('document_list', $document_list); - } - - $oModuleModel = &getModel('module'); - - // 모듈 카테고리 목록과 모듈 목록의 조합 - if(count($module_list)>1) Context::set('module_list', $module_categories); - - // 팝업 레이아웃 선택 - $this->setLayoutPath('./common/tpl'); - $this->setLayoutFile('popup_layout'); - - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('checked_list'); - } - - function triggerDispDocumentAdditionSetup(&$obj) { - $current_module_srl = Context::get('module_srl'); - $current_module_srls = Context::get('module_srls'); - - if(!$current_module_srl && !$current_module_srls) { - // 선택된 모듈의 정보를 가져옴 - $current_module_info = Context::get('current_module_info'); - $current_module_srl = $current_module_info->module_srl; - if(!$current_module_srl) return new Object(); - } - - $oModuleModel = &getModel('module'); - if($current_module_srl) - { - $document_config = $oModuleModel->getModulePartConfig('document', $current_module_srl); - } - if(!isset($document_config->use_history)) $document_config->use_history = 'N'; - Context::set('document_config', $document_config); - - $oTemplate = &TemplateHandler::getInstance(); - $tpl = $oTemplate->compile($this->module_path.'tpl', 'document_module_config'); - $obj .= $tpl; - - return new Object(); - } - - } -?> +getModuleInfoByDocumentSrl($document_srl); + + // document 객체를 생성. 기본 데이터 구조의 경우 document모듈만 쓰면 만사 해결.. -_-; + $oDocumentModel = &getModel('document'); + + // 선택된 문서 표시를 위한 객체 생성 + $oDocument = $oDocumentModel->getDocument($document_srl, $this->grant->manager); + if(!$oDocument->isExists()) return new Object(-1,'msg_invalid_request'); + + // 권한 체크 + if(!$oDocument->isAccessible()) return new Object(-1,'msg_not_permitted'); + + // 모듈 정보 세팅 + Context::set('module_info', $module_info); + + // 브라우저 타이틀 설정 + Context::setBrowserTitle($oDocument->getTitleText()); + Context::set('oDocument', $oDocument); + + Context::set('layout','none'); + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('print_page'); + } + + /** + * @brief 미리 보기 + **/ + function dispDocumentPreview() { + Context::set('layout','none'); + + $content = Context::get('content'); + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('preview_page'); + } + + /** + * @brief 관리자가 선택한 문서에 대한 관리 + **/ + function dispDocumentManageDocument() { + if(!Context::get('is_logged')) return new Object(-1,'msg_not_permitted'); + + // 선택한 목록을 세션에서 가져옴 + $flag_list = $_SESSION['document_management']; + if(count($flag_list)) { + foreach($flag_list as $key => $val) { + if(!is_bool($val)) continue; + $document_srl_list[] = $key; + } + } + + if(count($document_srl_list)) { + $oDocumentModel = &getModel('document'); + $document_list = $oDocumentModel->getDocuments($document_srl_list, $this->grant->is_admin); + Context::set('document_list', $document_list); + } + + $oModuleModel = &getModel('module'); + + // 모듈 카테고리 목록과 모듈 목록의 조합 + if(count($module_list)>1) Context::set('module_list', $module_categories); + + // 팝업 레이아웃 선택 + $this->setLayoutPath('./common/tpl'); + $this->setLayoutFile('popup_layout'); + + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('checked_list'); + } + + function triggerDispDocumentAdditionSetup(&$obj) { + $current_module_srl = Context::get('module_srl'); + $current_module_srls = Context::get('module_srls'); + + if(!$current_module_srl && !$current_module_srls) { + // 선택된 모듈의 정보를 가져옴 + $current_module_info = Context::get('current_module_info'); + $current_module_srl = $current_module_info->module_srl; + if(!$current_module_srl) return new Object(); + } + + $oModuleModel = &getModel('module'); + if($current_module_srl) + { + $document_config = $oModuleModel->getModulePartConfig('document', $current_module_srl); + } + if(!isset($document_config->use_history)) $document_config->use_history = 'N'; + Context::set('document_config', $document_config); + + $oTemplate = &TemplateHandler::getInstance(); + $tpl = $oTemplate->compile($this->module_path.'tpl', 'document_module_config'); + $obj .= $tpl; + + return new Object(); + } + + } +?> diff --git a/modules/document/lang/en.lang.php b/modules/document/lang/en.lang.php index 4bc6b61de..6d0c9b455 100644 --- a/modules/document/lang/en.lang.php +++ b/modules/document/lang/en.lang.php @@ -1,99 +1,99 @@ -document_list = 'Documents List'; - $lang->thumbnail_type = 'Thumbnail Type'; - $lang->thumbnail_crop = 'Crop'; - $lang->thumbnail_ratio = 'Ratio'; - $lang->cmd_delete_all_thumbnail = 'Delete all thumbnails'; - $lang->move_target_module = "Target module "; - $lang->title_bold = 'Bold'; - $lang->title_color = 'Color'; - $lang->new_document_count = 'New documents'; - - $lang->parent_category_title = 'Parent Category'; - $lang->category_title = 'Category'; - $lang->category_color = 'Category Font Color'; - $lang->expand = 'Expand'; - $lang->category_group_srls = 'Accessable Group'; - - $lang->cmd_make_child = 'Add Child Category'; - $lang->cmd_enable_move_category = "Change Category Position (Drag the top menu after selection)"; - - $lang->about_category_title = 'Please input category name'; - $lang->about_expand = 'By selecting this option, it will be always expanded'; - $lang->about_category_group_srls = 'Only selected group will be able to use current category'; - $lang->about_category_color = 'You can set font color of category.'; - - $lang->cmd_search_next = 'Search Next'; - - $lang->cmd_temp_save = 'Temporary Save'; - - $lang->cmd_toggle_checked_document = 'Reverse selected items'; - $lang->cmd_delete_checked_document = 'Delete selected'; - $lang->cmd_document_do = 'I want to'; - - $lang->msg_cart_is_null = 'Please select the articles to delete'; - $lang->msg_category_not_moved = 'Could not be moved'; - $lang->msg_is_secret = 'This is a secret article'; - $lang->msg_checked_document_is_deleted = '%d article(s) was(were) deleted'; - - // Search targets in admin page - $lang->search_target_list = array( - 'title' => 'Subject', - 'content' => 'Content', - 'user_id' => 'User ID', - 'member_srl' => 'Member Serial Number', - 'user_name' => 'User Name', - 'nick_name' => 'Nickname', - 'email_address' => 'Email', - 'homepage' => 'Homepage', - 'is_notice' => 'Notice', - 'is_secret' => 'Secret', - 'tags' => 'Tag', - 'readed_count' => 'Number of Views (over)', - 'voted_count' => 'Number of Votes (over)', - 'comment_count ' => 'Number of Comments (over)', - 'trackback_count ' => 'Number of Trackbacks (over)', - 'uploaded_count ' => 'Number of Attachments (over)', - 'regdate' => 'Date', - 'last_update' => 'Last Modified Date', - 'ipaddress' => 'IP Address', - ); - - $lang->alias = "Alias"; - $lang->history = "History"; - $lang->about_use_history = "History can restore documents to previous revisions"; - $lang->trace_only = "Trace only"; - - $lang->cmd_trash = 'Trashcan'; - $lang->cmd_restore = 'Restore'; - $lang->cmd_restore_all = 'Restore All'; - - $lang->in_trash = 'Trashcan'; - $lang->trash_nick_name = 'Deleter'; - $lang->trash_date = 'Deleted date'; - $lang->trash_description = 'Description'; - - $lang->search_target_trash_list = array( - 'title' => 'Title', - 'content' => 'Content', - 'user_id' => 'User ID', - 'member_srl' => 'Member srl', - 'user_name' => 'User name', - 'nick_name' => 'Nickname', - 'trash_member_srl' => 'Deleter srl', - 'trash_user_name' => 'Deleter name', - 'trash_nick_name' => 'Deleter nickname', - 'trash_date' => 'Deleted date', - 'trash_ipaddress' => 'Deleter IP address', - ); - - $lang->success_trashed = "Successfully moved to trashcan"; - $lang->msg_not_selected_document = 'There is no selected article.'; - $lang->show_voted_member = 'Show Voters'; -?> +document_list = 'Documents List'; + $lang->thumbnail_type = 'Thumbnail Type'; + $lang->thumbnail_crop = 'Crop'; + $lang->thumbnail_ratio = 'Ratio'; + $lang->cmd_delete_all_thumbnail = 'Delete all thumbnails'; + $lang->move_target_module = "Target module "; + $lang->title_bold = 'Bold'; + $lang->title_color = 'Color'; + $lang->new_document_count = 'New documents'; + + $lang->parent_category_title = 'Parent Category'; + $lang->category_title = 'Category'; + $lang->category_color = 'Category Font Color'; + $lang->expand = 'Expand'; + $lang->category_group_srls = 'Accessable Group'; + + $lang->cmd_make_child = 'Add Child Category'; + $lang->cmd_enable_move_category = "Change Category Position (Drag the top menu after selection)"; + + $lang->about_category_title = 'Please input category name'; + $lang->about_expand = 'By selecting this option, it will be always expanded'; + $lang->about_category_group_srls = 'Only selected group will be able to use current category'; + $lang->about_category_color = 'You can set font color of category.'; + + $lang->cmd_search_next = 'Search Next'; + + $lang->cmd_temp_save = 'Temporary Save'; + + $lang->cmd_toggle_checked_document = 'Reverse selected items'; + $lang->cmd_delete_checked_document = 'Delete selected'; + $lang->cmd_document_do = 'I want to'; + + $lang->msg_cart_is_null = 'Please select the articles to delete'; + $lang->msg_category_not_moved = 'Could not be moved'; + $lang->msg_is_secret = 'This is a secret article'; + $lang->msg_checked_document_is_deleted = '%d article(s) was(were) deleted'; + + // Search targets in admin page + $lang->search_target_list = array( + 'title' => 'Subject', + 'content' => 'Content', + 'user_id' => 'User ID', + 'member_srl' => 'Member Serial Number', + 'user_name' => 'User Name', + 'nick_name' => 'Nickname', + 'email_address' => 'Email', + 'homepage' => 'Homepage', + 'is_notice' => 'Notice', + 'is_secret' => 'Secret', + 'tags' => 'Tag', + 'readed_count' => 'Number of Views (over)', + 'voted_count' => 'Number of Votes (over)', + 'comment_count ' => 'Number of Comments (over)', + 'trackback_count ' => 'Number of Trackbacks (over)', + 'uploaded_count ' => 'Number of Attachments (over)', + 'regdate' => 'Date', + 'last_update' => 'Last Modified Date', + 'ipaddress' => 'IP Address', + ); + + $lang->alias = "Alias"; + $lang->history = "History"; + $lang->about_use_history = "History can restore documents to previous revisions"; + $lang->trace_only = "Trace only"; + + $lang->cmd_trash = 'Trashcan'; + $lang->cmd_restore = 'Restore'; + $lang->cmd_restore_all = 'Restore All'; + + $lang->in_trash = 'Trashcan'; + $lang->trash_nick_name = 'Deleter'; + $lang->trash_date = 'Deleted date'; + $lang->trash_description = 'Description'; + + $lang->search_target_trash_list = array( + 'title' => 'Title', + 'content' => 'Content', + 'user_id' => 'User ID', + 'member_srl' => 'Member srl', + 'user_name' => 'User name', + 'nick_name' => 'Nickname', + 'trash_member_srl' => 'Deleter srl', + 'trash_user_name' => 'Deleter name', + 'trash_nick_name' => 'Deleter nickname', + 'trash_date' => 'Deleted date', + 'trash_ipaddress' => 'Deleter IP address', + ); + + $lang->success_trashed = "Successfully moved to trashcan"; + $lang->msg_not_selected_document = 'There is no selected article.'; + $lang->show_voted_member = 'Show Voters'; +?> diff --git a/modules/document/lang/es.lang.php b/modules/document/lang/es.lang.php index 70c9eeeb4..49fa642e6 100644 --- a/modules/document/lang/es.lang.php +++ b/modules/document/lang/es.lang.php @@ -1,82 +1,82 @@ -document_list = 'Document list'; - $lang->thumbnail_type = 'Thumbnail Type'; - $lang->thumbnail_crop = 'Crop'; - $lang->thumbnail_ratio = 'Ratio'; - $lang->cmd_delete_all_thumbnail = 'Delete all thumbnails'; - $lang->move_target_module = "Módulo para cambiar de posición"; - $lang->title_bold = 'Bold'; - $lang->title_color = 'Color'; - $lang->new_document_count = '새글'; - - $lang->parent_category_title = 'Categoría Superior'; - $lang->category_title = 'Nombre de la categoría'; - $lang->category_color = '분류 폰트색깔'; - $lang->expand = 'Expandir'; - $lang->category_group_srls = 'Limitar el grupo'; - $lang->cmd_make_child = 'Agregar sub categoría'; - $lang->cmd_enable_move_category = "Cambiar la posición de la categoría. (arrastrar y soltar luego de haber selecionado)"; - $lang->about_category_title = 'Ingresar el nombre de la categoría.'; - $lang->about_expand = 'Si seleccionas esta opción, siempre estará expandido.'; - $lang->about_category_group_srls = '선택하신 그룹만 현재 카테고리를 지정할 수 있도록 합니다'; - $lang->about_category_color = '분류 폰트색깔을 지정합니다.'; - - $lang->cmd_search_next = 'Buscar siguiente'; - - $lang->cmd_temp_save = 'Guardar Temporales'; - - $lang->cmd_toggle_checked_document = 'Invertir los elementos seleccionados'; - $lang->cmd_delete_checked_document = 'Eliminar lo seleccionado'; - $lang->cmd_document_do = 'Usted ..'; - - $lang->msg_cart_is_null = 'Selecciona el documento que desea eliminar'; - $lang->msg_category_not_moved = 'No puede se movido'; - $lang->msg_is_secret = 'Es un documento secreto'; - $lang->msg_checked_document_is_deleted = 'Total de %d documentos han sido eliminados'; - - // Objetivo de búsqueda en la página del administrador - $lang->search_target_list = array( - 'title' => 'Título', - 'content' => 'Contenido', - 'user_id' => 'ID', - 'member_srl' => 'Número del usuario', - 'user_name' => 'Nombre del usuario', - 'nick_name' => 'Apodo', - 'email_address' => 'Correo Electrónico', - 'homepage' => 'Página web', - 'is_notice' => 'Aviso', - 'is_secret' => 'Secreto', - 'tags' => 'Etiqueta', - 'readed_count' => 'Número de leídos (sobre)', - 'voted_count' => 'Número de recomnedados (sobre)', - 'comment_count ' => 'Número de comentarios (sobre)', - 'trackback_count ' => 'Número de Trackback (sobre)', - 'uploaded_count ' => 'Número de archivos adjuntos (sobre)', - 'regdate' => 'Día del registro', - 'last_update' => 'Día de la última actualización', - 'ipaddress' => 'Dirección IP', - ); - $lang->alias = "Alias"; - $lang->history = "히스토리"; - $lang->about_use_history = "히스토리 기능의 사용여부를 지정합니다. 히스토리 기능을 사용할 경우 문서 수정시 이전 리비전을 기록하고 복원할 수 있습니다."; - $lang->trace_only = "흔적만 남김"; - - $lang->cmd_trash = 'Trashcan'; - $lang->cmd_restore = 'Restore'; - $lang->cmd_restore_all = 'Restore All'; - - $lang->in_trash = 'Trashcan'; - $lang->trash_nick_name = 'Person who deleted'; - $lang->trash_date = 'Deleted date'; - $lang->trash_description = 'Description'; - - $lang->success_trashed = "Successfully moved to trashcan"; - $lang->msg_not_selected_document = '선택된 문서가 없습니다.'; - $lang->show_voted_member = '사용자 노출'; -?> +document_list = 'Document list'; + $lang->thumbnail_type = 'Thumbnail Type'; + $lang->thumbnail_crop = 'Crop'; + $lang->thumbnail_ratio = 'Ratio'; + $lang->cmd_delete_all_thumbnail = 'Delete all thumbnails'; + $lang->move_target_module = "Módulo para cambiar de posición"; + $lang->title_bold = 'Bold'; + $lang->title_color = 'Color'; + $lang->new_document_count = '새글'; + + $lang->parent_category_title = 'Categoría Superior'; + $lang->category_title = 'Nombre de la categoría'; + $lang->category_color = '분류 폰트색깔'; + $lang->expand = 'Expandir'; + $lang->category_group_srls = 'Limitar el grupo'; + $lang->cmd_make_child = 'Agregar sub categoría'; + $lang->cmd_enable_move_category = "Cambiar la posición de la categoría. (arrastrar y soltar luego de haber selecionado)"; + $lang->about_category_title = 'Ingresar el nombre de la categoría.'; + $lang->about_expand = 'Si seleccionas esta opción, siempre estará expandido.'; + $lang->about_category_group_srls = '선택하신 그룹만 현재 카테고리를 지정할 수 있도록 합니다'; + $lang->about_category_color = '분류 폰트색깔을 지정합니다.'; + + $lang->cmd_search_next = 'Buscar siguiente'; + + $lang->cmd_temp_save = 'Guardar Temporales'; + + $lang->cmd_toggle_checked_document = 'Invertir los elementos seleccionados'; + $lang->cmd_delete_checked_document = 'Eliminar lo seleccionado'; + $lang->cmd_document_do = 'Usted ..'; + + $lang->msg_cart_is_null = 'Selecciona el documento que desea eliminar'; + $lang->msg_category_not_moved = 'No puede se movido'; + $lang->msg_is_secret = 'Es un documento secreto'; + $lang->msg_checked_document_is_deleted = 'Total de %d documentos han sido eliminados'; + + // Objetivo de búsqueda en la página del administrador + $lang->search_target_list = array( + 'title' => 'Título', + 'content' => 'Contenido', + 'user_id' => 'ID', + 'member_srl' => 'Número del usuario', + 'user_name' => 'Nombre del usuario', + 'nick_name' => 'Apodo', + 'email_address' => 'Correo Electrónico', + 'homepage' => 'Página web', + 'is_notice' => 'Aviso', + 'is_secret' => 'Secreto', + 'tags' => 'Etiqueta', + 'readed_count' => 'Número de leídos (sobre)', + 'voted_count' => 'Número de recomnedados (sobre)', + 'comment_count ' => 'Número de comentarios (sobre)', + 'trackback_count ' => 'Número de Trackback (sobre)', + 'uploaded_count ' => 'Número de archivos adjuntos (sobre)', + 'regdate' => 'Día del registro', + 'last_update' => 'Día de la última actualización', + 'ipaddress' => 'Dirección IP', + ); + $lang->alias = "Alias"; + $lang->history = "히스토리"; + $lang->about_use_history = "히스토리 기능의 사용여부를 지정합니다. 히스토리 기능을 사용할 경우 문서 수정시 이전 리비전을 기록하고 복원할 수 있습니다."; + $lang->trace_only = "흔적만 남김"; + + $lang->cmd_trash = 'Trashcan'; + $lang->cmd_restore = 'Restore'; + $lang->cmd_restore_all = 'Restore All'; + + $lang->in_trash = 'Trashcan'; + $lang->trash_nick_name = 'Person who deleted'; + $lang->trash_date = 'Deleted date'; + $lang->trash_description = 'Description'; + + $lang->success_trashed = "Successfully moved to trashcan"; + $lang->msg_not_selected_document = '선택된 문서가 없습니다.'; + $lang->show_voted_member = '사용자 노출'; +?> diff --git a/modules/document/lang/fr.lang.php b/modules/document/lang/fr.lang.php index 402957433..68966b8f2 100644 --- a/modules/document/lang/fr.lang.php +++ b/modules/document/lang/fr.lang.php @@ -1,83 +1,83 @@ - - * @brief Paquet du langage en français pour le module de Document - **/ - - $lang->document_list = 'Liste des Documents'; - $lang->thumbnail_type = 'Type de la Vignette'; - $lang->thumbnail_crop = 'Rogner'; - $lang->thumbnail_ratio = 'Proportion'; - $lang->cmd_delete_all_thumbnail = 'Supprimer toutes les vignettes'; - $lang->title_bold = 'Gras'; - $lang->title_color = 'Couleur'; - $lang->new_document_count = '새글'; - - $lang->parent_category_title = 'catégorie supérieure'; - $lang->category_title = 'Catégorie'; - $lang->category_color = '분류 폰트색깔'; - $lang->expand = 'Etendre'; - $lang->category_group_srls = 'Groupe Accessible'; - $lang->cmd_make_child = 'Ajouter une catégorie inférieure'; - $lang->cmd_enable_move_category = "Bouger la position de la catégorie (Cochez la case et puis glisser la catégorie que vous voulez déplacer)"; - $lang->about_category_title = 'Entrez le nom de la catégorie, S.V.P.'; - $lang->about_expand = 'Si vous cochez la case à cocher, ce sera toujours tendu'; - $lang->about_category_group_srls = 'Le groupe choisi seulement pourra utiliser la catégorie courante'; - $lang->about_category_color = 'You can set font color of category.'; - - $lang->cmd_search_next = 'Recherche Suivante'; - - $lang->cmd_temp_save = 'Conserver temporairement'; - - $lang->cmd_toggle_checked_document = 'Renverser les choisis'; - $lang->cmd_delete_checked_document = 'Supprimer les choisis'; - $lang->cmd_document_do = 'Vous voudriez..'; - - $lang->msg_cart_is_null = 'Choisissez les articles à supprimer, S.V.P.'; - $lang->msg_category_not_moved = 'Ne peut(peuvent) pas être bougé(s)'; - $lang->msg_is_secret = 'Cet article est secret'; - $lang->msg_checked_document_is_deleted = '%d article(s) est(sont) supprimé(s)'; - - $lang->move_target_module = "Module à déménager"; - - // Search targets in admin page - $lang->search_target_list = array( - 'title' => 'Titre', - 'content' => 'Contenu', - 'user_id' => 'Compte', - 'member_srl' => 'Numéro de Série du Membre', - 'user_name' => 'Nom', - 'nick_name' => 'Surnom', - 'email_address' => 'Mél', - 'homepage' => 'Page d\'accueil', - 'is_notice' => 'Notice', - 'is_secret' => 'Secret', - 'tags' => 'Balises', - 'readed_count' => 'Vues (surplus)', - 'voted_count' => 'Recommandés (surplus)', - 'comment_count ' => 'Commentaires (surplus)', - 'trackback_count ' => 'Rétroliens (surplus)', - 'uploaded_count ' => 'Fichiers Attachés (surplus)', - 'regdate' => 'Enrégistré', - 'last_update' => 'La Dernière Mise à Jour', - 'ipaddress' => 'Adresse IP', - ); - $lang->alias = "Alias"; - $lang->history = "히스토리"; - $lang->about_use_history = "히스토리 기능의 사용여부를 지정합니다. 히스토리 기능을 사용할 경우 문서 수정시 이전 리비전을 기록하고 복원할 수 있습니다."; - $lang->trace_only = "흔적만 남김"; - - $lang->cmd_trash = 'Trashcan'; - $lang->cmd_restore = 'Restore'; - $lang->cmd_restore_all = 'Restore All'; - - $lang->in_trash = 'Trashcan'; - $lang->trash_nick_name = 'Person who deleted'; - $lang->trash_date = 'Deleted date'; - $lang->trash_description = 'Description'; - - $lang->success_trashed = "Successfully moved to trashcan"; - $lang->msg_not_selected_document = '선택된 문서가 없습니다.'; - $lang->show_voted_member = '사용자 노출'; -?> + + * @brief Paquet du langage en français pour le module de Document + **/ + + $lang->document_list = 'Liste des Documents'; + $lang->thumbnail_type = 'Type de la Vignette'; + $lang->thumbnail_crop = 'Rogner'; + $lang->thumbnail_ratio = 'Proportion'; + $lang->cmd_delete_all_thumbnail = 'Supprimer toutes les vignettes'; + $lang->title_bold = 'Gras'; + $lang->title_color = 'Couleur'; + $lang->new_document_count = '새글'; + + $lang->parent_category_title = 'catégorie supérieure'; + $lang->category_title = 'Catégorie'; + $lang->category_color = '분류 폰트색깔'; + $lang->expand = 'Etendre'; + $lang->category_group_srls = 'Groupe Accessible'; + $lang->cmd_make_child = 'Ajouter une catégorie inférieure'; + $lang->cmd_enable_move_category = "Bouger la position de la catégorie (Cochez la case et puis glisser la catégorie que vous voulez déplacer)"; + $lang->about_category_title = 'Entrez le nom de la catégorie, S.V.P.'; + $lang->about_expand = 'Si vous cochez la case à cocher, ce sera toujours tendu'; + $lang->about_category_group_srls = 'Le groupe choisi seulement pourra utiliser la catégorie courante'; + $lang->about_category_color = 'You can set font color of category.'; + + $lang->cmd_search_next = 'Recherche Suivante'; + + $lang->cmd_temp_save = 'Conserver temporairement'; + + $lang->cmd_toggle_checked_document = 'Renverser les choisis'; + $lang->cmd_delete_checked_document = 'Supprimer les choisis'; + $lang->cmd_document_do = 'Vous voudriez..'; + + $lang->msg_cart_is_null = 'Choisissez les articles à supprimer, S.V.P.'; + $lang->msg_category_not_moved = 'Ne peut(peuvent) pas être bougé(s)'; + $lang->msg_is_secret = 'Cet article est secret'; + $lang->msg_checked_document_is_deleted = '%d article(s) est(sont) supprimé(s)'; + + $lang->move_target_module = "Module à déménager"; + + // Search targets in admin page + $lang->search_target_list = array( + 'title' => 'Titre', + 'content' => 'Contenu', + 'user_id' => 'Compte', + 'member_srl' => 'Numéro de Série du Membre', + 'user_name' => 'Nom', + 'nick_name' => 'Surnom', + 'email_address' => 'Mél', + 'homepage' => 'Page d\'accueil', + 'is_notice' => 'Notice', + 'is_secret' => 'Secret', + 'tags' => 'Balises', + 'readed_count' => 'Vues (surplus)', + 'voted_count' => 'Recommandés (surplus)', + 'comment_count ' => 'Commentaires (surplus)', + 'trackback_count ' => 'Rétroliens (surplus)', + 'uploaded_count ' => 'Fichiers Attachés (surplus)', + 'regdate' => 'Enrégistré', + 'last_update' => 'La Dernière Mise à Jour', + 'ipaddress' => 'Adresse IP', + ); + $lang->alias = "Alias"; + $lang->history = "히스토리"; + $lang->about_use_history = "히스토리 기능의 사용여부를 지정합니다. 히스토리 기능을 사용할 경우 문서 수정시 이전 리비전을 기록하고 복원할 수 있습니다."; + $lang->trace_only = "흔적만 남김"; + + $lang->cmd_trash = 'Trashcan'; + $lang->cmd_restore = 'Restore'; + $lang->cmd_restore_all = 'Restore All'; + + $lang->in_trash = 'Trashcan'; + $lang->trash_nick_name = 'Person who deleted'; + $lang->trash_date = 'Deleted date'; + $lang->trash_description = 'Description'; + + $lang->success_trashed = "Successfully moved to trashcan"; + $lang->msg_not_selected_document = '선택된 문서가 없습니다.'; + $lang->show_voted_member = '사용자 노출'; +?> diff --git a/modules/document/lang/jp.lang.php b/modules/document/lang/jp.lang.php index 756a54e7c..3712e05bf 100644 --- a/modules/document/lang/jp.lang.php +++ b/modules/document/lang/jp.lang.php @@ -1,101 +1,101 @@ -document_list = 'ドキュメントリスト'; - $lang->thumbnail_type = 'サムネールタイプ'; - $lang->thumbnail_crop = 'トリミングする'; - $lang->thumbnail_ratio = '比率に合わせる'; - $lang->cmd_delete_all_thumbnail = 'すべてのサムネール削除'; - $lang->title_bold = 'タイトル太字'; - $lang->title_color = 'タイトルの色'; - $lang->new_document_count = '新規'; - - $lang->parent_category_title = '上位カテゴリ名'; - $lang->category_title = 'カテゴリ名'; - $lang->category_color = 'カテゴリフォント色'; - $lang->expand = '拡張表示'; - $lang->category_group_srls = 'グループ制限'; - - $lang->cmd_make_child = '下位カテゴリ追加'; - $lang->cmd_enable_move_category = 'カテゴリ位置変更(選択後上のメニューをドラッグして下さい)'; - - $lang->about_category_title = 'カテゴリ名を入力して下さい。'; - $lang->about_expand = 'チェックすると常に展開された状態になります。'; - $lang->about_category_group_srls = '選択したグループのみ、現在のカテゴリの指定が出来ます。'; - $lang->about_category_color = 'カテゴリのフォント色を設定します。'; - - $lang->cmd_search_next = '継続検索'; - - $lang->cmd_temp_save = '一時保存'; - - $lang->cmd_toggle_checked_document = '選択項目反転'; - $lang->cmd_delete_checked_document = '選択項目削除'; - $lang->cmd_document_do = 'この書き込みを..'; - - $lang->msg_cart_is_null = '削除する書き込みを選択して下さい。'; - $lang->msg_category_not_moved = '移動出来ません。'; - $lang->msg_is_secret = '非公開設定の書き込みです。'; - $lang->msg_checked_document_is_deleted = '%d個の書き込みが削除されました。'; - - $lang->move_target_module = '移動対象モジュール'; - - // 管理者ページで検索する内容 - $lang->search_target_list = array( - 'title' => 'タイトル', - 'content' => '内容', - 'user_id' => 'ユーザーID', - 'member_srl' => '会員番号', - 'user_name' => 'ユーザ名', - 'nick_name' => 'ニックネーム', - 'email_address' => 'メールアドレス', - 'homepage' => 'ホームページURL', - 'is_notice' => 'お知らせ', - 'is_secret' => '非公開書き込み', - 'tags' => 'タグ', - 'readed_count' => '閲覧数(以上)', - 'voted_count' => '推薦数(以上)', - 'comment_count ' => 'コメント数(以上)', - 'trackback_count ' => 'トラックバック数(以上)', - 'uploaded_count ' => '添付ファイル数(以上)', - 'regdate' => '登録日', - 'last_update' => '最近修正日', - 'ipaddress' => 'IPアドレス', - ); - - $lang->alias = 'アリアス(Alias)'; - $lang->history = '履歴'; - $lang->about_use_history = '履歴機能を使用するかを設定します。履歴機能を使用すると文書修正のバージョンを管理し、過去のバージョンから復元することも可能です。'; - $lang->trace_only = '記録だけ残す'; - - $lang->cmd_trash = "ごみ箱"; - $lang->cmd_restore = "差し戻し"; - $lang->cmd_restore_all = "すべて差し戻し"; - - $lang->in_trash = "ごみ箱"; - $lang->trash_nick_name = "削除者のニックネーム"; - $lang->trash_date = "削除日"; - $lang->trash_description = "理由"; - - // 管理者ページでのごみ箱の検索対象 - $lang->search_target_trash_list = array( - 'title' => 'タイトル', - 'content' => '内容', - 'user_id' => 'ユーザーID', - 'member_srl' => '会員番号', - 'user_name' => 'ユーザー名', - 'nick_name' => 'ニックネーム', - 'trash_member_srl' => '削除者会員番号', - 'trash_user_name' => '削除者ユーザー名', - 'trash_nick_name' => '削除者ニックネーム', - 'trash_date' => '削除日', - 'trash_ipaddress' => '削除者のIPアドレス', - ); - - $lang->success_trashed = "ごみ箱に移動させました。"; - $lang->msg_not_selected_document = '選択された書き込みがありません。'; - $lang->show_voted_member = '사용자 노출'; -?> +document_list = 'ドキュメントリスト'; + $lang->thumbnail_type = 'サムネールタイプ'; + $lang->thumbnail_crop = 'トリミングする'; + $lang->thumbnail_ratio = '比率に合わせる'; + $lang->cmd_delete_all_thumbnail = 'すべてのサムネール削除'; + $lang->title_bold = 'タイトル太字'; + $lang->title_color = 'タイトルの色'; + $lang->new_document_count = '新規'; + + $lang->parent_category_title = '上位カテゴリ名'; + $lang->category_title = 'カテゴリ名'; + $lang->category_color = 'カテゴリフォント色'; + $lang->expand = '拡張表示'; + $lang->category_group_srls = 'グループ制限'; + + $lang->cmd_make_child = '下位カテゴリ追加'; + $lang->cmd_enable_move_category = 'カテゴリ位置変更(選択後上のメニューをドラッグして下さい)'; + + $lang->about_category_title = 'カテゴリ名を入力して下さい。'; + $lang->about_expand = 'チェックすると常に展開された状態になります。'; + $lang->about_category_group_srls = '選択したグループのみ、現在のカテゴリの指定が出来ます。'; + $lang->about_category_color = 'カテゴリのフォント色を設定します。'; + + $lang->cmd_search_next = '継続検索'; + + $lang->cmd_temp_save = '一時保存'; + + $lang->cmd_toggle_checked_document = '選択項目反転'; + $lang->cmd_delete_checked_document = '選択項目削除'; + $lang->cmd_document_do = 'この書き込みを..'; + + $lang->msg_cart_is_null = '削除する書き込みを選択して下さい。'; + $lang->msg_category_not_moved = '移動出来ません。'; + $lang->msg_is_secret = '非公開設定の書き込みです。'; + $lang->msg_checked_document_is_deleted = '%d個の書き込みが削除されました。'; + + $lang->move_target_module = '移動対象モジュール'; + + // 管理者ページで検索する内容 + $lang->search_target_list = array( + 'title' => 'タイトル', + 'content' => '内容', + 'user_id' => 'ユーザーID', + 'member_srl' => '会員番号', + 'user_name' => 'ユーザ名', + 'nick_name' => 'ニックネーム', + 'email_address' => 'メールアドレス', + 'homepage' => 'ホームページURL', + 'is_notice' => 'お知らせ', + 'is_secret' => '非公開書き込み', + 'tags' => 'タグ', + 'readed_count' => '閲覧数(以上)', + 'voted_count' => '推薦数(以上)', + 'comment_count ' => 'コメント数(以上)', + 'trackback_count ' => 'トラックバック数(以上)', + 'uploaded_count ' => '添付ファイル数(以上)', + 'regdate' => '登録日', + 'last_update' => '最近修正日', + 'ipaddress' => 'IPアドレス', + ); + + $lang->alias = 'アリアス(Alias)'; + $lang->history = '履歴'; + $lang->about_use_history = '履歴機能を使用するかを設定します。履歴機能を使用すると文書修正のバージョンを管理し、過去のバージョンから復元することも可能です。'; + $lang->trace_only = '記録だけ残す'; + + $lang->cmd_trash = "ごみ箱"; + $lang->cmd_restore = "差し戻し"; + $lang->cmd_restore_all = "すべて差し戻し"; + + $lang->in_trash = "ごみ箱"; + $lang->trash_nick_name = "削除者のニックネーム"; + $lang->trash_date = "削除日"; + $lang->trash_description = "理由"; + + // 管理者ページでのごみ箱の検索対象 + $lang->search_target_trash_list = array( + 'title' => 'タイトル', + 'content' => '内容', + 'user_id' => 'ユーザーID', + 'member_srl' => '会員番号', + 'user_name' => 'ユーザー名', + 'nick_name' => 'ニックネーム', + 'trash_member_srl' => '削除者会員番号', + 'trash_user_name' => '削除者ユーザー名', + 'trash_nick_name' => '削除者ニックネーム', + 'trash_date' => '削除日', + 'trash_ipaddress' => '削除者のIPアドレス', + ); + + $lang->success_trashed = "ごみ箱に移動させました。"; + $lang->msg_not_selected_document = '選択された書き込みがありません。'; + $lang->show_voted_member = '사용자 노출'; +?> diff --git a/modules/document/lang/ru.lang.php b/modules/document/lang/ru.lang.php index c91135b9a..506b3d09f 100644 --- a/modules/document/lang/ru.lang.php +++ b/modules/document/lang/ru.lang.php @@ -1,105 +1,105 @@ -document_list = 'Список документов'; - $lang->thumbnail_type = 'Тип миниатюры'; - $lang->thumbnail_crop = 'Обрезать'; - $lang->thumbnail_ratio = 'Соотношение'; - $lang->cmd_delete_all_thumbnail = 'Удалить все миниарюры'; - $lang->move_target_module = "Переместить в"; - $lang->title_bold = 'Жирное название'; - $lang->title_color = 'Цвет названия'; - $lang->new_document_count = 'Новые документы'; - - $lang->parent_category_title = 'Название верхней категории'; - $lang->category_title = 'Категория'; - $lang->category_color = 'Цвет шрифта категории'; - $lang->expand = 'Развернуть'; - $lang->category_group_srls = 'Доступные группы'; - - $lang->about_category_title = 'Добавьте дочернюю категорию'; - $lang->cmd_enable_move_category = 'Изменить местоположение категории(после выделения перетащите верхнее меню)'; - - $lang->about_category_title = 'Введите название категории'; - $lang->about_expand = 'Если эта опция выбрана, расширение будут применено всегда'; - $lang->about_category_group_srls = 'Только выбранные группы можно отнести к этой категории'; - $lang->about_category_color = 'Установить цвет шрифта категории. ex) red или #ff0000'; - - $lang->cmd_search_next = 'Искать дальше'; - - $lang->about_category_color = '분류 폰트색깔을 지정합니다.'; - $lang->cmd_temp_save = 'Сохранить временно'; - - $lang->cmd_toggle_checked_document = 'Перевернуть выбранные объекты'; - $lang->cmd_delete_checked_document = 'Удалить выбранные'; - $lang->cmd_document_do = 'Эту запись...'; - - $lang->msg_cart_is_null = 'Выберите записи,которые Вы хотите удалить'; - $lang->msg_category_not_moved = 'Невозможно переместить'; - $lang->msg_is_secret = 'Секретная запись'; - $lang->msg_checked_document_is_deleted = '%d записей удалено'; - - $lang->move_target_module = 'Этот модуль'; - - // Search targets in admin page - $lang->search_target_list = array( - 'title' => 'Тема', - 'content' => 'Содержание', - 'user_id' => 'ID пользователя', - 'member_srl' => 'No. пользователя', - 'user_name' => 'Имя пользователя', - 'nick_name' => 'Ник', - 'email_address' => 'Email', - 'homepage' => 'Домашняя страница', - 'is_notice' => 'Объявления', - 'is_secret' => 'Секретная запись', - 'tags' => 'Тег', - 'readed_count' => 'Количество просмотров (свыше)', - 'voted_count' => 'Количество голосов (свыше)', - 'comment_count ' => 'Количество записей (свыше)', - 'trackback_count ' => 'Количество трекбеков (свыше)', - 'uploaded_count ' => 'Количество вложений (прикрепленных файлов) (свыше)', - 'regdate' => 'Дата регистрации', - 'last_update' => 'Дата последнего обновления', - 'ipaddress' => 'IP-Адрес', - ); - - $lang->alias = "Alias"; - $lang->history = "History"; - $lang->about_use_history = "Determine whether to enable history feature, if it is enabled, update history would be stored and possible to restore old revisions."; - $lang->trace_only = "Trace only"; - - $lang->cmd_trash = 'Корзина'; - $lang->cmd_restore = 'Восстановить'; - $lang->cmd_restore_all = 'Восстановить все'; - - $lang->in_trash = 'Корзина'; - $lang->trash_nick_name = 'Ник удалителя'; - $lang->trash_date = 'Дата удаления'; - $lang->trash_description = 'Описание'; - - // Возможен поиск на странице админа - $lang->search_target_trash_list = array( - 'title' => 'Тема', - 'content' => 'Содержание', - 'user_id' => 'ID', - 'member_srl' =>'No пользователя', - 'user_name' => 'Имя пользователя', - 'nick_name' => 'Ник', - 'trash_member_srl' => 'Номер удалителя', - 'trash_user_name' => 'Имя удалителя', - 'trash_nick_name' => 'Ник удалителя', - 'trash_date' => 'Дата удаления', - 'trash_ipaddress' => 'IP адрес удалителя', - ); - - $lang->success_trashed = 'Удалено в корзину'; - - $lang->success_trashed = "Successfully moved to trashcan"; - $lang->msg_not_selected_document = '선택된 문서가 없습니다.'; - $lang->show_voted_member = '사용자 노출'; -?> +document_list = 'Список документов'; + $lang->thumbnail_type = 'Тип миниатюры'; + $lang->thumbnail_crop = 'Обрезать'; + $lang->thumbnail_ratio = 'Соотношение'; + $lang->cmd_delete_all_thumbnail = 'Удалить все миниарюры'; + $lang->move_target_module = "Переместить в"; + $lang->title_bold = 'Жирное название'; + $lang->title_color = 'Цвет названия'; + $lang->new_document_count = 'Новые документы'; + + $lang->parent_category_title = 'Название верхней категории'; + $lang->category_title = 'Категория'; + $lang->category_color = 'Цвет шрифта категории'; + $lang->expand = 'Развернуть'; + $lang->category_group_srls = 'Доступные группы'; + + $lang->about_category_title = 'Добавьте дочернюю категорию'; + $lang->cmd_enable_move_category = 'Изменить местоположение категории(после выделения перетащите верхнее меню)'; + + $lang->about_category_title = 'Введите название категории'; + $lang->about_expand = 'Если эта опция выбрана, расширение будут применено всегда'; + $lang->about_category_group_srls = 'Только выбранные группы можно отнести к этой категории'; + $lang->about_category_color = 'Установить цвет шрифта категории. ex) red или #ff0000'; + + $lang->cmd_search_next = 'Искать дальше'; + + $lang->about_category_color = '분류 폰트색깔을 지정합니다.'; + $lang->cmd_temp_save = 'Сохранить временно'; + + $lang->cmd_toggle_checked_document = 'Перевернуть выбранные объекты'; + $lang->cmd_delete_checked_document = 'Удалить выбранные'; + $lang->cmd_document_do = 'Эту запись...'; + + $lang->msg_cart_is_null = 'Выберите записи,которые Вы хотите удалить'; + $lang->msg_category_not_moved = 'Невозможно переместить'; + $lang->msg_is_secret = 'Секретная запись'; + $lang->msg_checked_document_is_deleted = '%d записей удалено'; + + $lang->move_target_module = 'Этот модуль'; + + // Search targets in admin page + $lang->search_target_list = array( + 'title' => 'Тема', + 'content' => 'Содержание', + 'user_id' => 'ID пользователя', + 'member_srl' => 'No. пользователя', + 'user_name' => 'Имя пользователя', + 'nick_name' => 'Ник', + 'email_address' => 'Email', + 'homepage' => 'Домашняя страница', + 'is_notice' => 'Объявления', + 'is_secret' => 'Секретная запись', + 'tags' => 'Тег', + 'readed_count' => 'Количество просмотров (свыше)', + 'voted_count' => 'Количество голосов (свыше)', + 'comment_count ' => 'Количество записей (свыше)', + 'trackback_count ' => 'Количество трекбеков (свыше)', + 'uploaded_count ' => 'Количество вложений (прикрепленных файлов) (свыше)', + 'regdate' => 'Дата регистрации', + 'last_update' => 'Дата последнего обновления', + 'ipaddress' => 'IP-Адрес', + ); + + $lang->alias = "Alias"; + $lang->history = "History"; + $lang->about_use_history = "Determine whether to enable history feature, if it is enabled, update history would be stored and possible to restore old revisions."; + $lang->trace_only = "Trace only"; + + $lang->cmd_trash = 'Корзина'; + $lang->cmd_restore = 'Восстановить'; + $lang->cmd_restore_all = 'Восстановить все'; + + $lang->in_trash = 'Корзина'; + $lang->trash_nick_name = 'Ник удалителя'; + $lang->trash_date = 'Дата удаления'; + $lang->trash_description = 'Описание'; + + // Возможен поиск на странице админа + $lang->search_target_trash_list = array( + 'title' => 'Тема', + 'content' => 'Содержание', + 'user_id' => 'ID', + 'member_srl' =>'No пользователя', + 'user_name' => 'Имя пользователя', + 'nick_name' => 'Ник', + 'trash_member_srl' => 'Номер удалителя', + 'trash_user_name' => 'Имя удалителя', + 'trash_nick_name' => 'Ник удалителя', + 'trash_date' => 'Дата удаления', + 'trash_ipaddress' => 'IP адрес удалителя', + ); + + $lang->success_trashed = 'Удалено в корзину'; + + $lang->success_trashed = "Successfully moved to trashcan"; + $lang->msg_not_selected_document = '선택된 문서가 없습니다.'; + $lang->show_voted_member = '사용자 노출'; +?> diff --git a/modules/document/lang/tr.lang.php b/modules/document/lang/tr.lang.php index 7aeb53892..8267c0947 100644 --- a/modules/document/lang/tr.lang.php +++ b/modules/document/lang/tr.lang.php @@ -1,99 +1,99 @@ -document_list = 'Belge Listesi'; - $lang->thumbnail_type = 'Küçük Resim Türü'; - $lang->thumbnail_crop = 'Kırpılmış'; - $lang->thumbnail_ratio = 'Oran'; - $lang->cmd_delete_all_thumbnail = 'Tüm küçük resimleri sil'; - $lang->move_target_module = "Hedef modül "; - $lang->title_bold = 'Kalın'; - $lang->title_color = 'Renk'; - $lang->new_document_count = 'Yeni belgeler'; - - $lang->parent_category_title = 'Üst Kategori'; - $lang->category_title = 'Kategori'; - $lang->category_color = 'Kategori Yazı Rengi'; - $lang->expand = 'Genişlet'; - $lang->category_group_srls = 'Erişilebilir Grup'; - - $lang->cmd_make_child = 'Alt Kategori Ekle'; - $lang->cmd_enable_move_category = "Kategori konumunu değiştir (Seçtikten sonra anamenüyü taşıyınız)"; - - $lang->about_category_title = 'Lütfen kategori ismi giriniz'; - $lang->about_expand = 'Bu seçimle, her zaman genişletilmiş olacaktır'; - $lang->about_category_group_srls = 'Sadece seçilen grup geçerli kategoriyi kullanabilecektir'; - $lang->about_category_color = 'Kategorinin yazı rengini ayarlayabilirsiniz.'; - - $lang->cmd_search_next = 'Sonrakini Ara'; - - $lang->cmd_temp_save = 'Geçiçi olarak Kaydet'; - - $lang->cmd_toggle_checked_document = 'Seçili ögeleri ters çevir'; - $lang->cmd_delete_checked_document = 'Seçilenleri Sil'; - $lang->cmd_document_do = 'Şunu yap'; - - $lang->msg_cart_is_null = 'Lütfen silinecek makaleleri seçiniz'; - $lang->msg_category_not_moved = 'Taşınamıyor'; - $lang->msg_is_secret = 'Bu gizli bir makaledir'; - $lang->msg_checked_document_is_deleted = '%d makale silinmiştir'; - - // Search targets in admin page - $lang->search_target_list = array( - 'title' => 'Konu', - 'content' => 'İçerik', - 'user_id' => 'Kullanıcı Kimliği', - 'member_srl' => 'Üye Seri Numarası', - 'user_name' => 'Kullanıcı İsmi', - 'nick_name' => 'Rumuz', - 'email_address' => 'Email', - 'homepage' => 'Anasayfa', - 'is_notice' => 'Bildirim', - 'is_secret' => 'Gizli', - 'tags' => 'Etiket', - 'readed_count' => 'Gösterim Sayısı (over)', - 'voted_count' => 'Oylama Sayısı (over)', - 'comment_count ' => 'Yorum Sayısı (over)', - 'trackback_count ' => 'Geri İzleme Sayısı (over)', - 'uploaded_count ' => 'Eklerin Sayısı (over)', - 'regdate' => 'Tarih', - 'last_update' => 'Son Güncelleme Tarihi', - 'ipaddress' => 'IP Adresi', - ); - - $lang->alias = "Diğer Adıyla"; - $lang->history = "Geçmiş"; - $lang->about_use_history = "Geçmiş, belgeleri önceki değişikliklerine dönüştürmek içindir."; - $lang->trace_only = "Sadece izleme"; - - $lang->cmd_trash = 'Çöp Kutusu'; - $lang->cmd_restore = 'Geri Yükleme'; - $lang->cmd_restore_all = 'Hepsini Geri Yükle'; - - $lang->in_trash = 'Çöp Kutusu'; - $lang->trash_nick_name = 'Silici'; - $lang->trash_date = 'Silinme Tarihi'; - $lang->trash_description = 'Açıklama'; - - $lang->search_target_trash_list = array( - 'title' => 'Başlık', - 'content' => 'İçerik', - 'user_id' => 'Kullanıcı Kimliği', - 'member_srl' => 'Üye Diziseli', - 'user_name' => 'Kullanıcı İsmi', - 'nick_name' => 'Rumuz', - 'trash_member_srl' => 'Silici Diziseli', - 'trash_user_name' => 'Silici İsmi', - 'trash_nick_name' => 'Silici rumuzu', - 'trash_date' => 'Silinme Tarihi', - 'trash_ipaddress' => 'Silici IP adresi', - ); - - $lang->success_trashed = "Başarıyla silindi"; - $lang->msg_not_selected_document = 'Hiçbir makale seçilmedi.'; - $lang->show_voted_member = '사용자 노출'; -?> +document_list = 'Belge Listesi'; + $lang->thumbnail_type = 'Küçük Resim Türü'; + $lang->thumbnail_crop = 'Kırpılmış'; + $lang->thumbnail_ratio = 'Oran'; + $lang->cmd_delete_all_thumbnail = 'Tüm küçük resimleri sil'; + $lang->move_target_module = "Hedef modül "; + $lang->title_bold = 'Kalın'; + $lang->title_color = 'Renk'; + $lang->new_document_count = 'Yeni belgeler'; + + $lang->parent_category_title = 'Üst Kategori'; + $lang->category_title = 'Kategori'; + $lang->category_color = 'Kategori Yazı Rengi'; + $lang->expand = 'Genişlet'; + $lang->category_group_srls = 'Erişilebilir Grup'; + + $lang->cmd_make_child = 'Alt Kategori Ekle'; + $lang->cmd_enable_move_category = "Kategori konumunu değiştir (Seçtikten sonra anamenüyü taşıyınız)"; + + $lang->about_category_title = 'Lütfen kategori ismi giriniz'; + $lang->about_expand = 'Bu seçimle, her zaman genişletilmiş olacaktır'; + $lang->about_category_group_srls = 'Sadece seçilen grup geçerli kategoriyi kullanabilecektir'; + $lang->about_category_color = 'Kategorinin yazı rengini ayarlayabilirsiniz.'; + + $lang->cmd_search_next = 'Sonrakini Ara'; + + $lang->cmd_temp_save = 'Geçiçi olarak Kaydet'; + + $lang->cmd_toggle_checked_document = 'Seçili ögeleri ters çevir'; + $lang->cmd_delete_checked_document = 'Seçilenleri Sil'; + $lang->cmd_document_do = 'Şunu yap'; + + $lang->msg_cart_is_null = 'Lütfen silinecek makaleleri seçiniz'; + $lang->msg_category_not_moved = 'Taşınamıyor'; + $lang->msg_is_secret = 'Bu gizli bir makaledir'; + $lang->msg_checked_document_is_deleted = '%d makale silinmiştir'; + + // Search targets in admin page + $lang->search_target_list = array( + 'title' => 'Konu', + 'content' => 'İçerik', + 'user_id' => 'Kullanıcı Kimliği', + 'member_srl' => 'Üye Seri Numarası', + 'user_name' => 'Kullanıcı İsmi', + 'nick_name' => 'Rumuz', + 'email_address' => 'Email', + 'homepage' => 'Anasayfa', + 'is_notice' => 'Bildirim', + 'is_secret' => 'Gizli', + 'tags' => 'Etiket', + 'readed_count' => 'Gösterim Sayısı (over)', + 'voted_count' => 'Oylama Sayısı (over)', + 'comment_count ' => 'Yorum Sayısı (over)', + 'trackback_count ' => 'Geri İzleme Sayısı (over)', + 'uploaded_count ' => 'Eklerin Sayısı (over)', + 'regdate' => 'Tarih', + 'last_update' => 'Son Güncelleme Tarihi', + 'ipaddress' => 'IP Adresi', + ); + + $lang->alias = "Diğer Adıyla"; + $lang->history = "Geçmiş"; + $lang->about_use_history = "Geçmiş, belgeleri önceki değişikliklerine dönüştürmek içindir."; + $lang->trace_only = "Sadece izleme"; + + $lang->cmd_trash = 'Çöp Kutusu'; + $lang->cmd_restore = 'Geri Yükleme'; + $lang->cmd_restore_all = 'Hepsini Geri Yükle'; + + $lang->in_trash = 'Çöp Kutusu'; + $lang->trash_nick_name = 'Silici'; + $lang->trash_date = 'Silinme Tarihi'; + $lang->trash_description = 'Açıklama'; + + $lang->search_target_trash_list = array( + 'title' => 'Başlık', + 'content' => 'İçerik', + 'user_id' => 'Kullanıcı Kimliği', + 'member_srl' => 'Üye Diziseli', + 'user_name' => 'Kullanıcı İsmi', + 'nick_name' => 'Rumuz', + 'trash_member_srl' => 'Silici Diziseli', + 'trash_user_name' => 'Silici İsmi', + 'trash_nick_name' => 'Silici rumuzu', + 'trash_date' => 'Silinme Tarihi', + 'trash_ipaddress' => 'Silici IP adresi', + ); + + $lang->success_trashed = "Başarıyla silindi"; + $lang->msg_not_selected_document = 'Hiçbir makale seçilmedi.'; + $lang->show_voted_member = '사용자 노출'; +?> diff --git a/modules/document/lang/vi.lang.php b/modules/document/lang/vi.lang.php index 9e7fa67e4..92d36bf05 100644 --- a/modules/document/lang/vi.lang.php +++ b/modules/document/lang/vi.lang.php @@ -1,103 +1,103 @@ -document_list = 'Danh sách bài viết'; - $lang->thumbnail_type = 'Định dạng hình nhỏ'; - $lang->thumbnail_crop = 'Hình cắt'; - $lang->thumbnail_ratio = 'Tỉ lệ'; - $lang->cmd_delete_all_thumbnail = 'Xóa tất cả hình nhỏ'; - $lang->move_target_module = "Vị trí Module"; - $lang->title_bold = 'Chữ đậm'; - $lang->title_color = 'Màu'; - $lang->new_document_count = 'Bài viết mới'; - - $lang->parent_category_title = 'Tên thể loại chính'; - $lang->category_title = 'Tên thể loại nhỏ'; - $lang->category_color = 'Màu chữ'; - $lang->expand = 'Mở rộng'; - $lang->category_group_srls = 'Nhóm được cho phép'; - - $lang->cmd_make_child = 'Thêm thể loại nhỏ'; - $lang->cmd_enable_move_category = "Thay đổi vị trí thể loại (Kéo lên Menu trên sau khi lựa chọn)"; - - $lang->about_category_title = 'Hãy nhập tên thể loại'; - $lang->about_expand = 'Nếu sử dụng tùy chọn này, Thể loại sẽ luôn luôn được trải rộng.'; - $lang->about_category_group_srls = 'Chỉ những nhóm đã chọn mới được phép sử dụng thể loại này.'; - $lang->about_category_color = 'Bạn có thể đặt màu cho thể loại.'; - - $lang->cmd_search_next = 'Tìm tiếp'; - - $lang->cmd_temp_save = 'Lưu tạm thời'; - - $lang->cmd_toggle_checked_document = 'Khôi phục những bài đã chọn'; - $lang->cmd_delete_checked_document = 'Xóa những bài đã chọn'; - $lang->cmd_document_do = 'Bình chọn / Phê bình'; - - $lang->msg_cart_is_null = 'Xin hãy chọn bài viết để xóa.'; - $lang->msg_category_not_moved = 'Không thể di chuyển'; - $lang->msg_is_secret = 'Bài viết này đã đặt bí mật'; - $lang->msg_checked_document_is_deleted = '%d bài viết đã được xóa.'; - - // Search targets in admin page - $lang->search_target_list = array( - 'title' => 'Tiêu đề', - 'content' => 'Nội dung', - 'user_id' => 'ID sử dụng', - 'member_srl' => 'Mã thành viên', - 'user_name' => 'Tên', - 'nick_name' => 'Nickname', - 'email_address' => 'Email', - 'homepage' => 'Trang chủ', - 'is_notice' => 'Chú ý', - 'is_secret' => 'Bí mật', - 'tags' => 'Tag', - 'readed_count' => 'Lượt xem', - 'voted_count' => 'Lượt bình chọn', - 'comment_count ' => 'Số bình luận', - 'trackback_count ' => 'Số liên kết Web', - 'uploaded_count ' => 'Số đính kèm', - 'regdate' => 'Ngày gửi', - 'last_update' => 'Cập nhật lần cuối', - 'ipaddress' => 'IP', - ); - - $lang->alias = "Bí danh"; - $lang->history = "Lịch sử"; - $lang->about_use_history = "Chức năng này sẽ lưu lại những thay đổi trên bài viết. Nếu sử dụng chức năng này, bạn có thể khôi phục lại trạng thái ban đầu của bài viết."; - $lang->trace_only = "Chỉ theo dõi"; - - $lang->cmd_trash = "Thùng rác"; - $lang->cmd_restore = "Khôi phục"; - $lang->cmd_restore_all = "Khôi phục tất cả"; - - $lang->in_trash = "Thùng rác"; - $lang->trash_nick_name = "Người xóa"; - $lang->trash_date = "Ngày xóa"; - $lang->trash_description = "Mô tả"; - - // 관리자 페이지에서 휴지통의 검색할 대상 - $lang->search_target_trash_list = array( - 'title' => 'Tiêu đề', - 'content' => 'Nội dung', - 'user_id' => 'ID', - 'member_srl' => 'Mã số thành viên', - 'user_name' => 'Tên thật', - 'nick_name' => 'NickName', - 'trash_member_srl' => 'Mã số người xóa', - 'trash_user_name' => 'Tên người xóa', - 'trash_nick_name' => 'NickName người xóa', - 'trash_date' => 'Ngày xóa', - 'trash_ipaddress' => 'IP Người xóa', - ); - - $lang->success_trashed = "Đã chuyển tới thùng rác thành công."; - $lang->msg_not_selected_document = '선택된 문서가 없습니다.'; - $lang->show_voted_member = '사용자 노출'; -?> +document_list = 'Danh sách bài viết'; + $lang->thumbnail_type = 'Định dạng hình nhỏ'; + $lang->thumbnail_crop = 'Hình cắt'; + $lang->thumbnail_ratio = 'Tỉ lệ'; + $lang->cmd_delete_all_thumbnail = 'Xóa tất cả hình nhỏ'; + $lang->move_target_module = "Vị trí Module"; + $lang->title_bold = 'Chữ đậm'; + $lang->title_color = 'Màu'; + $lang->new_document_count = 'Bài viết mới'; + + $lang->parent_category_title = 'Tên thể loại chính'; + $lang->category_title = 'Tên thể loại nhỏ'; + $lang->category_color = 'Màu chữ'; + $lang->expand = 'Mở rộng'; + $lang->category_group_srls = 'Nhóm được cho phép'; + + $lang->cmd_make_child = 'Thêm thể loại nhỏ'; + $lang->cmd_enable_move_category = "Thay đổi vị trí thể loại (Kéo lên Menu trên sau khi lựa chọn)"; + + $lang->about_category_title = 'Hãy nhập tên thể loại'; + $lang->about_expand = 'Nếu sử dụng tùy chọn này, Thể loại sẽ luôn luôn được trải rộng.'; + $lang->about_category_group_srls = 'Chỉ những nhóm đã chọn mới được phép sử dụng thể loại này.'; + $lang->about_category_color = 'Bạn có thể đặt màu cho thể loại.'; + + $lang->cmd_search_next = 'Tìm tiếp'; + + $lang->cmd_temp_save = 'Lưu tạm thời'; + + $lang->cmd_toggle_checked_document = 'Khôi phục những bài đã chọn'; + $lang->cmd_delete_checked_document = 'Xóa những bài đã chọn'; + $lang->cmd_document_do = 'Bình chọn / Phê bình'; + + $lang->msg_cart_is_null = 'Xin hãy chọn bài viết để xóa.'; + $lang->msg_category_not_moved = 'Không thể di chuyển'; + $lang->msg_is_secret = 'Bài viết này đã đặt bí mật'; + $lang->msg_checked_document_is_deleted = '%d bài viết đã được xóa.'; + + // Search targets in admin page + $lang->search_target_list = array( + 'title' => 'Tiêu đề', + 'content' => 'Nội dung', + 'user_id' => 'ID sử dụng', + 'member_srl' => 'Mã thành viên', + 'user_name' => 'Tên', + 'nick_name' => 'Nickname', + 'email_address' => 'Email', + 'homepage' => 'Trang chủ', + 'is_notice' => 'Chú ý', + 'is_secret' => 'Bí mật', + 'tags' => 'Tag', + 'readed_count' => 'Lượt xem', + 'voted_count' => 'Lượt bình chọn', + 'comment_count ' => 'Số bình luận', + 'trackback_count ' => 'Số liên kết Web', + 'uploaded_count ' => 'Số đính kèm', + 'regdate' => 'Ngày gửi', + 'last_update' => 'Cập nhật lần cuối', + 'ipaddress' => 'IP', + ); + + $lang->alias = "Bí danh"; + $lang->history = "Lịch sử"; + $lang->about_use_history = "Chức năng này sẽ lưu lại những thay đổi trên bài viết. Nếu sử dụng chức năng này, bạn có thể khôi phục lại trạng thái ban đầu của bài viết."; + $lang->trace_only = "Chỉ theo dõi"; + + $lang->cmd_trash = "Thùng rác"; + $lang->cmd_restore = "Khôi phục"; + $lang->cmd_restore_all = "Khôi phục tất cả"; + + $lang->in_trash = "Thùng rác"; + $lang->trash_nick_name = "Người xóa"; + $lang->trash_date = "Ngày xóa"; + $lang->trash_description = "Mô tả"; + + // 관리자 페이지에서 휴지통의 검색할 대상 + $lang->search_target_trash_list = array( + 'title' => 'Tiêu đề', + 'content' => 'Nội dung', + 'user_id' => 'ID', + 'member_srl' => 'Mã số thành viên', + 'user_name' => 'Tên thật', + 'nick_name' => 'NickName', + 'trash_member_srl' => 'Mã số người xóa', + 'trash_user_name' => 'Tên người xóa', + 'trash_nick_name' => 'NickName người xóa', + 'trash_date' => 'Ngày xóa', + 'trash_ipaddress' => 'IP Người xóa', + ); + + $lang->success_trashed = "Đã chuyển tới thùng rác thành công."; + $lang->msg_not_selected_document = '선택된 문서가 없습니다.'; + $lang->show_voted_member = '사용자 노출'; +?> diff --git a/modules/document/lang/zh-CN.lang.php b/modules/document/lang/zh-CN.lang.php index 1ebf2a1cf..c595af7a2 100644 --- a/modules/document/lang/zh-CN.lang.php +++ b/modules/document/lang/zh-CN.lang.php @@ -1,101 +1,101 @@ -document_list = '主题列表'; - $lang->thumbnail_type = '缩略图生成方式'; - $lang->thumbnail_crop = '裁减(按指定大小裁剪图片)'; - $lang->thumbnail_ratio = '比例(按原图比例缩略处理)'; - $lang->cmd_delete_all_thumbnail = '删除全部缩略图'; - $lang->title_bold = '粗标题'; - $lang->title_color = '标题颜色'; - $lang->new_document_count = '新帖'; - - $lang->parent_category_title = '上级分类名'; - $lang->category_title = '分类名'; - $lang->category_color = '分类颜色'; - $lang->expand = '展开'; - $lang->category_group_srls = '用户组'; - - $lang->cmd_make_child = '添加下级分类'; - $lang->cmd_enable_move_category = "分类顺序(勾选后用鼠标拖动分类项)"; - - $lang->about_category_title = '请输入分类名。'; - $lang->about_expand = '选择此项将维持展开状态。'; - $lang->about_category_group_srls = '所选用户组才可以查看此分类。'; - $lang->about_category_color = '请指定分类颜色(必须带#符号)。ex)#ff0000'; - - $lang->cmd_search_next = '继续搜索'; - - $lang->cmd_temp_save = '临时保存'; - - $lang->cmd_toggle_checked_document = '反选'; - $lang->cmd_delete_checked_document = '删除所选'; - $lang->cmd_document_do = '将把此主题..'; - - $lang->msg_cart_is_null = '请选择要删除的文章。'; - $lang->msg_category_not_moved = '不能移动!'; - $lang->msg_is_secret = '这是密帖!'; - $lang->msg_checked_document_is_deleted = '删除了%d个文章。'; - - $lang->move_target_module = '目标模块'; - - // 管理页面查找的对象 - $lang->search_target_list = array( - 'title' => '标题', - 'content' => '内容', - 'user_id' => 'I D', - 'member_srl' => '会员编号', - 'user_name' => '姓名', - 'nick_name' => '昵称', - 'email_address' => '电子邮件', - 'homepage' => '主页', - 'is_notice' => '公告', - 'is_secret' => '密帖', - 'tags' => '标签', - 'readed_count' => '查看数(以上)', - 'voted_count' => '推荐数(以上)', - 'comment_count ' => '评论数(以上)', - 'trackback_count ' => '引用数(以上)', - 'uploaded_count ' => '上传附件数(以上)', - 'regdate' => '登录日期', - 'last_update' => '最近更新日期', - 'ipaddress' => 'IP 地址', - ); - - $lang->alias = "Alias"; - $lang->history = "历史版本功能"; - $lang->about_use_history = "启用历史版本功能它将记录主题修改版本,并还可以复原到之前版本。"; - $lang->trace_only = "只留痕迹"; - - $lang->cmd_trash = "回收箱"; - $lang->cmd_restore = "复原"; - $lang->cmd_restore_all = "全部复原"; - - $lang->in_trash = "回收箱"; - $lang->trash_nick_name = "操作人昵称"; - $lang->trash_date = "删除日期"; - $lang->trash_description = "说明"; - - // 管理页面回收箱搜索对象 - $lang->search_target_trash_list = array( - 'title' => '标题', - 'content' => '内容', - 'user_id' => '用户名', - 'member_srl' => '会员编号', - 'user_name' => '姓名', - 'nick_name' => '昵称', - 'trash_member_srl' => '操作人会员编号', - 'trash_user_name' => '操作人用户名', - 'trash_nick_name' => '操作人昵称', - 'trash_date' => '删除日期', - 'trash_ipaddress' => '操作人IP地址', - ); - - $lang->success_trashed = '已成功移除到回收箱。'; - $lang->msg_not_selected_document = '선택된 문서가 없습니다.'; - $lang->show_voted_member = '사용자 노출'; -?> +document_list = '主题列表'; + $lang->thumbnail_type = '缩略图生成方式'; + $lang->thumbnail_crop = '裁减(按指定大小裁剪图片)'; + $lang->thumbnail_ratio = '比例(按原图比例缩略处理)'; + $lang->cmd_delete_all_thumbnail = '删除全部缩略图'; + $lang->title_bold = '粗标题'; + $lang->title_color = '标题颜色'; + $lang->new_document_count = '新帖'; + + $lang->parent_category_title = '上级分类名'; + $lang->category_title = '分类名'; + $lang->category_color = '分类颜色'; + $lang->expand = '展开'; + $lang->category_group_srls = '用户组'; + + $lang->cmd_make_child = '添加下级分类'; + $lang->cmd_enable_move_category = "分类顺序(勾选后用鼠标拖动分类项)"; + + $lang->about_category_title = '请输入分类名。'; + $lang->about_expand = '选择此项将维持展开状态。'; + $lang->about_category_group_srls = '所选用户组才可以查看此分类。'; + $lang->about_category_color = '请指定分类颜色(必须带#符号)。ex)#ff0000'; + + $lang->cmd_search_next = '继续搜索'; + + $lang->cmd_temp_save = '临时保存'; + + $lang->cmd_toggle_checked_document = '反选'; + $lang->cmd_delete_checked_document = '删除所选'; + $lang->cmd_document_do = '将把此主题..'; + + $lang->msg_cart_is_null = '请选择要删除的文章。'; + $lang->msg_category_not_moved = '不能移动!'; + $lang->msg_is_secret = '这是密帖!'; + $lang->msg_checked_document_is_deleted = '删除了%d个文章。'; + + $lang->move_target_module = '目标模块'; + + // 管理页面查找的对象 + $lang->search_target_list = array( + 'title' => '标题', + 'content' => '内容', + 'user_id' => 'I D', + 'member_srl' => '会员编号', + 'user_name' => '姓名', + 'nick_name' => '昵称', + 'email_address' => '电子邮件', + 'homepage' => '主页', + 'is_notice' => '公告', + 'is_secret' => '密帖', + 'tags' => '标签', + 'readed_count' => '查看数(以上)', + 'voted_count' => '推荐数(以上)', + 'comment_count ' => '评论数(以上)', + 'trackback_count ' => '引用数(以上)', + 'uploaded_count ' => '上传附件数(以上)', + 'regdate' => '登录日期', + 'last_update' => '最近更新日期', + 'ipaddress' => 'IP 地址', + ); + + $lang->alias = "Alias"; + $lang->history = "历史版本功能"; + $lang->about_use_history = "启用历史版本功能它将记录主题修改版本,并还可以复原到之前版本。"; + $lang->trace_only = "只留痕迹"; + + $lang->cmd_trash = "回收箱"; + $lang->cmd_restore = "复原"; + $lang->cmd_restore_all = "全部复原"; + + $lang->in_trash = "回收箱"; + $lang->trash_nick_name = "操作人昵称"; + $lang->trash_date = "删除日期"; + $lang->trash_description = "说明"; + + // 管理页面回收箱搜索对象 + $lang->search_target_trash_list = array( + 'title' => '标题', + 'content' => '内容', + 'user_id' => '用户名', + 'member_srl' => '会员编号', + 'user_name' => '姓名', + 'nick_name' => '昵称', + 'trash_member_srl' => '操作人会员编号', + 'trash_user_name' => '操作人用户名', + 'trash_nick_name' => '操作人昵称', + 'trash_date' => '删除日期', + 'trash_ipaddress' => '操作人IP地址', + ); + + $lang->success_trashed = '已成功移除到回收箱。'; + $lang->msg_not_selected_document = '선택된 문서가 없습니다.'; + $lang->show_voted_member = '사용자 노출'; +?> diff --git a/modules/document/lang/zh-TW.lang.php b/modules/document/lang/zh-TW.lang.php index 7529bd730..15a15c69a 100644 --- a/modules/document/lang/zh-TW.lang.php +++ b/modules/document/lang/zh-TW.lang.php @@ -1,101 +1,101 @@ -document_list = '主題列表'; - $lang->thumbnail_type = '縮圖建立方式'; - $lang->thumbnail_crop = '裁減'; - $lang->thumbnail_ratio = '比例'; - $lang->cmd_delete_all_thumbnail = '刪除全部縮圖'; - $lang->title_bold = '粗體'; - $lang->title_color = '標題顏色'; - $lang->new_document_count = 'N'; - - $lang->parent_category_title = '主分類'; - $lang->category_title = '分類名稱'; - $lang->category_color = '分類顏色'; - $lang->expand = '展開'; - $lang->category_group_srls = '群組'; - - $lang->cmd_make_child = '新增子分類'; - $lang->cmd_enable_move_category = '分類順序(勾選後用滑鼠拖曳分類項目)'; - - $lang->about_category_title = '請輸入分類名稱。'; - $lang->about_expand = '選擇此項將維持展開狀態。'; - $lang->about_category_group_srls = '被選擇的群組才可以檢視此分類。'; - $lang->about_category_color = '設定分類顏色。例)紅色為 #ff0000'; - - $lang->cmd_search_next = '繼續搜尋'; - - $lang->cmd_temp_save = '臨時儲存'; - - $lang->cmd_toggle_checked_document = '反選'; - $lang->cmd_delete_checked_document = '刪除所選'; - $lang->cmd_document_do = '將此主題..'; - - $lang->msg_cart_is_null = '請選擇要刪除的文章。'; - $lang->msg_category_not_moved = '無法移動!'; - $lang->msg_is_secret = '秘密!'; - $lang->msg_checked_document_is_deleted = '刪除%d個文章。'; - - $lang->move_target_module = '移到'; - - // 管理者頁面中搜尋的內容 - $lang->search_target_list = array( - 'title' => '標題', - 'content' => '內容', - 'user_id' => '帳號', - 'member_srl' => '會員編號', - 'user_name' => '姓名', - 'nick_name' => '暱稱', - 'email_address' => '電子郵件', - 'homepage' => '主頁', - 'is_notice' => '公告', - 'is_secret' => '秘密', - 'tags' => '標籤', - 'readed_count' => '點閱數(以上)', - 'voted_count' => '推薦數(以上)', - 'comment_count ' => '評論數(以上)', - 'trackback_count ' => '引用數(以上)', - 'uploaded_count ' => '上傳檔案數(以上)', - 'regdate' => '登錄日期', - 'last_update' => '最近更新', - 'ipaddress' => 'IP位址', - ); - - $lang->alias = "Alias"; - $lang->history = "歷史紀錄"; - $lang->about_use_history = "選擇是否使用歷史記錄功能。選擇使用,將能夠編輯歷史紀錄並還原。"; - $lang->trace_only = "追蹤"; - - $lang->cmd_trash = "垃圾桶"; - $lang->cmd_restore = "還原"; - $lang->cmd_restore_all = "全部還原"; - - $lang->in_trash = "垃圾桶"; - $lang->trash_nick_name = "暱稱"; - $lang->trash_date = "刪除日期"; - $lang->trash_description = "原因"; - - // 管理者頁面中垃圾桶的搜尋目標 - $lang->search_target_trash_list = array( - 'title' => '標題', - 'content' => '內容', - 'user_id' => '帳號', - 'member_srl' => '會員編號', - 'user_name' => '姓名', - 'nick_name' => '暱稱', - 'trash_member_srl' => '移除會員編號', - 'trash_user_name' => '移除姓名', - 'trash_nick_name' => '移除暱稱', - 'trash_date' => '刪除日期', - 'trash_ipaddress' => '移除 IP 位址', - ); - - $lang->success_trashed = "成功地移到垃圾桶"; - $lang->msg_not_selected_document = '尚未選擇主題'; - $lang->show_voted_member = '投票會員'; -?> +document_list = '主題列表'; + $lang->thumbnail_type = '縮圖建立方式'; + $lang->thumbnail_crop = '裁減'; + $lang->thumbnail_ratio = '比例'; + $lang->cmd_delete_all_thumbnail = '刪除全部縮圖'; + $lang->title_bold = '粗體'; + $lang->title_color = '標題顏色'; + $lang->new_document_count = 'N'; + + $lang->parent_category_title = '主分類'; + $lang->category_title = '分類名稱'; + $lang->category_color = '分類顏色'; + $lang->expand = '展開'; + $lang->category_group_srls = '群組'; + + $lang->cmd_make_child = '新增子分類'; + $lang->cmd_enable_move_category = '分類順序(勾選後用滑鼠拖曳分類項目)'; + + $lang->about_category_title = '請輸入分類名稱。'; + $lang->about_expand = '選擇此項將維持展開狀態。'; + $lang->about_category_group_srls = '被選擇的群組才可以檢視此分類。'; + $lang->about_category_color = '設定分類顏色。例)紅色為 #ff0000'; + + $lang->cmd_search_next = '繼續搜尋'; + + $lang->cmd_temp_save = '臨時儲存'; + + $lang->cmd_toggle_checked_document = '反選'; + $lang->cmd_delete_checked_document = '刪除所選'; + $lang->cmd_document_do = '將此主題..'; + + $lang->msg_cart_is_null = '請選擇要刪除的文章。'; + $lang->msg_category_not_moved = '無法移動!'; + $lang->msg_is_secret = '秘密!'; + $lang->msg_checked_document_is_deleted = '刪除%d個文章。'; + + $lang->move_target_module = '移到'; + + // 管理者頁面中搜尋的內容 + $lang->search_target_list = array( + 'title' => '標題', + 'content' => '內容', + 'user_id' => '帳號', + 'member_srl' => '會員編號', + 'user_name' => '姓名', + 'nick_name' => '暱稱', + 'email_address' => '電子郵件', + 'homepage' => '主頁', + 'is_notice' => '公告', + 'is_secret' => '秘密', + 'tags' => '標籤', + 'readed_count' => '點閱數(以上)', + 'voted_count' => '推薦數(以上)', + 'comment_count ' => '評論數(以上)', + 'trackback_count ' => '引用數(以上)', + 'uploaded_count ' => '上傳檔案數(以上)', + 'regdate' => '登錄日期', + 'last_update' => '最近更新', + 'ipaddress' => 'IP位址', + ); + + $lang->alias = "Alias"; + $lang->history = "歷史紀錄"; + $lang->about_use_history = "選擇是否使用歷史記錄功能。選擇使用,將能夠編輯歷史紀錄並還原。"; + $lang->trace_only = "追蹤"; + + $lang->cmd_trash = "垃圾桶"; + $lang->cmd_restore = "還原"; + $lang->cmd_restore_all = "全部還原"; + + $lang->in_trash = "垃圾桶"; + $lang->trash_nick_name = "暱稱"; + $lang->trash_date = "刪除日期"; + $lang->trash_description = "原因"; + + // 管理者頁面中垃圾桶的搜尋目標 + $lang->search_target_trash_list = array( + 'title' => '標題', + 'content' => '內容', + 'user_id' => '帳號', + 'member_srl' => '會員編號', + 'user_name' => '姓名', + 'nick_name' => '暱稱', + 'trash_member_srl' => '移除會員編號', + 'trash_user_name' => '移除姓名', + 'trash_nick_name' => '移除暱稱', + 'trash_date' => '刪除日期', + 'trash_ipaddress' => '移除 IP 位址', + ); + + $lang->success_trashed = "成功地移到垃圾桶"; + $lang->msg_not_selected_document = '尚未選擇主題'; + $lang->show_voted_member = '投票會員'; +?> diff --git a/modules/document/queries/getChildCategoryMinListOrder.xml b/modules/document/queries/getChildCategoryMinListOrder.xml index 0ae643680..5a3407ff5 100644 --- a/modules/document/queries/getChildCategoryMinListOrder.xml +++ b/modules/document/queries/getChildCategoryMinListOrder.xml @@ -1,12 +1,12 @@ - - - - - - - - - - - - + + +
    + + + + + + + + + diff --git a/modules/document/tpl/declared_list.html b/modules/document/tpl/declared_list.html index e49b4320b..f96216d2e 100644 --- a/modules/document/tpl/declared_list.html +++ b/modules/document/tpl/declared_list.html @@ -1,70 +1,70 @@ - - - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
    {$lang->no}
    {$lang->title}
    {$lang->user_name}
    {$lang->cmd_declare}
    {$lang->readed_count}
    {$lang->voted_count}
    {$lang->date}
    {$no}isCarted())-->checked="checked"/> - {$oDocument->getTitleText()} - - - [{$oDocument->getCommentCount()}] - - - - [{$oDocument->getTrackbackCount()}] - - {$oDocument->getNickName()}{$oDocument->get('declared_count')}{$oDocument->get('readed_count')}{$oDocument->get('voted_count')}{$oDocument->getRegdate("Y-m-d")}
    - {$lang->cmd_manage_document} - {$lang->cmd_cancel_declare} -
    - - - - - -
    - + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
    {$lang->no}
    {$lang->title}
    {$lang->user_name}
    {$lang->cmd_declare}
    {$lang->readed_count}
    {$lang->voted_count}
    {$lang->date}
    {$no}isCarted())-->checked="checked"/> + {$oDocument->getTitleText()} + + + [{$oDocument->getCommentCount()}] + + + + [{$oDocument->getTrackbackCount()}] + + {$oDocument->getNickName()}{$oDocument->get('declared_count')}{$oDocument->get('readed_count')}{$oDocument->get('voted_count')}{$oDocument->getRegdate("Y-m-d")}
    + {$lang->cmd_manage_document} + {$lang->cmd_cancel_declare} +
    + + +
    + + +
    + diff --git a/modules/document/tpl/document_list.html b/modules/document/tpl/document_list.html index 6334736eb..4c0e52f0a 100644 --- a/modules/document/tpl/document_list.html +++ b/modules/document/tpl/document_list.html @@ -1,100 +1,100 @@ - - - - - - -
    -
    - - - - -
    - - - - {$lang->cmd_cancel} -
    -
    -
    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
    {$lang->no}
    {$lang->document}
    {$lang->nick_name}
    {$lang->readed_count}
    {$lang->voted_count}
    {$lang->date}
    {$lang->ipaddress}
    {$lang->alias}
    {$no}isCarted())-->checked="checked"/> - - - {$lang->cmd_save} - - {$oDocument->getTitle()} - - - [{$lang->in_trash}] {$oDocument->getTitle()} - - - - [{$oDocument->getCommentCount()}] - - - - [{$oDocument->getTrackbackCount()}] - - {$oDocument->getNickName()}{$oDocument->get('readed_count')}{$oDocument->get('voted_count')} / {$oDocument->get('blamed_count')}{$oDocument->getRegdate("Y-m-d H:i:s")}{$oDocument->get('ipaddress')}{$lang->alias} -
    - -
    - - - + + + + + + +
    +
    + + + + +
    + + + + {$lang->cmd_cancel} +
    +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
    {$lang->no}
    {$lang->document}
    {$lang->nick_name}
    {$lang->readed_count}
    {$lang->voted_count}
    {$lang->date}
    {$lang->ipaddress}
    {$lang->alias}
    {$no}isCarted())-->checked="checked"/> + + + {$lang->cmd_save} + + {$oDocument->getTitle()} + + + [{$lang->in_trash}] {$oDocument->getTitle()} + + + + [{$oDocument->getCommentCount()}] + + + + [{$oDocument->getTrackbackCount()}] + + {$oDocument->getNickName()}{$oDocument->get('readed_count')}{$oDocument->get('voted_count')} / {$oDocument->get('blamed_count')}{$oDocument->getRegdate("Y-m-d H:i:s")}{$oDocument->get('ipaddress')}{$lang->alias} +
    + +
    + + + diff --git a/modules/document/tpl/document_trash_list.html b/modules/document/tpl/document_trash_list.html index 3e8d108b9..652a2a8cb 100644 --- a/modules/document/tpl/document_trash_list.html +++ b/modules/document/tpl/document_trash_list.html @@ -1,73 +1,73 @@ - - - - - -
    - -
    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - checked="checked"/>--> - - - - - - - - - -
    Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
    {$lang->no}
    {$lang->document}
    {$lang->trash_nick_name}
    {$lang->trash_date}
    {$lang->ipaddress}
    {$lang->trash_description}
    {$lang->cmd_restore}
    {$no} - {$oDocument->getTitle()} - - - [{$oDocument->getCommentCount()}] - - - - [{$oDocument->getTrackbackCount()}] - - {htmlspecialchars($oDocument->get('trash_nick_name'))}{zdate($oDocument->get('trash_date'), "Y-m-d H:i:s")}{$oDocument->get('ipaddress')}{$oDocument->get('trash_description')}{$lang->cmd_restore}
    - -
    - - - + + + + + +
    + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + checked="checked"/>--> + + + + + + + + + +
    Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
    {$lang->no}
    {$lang->document}
    {$lang->trash_nick_name}
    {$lang->trash_date}
    {$lang->ipaddress}
    {$lang->trash_description}
    {$lang->cmd_restore}
    {$no} + {$oDocument->getTitle()} + + + [{$oDocument->getCommentCount()}] + + + + [{$oDocument->getTrackbackCount()}] + + {htmlspecialchars($oDocument->get('trash_nick_name'))}{zdate($oDocument->get('trash_date'), "Y-m-d H:i:s")}{$oDocument->get('ipaddress')}{$oDocument->get('trash_description')}{$lang->cmd_restore}
    + +
    + + + diff --git a/modules/document/tpl/js/document_category.js b/modules/document/tpl/js/document_category.js index 5ec3fc492..6743f8795 100644 --- a/modules/document/tpl/js/document_category.js +++ b/modules/document/tpl/js/document_category.js @@ -1,189 +1,189 @@ -/** - * @file modules/document/tpl/js/document_category.js - * @author NHN (developers@xpressengine.com) - * @brief document 모듈의 category tree javascript - **/ - -function Tree(url){ - // clear tree; - jQuery('#menu > ul > li > ul').remove(); - if(jQuery("ul.simpleTree > li > a").size() ==0)jQuery('').bind("click",function(e){addNode(0,e);}).appendTo("ul.simpleTree > li"); - - //ajax get data and transeform ul il - jQuery.get(url,function(data){ - jQuery(data).find("node").each(function(i){ - var text = jQuery(this).attr("text"); - var node_srl = jQuery(this).attr("node_srl"); - var parent_srl = jQuery(this).attr("parent_srl"); - var color = jQuery(this).attr("color"); - var url = jQuery(this).attr("url"); - - // node - var node = ''; - if(color && color !='transparent'){ - node = jQuery('
  • '+text+'
  • '); - }else{ - node = jQuery('
  • '+text+'
  • '); - } - - // button - jQuery('').bind("click",function(e){ - jQuery("#tree_"+node_srl+" > span").click(); - addNode(node_srl,e); - return false; - }).appendTo(node); - - jQuery('').bind("click",function(e){ - jQuery("#tree_"+node_srl+" > span").click(); - modifyNode(node_srl,e); - return false; - }).appendTo(node); - - jQuery('').bind("click",function(e){ - deleteNode(node_srl); - return false; - }).appendTo(node); - - // insert parent child - if(parent_srl>0){ - if(jQuery('#tree_'+parent_srl+'>ul').length==0) jQuery('#tree_'+parent_srl).append(jQuery('
      ')); - jQuery('#tree_'+parent_srl+'> ul').append(node); - }else{ - if(jQuery('#menu ul.simpleTree > li > ul').length==0) jQuery("
        ").appendTo('#menu ul.simpleTree > li'); - jQuery('#menu ul.simpleTree > li > ul').append(node); - } - - }); - - //button show hide - jQuery("#menu li").each(function(){ - if(jQuery(this).parents('ul').size() > max_menu_depth) jQuery("a.add",this).hide(); - if(jQuery(">ul",this).size()>0) jQuery(">a.delete",this).hide(); - }); - - - // draw tree - simpleTreeCollection = jQuery('.simpleTree').simpleTree({ - autoclose: false, - afterClick:function(node){ - jQuery('#category_info').html(""); - //alert("text-"+jQuery('span:first',node).text()); - }, - afterDblClick:function(node){ - //alert("text-"+jQuery('span:first',node).text()); - }, - afterMove:function(destination, source, pos){ - if(destination.size() == 0){ - Tree(xml_url); - return; - } - var module_srl = jQuery("#fo_category input[name=module_srl]").val(); - var parent_srl = destination.attr('id').replace(/.*_/g,''); - var source_srl = source.attr('id').replace(/.*_/g,''); - - var target = source.prevAll("li:not([class^=line])"); - var target_srl = 0; - if(target.length >0){ - target_srl = source.prevAll("li:not([class^=line])").get(0).id.replace(/.*_/g,''); - parent_srl = 0; - } - - jQuery.exec_json("document.procDocumentMoveCategory",{ "module_srl":module_srl,"parent_srl":parent_srl,"target_srl":target_srl,"source_srl":source_srl}, - function(data){ - jQuery('#category_info').html(''); - if(data.error > 0) Tree(xml_url); - }); - - }, - - // i want you !! made by sol - beforeMovedToLine : function(destination, source, pos){ - return (jQuery(destination).parents('ul').size() + jQuery('ul',source).size() <= max_menu_depth); - }, - - // i want you !! made by sol - beforeMovedToFolder : function(destination, source, pos){ - return (jQuery(destination).parents('ul').size() + jQuery('ul',source).size() <= max_menu_depth-1); - }, - afterAjax:function() - { - //alert('Loaded'); - }, - animate:true - ,docToFolderConvert:true - }); - - - - // open all node - nodeToggleAll(); - },"xml"); -} -function addNode(node,e){ - var params ={ - "category_srl":0 - ,"parent_srl":node - ,"module_srl":jQuery("#fo_category [name=module_srl]").val() - }; - - jQuery.exec_json('document.getDocumentCategoryTplInfo', params, function(data){ - jQuery('#category_info').html(data.tpl).css('left',e.pageX).css('top',e.pageY); - }); -} - -function modifyNode(node,e){ - var params ={ - "category_srl":node - ,"parent_srl":0 - ,"module_srl":jQuery("#fo_category [name=module_srl]").val() - }; - - jQuery.exec_json('document.getDocumentCategoryTplInfo', params, function(data){ - jQuery('#category_info').html(data.tpl).css('left',e.pageX).css('top',e.pageY); - }); -} - - -function nodeToggleAll(){ - jQuery("[class*=close]", simpleTreeCollection[0]).each(function(){ - simpleTreeCollection[0].nodeToggle(this); - }); -} - -function deleteNode(node){ - if(confirm(lang_confirm_delete)){ - jQuery('#category_info').html(""); - var params ={ - "category_srl":node - ,"parent_srl":0 - ,"module_srl":jQuery("#fo_category [name=module_srl]").val() - }; - - jQuery.exec_json('document.procDocumentDeleteCategory', params, function(data){ - if(data.error==0) Tree(xml_url); - }); - } -} - -/* 카테고리 아이템 입력후 */ -function completeInsertCategory(ret_obj) { - jQuery('#category_info').html(""); - Tree(xml_url); -} - -function hideCategoryInfo() { - jQuery('#category_info').html(""); -} - -/* 카테고리 목록 갱신 */ -function doReloadTreeCategory(module_srl) { - var params = {'module_srl':module_srl}; - - // 서버에 요청하여 해당 노드의 정보를 수정할 수 있도록 한다. - var response_tags = new Array('error','message', 'xml_file'); - exec_xml('document', 'procDocumentMakeXmlFile', params, completeInsertCategory, response_tags, params); -} - -function doCategoryFormMove() { - jQuery(function($){ $('#fo_category').appendTo(document.body); $('#category_info').css('width', '550px'); }); -} +/** + * @file modules/document/tpl/js/document_category.js + * @author NHN (developers@xpressengine.com) + * @brief document 모듈의 category tree javascript + **/ + +function Tree(url){ + // clear tree; + jQuery('#menu > ul > li > ul').remove(); + if(jQuery("ul.simpleTree > li > a").size() ==0)jQuery('').bind("click",function(e){addNode(0,e);}).appendTo("ul.simpleTree > li"); + + //ajax get data and transeform ul il + jQuery.get(url,function(data){ + jQuery(data).find("node").each(function(i){ + var text = jQuery(this).attr("text"); + var node_srl = jQuery(this).attr("node_srl"); + var parent_srl = jQuery(this).attr("parent_srl"); + var color = jQuery(this).attr("color"); + var url = jQuery(this).attr("url"); + + // node + var node = ''; + if(color && color !='transparent'){ + node = jQuery('
      • '+text+'
      • '); + }else{ + node = jQuery('
      • '+text+'
      • '); + } + + // button + jQuery('').bind("click",function(e){ + jQuery("#tree_"+node_srl+" > span").click(); + addNode(node_srl,e); + return false; + }).appendTo(node); + + jQuery('').bind("click",function(e){ + jQuery("#tree_"+node_srl+" > span").click(); + modifyNode(node_srl,e); + return false; + }).appendTo(node); + + jQuery('').bind("click",function(e){ + deleteNode(node_srl); + return false; + }).appendTo(node); + + // insert parent child + if(parent_srl>0){ + if(jQuery('#tree_'+parent_srl+'>ul').length==0) jQuery('#tree_'+parent_srl).append(jQuery('
          ')); + jQuery('#tree_'+parent_srl+'> ul').append(node); + }else{ + if(jQuery('#menu ul.simpleTree > li > ul').length==0) jQuery("
            ").appendTo('#menu ul.simpleTree > li'); + jQuery('#menu ul.simpleTree > li > ul').append(node); + } + + }); + + //button show hide + jQuery("#menu li").each(function(){ + if(jQuery(this).parents('ul').size() > max_menu_depth) jQuery("a.add",this).hide(); + if(jQuery(">ul",this).size()>0) jQuery(">a.delete",this).hide(); + }); + + + // draw tree + simpleTreeCollection = jQuery('.simpleTree').simpleTree({ + autoclose: false, + afterClick:function(node){ + jQuery('#category_info').html(""); + //alert("text-"+jQuery('span:first',node).text()); + }, + afterDblClick:function(node){ + //alert("text-"+jQuery('span:first',node).text()); + }, + afterMove:function(destination, source, pos){ + if(destination.size() == 0){ + Tree(xml_url); + return; + } + var module_srl = jQuery("#fo_category input[name=module_srl]").val(); + var parent_srl = destination.attr('id').replace(/.*_/g,''); + var source_srl = source.attr('id').replace(/.*_/g,''); + + var target = source.prevAll("li:not([class^=line])"); + var target_srl = 0; + if(target.length >0){ + target_srl = source.prevAll("li:not([class^=line])").get(0).id.replace(/.*_/g,''); + parent_srl = 0; + } + + jQuery.exec_json("document.procDocumentMoveCategory",{ "module_srl":module_srl,"parent_srl":parent_srl,"target_srl":target_srl,"source_srl":source_srl}, + function(data){ + jQuery('#category_info').html(''); + if(data.error > 0) Tree(xml_url); + }); + + }, + + // i want you !! made by sol + beforeMovedToLine : function(destination, source, pos){ + return (jQuery(destination).parents('ul').size() + jQuery('ul',source).size() <= max_menu_depth); + }, + + // i want you !! made by sol + beforeMovedToFolder : function(destination, source, pos){ + return (jQuery(destination).parents('ul').size() + jQuery('ul',source).size() <= max_menu_depth-1); + }, + afterAjax:function() + { + //alert('Loaded'); + }, + animate:true + ,docToFolderConvert:true + }); + + + + // open all node + nodeToggleAll(); + },"xml"); +} +function addNode(node,e){ + var params ={ + "category_srl":0 + ,"parent_srl":node + ,"module_srl":jQuery("#fo_category [name=module_srl]").val() + }; + + jQuery.exec_json('document.getDocumentCategoryTplInfo', params, function(data){ + jQuery('#category_info').html(data.tpl).css('left',e.pageX).css('top',e.pageY); + }); +} + +function modifyNode(node,e){ + var params ={ + "category_srl":node + ,"parent_srl":0 + ,"module_srl":jQuery("#fo_category [name=module_srl]").val() + }; + + jQuery.exec_json('document.getDocumentCategoryTplInfo', params, function(data){ + jQuery('#category_info').html(data.tpl).css('left',e.pageX).css('top',e.pageY); + }); +} + + +function nodeToggleAll(){ + jQuery("[class*=close]", simpleTreeCollection[0]).each(function(){ + simpleTreeCollection[0].nodeToggle(this); + }); +} + +function deleteNode(node){ + if(confirm(lang_confirm_delete)){ + jQuery('#category_info').html(""); + var params ={ + "category_srl":node + ,"parent_srl":0 + ,"module_srl":jQuery("#fo_category [name=module_srl]").val() + }; + + jQuery.exec_json('document.procDocumentDeleteCategory', params, function(data){ + if(data.error==0) Tree(xml_url); + }); + } +} + +/* 카테고리 아이템 입력후 */ +function completeInsertCategory(ret_obj) { + jQuery('#category_info').html(""); + Tree(xml_url); +} + +function hideCategoryInfo() { + jQuery('#category_info').html(""); +} + +/* 카테고리 목록 갱신 */ +function doReloadTreeCategory(module_srl) { + var params = {'module_srl':module_srl}; + + // 서버에 요청하여 해당 노드의 정보를 수정할 수 있도록 한다. + var response_tags = new Array('error','message', 'xml_file'); + exec_xml('document', 'procDocumentMakeXmlFile', params, completeInsertCategory, response_tags, params); +} + +function doCategoryFormMove() { + jQuery(function($){ $('#fo_category').appendTo(document.body); $('#category_info').css('width', '550px'); }); +} diff --git a/modules/editor/components/emoticon/emoticon.class.php b/modules/editor/components/emoticon/emoticon.class.php index 0909ee578..2f7eacfc0 100644 --- a/modules/editor/components/emoticon/emoticon.class.php +++ b/modules/editor/components/emoticon/emoticon.class.php @@ -1,107 +1,107 @@ -editor_sequence = $editor_sequence; - $this->component_path = $component_path; - $this->emoticon_path = sprintf('%s%s/images',preg_replace('/^\.\//i','',$this->component_path),'tpl','images'); - } - - /** - * @brief 이모티콘 파일 목록을 리턴 - **/ - function getEmoticonList() { - $emoticon = Context::get('emoticon'); - if(!$emoticon || !preg_match("/^([a-z0-9\_]+)$/i",$emoticon)) return new Object(-1,'msg_invalid_request'); - - $list = $this->getEmoticons($emoticon); - - $this->add('emoticons', implode("\n",$list)); - } - - /** - * @brief 재귀적으로 이모티콘이 될 법한 파일들을 하위 디렉토리까지 전부 검색한다. 8,000개까지는 테스트 해봤는데 스택오버프로우를 일으킬지 어떨지는 잘 모르겠음.(2007.9.6, 베니) - **/ - function getEmoticons($path) { - $emoticon_path = sprintf("%s/%s", $this->emoticon_path, $path); - $output = array(); - - $oDir = dir($emoticon_path); - while($file = $oDir->read()) { - if(substr($file,0,1)=='.') continue; - if(preg_match('/\.(jpg|jpeg|gif|png)$/i',$file)) $output[] = sprintf("%s/%s", $path, str_replace($this->emoticon_path,'',$file)); - } - $oDir->close(); - if(count($output)) asort($output); - return $output; - } - - /** - * @brief popup window요청시 popup window에 출력할 내용을 추가하면 된다 - **/ - function getPopupContent() { - // 이모티콘 디렉토리 목록을 가져옴 - $emoticon_dirs = FileHandler::readDir($this->emoticon_path); - $emoticon_list = array(); - if($emoticon_dirs) { - foreach($emoticon_dirs as $emoticon) { - if(preg_match("/^([a-z0-9\_]+)$/i", $emoticon)) $emoticon_list[] = $emoticon; - } - } - Context::set('emoticon_list', $emoticon_list); - - // 첫번째 이모티콘 디렉토리의 이미지 파일을 구함 - $emoticons = $this->getEmoticons($emoticon_list[0]); - Context::set('emoticons', $emoticons); - - // 템플릿을 미리 컴파일해서 컴파일된 소스를 return - $tpl_path = $this->component_path.'tpl'; - $tpl_file = 'popup.html'; - - $oTemplate = &TemplateHandler::getInstance(); - return $oTemplate->compile($tpl_path, $tpl_file); - } - - /** - * @brief 이모티콘의 경로 문제 해결을 하기 위해 추가하였다. (2007.9.6 베니) - **/ - function transHTML($xml_obj) { - $src = $xml_obj->attrs->src; - $alt = $xml_obj->attrs->alt; - - if(!$alt) { - $tmp_arr = explode('/',$src); - $alt = array_pop($tmp_arr); - } - - $src = str_replace(array('&','"'), array('&','&qout;'), $src); - if(!$alt) $alt = $src; - - $attr_output = array(); - $attr_output = array("src=\"".$src."\""); - - if($alt) { - $attr_output[] = "alt=\"".$alt."\""; - } - if(preg_match("/\.png$/i",$src)) $attr_output[] = "class=\"iePngFix\""; - - $code = sprintf("", implode(" ",$attr_output)); - - return $code; - } - } -?> +editor_sequence = $editor_sequence; + $this->component_path = $component_path; + $this->emoticon_path = sprintf('%s%s/images',preg_replace('/^\.\//i','',$this->component_path),'tpl','images'); + } + + /** + * @brief 이모티콘 파일 목록을 리턴 + **/ + function getEmoticonList() { + $emoticon = Context::get('emoticon'); + if(!$emoticon || !preg_match("/^([a-z0-9\_]+)$/i",$emoticon)) return new Object(-1,'msg_invalid_request'); + + $list = $this->getEmoticons($emoticon); + + $this->add('emoticons', implode("\n",$list)); + } + + /** + * @brief 재귀적으로 이모티콘이 될 법한 파일들을 하위 디렉토리까지 전부 검색한다. 8,000개까지는 테스트 해봤는데 스택오버프로우를 일으킬지 어떨지는 잘 모르겠음.(2007.9.6, 베니) + **/ + function getEmoticons($path) { + $emoticon_path = sprintf("%s/%s", $this->emoticon_path, $path); + $output = array(); + + $oDir = dir($emoticon_path); + while($file = $oDir->read()) { + if(substr($file,0,1)=='.') continue; + if(preg_match('/\.(jpg|jpeg|gif|png)$/i',$file)) $output[] = sprintf("%s/%s", $path, str_replace($this->emoticon_path,'',$file)); + } + $oDir->close(); + if(count($output)) asort($output); + return $output; + } + + /** + * @brief popup window요청시 popup window에 출력할 내용을 추가하면 된다 + **/ + function getPopupContent() { + // 이모티콘 디렉토리 목록을 가져옴 + $emoticon_dirs = FileHandler::readDir($this->emoticon_path); + $emoticon_list = array(); + if($emoticon_dirs) { + foreach($emoticon_dirs as $emoticon) { + if(preg_match("/^([a-z0-9\_]+)$/i", $emoticon)) $emoticon_list[] = $emoticon; + } + } + Context::set('emoticon_list', $emoticon_list); + + // 첫번째 이모티콘 디렉토리의 이미지 파일을 구함 + $emoticons = $this->getEmoticons($emoticon_list[0]); + Context::set('emoticons', $emoticons); + + // 템플릿을 미리 컴파일해서 컴파일된 소스를 return + $tpl_path = $this->component_path.'tpl'; + $tpl_file = 'popup.html'; + + $oTemplate = &TemplateHandler::getInstance(); + return $oTemplate->compile($tpl_path, $tpl_file); + } + + /** + * @brief 이모티콘의 경로 문제 해결을 하기 위해 추가하였다. (2007.9.6 베니) + **/ + function transHTML($xml_obj) { + $src = $xml_obj->attrs->src; + $alt = $xml_obj->attrs->alt; + + if(!$alt) { + $tmp_arr = explode('/',$src); + $alt = array_pop($tmp_arr); + } + + $src = str_replace(array('&','"'), array('&','&qout;'), $src); + if(!$alt) $alt = $src; + + $attr_output = array(); + $attr_output = array("src=\"".$src."\""); + + if($alt) { + $attr_output[] = "alt=\"".$alt."\""; + } + if(preg_match("/\.png$/i",$src)) $attr_output[] = "class=\"iePngFix\""; + + $code = sprintf("", implode(" ",$attr_output)); + + return $code; + } + } +?> diff --git a/modules/editor/components/emoticon/info.xml b/modules/editor/components/emoticon/info.xml index a4c526549..7f89742e5 100644 --- a/modules/editor/components/emoticon/info.xml +++ b/modules/editor/components/emoticon/info.xml @@ -1,35 +1,35 @@ - - - 이모티콘 출력 - 顔文字(イモティコン) - 表情图标 - Display Emoticons - Diễn tả cảm xúc - Mostrar iconos gestuales - Отображение смайлов - 表情符號 - His Simgeleri Gösterimi - 이모티콘을 에디터에 삽입할 수 있습니다. - 顔文字(イモティコン)をエディターに追加することが出来ます。 - 可以插入表情图标到编辑器。 - You may insert emoticons to editor. - Bạn có thể chèn biểu tượng cảm xúc vào bài viết. - Usted puede insertar emoticonos para el editor. - Вы можете вставить смыйлы в редактор. - 可插入表情符號到編輯器。 - Editöre his simgeleri ekleyebilirsiniz. - 0.1 - 2007-02-28 - - - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - - + + + 이모티콘 출력 + 顔文字(イモティコン) + 表情图标 + Display Emoticons + Diễn tả cảm xúc + Mostrar iconos gestuales + Отображение смайлов + 表情符號 + His Simgeleri Gösterimi + 이모티콘을 에디터에 삽입할 수 있습니다. + 顔文字(イモティコン)をエディターに追加することが出来ます。 + 可以插入表情图标到编辑器。 + You may insert emoticons to editor. + Bạn có thể chèn biểu tượng cảm xúc vào bài viết. + Usted puede insertar emoticonos para el editor. + Вы можете вставить смыйлы в редактор. + 可插入表情符號到編輯器。 + Editöre his simgeleri ekleyebilirsiniz. + 0.1 + 2007-02-28 + + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + diff --git a/modules/editor/components/image_gallery/image_gallery.class.php b/modules/editor/components/image_gallery/image_gallery.class.php index 05ecd286e..3aa0b2e86 100644 --- a/modules/editor/components/image_gallery/image_gallery.class.php +++ b/modules/editor/components/image_gallery/image_gallery.class.php @@ -1,81 +1,81 @@ -editor_sequence = $editor_sequence; - $this->component_path = $component_path; - } - - /** - * @brief popup window요청시 popup window에 출력할 내용을 추가하면 된다 - **/ - function getPopupContent() { - // 템플릿을 미리 컴파일해서 컴파일된 소스를 return - $tpl_path = $this->component_path.'tpl'; - $tpl_file = 'popup.html'; - - Context::set("tpl_path", $tpl_path); - - $oTemplate = &TemplateHandler::getInstance(); - return $oTemplate->compile($tpl_path, $tpl_file); - } - - /** - * @brief 에디터 컴포넌트가 별도의 고유 코드를 이용한다면 그 코드를 html로 변경하여 주는 method - * - * 이미지나 멀티미디어, 설문등 고유 코드가 필요한 에디터 컴포넌트는 고유코드를 내용에 추가하고 나서 - * DocumentModule::transContent() 에서 해당 컴포넌트의 transHtml() method를 호출하여 고유코드를 html로 변경 - **/ - function transHTML($xml_obj) { - $gallery_info->srl = rand(111111,999999); - $gallery_info->border_thickness = $xml_obj->attrs->border_thickness; - $gallery_info->gallery_style = $xml_obj->attrs->gallery_style; - $gallery_info->border_color = $xml_obj->attrs->border_color; - $gallery_info->bg_color = $xml_obj->attrs->bg_color; - $gallery_info->gallery_align = $xml_obj->attrs->gallery_align; - - $images_list = $xml_obj->attrs->images_list; - $images_list = preg_replace('/\.(gif|jpg|jpeg|png) /i',".\\1\n",$images_list); - $gallery_info->images_list = explode("\n",trim($images_list)); - - // 만약 출력설정이 XML일 경우 이미지 목록만 출력하도록 코드 생성 - if(Context::getResponseMethod() == 'XMLRPC') { - $output = ''; - for($i=0;$iimages_list);$i++) { - $output .= sprintf('
            ', $gallery_info->images_list[$i]); - } - return $output; - } - - // HTML 출력일 경우 템플릿 변환을 거쳐서 갤러리 출력 설정에 맞는 html코드를 생성하도록 함 - preg_match_all('/(width|height)([^[:digit:]]+)([0-9]+)/i',$xml_obj->attrs->style,$matches); - $gallery_info->width = trim($matches[3][0]); - if(!$gallery_info->width) $gallery_info->width = 400; - - Context::set('gallery_info', $gallery_info); - - $tpl_path = $this->component_path.'tpl'; - Context::set("tpl_path", $tpl_path); - - if($gallery_info->gallery_style == "list") $tpl_file = 'list_gallery.html'; - else $tpl_file = 'slide_gallery.html'; - - $oTemplate = &TemplateHandler::getInstance(); - return $oTemplate->compile($tpl_path, $tpl_file); - } - - } -?> +editor_sequence = $editor_sequence; + $this->component_path = $component_path; + } + + /** + * @brief popup window요청시 popup window에 출력할 내용을 추가하면 된다 + **/ + function getPopupContent() { + // 템플릿을 미리 컴파일해서 컴파일된 소스를 return + $tpl_path = $this->component_path.'tpl'; + $tpl_file = 'popup.html'; + + Context::set("tpl_path", $tpl_path); + + $oTemplate = &TemplateHandler::getInstance(); + return $oTemplate->compile($tpl_path, $tpl_file); + } + + /** + * @brief 에디터 컴포넌트가 별도의 고유 코드를 이용한다면 그 코드를 html로 변경하여 주는 method + * + * 이미지나 멀티미디어, 설문등 고유 코드가 필요한 에디터 컴포넌트는 고유코드를 내용에 추가하고 나서 + * DocumentModule::transContent() 에서 해당 컴포넌트의 transHtml() method를 호출하여 고유코드를 html로 변경 + **/ + function transHTML($xml_obj) { + $gallery_info->srl = rand(111111,999999); + $gallery_info->border_thickness = $xml_obj->attrs->border_thickness; + $gallery_info->gallery_style = $xml_obj->attrs->gallery_style; + $gallery_info->border_color = $xml_obj->attrs->border_color; + $gallery_info->bg_color = $xml_obj->attrs->bg_color; + $gallery_info->gallery_align = $xml_obj->attrs->gallery_align; + + $images_list = $xml_obj->attrs->images_list; + $images_list = preg_replace('/\.(gif|jpg|jpeg|png) /i',".\\1\n",$images_list); + $gallery_info->images_list = explode("\n",trim($images_list)); + + // 만약 출력설정이 XML일 경우 이미지 목록만 출력하도록 코드 생성 + if(Context::getResponseMethod() == 'XMLRPC') { + $output = ''; + for($i=0;$iimages_list);$i++) { + $output .= sprintf('
            ', $gallery_info->images_list[$i]); + } + return $output; + } + + // HTML 출력일 경우 템플릿 변환을 거쳐서 갤러리 출력 설정에 맞는 html코드를 생성하도록 함 + preg_match_all('/(width|height)([^[:digit:]]+)([0-9]+)/i',$xml_obj->attrs->style,$matches); + $gallery_info->width = trim($matches[3][0]); + if(!$gallery_info->width) $gallery_info->width = 400; + + Context::set('gallery_info', $gallery_info); + + $tpl_path = $this->component_path.'tpl'; + Context::set("tpl_path", $tpl_path); + + if($gallery_info->gallery_style == "list") $tpl_file = 'list_gallery.html'; + else $tpl_file = 'slide_gallery.html'; + + $oTemplate = &TemplateHandler::getInstance(); + return $oTemplate->compile($tpl_path, $tpl_file); + } + + } +?> diff --git a/modules/editor/components/image_gallery/info.xml b/modules/editor/components/image_gallery/info.xml index dd2c477e5..2d5a16ffd 100644 --- a/modules/editor/components/image_gallery/info.xml +++ b/modules/editor/components/image_gallery/info.xml @@ -1,35 +1,35 @@ - - - Slide Show - 기본 이미지 갤러리 - デフォルトイメージギャラリー - 图片相册 - Basic Image Gallery - Galería de imágenes básicos - Базовая галлерея изображений - 預設圖片相簿 - Temel Resim Galerisi - Bạn có thể tạo ra một Slide Show theo dạng danh sách hoặc Slide từ những hình ảnh đính kèm của mình. - 첨부된 이미지파일을 이용하여 슬라이드/목록형 이미지 갤러리를 만들 수 있습니다. - 添付されたイメージファイルを利用して、スライド型・リスト型のイメージギャラリーが作成できます。 - 利用上传的图片文件实现幻灯片式或目录型相册图片。 - It can create image gallery of slide/list style by using attached image file. - It can create image gallery of slide/list style by using attached image file. - Это может создать гллерею изображений в стиле слайдов/списка, используя вложенный файл изображения. - 將上傳的圖片以投影片或列表的形式實現。 - Ekteki resim dosyasını kullanarak, slayt/liste tarzı resim galerisi oluşturabilir. - 0.1 - 2007-02-28 - - - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - - + + + Slide Show + 기본 이미지 갤러리 + デフォルトイメージギャラリー + 图片相册 + Basic Image Gallery + Galería de imágenes básicos + Базовая галлерея изображений + 預設圖片相簿 + Temel Resim Galerisi + Bạn có thể tạo ra một Slide Show theo dạng danh sách hoặc Slide từ những hình ảnh đính kèm của mình. + 첨부된 이미지파일을 이용하여 슬라이드/목록형 이미지 갤러리를 만들 수 있습니다. + 添付されたイメージファイルを利用して、スライド型・リスト型のイメージギャラリーが作成できます。 + 利用上传的图片文件实现幻灯片式或目录型相册图片。 + It can create image gallery of slide/list style by using attached image file. + It can create image gallery of slide/list style by using attached image file. + Это может создать гллерею изображений в стиле слайдов/списка, используя вложенный файл изображения. + 將上傳的圖片以投影片或列表的形式實現。 + Ekteki resim dosyasını kullanarak, slayt/liste tarzı resim galerisi oluşturabilir. + 0.1 + 2007-02-28 + + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + diff --git a/modules/editor/components/image_gallery/lang/en.lang.php b/modules/editor/components/image_gallery/lang/en.lang.php index 23c267c36..5f0618f66 100644 --- a/modules/editor/components/image_gallery/lang/en.lang.php +++ b/modules/editor/components/image_gallery/lang/en.lang.php @@ -1,27 +1,27 @@ - language pack of image_gallery component. - **/ - - $lang->image_gallery = "Make Image Gallery"; - $lang->width = "Width"; - $lang->height = "Height"; - $lang->image_list = "Image List"; - $lang->gallery_style = "Gallery Style"; - $lang->gallery_slide_style = "Slide Style"; - $lang->gallery_slide_align = "Align Style"; - $lang->gallery_slide_center = "Center"; - $lang->gallery_slide_left = "Left"; - $lang->gallery_slide_right = "Right"; - $lang->gallery_list_style = "Expand All"; - $lang->gallery_border_color = "Border Color"; - $lang->gallery_border_thickness = "Border Thickness"; - $lang->gallery_bg_color = "Background Color"; - $lang->about_image_list = "Select file to add to the image gallery. You can drag it after selecting or shift+click(for selecting widely), ctrl+click(for selecting individually)"; - - $lang->cmd_gallery_prev = "Previous Picture"; - $lang->cmd_gallery_next = "Next Picture"; - $lang->cmd_gallery_thumbnail = "Thumbnail"; -?> + language pack of image_gallery component. + **/ + + $lang->image_gallery = "Make Image Gallery"; + $lang->width = "Width"; + $lang->height = "Height"; + $lang->image_list = "Image List"; + $lang->gallery_style = "Gallery Style"; + $lang->gallery_slide_style = "Slide Style"; + $lang->gallery_slide_align = "Align Style"; + $lang->gallery_slide_center = "Center"; + $lang->gallery_slide_left = "Left"; + $lang->gallery_slide_right = "Right"; + $lang->gallery_list_style = "Expand All"; + $lang->gallery_border_color = "Border Color"; + $lang->gallery_border_thickness = "Border Thickness"; + $lang->gallery_bg_color = "Background Color"; + $lang->about_image_list = "Select file to add to the image gallery. You can drag it after selecting or shift+click(for selecting widely), ctrl+click(for selecting individually)"; + + $lang->cmd_gallery_prev = "Previous Picture"; + $lang->cmd_gallery_next = "Next Picture"; + $lang->cmd_gallery_thumbnail = "Thumbnail"; +?> diff --git a/modules/editor/components/image_gallery/lang/es.lang.php b/modules/editor/components/image_gallery/lang/es.lang.php index b9355d4d7..c6372b1dc 100644 --- a/modules/editor/components/image_gallery/lang/es.lang.php +++ b/modules/editor/components/image_gallery/lang/es.lang.php @@ -1,27 +1,27 @@ - language pack of image_gallery component. - **/ - - $lang->image_gallery = "Haga Galeria de Imagenes"; - $lang->width = "Ancho"; - $lang->altura = "Altura"; - $lang->image_list = "Lista de imagenes"; - $lang->gallery_style = "Galeria de Estilo"; - $lang->gallery_slide_style = "Estilo de diapositivas"; - $lang->gallery_slide_align = "Alinear Estilo"; - $lang->gallery_slide_center = "Centro"; - $lang->gallery_slide_left = "Izquierda"; - $lang->gallery_slide_right = "Derecho"; - $lang->gallery_list_style = "Mostrar todos"; - $lang->gallery_border_color = "Color del borde"; - $lang->gallery_border_thickness = "Grosor de Fronteras"; - $lang->gallery_bg_color = "Color de fondo"; - $lang->about_image_list = "Seleccione archivo para anadir a la galeria de imagenes. Puede arrastrar despues de la seleccion o cambio + clic (para seleccionar ampliamente), ctrl + clic (para seleccionar individualmente)"; - - $lang->cmd_gallery_prev = "Imagen anterior"; - $lang->cmd_gallery_next = "Imagen siguiente"; - $lang->cmd_gallery_thumbnail = "Miniatura"; -?> + language pack of image_gallery component. + **/ + + $lang->image_gallery = "Haga Galeria de Imagenes"; + $lang->width = "Ancho"; + $lang->altura = "Altura"; + $lang->image_list = "Lista de imagenes"; + $lang->gallery_style = "Galeria de Estilo"; + $lang->gallery_slide_style = "Estilo de diapositivas"; + $lang->gallery_slide_align = "Alinear Estilo"; + $lang->gallery_slide_center = "Centro"; + $lang->gallery_slide_left = "Izquierda"; + $lang->gallery_slide_right = "Derecho"; + $lang->gallery_list_style = "Mostrar todos"; + $lang->gallery_border_color = "Color del borde"; + $lang->gallery_border_thickness = "Grosor de Fronteras"; + $lang->gallery_bg_color = "Color de fondo"; + $lang->about_image_list = "Seleccione archivo para anadir a la galeria de imagenes. Puede arrastrar despues de la seleccion o cambio + clic (para seleccionar ampliamente), ctrl + clic (para seleccionar individualmente)"; + + $lang->cmd_gallery_prev = "Imagen anterior"; + $lang->cmd_gallery_next = "Imagen siguiente"; + $lang->cmd_gallery_thumbnail = "Miniatura"; +?> diff --git a/modules/editor/components/image_gallery/lang/jp.lang.php b/modules/editor/components/image_gallery/lang/jp.lang.php index 8e2b37c0d..52ca29da2 100644 --- a/modules/editor/components/image_gallery/lang/jp.lang.php +++ b/modules/editor/components/image_gallery/lang/jp.lang.php @@ -1,27 +1,27 @@ - イメージギャラリー(image_gallery)コンポネント言語パッケージ - **/ - - $lang->image_gallery = "イメージギャラリー作成"; - $lang->width = "横幅サイズ"; - $lang->height = "縦幅サイズ"; - $lang->image_list = "イメージリスト"; - $lang->gallery_style = "ギャラリースタイル"; - $lang->gallery_slide_style = "スライドスタイル"; - $lang->gallery_slide_align = "アライン位置"; - $lang->gallery_slide_center = "中央揃え"; - $lang->gallery_slide_left = "左揃え"; - $lang->gallery_slide_right = "右揃え"; - $lang->gallery_list_style = "展開表示(リスト)"; - $lang->gallery_border_color = "ボーダーカラー"; - $lang->gallery_border_thickness = "ボーダー"; - $lang->gallery_bg_color = "背景色"; - $lang->about_image_list = "イメージギャラリーに追加するファイルを選択して下さい。選択した後、ドラッグまたは「Shift+クリック(範囲選択)、Ctrl+クリック(個別選択)」が出来ます。"; - - $lang->cmd_gallery_prev = "前のイメージ表示"; - $lang->cmd_gallery_next = "次のイメージ表示"; - $lang->cmd_gallery_thumbnail = "サムネール表示"; -?> + イメージギャラリー(image_gallery)コンポネント言語パッケージ + **/ + + $lang->image_gallery = "イメージギャラリー作成"; + $lang->width = "横幅サイズ"; + $lang->height = "縦幅サイズ"; + $lang->image_list = "イメージリスト"; + $lang->gallery_style = "ギャラリースタイル"; + $lang->gallery_slide_style = "スライドスタイル"; + $lang->gallery_slide_align = "アライン位置"; + $lang->gallery_slide_center = "中央揃え"; + $lang->gallery_slide_left = "左揃え"; + $lang->gallery_slide_right = "右揃え"; + $lang->gallery_list_style = "展開表示(リスト)"; + $lang->gallery_border_color = "ボーダーカラー"; + $lang->gallery_border_thickness = "ボーダー"; + $lang->gallery_bg_color = "背景色"; + $lang->about_image_list = "イメージギャラリーに追加するファイルを選択して下さい。選択した後、ドラッグまたは「Shift+クリック(範囲選択)、Ctrl+クリック(個別選択)」が出来ます。"; + + $lang->cmd_gallery_prev = "前のイメージ表示"; + $lang->cmd_gallery_next = "次のイメージ表示"; + $lang->cmd_gallery_thumbnail = "サムネール表示"; +?> diff --git a/modules/editor/components/image_gallery/lang/ru.lang.php b/modules/editor/components/image_gallery/lang/ru.lang.php index e9a585eab..47b680728 100644 --- a/modules/editor/components/image_gallery/lang/ru.lang.php +++ b/modules/editor/components/image_gallery/lang/ru.lang.php @@ -1,27 +1,27 @@ - language pack of image_gallery component. - **/ - - $lang->image_gallery = "Создать галлерею изображений"; - $lang->width = "Ширина"; - $lang->height = "Высота"; - $lang->image_list = "Список изображений"; - $lang->gallery_style = "Стиль галлереи"; - $lang->gallery_slide_style = "Стиль слайда"; - $lang->gallery_slide_align = "Стиль выравнивания"; - $lang->gallery_slide_center = "Центр"; - $lang->gallery_slide_left = "Лево"; - $lang->gallery_slide_right = "Право"; - $lang->gallery_list_style = "Раскрыть все"; - $lang->gallery_border_color = "Цыет рамки"; - $lang->gallery_border_thickness = "Толщина рамки"; - $lang->gallery_bg_color = "Цвет фона"; - $lang->about_image_list = "Выберите файл для добавления в галлерею изображений. Вы можете перетащить его после выбора или нажав shift+click(для широкого выделения), ctrl+click(для индивидуального выделения)"; - - $lang->cmd_gallery_prev = "Предыдущее изображение"; - $lang->cmd_gallery_next = "Следующее изображение"; - $lang->cmd_gallery_thumbnail = "Миниатюра"; -?> + language pack of image_gallery component. + **/ + + $lang->image_gallery = "Создать галлерею изображений"; + $lang->width = "Ширина"; + $lang->height = "Высота"; + $lang->image_list = "Список изображений"; + $lang->gallery_style = "Стиль галлереи"; + $lang->gallery_slide_style = "Стиль слайда"; + $lang->gallery_slide_align = "Стиль выравнивания"; + $lang->gallery_slide_center = "Центр"; + $lang->gallery_slide_left = "Лево"; + $lang->gallery_slide_right = "Право"; + $lang->gallery_list_style = "Раскрыть все"; + $lang->gallery_border_color = "Цыет рамки"; + $lang->gallery_border_thickness = "Толщина рамки"; + $lang->gallery_bg_color = "Цвет фона"; + $lang->about_image_list = "Выберите файл для добавления в галлерею изображений. Вы можете перетащить его после выбора или нажав shift+click(для широкого выделения), ctrl+click(для индивидуального выделения)"; + + $lang->cmd_gallery_prev = "Предыдущее изображение"; + $lang->cmd_gallery_next = "Следующее изображение"; + $lang->cmd_gallery_thumbnail = "Миниатюра"; +?> diff --git a/modules/editor/components/image_gallery/lang/tr.lang.php b/modules/editor/components/image_gallery/lang/tr.lang.php index 2a106e3af..8d4bd57f1 100644 --- a/modules/editor/components/image_gallery/lang/tr.lang.php +++ b/modules/editor/components/image_gallery/lang/tr.lang.php @@ -1,27 +1,27 @@ - language pack of image_gallery component. - **/ - - $lang->image_gallery = "Resim Galerisi Oluştur"; - $lang->width = "Genişlik"; - $lang->height = "Yükseklik"; - $lang->image_list = "Resim Listesi"; - $lang->gallery_style = "Galeri Tarzı"; - $lang->gallery_slide_style = "Slayt Tarzı"; - $lang->gallery_slide_align = "Hizalama Tarzı"; - $lang->gallery_slide_center = "Ortalı"; - $lang->gallery_slide_left = "Sol"; - $lang->gallery_slide_right = "Sağ"; - $lang->gallery_list_style = "Hepsini Genişlet"; - $lang->gallery_border_color = "Kenarlık Rengi"; - $lang->gallery_border_thickness = "Kenarlık Kalınlığı"; - $lang->gallery_bg_color = "Arkaplan Rengi"; - $lang->about_image_list = "Resim galerisine eklenecek dosyayı seçiniz. Seçtikten sonra dosyayı sürükleyebilirsiniz ya da shift+click(geniş ölçüde seçimler için), ctrl+click(bireysel seçimler için)komutlarını kullanabilirsiniz"; - - $lang->cmd_gallery_prev = "Önceki Resim"; - $lang->cmd_gallery_next = "Sonraki Resim"; - $lang->cmd_gallery_thumbnail = "Küçük Resim"; -?> + language pack of image_gallery component. + **/ + + $lang->image_gallery = "Resim Galerisi Oluştur"; + $lang->width = "Genişlik"; + $lang->height = "Yükseklik"; + $lang->image_list = "Resim Listesi"; + $lang->gallery_style = "Galeri Tarzı"; + $lang->gallery_slide_style = "Slayt Tarzı"; + $lang->gallery_slide_align = "Hizalama Tarzı"; + $lang->gallery_slide_center = "Ortalı"; + $lang->gallery_slide_left = "Sol"; + $lang->gallery_slide_right = "Sağ"; + $lang->gallery_list_style = "Hepsini Genişlet"; + $lang->gallery_border_color = "Kenarlık Rengi"; + $lang->gallery_border_thickness = "Kenarlık Kalınlığı"; + $lang->gallery_bg_color = "Arkaplan Rengi"; + $lang->about_image_list = "Resim galerisine eklenecek dosyayı seçiniz. Seçtikten sonra dosyayı sürükleyebilirsiniz ya da shift+click(geniş ölçüde seçimler için), ctrl+click(bireysel seçimler için)komutlarını kullanabilirsiniz"; + + $lang->cmd_gallery_prev = "Önceki Resim"; + $lang->cmd_gallery_next = "Sonraki Resim"; + $lang->cmd_gallery_thumbnail = "Küçük Resim"; +?> diff --git a/modules/editor/components/image_gallery/lang/vi.lang.php b/modules/editor/components/image_gallery/lang/vi.lang.php index 5934406c5..0fb2f5aba 100644 --- a/modules/editor/components/image_gallery/lang/vi.lang.php +++ b/modules/editor/components/image_gallery/lang/vi.lang.php @@ -1,29 +1,29 @@ -image_gallery = "Tạo Slide Show"; - $lang->width = "Chiều rộng"; - $lang->height = "Chiều cao"; - $lang->image_list = "Danh sách hình ảnh"; - $lang->gallery_style = "Kiểu dáng Show"; - $lang->gallery_slide_style = "Kiểu Slide"; - $lang->gallery_slide_align = "Kiểu căn chỉnh"; - $lang->gallery_slide_center = "Giữa"; - $lang->gallery_slide_left = "Trái"; - $lang->gallery_slide_right = "Phải"; - $lang->gallery_list_style = "Mở rộng tất cả"; - $lang->gallery_border_color = "Màu viền"; - $lang->gallery_border_thickness = "Độ dày viền"; - $lang->gallery_bg_color = "Màu nền"; - $lang->about_image_list = "Chọn hình ảnh để thêm vào Show. Bạn có thể di chuyển hình ảnh bằng cách bấm tổ hợp 'Shift+Click' để di chuyển nhiều hình ảnh, hoặc 'Ctrl+Click' để di chuyển từng hình ảnh."; - - $lang->cmd_gallery_prev = "Hình trước"; - $lang->cmd_gallery_next = "Hình sau"; - $lang->cmd_gallery_thumbnail = "Hình nhỏ"; -?> +image_gallery = "Tạo Slide Show"; + $lang->width = "Chiều rộng"; + $lang->height = "Chiều cao"; + $lang->image_list = "Danh sách hình ảnh"; + $lang->gallery_style = "Kiểu dáng Show"; + $lang->gallery_slide_style = "Kiểu Slide"; + $lang->gallery_slide_align = "Kiểu căn chỉnh"; + $lang->gallery_slide_center = "Giữa"; + $lang->gallery_slide_left = "Trái"; + $lang->gallery_slide_right = "Phải"; + $lang->gallery_list_style = "Mở rộng tất cả"; + $lang->gallery_border_color = "Màu viền"; + $lang->gallery_border_thickness = "Độ dày viền"; + $lang->gallery_bg_color = "Màu nền"; + $lang->about_image_list = "Chọn hình ảnh để thêm vào Show. Bạn có thể di chuyển hình ảnh bằng cách bấm tổ hợp 'Shift+Click' để di chuyển nhiều hình ảnh, hoặc 'Ctrl+Click' để di chuyển từng hình ảnh."; + + $lang->cmd_gallery_prev = "Hình trước"; + $lang->cmd_gallery_next = "Hình sau"; + $lang->cmd_gallery_thumbnail = "Hình nhỏ"; +?> diff --git a/modules/editor/components/image_gallery/lang/zh-CN.lang.php b/modules/editor/components/image_gallery/lang/zh-CN.lang.php index af5e01b93..f6552c3ee 100644 --- a/modules/editor/components/image_gallery/lang/zh-CN.lang.php +++ b/modules/editor/components/image_gallery/lang/zh-CN.lang.php @@ -1,27 +1,27 @@ - 图像(image_gallery) 组件的语言包 - **/ - - $lang->image_gallery = "图像编辑"; - $lang->width = "宽度"; - $lang->height = "高度"; - $lang->image_list = "图像目录"; - $lang->gallery_style = "风格"; - $lang->gallery_slide_style = "幻灯片风格"; - $lang->gallery_slide_align = "对齐方式"; - $lang->gallery_slide_center = "居中对齐"; - $lang->gallery_slide_left = "左对齐"; - $lang->gallery_slide_right = "右对齐"; - $lang->gallery_list_style = "全部展开"; - $lang->gallery_border_color = "边框颜色"; - $lang->gallery_border_thickness = "边框粗细"; - $lang->gallery_bg_color = "背景颜色"; - $lang->about_image_list = "请选择要添加的图像文件。 选择后可以拖动或按 shift+点击(范围选择), ctrl+点击(个别选择)"; - - $lang->cmd_gallery_prev = "上一个"; - $lang->cmd_gallery_next = "下一个"; - $lang->cmd_gallery_thumbnail = "查看缩略图il"; -?> + 图像(image_gallery) 组件的语言包 + **/ + + $lang->image_gallery = "图像编辑"; + $lang->width = "宽度"; + $lang->height = "高度"; + $lang->image_list = "图像目录"; + $lang->gallery_style = "风格"; + $lang->gallery_slide_style = "幻灯片风格"; + $lang->gallery_slide_align = "对齐方式"; + $lang->gallery_slide_center = "居中对齐"; + $lang->gallery_slide_left = "左对齐"; + $lang->gallery_slide_right = "右对齐"; + $lang->gallery_list_style = "全部展开"; + $lang->gallery_border_color = "边框颜色"; + $lang->gallery_border_thickness = "边框粗细"; + $lang->gallery_bg_color = "背景颜色"; + $lang->about_image_list = "请选择要添加的图像文件。 选择后可以拖动或按 shift+点击(范围选择), ctrl+点击(个别选择)"; + + $lang->cmd_gallery_prev = "上一个"; + $lang->cmd_gallery_next = "下一个"; + $lang->cmd_gallery_thumbnail = "查看缩略图il"; +?> diff --git a/modules/editor/components/image_gallery/lang/zh-TW.lang.php b/modules/editor/components/image_gallery/lang/zh-TW.lang.php index 430b4c80a..adbee32d8 100644 --- a/modules/editor/components/image_gallery/lang/zh-TW.lang.php +++ b/modules/editor/components/image_gallery/lang/zh-TW.lang.php @@ -1,27 +1,27 @@ - 圖片(image_gallery) 組件的語言 - **/ - - $lang->image_gallery = "圖片編輯"; - $lang->width = "寬度"; - $lang->height = "高度"; - $lang->image_list = "圖片列表"; - $lang->gallery_style = "風格"; - $lang->gallery_slide_style = "幻燈片"; - $lang->gallery_slide_align = "對齊方式"; - $lang->gallery_slide_center = "置中"; - $lang->gallery_slide_left = "靠左"; - $lang->gallery_slide_right = "靠右"; - $lang->gallery_list_style = "全部展開"; - $lang->gallery_border_color = "邊框顏色"; - $lang->gallery_border_thickness = "邊框粗細"; - $lang->gallery_bg_color = "背景顏色"; - $lang->about_image_list = "請選擇要新增的圖片檔案。可以框選或按住 shift+左鍵(範圍選擇), ctrl+左鍵(個別選擇)選擇檔案。"; - - $lang->cmd_gallery_prev = "上一個"; - $lang->cmd_gallery_next = "下一個"; - $lang->cmd_gallery_thumbnail = "檢視縮圖"; -?> + 圖片(image_gallery) 組件的語言 + **/ + + $lang->image_gallery = "圖片編輯"; + $lang->width = "寬度"; + $lang->height = "高度"; + $lang->image_list = "圖片列表"; + $lang->gallery_style = "風格"; + $lang->gallery_slide_style = "幻燈片"; + $lang->gallery_slide_align = "對齊方式"; + $lang->gallery_slide_center = "置中"; + $lang->gallery_slide_left = "靠左"; + $lang->gallery_slide_right = "靠右"; + $lang->gallery_list_style = "全部展開"; + $lang->gallery_border_color = "邊框顏色"; + $lang->gallery_border_thickness = "邊框粗細"; + $lang->gallery_bg_color = "背景顏色"; + $lang->about_image_list = "請選擇要新增的圖片檔案。可以框選或按住 shift+左鍵(範圍選擇), ctrl+左鍵(個別選擇)選擇檔案。"; + + $lang->cmd_gallery_prev = "上一個"; + $lang->cmd_gallery_next = "下一個"; + $lang->cmd_gallery_thumbnail = "檢視縮圖"; +?> diff --git a/modules/editor/components/image_link/image_link.class.php b/modules/editor/components/image_link/image_link.class.php index a6bda7807..ab771e421 100644 --- a/modules/editor/components/image_link/image_link.class.php +++ b/modules/editor/components/image_link/image_link.class.php @@ -1,108 +1,108 @@ -editor_sequence = $editor_sequence; - $this->component_path = $component_path; - } - - /** - * @brief popup window요청시 popup window에 출력할 내용을 추가하면 된다 - **/ - function getPopupContent() { - // 템플릿을 미리 컴파일해서 컴파일된 소스를 return - $tpl_path = $this->component_path.'tpl'; - $tpl_file = 'popup.html'; - - Context::set("tpl_path", $tpl_path); - - $oTemplate = &TemplateHandler::getInstance(); - return $oTemplate->compile($tpl_path, $tpl_file); - } - - /** - * @brief 에디터 컴포넌트가 별도의 고유 코드를 이용한다면 그 코드를 html로 변경하여 주는 method - * - * 이미지나 멀티미디어, 설문등 고유 코드가 필요한 에디터 컴포넌트는 고유코드를 내용에 추가하고 나서 - * DocumentModule::transContent() 에서 해당 컴포넌트의 transHtml() method를 호출하여 고유코드를 html로 변경 - **/ - function transHTML($xml_obj) { - $src = $xml_obj->attrs->src; - $width = $xml_obj->attrs->width; - $height = $xml_obj->attrs->height; - $align = $xml_obj->attrs->align; - $alt = $xml_obj->attrs->alt; - $border = (int)$xml_obj->attrs->border; - $link_url = $xml_obj->attrs->link_url; - $open_window = $xml_obj->attrs->open_window; - $style = $xml_obj->attrs->style; - $margin = (int)$xml_obj->attrs->margin; - - if(!$alt) { - $tmp_arr = explode('/',$src); - $alt = array_pop($tmp_arr); - } - - $src = str_replace(array('&','"'), array('&','&qout;'), $src); - $src = str_replace('&amp;', '&', $src); - - if(!$alt) $alt = $src; - // 이미지 주소를 request uri가 포함된 주소로 변환 (rss출력, 등등을 위함) - $temp_src = explode('/', $src); - if(substr($src, 0,2)=='./') $src = Context::getRequestUri().substr($src, 2); - elseif(substr($src , 0, 1)=='/') { - if($_SERVER['HTTPS']=='on') $http_src = 'https://'; - else $http_src = 'http://'; - $src = $http_src.$_SERVER['HTTP_HOST'].$src; - } - elseif(!strpos($temp_src[0],':') && $src) $src = Context::getRequestUri().$src; - - $attr_output = array(); - $attr_output = array("src=\"".$src."\""); - if($alt) { - $attr_output[] = "alt=\"".$alt."\""; - $attr_output[] = "title=\"".$alt."\""; - } - if($margin) { - $style = trim(preg_replace('/margin[a-z\-]*[ ]*:[ ]*[0-9 a-z]+(;| )/i','', $style)).';'; - $style = str_replace(';;',';',$style); - if($style == ';') $style = ''; - $style .= ' margin:'.$margin.'px;'; - } - if($align) $attr_output[] = "align=\"".$align."\""; - - if(preg_match("/\.png$/i",$src)) $attr_output[] = "class=\"iePngFix\""; - - if($width) $attr_output[] = 'width="'.$width.'"'; - if($height) $attr_output[] = 'height="'.$height.'"'; - if($border) { - $style = trim(preg_replace('/border[a-z\-]*[ ]*:[ ]*[0-9 a-z]+(;| )/i','', $style)).';'; - $style = str_replace(';;',';',$style); - if($style == ';') $style = ''; - $style .= ' border-style: solid; border-width:'.$border.'px;'; - } - - $code = sprintf("", implode(' ',$attr_output), $style); - - if($link_url) { - if($open_window =='Y') $code = sprintf('%s', $link_url, $code); - else $code = sprintf('%s', $link_url, $code); - } - return $code; - } - - } -?> +editor_sequence = $editor_sequence; + $this->component_path = $component_path; + } + + /** + * @brief popup window요청시 popup window에 출력할 내용을 추가하면 된다 + **/ + function getPopupContent() { + // 템플릿을 미리 컴파일해서 컴파일된 소스를 return + $tpl_path = $this->component_path.'tpl'; + $tpl_file = 'popup.html'; + + Context::set("tpl_path", $tpl_path); + + $oTemplate = &TemplateHandler::getInstance(); + return $oTemplate->compile($tpl_path, $tpl_file); + } + + /** + * @brief 에디터 컴포넌트가 별도의 고유 코드를 이용한다면 그 코드를 html로 변경하여 주는 method + * + * 이미지나 멀티미디어, 설문등 고유 코드가 필요한 에디터 컴포넌트는 고유코드를 내용에 추가하고 나서 + * DocumentModule::transContent() 에서 해당 컴포넌트의 transHtml() method를 호출하여 고유코드를 html로 변경 + **/ + function transHTML($xml_obj) { + $src = $xml_obj->attrs->src; + $width = $xml_obj->attrs->width; + $height = $xml_obj->attrs->height; + $align = $xml_obj->attrs->align; + $alt = $xml_obj->attrs->alt; + $border = (int)$xml_obj->attrs->border; + $link_url = $xml_obj->attrs->link_url; + $open_window = $xml_obj->attrs->open_window; + $style = $xml_obj->attrs->style; + $margin = (int)$xml_obj->attrs->margin; + + if(!$alt) { + $tmp_arr = explode('/',$src); + $alt = array_pop($tmp_arr); + } + + $src = str_replace(array('&','"'), array('&','&qout;'), $src); + $src = str_replace('&amp;', '&', $src); + + if(!$alt) $alt = $src; + // 이미지 주소를 request uri가 포함된 주소로 변환 (rss출력, 등등을 위함) + $temp_src = explode('/', $src); + if(substr($src, 0,2)=='./') $src = Context::getRequestUri().substr($src, 2); + elseif(substr($src , 0, 1)=='/') { + if($_SERVER['HTTPS']=='on') $http_src = 'https://'; + else $http_src = 'http://'; + $src = $http_src.$_SERVER['HTTP_HOST'].$src; + } + elseif(!strpos($temp_src[0],':') && $src) $src = Context::getRequestUri().$src; + + $attr_output = array(); + $attr_output = array("src=\"".$src."\""); + if($alt) { + $attr_output[] = "alt=\"".$alt."\""; + $attr_output[] = "title=\"".$alt."\""; + } + if($margin) { + $style = trim(preg_replace('/margin[a-z\-]*[ ]*:[ ]*[0-9 a-z]+(;| )/i','', $style)).';'; + $style = str_replace(';;',';',$style); + if($style == ';') $style = ''; + $style .= ' margin:'.$margin.'px;'; + } + if($align) $attr_output[] = "align=\"".$align."\""; + + if(preg_match("/\.png$/i",$src)) $attr_output[] = "class=\"iePngFix\""; + + if($width) $attr_output[] = 'width="'.$width.'"'; + if($height) $attr_output[] = 'height="'.$height.'"'; + if($border) { + $style = trim(preg_replace('/border[a-z\-]*[ ]*:[ ]*[0-9 a-z]+(;| )/i','', $style)).';'; + $style = str_replace(';;',';',$style); + if($style == ';') $style = ''; + $style .= ' border-style: solid; border-width:'.$border.'px;'; + } + + $code = sprintf("", implode(' ',$attr_output), $style); + + if($link_url) { + if($open_window =='Y') $code = sprintf('%s', $link_url, $code); + else $code = sprintf('%s', $link_url, $code); + } + return $code; + } + + } +?> diff --git a/modules/editor/components/image_link/info.xml b/modules/editor/components/image_link/info.xml index dd9afc9b0..c9469694f 100644 --- a/modules/editor/components/image_link/info.xml +++ b/modules/editor/components/image_link/info.xml @@ -1,35 +1,35 @@ - - - 이미지 추가 - イメージ追加 - 插入图像 - Add Images - Thêm hình ảnh - Añadir imágenes - Добавление изображений - 圖片連結 - Resim Ekle - 에디터에 이미지를 추가하거나 속성을 변경할 수 있습니다. - エディターでイメージの追加、属性の変更が出来ます。 - 可以插入图像或编辑其相应属性。 - It can add an image to editor or change the attribution of image. - Bạn có thể thêm hình ảnh để sửa hay chia sẻ. - Se puede añadir una imagen a editor o cambiar la atribución de la imagen. - Это может добавить изображение в редактор или изменить параметры изображения. - 可以新增或編輯其相關屬性。 - Editöre bir resim ekleyebilir veya resmin niteliğini değiştirebilir. - 0.1 - 2007-02-28 - - - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - - + + + 이미지 추가 + イメージ追加 + 插入图像 + Add Images + Thêm hình ảnh + Añadir imágenes + Добавление изображений + 圖片連結 + Resim Ekle + 에디터에 이미지를 추가하거나 속성을 변경할 수 있습니다. + エディターでイメージの追加、属性の変更が出来ます。 + 可以插入图像或编辑其相应属性。 + It can add an image to editor or change the attribution of image. + Bạn có thể thêm hình ảnh để sửa hay chia sẻ. + Se puede añadir una imagen a editor o cambiar la atribución de la imagen. + Это может добавить изображение в редактор или изменить параметры изображения. + 可以新增或編輯其相關屬性。 + Editöre bir resim ekleyebilir veya resmin niteliğini değiştirebilir. + 0.1 + 2007-02-28 + + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + diff --git a/modules/editor/components/image_link/lang/en.lang.php b/modules/editor/components/image_link/lang/en.lang.php index 0f21f84d5..9f90c0420 100644 --- a/modules/editor/components/image_link/lang/en.lang.php +++ b/modules/editor/components/image_link/lang/en.lang.php @@ -1,22 +1,22 @@ - language pack of image_link component - **/ - - $lang->image_url = "Image Path"; - $lang->image_alt = "Input Description"; - $lang->image_scale = "Image Size"; - $lang->image_align = "Align Style"; - $lang->image_align_normal = "Occupy a Paragraph"; - $lang->image_align_left = "Left of Article"; - $lang->image_align_middle = "Center"; - $lang->image_align_right = "Right of Article"; - $lang->image_border = "Border Thickness"; - $lang->urllink_url = "URL"; - $lang->image_margin = 'Image Margin'; - - $lang->about_url_link_open_window = "Make the link to open as a new window"; - $lang->cmd_get_scale = "Get Image Size"; -?> + language pack of image_link component + **/ + + $lang->image_url = "Image Path"; + $lang->image_alt = "Input Description"; + $lang->image_scale = "Image Size"; + $lang->image_align = "Align Style"; + $lang->image_align_normal = "Occupy a Paragraph"; + $lang->image_align_left = "Left of Article"; + $lang->image_align_middle = "Center"; + $lang->image_align_right = "Right of Article"; + $lang->image_border = "Border Thickness"; + $lang->urllink_url = "URL"; + $lang->image_margin = 'Image Margin'; + + $lang->about_url_link_open_window = "Make the link to open as a new window"; + $lang->cmd_get_scale = "Get Image Size"; +?> diff --git a/modules/editor/components/image_link/lang/es.lang.php b/modules/editor/components/image_link/lang/es.lang.php index 46f63bacd..2c211bc61 100644 --- a/modules/editor/components/image_link/lang/es.lang.php +++ b/modules/editor/components/image_link/lang/es.lang.php @@ -1,22 +1,22 @@ - language pack of image_link component - **/ - - $lang->image_url = "Ruta de la imagen"; - $lang->image_alt = "Descripcion de Entrada"; - $lang->image_scale = "Tamano de la Imagen"; - $lang->image_align = "Alinear Estilo"; - $lang->image_align_normal = "Occupy un parrafo"; - $lang->image_align_left = "Izquierda del articulo"; - $lang->image_align_middle = "Centro"; - $lang->image_align_right = "Derecho de articulo"; - $lang->image_border = "Grosor de Fronteras"; - $lang->urllink_url = "URL"; - $lang->image_margin = 'Image Margin'; - - $lang->about_url_link_open_window = "Hacer el vinculo para abrir una nueva ventana"; - $lang->cmd_get_scale = "Obtener tamano de la imagen"; -?> + language pack of image_link component + **/ + + $lang->image_url = "Ruta de la imagen"; + $lang->image_alt = "Descripcion de Entrada"; + $lang->image_scale = "Tamano de la Imagen"; + $lang->image_align = "Alinear Estilo"; + $lang->image_align_normal = "Occupy un parrafo"; + $lang->image_align_left = "Izquierda del articulo"; + $lang->image_align_middle = "Centro"; + $lang->image_align_right = "Derecho de articulo"; + $lang->image_border = "Grosor de Fronteras"; + $lang->urllink_url = "URL"; + $lang->image_margin = 'Image Margin'; + + $lang->about_url_link_open_window = "Hacer el vinculo para abrir una nueva ventana"; + $lang->cmd_get_scale = "Obtener tamano de la imagen"; +?> diff --git a/modules/editor/components/image_link/lang/jp.lang.php b/modules/editor/components/image_link/lang/jp.lang.php index d53e4cd6b..97bf86c89 100644 --- a/modules/editor/components/image_link/lang/jp.lang.php +++ b/modules/editor/components/image_link/lang/jp.lang.php @@ -1,23 +1,23 @@ - イメージリンク(image_link)コンポネント言語パッケージ - **/ - - $lang->image_url = 'イメージパス'; - $lang->image_alt = '説明(Alt)入力'; - $lang->image_scale = 'イメージサイズ'; - $lang->image_align = 'アライン位置'; - $lang->image_align_normal = '一段落'; - $lang->image_align_left = '左揃え'; - $lang->image_align_middle = '中央揃え'; - $lang->image_align_right = '右揃え'; - $lang->image_border = 'ボーダー'; - $lang->image_margin = '外側の空白(Margin)'; - - $lang->urllink_open_window = '新しいウィンドウで開く'; - $lang->about_url_link_open_window = 'チェックすると、リンクをクリックする際、新しいウィンドウで開きます。'; - - $lang->cmd_get_scale = 'イメージサイズを計算'; -?> + イメージリンク(image_link)コンポネント言語パッケージ + **/ + + $lang->image_url = 'イメージパス'; + $lang->image_alt = '説明(Alt)入力'; + $lang->image_scale = 'イメージサイズ'; + $lang->image_align = 'アライン位置'; + $lang->image_align_normal = '一段落'; + $lang->image_align_left = '左揃え'; + $lang->image_align_middle = '中央揃え'; + $lang->image_align_right = '右揃え'; + $lang->image_border = 'ボーダー'; + $lang->image_margin = '外側の空白(Margin)'; + + $lang->urllink_open_window = '新しいウィンドウで開く'; + $lang->about_url_link_open_window = 'チェックすると、リンクをクリックする際、新しいウィンドウで開きます。'; + + $lang->cmd_get_scale = 'イメージサイズを計算'; +?> diff --git a/modules/editor/components/image_link/lang/ko.lang.php b/modules/editor/components/image_link/lang/ko.lang.php index 79b4bff96..6e6f0e1e2 100644 --- a/modules/editor/components/image_link/lang/ko.lang.php +++ b/modules/editor/components/image_link/lang/ko.lang.php @@ -1,23 +1,23 @@ - 이미지링크(image_link) 컴포넌트의 언어팩 - **/ - - $lang->image_url = '이미지 경로'; - $lang->image_alt = '설명 입력'; - $lang->image_scale = '이미지 크기'; - $lang->image_align = '정렬 방법'; - $lang->image_align_normal = '한 문단을 차지'; - $lang->image_align_left = '글의 왼쪽으로'; - $lang->image_align_middle = '가운데'; - $lang->image_align_right = '글의 우측으로'; - $lang->image_border = '경계선 두께'; - $lang->image_margin = '바깥 여백'; - - $lang->urllink_open_window = '새 창 열기'; - $lang->about_url_link_open_window = '선택하시면 링크 선택 시 새 창으로 열립니다.'; - - $lang->cmd_get_scale = '가로세로 구하기'; -?> + 이미지링크(image_link) 컴포넌트의 언어팩 + **/ + + $lang->image_url = '이미지 경로'; + $lang->image_alt = '설명 입력'; + $lang->image_scale = '이미지 크기'; + $lang->image_align = '정렬 방법'; + $lang->image_align_normal = '한 문단을 차지'; + $lang->image_align_left = '글의 왼쪽으로'; + $lang->image_align_middle = '가운데'; + $lang->image_align_right = '글의 우측으로'; + $lang->image_border = '경계선 두께'; + $lang->image_margin = '바깥 여백'; + + $lang->urllink_open_window = '새 창 열기'; + $lang->about_url_link_open_window = '선택하시면 링크 선택 시 새 창으로 열립니다.'; + + $lang->cmd_get_scale = '가로세로 구하기'; +?> diff --git a/modules/editor/components/image_link/lang/ru.lang.php b/modules/editor/components/image_link/lang/ru.lang.php index 27354e5ae..fef966903 100644 --- a/modules/editor/components/image_link/lang/ru.lang.php +++ b/modules/editor/components/image_link/lang/ru.lang.php @@ -1,22 +1,22 @@ - language pack of image_link component - **/ - - $lang->image_url = "Путь изображения"; - $lang->image_alt = "Введите описание"; - $lang->image_scale = "Размер изображения"; - $lang->image_align = "Стиль выравнивания"; - $lang->image_align_normal = "Занять параграф"; - $lang->image_align_left = "Лево"; - $lang->image_align_middle = "Центр"; - $lang->image_align_right = "Право"; - $lang->image_border = "Толщина рамки"; - $lang->urllink_url = "URL"; - $lang->image_margin = 'Image Margin'; - - $lang->about_url_link_open_window = "Создайте ссылку для открытия в новом окне"; - $lang->cmd_get_scale = "Получить размер изображения"; -?> + language pack of image_link component + **/ + + $lang->image_url = "Путь изображения"; + $lang->image_alt = "Введите описание"; + $lang->image_scale = "Размер изображения"; + $lang->image_align = "Стиль выравнивания"; + $lang->image_align_normal = "Занять параграф"; + $lang->image_align_left = "Лево"; + $lang->image_align_middle = "Центр"; + $lang->image_align_right = "Право"; + $lang->image_border = "Толщина рамки"; + $lang->urllink_url = "URL"; + $lang->image_margin = 'Image Margin'; + + $lang->about_url_link_open_window = "Создайте ссылку для открытия в новом окне"; + $lang->cmd_get_scale = "Получить размер изображения"; +?> diff --git a/modules/editor/components/image_link/lang/tr.lang.php b/modules/editor/components/image_link/lang/tr.lang.php index f4fb574f7..c384240b8 100644 --- a/modules/editor/components/image_link/lang/tr.lang.php +++ b/modules/editor/components/image_link/lang/tr.lang.php @@ -1,22 +1,22 @@ - language pack of image_link component - **/ - - $lang->image_url = "Resim Yolu"; - $lang->image_alt = "Açıklama Gir"; - $lang->image_scale = "Resim Boyutu"; - $lang->image_align = "Hizalama Tarzı"; - $lang->image_align_normal = "Paragraf Atla"; - $lang->image_align_left = "Makalenin Solunda"; - $lang->image_align_middle = "Ortalı"; - $lang->image_align_right = "Makalenin Sağında"; - $lang->image_border = "Kenarlık Kalınlığı"; - $lang->urllink_url = "URL"; - $lang->image_margin = 'Resim Kenar Boşluğu'; - - $lang->about_url_link_open_window = "Köprüyü yeni pencerede aç."; - $lang->cmd_get_scale = "Resim Boyutunu Al"; -?> + language pack of image_link component + **/ + + $lang->image_url = "Resim Yolu"; + $lang->image_alt = "Açıklama Gir"; + $lang->image_scale = "Resim Boyutu"; + $lang->image_align = "Hizalama Tarzı"; + $lang->image_align_normal = "Paragraf Atla"; + $lang->image_align_left = "Makalenin Solunda"; + $lang->image_align_middle = "Ortalı"; + $lang->image_align_right = "Makalenin Sağında"; + $lang->image_border = "Kenarlık Kalınlığı"; + $lang->urllink_url = "URL"; + $lang->image_margin = 'Resim Kenar Boşluğu'; + + $lang->about_url_link_open_window = "Köprüyü yeni pencerede aç."; + $lang->cmd_get_scale = "Resim Boyutunu Al"; +?> diff --git a/modules/editor/components/image_link/lang/vi.lang.php b/modules/editor/components/image_link/lang/vi.lang.php index df986db6e..976109eab 100644 --- a/modules/editor/components/image_link/lang/vi.lang.php +++ b/modules/editor/components/image_link/lang/vi.lang.php @@ -1,24 +1,24 @@ -image_url = "Đường dẫn"; - $lang->image_alt = "Mô tả"; - $lang->image_scale = "Kích thước"; - $lang->image_align = "Căn chỉnh"; - $lang->image_align_normal = "Một khoảng bài viết"; - $lang->image_align_left = "Bên trái bài viết"; - $lang->image_align_middle = "Giữa"; - $lang->image_align_right = "Bên phải bài viết"; - $lang->image_border = "Độ dày viền"; - $lang->urllink_url = "URL"; - $lang->image_margin = 'Lề của hình ảnh'; - - $lang->about_url_link_open_window = "Mở ra trang mới khi bấm vào hình"; - $lang->cmd_get_scale = "Lấy kích thước thật của hình"; +image_url = "Đường dẫn"; + $lang->image_alt = "Mô tả"; + $lang->image_scale = "Kích thước"; + $lang->image_align = "Căn chỉnh"; + $lang->image_align_normal = "Một khoảng bài viết"; + $lang->image_align_left = "Bên trái bài viết"; + $lang->image_align_middle = "Giữa"; + $lang->image_align_right = "Bên phải bài viết"; + $lang->image_border = "Độ dày viền"; + $lang->urllink_url = "URL"; + $lang->image_margin = 'Lề của hình ảnh'; + + $lang->about_url_link_open_window = "Mở ra trang mới khi bấm vào hình"; + $lang->cmd_get_scale = "Lấy kích thước thật của hình"; ?> \ No newline at end of file diff --git a/modules/editor/components/image_link/lang/zh-CN.lang.php b/modules/editor/components/image_link/lang/zh-CN.lang.php index 1bc6e7452..3058d987b 100644 --- a/modules/editor/components/image_link/lang/zh-CN.lang.php +++ b/modules/editor/components/image_link/lang/zh-CN.lang.php @@ -1,23 +1,23 @@ - 图像链接(image_link) 组件的语言包 - **/ - - $lang->image_url = "图像路径"; - $lang->image_alt = "图像说明"; - $lang->image_scale = "图像大小"; - $lang->image_align = "对齐方式"; - $lang->image_align_normal = "占一个段落"; - $lang->image_align_left = "内容左侧"; - $lang->image_align_middle = "居中"; - $lang->image_align_right = "内容右侧"; - $lang->image_border = "边框粗细"; - $lang->image_margin = '外边距'; - - $lang->urllink_open_window = '新窗口打开'; - $lang->about_url_link_open_window = "将在新窗口中打开链接。"; - - $lang->cmd_get_scale = "获得图片大小"; -?> + 图像链接(image_link) 组件的语言包 + **/ + + $lang->image_url = "图像路径"; + $lang->image_alt = "图像说明"; + $lang->image_scale = "图像大小"; + $lang->image_align = "对齐方式"; + $lang->image_align_normal = "占一个段落"; + $lang->image_align_left = "内容左侧"; + $lang->image_align_middle = "居中"; + $lang->image_align_right = "内容右侧"; + $lang->image_border = "边框粗细"; + $lang->image_margin = '外边距'; + + $lang->urllink_open_window = '新窗口打开'; + $lang->about_url_link_open_window = "将在新窗口中打开链接。"; + + $lang->cmd_get_scale = "获得图片大小"; +?> diff --git a/modules/editor/components/image_link/lang/zh-TW.lang.php b/modules/editor/components/image_link/lang/zh-TW.lang.php index 1c63b2e22..5a94e4fa6 100644 --- a/modules/editor/components/image_link/lang/zh-TW.lang.php +++ b/modules/editor/components/image_link/lang/zh-TW.lang.php @@ -1,22 +1,22 @@ - 圖片連結(image_link)組件語言 - **/ - - $lang->image_url = "圖片路徑"; - $lang->image_alt = "圖片說明"; - $lang->image_scale = "圖片大小"; - $lang->image_align = "對齊方式"; - $lang->image_align_normal = "段落"; - $lang->image_align_left = "靠左"; - $lang->image_align_middle = "置中"; - $lang->image_align_right = "靠右"; - $lang->image_border = "邊框粗細"; - $lang->urllink_url = "網址"; - $lang->image_margin = '圖片邊距'; - - $lang->about_url_link_open_window = "開啟連結於新視窗。"; - $lang->cmd_get_scale = "取得圖片大小"; -?> + 圖片連結(image_link)組件語言 + **/ + + $lang->image_url = "圖片路徑"; + $lang->image_alt = "圖片說明"; + $lang->image_scale = "圖片大小"; + $lang->image_align = "對齊方式"; + $lang->image_align_normal = "段落"; + $lang->image_align_left = "靠左"; + $lang->image_align_middle = "置中"; + $lang->image_align_right = "靠右"; + $lang->image_border = "邊框粗細"; + $lang->urllink_url = "網址"; + $lang->image_margin = '圖片邊距'; + + $lang->about_url_link_open_window = "開啟連結於新視窗。"; + $lang->cmd_get_scale = "取得圖片大小"; +?> diff --git a/modules/editor/components/multimedia_link/info.xml b/modules/editor/components/multimedia_link/info.xml index ccc962535..511899ca5 100644 --- a/modules/editor/components/multimedia_link/info.xml +++ b/modules/editor/components/multimedia_link/info.xml @@ -1,35 +1,35 @@ - - - 멀티미디어 자료 관리 - マルチメディア管理 - 多媒体 - Manage Multimedia Data - Administrar datos multimedia - Управление мультимедиа данными - 多媒體管理 - Chèn Media vào bài viết - Çoklu Ortam Verisi Yönetme - 에디터에 wmv,avi,flv등의 멀티미디어 자료를 추가하거나 속성을 수정할 수 있습니다. - エディターに拡張子が「wmv,avi,flv」などのマルチメディアコンテンツを追加、または属性の修正ができます。 - 插入wmv,avi,flv等多媒体文件或修改其相应属性 。 - It can add multimedia data like wmv,avi,flv to editor or change the attribution of multimedia data. - Se pueden agregar datos multimedia como wmv, avi, flv al editor o cambiar la atribución de datos multimedia. - Это может добавить мультимедиа данные как wmv,avi,flv в редактор или изменить параметры данных мультимедиа. - 可新增 wmv、avi、flv 等多媒體檔案或修改其相關屬性。 - Chèn Media dạng '.wmv,.avi,.flv,.mp3,.wma' vào bài viết. - wmv, avi, flv gibi çoklu ortam dosyalarını editöre ekleyebilir veya çoklu ortam dosyasının niteliğini değiştirebilir. - 0.1 - 2007-02-28 - - - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - - + + + 멀티미디어 자료 관리 + マルチメディア管理 + 多媒体 + Manage Multimedia Data + Administrar datos multimedia + Управление мультимедиа данными + 多媒體管理 + Chèn Media vào bài viết + Çoklu Ortam Verisi Yönetme + 에디터에 wmv,avi,flv등의 멀티미디어 자료를 추가하거나 속성을 수정할 수 있습니다. + エディターに拡張子が「wmv,avi,flv」などのマルチメディアコンテンツを追加、または属性の修正ができます。 + 插入wmv,avi,flv等多媒体文件或修改其相应属性 。 + It can add multimedia data like wmv,avi,flv to editor or change the attribution of multimedia data. + Se pueden agregar datos multimedia como wmv, avi, flv al editor o cambiar la atribución de datos multimedia. + Это может добавить мультимедиа данные как wmv,avi,flv в редактор или изменить параметры данных мультимедиа. + 可新增 wmv、avi、flv 等多媒體檔案或修改其相關屬性。 + Chèn Media dạng '.wmv,.avi,.flv,.mp3,.wma' vào bài viết. + wmv, avi, flv gibi çoklu ortam dosyalarını editöre ekleyebilir veya çoklu ortam dosyasının niteliğini değiştirebilir. + 0.1 + 2007-02-28 + + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + diff --git a/modules/editor/components/multimedia_link/lang/en.lang.php b/modules/editor/components/multimedia_link/lang/en.lang.php index 7b33ccba7..8076498bf 100644 --- a/modules/editor/components/multimedia_link/lang/en.lang.php +++ b/modules/editor/components/multimedia_link/lang/en.lang.php @@ -1,13 +1,13 @@ - language pack of multimedia_link component - **/ - - $lang->multimedia_url = "Multimedia Path"; - $lang->multimedia_caption = "Input Description"; - $lang->multimedia_width = "Width"; - $lang->multimedia_height = "Height"; - $lang->multimedia_auto_start = "Auto Start"; -?> + language pack of multimedia_link component + **/ + + $lang->multimedia_url = "Multimedia Path"; + $lang->multimedia_caption = "Input Description"; + $lang->multimedia_width = "Width"; + $lang->multimedia_height = "Height"; + $lang->multimedia_auto_start = "Auto Start"; +?> diff --git a/modules/editor/components/multimedia_link/lang/es.lang.php b/modules/editor/components/multimedia_link/lang/es.lang.php index bf537550c..a2614d825 100644 --- a/modules/editor/components/multimedia_link/lang/es.lang.php +++ b/modules/editor/components/multimedia_link/lang/es.lang.php @@ -1,14 +1,14 @@ - language pack of multimedia_link component - **/ - - $lang->multimedia_url = "Sendero Multimedia"; - $lang->multimedia_caption = "Descripcion de Entrada"; - $lang->multimedia_width = "Ancho"; - $lang->multimedia_height = "Altura"; - $lang->multimedia_auto_start = "Auto Start"; - -?> + language pack of multimedia_link component + **/ + + $lang->multimedia_url = "Sendero Multimedia"; + $lang->multimedia_caption = "Descripcion de Entrada"; + $lang->multimedia_width = "Ancho"; + $lang->multimedia_height = "Altura"; + $lang->multimedia_auto_start = "Auto Start"; + +?> diff --git a/modules/editor/components/multimedia_link/lang/jp.lang.php b/modules/editor/components/multimedia_link/lang/jp.lang.php index 2e25f1659..bec35bbdc 100644 --- a/modules/editor/components/multimedia_link/lang/jp.lang.php +++ b/modules/editor/components/multimedia_link/lang/jp.lang.php @@ -1,18 +1,18 @@ - マルチメディアリンク((multimedia_link)コンポネント言語パッケージ - **/ - - $lang->multimedia_url = "マルチメディアのパス"; - $lang->multimedia_caption = "説明入力"; - $lang->multimedia_width = "横幅サイズ"; - $lang->multimedia_height = "縦幅サイズ"; - $lang->multimedia_auto_start = "自動再生"; - $lang->multimedia_wmode = '位置'; - - $lang->multimedia_wmode_window = '常に上へ'; - $lang->multimedia_wmode_opaque = '不透明背景'; - $lang->multimedia_wmode_transparent = '透明背景'; -?> + マルチメディアリンク((multimedia_link)コンポネント言語パッケージ + **/ + + $lang->multimedia_url = "マルチメディアのパス"; + $lang->multimedia_caption = "説明入力"; + $lang->multimedia_width = "横幅サイズ"; + $lang->multimedia_height = "縦幅サイズ"; + $lang->multimedia_auto_start = "自動再生"; + $lang->multimedia_wmode = '位置'; + + $lang->multimedia_wmode_window = '常に上へ'; + $lang->multimedia_wmode_opaque = '不透明背景'; + $lang->multimedia_wmode_transparent = '透明背景'; +?> diff --git a/modules/editor/components/multimedia_link/lang/ko.lang.php b/modules/editor/components/multimedia_link/lang/ko.lang.php index 8a5adc012..9ac9655bd 100644 --- a/modules/editor/components/multimedia_link/lang/ko.lang.php +++ b/modules/editor/components/multimedia_link/lang/ko.lang.php @@ -1,18 +1,18 @@ - 멀티미디어 링크 (multimedia_link) 컴포넌트의 언어팩 - **/ - - $lang->multimedia_url = '멀티미디어 경로'; - $lang->multimedia_caption = '설명 입력'; - $lang->multimedia_width = '가로'; - $lang->multimedia_height = '세로'; - $lang->multimedia_auto_start = '자동 시작'; - $lang->multimedia_wmode = '위치'; - - $lang->multimedia_wmode_window = '항상 위'; - $lang->multimedia_wmode_opaque = '배경 불투명'; - $lang->multimedia_wmode_transparent = '배경 투명'; -?> + 멀티미디어 링크 (multimedia_link) 컴포넌트의 언어팩 + **/ + + $lang->multimedia_url = '멀티미디어 경로'; + $lang->multimedia_caption = '설명 입력'; + $lang->multimedia_width = '가로'; + $lang->multimedia_height = '세로'; + $lang->multimedia_auto_start = '자동 시작'; + $lang->multimedia_wmode = '위치'; + + $lang->multimedia_wmode_window = '항상 위'; + $lang->multimedia_wmode_opaque = '배경 불투명'; + $lang->multimedia_wmode_transparent = '배경 투명'; +?> diff --git a/modules/editor/components/multimedia_link/lang/ru.lang.php b/modules/editor/components/multimedia_link/lang/ru.lang.php index 7672afa58..135e3ebee 100644 --- a/modules/editor/components/multimedia_link/lang/ru.lang.php +++ b/modules/editor/components/multimedia_link/lang/ru.lang.php @@ -1,13 +1,13 @@ - | translation by Maslennikov Evgeny aka X-[Vr]bL1s5 | e-mail: x-bliss[a]tut.by; ICQ: 225035467; - * @brief editor module > language pack of multimedia_link component - **/ - - $lang->multimedia_url = "Путь мультимедиа"; - $lang->multimedia_caption = "Введите описание"; - $lang->multimedia_width = "Ширина"; - $lang->multimedia_height = "Высота"; - $lang->multimedia_auto_start = "Автозапуск"; -?> + | translation by Maslennikov Evgeny aka X-[Vr]bL1s5 | e-mail: x-bliss[a]tut.by; ICQ: 225035467; + * @brief editor module > language pack of multimedia_link component + **/ + + $lang->multimedia_url = "Путь мультимедиа"; + $lang->multimedia_caption = "Введите описание"; + $lang->multimedia_width = "Ширина"; + $lang->multimedia_height = "Высота"; + $lang->multimedia_auto_start = "Автозапуск"; +?> diff --git a/modules/editor/components/multimedia_link/lang/tr.lang.php b/modules/editor/components/multimedia_link/lang/tr.lang.php index 4a2712f96..7519adacc 100644 --- a/modules/editor/components/multimedia_link/lang/tr.lang.php +++ b/modules/editor/components/multimedia_link/lang/tr.lang.php @@ -1,13 +1,13 @@ - language pack of multimedia_link component - **/ - - $lang->multimedia_url = "Çoklu Ortam Yolu"; - $lang->multimedia_caption = "Açıklama Girin"; - $lang->multimedia_width = "Genişlik"; - $lang->multimedia_height = "Yükseklik"; - $lang->multimedia_auto_start = "Otomatik Başlangıç"; -?> + language pack of multimedia_link component + **/ + + $lang->multimedia_url = "Çoklu Ortam Yolu"; + $lang->multimedia_caption = "Açıklama Girin"; + $lang->multimedia_width = "Genişlik"; + $lang->multimedia_height = "Yükseklik"; + $lang->multimedia_auto_start = "Otomatik Başlangıç"; +?> diff --git a/modules/editor/components/multimedia_link/lang/vi.lang.php b/modules/editor/components/multimedia_link/lang/vi.lang.php index c3afc5bce..89db4b2ba 100644 --- a/modules/editor/components/multimedia_link/lang/vi.lang.php +++ b/modules/editor/components/multimedia_link/lang/vi.lang.php @@ -1,15 +1,15 @@ -multimedia_url = "Đường dẫn Media"; - $lang->multimedia_caption = "Mô tả Media"; - $lang->multimedia_width = "Chiều rộng"; - $lang->multimedia_height = "Chiều cao"; - $lang->multimedia_auto_start = "Tự động Play"; -?> +multimedia_url = "Đường dẫn Media"; + $lang->multimedia_caption = "Mô tả Media"; + $lang->multimedia_width = "Chiều rộng"; + $lang->multimedia_height = "Chiều cao"; + $lang->multimedia_auto_start = "Tự động Play"; +?> diff --git a/modules/editor/components/multimedia_link/lang/zh-CN.lang.php b/modules/editor/components/multimedia_link/lang/zh-CN.lang.php index 0ce3e79ce..e45079c55 100644 --- a/modules/editor/components/multimedia_link/lang/zh-CN.lang.php +++ b/modules/editor/components/multimedia_link/lang/zh-CN.lang.php @@ -1,13 +1,13 @@ - 媒体链接 (multimedia_link) 组件的语言包 - **/ - - $lang->multimedia_url = "媒体路径"; - $lang->multimedia_caption = "输入说明"; - $lang->multimedia_width = "宽度"; - $lang->multimedia_height = "高度"; - $lang->multimedia_auto_start = "自动播放"; -?> + 媒体链接 (multimedia_link) 组件的语言包 + **/ + + $lang->multimedia_url = "媒体路径"; + $lang->multimedia_caption = "输入说明"; + $lang->multimedia_width = "宽度"; + $lang->multimedia_height = "高度"; + $lang->multimedia_auto_start = "自动播放"; +?> diff --git a/modules/editor/components/multimedia_link/lang/zh-TW.lang.php b/modules/editor/components/multimedia_link/lang/zh-TW.lang.php index ca4ed9823..444699359 100644 --- a/modules/editor/components/multimedia_link/lang/zh-TW.lang.php +++ b/modules/editor/components/multimedia_link/lang/zh-TW.lang.php @@ -1,17 +1,17 @@ - 多媒體連結 (multimedia_link) 組件的語言 - **/ - - $lang->multimedia_url = "多媒體路徑"; - $lang->multimedia_caption = "輸入說明"; - $lang->multimedia_width = "寬度"; - $lang->multimedia_height = "高度"; - $lang->multimedia_auto_start = "自動播放"; - - $lang->multimedia_wmode_window = '總是在上'; - $lang->multimedia_wmode_opaque = '背景不透明'; - $lang->multimedia_wmode_transparent = '透明背景'; -?> + 多媒體連結 (multimedia_link) 組件的語言 + **/ + + $lang->multimedia_url = "多媒體路徑"; + $lang->multimedia_caption = "輸入說明"; + $lang->multimedia_width = "寬度"; + $lang->multimedia_height = "高度"; + $lang->multimedia_auto_start = "自動播放"; + + $lang->multimedia_wmode_window = '總是在上'; + $lang->multimedia_wmode_opaque = '背景不透明'; + $lang->multimedia_wmode_transparent = '透明背景'; +?> diff --git a/modules/editor/components/multimedia_link/multimedia_link.class.php b/modules/editor/components/multimedia_link/multimedia_link.class.php index efce7a308..5a226f677 100644 --- a/modules/editor/components/multimedia_link/multimedia_link.class.php +++ b/modules/editor/components/multimedia_link/multimedia_link.class.php @@ -1,71 +1,71 @@ -editor_sequence = $editor_sequence; - $this->component_path = $component_path; - } - - /** - * @brief popup window요청시 popup window에 출력할 내용을 추가하면 된다 - **/ - function getPopupContent() { - // 템플릿을 미리 컴파일해서 컴파일된 소스를 return - $tpl_path = $this->component_path.'tpl'; - $tpl_file = 'popup.html'; - - Context::set("tpl_path", $tpl_path); - - $oTemplate = &TemplateHandler::getInstance(); - return $oTemplate->compile($tpl_path, $tpl_file); - } - - /** - * @brief 에디터 컴포넌트가 별도의 고유 코드를 이용한다면 그 코드를 html로 변경하여 주는 method - * - * 이미지나 멀티미디어, 설문등 고유 코드가 필요한 에디터 컴포넌트는 고유코드를 내용에 추가하고 나서 - * DocumentModule::transContent() 에서 해당 컴포넌트의 transHtml() method를 호출하여 고유코드를 html로 변경 - **/ - function transHTML($xml_obj) { - $src = $xml_obj->attrs->multimedia_src; - $style = $xml_obj->attrs->style; - - preg_match_all('/(width|height)([^[:digit:]]+)([0-9]+)/i',$style,$matches); - $width = trim($matches[3][0]); - $height = trim($matches[3][1]); - if(!$width) $width = 400; - if(!$height) $height = 400; - - $auto_start = $xml_obj->attrs->auto_start; - if($auto_start!="true") $auto_start = "false"; - else $auto_start = "true"; - - $wmode = $xml_obj->attrs->wmode; - if($wmode == 'window') $wmode = 'window'; - elseif($wmode == 'opaque') $wmode = 'opaque'; - else $wmode = 'transparent'; - - - $caption = $xml_obj->body; - - $src = str_replace(array('&','"'), array('&','&qout;'), $src); - $src = str_replace('&amp;', '&', $src); - - if(Context::getResponseMethod() != "XMLRPC") return sprintf("", $src, $width, $height, $auto_start, $wmode); - else return sprintf("

            Attached Multimedia
            ", $width, $height, ($height/2-16), ($width/2-31), Context::getRequestUri().'./modules/editor/components/multimedia_link/tpl/multimedia_link_component.gif'); - } - } -?> +editor_sequence = $editor_sequence; + $this->component_path = $component_path; + } + + /** + * @brief popup window요청시 popup window에 출력할 내용을 추가하면 된다 + **/ + function getPopupContent() { + // 템플릿을 미리 컴파일해서 컴파일된 소스를 return + $tpl_path = $this->component_path.'tpl'; + $tpl_file = 'popup.html'; + + Context::set("tpl_path", $tpl_path); + + $oTemplate = &TemplateHandler::getInstance(); + return $oTemplate->compile($tpl_path, $tpl_file); + } + + /** + * @brief 에디터 컴포넌트가 별도의 고유 코드를 이용한다면 그 코드를 html로 변경하여 주는 method + * + * 이미지나 멀티미디어, 설문등 고유 코드가 필요한 에디터 컴포넌트는 고유코드를 내용에 추가하고 나서 + * DocumentModule::transContent() 에서 해당 컴포넌트의 transHtml() method를 호출하여 고유코드를 html로 변경 + **/ + function transHTML($xml_obj) { + $src = $xml_obj->attrs->multimedia_src; + $style = $xml_obj->attrs->style; + + preg_match_all('/(width|height)([^[:digit:]]+)([0-9]+)/i',$style,$matches); + $width = trim($matches[3][0]); + $height = trim($matches[3][1]); + if(!$width) $width = 400; + if(!$height) $height = 400; + + $auto_start = $xml_obj->attrs->auto_start; + if($auto_start!="true") $auto_start = "false"; + else $auto_start = "true"; + + $wmode = $xml_obj->attrs->wmode; + if($wmode == 'window') $wmode = 'window'; + elseif($wmode == 'opaque') $wmode = 'opaque'; + else $wmode = 'transparent'; + + + $caption = $xml_obj->body; + + $src = str_replace(array('&','"'), array('&','&qout;'), $src); + $src = str_replace('&amp;', '&', $src); + + if(Context::getResponseMethod() != "XMLRPC") return sprintf("", $src, $width, $height, $auto_start, $wmode); + else return sprintf("

            Attached Multimedia
            ", $width, $height, ($height/2-16), ($width/2-31), Context::getRequestUri().'./modules/editor/components/multimedia_link/tpl/multimedia_link_component.gif'); + } + } +?> diff --git a/modules/editor/components/poll_maker/info.xml b/modules/editor/components/poll_maker/info.xml index b6f226866..c4c7654a0 100644 --- a/modules/editor/components/poll_maker/info.xml +++ b/modules/editor/components/poll_maker/info.xml @@ -1,35 +1,35 @@ - - - Thăm dò ý kiến - 설문조사 컴포넌트 - アンケート調査 - 投票调查 - Poll Component - Componente Poll - Компонент опросов - 投票調查 - Oylama Bileşenleri - Bạn có thể tạo một cuộc thăm dò cho chủ đề của mình. - 글 작성시에 설문조사를 첨부하실 수 있습니다. 설문조사 컴포넌트는 설문조사 모듈의 설정에 영향을 받습니다. - 書き込みの時、アンケート機能の追加ができます。アンケートモジュールの影響を受けます。 - 发表主题时可以附加投票调查。投票调查组件受投票调查模块设置的影响。 - You can attach a poll on writing articles. Poll component is affected by setting of poll module. - Puede adjuntar una encuesta sobre la redacción de artículos. Encuesta componente se ve afectada por la configuración de módulo de encuesta. - Вы можете присоединить опрос при написании статей. Компонент опросов зависит от настроек модуля отпросов. - 發表主題時可以附加投票調查。投票調查組件受投票調查模組設置的影響。 - Oylamaları yazı makalelerine ekleyebilirsiniz. Oylama bileşeni, oylama modülü ayarlarından ayarlanır. - 0.1 - 2007-02-28 - - - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - - + + + Thăm dò ý kiến + 설문조사 컴포넌트 + アンケート調査 + 投票调查 + Poll Component + Componente Poll + Компонент опросов + 投票調查 + Oylama Bileşenleri + Bạn có thể tạo một cuộc thăm dò cho chủ đề của mình. + 글 작성시에 설문조사를 첨부하실 수 있습니다. 설문조사 컴포넌트는 설문조사 모듈의 설정에 영향을 받습니다. + 書き込みの時、アンケート機能の追加ができます。アンケートモジュールの影響を受けます。 + 发表主题时可以附加投票调查。投票调查组件受投票调查模块设置的影响。 + You can attach a poll on writing articles. Poll component is affected by setting of poll module. + Puede adjuntar una encuesta sobre la redacción de artículos. Encuesta componente se ve afectada por la configuración de módulo de encuesta. + Вы можете присоединить опрос при написании статей. Компонент опросов зависит от настроек модуля отпросов. + 發表主題時可以附加投票調查。投票調查組件受投票調查模組設置的影響。 + Oylamaları yazı makalelerine ekleyebilirsiniz. Oylama bileşeni, oylama modülü ayarlarından ayarlanır. + 0.1 + 2007-02-28 + + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + diff --git a/modules/editor/components/poll_maker/lang/en.lang.php b/modules/editor/components/poll_maker/lang/en.lang.php index 1ebc2bc55..a641b3329 100644 --- a/modules/editor/components/poll_maker/lang/en.lang.php +++ b/modules/editor/components/poll_maker/lang/en.lang.php @@ -1,18 +1,18 @@ - language pack of poll_maker component - **/ - - $lang->poll_title = "Title"; - $lang->poll_item = "Items"; - $lang->poll_stop_date = "Expiration Date"; - $lang->poll_chk_count = "Number of Checking Item"; - - $lang->cmd_add_poll = "Add Poll"; - $lang->cmd_del_poll = "Delete Poll"; - $lang->cmd_add_item = "Add Item"; - - $lang->msg_poll_cannot_modify = "You cannot modify the poll. It should be deleted to create a new poll"; -?> + language pack of poll_maker component + **/ + + $lang->poll_title = "Title"; + $lang->poll_item = "Items"; + $lang->poll_stop_date = "Expiration Date"; + $lang->poll_chk_count = "Number of Checking Item"; + + $lang->cmd_add_poll = "Add Poll"; + $lang->cmd_del_poll = "Delete Poll"; + $lang->cmd_add_item = "Add Item"; + + $lang->msg_poll_cannot_modify = "You cannot modify the poll. It should be deleted to create a new poll"; +?> diff --git a/modules/editor/components/poll_maker/lang/es.lang.php b/modules/editor/components/poll_maker/lang/es.lang.php index d6bd3667a..ba7fba5a0 100644 --- a/modules/editor/components/poll_maker/lang/es.lang.php +++ b/modules/editor/components/poll_maker/lang/es.lang.php @@ -1,19 +1,19 @@ - language pack of poll_maker component - **/ - - $lang->poll_title = "Titulo"; - $lang->poll_item = "Temas"; - $lang->poll_stop_date = "Fecha de Expiracion"; - $lang->poll_chk_count = "Numero de Comprobacion de Partida"; - - $lang->cmd_add_poll = "Anadir Encuesta"; - $lang->cmd_del_poll = "Borrar encuesta"; - $lang->cmd_add_item = "Anadir Tema"; - - $lang->msg_poll_cannot_modify = "No se puede modificar la encuesta. Por lo que debe suprimirse para crear una nueva encuesta"; - -?> + language pack of poll_maker component + **/ + + $lang->poll_title = "Titulo"; + $lang->poll_item = "Temas"; + $lang->poll_stop_date = "Fecha de Expiracion"; + $lang->poll_chk_count = "Numero de Comprobacion de Partida"; + + $lang->cmd_add_poll = "Anadir Encuesta"; + $lang->cmd_del_poll = "Borrar encuesta"; + $lang->cmd_add_item = "Anadir Tema"; + + $lang->msg_poll_cannot_modify = "No se puede modificar la encuesta. Por lo que debe suprimirse para crear una nueva encuesta"; + +?> diff --git a/modules/editor/components/poll_maker/lang/jp.lang.php b/modules/editor/components/poll_maker/lang/jp.lang.php index c8f907f7a..1fd155c15 100644 --- a/modules/editor/components/poll_maker/lang/jp.lang.php +++ b/modules/editor/components/poll_maker/lang/jp.lang.php @@ -1,18 +1,18 @@ - アンケート調査言語パッケージ - **/ - - $lang->poll_title = "タイトル"; - $lang->poll_item = "項目"; - $lang->poll_stop_date = "終了日"; - $lang->poll_chk_count = "選択項目数"; - - $lang->cmd_add_poll = "アンケート追加"; - $lang->cmd_del_poll = "アンケート削除"; - $lang->cmd_add_item = "項目追加"; - - $lang->msg_poll_cannot_modify = 'アンケートは修正出来ません。削除後、改めて新しく作成して下さい。'; -?> + アンケート調査言語パッケージ + **/ + + $lang->poll_title = "タイトル"; + $lang->poll_item = "項目"; + $lang->poll_stop_date = "終了日"; + $lang->poll_chk_count = "選択項目数"; + + $lang->cmd_add_poll = "アンケート追加"; + $lang->cmd_del_poll = "アンケート削除"; + $lang->cmd_add_item = "項目追加"; + + $lang->msg_poll_cannot_modify = 'アンケートは修正出来ません。削除後、改めて新しく作成して下さい。'; +?> diff --git a/modules/editor/components/poll_maker/lang/ko.lang.php b/modules/editor/components/poll_maker/lang/ko.lang.php index f320afb37..6f67bf0be 100644 --- a/modules/editor/components/poll_maker/lang/ko.lang.php +++ b/modules/editor/components/poll_maker/lang/ko.lang.php @@ -1,18 +1,18 @@ - 설문조사 컴포넌트의 언어팩 - **/ - - $lang->poll_title = '제목'; - $lang->poll_item = '항목'; - $lang->poll_stop_date = '종료 일자'; - $lang->poll_chk_count = '선택항목 수'; - - $lang->cmd_add_poll = '설문 추가'; - $lang->cmd_del_poll = '설문 제거'; - $lang->cmd_add_item = '항목 추가'; - - $lang->msg_poll_cannot_modify = '설문조사는 수정하실 수 없습니다. 삭제 후 다시 생성하셔야 합니다.'; -?> + 설문조사 컴포넌트의 언어팩 + **/ + + $lang->poll_title = '제목'; + $lang->poll_item = '항목'; + $lang->poll_stop_date = '종료 일자'; + $lang->poll_chk_count = '선택항목 수'; + + $lang->cmd_add_poll = '설문 추가'; + $lang->cmd_del_poll = '설문 제거'; + $lang->cmd_add_item = '항목 추가'; + + $lang->msg_poll_cannot_modify = '설문조사는 수정하실 수 없습니다. 삭제 후 다시 생성하셔야 합니다.'; +?> diff --git a/modules/editor/components/poll_maker/lang/ru.lang.php b/modules/editor/components/poll_maker/lang/ru.lang.php index 4e1716d20..04e0e2a62 100644 --- a/modules/editor/components/poll_maker/lang/ru.lang.php +++ b/modules/editor/components/poll_maker/lang/ru.lang.php @@ -1,18 +1,18 @@ - language pack of poll_maker component - **/ - - $lang->poll_title = "Заголовок"; - $lang->poll_item = "Пункты"; - $lang->poll_stop_date = "Дата истечения"; - $lang->poll_chk_count = "Число пунктов выбора"; - - $lang->cmd_add_poll = "Добавить опрос"; - $lang->cmd_del_poll = "Удалить опрос"; - $lang->cmd_add_item = "Добавить пункт"; - - $lang->msg_poll_cannot_modify = "Вы не можете изменить этот опрос. Его следует удалить для того, чтобы создать новый."; -?> + language pack of poll_maker component + **/ + + $lang->poll_title = "Заголовок"; + $lang->poll_item = "Пункты"; + $lang->poll_stop_date = "Дата истечения"; + $lang->poll_chk_count = "Число пунктов выбора"; + + $lang->cmd_add_poll = "Добавить опрос"; + $lang->cmd_del_poll = "Удалить опрос"; + $lang->cmd_add_item = "Добавить пункт"; + + $lang->msg_poll_cannot_modify = "Вы не можете изменить этот опрос. Его следует удалить для того, чтобы создать новый."; +?> diff --git a/modules/editor/components/poll_maker/lang/tr.lang.php b/modules/editor/components/poll_maker/lang/tr.lang.php index 72b0750ae..6072b9e6e 100644 --- a/modules/editor/components/poll_maker/lang/tr.lang.php +++ b/modules/editor/components/poll_maker/lang/tr.lang.php @@ -1,18 +1,18 @@ - language pack of poll_maker component - **/ - - $lang->poll_title = "Başlık"; - $lang->poll_item = "Parça"; - $lang->poll_stop_date = "Sonlandırma Tarihi"; - $lang->poll_chk_count = "Denetlenen Parça Sayısı"; - - $lang->cmd_add_poll = "Oylama Ekle"; - $lang->cmd_del_poll = "Parçayı Sil"; - $lang->cmd_add_item = "Parça Ekle"; - - $lang->msg_poll_cannot_modify = "Oylamayı düzenleyemezsiniz. Yeni oylama oluşturmak için, oylamanın silinmesi gerekiyor."; -?> + language pack of poll_maker component + **/ + + $lang->poll_title = "Başlık"; + $lang->poll_item = "Parça"; + $lang->poll_stop_date = "Sonlandırma Tarihi"; + $lang->poll_chk_count = "Denetlenen Parça Sayısı"; + + $lang->cmd_add_poll = "Oylama Ekle"; + $lang->cmd_del_poll = "Parçayı Sil"; + $lang->cmd_add_item = "Parça Ekle"; + + $lang->msg_poll_cannot_modify = "Oylamayı düzenleyemezsiniz. Yeni oylama oluşturmak için, oylamanın silinmesi gerekiyor."; +?> diff --git a/modules/editor/components/poll_maker/lang/vi.lang.php b/modules/editor/components/poll_maker/lang/vi.lang.php index 0482e6c34..75f5c79e4 100644 --- a/modules/editor/components/poll_maker/lang/vi.lang.php +++ b/modules/editor/components/poll_maker/lang/vi.lang.php @@ -1,20 +1,20 @@ -poll_title = "Tiêu đề"; - $lang->poll_item = "Mục"; - $lang->poll_stop_date = "Ngày hết hạn"; - $lang->poll_chk_count = "Số phiếu"; - - $lang->cmd_add_poll = "Tạo thăm dò"; - $lang->cmd_del_poll = "Xóa thăm dò"; - $lang->cmd_add_item = "Thêm mục"; - - $lang->msg_poll_cannot_modify = "Bạn không thể sửa đổi được. Nó sẽ được xóa để tạo cuộc thăm dò mới."; -?> +poll_title = "Tiêu đề"; + $lang->poll_item = "Mục"; + $lang->poll_stop_date = "Ngày hết hạn"; + $lang->poll_chk_count = "Số phiếu"; + + $lang->cmd_add_poll = "Tạo thăm dò"; + $lang->cmd_del_poll = "Xóa thăm dò"; + $lang->cmd_add_item = "Thêm mục"; + + $lang->msg_poll_cannot_modify = "Bạn không thể sửa đổi được. Nó sẽ được xóa để tạo cuộc thăm dò mới."; +?> diff --git a/modules/editor/components/poll_maker/lang/zh-CN.lang.php b/modules/editor/components/poll_maker/lang/zh-CN.lang.php index ed811772a..6cafbb50d 100644 --- a/modules/editor/components/poll_maker/lang/zh-CN.lang.php +++ b/modules/editor/components/poll_maker/lang/zh-CN.lang.php @@ -1,18 +1,18 @@ - 投票调查组件语言包 - **/ - - $lang->poll_title = "标题"; - $lang->poll_item = "项目"; - $lang->poll_stop_date = "结束日期"; - $lang->poll_chk_count = "选择项目数"; - - $lang->cmd_add_poll = "添加投票"; - $lang->cmd_del_poll = "解除投票"; - $lang->cmd_add_item = "添加项目"; - - $lang->msg_poll_cannot_modify = '投票调查不提供修改功能。必须删除后再生成'; -?> + 投票调查组件语言包 + **/ + + $lang->poll_title = "标题"; + $lang->poll_item = "项目"; + $lang->poll_stop_date = "结束日期"; + $lang->poll_chk_count = "选择项目数"; + + $lang->cmd_add_poll = "添加投票"; + $lang->cmd_del_poll = "解除投票"; + $lang->cmd_add_item = "添加项目"; + + $lang->msg_poll_cannot_modify = '投票调查不提供修改功能。必须删除后再生成'; +?> diff --git a/modules/editor/components/poll_maker/lang/zh-TW.lang.php b/modules/editor/components/poll_maker/lang/zh-TW.lang.php index f691de9a2..78fe3c6f6 100644 --- a/modules/editor/components/poll_maker/lang/zh-TW.lang.php +++ b/modules/editor/components/poll_maker/lang/zh-TW.lang.php @@ -1,18 +1,18 @@ - 投票調查組件語言 - **/ - - $lang->poll_title = "標題"; - $lang->poll_item = "項目"; - $lang->poll_stop_date = "結束日期"; - $lang->poll_chk_count = "選擇項目數"; - - $lang->cmd_add_poll = "新增投票"; - $lang->cmd_del_poll = "刪除投票"; - $lang->cmd_add_item = "新增項目"; - - $lang->msg_poll_cannot_modify = '投票調查不提供修改功能。必須刪除後再新增'; -?> + 投票調查組件語言 + **/ + + $lang->poll_title = "標題"; + $lang->poll_item = "項目"; + $lang->poll_stop_date = "結束日期"; + $lang->poll_chk_count = "選擇項目數"; + + $lang->cmd_add_poll = "新增投票"; + $lang->cmd_del_poll = "刪除投票"; + $lang->cmd_add_item = "新增項目"; + + $lang->msg_poll_cannot_modify = '投票調查不提供修改功能。必須刪除後再新增'; +?> diff --git a/modules/editor/components/poll_maker/poll_maker.class.php b/modules/editor/components/poll_maker/poll_maker.class.php index 96eabf422..be43dcb95 100644 --- a/modules/editor/components/poll_maker/poll_maker.class.php +++ b/modules/editor/components/poll_maker/poll_maker.class.php @@ -1,60 +1,60 @@ -editor_sequence = $editor_sequence; - $this->component_path = $component_path; - } - - /** - * @brief popup window요청시 popup window에 출력할 내용을 추가하면 된다 - **/ - function getPopupContent() { - // 설문조사 스킨을 구함 - $oModuleModel = &getModel('module'); - $skin_list = $oModuleModel->getSkins("./modules/poll/"); - Context::set('skin_list', $skin_list); - - // 템플릿을 미리 컴파일해서 컴파일된 소스를 return - $tpl_path = $this->component_path.'tpl'; - $tpl_file = 'popup.html'; - - $oTemplate = &TemplateHandler::getInstance(); - return $oTemplate->compile($tpl_path, $tpl_file); - } - - /** - * @brief 에디터 컴포넌트가 별도의 고유 코드를 이용한다면 그 코드를 html로 변경하여 주는 method - * - * 이미지나 멀티미디어, 설문등 고유 코드가 필요한 에디터 컴포넌트는 고유코드를 내용에 추가하고 나서 - * DocumentModule::transContent() 에서 해당 컴포넌트의 transHtml() method를 호출하여 고유코드를 html로 변경 - **/ - function transHTML($xml_obj) { - $poll_srl = $xml_obj->attrs->poll_srl; - $skin = $xml_obj->attrs->skin; - if(!$skin) $skin = 'default'; - - preg_match('/width([^[:digit:]]+)([0-9]+)/i',$xml_obj->attrs->style,$matches); - $width = $matches[2]; - if(!$width) $width = 400; - $style = sprintf('width:%dpx', $width); - - // poll model 객체 생성해서 html 얻어와서 return - $oPollModel = &getModel('poll'); - return $oPollModel->getPollHtml($poll_srl, $style, $skin); - } - } -?> +editor_sequence = $editor_sequence; + $this->component_path = $component_path; + } + + /** + * @brief popup window요청시 popup window에 출력할 내용을 추가하면 된다 + **/ + function getPopupContent() { + // 설문조사 스킨을 구함 + $oModuleModel = &getModel('module'); + $skin_list = $oModuleModel->getSkins("./modules/poll/"); + Context::set('skin_list', $skin_list); + + // 템플릿을 미리 컴파일해서 컴파일된 소스를 return + $tpl_path = $this->component_path.'tpl'; + $tpl_file = 'popup.html'; + + $oTemplate = &TemplateHandler::getInstance(); + return $oTemplate->compile($tpl_path, $tpl_file); + } + + /** + * @brief 에디터 컴포넌트가 별도의 고유 코드를 이용한다면 그 코드를 html로 변경하여 주는 method + * + * 이미지나 멀티미디어, 설문등 고유 코드가 필요한 에디터 컴포넌트는 고유코드를 내용에 추가하고 나서 + * DocumentModule::transContent() 에서 해당 컴포넌트의 transHtml() method를 호출하여 고유코드를 html로 변경 + **/ + function transHTML($xml_obj) { + $poll_srl = $xml_obj->attrs->poll_srl; + $skin = $xml_obj->attrs->skin; + if(!$skin) $skin = 'default'; + + preg_match('/width([^[:digit:]]+)([0-9]+)/i',$xml_obj->attrs->style,$matches); + $width = $matches[2]; + if(!$width) $width = 400; + $style = sprintf('width:%dpx', $width); + + // poll model 객체 생성해서 html 얻어와서 return + $oPollModel = &getModel('poll'); + return $oPollModel->getPollHtml($poll_srl, $style, $skin); + } + } +?> diff --git a/modules/editor/conf/info.xml b/modules/editor/conf/info.xml index 942689118..d16d0537c 100644 --- a/modules/editor/conf/info.xml +++ b/modules/editor/conf/info.xml @@ -1,36 +1,36 @@ - - - WYSIWYG Editor - 위지윅 에디터 - WYSIWYG Editor - Editor WYSIWYG - 网页编辑器 - ウイジウイグエディター - WYSIWYG-редактор - 網頁編輯器 - Editor WYSIWYG - Module hiển thị WYSIWYG Editor để quản lý những kiểu viết bài. - 위지윅 에디터를 출력하거나 에디터 컴포넌트들을 관리/중계하는 모듈입니다. - Module for displaying WYSIWYG editor and managing/relaying editor components. - Módulo para mostrar en la pantalla el editor de WYSIWYG y para el manejo/relato de los componentes del editor. - 显示网页编辑器或管理/传递编辑器组件的模块。 - ウイジウイグエディター を出力したり、エディターのコンポーネントを管理・中継するモジュールです。 - Модуль для отображения WYSIWYG-редактора и управления/смены записей редактора. - 顯示網頁編輯器或管理/傳遞編輯器組件的模組。 - WYSIWYG editörünü görüntüleme ve editör bileşenlerini düzenleme/aktarma için kullanılan modüldür. - 0.1 - 2007-02-28 - utility - - - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - - + + + WYSIWYG Editor + 위지윅 에디터 + WYSIWYG Editor + Editor WYSIWYG + 网页编辑器 + ウイジウイグエディター + WYSIWYG-редактор + 網頁編輯器 + Editor WYSIWYG + Module hiển thị WYSIWYG Editor để quản lý những kiểu viết bài. + 위지윅 에디터를 출력하거나 에디터 컴포넌트들을 관리/중계하는 모듈입니다. + Module for displaying WYSIWYG editor and managing/relaying editor components. + Módulo para mostrar en la pantalla el editor de WYSIWYG y para el manejo/relato de los componentes del editor. + 显示网页编辑器或管理/传递编辑器组件的模块。 + ウイジウイグエディター を出力したり、エディターのコンポーネントを管理・中継するモジュールです。 + Модуль для отображения WYSIWYG-редактора и управления/смены записей редактора. + 顯示網頁編輯器或管理/傳遞編輯器組件的模組。 + WYSIWYG editörünü görüntüleme ve editör bileşenlerini düzenleme/aktarma için kullanılan modüldür. + 0.1 + 2007-02-28 + utility + + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + diff --git a/modules/editor/conf/module.xml b/modules/editor/conf/module.xml index b2522a8d6..e1bb1140a 100644 --- a/modules/editor/conf/module.xml +++ b/modules/editor/conf/module.xml @@ -1,28 +1,28 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/editor/editor.admin.controller.php b/modules/editor/editor.admin.controller.php index f6d2bb629..016855db7 100644 --- a/modules/editor/editor.admin.controller.php +++ b/modules/editor/editor.admin.controller.php @@ -1,166 +1,166 @@ -component_name = Context::get('component_name'); - $args->enabled = 'Y'; - $args->site_srl = (int)$site_module_info->site_srl; - if(!$args->site_srl) $output = executeQuery('editor.updateComponent', $args); - else $output = executeQuery('editor.updateSiteComponent', $args); - if(!$output->toBool()) return $output; - - $oEditorController = &getController('editor'); - $oEditorController->removeCache($args->site_srl); - - $this->setMessage('success_updated'); - } - - /** - * @brief 컴포넌트의 비활성화 - **/ - function procEditorAdminDisableComponent() { - $site_module_info = Context::get('site_module_info'); - - $args->component_name = Context::get('component_name'); - $args->enabled = 'N'; - $args->site_srl = (int)$site_module_info->site_srl; - if(!$args->site_srl) $output = executeQuery('editor.updateComponent', $args); - else $output = executeQuery('editor.updateSiteComponent', $args); - if(!$output->toBool()) return $output; - - $oEditorController = &getController('editor'); - $oEditorController->removeCache($args->site_srl); - - $this->setMessage('success_updated'); - } - - /** - * @brief 컴포넌트의 위치 변경 - **/ - function procEditorAdminMoveListOrder() { - $site_module_info = Context::get('site_module_info'); - $args->site_srl = (int)$site_module_info->site_srl; - $args->component_name = Context::get('component_name'); - $mode = Context::get('mode'); - - // DB에서 전체 목록 가져옴 - if(!$args->site_srl) $output = executeQuery('editor.getComponentList', $args); - else $output = executeQuery('editor.getSiteComponentList', $args); - - $db_list = $output->data; - foreach($db_list as $key => $val) { - if($val->component_name == $args->component_name) break; - } - - if($mode=="up") { - if($key == 2) return new Object(-1,'msg_component_is_first_order'); - - $prev_args->component_name = $db_list[$key-1]->component_name; - $prev_args->list_order = $db_list[$key]->list_order; - $prev_args->site_srl = $args->site_srl; - if(!$args->site_srl) $output = executeQuery('editor.updateComponent', $prev_args); - else $output = executeQuery('editor.updateSiteComponent', $prev_args); - - $cur_args->component_name = $db_list[$key]->component_name; - $cur_args->list_order = $db_list[$key-1]->list_order; - if($prev_args->list_order == $cur_args->list_order) $cur_args->list_order--; - $cur_args->site_srl = $args->site_srl; - if(!$args->site_srl) $output = executeQuery('editor.updateComponent', $cur_args); - else $output = executeQuery('editor.updateSiteComponent', $cur_args); - } else { - if($key == count($db_list)-1) return new Object(-1,'msg_component_is_last_order'); - - $next_args->component_name = $db_list[$key+1]->component_name; - $next_args->list_order = $db_list[$key]->list_order; - $next_args->site_srl = $args->site_srl; - if(!$args->site_srl) $output = executeQuery('editor.updateComponent', $next_args); - else $output = executeQuery('editor.updateSiteComponent', $next_args); - - $cur_args->component_name = $db_list[$key]->component_name; - $cur_args->list_order = $db_list[$key+1]->list_order; - $cur_args->site_srl = $args->site_srl; - if($next_args->list_order == $cur_args->list_order) $cur_args->list_order++; - if(!$args->site_srl) $output = executeQuery('editor.updateComponent', $cur_args); - else $output = executeQuery('editor.updateSiteComponent', $cur_args); - } - - $oEditorController = &getController('editor'); - $oEditorController->removeCache($args->site_srl); - - $this->setMessage('success_updated'); - } - - /** - * @brief 컴포넌트 설정 - **/ - function procEditorAdminSetupComponent() { - $site_module_info = Context::get('site_module_info'); - - $component_name = Context::get('component_name'); - $extra_vars = Context::getRequestVars(); - unset($extra_vars->component_name); - unset($extra_vars->module); - unset($extra_vars->act); - unset($extra_vars->body); - - if($extra_vars->target_group) $extra_vars->target_group = explode('|@|', $extra_vars->target_group); - if($extra_vars->mid_list) $extra_vars->mid_list = explode('|@|', $extra_vars->mid_list); - - $args->component_name = $component_name; - $args->extra_vars = serialize($extra_vars); - $args->site_srl = (int)$site_module_info->site_srl; - - if(!$args->site_srl) $output = executeQuery('editor.updateComponent', $args); - else $output = executeQuery('editor.updateSiteComponent', $args); - if(!$output->toBool()) return $output; - - $oEditorController = &getController('editor'); - $oEditorController->removeCache($args->site_srl); - - $this->setMessage('success_updated'); - } - - /** - * @brief 컴포넌트를 DB에 추가 - **/ - function insertComponent($component_name, $enabled = false, $site_srl = 0) { - if($enabled) $enabled = 'Y'; - else $enabled = 'N'; - - $args->component_name = $component_name; - $args->enabled = $enabled; - $args->site_srl = $site_srl; - - // 컴포넌트가 있는지 확인 - if(!$site_srl) $output = executeQuery('editor.isComponentInserted', $args); - else $output = executeQuery('editor.isSiteComponentInserted', $args); - if($output->data->count) return new Object(-1, 'msg_component_is_not_founded'); - - // 입력 - $args->list_order = getNextSequence(); - if(!$site_srl) $output = executeQuery('editor.insertComponent', $args); - else $output = executeQuery('editor.insertSiteComponent', $args); - - $oEditorController = &getController('editor'); - $oEditorController->removeCache($site_srl); - return $output; - } - } -?> +component_name = Context::get('component_name'); + $args->enabled = 'Y'; + $args->site_srl = (int)$site_module_info->site_srl; + if(!$args->site_srl) $output = executeQuery('editor.updateComponent', $args); + else $output = executeQuery('editor.updateSiteComponent', $args); + if(!$output->toBool()) return $output; + + $oEditorController = &getController('editor'); + $oEditorController->removeCache($args->site_srl); + + $this->setMessage('success_updated'); + } + + /** + * @brief 컴포넌트의 비활성화 + **/ + function procEditorAdminDisableComponent() { + $site_module_info = Context::get('site_module_info'); + + $args->component_name = Context::get('component_name'); + $args->enabled = 'N'; + $args->site_srl = (int)$site_module_info->site_srl; + if(!$args->site_srl) $output = executeQuery('editor.updateComponent', $args); + else $output = executeQuery('editor.updateSiteComponent', $args); + if(!$output->toBool()) return $output; + + $oEditorController = &getController('editor'); + $oEditorController->removeCache($args->site_srl); + + $this->setMessage('success_updated'); + } + + /** + * @brief 컴포넌트의 위치 변경 + **/ + function procEditorAdminMoveListOrder() { + $site_module_info = Context::get('site_module_info'); + $args->site_srl = (int)$site_module_info->site_srl; + $args->component_name = Context::get('component_name'); + $mode = Context::get('mode'); + + // DB에서 전체 목록 가져옴 + if(!$args->site_srl) $output = executeQuery('editor.getComponentList', $args); + else $output = executeQuery('editor.getSiteComponentList', $args); + + $db_list = $output->data; + foreach($db_list as $key => $val) { + if($val->component_name == $args->component_name) break; + } + + if($mode=="up") { + if($key == 2) return new Object(-1,'msg_component_is_first_order'); + + $prev_args->component_name = $db_list[$key-1]->component_name; + $prev_args->list_order = $db_list[$key]->list_order; + $prev_args->site_srl = $args->site_srl; + if(!$args->site_srl) $output = executeQuery('editor.updateComponent', $prev_args); + else $output = executeQuery('editor.updateSiteComponent', $prev_args); + + $cur_args->component_name = $db_list[$key]->component_name; + $cur_args->list_order = $db_list[$key-1]->list_order; + if($prev_args->list_order == $cur_args->list_order) $cur_args->list_order--; + $cur_args->site_srl = $args->site_srl; + if(!$args->site_srl) $output = executeQuery('editor.updateComponent', $cur_args); + else $output = executeQuery('editor.updateSiteComponent', $cur_args); + } else { + if($key == count($db_list)-1) return new Object(-1,'msg_component_is_last_order'); + + $next_args->component_name = $db_list[$key+1]->component_name; + $next_args->list_order = $db_list[$key]->list_order; + $next_args->site_srl = $args->site_srl; + if(!$args->site_srl) $output = executeQuery('editor.updateComponent', $next_args); + else $output = executeQuery('editor.updateSiteComponent', $next_args); + + $cur_args->component_name = $db_list[$key]->component_name; + $cur_args->list_order = $db_list[$key+1]->list_order; + $cur_args->site_srl = $args->site_srl; + if($next_args->list_order == $cur_args->list_order) $cur_args->list_order++; + if(!$args->site_srl) $output = executeQuery('editor.updateComponent', $cur_args); + else $output = executeQuery('editor.updateSiteComponent', $cur_args); + } + + $oEditorController = &getController('editor'); + $oEditorController->removeCache($args->site_srl); + + $this->setMessage('success_updated'); + } + + /** + * @brief 컴포넌트 설정 + **/ + function procEditorAdminSetupComponent() { + $site_module_info = Context::get('site_module_info'); + + $component_name = Context::get('component_name'); + $extra_vars = Context::getRequestVars(); + unset($extra_vars->component_name); + unset($extra_vars->module); + unset($extra_vars->act); + unset($extra_vars->body); + + if($extra_vars->target_group) $extra_vars->target_group = explode('|@|', $extra_vars->target_group); + if($extra_vars->mid_list) $extra_vars->mid_list = explode('|@|', $extra_vars->mid_list); + + $args->component_name = $component_name; + $args->extra_vars = serialize($extra_vars); + $args->site_srl = (int)$site_module_info->site_srl; + + if(!$args->site_srl) $output = executeQuery('editor.updateComponent', $args); + else $output = executeQuery('editor.updateSiteComponent', $args); + if(!$output->toBool()) return $output; + + $oEditorController = &getController('editor'); + $oEditorController->removeCache($args->site_srl); + + $this->setMessage('success_updated'); + } + + /** + * @brief 컴포넌트를 DB에 추가 + **/ + function insertComponent($component_name, $enabled = false, $site_srl = 0) { + if($enabled) $enabled = 'Y'; + else $enabled = 'N'; + + $args->component_name = $component_name; + $args->enabled = $enabled; + $args->site_srl = $site_srl; + + // 컴포넌트가 있는지 확인 + if(!$site_srl) $output = executeQuery('editor.isComponentInserted', $args); + else $output = executeQuery('editor.isSiteComponentInserted', $args); + if($output->data->count) return new Object(-1, 'msg_component_is_not_founded'); + + // 입력 + $args->list_order = getNextSequence(); + if(!$site_srl) $output = executeQuery('editor.insertComponent', $args); + else $output = executeQuery('editor.insertSiteComponent', $args); + + $oEditorController = &getController('editor'); + $oEditorController->removeCache($site_srl); + return $output; + } + } +?> diff --git a/modules/editor/editor.admin.view.php b/modules/editor/editor.admin.view.php index 745758053..61f2e175f 100644 --- a/modules/editor/editor.admin.view.php +++ b/modules/editor/editor.admin.view.php @@ -1,80 +1,80 @@ -site_srl; - - // 컴포넌트의 종류를 구해옴 - $oEditorModel = &getModel('editor'); - $component_list = $oEditorModel->getComponentList(false, $site_srl, true); - - Context::set('component_list', $component_list); - - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('admin_index'); - } - - /** - * @brief 컴퍼넌트 setup - **/ - function dispEditorAdminSetupComponent() { - $site_module_info = Context::get('site_module_info'); - $site_srl = (int)$site_module_info->site_srl; - - $component_name = Context::get('component_name'); - - // 에디터 컴포넌트의 정보를 구함 - $oEditorModel = &getModel('editor'); - $component = $oEditorModel->getComponent($component_name,$site_srl); - Context::set('component', $component); - - // 그룹 설정을 위한 그룹 목록을 구함 - $oMemberModel = &getModel('member'); - $group_list = $oMemberModel->getGroups($site_srl); - Context::set('group_list', $group_list); - - // mid 목록을 가져옴 - $oModuleModel = &getModel('module'); - - $args->site_srl = $site_srl; - $mid_list = $oModuleModel->getMidList($args); - - // module_category와 module의 조합 - if(!$args->site_srl) { - // 모듈 카테고리 목록을 구함 - $module_categories = $oModuleModel->getModuleCategories(); - - if(!is_array($mid_list)) $mid_list = array($mid_list); - foreach($mid_list as $module_srl => $module) { - if($module) $module_categories[$module->module_category_srl]->list[$module_srl] = $module; - } - } else { - $module_categories[0]->list = $mid_list; - } - - Context::set('mid_list',$module_categories); - - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('setup_component'); - $this->setLayoutFile("popup_layout"); - } - - } -?> +site_srl; + + // 컴포넌트의 종류를 구해옴 + $oEditorModel = &getModel('editor'); + $component_list = $oEditorModel->getComponentList(false, $site_srl, true); + + Context::set('component_list', $component_list); + + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('admin_index'); + } + + /** + * @brief 컴퍼넌트 setup + **/ + function dispEditorAdminSetupComponent() { + $site_module_info = Context::get('site_module_info'); + $site_srl = (int)$site_module_info->site_srl; + + $component_name = Context::get('component_name'); + + // 에디터 컴포넌트의 정보를 구함 + $oEditorModel = &getModel('editor'); + $component = $oEditorModel->getComponent($component_name,$site_srl); + Context::set('component', $component); + + // 그룹 설정을 위한 그룹 목록을 구함 + $oMemberModel = &getModel('member'); + $group_list = $oMemberModel->getGroups($site_srl); + Context::set('group_list', $group_list); + + // mid 목록을 가져옴 + $oModuleModel = &getModel('module'); + + $args->site_srl = $site_srl; + $mid_list = $oModuleModel->getMidList($args); + + // module_category와 module의 조합 + if(!$args->site_srl) { + // 모듈 카테고리 목록을 구함 + $module_categories = $oModuleModel->getModuleCategories(); + + if(!is_array($mid_list)) $mid_list = array($mid_list); + foreach($mid_list as $module_srl => $module) { + if($module) $module_categories[$module->module_category_srl]->list[$module_srl] = $module; + } + } else { + $module_categories[0]->list = $mid_list; + } + + Context::set('mid_list',$module_categories); + + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('setup_component'); + $this->setLayoutFile("popup_layout"); + } + + } +?> diff --git a/modules/editor/editor.api.php b/modules/editor/editor.api.php index 3945c9adf..c8f48edca 100644 --- a/modules/editor/editor.api.php +++ b/modules/editor/editor.api.php @@ -1,13 +1,13 @@ -add('colorset', Context::get('colorset')); - } - } -?> +add('colorset', Context::get('colorset')); + } + } +?> diff --git a/modules/editor/editor.class.php b/modules/editor/editor.class.php index 43c4499ed..1e61f1b93 100644 --- a/modules/editor/editor.class.php +++ b/modules/editor/editor.class.php @@ -1,120 +1,120 @@ -insertComponent('colorpicker_text',true); - $oEditorController->insertComponent('colorpicker_bg',true); - $oEditorController->insertComponent('emoticon',true); - $oEditorController->insertComponent('url_link',true); - $oEditorController->insertComponent('image_link',true); - $oEditorController->insertComponent('multimedia_link',true); - $oEditorController->insertComponent('quotation',true); - $oEditorController->insertComponent('table_maker',true); - $oEditorController->insertComponent('poll_maker',true); - $oEditorController->insertComponent('image_gallery',true); - - // 에디터 모듈에서 사용할 디렉토리 생성 - FileHandler::makeDir('./files/cache/editor'); - - // 2007. 10. 17 글의 입력(신규 or 수정)이 일어날때마다 자동 저장된 문서를 삭제하는 trigger 추가 - $oModuleController->insertTrigger('document.insertDocument', 'editor', 'controller', 'triggerDeleteSavedDoc', 'after'); - $oModuleController->insertTrigger('document.updateDocument', 'editor', 'controller', 'triggerDeleteSavedDoc', 'after'); - - // 2007. 10. 23 모듈의 추가 설정에서 에디터 trigger 추가 - $oModuleController->insertTrigger('module.dispAdditionSetup', 'editor', 'view', 'triggerDispEditorAdditionSetup', 'before'); - - // 2009. 04. 14 editor component 변환 코드를 trigger로 독립 - $oModuleController->insertTrigger('display', 'editor', 'controller', 'triggerEditorComponentCompile', 'before'); - - return new Object(); - } - - /** - * @brief 설치가 이상이 없는지 체크하는 method - **/ - function checkUpdate() { - $oModuleModel = &getModel('module'); - - $oDB = &DB::getInstance(); - - // 2009. 06. 15 자동저장시 module_srl 을 저장 - if(!$oDB->isColumnExists("editor_autosave","module_srl")) return true; - if(!$oDB->isIndexExists("editor_autosave","idx_module_srl")) return true; - - - // 2007. 10. 17 글의 입력(신규 or 수정)이 일어날때마다 자동 저장된 문서를 삭제하는 trigger 추가 - if(!$oModuleModel->getTrigger('document.insertDocument', 'editor', 'controller', 'triggerDeleteSavedDoc', 'after')) return true; - if(!$oModuleModel->getTrigger('document.updateDocument', 'editor', 'controller', 'triggerDeleteSavedDoc', 'after')) return true; - - // 2007. 10. 23 모듈의 추가 설정에서 에디터 trigger 추가 - if(!$oModuleModel->getTrigger('module.dispAdditionSetup', 'editor', 'view', 'triggerDispEditorAdditionSetup', 'before')) return true; - - // 2009. 04. 14 editor component 변환 코드를 trigger로 독립 - if(!$oModuleModel->getTrigger('display', 'editor', 'controller', 'triggerEditorComponentCompile', 'before')) return true; - - // 2009. 06. 19 사용하지 않는 트리거 제거 - if($oModuleModel->getTrigger('file.getIsPermitted', 'editor', 'controller', 'triggerSrlSetting', 'before')) return true; - - return false; - } - - /** - * @brief 업데이트 실행 - **/ - function moduleUpdate() { - $oModuleModel = &getModel('module'); - $oModuleController = &getController('module'); - - $oDB = &DB::getInstance(); - - // 자동저장시 module_srl 을 저장 2009.6.15 - if(!$oDB->isColumnExists("editor_autosave","module_srl")) - $oDB->addColumn("editor_autosave","module_srl","number",11); - - // module_srl을 인덱스로 - if(!$oDB->isIndexExists("editor_autosave","idx_module_srl")) $oDB->addIndex("editor_autosave","idx_module_srl", "module_srl"); - - // 2007. 10. 17 글의 입력(신규 or 수정)이 일어날때마다 자동 저장된 문서를 삭제하는 trigger 추가 - if(!$oModuleModel->getTrigger('document.insertDocument', 'editor', 'controller', 'triggerDeleteSavedDoc', 'after')) - $oModuleController->insertTrigger('document.insertDocument', 'editor', 'controller', 'triggerDeleteSavedDoc', 'after'); - if(!$oModuleModel->getTrigger('document.updateDocument', 'editor', 'controller', 'triggerDeleteSavedDoc', 'after')) - $oModuleController->insertTrigger('document.updateDocument', 'editor', 'controller', 'triggerDeleteSavedDoc', 'after'); - - // 2007. 10. 23 모듈의 추가 설정에서 에디터 trigger 추가 - if(!$oModuleModel->getTrigger('module.dispAdditionSetup', 'editor', 'view', 'triggerDispEditorAdditionSetup', 'before')) - $oModuleController->insertTrigger('module.dispAdditionSetup', 'editor', 'view', 'triggerDispEditorAdditionSetup', 'before'); - - // 2009. 04. 14 editor component 변환 코드를 trigger로 독립 - if(!$oModuleModel->getTrigger('display', 'editor', 'controller', 'triggerEditorComponentCompile', 'before')) - $oModuleController->insertTrigger('display', 'editor', 'controller', 'triggerEditorComponentCompile', 'before'); - - // 2009. 06. 19 사용하지 않는 트리거 제거 - if($oModuleModel->getTrigger('file.getIsPermitted', 'editor', 'controller', 'triggerSrlSetting', 'before')) - $oModuleController->deleteTrigger('file.getIsPermitted', 'editor', 'controller', 'triggerSrlSetting', 'before'); - - return new Object(0, 'success_updated'); - } - - /** - * @brief 캐시 파일 재생성 - **/ - function recompileCache() { - // 에디터 컴포넌트 캐시 파일 삭제 - FileHandler::removeFilesInDir("./files/cache/editor"); - } - } -?> +insertComponent('colorpicker_text',true); + $oEditorController->insertComponent('colorpicker_bg',true); + $oEditorController->insertComponent('emoticon',true); + $oEditorController->insertComponent('url_link',true); + $oEditorController->insertComponent('image_link',true); + $oEditorController->insertComponent('multimedia_link',true); + $oEditorController->insertComponent('quotation',true); + $oEditorController->insertComponent('table_maker',true); + $oEditorController->insertComponent('poll_maker',true); + $oEditorController->insertComponent('image_gallery',true); + + // 에디터 모듈에서 사용할 디렉토리 생성 + FileHandler::makeDir('./files/cache/editor'); + + // 2007. 10. 17 글의 입력(신규 or 수정)이 일어날때마다 자동 저장된 문서를 삭제하는 trigger 추가 + $oModuleController->insertTrigger('document.insertDocument', 'editor', 'controller', 'triggerDeleteSavedDoc', 'after'); + $oModuleController->insertTrigger('document.updateDocument', 'editor', 'controller', 'triggerDeleteSavedDoc', 'after'); + + // 2007. 10. 23 모듈의 추가 설정에서 에디터 trigger 추가 + $oModuleController->insertTrigger('module.dispAdditionSetup', 'editor', 'view', 'triggerDispEditorAdditionSetup', 'before'); + + // 2009. 04. 14 editor component 변환 코드를 trigger로 독립 + $oModuleController->insertTrigger('display', 'editor', 'controller', 'triggerEditorComponentCompile', 'before'); + + return new Object(); + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + **/ + function checkUpdate() { + $oModuleModel = &getModel('module'); + + $oDB = &DB::getInstance(); + + // 2009. 06. 15 자동저장시 module_srl 을 저장 + if(!$oDB->isColumnExists("editor_autosave","module_srl")) return true; + if(!$oDB->isIndexExists("editor_autosave","idx_module_srl")) return true; + + + // 2007. 10. 17 글의 입력(신규 or 수정)이 일어날때마다 자동 저장된 문서를 삭제하는 trigger 추가 + if(!$oModuleModel->getTrigger('document.insertDocument', 'editor', 'controller', 'triggerDeleteSavedDoc', 'after')) return true; + if(!$oModuleModel->getTrigger('document.updateDocument', 'editor', 'controller', 'triggerDeleteSavedDoc', 'after')) return true; + + // 2007. 10. 23 모듈의 추가 설정에서 에디터 trigger 추가 + if(!$oModuleModel->getTrigger('module.dispAdditionSetup', 'editor', 'view', 'triggerDispEditorAdditionSetup', 'before')) return true; + + // 2009. 04. 14 editor component 변환 코드를 trigger로 독립 + if(!$oModuleModel->getTrigger('display', 'editor', 'controller', 'triggerEditorComponentCompile', 'before')) return true; + + // 2009. 06. 19 사용하지 않는 트리거 제거 + if($oModuleModel->getTrigger('file.getIsPermitted', 'editor', 'controller', 'triggerSrlSetting', 'before')) return true; + + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + $oModuleModel = &getModel('module'); + $oModuleController = &getController('module'); + + $oDB = &DB::getInstance(); + + // 자동저장시 module_srl 을 저장 2009.6.15 + if(!$oDB->isColumnExists("editor_autosave","module_srl")) + $oDB->addColumn("editor_autosave","module_srl","number",11); + + // module_srl을 인덱스로 + if(!$oDB->isIndexExists("editor_autosave","idx_module_srl")) $oDB->addIndex("editor_autosave","idx_module_srl", "module_srl"); + + // 2007. 10. 17 글의 입력(신규 or 수정)이 일어날때마다 자동 저장된 문서를 삭제하는 trigger 추가 + if(!$oModuleModel->getTrigger('document.insertDocument', 'editor', 'controller', 'triggerDeleteSavedDoc', 'after')) + $oModuleController->insertTrigger('document.insertDocument', 'editor', 'controller', 'triggerDeleteSavedDoc', 'after'); + if(!$oModuleModel->getTrigger('document.updateDocument', 'editor', 'controller', 'triggerDeleteSavedDoc', 'after')) + $oModuleController->insertTrigger('document.updateDocument', 'editor', 'controller', 'triggerDeleteSavedDoc', 'after'); + + // 2007. 10. 23 모듈의 추가 설정에서 에디터 trigger 추가 + if(!$oModuleModel->getTrigger('module.dispAdditionSetup', 'editor', 'view', 'triggerDispEditorAdditionSetup', 'before')) + $oModuleController->insertTrigger('module.dispAdditionSetup', 'editor', 'view', 'triggerDispEditorAdditionSetup', 'before'); + + // 2009. 04. 14 editor component 변환 코드를 trigger로 독립 + if(!$oModuleModel->getTrigger('display', 'editor', 'controller', 'triggerEditorComponentCompile', 'before')) + $oModuleController->insertTrigger('display', 'editor', 'controller', 'triggerEditorComponentCompile', 'before'); + + // 2009. 06. 19 사용하지 않는 트리거 제거 + if($oModuleModel->getTrigger('file.getIsPermitted', 'editor', 'controller', 'triggerSrlSetting', 'before')) + $oModuleController->deleteTrigger('file.getIsPermitted', 'editor', 'controller', 'triggerSrlSetting', 'before'); + + return new Object(0, 'success_updated'); + } + + /** + * @brief 캐시 파일 재생성 + **/ + function recompileCache() { + // 에디터 컴포넌트 캐시 파일 삭제 + FileHandler::removeFilesInDir("./files/cache/editor"); + } + } +?> diff --git a/modules/editor/editor.controller.php b/modules/editor/editor.controller.php index 4ebad3731..2a481b6e6 100644 --- a/modules/editor/editor.controller.php +++ b/modules/editor/editor.controller.php @@ -1,457 +1,457 @@ -deleteSavedDoc(false); - - $args->document_srl = Context::get('document_srl'); - $args->content = Context::get('content'); - $args->title = Context::get('title'); - $output = $this->doSaveDoc($args); - - $this->setMessage('msg_auto_saved'); - } - - /** - * @brief 자동저장된 문서 삭제 - **/ - function procEditorRemoveSavedDoc() { - $oEditorController = &getController('editor'); - $oEditorController->deleteSavedDoc(true); - } - - /** - * @brief 컴포넌트에서 ajax요청시 해당 컴포넌트의 method를 실행 - **/ - function procEditorCall() { - $component = Context::get('component'); - $method = Context::get('method'); - if(!$component) return new Object(-1, sprintf(Context::getLang('msg_component_is_not_founded'), $component)); - - $oEditorModel = &getModel('editor'); - $oComponent = &$oEditorModel->getComponentObject($component); - if(!$oComponent->toBool()) return $oComponent; - - if(!method_exists($oComponent, $method)) return new Object(-1, sprintf(Context::getLang('msg_component_is_not_founded'), $component)); - - //$output = call_user_method($method, $oComponent); - //$output = call_user_func(array($oComponent, $method)); - if(method_exists($oComponent, $method)) $output = $oComponent->{$method}(); - else return new Object(-1,sprintf('%s method is not exists', $method)); - - if((is_a($output, 'Object') || is_subclass_of($output, 'Object')) && !$output->toBool()) return $output; - - $this->setError($oComponent->getError()); - $this->setMessage($oComponent->getMessage()); - - $vars = $oComponent->getVariables(); - if(count($vars)) { - foreach($vars as $key=>$val) $this->add($key, $val); - } - } - - /** - * @brief 에디터의 모듈별 추가 확장 폼을 저장 - **/ - function procEditorInsertModuleConfig() { - $module_srl = Context::get('target_module_srl'); - - // 여러개의 모듈 일괄 설정일 경우 - if(preg_match('/^([0-9,]+)$/',$module_srl)) $module_srl = explode(',',$module_srl); - else $module_srl = array($module_srl); - - $editor_config = null; - - $editor_config->editor_skin = Context::get('editor_skin'); - $editor_config->comment_editor_skin = Context::get('comment_editor_skin'); - $editor_config->content_style = Context::get('content_style'); - $editor_config->comment_content_style = Context::get('comment_content_style'); - $editor_config->content_font = Context::get('content_font'); - if($editor_config->content_font) { - $font_list = array(); - $fonts = explode(',',$editor_config->content_font); - for($i=0,$c=count($fonts);$i<$c;$i++) { - $font = trim(str_replace(array('"','\''),'',$fonts[$i])); - if(!$font) continue; - $font_list[] = $font; - } - if(count($font_list)) $editor_config->content_font = '"'.implode('","',$font_list).'"'; - } - $editor_config->content_font_size = Context::get('content_font_size'); - $editor_config->sel_editor_colorset = Context::get('sel_editor_colorset'); - $editor_config->sel_comment_editor_colorset = Context::get('sel_comment_editor_colorset'); - - $enable_html_grant = trim(Context::get('enable_html_grant')); - if($enable_html_grant) $editor_config->enable_html_grant = explode('|@|', $enable_html_grant); - else $editor_config->enable_html_grant = array(); - - $enable_comment_html_grant = trim(Context::get('enable_comment_html_grant')); - if($enable_comment_html_grant) $editor_config->enable_comment_html_grant = explode('|@|', $enable_comment_html_grant); - else $editor_config->enable_comment_html_grant = array(); - - $upload_file_grant = trim(Context::get('upload_file_grant')); - if($upload_file_grant) $editor_config->upload_file_grant = explode('|@|', $upload_file_grant); - else $editor_config->upload_file_grant = array(); - - $comment_upload_file_grant = trim(Context::get('comment_upload_file_grant')); - if($comment_upload_file_grant) $editor_config->comment_upload_file_grant = explode('|@|', $comment_upload_file_grant); - else $editor_config->comment_upload_file_grant = array(); - - $enable_default_component_grant = trim(Context::get('enable_default_component_grant')); - if($enable_default_component_grant) $editor_config->enable_default_component_grant = explode('|@|', $enable_default_component_grant); - else $editor_config->enable_default_component_grant = array(); - - $enable_comment_default_component_grant = trim(Context::get('enable_comment_default_component_grant')); - if($enable_comment_default_component_grant) $editor_config->enable_comment_default_component_grant = explode('|@|', $enable_comment_default_component_grant); - else $editor_config->enable_comment_default_component_grant = array(); - - $enable_component_grant = trim(Context::get('enable_component_grant')); - if($enable_component_grant) $editor_config->enable_component_grant = explode('|@|', $enable_component_grant); - else $editor_config->enable_component_grant = array(); - - $enable_comment_component_grant = trim(Context::get('enable_comment_component_grant')); - if($enable_comment_component_grant) $editor_config->enable_comment_component_grant = explode('|@|', $enable_comment_component_grant); - else $editor_config->enable_comment_component_grant = array(); - - $editor_config->editor_height = (int)Context::get('editor_height'); - - $editor_config->comment_editor_height = (int)Context::get('comment_editor_height'); - - $editor_config->enable_autosave = Context::get('enable_autosave'); - - if($editor_config->enable_autosave != 'Y') $editor_config->enable_autosave = 'N'; - - $oModuleController = &getController('module'); - for($i=0;$iinsertModulePartConfig('editor',$srl,$editor_config); - } - - $this->setError(-1); - $this->setMessage('success_updated'); - } - - /** - * @brief 에디터컴포넌트의 코드를 결과물로 변환 + 문서서식 style 지정 - **/ - function triggerEditorComponentCompile(&$content) { - if(Context::getResponseMethod()!='HTML') return new Object(); - if(Mobile::isFromMobilePhone()) return new Object(); - - $module_info = Context::get('module_info'); - $module_srl = $module_info->module_srl; - if($module_srl) { - $oEditorModel = &getModel('editor'); - $editor_config = $oEditorModel->getEditorConfig($module_srl); - $content_style = $editor_config->content_style; - if($content_style) { - $path = _XE_PATH_.'modules/editor/styles/'.$content_style.'/'; - if(is_dir($path) && file_exists($path.'style.ini')) { - $ini = file($path.'style.ini'); - for($i=0,$c=count($ini);$i<$c;$i++) { - $file = trim($ini[$i]); - if(!$file) continue; - if(preg_match('/\.css$/i',$file)) Context::addCSSFile('./modules/editor/styles/'.$content_style.'/'.$file, false); - elseif(preg_match('/\.js/i',$file)) Context::addJsFile('./modules/editor/styles/'.$content_style.'/'.$file, false); - } - } - } - $content_font = $editor_config->content_font; - $content_font_size = $editor_config->content_font_size; - if($content_font || $content_font_size) { - $buff = ''; - Context::addHtmlHeader($buff); - } - } - - $content = $this->transComponent($content); - return new Object(); - } - - /** - * @brief 에디터 컴포넌트코드를 결과물로 변환 - **/ - function transComponent($content) { - $content = preg_replace_callback('!]*)editor_component=([^\>]*)>(.*?)\<\/div\>!is', array($this,'transEditorComponent'), $content); - $content = preg_replace_callback('!]*)editor_component=([^\>]*?)\>!is', array($this,'transEditorComponent'), $content); - return $content; - } - - /** - * @brief 내용의 에디터 컴포넌트 코드를 변환 - **/ - function transEditorComponent($matches) { - $script = sprintf(' %s editor_component=%s', $matches[1], $matches[2]); - $script = preg_replace_callback('/([^=^"^ ]*)=([^ ^>]*)/i', fixQuotation, $script); - preg_match_all('/([a-z0-9\-\_]+)\=\"([^\"]+)\"/is', $script, $m); - for($i=0,$c=count($m[0]);$i<$c;$i++) { - $xml_obj->attrs->{$m[1][$i]} = $m[2][$i]; - } - $xml_obj->body = $matches[3]; - - if(!$xml_obj->attrs->editor_component) return $matches[0]; - - // component::transHTML() 을 이용하여 변환된 코드를 받음 - $oEditorModel = &getModel('editor'); - $oComponent = &$oEditorModel->getComponentObject($xml_obj->attrs->editor_component, 0); - if(!is_object($oComponent)||!method_exists($oComponent, 'transHTML')) return $matches[0]; - - return $oComponent->transHTML($xml_obj); - } - - - /** - * @brief 자동 저장 - **/ - function doSaveDoc($args) { - - if(!$args->document_srl) $args->document_srl = $_SESSION['upload_info'][$editor_sequence]->upload_target_srl; - if(Context::get('is_logged')) { - $logged_info = Context::get('logged_info'); - $args->member_srl = $logged_info->member_srl; - } else { - $args->ipaddress = $_SERVER['REMOTE_ADDR']; - } - // module_srl이 없으면 현재 모듈 - if(!$args->module_srl) { - $args->module_srl = Context::get('module_srl'); - } - if(!$args->module_srl) { - $current_module_info = Context::get('current_module_info'); - $args->module_srl = $current_module_info->module_srl; - } - - // 저장 - return executeQuery('editor.insertSavedDoc', $args); - } - - /** - * @brief 자동 저장글 Srl 로드 - XE 이전 버전 사용자를 위함. - **/ - function procEditorLoadSavedDocument() { - $editor_sequence = Context::get('editor_sequence'); - $primary_key = Context::get('primary_key'); - $oEditorModel = &getModel('editor'); - $oFileController = &getController('file'); - - $saved_doc = $oEditorModel->getSavedDoc(null); - - $oFileController->setUploadInfo($editor_sequence, $saved_doc->document_srl); - $vars = $this->getVariables(); - $this->add("editor_sequence", $editor_sequence); - $this->add("key", $primary_key); - $this->add("title", $saved_doc->title); - $this->add("content", $saved_doc->content); - $this->add("document_srl", $saved_doc->document_srl); - } - - - /** - * @brief 게시글의 입력/수정이 일어났을 경우 자동 저장문서를 제거하는 trigger - **/ - function triggerDeleteSavedDoc(&$obj) { - $this->deleteSavedDoc(false); - return new Object(); - } - - /** - * @brief 자동 저장된 글을 삭제 - * 현재 접속한 사용자를 기준 - **/ - function deleteSavedDoc($mode = false) { - if(Context::get('is_logged')) { - $logged_info = Context::get('logged_info'); - $args->member_srl = $logged_info->member_srl; - } else { - $args->ipaddress = $_SERVER['REMOTE_ADDR']; - } - $args->module_srl = Context::get('module_srl'); - // module_srl이 없으면 현재 모듈 - if(!$args->module_srl) { - $current_module_info = Context::get('current_module_info'); - $args->module_srl = $current_module_info->module_srl; - } - - // 자동저장된 값이 혹시 이미 등록된 글인지 확인 - $output = executeQuery('editor.getSavedDocument', $args); - $saved_doc = $output->data; - if(!$saved_doc) return; - - $oDocumentModel = &getModel('document'); - $oSaved = $oDocumentModel->getDocument($saved_doc->document_srl); - if(!$oSaved->isExists()) { - if($mode) { - $output = executeQuery('editor.getSavedDocument', $args); - $output = ModuleHandler::triggerCall('editor.deleteSavedDoc', 'after', $saved_doc); - } - } - - // 일단 이전 저장본 삭제 - return executeQuery('editor.deleteSavedDoc', $args); - } - - /** - * @brief 가상 사이트에서 사용된 에디터 컴포넌트 정보를 제거 - **/ - function removeEditorConfig($site_srl) { - $args->site_srl = $site_srl; - executeQuery('editor.deleteSiteComponent', $args); - } - - /** - * @brief 에디터 컴포넌트 목록 캐싱 (editorModel::getComponentList) - * 에디터 컴포넌트 목록의 경우 DB query + Xml Parsing 때문에 캐싱 파일을 이용하도록 함 - **/ - function makeCache($filter_enabled = true, $site_srl) { - $oEditorModel = &getModel('editor'); - - if($filter_enabled) $args->enabled = "Y"; - - if($site_srl) { - $args->site_srl = $site_srl; - $output = executeQuery('editor.getSiteComponentList', $args); - } else $output = executeQuery('editor.getComponentList', $args); - $db_list = $output->data; - - // 파일목록을 구함 - $downloaded_list = FileHandler::readDir(_XE_PATH_.'modules/editor/components'); - - // 로그인 여부 및 소속 그룹 구함 - $is_logged = Context::get('is_logged'); - if($is_logged) { - $logged_info = Context::get('logged_info'); - if($logged_info->group_list && is_array($logged_info->group_list)) { - $group_list = array_keys($logged_info->group_list); - } else $group_list = array(); - } - - // DB 목록을 loop돌면서 xml정보까지 구함 - if(!is_array($db_list)) $db_list = array($db_list); - foreach($db_list as $component) { - if(in_array($component->component_name, array('colorpicker_text','colorpicker_bg'))) continue; - - $component_name = $component->component_name; - if(!$component_name) continue; - - if(!in_array($component_name, $downloaded_list)) continue; - - unset($xml_info); - $xml_info = $oEditorModel->getComponentXmlInfo($component_name); - $xml_info->enabled = $component->enabled; - - if($component->extra_vars) { - $extra_vars = unserialize($component->extra_vars); - if($extra_vars->target_group) { - $xml_info->target_group = $extra_vars->target_group; - } - - if($extra_vars->mid_list && count($extra_vars->mid_list)) - { - $xml_info->mid_list = $extra_vars->mid_list; - } - /* - // 사용권한이 있으면 권한 체크 - if($extra_vars->target_group) { - // 사용권한이 체크되어 있는데 로그인이 되어 있지 않으면 무조건 사용 중지 - if(!$is_logged) continue; - - // 대상 그룹을 구해서 현재 로그인 사용자의 그룹과 비교 - $target_group = $extra_vars->target_group; - unset($extra_vars->target_group); - - $is_granted = false; - foreach($group_list as $group_srl) { - if(in_array($group_srl, $target_group)) { - $is_granted = true; - break; - } - } - if(!$is_granted) continue; - } - - // 대상 모듈이 있으면 체크 - if($extra_vars->mid_list && count($extra_vars->mid_list) && Context::get('mid')) { - if(!in_array(Context::get('mid'), $extra_vars->mid_list)) continue; - }*/ - - // 에디터 컴포넌트의 설정 정보를 체크 - if($xml_info->extra_vars) { - foreach($xml_info->extra_vars as $key => $val) { - $xml_info->extra_vars->{$key}->value = $extra_vars->{$key}; - } - } - } - - $component_list->{$component_name} = $xml_info; - - // 버튼, 아이콘 이미지 구함 - $icon_file = _XE_PATH_.'modules/editor/components/'.$component_name.'/icon.gif'; - $component_icon_file = _XE_PATH_.'modules/editor/components/'.$component_name.'/component_icon.gif'; - if(file_exists($icon_file)) $component_list->{$component_name}->icon = true; - if(file_exists($component_icon_file)) $component_list->{$component_name}->component_icon = true; - } - - // enabled만 체크하도록 하였으면 그냥 return - if($filter_enabled) { - $cache_file = $oEditorModel->getCacheFile($filter_enabled, $site_srl); - $buff = sprintf('', str_replace('"','\\"',serialize($component_list))); - FileHandler::writeFile($cache_file, $buff); - return $component_list; - } - - // 다운로드된 목록의 xml_info를 마저 구함 - foreach($downloaded_list as $component_name) { - if(in_array($component_name, array('colorpicker_text','colorpicker_bg'))) continue; - - // 설정된 것이라면 패스 - if($component_list->{$component_name}) continue; - - // DB에 입력 - $oEditorController = &getAdminController('editor'); - $oEditorController->insertComponent($component_name, false, $site_srl); - - // component_list에 추가 - unset($xml_info); - $xml_info = $oEditorModel->getComponentXmlInfo($component_name); - $xml_info->enabled = 'N'; - - $component_list->{$component_name} = $xml_info; - } - - $cache_file = $oEditorModel->getCacheFile($filter_enabled, $site_srl); - $buff = sprintf('', str_replace('"','\\"',serialize($component_list))); - FileHandler::writeFile($cache_file, $buff); - - return $component_list; - } - - /** - * @brief 캐시 파일 삭제 - **/ - function removeCache($site_srl = 0) { - $oEditorModel = &getModel('editor'); - FileHandler::removeFile($oEditorModel->getCacheFile(true, $site_srl)); - FileHandler::removeFile($oEditorModel->getCacheFile(false, $site_srl)); - } - } -?> +deleteSavedDoc(false); + + $args->document_srl = Context::get('document_srl'); + $args->content = Context::get('content'); + $args->title = Context::get('title'); + $output = $this->doSaveDoc($args); + + $this->setMessage('msg_auto_saved'); + } + + /** + * @brief 자동저장된 문서 삭제 + **/ + function procEditorRemoveSavedDoc() { + $oEditorController = &getController('editor'); + $oEditorController->deleteSavedDoc(true); + } + + /** + * @brief 컴포넌트에서 ajax요청시 해당 컴포넌트의 method를 실행 + **/ + function procEditorCall() { + $component = Context::get('component'); + $method = Context::get('method'); + if(!$component) return new Object(-1, sprintf(Context::getLang('msg_component_is_not_founded'), $component)); + + $oEditorModel = &getModel('editor'); + $oComponent = &$oEditorModel->getComponentObject($component); + if(!$oComponent->toBool()) return $oComponent; + + if(!method_exists($oComponent, $method)) return new Object(-1, sprintf(Context::getLang('msg_component_is_not_founded'), $component)); + + //$output = call_user_method($method, $oComponent); + //$output = call_user_func(array($oComponent, $method)); + if(method_exists($oComponent, $method)) $output = $oComponent->{$method}(); + else return new Object(-1,sprintf('%s method is not exists', $method)); + + if((is_a($output, 'Object') || is_subclass_of($output, 'Object')) && !$output->toBool()) return $output; + + $this->setError($oComponent->getError()); + $this->setMessage($oComponent->getMessage()); + + $vars = $oComponent->getVariables(); + if(count($vars)) { + foreach($vars as $key=>$val) $this->add($key, $val); + } + } + + /** + * @brief 에디터의 모듈별 추가 확장 폼을 저장 + **/ + function procEditorInsertModuleConfig() { + $module_srl = Context::get('target_module_srl'); + + // 여러개의 모듈 일괄 설정일 경우 + if(preg_match('/^([0-9,]+)$/',$module_srl)) $module_srl = explode(',',$module_srl); + else $module_srl = array($module_srl); + + $editor_config = null; + + $editor_config->editor_skin = Context::get('editor_skin'); + $editor_config->comment_editor_skin = Context::get('comment_editor_skin'); + $editor_config->content_style = Context::get('content_style'); + $editor_config->comment_content_style = Context::get('comment_content_style'); + $editor_config->content_font = Context::get('content_font'); + if($editor_config->content_font) { + $font_list = array(); + $fonts = explode(',',$editor_config->content_font); + for($i=0,$c=count($fonts);$i<$c;$i++) { + $font = trim(str_replace(array('"','\''),'',$fonts[$i])); + if(!$font) continue; + $font_list[] = $font; + } + if(count($font_list)) $editor_config->content_font = '"'.implode('","',$font_list).'"'; + } + $editor_config->content_font_size = Context::get('content_font_size'); + $editor_config->sel_editor_colorset = Context::get('sel_editor_colorset'); + $editor_config->sel_comment_editor_colorset = Context::get('sel_comment_editor_colorset'); + + $enable_html_grant = trim(Context::get('enable_html_grant')); + if($enable_html_grant) $editor_config->enable_html_grant = explode('|@|', $enable_html_grant); + else $editor_config->enable_html_grant = array(); + + $enable_comment_html_grant = trim(Context::get('enable_comment_html_grant')); + if($enable_comment_html_grant) $editor_config->enable_comment_html_grant = explode('|@|', $enable_comment_html_grant); + else $editor_config->enable_comment_html_grant = array(); + + $upload_file_grant = trim(Context::get('upload_file_grant')); + if($upload_file_grant) $editor_config->upload_file_grant = explode('|@|', $upload_file_grant); + else $editor_config->upload_file_grant = array(); + + $comment_upload_file_grant = trim(Context::get('comment_upload_file_grant')); + if($comment_upload_file_grant) $editor_config->comment_upload_file_grant = explode('|@|', $comment_upload_file_grant); + else $editor_config->comment_upload_file_grant = array(); + + $enable_default_component_grant = trim(Context::get('enable_default_component_grant')); + if($enable_default_component_grant) $editor_config->enable_default_component_grant = explode('|@|', $enable_default_component_grant); + else $editor_config->enable_default_component_grant = array(); + + $enable_comment_default_component_grant = trim(Context::get('enable_comment_default_component_grant')); + if($enable_comment_default_component_grant) $editor_config->enable_comment_default_component_grant = explode('|@|', $enable_comment_default_component_grant); + else $editor_config->enable_comment_default_component_grant = array(); + + $enable_component_grant = trim(Context::get('enable_component_grant')); + if($enable_component_grant) $editor_config->enable_component_grant = explode('|@|', $enable_component_grant); + else $editor_config->enable_component_grant = array(); + + $enable_comment_component_grant = trim(Context::get('enable_comment_component_grant')); + if($enable_comment_component_grant) $editor_config->enable_comment_component_grant = explode('|@|', $enable_comment_component_grant); + else $editor_config->enable_comment_component_grant = array(); + + $editor_config->editor_height = (int)Context::get('editor_height'); + + $editor_config->comment_editor_height = (int)Context::get('comment_editor_height'); + + $editor_config->enable_autosave = Context::get('enable_autosave'); + + if($editor_config->enable_autosave != 'Y') $editor_config->enable_autosave = 'N'; + + $oModuleController = &getController('module'); + for($i=0;$iinsertModulePartConfig('editor',$srl,$editor_config); + } + + $this->setError(-1); + $this->setMessage('success_updated'); + } + + /** + * @brief 에디터컴포넌트의 코드를 결과물로 변환 + 문서서식 style 지정 + **/ + function triggerEditorComponentCompile(&$content) { + if(Context::getResponseMethod()!='HTML') return new Object(); + if(Mobile::isFromMobilePhone()) return new Object(); + + $module_info = Context::get('module_info'); + $module_srl = $module_info->module_srl; + if($module_srl) { + $oEditorModel = &getModel('editor'); + $editor_config = $oEditorModel->getEditorConfig($module_srl); + $content_style = $editor_config->content_style; + if($content_style) { + $path = _XE_PATH_.'modules/editor/styles/'.$content_style.'/'; + if(is_dir($path) && file_exists($path.'style.ini')) { + $ini = file($path.'style.ini'); + for($i=0,$c=count($ini);$i<$c;$i++) { + $file = trim($ini[$i]); + if(!$file) continue; + if(preg_match('/\.css$/i',$file)) Context::addCSSFile('./modules/editor/styles/'.$content_style.'/'.$file, false); + elseif(preg_match('/\.js/i',$file)) Context::addJsFile('./modules/editor/styles/'.$content_style.'/'.$file, false); + } + } + } + $content_font = $editor_config->content_font; + $content_font_size = $editor_config->content_font_size; + if($content_font || $content_font_size) { + $buff = ''; + Context::addHtmlHeader($buff); + } + } + + $content = $this->transComponent($content); + return new Object(); + } + + /** + * @brief 에디터 컴포넌트코드를 결과물로 변환 + **/ + function transComponent($content) { + $content = preg_replace_callback('!]*)editor_component=([^\>]*)>(.*?)\<\/div\>!is', array($this,'transEditorComponent'), $content); + $content = preg_replace_callback('!]*)editor_component=([^\>]*?)\>!is', array($this,'transEditorComponent'), $content); + return $content; + } + + /** + * @brief 내용의 에디터 컴포넌트 코드를 변환 + **/ + function transEditorComponent($matches) { + $script = sprintf(' %s editor_component=%s', $matches[1], $matches[2]); + $script = preg_replace_callback('/([^=^"^ ]*)=([^ ^>]*)/i', fixQuotation, $script); + preg_match_all('/([a-z0-9\-\_]+)\=\"([^\"]+)\"/is', $script, $m); + for($i=0,$c=count($m[0]);$i<$c;$i++) { + $xml_obj->attrs->{$m[1][$i]} = $m[2][$i]; + } + $xml_obj->body = $matches[3]; + + if(!$xml_obj->attrs->editor_component) return $matches[0]; + + // component::transHTML() 을 이용하여 변환된 코드를 받음 + $oEditorModel = &getModel('editor'); + $oComponent = &$oEditorModel->getComponentObject($xml_obj->attrs->editor_component, 0); + if(!is_object($oComponent)||!method_exists($oComponent, 'transHTML')) return $matches[0]; + + return $oComponent->transHTML($xml_obj); + } + + + /** + * @brief 자동 저장 + **/ + function doSaveDoc($args) { + + if(!$args->document_srl) $args->document_srl = $_SESSION['upload_info'][$editor_sequence]->upload_target_srl; + if(Context::get('is_logged')) { + $logged_info = Context::get('logged_info'); + $args->member_srl = $logged_info->member_srl; + } else { + $args->ipaddress = $_SERVER['REMOTE_ADDR']; + } + // module_srl이 없으면 현재 모듈 + if(!$args->module_srl) { + $args->module_srl = Context::get('module_srl'); + } + if(!$args->module_srl) { + $current_module_info = Context::get('current_module_info'); + $args->module_srl = $current_module_info->module_srl; + } + + // 저장 + return executeQuery('editor.insertSavedDoc', $args); + } + + /** + * @brief 자동 저장글 Srl 로드 - XE 이전 버전 사용자를 위함. + **/ + function procEditorLoadSavedDocument() { + $editor_sequence = Context::get('editor_sequence'); + $primary_key = Context::get('primary_key'); + $oEditorModel = &getModel('editor'); + $oFileController = &getController('file'); + + $saved_doc = $oEditorModel->getSavedDoc(null); + + $oFileController->setUploadInfo($editor_sequence, $saved_doc->document_srl); + $vars = $this->getVariables(); + $this->add("editor_sequence", $editor_sequence); + $this->add("key", $primary_key); + $this->add("title", $saved_doc->title); + $this->add("content", $saved_doc->content); + $this->add("document_srl", $saved_doc->document_srl); + } + + + /** + * @brief 게시글의 입력/수정이 일어났을 경우 자동 저장문서를 제거하는 trigger + **/ + function triggerDeleteSavedDoc(&$obj) { + $this->deleteSavedDoc(false); + return new Object(); + } + + /** + * @brief 자동 저장된 글을 삭제 + * 현재 접속한 사용자를 기준 + **/ + function deleteSavedDoc($mode = false) { + if(Context::get('is_logged')) { + $logged_info = Context::get('logged_info'); + $args->member_srl = $logged_info->member_srl; + } else { + $args->ipaddress = $_SERVER['REMOTE_ADDR']; + } + $args->module_srl = Context::get('module_srl'); + // module_srl이 없으면 현재 모듈 + if(!$args->module_srl) { + $current_module_info = Context::get('current_module_info'); + $args->module_srl = $current_module_info->module_srl; + } + + // 자동저장된 값이 혹시 이미 등록된 글인지 확인 + $output = executeQuery('editor.getSavedDocument', $args); + $saved_doc = $output->data; + if(!$saved_doc) return; + + $oDocumentModel = &getModel('document'); + $oSaved = $oDocumentModel->getDocument($saved_doc->document_srl); + if(!$oSaved->isExists()) { + if($mode) { + $output = executeQuery('editor.getSavedDocument', $args); + $output = ModuleHandler::triggerCall('editor.deleteSavedDoc', 'after', $saved_doc); + } + } + + // 일단 이전 저장본 삭제 + return executeQuery('editor.deleteSavedDoc', $args); + } + + /** + * @brief 가상 사이트에서 사용된 에디터 컴포넌트 정보를 제거 + **/ + function removeEditorConfig($site_srl) { + $args->site_srl = $site_srl; + executeQuery('editor.deleteSiteComponent', $args); + } + + /** + * @brief 에디터 컴포넌트 목록 캐싱 (editorModel::getComponentList) + * 에디터 컴포넌트 목록의 경우 DB query + Xml Parsing 때문에 캐싱 파일을 이용하도록 함 + **/ + function makeCache($filter_enabled = true, $site_srl) { + $oEditorModel = &getModel('editor'); + + if($filter_enabled) $args->enabled = "Y"; + + if($site_srl) { + $args->site_srl = $site_srl; + $output = executeQuery('editor.getSiteComponentList', $args); + } else $output = executeQuery('editor.getComponentList', $args); + $db_list = $output->data; + + // 파일목록을 구함 + $downloaded_list = FileHandler::readDir(_XE_PATH_.'modules/editor/components'); + + // 로그인 여부 및 소속 그룹 구함 + $is_logged = Context::get('is_logged'); + if($is_logged) { + $logged_info = Context::get('logged_info'); + if($logged_info->group_list && is_array($logged_info->group_list)) { + $group_list = array_keys($logged_info->group_list); + } else $group_list = array(); + } + + // DB 목록을 loop돌면서 xml정보까지 구함 + if(!is_array($db_list)) $db_list = array($db_list); + foreach($db_list as $component) { + if(in_array($component->component_name, array('colorpicker_text','colorpicker_bg'))) continue; + + $component_name = $component->component_name; + if(!$component_name) continue; + + if(!in_array($component_name, $downloaded_list)) continue; + + unset($xml_info); + $xml_info = $oEditorModel->getComponentXmlInfo($component_name); + $xml_info->enabled = $component->enabled; + + if($component->extra_vars) { + $extra_vars = unserialize($component->extra_vars); + if($extra_vars->target_group) { + $xml_info->target_group = $extra_vars->target_group; + } + + if($extra_vars->mid_list && count($extra_vars->mid_list)) + { + $xml_info->mid_list = $extra_vars->mid_list; + } + /* + // 사용권한이 있으면 권한 체크 + if($extra_vars->target_group) { + // 사용권한이 체크되어 있는데 로그인이 되어 있지 않으면 무조건 사용 중지 + if(!$is_logged) continue; + + // 대상 그룹을 구해서 현재 로그인 사용자의 그룹과 비교 + $target_group = $extra_vars->target_group; + unset($extra_vars->target_group); + + $is_granted = false; + foreach($group_list as $group_srl) { + if(in_array($group_srl, $target_group)) { + $is_granted = true; + break; + } + } + if(!$is_granted) continue; + } + + // 대상 모듈이 있으면 체크 + if($extra_vars->mid_list && count($extra_vars->mid_list) && Context::get('mid')) { + if(!in_array(Context::get('mid'), $extra_vars->mid_list)) continue; + }*/ + + // 에디터 컴포넌트의 설정 정보를 체크 + if($xml_info->extra_vars) { + foreach($xml_info->extra_vars as $key => $val) { + $xml_info->extra_vars->{$key}->value = $extra_vars->{$key}; + } + } + } + + $component_list->{$component_name} = $xml_info; + + // 버튼, 아이콘 이미지 구함 + $icon_file = _XE_PATH_.'modules/editor/components/'.$component_name.'/icon.gif'; + $component_icon_file = _XE_PATH_.'modules/editor/components/'.$component_name.'/component_icon.gif'; + if(file_exists($icon_file)) $component_list->{$component_name}->icon = true; + if(file_exists($component_icon_file)) $component_list->{$component_name}->component_icon = true; + } + + // enabled만 체크하도록 하였으면 그냥 return + if($filter_enabled) { + $cache_file = $oEditorModel->getCacheFile($filter_enabled, $site_srl); + $buff = sprintf('', str_replace('"','\\"',serialize($component_list))); + FileHandler::writeFile($cache_file, $buff); + return $component_list; + } + + // 다운로드된 목록의 xml_info를 마저 구함 + foreach($downloaded_list as $component_name) { + if(in_array($component_name, array('colorpicker_text','colorpicker_bg'))) continue; + + // 설정된 것이라면 패스 + if($component_list->{$component_name}) continue; + + // DB에 입력 + $oEditorController = &getAdminController('editor'); + $oEditorController->insertComponent($component_name, false, $site_srl); + + // component_list에 추가 + unset($xml_info); + $xml_info = $oEditorModel->getComponentXmlInfo($component_name); + $xml_info->enabled = 'N'; + + $component_list->{$component_name} = $xml_info; + } + + $cache_file = $oEditorModel->getCacheFile($filter_enabled, $site_srl); + $buff = sprintf('', str_replace('"','\\"',serialize($component_list))); + FileHandler::writeFile($cache_file, $buff); + + return $component_list; + } + + /** + * @brief 캐시 파일 삭제 + **/ + function removeCache($site_srl = 0) { + $oEditorModel = &getModel('editor'); + FileHandler::removeFile($oEditorModel->getCacheFile(true, $site_srl)); + FileHandler::removeFile($oEditorModel->getCacheFile(false, $site_srl)); + } + } +?> diff --git a/modules/editor/editor.model.php b/modules/editor/editor.model.php index d115c5ef1..0c090b664 100644 --- a/modules/editor/editor.model.php +++ b/modules/editor/editor.model.php @@ -1,806 +1,806 @@ -getModulePartConfig('editor', $module_srl); - } - - $editor_config = $GLOBALS['__editor_module_config__'][$module_srl]; - - if(!is_object($editor_config)) $editor_config = null; - - if(!is_array($editor_config->enable_html_grant)) $editor_config->enable_html_grant = array(); - if(!is_array($editor_config->enable_comment_html_grant)) $editor_config->enable_comment_html_grant = array(); - if(!is_array($editor_config->upload_file_grant)) $editor_config->upload_file_grant = array(); - if(!is_array($editor_config->comment_upload_file_grant)) $editor_config->comment_upload_file_grant = array(); - if(!is_array($editor_config->enable_default_component_grant)) $editor_config->enable_default_component_grant = array(); - if(!is_array($editor_config->enable_comment_default_component_grant)) $editor_config->enable_comment_default_component_grant = array(); - if(!is_array($editor_config->enable_component_grant)) $editor_config->enable_component_grant = array(); - if(!is_array($editor_config->enable_comment_component_grant)) $editor_config->enable_comment_component_grant= array(); - - if(!$editor_config->editor_height) $editor_config->editor_height = 500; - if(!$editor_config->comment_editor_height) $editor_config->comment_editor_height = 120; - if($editor_config->enable_autosave!='N') $editor_config->enable_autosave = "Y"; - - if(!$editor_config->editor_skin) $editor_config->editor_skin = 'xpresseditor'; - if(!$editor_config->comment_editor_skin) $editor_config->comment_editor_skin = 'xpresseditor'; - if(!$editor_config->content_style) $editor_config->content_style = 'default'; - - return $editor_config; - } - - function loadDrComponents(){ - $drComponentPath = './modules/editor/skins/dreditor/drcomponents/'; - $drComponentList = FileHandler::readDir($drComponentPath); - - $oTemplate = &TemplateHandler::getInstance(); - - $drComponentInfo = array(); - if($drComponentList){ - foreach($drComponentList as $i => $drComponent){ - unset($obj); - $obj = $this->getDrComponentXmlInfo($drComponent); - Context::loadLang(sprintf('%s%s/lang/',$drComponentPath,$drComponent)); - $path = sprintf('%s%s/tpl/',$drComponentPath,$drComponent); - $obj->html = $oTemplate->compile($path,$drComponent); - $drComponentInfo[$drComponent] = $obj; - } - } - Context::set('drComponentList',$drComponentInfo); - } - - function getDrComponentXmlInfo($drComponentName){ - $lang_type = Context::getLangType(); - - // 요청된 컴포넌트의 xml파일 위치를 구함 - $component_path = sprintf('%s/skins/dreditor/drcomponents/%s/', $this->module_path, $drComponentName); - - $xml_file = sprintf('%sinfo.xml', $component_path); - $cache_file = sprintf('./files/cache/editor/dr_%s.%s.php', $drComponentName, $lang_type); - - // 캐시된 xml파일이 있으면 include 후 정보 return - if(file_exists($cache_file) && file_exists($xml_file) && filemtime($cache_file) > filemtime($xml_file)) { - include($cache_file); - return $xml_info; - } - - // 캐시된 파일이 없으면 파싱후 캐싱 후 return - $oParser = new XmlParser(); - $xml_doc = $oParser->loadXmlFile($xml_file); - - $component_info->component_name = $drComponentName; - $component_info->title = $xml_doc->component->title->body; - $component_info->description = str_replace('\n', "\n", $xml_doc->component->description->body); - $component_info->version = $xml_doc->component->version->body; - $component_info->date = $xml_doc->component->date->body; - $component_info->homepage = $xml_doc->component->link->body; - $component_info->license = $xml_doc->component->license->body; - $component_info->license_link = $xml_doc->component->license->attrs->link; - - $buff = 'component_name = "%s";', $component_info->component_name); - $buff .= sprintf('$xml_info->title = "%s";', $component_info->title); - $buff .= sprintf('$xml_info->description = "%s";', $component_info->description); - $buff .= sprintf('$xml_info->version = "%s";', $component_info->version); - $buff .= sprintf('$xml_info->date = "%s";', $component_info->date); - $buff .= sprintf('$xml_info->homepage = "%s";', $component_info->homepage); - $buff .= sprintf('$xml_info->license = "%s";', $component_info->license); - $buff .= sprintf('$xml_info->license_link = "%s";', $component_info->license_link); - - // 작성자 정보 - if(!is_array($xml_doc->component->author)) $author_list[] = $xml_doc->component->author; - else $author_list = $xml_doc->component->author; - - for($i=0; $i < count($author_list); $i++) { - $buff .= sprintf('$xml_info->author['.$i.']->name = "%s";', $author_list[$i]->name->body); - $buff .= sprintf('$xml_info->author['.$i.']->email_address = "%s";', $author_list[$i]->attrs->email_address); - $buff .= sprintf('$xml_info->author['.$i.']->homepage = "%s";', $author_list[$i]->attrs->link); - } - - // history - if($xml_doc->component->history) { - if(!is_array($xml_doc->component->history)) $history_list[] = $xml_doc->component->history; - else $history_list = $xml_doc->component->history; - - for($i=0; $i < count($history_list); $i++) { - unset($obj); - sscanf($history_list[$i]->attrs->date, '%d-%d-%d', $date_obj->y, $date_obj->m, $date_obj->d); - $date = sprintf('%04d%02d%02d', $date_obj->y, $date_obj->m, $date_obj->d); - $buff .= sprintf('$xml_info->history['.$i.']->description = "%s";', $history_list[$i]->description->body); - $buff .= sprintf('$xml_info->history['.$i.']->version = "%s";', $history_list[$i]->attrs->version); - $buff .= sprintf('$xml_info->history['.$i.']->date = "%s";', $date); - - if($history_list[$i]->author) { - (!is_array($history_list[$i]->author)) ? $obj->author_list[] = $history_list[$i]->author : $obj->author_list = $history_list[$i]->author; - - for($j=0; $j < count($obj->author_list); $j++) { - $buff .= sprintf('$xml_info->history['.$i.']->author['.$j.']->name = "%s";', $obj->author_list[$j]->name->body); - $buff .= sprintf('$xml_info->history['.$i.']->author['.$j.']->email_address = "%s";', $obj->author_list[$j]->attrs->email_address); - $buff .= sprintf('$xml_info->history['.$i.']->author['.$j.']->homepage = "%s";', $obj->author_list[$j]->attrs->link); - } - } - - if($history_list[$i]->log) { - (!is_array($history_list[$i]->log)) ? $obj->log_list[] = $history_list[$i]->log : $obj->log_list = $history_list[$i]->log; - - for($j=0; $j < count($obj->log_list); $j++) { - $buff .= sprintf('$xml_info->history['.$i.']->logs['.$j.']->text = "%s";', $obj->log_list[$j]->body); - $buff .= sprintf('$xml_info->history['.$i.']->logs['.$j.']->link = "%s";', $obj->log_list[$j]->attrs->link); - } - } - } - } - - // 추가 변수 정리 (에디터 컴포넌트에서는 text형만 가능) - $extra_vars = $xml_doc->component->extra_vars->var; - if($extra_vars) { - if(!is_array($extra_vars)) $extra_vars = array($extra_vars); - foreach($extra_vars as $key => $val) { - unset($obj); - $key = $val->attrs->name; - $title = $val->title->body; - $description = $val->description->body; - $xml_info->extra_vars->{$key}->title = $title; - $xml_info->extra_vars->{$key}->description = $description; - - $buff .= sprintf('$xml_info->extra_vars->%s->%s = "%s";', $key, 'title', $title); - $buff .= sprintf('$xml_info->extra_vars->%s->%s = "%s";', $key, 'description', $description); - } - } - - $buff .= ' ?>'; - - FileHandler::writeFile($cache_file, $buff, "w"); - - unset($xml_info); - include($cache_file); - return $xml_info; - } - - /** - * @brief 에디터 template을 return - * upload_target_srl은 글의 수정시 호출하면 됨. - * 이 upload_target_srl은 첨부파일의 유무를 체크하기 위한 루틴을 구현하는데 사용됨. - **/ - function getEditor($upload_target_srl = 0, $option = null) { - /** - * 기본적인 에디터의 옵션을 정리 - **/ - // 파일 업로드 유무 옵션 설정 - if(!$option->allow_fileupload) $allow_fileupload = false; - else $allow_fileupload = true; - - // content_style 세팅 - if(!$option->content_style) $option->content_style = 'default'; - Context::set('content_style', $option->content_style); - - // 기본 글꼴 지정 - Context::set('content_font', $option->content_font); - Context::set('content_font_size', $option->content_font_size); - - // 자동 저장 유무 옵션 설정 글 수정시는 사용 안함 - if(!$option->enable_autosave) $enable_autosave = false; - elseif(Context::get($option->primary_key_name)) $enable_autosave = false; - else $enable_autosave = true; - - // 기본 에디터 컴포넌트 사용 설정 - if(!$option->enable_default_component) $enable_default_component = false; - else $enable_default_component = true; - - // 확장 컴포넌트 사용 설정 - if(!$option->enable_component) $enable_component = false; - else $enable_component = true; - - // html 모드 조절 - if($option->disable_html) $html_mode = false; - else $html_mode = true; - - // 높이 설정 - if(!$option->height) $editor_height = 400; - else $editor_height = $option->height; - - // 스킨 설정 - $skin = $option->skin; - if(!$skin) $skin = 'xpresseditor'; - - $colorset = $option->colorset; - Context::set('colorset', $colorset); - Context::set('skin', $skin); - - if($skin=='dreditor'){ - $this->loadDrComponents(); - } - - /** - * 자동백업 기능 체크 (글 수정일 경우는 사용하지 않음) - **/ - if($enable_autosave) { - // 자동 저장된 데이터를 추출 - $saved_doc = $this->getSavedDoc($upload_target_srl); - - // 자동 저장 데이터를 context setting - Context::set('saved_doc', $saved_doc); - } - Context::set('enable_autosave', $enable_autosave); - - /** - * 에디터의 고유 번호 추출 (한 페이지에 여러개의 에디터를 출력하는 경우를 대비) - **/ - if($option->editor_sequence) $editor_sequence = $option->editor_sequence; - else { - if(!$GLOBALS['_editor_sequence_']) $GLOBALS['_editor_sequence_'] = 1; - $editor_sequence = $GLOBALS['_editor_sequence_'] ++; - } - - /** - * 업로드 활성화시 내부적으로 file 모듈의 환경설정을 이용하여 설정 - **/ - $files_count = 0; - if($allow_fileupload) { - $oFileModel = &getModel('file'); - - // SWFUploader에 세팅할 업로드 설정 구함 - $file_config = $oFileModel->getUploadConfig(); - $file_config->allowed_attach_size = $file_config->allowed_attach_size*1024*1024; - $file_config->allowed_filesize = $file_config->allowed_filesize*1024*1024; - - Context::set('file_config',$file_config); - - // 업로드 가능 용량등에 대한 정보를 세팅 - $upload_status = $oFileModel->getUploadStatus(); - Context::set('upload_status', $upload_status); - - // upload가능하다고 설정 (내부적으로 캐싱하여 처리) - $oFileController = &getController('file'); - $oFileController->setUploadInfo($editor_sequence, $upload_target_srl); - - // 이미 등록된 파일이 있는지 검사 - if($upload_target_srl) $files_count = $oFileModel->getFilesCount($upload_target_srl); - } - Context::set('files_count', (int)$files_count); - - Context::set('allow_fileupload', $allow_fileupload); - - // 에디터 동작을 위한 editor_sequence값 설정 - Context::set('editor_sequence', $editor_sequence); - - // 파일 첨부 관련 행동을 하기 위해 문서 번호를 upload_target_srl로 설정 - // 신규문서일 경우 upload_target_srl=0 이고 첨부파일 관련 동작이 요청될때 이 값이 변경됨 - Context::set('upload_target_srl', $upload_target_srl); - - // 문서 혹은 댓글의 primary key값을 세팅한다. - Context::set('editor_primary_key_name', $option->primary_key_name); - - // 내용을 sync 맞추기 위한 content column name을 세팅한다 - Context::set('editor_content_key_name', $option->content_key_name); - - - /** - * 에디터 컴포넌트 체크 - **/ - $site_module_info = Context::get('site_module_info'); - $site_srl = (int)$site_module_info->site_srl; - if($enable_component) { - if(!Context::get('component_list')) { - $component_list = $this->getComponentList(true, $site_srl); - Context::set('component_list', $component_list); - } - } - Context::set('enable_component', $enable_component); - Context::set('enable_default_component', $enable_default_component); - - /** - * html_mode 가능한지 변수 설정 - **/ - Context::set('html_mode', $html_mode); - - /** - * 에디터 세로 크기 설정 - **/ - Context::set('editor_height', $editor_height); - - // 에디터의 초기화를 수동으로하는 것에 대한 값 체크 - Context::set('editor_manual_start', $option->manual_start); - - /** - * 템플릿을 미리 컴파일해서 컴파일된 소스를 하기 위해 스킨의 경로를 설정 - ?**/ - $tpl_path = sprintf('%sskins/%s/', $this->module_path, $skin); - $tpl_file = 'editor.html'; - - if(!file_exists($tpl_path.$tpl_file)) { - $skin = 'xpresseditor'; - $tpl_path = sprintf('%sskins/%s/', $this->module_path, $skin); - } - Context::set('editor_path', $tpl_path); - - // load editor skin lang - Context::loadLang($tpl_path.'lang'); - - // tpl 파일을 compile한 결과를 return - $oTemplate = new TemplateHandler(); - return $oTemplate->compile($tpl_path, $tpl_file); - } - - /** - * @brief 모듈별 설정이 반영된 에디터 template을 return - * getEditor() 와 동일한 결과물을 return하지만 getModuleEditor()는 각 모듈별 추가 설정을 통해 직접 제어되는 설정을 이용하여 에디터를 생성함 - * - * document/ comment 2가지 종류를 이용함. - * 굳이 나눈 이유는 하나의 모듈에서 2개 종류의 에디터 사용을 위해서인데 게시판이나 블로그등 원글과 그에 연관된 글(댓글)을 위한 용도임. - **/ - function getModuleEditor($type = 'document', $module_srl, $upload_target_srl, $primary_key_name, $content_key_name) { - // 지정된 모듈의 에디터 설정을 구해옴 - $editor_config = $this->getEditorConfig($module_srl); - - // type에 따른 설정 정리 - if($type == 'document') { - $config->editor_skin = $editor_config->editor_skin; - $config->content_style = $editor_config->content_style; - $config->content_font = $editor_config->content_font; - $config->content_font_size = $editor_config->content_font_size; - $config->sel_editor_colorset = $editor_config->sel_editor_colorset; - $config->upload_file_grant = $editor_config->upload_file_grant; - $config->enable_default_component_grant = $editor_config->enable_default_component_grant; - $config->enable_component_grant = $editor_config->enable_component_grant; - $config->enable_html_grant = $editor_config->enable_html_grant; - $config->editor_height = $editor_config->editor_height; - $config->enable_autosave = $editor_config->enable_autosave; - } else { - $config->editor_skin = $editor_config->comment_editor_skin; - $config->content_style = $editor_config->comment_content_style; - $config->content_font = $editor_config->content_font; - $config->content_font_size = $editor_config->content_font_size; - $config->sel_editor_colorset = $editor_config->sel_comment_editor_colorset; - $config->upload_file_grant = $editor_config->comment_upload_file_grant; - $config->enable_default_component_grant = $editor_config->enable_comment_default_component_grant; - $config->enable_component_grant = $editor_config->enable_comment_component_grant; - $config->enable_html_grant = $editor_config->enable_comment_html_grant; - $config->editor_height = $editor_config->comment_editor_height; - $config->enable_autosave = 'N'; - } - - // 권한 체크를 위한 현재 로그인 사용자의 그룹 설정 체크 - if(Context::get('is_logged')) { - $logged_info = Context::get('logged_info'); - $group_list = $logged_info->group_list; - } else { - $group_list = array(); - } - - // 에디터 옵션 변수를 미리 설정 - $option->skin = $config->editor_skin; - $option->content_style = $config->content_style; - $option->content_font = $config->content_font; - $option->content_font_size = $config->content_font_size; - $option->colorset = $config->sel_editor_colorset; - - // 파일 업로드 권한 체크 - $option->allow_fileupload = false; - if(count($config->upload_file_grant)) { - foreach($group_list as $group_srl => $group_info) { - if(in_array($group_srl, $config->upload_file_grant)) { - $option->allow_fileupload = true; - break; - } - } - } else $option->allow_fileupload = true; - - // 기본 컴포넌트 사용 권한 - $option->enable_default_component = false; - if(count($config->enable_default_component_grant)) { - foreach($group_list as $group_srl => $group_info) { - if(in_array($group_srl, $config->enable_default_component_grant)) { - $option->enable_default_component = true; - break; - } - } - } else $option->enable_default_component = true; - - // 확장 컴포넌트 사용 권한 - $option->enable_component = false; - if(count($config->enable_component_grant)) { - foreach($group_list as $group_srl => $group_info) { - if(in_array($group_srl, $config->enable_component_grant)) { - $option->enable_component = true; - break; - } - } - } else $option->enable_component = true; - - // HTML 편집 권한 - $enable_html = false; - if(count($config->enable_html_grant)) { - foreach($group_list as $group_srl => $group_info) { - if(in_array($group_srl, $config->enable_html_grant)) { - $enable_html = true; - break; - } - } - } else $enable_html = true; - - if($enable_html) $option->disable_html = false; - else $option->disable_html = true; - - // 높이 설정 - $option->height = $config->editor_height; - - // 자동 저장 유무 옵션 설정 - $option->enable_autosave = $config->enable_autosave=='Y'?true:false; - - // 기타 설정 - $option->primary_key_name = $primary_key_name; - $option->content_key_name = $content_key_name; - - return $this->getEditor($upload_target_srl, $option); - } - - /** - * @brief 자동저장되어 있는 정보를 가져옴 - **/ - function getSavedDoc($upload_target_srl) { - // 로그인 회원이면 member_srl, 아니면 ipaddress로 저장되어 있는 문서를 찾음 - if(Context::get('is_logged')) { - $logged_info = Context::get('logged_info'); - $auto_save_args->member_srl = $logged_info->member_srl; - } else { - $auto_save_args->ipaddress = $_SERVER['REMOTE_ADDR']; - } - $auto_save_args->module_srl = Context::get('module_srl'); - // module_srl이 없으면 현재 모듈 - if(!$auto_save_args->module_srl) { - $current_module_info = Context::get('current_module_info'); - $auto_save_args->module_srl = $current_module_info->module_srl; - } - - // DB에서 자동저장 데이터 추출 - $output = executeQuery('editor.getSavedDocument', $auto_save_args); - $saved_doc = $output->data; - - // 자동저장한 결과가 없으면 null값 return - if(!$saved_doc) return; - - // 자동저장된 값이 혹시 이미 등록된 글인지 확인 - $oDocumentModel = &getModel('document'); - $oSaved = $oDocumentModel->getDocument($saved_doc->document_srl); - if($oSaved->isExists()) return; - - // 자동저장 데이터에 문서번호가 있고 이 번호에 파일이 있다면 파일을 모두 이동하고 - // 해당 문서 번호를 editor_sequence로 세팅함 - if($saved_doc->document_srl && $upload_target_srl && !Context::get('document_srl')) { - $saved_doc->module_srl = $auto_save_args->module_srl; - $oFileController = &getController('file'); - $oFileController->moveFile($saved_doc->document_srl, $saved_doc->module_srl, $upload_target_srl); - } - else if($upload_target_srl) $saved_doc->document_srl = $upload_target_srl; - - // 자동 저장 데이터 변경 - $oEditorController = &getController('editor'); - $oEditorController->deleteSavedDoc(false); - $oEditorController->doSaveDoc($saved_doc); - - return $saved_doc; - } - - /** - * @brief component의 객체 생성 - **/ - function getComponentObject($component, $editor_sequence = 0, $site_srl = 0) { - if(!preg_match('/^[a-zA-Z0-9_-]+$/',$component) || !preg_match('/^[0-9]+$/', $editor_sequence . $site_srl)) return; - - if(!$this->loaded_component_list[$component][$editor_sequence]) { - // 해당 컴포넌트의 객체를 생성해서 실행 - $class_path = sprintf('%scomponents/%s/', $this->module_path, $component); - $class_file = sprintf('%s%s.class.php', $class_path, $component); - if(!file_exists($class_file)) return new Object(-1, sprintf(Context::getLang('msg_component_is_not_founded'), $component)); - - // 클래스 파일을 읽은 후 객체 생성 - require_once($class_file); - $tmp_fn = create_function('$seq,$path', "return new {$component}(\$seq,\$path);"); - $oComponent = $tmp_fn($editor_sequence, $class_path); - if(!$oComponent) return new Object(-1, sprintf(Context::getLang('msg_component_is_not_founded'), $component)); - - // 설정 정보를 추가 - $component_info = $this->getComponent($component, $site_srl); - $oComponent->setInfo($component_info); - $this->loaded_component_list[$component][$editor_sequence] = $oComponent; - } - - return $this->loaded_component_list[$component][$editor_sequence]; - } - - /** - * @brief editor skin 목록을 return - **/ - function getEditorSkinList() { - return FileHandler::readDir('./modules/editor/skins'); - } - - /** - * @brief 에디터 컴포넌트 목록 캐시 파일 이름 return - **/ - function getCacheFile($filter_enabled= true, $site_srl = 0) { - $lang = Context::getLangType(); - $cache_path = _XE_PATH_.'files/cache/editor/cache/'; - if(!is_dir($cache_path)) FileHandler::makeDir($cache_path); - $cache_file = $cache_path.'component_list.' . $lang .'.'; - if($filter_enabled) $cache_file .= 'filter.'; - if($site_srl) $cache_file .= $site_srl.'.'; - $cache_file .= 'php'; - return $cache_file; - } - - /** - * @brief component 목록을 return (DB정보 보함) - **/ - function getComponentList($filter_enabled = true, $site_srl=0, $from_db=false) { - $cache_file = $this->getCacheFile(false, $site_srl); - if($from_db || !file_exists($cache_file)) { - $oEditorController = &getController('editor'); - $oEditorController->makeCache(false, $site_srl); - } - - if(!file_exists($cache_file)) return; - @include($cache_file); - $logged_info = Context::get('logged_info'); - if($logged_info && is_array($logged_info->group_list)) - { - $group_list = array_keys($logged_info->group_list); - } - else - { - $group_list = array(); - } - - if(count($component_list)) { - foreach($component_list as $key => $val) { - if(!trim($key)) continue; - if(!is_dir(_XE_PATH_.'modules/editor/components/'.$key)) { - FileHandler::removeFile($cache_file); - return $this->getComponentList($filter_enabled, $site_srl); - } - if(!$filter_enabled) continue; - if($val->enabled == "N") { - unset($component_list->{$key}); - continue; - } - if($logged_info->is_admin == "Y" || $logged_info->is_site_admin == "Y") continue; - if($val->target_group) - { - if(!$logged_info) { - $val->enabled = "N"; - } - else { - $is_granted = false; - foreach($group_list as $group_srl) - { - if(in_array($group_srl, $val->target_group)) $is_granted = true; - } - if(!$is_granted) $val->enabled = "N"; - } - } - if($val->enabled != "N" && $val->mid_list) - { - $mid = Context::get('mid'); - if(!in_array($mid, $val->mid_list)) $val->enabled = "N"; - } - if($val->enabled == "N") { - unset($component_list->{$key}); - continue; - } - } - - } - return $component_list; - } - - /** - * @brief compnent의 xml+db정보를 구함 - **/ - function getComponent($component_name, $site_srl = 0) { - $args->component_name = $component_name; - - if($site_srl) { - $args->site_srl = $site_srl; - $output = executeQuery('editor.getSiteComponent', $args); - } else { - $output = executeQuery('editor.getComponent', $args); - } - $component = $output->data; - - $component_name = $component->component_name; - - unset($xml_info); - $xml_info = $this->getComponentXmlInfo($component_name); - $xml_info->enabled = $component->enabled; - - $xml_info->target_group = array(); - - $xml_info->mid_list = array(); - - if($component->extra_vars) { - $extra_vars = unserialize($component->extra_vars); - - if($extra_vars->target_group) { - $xml_info->target_group = $extra_vars->target_group; - unset($extra_vars->target_group); - } - - if($extra_vars->mid_list) { - $xml_info->mid_list = $extra_vars->mid_list; - unset($extra_vars->mid_list); - } - - - if($xml_info->extra_vars) { - foreach($xml_info->extra_vars as $key => $val) { - $xml_info->extra_vars->{$key}->value = $extra_vars->{$key}; - } - } - } - - return $xml_info; - } - - /** - * @brief component의 xml정보를 읽음 - **/ - function getComponentXmlInfo($component) { - $lang_type = Context::getLangType(); - - // 요청된 컴포넌트의 xml파일 위치를 구함 - $component_path = sprintf('%s/components/%s/', $this->module_path, $component); - - $xml_file = sprintf('%sinfo.xml', $component_path); - $cache_file = sprintf('./files/cache/editor/%s.%s.php', $component, $lang_type); - - // 캐시된 xml파일이 있으면 include 후 정보 return - if(file_exists($cache_file) && file_exists($xml_file) && filemtime($cache_file) > filemtime($xml_file)) { - include($cache_file); - return $xml_info; - } - - // 캐시된 파일이 없으면 파싱후 캐싱 후 return - $oParser = new XmlParser(); - $xml_doc = $oParser->loadXmlFile($xml_file); - - // 정보 정리 - if($xml_doc->component->version && $xml_doc->component->attrs->version == '0.2') { - $component_info->component_name = $component; - $component_info->title = $xml_doc->component->title->body; - $component_info->description = str_replace('\n', "\n", $xml_doc->component->description->body); - $component_info->version = $xml_doc->component->version->body; - $component_info->date = $xml_doc->component->date->body; - $component_info->homepage = $xml_doc->component->link->body; - $component_info->license = $xml_doc->component->license->body; - $component_info->license_link = $xml_doc->component->license->attrs->link; - - $buff = 'component_name = "%s";', $component_info->component_name); - $buff .= sprintf('$xml_info->title = "%s";', $component_info->title); - $buff .= sprintf('$xml_info->description = "%s";', $component_info->description); - $buff .= sprintf('$xml_info->version = "%s";', $component_info->version); - $buff .= sprintf('$xml_info->date = "%s";', $component_info->date); - $buff .= sprintf('$xml_info->homepage = "%s";', $component_info->homepage); - $buff .= sprintf('$xml_info->license = "%s";', $component_info->license); - $buff .= sprintf('$xml_info->license_link = "%s";', $component_info->license_link); - - // 작성자 정보 - if(!is_array($xml_doc->component->author)) $author_list[] = $xml_doc->component->author; - else $author_list = $xml_doc->component->author; - - for($i=0; $i < count($author_list); $i++) { - $buff .= sprintf('$xml_info->author['.$i.']->name = "%s";', $author_list[$i]->name->body); - $buff .= sprintf('$xml_info->author['.$i.']->email_address = "%s";', $author_list[$i]->attrs->email_address); - $buff .= sprintf('$xml_info->author['.$i.']->homepage = "%s";', $author_list[$i]->attrs->link); - } - - // history - if($xml_doc->component->history) { - if(!is_array($xml_doc->component->history)) $history_list[] = $xml_doc->component->history; - else $history_list = $xml_doc->component->history; - - for($i=0; $i < count($history_list); $i++) { - unset($obj); - sscanf($history_list[$i]->attrs->date, '%d-%d-%d', $date_obj->y, $date_obj->m, $date_obj->d); - $date = sprintf('%04d%02d%02d', $date_obj->y, $date_obj->m, $date_obj->d); - $buff .= sprintf('$xml_info->history['.$i.']->description = "%s";', $history_list[$i]->description->body); - $buff .= sprintf('$xml_info->history['.$i.']->version = "%s";', $history_list[$i]->attrs->version); - $buff .= sprintf('$xml_info->history['.$i.']->date = "%s";', $date); - - if($history_list[$i]->author) { - (!is_array($history_list[$i]->author)) ? $obj->author_list[] = $history_list[$i]->author : $obj->author_list = $history_list[$i]->author; - - for($j=0; $j < count($obj->author_list); $j++) { - $buff .= sprintf('$xml_info->history['.$i.']->author['.$j.']->name = "%s";', $obj->author_list[$j]->name->body); - $buff .= sprintf('$xml_info->history['.$i.']->author['.$j.']->email_address = "%s";', $obj->author_list[$j]->attrs->email_address); - $buff .= sprintf('$xml_info->history['.$i.']->author['.$j.']->homepage = "%s";', $obj->author_list[$j]->attrs->link); - } - } - - if($history_list[$i]->log) { - (!is_array($history_list[$i]->log)) ? $obj->log_list[] = $history_list[$i]->log : $obj->log_list = $history_list[$i]->log; - - for($j=0; $j < count($obj->log_list); $j++) { - $buff .= sprintf('$xml_info->history['.$i.']->logs['.$j.']->text = "%s";', $obj->log_list[$j]->body); - $buff .= sprintf('$xml_info->history['.$i.']->logs['.$j.']->link = "%s";', $obj->log_list[$j]->attrs->link); - } - } - } - } - - - } else { - sscanf($xml_doc->component->author->attrs->date, '%d. %d. %d', $date_obj->y, $date_obj->m, $date_obj->d); - $date = sprintf('%04d%02d%02d', $date_obj->y, $date_obj->m, $date_obj->d); - $xml_info->component_name = $component; - $xml_info->title = $xml_doc->component->title->body; - $xml_info->description = str_replace('\n', "\n", $xml_doc->component->author->description->body); - $xml_info->version = $xml_doc->component->attrs->version; - $xml_info->date = $date; - $xml_info->author->name = $xml_doc->component->author->name->body; - $xml_info->author->email_address = $xml_doc->component->author->attrs->email_address; - $xml_info->author->homepage = $xml_doc->component->author->attrs->link; - - $buff = 'component_name = "%s";', $xml_info->component_name); - $buff .= sprintf('$xml_info->title = "%s";', $xml_info->title); - $buff .= sprintf('$xml_info->description = "%s";', $xml_info->description); - $buff .= sprintf('$xml_info->version = "%s";', $xml_info->version); - $buff .= sprintf('$xml_info->date = "%s";', $xml_info->date); - $buff .= sprintf('$xml_info->author[0]->name = "%s";', $xml_info->author->name); - $buff .= sprintf('$xml_info->author[0]->email_address = "%s";', $xml_info->author->email_address); - $buff .= sprintf('$xml_info->author[0]->homepage = "%s";', $xml_info->author->homepage); - } - - // 추가 변수 정리 (에디터 컴포넌트에서는 text형만 가능) - $extra_vars = $xml_doc->component->extra_vars->var; - if($extra_vars) { - if(!is_array($extra_vars)) $extra_vars = array($extra_vars); - foreach($extra_vars as $key => $val) { - unset($obj); - $key = $val->attrs->name; - $title = $val->title->body; - $description = $val->description->body; - $xml_info->extra_vars->{$key}->title = $title; - $xml_info->extra_vars->{$key}->description = $description; - - $buff .= sprintf('$xml_info->extra_vars->%s->%s = "%s";', $key, 'title', $title); - $buff .= sprintf('$xml_info->extra_vars->%s->%s = "%s";', $key, 'description', $description); - } - } - - $buff .= ' ?>'; - - FileHandler::writeFile($cache_file, $buff, "w"); - - unset($xml_info); - include($cache_file); - return $xml_info; - } - } -?> +getModulePartConfig('editor', $module_srl); + } + + $editor_config = $GLOBALS['__editor_module_config__'][$module_srl]; + + if(!is_object($editor_config)) $editor_config = null; + + if(!is_array($editor_config->enable_html_grant)) $editor_config->enable_html_grant = array(); + if(!is_array($editor_config->enable_comment_html_grant)) $editor_config->enable_comment_html_grant = array(); + if(!is_array($editor_config->upload_file_grant)) $editor_config->upload_file_grant = array(); + if(!is_array($editor_config->comment_upload_file_grant)) $editor_config->comment_upload_file_grant = array(); + if(!is_array($editor_config->enable_default_component_grant)) $editor_config->enable_default_component_grant = array(); + if(!is_array($editor_config->enable_comment_default_component_grant)) $editor_config->enable_comment_default_component_grant = array(); + if(!is_array($editor_config->enable_component_grant)) $editor_config->enable_component_grant = array(); + if(!is_array($editor_config->enable_comment_component_grant)) $editor_config->enable_comment_component_grant= array(); + + if(!$editor_config->editor_height) $editor_config->editor_height = 500; + if(!$editor_config->comment_editor_height) $editor_config->comment_editor_height = 120; + if($editor_config->enable_autosave!='N') $editor_config->enable_autosave = "Y"; + + if(!$editor_config->editor_skin) $editor_config->editor_skin = 'xpresseditor'; + if(!$editor_config->comment_editor_skin) $editor_config->comment_editor_skin = 'xpresseditor'; + if(!$editor_config->content_style) $editor_config->content_style = 'default'; + + return $editor_config; + } + + function loadDrComponents(){ + $drComponentPath = './modules/editor/skins/dreditor/drcomponents/'; + $drComponentList = FileHandler::readDir($drComponentPath); + + $oTemplate = &TemplateHandler::getInstance(); + + $drComponentInfo = array(); + if($drComponentList){ + foreach($drComponentList as $i => $drComponent){ + unset($obj); + $obj = $this->getDrComponentXmlInfo($drComponent); + Context::loadLang(sprintf('%s%s/lang/',$drComponentPath,$drComponent)); + $path = sprintf('%s%s/tpl/',$drComponentPath,$drComponent); + $obj->html = $oTemplate->compile($path,$drComponent); + $drComponentInfo[$drComponent] = $obj; + } + } + Context::set('drComponentList',$drComponentInfo); + } + + function getDrComponentXmlInfo($drComponentName){ + $lang_type = Context::getLangType(); + + // 요청된 컴포넌트의 xml파일 위치를 구함 + $component_path = sprintf('%s/skins/dreditor/drcomponents/%s/', $this->module_path, $drComponentName); + + $xml_file = sprintf('%sinfo.xml', $component_path); + $cache_file = sprintf('./files/cache/editor/dr_%s.%s.php', $drComponentName, $lang_type); + + // 캐시된 xml파일이 있으면 include 후 정보 return + if(file_exists($cache_file) && file_exists($xml_file) && filemtime($cache_file) > filemtime($xml_file)) { + include($cache_file); + return $xml_info; + } + + // 캐시된 파일이 없으면 파싱후 캐싱 후 return + $oParser = new XmlParser(); + $xml_doc = $oParser->loadXmlFile($xml_file); + + $component_info->component_name = $drComponentName; + $component_info->title = $xml_doc->component->title->body; + $component_info->description = str_replace('\n', "\n", $xml_doc->component->description->body); + $component_info->version = $xml_doc->component->version->body; + $component_info->date = $xml_doc->component->date->body; + $component_info->homepage = $xml_doc->component->link->body; + $component_info->license = $xml_doc->component->license->body; + $component_info->license_link = $xml_doc->component->license->attrs->link; + + $buff = 'component_name = "%s";', $component_info->component_name); + $buff .= sprintf('$xml_info->title = "%s";', $component_info->title); + $buff .= sprintf('$xml_info->description = "%s";', $component_info->description); + $buff .= sprintf('$xml_info->version = "%s";', $component_info->version); + $buff .= sprintf('$xml_info->date = "%s";', $component_info->date); + $buff .= sprintf('$xml_info->homepage = "%s";', $component_info->homepage); + $buff .= sprintf('$xml_info->license = "%s";', $component_info->license); + $buff .= sprintf('$xml_info->license_link = "%s";', $component_info->license_link); + + // 작성자 정보 + if(!is_array($xml_doc->component->author)) $author_list[] = $xml_doc->component->author; + else $author_list = $xml_doc->component->author; + + for($i=0; $i < count($author_list); $i++) { + $buff .= sprintf('$xml_info->author['.$i.']->name = "%s";', $author_list[$i]->name->body); + $buff .= sprintf('$xml_info->author['.$i.']->email_address = "%s";', $author_list[$i]->attrs->email_address); + $buff .= sprintf('$xml_info->author['.$i.']->homepage = "%s";', $author_list[$i]->attrs->link); + } + + // history + if($xml_doc->component->history) { + if(!is_array($xml_doc->component->history)) $history_list[] = $xml_doc->component->history; + else $history_list = $xml_doc->component->history; + + for($i=0; $i < count($history_list); $i++) { + unset($obj); + sscanf($history_list[$i]->attrs->date, '%d-%d-%d', $date_obj->y, $date_obj->m, $date_obj->d); + $date = sprintf('%04d%02d%02d', $date_obj->y, $date_obj->m, $date_obj->d); + $buff .= sprintf('$xml_info->history['.$i.']->description = "%s";', $history_list[$i]->description->body); + $buff .= sprintf('$xml_info->history['.$i.']->version = "%s";', $history_list[$i]->attrs->version); + $buff .= sprintf('$xml_info->history['.$i.']->date = "%s";', $date); + + if($history_list[$i]->author) { + (!is_array($history_list[$i]->author)) ? $obj->author_list[] = $history_list[$i]->author : $obj->author_list = $history_list[$i]->author; + + for($j=0; $j < count($obj->author_list); $j++) { + $buff .= sprintf('$xml_info->history['.$i.']->author['.$j.']->name = "%s";', $obj->author_list[$j]->name->body); + $buff .= sprintf('$xml_info->history['.$i.']->author['.$j.']->email_address = "%s";', $obj->author_list[$j]->attrs->email_address); + $buff .= sprintf('$xml_info->history['.$i.']->author['.$j.']->homepage = "%s";', $obj->author_list[$j]->attrs->link); + } + } + + if($history_list[$i]->log) { + (!is_array($history_list[$i]->log)) ? $obj->log_list[] = $history_list[$i]->log : $obj->log_list = $history_list[$i]->log; + + for($j=0; $j < count($obj->log_list); $j++) { + $buff .= sprintf('$xml_info->history['.$i.']->logs['.$j.']->text = "%s";', $obj->log_list[$j]->body); + $buff .= sprintf('$xml_info->history['.$i.']->logs['.$j.']->link = "%s";', $obj->log_list[$j]->attrs->link); + } + } + } + } + + // 추가 변수 정리 (에디터 컴포넌트에서는 text형만 가능) + $extra_vars = $xml_doc->component->extra_vars->var; + if($extra_vars) { + if(!is_array($extra_vars)) $extra_vars = array($extra_vars); + foreach($extra_vars as $key => $val) { + unset($obj); + $key = $val->attrs->name; + $title = $val->title->body; + $description = $val->description->body; + $xml_info->extra_vars->{$key}->title = $title; + $xml_info->extra_vars->{$key}->description = $description; + + $buff .= sprintf('$xml_info->extra_vars->%s->%s = "%s";', $key, 'title', $title); + $buff .= sprintf('$xml_info->extra_vars->%s->%s = "%s";', $key, 'description', $description); + } + } + + $buff .= ' ?>'; + + FileHandler::writeFile($cache_file, $buff, "w"); + + unset($xml_info); + include($cache_file); + return $xml_info; + } + + /** + * @brief 에디터 template을 return + * upload_target_srl은 글의 수정시 호출하면 됨. + * 이 upload_target_srl은 첨부파일의 유무를 체크하기 위한 루틴을 구현하는데 사용됨. + **/ + function getEditor($upload_target_srl = 0, $option = null) { + /** + * 기본적인 에디터의 옵션을 정리 + **/ + // 파일 업로드 유무 옵션 설정 + if(!$option->allow_fileupload) $allow_fileupload = false; + else $allow_fileupload = true; + + // content_style 세팅 + if(!$option->content_style) $option->content_style = 'default'; + Context::set('content_style', $option->content_style); + + // 기본 글꼴 지정 + Context::set('content_font', $option->content_font); + Context::set('content_font_size', $option->content_font_size); + + // 자동 저장 유무 옵션 설정 글 수정시는 사용 안함 + if(!$option->enable_autosave) $enable_autosave = false; + elseif(Context::get($option->primary_key_name)) $enable_autosave = false; + else $enable_autosave = true; + + // 기본 에디터 컴포넌트 사용 설정 + if(!$option->enable_default_component) $enable_default_component = false; + else $enable_default_component = true; + + // 확장 컴포넌트 사용 설정 + if(!$option->enable_component) $enable_component = false; + else $enable_component = true; + + // html 모드 조절 + if($option->disable_html) $html_mode = false; + else $html_mode = true; + + // 높이 설정 + if(!$option->height) $editor_height = 400; + else $editor_height = $option->height; + + // 스킨 설정 + $skin = $option->skin; + if(!$skin) $skin = 'xpresseditor'; + + $colorset = $option->colorset; + Context::set('colorset', $colorset); + Context::set('skin', $skin); + + if($skin=='dreditor'){ + $this->loadDrComponents(); + } + + /** + * 자동백업 기능 체크 (글 수정일 경우는 사용하지 않음) + **/ + if($enable_autosave) { + // 자동 저장된 데이터를 추출 + $saved_doc = $this->getSavedDoc($upload_target_srl); + + // 자동 저장 데이터를 context setting + Context::set('saved_doc', $saved_doc); + } + Context::set('enable_autosave', $enable_autosave); + + /** + * 에디터의 고유 번호 추출 (한 페이지에 여러개의 에디터를 출력하는 경우를 대비) + **/ + if($option->editor_sequence) $editor_sequence = $option->editor_sequence; + else { + if(!$GLOBALS['_editor_sequence_']) $GLOBALS['_editor_sequence_'] = 1; + $editor_sequence = $GLOBALS['_editor_sequence_'] ++; + } + + /** + * 업로드 활성화시 내부적으로 file 모듈의 환경설정을 이용하여 설정 + **/ + $files_count = 0; + if($allow_fileupload) { + $oFileModel = &getModel('file'); + + // SWFUploader에 세팅할 업로드 설정 구함 + $file_config = $oFileModel->getUploadConfig(); + $file_config->allowed_attach_size = $file_config->allowed_attach_size*1024*1024; + $file_config->allowed_filesize = $file_config->allowed_filesize*1024*1024; + + Context::set('file_config',$file_config); + + // 업로드 가능 용량등에 대한 정보를 세팅 + $upload_status = $oFileModel->getUploadStatus(); + Context::set('upload_status', $upload_status); + + // upload가능하다고 설정 (내부적으로 캐싱하여 처리) + $oFileController = &getController('file'); + $oFileController->setUploadInfo($editor_sequence, $upload_target_srl); + + // 이미 등록된 파일이 있는지 검사 + if($upload_target_srl) $files_count = $oFileModel->getFilesCount($upload_target_srl); + } + Context::set('files_count', (int)$files_count); + + Context::set('allow_fileupload', $allow_fileupload); + + // 에디터 동작을 위한 editor_sequence값 설정 + Context::set('editor_sequence', $editor_sequence); + + // 파일 첨부 관련 행동을 하기 위해 문서 번호를 upload_target_srl로 설정 + // 신규문서일 경우 upload_target_srl=0 이고 첨부파일 관련 동작이 요청될때 이 값이 변경됨 + Context::set('upload_target_srl', $upload_target_srl); + + // 문서 혹은 댓글의 primary key값을 세팅한다. + Context::set('editor_primary_key_name', $option->primary_key_name); + + // 내용을 sync 맞추기 위한 content column name을 세팅한다 + Context::set('editor_content_key_name', $option->content_key_name); + + + /** + * 에디터 컴포넌트 체크 + **/ + $site_module_info = Context::get('site_module_info'); + $site_srl = (int)$site_module_info->site_srl; + if($enable_component) { + if(!Context::get('component_list')) { + $component_list = $this->getComponentList(true, $site_srl); + Context::set('component_list', $component_list); + } + } + Context::set('enable_component', $enable_component); + Context::set('enable_default_component', $enable_default_component); + + /** + * html_mode 가능한지 변수 설정 + **/ + Context::set('html_mode', $html_mode); + + /** + * 에디터 세로 크기 설정 + **/ + Context::set('editor_height', $editor_height); + + // 에디터의 초기화를 수동으로하는 것에 대한 값 체크 + Context::set('editor_manual_start', $option->manual_start); + + /** + * 템플릿을 미리 컴파일해서 컴파일된 소스를 하기 위해 스킨의 경로를 설정 + ?**/ + $tpl_path = sprintf('%sskins/%s/', $this->module_path, $skin); + $tpl_file = 'editor.html'; + + if(!file_exists($tpl_path.$tpl_file)) { + $skin = 'xpresseditor'; + $tpl_path = sprintf('%sskins/%s/', $this->module_path, $skin); + } + Context::set('editor_path', $tpl_path); + + // load editor skin lang + Context::loadLang($tpl_path.'lang'); + + // tpl 파일을 compile한 결과를 return + $oTemplate = new TemplateHandler(); + return $oTemplate->compile($tpl_path, $tpl_file); + } + + /** + * @brief 모듈별 설정이 반영된 에디터 template을 return + * getEditor() 와 동일한 결과물을 return하지만 getModuleEditor()는 각 모듈별 추가 설정을 통해 직접 제어되는 설정을 이용하여 에디터를 생성함 + * + * document/ comment 2가지 종류를 이용함. + * 굳이 나눈 이유는 하나의 모듈에서 2개 종류의 에디터 사용을 위해서인데 게시판이나 블로그등 원글과 그에 연관된 글(댓글)을 위한 용도임. + **/ + function getModuleEditor($type = 'document', $module_srl, $upload_target_srl, $primary_key_name, $content_key_name) { + // 지정된 모듈의 에디터 설정을 구해옴 + $editor_config = $this->getEditorConfig($module_srl); + + // type에 따른 설정 정리 + if($type == 'document') { + $config->editor_skin = $editor_config->editor_skin; + $config->content_style = $editor_config->content_style; + $config->content_font = $editor_config->content_font; + $config->content_font_size = $editor_config->content_font_size; + $config->sel_editor_colorset = $editor_config->sel_editor_colorset; + $config->upload_file_grant = $editor_config->upload_file_grant; + $config->enable_default_component_grant = $editor_config->enable_default_component_grant; + $config->enable_component_grant = $editor_config->enable_component_grant; + $config->enable_html_grant = $editor_config->enable_html_grant; + $config->editor_height = $editor_config->editor_height; + $config->enable_autosave = $editor_config->enable_autosave; + } else { + $config->editor_skin = $editor_config->comment_editor_skin; + $config->content_style = $editor_config->comment_content_style; + $config->content_font = $editor_config->content_font; + $config->content_font_size = $editor_config->content_font_size; + $config->sel_editor_colorset = $editor_config->sel_comment_editor_colorset; + $config->upload_file_grant = $editor_config->comment_upload_file_grant; + $config->enable_default_component_grant = $editor_config->enable_comment_default_component_grant; + $config->enable_component_grant = $editor_config->enable_comment_component_grant; + $config->enable_html_grant = $editor_config->enable_comment_html_grant; + $config->editor_height = $editor_config->comment_editor_height; + $config->enable_autosave = 'N'; + } + + // 권한 체크를 위한 현재 로그인 사용자의 그룹 설정 체크 + if(Context::get('is_logged')) { + $logged_info = Context::get('logged_info'); + $group_list = $logged_info->group_list; + } else { + $group_list = array(); + } + + // 에디터 옵션 변수를 미리 설정 + $option->skin = $config->editor_skin; + $option->content_style = $config->content_style; + $option->content_font = $config->content_font; + $option->content_font_size = $config->content_font_size; + $option->colorset = $config->sel_editor_colorset; + + // 파일 업로드 권한 체크 + $option->allow_fileupload = false; + if(count($config->upload_file_grant)) { + foreach($group_list as $group_srl => $group_info) { + if(in_array($group_srl, $config->upload_file_grant)) { + $option->allow_fileupload = true; + break; + } + } + } else $option->allow_fileupload = true; + + // 기본 컴포넌트 사용 권한 + $option->enable_default_component = false; + if(count($config->enable_default_component_grant)) { + foreach($group_list as $group_srl => $group_info) { + if(in_array($group_srl, $config->enable_default_component_grant)) { + $option->enable_default_component = true; + break; + } + } + } else $option->enable_default_component = true; + + // 확장 컴포넌트 사용 권한 + $option->enable_component = false; + if(count($config->enable_component_grant)) { + foreach($group_list as $group_srl => $group_info) { + if(in_array($group_srl, $config->enable_component_grant)) { + $option->enable_component = true; + break; + } + } + } else $option->enable_component = true; + + // HTML 편집 권한 + $enable_html = false; + if(count($config->enable_html_grant)) { + foreach($group_list as $group_srl => $group_info) { + if(in_array($group_srl, $config->enable_html_grant)) { + $enable_html = true; + break; + } + } + } else $enable_html = true; + + if($enable_html) $option->disable_html = false; + else $option->disable_html = true; + + // 높이 설정 + $option->height = $config->editor_height; + + // 자동 저장 유무 옵션 설정 + $option->enable_autosave = $config->enable_autosave=='Y'?true:false; + + // 기타 설정 + $option->primary_key_name = $primary_key_name; + $option->content_key_name = $content_key_name; + + return $this->getEditor($upload_target_srl, $option); + } + + /** + * @brief 자동저장되어 있는 정보를 가져옴 + **/ + function getSavedDoc($upload_target_srl) { + // 로그인 회원이면 member_srl, 아니면 ipaddress로 저장되어 있는 문서를 찾음 + if(Context::get('is_logged')) { + $logged_info = Context::get('logged_info'); + $auto_save_args->member_srl = $logged_info->member_srl; + } else { + $auto_save_args->ipaddress = $_SERVER['REMOTE_ADDR']; + } + $auto_save_args->module_srl = Context::get('module_srl'); + // module_srl이 없으면 현재 모듈 + if(!$auto_save_args->module_srl) { + $current_module_info = Context::get('current_module_info'); + $auto_save_args->module_srl = $current_module_info->module_srl; + } + + // DB에서 자동저장 데이터 추출 + $output = executeQuery('editor.getSavedDocument', $auto_save_args); + $saved_doc = $output->data; + + // 자동저장한 결과가 없으면 null값 return + if(!$saved_doc) return; + + // 자동저장된 값이 혹시 이미 등록된 글인지 확인 + $oDocumentModel = &getModel('document'); + $oSaved = $oDocumentModel->getDocument($saved_doc->document_srl); + if($oSaved->isExists()) return; + + // 자동저장 데이터에 문서번호가 있고 이 번호에 파일이 있다면 파일을 모두 이동하고 + // 해당 문서 번호를 editor_sequence로 세팅함 + if($saved_doc->document_srl && $upload_target_srl && !Context::get('document_srl')) { + $saved_doc->module_srl = $auto_save_args->module_srl; + $oFileController = &getController('file'); + $oFileController->moveFile($saved_doc->document_srl, $saved_doc->module_srl, $upload_target_srl); + } + else if($upload_target_srl) $saved_doc->document_srl = $upload_target_srl; + + // 자동 저장 데이터 변경 + $oEditorController = &getController('editor'); + $oEditorController->deleteSavedDoc(false); + $oEditorController->doSaveDoc($saved_doc); + + return $saved_doc; + } + + /** + * @brief component의 객체 생성 + **/ + function getComponentObject($component, $editor_sequence = 0, $site_srl = 0) { + if(!preg_match('/^[a-zA-Z0-9_-]+$/',$component) || !preg_match('/^[0-9]+$/', $editor_sequence . $site_srl)) return; + + if(!$this->loaded_component_list[$component][$editor_sequence]) { + // 해당 컴포넌트의 객체를 생성해서 실행 + $class_path = sprintf('%scomponents/%s/', $this->module_path, $component); + $class_file = sprintf('%s%s.class.php', $class_path, $component); + if(!file_exists($class_file)) return new Object(-1, sprintf(Context::getLang('msg_component_is_not_founded'), $component)); + + // 클래스 파일을 읽은 후 객체 생성 + require_once($class_file); + $tmp_fn = create_function('$seq,$path', "return new {$component}(\$seq,\$path);"); + $oComponent = $tmp_fn($editor_sequence, $class_path); + if(!$oComponent) return new Object(-1, sprintf(Context::getLang('msg_component_is_not_founded'), $component)); + + // 설정 정보를 추가 + $component_info = $this->getComponent($component, $site_srl); + $oComponent->setInfo($component_info); + $this->loaded_component_list[$component][$editor_sequence] = $oComponent; + } + + return $this->loaded_component_list[$component][$editor_sequence]; + } + + /** + * @brief editor skin 목록을 return + **/ + function getEditorSkinList() { + return FileHandler::readDir('./modules/editor/skins'); + } + + /** + * @brief 에디터 컴포넌트 목록 캐시 파일 이름 return + **/ + function getCacheFile($filter_enabled= true, $site_srl = 0) { + $lang = Context::getLangType(); + $cache_path = _XE_PATH_.'files/cache/editor/cache/'; + if(!is_dir($cache_path)) FileHandler::makeDir($cache_path); + $cache_file = $cache_path.'component_list.' . $lang .'.'; + if($filter_enabled) $cache_file .= 'filter.'; + if($site_srl) $cache_file .= $site_srl.'.'; + $cache_file .= 'php'; + return $cache_file; + } + + /** + * @brief component 목록을 return (DB정보 보함) + **/ + function getComponentList($filter_enabled = true, $site_srl=0, $from_db=false) { + $cache_file = $this->getCacheFile(false, $site_srl); + if($from_db || !file_exists($cache_file)) { + $oEditorController = &getController('editor'); + $oEditorController->makeCache(false, $site_srl); + } + + if(!file_exists($cache_file)) return; + @include($cache_file); + $logged_info = Context::get('logged_info'); + if($logged_info && is_array($logged_info->group_list)) + { + $group_list = array_keys($logged_info->group_list); + } + else + { + $group_list = array(); + } + + if(count($component_list)) { + foreach($component_list as $key => $val) { + if(!trim($key)) continue; + if(!is_dir(_XE_PATH_.'modules/editor/components/'.$key)) { + FileHandler::removeFile($cache_file); + return $this->getComponentList($filter_enabled, $site_srl); + } + if(!$filter_enabled) continue; + if($val->enabled == "N") { + unset($component_list->{$key}); + continue; + } + if($logged_info->is_admin == "Y" || $logged_info->is_site_admin == "Y") continue; + if($val->target_group) + { + if(!$logged_info) { + $val->enabled = "N"; + } + else { + $is_granted = false; + foreach($group_list as $group_srl) + { + if(in_array($group_srl, $val->target_group)) $is_granted = true; + } + if(!$is_granted) $val->enabled = "N"; + } + } + if($val->enabled != "N" && $val->mid_list) + { + $mid = Context::get('mid'); + if(!in_array($mid, $val->mid_list)) $val->enabled = "N"; + } + if($val->enabled == "N") { + unset($component_list->{$key}); + continue; + } + } + + } + return $component_list; + } + + /** + * @brief compnent의 xml+db정보를 구함 + **/ + function getComponent($component_name, $site_srl = 0) { + $args->component_name = $component_name; + + if($site_srl) { + $args->site_srl = $site_srl; + $output = executeQuery('editor.getSiteComponent', $args); + } else { + $output = executeQuery('editor.getComponent', $args); + } + $component = $output->data; + + $component_name = $component->component_name; + + unset($xml_info); + $xml_info = $this->getComponentXmlInfo($component_name); + $xml_info->enabled = $component->enabled; + + $xml_info->target_group = array(); + + $xml_info->mid_list = array(); + + if($component->extra_vars) { + $extra_vars = unserialize($component->extra_vars); + + if($extra_vars->target_group) { + $xml_info->target_group = $extra_vars->target_group; + unset($extra_vars->target_group); + } + + if($extra_vars->mid_list) { + $xml_info->mid_list = $extra_vars->mid_list; + unset($extra_vars->mid_list); + } + + + if($xml_info->extra_vars) { + foreach($xml_info->extra_vars as $key => $val) { + $xml_info->extra_vars->{$key}->value = $extra_vars->{$key}; + } + } + } + + return $xml_info; + } + + /** + * @brief component의 xml정보를 읽음 + **/ + function getComponentXmlInfo($component) { + $lang_type = Context::getLangType(); + + // 요청된 컴포넌트의 xml파일 위치를 구함 + $component_path = sprintf('%s/components/%s/', $this->module_path, $component); + + $xml_file = sprintf('%sinfo.xml', $component_path); + $cache_file = sprintf('./files/cache/editor/%s.%s.php', $component, $lang_type); + + // 캐시된 xml파일이 있으면 include 후 정보 return + if(file_exists($cache_file) && file_exists($xml_file) && filemtime($cache_file) > filemtime($xml_file)) { + include($cache_file); + return $xml_info; + } + + // 캐시된 파일이 없으면 파싱후 캐싱 후 return + $oParser = new XmlParser(); + $xml_doc = $oParser->loadXmlFile($xml_file); + + // 정보 정리 + if($xml_doc->component->version && $xml_doc->component->attrs->version == '0.2') { + $component_info->component_name = $component; + $component_info->title = $xml_doc->component->title->body; + $component_info->description = str_replace('\n', "\n", $xml_doc->component->description->body); + $component_info->version = $xml_doc->component->version->body; + $component_info->date = $xml_doc->component->date->body; + $component_info->homepage = $xml_doc->component->link->body; + $component_info->license = $xml_doc->component->license->body; + $component_info->license_link = $xml_doc->component->license->attrs->link; + + $buff = 'component_name = "%s";', $component_info->component_name); + $buff .= sprintf('$xml_info->title = "%s";', $component_info->title); + $buff .= sprintf('$xml_info->description = "%s";', $component_info->description); + $buff .= sprintf('$xml_info->version = "%s";', $component_info->version); + $buff .= sprintf('$xml_info->date = "%s";', $component_info->date); + $buff .= sprintf('$xml_info->homepage = "%s";', $component_info->homepage); + $buff .= sprintf('$xml_info->license = "%s";', $component_info->license); + $buff .= sprintf('$xml_info->license_link = "%s";', $component_info->license_link); + + // 작성자 정보 + if(!is_array($xml_doc->component->author)) $author_list[] = $xml_doc->component->author; + else $author_list = $xml_doc->component->author; + + for($i=0; $i < count($author_list); $i++) { + $buff .= sprintf('$xml_info->author['.$i.']->name = "%s";', $author_list[$i]->name->body); + $buff .= sprintf('$xml_info->author['.$i.']->email_address = "%s";', $author_list[$i]->attrs->email_address); + $buff .= sprintf('$xml_info->author['.$i.']->homepage = "%s";', $author_list[$i]->attrs->link); + } + + // history + if($xml_doc->component->history) { + if(!is_array($xml_doc->component->history)) $history_list[] = $xml_doc->component->history; + else $history_list = $xml_doc->component->history; + + for($i=0; $i < count($history_list); $i++) { + unset($obj); + sscanf($history_list[$i]->attrs->date, '%d-%d-%d', $date_obj->y, $date_obj->m, $date_obj->d); + $date = sprintf('%04d%02d%02d', $date_obj->y, $date_obj->m, $date_obj->d); + $buff .= sprintf('$xml_info->history['.$i.']->description = "%s";', $history_list[$i]->description->body); + $buff .= sprintf('$xml_info->history['.$i.']->version = "%s";', $history_list[$i]->attrs->version); + $buff .= sprintf('$xml_info->history['.$i.']->date = "%s";', $date); + + if($history_list[$i]->author) { + (!is_array($history_list[$i]->author)) ? $obj->author_list[] = $history_list[$i]->author : $obj->author_list = $history_list[$i]->author; + + for($j=0; $j < count($obj->author_list); $j++) { + $buff .= sprintf('$xml_info->history['.$i.']->author['.$j.']->name = "%s";', $obj->author_list[$j]->name->body); + $buff .= sprintf('$xml_info->history['.$i.']->author['.$j.']->email_address = "%s";', $obj->author_list[$j]->attrs->email_address); + $buff .= sprintf('$xml_info->history['.$i.']->author['.$j.']->homepage = "%s";', $obj->author_list[$j]->attrs->link); + } + } + + if($history_list[$i]->log) { + (!is_array($history_list[$i]->log)) ? $obj->log_list[] = $history_list[$i]->log : $obj->log_list = $history_list[$i]->log; + + for($j=0; $j < count($obj->log_list); $j++) { + $buff .= sprintf('$xml_info->history['.$i.']->logs['.$j.']->text = "%s";', $obj->log_list[$j]->body); + $buff .= sprintf('$xml_info->history['.$i.']->logs['.$j.']->link = "%s";', $obj->log_list[$j]->attrs->link); + } + } + } + } + + + } else { + sscanf($xml_doc->component->author->attrs->date, '%d. %d. %d', $date_obj->y, $date_obj->m, $date_obj->d); + $date = sprintf('%04d%02d%02d', $date_obj->y, $date_obj->m, $date_obj->d); + $xml_info->component_name = $component; + $xml_info->title = $xml_doc->component->title->body; + $xml_info->description = str_replace('\n', "\n", $xml_doc->component->author->description->body); + $xml_info->version = $xml_doc->component->attrs->version; + $xml_info->date = $date; + $xml_info->author->name = $xml_doc->component->author->name->body; + $xml_info->author->email_address = $xml_doc->component->author->attrs->email_address; + $xml_info->author->homepage = $xml_doc->component->author->attrs->link; + + $buff = 'component_name = "%s";', $xml_info->component_name); + $buff .= sprintf('$xml_info->title = "%s";', $xml_info->title); + $buff .= sprintf('$xml_info->description = "%s";', $xml_info->description); + $buff .= sprintf('$xml_info->version = "%s";', $xml_info->version); + $buff .= sprintf('$xml_info->date = "%s";', $xml_info->date); + $buff .= sprintf('$xml_info->author[0]->name = "%s";', $xml_info->author->name); + $buff .= sprintf('$xml_info->author[0]->email_address = "%s";', $xml_info->author->email_address); + $buff .= sprintf('$xml_info->author[0]->homepage = "%s";', $xml_info->author->homepage); + } + + // 추가 변수 정리 (에디터 컴포넌트에서는 text형만 가능) + $extra_vars = $xml_doc->component->extra_vars->var; + if($extra_vars) { + if(!is_array($extra_vars)) $extra_vars = array($extra_vars); + foreach($extra_vars as $key => $val) { + unset($obj); + $key = $val->attrs->name; + $title = $val->title->body; + $description = $val->description->body; + $xml_info->extra_vars->{$key}->title = $title; + $xml_info->extra_vars->{$key}->description = $description; + + $buff .= sprintf('$xml_info->extra_vars->%s->%s = "%s";', $key, 'title', $title); + $buff .= sprintf('$xml_info->extra_vars->%s->%s = "%s";', $key, 'description', $description); + } + } + + $buff .= ' ?>'; + + FileHandler::writeFile($cache_file, $buff, "w"); + + unset($xml_info); + include($cache_file); + return $xml_info; + } + } +?> diff --git a/modules/editor/editor.view.php b/modules/editor/editor.view.php index 8bf3584b0..f0ddaa973 100644 --- a/modules/editor/editor.view.php +++ b/modules/editor/editor.view.php @@ -1,138 +1,138 @@ -module_path."tpl/css/editor.css"); - - // 변수 정리 - $editor_sequence = Context::get('editor_sequence'); - $component = Context::get('component'); - - $site_module_info = Context::get('site_module_info'); - $site_srl = (int)$site_module_info->site_srl; - - // component 객체를 받음 - $oEditorModel = &getModel('editor'); - $oComponent = &$oEditorModel->getComponentObject($component, $editor_sequence, $site_srl); - if(!$oComponent->toBool()) { - Context::set('message', sprintf(Context::getLang('msg_component_is_not_founded'), $component)); - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('component_not_founded'); - } else { - - // 컴포넌트의 popup url을 출력하는 method실행후 결과를 받음 - $popup_content = $oComponent->getPopupContent(); - Context::set('popup_content', $popup_content); - - // 레이아웃을 popup_layout으로 설정 - $this->setLayoutFile('popup_layout'); - - // 템플릿 지정 - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('popup'); - } - } - - /** - * @brief 컴퍼넌트 정보 보기 - **/ - function dispEditorComponentInfo() { - $component_name = Context::get('component_name'); - - $site_module_info = Context::get('site_module_info'); - $site_srl = (int)$site_module_info->site_srl; - - $oEditorModel = &getModel('editor'); - $component = $oEditorModel->getComponent($component_name, $site_srl); - Context::set('component', $component); - - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('view_component'); - $this->setLayoutFile("popup_layout"); - } - - /** - * @brief 모듈의 추가 설정에서 에디터 설정을 하는 form 추가 - **/ - function triggerDispEditorAdditionSetup(&$obj) { - $current_module_srl = Context::get('module_srl'); - $current_module_srls = Context::get('module_srls'); - - if(!$current_module_srl && !$current_module_srls) { - // 선택된 모듈의 정보를 가져옴 - $current_module_info = Context::get('current_module_info'); - $current_module_srl = $current_module_info->module_srl; - if(!$current_module_srl) return new Object(); - } - - // 에디터 설정을 구함 - $oEditorModel = &getModel('editor'); - $editor_config = $oEditorModel->getEditorConfig($current_module_srl); - - Context::set('editor_config', $editor_config); - - $oModuleModel = &getModel('module'); - - // 에디터 스킨 목록을 구함 - $editor_skin_list = FileHandler::readDir(_XE_PATH_.'modules/editor/skins'); - Context::set('editor_skin_list', $editor_skin_list); - - $skin_info = $oModuleModel->loadSkinInfo($this->module_path,$editor_config->editor_skin); - Context::set('editor_colorset_list', $skin_info->colorset); - $skin_info = $oModuleModel->loadSkinInfo($this->module_path,$editor_config->comment_editor_skin); - Context::set('editor_comment_colorset_list', $skin_info->colorset); - - $contents = FileHandler::readDir(_XE_PATH_.'modules/editor/styles'); - for($i=0,$c=count($contents);$i<$c;$i++) { - $style = $contents[$i]; - $info = $oModuleModel->loadSkinInfo($this->module_path,$style,'styles'); - $content_style_list[$style]->title = $info->title; - } - Context::set('content_style_list', $content_style_list); - - - // 그룹 목록을 구함 - $oMemberModel = &getModel('member'); - $site_module_info = Context::get('site_module_info'); - $group_list = $oMemberModel->getGroups($site_module_info->site_srl); - Context::set('group_list', $group_list); - - // 템플릿 파일 지정 - $oTemplate = &TemplateHandler::getInstance(); - $tpl = $oTemplate->compile($this->module_path.'tpl', 'editor_module_config'); - $obj .= $tpl; - - return new Object(); - } - - - function dispEditorPreview(){ - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('preview'); - } - - function dispEditorSkinColorset(){ - $skin = Context::get('skin'); - $oModuleModel = &getModel('module'); - $skin_info = $oModuleModel->loadSkinInfo($this->module_path,$skin); - $colorset = $skin_info->colorset; - Context::set('colorset', $colorset); - } - } -?> +module_path."tpl/css/editor.css"); + + // 변수 정리 + $editor_sequence = Context::get('editor_sequence'); + $component = Context::get('component'); + + $site_module_info = Context::get('site_module_info'); + $site_srl = (int)$site_module_info->site_srl; + + // component 객체를 받음 + $oEditorModel = &getModel('editor'); + $oComponent = &$oEditorModel->getComponentObject($component, $editor_sequence, $site_srl); + if(!$oComponent->toBool()) { + Context::set('message', sprintf(Context::getLang('msg_component_is_not_founded'), $component)); + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('component_not_founded'); + } else { + + // 컴포넌트의 popup url을 출력하는 method실행후 결과를 받음 + $popup_content = $oComponent->getPopupContent(); + Context::set('popup_content', $popup_content); + + // 레이아웃을 popup_layout으로 설정 + $this->setLayoutFile('popup_layout'); + + // 템플릿 지정 + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('popup'); + } + } + + /** + * @brief 컴퍼넌트 정보 보기 + **/ + function dispEditorComponentInfo() { + $component_name = Context::get('component_name'); + + $site_module_info = Context::get('site_module_info'); + $site_srl = (int)$site_module_info->site_srl; + + $oEditorModel = &getModel('editor'); + $component = $oEditorModel->getComponent($component_name, $site_srl); + Context::set('component', $component); + + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('view_component'); + $this->setLayoutFile("popup_layout"); + } + + /** + * @brief 모듈의 추가 설정에서 에디터 설정을 하는 form 추가 + **/ + function triggerDispEditorAdditionSetup(&$obj) { + $current_module_srl = Context::get('module_srl'); + $current_module_srls = Context::get('module_srls'); + + if(!$current_module_srl && !$current_module_srls) { + // 선택된 모듈의 정보를 가져옴 + $current_module_info = Context::get('current_module_info'); + $current_module_srl = $current_module_info->module_srl; + if(!$current_module_srl) return new Object(); + } + + // 에디터 설정을 구함 + $oEditorModel = &getModel('editor'); + $editor_config = $oEditorModel->getEditorConfig($current_module_srl); + + Context::set('editor_config', $editor_config); + + $oModuleModel = &getModel('module'); + + // 에디터 스킨 목록을 구함 + $editor_skin_list = FileHandler::readDir(_XE_PATH_.'modules/editor/skins'); + Context::set('editor_skin_list', $editor_skin_list); + + $skin_info = $oModuleModel->loadSkinInfo($this->module_path,$editor_config->editor_skin); + Context::set('editor_colorset_list', $skin_info->colorset); + $skin_info = $oModuleModel->loadSkinInfo($this->module_path,$editor_config->comment_editor_skin); + Context::set('editor_comment_colorset_list', $skin_info->colorset); + + $contents = FileHandler::readDir(_XE_PATH_.'modules/editor/styles'); + for($i=0,$c=count($contents);$i<$c;$i++) { + $style = $contents[$i]; + $info = $oModuleModel->loadSkinInfo($this->module_path,$style,'styles'); + $content_style_list[$style]->title = $info->title; + } + Context::set('content_style_list', $content_style_list); + + + // 그룹 목록을 구함 + $oMemberModel = &getModel('member'); + $site_module_info = Context::get('site_module_info'); + $group_list = $oMemberModel->getGroups($site_module_info->site_srl); + Context::set('group_list', $group_list); + + // 템플릿 파일 지정 + $oTemplate = &TemplateHandler::getInstance(); + $tpl = $oTemplate->compile($this->module_path.'tpl', 'editor_module_config'); + $obj .= $tpl; + + return new Object(); + } + + + function dispEditorPreview(){ + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('preview'); + } + + function dispEditorSkinColorset(){ + $skin = Context::get('skin'); + $oModuleModel = &getModel('module'); + $skin_info = $oModuleModel->loadSkinInfo($this->module_path,$skin); + $colorset = $skin_info->colorset; + Context::set('colorset', $colorset); + } + } +?> diff --git a/modules/editor/skins/dreditor/css/button.css b/modules/editor/skins/dreditor/css/button.css index 50315c21c..76d674d3d 100644 --- a/modules/editor/skins/dreditor/css/button.css +++ b/modules/editor/skins/dreditor/css/button.css @@ -1,81 +1,81 @@ -@charset "utf-8"; -/* NHN (developers@xpressengine.com) */ - -/* -- Button Gray Style -- */ -.buttonGray, -.buttonGray button{ position:relative; border:0; margin:0; display:inline-block; color:#000; font-family:Tahoma, Sans-serif; cursor:pointer; text-decoration:none !important; white-space:nowrap; vertical-align:middle; background-color:transparent; background-image:url(../img/buttonGray.gif) !important; background-repeat:no-repeat;} -.buttonGray{ margin-right:2px;} -.buttonGray button{ left:2px; overflow:visible;} - -/* Medium Size */ -.buttonGray.medium { background-position:left -30px;} -.buttonGray.medium button{ height:24px; padding:0 10px 0 8px; *padding:0 5px 0 3px; font:12px/25px Sans-serif; background-position:right -30px; _top:-1px;} - -/* Strong Button */ -.buttonGray.strong * { font-weight:bold !important;} - -/* Icon Add */ -.buttonGray .icon { position:relative; margin-right:5px; vertical-align:middle;} - -/* Button Reset */ -.buttonDrEditor, -.buttonDrEditor a, -.buttonDrEditor button, -.buttonDrEditor input { position:relative; margin:0; display:inline-block; text-decoration:none !important; border:0; font-size:12px; font-family:Tahoma, Sans-serif; white-space:nowrap; background:url(../img/buttonWhite.gif) no-repeat; vertical-align:middle; overflow:visible; color:#333;} -.buttonDrEditor { height:23px; padding:0; margin-right:2px; background-position:left top;} -.buttonDrEditor a, -.buttonDrEditor button, -.buttonDrEditor input{ left:2px; *vertical-align:top; cursor:pointer;} - -/* Button Size */ -.buttonDrEditor.large { height:29px; background-position:left -30px; } -.buttonDrEditor.xLarge { height:35px; background-position:left -65px; } -.buttonDrEditor.small { height:18px; background-position:left -107px; } -.buttonDrEditor a, -.buttonDrEditor button, -.buttonDrEditor input { height:23px; padding:0 10px 0 8px; font-size:12px; line-height:23px; background-position:right top;} -.buttonDrEditor.large a, -.buttonDrEditor.large button, -.buttonDrEditor.large input { height:30px; padding:0 10px 0 8px; font-size:16px; line-height:29px; background-position:right -30px;} -.buttonDrEditor.xLarge a, -.buttonDrEditor.xLarge button, -.buttonDrEditor.xLarge input { height:35px; padding:0 10px 0 8px; font-size:20px; line-height:35px; background-position:right -65px;} -.buttonDrEditor.small a, -.buttonDrEditor.small button, -.buttonDrEditor.small input { height:18px; padding:0 6px 0 4px; font-size:11px; line-height:18px; background-position:right -107px;} - -/* Button Text Color */ -.buttonDrEditor *:hover, -.buttonDrEditor *:active, -.buttonDrEditor *:focus{ color:#690;} -.buttonDrEditor.green, -.buttonDrEditor.green a, -.buttonDrEditor.green button, -.buttonDrEditor.green input { background-image:url(../img/buttonGreen.gif); color:#fff;} -.buttonDrEditor.green *:hover, -.buttonDrEditor.green *:active, -.buttonDrEditor.green *:focus{ color:#ff0;} -.buttonDrEditor.black, -.buttonDrEditor.black a, -.buttonDrEditor.black button, -.buttonDrEditor.black input { background-image:url(../img/buttonBlack.gif); color:#fff;} -.buttonDrEditor.black *:hover, -.buttonDrEditor.black *:active, -.buttonDrEditor.black *:focus{ color:#ff0;} -.buttonDrEditor.red, -.buttonDrEditor.red a, -.buttonDrEditor.red button, -.buttonDrEditor.red input { background-image:url(../img/buttonRed.gif); color:#fff;} -.buttonDrEditor.red *:hover, -.buttonDrEditor.red *:active, -.buttonDrEditor.red *:focus{ color:#ff0;} -.buttonDrEditor.blue, -.buttonDrEditor.blue a, -.buttonDrEditor.blue button, -.buttonDrEditor.blue input { background-image:url(../img/buttonBlue.gif); color:#fff;} -.buttonDrEditor.blue *:hover, -.buttonDrEditor.blue *:active, -.buttonDrEditor.blue *:focus{ color:#ff0;} - -/* Button Text Strong */ -.buttonDrEditor.strong * { font-weight:bold !important;} +@charset "utf-8"; +/* NHN (developers@xpressengine.com) */ + +/* -- Button Gray Style -- */ +.buttonGray, +.buttonGray button{ position:relative; border:0; margin:0; display:inline-block; color:#000; font-family:Tahoma, Sans-serif; cursor:pointer; text-decoration:none !important; white-space:nowrap; vertical-align:middle; background-color:transparent; background-image:url(../img/buttonGray.gif) !important; background-repeat:no-repeat;} +.buttonGray{ margin-right:2px;} +.buttonGray button{ left:2px; overflow:visible;} + +/* Medium Size */ +.buttonGray.medium { background-position:left -30px;} +.buttonGray.medium button{ height:24px; padding:0 10px 0 8px; *padding:0 5px 0 3px; font:12px/25px Sans-serif; background-position:right -30px; _top:-1px;} + +/* Strong Button */ +.buttonGray.strong * { font-weight:bold !important;} + +/* Icon Add */ +.buttonGray .icon { position:relative; margin-right:5px; vertical-align:middle;} + +/* Button Reset */ +.buttonDrEditor, +.buttonDrEditor a, +.buttonDrEditor button, +.buttonDrEditor input { position:relative; margin:0; display:inline-block; text-decoration:none !important; border:0; font-size:12px; font-family:Tahoma, Sans-serif; white-space:nowrap; background:url(../img/buttonWhite.gif) no-repeat; vertical-align:middle; overflow:visible; color:#333;} +.buttonDrEditor { height:23px; padding:0; margin-right:2px; background-position:left top;} +.buttonDrEditor a, +.buttonDrEditor button, +.buttonDrEditor input{ left:2px; *vertical-align:top; cursor:pointer;} + +/* Button Size */ +.buttonDrEditor.large { height:29px; background-position:left -30px; } +.buttonDrEditor.xLarge { height:35px; background-position:left -65px; } +.buttonDrEditor.small { height:18px; background-position:left -107px; } +.buttonDrEditor a, +.buttonDrEditor button, +.buttonDrEditor input { height:23px; padding:0 10px 0 8px; font-size:12px; line-height:23px; background-position:right top;} +.buttonDrEditor.large a, +.buttonDrEditor.large button, +.buttonDrEditor.large input { height:30px; padding:0 10px 0 8px; font-size:16px; line-height:29px; background-position:right -30px;} +.buttonDrEditor.xLarge a, +.buttonDrEditor.xLarge button, +.buttonDrEditor.xLarge input { height:35px; padding:0 10px 0 8px; font-size:20px; line-height:35px; background-position:right -65px;} +.buttonDrEditor.small a, +.buttonDrEditor.small button, +.buttonDrEditor.small input { height:18px; padding:0 6px 0 4px; font-size:11px; line-height:18px; background-position:right -107px;} + +/* Button Text Color */ +.buttonDrEditor *:hover, +.buttonDrEditor *:active, +.buttonDrEditor *:focus{ color:#690;} +.buttonDrEditor.green, +.buttonDrEditor.green a, +.buttonDrEditor.green button, +.buttonDrEditor.green input { background-image:url(../img/buttonGreen.gif); color:#fff;} +.buttonDrEditor.green *:hover, +.buttonDrEditor.green *:active, +.buttonDrEditor.green *:focus{ color:#ff0;} +.buttonDrEditor.black, +.buttonDrEditor.black a, +.buttonDrEditor.black button, +.buttonDrEditor.black input { background-image:url(../img/buttonBlack.gif); color:#fff;} +.buttonDrEditor.black *:hover, +.buttonDrEditor.black *:active, +.buttonDrEditor.black *:focus{ color:#ff0;} +.buttonDrEditor.red, +.buttonDrEditor.red a, +.buttonDrEditor.red button, +.buttonDrEditor.red input { background-image:url(../img/buttonRed.gif); color:#fff;} +.buttonDrEditor.red *:hover, +.buttonDrEditor.red *:active, +.buttonDrEditor.red *:focus{ color:#ff0;} +.buttonDrEditor.blue, +.buttonDrEditor.blue a, +.buttonDrEditor.blue button, +.buttonDrEditor.blue input { background-image:url(../img/buttonBlue.gif); color:#fff;} +.buttonDrEditor.blue *:hover, +.buttonDrEditor.blue *:active, +.buttonDrEditor.blue *:focus{ color:#ff0;} + +/* Button Text Strong */ +.buttonDrEditor.strong * { font-weight:bold !important;} diff --git a/modules/editor/skins/dreditor/css/dreditor.css b/modules/editor/skins/dreditor/css/dreditor.css index 07aceca58..c600d0b30 100644 --- a/modules/editor/skins/dreditor/css/dreditor.css +++ b/modules/editor/skins/dreditor/css/dreditor.css @@ -1,348 +1,348 @@ -@charset "utf-8"; -/* NHN (developers@xpressengine.com) */ - -/* Textyle Editor */ -.textyleEditor{ position:relative; *zoom:1; margin:0 0 1em 0;} -.textyleEditor:after{ content:""; display:block; clear:both;} -.textyleEditor .editorContainer{ position:relative; width:100%; display:table; table-layout:fixed;} -.textyleEditor .editorContainer .editorArea{ opacity:1; filter:alpha(opacity=100);} -.textyleEditor .editorContainer .writeArea{ position:relative; *zoom:1;} - -/* Writing Toolbar */ -.wToolbarContainer{ position:relative; margin:20px 0 40px 0; height:62px; overflow:hidden; z-index:1000; _zoom:1;} -.wToolbarContainer.more{ height:auto;} -.wToolbar{ position:relative; height:62px; margin:0 10px; *zoom:1; background-image:url(../img/bgWritingToolbarCenter.gif); background-repeat:repeat-x; } -.wToolbarContainer.more .wToolbar{ height:auto; padding:0 0 5px 0; background-position:0 bottom; border-top:1px solid #bec2ca;} -.wToolbar .cap{ position:absolute; top:0; height:62px; background-repeat:no-repeat; font-size:0; line-height:0; background:url(../img/bgWritingToolbar.gif) no-repeat; z-index:1;} -.wToolbar .top{ display:none; position:absolute; top:-1px; width:10px; height:7px; background:url(../img/bgWritingToolbarMore.gif) no-repeat; z-index:2;} -.wToolbarContainer.more .cap{ height:100%; _top:auto; _bottom:0; _height:300px; background:url(../img/bgWritingToolbarMore.gif) no-repeat;} -.wToolbarContainer.more .top{ display:block;} -.wToolbar .capLeft{ width:10px; left:-10px; background-position:left top;} -.wToolbar .topLeft{ left:-10px; background-position:left top;} -.wToolbarContainer.more .cap.capLeft{ background-position:left bottom;} -.wToolbar .capRight{ width:10px; right:-10px; background-position:right top;} -.wToolbar .topRight{ right:-10px; background-position:right top;} -.wToolbarContainer.more .capRight{ background-position:right bottom;} - -.wToolbar ul{ position:relative; margin:0 70px 0 0; padding:0; *zoom:1; height:58px; z-index:2;} -.wToolbarContainer.more ul{ height:auto; _height:58px; background:url(../img/hrToolbarMore.gif);} -.wToolbar ul:after{ content:""; display:block; clear:both;} -.wToolbar li{ position:relative; float:left; list-style:none; margin-bottom:4px; width:11.1%; *width:11%; _margin-top:0; _margin-right:-1px;} -.wToolbar li button{ position:relative; padding:0; width:100%; height:57px; *height:59px; border:0; background:transparent; cursor:pointer; font-size:11px; color:#44506a; background-image:url(../img/iconWritingToolbar.gif); background-repeat:no-repeat;} -.wToolbar li button .tx{ display:inline-block; padding-top:37px; height:20px;} -.wToolbar li.more{ float:none; position:absolute; top:1px; right:-70px; width:60px; background:url(../img/vrToolbarMore.gif) repeat-y; _zoom:1;} -.wToolbar li.more button{ width:60px;} -.wToolbarContainer.more li{ margin-bottom:0;} -.wToolbarContainer.more li.more{ height:100%;} -.wToolbarContainer.more li.more button{ height:100%; _height:114px; background:url(../img/iconWritingToolbarFolder.gif) no-repeat center !important;} -.wToolbarContainer.more li.more button .nx{ top:0;} -.wToolbar li.hover button{ background-color:#bfc3cb;} - -.wToolbar li.hx button{ background-position:center top;} -.wToolbar li.txt button{ background-position:center -100px;} -.wToolbar li.link button{ background-position:center -200px;} -.wToolbar li.list button{ background-position:center -300px;} -.wToolbar li.quote button{ background-position:center -400px;} -.wToolbar li.img button{ background-position:center -500px;} -.wToolbar li.movie button{ background-position:center -600px;} -.wToolbar li.file button{ background-position:center -700px;} -.wToolbar li.hr button{ background-position:center -800px;} -.wToolbar li.index button{ background-position:center -900px;} -.wToolbar li.material button{ background-position:center -1000px;} -.wToolbar li.help button{ background-position:center -1100px;} -.wToolbar li.more button{ background-position:center -1187px;} - -.wToolbar li .dragable{ position:absolute; display:none; bottom:38px; right:0; padding:0; border:0; width:20px; height:20px; overflow:hidden; background:url(../img/iconMovable.gif) no-repeat center center !important; cursor:move; font-size:0; line-height:0; text-indent:-200%;} -.wToolbarContainer.more li.hover .dragable{ _display:block;} -.wToolbarContainer.more li:hover .dragable{ display:block;} -.wToolbar li .nx{ position:absolute; text-align:center; top:8px; left:50%; font:bold 10px Tahoma, Geneva, sans-serif; color:#fff; width:18px; height:18px; line-height:16px; opacity:.7; background:url(../img/bgShortcut.png) no-repeat center top; _background:none; _filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='./modules/editor/skins/dreditor/img/bgShortcut.png', sizingMethod='crop');} - -/* Writing Area + Material Area */ -.wArea, -.mArea{ display:none; position:relative; *zoom:1; padding:20px; margin:0;} -.wArea{ background:#f5f5f5; border:1px solid #e9e9e9;} -.mArea{ background:url(../img/bgChess76.gif); border:1px solid #666;} -.mArea{ margin:20px 0;} -.wArea.open, -.mArea.open{ display:block;} -.wArea .cap, -.mArea .cap{ position:absolute; width:10px; height:10px; background-repeat:no-repeat; font-size:0; line-height:0; overflow:hidden;} -.wArea .cap{ background-image:url(../img/bgRouningF5.gif);} -.mArea .cap{ background-image:url(../img/bgRouning76.gif);} -.wArea .cap.capTL, -.mArea .cap.capTL{ top:-1px; left:-1px; background-position:left top;} -.wArea .cap.capTR, -.mArea .cap.capTR{ top:-1px; right:-1px; background-position:right top;} -.wArea .cap.capBL, -.mArea .cap.capBL{ bottom:-1px; left:-1px; background-position:left bottom;} -.wArea .cap.capBR, -.mArea .cap.capBR{ bottom:-1px; right:-1px; background-position:right bottom;} -.wArea .h4, -.mArea .h4{ font-size:16px; margin:0 0 10px 0;} -.wArea .h4{ color:#555;} -.mArea .h4{ color:#fff;} -.mArea .controls{ position:absolute; top:20px; right:20px;} - -/* Writing Area */ -.wArea .buttonArea{ position:relative; text-align:left; *zoom:1;} -.wArea .buttonArea .buttonGray button{ _top:0;} -.wArea .buttonArea .info{ display:inline; padding:0 0 0 15px; color:#777;} -.wArea .inputTitle{ width:98%; border:1px solid #ddd; background:#fff url(../img/bgInputText.gif) no-repeat; color:#767676; padding:6px 0 0 10px; height:21px; font-size:14px; margin-bottom:10px;} -.wArea .inputLink{ width:98%; border:1px solid #ddd; background:#fff url(../img/bgInputText.gif) no-repeat; color:#767676; padding:6px 0 0 10px; height:21px; font-size:11px; margin-bottom:10px;} -.wArea .inputText{ width:98%; border:1px solid #ddd; background:#fff url(../img/bgInputText.gif) no-repeat; color:#767676; padding:6px 0 0 10px; height:21px; font-size:12px; margin-bottom:10px;} -.wArea .inputFile{ width:100%; border:1px solid #ddd; background:#fff url(../img/bgInputText.gif) no-repeat; color:#767676; padding:6px 0 0 10px; height:29px; font-size:12px; margin-bottom:10px;} -.wArea .inputTextarea{ width:98%; border:1px solid #ddd; background:#fff url(../img/bgInputText.gif) no-repeat; color:#767676; padding:10px 0 0 10px; height:150px; font-size:12px; line-height:1.5; margin-bottom:10px;} -.wArea .inputRadio{ width:13px; height:13px; vertical-align:middle;} -.wArea .hr{ border-top:1px solid #e6e6e6; border-bottom:1px solid #fff; font-size:0; line-height:0; overflow:hidden; height:0; margin:15px -20px;} - -/* Material Area */ -.mArea .reload{ position:absolute; top:24px; right:40px; width:15px; height:16px; padding:0; cursor:pointer; border:0; *margin:0 5px 0 0; background:transparent url(../img/buttonRefresh.gif) no-repeat; vertical-align:middle;} -.mArea .reload span{ position:absolute; width:0; height:0; font-size:0; line-height:0; overflow:hidden; z-index:-1; visibility:hidden;} -.mArea .close{ position:absolute; top:24px; right:20px; width:15px; height:16px; padding:0; cursor:pointer; border:0; *margin:0 5px 0 0; background:transparent url(../img/buttonClose.gif) no-repeat; vertical-align:middle;} -.mArea .close span{ position:absolute; width:0; height:0; font-size:0; line-height:0; overflow:hidden; z-index:-1; visibility:hidden;} -.mArea .noData{ position:relative; border-top:1px solid #ddd; border-bottom:1px solid #ddd; background:#fff; padding:10px 20px;} -.mArea dl{ position:relative; background:#fff;} -.mArea dt{ position:relative; padding:7px 15px; font-weight:bold; color:#fff; background:#555; border-top:1px solid #444;} -.mArea dd{ margin:0 15px; padding:5px 0;} -.mArea dd .buttonDrEditor{ position:absolute; top:8px; right:10px;} -.mArea .eArea{ border:0; padding:0;} - -.mArea .paginate{ position:relative; width:100px; margin:0 auto; text-align:center; padding:0; font-size:12px; color:#fff; *zoom:1;} -.mArea .paginate:after{ content:""; display:block; clear:both;} -.mArea .paginate button{ width:17px; height:17px; padding:0; background:transparent url(../img/buttonPaginate.gif) no-repeat 0 0; cursor:pointer; border:0; vertical-align:middle;} -.mArea .paginate button span{ position:absolute; width:0; height:0; font-size:0; line-height:0; overflow:hidden; visibility:hidden; z-index:-1;} -.mArea .paginate .prev{ float:left; background-position:left top;} -.mArea .paginate .next{ float:right; background-position:right top;} - -/* Writing Area Blank */ -.editorArea .wArea { display:block;} -.wArea.blank{ padding:15px 30px; margin:0;} -.wArea.blank dt{ font-size:12px; font-weight:bold; color:#333;} -.wArea.blank dd{ margin:0 0 5px 0; color:#767676;} -.wArea.blank .drEditorBugReport{ position:absolute; margin:0 !important; top:20px; right:30px;} - -/* Writing Area Hx */ -.wArea.hx ul{ margin:0 0 5px 0; padding:0; list-style:none;} -.wArea.hx li{ display:inline !important; font-weight:bold !important; color:#333 !important;} -.wArea.hx li label{ margin-right:30px;} -.wArea.hx .inputTitle{ font-weight:bold !important;} -.wArea.hx li.h3, -.wArea.hx .inputTitle.h3{ font-size:18px !important; height:28px;} -.wArea.hx li.h4, -.wArea.hx .inputTitle.h4{ font-size:16px !important; height:26px;} -.wArea.hx li.h5, -.wArea.hx .inputTitle.h5{ font-size:13px !important; height:23px;} - -/* Writing Area List */ -.wArea.list .toolbar{ border:1px solid #ddd; list-style:none; margin:0 0 -1px 0; padding:0; background:#fafafa; padding:6px 20px;} -.wArea.list .toolbar li{ display:inline; margin-right:5px;} -.wArea.list .toolbar li button{ position:relative; width:23px; height:22px; padding:0; border:0; cursor:pointer; background-image:url(../img/buttonListToolbar.gif); background-repeat:no-repeat;} -.wArea.list .toolbar li button:hover, -.wArea.list .toolbar li button:active, -.wArea.list .toolbar li button:focus{ border:1px solid #ddd;} -.wArea.list .toolbar li button.type_disc{ background-position:center 0;} -.wArea.list .toolbar li button.type_circle{ background-position:center -30px;} -.wArea.list .toolbar li button.type_square{ background-position:center -60px;} -.wArea.list .toolbar li button.type_decimal{ background-position:center -90px;} -.wArea.list .toolbar li button.type_lower-alpha{ background-position:center -120px;} -.wArea.list .toolbar li button.type_upper-alpha{ background-position:center -150px;} -.wArea.list .toolbar li button.type_lower-roman{ background-position:center -180px;} -.wArea.list .toolbar li button.type_upper-roman{ background-position:center -210px;} -.wArea.list .toolbar li button span{ position:absolute; width:0; height:0; font-size:0; line-height:0; overflow:hidden; visibility:hidden;} - -.wArea.list .listArea{ padding:1em 0; margin-bottom:1em; background:#fff url(../img/bgInputText.gif) no-repeat; border:1px solid #ddd;} -.wArea.list .listArea ul{ border:0;} -.wArea.list .listArea input{ border:0; border-bottom:1px solid #ddd; background:transparent; width:96%; padding:3px 4px;} - -/* Writing Area Image */ -.wArea.img .image{ position:relative; margin-bottom:10px; background:#fff; padding:0; _width:100%; overflow:hidden;} -.wArea.img .image img{ max-width:100%;} -.wArea.img .uploading{ display:none; padding:0 0 0 20px; background:url(../img/iconLoading.gif) no-repeat left center;} -.wArea.img .uploading button{ border:2px solid #ccc; background:#eee; cursor:pointer; font-size:11px; font-weight:bold; padding:0; overflow:visible; vertical-align:middle; margin:0 10px;} -.wArea.img .info{ font-size:11px; color:#737fa1; margin:0;} -.wArea.img .resize{ display:none;} -.wArea.img .resize.open{ display:block;} -.wArea.img .resize dl *{ vertical-align:middle;} -.wArea.img .resize dt{ display:inline; font-weight:bold;} -.wArea.img .resize dd{ display:inline; margin:0;} -.wArea.img .resize .width{ width:60px; text-align:right; padding:1px 4px; height:16px;} -.wArea.img .resize .width.original{ background:#d4d0c8;} -.wArea.img .resize .resizeInfo{ margin:0 0 0 1em;} -.wArea.img .resize .resizeError{ display:none; padding:.5em 3.5em; margin:1em 6px 1em 0; color:#ff6633; background:#fff url(../img/iconCheckSmall.gif) no-repeat 2em center;; border:1px solid #ddd;} -.wArea.img .resize .resizeError.open{ display:block;} -.wArea.img .align{ display:none;} -.wArea.img .align dt{ display:inline; font-weight:bold;} -.wArea.img .align dd{ display:inline; margin:0;} - -/* Writing Area File */ -.wArea.file .buttonFileUpload, -.wArea.file .buttonFileUpload button{ position:relative; display:inline-block; height:39px; background-color:transparent; background-image:url(../img/buttonUpload.gif); background-repeat:no-repeat; cursor:pointer;} -.wArea.file .buttonFileUpload{ background-position:left top;} -.wArea.file .buttonFileUpload button{ left:7px; border:0; padding:0 15px 0 25px; background-position:right top; font-size:12px; font-weight:bold; color:#fff; line-height:39px; overflow:visible;} -.wArea.file .buttonFileUpload .swfupload{ margin:0 !important; cursor:pointer;} -.wArea.file .info{ font-size:11px; color:#737fa1;} -.wArea.file .info .help{ position:relative; font-size:11px; border:0; background:none; padding:0; cursor:pointer; *zoom:1; color:#f66; overflow:visible;} -.wArea.file .inputFile{ display:none;} -.wArea.file .inputFile.open{ display:block;} -.wArea.file dl{ margin:0; padding:0;} -.wArea.file dd{ font-size:11px; margin-bottom:3px; margin:0;} -.wArea.file dd strong{ margin-right:15px; color:#555; font-weight:normal;} -.wArea.file dd em{ color:#767676; font-style:normal; margin-right:15px;} -.wArea.file dd .buttonDelete{ border:0; padding:0; width:17px; height:17px; vertical-align:middle; cursor:pointer; background:url(../img/buttonTableDataX.gif) no-repeat center center;} -.wArea.file dd .buttonDelete span{ position:absolute; width:0; height:0; overflow:hidden; font-size:0; line-height:0; z-index:-1; visibility:hidden;} -.wArea.file .summary{ text-align:right; font-size:11px;} -.wArea.file .summary{ color:#555;} -.wArea.file .summary em{ color:#767676; font-style:normal; margin-left:10px;} - -/* Writing Area Hr */ -.wArea.hr ul{ margin:0 0 20px 0; padding:0; list-style:none; font-size:12px; color:#555; *zoom:1;} -.wArea.hr li{ position:relative; margin-bottom:10px; *zoom:1;} -.wArea.hr li label{ position:relative; background:#f5f5f5; padding:0 15px 0 30px; margin-left:-30px; z-index:1; display:none;} -.wArea.hr li .inputRadio{ position:relative; z-index:10; display:none;} -.wArea.hr .inputToggle, -.wArea.hr .inputContinue{ position:absolute; top:0; border:1px solid #ddd; font-size:12px; color:#767676; width:150px; padding:3px 4px; height:14px; text-align:right; background-image:url(../img/bgInputText.gif); background-repeat:no-repeat;} -.wArea.hr .inputShow{ right:170px;} -.wArea.hr .inputHide, -.wArea.hr .inputContinue{ right:0;} -.wArea.hr .hRule{ position:absolute; width:100%; top:50%; left:0; display:block; border-top:1px solid #e6e6e6; border-bottom:1px solid #fff; font-size:0; line-height:0; overflow:hidden; height:0;} - -/* Edit Area */ -.eArea{ position:relative; padding:0 20px; margin:0; font-size:12px; border:1px solid #fff; overflow:visible !important; _zoom:1;} -.eArea.xe_dr_hr{ padding-top:1em; padding-bottom:1em;} -.eArea a{ color:#648AB9;} -.eArea button.holder{ position:absolute; left:-2000px; top:0px; } -.eArea .eTool{ display:none;} -.eArea .eFocusTrigger{ position:absolute; top:0; left:0; font-size:0; line-height:0; border:0; background:transparent; width:1px; height:1px; overflow:hidden; opacity:0; filter:alpha(opacity=0);} -.eArea .eFocusTrigger:focus{ border:1px solid;} -.eArea .del{ display:none; position:absolute; top:0; right:20px; border:0; padding:0; width:20px; height:20px; cursor:pointer; background:transparent url(../img/buttonTableDataX.gif) no-repeat center;} -.eArea .del span{position:absolute; width:0; height:0; overflow:hidden; font-size:0; line-height:0; z-index:-1; visibility:hidden;} - -.eArea.xe_dr_img p{ overflow:hidden; width:100%;} -.eArea.xe_dr_img p img{ *padding:1em 0;} - -.eFocus{ border:1px solid #d8d8de; z-index:999; background:#f9f9f9;} -.eArea .cap{ display:none;} -.eFocus .cap{ display:none; *display:block; position:absolute; width:10px; height:10px; background-repeat:no-repeat; font-size:0; line-height:0; overflow:hidden;} -.eFocus .cap.capTL{ top:-1px; left:-1px; background-position:left top;} -.eFocus .cap.capTR{ top:-1px; right:-1px; background-position:right top;} -.eFocus .cap.capBL{ bottom:-1px; left:-1px; background-position:left bottom;} -.eFocus .cap.capBR{ bottom:-1px; right:-1px; background-position:right bottom;} - -.eFocus .eTool{ display:block; height:24px; position:absolute !important; z-index:99; top:-24px !important; left:-1px !important; white-space:nowrap; margin:0 0 0 2px !important; padding:0 5px 0 0 !important; border:0 !important; background:url(../img/bgEtool.gif) no-repeat right top !important;} -.eFocus .eTool li{ position:relative; left:-2px; display:block; float:left; height:22px; padding:2px 3px 0 5px; background:url(../img/vrContentNavigation.gif) no-repeat left center;} -.eFocus .eTool li.edit{ background:url(../img/bgEtool.gif) no-repeat left top;} -.eFocus .eTool li button{ border:0; padding:0; overflow:visible; cursor:pointer; background-color:transparent; font-size:11px; vertical-align:middle;} -.eFocus .eTool li.move button, -.eFocus .eTool li.delete button{ overflow:hidden; width:17px; height:17px; background-position:center center; background-repeat:no-repeat;} -.eFocus .eTool li.move button{ background-image:url(../img/iconMovable.gif); cursor:move;} -.eFocus .eTool li.delete button{ background-image:url(../img/buttonWasteBox.gif);} -.eFocus .eTool li.move button span, -.eFocus .eTool li.delete button span{ position:absolute; width:0; height:0; overflow:hidden; font-size:0; line-height:0; z-index:-1; visibility:hidden;} -.eFocus .del{ display:block;} - -/* txEditor */ -.txEditor{ position:relative; width:98%; padding-right:10px; margin-bottom:10px; border:1px solid #ddd; *zoom:1; background:#fff;} -.txEditor .toolbar{ position:relative; z-index:10; margin:0 -10px 0 0; padding:6px 10px; list-style:none; *zoom:1; background:#fafafa; border-bottom:1px solid #ddd;} -.txEditor .toolbar:after{ content:""; display:block; clear:both;} -.txEditor .toolbar li{ position:relative; float:left; margin-right:5px;} -.txEditor .toolbar li button{ border:0; padding:0; height:22px; background-color:transparent; background-image:url(../img/buttonEditorToolbar.gif); background-repeat:no-repeat; cursor:pointer; vertical-align:middle;} -.txEditor .toolbar li button:hover, -.txEditor .toolbar li button:active, -.txEditor .toolbar li button:focus, -.txEditor .toolbar li button.active{ border:1px solid #ddd;} -.txEditor .toolbar li button span{ position:absolute; width:0; height:0; overflow:hidden; font-size:0; line-height:0; z-index:-1; visibility:hidden;} -.txEditor .toolbar li select{ font-size:12px; vertical-align:middle; height:21px;} -.txEditor .toolbar li.undo button{ width:23px; background-position:center -210px;} -.txEditor .toolbar li.redo button{ width:23px; background-position:center -240px;} -.txEditor .toolbar li.strong button{ width:23px; background-position:center 0;} -.txEditor .toolbar li.em button{ width:23px; background-position:center -30px;} -.txEditor .toolbar li.underline button{ width:23px; background-position:center -60px;} -.txEditor .toolbar li.del button{ width:23px; background-position:center -90px;} -.txEditor .toolbar li.vRule{ padding-left:10px; margin:0 5px; background:url(../img/vrEditorToolbar.gif) no-repeat left center;} -.txEditor .toolbar li.aHref button{ width:23px; background-position:center -120px;} -.txEditor .toolbar li.fSize{ margin-right:5px;} -.txEditor .toolbar li.fColor{ margin-right:5px; z-index:2;} -.txEditor .toolbar li.fColor button{ width:28px; background-position:center -150px;} -.txEditor .toolbar li.bgColor{ margin-right:5px; z-index:1;} -.txEditor .toolbar li.bgColor button{ width:28px; background-position:center -180px;} -.txEditor .toolbar li.left button{ width:23px; background-position:center -270px;} -.txEditor .toolbar li.center button{ width:23px; background-position:center -300px;} -.txEditor .toolbar li.right button{ width:23px; background-position:center -330px;} -.txEditor .toolbar li.justify button{ width:23px; background-position:center -360px;} -.txEditor .toolbar li.character button{ width:23px; background-position:center -390px;} -.txEditor .toolbar li.list button{ width:23px; background-image:url(../img/buttonListToolbar.gif); background-repeat:no-repeat;} -.txEditor .toolbar li.disc button{ background-position:center 0;} -.txEditor .toolbar li.circle button{ background-position:center -30px;} -.txEditor .toolbar li.square button{ background-position:center -60px;} -.txEditor .toolbar li.decimal button{ background-position:center -90px;} -.txEditor .toolbar li.alphaLower button{ background-position:center -120px;} -.txEditor .toolbar li.alphaUpper button{ background-position:center -150px;} -.txEditor .toolbar li.romanLower button{ background-position:center -180px;} -.txEditor .toolbar li.romanUpper button{ background-position:center -210px;} -.txEditor .toolbar li .uri{ display:none; position:absolute; left:10px; top:25px; padding:15px 20px; border:1px solid #ddd; background:#fff; *zoom:1; *white-space:nowrap;} -.txEditor .toolbar li .uri h3{ font-size:12px; margin:0 0 .5em 0;} -.txEditor .toolbar li .uri .link{ border:1px solid #ccc; padding:3px 4px; height:14px; font-size:12px; width:200px; font-size:11px; color:#666;} -.txEditor .toolbar li .uri p{ margin:.5em 0;} -.txEditor .toolbar li .uri p input{ width:13px; height:13px; margin:0 3px 0 0; vertical-align:middle;} -.txEditor .toolbar li .uri .btn_area{ text-align:center;} -.txEditor .toolbar li .uri .btn_area .buttonGray, -.txEditor .toolbar li .uri .btn_area .buttonGray button{ background-image:url(../img/buttonGray.gif);} -.txEditor .toolbar li .uri .btn_area .buttonGray{ background-position:left top;} -.txEditor .toolbar li .uri .btn_area .buttonGray button{ background-position:right top; line-height:18px; border:0 !important; width:auto; padding:0 6px 0 4px;} -.txEditor .toolbar li .palette{ display:none; width:211px; position:absolute; left:0; top:25px; padding:8px 0 7px 8px; margin:0; list-style:none; border:1px solid #ddd; background:#fff; *zoom:1;} -.txEditor .toolbar li .palette:after{ content:""; display:block; clear:both;} -.txEditor .toolbar li .palette.open{ display:block;} -.txEditor .toolbar li .palette li{ float:left; margin:0 1px 1px 0; font-size:0; line-height:0;} -.txEditor .toolbar li .palette button{ position:relative; overflow:hidden; width:11px; height:11px;} -.txEditor .toolbar li .palette button span{ position:absolute; width:0; height:0; overflow:hidden; font-size:0; line-height:0; z-index:-1; visibility:hidden;} -.txEditor .inputRichText{ position:relative; margin-right:-10px; position:relative; *zoom:1; z-index:1; padding:3px 0 3px 3px; background-image:url(../img/bgInputText.gif); background-repeat:no-repeat; background-position:0 0;} -.txEditor .inputRichText iframe{ width:100%; height:136px; border:0; overflow-x:hidden;} -.txEditor .resizeVertical{ position:relative; margin-right:-10px; border-top:1px solid #ddd; height:10px; background:url(../img/buttonResizeVertical.gif) no-repeat center center; *zoom:1; font-size:0; line-height:0;} -.txEditor .resizeVertical button{ width:100%; height:10px; border:0; margin:0; padding:0; background:transparent; cursor:n-resize; vertical-align:middle;} -.txEditor .resizeVertical button span{ position:absolute; width:0; height:0; font-size:0; line-height:0; overflow:hidden; visibility:hidden; z-index:-1;} - -.txEditor .toolbar li.character .layer{ width:433px; height:242px; overflow:hidden; padding:0;} -.txEditor .toolbar li.character .layer .close{ position:absolute; background:url(../img/buttonLayerClose.gif) no-repeat center; width:20px; height:21px; top:4px; right:3px; border:0 !important;} -.txEditor .toolbar li.character .layer ul{ margin:0; padding:0; list-style:none;} -.txEditor .toolbar li.character .layer h3{position:absolute; width:0; height:0; overflow:hidden; visibility:hidden;} -.txEditor .toolbar li.character .layer .nav{ position:absolute; top:8px; left:-1px; overflow:hidden; white-space:nowrap; line-height:normal;} -.txEditor .toolbar li.character .layer .nav li{ display:inline; margin:0 -4px 0 0; padding:0 8px; background:url(../img/vr_layer_character.gif) no-repeat 0 center;} -.txEditor .toolbar li.character .layer .nav li a{ color:#444; text-decoration:none; letter-spacing:-1px;} -.txEditor .toolbar li.character .layer .nav li a:hover, -.txEditor .toolbar li.character .layer .nav li a:active, -.txEditor .toolbar li.character .layer .nav li a:focus{ text-decoration:underline;} -.txEditor .toolbar li.character .layer .nav li a.on{ font-weight:bold; color:#004790; display:inline;} -.txEditor .toolbar li.character .layer .list{ position:absolute; left:7px; top:30px; width:421px; height:172px; background:url(../img/bx_character.gif) no-repeat;} -.txEditor .toolbar li.character .layer .list li{ position:relative; top:1px; left:1px; float:left; width:20px; height:18px; margin:0 1px 1px 0;} -.txEditor .toolbar li.character .layer .list li button{ width:20px; height:18px; background:none; padding:0; vertical-align:top;} -.txEditor .toolbar li.character .layer .list li button:hover, -.txEditor .toolbar li.character .layer .list li button:active, -.txEditor .toolbar li.character .layer .list li button:focus{ border:2px solid #27c11a;} -.txEditor .toolbar li.character .layer .list li button span{ overflow:visible; font-size:12px; width:auto; height:auto; position:relative; visibility:visible; line-height:normal; z-index:1;} -.txEditor .toolbar li.character .layer p{ position:absolute; top:212px; left:7px; margin:0 !important;} -.txEditor .toolbar li.character .layer p *{ vertical-align:top;} -.txEditor .toolbar li.character .layer p label{ position:relative; top:4px; margin:0 7px 0 0; color:#333; letter-spacing:-1px; line-height:normal;} -.txEditor .toolbar li.character .layer p input{ padding:3px 0 0 4px; margin:0 4px 0 0; width:300px; height:16px; border:1px solid #acacac; border-right:1px solid #dadada; border-bottom:1px solid #dadada; font-size:12px;} -.txEditor .toolbar li.character .layer p button{ position:relative; *top:1px; width:38px; height:21px; background:url(../img/buttonLayerConfirm.gif) no-repeat; border:0 !important;} - -.txEditor .toolbar .font9px { font-size:9px } -.txEditor .toolbar .font10px { font-size:10px } -.txEditor .toolbar .font11px { font-size:11px } -.txEditor .toolbar .font12px { font-size:12px } -.txEditor .toolbar .font14px { font-size:14px } -.txEditor .toolbar .font16px { font-size:16px } -.txEditor .toolbar .font18px { font-size:18px } -.txEditor .toolbar .font20px { font-size:20px } -.txEditor .toolbar .font24px { font-size:24px } -.txEditor .toolbar .font28px { font-size:28px } -.txEditor .toolbar .font32px { font-size:32px } -.txEditor .toolbar .font36px { font-size:36px } - -/* Drag and Drop */ -.xe_dr_placeholder { background-color:#F8F4CE; margin:5px 0; height:20px; padding:10px 0; z-index:0; -moz-border-radius:5px; -webkit-border-radius:5px; z-index:1; } -.drag_handle { position:absolute; height:100%; width:10px; top:0; opacity:.5; filter:alpha(opacity=50); background:#ddd url(../img/iconDragHandler.gif) no-repeat center; cursor:n-resize; margin:0 2px !important; padding:0 !important; border:0 !important; _zoom:1;} -.drag_handle.left { left:0; } -.drag_handle.right { right:0; } -.eArea .drag_handle {display:none} -.eFocus .drag_handle {display:block} +@charset "utf-8"; +/* NHN (developers@xpressengine.com) */ + +/* Textyle Editor */ +.textyleEditor{ position:relative; *zoom:1; margin:0 0 1em 0;} +.textyleEditor:after{ content:""; display:block; clear:both;} +.textyleEditor .editorContainer{ position:relative; width:100%; display:table; table-layout:fixed;} +.textyleEditor .editorContainer .editorArea{ opacity:1; filter:alpha(opacity=100);} +.textyleEditor .editorContainer .writeArea{ position:relative; *zoom:1;} + +/* Writing Toolbar */ +.wToolbarContainer{ position:relative; margin:20px 0 40px 0; height:62px; overflow:hidden; z-index:1000; _zoom:1;} +.wToolbarContainer.more{ height:auto;} +.wToolbar{ position:relative; height:62px; margin:0 10px; *zoom:1; background-image:url(../img/bgWritingToolbarCenter.gif); background-repeat:repeat-x; } +.wToolbarContainer.more .wToolbar{ height:auto; padding:0 0 5px 0; background-position:0 bottom; border-top:1px solid #bec2ca;} +.wToolbar .cap{ position:absolute; top:0; height:62px; background-repeat:no-repeat; font-size:0; line-height:0; background:url(../img/bgWritingToolbar.gif) no-repeat; z-index:1;} +.wToolbar .top{ display:none; position:absolute; top:-1px; width:10px; height:7px; background:url(../img/bgWritingToolbarMore.gif) no-repeat; z-index:2;} +.wToolbarContainer.more .cap{ height:100%; _top:auto; _bottom:0; _height:300px; background:url(../img/bgWritingToolbarMore.gif) no-repeat;} +.wToolbarContainer.more .top{ display:block;} +.wToolbar .capLeft{ width:10px; left:-10px; background-position:left top;} +.wToolbar .topLeft{ left:-10px; background-position:left top;} +.wToolbarContainer.more .cap.capLeft{ background-position:left bottom;} +.wToolbar .capRight{ width:10px; right:-10px; background-position:right top;} +.wToolbar .topRight{ right:-10px; background-position:right top;} +.wToolbarContainer.more .capRight{ background-position:right bottom;} + +.wToolbar ul{ position:relative; margin:0 70px 0 0; padding:0; *zoom:1; height:58px; z-index:2;} +.wToolbarContainer.more ul{ height:auto; _height:58px; background:url(../img/hrToolbarMore.gif);} +.wToolbar ul:after{ content:""; display:block; clear:both;} +.wToolbar li{ position:relative; float:left; list-style:none; margin-bottom:4px; width:11.1%; *width:11%; _margin-top:0; _margin-right:-1px;} +.wToolbar li button{ position:relative; padding:0; width:100%; height:57px; *height:59px; border:0; background:transparent; cursor:pointer; font-size:11px; color:#44506a; background-image:url(../img/iconWritingToolbar.gif); background-repeat:no-repeat;} +.wToolbar li button .tx{ display:inline-block; padding-top:37px; height:20px;} +.wToolbar li.more{ float:none; position:absolute; top:1px; right:-70px; width:60px; background:url(../img/vrToolbarMore.gif) repeat-y; _zoom:1;} +.wToolbar li.more button{ width:60px;} +.wToolbarContainer.more li{ margin-bottom:0;} +.wToolbarContainer.more li.more{ height:100%;} +.wToolbarContainer.more li.more button{ height:100%; _height:114px; background:url(../img/iconWritingToolbarFolder.gif) no-repeat center !important;} +.wToolbarContainer.more li.more button .nx{ top:0;} +.wToolbar li.hover button{ background-color:#bfc3cb;} + +.wToolbar li.hx button{ background-position:center top;} +.wToolbar li.txt button{ background-position:center -100px;} +.wToolbar li.link button{ background-position:center -200px;} +.wToolbar li.list button{ background-position:center -300px;} +.wToolbar li.quote button{ background-position:center -400px;} +.wToolbar li.img button{ background-position:center -500px;} +.wToolbar li.movie button{ background-position:center -600px;} +.wToolbar li.file button{ background-position:center -700px;} +.wToolbar li.hr button{ background-position:center -800px;} +.wToolbar li.index button{ background-position:center -900px;} +.wToolbar li.material button{ background-position:center -1000px;} +.wToolbar li.help button{ background-position:center -1100px;} +.wToolbar li.more button{ background-position:center -1187px;} + +.wToolbar li .dragable{ position:absolute; display:none; bottom:38px; right:0; padding:0; border:0; width:20px; height:20px; overflow:hidden; background:url(../img/iconMovable.gif) no-repeat center center !important; cursor:move; font-size:0; line-height:0; text-indent:-200%;} +.wToolbarContainer.more li.hover .dragable{ _display:block;} +.wToolbarContainer.more li:hover .dragable{ display:block;} +.wToolbar li .nx{ position:absolute; text-align:center; top:8px; left:50%; font:bold 10px Tahoma, Geneva, sans-serif; color:#fff; width:18px; height:18px; line-height:16px; opacity:.7; background:url(../img/bgShortcut.png) no-repeat center top; _background:none; _filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='./modules/editor/skins/dreditor/img/bgShortcut.png', sizingMethod='crop');} + +/* Writing Area + Material Area */ +.wArea, +.mArea{ display:none; position:relative; *zoom:1; padding:20px; margin:0;} +.wArea{ background:#f5f5f5; border:1px solid #e9e9e9;} +.mArea{ background:url(../img/bgChess76.gif); border:1px solid #666;} +.mArea{ margin:20px 0;} +.wArea.open, +.mArea.open{ display:block;} +.wArea .cap, +.mArea .cap{ position:absolute; width:10px; height:10px; background-repeat:no-repeat; font-size:0; line-height:0; overflow:hidden;} +.wArea .cap{ background-image:url(../img/bgRouningF5.gif);} +.mArea .cap{ background-image:url(../img/bgRouning76.gif);} +.wArea .cap.capTL, +.mArea .cap.capTL{ top:-1px; left:-1px; background-position:left top;} +.wArea .cap.capTR, +.mArea .cap.capTR{ top:-1px; right:-1px; background-position:right top;} +.wArea .cap.capBL, +.mArea .cap.capBL{ bottom:-1px; left:-1px; background-position:left bottom;} +.wArea .cap.capBR, +.mArea .cap.capBR{ bottom:-1px; right:-1px; background-position:right bottom;} +.wArea .h4, +.mArea .h4{ font-size:16px; margin:0 0 10px 0;} +.wArea .h4{ color:#555;} +.mArea .h4{ color:#fff;} +.mArea .controls{ position:absolute; top:20px; right:20px;} + +/* Writing Area */ +.wArea .buttonArea{ position:relative; text-align:left; *zoom:1;} +.wArea .buttonArea .buttonGray button{ _top:0;} +.wArea .buttonArea .info{ display:inline; padding:0 0 0 15px; color:#777;} +.wArea .inputTitle{ width:98%; border:1px solid #ddd; background:#fff url(../img/bgInputText.gif) no-repeat; color:#767676; padding:6px 0 0 10px; height:21px; font-size:14px; margin-bottom:10px;} +.wArea .inputLink{ width:98%; border:1px solid #ddd; background:#fff url(../img/bgInputText.gif) no-repeat; color:#767676; padding:6px 0 0 10px; height:21px; font-size:11px; margin-bottom:10px;} +.wArea .inputText{ width:98%; border:1px solid #ddd; background:#fff url(../img/bgInputText.gif) no-repeat; color:#767676; padding:6px 0 0 10px; height:21px; font-size:12px; margin-bottom:10px;} +.wArea .inputFile{ width:100%; border:1px solid #ddd; background:#fff url(../img/bgInputText.gif) no-repeat; color:#767676; padding:6px 0 0 10px; height:29px; font-size:12px; margin-bottom:10px;} +.wArea .inputTextarea{ width:98%; border:1px solid #ddd; background:#fff url(../img/bgInputText.gif) no-repeat; color:#767676; padding:10px 0 0 10px; height:150px; font-size:12px; line-height:1.5; margin-bottom:10px;} +.wArea .inputRadio{ width:13px; height:13px; vertical-align:middle;} +.wArea .hr{ border-top:1px solid #e6e6e6; border-bottom:1px solid #fff; font-size:0; line-height:0; overflow:hidden; height:0; margin:15px -20px;} + +/* Material Area */ +.mArea .reload{ position:absolute; top:24px; right:40px; width:15px; height:16px; padding:0; cursor:pointer; border:0; *margin:0 5px 0 0; background:transparent url(../img/buttonRefresh.gif) no-repeat; vertical-align:middle;} +.mArea .reload span{ position:absolute; width:0; height:0; font-size:0; line-height:0; overflow:hidden; z-index:-1; visibility:hidden;} +.mArea .close{ position:absolute; top:24px; right:20px; width:15px; height:16px; padding:0; cursor:pointer; border:0; *margin:0 5px 0 0; background:transparent url(../img/buttonClose.gif) no-repeat; vertical-align:middle;} +.mArea .close span{ position:absolute; width:0; height:0; font-size:0; line-height:0; overflow:hidden; z-index:-1; visibility:hidden;} +.mArea .noData{ position:relative; border-top:1px solid #ddd; border-bottom:1px solid #ddd; background:#fff; padding:10px 20px;} +.mArea dl{ position:relative; background:#fff;} +.mArea dt{ position:relative; padding:7px 15px; font-weight:bold; color:#fff; background:#555; border-top:1px solid #444;} +.mArea dd{ margin:0 15px; padding:5px 0;} +.mArea dd .buttonDrEditor{ position:absolute; top:8px; right:10px;} +.mArea .eArea{ border:0; padding:0;} + +.mArea .paginate{ position:relative; width:100px; margin:0 auto; text-align:center; padding:0; font-size:12px; color:#fff; *zoom:1;} +.mArea .paginate:after{ content:""; display:block; clear:both;} +.mArea .paginate button{ width:17px; height:17px; padding:0; background:transparent url(../img/buttonPaginate.gif) no-repeat 0 0; cursor:pointer; border:0; vertical-align:middle;} +.mArea .paginate button span{ position:absolute; width:0; height:0; font-size:0; line-height:0; overflow:hidden; visibility:hidden; z-index:-1;} +.mArea .paginate .prev{ float:left; background-position:left top;} +.mArea .paginate .next{ float:right; background-position:right top;} + +/* Writing Area Blank */ +.editorArea .wArea { display:block;} +.wArea.blank{ padding:15px 30px; margin:0;} +.wArea.blank dt{ font-size:12px; font-weight:bold; color:#333;} +.wArea.blank dd{ margin:0 0 5px 0; color:#767676;} +.wArea.blank .drEditorBugReport{ position:absolute; margin:0 !important; top:20px; right:30px;} + +/* Writing Area Hx */ +.wArea.hx ul{ margin:0 0 5px 0; padding:0; list-style:none;} +.wArea.hx li{ display:inline !important; font-weight:bold !important; color:#333 !important;} +.wArea.hx li label{ margin-right:30px;} +.wArea.hx .inputTitle{ font-weight:bold !important;} +.wArea.hx li.h3, +.wArea.hx .inputTitle.h3{ font-size:18px !important; height:28px;} +.wArea.hx li.h4, +.wArea.hx .inputTitle.h4{ font-size:16px !important; height:26px;} +.wArea.hx li.h5, +.wArea.hx .inputTitle.h5{ font-size:13px !important; height:23px;} + +/* Writing Area List */ +.wArea.list .toolbar{ border:1px solid #ddd; list-style:none; margin:0 0 -1px 0; padding:0; background:#fafafa; padding:6px 20px;} +.wArea.list .toolbar li{ display:inline; margin-right:5px;} +.wArea.list .toolbar li button{ position:relative; width:23px; height:22px; padding:0; border:0; cursor:pointer; background-image:url(../img/buttonListToolbar.gif); background-repeat:no-repeat;} +.wArea.list .toolbar li button:hover, +.wArea.list .toolbar li button:active, +.wArea.list .toolbar li button:focus{ border:1px solid #ddd;} +.wArea.list .toolbar li button.type_disc{ background-position:center 0;} +.wArea.list .toolbar li button.type_circle{ background-position:center -30px;} +.wArea.list .toolbar li button.type_square{ background-position:center -60px;} +.wArea.list .toolbar li button.type_decimal{ background-position:center -90px;} +.wArea.list .toolbar li button.type_lower-alpha{ background-position:center -120px;} +.wArea.list .toolbar li button.type_upper-alpha{ background-position:center -150px;} +.wArea.list .toolbar li button.type_lower-roman{ background-position:center -180px;} +.wArea.list .toolbar li button.type_upper-roman{ background-position:center -210px;} +.wArea.list .toolbar li button span{ position:absolute; width:0; height:0; font-size:0; line-height:0; overflow:hidden; visibility:hidden;} + +.wArea.list .listArea{ padding:1em 0; margin-bottom:1em; background:#fff url(../img/bgInputText.gif) no-repeat; border:1px solid #ddd;} +.wArea.list .listArea ul{ border:0;} +.wArea.list .listArea input{ border:0; border-bottom:1px solid #ddd; background:transparent; width:96%; padding:3px 4px;} + +/* Writing Area Image */ +.wArea.img .image{ position:relative; margin-bottom:10px; background:#fff; padding:0; _width:100%; overflow:hidden;} +.wArea.img .image img{ max-width:100%;} +.wArea.img .uploading{ display:none; padding:0 0 0 20px; background:url(../img/iconLoading.gif) no-repeat left center;} +.wArea.img .uploading button{ border:2px solid #ccc; background:#eee; cursor:pointer; font-size:11px; font-weight:bold; padding:0; overflow:visible; vertical-align:middle; margin:0 10px;} +.wArea.img .info{ font-size:11px; color:#737fa1; margin:0;} +.wArea.img .resize{ display:none;} +.wArea.img .resize.open{ display:block;} +.wArea.img .resize dl *{ vertical-align:middle;} +.wArea.img .resize dt{ display:inline; font-weight:bold;} +.wArea.img .resize dd{ display:inline; margin:0;} +.wArea.img .resize .width{ width:60px; text-align:right; padding:1px 4px; height:16px;} +.wArea.img .resize .width.original{ background:#d4d0c8;} +.wArea.img .resize .resizeInfo{ margin:0 0 0 1em;} +.wArea.img .resize .resizeError{ display:none; padding:.5em 3.5em; margin:1em 6px 1em 0; color:#ff6633; background:#fff url(../img/iconCheckSmall.gif) no-repeat 2em center;; border:1px solid #ddd;} +.wArea.img .resize .resizeError.open{ display:block;} +.wArea.img .align{ display:none;} +.wArea.img .align dt{ display:inline; font-weight:bold;} +.wArea.img .align dd{ display:inline; margin:0;} + +/* Writing Area File */ +.wArea.file .buttonFileUpload, +.wArea.file .buttonFileUpload button{ position:relative; display:inline-block; height:39px; background-color:transparent; background-image:url(../img/buttonUpload.gif); background-repeat:no-repeat; cursor:pointer;} +.wArea.file .buttonFileUpload{ background-position:left top;} +.wArea.file .buttonFileUpload button{ left:7px; border:0; padding:0 15px 0 25px; background-position:right top; font-size:12px; font-weight:bold; color:#fff; line-height:39px; overflow:visible;} +.wArea.file .buttonFileUpload .swfupload{ margin:0 !important; cursor:pointer;} +.wArea.file .info{ font-size:11px; color:#737fa1;} +.wArea.file .info .help{ position:relative; font-size:11px; border:0; background:none; padding:0; cursor:pointer; *zoom:1; color:#f66; overflow:visible;} +.wArea.file .inputFile{ display:none;} +.wArea.file .inputFile.open{ display:block;} +.wArea.file dl{ margin:0; padding:0;} +.wArea.file dd{ font-size:11px; margin-bottom:3px; margin:0;} +.wArea.file dd strong{ margin-right:15px; color:#555; font-weight:normal;} +.wArea.file dd em{ color:#767676; font-style:normal; margin-right:15px;} +.wArea.file dd .buttonDelete{ border:0; padding:0; width:17px; height:17px; vertical-align:middle; cursor:pointer; background:url(../img/buttonTableDataX.gif) no-repeat center center;} +.wArea.file dd .buttonDelete span{ position:absolute; width:0; height:0; overflow:hidden; font-size:0; line-height:0; z-index:-1; visibility:hidden;} +.wArea.file .summary{ text-align:right; font-size:11px;} +.wArea.file .summary{ color:#555;} +.wArea.file .summary em{ color:#767676; font-style:normal; margin-left:10px;} + +/* Writing Area Hr */ +.wArea.hr ul{ margin:0 0 20px 0; padding:0; list-style:none; font-size:12px; color:#555; *zoom:1;} +.wArea.hr li{ position:relative; margin-bottom:10px; *zoom:1;} +.wArea.hr li label{ position:relative; background:#f5f5f5; padding:0 15px 0 30px; margin-left:-30px; z-index:1; display:none;} +.wArea.hr li .inputRadio{ position:relative; z-index:10; display:none;} +.wArea.hr .inputToggle, +.wArea.hr .inputContinue{ position:absolute; top:0; border:1px solid #ddd; font-size:12px; color:#767676; width:150px; padding:3px 4px; height:14px; text-align:right; background-image:url(../img/bgInputText.gif); background-repeat:no-repeat;} +.wArea.hr .inputShow{ right:170px;} +.wArea.hr .inputHide, +.wArea.hr .inputContinue{ right:0;} +.wArea.hr .hRule{ position:absolute; width:100%; top:50%; left:0; display:block; border-top:1px solid #e6e6e6; border-bottom:1px solid #fff; font-size:0; line-height:0; overflow:hidden; height:0;} + +/* Edit Area */ +.eArea{ position:relative; padding:0 20px; margin:0; font-size:12px; border:1px solid #fff; overflow:visible !important; _zoom:1;} +.eArea.xe_dr_hr{ padding-top:1em; padding-bottom:1em;} +.eArea a{ color:#648AB9;} +.eArea button.holder{ position:absolute; left:-2000px; top:0px; } +.eArea .eTool{ display:none;} +.eArea .eFocusTrigger{ position:absolute; top:0; left:0; font-size:0; line-height:0; border:0; background:transparent; width:1px; height:1px; overflow:hidden; opacity:0; filter:alpha(opacity=0);} +.eArea .eFocusTrigger:focus{ border:1px solid;} +.eArea .del{ display:none; position:absolute; top:0; right:20px; border:0; padding:0; width:20px; height:20px; cursor:pointer; background:transparent url(../img/buttonTableDataX.gif) no-repeat center;} +.eArea .del span{position:absolute; width:0; height:0; overflow:hidden; font-size:0; line-height:0; z-index:-1; visibility:hidden;} + +.eArea.xe_dr_img p{ overflow:hidden; width:100%;} +.eArea.xe_dr_img p img{ *padding:1em 0;} + +.eFocus{ border:1px solid #d8d8de; z-index:999; background:#f9f9f9;} +.eArea .cap{ display:none;} +.eFocus .cap{ display:none; *display:block; position:absolute; width:10px; height:10px; background-repeat:no-repeat; font-size:0; line-height:0; overflow:hidden;} +.eFocus .cap.capTL{ top:-1px; left:-1px; background-position:left top;} +.eFocus .cap.capTR{ top:-1px; right:-1px; background-position:right top;} +.eFocus .cap.capBL{ bottom:-1px; left:-1px; background-position:left bottom;} +.eFocus .cap.capBR{ bottom:-1px; right:-1px; background-position:right bottom;} + +.eFocus .eTool{ display:block; height:24px; position:absolute !important; z-index:99; top:-24px !important; left:-1px !important; white-space:nowrap; margin:0 0 0 2px !important; padding:0 5px 0 0 !important; border:0 !important; background:url(../img/bgEtool.gif) no-repeat right top !important;} +.eFocus .eTool li{ position:relative; left:-2px; display:block; float:left; height:22px; padding:2px 3px 0 5px; background:url(../img/vrContentNavigation.gif) no-repeat left center;} +.eFocus .eTool li.edit{ background:url(../img/bgEtool.gif) no-repeat left top;} +.eFocus .eTool li button{ border:0; padding:0; overflow:visible; cursor:pointer; background-color:transparent; font-size:11px; vertical-align:middle;} +.eFocus .eTool li.move button, +.eFocus .eTool li.delete button{ overflow:hidden; width:17px; height:17px; background-position:center center; background-repeat:no-repeat;} +.eFocus .eTool li.move button{ background-image:url(../img/iconMovable.gif); cursor:move;} +.eFocus .eTool li.delete button{ background-image:url(../img/buttonWasteBox.gif);} +.eFocus .eTool li.move button span, +.eFocus .eTool li.delete button span{ position:absolute; width:0; height:0; overflow:hidden; font-size:0; line-height:0; z-index:-1; visibility:hidden;} +.eFocus .del{ display:block;} + +/* txEditor */ +.txEditor{ position:relative; width:98%; padding-right:10px; margin-bottom:10px; border:1px solid #ddd; *zoom:1; background:#fff;} +.txEditor .toolbar{ position:relative; z-index:10; margin:0 -10px 0 0; padding:6px 10px; list-style:none; *zoom:1; background:#fafafa; border-bottom:1px solid #ddd;} +.txEditor .toolbar:after{ content:""; display:block; clear:both;} +.txEditor .toolbar li{ position:relative; float:left; margin-right:5px;} +.txEditor .toolbar li button{ border:0; padding:0; height:22px; background-color:transparent; background-image:url(../img/buttonEditorToolbar.gif); background-repeat:no-repeat; cursor:pointer; vertical-align:middle;} +.txEditor .toolbar li button:hover, +.txEditor .toolbar li button:active, +.txEditor .toolbar li button:focus, +.txEditor .toolbar li button.active{ border:1px solid #ddd;} +.txEditor .toolbar li button span{ position:absolute; width:0; height:0; overflow:hidden; font-size:0; line-height:0; z-index:-1; visibility:hidden;} +.txEditor .toolbar li select{ font-size:12px; vertical-align:middle; height:21px;} +.txEditor .toolbar li.undo button{ width:23px; background-position:center -210px;} +.txEditor .toolbar li.redo button{ width:23px; background-position:center -240px;} +.txEditor .toolbar li.strong button{ width:23px; background-position:center 0;} +.txEditor .toolbar li.em button{ width:23px; background-position:center -30px;} +.txEditor .toolbar li.underline button{ width:23px; background-position:center -60px;} +.txEditor .toolbar li.del button{ width:23px; background-position:center -90px;} +.txEditor .toolbar li.vRule{ padding-left:10px; margin:0 5px; background:url(../img/vrEditorToolbar.gif) no-repeat left center;} +.txEditor .toolbar li.aHref button{ width:23px; background-position:center -120px;} +.txEditor .toolbar li.fSize{ margin-right:5px;} +.txEditor .toolbar li.fColor{ margin-right:5px; z-index:2;} +.txEditor .toolbar li.fColor button{ width:28px; background-position:center -150px;} +.txEditor .toolbar li.bgColor{ margin-right:5px; z-index:1;} +.txEditor .toolbar li.bgColor button{ width:28px; background-position:center -180px;} +.txEditor .toolbar li.left button{ width:23px; background-position:center -270px;} +.txEditor .toolbar li.center button{ width:23px; background-position:center -300px;} +.txEditor .toolbar li.right button{ width:23px; background-position:center -330px;} +.txEditor .toolbar li.justify button{ width:23px; background-position:center -360px;} +.txEditor .toolbar li.character button{ width:23px; background-position:center -390px;} +.txEditor .toolbar li.list button{ width:23px; background-image:url(../img/buttonListToolbar.gif); background-repeat:no-repeat;} +.txEditor .toolbar li.disc button{ background-position:center 0;} +.txEditor .toolbar li.circle button{ background-position:center -30px;} +.txEditor .toolbar li.square button{ background-position:center -60px;} +.txEditor .toolbar li.decimal button{ background-position:center -90px;} +.txEditor .toolbar li.alphaLower button{ background-position:center -120px;} +.txEditor .toolbar li.alphaUpper button{ background-position:center -150px;} +.txEditor .toolbar li.romanLower button{ background-position:center -180px;} +.txEditor .toolbar li.romanUpper button{ background-position:center -210px;} +.txEditor .toolbar li .uri{ display:none; position:absolute; left:10px; top:25px; padding:15px 20px; border:1px solid #ddd; background:#fff; *zoom:1; *white-space:nowrap;} +.txEditor .toolbar li .uri h3{ font-size:12px; margin:0 0 .5em 0;} +.txEditor .toolbar li .uri .link{ border:1px solid #ccc; padding:3px 4px; height:14px; font-size:12px; width:200px; font-size:11px; color:#666;} +.txEditor .toolbar li .uri p{ margin:.5em 0;} +.txEditor .toolbar li .uri p input{ width:13px; height:13px; margin:0 3px 0 0; vertical-align:middle;} +.txEditor .toolbar li .uri .btn_area{ text-align:center;} +.txEditor .toolbar li .uri .btn_area .buttonGray, +.txEditor .toolbar li .uri .btn_area .buttonGray button{ background-image:url(../img/buttonGray.gif);} +.txEditor .toolbar li .uri .btn_area .buttonGray{ background-position:left top;} +.txEditor .toolbar li .uri .btn_area .buttonGray button{ background-position:right top; line-height:18px; border:0 !important; width:auto; padding:0 6px 0 4px;} +.txEditor .toolbar li .palette{ display:none; width:211px; position:absolute; left:0; top:25px; padding:8px 0 7px 8px; margin:0; list-style:none; border:1px solid #ddd; background:#fff; *zoom:1;} +.txEditor .toolbar li .palette:after{ content:""; display:block; clear:both;} +.txEditor .toolbar li .palette.open{ display:block;} +.txEditor .toolbar li .palette li{ float:left; margin:0 1px 1px 0; font-size:0; line-height:0;} +.txEditor .toolbar li .palette button{ position:relative; overflow:hidden; width:11px; height:11px;} +.txEditor .toolbar li .palette button span{ position:absolute; width:0; height:0; overflow:hidden; font-size:0; line-height:0; z-index:-1; visibility:hidden;} +.txEditor .inputRichText{ position:relative; margin-right:-10px; position:relative; *zoom:1; z-index:1; padding:3px 0 3px 3px; background-image:url(../img/bgInputText.gif); background-repeat:no-repeat; background-position:0 0;} +.txEditor .inputRichText iframe{ width:100%; height:136px; border:0; overflow-x:hidden;} +.txEditor .resizeVertical{ position:relative; margin-right:-10px; border-top:1px solid #ddd; height:10px; background:url(../img/buttonResizeVertical.gif) no-repeat center center; *zoom:1; font-size:0; line-height:0;} +.txEditor .resizeVertical button{ width:100%; height:10px; border:0; margin:0; padding:0; background:transparent; cursor:n-resize; vertical-align:middle;} +.txEditor .resizeVertical button span{ position:absolute; width:0; height:0; font-size:0; line-height:0; overflow:hidden; visibility:hidden; z-index:-1;} + +.txEditor .toolbar li.character .layer{ width:433px; height:242px; overflow:hidden; padding:0;} +.txEditor .toolbar li.character .layer .close{ position:absolute; background:url(../img/buttonLayerClose.gif) no-repeat center; width:20px; height:21px; top:4px; right:3px; border:0 !important;} +.txEditor .toolbar li.character .layer ul{ margin:0; padding:0; list-style:none;} +.txEditor .toolbar li.character .layer h3{position:absolute; width:0; height:0; overflow:hidden; visibility:hidden;} +.txEditor .toolbar li.character .layer .nav{ position:absolute; top:8px; left:-1px; overflow:hidden; white-space:nowrap; line-height:normal;} +.txEditor .toolbar li.character .layer .nav li{ display:inline; margin:0 -4px 0 0; padding:0 8px; background:url(../img/vr_layer_character.gif) no-repeat 0 center;} +.txEditor .toolbar li.character .layer .nav li a{ color:#444; text-decoration:none; letter-spacing:-1px;} +.txEditor .toolbar li.character .layer .nav li a:hover, +.txEditor .toolbar li.character .layer .nav li a:active, +.txEditor .toolbar li.character .layer .nav li a:focus{ text-decoration:underline;} +.txEditor .toolbar li.character .layer .nav li a.on{ font-weight:bold; color:#004790; display:inline;} +.txEditor .toolbar li.character .layer .list{ position:absolute; left:7px; top:30px; width:421px; height:172px; background:url(../img/bx_character.gif) no-repeat;} +.txEditor .toolbar li.character .layer .list li{ position:relative; top:1px; left:1px; float:left; width:20px; height:18px; margin:0 1px 1px 0;} +.txEditor .toolbar li.character .layer .list li button{ width:20px; height:18px; background:none; padding:0; vertical-align:top;} +.txEditor .toolbar li.character .layer .list li button:hover, +.txEditor .toolbar li.character .layer .list li button:active, +.txEditor .toolbar li.character .layer .list li button:focus{ border:2px solid #27c11a;} +.txEditor .toolbar li.character .layer .list li button span{ overflow:visible; font-size:12px; width:auto; height:auto; position:relative; visibility:visible; line-height:normal; z-index:1;} +.txEditor .toolbar li.character .layer p{ position:absolute; top:212px; left:7px; margin:0 !important;} +.txEditor .toolbar li.character .layer p *{ vertical-align:top;} +.txEditor .toolbar li.character .layer p label{ position:relative; top:4px; margin:0 7px 0 0; color:#333; letter-spacing:-1px; line-height:normal;} +.txEditor .toolbar li.character .layer p input{ padding:3px 0 0 4px; margin:0 4px 0 0; width:300px; height:16px; border:1px solid #acacac; border-right:1px solid #dadada; border-bottom:1px solid #dadada; font-size:12px;} +.txEditor .toolbar li.character .layer p button{ position:relative; *top:1px; width:38px; height:21px; background:url(../img/buttonLayerConfirm.gif) no-repeat; border:0 !important;} + +.txEditor .toolbar .font9px { font-size:9px } +.txEditor .toolbar .font10px { font-size:10px } +.txEditor .toolbar .font11px { font-size:11px } +.txEditor .toolbar .font12px { font-size:12px } +.txEditor .toolbar .font14px { font-size:14px } +.txEditor .toolbar .font16px { font-size:16px } +.txEditor .toolbar .font18px { font-size:18px } +.txEditor .toolbar .font20px { font-size:20px } +.txEditor .toolbar .font24px { font-size:24px } +.txEditor .toolbar .font28px { font-size:28px } +.txEditor .toolbar .font32px { font-size:32px } +.txEditor .toolbar .font36px { font-size:36px } + +/* Drag and Drop */ +.xe_dr_placeholder { background-color:#F8F4CE; margin:5px 0; height:20px; padding:10px 0; z-index:0; -moz-border-radius:5px; -webkit-border-radius:5px; z-index:1; } +.drag_handle { position:absolute; height:100%; width:10px; top:0; opacity:.5; filter:alpha(opacity=50); background:#ddd url(../img/iconDragHandler.gif) no-repeat center; cursor:n-resize; margin:0 2px !important; padding:0 !important; border:0 !important; _zoom:1;} +.drag_handle.left { left:0; } +.drag_handle.right { right:0; } +.eArea .drag_handle {display:none} +.eFocus .drag_handle {display:block} .editorContainer .ui-draggable{ margin:0 0 3em 0 !important;} \ No newline at end of file diff --git a/modules/editor/skins/dreditor/css/editor.css b/modules/editor/skins/dreditor/css/editor.css index c02b4ad4b..a44bc1bfe 100644 --- a/modules/editor/skins/dreditor/css/editor.css +++ b/modules/editor/skins/dreditor/css/editor.css @@ -1,6 +1,6 @@ -@charset "utf-8"; -/* NHN (developers@xpressengine.com) */ - -html, body { height:100%; background-color:transparent; padding:0; margin:0;} -body{ margin:1em;} -.xe_content{ color:#000; font-size:12px; line-height:1.5;} +@charset "utf-8"; +/* NHN (developers@xpressengine.com) */ + +html, body { height:100%; background-color:transparent; padding:0; margin:0;} +body{ margin:1em;} +.xe_content{ color:#000; font-size:12px; line-height:1.5;} diff --git a/modules/editor/skins/dreditor/css/style@content.css b/modules/editor/skins/dreditor/css/style@content.css index 16a486ed2..01c649ce1 100644 --- a/modules/editor/skins/dreditor/css/style@content.css +++ b/modules/editor/skins/dreditor/css/style@content.css @@ -1,52 +1,52 @@ -@charset "utf-8"; -/* NHN (developers@xpressengine.com) */ - -/* textyleContent */ -.textyleContent{ font-size:12px; line-height:1.6; clear:both;} -.textyleContent h1{ font-size:24px;} -.textyleContent h2{ font-size:20px;} -.textyleContent h3{ font-size:18px;} -.textyleContent h4{ font-size:16px;} -.textyleContent h5{ font-size:14px;} -.textyleContent h6{ font-size:12px;} - -/* Attached File */ -.textyleContent dl.attachedFile { margin:1em 0; padding:1em 0; background:#f9f9f9; border:1px solid #eee; } -.textyleContent dl.attachedFile dt { padding:0 2em .5em 2em; margin:0 0 1em 0; font-weight:bold; text-indent:1em; border-bottom:1px solid #eee; background:#f9f9f9 url(../img/iconClip.gif) no-repeat 2em .3em; font-size:12px;} -.textyleContent dl.attachedFile em{ font-size:11px; font-weight:normal; font-style:normal; margin:0 5px;} -.textyleContent dl.attachedFile dd{ margin:0; padding:0 2em; color:#8b8b8b; font-size:11px;} -.textyleContent dl.attachedFile dd a{ text-decoration:none; color:#0092cf; margin-right:10px;} -.textyleContent dl.attachedFile dd a:hover, -.textyleContent dl.attachedFile dd a:active, -.textyleContent dl.attachedFile dd a:focus{ text-decoration:underline;} - -/* Table Of Content */ -.textyleContent .toc{ background:#fff; border:1px solid #ddd; font-size:14px; line-height:1.6; margin:1em 0; padding:15px;} -.textyleContent .toc li{ font-weight:bold; color:#555; margin-left:35px;} -.textyleContent .toc li.toc3{} -.textyleContent .toc li.toc4{ margin-left:55px;} -.textyleContent .toc li.toc5{ margin-left:75px;} -.textyleContent .toc li a{ color:#648ab9; text-decoration:none; font-weight:normal;} -.textyleContent .toc li a:hover, -.textyleContent .toc li a:active, -.textyleContent .toc li a:focus{ text-decoration:underline;} - -/* Object */ -.textyleContent object, -.textyleContent embed{ margin:1em 0;} - -/* Horizontal Rule */ -.textyleContent hr{ display:block; position:static; border-bottom:0; height:1px; overflow:hidden; color:#e2e2e2; clear:both;} - -/* Blockquote */ -.textyleContent blockquote{ margin-left:0; margin-right:0; padding:1em 40px; background:#f6f6f6 url(../img/bgBlockquote.gif) no-repeat 20px 1.5em; -moz-border-radius:5px; -webkit-border-radius:5px; } - -/* Cite */ -.textyleContent cite{ display:block; margin:1em 0;} - -/* Link */ -.textyleContent .xe_dr_link p strong{ display:block;} - -/* P */ -.xe_content p, -.textyleContent p{ margin:1em 0 !important;} +@charset "utf-8"; +/* NHN (developers@xpressengine.com) */ + +/* textyleContent */ +.textyleContent{ font-size:12px; line-height:1.6; clear:both;} +.textyleContent h1{ font-size:24px;} +.textyleContent h2{ font-size:20px;} +.textyleContent h3{ font-size:18px;} +.textyleContent h4{ font-size:16px;} +.textyleContent h5{ font-size:14px;} +.textyleContent h6{ font-size:12px;} + +/* Attached File */ +.textyleContent dl.attachedFile { margin:1em 0; padding:1em 0; background:#f9f9f9; border:1px solid #eee; } +.textyleContent dl.attachedFile dt { padding:0 2em .5em 2em; margin:0 0 1em 0; font-weight:bold; text-indent:1em; border-bottom:1px solid #eee; background:#f9f9f9 url(../img/iconClip.gif) no-repeat 2em .3em; font-size:12px;} +.textyleContent dl.attachedFile em{ font-size:11px; font-weight:normal; font-style:normal; margin:0 5px;} +.textyleContent dl.attachedFile dd{ margin:0; padding:0 2em; color:#8b8b8b; font-size:11px;} +.textyleContent dl.attachedFile dd a{ text-decoration:none; color:#0092cf; margin-right:10px;} +.textyleContent dl.attachedFile dd a:hover, +.textyleContent dl.attachedFile dd a:active, +.textyleContent dl.attachedFile dd a:focus{ text-decoration:underline;} + +/* Table Of Content */ +.textyleContent .toc{ background:#fff; border:1px solid #ddd; font-size:14px; line-height:1.6; margin:1em 0; padding:15px;} +.textyleContent .toc li{ font-weight:bold; color:#555; margin-left:35px;} +.textyleContent .toc li.toc3{} +.textyleContent .toc li.toc4{ margin-left:55px;} +.textyleContent .toc li.toc5{ margin-left:75px;} +.textyleContent .toc li a{ color:#648ab9; text-decoration:none; font-weight:normal;} +.textyleContent .toc li a:hover, +.textyleContent .toc li a:active, +.textyleContent .toc li a:focus{ text-decoration:underline;} + +/* Object */ +.textyleContent object, +.textyleContent embed{ margin:1em 0;} + +/* Horizontal Rule */ +.textyleContent hr{ display:block; position:static; border-bottom:0; height:1px; overflow:hidden; color:#e2e2e2; clear:both;} + +/* Blockquote */ +.textyleContent blockquote{ margin-left:0; margin-right:0; padding:1em 40px; background:#f6f6f6 url(../img/bgBlockquote.gif) no-repeat 20px 1.5em; -moz-border-radius:5px; -webkit-border-radius:5px; } + +/* Cite */ +.textyleContent cite{ display:block; margin:1em 0;} + +/* Link */ +.textyleContent .xe_dr_link p strong{ display:block;} + +/* P */ +.xe_content p, +.textyleContent p{ margin:1em 0 !important;} diff --git a/modules/editor/skins/dreditor/drcomponents/fold/info.xml b/modules/editor/skins/dreditor/drcomponents/fold/info.xml index 452ce7f3a..2b6fc3938 100644 --- a/modules/editor/skins/dreditor/drcomponents/fold/info.xml +++ b/modules/editor/skins/dreditor/drcomponents/fold/info.xml @@ -1,23 +1,23 @@ - - - 접기 - Fold - Co giãn - 摺疊 - Katla - 접고 펼치는 블럭을 추가할 수 있습니다. - create a new foldable paragraph - Chức năng này sẽ giúp bạn tạo một đoạn văn bản tự động co giãn khi đưa chuột tới. - 新增一個可展開與摺疊的段落。 - Yeni bir katlanabilir paragraf oluştur - 2010-01-22 - 0.2 - - - NHN - NHN - NHN - NHN - NHN - - + + + 접기 + Fold + Co giãn + 摺疊 + Katla + 접고 펼치는 블럭을 추가할 수 있습니다. + create a new foldable paragraph + Chức năng này sẽ giúp bạn tạo một đoạn văn bản tự động co giãn khi đưa chuột tới. + 新增一個可展開與摺疊的段落。 + Yeni bir katlanabilir paragraf oluştur + 2010-01-22 + 0.2 + + + NHN + NHN + NHN + NHN + NHN + + diff --git a/modules/editor/skins/dreditor/drcomponents/fold/lang/tr.lang.php b/modules/editor/skins/dreditor/drcomponents/fold/lang/tr.lang.php index 503bce9e9..2255325dc 100644 --- a/modules/editor/skins/dreditor/drcomponents/fold/lang/tr.lang.php +++ b/modules/editor/skins/dreditor/drcomponents/fold/lang/tr.lang.php @@ -1,5 +1,5 @@ -edit->fold = 'Katla'; - $lang->edit->fold_default = 'Aç..|Kapat..'; - $lang->edit->fold_description = '\'Aç|Kapat\'Yukarıdaki örnekteki gibi gir'; +edit->fold = 'Katla'; + $lang->edit->fold_default = 'Aç..|Kapat..'; + $lang->edit->fold_description = '\'Aç|Kapat\'Yukarıdaki örnekteki gibi gir'; ?> \ No newline at end of file diff --git a/modules/editor/skins/dreditor/drcomponents/fold/tpl/fold.css b/modules/editor/skins/dreditor/drcomponents/fold/tpl/fold.css index 920642409..d55883339 100644 --- a/modules/editor/skins/dreditor/drcomponents/fold/tpl/fold.css +++ b/modules/editor/skins/dreditor/drcomponents/fold/tpl/fold.css @@ -1,12 +1,12 @@ -.wToolbar li.fold button{ background:url(fold.gif) no-repeat center 12px; } - -.editorArea ._fold{ padding:0;} -.editorArea ._fold ._fold_cap{ border:3px solid #f90; padding:5px 20px; margin:2px;} -.editorArea ._fold_first ._fold_cap{ border-bottom:0;} -.editorArea ._fold_last ._fold_cap{ border-top:0;} -.editorArea ._fold span { cursor:pointer; font-weight:bold; } -.editorArea ._fold_last span { display:none; } -.editorArea ._fold span.more { display:none; } -.editorArea ._fold_more span.less { display:none; } -.editorArea ._fold_more span.more { display:inline; } +.wToolbar li.fold button{ background:url(fold.gif) no-repeat center 12px; } + +.editorArea ._fold{ padding:0;} +.editorArea ._fold ._fold_cap{ border:3px solid #f90; padding:5px 20px; margin:2px;} +.editorArea ._fold_first ._fold_cap{ border-bottom:0;} +.editorArea ._fold_last ._fold_cap{ border-top:0;} +.editorArea ._fold span { cursor:pointer; font-weight:bold; } +.editorArea ._fold_last span { display:none; } +.editorArea ._fold span.more { display:none; } +.editorArea ._fold_more span.less { display:none; } +.editorArea ._fold_more span.more { display:inline; } .editorArea ._fold_hide { display:none; } \ No newline at end of file diff --git a/modules/editor/skins/dreditor/drcomponents/fold/tpl/fold.html b/modules/editor/skins/dreditor/drcomponents/fold/tpl/fold.html index c729c12d4..a6739ecf8 100644 --- a/modules/editor/skins/dreditor/drcomponents/fold/tpl/fold.html +++ b/modules/editor/skins/dreditor/drcomponents/fold/tpl/fold.html @@ -1,17 +1,17 @@ - - -
            -
            - {$lang->edit->fold} - -
            - - -

            {$lang->edit->fold_description}

            -
            - - - - -
            + + +
            +
            + {$lang->edit->fold} + +
            + + +

            {$lang->edit->fold_description}

            +
            + + + + +
            \ No newline at end of file diff --git a/modules/editor/skins/dreditor/drcomponents/fold/tpl/fold.js b/modules/editor/skins/dreditor/drcomponents/fold/tpl/fold.js index 6877d155b..cd1182e21 100644 --- a/modules/editor/skins/dreditor/drcomponents/fold/tpl/fold.js +++ b/modules/editor/skins/dreditor/drcomponents/fold/tpl/fold.js @@ -1,205 +1,205 @@ -/** - * Fold component - * @author NHN (developers@xpressengine.com) - */ -jQuery(function($){ - -var editor = xe.getApp('DrEditor')[0]; -var Fold = xe.createPlugin('Fold', { - configs : {}, - init : function() { - this.configs = {}; - }, - create : function(seq) { - var config = editor.getConfig(seq); - var _editor = config.writeArea.find('>div.fold'); - var _text = _editor.find('input[type=text]'); - var next = _text.next(); - - _text.remove(); - this.cast('ADD_DEFAULT_EDITOR_ACTION', [seq, _editor, 'FOLD']); - next.before(_text); - - _text - .blur(function(){ if(!$.trim(this.value)) this.value = this.title }) - .val(_text.attr('title')); - - this.configs[seq] = { - editor : _editor, - text : _text, - marker : [], - before : null - }; - - return this.configs[seq]; - }, - assign_class : function(seq) { - if (this.configs[seq].marker.length) { - this.configs[seq].marker.eq(0).removeClass('_fold_last').addClass('_fold_first'); - this.configs[seq].marker.eq(1).removeClass('_fold_first').addClass('_fold_last'); - } - }, - toggle : function(seq, button) { - var parent = button.parent().parent(); - var target = parent.nextAll('div.eArea'); - var n_fold = target.index(target.filter('div._fold')); - - if (button.is('.more')) { - target.slice(0, n_fold).removeClass('_fold_hide'); - parent.removeClass('_fold_more'); - } else { - target.slice(0, n_fold).addClass('_fold_hide'); - parent.addClass('_fold_more'); - } - }, - API_BEFORE_SETTING_CONTENT : function(sender, params) { - var self = this; - var seq = params[0]; - var obj = params[1]; - var button = obj.children('div.fold_button:first'); - var container = obj.children('div.fold_container'); - - if (button.length && container.length) { - var more = button.find('button.more').text(); // copy only text - var less = button.find('button.less').text(); - var fold = $('
            »
            ').attr('type', 'fold'); - - fold.find('span.more').click(function(){ self.toggle(seq,$(this)) }).text(more); - fold.find('span.less').click(function(){ self.toggle(seq,$(this)) }).text(less); - - container.before(fold).before(container.children()).before(fold.clone(true)).remove(); - - if (!this.configs[seq]) this.create(seq); - this.configs[seq].marker = obj.children('div._fold'); - this.assign_class(seq); - } else { - container.before(container.children()).remove(); - } - button.remove(); - }, - API_AFTER_GETTING_CONTENT : function(sender, params) { - var seq = params[0]; - var obj = params[1]; - var chd = obj.children(); - var fold = chd.filter('div._fold'); - - if (!fold.length) return true; - - var n_start = chd.index(fold.eq(0)); - var n_end = chd.index(fold.eq(1)); - - if (n_start+1 >= n_end) return true; - - var div = $('


     

    '; - var sRow = ''; - var iColumns = this.oColumnInput.value; - for(var i=0; i/ig, - regex_meanless_css2 = /(?:(?:margin|padding)\s*:\s*0(?:px)?|\-(?:moz|ms|webkit|opera)\-[\w-]+\s*:\s*.*?|[\w-]+\s*:\s*\-(?:moz|ms|webkit|opera)\-[\w-]+|(?:line-height|font-variant|font-stretch|font-size-adjust|font-size)\s*:\s*[a-z_-]+)\s*;?\s*|font-(?:weight|style)\s*:\s*normal;?/ig, - regex_class = /<(.*?)\s+class\s*=(?:\s*"(.*?)"|\s*'(.*?)'|([^\s>]+))(.*?)>/ig, - regex_class2 = /xe_selected_cell/g; - regex_handler = /<(.*?)\s+on[a-z]+\s*=(?:\s*".*?"|\s*'.*?'|[^\s>]+)(.*?)>/ig, - //regex_id = /<(.*?)\s+id\s*=(?:[^\s>]+|\s*".*?"|\s*'.*?')(.*?)>/ig, - //regex_script = //ig, - regex_font_color = /color\s*=(?:\s*"(.*?)"|\s*'(.*?)'|([^\s>]+))/i, - regex_font_face = /face\s*=(?:\s*"(.*?)"|\s*'(.*?)'|([^\s>]+))/i, - regex_font_size = /size\s*=(?:\s*"(\d+)"|\s*'(\d+)'|(\d+))/i, - regex_style = /style\s*=\s*(?:\s*"(.*?)"|\s*'(.*?)'|([^\s>]+))/i, - regex_font_weight = /font-weight\s*:\s*([a-z]+);?/i, - regex_font_style = /font-style\s*:\s*italic;?/i, - regex_font_decoration = /text-decoration\s*:\s*([a-z -]+);?/i, - regex_jquery = /jQuery\d+\s*=(\s*"\d+"|\d+)/ig, - regex_quote_attr = /([\w-]+\s*=(?:\s*"[^"]+"|\s*'[^']+'))|([\w-]+)=([^\s]+)/g; //" - -var - allow_tags = 'a,abbr,acronym,address,area,blockquote,br,caption,center,cite,code,col,colgroup,dd,del,dfn,div,dl,dt,em,embed,h1,h2,h3,h4,h5,h6,hr,img,ins,kbd,li,map,object,ol,p,param,pre,q,samp,span,strong,sub,sup,table,tbody,td,tfoot,th,thead,tr,tt,u,ul,var,iframe,object,param,style'.split(','), - lonely_tags = 'area,br,col,embed,hr,img,input,param'.split(','); - -var - replace_tags = { - 'b' : 'strong', - 'i' : 'em', - 's' : 'del', - 'strike' : 'del' - }; - -xe.XE_XHTMLFormatter = $.Class({ - name : "XE_XHTMLFormatter", - - $ON_MSG_APP_READY : function() { - this.oApp.addConverter("WYSIWYG_TO_IR", this.TO_IR); - this.oApp.addConverter("HTMLSrc_TO_IR", this.TO_IR); - this.oApp.addConverter("IR_TO_HTMLSrc", this.IR_TO); - this.oApp.addConverter("IR_TO_WYSIWYG", this.IR_TO); - }, - - TO_IR : function(sContent) { - var stack = []; - - // remove xeHandled attrs - /* - sContent = sContent.replace(/xeHandled="YES"/ig,''); - */ - - - // remove all useless styles - /* - sContent = sContent.replace(regex_meanless_css1, function(m0,m1,m2,m3){ - m2 = m2.replace(regex_meanless_css2, ''); - - return '<'+m1+(m2?' style="'+m2+'"':'')+m3+'>'; - }); - */ - - // remove all useless classes - /* - sContent = sContent.replace(regex_class, function(m0,m1,m2,m3,m4,m5){ - var cls = $.trim((m2 || m3 || m4 || "").replace(regex_class2, '')); - - return '<'+(m1||"")+(cls?' class="'+cls+'"':'')+(m5||"")+'>'; - }); - */ - - // remove all event handler - //sContent = sContent.replace(regex_handler, '<$1$2>'); - - // remove all id - //sContent = sContent.replace(regex_id, '<$1$2>'); - - // remove all scripts - //sContent = sContent.replace(regex_script, ''); - - if ($.browser.msie) { - // remove $ attributes - sContent = sContent.replace(regex_jquery, ''); - - // quote all attrs - sContent = sContent.replace(/<(\w+) ([^>]+)>/g, function(m0,m1,m2){ - return '<'+m1+' '+ - m2.replace(regex_quote_attr, function(s0,s1,s2,s3){ - if (s1) return s1; - if(/^"/.test(s3)||/"$/.test(s3)) return s2+'='+s3; - return s2+'="'+s3+'"'; - }) + '>'; - }); - } - - // remove all useless tag and enclose tags - regex = /<(\/)?([:\w\/-]+)(.*?)>/ig; - sContent = sContent.replace(regex, function(m0,closing,tag,attrs){ - var m3s = []; - var state = ''; - - closing = closing || ''; - tag = tag.toLowerCase(); - attrs = $.trim(attrs || ''); - - if (!closing) { - if ($.inArray(tag,lonely_tags) >= 0) { - var len = attrs.length; - if (tag == 'br') attrs = ''; - if (!attrs || attrs.substring(len-1,len) != '/') attrs += '/'; - - return '<'+tag+' '+$.trim(attrs)+'>'; - } else { - stack[stack.length] = {tag:tag, state:state}; - } - } else { - var tags = [], t = ''; - - // remove unnecessary closing tag - if (!stack.length) return ''; - - do { - t = stack.pop(); - if (t.tag != tag) continue; - if (t.state != 'deleted') tags.push(''); - } while(stack.length && t.tag != tag); - - return tags.join(''); - } - - return '<'+closing+tag+(attrs?' '+attrs:'')+'>'; - }); - /* - if (stack.length) { - var t = ''; - - do { - t = stack.pop(); - if (t.state != 'deleted') sContent += ''; - } while(stack.length); - } - */ - - return sContent; - }, - - IR_TO : function(sContent) { - return sContent; - } -}); -// center, font, b, i, s, strike - -/** - * Support XE extensions - * @author NHN (developer@xpressengine.com) - */ -xe.XE_Extension = $.Class({ - name : "XE_Extension", - seq : '', - last_doc : '', - - $init : function(elAppContainer, editor_sequence) { - this.seq = editor_sequence; - this._assignHTMLObjects(elAppContainer); - }, - - _assignHTMLObjects : function(elAppContainer) { - this.elDropdownLayer = $('DIV.xpress_xeditor_extension_layer', elAppContainer).get(0); - }, - - _removeAttrs : function(sContent) { - return sContent; - }, - - _addEvent : function() { - if (this.oApp.getEditingMode() != 'WYSIWYG') return; - - var doc = this.oApp.getWYSIWYGDocument(); - var seq = this.seq; - var fn = function(){ - var obj = $(this); - var comp = obj.attr('editor_component'); - if (comp && $.isFunction(openComponent)) { - editorPrevNode = obj.get(0); - openComponent(comp, seq); - } - }; - - $('img,div[editor_component]', doc).each(function(){ - var obj = $(this); - if(this.nodeName == 'IMG' && !obj.attr('editor_component')) { - obj.attr('editor_component','image_link'); - } - if(this.last_doc != doc) { - obj.dblclick(fn); - this.last_doc = doc; - } - }); - }, - - $ON_MSG_APP_READY : function() { - var oApp = this.oApp; - oApp.exec('REGISTER_UI_EVENT', ['extension', 'click', 'TOGGLE_EXTENSION_LAYER']); - var functn = function(){ - oApp.exec("HIDE_ACTIVE_LAYER", []); - }; - $('a', this.elDropdownLayer).each(function(){ - var obj = $(this); - if(!obj.attr('component_onclick_event_added')) { - obj.click(functn); - obj.attr('component_onclick_event_added','Y'); - } - }); - }, - - $ON_TOGGLE_EXTENSION_LAYER : function() { - this.oApp.exec('TOGGLE_TOOLBAR_ACTIVE_LAYER', [this.elDropdownLayer]); - }, - - $ON_CHANGE_EDITING_MODE : function(mode) { - var self = this; - setTimeout(function(){ self._addEvent(); }, 100); - }, - - $ON_PASTE_HTML : function() { - var self = this; - setTimeout(function(){ self._addEvent(); }, 100); - }, - - $ON_LOAD_IR_FIELD : function() { - var self = this; - setTimeout(function(){ self._addEvent(); }, 100); - }, - - $ON_SET_IR : function() { - var self = this; - setTimeout(function(){ self._addEvent(); }, 100); - } -}); -/** - * Auto saving - * @author NHN (developer@xpressengine.com) - */ -xe.XE_AutoSave = $.Class({ - name : "XE_AutoSave", - form : null, - textarea : null, - - $init : function(oIRTextarea, elAppContainer) { - this.form = oIRTextarea.form; - this.textarea = oIRTextarea; - - this._assignHTMLObjects(elAppContainer); - }, - - _assignHTMLObjects : function(elAppContainer) { - this.welMessageBox = $('autosave_message'); - }, - - $ON_MSG_APP_READY : function() { - var elTitle = $(this.form._saved_doc_title); - var elContent = $(this.form._saved_doc_content); - - var title = $.trim(elTitle.val()); - var content = $.trim(elContent.val()); - - if (title || content) { - if (confirm(this.form._saved_doc_message.value)) { - $(this.form.title).val(title); - this.oApp.setIR(content); - if(typeof(editorGetAutoSavedDoc) == 'function') editorGetAutoSavedDoc(this.form); - } else { - editorRemoveSavedDoc(); - } - } - - editorEnableAutoSave(this.form, $(this.form).attr("editor_sequence")); - - // register hotkey - this.oApp.exec('REGISTER_HOTKEY', ['ctrl+shift+s','AUTO_SAVE']); - }, - - $ON_AUTO_SAVE : function() { - _editorAutoSave(); - } -}); -/** - * Format Block plugin - * @author NHN (developer@xpressengine.com) - */ -xe.XE_FormatWithSelectUI = $.Class({ - name : "XE_FormatWithSelectUI", - - $init : function(elAppContainer){ - this._assignHTMLObjects(elAppContainer); - }, - - _assignHTMLObjects : function(elAppContainer){ - this.elFormatSelect = $("SELECT.xpress_xeditor_ui_format_select", elAppContainer).get(0); - }, - - $ON_MSG_APP_READY : function(){ - this.oApp.registerBrowserEvent(this.elFormatSelect, "change", "SET_FORMAT_FROM_SELECT_UI"); - this.elFormatSelect.selectedIndex = 0; - }, - - $ON_MSG_STYLE_CHANGED : function(sAttributeName, sAttributeValue){ - var blockName = this.oApp.getWYSIWYGDocument().queryCommandValue("FormatBlock"); - - if (!blockName) return (this.elFormatSelect.selectedIndex = 0); - if ($.browser.msie && /([0-9])/.test(blockName)) blockName = 'h'+(RegExp.$1); - - this.elFormatSelect.value = blockName.toLowerCase(); - if(this.elFormatSelect.selectedIndex < 0) this.elFormatSelect.selectedIndex = 0; - if(this.elFormatSelect.value != blockName.toLowerCase()) this.elFormatSelect.selectedIndex = 0; - }, - - $ON_SET_FORMAT_FROM_SELECT_UI : function(){ - var sFormat = this.elFormatSelect.value; - if(!sFormat) return; - if($.browser.msie) sFormat = '<'+sFormat+'>'; - - this.oApp.exec("EXECCOMMAND", ["FormatBlock", false, sFormat]); - this.oApp.exec("CHECK_STYLE_CHANGE", []); - } -}); -/** - * Enhanced Table Fetures - * @author NHN (developer@xpressengine.com) - */ - -// 표 편집 확장 기능 -xe.XE_Table = $.Class({ - _startSel : null, - _endSel : null, - - $ON_MSG_APP_READY : function() { - this._doc = $(this.oApp.getWYSIWYGDocument()); - - this.$FnMouseDown = $.fnBind(this._mousedown, this); - this.$FnMouseUp = $.fnBind(this._mouseup, this); - this.$FnMouseMove = $.fnBind(this._mousemove, this); - - this._doc.mousedown(this.$FnMouseDown); - - // initialize - this._startSel = null; - this._endSel = null; - - // register buttons - this.oApp.exec('REGISTER_UI_EVENT', ['merge_cells', 'click', 'MERGE_CELLS']); - this.oApp.exec('REGISTER_UI_EVENT', ['split_col', 'click', 'CELL_SPLIT_BY_COL']); - this.oApp.exec('REGISTER_UI_EVENT', ['split_row', 'click', 'CELL_SPLIT_BY_ROW']); - - // register hotkeys - this.oApp.exec('REGISTER_HOTKEY', ['ctrl+alt+m', 'MERGE_CELLS']); - - // perform default ready action - this.$super.$ON_MSG_APP_READY(); - }, - - $ON_MERGE_CELLS : function() { - var html = ""; - var cell = $('.xe_selected_cell', this.oApp.getWYSIWYGDocument()).filter('td,th'); - var self = this; - - // 선택된 셀이 없으면 종료 - if (!cell.length) return; - - // UNDO 지점 기록 - this.oApp.exec("RECORD_UNDO_ACTION", ["Cell:Merge"]); - - // 선택한 모든 셀의 데이터를 첫번째 셀로 복사 - cell.each(function(){ html += $(this).html() }).eq(0).html(html); - - // 첫번째 셀 가로 확장 - var colspan = 0; - cell.eq(0).nextAll('td,th').andSelf().filter('.xe_selected_cell').each(function(idx){ - colspan += self._getSpan(this, 'col'); - }); - - // 마지막 셀까지 줄의 갯수 계산 - var rect = this._getRect(cell.eq(0)); - var start_tr = cell.eq(0).parent('tr'); - var end_tr = cell.eq(cell.length-1).parent('tr'); - var all_rows = cell.parents('table').eq(0).find('tr'); - var rowspan = all_rows.index(end_tr.get(0)) - all_rows.index(start_tr.get(0)) + this._getSpan(cell.eq(cell.length-1), 'row'); - - // 첫번째 셀 colspan, rowspan 속성 지정 - cell.eq(0).attr('colSpan', colspan).attr('rowSpan', rowspan); - - // 첫번째 셀을 제외한 다른 모든 셀 제거 - cell.slice(1).remove(); - }, - - $ON_CELL_SPLIT_BY_ROW : function(many) { - var cell = $('.xe_selected_cell', this.oApp.getWYSIWYGDocument()).filter('td,th'); - var table = cell.parents('table').eq(0); - var self = this; - - // 선택된 셀이 없으면 종료 - if (!cell.length) return; - - // UNDO 지점 기록 - this.oApp.exec("RECORD_UNDO_ACTION", ["Cell:Split By Row"]); - - // 선택 영역의 상하 좌표 구함 - var _top = this._getRect(cell.eq(0)).top; - var _bottom = this._getRect(cell.eq(cell.length-1)).bottom; - - // 테이블의 모든 셀에서 선택영역에 해당하는 셀을 구한다(상하 기준). - (cell = table.find('td,th').filter(function(){ - var rect = self._getRect($(this)); - - return !(rect.bottom <= _top || rect.top >= _bottom); - })).filter('.xe_selected_cell').each(function(){ - var t = $(this); - var row = t.parent('tr'); - var rowspan = self._getSpan(t, 'row'); - var rect = self._getRect(t); - var queue = []; - var clone = t.clone().html('
    '); - var topspan = 1, botspan = 1; - - // rowspan > 1이면 현재 셀의 rowspan을 절반으로 분할한다. - if (rowspan > 1) { - - topspan = Math.ceil(rowspan/2); - botspan = rowspan - topspan; - - queue.push(function(){ - t.attr('rowSpan', topspan); - }); - - clone.attr('rowSpan', botspan); - } else { - // rowspan이 없으면 현재 셀과 영역이 겹치는 모든 셀에 rowspan을 추가 - cell.filter(function(){ - if (t.get(0) == this) return false; - - var tt = $(this); - var rc = self._getRect(tt); - - // 범위를 넘은 부분은 제외 - if (rc.bottom <= rect.top || rc.top >= rect.bottom) return false; - - return true; - }).each(function(){ - var tt = $(this); - var sp = self._getSpan(tt, 'row')+1; - - // rowspan 1 추가 - queue.push(function(){ - tt.attr('rowSpan', sp); - }); - }); - - // 새 줄을 추가한다. - if ($.browser.msie) { - // Fix bug for IE - row.after(row.clone().empty().get(0).outerHTML); - } else { - row.after(row.clone().empty()); - } - } - - var rows = row.nextAll('tr'); - - // 현재 셀이 마지막 줄에 있다면 한 줄 추가 후 새로운 셀 추가 - if (!rows.length) { - row.after(row.clone().empty().append(clone)); - } else { - var next_sib = rows.eq(topspan - 1).children('td,th').filter(function(){ - return ( self._getRect($(this)).left > rect.left ); - }); - - if ($.browser.msie) { - next_sib.length? - next_sib.eq(0).before(clone.get(0).outerHTML): - rows.eq(topspan-1).append(clone.get(0).outerHTML); - } else { - next_sib.length? - next_sib.slice(0,1).before(clone): - rows.slice(topspan-1,1).append(clone); - } - } - - // 함수를 바로 실행하면 좌표가 틀어지므로, 큐에 넣은 후 실행 - $.each(queue, function(){ this(); }); - - }); - }, - - $ON_CELL_SPLIT_BY_COL : function(many) { - var cell = $('.xe_selected_cell', this.oApp.getWYSIWYGDocument()).filter('td,th'); - var table = cell.parents('table').slice(0,1); - var self = this; - var ie_bug = [], tmpId = (new Date).getTime(), tmpStr = ''; - - // 선택된 셀이 없으면 종료 - if (!cell.length) return; - - // UNDO 지점 기록 - this.oApp.exec("RECORD_UNDO_ACTION", ["Cell:Split By Column"]); - - // 선택 영역의 좌우 좌표 구함 - var first_row = cell.eq(0).parent('tr'); - var _left = this._getRect(first_row.find('.xe_selected_cell:first')).left; - var _right = this._getRect(first_row.find('.xe_selected_cell:last')).right; - - // 테이블의 모든 셀에서 선택영역에 해당하는 셀을 구한다(좌우 기준). - (cell = table.find('td,th').filter(function(){ - var rect = self._getRect($(this)); - - return !(rect.right <= _left || rect.left >= _right); - })).filter('.xe_selected_cell').each(function(idx){ - var t = $(this); - var colspan = self._getSpan(t, 'col'); - var clone = t.clone().html('
    '); - - // colspan > 1 이면 colspan을 절반으로 분할한다. - if (colspan > 1) { - var leftspan = Math.ceil(colspan/2); - var rightspan = colspan - leftspan; - - t.attr('colSpan', leftspan); - clone.attr('colSpan', rightspan); - } else { - // colspan이 없으면 현재 셀과 영역이 겹치는 모든 셀에 colspan을 추가 - var rect = self._getRect(t); - - cell.filter(function(){ - if (t.get(0) == this) return false; - - var tt = $(this); - var rc = self._getRect(tt); - - // 범위를 넘은 부분은 제외 - if (rc.right <= rect.left || rc.left >= rect.right) return false; - - return true; - }).each(function(){ - var tt = $(this); - - // colspan 1 추가 - tt.attr('colSpan', self._getSpan(tt, 'col')+1); - }); - - clone.attr('colSpan', 1); - } - - if ($.browser.msie) { - // Fix for IE bug - t.after(clone.get(0).outerHTML); - } else { - t.after(clone); - } - }); - }, - - $ON_CHECK_STYLE_CHANGE : function(){ - var ui = ['merge_cells', 'split_col', 'split_row']; - var app = this.oApp; - var command = (this._startSel && this._startSel.is('.xe_selected_cell'))?'ENABLE_UI':'DISABLE_UI'; - - $.each(ui, function(){ app.exec(command, [this]); }); - }, - - _mousedown : function(event) { - var cur = $(event.target); - var sel = cur.parents().andSelf().filter('td,th,table'); - var app = this.oApp; - var self = this; - - // 모든 선택영역 해제 - $('td.xe_selected_cell', this.oApp.getWYSIWYGDocument()).removeClass('xe_selected_cell'); - - this._startSel = null; - this._endSel = null; - - if (!sel.length || !this._isLeftClicked(event.button)) return; - - function delayed(){ - sel = app.getSelection().cloneRange(); - sel.collapseToStart(); - sel = $(sel.startContainer).parents().andSelf().filter('td,th').eq(0); - - if (!sel.length) return self._removeAllListener()||true; - - // 좌표를 구한다 - self._getRect(self._startSel = sel); - - // 이벤트 바인딩 - self._doc.bind('mousemove', self.$FnMouseMove); - self._doc.bind('mouseup', self.$FnMouseUp); - } - - // mousedown이 일어난 후에 선택 영역이 설정되므로 실행을 지연시킨다. - setTimeout(delayed, 0); - }, - - _mouseup : function(event) { - // 선택된 셀 확인 - this._removeAllListener(); - - // 시작셀과 종료셀 제거 - this._startSel = this._endSel = null; - }, - - _mousemove : function(event) { - var cur = $(event.target); - var cell = cur.parents().andSelf().filter('td,th').eq(0); - var self = this; - - // 마우스 왼쪽 버튼이 눌리지 않았으면 종료 - if (!cell.length || !this._isLeftClicked(event.button)) return; - if (!this._endSel && cell.get(0) == this._startSel.get(0)) return; - if (this._endSel && cell.get(0) == this._endSel.get(0)) return; - - // 종료셀 && 종료셀의 좌표 - this._getRect(this._endSel = cell); - - // 선택 범위를 구한다 - var _top = Math.min(this._startSel.rect.top, this._endSel.rect.top); - var _left = Math.min(this._startSel.rect.left, this._endSel.rect.left); - var _bottom = Math.max(this._startSel.rect.bottom, this._endSel.rect.bottom); - var _right = Math.max(this._startSel.rect.right, this._endSel.rect.right); - - var table = cell.parents('table'); - var cells = table.find('td,th').removeClass('xe_selected_cell'); - var i = 0; - - // 복잡한 모양의 테이블을 위한 반복 처리 - var selected = $(); - do { - // 선택한 셀로 최대 영역 재계산 - selected.each(function(){ - var rect = self._getRect($(this)); - - // 영역 재계산 - if (rect.right > _right) _right = rect.right; - if (rect.left < _left) _left = rect.left; - if (rect.top < _top) _top = rect.top; - if (rect.bottom > _bottom) _bottom = rect.bottom; - }); - - // 좌표 범위 안에 있는 선택할 셀을 추린다. - cells = cells.filter(':not(.xe_selected_cell)'); - selected = cells.filter(function(){ - var rect = self._getRect($(this)); - - if (rect.right <= _left || rect.left >= _right || rect.bottom <= _top || rect.top >= _bottom) return false; - - return true; - }).addClass('xe_selected_cell'); - } while(selected.length); - - // 브라우저의 기본 선택영역 해제 : FF 제외 - 기본 기능이 충분히 좋아서 + 이 부분을 실행하면 오류가 발생해서 - if (!$.browser.mozilla) { - function delayed() { - var sel = self.oApp.getSelection(); - - if (!self._startSel) return; - if (!self._startSel.get(0).firstChild) self._startSel.text(" "); - - sel.selectNode(self._startSel.get(0).firstChild); - sel.collapseToStart(); - sel.select(); - } - - setTimeout(delayed, 0); - } - - return false; - }, - - _removeAllListener : function() { - // 이벤트 해제 - this._doc.unbind("mousemove", this.$FnMouseMove); - this._doc.unbind("mouseup", this.$FnMouseUp); - }, - - _isLeftClicked : function(value) { - return $.browser.msie?!!(value & 1):(value == 0); - }, - - _getRect : function(obj) { - var el = obj.get(0); - - obj.rect = {}; - obj.rect.top = el.offsetTop; - obj.rect.left = el.offsetLeft; - obj.rect.bottom = obj.rect.top + el.offsetHeight; - obj.rect.right = obj.rect.left + el.offsetWidth; - - return obj.rect; - }, - - _getSpan : function(obj, type) { - var span = parseInt($(obj).attr(type+'span')); - - return isNaN(span)?1:span; - } -}).extend(xe.XE_Table); - -})(jQuery); +(function($){ + +// extends jQuery object +$.extend({ + Class : function(def) { + function c(){ + if (typeof this.$super != 'undefined') this.$super.$this = this; + if ($.isFunction(this.$init)) this.$init.apply(this, arguments); + } + c.prototype = def; + c.constructor = c; + c.extend = Class_extend; + + return c; + }, + $ : function(id) { + if(typeof id == 'string') { + if (id.substring(0,1) == '<') return $(id).get(0); + return $('#'+id).get(0); + } else { + return id; + } + }, + fnBind : function(fn, th/* , args... */) { + var args = $.makeArray(arguments); + args.shift(); args.shift(); + + return function() { + var a = args.concat($.makeArray(arguments)); + + return fn.apply(th, a); + }; + } +}); + +$.browser.nVersion = parseFloat($.browser.version); + +function Class_extend(superDef) { + var Super = superDef.prototype; + + this.prototype.$super = {}; + + function bind(fn) { + return function() { + return fn.apply(this.$this, arguments); + }; + } + + for(var x in Super) { + if (!Super.propertyIsEnumerable(x)) continue; + + if (typeof this.prototype[x] == 'undefined') this.prototype[x] = Super[x]; + this.prototype.$super[x] = $.isFunction(Super[x])?bind(Super[x]):Super[x]; + } + + return this; +} + +if (typeof window.xe == 'undefined') window.xe = {}; + +//{ + /** + * @fileOverview This file contains Xpress framework core + * @name XpressCore.js + */ +xe.XpressCore = $.Class({ + name : "XpressCore", + + $init : function(htOptions){ + htOptions = !htOptions?{}:$.Class({}).extend({ + oDebugger : null + }).extend(htOptions); + if(htOptions.oDebugger){ + this.oDebugger = htOptions.oDebugger; + this.oDebugger.oApp = this; + } + + // To prevent processing a Xpress command before all the plugins are registered and ready, + // Queue up all the commands here until the application's status is changed to READY + this.commandQueue = []; + + this.oCommandMap = {}; + this.oDisabledCommand = {}; + this.aPlugins = []; + + this.appStatus = xe.APP_STATUS["NOT_READY"]; + + // Register the core as a plugin so it can receive messages + this.registerPlugin(this); + }, + + exec : function(msg, args, oEvent){ + // If the application is not yet ready just queue the command + if(this.appStatus == xe.APP_STATUS["NOT_READY"]){ + this.commandQueue[this.commandQueue.length] = {'msg':msg, 'args':args, 'event':oEvent}; + return true; + } + + this.exec = this._exec; + this.exec(msg, args, oEvent); + }, + + delayedExec : function(msg, args, nDelay, oEvent){ + var fExec = $.fnBind(this.exec, this, msg, args, oEvent); + setTimeout(fExec, nDelay); + }, + + _exec : function(msg, args, oEvent){return (this._exec = this.oDebugger?this._execWithDebugger:this._execWithoutDebugger).call(this, msg, args, oEvent);}, + _execWithDebugger : function(msg, args, oEvent){this.oDebugger.log_MessageStart(msg, args);var bResult = this._doExec(msg, args, oEvent);this.oDebugger.log_MessageEnd(msg, args);return bResult; }, + _execWithoutDebugger : function(msg, args, oEvent){return this._doExec(msg, args, oEvent);}, + _doExec : function(msg, args, oEvent){ + var bContinue = false; + + if(!this.oDisabledCommand[msg]){ + var allArgs = []; + if(args && args.length){ + var iLen = args.length; + for(var i=0; i= 0 && xe.DOMFix.parentNode(aAllNodes[iChildIdx]) == aAllNodes[iCurIdx]){ + iChildIdx = this._recurConstructClonedTree(aAllNodes, iChildIdx, aAllNodes[iCurIdx], oCurNodeCloneWithChildren, oClonedStartContainer, oClonedEndContainer); + } + + // this may trigger an error message in IE when an erroneous script is inserted + oClonedParentNode.insertBefore(oCurNodeCloneWithChildren, oClonedParentNode.firstChild); + + return iChildIdx; + }; + + aNodes[aNodes.length] = xe.DOMFix.parentNode(aNodes[aNodes.length-1]); + _recurConstructClonedTree(aNodes, aNodes.length-1, aNodes[aNodes.length-1], oClonedParentNode); + + return {oStartContainer: oClonedStartContainer, oEndContainer: oClonedEndContainer}; + }, + + cloneRange : function(){ + return this._copyRange(new xe.W3CDOMRange(this._document)); + }, + + _copyRange : function(oClonedRange){ + oClonedRange.collapsed = this.collapsed; + oClonedRange.commonAncestorContainer = this.commonAncestorContainer; + oClonedRange.endContainer = this.endContainer; + oClonedRange.endOffset = this.endOffset; + oClonedRange.startContainer = this.startContainer; + oClonedRange.startOffset = this.startOffset; + oClonedRange._document = this._document; + + return oClonedRange; + }, + + collapse : function(toStart){ + if(toStart){ + this.endContainer = this.startContainer; + this.endOffset = this.startOffset; + }else{ + this.startContainer = this.endContainer; + this.startOffset = this.endOffset; + } + + this._updateRangeInfo(); + }, + + compareBoundaryPoints : function(how, sourceRange){ + switch(how){ + case xe.W3CDOMRange.START_TO_START: + return this._compareEndPoint(this.startContainer, this.startOffset, sourceRange.startContainer, sourceRange.startOffset); + case xe.W3CDOMRange.START_TO_END: + return this._compareEndPoint(this.endContainer, this.endOffset, sourceRange.startContainer, sourceRange.startOffset); + case xe.W3CDOMRange.END_TO_END: + return this._compareEndPoint(this.endContainer, this.endOffset, sourceRange.endContainer, sourceRange.endOffset); + case xe.W3CDOMRange.END_TO_START: + return this._compareEndPoint(this.startContainer, this.startOffset, sourceRange.endContainer, sourceRange.endOffset); + } + }, + + _findBody : function(oNode){ + if(!oNode) return null; + while(oNode){ + if(oNode.tagName == "BODY") return oNode; + oNode = xe.DOMFix.parentNode(oNode); + } + return null; + }, + + _compareEndPoint : function(oContainerA, iOffsetA, oContainerB, iOffsetB){ + var iIdxA, iIdxB; + + if(!oContainerA || this._findBody(oContainerA) != this._document.body){ + oContainerA = this._document.body; + iOffsetA = 0; + } + + if(!oContainerB || this._findBody(oContainerB) != this._document.body){ + oContainerB = this._document.body; + iOffsetB = 0; + } + + var compareIdx = function(iIdxA, iIdxB){ + // iIdxX == -1 when the node is the commonAncestorNode + // if iIdxA == -1 + // -> [[...]]... + // if iIdxB == -1 + // -> ...[[...]] + if(iIdxB == -1) iIdxB = iIdxA+1; + if(iIdxA < iIdxB) return -1; + if(iIdxA == iIdxB) return 0; + return 1; + }; + + var oCommonAncestor = this._getCommonAncestorContainer(oContainerA, oContainerB); + + // ================================================================================================================================================ + // Move up both containers so that both containers are direct child nodes of the common ancestor node. From there, just compare the offset + // Add 0.5 for each contaienrs that has "moved up" since the actual node is wrapped by 1 or more parent nodes and therefore its position is somewhere between idx & idx+1 + // NODE1

    NODE2

    NODE3
    + // The position of NODE2 in COMMON_ANCESTOR is somewhere between after NODE1(idx1) and before NODE3(idx2), so we let that be 1.5 + + // container node A in common ancestor container + var oNodeA = oContainerA; + if(oNodeA != oCommonAncestor){ + while((oTmpNode = xe.DOMFix.parentNode(oNodeA)) != oCommonAncestor){oNodeA = oTmpNode;} + + iIdxA = this._getPosIdx(oNodeA)+0.5; + }else iIdxA = iOffsetA; + + // container node B in common ancestor container + var oNodeB = oContainerB; + if(oNodeB != oCommonAncestor){ + while((oTmpNode = xe.DOMFix.parentNode(oNodeB)) != oCommonAncestor){oNodeB = oTmpNode;} + + iIdxB = this._getPosIdx(oNodeB)+0.5; + }else iIdxB = iOffsetB; + + return compareIdx(iIdxA, iIdxB); + }, + + _getCommonAncestorContainer : function(oNode1, oNode2){ + var oComparingNode = oNode2; + + while(oNode1){ + while(oComparingNode){ + if(oNode1 == oComparingNode) return oNode1; + oComparingNode = xe.DOMFix.parentNode(oComparingNode); + } + oComparingNode = oNode2; + oNode1 = xe.DOMFix.parentNode(oNode1); + } + + return this._document.body; + }, + + deleteContents : function(){ + if(this.collapsed) return; + + this._splitTextEndNodesOfTheRange(); + + var aNodes = this._getNodesInRange(); + + if(aNodes.length < 1) return; + + var oPrevNode = aNodes[0].previousSibling; + while(oPrevNode && this._isBlankTextNode(oPrevNode)) oPrevNode = oPrevNode.previousSibling; + + var oNewStartContainer, iNewOffset; + if(!oPrevNode){ + oNewStartContainer = xe.DOMFix.parentNode(aNodes[0]); + iNewOffset = 0; + } + + for(var i=0; i oNode.nodeValue.length) iOffset = oNode.nodeValue.length; + }else{ + if(iOffset > xe.DOMFix.childNodes(oNode).length) iOffset = xe.DOMFix.childNodes(oNode).length; + } + + return iOffset; + }, + + + setEnd : function(refNode, offset){ + offset = this._endsNodeValidation(refNode, offset); + + this.endContainer = refNode; + this.endOffset = offset; + if(!this.startContainer || this._compareEndPoint(this.startContainer, this.startOffset, this.endContainer, this.endOffset) != -1) this.collapse(false); + + this._updateRangeInfo(); + }, + + setEndAfter : function(refNode){ + if(!refNode) throw new Error("INVALID_NODE_TYPE_ERR in setEndAfter"); + + if(refNode.tagName == "BODY"){ + this.setEnd(refNode, xe.DOMFix.childNodes(refNode).length); + return; + } + this.setEnd(xe.DOMFix.parentNode(refNode), this._getPosIdx(refNode)+1); + }, + + setEndBefore : function(refNode){ + if(!refNode) throw new Error("INVALID_NODE_TYPE_ERR in setEndBefore"); + + if(refNode.tagName == "BODY"){ + this.setEnd(refNode, 0); + return; + } + + this.setEnd(xe.DOMFix.parentNode(refNode), this._getPosIdx(refNode)); + }, + + setStart : function(refNode, offset){ + offset = this._endsNodeValidation(refNode, offset); + + this.startContainer = refNode; + this.startOffset = offset; + + if(!this.endContainer || this._compareEndPoint(this.startContainer, this.startOffset, this.endContainer, this.endOffset) != -1) this.collapse(true); + this._updateRangeInfo(); + }, + + setStartAfter : function(refNode){ + if(!refNode) throw new Error("INVALID_NODE_TYPE_ERR in setStartAfter"); + + if(refNode.tagName == "BODY"){ + this.setStart(refNode, xe.DOMFix.childNodes(refNode).length); + return; + } + + this.setStart(xe.DOMFix.parentNode(refNode), this._getPosIdx(refNode)+1); + }, + + setStartBefore : function(refNode){ + if(!refNode) throw new Error("INVALID_NODE_TYPE_ERR in setStartBefore"); + + if(refNode.tagName == "BODY"){ + this.setStart(refNode, 0); + return; + } + this.setStart(xe.DOMFix.parentNode(refNode), this._getPosIdx(refNode)); + }, + + surroundContents : function(newParent){ + newParent.appendChild(this.extractContents()); + this.insertNode(newParent); + this.selectNode(newParent); + }, + + toString : function(){ + var oTmpContainer = this._document.createElement("DIV"); + oTmpContainer.appendChild(this.cloneContents()); + + return oTmpContainer.textContent || oTmpContainer.innerText || ""; + }, + + _isBlankTextNode : function(oNode){ + if(oNode.nodeType == 3 && oNode.nodeValue == "") return true; + return false; + }, + + _getPosIdx : function(refNode){ + var idx = 0; + for(var node = refNode.previousSibling; node; node = node.previousSibling) idx++; + + return idx; + }, + + _updateRangeInfo : function(){ + if(!this.startContainer){ + this.init(this._document); + return; + } + + this.collapsed = this._isCollapsed(this.startContainer, this.startOffset, this.endContainer, this.endOffset); + + this.commonAncestorContainer = this._getCommonAncestorContainer(this.startContainer, this.endContainer); + }, + + _isCollapsed : function(oStartContainer, iStartOffset, oEndContainer, iEndOffset){ + var bCollapsed = false; + + if(oStartContainer == oEndContainer && iStartOffset == iEndOffset){ + bCollapsed = true; + }else{ + var oActualStartNode = this._getActualStartNode(oStartContainer, iStartOffset); + var oActualEndNode = this._getActualEndNode(oEndContainer, iEndOffset); + + // Take the parent nodes on the same level for easier comparison when they're next to each other + // eg) From + // + // + // + // + // + // + // + // + // + // + // + // + // , it's easier to compare the position of B and D rather than C and F because they are siblings + // + // If the range were collapsed, oActualEndNode will precede oActualStartNode by doing this + oActualStartNode = this._getNextNode(this._getPrevNode(oActualStartNode)); + oActualEndNode = this._getPrevNode(this._getNextNode(oActualEndNode)); + + if(oActualStartNode && oActualEndNode && oActualEndNode.tagName != "BODY" && + (this._getNextNode(oActualEndNode) == oActualStartNode || (oActualEndNode == oActualStartNode && this._isBlankTextNode(oActualEndNode))) + ) + bCollapsed = true; + } + + return bCollapsed; + }, + + _splitTextEndNodesOfTheRange : function(){ + var oEndPoints = this._splitTextEndNodes({oStartContainer: this.startContainer, iStartOffset: this.startOffset, + oEndContainer: this.endContainer, iEndOffset: this.endOffset}); + + this.startContainer = oEndPoints.oStartContainer; + this.startOffset = oEndPoints.iStartOffset; + + this.endContainer = oEndPoints.oEndContainer; + this.endOffset = oEndPoints.iEndOffset; + }, + + _splitTextEndNodes : function(oEndPoints){ + oEndPoints = this._splitStartTextNode(oEndPoints); + oEndPoints = this._splitEndTextNode(oEndPoints); + + return oEndPoints; + }, + + _splitStartTextNode : function(oEndPoints){ + var oStartContainer = oEndPoints.oStartContainer; + var iStartOffset = oEndPoints.iStartOffset; + + var oEndContainer = oEndPoints.oEndContainer; + var iEndOffset = oEndPoints.iEndOffset; + + if(!oStartContainer) return oEndPoints; + if(oStartContainer.nodeType != 3) return oEndPoints; + if(iStartOffset == 0) return oEndPoints; + + if(oStartContainer.nodeValue.length <= iStartOffset) return oEndPoints; + + var oLastPart = oStartContainer.splitText(iStartOffset); + + if(oStartContainer == oEndContainer){ + iEndOffset -= iStartOffset; + oEndContainer = oLastPart; + } + oStartContainer = oLastPart; + iStartOffset = 0; + + return {oStartContainer: oStartContainer, iStartOffset: iStartOffset, oEndContainer: oEndContainer, iEndOffset: iEndOffset}; + }, + + _splitEndTextNode : function(oEndPoints){ + var oStartContainer = oEndPoints.oStartContainer; + var iStartOffset = oEndPoints.iStartOffset; + + var oEndContainer = oEndPoints.oEndContainer; + var iEndOffset = oEndPoints.iEndOffset; + + if(!oEndContainer) return oEndPoints; + if(oEndContainer.nodeType != 3) return oEndPoints; + + if(iEndOffset >= oEndContainer.nodeValue.length) return oEndPoints; + if(iEndOffset == 0) return oEndPoints; + + oEndContainer.splitText(iEndOffset); + + return {oStartContainer: oStartContainer, iStartOffset: iStartOffset, oEndContainer: oEndContainer, iEndOffset: iEndOffset}; + }, + + _getNodesInRange : function(){ + if(this.collapsed) return []; + + var oStartNode = this._getActualStartNode(this.startContainer, this.startOffset); + var oEndNode = this._getActualEndNode(this.endContainer, this.endOffset); + + return this._getNodesBetween(oStartNode, oEndNode); + }, + + _getActualStartNode : function(oStartContainer, iStartOffset){ + var oStartNode = oStartContainer;; + + if(oStartContainer.nodeType == 3){ + if(iStartOffset >= oStartContainer.nodeValue.length){ + oStartNode = this._getNextNode(oStartContainer); + if(oStartNode.tagName == "BODY") oStartNode = null; + }else{ + oStartNode = oStartContainer; + } + }else{ + if(iStartOffset < xe.DOMFix.childNodes(oStartContainer).length){ + oStartNode = xe.DOMFix.childNodes(oStartContainer)[iStartOffset]; + }else{ + oStartNode = this._getNextNode(oStartContainer); + if(oStartNode.tagName == "BODY") oStartNode = null; + } + } + + return oStartNode; + }, + + _getActualEndNode : function(oEndContainer, iEndOffset){ + var oEndNode = oEndContainer; + + if(iEndOffset == 0){ + oEndNode = this._getPrevNode(oEndContainer); + if(oEndNode.tagName == "BODY") oEndNode = null; + }else if(oEndContainer.nodeType == 3){ + oEndNode = oEndContainer; + }else{ + oEndNode = xe.DOMFix.childNodes(oEndContainer)[iEndOffset-1]; + } + + return oEndNode; + }, + + _getNextNode : function(oNode){ + if(!oNode || oNode.tagName == "BODY") return this._document.body; + + if(oNode.nextSibling) return oNode.nextSibling; + + return this._getNextNode(xe.DOMFix.parentNode(oNode)); + }, + + _getPrevNode : function(oNode){ + if(!oNode || oNode.tagName == "BODY") return this._document.body; + + if(oNode.previousSibling) return oNode.previousSibling; + + return this._getPrevNode(xe.DOMFix.parentNode(oNode)); + }, + + // includes partially selected + // for
    , _getNodesBetween(b, c) will yield to b, "a" and c + _getNodesBetween : function(oStartNode, oEndNode){ + var aNodesBetween = []; + this._nNodesBetweenLen = 0; + + if(!oStartNode || !oEndNode) return aNodesBetween; + + this._recurGetNextNodesUntil(oStartNode, oEndNode, aNodesBetween); + return aNodesBetween; + }, + + _recurGetNextNodesUntil : function(oNode, oEndNode, aNodesBetween){ + if(!oNode) return false; + + if(!this._recurGetChildNodesUntil(oNode, oEndNode, aNodesBetween)) return false; + + var oNextToChk = oNode.nextSibling; + + while(!oNextToChk){ + if(!(oNode = xe.DOMFix.parentNode(oNode))) return false; + + aNodesBetween[this._nNodesBetweenLen++] = oNode; + + if(oNode == oEndNode) return false; + + oNextToChk = oNode.nextSibling; + } + + return this._recurGetNextNodesUntil(oNextToChk, oEndNode, aNodesBetween); + }, + + _recurGetChildNodesUntil : function(oNode, oEndNode, aNodesBetween){ + if(!oNode) return false; + + var bEndFound = false; + var oCurNode = oNode; + if(oCurNode.firstChild){ + oCurNode = oCurNode.firstChild; + while(oCurNode){ + if(!this._recurGetChildNodesUntil(oCurNode, oEndNode, aNodesBetween)){ + bEndFound = true; + break; + } + oCurNode = oCurNode.nextSibling; + } + } + + aNodesBetween[this._nNodesBetweenLen++] = oNode; + + if(bEndFound) return false; + if(oNode == oEndNode) return false; + + return true; + } +}); + +xe.W3CDOMRange.START_TO_START = 0; +xe.W3CDOMRange.START_TO_END = 1; +xe.W3CDOMRange.END_TO_END = 2; +xe.W3CDOMRange.END_TO_START = 3; + + +/** + * @fileOverview This file contains a cross-browser function that implements all of the W3C's DOM Range specification and some more + * @name XpressRange.js + */ +xe.XpressRange = $.Class({ + setWindow : function(win){ + this._window = win; + this._document = win.document; + }, + + $init : function(win){ + this.HUSKY_BOOMARK_START_ID_PREFIX = "xpress_bookmark_start_"; + this.HUSKY_BOOMARK_END_ID_PREFIX = "xpress_bookmark_end_"; + + this.sBlockElement = "P|DIV|LI|H[1-6]|PRE"; + this.sBlockContainer = "BODY|TABLE|TH|TR|TD|UL|OL|BLOCKQUOTE|FORM"; + + this.rxBlockElement = new RegExp("^("+this.sBlockElement+")$"); + this.rxBlockContainer = new RegExp("^("+this.sBlockContainer+")$") + this.rxLineBreaker = new RegExp("^("+this.sBlockElement+"|"+this.sBlockContainer+")$") + + this.setWindow(win); + + this.oSimpleSelection = new xe.SimpleSelection(this._window); + this.selectionLoaded = this.oSimpleSelection.selectionLoaded; + + this.$super.$init(this._document); + }, + + select : function(){ + this.oSimpleSelection.selectRange(this); + }, + + setFromSelection : function(iNum){ + this.setRange(this.oSimpleSelection.getRangeAt(iNum)); + }, + + setRange : function(oW3CRange){ + this.setStart(oW3CRange.startContainer, oW3CRange.startOffset); + this.setEnd(oW3CRange.endContainer, oW3CRange.endOffset); + }, + + setEndNodes : function(oSNode, oENode){ + this.setEndAfter(oENode); + this.setStartBefore(oSNode); + }, + + splitTextAtBothEnds : function(){ + this._splitTextEndNodesOfTheRange(); + }, + + getStartNode : function(){ + if(this.collapsed){ + if(this.startContainer.nodeType == 3){ + if(this.startOffset == 0) return null; + if(this.startContainer.nodeValue.length <= this.startOffset) return null; + return this.startContainer; + } + return null; + } + + if(this.startContainer.nodeType == 3){ + if(this.startOffset >= this.startContainer.nodeValue.length) return this._getNextNode(this.startContainer); + return this.startContainer; + }else{ + if(this.startOffset >= xe.DOMFix.childNodes(this.startContainer).length) return this._getNextNode(this.startContainer); + return xe.DOMFix.childNodes(this.startContainer)[this.startOffset]; + } + }, + + getEndNode : function(){ + if(this.collapsed) return this.getStartNode(); + + if(this.endContainer.nodeType == 3){ + if(this.endOffset == 0) return this._getPrevNode(this.endContainer); + return this.endContainer; + }else{ + if(this.endOffset == 0) return this._getPrevNode(this.endContainer); + return xe.DOMFix.childNodes(this.endContainer)[this.endOffset-1]; + } + }, + + getNodeAroundRange : function(bBefore, bStrict){ + if(this.collapsed && this.startContainer && this.startContainer.nodeType == 3) return this.startContainer; + if(!this.collapsed || (this.startContainer && this.startContainer.nodeType == 3)) return this.getStartNode(); + + var oBeforeRange, oAfterRange, oResult; + + if(this.startOffset >= xe.DOMFix.childNodes(this.startContainer).length) + oAfterRange = this._getNextNode(this.startContainer); + else + oAfterRange = xe.DOMFix.childNodes(this.startContainer)[this.startOffset]; + + if(this.endOffset == 0) + oBeforeRange = this._getPrevNode(this.endContainer); + else + oBeforeRange = xe.DOMFix.childNodes(this.endContainer)[this.endOffset-1]; + + if(bBefore){ + oResult = oBeforeRange; + if(!oResult && !bStrict) oResult = oAfterRange; + }else{ + oResult = oAfterRange; + if(!oResult && !bStrict) oResult = oBeforeRange; + } + + return oResult; + }, + + _getXPath : function(elNode){ + var sXPath = ""; + + while(elNode && elNode.nodeType == 1){ + sXPath = "/" + elNode.tagName+"["+this._getPosIdx4XPath(elNode)+"]" + sXPath; + elNode = xe.DOMFix.parentNode(elNode); + } + + return sXPath; + }, + + _getPosIdx4XPath : function(refNode){ + var idx = 0; + for(var node = refNode.previousSibling; node; node = node.previousSibling) + if(node.tagName == refNode.tagName) idx++; + + return idx; + }, + + // this was written specifically for XPath Bookmark and it may not perform correctly for general purposes + _evaluateXPath : function(sXPath, oDoc){ + sXPath = sXPath.substring(1, sXPath.length-1); + var aXPath = sXPath.split(/\//); + var elNode = oDoc.body; + + for(var i=2; i -1 && elContainer){ + var aChildNodes = xe.DOMFix.childNodes(elContainer); + var elNode = null; + + var nIdx = nTextNodeIdx; + var nOffsetLeft = nOffset; + + while((elNode = aChildNodes[nIdx]) && elNode.nodeType == 3 && elNode.nodeValue.length < nOffsetLeft){ + nOffsetLeft -= elNode.nodeValue.length; + nIdx++; + } + + elContainer = xe.DOMFix.childNodes(elContainer)[nIdx]; + nOffset = nOffsetLeft; + } + + if(!elContainer){ + elContainer = this._document.body; + nOffset = 0; + } + return {elContainer: elContainer, nOffset: nOffset}; + }, + + // this was written specifically for XPath Bookmark and it may not perform correctly for general purposes + getXPathBookmark : function(){ + var nTextNodeIdx1 = -1; + var htEndPt1 = {elContainer: this.startContainer, nOffset: this.startOffset}; + var elNode1 = this.startContainer; + if(elNode1.nodeType == 3){ + htEndPt1 = this._getFixedStartTextNode(); + nTextNodeIdx1 = this._getPosIdx(htEndPt1.elContainer); + elNode1 = xe.DOMFix.parentNode(elNode1); + } + var sXPathNode1 = this._getXPath(elNode1); + var oBookmark1 = {sXPath:sXPathNode1, nTextNodeIdx:nTextNodeIdx1, nOffset: htEndPt1.nOffset}; + + var nTextNodeIdx2 = -1; + var htEndPt2 = {elContainer: this.endContainer, nOffset: this.endOffset}; + var elNode2 = this.endContainer; + if(elNode2.nodeType == 3){ + htEndPt2 = this._getFixedEndTextNode(); + nTextNodeIdx2 = this._getPosIdx(htEndPt2.elContainer); + elNode2 = xe.DOMFix.parentNode(elNode2); + } + var sXPathNode2 = this._getXPath(elNode2); + var oBookmark2 = {sXPath:sXPathNode2, nTextNodeIdx:nTextNodeIdx2, nOffset: htEndPt2.nOffset}; + + return [oBookmark1, oBookmark2]; + }, + + moveToXPathBookmark : function(aBookmark){ + if(!aBookmark) return; + + var oBookmarkInfo1 = this._evaluateXPathBookmark(aBookmark[0]); + var oBookmarkInfo2 = this._evaluateXPathBookmark(aBookmark[1]); + + if(!oBookmarkInfo1["elContainer"] || !oBookmarkInfo2["elContainer"]) return; + + this.startContainer = oBookmarkInfo1["elContainer"]; + this.startOffset = oBookmarkInfo1["nOffset"]; + + this.endContainer = oBookmarkInfo2["elContainer"]; + this.endOffset = oBookmarkInfo2["nOffset"]; + }, + + _getFixedTextContainer : function(elNode, nOffset){ + while(elNode && elNode.nodeType == 3 && elNode.previousSibling && elNode.previousSibling.nodeType == 3){ + nOffset += elNode.previousSibling.nodeValue.length; + elNode = elNode.previousSibling; + } + + return {elContainer:elNode, nOffset:nOffset}; + }, + + _getFixedStartTextNode : function(){ + return this._getFixedTextContainer(this.startContainer, this.startOffset); + }, + + _getFixedEndTextNode : function(){ + return this._getFixedTextContainer(this.endContainer, this.endOffset); + }, + + placeStringBookmark : function(){ + var sTmpId = (new Date()).getTime(); + + var oInsertionPoint = this.cloneRange(); + oInsertionPoint.collapseToEnd(); + var oEndMarker = this._document.createElement("A"); + oEndMarker.id = this.HUSKY_BOOMARK_END_ID_PREFIX+sTmpId; + oInsertionPoint.insertNode(oEndMarker); + + var oInsertionPoint = this.cloneRange(); + oInsertionPoint.collapseToStart(); + var oStartMarker = this._document.createElement("A"); + oStartMarker.id = this.HUSKY_BOOMARK_START_ID_PREFIX+sTmpId; + oInsertionPoint.insertNode(oStartMarker); + + this.moveToBookmark(sTmpId); + + return sTmpId; + }, + + cloneRange : function(){ + return this._copyRange(new xe.XpressRange(this._window)); + }, + + moveToBookmark : function(vBookmark){ + if(typeof(vBookmark) != "object") + this.moveToStringBookmark(vBookmark); + else + this.moveToXPathBookmark(vBookmark); + }, + + moveToStringBookmark : function(sBookmarkID){ + var oStartMarker = this._document.getElementById(this.HUSKY_BOOMARK_START_ID_PREFIX+sBookmarkID); + var oEndMarker = this._document.getElementById(this.HUSKY_BOOMARK_END_ID_PREFIX+sBookmarkID); + + if(!oStartMarker || !oEndMarker) return; + + this.setEndBefore(oEndMarker); + this.setStartAfter(oStartMarker); + }, + + removeStringBookmark : function(sBookmarkID){ + var oStartMarker = this._document.getElementById(this.HUSKY_BOOMARK_START_ID_PREFIX+sBookmarkID); + var oEndMarker = this._document.getElementById(this.HUSKY_BOOMARK_END_ID_PREFIX+sBookmarkID); + + if(oStartMarker) xe.DOMFix.parentNode(oStartMarker).removeChild(oStartMarker); + if(oEndMarker) xe.DOMFix.parentNode(oEndMarker).removeChild(oEndMarker); + }, + + collapseToStart : function(){ + this.collapse(true); + }, + + collapseToEnd : function(){ + this.collapse(false); + }, + + createAndInsertNode : function(sTagName){ + tmpNode = this._document.createElement(tagName); + this.insertNode(tmpNode) + return tmpNode + }, + + getNodes : function(bSplitTextEndNodes, fnFilter){ + if(bSplitTextEndNodes) this._splitTextEndNodesOfTheRange(); + + var aAllNodes = this._getNodesInRange(); + var aFilteredNodes = []; + + if(!fnFilter) return aAllNodes; + + for(var i=0; i= 0) return true; + + if(bIncludePartlyIncluded){ + if(startToEnd == 1) return false; + if(endToStart == -1) return false; + return true; + } + + return false; + }, + + isNodeInRange : function(oNode, bIncludePartlySelected, bContentOnly){ + var oTmpRange = new xe.XpressRange(this._window); + + if(bContentOnly && oNode.firstChild){ + oTmpRange.setStartBefore(oNode.firstChild); + oTmpRange.setEndAfter(oNode.lastChild); + }else{ + oTmpRange.selectNode(oNode); + } + + return isRangeInRange(oTmpRange, bIncludePartlySelected); + }, + + pasteHTML : function(sHTML){ + if(sHTML == ""){ + this.deleteContents(); + return; + } + + var oTmpDiv = this._document.createElement("DIV"); + oTmpDiv.innerHTML = sHTML; + + var oFirstNode = oTmpDiv.firstChild; + var oLastNode = oTmpDiv.lastChild; + + var clone = this.cloneRange(); + var sBM = clone.placeStringBookmark(); + + while(oTmpDiv.lastChild) this.insertNode(oTmpDiv.lastChild); + + this.setEndNodes(oFirstNode, oLastNode); + + // delete the content later as deleting it first may mass up the insertion point + // eg)

    [A]BCD

    ---paste O---> O

    BCD

    + clone.moveToBookmark(sBM); + clone.deleteContents(); + clone.removeStringBookmark(sBM); + }, + + toString : function(){ + this.toString = xe.W3CDOMRange.prototype.toString; + return this.toString(); + }, + + toHTMLString : function(){ + var oTmpContainer = this._document.createElement("DIV"); + oTmpContainer.appendChild(this.cloneContents()); + + return oTmpContainer.innerHTML; + }, + + findAncestorByTagName : function(sTagName){ + var oNode = this.commonAncestorContainer; + while(oNode && oNode.tagName != sTagName) oNode = xe.DOMFix.parentNode(oNode); + + return oNode; + }, + + selectNodeContents : function(oNode){ + if(!oNode) return; + + var oFirstNode = oNode.firstChild?oNode.firstChild:oNode; + var oLastNode = oNode.lastChild?oNode.lastChild:oNode; + + if(oFirstNode.nodeType == 3) + this.setStart(oFirstNode, 0); + else + this.setStartBefore(oFirstNode); + + if(oLastNode.nodeType == 3) + this.setEnd(oLastNode, oLastNode.nodeValue.length); + else + this.setEndAfter(oLastNode); + }, + + styleRange : function(oStyle, oAttribute, sNewSpanMarker){ + var aStyleParents = this._getStyleParentNodes(sNewSpanMarker); + if(aStyleParents.length < 1) return; + + var sName, sValue; + + for(var i=0; i= 0)){ + oSNode = this.getNodeAroundRange(false, true); + oENode = this.getNodeAroundRange(false, true); + oStart = this._getLineStartInfo(oSNode); + oEnd = this._getLineEndInfo(oENode); + } + + return {oStart: oStart, oEnd: oEnd}; + } +}).extend(xe.W3CDOMRange); + +/** + * @fileOverview This file contains cross-browser selection function + * @name SimpleSelection.js + */ +xe.SimpleSelection = function(win){ + this.init = function(win){ + this._window = win || window; + this._document = this._window.document; + }; + + this.init(win); + + if($.browser.msie) + xe.SimpleSelectionImpl_IE.apply(this); + else + xe.SimpleSelectionImpl_FF.apply(this); + + this.selectRange = function(oRng){ + this.selectNone(); + this.addRange(oRng); + }; + + this.selectionLoaded = true; + if(!this._oSelection) this.selectionLoaded = false; +}; + +xe.SimpleSelectionImpl_FF = function(){ + this._oSelection = this._window.getSelection(); + + this.getRangeAt = function(iNum){ + iNum = iNum || 0; + + try{ + var oFFRange = this._oSelection.getRangeAt(iNum); + }catch(e){return new xe.W3CDOMRange(this._document);} + + return this._FFRange2W3CRange(oFFRange); + }; + + this.addRange = function(oW3CRange){ + var oFFRange = this._W3CRange2FFRange(oW3CRange); + this._oSelection.addRange(oFFRange); + }; + + this.selectNone = function(){ + this._oSelection.removeAllRanges(); + }; + + this._FFRange2W3CRange = function(oFFRange){ + var oW3CRange = new xe.W3CDOMRange(this._document); + oW3CRange.setStart(oFFRange.startContainer, oFFRange.startOffset); + oW3CRange.setEnd(oFFRange.endContainer, oFFRange.endOffset); + return oW3CRange; + }; + + this._W3CRange2FFRange = function(oW3CRange){ + var oFFRange = this._document.createRange(); + oFFRange.setStart(oW3CRange.startContainer, oW3CRange.startOffset); + oFFRange.setEnd(oW3CRange.endContainer, oW3CRange.endOffset); + + return oFFRange; + }; +}; + +xe.SimpleSelectionImpl_IE = function(){ + this._oSelection = this._document.selection; + + this.getRangeAt = function(iNum){ + iNum = iNum || 0; + + if(this._oSelection.type == "Control"){ + var oW3CRange = new xe.W3CDOMRange(this._document); + + var oSelectedNode = this._oSelection.createRange().item(iNum); + + // if the selction occurs in a different document, ignore + if(!oSelectedNode || oSelectedNode.ownerDocument != this._document) return oW3CRange; + + oW3CRange.selectNode(oSelectedNode); + + return oW3CRange; + }else{ + var oSelectedNode = this._oSelection.createRangeCollection().item(iNum).parentElement(); + + // if the selction occurs in a different document, ignore + if(!oSelectedNode || oSelectedNode.ownerDocument != this._document){ + var oW3CRange = new xe.W3CDOMRange(this._document); + return oW3CRange; + } + return this._IERange2W3CRange(this._oSelection.createRangeCollection().item(iNum)); + } + }; + + this.addRange = function(oW3CRange){ + var oIERange = this._W3CRange2IERange(oW3CRange); + oIERange.select(); + }; + + this.selectNone = function(){ + this._oSelection.empty(); + }; + + this._W3CRange2IERange = function(oW3CRange){ + var oStartIERange = this._getIERangeAt(oW3CRange.startContainer, oW3CRange.startOffset); + var oEndIERange = this._getIERangeAt(oW3CRange.endContainer, oW3CRange.endOffset); + oStartIERange.setEndPoint("EndToEnd", oEndIERange); + + return oStartIERange; + }; + + this._getIERangeAt = function(oW3CContainer, iW3COffset){ + var oIERange = this._document.body.createTextRange(); + + var oEndPointInfoForIERange = this._getSelectableNodeAndOffsetForIE(oW3CContainer, iW3COffset); + + var oSelectableNode = oEndPointInfoForIERange.oSelectableNodeForIE; + var iIEOffset = oEndPointInfoForIERange.iOffsetForIE; + + oIERange.moveToElementText(oSelectableNode); + oIERange.collapse(oEndPointInfoForIERange.bCollapseToStart); + oIERange.moveStart("character", iIEOffset); + + return oIERange; + }; + + this._getSelectableNodeAndOffsetForIE = function(oW3CContainer, iW3COffset){ + var oIERange = this._document.body.createTextRange(); + + var oNonTextNode = null; + var aChildNodes = null; + var iNumOfLeftNodesToCount = 0; + + if(oW3CContainer.nodeType == 3){ + oNonTextNode = xe.DOMFix.parentNode(oW3CContainer); + aChildNodes = xe.DOMFix.childNodes(oNonTextNode); + iNumOfLeftNodesToCount = aChildNodes.length; + }else{ + oNonTextNode = oW3CContainer; + aChildNodes = xe.DOMFix.childNodes(oNonTextNode); + iNumOfLeftNodesToCount = iW3COffset; + } + + var oNodeTester = null; + + var iResultOffset = 0; + + var bCollapseToStart = true; + + for(var i=0; i=0) break; + + oPrevNonTextNode = aChildNodes[i]; + } + + var pointRangeIdx = i; + + if(pointRangeIdx != 0 && aChildNodes[pointRangeIdx-1].nodeType == 3){ + var oRgTextStart = this._document.body.createTextRange(); + var oCurTextNode = null; + if(oPrevNonTextNode){ + oRgTextStart.moveToElementText(oPrevNonTextNode); + oRgTextStart.collapse(false); + oCurTextNode = oPrevNonTextNode.nextSibling; + }else{ + oRgTextStart.moveToElementText(oContainer); + oRgTextStart.collapse(true); + oCurTextNode = oContainer.firstChild; + } + + var oRgTextsUpToThePoint = oRgOrigPoint.duplicate(); + oRgTextsUpToThePoint.setEndPoint("StartToStart", oRgTextStart); + + var textCount = oRgTextsUpToThePoint.text.length + + while(textCount > oCurTextNode.nodeValue.length && oCurTextNode.nextSibling){ + textCount -= oCurTextNode.nodeValue.length; + oCurTextNode = oCurTextNode.nextSibling; + } + + // this will enforce IE to re-reference oCurTextNode + var oTmp = oCurTextNode.nodeValue; + + if(bStartPt && oCurTextNode.nextSibling && oCurTextNode.nextSibling.nodeType == 3 && textCount == oCurTextNode.nodeValue.length){ + textCount -= oCurTextNode.nodeValue.length; + oCurTextNode = oCurTextNode.nextSibling; + } + + oContainer = oCurTextNode; + offset = textCount; + }else{ + oContainer = oRgOrigPoint.parentElement(); + offset = pointRangeIdx; + } + + return {"oContainer" : oContainer, "iOffset" : offset}; + }; +} + +xe.DOMFix = new ($.Class({ + $init : function(){ + if($.browser.msie || $.browser.opera){ + this.childNodes = this._childNodes_Fix; + this.parentNode = this._parentNode_Fix; + }else{ + this.childNodes = this._childNodes_Native; + this.parentNode = this._parentNode_Native; + } + }, + + _parentNode_Native : function(elNode){ + return elNode.parentNode; + }, + + _parentNode_Fix : function(elNode){ + if(!elNode) return elNode; + + while(elNode.previousSibling){elNode = elNode.previousSibling;} + + return elNode.parentNode; + }, + + _childNodes_Native : function(elNode){ + return elNode.childNodes; + }, + + _childNodes_Fix : function(elNode){ + var aResult = null; + var nCount = 0; + + if(elNode){ + var aResult = []; + elNode = elNode.firstChild; + while(elNode){ + aResult[nCount++] = elNode; + elNode=elNode.nextSibling; + } + } + + return aResult; + } +}))(); + +/** + * @fileOverview This file contains a function that takes care of the draggable layers + * @name N_DraggableLayer.js + */ +xe.DraggableLayer = $.Class({ + $init : function(oLayer, oOptions){ + this.oOptions = $.extend({ + bModal : "false", + oHandle : oLayer, + iMinX : -999999, + iMinY : -999999, + iMaxX : 999999, + iMaxY : 999999 + }, oOptions); + + this.oHandle = this.oOptions.oHandle; + + oLayer.style.display = "block"; + oLayer.style.position = "absolute"; + oLayer.style.zIndex = "9999"; + + this.aBasePosition = this.getBaseOffset(oLayer); + + // "number-ize" the position and set it as inline style. (the position could've been set as "auto" or set by css, not inline style) + oLayer.style.top = (this.toInt($(oLayer).offset().top) - this.aBasePosition.top)+"px"; + oLayer.style.left = (this.toInt($(oLayer).offset().left) - this.aBasePosition.left)+"px"; + + this.$FnMouseDown = $.fnBind(this._mousedown, this, oLayer); + this.$FnMouseMove = $.fnBind(this._mousemove, this, oLayer); + this.$FnMouseUp = $.fnBind(this._mouseup, this, oLayer); + + $(this.oHandle).bind("mousedown", this.$FnMouseDown); + }, + + _mousedown : function(oLayer, oEvent){ + if(oEvent.target.tagName == "INPUT") return; + + this.MouseOffsetY = (oEvent.pageY-this.toInt(oLayer.style.top)-this.aBasePosition['top']); + this.MouseOffsetX = (oEvent.pageX-this.toInt(oLayer.style.left)-this.aBasePosition['left']); + + $(oLayer).bind("mousemove", this.$FnMouseMove); + $(oLayer).bind("mouseup", this.$FnMouseUp); + }, + + _mousemove : function(oLayer, oEvent){ + var iTop = (oEvent.pageY-this.MouseOffsetY-this.aBasePosition['top']); + var iLeft = (oEvent.pageX-this.MouseOffsetX-this.aBasePosition['left']); + + if(iTopthis.oOptions.iMaxY) iTop = this.oOptions.iMaxY; + + if(iLeftthis.oOptions.iMaxX) iLeft = this.oOptions.iMaxX; + + oLayer.style.top = iTop + "px"; + oLayer.style.left = iLeft + "px"; + }, + + _mouseup : function(oLayer, oEvent){ + $(oLayer).unbind("mousemove", this.$FnMouseMove); + $(oLayer).unbind("mouseup", this.$FnMouseUp); + }, + + toInt : function(num){ + var result = parseInt(num); + return result || 0; + }, + + findNonStatic : function(oEl){ + if(!oEl) return null; + if(oEl.tagName == "BODY") return oEl; + + if($(oEl).css("position").match(/absolute|relative/i)) return oEl; + + return this.findNonStatic(oEl.offsetParent); + }, + + getBaseOffset : function(oEl){ + var oBase = this.findNonStatic(oEl.offsetParent); + var tmp = $(oBase).offset(); + + return {top: tmp.top, left: tmp.left}; + } +}); +//{ +/** + * @fileOverview This file contains Xpress plugin that takes care of the messages related to core operations + * @name hp_CorePlugin.js + */ +xe.CorePlugin = $.Class({ + name : "CorePlugin", + + $init : function(funcOnReady){ + this.funcOnReady = funcOnReady; + }, + + $AFTER_MSG_APP_READY : function(){ + this.oApp.exec("EXEC_ON_READY_FUNCTION", []); + }, + + $ON_ADD_APP_PROPERTY : function(sPropertyName, oProperty){ + this.oApp[sPropertyName] = oProperty; + }, + + $ON_REGISTER_BROWSER_EVENT : function(obj, sEvent, sCMD, aParams, nDelay){ + this.oApp.registerBrowserEvent(obj, sEvent, sCMD, aParams, nDelay); + }, + + $ON_DISABLE_COMMAND : function(sCommand){ + this.oApp.disableCommand(sCommand, true); + }, + + $ON_ENABLE_COMMAND : function(sCommand){ + this.oApp.disableCommand(sCommand, false); + }, + + $ON_EXEC_ON_READY_FUNCTION : function(){ + if(typeof this.funcOnReady == "function") this.funcOnReady(); + } +}); +//} +//{ +/** + * @fileOverview This file contains Xpress plugin that helps various operations. + * @name hp_Utils.js + */ + xe.Utils = $.Class({ + name : "Utils", + + $init : function(){ + if($.browser.msie && $.browser.nVersion == 6){ + try{ + document.execCommand('BackgroundImageCache', false, true); + }catch(e){} + } + }, + + $ON_ATTACH_HOVER_EVENTS : function(aElms, sHoverClass){ + sHoverClass = sHoverClass || "hover"; + + if(!aElms) return; + + $(aElms).hover( + function(){$(this).addClass(sHoverClass)}, + function(){$(this).removeClass(sHoverClass)} + ); + } +}); +//} + +//{ +/** + * @fileOverview This file contains Xpress plugin that bridges the XpressRange function + * @name hp_XpressRangeManager.js + */ +xe.XpressRangeManager = $.Class({ + name : "XpressRangeManager", + + oWindow : null, + + $init : function(win){ + this.oWindow = win || window; + }, + + $BEFORE_MSG_APP_READY : function(){ + if(this.oWindow && this.oWindow.tagName == "IFRAME") + this.oWindow = this.oWindow.contentWindow; + + this.oApp.exec("ADD_APP_PROPERTY", ["getSelection", $.fnBind(this.getSelection, this)]); + this.oApp.exec("ADD_APP_PROPERTY", ["getEmptySelection", $.fnBind(this.getEmptySelection, this)]); + }, + + $ON_SET_EDITING_WINDOW : function(oWindow){ + this.oWindow = oWindow; + }, + + getEmptySelection : function(){ + var oXpressRange = new xe.XpressRange(this.oWindow); + return oXpressRange; + }, + + getSelection : function(){ + this.oApp.exec("RESTORE_IE_SELECTION", []); + + var oXpressRange = this.getEmptySelection(); + + // this may throw an exception if the selected is area is not yet shown + try{ + oXpressRange.setFromSelection(); + }catch(e){} + + return oXpressRange; + } +}); +//} +xe.Hotkey = $.Class({ + name : "Hotkey", + + storage : {}, + keyhash : {}, + + $init : function(){ + this.storage = {}; + + this.keyhash = { + backspace : 8, + tab : 9, + enter : 13, + shift : 16, + ctrl : 17, + alt : 18, + meta : 224, + esc : 27, + space : 32, + pageup : 33, + pagedown : 34, + end : 35, + home : 36, + left : 37, + up : 38, + right : 39, + down : 40, + del : 46, + comma : 188,//(,) + period : 190,//(.) + slash : 191,//(/) + hyphen : 109, + equal : 61 + }; + + if ($.browser.msie || $.browser.safari) { + this.keyhash.hyphen = 189; // (-) + this.keyhash.equal = 187; // (=) + this.keyhash.meta = 91; // meta + } + + + }, + + $ON_MSG_APP_READY : function(){ + $(this.oApp.getWYSIWYGDocument() || document).keydown($.fnBind(this.keydown, this)); + }, + + $ON_REGISTER_HOTKEY : function(sHotkey, sCMD, sArgs){ + if(!sArgs) sArgs = []; + var func = $.fnBind(this.oApp.exec, this.oApp, sCMD, sArgs); + + sHotkey = this.normalize(sHotkey); + if (!sHotkey) return false; + + this.add(sHotkey, func); + }, + + add : function(sHotkey, func) { + if (typeof this.storage[sHotkey] == 'undefined') { + this.storage[sHotkey] = [func]; + } else { + this.storage[sHotkey].push(func); + } + }, + + keydown : function(event) { + var key = [], kh = this.keyhash; + + if ($.inArray(event.keyCode, [kh.shift, kh.ctrl, kh.alt, kh.meta]) >= 0) return; + + if (event.shiftKey) key.push('shift'); + if (event.altKey) key.push('alt'); + if (event.ctrlKey) key.push('ctrl'); + if (event.metaKey) key.push('meta'); + if (!key.length) return; + if (key.length == 1 && event.metaKey) key = ['ctrl', 'meta']; + + key.push(event.keyCode); + + key = key.join('+'); + + if (!this.storage[key]) return; + + $.each(this.storage[key], function(){ this(); }); + + return false; + }, + + normalize : function(sHotkey) { + var shift, ctrl, alt, meta, key, keys = (sHotkey||"").toLowerCase().split('+'); + + shift = ctrl = alt = meta = key = false; + + $.each(keys, function(){ + var s = ""+this; + switch(s) { + case 'shift': shift = true; + case 'alt' : alt = true; + case 'ctrl' : ctrl = true; + case 'meta' : meta = true; + default: + key = s; + } + }); + + if (!key) return ''; + + keys = []; + if (shift) keys.push('shift'); + if (alt) keys.push('alt'); + if (ctrl) keys.push('ctrl'); + if (meta || (ctrl && !shift && !alt)) keys.push('meta'); + + keys.push(this.keyhash[key] || key.toUpperCase().charCodeAt(0)); + + return keys.join('+'); + } +}); + +//{ +/** + * @fileOverview This file contains Xpress plugin that takes care of the draggable layers + * @name hp_DialogLayerManager.js + */ +xe.DialogLayerManager = $.Class({ + name : "DialogLayerManager", + aMadeDraggable : null, + aOpenedLayers : null, + + $init : function(){ + this.aMadeDraggable = []; + this.aOpenedLayers = []; + }, + + $ON_SHOW_DIALOG_LAYER : function(oLayer, bModal){ + oLayer = $.$(oLayer); + bModal = $.$(bModal) || false; + if(!oLayer) return; + + if($.inArray(oLayer, this.aOpenedLayers) != -1) return; + + this.oApp.exec("POSITION_DIALOG_LAYER", [oLayer]); + + this.aOpenedLayers[this.aOpenedLayers.length] = oLayer; + + if($.inArray(oLayer, this.aMadeDraggable) == -1){ + new xe.DraggableLayer(oLayer, {bModal: bModal, iMinY: 0}); + this.aMadeDraggable[this.aMadeDraggable.length] = oLayer; + }else{ + oLayer.style.display = "block"; + } + }, + + $ON_HIDE_LAST_DIALOG_LAYER : function(){ + this.oApp.exec("HIDE_DIALOG_LAYER", [this.aOpenedLayers[this.aOpenedLayers.length-1]]); + }, + + $ON_HIDE_ALL_DIALOG_LAYER : function(){ + for(var i=this.aOpenedLayers.length-1; i>=0; i--) + this.oApp.exec("HIDE_DIALOG_LAYER", [this.aOpenedLayers[i]]); + }, + + $ON_HIDE_DIALOG_LAYER : function(oLayer){ + oLayer = $.$(oLayer); + + if(oLayer) oLayer.style.display = "none"; + this.aOpenedLayers = $.grep(this.aOpenedLayers, function(a){return a!=oLayer}); + }, + + $ON_SET_DIALOG_LAYER_POSITION : function(oLayer, iTop, iLeft){ + oLayer.style.top = iTop; + oLayer.style.left = iLeft; + } +}); +//} +//{ +/** + * @fileOverview This file contains Xpress plugin that takes care of the layers that should disappear when the focus is lost + * @name hp_ActiveLayerManager.js + */ +xe.ActiveLayerManager = $.Class({ + name : "ActiveLayerManager", + oCurrentLayer : null, + + $ON_TOGGLE_ACTIVE_LAYER : function(oLayer, sOnOpenCmd, aOnOpenParam, sOnCloseCmd, aOnCloseParam){ + if(oLayer == this.oCurrentLayer){ + this.oApp.exec("HIDE_ACTIVE_LAYER", []); + }else{ + this.oApp.exec("SHOW_ACTIVE_LAYER", [oLayer, sOnCloseCmd, aOnCloseParam]); + if(sOnOpenCmd) this.oApp.exec(sOnOpenCmd, aOnOpenParam); + } + }, + + $ON_SHOW_ACTIVE_LAYER : function(oLayer, sOnCloseCmd, aOnCloseParam){ + oLayer = $.$(oLayer); + this.sOnCloseCmd = sOnCloseCmd; + this.aOnCloseParam = aOnCloseParam; + + var oPrevLayer = this.oCurrentLayer; + + if(oLayer == oPrevLayer) return; + + this.oApp.exec("HIDE_ACTIVE_LAYER", []); + + oLayer.style.display = "block"; + this.oCurrentLayer = oLayer; + }, + + $ON_HIDE_ACTIVE_LAYER : function(){ + var oLayer = this.oCurrentLayer; + if(!oLayer) return; + oLayer.style.display = "none"; + this.oCurrentLayer = null; + + if(this.sOnCloseCmd) + this.oApp.exec(this.sOnCloseCmd, this.aOnCloseParam); + }, + + // for backward compatibility only. + // use HIDE_ACTIVE_LAYER instead! + $ON_HIDE_CURRENT_ACTIVE_LAYER : function(){ + this.oApp.exec("HIDE_ACTIVE_LAYER", []); + }, + + $ON_EVENT_EDITING_AREA_KEYDOWN : function(){ + this.oApp.exec("HIDE_ACTIVE_LAYER", []); + }, + + $ON_EVENT_EDITING_AREA_MOUSEDOWN : function(){ + this.oApp.exec("HIDE_ACTIVE_LAYER", []); + } +}); +//} +//{ +/** + * @fileOverview This file contains Xpress plugin that takes care of the operations related to string conversion. Ususally used to convert the IR value. + * @name hp_StringConverterManager.js + */ +xe.StringConverterManager = $.Class({ + name : "StringConverterManager", + + oConverters : null, + + $init : function(){ + this.oConverters = {}; + }, + + $BEFORE_MSG_APP_READY : function(){ + this.oApp.exec("ADD_APP_PROPERTY", ["applyConverter", $.fnBind(this.applyConverter, this)]); + this.oApp.exec("ADD_APP_PROPERTY", ["addConverter", $.fnBind(this.addConverter, this)]); + }, + + applyConverter : function(sRuleName, sContent){ + var aConverters = this.oConverters[sRuleName]; + if(!aConverters) return sContent; + + for(var i=0; i*:first-child", aAllLi[i]).get(0); + } + } + }, + + $ON_MSG_APP_READY : function(){ + this.oApp.registerBrowserEvent(this.toolbarArea, "mouseover", "EVENT_TOOLBAR_MOUSEOVER", []); + this.oApp.registerBrowserEvent(this.toolbarArea, "mouseout", "EVENT_TOOLBAR_MOUSEOUT", []); + + this.oApp.exec("ADD_APP_PROPERTY", ["getToolbarButtonByUIName", $.fnBind(this.getToolbarButtonByUIName, this)]); + }, + + $ON_EVENT_TOOLBAR_MOUSEOVER : function(weEvent){ + if(weEvent.target.tagName == "BUTTON") $(weEvent.target).addClass("hover").parent("span").addClass("hover"); + }, + + $ON_EVENT_TOOLBAR_MOUSEOUT : function(weEvent){ + if(weEvent.target.tagName == "BUTTON") $(weEvent.target).removeClass("hover").parent("span").removeClass("hover"); + }, + + $ON_TOGGLE_TOOLBAR_ACTIVE_LAYER : function(oLayer, oBtn, sOpenCmd, aOpenArgs, sCloseCmd, aCloseArgs){ + this.oApp.exec("TOGGLE_ACTIVE_LAYER", [oLayer, "MSG_TOOLBAR_LAYER_SHOWN", [oLayer, oBtn, sOpenCmd, aOpenArgs], sCloseCmd, aCloseArgs]); + }, + + $ON_MSG_TOOLBAR_LAYER_SHOWN : function(oLayer, oBtn, aOpenCmd, aOpenArgs){ + this.oApp.exec("POSITION_TOOLBAR_LAYER", [oLayer, oBtn]); + if(aOpenCmd) this.oApp.exec(aOpenCmd, aOpenArgs); + }, + + $ON_SHOW_TOOLBAR_ACTIVE_LAYER : function(oLayer, sCmd, aArgs, oBtn){ + this.oApp.exec("SHOW_ACTIVE_LAYER", [oLayer, sCmd, aArgs]); + this.oApp.exec("POSITION_TOOLBAR_LAYER", [oLayer, oBtn]); + }, + + $ON_ENABLE_UI : function(sUIName){ + var elUI = this.htUIList[sUIName]; + if(!elUI) return; + $(elUI).removeClass("off"); + elUI.disabled = false; + + // enable related commands + var sCmd = ""; + if(this.aUICmdMap[sUIName]){ + for(var i=0; i nToolbarLeft) oLayer.style.left = (nToolbarLeft-nLayerLeft-5)+"px"; + }, + + getToolbarButtonByUIName : function(sUIName){ + return this.htUIList[sUIName]; + } +}); +//} +//{ +/** + * @fileOverview This file contains Xpress plugin that manages multiple number editing area plugins and the IR value + * @name hp_XE_EditingAreaManager.js + */ +xe.XE_EditingAreaManager = $.Class({ + name : "XE_EditingAreaManager", + + // Currently active plugin instance(XE_EditingArea_???) + oActivePlugin : null, + + // Intermediate Representation of the content being edited. + // This should be a textarea element. + oIRField : null, + + bIsDirty : false, + + $init : function(sInitialMode, oIRField, oDimension, fOnBeforeUnload, oAppContainer){ + this.sInitialMode = sInitialMode; + this.oIRField = $.$(oIRField); + this._assignHTMLObjects(oAppContainer); + this.fOnBeforeUnload = fOnBeforeUnload; + + this.oEditingMode = {}; + + this.elEditingAreaContainer.style.height = parseInt(oDimension.nHeight || this.elEditingAreaContainer.offsetHeight)+"px"; + + this.nMinHeight = oDimension.nMinHeight || 10; + this.niMinWidth = oDimension.nMinWidth || 10; + }, + + _assignHTMLObjects : function(oAppContainer){ + oAppContainer = $.$(oAppContainer) || document; + this.elEditingAreaContainer = $("DIV.xpress_xeditor_editing_area_container", oAppContainer).get(0); + this.elEditingAreaSkipUI = $("A.skip", oAppContainer).get(0); + }, + + $BEFORE_MSG_APP_READY : function(msg){ + this.oApp.exec("ADD_APP_PROPERTY", ["elEditingAreaContainer", this.elEditingAreaContainer]); + this.oApp.exec("ADD_APP_PROPERTY", ["getIR", $.fnBind(this.getIR, this)]); + this.oApp.exec("ADD_APP_PROPERTY", ["setIR", this.setIR]); + this.oApp.exec("ADD_APP_PROPERTY", ["getEditingMode", $.fnBind(this.getEditingMode, this)]); + }, + + $ON_MSG_APP_READY : function(){ + this.oApp.exec("CHANGE_EDITING_MODE", [this.sInitialMode, true]); + this.oApp.exec("LOAD_IR_FIELD", [false]); + + this.oApp.registerBrowserEvent(this.elEditingAreaSkipUI, "focus", "MSG_EDITING_AREA_SIZE_CHANGED", [], 50); + this.oApp.registerBrowserEvent(this.elEditingAreaSkipUI, "blur", "MSG_EDITING_AREA_SIZE_CHANGED", [], 50); + +// var fOnBeforeUnload = this.fOnBeforeUnload||function(){if(this.getIR() != this.oIRField.value || this.bIsDirty) return this.oApp.$MSG("XE_EditingAreaManager.onExit")}; +// $(window).bind("beforeunload", $.fnBind(fOnBeforeUnload, this)); + }, + + $AFTER_MSG_APP_READY : function(){ + this.oApp.exec("UPDATE_IR_FIELD", []); + }, + + $ON_LOAD_IR_FIELD : function(bDontAddUndo){ + this.oApp.setIR(this.oIRField.value, bDontAddUndo); + }, + + $ON_UPDATE_IR_FIELD : function(){ + this.oIRField.value = this.oApp.getIR(); + }, + + $BEFORE_CHANGE_EDITING_MODE : function(sMode){ + this._oPrevActivePlugin = this.oActivePlugin; + this.oActivePlugin = this.oEditingMode[sMode]; + }, + + $AFTER_CHANGE_EDITING_MODE : function(sMode, bNoFocus){ + if(this._oPrevActivePlugin){ + var sIR = this._oPrevActivePlugin.getIR(); + this.oApp.exec("SET_IR", [sIR]); + + this.oApp.exec("ENABLE_UI", [this._oPrevActivePlugin.sMode]); + + this._setEditingAreaDimension(); + } + this.oApp.exec("DISABLE_UI", [this.oActivePlugin.sMode]); + + if(!bNoFocus){ + this.oApp.exec("FOCUS", []); + } + }, + + $ON_SET_IS_DIRTY : function(bIsDirty){ + this.bIsDirty = bIsDirty; + }, + + $ON_FOCUS : function(){ + if(!this.oActivePlugin || typeof this.oActivePlugin.setIR != "function") return + + this.oActivePlugin.focus(); + }, + + $BEFORE_SET_IR : function(sIR, bDontAddUndoHistory){ + bDontAddUndoHistory = bDontAddUndoHistory || false; + if(!bDontAddUndoHistory) this.oApp.exec("RECORD_UNDO_ACTION", ["SET CONTENTS"]); + }, + + $ON_SET_IR : function(sIR){ + if(!this.oActivePlugin || typeof this.oActivePlugin.setIR != "function") return + + this.oActivePlugin.setIR(sIR); + }, + + $AFTER_SET_IR : function(sIR, bDontAddUndoHistory){ + bDontAddUndoHistory = bDontAddUndoHistory || false; + if(!bDontAddUndoHistory) this.oApp.exec("RECORD_UNDO_ACTION", ["SET CONTENTS"]); + }, + + $ON_REGISTER_EDITING_AREA : function(oEditingAreaPlugin){ + this.oEditingMode[oEditingAreaPlugin.sMode] = oEditingAreaPlugin; + this.attachDocumentEvents(oEditingAreaPlugin.oEditingArea); + }, + + $ON_MSG_EDITING_AREA_RESIZE_STARTED : function(){ + this.oActivePlugin.elEditingArea.style.display = "none"; + + this.iStartingHeight = parseInt(this.elEditingAreaContainer.style.height); + }, + + $ON_RESIZE_EDITING_AREA: function(ipNewWidth, ipNewHeight){ + var iNewWidth = parseInt(ipNewWidth); + var iNewHeight = parseInt(ipNewHeight); + + if(iNewWidth < this.niMinWidth) iNewWidth = this.niMinWidth; + if(iNewHeight < this.nMinHeight) iNewHeight = this.nMinHeight; + + if(ipNewWidth) this.elEditingAreaContainer.style.width = iNewWidth + "px"; + if(ipNewHeight) this.elEditingAreaContainer.style.height = iNewHeight + "px"; + }, + + $ON_RESIZE_EDITING_AREA_BY : function(ipWidthChange, ipHeightChange){ + var iWidthChange = parseInt(ipWidthChange); + var iHeightChange = parseInt(ipHeightChange); + + var iWidth = this.elEditingAreaContainer.style.width?parseInt(this.elEditingAreaContainer.style.width)+iWidthChange:null; + var iHeight = this.elEditingAreaContainer.style.height?this.iStartingHeight+iHeightChange:null; + + this.oApp.exec("RESIZE_EDITING_AREA", [iWidth, iHeight]); + }, + + $ON_MSG_EDITING_AREA_RESIZE_ENDED : function(FnMouseDown, FnMouseMove, FnMouseUp){ + this.oActivePlugin.elEditingArea.style.display = "block"; + this._setEditingAreaDimension(); + }, + + _setEditingAreaDimension : function(){ + this.oActivePlugin.elEditingArea.style.height = this.elEditingAreaContainer.style.height; + this.oActivePlugin.elEditingArea.style.width = this.elEditingAreaContainer.style.width; + }, + + attachDocumentEvents : function(doc){ + this.oApp.registerBrowserEvent(doc, "click", "EVENT_EDITING_AREA_CLICK"); + this.oApp.registerBrowserEvent(doc, "mousedown", "EVENT_EDITING_AREA_MOUSEDOWN"); + this.oApp.registerBrowserEvent(doc, "mousemove", "EVENT_EDITING_AREA_MOUSEMOVE"); + this.oApp.registerBrowserEvent(doc, "mouseup", "EVENT_EDITING_AREA_MOUSEUP"); + this.oApp.registerBrowserEvent(doc, "keydown", "EVENT_EDITING_AREA_KEYDOWN"); + this.oApp.registerBrowserEvent(doc, "keypress", "EVENT_EDITING_AREA_KEYPRESS"); + this.oApp.registerBrowserEvent(doc, "keyup", "EVENT_EDITING_AREA_KEYUP"); + }, + + getIR : function(){ + return this.oActivePlugin.getIR(); + }, + + setIR : function(sIR, bDontAddUndo){ + this.oApp.exec("SET_IR", [sIR, bDontAddUndo]); + }, + + getEditingMode : function(){ + return this.oActivePlugin.sMode; + } +}); +//} + +//{ +/** + * @fileOverview This file contains Xpress plugin that takes care of the operations directly related to editing the HTML source code using Textarea element + * @name hp_XE_EditingArea_HTMLSrc.js + * @required XE_EditingAreaManager + */ +xe.XE_EditingArea_HTMLSrc = $.Class({ + name : "XE_EditingArea_HTMLSrc", + + sMode : "HTMLSrc", + textarea : null, + + $init : function(textarea){ + this.textarea = $.$(textarea); + this.elEditingArea = this.textarea; + }, + + $BEFORE_MSG_APP_READY : function(){ + this.oEditingArea = this.textarea; + this.oApp.exec("REGISTER_EDITING_AREA", [this]); + }, + + $ON_CHANGE_EDITING_MODE : function(sMode, bNoFocus){ + if(sMode == this.sMode){ + this.textarea.style.display = "block"; + }else{ + this.textarea.style.display = "none"; + } + }, + + $ON_PASTE_HTML : function(sHTML, oPSelection){ + if(this.oApp.getEditingMode() != this.sMode) return; + + var o = new TextRange(this.textarea); + o.paste(sHTML); + this.textarea.focus(); + }, + + getIR : function(){ + var sIR; + var sContent = this.textarea.value; + + if(this.oApp.applyConverter) + sIR = this.oApp.applyConverter(this.sMode+"_TO_IR", sContent); + else + sIR = sContent; + + return sIR; + }, + + setIR : function(sIR){ + var sContent; + + if(this.oApp.applyConverter) + sContent = this.oApp.applyConverter("IR_TO_"+this.sMode, sIR); + else + sContent = sIR; + + this.textarea.value = sContent; + }, + + focus : function(){ + this.textarea.focus(); + } +}); + +var TextRange = function(oEl) { + this._o = oEl; +}; + +/** + * Selection for textfield + * @author NHN (developer@xpressengine.com) + */ +TextRange.prototype.getSelection = function() { + var obj = this._o; + var ret = [ -1, -1 ]; + + if (isNaN(this._o.selectionStart)) { + obj.focus(); + + // textarea support added by nagoon97 + var range = document.body.createTextRange(); + var rangeField = null; + + rangeField = document.selection.createRange().duplicate(); + range.moveToElementText(obj); + rangeField.collapse(true); + range.setEndPoint("EndToEnd", rangeField); + ret[0] = range.text.length; + + rangeField = document.selection.createRange().duplicate(); + range.moveToElementText(obj); + rangeField.collapse(false); + range.setEndPoint("EndToEnd", rangeField); + ret[1] = range.text.length; + + obj.blur(); + } else { + ret[0] = obj.selectionStart; + ret[1] = obj.selectionEnd; + } + + return ret; +}; + +TextRange.prototype.setSelection = function(start, end) { + + var obj = this._o; + if (typeof end == 'undefined') end = start; + + if (obj.setSelectionRange) { + + obj.setSelectionRange(start, end); + + } else if (obj.createTextRange) { + + var range = obj.createTextRange(); + + range.collapse(true); + range.moveStart("character", start); + range.moveEnd("character", end - start); + range.select(); + + obj.blur(); + } + +}; + +TextRange.prototype.copy = function() { + + var r = this.getSelection(); + return this._o.value.substring(r[0], r[1]); + +}; + +TextRange.prototype.paste = function(sStr) { + + var obj = this._o; + var sel = this.getSelection(); + + var value = obj.value; + + var pre = value.substr(0, sel[0]); + var post = value.substr(sel[1]); + + value = pre + sStr + post; + obj.value = value; + + var n = 0; + if ( typeof document.body.style.maxHeight == "undefined" ) { + var a = pre.match( /\n/gi ); + n = ( a != null ? a.length : 0 ); + } + this.setSelection(sel[0] + sStr.length - n ); + +}; + +TextRange.prototype.cut = function() { + var r = this.copy(); + this.paste(''); + + return r; +}; +//} +//{ +/** + * @fileOverview This file contains Xpress plugin that takes care of the operations directly related to WYSIWYG iframe + * @name hp_XE_EditingArea_WYSIWYG.js + */ +xe.XE_EditingArea_WYSIWYG = $.Class({ + name : "XE_EditingArea_WYSIWYG", + status : xe.PLUGIN_STATUS["NOT_READY"], + + sMode : "WYSIWYG", + iframe : null, + doc : null, + + iLastUndoRecorded : 0, + iMinUndoInterval : 3000, + + _nIFrameReadyCount : 50, + + $init : function(iframe){ + this.iframe = $.$(iframe); + + this.initIframe(); + + this.elEditingArea = iframe; + }, + + $BEFORE_MSG_APP_READY : function(){ + this.oEditingArea = this.doc; + this.oApp.exec("REGISTER_EDITING_AREA", [this]); + this.oApp.exec("ADD_APP_PROPERTY", ["getWYSIWYGWindow", $.fnBind(this.getWindow, this)]); + this.oApp.exec("ADD_APP_PROPERTY", ["getWYSIWYGDocument", $.fnBind(this.getDocument, this)]); + }, + + $ON_MSG_APP_READY : function(){ + // uncomment this line if you wish to use the IE-style cursor in FF + // this.getDocument().body.style.cursor = "text"; + + if($.browser.msie){ + $(this.doc).bind('keydown', $.fnBind( + function(weEvent){ + if(this.doc.selection.type.toLowerCase() == 'control' && weEvent.keyCode == 8) { + this.oApp.exec("EXECCOMMAND", ['delete', false, false]); + weEvent.preventDefault(); weEvent.stopPropagation(); + } + } + , this)); + $(this.doc.body).bind('mousedown', $.fnBind( + function(weEvent){ + this._oIERange = null; + this._bIERangeReset = true; + } + , this)); + $(this.doc.body).bind('beforedeactivate', $.fnBind( + function(weEvent){ + // without this, cursor won't make it inside a table. + // mousedown(_oIERange gets reset) -> beforedeactivate(gets fired for table) -> RESTORE_IE_SELECTION + if(this._bIERangeReset) return; + + var tmpRange = this.getDocument().selection.createRange(0); + // Control range does not have parentElement + if(tmpRange.parentElement && tmpRange.parentElement() && tmpRange.parentElement().tagName == "INPUT"){ + this._oIERange = this._oPrevIERange; + }else{ + this._oIERange = tmpRange; + } + } + , this)); + $(this.doc.body).bind('mouseup', $.fnBind( + function(weEvent){ + this._bIERangeReset = false; + } + , this)); + } + }, + + $ON_CHANGE_EDITING_MODE : function(sMode, bNoFocus){ + if(sMode == this.sMode){ + this.iframe.style.display = "block"; + + this.oApp.exec("REFRESH_WYSIWYG", []); + this.oApp.exec("SET_EDITING_WINDOW", [this.getWindow()]); + }else{ + this.iframe.style.display = "none"; + } + }, + + $AFTER_CHANGE_EDITING_MODE : function(sMode, bNoFocus){ + this._oIERange = null; + }, + + $ON_REFRESH_WYSIWYG : function(){ + if(!$.browser.mozilla) return; + + this._disableWYSIWYG(); + this._enableWYSIWYG(); + }, + + $ON_ENABLE_WYSIWYG : function(){ + this._enableWYSIWYG(); + }, + + $ON_DISABLE_WYSIWYG : function(){ + this._disableWYSIWYG(); + }, + + $ON_EVENT_EDITING_AREA_KEYDOWN : function(oEvent) { + // ctrl-left/right add/remove indent + if(!oEvent.ctrlKey) return; + + switch(oEvent.keyCode) { + // outdent + case 37 : + this.oApp.exec("EXECCOMMAND", ["outdent", false, false]); + break; + // indent + case 39 : + this.oApp.exec("EXECCOMMAND", ["indent", false, false]); + break; + // h1 ~ h6, normal + case 49 : + case 50 : + case 51 : + case 52 : + case 53 : + case 54 : + this.oApp.exec("EXECCOMMAND", ["FormatBlock", false, '']); + break; + default : + return; + } + oEvent.preventDefault(); oEvent.stopPropagation(); + + }, + + $ON_EVENT_EDITING_AREA_KEYUP : function(oEvent){ + // 33, 34: page up/down, 35,36: end/home, 37,38,39,40: left, up, right, down + if(oEvent.keyCode == 229 || oEvent.keyCode == 13 || oEvent.altKey || oEvent.ctrlKey || (oEvent.keyCode >= 33 && oEvent.keyCode <= 40) || oEvent.keyCode == 16) return; + this._recordUndo(oEvent); + }, + + $ON_PASTE_HTML : function(sHTML, oPSelection){ + if(this.oApp.getEditingMode() != this.sMode) return; + + var oSelection = oPSelection || this.oApp.getSelection(); + oSelection.pasteHTML(sHTML); + + // every browser except for IE may modify the innerHTML when it is inserted + if(!$.browser.msie){ + var sTmpBookmark = oSelection.placeStringBookmark(); + this.oApp.getWYSIWYGDocument().body.innerHTML = this.oApp.getWYSIWYGDocument().body.innerHTML; + oSelection.moveToBookmark(sTmpBookmark); + oSelection.collapseToEnd(); + oSelection.select(); + oSelection.removeStringBookmark(sTmpBookmark); + } + + this.oApp.exec("RECORD_UNDO_ACTION", ["INSERT HTML"]); + }, + + $AFTER_MSG_EDITING_AREA_RESIZE_ENDED : function(FnMouseDown, FnMouseMove, FnMouseUp){ + this.oApp.exec("REFRESH_WYSIWYG", []); + }, + + $ON_RESTORE_IE_SELECTION : function(){ + if(this._oIERange){ + this._oIERange.select(); + this._oPrevIERange = this._oIERange; + this._oIERange = null; + } + }, + + initIframe : function(){ + try { + this.doc = this.iframe.contentWindow.document; + if (this.doc == null || this.doc.location.href == 'about:blank') { + throw new Error('Access denied'); + } + + this._enableWYSIWYG(); + + this.status = xe.PLUGIN_STATUS["READY"]; + } catch(e) { + if(this._nIFrameReadyCount-- > 0){ + setTimeout($.fnBind(this.initIframe, this), 100); + }else{ + throw("iframe for WYSIWYG editing mode can't be initialized. Please check if the iframe document exists and is also accessable(cross-domain issues). "); + } + } + }, + + getIR : function(){ + var sContent = this.doc.body.innerHTML; + var sIR; + + if(this.oApp.applyConverter) + sIR = this.oApp.applyConverter(this.sMode+"_TO_IR", sContent); + else + sIR = sContent; + + return sIR; + }, + + setIR : function(sIR){ + var sContent; + if(this.oApp.applyConverter) + sContent = this.oApp.applyConverter("IR_TO_"+this.sMode, sIR); + else + sContent = sIR; + + this.doc.body.innerHTML = sContent; + + if($.browser.mozilla){ + if(this.doc.body.innerHTML == "") this.doc.body.innerHTML = "
    "; + } + }, + + getWindow : function(){ + return this.iframe.contentWindow; + }, + + getDocument : function(){ + return this.iframe.contentWindow.document; + }, + + focus : function(){ + //this.getWindow().focus(); + //this.oApp.exec("RESTORE_IE_SELECTION", []); + }, + + _recordUndo : function(oKeyInfo){ + var curTime = new Date(); + if(curTime-this.iLastUndoRecorded < this.iMinUndoInterval) return; + this.oApp.exec("RECORD_UNDO_ACTION", ["KEYPRESS"]); + + this.iLastUndoRecorded = new Date(); + + this.prevKeyCode = oKeyInfo.keyCode; + }, + + _enableWYSIWYG : function(){ + if ($.browser.msie){ + this.doc.body.disabled = true; + this.doc.body.contentEditable = true; + this.doc.body.removeAttribute('disabled'); + } else { + this.doc.designMode = "on"; + } + }, + + _disableWYSIWYG : function(){ + if ($.browser.msie){ + this.doc.body.contentEditable = false; + } else { + this.doc.designMode = "off"; + } + } +}); +//} +//{ +/** + * @fileOverview This file contains Xpress plugin that takes care of the operations related to resizing the editing area vertically + * @name hp_XE_EditingAreaVerticalResizer.js + */ +xe.XE_EditingAreaVerticalResizer = $.Class({ + name : "XE_EditingAreaVerticalResizer", + oResizeGrip : null, + + $init : function(oAppContainer){ + this._assignHTMLObjects(oAppContainer); + + this.$FnMouseDown = $.fnBind(this._mousedown, this); + this.$FnMouseMove = $.fnBind(this._mousemove, this); + this.$FnMouseUp = $.fnBind(this._mouseup, this); + + $(this.oResizeGrip).bind("mousedown", this.$FnMouseDown); + }, + + _assignHTMLObjects : function(oAppContainer){ + oAppContainer = $.$(oAppContainer) || document; + + this.oResizeGrip = $(".xpress_xeditor_editingArea_verticalResizer", oAppContainer).get(0); + }, + + _mousedown : function(oEvent){ + this.iStartHeight = oEvent.clientY; + + $(document).bind("mousemove", this.$FnMouseMove); + $(document).bind("mouseup", this.$FnMouseUp); + + this.oApp.exec("MSG_EDITING_AREA_RESIZE_STARTED", [this.$FnMouseDown, this.$FnMouseMove, this.$FnMouseUp]); + }, + + _mousemove : function(oEvent){ + var iHeightChange = oEvent.clientY - this.iStartHeight; + + this.oApp.exec("RESIZE_EDITING_AREA_BY", [0, iHeightChange]); + }, + + _mouseup : function(oEvent){ + $(document).unbind("mousemove", this.$FnMouseMove); + $(document).unbind("mouseup", this.$FnMouseUp); + + this.oApp.exec("MSG_EDITING_AREA_RESIZE_ENDED", [this.$FnMouseDown, this.$FnMouseMove, this.$FnMouseUp]); + } +}); +//} +//{ +/** + * @fileOverview This file contains Xpress plugin that takes care of the basic editor commands + * @name hp_XE_ExecCommand.js + */ +xe.XE_ExecCommand = $.Class({ + name : "XE_ExecCommand", + oEditingArea : null, + + $init : function(oEditingArea){ + this.oEditingArea = oEditingArea; + }, + + $BEFORE_MSG_APP_READY : function(){ + // the right document will be available only when the src is completely loaded + if(this.oEditingArea && this.oEditingArea.tagName == "IFRAME") + this.oEditingArea = this.oEditingArea.contentWindow.document; + }, + + $ON_MSG_APP_READY : function(){ + this.oApp.exec("REGISTER_HOTKEY", ["ctrl+b", "EXECCOMMAND", ["bold", false, false]]); + this.oApp.exec("REGISTER_HOTKEY", ["ctrl+u", "EXECCOMMAND", ["underline", false, false]]); + this.oApp.exec("REGISTER_HOTKEY", ["ctrl+i", "EXECCOMMAND", ["italic", false, false]]); + this.oApp.exec("REGISTER_HOTKEY", ["ctrl+d", "EXECCOMMAND", ["strikethrough", false, false]]); + + this.oApp.exec("REGISTER_UI_EVENT", ["bold", "click", "EXECCOMMAND", ["bold", false, false]]); + this.oApp.exec("REGISTER_UI_EVENT", ["underline", "click", "EXECCOMMAND", ["underline", false, false]]); + this.oApp.exec("REGISTER_UI_EVENT", ["italic", "click", "EXECCOMMAND", ["italic", false, false]]); + this.oApp.exec("REGISTER_UI_EVENT", ["lineThrough", "click", "EXECCOMMAND", ["strikethrough", false, false]]); + this.oApp.exec("REGISTER_UI_EVENT", ["superscript", "click", "EXECCOMMAND", ["superscript", false, false]]); + this.oApp.exec("REGISTER_UI_EVENT", ["subscript", "click", "EXECCOMMAND", ["subscript", false, false]]); + this.oApp.exec("REGISTER_UI_EVENT", ["justifyleft", "click", "EXECCOMMAND", ["justifyleft", false, false]]); + this.oApp.exec("REGISTER_UI_EVENT", ["justifycenter", "click", "EXECCOMMAND", ["justifycenter", false, false]]); + this.oApp.exec("REGISTER_UI_EVENT", ["justifyright", "click", "EXECCOMMAND", ["justifyright", false, false]]); + this.oApp.exec("REGISTER_UI_EVENT", ["justifyfull", "click", "EXECCOMMAND", ["justifyfull", false, false]]); + this.oApp.exec("REGISTER_UI_EVENT", ["orderedlist", "click", "EXECCOMMAND", ["insertorderedlist", false, false]]); + this.oApp.exec("REGISTER_UI_EVENT", ["unorderedlist", "click", "EXECCOMMAND", ["insertunorderedlist", false, false]]); + this.oApp.exec("REGISTER_UI_EVENT", ["outdent", "click", "EXECCOMMAND", ["outdent", false, false]]); + this.oApp.exec("REGISTER_UI_EVENT", ["indent", "click", "EXECCOMMAND", ["indent", false, false]]); + }, + + $BEFORE_EXECCOMMAND : function(sCommand, bUserInterface, vValue){ + this._bOnlyCursorChanged = false; + + this.oApp.exec("FOCUS", []); + + if(sCommand.match(/^bold|underline|italic|strikethrough|superscript|subscript$/i)){ + var oSelection = this.oApp.getSelection(); + if(oSelection.collapsed) this._bOnlyCursorChanged = true; + } + + if(!this._bOnlyCursorChanged){ + this.oApp.exec("RECORD_UNDO_BEFORE_ACTION", [sCommand]); + } + }, + + $ON_EXECCOMMAND : function(sCommand, bUserInterface, vValue){ + bUserInterface = (bUserInterface == "" || bUserInterface)?bUserInterface:false; + vValue = (vValue == "" || vValue)?vValue:false; + + this.oEditingArea.execCommand(sCommand, bUserInterface, vValue); + }, + + $AFTER_EXECCOMMAND : function(sCommand, bUserInterface, vValue){ + if(!this._bOnlyCursorChanged){ + this.oApp.exec("RECORD_UNDO_AFTER_ACTION", [sCommand]); + } + + this.oApp.exec("CHECK_STYLE_CHANGE", []); + } +}); +//} + +//{ +/** + * @fileOverview This file contains Xpress plugin that takes care of the operations related to wrapping the sentence around with a

    tag when enter key is pressed + * @name hp_XE_WYSIWYGEnterKey.js + */ +xe.XE_WYSIWYGEnterKey = $.Class({ + name : "XE_WYSIWYGEnterKey", + // IE/Opera do not need this + unsupportedBrowser : ['ie', 'opera'], + oEditingArea : null, + + $init : function(oEditingArea){ + this.oEditingArea = oEditingArea; + }, + + $BEFORE_MSG_APP_READY : function(){ + // the right document will be available only when the src is completely loaded + if(this.oEditingArea && this.oEditingArea.tagName == "IFRAME") + this.oEditingArea = this.oEditingArea.contentWindow.document; + }, + + $ON_EVENT_EDITING_AREA_KEYDOWN : function(oEvent){ + if(this.oApp.getEditingMode() != "WYSIWYG") return; + + if(oEvent.shiftKey) return; + + if(oEvent.keyCode == 13){ + var oSelection = this.oApp.getSelection(); + var sBM = oSelection.placeStringBookmark(); + var oLineInfo = oSelection.getLineInfo(); + var oStart = oLineInfo.oStart; + var oEnd = oLineInfo.oEnd; + + //top.document.title = oStart.oNode.tagName+":"+oStart.oNode.nodeValue+", "+oEnd.oNode.tagName+":"+oEnd.oNode.nodeValue+"::"+oStart.bParentBreak+", "+oStart.oLineBreaker.tagName; + + // line broke by sibling + // or + // the parent line breaker is just a block container + if(!oStart.bParentBreak || oSelection.rxBlockContainer.test(oStart.oLineBreaker.tagName)){ + oEvent.stopPropagation(); + oEvent.preventDefault(); + + var oSWrapper = this.oEditingArea.createElement("P"); + oSelection.moveToBookmark(sBM); + oSelection.setStartBefore(oStart.oNode); + oSelection.surroundContents(oSWrapper); + + oSelection.collapseToEnd(); + + var oEWrapper = this.oEditingArea.createElement("P"); + oSelection.setEndAfter(oEnd.oNode); + oSelection.surroundContents(oEWrapper); + + oSelection.removeStringBookmark(sBM); + + if(oSWrapper.innerHTML == "") oSWrapper.innerHTML = "
    "; + if(oEWrapper.innerHTML == "") oEWrapper.innerHTML = "
    "; + + if(oEWrapper.nextSibling && oEWrapper.nextSibling.tagName == "BR") oEWrapper.parentNode.removeChild(oEWrapper.nextSibling); + + oSelection.selectNodeContents(oEWrapper); + oSelection.collapseToStart(); + oSelection.select(); + this.oApp.exec("CHECK_STYLE_CHANGE", []); + }else{ + oSelection.removeStringBookmark(sBM); + } + } + } +}); +//} + +//{ +/** + * @fileOverview This file contains Xpress plugin that takes care of the operations related to styling the font + * @name hp_XE_WYSIWYGStyler.js + * @required XE_EditingArea_WYSIWYG, XpressRangeManager + */ +xe.XE_WYSIWYGStyler = $.Class({ + name : "XE_WYSIWYGStyler", + + $PRECONDITION : function(sFullCommand, aArgs){ + return (this.oApp.getEditingMode() == "WYSIWYG"); + }, + + $ON_SET_WYSIWYG_STYLE : function(oStyles){ + var oSelection = this.oApp.getSelection(); + + // style cursor + if(oSelection.collapsed){ + var oSpan = this.oApp.getWYSIWYGDocument().createElement("SPAN"); + oSelection.insertNode(oSpan); + oSpan.innerHTML = unescape("%uFEFF"); + + var sValue; + for(var sName in oStyles){ + sValue = oStyles[sName]; + + if(typeof sValue != "string") continue; + + oSpan.style[sName] = sValue; + } + + oSelection.selectNodeContents(oSpan); + oSelection.collapseToEnd(); + oSelection._window.focus(); + oSelection._window.document.body.focus(); + oSelection.select(); + + // FF3 will actually display %uFEFF when it is followed by a number AND certain font-family is used(like Gulim), so remove the chcaracter for FF3 + if($.browser.mozilla && $.browser.nVersion == 3) + oSpan.innerHTML = ""; + + return; + } + + this.oApp.exec("RECORD_UNDO_BEFORE_ACTION", ["FONT STYLE"]); + + oSelection.styleRange(oStyles); + oSelection._window.focus(); + oSelection.select(); + + this.oApp.exec("RECORD_UNDO_AFTER_ACTION", ["FONT STYLE"]); + } +}); +//} + +//{ +/** + * @fileOverview This file contains Xpress plugin that takes care of the operations related to detecting the style change + * @name hp_XE_WYSIWYGStyleGetter.js + */ +xe.XE_WYSIWYGStyleGetter = $.Class({ + name : "XE_WYSIWYGStyleGetter", + + hKeyUp : null, + + getStyleInterval : 200, + + oStyleMap : { + fontFamily : { + type : "Value", + css : "fontFamily" + }, + fontSize : { + type : "Value", + css : "fontSize" + }, + lineHeight : { + type : "Value", + css : "lineHeight", + converter : function(sValue, oStyle){ + if(!sValue.match(/px$/)) return sValue; + + return Math.ceil((parseInt(sValue)/parseInt(oStyle.fontSize))*10)/10; + } + }, + bold : { + command : "bold" + }, + underline : { + command : "underline" + }, + italic : { + command : "italic" + }, + lineThrough : { + command : "strikethrough" + }, + superscript : { + command : "superscript" + }, + subscript : { + command : "subscript" + }, + justifyleft : { + command : "justifyleft" + }, + justifycenter : { + command : "justifycenter" + }, + justifyright : { + command : "justifyright" + }, + justifyfull : { + command : "justifyfull" + }, + orderedlist : { + command : "insertorderedlist" + }, + unorderedlist : { + command : "insertunorderedlist" + } + }, + + $init : function(){ + this.oStyle = this._getBlankStyle(); + }, + + $PRECONDITION : function(){ + if(this.oApp.getEditingMode() != "WYSIWYG") return false; + + return true; + }, + + $ON_MSG_APP_READY : function(){ + this.oDocument = this.oApp.getWYSIWYGDocument(); + this.oApp.exec("ADD_APP_PROPERTY", ["getCurrentStyle", $.fnBind(this.getCurrentStyle, this)]); + }, + + $ON_EVENT_EDITING_AREA_MOUSEUP : function(oEvnet){ + if(this.hKeyUp) clearTimeout(this.hKeyUp); + this.oApp.exec("CHECK_STYLE_CHANGE", []); + }, + + $ON_EVENT_EDITING_AREA_KEYUP : function(oEvent){ + /* + backspace 8 + page up 33 + page down 34 + end 35 + home 36 + left arrow 37 + up arrow 38 + right arrow 39 + down arrow 40 + insert 45 + delete 46 + */ + if(!(oEvent.keyCode == 8 || (oEvent.keyCode >= 33 && oEvent.keyCode <= 40) || oEvent.keyCode == 45 || oEvent.keyCode == 46)) return; + + if(this.hKeyUp) clearTimeout(this.hKeyUp); + + this.hKeyUp = setTimeout($.fnBind(this.oApp.exec, this.oApp, "CHECK_STYLE_CHANGE", []), this.getStyleInterval); + }, + + $ON_CHECK_STYLE_CHANGE : function(){ + this._getStyle(); + }, + + $ON_RESET_STYLE_STATUS : function(){ + var oBlankStyle = this._getBlankStyle(); + for(var sAttributeName in oBlankStyle) + this.oApp.exec("SET_STYLE_STATUS", [sAttributeName, oBlankStyle[sAttributeName]]); + }, + + getCurrentStyle : function(){ + return this.oStyle; + }, + + _check_style_change : function(){ + this.oApp.exec("CHECK_STYLE_CHANGE", []); + }, + + _getBlankStyle : function(){ + var oBlankStyle = {}; + for(var attributeName in this.oStyleMap){ + if(this.oStyleMap[attributeName].type == "Value") + oBlankStyle[attributeName] = ""; + else + oBlankStyle[attributeName] = 0; + } + + return oBlankStyle; + }, + + _getStyle : function(){ + var oSelection = this.oApp.getSelection(); + + var funcFilter = function(oNode){ + if (!oNode.childNodes || oNode.childNodes.length == 0) + return true; + else + return false; + } + + var aBottomNodes = oSelection.getNodes(false, funcFilter); + + var oStyle, oBaseStyle, oTmpStyle, attributeName; + if(aBottomNodes.length == 0){ + oStyle = this._getStyleOf(oSelection.commonAncestorContainer); + }else{ + oStyle = this._getStyleOf(aBottomNodes[0]); + } + + for(attributeName in oStyle){ + if(this.oStyleMap[attributeName].converter){ + oStyle[attributeName] = this.oStyleMap[attributeName].converter(oStyle[attributeName], oStyle); + } + + if(this.oStyle[attributeName] != oStyle[attributeName]) + this.oApp.exec("MSG_STYLE_CHANGED", [attributeName, oStyle[attributeName]]); + } + + this.oStyle = oStyle; + }, + + _getStyleOf : function(oNode){ + var oStyle = this._getBlankStyle(); + + // this must not happen + if(!oNode) return oStyle; + + if(oNode.nodeType == 3) oNode = oNode.parentNode; + + var welNode = $(oNode); + var attribute, cssName; + for(var styleName in this.oStyle){ + attribute = this.oStyleMap[styleName]; + + if(attribute.type && attribute.type == "Value"){ + if(attribute.css){ + var sValue = welNode.css(attribute.css); + + if(styleName == "fontFamily"){ + sValue = sValue.split(/,/)[0]; + } + + oStyle[styleName] = sValue; + }else{ + if(attribute.command){ + try{ + oStyle[styleName] = this.oDocument.queryCommandState(attribute.command); + }catch(e){} + }else{ + // todo + } + } + }else{ + if(attribute.command){ + try{ + if(this.oDocument.queryCommandState(attribute.command)){ + oStyle[styleName] = 1; + }else{ + oStyle[styleName] = 0; + } + }catch(e){} + }else{ + // todo + } + } + } + return oStyle; + } +}); +//} +//{ +/** + * @fileOverview This file contains Xpress plugin that takes care of the operations related to changing the font size using Select element + * @name hp_XE_FontSizeWithSelectUI.js + */ +xe.XE_FontSizeWithSelectUI = $.Class({ + name : "XE_FontSizeWithSelectUI", + + $init : function(elAppContainer){ + this._assignHTMLObjects(elAppContainer); + }, + + _assignHTMLObjects : function(elAppContainer){ + this.elFontSizeSelect = $("SELECT.xpress_xeditor_ui_fontSize_select", elAppContainer).get(0); + }, + + $ON_MSG_APP_READY : function(){ + this.oApp.registerBrowserEvent(this.elFontSizeSelect, "change", "SET_FONTSIZE_FROM_SELECT_UI"); + this.elFontSizeSelect.selectedIndex = 0; + }, + + $ON_MSG_STYLE_CHANGED : function(sAttributeName, sAttributeValue){ + if(sAttributeName == "fontSize"){ + this.elFontSizeSelect.value = sAttributeValue; + if(this.elFontSizeSelect.selectedIndex < 0) this.elFontSizeSelect.selectedIndex = 0; + } + }, + + $ON_SET_FONTSIZE_FROM_SELECT_UI : function(){ + var sFontSize = this.elFontSizeSelect.value; + if(!sFontSize) return; + + this.oApp.exec("SET_WYSIWYG_STYLE", [{"fontSize":sFontSize}]); + this.oApp.exec("CHECK_STYLE_CHANGE", []); + } +}); +//} +//{ +/** + * @fileOverview This file contains Xpress plugin that takes care of the operations related to changing the font name using Select element + * @name hp_XE_FontNameWithSelectUI.js + */ +xe.XE_FontNameWithSelectUI = $.Class({ + name : "XE_FontNameWithSelectUI", + + $init : function(elAppContainer){ + this._assignHTMLObjects(elAppContainer); + }, + + _assignHTMLObjects : function(elAppContainer){ + this.elFontNameSelect = $("SELECT.xpress_xeditor_ui_fontName_select", elAppContainer).get(0); + }, + + $ON_MSG_APP_READY : function(){ + this.oApp.registerBrowserEvent(this.elFontNameSelect, "change", "SET_FONTNAME_FROM_SELECT_UI"); + this.elFontNameSelect.selectedIndex = 0; + }, + + $ON_MSG_STYLE_CHANGED : function(sAttributeName, sAttributeValue){ + if(sAttributeName == "fontFamily"){ + this.elFontNameSelect.value = sAttributeValue.toLowerCase(); + if(this.elFontNameSelect.selectedIndex < 0) this.elFontNameSelect.selectedIndex = 0; + } + }, + + $ON_SET_FONTNAME_FROM_SELECT_UI : function(){ + var sFontName = this.elFontNameSelect.value; + if(!sFontName) return; + + this.oApp.exec("SET_WYSIWYG_STYLE", [{"fontFamily":sFontName}]); + this.oApp.exec("CHECK_STYLE_CHANGE", []); + } +}); +//} +//{ +/** + * @fileOverview This file contains Xpress plugin that takes care of the operations related to setting/changing the lineheight + * @name hp_XE_LineHeight.js + */ +xe.XE_LineHeight = $.Class({ + name : "XE_LineHeight", + + $init : function(oAppContainer){ + this._assignHTMLObjects(oAppContainer); + }, + + _assignHTMLObjects : function(oAppContainer){ + }, + + $ON_SET_LINEHEIGHT : function(nLineHeight){ + this.setLineHeight(nLineHeight); + }, + + getLineHeight : function(){ + var nodes = this._getSelectedNodes(false); + + var curWrapper, prevWrapper; + var iCurHeight, iHeight; + + if(nodes.length == 0) return -1; + + var iLength = nodes.length; + + if(iLength == 0){ + iHeight = -1; + }else{ + prevWrapper = this._getLineWrapper(nodes[0]); + iHeight = this._getWrapperLineheight(prevWrapper); + } + + var firstNode = this.oSelection.getStartNode(); + + if(iHeight > 0){ + for(var i=1; i=0; i--){ + if(aNodes[i].nodeType == 3 || aNodes[i].tagName == "BR"){ + var oP = oSelection._document.createElement("P"); + oInsertionPoint = aNodes[i].nextSibling; + while(i>=0 && aNodes[i] && (aNodes[i].nodeType == 3 || aNodes[i].tagName == "BR")){ + oP.insertBefore(aNodes[i--], oP.firstChild); + } + oFormattingNode.insertBefore(oP, oInsertionPoint); + i++; + } + } + + if(oFormattingNode && oFormattingNode.parentNode){ + var oP = oSelection._document.createElement("P"); + oP.innerHTML = unescape("
    "); + oFormattingNode.parentNode.insertBefore(oP, oFormattingNode.nextSibling); + } + + this.oApp.exec("RECORD_UNDO_ACTION", ["Block Quote"]); + + return oFormattingNode; + }, + + _expandToTableStart : function(oSelection, oNode){ + var oC = oSelection.commonAncestorContainer; + var oResultNode = null; + + var bLastIteration = false; + while(oNode && !bLastIteration){ + if(oNode == oC) bLastIteration = true; + + if(/TBODY|TFOOT|THEAD|TR/i.test(oNode.tagName)){ + oResultNode = this._getTableRoot(oNode); + break; + } + oNode = oNode.parentNode; + } + + return oResultNode; + }, + + _getTableRoot : function(oNode){ + while(oNode && oNode.tagName != "TABLE") oNode = oNode.parentNode; + + return oNode; + } +}); +//} +//{ +/** + * @fileOverview This file contains Xpress plugin that takes care of the operations related to inserting special characters + * @name hp_XE_SCharacter.js + * @required XpressRangeManager + */ +xe.XE_SCharacter = $.Class({ + name : "XE_SCharacter", + + $init : function(oAppContainer){ + this.bIE = $.browser.msie; + + this._assignHTMLObjects(oAppContainer); + + this.charSet = []; + this.charSet[0] = unescape('FF5B FF5D 3014 3015 3008 3009 300A 300B 300C 300D 300E 300F 3010 3011 2018 2019 201C 201D 3001 3002 %B7 2025 2026 %A7 203B 2606 2605 25CB 25CF 25CE 25C7 25C6 25A1 25A0 25B3 25B2 25BD 25BC 25C1 25C0 25B7 25B6 2664 2660 2661 2665 2667 2663 2299 25C8 25A3 25D0 25D1 2592 25A4 25A5 25A8 25A7 25A6 25A9 %B1 %D7 %F7 2260 2264 2265 221E 2234 %B0 2032 2033 2220 22A5 2312 2202 2261 2252 226A 226B 221A 223D 221D 2235 222B 222C 2208 220B 2286 2287 2282 2283 222A 2229 2227 2228 FFE2 21D2 21D4 2200 2203 %B4 FF5E 02C7 02D8 02DD 02DA 02D9 %B8 02DB %A1 %BF 02D0 222E 2211 220F 266D 2669 266A 266C 327F 2192 2190 2191 2193 2194 2195 2197 2199 2196 2198 321C 2116 33C7 2122 33C2 33D8 2121 2668 260F 260E 261C 261E %B6 2020 2021 %AE %AA %BA 2642 2640').replace(/(\S{4})/g, function(a){return "%u"+a}).split(' '); + this.charSet[1] = unescape('%BD 2153 2154 %BC %BE 215B 215C 215D 215E %B9 %B2 %B3 2074 207F 2081 2082 2083 2084 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 FFE6 %24 FFE5 FFE1 20AC 2103 212B 2109 FFE0 %A4 2030 3395 3396 3397 2113 3398 33C4 33A3 33A4 33A5 33A6 3399 339A 339B 339C 339D 339E 339F 33A0 33A1 33A2 33CA 338D 338E 338F 33CF 3388 3389 33C8 33A7 33A8 33B0 33B1 33B2 33B3 33B4 33B5 33B6 33B7 33B8 33B9 3380 3381 3382 3383 3384 33BA 33BB 33BC 33BD 33BE 33BF 3390 3391 3392 3393 3394 2126 33C0 33C1 338A 338B 338C 33D6 33C5 33AD 33AE 33AF 33DB 33A9 33AA 33AB 33AC 33DD 33D0 33D3 33C3 33C9 33DC 33C6').replace(/(\S{4})/g, function(a){return "%u"+a}).split(' '); + this.charSet[2] = unescape('3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 326A 326B 326C 326D 326E 326F 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 327A 327B 24D0 24D1 24D2 24D3 24D4 24D5 24D6 24D7 24D8 24D9 24DA 24DB 24DC 24DD 24DE 24DF 24E0 24E1 24E2 24E3 24E4 24E5 24E6 24E7 24E8 24E9 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 246A 246B 246C 246D 246E 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 320A 320B 320C 320D 320E 320F 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 321A 321B 249C 249D 249E 249F 24A0 24A1 24A2 24A3 24A4 24A5 24A6 24A7 24A8 24A9 24AA 24AB 24AC 24AD 24AE 24AF 24B0 24B1 24B2 24B3 24B4 24B5 2474 2475 2476 2477 2478 2479 247A 247B 247C 247D 247E 247F 2480 2481 2482').replace(/(\S{4})/g, function(a){return "%u"+a}).split(' '); + this.charSet[3] = unescape('3131 3132 3133 3134 3135 3136 3137 3138 3139 313A 313B 313C 313D 313E 313F 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 314A 314B 314C 314D 314E 314F 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 315A 315B 315C 315D 315E 315F 3160 3161 3162 3163 3165 3166 3167 3168 3169 316A 316B 316C 316D 316E 316F 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 317A 317B 317C 317D 317E 317F 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 318A 318B 318C 318D 318E').replace(/(\S{4})/g, function(a){return "%u"+a}).split(' '); + this.charSet[4] = unescape('0391 0392 0393 0394 0395 0396 0397 0398 0399 039A 039B 039C 039D 039E 039F 03A0 03A1 03A3 03A4 03A5 03A6 03A7 03A8 03A9 03B1 03B2 03B3 03B4 03B5 03B6 03B7 03B8 03B9 03BA 03BB 03BC 03BD 03BE 03BF 03C0 03C1 03C3 03C4 03C5 03C6 03C7 03C8 03C9 %C6 %D0 0126 0132 013F 0141 %D8 0152 %DE 0166 014A %E6 0111 %F0 0127 I 0133 0138 0140 0142 0142 0153 %DF %FE 0167 014B 0149 0411 0413 0414 0401 0416 0417 0418 0419 041B 041F 0426 0427 0428 0429 042A 042B 042C 042D 042E 042F 0431 0432 0433 0434 0451 0436 0437 0438 0439 043B 043F 0444 0446 0447 0448 0449 044A 044B 044C 044D 044E 044F').replace(/(\S{4})/g, function(a){return "%u"+a}).split(' '); + this.charSet[5] = unescape('3041 3042 3043 3044 3045 3046 3047 3048 3049 304A 304B 304C 304D 304E 304F 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 305A 305B 305C 305D 305E 305F 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 306A 306B 306C 306D 306E 306F 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 307A 307B 307C 307D 307E 307F 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 308A 308B 308C 308D 308E 308F 3090 3091 3092 3093 30A1 30A2 30A3 30A4 30A5 30A6 30A7 30A8 30A9 30AA 30AB 30AC 30AD 30AE 30AF 30B0 30B1 30B2 30B3 30B4 30B5 30B6 30B7 30B8 30B9 30BA 30BB 30BC 30BD 30BE 30BF 30C0 30C1 30C2 30C3 30C4 30C5 30C6 30C7 30C8 30C9 30CA 30CB 30CC 30CD 30CE 30CF 30D0 30D1 30D2 30D3 30D4 30D5 30D6 30D7 30D8 30D9 30DA 30DB 30DC 30DD 30DE 30DF 30E0 30E1 30E2 30E3 30E4 30E5 30E6 30E7 30E8 30E9 30EA 30EB 30EC 30ED 30EE 30EF 30F0 30F1 30F2 30F3 30F4 30F5 30F6').replace(/(\S{4})/g, function(a){return "%u"+a}).split(' '); + }, + + _assignHTMLObjects : function(oAppContainer){ + oAppContainer = $.$(oAppContainer) || document; + + this.elDropdownLayer = $("DIV.xpress_xeditor_sCharacter_layer", oAppContainer).get(0); + + this.oTextField = $("INPUT", this.elDropdownLayer).get(0); + this.oInsertButton = $("+ BUTTON", this.oTextField).get(0); + this.aCloseButton = $("BUTTON.close", this.elDropdownLayer).get(); + this.aSCharList = $(".list", this.elDropdownLayer).get(); + var oLabelUL = $(">UL", this.elDropdownLayer).get(0); + this.aLabelA = $("A", oLabelUL).get(); + }, + + $ON_MSG_APP_READY : function(){ + var funcInsert = $.fnBind(this.oApp.exec, this.oApp, "INSERT_SCHARACTERS", [this.oTextField.value]); + $(this.oInsertButton).click(funcInsert, this); + + this.oApp.exec("SET_SCHARACTER_LIST", [this.charSet]); + + for(var i=0; i'; + this.aSCharList[i].appendChild(aLI[ii]); + } + + // enable this after Jindo framework is updated +// this.oApp.exec("ATTACH_HOVER_EVENTS", [$(">LI>BUTTON", this.aSCharList[i])]).get(); + }, + + _stopBrowserEvent : function(obj, sEvent){ + $(obj).bind(sEvent, function(e){e.stopPropagation();e.preventDefault();} ) + } +}); +//} +//{ +/** + * @fileOverview This file contains Xpress plugin that takes care of the operations related to Undo/Redo + * @name hp_XE_UndoRedo.js + * @required XE_EditingAreaManager, XpressRangeManager + */ +xe.XE_UndoRedo = $.Class({ + name : "XE_UndoRedo", + actionHistory : null, + // this may also be called, lastAdded/lastRestored + oCurStateIdx : null, + iMinimumSizeChange : 10, + sBlankContentsForFF : "
    ", + + $init : function(){ + this.aUndoHistory = []; + this.oCurStateIdx = {nIdx: 0, nStep: 0}; + }, + + $PRECONDITION : function(sCmd){ + if(sCmd.match(/_DO_RECORD_UNDO_HISTORY_AT$/)) return true; + + try{ + if(this.oApp.getEditingMode() != "WYSIWYG") return false; + }catch(e){ + return false; + } + + return true; + }, + + $BEFORE_MSG_APP_READY : function(){ + this.oApp.exec("DO_RECORD_UNDO_HISTORY_AT", [this.oCurStateIdx, "", "", null]); + }, + + $ON_MSG_APP_READY : function(){ + this.bFF = $.browser.mozilla; + + this.oApp.exec("ADD_APP_PROPERTY", ["getUndoHistory", $.fnBind(this.getUndoHistory, this)]); + this.oApp.exec("ADD_APP_PROPERTY", ["getUndoStateIdx", $.fnBind(this.getUndoStateIdx, this)]); + + this.oApp.exec("REGISTER_UI_EVENT", ["undo", "click", "UNDO"]); + this.oApp.exec("REGISTER_UI_EVENT", ["redo", "click", "REDO"]); + + this.oApp.exec("REGISTER_HOTKEY", ["ctrl+z", "UNDO"]); + this.oApp.exec("REGISTER_HOTKEY", ["ctrl+y", "REDO"]); + }, + + $ON_UNDO : function(){ + var oTmpStateIdx = {}; + this.oApp.exec("DO_RECORD_UNDO_HISTORY", ["KEYPRESS", false, false, 1]); + if(this.oCurStateIdx.nIdx == 0) return; + + if(this.oCurStateIdx.nStep > 0){ + this.oCurStateIdx.nStep--; + }else{ + var oTmpHistory = this.aUndoHistory[this.oCurStateIdx.nIdx]; + + this.oCurStateIdx.nIdx--; + + if(oTmpHistory.nTotalSteps>1){ + this.oCurStateIdx.nStep = 0; + }else{ + oTmpHistory = this.aUndoHistory[this.oCurStateIdx.nIdx]; + this.oCurStateIdx.nStep = oTmpHistory.nTotalSteps-1; + } + } + + this.oApp.exec("RESTORE_UNDO_HISTORY", [this.oCurStateIdx.nIdx, this.oCurStateIdx.nStep]); + + this.oApp.exec("CHECK_STYLE_CHANGE", []); + }, + + + $ON_REDO : function(){ + if(this.oCurStateIdx.nIdx >= this.aUndoHistory.length) return; + + var oCurHistory = this.aUndoHistory[this.oCurStateIdx.nIdx]; + if(this.oCurStateIdx.nIdx == this.aUndoHistory.length-1 && this.oCurStateIdx.nStep >= oCurHistory.nTotalSteps-1) return; + + if(this.oCurStateIdx.nStep < oCurHistory.nTotalSteps-1){ + this.oCurStateIdx.nStep++; + }else{ + this.oCurStateIdx.nIdx++; + oCurHistory = this.aUndoHistory[this.oCurStateIdx.nIdx]; + this.oCurStateIdx.nStep = oCurHistory.nTotalSteps-1; + } + + this.oApp.exec("RESTORE_UNDO_HISTORY", [this.oCurStateIdx.nIdx, this.oCurStateIdx.nStep]); + + this.oApp.exec("CHECK_STYLE_CHANGE", []); + }, + + $ON_RECORD_UNDO_ACTION : function(sAction){ + this.oApp.exec("DO_RECORD_UNDO_HISTORY", [sAction]); + }, + + $ON_RECORD_UNDO_BEFORE_ACTION : function(sAction){ + this.oApp.exec("DO_RECORD_UNDO_HISTORY", [sAction, true, true]); + }, + + $ON_RECORD_UNDO_AFTER_ACTION : function(sAction){ + this.oApp.exec("DO_RECORD_UNDO_HISTORY", [sAction, true, false]); + }, + + $ON_RESTORE_UNDO_HISTORY : function(nUndoIdx, nUndoStateStep){ + this.oCurStateIdx.nIdx = nUndoIdx; + this.oCurStateIdx.nStep = nUndoStateStep; + + var oCurHistory = this.aUndoHistory[this.oCurStateIdx.nIdx]; + var sContent = oCurHistory.sContent[this.oCurStateIdx.nStep]; + var oBookmark = oCurHistory.oBookmark[this.oCurStateIdx.nStep]; + + this.oApp.setIR(sContent, true); + + // setting the innerHTML may change the internal DOM structure, so save the value again. + var sCurContent = this.oApp.getIR(); + if(this.bFF && sCurContent == this.sBlankContentsForFF){ + sCurContent = ""; + } + oCurHistory.sContent[this.oCurStateIdx.nStep] = sCurContent; + + var oSelection = this.oApp.getEmptySelection(); + if(oSelection.selectionLoaded){ + if(oBookmark){ + oSelection.moveToXPathBookmark(oBookmark); + }else{ + oSelection = this.oApp.getEmptySelection(); + } + + oSelection.select(); + } + }, + + $ON_DO_RECORD_UNDO_HISTORY : function(sAction, bTwoStepAction, bBeforeAction, nForceAddUnlessEqual){ + bTwoStepAction = bTwoStepAction || false; + bBeforeAction = bBeforeAction || false; + nForceAddUnlessEqual = nForceAddUnlessEqual || 0; + + // if we're in the middle of some action history, remove everything after current idx if any "little" change is made + if(!(this.oCurStateIdx.nIdx == this.aUndoHistory.length-1)) nForceAddUnlessEqual = 1; + + var oCurHistory = this.aUndoHistory[this.oCurStateIdx.nIdx]; + + var sCurContent = this.oApp.getIR(); + var sHistoryContent = oCurHistory.sContent[this.oCurStateIdx.nStep]; + + if(this.bFF && sCurContent == this.sBlankContentsForFF){ + sCurContent = ""; + } + + // every TwoStepAction needs to be recorded + if(!bTwoStepAction){ + switch(nForceAddUnlessEqual){ + case 0: + if(Math.abs(sHistoryContent.length - sCurContent.length)" + sURL + ""; + this.oSelection.pasteHTML(str); + }else{ + var nSession = Math.ceil(Math.random()*10000); + var sMarker = this.sATagMarker+nSession; + var arg = ( sURL == "" ? ["unlink"] : ["createLink", false, sMarker+sURL] ); + this.oApp.exec("EXECCOMMAND", arg); + + try { this.oSelection.setFromSelection() }catch(e){}; + var oDoc = this.oApp.getWYSIWYGDocument(); + $(oDoc.body.getElementsByTagName("A")) + .filter('[href^="'+sMarker+'"]') + .attr('href', function(){ + var rx = new RegExp('^'+sMarker.replace(/([\.\\])/g, '\\$1'), 'i'); + + if (sTarget) $(this).attr('target', sTarget); + else $(this).removeAttr('target'); + + return this.href.replace(rx, ''); + }); + } + this.oApp.exec("HIDE_ACTIVE_LAYER"); + + setTimeout($.fnBind(function(){try{this.oSelection.select()}catch(e){}}, this), 0); + }, + + _validateURL : function(sURL){ + return /^(http|https|ftp|mailto):(?:\/\/)?((\w|-)+(?:[\.:@](\w|-))+)(?:\/|@)?([^"\?]*?)(?:\?([^\?"]*?))?$/.test(sURL); + }, + + $ON_EVENT_XE_HYPERLINK_KEYDOWN : function(oEvent){ + if (oEvent.keyCode == 13){ + this.oApp.exec("XE_APPLY_HYPERLINK"); + oEvent.preventDefault(); oEvent.stopPropagation(); + } + } +}); +//} +//{ +/** + * @fileOverview This file contains Xpress plugin that takes care of the operations related to table creation + * @name hp_XE_Table.js + */ +xe.XE_Table = $.Class({ + name : "XE_Table", + iMinRows : 1, + iMaxRows : 20, + + iMinColumns : 1, + iMaxColumns : 10, + + iMinBorderWidth : 1, + iMaxBorderWidth : 10, + + oSelection : null, + + $init : function(oAppContainer){ + this._assignHTMLObjects(oAppContainer); + }, + + _assignHTMLObjects : function(oAppContainer){ + var tmp = null; + + this.elDropdownLayer = $("DIV.xpress_xeditor_table_layer", oAppContainer).get(0); + this.welDropdownLayer = $(this.elDropdownLayer); + + tmp = $("INPUT", this.elDropdownLayer).get(); + this.oRowInput = tmp[0]; + this.oColumnInput = tmp[1]; + this.oBorderWidthInput = tmp[2]; + this.oBorderColorInput = tmp[3]; + this.oBGColorInput = tmp[4]; + + tmp = $("BUTTON", this.elDropdownLayer).get(); + this.oButton_AddRow = tmp[0]; + this.oButton_RemoveRow = tmp[1]; + this.oButton_AddColumn = tmp[2]; + this.oButton_RemoveColumn = tmp[3]; + this.oButton_IncBorderWidth = tmp[4]; + this.oButton_DecBorderWidth = tmp[5]; + this.oButton_BorderColorPreview = tmp[6]; + this.oButton_BorderColor = tmp[7]; + this.oButton_BGColorPreview = tmp[8]; + this.oButton_BGColor = tmp[9]; + this.oButton_Insert = tmp[10]; + this.oButton_Cancel = tmp[11]; + + this.oSampleTable = $("TABLE", this.elDropdownLayer).get(0); + }, + + $ON_MSG_APP_READY : function(){ + this.oApp.exec("REGISTER_UI_EVENT", ["table", "click", "ST_TOGGLE_TOOLBAR_LAYER"]); + + this.oApp.registerBrowserEvent(this.oRowInput, "change", "ST_SET_ROW_NUM", [null, 0]); + this.oApp.registerBrowserEvent(this.oColumnInput, "change", "ST_SET_COLUMN_NUM", [null, 0]); + this.oApp.registerBrowserEvent(this.oBorderWidthInput, "change", "ST_SET_BORDER_WIDTH", [null, 0]); + + this.oApp.registerBrowserEvent(this.oButton_AddRow, "click", "ST_ADD_ROW"); + this.oApp.registerBrowserEvent(this.oButton_RemoveRow, "click", "ST_REMOVE_ROW"); + this.oApp.registerBrowserEvent(this.oButton_AddColumn, "click", "ST_ADD_COLUMN"); + this.oApp.registerBrowserEvent(this.oButton_RemoveColumn, "click", "ST_REMOVE_COLUMN"); + + this.oApp.registerBrowserEvent(this.oButton_IncBorderWidth, "click", "ST_INC_BORDER_WIDTH"); + this.oApp.registerBrowserEvent(this.oButton_DecBorderWidth, "click", "ST_DEC_BORDER_WIDTH"); + + this.oApp.registerBrowserEvent(this.oButton_BorderColorPreview, "click", "ST_TOGGLE_BORDER_COLOR_LAYER"); + this.oApp.registerBrowserEvent(this.oButton_BGColorPreview, "click", "ST_TOGGLE_BGCOLOR_LAYER"); + + this.oApp.registerBrowserEvent(this.oButton_BorderColor, "click", "ST_TOGGLE_BORDER_COLOR_LAYER"); + this.oApp.registerBrowserEvent(this.oButton_BGColor, "click", "ST_TOGGLE_BGCOLOR_LAYER"); + + this.oApp.registerBrowserEvent(this.oButton_Insert, "click", "ST_INSERT_TABLE"); + this.oApp.registerBrowserEvent(this.oButton_Cancel, "click", "ST_CLOSE"); + + this.oApp.exec("ST_SET_BORDER_COLOR", ["#CCCCCC"]); + this.oApp.exec("ST_SET_BGCOLOR", ["#FFFFFF"]); + }, + + $ON_ST_TOGGLE_TOOLBAR_LAYER : function(){ + this.oApp.exec("RECORD_UNDO_ACTION_FORCED", ["KEYPRESS"]); + + this._showNewTable(); + this.oApp.exec("TOGGLE_TOOLBAR_ACTIVE_LAYER", [this.elDropdownLayer]); + }, + + $ON_ST_ADD_ROW : function(){ + this.oApp.exec("ST_SET_ROW_NUM", [null, 1]); + }, + + $ON_ST_REMOVE_ROW : function(){ + this.oApp.exec("ST_SET_ROW_NUM", [null, -1]); + }, + + $ON_ST_ADD_COLUMN : function(){ + this.oApp.exec("ST_SET_COLUMN_NUM", [null, 1]); + }, + + $ON_ST_REMOVE_COLUMN : function(){ + this.oApp.exec("ST_SET_COLUMN_NUM", [null, -1]); + }, + + $ON_ST_SET_ROW_NUM : function(iRows, iRowDiff){ + iRows = iRows || parseInt(this.oRowInput.value); + iRowDiff = iRowDiff || 0; + + iRows += iRowDiff; + + if(iRows < this.iMinRows) iRows = this.iMinRows; + if(iRows > this.iMaxRows) iRows = this.iMaxRows; + + this.oRowInput.value = iRows; + this._showNewTable(); + }, + + $ON_ST_SET_COLUMN_NUM : function(iColumns, iColumnDiff){ + iColumns = iColumns || parseInt(this.oColumnInput.value); + iColumnDiff = iColumnDiff || 0; + + iColumns += iColumnDiff; + + if(iColumns < this.iMinColumns) iColumns = this.iMinColumns; + if(iColumns > this.iMaxColumns) iColumns = this.iMaxColumns; + + this.oColumnInput.value = iColumns; + this._showNewTable(); + }, + + $ON_ST_INSERT_TABLE : function(){ + var sTable = this._getTableString(); + + this.oApp.exec("PASTE_HTML", [sTable]); + + this.oApp.exec("ST_CLOSE", []); + }, + + $ON_ST_CLOSE : function(){ + this.oApp.exec("HIDE_ACTIVE_LAYER", []); + }, + + $ON_ST_SET_BORDER_WIDTH : function(iBorderWidth, iBorderWidthDiff){ + iBorderWidth = iBorderWidth || parseInt(this.oBorderWidthInput.value); + iBorderWidthDiff = iBorderWidthDiff || 0; + + iBorderWidth += iBorderWidthDiff; + + if(iBorderWidth < this.iMinBorderWidth) iBorderWidth = this.iMinBorderWidth; + if(iBorderWidth > this.iMaxBorderWidth) iBorderWidth = this.iMaxBorderWidth; + + this.oBorderWidthInput.value = iBorderWidth; + this._showNewTable(); + }, + + $ON_ST_INC_BORDER_WIDTH : function(){ + this.oApp.exec("ST_SET_BORDER_WIDTH", [null, 1]); + }, + + $ON_ST_DEC_BORDER_WIDTH : function(){ + this.oApp.exec("ST_SET_BORDER_WIDTH", [null, -1]); + }, + + $ON_ST_TOGGLE_BORDER_COLOR_LAYER : function(){ + if(this.welDropdownLayer.hasClass("p1")) + this.oApp.exec("ST_HIDE_BORDER_COLOR_LAYER", []); + else + this.oApp.exec("ST_SHOW_BORDER_COLOR_LAYER", []); + }, + + $ON_ST_SHOW_BORDER_COLOR_LAYER : function(){ + this.welDropdownLayer.addClass("p1"); + this.welDropdownLayer.removeClass("p2"); + + this.oApp.exec("SHOW_COLOR_PALETTE", ["ST_SET_BORDER_COLOR_FROM_PALETTE", this.elDropdownLayer]); + }, + + $ON_ST_HIDE_BORDER_COLOR_LAYER : function(){ + this.welDropdownLayer.removeClass("p1"); + + this.oApp.exec("HIDE_COLOR_PALETTE", []); + }, + + $ON_ST_TOGGLE_BGCOLOR_LAYER : function(){ + if(this.welDropdownLayer.hasClass("p2")) + this.oApp.exec("ST_HIDE_BGCOLOR_LAYER", []); + else + this.oApp.exec("ST_SHOW_BGCOLOR_LAYER", []); + }, + + $ON_ST_SHOW_BGCOLOR_LAYER : function(){ + this.welDropdownLayer.removeClass("p1"); + this.welDropdownLayer.addClass("p2"); + + this.oApp.exec("SHOW_COLOR_PALETTE", ["ST_SET_BGCOLOR_FROM_PALETTE", this.elDropdownLayer]); + }, + + $ON_ST_HIDE_BGCOLOR_LAYER : function(){ + this.welDropdownLayer.removeClass("p2"); + + this.oApp.exec("HIDE_COLOR_PALETTE", []); + }, + + $ON_ST_SET_BORDER_COLOR_FROM_PALETTE : function(sColorCode){ + this.oApp.exec("ST_SET_BORDER_COLOR", [sColorCode]); + this.oApp.exec("ST_HIDE_BORDER_COLOR_LAYER", []); + }, + + $ON_ST_SET_BORDER_COLOR : function(sColorCode){ + this.oBorderColorInput.value = sColorCode; + this.oButton_BorderColorPreview.style.backgroundColor = sColorCode; + + this._showNewTable(); + }, + + $ON_ST_SET_BGCOLOR_FROM_PALETTE : function(sColorCode){ + this.oApp.exec("ST_SET_BGCOLOR", [sColorCode]); + this.oApp.exec("ST_HIDE_BGCOLOR_LAYER", []); + }, + + $ON_ST_SET_BGCOLOR : function(sColorCode){ + this.oBGColorInput.value = sColorCode; + this.oButton_BGColorPreview.style.backgroundColor = sColorCode; + + this._showNewTable(); + }, + + _showNewTable : function(){ + var oTmp = document.createElement("DIV"); + oTmp.innerHTML = this._getTableString(); + var oNewTable = oTmp.firstChild; + this.oSampleTable.parentNode.insertBefore(oNewTable, this.oSampleTable); + this.oSampleTable.parentNode.removeChild(this.oSampleTable); + this.oSampleTable = oNewTable; + }, + + // need to do something about the table width as the same HTML code is being used to the actual table and the preview table + _getTableString : function(){ + var sBorderColorCode = this.oBorderColorInput.value; + var sBGColorCode = this.oBGColorInput.value; + var iBorderWidth = this.oBorderWidthInput.value; + var sTD = ""; + if($.browser.msie){ + sTD = "

    "; + }else{ + if($.browser.firefox){ + sTD = ""; + }else{ + sTD = ""; + } + } + + var sTable = '


     

    '; + var sRow = ''; + var iColumns = this.oColumnInput.value; + for(var i=0; i/ig, + regex_meanless_css2 = /(?:(?:margin|padding)\s*:\s*0(?:px)?|\-(?:moz|ms|webkit|opera)\-[\w-]+\s*:\s*.*?|[\w-]+\s*:\s*\-(?:moz|ms|webkit|opera)\-[\w-]+|(?:line-height|font-variant|font-stretch|font-size-adjust|font-size)\s*:\s*[a-z_-]+)\s*;?\s*|font-(?:weight|style)\s*:\s*normal;?/ig, + regex_class = /<(.*?)\s+class\s*=(?:\s*"(.*?)"|\s*'(.*?)'|([^\s>]+))(.*?)>/ig, + regex_class2 = /xe_selected_cell/g; + regex_handler = /<(.*?)\s+on[a-z]+\s*=(?:\s*".*?"|\s*'.*?'|[^\s>]+)(.*?)>/ig, + //regex_id = /<(.*?)\s+id\s*=(?:[^\s>]+|\s*".*?"|\s*'.*?')(.*?)>/ig, + //regex_script = //ig, + regex_font_color = /color\s*=(?:\s*"(.*?)"|\s*'(.*?)'|([^\s>]+))/i, + regex_font_face = /face\s*=(?:\s*"(.*?)"|\s*'(.*?)'|([^\s>]+))/i, + regex_font_size = /size\s*=(?:\s*"(\d+)"|\s*'(\d+)'|(\d+))/i, + regex_style = /style\s*=\s*(?:\s*"(.*?)"|\s*'(.*?)'|([^\s>]+))/i, + regex_font_weight = /font-weight\s*:\s*([a-z]+);?/i, + regex_font_style = /font-style\s*:\s*italic;?/i, + regex_font_decoration = /text-decoration\s*:\s*([a-z -]+);?/i, + regex_jquery = /jQuery\d+\s*=(\s*"\d+"|\d+)/ig, + regex_quote_attr = /([\w-]+\s*=(?:\s*"[^"]+"|\s*'[^']+'))|([\w-]+)=([^\s]+)/g; //" + +var + allow_tags = 'a,abbr,acronym,address,area,blockquote,br,caption,center,cite,code,col,colgroup,dd,del,dfn,div,dl,dt,em,embed,h1,h2,h3,h4,h5,h6,hr,img,ins,kbd,li,map,object,ol,p,param,pre,q,samp,span,strong,sub,sup,table,tbody,td,tfoot,th,thead,tr,tt,u,ul,var,iframe,object,param,style'.split(','), + lonely_tags = 'area,br,col,embed,hr,img,input,param'.split(','); + +var + replace_tags = { + 'b' : 'strong', + 'i' : 'em', + 's' : 'del', + 'strike' : 'del' + }; + +xe.XE_XHTMLFormatter = $.Class({ + name : "XE_XHTMLFormatter", + + $ON_MSG_APP_READY : function() { + this.oApp.addConverter("WYSIWYG_TO_IR", this.TO_IR); + this.oApp.addConverter("HTMLSrc_TO_IR", this.TO_IR); + this.oApp.addConverter("IR_TO_HTMLSrc", this.IR_TO); + this.oApp.addConverter("IR_TO_WYSIWYG", this.IR_TO); + }, + + TO_IR : function(sContent) { + var stack = []; + + // remove xeHandled attrs + /* + sContent = sContent.replace(/xeHandled="YES"/ig,''); + */ + + + // remove all useless styles + /* + sContent = sContent.replace(regex_meanless_css1, function(m0,m1,m2,m3){ + m2 = m2.replace(regex_meanless_css2, ''); + + return '<'+m1+(m2?' style="'+m2+'"':'')+m3+'>'; + }); + */ + + // remove all useless classes + /* + sContent = sContent.replace(regex_class, function(m0,m1,m2,m3,m4,m5){ + var cls = $.trim((m2 || m3 || m4 || "").replace(regex_class2, '')); + + return '<'+(m1||"")+(cls?' class="'+cls+'"':'')+(m5||"")+'>'; + }); + */ + + // remove all event handler + //sContent = sContent.replace(regex_handler, '<$1$2>'); + + // remove all id + //sContent = sContent.replace(regex_id, '<$1$2>'); + + // remove all scripts + //sContent = sContent.replace(regex_script, ''); + + if ($.browser.msie) { + // remove $ attributes + sContent = sContent.replace(regex_jquery, ''); + + // quote all attrs + sContent = sContent.replace(/<(\w+) ([^>]+)>/g, function(m0,m1,m2){ + return '<'+m1+' '+ + m2.replace(regex_quote_attr, function(s0,s1,s2,s3){ + if (s1) return s1; + if(/^"/.test(s3)||/"$/.test(s3)) return s2+'='+s3; + return s2+'="'+s3+'"'; + }) + '>'; + }); + } + + // remove all useless tag and enclose tags + regex = /<(\/)?([:\w\/-]+)(.*?)>/ig; + sContent = sContent.replace(regex, function(m0,closing,tag,attrs){ + var m3s = []; + var state = ''; + + closing = closing || ''; + tag = tag.toLowerCase(); + attrs = $.trim(attrs || ''); + + if (!closing) { + if ($.inArray(tag,lonely_tags) >= 0) { + var len = attrs.length; + if (tag == 'br') attrs = ''; + if (!attrs || attrs.substring(len-1,len) != '/') attrs += '/'; + + return '<'+tag+' '+$.trim(attrs)+'>'; + } else { + stack[stack.length] = {tag:tag, state:state}; + } + } else { + var tags = [], t = ''; + + // remove unnecessary closing tag + if (!stack.length) return ''; + + do { + t = stack.pop(); + if (t.tag != tag) continue; + if (t.state != 'deleted') tags.push(''); + } while(stack.length && t.tag != tag); + + return tags.join(''); + } + + return '<'+closing+tag+(attrs?' '+attrs:'')+'>'; + }); + /* + if (stack.length) { + var t = ''; + + do { + t = stack.pop(); + if (t.state != 'deleted') sContent += ''; + } while(stack.length); + } + */ + + return sContent; + }, + + IR_TO : function(sContent) { + return sContent; + } +}); +// center, font, b, i, s, strike + +/** + * Support XE extensions + * @author NHN (developer@xpressengine.com) + */ +xe.XE_Extension = $.Class({ + name : "XE_Extension", + seq : '', + last_doc : '', + + $init : function(elAppContainer, editor_sequence) { + this.seq = editor_sequence; + this._assignHTMLObjects(elAppContainer); + }, + + _assignHTMLObjects : function(elAppContainer) { + this.elDropdownLayer = $('DIV.xpress_xeditor_extension_layer', elAppContainer).get(0); + }, + + _removeAttrs : function(sContent) { + return sContent; + }, + + _addEvent : function() { + if (this.oApp.getEditingMode() != 'WYSIWYG') return; + + var doc = this.oApp.getWYSIWYGDocument(); + var seq = this.seq; + var fn = function(){ + var obj = $(this); + var comp = obj.attr('editor_component'); + if (comp && $.isFunction(openComponent)) { + editorPrevNode = obj.get(0); + openComponent(comp, seq); + } + }; + + $('img,div[editor_component]', doc).each(function(){ + var obj = $(this); + if(this.nodeName == 'IMG' && !obj.attr('editor_component')) { + obj.attr('editor_component','image_link'); + } + if(this.last_doc != doc) { + obj.dblclick(fn); + this.last_doc = doc; + } + }); + }, + + $ON_MSG_APP_READY : function() { + var oApp = this.oApp; + oApp.exec('REGISTER_UI_EVENT', ['extension', 'click', 'TOGGLE_EXTENSION_LAYER']); + var functn = function(){ + oApp.exec("HIDE_ACTIVE_LAYER", []); + }; + $('a', this.elDropdownLayer).each(function(){ + var obj = $(this); + if(!obj.attr('component_onclick_event_added')) { + obj.click(functn); + obj.attr('component_onclick_event_added','Y'); + } + }); + }, + + $ON_TOGGLE_EXTENSION_LAYER : function() { + this.oApp.exec('TOGGLE_TOOLBAR_ACTIVE_LAYER', [this.elDropdownLayer]); + }, + + $ON_CHANGE_EDITING_MODE : function(mode) { + var self = this; + setTimeout(function(){ self._addEvent(); }, 100); + }, + + $ON_PASTE_HTML : function() { + var self = this; + setTimeout(function(){ self._addEvent(); }, 100); + }, + + $ON_LOAD_IR_FIELD : function() { + var self = this; + setTimeout(function(){ self._addEvent(); }, 100); + }, + + $ON_SET_IR : function() { + var self = this; + setTimeout(function(){ self._addEvent(); }, 100); + } +}); +/** + * Auto saving + * @author NHN (developer@xpressengine.com) + */ +xe.XE_AutoSave = $.Class({ + name : "XE_AutoSave", + form : null, + textarea : null, + + $init : function(oIRTextarea, elAppContainer) { + this.form = oIRTextarea.form; + this.textarea = oIRTextarea; + + this._assignHTMLObjects(elAppContainer); + }, + + _assignHTMLObjects : function(elAppContainer) { + this.welMessageBox = $('autosave_message'); + }, + + $ON_MSG_APP_READY : function() { + var elTitle = $(this.form._saved_doc_title); + var elContent = $(this.form._saved_doc_content); + + var title = $.trim(elTitle.val()); + var content = $.trim(elContent.val()); + + if (title || content) { + if (confirm(this.form._saved_doc_message.value)) { + $(this.form.title).val(title); + this.oApp.setIR(content); + if(typeof(editorGetAutoSavedDoc) == 'function') editorGetAutoSavedDoc(this.form); + } else { + editorRemoveSavedDoc(); + } + } + + editorEnableAutoSave(this.form, $(this.form).attr("editor_sequence")); + + // register hotkey + this.oApp.exec('REGISTER_HOTKEY', ['ctrl+shift+s','AUTO_SAVE']); + }, + + $ON_AUTO_SAVE : function() { + _editorAutoSave(); + } +}); +/** + * Format Block plugin + * @author NHN (developer@xpressengine.com) + */ +xe.XE_FormatWithSelectUI = $.Class({ + name : "XE_FormatWithSelectUI", + + $init : function(elAppContainer){ + this._assignHTMLObjects(elAppContainer); + }, + + _assignHTMLObjects : function(elAppContainer){ + this.elFormatSelect = $("SELECT.xpress_xeditor_ui_format_select", elAppContainer).get(0); + }, + + $ON_MSG_APP_READY : function(){ + this.oApp.registerBrowserEvent(this.elFormatSelect, "change", "SET_FORMAT_FROM_SELECT_UI"); + this.elFormatSelect.selectedIndex = 0; + }, + + $ON_MSG_STYLE_CHANGED : function(sAttributeName, sAttributeValue){ + var blockName = this.oApp.getWYSIWYGDocument().queryCommandValue("FormatBlock"); + + if (!blockName) return (this.elFormatSelect.selectedIndex = 0); + if ($.browser.msie && /([0-9])/.test(blockName)) blockName = 'h'+(RegExp.$1); + + this.elFormatSelect.value = blockName.toLowerCase(); + if(this.elFormatSelect.selectedIndex < 0) this.elFormatSelect.selectedIndex = 0; + if(this.elFormatSelect.value != blockName.toLowerCase()) this.elFormatSelect.selectedIndex = 0; + }, + + $ON_SET_FORMAT_FROM_SELECT_UI : function(){ + var sFormat = this.elFormatSelect.value; + if(!sFormat) return; + if($.browser.msie) sFormat = '<'+sFormat+'>'; + + this.oApp.exec("EXECCOMMAND", ["FormatBlock", false, sFormat]); + this.oApp.exec("CHECK_STYLE_CHANGE", []); + } +}); +/** + * Enhanced Table Fetures + * @author NHN (developer@xpressengine.com) + */ + +// 표 편집 확장 기능 +xe.XE_Table = $.Class({ + _startSel : null, + _endSel : null, + + $ON_MSG_APP_READY : function() { + this._doc = $(this.oApp.getWYSIWYGDocument()); + + this.$FnMouseDown = $.fnBind(this._mousedown, this); + this.$FnMouseUp = $.fnBind(this._mouseup, this); + this.$FnMouseMove = $.fnBind(this._mousemove, this); + + this._doc.mousedown(this.$FnMouseDown); + + // initialize + this._startSel = null; + this._endSel = null; + + // register buttons + this.oApp.exec('REGISTER_UI_EVENT', ['merge_cells', 'click', 'MERGE_CELLS']); + this.oApp.exec('REGISTER_UI_EVENT', ['split_col', 'click', 'CELL_SPLIT_BY_COL']); + this.oApp.exec('REGISTER_UI_EVENT', ['split_row', 'click', 'CELL_SPLIT_BY_ROW']); + + // register hotkeys + this.oApp.exec('REGISTER_HOTKEY', ['ctrl+alt+m', 'MERGE_CELLS']); + + // perform default ready action + this.$super.$ON_MSG_APP_READY(); + }, + + $ON_MERGE_CELLS : function() { + var html = ""; + var cell = $('.xe_selected_cell', this.oApp.getWYSIWYGDocument()).filter('td,th'); + var self = this; + + // 선택된 셀이 없으면 종료 + if (!cell.length) return; + + // UNDO 지점 기록 + this.oApp.exec("RECORD_UNDO_ACTION", ["Cell:Merge"]); + + // 선택한 모든 셀의 데이터를 첫번째 셀로 복사 + cell.each(function(){ html += $(this).html() }).eq(0).html(html); + + // 첫번째 셀 가로 확장 + var colspan = 0; + cell.eq(0).nextAll('td,th').andSelf().filter('.xe_selected_cell').each(function(idx){ + colspan += self._getSpan(this, 'col'); + }); + + // 마지막 셀까지 줄의 갯수 계산 + var rect = this._getRect(cell.eq(0)); + var start_tr = cell.eq(0).parent('tr'); + var end_tr = cell.eq(cell.length-1).parent('tr'); + var all_rows = cell.parents('table').eq(0).find('tr'); + var rowspan = all_rows.index(end_tr.get(0)) - all_rows.index(start_tr.get(0)) + this._getSpan(cell.eq(cell.length-1), 'row'); + + // 첫번째 셀 colspan, rowspan 속성 지정 + cell.eq(0).attr('colSpan', colspan).attr('rowSpan', rowspan); + + // 첫번째 셀을 제외한 다른 모든 셀 제거 + cell.slice(1).remove(); + }, + + $ON_CELL_SPLIT_BY_ROW : function(many) { + var cell = $('.xe_selected_cell', this.oApp.getWYSIWYGDocument()).filter('td,th'); + var table = cell.parents('table').eq(0); + var self = this; + + // 선택된 셀이 없으면 종료 + if (!cell.length) return; + + // UNDO 지점 기록 + this.oApp.exec("RECORD_UNDO_ACTION", ["Cell:Split By Row"]); + + // 선택 영역의 상하 좌표 구함 + var _top = this._getRect(cell.eq(0)).top; + var _bottom = this._getRect(cell.eq(cell.length-1)).bottom; + + // 테이블의 모든 셀에서 선택영역에 해당하는 셀을 구한다(상하 기준). + (cell = table.find('td,th').filter(function(){ + var rect = self._getRect($(this)); + + return !(rect.bottom <= _top || rect.top >= _bottom); + })).filter('.xe_selected_cell').each(function(){ + var t = $(this); + var row = t.parent('tr'); + var rowspan = self._getSpan(t, 'row'); + var rect = self._getRect(t); + var queue = []; + var clone = t.clone().html('
    '); + var topspan = 1, botspan = 1; + + // rowspan > 1이면 현재 셀의 rowspan을 절반으로 분할한다. + if (rowspan > 1) { + + topspan = Math.ceil(rowspan/2); + botspan = rowspan - topspan; + + queue.push(function(){ + t.attr('rowSpan', topspan); + }); + + clone.attr('rowSpan', botspan); + } else { + // rowspan이 없으면 현재 셀과 영역이 겹치는 모든 셀에 rowspan을 추가 + cell.filter(function(){ + if (t.get(0) == this) return false; + + var tt = $(this); + var rc = self._getRect(tt); + + // 범위를 넘은 부분은 제외 + if (rc.bottom <= rect.top || rc.top >= rect.bottom) return false; + + return true; + }).each(function(){ + var tt = $(this); + var sp = self._getSpan(tt, 'row')+1; + + // rowspan 1 추가 + queue.push(function(){ + tt.attr('rowSpan', sp); + }); + }); + + // 새 줄을 추가한다. + if ($.browser.msie) { + // Fix bug for IE + row.after(row.clone().empty().get(0).outerHTML); + } else { + row.after(row.clone().empty()); + } + } + + var rows = row.nextAll('tr'); + + // 현재 셀이 마지막 줄에 있다면 한 줄 추가 후 새로운 셀 추가 + if (!rows.length) { + row.after(row.clone().empty().append(clone)); + } else { + var next_sib = rows.eq(topspan - 1).children('td,th').filter(function(){ + return ( self._getRect($(this)).left > rect.left ); + }); + + if ($.browser.msie) { + next_sib.length? + next_sib.eq(0).before(clone.get(0).outerHTML): + rows.eq(topspan-1).append(clone.get(0).outerHTML); + } else { + next_sib.length? + next_sib.slice(0,1).before(clone): + rows.slice(topspan-1,1).append(clone); + } + } + + // 함수를 바로 실행하면 좌표가 틀어지므로, 큐에 넣은 후 실행 + $.each(queue, function(){ this(); }); + + }); + }, + + $ON_CELL_SPLIT_BY_COL : function(many) { + var cell = $('.xe_selected_cell', this.oApp.getWYSIWYGDocument()).filter('td,th'); + var table = cell.parents('table').slice(0,1); + var self = this; + var ie_bug = [], tmpId = (new Date).getTime(), tmpStr = ''; + + // 선택된 셀이 없으면 종료 + if (!cell.length) return; + + // UNDO 지점 기록 + this.oApp.exec("RECORD_UNDO_ACTION", ["Cell:Split By Column"]); + + // 선택 영역의 좌우 좌표 구함 + var first_row = cell.eq(0).parent('tr'); + var _left = this._getRect(first_row.find('.xe_selected_cell:first')).left; + var _right = this._getRect(first_row.find('.xe_selected_cell:last')).right; + + // 테이블의 모든 셀에서 선택영역에 해당하는 셀을 구한다(좌우 기준). + (cell = table.find('td,th').filter(function(){ + var rect = self._getRect($(this)); + + return !(rect.right <= _left || rect.left >= _right); + })).filter('.xe_selected_cell').each(function(idx){ + var t = $(this); + var colspan = self._getSpan(t, 'col'); + var clone = t.clone().html('
    '); + + // colspan > 1 이면 colspan을 절반으로 분할한다. + if (colspan > 1) { + var leftspan = Math.ceil(colspan/2); + var rightspan = colspan - leftspan; + + t.attr('colSpan', leftspan); + clone.attr('colSpan', rightspan); + } else { + // colspan이 없으면 현재 셀과 영역이 겹치는 모든 셀에 colspan을 추가 + var rect = self._getRect(t); + + cell.filter(function(){ + if (t.get(0) == this) return false; + + var tt = $(this); + var rc = self._getRect(tt); + + // 범위를 넘은 부분은 제외 + if (rc.right <= rect.left || rc.left >= rect.right) return false; + + return true; + }).each(function(){ + var tt = $(this); + + // colspan 1 추가 + tt.attr('colSpan', self._getSpan(tt, 'col')+1); + }); + + clone.attr('colSpan', 1); + } + + if ($.browser.msie) { + // Fix for IE bug + t.after(clone.get(0).outerHTML); + } else { + t.after(clone); + } + }); + }, + + $ON_CHECK_STYLE_CHANGE : function(){ + var ui = ['merge_cells', 'split_col', 'split_row']; + var app = this.oApp; + var command = (this._startSel && this._startSel.is('.xe_selected_cell'))?'ENABLE_UI':'DISABLE_UI'; + + $.each(ui, function(){ app.exec(command, [this]); }); + }, + + _mousedown : function(event) { + var cur = $(event.target); + var sel = cur.parents().andSelf().filter('td,th,table'); + var app = this.oApp; + var self = this; + + // 모든 선택영역 해제 + $('td.xe_selected_cell', this.oApp.getWYSIWYGDocument()).removeClass('xe_selected_cell'); + + this._startSel = null; + this._endSel = null; + + if (!sel.length || !this._isLeftClicked(event.button)) return; + + function delayed(){ + sel = app.getSelection().cloneRange(); + sel.collapseToStart(); + sel = $(sel.startContainer).parents().andSelf().filter('td,th').eq(0); + + if (!sel.length) return self._removeAllListener()||true; + + // 좌표를 구한다 + self._getRect(self._startSel = sel); + + // 이벤트 바인딩 + self._doc.bind('mousemove', self.$FnMouseMove); + self._doc.bind('mouseup', self.$FnMouseUp); + } + + // mousedown이 일어난 후에 선택 영역이 설정되므로 실행을 지연시킨다. + setTimeout(delayed, 0); + }, + + _mouseup : function(event) { + // 선택된 셀 확인 + this._removeAllListener(); + + // 시작셀과 종료셀 제거 + this._startSel = this._endSel = null; + }, + + _mousemove : function(event) { + var cur = $(event.target); + var cell = cur.parents().andSelf().filter('td,th').eq(0); + var self = this; + + // 마우스 왼쪽 버튼이 눌리지 않았으면 종료 + if (!cell.length || !this._isLeftClicked(event.button)) return; + if (!this._endSel && cell.get(0) == this._startSel.get(0)) return; + if (this._endSel && cell.get(0) == this._endSel.get(0)) return; + + // 종료셀 && 종료셀의 좌표 + this._getRect(this._endSel = cell); + + // 선택 범위를 구한다 + var _top = Math.min(this._startSel.rect.top, this._endSel.rect.top); + var _left = Math.min(this._startSel.rect.left, this._endSel.rect.left); + var _bottom = Math.max(this._startSel.rect.bottom, this._endSel.rect.bottom); + var _right = Math.max(this._startSel.rect.right, this._endSel.rect.right); + + var table = cell.parents('table'); + var cells = table.find('td,th').removeClass('xe_selected_cell'); + var i = 0; + + // 복잡한 모양의 테이블을 위한 반복 처리 + var selected = $(); + do { + // 선택한 셀로 최대 영역 재계산 + selected.each(function(){ + var rect = self._getRect($(this)); + + // 영역 재계산 + if (rect.right > _right) _right = rect.right; + if (rect.left < _left) _left = rect.left; + if (rect.top < _top) _top = rect.top; + if (rect.bottom > _bottom) _bottom = rect.bottom; + }); + + // 좌표 범위 안에 있는 선택할 셀을 추린다. + cells = cells.filter(':not(.xe_selected_cell)'); + selected = cells.filter(function(){ + var rect = self._getRect($(this)); + + if (rect.right <= _left || rect.left >= _right || rect.bottom <= _top || rect.top >= _bottom) return false; + + return true; + }).addClass('xe_selected_cell'); + } while(selected.length); + + // 브라우저의 기본 선택영역 해제 : FF 제외 - 기본 기능이 충분히 좋아서 + 이 부분을 실행하면 오류가 발생해서 + if (!$.browser.mozilla) { + function delayed() { + var sel = self.oApp.getSelection(); + + if (!self._startSel) return; + if (!self._startSel.get(0).firstChild) self._startSel.text(" "); + + sel.selectNode(self._startSel.get(0).firstChild); + sel.collapseToStart(); + sel.select(); + } + + setTimeout(delayed, 0); + } + + return false; + }, + + _removeAllListener : function() { + // 이벤트 해제 + this._doc.unbind("mousemove", this.$FnMouseMove); + this._doc.unbind("mouseup", this.$FnMouseUp); + }, + + _isLeftClicked : function(value) { + return $.browser.msie?!!(value & 1):(value == 0); + }, + + _getRect : function(obj) { + var el = obj.get(0); + + obj.rect = {}; + obj.rect.top = el.offsetTop; + obj.rect.left = el.offsetLeft; + obj.rect.bottom = obj.rect.top + el.offsetHeight; + obj.rect.right = obj.rect.left + el.offsetWidth; + + return obj.rect; + }, + + _getSpan : function(obj, type) { + var span = parseInt($(obj).attr(type+'span')); + + return isNaN(span)?1:span; + } +}).extend(xe.XE_Table); + +})(jQuery); diff --git a/modules/editor/skins/xpresseditor/js/xe_interface.js b/modules/editor/skins/xpresseditor/js/xe_interface.js index 269a02c8d..ef9a2348d 100644 --- a/modules/editor/skins/xpresseditor/js/xe_interface.js +++ b/modules/editor/skins/xpresseditor/js/xe_interface.js @@ -1,308 +1,308 @@ -if (!window.xe) xe = {}; - -xe.Editors = []; - -function editorStart_xe(editor_sequence, primary_key, content_key, editor_height, colorset, content_style, content_font, content_font_size) { - if(typeof(colorset)=='undefined') colorset = 'white'; - if(typeof(content_style)=='undefined') content_style = 'xeStyle'; - if(typeof(content_font)=='undefined') content_font= ''; - if(typeof(content_font_size)=='undefined') content_font_size= ''; - - var target_src = request_uri+'modules/editor/styles/'+content_style+'/editor.html'; - - var textarea = jQuery("#xpress-editor-"+editor_sequence); - var iframe = jQuery(' + + + + +
    +

    레이아웃 이미지 목록

    +
    + +
    + + {@$ext=substr(strrchr($file,'.'),1)} +
    + + + + + + +
    + + +
    +
    +
    + + + + + + +
    + diff --git a/modules/member/conf/info.xml b/modules/member/conf/info.xml index d53217ddb..47f6cb7df 100644 --- a/modules/member/conf/info.xml +++ b/modules/member/conf/info.xml @@ -1,36 +1,36 @@ - - - 회원 관리 - 会员管理 - 会員 管理 - Member Management - Quản lý thành viên - Usuario Gestión - Управление пользователями - 會員 管理 - Üye Yönetimi - 회원 관리 및 회원 관련 설정등을 하는 모듈입니다. - 对会员进行管理及相关设置的模块。 - 会員管理及び会員関連設定などを行うモジュールです。 - This module is for managing or configuring members. - Module này dành cho việc quản lý và tạo thành viên. - Este módulo es para el manejo y la configuración de los usuarios. - Этот модуль служит для управления и конфигурирования пользователей. - 對會員進行管理與相關設置的模組。 - Bu modül üyeleri yönetmek/yapılandırmak için kullanılır - 0.1 - 2007-02-28 - member - - - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - - + + + 회원 관리 + 会员管理 + 会員 管理 + Member Management + Quản lý thành viên + Usuario Gestión + Управление пользователями + 會員 管理 + Üye Yönetimi + 회원 관리 및 회원 관련 설정등을 하는 모듈입니다. + 对会员进行管理及相关设置的模块。 + 会員管理及び会員関連設定などを行うモジュールです。 + This module is for managing or configuring members. + Module này dành cho việc quản lý và tạo thành viên. + Este módulo es para el manejo y la configuración de los usuarios. + Этот модуль служит для управления и конфигурирования пользователей. + 對會員進行管理與相關設置的模組。 + Bu modül üyeleri yönetmek/yapılandırmak için kullanılır + 0.1 + 2007-02-28 + member + + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + diff --git a/modules/member/lang/en.lang.php b/modules/member/lang/en.lang.php index 7f1a9a4fc..416f075c3 100644 --- a/modules/member/lang/en.lang.php +++ b/modules/member/lang/en.lang.php @@ -1,236 +1,236 @@ -member = 'Member'; - $lang->member_default_info = 'Basic Info'; - $lang->member_extend_info = 'Additional Info'; - $lang->default_group_1 = "Associate Member"; - $lang->default_group_2 = "Regular Member"; - $lang->admin_group = "Managing Group"; - $lang->keep_signed = 'Keep me signed in'; - $lang->remember_user_id = 'Remember ID'; - $lang->already_logged = "You are already signed in"; - $lang->denied_user_id = 'You have entered a prohibited ID.'; - $lang->null_user_id = 'Please input ID'; - $lang->null_password = 'Please input password'; - $lang->invalid_authorization = 'The account is not activated.'; - $lang->invalid_user_id= "You have entered an invalid ID"; - $lang->invalid_password = 'You have entered an invalid password'; - $lang->invalid_new_password = 'New password must not be the same as old one.'; - $lang->allow_mailing = 'Join Mailing'; - $lang->denied = 'Prohibited'; - $lang->is_admin = 'Superadmin Permission'; - $lang->group = 'Group'; - $lang->group_title = 'Group Name'; - $lang->group_srl = 'Group Number'; - $lang->signature = 'Signature'; - $lang->profile_image = 'Profile Image'; - $lang->profile_image_max_width = 'Max Width'; - $lang->profile_image_max_height = 'Max Height'; - $lang->image_name = 'Image Name'; - $lang->image_name_max_width = 'Max Width'; - $lang->image_name_max_height = 'Max Height'; - $lang->image_mark = 'Image Mark'; - $lang->image_mark_max_width = 'Max Width'; - $lang->image_mark_max_height = 'Max Height'; - $lang->group_image_mark = 'Group Image Mark'; - $lang->group_image_mark_max_width = 'Max Width'; - $lang->group_image_mark_max_height = 'Max Height'; - $lang->group_image_mark_order = 'Group Image Mark Order'; - $lang->signature_max_height = 'Max Signature Height'; - $lang->enable_openid = 'Enable OpenID'; - $lang->enable_join = 'Accept New Members'; - $lang->enable_confirm = 'Email Activation'; - $lang->enable_ssl = 'Enable SSL'; - $lang->security_sign_in = 'Sign in using enhanced security'; - $lang->limit_day = 'Temporary Limit Date'; - $lang->limit_date = 'Limit Date'; - $lang->after_login_url = 'URL after Sign in'; - $lang->after_logout_url = 'URL after Sign out'; - $lang->redirect_url = 'URL after Sign up'; - $lang->agreement = 'Sign up Agreement'; - $lang->accept_agreement = 'Agree'; - $lang->member_info = 'Member Info'; - $lang->current_password = 'Current Password'; - $lang->openid = 'OpenID'; - $lang->allow_message = 'Allow Messages'; - $lang->allow_message_type = array( - 'Y' => 'Allow All', - 'F' => 'Allow for Friends', - 'N' => 'Reject All', - ); - $lang->about_allow_message = 'You may allow or reject messages.'; - $lang->logged_users = 'Logged on Users'; - - $lang->webmaster_name = "Webmaster Name"; - $lang->webmaster_email = "Webmaster Email"; - - $lang->about_keep_signed = 'You will be still signed in even when the browser is closed.\n\nIt is not recommended to use this if you are using a public computer for your personal information could be violated'; - $lang->about_keep_warning = 'You will be still signed in even when the browser is closed. It is not recommended to use this if you are using a public computer for your personal information could be violated'; - $lang->about_webmaster_name = "Please input webmaster's name which will be used for verification mails or other site administration. (default : webmaster)"; - $lang->about_webmaster_email = "Please input webmaster's email address."; - - $lang->search_target_list = array( - 'user_id' => 'ID', - 'user_name' => 'Name', - 'nick_name' => 'Nickname', - 'email_address' => 'Email Address', - 'regdate' => 'Sign up Date', - 'regdate_more' => 'Sign up Date (more)', - 'regdate_less' => 'Sign up Date (less)', - 'last_login' => 'Last Sign in Date', - 'last_login_more' => 'Last Sign in Date (more)', - 'last_login_less' => 'Last Sign in Date (less)', - 'extra_vars' => 'Extra Vars', - ); - - $lang->cmd_login = 'Sign In'; - $lang->cmd_logout = 'Sign Out'; - $lang->cmd_signup = 'Sign Up'; - $lang->cmd_site_signup = 'Sign Up'; - $lang->cmd_modify_member_info = 'Modify Member Info'; - $lang->cmd_modify_member_password = 'Modify Password'; - $lang->cmd_view_member_info = 'Member Info'; - $lang->cmd_leave = 'Leave'; - $lang->cmd_find_member_account = 'Find Account Info'; - $lang->cmd_resend_auth_mail = 'Request for Activation Mail'; - - $lang->cmd_member_list = 'Member List'; - $lang->cmd_module_config = 'Default Setting'; - $lang->cmd_member_group = 'Member Groups'; - $lang->cmd_send_mail = 'Send Mail'; - $lang->cmd_manage_id = 'Prohibited IDs'; - $lang->cmd_manage_form = 'Sign up Form'; - $lang->cmd_view_own_document = 'Written Articles'; - $lang->cmd_manage_member_info = 'Manage Member Info'; - $lang->cmd_trace_document = 'Trace Written Articles'; - $lang->cmd_trace_comment = 'Trace Written Comments'; - $lang->cmd_view_scrapped_document = 'Scraps'; - $lang->cmd_view_saved_document = 'Saved Articles'; - $lang->cmd_send_email = 'Send Mail'; - - $lang->msg_email_not_exists = "You have entered an invalid email address"; - - $lang->msg_alreay_scrapped = 'This article is already scrapped'; - - $lang->msg_cart_is_null = 'Please select the target'; - $lang->msg_checked_file_is_deleted = '%d attached file(s) is(are) deleted'; - - $lang->msg_find_account_title = 'Account Info'; - $lang->msg_find_account_info = 'This is requested account info.'; - $lang->msg_find_account_comment = 'The password will be modified as above one as you click below link.
    Please modify the password after login.'; - $lang->msg_confirm_account_title = 'Zeroboard XE Account Activation'; - $lang->msg_confirm_account_info = 'This is your account information:'; - $lang->msg_confirm_account_comment = 'Click on the followed link to complete your account activation.'; - $lang->msg_auth_mail_sent = 'The activation mail has been sent to %s. Please check your mail.'; - $lang->msg_confirm_mail_sent = 'We just sent the activation email to %s. Please check your mail.'; - $lang->msg_invalid_auth_key = 'This is an invalid request of verification.
    Please retry finding account info or contact to administrator.'; - $lang->msg_success_authed = 'Your account has been successfully activated and logged on.\n Please modify the password to your own one with the password in the mail.'; - $lang->msg_success_confirmed = 'Your account has been activated successfully.'; - - $lang->msg_new_member = 'Add Member'; - $lang->msg_update_member = 'Modify Member Info'; - $lang->msg_leave_member = 'Leave'; - $lang->msg_group_is_null = 'There is no group'; - $lang->msg_not_delete_default = 'Default items cannot be deleted'; - $lang->msg_not_exists_member = "Invalid member"; - $lang->msg_cannot_delete_admin = 'Admin ID cannot be deleted. Please remove the ID from administration and try again.'; - $lang->msg_exists_user_id = 'This ID already exists. Please try with another one.'; - $lang->msg_exists_email_address = 'This email address already exists. Please try with another one.'; - $lang->msg_exists_nick_name = 'This nickname already exists. Please try with another one.'; - $lang->msg_signup_disabled = 'You are not able to sign up'; - $lang->msg_already_logged = 'You have already signed up'; - $lang->msg_not_logged = 'Please sign in first'; - $lang->msg_insert_group_name = 'Please input the name of group'; - $lang->msg_check_group = 'Please select the group'; - - $lang->msg_not_uploaded_profile_image = 'Profile image could not be registered'; - $lang->msg_not_uploaded_image_name = 'Image name could not be registered'; - $lang->msg_not_uploaded_image_mark = 'Image mark could not be registered'; - $lang->msg_not_uploaded_group_image_mark = 'Group image mark could not be registered'; - - $lang->msg_accept_agreement = 'You have to agree with the agreement'; - - $lang->msg_user_denied = 'You have entered a prohibited ID'; - $lang->msg_user_not_confirmed = 'Your account is not activated yet. Please check your email.'; - $lang->msg_user_limited = 'You have entered an ID that can be used after %s'; - - $lang->about_user_id = 'User ID should be 3~20 letters long and consist of alphabet+number with alphabet as first letter.'; - $lang->about_password = 'Password should be 6~20 letters long'; - $lang->about_user_name = 'Name should be 2~20 letters long'; - $lang->about_nick_name = 'Nickname should be 2~20 letters long'; - $lang->about_email_address = 'Email address will be used to modify/find password after email verification'; - $lang->about_homepage = 'Please input if you have your websites'; - $lang->about_blog_url = 'Please input if you have your blogs'; - $lang->about_birthday = 'Please input your birth date'; - $lang->about_allow_mailing = "If you don't join mailing, you will not able to receive group mail"; - $lang->about_denied = 'Check to prohibit the ID'; - $lang->about_is_admin = 'Check to give Superadmin permission'; - $lang->about_member_description = "Administrator's memo about members"; - $lang->about_group = 'An ID can belong to many groups'; - - $lang->about_column_type = 'Please set the format of additional sign up form'; - $lang->about_column_name = 'Please input English name that can be used in template (name as variable)'; - $lang->about_column_title = 'This will be displayed on sign up or modifying/viewing member info form'; - $lang->about_default_value = 'You can set default values'; - $lang->about_active = 'You have to check on active items to show on sign up form'; - $lang->about_form_description = 'If you input in description form, it will be displayed on join form'; - $lang->about_required = 'If you check, it will be essential item for sign up'; - - $lang->about_enable_openid = 'Please check if you want to provide OpenID service'; - $lang->about_enable_join = 'Please check if you want to allow new members to sign up your site'; - $lang->about_enable_confirm = 'Please check if you want new members to activate their accounts via their emails.'; - $lang->about_enable_ssl = 'Personal information from Sign up/Modify Member Info/Sign in can be sent as SSL(https) mode if server provides SSL service.'; - $lang->about_limit_day = 'You can limit activation date after sign up'; - $lang->about_limit_date = 'Users cannot sign in until assigned date'; - $lang->about_after_login_url = 'You can set URL after login. Blank means current page.'; - $lang->about_after_logout_url = 'You can set URL after logout. Blank means current page.'; - $lang->about_redirect_url = 'Please input URL where users will go after sign up. When this is empty, it will be set as the previous page of sign up page.'; - $lang->about_agreement = "Sign up Agreement will be displayed if it's not empty"; - - $lang->about_image_name = "Members will be able to use image name instead of text"; - $lang->about_image_mark = "Members will be able to use image mark in front of their names"; - $lang->about_group_image_mark = "You may use group marks shown before their names"; - $lang->about_profile_image = 'Members will be able to use profile images'; - $lang->about_accept_agreement = "I have read the agreement and agree with it"; - - $lang->about_member_default = 'It will be set as default group on sign up'; - - $lang->about_openid = 'When you join as OpenID, basic info like ID or email address will be saved on this site, process for password and verification management will be done on current OpenID offering service'; - $lang->about_openid_leave = 'The secession of OpenID means deletion of your member info from this site.
    If you login after secession, it will be recognized as a new member, so you will no longer have the permission for your ex-written articles.'; - - $lang->about_member = "Member module will help you create, modify and remove members and manage groups or sign up form.\nYou can add a custom group to manage members, and also get additional information by modifying sign up form."; - $lang->about_find_member_account = 'Your account info will be noticed by registered email address.
    Please input email address which you have input on registration, and press "Find Account Info" button.
    '; - $lang->about_ssl_port = 'Please input if you are using non-default SSL port'; - $lang->add_openid = 'Add OpenID'; - - $lang->about_resend_auth_mail = 'You can request for activation mail if you have not activated before'; - $lang->no_article = 'There exists no article'; - - $lang->find_account_question = 'Question for a temporary password.'; - $lang->find_account_answer = 'Answer for a temporary password.'; - $lang->about_find_account_question = 'You can get a temporary password by your ID, email address, and the answer for the question you set.'; - $lang->find_account_question_items = array('' - ,'What is your alternate email address?' - ,'What is your favorite thing?' - ,'What elementary school did you graduate?' - ,'Where is your hometown?' - ,'What is your ideal match?' - ,"What is your mother's name?" - ,"What is your father's name?" - ,'What is your favorite color?' - ,'What is your favorite food?' - ); - $lang->temp_password = 'Temporary password'; - $lang->cmd_get_temp_password = 'Get a temporary password'; - $lang->about_get_temp_password = 'Change your password after you logged in.'; - $lang->msg_question_not_exists = 'You haven`t set your question for a temporary password.'; - $lang->msg_answer_not_matches = 'Your answer for the question is not correct.'; - - $lang->change_password_date = 'Password renewal cycle'; - $lang->about_change_password_date = 'If you set a value to this, you will be notified to change your password periodically. (if set to 0, disabled)'; -?> +member = 'Member'; + $lang->member_default_info = 'Basic Info'; + $lang->member_extend_info = 'Additional Info'; + $lang->default_group_1 = "Associate Member"; + $lang->default_group_2 = "Regular Member"; + $lang->admin_group = "Managing Group"; + $lang->keep_signed = 'Keep me signed in'; + $lang->remember_user_id = 'Remember ID'; + $lang->already_logged = "You are already signed in"; + $lang->denied_user_id = 'You have entered a prohibited ID.'; + $lang->null_user_id = 'Please input ID'; + $lang->null_password = 'Please input password'; + $lang->invalid_authorization = 'The account is not activated.'; + $lang->invalid_user_id= "You have entered an invalid ID"; + $lang->invalid_password = 'You have entered an invalid password'; + $lang->invalid_new_password = 'New password must not be the same as old one.'; + $lang->allow_mailing = 'Join Mailing'; + $lang->denied = 'Prohibited'; + $lang->is_admin = 'Superadmin Permission'; + $lang->group = 'Group'; + $lang->group_title = 'Group Name'; + $lang->group_srl = 'Group Number'; + $lang->signature = 'Signature'; + $lang->profile_image = 'Profile Image'; + $lang->profile_image_max_width = 'Max Width'; + $lang->profile_image_max_height = 'Max Height'; + $lang->image_name = 'Image Name'; + $lang->image_name_max_width = 'Max Width'; + $lang->image_name_max_height = 'Max Height'; + $lang->image_mark = 'Image Mark'; + $lang->image_mark_max_width = 'Max Width'; + $lang->image_mark_max_height = 'Max Height'; + $lang->group_image_mark = 'Group Image Mark'; + $lang->group_image_mark_max_width = 'Max Width'; + $lang->group_image_mark_max_height = 'Max Height'; + $lang->group_image_mark_order = 'Group Image Mark Order'; + $lang->signature_max_height = 'Max Signature Height'; + $lang->enable_openid = 'Enable OpenID'; + $lang->enable_join = 'Accept New Members'; + $lang->enable_confirm = 'Email Activation'; + $lang->enable_ssl = 'Enable SSL'; + $lang->security_sign_in = 'Sign in using enhanced security'; + $lang->limit_day = 'Temporary Limit Date'; + $lang->limit_date = 'Limit Date'; + $lang->after_login_url = 'URL after Sign in'; + $lang->after_logout_url = 'URL after Sign out'; + $lang->redirect_url = 'URL after Sign up'; + $lang->agreement = 'Sign up Agreement'; + $lang->accept_agreement = 'Agree'; + $lang->member_info = 'Member Info'; + $lang->current_password = 'Current Password'; + $lang->openid = 'OpenID'; + $lang->allow_message = 'Allow Messages'; + $lang->allow_message_type = array( + 'Y' => 'Allow All', + 'F' => 'Allow for Friends', + 'N' => 'Reject All', + ); + $lang->about_allow_message = 'You may allow or reject messages.'; + $lang->logged_users = 'Logged on Users'; + + $lang->webmaster_name = "Webmaster Name"; + $lang->webmaster_email = "Webmaster Email"; + + $lang->about_keep_signed = 'You will be still signed in even when the browser is closed.\n\nIt is not recommended to use this if you are using a public computer for your personal information could be violated'; + $lang->about_keep_warning = 'You will be still signed in even when the browser is closed. It is not recommended to use this if you are using a public computer for your personal information could be violated'; + $lang->about_webmaster_name = "Please input webmaster's name which will be used for verification mails or other site administration. (default : webmaster)"; + $lang->about_webmaster_email = "Please input webmaster's email address."; + + $lang->search_target_list = array( + 'user_id' => 'ID', + 'user_name' => 'Name', + 'nick_name' => 'Nickname', + 'email_address' => 'Email Address', + 'regdate' => 'Sign up Date', + 'regdate_more' => 'Sign up Date (more)', + 'regdate_less' => 'Sign up Date (less)', + 'last_login' => 'Last Sign in Date', + 'last_login_more' => 'Last Sign in Date (more)', + 'last_login_less' => 'Last Sign in Date (less)', + 'extra_vars' => 'Extra Vars', + ); + + $lang->cmd_login = 'Sign In'; + $lang->cmd_logout = 'Sign Out'; + $lang->cmd_signup = 'Sign Up'; + $lang->cmd_site_signup = 'Sign Up'; + $lang->cmd_modify_member_info = 'Modify Member Info'; + $lang->cmd_modify_member_password = 'Modify Password'; + $lang->cmd_view_member_info = 'Member Info'; + $lang->cmd_leave = 'Leave'; + $lang->cmd_find_member_account = 'Find Account Info'; + $lang->cmd_resend_auth_mail = 'Request for Activation Mail'; + + $lang->cmd_member_list = 'Member List'; + $lang->cmd_module_config = 'Default Setting'; + $lang->cmd_member_group = 'Member Groups'; + $lang->cmd_send_mail = 'Send Mail'; + $lang->cmd_manage_id = 'Prohibited IDs'; + $lang->cmd_manage_form = 'Sign up Form'; + $lang->cmd_view_own_document = 'Written Articles'; + $lang->cmd_manage_member_info = 'Manage Member Info'; + $lang->cmd_trace_document = 'Trace Written Articles'; + $lang->cmd_trace_comment = 'Trace Written Comments'; + $lang->cmd_view_scrapped_document = 'Scraps'; + $lang->cmd_view_saved_document = 'Saved Articles'; + $lang->cmd_send_email = 'Send Mail'; + + $lang->msg_email_not_exists = "You have entered an invalid email address"; + + $lang->msg_alreay_scrapped = 'This article is already scrapped'; + + $lang->msg_cart_is_null = 'Please select the target'; + $lang->msg_checked_file_is_deleted = '%d attached file(s) is(are) deleted'; + + $lang->msg_find_account_title = 'Account Info'; + $lang->msg_find_account_info = 'This is requested account info.'; + $lang->msg_find_account_comment = 'The password will be modified as above one as you click below link.
    Please modify the password after login.'; + $lang->msg_confirm_account_title = 'Zeroboard XE Account Activation'; + $lang->msg_confirm_account_info = 'This is your account information:'; + $lang->msg_confirm_account_comment = 'Click on the followed link to complete your account activation.'; + $lang->msg_auth_mail_sent = 'The activation mail has been sent to %s. Please check your mail.'; + $lang->msg_confirm_mail_sent = 'We just sent the activation email to %s. Please check your mail.'; + $lang->msg_invalid_auth_key = 'This is an invalid request of verification.
    Please retry finding account info or contact to administrator.'; + $lang->msg_success_authed = 'Your account has been successfully activated and logged on.\n Please modify the password to your own one with the password in the mail.'; + $lang->msg_success_confirmed = 'Your account has been activated successfully.'; + + $lang->msg_new_member = 'Add Member'; + $lang->msg_update_member = 'Modify Member Info'; + $lang->msg_leave_member = 'Leave'; + $lang->msg_group_is_null = 'There is no group'; + $lang->msg_not_delete_default = 'Default items cannot be deleted'; + $lang->msg_not_exists_member = "Invalid member"; + $lang->msg_cannot_delete_admin = 'Admin ID cannot be deleted. Please remove the ID from administration and try again.'; + $lang->msg_exists_user_id = 'This ID already exists. Please try with another one.'; + $lang->msg_exists_email_address = 'This email address already exists. Please try with another one.'; + $lang->msg_exists_nick_name = 'This nickname already exists. Please try with another one.'; + $lang->msg_signup_disabled = 'You are not able to sign up'; + $lang->msg_already_logged = 'You have already signed up'; + $lang->msg_not_logged = 'Please sign in first'; + $lang->msg_insert_group_name = 'Please input the name of group'; + $lang->msg_check_group = 'Please select the group'; + + $lang->msg_not_uploaded_profile_image = 'Profile image could not be registered'; + $lang->msg_not_uploaded_image_name = 'Image name could not be registered'; + $lang->msg_not_uploaded_image_mark = 'Image mark could not be registered'; + $lang->msg_not_uploaded_group_image_mark = 'Group image mark could not be registered'; + + $lang->msg_accept_agreement = 'You have to agree with the agreement'; + + $lang->msg_user_denied = 'You have entered a prohibited ID'; + $lang->msg_user_not_confirmed = 'Your account is not activated yet. Please check your email.'; + $lang->msg_user_limited = 'You have entered an ID that can be used after %s'; + + $lang->about_user_id = 'User ID should be 3~20 letters long and consist of alphabet+number with alphabet as first letter.'; + $lang->about_password = 'Password should be 6~20 letters long'; + $lang->about_user_name = 'Name should be 2~20 letters long'; + $lang->about_nick_name = 'Nickname should be 2~20 letters long'; + $lang->about_email_address = 'Email address will be used to modify/find password after email verification'; + $lang->about_homepage = 'Please input if you have your websites'; + $lang->about_blog_url = 'Please input if you have your blogs'; + $lang->about_birthday = 'Please input your birth date'; + $lang->about_allow_mailing = "If you don't join mailing, you will not able to receive group mail"; + $lang->about_denied = 'Check to prohibit the ID'; + $lang->about_is_admin = 'Check to give Superadmin permission'; + $lang->about_member_description = "Administrator's memo about members"; + $lang->about_group = 'An ID can belong to many groups'; + + $lang->about_column_type = 'Please set the format of additional sign up form'; + $lang->about_column_name = 'Please input English name that can be used in template (name as variable)'; + $lang->about_column_title = 'This will be displayed on sign up or modifying/viewing member info form'; + $lang->about_default_value = 'You can set default values'; + $lang->about_active = 'You have to check on active items to show on sign up form'; + $lang->about_form_description = 'If you input in description form, it will be displayed on join form'; + $lang->about_required = 'If you check, it will be essential item for sign up'; + + $lang->about_enable_openid = 'Please check if you want to provide OpenID service'; + $lang->about_enable_join = 'Please check if you want to allow new members to sign up your site'; + $lang->about_enable_confirm = 'Please check if you want new members to activate their accounts via their emails.'; + $lang->about_enable_ssl = 'Personal information from Sign up/Modify Member Info/Sign in can be sent as SSL(https) mode if server provides SSL service.'; + $lang->about_limit_day = 'You can limit activation date after sign up'; + $lang->about_limit_date = 'Users cannot sign in until assigned date'; + $lang->about_after_login_url = 'You can set URL after login. Blank means current page.'; + $lang->about_after_logout_url = 'You can set URL after logout. Blank means current page.'; + $lang->about_redirect_url = 'Please input URL where users will go after sign up. When this is empty, it will be set as the previous page of sign up page.'; + $lang->about_agreement = "Sign up Agreement will be displayed if it's not empty"; + + $lang->about_image_name = "Members will be able to use image name instead of text"; + $lang->about_image_mark = "Members will be able to use image mark in front of their names"; + $lang->about_group_image_mark = "You may use group marks shown before their names"; + $lang->about_profile_image = 'Members will be able to use profile images'; + $lang->about_accept_agreement = "I have read the agreement and agree with it"; + + $lang->about_member_default = 'It will be set as default group on sign up'; + + $lang->about_openid = 'When you join as OpenID, basic info like ID or email address will be saved on this site, process for password and verification management will be done on current OpenID offering service'; + $lang->about_openid_leave = 'The secession of OpenID means deletion of your member info from this site.
    If you login after secession, it will be recognized as a new member, so you will no longer have the permission for your ex-written articles.'; + + $lang->about_member = "Member module will help you create, modify and remove members and manage groups or sign up form.\nYou can add a custom group to manage members, and also get additional information by modifying sign up form."; + $lang->about_find_member_account = 'Your account info will be noticed by registered email address.
    Please input email address which you have input on registration, and press "Find Account Info" button.
    '; + $lang->about_ssl_port = 'Please input if you are using non-default SSL port'; + $lang->add_openid = 'Add OpenID'; + + $lang->about_resend_auth_mail = 'You can request for activation mail if you have not activated before'; + $lang->no_article = 'There exists no article'; + + $lang->find_account_question = 'Question for a temporary password.'; + $lang->find_account_answer = 'Answer for a temporary password.'; + $lang->about_find_account_question = 'You can get a temporary password by your ID, email address, and the answer for the question you set.'; + $lang->find_account_question_items = array('' + ,'What is your alternate email address?' + ,'What is your favorite thing?' + ,'What elementary school did you graduate?' + ,'Where is your hometown?' + ,'What is your ideal match?' + ,"What is your mother's name?" + ,"What is your father's name?" + ,'What is your favorite color?' + ,'What is your favorite food?' + ); + $lang->temp_password = 'Temporary password'; + $lang->cmd_get_temp_password = 'Get a temporary password'; + $lang->about_get_temp_password = 'Change your password after you logged in.'; + $lang->msg_question_not_exists = 'You haven`t set your question for a temporary password.'; + $lang->msg_answer_not_matches = 'Your answer for the question is not correct.'; + + $lang->change_password_date = 'Password renewal cycle'; + $lang->about_change_password_date = 'If you set a value to this, you will be notified to change your password periodically. (if set to 0, disabled)'; +?> diff --git a/modules/member/lang/es.lang.php b/modules/member/lang/es.lang.php index 81c2e7b77..d9a685d30 100644 --- a/modules/member/lang/es.lang.php +++ b/modules/member/lang/es.lang.php @@ -1,237 +1,237 @@ -member = 'Usuario'; - $lang->member_default_info = 'Información Basica'; - $lang->member_extend_info = 'Información adicional'; - $lang->default_group_1 = "Usuario registrado"; - $lang->default_group_2 = "Usuario regular"; - $lang->admin_group = "Manejo del grupo"; - $lang->keep_signed = 'Keep me signed in'; - $lang->remember_user_id = 'Guardar ID'; - $lang->already_logged = "Ya está conectado"; - $lang->denied_user_id = 'Este ID está prohibido.'; - $lang->null_user_id = 'IngresarID'; - $lang->null_password = 'Ingresar la contraseña'; - $lang->invalid_authorization = 'No está certificado'; - $lang->invalid_user_id= "Este ID no existe"; - $lang->invalid_password = 'Contraseña incorrecta'; - $lang->invalid_new_password = '이전 비밀번호와 같습니다.'; - $lang->allow_mailing = 'Registro del envío de mail'; - $lang->denied = 'Prohibido'; - $lang->is_admin = 'Atribución del administrador superior'; - $lang->group = 'Grupo asignado'; - $lang->group_title = 'Nombre del grupo'; - $lang->group_srl = 'Número del grupo'; - $lang->signature = 'Firma'; - $lang->profile_image = 'Perfil de Imagen'; - $lang->profile_image_max_width = 'Max Anchura'; - $lang->profile_image_max_height = 'Max Altura'; - $lang->image_name = 'Nombre de la imagen'; - $lang->image_name_max_width = 'Ancho Máximo'; - $lang->image_name_max_height = 'Altura Máxima'; - $lang->image_mark = 'Marca de la imagen'; - $lang->image_mark_max_width = 'Ancho Máximo'; - $lang->image_mark_max_height = 'Altura Máxima'; - $lang->group_image_mark = 'Group Image Mark'; - $lang->group_image_mark_max_width = 'Ancho Máximo'; - $lang->group_image_mark_max_height = 'Altura Máxima'; - $lang->group_image_mark_order = '그룹 이미지 마크 순서'; - $lang->enable_openid = 'Activar OpenID'; - $lang->enable_join = 'Permitir el registro del usuario'; - $lang->enable_confirm = '메일 인증 사용'; - $lang->enable_ssl = 'Activar SSL'; - $lang->security_sign_in = 'Sign in using enhanced security'; - $lang->limit_day = 'Límite de la fecha temporal'; - $lang->limit_date = 'Límite de fecha'; - $lang->after_login_url = 'URL después del inicio de sesión'; - $lang->after_logout_url = 'URL después de cerrar sesión'; - $lang->redirect_url = 'URL luego del registro'; - $lang->agreement = 'Acuerdo del registro del usuario'; - $lang->accept_agreement = 'Acepto'; - $lang->member_info = 'Información del Usuario'; - $lang->current_password = 'Contraseña actual'; - $lang->openid = 'OpenID'; - $lang->allow_message = '쪽지 허용'; - $lang->allow_message_type = array( - 'Y' => '모두 허용', - 'F' => '등록된 친구들만 허용', - 'N' => '모두 금지', - ); - $lang->about_allow_message = '쪽지 허용 방법 및 대상을 지정할 수 있습니다'; - $lang->logged_users = 'Logged Users'; - - $lang->webmaster_name = 'Nombre del Webmaster'; - $lang->webmaster_email = 'Correo electrónico Webmaster'; - - $lang->about_keep_signed = '브라우저를 닫더라도 로그인이 계속 유지될 수 있습니다.\n\n로그인 유지 기능을 사용할 경우 다음 접속부터는 로그인을 하실 필요가 없습니다.\n\n단, 게임방, 학교 등 공공장소에서 이용시 개인정보가 유출될 수 있으니 꼭 로그아웃을 해주세요'; - $lang->about_keep_warning = '브라우저를 닫더라도 로그인이 계속 유지될 수 있습니다. 로그인 유지 기능을 사용할 경우 다음 접속부터는 로그인을 하실 필요가 없습니다. 단, 게임방, 학교 등 공공장소에서 이용 시 개인정보가 유출될 수 있으니 꼭 로그아웃을 해주세요.'; - $lang->about_webmaster_name = 'Por favor, webmaster de entrada el nombre que se utilizará para la autenticación de los correos u otros sitio de la administración. (Por defecto: webmaster)'; - $lang->about_webmaster_email = 'Introduzca la dirección de correo electrónico webmaster.'; - - $lang->search_target_list = array( - 'user_id' => 'ID', - 'user_name' => 'Nombre', - 'nick_name' => 'Apodo', - 'email_address' => 'Dirección de Email', - 'regdate' => 'Fecha del registro', - 'regdate_more' => '가입일시(이상)', - 'regdate_less' => '가입일시(이하)', - 'last_login' => 'Fecha de su última conección', - 'last_login_more' => '최근로그인일시(이상)', - 'last_login_less' => '최근로그인일시(이하)', - 'extra_vars' => 'Variables Extra', - ); - - - $lang->cmd_login = 'Conectar'; - $lang->cmd_logout = 'Desconectar'; - $lang->cmd_signup = 'Registrar'; - $lang->cmd_site_signup = 'Join'; - $lang->cmd_modify_member_info = 'Modificar nombre del usuario'; - $lang->cmd_modify_member_password = 'Cambiar la contraseña'; - $lang->cmd_view_member_info = 'Información del usuario'; - $lang->cmd_leave = 'Dejar de ser usuario'; - $lang->cmd_find_member_account = 'Find Account Info'; - - $lang->cmd_member_list = 'Lista de los Usuarios'; - $lang->cmd_module_config = 'Configuración predefinidos'; - $lang->cmd_member_group = 'Manejo del grupo'; - $lang->cmd_send_mail = 'Enviar Email'; - $lang->cmd_manage_id = 'Manejo de ID prohibidos'; - $lang->cmd_manage_form = 'Manejo de forma del registro'; - $lang->cmd_view_own_document = 'Ver documentos escritos'; - $lang->cmd_manage_member_info = 'Manage Member Info'; - $lang->cmd_trace_document = 'Trace Written Articles'; - $lang->cmd_trace_comment = 'Trace Written Comments'; - $lang->cmd_view_scrapped_document = 'Ver Scraps'; - $lang->cmd_view_saved_document = 'Ver artículos guardados'; - $lang->cmd_send_email = 'Enviar Email'; - - $lang->msg_email_not_exists = "Email address doesn't exists"; - - $lang->msg_alreay_scrapped = 'Este documento ya esta hecho scrap'; - - $lang->msg_cart_is_null = 'Seleciona el objetivo'; - $lang->msg_checked_file_is_deleted = '%d archivos adjuntos son eliminados'; - - $lang->msg_find_account_title = 'Account Info'; - $lang->msg_find_account_info = 'Esto se solicita la información de la cuenta'; - $lang->msg_find_account_comment = 'La contraseña se modificará para arriba al hacer clic en un enlace a continuación.
    Por favor, después de modificar la contraseña de acceso.'; - $lang->msg_confirm_account_title = '가입 인증 메일 입니다'; - $lang->msg_confirm_account_info = '가입하신 계정 정보는 아래와 같습니다'; - $lang->msg_confirm_account_comment = '아래 링크를 클릭하시면 가입 인증이 이루어집니다.'; - $lang->msg_auth_mail_sent = 'La autenticación de correo ha sido enviado a% s. Por favor, compruebe su correo.'; - $lang->msg_confirm_mail_sent = '%s 메일로 가입 인증 메일이 발송되었습니다. 메일을 확인하세요.'; - $lang->msg_invalid_auth_key = '잘못된 계정 인증 요청입니다.
    아이디/비밀번호 찾기를 다시 하시거나 사이트 관리자에게 계정 정보를 문의해주세요'; - $lang->msg_success_authed = 'Esto no es válido solicitud de autenticación.
    Por favor, inténtelo encontrar información de la cuenta o póngase en contacto con el administrador.'; - $lang->msg_success_confirmed = '가입 인증이 정상적으로 처리 되었습니다.'; - - $lang->msg_new_member = 'Agregar usuario'; - $lang->msg_update_member = 'Modificar información del usuario'; - $lang->msg_leave_member = 'Dejar de ser usuario'; - $lang->msg_group_is_null = 'No es un grupo registrado'; - $lang->msg_not_delete_default = 'Los artículos predefinidos no pueden ser eliminados'; - $lang->msg_not_exists_member = "Este usuario no existe"; - $lang->msg_cannot_delete_admin = 'ID del Administrador no puede ser eliminado. Remover el ID desde la Administración y trate nuevamente.'; - $lang->msg_exists_user_id = 'Este ID ya existe. Por favor trate con otro ID'; - $lang->msg_exists_email_address = 'Esta dirección del email ya existe. Por favor trate con otra dirección del email.'; - $lang->msg_exists_nick_name = 'Este apodo ya existe. Por favor trate con otro apodo.'; - $lang->msg_signup_disabled = 'Usted no puede ser registrado'; - $lang->msg_already_logged = 'Usted ya ha sido registrado'; - $lang->msg_not_logged = 'Por favor conectese primero'; - $lang->msg_insert_group_name = 'Por favor ingresar el nombre del grupo'; - $lang->msg_check_group = 'Introduce nombre de grupo'; - - $lang->msg_not_uploaded_image_name = 'Imagen del nombre no puede ser registrado'; - $lang->msg_not_uploaded_image_mark = 'Imagen de marca no puede ser resistrado'; - $lang->msg_not_uploaded_group_image_mark = '그룹 이미지 마크를 등록할 수가 없습니다'; - - $lang->msg_accept_agreement = 'Usted primero debe aceptar el acuerdo'; - - $lang->msg_user_denied = 'ID ingresado ha sido prohibido para su uso'; - $lang->msg_user_not_confirmed = '아직 메일 인증이 이루어지지 않았습니다. 메일을 확인해 주세요'; - $lang->msg_user_limited = 'ID ingresado puede ser usado luego de %s'; - - $lang->about_user_id = 'ID del usuario debe ser entre 3-20 letras que consiste en alfabetos+número con alfabeto como primera letra.'; - $lang->about_password = 'Contraseña debe ser entre 6-20 letras'; - $lang->about_user_name = 'Nombre debe ser entre 2-20 letras'; - $lang->about_nick_name = 'Apodo debe ser entre 2-20 letras'; - $lang->about_email_address = 'Dirección de email es usado para modificar/encontrar contraseña luego de la certificación de email'; - $lang->about_homepage = 'Ingresar su sitio web, si es que lo tiene'; - $lang->about_blog_url = 'Ingresar su blog, si es que lo tiene'; - $lang->about_birthday = 'Ingresar su fecha de nacimiento'; - $lang->about_allow_mailing = "Si usted no se ha registrado el envío de email, usted no podrá recibir el email del grupo"; - $lang->about_denied = 'Si selecciona esta opción prohibirá el uso del ID'; - $lang->about_is_admin = 'Si selecciona esta opción para obtener la atribución del administrador superior'; - $lang->about_member_description = "Nota del administrador acerca de los usuarios"; - $lang->about_group = 'Un ID puede pertenecer a muchos grupos'; - - $lang->about_column_type = 'Definir el estilo de la forma de registro que desea agregar'; - $lang->about_column_name = 'Ingresar el nombre en español para poder usar en plantilla (nombre como variable)'; - $lang->about_column_title = 'Esto sera mostrado cuando el usuario registra o modifica/visualiza la información del usuario'; - $lang->about_default_value = 'Usted puede predefinir los valores'; - $lang->about_active = 'Si selecciona "Activar" los artículos seran mostrados en el momento de registrar'; - $lang->about_form_description = 'Si Usted ingresa la forma de la descripción, será mostrado en el momento de registrar'; - $lang->about_required = 'Si selecciona esta opción, será artículo esencial para el registro'; - - $lang->about_enable_openid = 'Selecciona esta opción si activado OpenID'; - $lang->about_enable_join = 'Debe seleccionar esta opción para permitir el registro de los usuarios'; - $lang->about_enable_confirm = '입력된 메일 주소로 인증 메일을 보내 회원 가입을 확인 합니다'; - $lang->about_enable_ssl = '서버에서 SSL지원이 될 경우 회원가입/정보수정/로그인등의 개인정보가 서버로 보내질때 SSL(https)를 이용하도록 할 수 있습니다'; - $lang->about_limit_day = 'Usted puede limitar la fecha de la certificación luego de registrar'; - $lang->about_limit_date = 'Usuario no podra conectarse hasta la fecha indicada'; - $lang->about_after_login_url = '로그인 후 이동할 URL을 정하실 수 있습니다. 비어 있으면 해당 페이지가 유지됩니다.'; - $lang->about_after_logout_url = '로그아웃 후 이동할 URL을 정하실 수 있습니다. 비어 있으면 해당 페이지가 유지됩니다.'; - $lang->about_redirect_url = 'Ingresar la URL que va a abrir luego de registrar los usuarios. Cuando esto esta vacío, se habrirá la página anterior a la del registro.'; - $lang->about_agreement = "Acuerdo del registro no será mostrado si esta vacío"; - - $lang->about_image_name = "Permitir a los usuarios el uso de imagen del nombre en ves del nombre del usuario"; - $lang->about_image_mark = "Permitir a los usuarios el uso de imagen de marca delante de sus nombres"; - $lang->about_group_image_mark = '사용자의 이름앞에 그룹 마크를 달 수 있습니다'; - $lang->about_profile_image = 'Permitir a los usuarios a utilizar nombre de la imagen en lugar de texto nombre'; - $lang->about_accept_agreement = "Yo he leído todo el acuerdo y acepto"; - - $lang->about_member_default = 'Al registrar se configura como grupo predefinido'; - - $lang->about_openid = 'Cuando tu registra como OpenID, la información básica como ID o la dirección del email sera guardado en este sitio, pero la contraseña y la resolución de la certificación se hará en el servicio ofrecido por openID'; - $lang->about_openid_leave = 'La secesión de OpenID medios eliminación de su información de miembros de este sitio.
    Si se registra después de la secesión, se le reconocerá como un nuevo miembro, de modo que ya no tienen el permiso para que su ex-escrito artículos.'; - - $lang->about_member = "Esto es un módulo para crear/modificar/eliminar usuarios y manejar grupos o el formato del registro.\n Usted puede manejar usuarios creando nuevos grupos, y obtener información adicional manejando el formato del registro"; - $lang->about_find_member_account = 'Su información de la cuenta será observado por dirección de correo electrónico registrada.
    Introduce la dirección de correo electrónico que usted tiene de entrada en el registro, y pulse "Buscar" Información de la cuenta ".
    '; - $lang->about_ssl_port = 'Please input if you are using different SSL port with default one'; - $lang->add_openid = 'Add OpenID'; - - $lang->about_resend_auth_mail = 'You can request for authentication mail if you have failed before.'; - $lang->no_article = 'There exists no article'; - - $lang->find_account_question = '비밀번호 찾기 질문/답변'; - $lang->find_account_answer = '비밀번호 찾기 답변'; - $lang->about_find_account_question = '가입시 아이디와 이메일, 질문/답변으로 임시 비밀번호를 발급 받을 수 있습니다.'; - /* - $lang->find_account_question_items = array('' - ,'다른 이메일 주소는?' - ,'나의 보물 1호는?' - ,'나의 출신 초등학교는?' - ,'나의 출신 고향은?' - ,'나의 이상형은?' - ,'어머니 성함은?' - ,'아버지 성함은?' - ,'가장 좋아하는 색깔은?' - ,'가장 좋아하는 음식은?' - ); -*/ - $lang->temp_password = '임시 비밀번호'; - $lang->cmd_get_temp_password = '임시 비밀번호 발급'; - $lang->about_get_temp_password = '로그인 후 비밀번호 변경해 주세요.'; - $lang->msg_question_not_exists = '등록한 비밀번호 찾기 질문/답변이 없습니다.'; - $lang->msg_answer_not_matches = '비밀번호 찾기 질문/답변 또는 정보가 올바르지 않습니다.'; - - $lang->change_password_date = '비밀번호 갱신주기'; - $lang->about_change_password_date = '일정기간이 지나면 비밀번호 변경을 하도록 유도하는 기능입니다. (사용하지 않음 : 0 입력) '; - -?> +member = 'Usuario'; + $lang->member_default_info = 'Información Basica'; + $lang->member_extend_info = 'Información adicional'; + $lang->default_group_1 = "Usuario registrado"; + $lang->default_group_2 = "Usuario regular"; + $lang->admin_group = "Manejo del grupo"; + $lang->keep_signed = 'Keep me signed in'; + $lang->remember_user_id = 'Guardar ID'; + $lang->already_logged = "Ya está conectado"; + $lang->denied_user_id = 'Este ID está prohibido.'; + $lang->null_user_id = 'IngresarID'; + $lang->null_password = 'Ingresar la contraseña'; + $lang->invalid_authorization = 'No está certificado'; + $lang->invalid_user_id= "Este ID no existe"; + $lang->invalid_password = 'Contraseña incorrecta'; + $lang->invalid_new_password = '이전 비밀번호와 같습니다.'; + $lang->allow_mailing = 'Registro del envío de mail'; + $lang->denied = 'Prohibido'; + $lang->is_admin = 'Atribución del administrador superior'; + $lang->group = 'Grupo asignado'; + $lang->group_title = 'Nombre del grupo'; + $lang->group_srl = 'Número del grupo'; + $lang->signature = 'Firma'; + $lang->profile_image = 'Perfil de Imagen'; + $lang->profile_image_max_width = 'Max Anchura'; + $lang->profile_image_max_height = 'Max Altura'; + $lang->image_name = 'Nombre de la imagen'; + $lang->image_name_max_width = 'Ancho Máximo'; + $lang->image_name_max_height = 'Altura Máxima'; + $lang->image_mark = 'Marca de la imagen'; + $lang->image_mark_max_width = 'Ancho Máximo'; + $lang->image_mark_max_height = 'Altura Máxima'; + $lang->group_image_mark = 'Group Image Mark'; + $lang->group_image_mark_max_width = 'Ancho Máximo'; + $lang->group_image_mark_max_height = 'Altura Máxima'; + $lang->group_image_mark_order = '그룹 이미지 마크 순서'; + $lang->enable_openid = 'Activar OpenID'; + $lang->enable_join = 'Permitir el registro del usuario'; + $lang->enable_confirm = '메일 인증 사용'; + $lang->enable_ssl = 'Activar SSL'; + $lang->security_sign_in = 'Sign in using enhanced security'; + $lang->limit_day = 'Límite de la fecha temporal'; + $lang->limit_date = 'Límite de fecha'; + $lang->after_login_url = 'URL después del inicio de sesión'; + $lang->after_logout_url = 'URL después de cerrar sesión'; + $lang->redirect_url = 'URL luego del registro'; + $lang->agreement = 'Acuerdo del registro del usuario'; + $lang->accept_agreement = 'Acepto'; + $lang->member_info = 'Información del Usuario'; + $lang->current_password = 'Contraseña actual'; + $lang->openid = 'OpenID'; + $lang->allow_message = '쪽지 허용'; + $lang->allow_message_type = array( + 'Y' => '모두 허용', + 'F' => '등록된 친구들만 허용', + 'N' => '모두 금지', + ); + $lang->about_allow_message = '쪽지 허용 방법 및 대상을 지정할 수 있습니다'; + $lang->logged_users = 'Logged Users'; + + $lang->webmaster_name = 'Nombre del Webmaster'; + $lang->webmaster_email = 'Correo electrónico Webmaster'; + + $lang->about_keep_signed = '브라우저를 닫더라도 로그인이 계속 유지될 수 있습니다.\n\n로그인 유지 기능을 사용할 경우 다음 접속부터는 로그인을 하실 필요가 없습니다.\n\n단, 게임방, 학교 등 공공장소에서 이용시 개인정보가 유출될 수 있으니 꼭 로그아웃을 해주세요'; + $lang->about_keep_warning = '브라우저를 닫더라도 로그인이 계속 유지될 수 있습니다. 로그인 유지 기능을 사용할 경우 다음 접속부터는 로그인을 하실 필요가 없습니다. 단, 게임방, 학교 등 공공장소에서 이용 시 개인정보가 유출될 수 있으니 꼭 로그아웃을 해주세요.'; + $lang->about_webmaster_name = 'Por favor, webmaster de entrada el nombre que se utilizará para la autenticación de los correos u otros sitio de la administración. (Por defecto: webmaster)'; + $lang->about_webmaster_email = 'Introduzca la dirección de correo electrónico webmaster.'; + + $lang->search_target_list = array( + 'user_id' => 'ID', + 'user_name' => 'Nombre', + 'nick_name' => 'Apodo', + 'email_address' => 'Dirección de Email', + 'regdate' => 'Fecha del registro', + 'regdate_more' => '가입일시(이상)', + 'regdate_less' => '가입일시(이하)', + 'last_login' => 'Fecha de su última conección', + 'last_login_more' => '최근로그인일시(이상)', + 'last_login_less' => '최근로그인일시(이하)', + 'extra_vars' => 'Variables Extra', + ); + + + $lang->cmd_login = 'Conectar'; + $lang->cmd_logout = 'Desconectar'; + $lang->cmd_signup = 'Registrar'; + $lang->cmd_site_signup = 'Join'; + $lang->cmd_modify_member_info = 'Modificar nombre del usuario'; + $lang->cmd_modify_member_password = 'Cambiar la contraseña'; + $lang->cmd_view_member_info = 'Información del usuario'; + $lang->cmd_leave = 'Dejar de ser usuario'; + $lang->cmd_find_member_account = 'Find Account Info'; + + $lang->cmd_member_list = 'Lista de los Usuarios'; + $lang->cmd_module_config = 'Configuración predefinidos'; + $lang->cmd_member_group = 'Manejo del grupo'; + $lang->cmd_send_mail = 'Enviar Email'; + $lang->cmd_manage_id = 'Manejo de ID prohibidos'; + $lang->cmd_manage_form = 'Manejo de forma del registro'; + $lang->cmd_view_own_document = 'Ver documentos escritos'; + $lang->cmd_manage_member_info = 'Manage Member Info'; + $lang->cmd_trace_document = 'Trace Written Articles'; + $lang->cmd_trace_comment = 'Trace Written Comments'; + $lang->cmd_view_scrapped_document = 'Ver Scraps'; + $lang->cmd_view_saved_document = 'Ver artículos guardados'; + $lang->cmd_send_email = 'Enviar Email'; + + $lang->msg_email_not_exists = "Email address doesn't exists"; + + $lang->msg_alreay_scrapped = 'Este documento ya esta hecho scrap'; + + $lang->msg_cart_is_null = 'Seleciona el objetivo'; + $lang->msg_checked_file_is_deleted = '%d archivos adjuntos son eliminados'; + + $lang->msg_find_account_title = 'Account Info'; + $lang->msg_find_account_info = 'Esto se solicita la información de la cuenta'; + $lang->msg_find_account_comment = 'La contraseña se modificará para arriba al hacer clic en un enlace a continuación.
    Por favor, después de modificar la contraseña de acceso.'; + $lang->msg_confirm_account_title = '가입 인증 메일 입니다'; + $lang->msg_confirm_account_info = '가입하신 계정 정보는 아래와 같습니다'; + $lang->msg_confirm_account_comment = '아래 링크를 클릭하시면 가입 인증이 이루어집니다.'; + $lang->msg_auth_mail_sent = 'La autenticación de correo ha sido enviado a% s. Por favor, compruebe su correo.'; + $lang->msg_confirm_mail_sent = '%s 메일로 가입 인증 메일이 발송되었습니다. 메일을 확인하세요.'; + $lang->msg_invalid_auth_key = '잘못된 계정 인증 요청입니다.
    아이디/비밀번호 찾기를 다시 하시거나 사이트 관리자에게 계정 정보를 문의해주세요'; + $lang->msg_success_authed = 'Esto no es válido solicitud de autenticación.
    Por favor, inténtelo encontrar información de la cuenta o póngase en contacto con el administrador.'; + $lang->msg_success_confirmed = '가입 인증이 정상적으로 처리 되었습니다.'; + + $lang->msg_new_member = 'Agregar usuario'; + $lang->msg_update_member = 'Modificar información del usuario'; + $lang->msg_leave_member = 'Dejar de ser usuario'; + $lang->msg_group_is_null = 'No es un grupo registrado'; + $lang->msg_not_delete_default = 'Los artículos predefinidos no pueden ser eliminados'; + $lang->msg_not_exists_member = "Este usuario no existe"; + $lang->msg_cannot_delete_admin = 'ID del Administrador no puede ser eliminado. Remover el ID desde la Administración y trate nuevamente.'; + $lang->msg_exists_user_id = 'Este ID ya existe. Por favor trate con otro ID'; + $lang->msg_exists_email_address = 'Esta dirección del email ya existe. Por favor trate con otra dirección del email.'; + $lang->msg_exists_nick_name = 'Este apodo ya existe. Por favor trate con otro apodo.'; + $lang->msg_signup_disabled = 'Usted no puede ser registrado'; + $lang->msg_already_logged = 'Usted ya ha sido registrado'; + $lang->msg_not_logged = 'Por favor conectese primero'; + $lang->msg_insert_group_name = 'Por favor ingresar el nombre del grupo'; + $lang->msg_check_group = 'Introduce nombre de grupo'; + + $lang->msg_not_uploaded_image_name = 'Imagen del nombre no puede ser registrado'; + $lang->msg_not_uploaded_image_mark = 'Imagen de marca no puede ser resistrado'; + $lang->msg_not_uploaded_group_image_mark = '그룹 이미지 마크를 등록할 수가 없습니다'; + + $lang->msg_accept_agreement = 'Usted primero debe aceptar el acuerdo'; + + $lang->msg_user_denied = 'ID ingresado ha sido prohibido para su uso'; + $lang->msg_user_not_confirmed = '아직 메일 인증이 이루어지지 않았습니다. 메일을 확인해 주세요'; + $lang->msg_user_limited = 'ID ingresado puede ser usado luego de %s'; + + $lang->about_user_id = 'ID del usuario debe ser entre 3-20 letras que consiste en alfabetos+número con alfabeto como primera letra.'; + $lang->about_password = 'Contraseña debe ser entre 6-20 letras'; + $lang->about_user_name = 'Nombre debe ser entre 2-20 letras'; + $lang->about_nick_name = 'Apodo debe ser entre 2-20 letras'; + $lang->about_email_address = 'Dirección de email es usado para modificar/encontrar contraseña luego de la certificación de email'; + $lang->about_homepage = 'Ingresar su sitio web, si es que lo tiene'; + $lang->about_blog_url = 'Ingresar su blog, si es que lo tiene'; + $lang->about_birthday = 'Ingresar su fecha de nacimiento'; + $lang->about_allow_mailing = "Si usted no se ha registrado el envío de email, usted no podrá recibir el email del grupo"; + $lang->about_denied = 'Si selecciona esta opción prohibirá el uso del ID'; + $lang->about_is_admin = 'Si selecciona esta opción para obtener la atribución del administrador superior'; + $lang->about_member_description = "Nota del administrador acerca de los usuarios"; + $lang->about_group = 'Un ID puede pertenecer a muchos grupos'; + + $lang->about_column_type = 'Definir el estilo de la forma de registro que desea agregar'; + $lang->about_column_name = 'Ingresar el nombre en español para poder usar en plantilla (nombre como variable)'; + $lang->about_column_title = 'Esto sera mostrado cuando el usuario registra o modifica/visualiza la información del usuario'; + $lang->about_default_value = 'Usted puede predefinir los valores'; + $lang->about_active = 'Si selecciona "Activar" los artículos seran mostrados en el momento de registrar'; + $lang->about_form_description = 'Si Usted ingresa la forma de la descripción, será mostrado en el momento de registrar'; + $lang->about_required = 'Si selecciona esta opción, será artículo esencial para el registro'; + + $lang->about_enable_openid = 'Selecciona esta opción si activado OpenID'; + $lang->about_enable_join = 'Debe seleccionar esta opción para permitir el registro de los usuarios'; + $lang->about_enable_confirm = '입력된 메일 주소로 인증 메일을 보내 회원 가입을 확인 합니다'; + $lang->about_enable_ssl = '서버에서 SSL지원이 될 경우 회원가입/정보수정/로그인등의 개인정보가 서버로 보내질때 SSL(https)를 이용하도록 할 수 있습니다'; + $lang->about_limit_day = 'Usted puede limitar la fecha de la certificación luego de registrar'; + $lang->about_limit_date = 'Usuario no podra conectarse hasta la fecha indicada'; + $lang->about_after_login_url = '로그인 후 이동할 URL을 정하실 수 있습니다. 비어 있으면 해당 페이지가 유지됩니다.'; + $lang->about_after_logout_url = '로그아웃 후 이동할 URL을 정하실 수 있습니다. 비어 있으면 해당 페이지가 유지됩니다.'; + $lang->about_redirect_url = 'Ingresar la URL que va a abrir luego de registrar los usuarios. Cuando esto esta vacío, se habrirá la página anterior a la del registro.'; + $lang->about_agreement = "Acuerdo del registro no será mostrado si esta vacío"; + + $lang->about_image_name = "Permitir a los usuarios el uso de imagen del nombre en ves del nombre del usuario"; + $lang->about_image_mark = "Permitir a los usuarios el uso de imagen de marca delante de sus nombres"; + $lang->about_group_image_mark = '사용자의 이름앞에 그룹 마크를 달 수 있습니다'; + $lang->about_profile_image = 'Permitir a los usuarios a utilizar nombre de la imagen en lugar de texto nombre'; + $lang->about_accept_agreement = "Yo he leído todo el acuerdo y acepto"; + + $lang->about_member_default = 'Al registrar se configura como grupo predefinido'; + + $lang->about_openid = 'Cuando tu registra como OpenID, la información básica como ID o la dirección del email sera guardado en este sitio, pero la contraseña y la resolución de la certificación se hará en el servicio ofrecido por openID'; + $lang->about_openid_leave = 'La secesión de OpenID medios eliminación de su información de miembros de este sitio.
    Si se registra después de la secesión, se le reconocerá como un nuevo miembro, de modo que ya no tienen el permiso para que su ex-escrito artículos.'; + + $lang->about_member = "Esto es un módulo para crear/modificar/eliminar usuarios y manejar grupos o el formato del registro.\n Usted puede manejar usuarios creando nuevos grupos, y obtener información adicional manejando el formato del registro"; + $lang->about_find_member_account = 'Su información de la cuenta será observado por dirección de correo electrónico registrada.
    Introduce la dirección de correo electrónico que usted tiene de entrada en el registro, y pulse "Buscar" Información de la cuenta ".
    '; + $lang->about_ssl_port = 'Please input if you are using different SSL port with default one'; + $lang->add_openid = 'Add OpenID'; + + $lang->about_resend_auth_mail = 'You can request for authentication mail if you have failed before.'; + $lang->no_article = 'There exists no article'; + + $lang->find_account_question = '비밀번호 찾기 질문/답변'; + $lang->find_account_answer = '비밀번호 찾기 답변'; + $lang->about_find_account_question = '가입시 아이디와 이메일, 질문/답변으로 임시 비밀번호를 발급 받을 수 있습니다.'; + /* + $lang->find_account_question_items = array('' + ,'다른 이메일 주소는?' + ,'나의 보물 1호는?' + ,'나의 출신 초등학교는?' + ,'나의 출신 고향은?' + ,'나의 이상형은?' + ,'어머니 성함은?' + ,'아버지 성함은?' + ,'가장 좋아하는 색깔은?' + ,'가장 좋아하는 음식은?' + ); +*/ + $lang->temp_password = '임시 비밀번호'; + $lang->cmd_get_temp_password = '임시 비밀번호 발급'; + $lang->about_get_temp_password = '로그인 후 비밀번호 변경해 주세요.'; + $lang->msg_question_not_exists = '등록한 비밀번호 찾기 질문/답변이 없습니다.'; + $lang->msg_answer_not_matches = '비밀번호 찾기 질문/답변 또는 정보가 올바르지 않습니다.'; + + $lang->change_password_date = '비밀번호 갱신주기'; + $lang->about_change_password_date = '일정기간이 지나면 비밀번호 변경을 하도록 유도하는 기능입니다. (사용하지 않음 : 0 입력) '; + +?> diff --git a/modules/member/lang/fr.lang.php b/modules/member/lang/fr.lang.php index 80f38c991..4060590e2 100644 --- a/modules/member/lang/fr.lang.php +++ b/modules/member/lang/fr.lang.php @@ -1,241 +1,241 @@ -member = 'Membre'; - $lang->member_default_info = 'Information fondamentale'; - $lang->member_extend_info = 'Information additionnelle'; - $lang->default_group_1 = "Membre Associé"; - $lang->default_group_2 = "Membre Régulier"; - $lang->admin_group = "Groupe des administrateurs"; - $lang->keep_signed = 'Garder la session ouverte'; - $lang->remember_user_id = 'Mémorisez mon Compte'; - $lang->already_logged = "La session est déjà ouverte"; - $lang->denied_user_id = 'C\'est un comte interdit.'; - $lang->null_user_id = 'Entrez le compte, S.V.P.'; - $lang->null_password = 'Entrez le mot de passe, S.V.P.'; - $lang->invalid_authorization = 'Le compte n\'est pas encore certifié.'; - $lang->invalid_user_id= "C'est un compte qui n'existe pas."; - $lang->invalid_password = 'C\'est un mot de passe invalide'; - $lang->invalid_new_password = '이전 비밀번호와 같습니다.'; - $lang->allow_mailing = 'Inscrire au Mailing'; - $lang->denied = 'Arrêté à utiliser'; - $lang->is_admin = 'Permission Superadministrative'; - $lang->group = 'Groupe assigné'; - $lang->group_title = 'Nom du Groupe'; - $lang->group_srl = 'Numéro du Groupe'; - $lang->signature = 'Signature'; - $lang->profile_image = 'Image du profil'; - $lang->profile_image_max_width = 'Largeur Maximum'; - $lang->profile_image_max_height = 'Hauteur Maximum'; - $lang->image_name = 'Nom en Image'; - $lang->image_name_max_width = 'Largeur Maximum'; - $lang->image_name_max_height = 'Hauteur Maximum'; - $lang->image_mark = 'Marque en Image'; - $lang->image_mark_max_width = 'Largeur Maximum'; - $lang->image_mark_max_height = 'Hauteur Maximum'; - $lang->group_image_mark = 'Group Image Mark'; - $lang->group_image_mark_max_width = 'Largeur Maximum'; - $lang->group_image_mark_max_height = 'Hauteur Maximum'; - $lang->group_image_mark_order = '그룹 이미지 마크 순서'; - $lang->signature_max_height = 'Hauteur Maximum de la Signature'; - $lang->enable_openid = 'Permettre OpenID'; - $lang->enable_join = 'Permettre l\'inscription'; - $lang->enable_confirm = 'Utiliser Authentification par mél'; - $lang->enable_ssl = 'Utiliser SSL'; - $lang->security_sign_in = 'Ouvrir une Session en utilisant sécurité rehaussé'; - $lang->limit_day = 'Jour de Limite Temporaire'; - $lang->limit_date = 'Jour de Limite'; - $lang->after_login_url = 'URL après la connexion'; - $lang->after_logout_url = 'URL après la déconnexion '; - $lang->redirect_url = 'URL après l\'Inscription'; - $lang->agreement = 'Accord de l\'Inscription comme Membre'; - $lang->accept_agreement = 'D\'accord'; - $lang->member_info = 'Information de Membre'; - $lang->current_password = 'Mot de Passe courant'; - $lang->openid = 'OpenID'; - $lang->allow_message = '쪽지 허용'; - $lang->allow_message_type = array( - 'Y' => '모두 허용', - 'F' => '등록된 친구들만 허용', - 'N' => '모두 금지', - ); - $lang->about_allow_message = '쪽지 허용 방법 및 대상을 지정할 수 있습니다'; - $lang->logged_users = 'Logged Users'; - - $lang->webmaster_name = "Nom de Webmestre"; - $lang->webmaster_email = "Mél de Webmestre"; - - $lang->about_keep_signed = 'Malgré que le navigateur est fermé, votre session peut rester ouverte. \n\nSi vous utilisez cette fonction sur l\'ordinateur publique, vos informations privé peut être exposé. Nous vous recommandons de ne pas utiliser cette fonctions sur l\'ordinateur publique.'; - $lang->about_keep_warning = 'Malgré que le navigateur est fermé, votre session peut rester ouverte. Si vous utilisez cette fonction sur l\'ordinateur publique, vos informations privé peut être exposé. Nous vous recommandons de ne pas utiliser cette fonctions sur l\'ordinateur publique.'; - $lang->about_webmaster_name = "Entrez le nom de webmestre qui va être utilisé pour le mél de certification ou l\'autre administration du site. (défaut : webmestre)"; - $lang->about_webmaster_email = "Entrez l\'adresse du mél de webmestre, S.V.P."; - - $lang->search_target_list = array( - 'user_id' => 'Compte', - 'user_name' => 'Nom', - 'nick_name' => 'Surnom', - 'email_address' => 'Mél', - 'regdate' => 'Jour d\'Inscription', - 'regdate_more' => '가입일시(이상)', - 'regdate_less' => '가입일시(이하)', - 'last_login' => 'Jour de la connexion dernière', - 'last_login_more' => '최근로그인일시(이상)', - 'last_login_less' => '최근로그인일시(이하)', - 'extra_vars' => 'Variables additionnels ', - ); - - $lang->cmd_login = 'Connexion'; - $lang->cmd_logout = 'Déconnexion'; - $lang->cmd_signup = 'Inscription'; - $lang->cmd_site_signup = 'Join'; - $lang->cmd_modify_member_info = 'Modifier Mon Information'; - $lang->cmd_modify_member_password = 'Modifier le Mot de Passe'; - $lang->cmd_view_member_info = 'Voir Mon Information'; - $lang->cmd_leave = 'Quitter'; - $lang->cmd_find_member_account = 'J\'ai perdu le compte / le mot de passe'; - $lang->cmd_resend_auth_mail = '인증 메일 재발송'; - - $lang->cmd_member_list = 'Liste de Membres'; - $lang->cmd_module_config = 'Configuration par Défaut'; - $lang->cmd_member_group = 'Administrer des Groupes'; - $lang->cmd_send_mail = 'Envoyer des Méls'; - $lang->cmd_manage_id = 'Administrer les Comptes Interdits'; - $lang->cmd_manage_form = 'Administrer la Forme d\'Inscription'; - $lang->cmd_view_own_document = 'Voir les Articles écrits'; - $lang->cmd_manage_member_info = 'Manage Member Info'; - $lang->cmd_trace_document = 'Tracer les Articles écrits'; - $lang->cmd_trace_comment = 'Tracer les Commentaires écrits'; - $lang->cmd_view_scrapped_document = 'Voir les Coupures'; - $lang->cmd_view_saved_document = 'Voir les Articles conservés'; - $lang->cmd_send_email = 'Envoyer des Méls'; - - $lang->msg_email_not_exists = "L'adresse mél n'existe pas."; - - $lang->msg_alreay_scrapped = 'Cet article est déjà coupé.'; - - $lang->msg_cart_is_null = 'Choisissez l\'Objet, S.V.P.'; - $lang->msg_checked_file_is_deleted = '%d fichier(s) attaché(s) est(sont) supprimé(s)'; - - $lang->msg_find_account_title = 'Information de compte'; - $lang->msg_find_account_info = 'Voilà votre information de compte.'; - $lang->msg_find_account_comment = 'Le Mot de Passe sera modifié comme celui ci-dessus si vous cliquez le lien ci-dessous.
    Modifiez le Mot de Passe après ouvrir la connexion, S.V.P.'; - $lang->msg_confirm_account_title = 'Mél à confirmer l\'Authentification'; - $lang->msg_confirm_account_info = 'Voilà votre Information de l\'inscription du Compte:'; - $lang->msg_confirm_account_comment = 'Cliquez le lien de confirmation suivant pour compléter votre inscription.'; - $lang->msg_auth_mail_sent = 'Le mél de certification a été envoyé à %s. Vérifiez votre mél.'; - $lang->msg_confirm_mail_sent = 'On a justement envoyé un mél de confirmation à %s. Cliquez sur le lien de confirmation dans le mél pour compléter l\'inscription.'; - $lang->msg_invalid_auth_key = 'Cette Requête à Certifier est invalide.
    Essayez encore une fois à retrouver votre information de compte ou contactez l\'administrateur.'; - $lang->msg_success_authed = 'Votre compte a été certifié avec succès et ouvert une session. \n Modifiez le Mot de Passe après vous ouvrez une session en utilisant le Mot de Passe dans le mél.'; - $lang->msg_success_confirmed = 'L\'authentification est complétée avec succèss.'; - - $lang->msg_new_member = 'Ajouter un membre'; - $lang->msg_update_member = 'Modifier l\'Information de Membre'; - $lang->msg_leave_member = 'Sécession'; - $lang->msg_group_is_null = 'Il n\'y a pas de groupe enrégistré'; - $lang->msg_not_delete_default = 'Elément fondamental ne pourra pas être supprimé'; - $lang->msg_not_exists_member = "Membre Invalide"; - $lang->msg_cannot_delete_admin = 'Le Compte de l\'Administrateur ne pourra pas être supprimé. Annulez l\'administration du compte et essayez encore une fois.'; - $lang->msg_exists_user_id = 'Le compte existe déjà. Essayez un autre.'; - $lang->msg_exists_email_address = 'L\'adresse mél existe déjà. Essayez une autre.'; - $lang->msg_exists_nick_name = 'Le surnom existe déjà. Essayez un autre.'; - $lang->msg_signup_disabled = 'Vous ne pouvez pas vous inscrire.'; - $lang->msg_already_logged = 'Vous vous êtes déjà inscrit(e).'; - $lang->msg_not_logged = 'Ouvrez une session d\'abord'; - $lang->msg_insert_group_name = 'Entrez le nom de groupe, S.V.P.'; - $lang->msg_check_group = 'Choisissez le groupe'; - - $lang->msg_not_uploaded_profile_image = 'L\'image de Profil n\'a pas pu être enrégistré'; - $lang->msg_not_uploaded_image_name = 'Le nom d\'image n\'a pas pu être enrégistré'; - $lang->msg_not_uploaded_image_mark = 'La marque en image n\'a pas pu être enrégistrée'; - $lang->msg_not_uploaded_group_image_mark = '그룹 이미지 마크를 등록할 수가 없습니다'; - - $lang->msg_accept_agreement = 'Vous devez agréer l\'accord'; - - $lang->msg_user_denied = 'Le compte que vous avez entré est suspendu'; - $lang->msg_user_not_confirmed = 'Vous n\'avez pas encore authentifié. Verifiez votre mél, S.V.P.'; - $lang->msg_user_limited = 'Vous avez entré un compte qui peut être utilisé depuis %s'; - - $lang->about_user_id = 'Le compte d\'utilisateur doit être long de 3~20 lettres et se composer des alphabets et des chiffres avec un alphabet au premier.'; - $lang->about_password = 'Le Mot de Passe doit être long de 6~20 lettres.'; - $lang->about_user_name = 'Le Nom doit être long de 2~20 lettres.'; - $lang->about_nick_name = 'Le Surnom doit être long de 2~20 lettres.'; - $lang->about_email_address = 'L\'Adresse mél sera utilisé à modifier/trouver le Mot de Passe après la certification en mél.'; - $lang->about_homepage = 'Entrez si vous avez un site Web.'; - $lang->about_blog_url = 'Entrez si vous avez un blogue.'; - $lang->about_birthday = 'Entrez votre anniversaire.'; - $lang->about_allow_mailing = "Si vous ne vous inscrivez pas sur mailing, vous ne pouvez pas recevoir le mél du groupe."; - $lang->about_denied = 'Cocher pour interdire le compte'; - $lang->about_is_admin = 'Cocher pour autoriser la permission de Superadministrateur'; - $lang->about_member_description = "La description de l\'Administrateur sur le membre"; - $lang->about_group = 'Un compte peut appartenir aux plusieurs groupes.'; - - $lang->about_column_type = 'Choisissez la format que vous voulez ajouter'; - $lang->about_column_name = 'Entrez le nom composé en alphabet qui peut être utilisé dans le modèle (nom comme variable)'; - $lang->about_column_title = 'Ce titre sera exposé sur la formule d\'inscription ou sur l\'écran pour modifier/voir les informations de membre'; - $lang->about_default_value = 'Vous pouvez mettre les valeurs par défaut'; - $lang->about_active = 'Cochez si vous voulez l\'exposer sur la formule d\'inscription'; - $lang->about_form_description = 'Si vous entrez la description, elle sera exposé sur la formule d\'incription'; - $lang->about_required = 'Si vous cochez, ce sera obligatoire'; - - $lang->about_enable_openid = 'Cochez si vous voulez permettre OpenID'; - $lang->about_enable_join = 'Cochez si vous voulez permettre l\'inscription'; - $lang->about_enable_confirm = 'Envoyer mél de confirmation pour compléter l\'inscription.'; - $lang->about_enable_ssl = 'Les informations personnelles (Inscription / Modification des informations du membre / Connexion) peuvent être envoyées comme mode SSL(https) si le serveur offre le service SSL.'; - $lang->about_limit_day = 'Vous pouvez limiter le jour de certification après l\'inscription'; - $lang->about_limit_date = 'Utilisateur ne peut pas ouverir la connexion jusqu\'au jour assigné'; - $lang->about_after_login_url = 'Vous pouvez indiquer URL où l\'on va après la connexion. Le vide signifie la page courante.'; - $lang->about_after_logout_url = 'Vous pouvez indiquer URL où l\'on va après la déconnexion. Le vide signifie la page courrante.'; - $lang->about_redirect_url = 'Entrez URL où l\'utilisateur irra après l\'inscription, S.V.P. Si c\'est vide, ce sera la page précédente de la page d\'inscription.'; - $lang->about_agreement = "L'Accord d'Inscription comme Membre sera exposé seulement quand il n'est pas vide."; - - $lang->about_image_name = "Permettre aux utilisateurs d'utiliser une image pour présenter leurs noms au lieu des lettres"; - $lang->about_image_mark = "Permettre aux utilisateurs d'utiliser une marque devent leurs noms"; - $lang->about_group_image_mark = '사용자의 이름앞에 그룹 마크를 달 수 있습니다'; - $lang->about_profile_image = 'Permettre aux utilisateurs d\'utiliser une image de profil'; - $lang->about_accept_agreement = "J'ai lu l'Accord et je suis d'accord."; - - $lang->about_member_default = 'On sera par défaut dans ce groupe après l\'inscription'; - - $lang->about_openid = 'Si vous vous inscrivez avec OpenID, vos informations primaires comme le Compte(ID) ou l\'adresse mél sera gardés sur ce site. Mais le procès pour le Mot de Passe et la certification sera fait sur le service courant qui offre OpenID'; - $lang->about_openid_leave = 'La sécession de OpenID nous fait supprimer vos informations du membre dans notre site.
    Si vous ouvrez la connexion après la sécession, nous vous reconnaîtrons comme un nouveau membre, c\'est-à-dire, vous n\'aurez plus la permission sur les articles que vous avez écrits avant.'; - - $lang->about_find_member_account = 'L\information de votre compte sera annoncé par le mél sur l\'inscription.
    Entrez l\'adresse mél que vous avez entré sur l\'inscription et appuyez le bouton "Recherce l\'Information du Compte".
    '; - - $lang->about_member = "C'est le module pour administrer des membres avec lequel vous pouvez créer/modifier/supprimer des membres ou administrer les groupes et la formule d'inscription.\nVous pouvez administrer membres par création un nouveau groupe, ou gagner les informations additionnelles par l'administration la formule d'inscrioption."; - $lang->about_find_member_account = 'Your account info will be noticed by registered email address.
    Please input email address which you have input on registration, and press "Find Account Info" button.
    '; - $lang->about_ssl_port = 'Please input if you are using different SSL port with default one'; - $lang->add_openid = 'Add OpenID'; - - $lang->about_resend_auth_mail = 'You can request for authentication mail if you have failed before.'; - $lang->no_article = 'There exists no article'; - - $lang->find_account_question = '비밀번호 찾기 질문/답변'; - $lang->find_account_answer = '비밀번호 찾기 답변'; - $lang->about_find_account_question = '가입시 아이디와 이메일, 질문/답변으로 임시 비밀번호를 발급 받을 수 있습니다.'; - /* - $lang->find_account_question_items = array('' - ,'다른 이메일 주소는?' - ,'나의 보물 1호는?' - ,'나의 출신 초등학교는?' - ,'나의 출신 고향은?' - ,'나의 이상형은?' - ,'어머니 성함은?' - ,'아버지 성함은?' - ,'가장 좋아하는 색깔은?' - ,'가장 좋아하는 음식은?' - ); -*/ - $lang->temp_password = '임시 비밀번호'; - $lang->cmd_get_temp_password = '임시 비밀번호 발급'; - $lang->about_get_temp_password = '로그인 후 비밀번호 변경해 주세요.'; - $lang->msg_question_not_exists = '등록한 비밀번호 찾기 질문/답변이 없습니다.'; - $lang->msg_answer_not_matches = '비밀번호 찾기 질문/답변 또는 정보가 올바르지 않습니다.'; - - $lang->change_password_date = '비밀번호 갱신주기'; - $lang->about_change_password_date = '일정기간이 지나면 비밀번호 변경을 하도록 유도하는 기능입니다. (사용하지 않음 : 0 입력) '; - -?> +member = 'Membre'; + $lang->member_default_info = 'Information fondamentale'; + $lang->member_extend_info = 'Information additionnelle'; + $lang->default_group_1 = "Membre Associé"; + $lang->default_group_2 = "Membre Régulier"; + $lang->admin_group = "Groupe des administrateurs"; + $lang->keep_signed = 'Garder la session ouverte'; + $lang->remember_user_id = 'Mémorisez mon Compte'; + $lang->already_logged = "La session est déjà ouverte"; + $lang->denied_user_id = 'C\'est un comte interdit.'; + $lang->null_user_id = 'Entrez le compte, S.V.P.'; + $lang->null_password = 'Entrez le mot de passe, S.V.P.'; + $lang->invalid_authorization = 'Le compte n\'est pas encore certifié.'; + $lang->invalid_user_id= "C'est un compte qui n'existe pas."; + $lang->invalid_password = 'C\'est un mot de passe invalide'; + $lang->invalid_new_password = '이전 비밀번호와 같습니다.'; + $lang->allow_mailing = 'Inscrire au Mailing'; + $lang->denied = 'Arrêté à utiliser'; + $lang->is_admin = 'Permission Superadministrative'; + $lang->group = 'Groupe assigné'; + $lang->group_title = 'Nom du Groupe'; + $lang->group_srl = 'Numéro du Groupe'; + $lang->signature = 'Signature'; + $lang->profile_image = 'Image du profil'; + $lang->profile_image_max_width = 'Largeur Maximum'; + $lang->profile_image_max_height = 'Hauteur Maximum'; + $lang->image_name = 'Nom en Image'; + $lang->image_name_max_width = 'Largeur Maximum'; + $lang->image_name_max_height = 'Hauteur Maximum'; + $lang->image_mark = 'Marque en Image'; + $lang->image_mark_max_width = 'Largeur Maximum'; + $lang->image_mark_max_height = 'Hauteur Maximum'; + $lang->group_image_mark = 'Group Image Mark'; + $lang->group_image_mark_max_width = 'Largeur Maximum'; + $lang->group_image_mark_max_height = 'Hauteur Maximum'; + $lang->group_image_mark_order = '그룹 이미지 마크 순서'; + $lang->signature_max_height = 'Hauteur Maximum de la Signature'; + $lang->enable_openid = 'Permettre OpenID'; + $lang->enable_join = 'Permettre l\'inscription'; + $lang->enable_confirm = 'Utiliser Authentification par mél'; + $lang->enable_ssl = 'Utiliser SSL'; + $lang->security_sign_in = 'Ouvrir une Session en utilisant sécurité rehaussé'; + $lang->limit_day = 'Jour de Limite Temporaire'; + $lang->limit_date = 'Jour de Limite'; + $lang->after_login_url = 'URL après la connexion'; + $lang->after_logout_url = 'URL après la déconnexion '; + $lang->redirect_url = 'URL après l\'Inscription'; + $lang->agreement = 'Accord de l\'Inscription comme Membre'; + $lang->accept_agreement = 'D\'accord'; + $lang->member_info = 'Information de Membre'; + $lang->current_password = 'Mot de Passe courant'; + $lang->openid = 'OpenID'; + $lang->allow_message = '쪽지 허용'; + $lang->allow_message_type = array( + 'Y' => '모두 허용', + 'F' => '등록된 친구들만 허용', + 'N' => '모두 금지', + ); + $lang->about_allow_message = '쪽지 허용 방법 및 대상을 지정할 수 있습니다'; + $lang->logged_users = 'Logged Users'; + + $lang->webmaster_name = "Nom de Webmestre"; + $lang->webmaster_email = "Mél de Webmestre"; + + $lang->about_keep_signed = 'Malgré que le navigateur est fermé, votre session peut rester ouverte. \n\nSi vous utilisez cette fonction sur l\'ordinateur publique, vos informations privé peut être exposé. Nous vous recommandons de ne pas utiliser cette fonctions sur l\'ordinateur publique.'; + $lang->about_keep_warning = 'Malgré que le navigateur est fermé, votre session peut rester ouverte. Si vous utilisez cette fonction sur l\'ordinateur publique, vos informations privé peut être exposé. Nous vous recommandons de ne pas utiliser cette fonctions sur l\'ordinateur publique.'; + $lang->about_webmaster_name = "Entrez le nom de webmestre qui va être utilisé pour le mél de certification ou l\'autre administration du site. (défaut : webmestre)"; + $lang->about_webmaster_email = "Entrez l\'adresse du mél de webmestre, S.V.P."; + + $lang->search_target_list = array( + 'user_id' => 'Compte', + 'user_name' => 'Nom', + 'nick_name' => 'Surnom', + 'email_address' => 'Mél', + 'regdate' => 'Jour d\'Inscription', + 'regdate_more' => '가입일시(이상)', + 'regdate_less' => '가입일시(이하)', + 'last_login' => 'Jour de la connexion dernière', + 'last_login_more' => '최근로그인일시(이상)', + 'last_login_less' => '최근로그인일시(이하)', + 'extra_vars' => 'Variables additionnels ', + ); + + $lang->cmd_login = 'Connexion'; + $lang->cmd_logout = 'Déconnexion'; + $lang->cmd_signup = 'Inscription'; + $lang->cmd_site_signup = 'Join'; + $lang->cmd_modify_member_info = 'Modifier Mon Information'; + $lang->cmd_modify_member_password = 'Modifier le Mot de Passe'; + $lang->cmd_view_member_info = 'Voir Mon Information'; + $lang->cmd_leave = 'Quitter'; + $lang->cmd_find_member_account = 'J\'ai perdu le compte / le mot de passe'; + $lang->cmd_resend_auth_mail = '인증 메일 재발송'; + + $lang->cmd_member_list = 'Liste de Membres'; + $lang->cmd_module_config = 'Configuration par Défaut'; + $lang->cmd_member_group = 'Administrer des Groupes'; + $lang->cmd_send_mail = 'Envoyer des Méls'; + $lang->cmd_manage_id = 'Administrer les Comptes Interdits'; + $lang->cmd_manage_form = 'Administrer la Forme d\'Inscription'; + $lang->cmd_view_own_document = 'Voir les Articles écrits'; + $lang->cmd_manage_member_info = 'Manage Member Info'; + $lang->cmd_trace_document = 'Tracer les Articles écrits'; + $lang->cmd_trace_comment = 'Tracer les Commentaires écrits'; + $lang->cmd_view_scrapped_document = 'Voir les Coupures'; + $lang->cmd_view_saved_document = 'Voir les Articles conservés'; + $lang->cmd_send_email = 'Envoyer des Méls'; + + $lang->msg_email_not_exists = "L'adresse mél n'existe pas."; + + $lang->msg_alreay_scrapped = 'Cet article est déjà coupé.'; + + $lang->msg_cart_is_null = 'Choisissez l\'Objet, S.V.P.'; + $lang->msg_checked_file_is_deleted = '%d fichier(s) attaché(s) est(sont) supprimé(s)'; + + $lang->msg_find_account_title = 'Information de compte'; + $lang->msg_find_account_info = 'Voilà votre information de compte.'; + $lang->msg_find_account_comment = 'Le Mot de Passe sera modifié comme celui ci-dessus si vous cliquez le lien ci-dessous.
    Modifiez le Mot de Passe après ouvrir la connexion, S.V.P.'; + $lang->msg_confirm_account_title = 'Mél à confirmer l\'Authentification'; + $lang->msg_confirm_account_info = 'Voilà votre Information de l\'inscription du Compte:'; + $lang->msg_confirm_account_comment = 'Cliquez le lien de confirmation suivant pour compléter votre inscription.'; + $lang->msg_auth_mail_sent = 'Le mél de certification a été envoyé à %s. Vérifiez votre mél.'; + $lang->msg_confirm_mail_sent = 'On a justement envoyé un mél de confirmation à %s. Cliquez sur le lien de confirmation dans le mél pour compléter l\'inscription.'; + $lang->msg_invalid_auth_key = 'Cette Requête à Certifier est invalide.
    Essayez encore une fois à retrouver votre information de compte ou contactez l\'administrateur.'; + $lang->msg_success_authed = 'Votre compte a été certifié avec succès et ouvert une session. \n Modifiez le Mot de Passe après vous ouvrez une session en utilisant le Mot de Passe dans le mél.'; + $lang->msg_success_confirmed = 'L\'authentification est complétée avec succèss.'; + + $lang->msg_new_member = 'Ajouter un membre'; + $lang->msg_update_member = 'Modifier l\'Information de Membre'; + $lang->msg_leave_member = 'Sécession'; + $lang->msg_group_is_null = 'Il n\'y a pas de groupe enrégistré'; + $lang->msg_not_delete_default = 'Elément fondamental ne pourra pas être supprimé'; + $lang->msg_not_exists_member = "Membre Invalide"; + $lang->msg_cannot_delete_admin = 'Le Compte de l\'Administrateur ne pourra pas être supprimé. Annulez l\'administration du compte et essayez encore une fois.'; + $lang->msg_exists_user_id = 'Le compte existe déjà. Essayez un autre.'; + $lang->msg_exists_email_address = 'L\'adresse mél existe déjà. Essayez une autre.'; + $lang->msg_exists_nick_name = 'Le surnom existe déjà. Essayez un autre.'; + $lang->msg_signup_disabled = 'Vous ne pouvez pas vous inscrire.'; + $lang->msg_already_logged = 'Vous vous êtes déjà inscrit(e).'; + $lang->msg_not_logged = 'Ouvrez une session d\'abord'; + $lang->msg_insert_group_name = 'Entrez le nom de groupe, S.V.P.'; + $lang->msg_check_group = 'Choisissez le groupe'; + + $lang->msg_not_uploaded_profile_image = 'L\'image de Profil n\'a pas pu être enrégistré'; + $lang->msg_not_uploaded_image_name = 'Le nom d\'image n\'a pas pu être enrégistré'; + $lang->msg_not_uploaded_image_mark = 'La marque en image n\'a pas pu être enrégistrée'; + $lang->msg_not_uploaded_group_image_mark = '그룹 이미지 마크를 등록할 수가 없습니다'; + + $lang->msg_accept_agreement = 'Vous devez agréer l\'accord'; + + $lang->msg_user_denied = 'Le compte que vous avez entré est suspendu'; + $lang->msg_user_not_confirmed = 'Vous n\'avez pas encore authentifié. Verifiez votre mél, S.V.P.'; + $lang->msg_user_limited = 'Vous avez entré un compte qui peut être utilisé depuis %s'; + + $lang->about_user_id = 'Le compte d\'utilisateur doit être long de 3~20 lettres et se composer des alphabets et des chiffres avec un alphabet au premier.'; + $lang->about_password = 'Le Mot de Passe doit être long de 6~20 lettres.'; + $lang->about_user_name = 'Le Nom doit être long de 2~20 lettres.'; + $lang->about_nick_name = 'Le Surnom doit être long de 2~20 lettres.'; + $lang->about_email_address = 'L\'Adresse mél sera utilisé à modifier/trouver le Mot de Passe après la certification en mél.'; + $lang->about_homepage = 'Entrez si vous avez un site Web.'; + $lang->about_blog_url = 'Entrez si vous avez un blogue.'; + $lang->about_birthday = 'Entrez votre anniversaire.'; + $lang->about_allow_mailing = "Si vous ne vous inscrivez pas sur mailing, vous ne pouvez pas recevoir le mél du groupe."; + $lang->about_denied = 'Cocher pour interdire le compte'; + $lang->about_is_admin = 'Cocher pour autoriser la permission de Superadministrateur'; + $lang->about_member_description = "La description de l\'Administrateur sur le membre"; + $lang->about_group = 'Un compte peut appartenir aux plusieurs groupes.'; + + $lang->about_column_type = 'Choisissez la format que vous voulez ajouter'; + $lang->about_column_name = 'Entrez le nom composé en alphabet qui peut être utilisé dans le modèle (nom comme variable)'; + $lang->about_column_title = 'Ce titre sera exposé sur la formule d\'inscription ou sur l\'écran pour modifier/voir les informations de membre'; + $lang->about_default_value = 'Vous pouvez mettre les valeurs par défaut'; + $lang->about_active = 'Cochez si vous voulez l\'exposer sur la formule d\'inscription'; + $lang->about_form_description = 'Si vous entrez la description, elle sera exposé sur la formule d\'incription'; + $lang->about_required = 'Si vous cochez, ce sera obligatoire'; + + $lang->about_enable_openid = 'Cochez si vous voulez permettre OpenID'; + $lang->about_enable_join = 'Cochez si vous voulez permettre l\'inscription'; + $lang->about_enable_confirm = 'Envoyer mél de confirmation pour compléter l\'inscription.'; + $lang->about_enable_ssl = 'Les informations personnelles (Inscription / Modification des informations du membre / Connexion) peuvent être envoyées comme mode SSL(https) si le serveur offre le service SSL.'; + $lang->about_limit_day = 'Vous pouvez limiter le jour de certification après l\'inscription'; + $lang->about_limit_date = 'Utilisateur ne peut pas ouverir la connexion jusqu\'au jour assigné'; + $lang->about_after_login_url = 'Vous pouvez indiquer URL où l\'on va après la connexion. Le vide signifie la page courante.'; + $lang->about_after_logout_url = 'Vous pouvez indiquer URL où l\'on va après la déconnexion. Le vide signifie la page courrante.'; + $lang->about_redirect_url = 'Entrez URL où l\'utilisateur irra après l\'inscription, S.V.P. Si c\'est vide, ce sera la page précédente de la page d\'inscription.'; + $lang->about_agreement = "L'Accord d'Inscription comme Membre sera exposé seulement quand il n'est pas vide."; + + $lang->about_image_name = "Permettre aux utilisateurs d'utiliser une image pour présenter leurs noms au lieu des lettres"; + $lang->about_image_mark = "Permettre aux utilisateurs d'utiliser une marque devent leurs noms"; + $lang->about_group_image_mark = '사용자의 이름앞에 그룹 마크를 달 수 있습니다'; + $lang->about_profile_image = 'Permettre aux utilisateurs d\'utiliser une image de profil'; + $lang->about_accept_agreement = "J'ai lu l'Accord et je suis d'accord."; + + $lang->about_member_default = 'On sera par défaut dans ce groupe après l\'inscription'; + + $lang->about_openid = 'Si vous vous inscrivez avec OpenID, vos informations primaires comme le Compte(ID) ou l\'adresse mél sera gardés sur ce site. Mais le procès pour le Mot de Passe et la certification sera fait sur le service courant qui offre OpenID'; + $lang->about_openid_leave = 'La sécession de OpenID nous fait supprimer vos informations du membre dans notre site.
    Si vous ouvrez la connexion après la sécession, nous vous reconnaîtrons comme un nouveau membre, c\'est-à-dire, vous n\'aurez plus la permission sur les articles que vous avez écrits avant.'; + + $lang->about_find_member_account = 'L\information de votre compte sera annoncé par le mél sur l\'inscription.
    Entrez l\'adresse mél que vous avez entré sur l\'inscription et appuyez le bouton "Recherce l\'Information du Compte".
    '; + + $lang->about_member = "C'est le module pour administrer des membres avec lequel vous pouvez créer/modifier/supprimer des membres ou administrer les groupes et la formule d'inscription.\nVous pouvez administrer membres par création un nouveau groupe, ou gagner les informations additionnelles par l'administration la formule d'inscrioption."; + $lang->about_find_member_account = 'Your account info will be noticed by registered email address.
    Please input email address which you have input on registration, and press "Find Account Info" button.
    '; + $lang->about_ssl_port = 'Please input if you are using different SSL port with default one'; + $lang->add_openid = 'Add OpenID'; + + $lang->about_resend_auth_mail = 'You can request for authentication mail if you have failed before.'; + $lang->no_article = 'There exists no article'; + + $lang->find_account_question = '비밀번호 찾기 질문/답변'; + $lang->find_account_answer = '비밀번호 찾기 답변'; + $lang->about_find_account_question = '가입시 아이디와 이메일, 질문/답변으로 임시 비밀번호를 발급 받을 수 있습니다.'; + /* + $lang->find_account_question_items = array('' + ,'다른 이메일 주소는?' + ,'나의 보물 1호는?' + ,'나의 출신 초등학교는?' + ,'나의 출신 고향은?' + ,'나의 이상형은?' + ,'어머니 성함은?' + ,'아버지 성함은?' + ,'가장 좋아하는 색깔은?' + ,'가장 좋아하는 음식은?' + ); +*/ + $lang->temp_password = '임시 비밀번호'; + $lang->cmd_get_temp_password = '임시 비밀번호 발급'; + $lang->about_get_temp_password = '로그인 후 비밀번호 변경해 주세요.'; + $lang->msg_question_not_exists = '등록한 비밀번호 찾기 질문/답변이 없습니다.'; + $lang->msg_answer_not_matches = '비밀번호 찾기 질문/답변 또는 정보가 올바르지 않습니다.'; + + $lang->change_password_date = '비밀번호 갱신주기'; + $lang->about_change_password_date = '일정기간이 지나면 비밀번호 변경을 하도록 유도하는 기능입니다. (사용하지 않음 : 0 입력) '; + +?> diff --git a/modules/member/lang/jp.lang.php b/modules/member/lang/jp.lang.php index cd4c51f9c..b78d183fc 100644 --- a/modules/member/lang/jp.lang.php +++ b/modules/member/lang/jp.lang.php @@ -1,241 +1,241 @@ -member = '会員'; - $lang->member_default_info = '基本情報'; - $lang->member_extend_info = '追加情報'; - $lang->default_group_1 = '準会員'; - $lang->default_group_2 = '正会員'; - $lang->admin_group = '管理グループ'; - $lang->keep_signed = '次回からID入力を省略'; - $lang->remember_user_id = 'ID保存'; - $lang->already_logged = '既にログインされています。'; - $lang->denied_user_id = '使用が禁じられているIDです。'; - $lang->null_user_id = 'ユーザーIDをもう一度入力して下さい。'; - $lang->null_password = 'パスワードを入力して下さい。'; - $lang->invalid_authorization = '認証出来ませんでした。'; - $lang->invalid_user_id= '存在しないユーザIDです。'; - $lang->invalid_password = '無効なパスワードです。'; - $lang->invalid_new_password = '以前のパスワードと同じパスワードを使う事はできません。'; - $lang->allow_mailing = 'メーリングリストに登録'; - $lang->denied = '使用中止'; - $lang->is_admin = '最高管理権限'; - $lang->group = '所属グループ'; - $lang->group_title = 'グループ名'; - $lang->group_srl = 'グループ番号'; - $lang->signature = '署名'; - $lang->profile_image = 'プロフィール写真'; - $lang->profile_image_max_width = '制限横幅サイズ'; - $lang->profile_image_max_height = '制限縦幅サイズ'; - $lang->image_name = 'イメージ名'; - $lang->image_name_max_width = '制限横幅サイズ'; - $lang->image_name_max_height = '制限縦幅サイズ'; - $lang->image_mark = 'イメージマーク'; - $lang->image_mark_max_width = '制限横幅サイズ'; - $lang->image_mark_max_height = '制限縦幅サイズ'; - $lang->group_image_mark = 'グループ用イメージマーク'; - $lang->group_image_mark_max_width = '制限横幅サイズ'; - $lang->group_image_mark_max_height = '制限縦幅サイズ'; - $lang->group_image_mark_order = 'グループ用イメージマークの順番'; - $lang->signature_max_height = '制限署名欄の高さ'; - $lang->enable_openid = 'OpenIDサポート'; - $lang->enable_join = '会員登録を許可する'; - $lang->enable_confirm = 'メール認証機能を使用'; - $lang->enable_ssl = 'SSL使用'; - $lang->security_sign_in = 'セキュア(SSL)'; - $lang->limit_day = '臨時制限期間(日)'; - $lang->limit_date = '制限日'; - $lang->after_login_url = 'ログイン後、表示するページのURL'; - $lang->after_logout_url = 'ログアウト後、表示するページのURL'; - $lang->redirect_url = '会員登録後、表示するページ'; - $lang->agreement = '会員登録規約'; - $lang->accept_agreement = '規約に同意する'; - $lang->member_info = '会員情報'; - $lang->current_password = '現在のパスワード'; - $lang->openid = 'OpenID'; - $lang->allow_message = 'メッセージ許可'; - $lang->allow_message_type = array( - 'Y' => '全て許可', - 'F' => '登録した友達のみ許可', - 'N' => '全て禁止', - ); - $lang->about_allow_message = 'メッセージの許可タイプ及び対象を設定します。'; - $lang->logged_users = '現在ログイン中の会員'; - - $lang->webmaster_name = 'ウェブマスターのお名前'; - $lang->webmaster_email = 'ウェブマスターのメールアドレス'; - - $lang->about_keep_signed = 'ブラウザを閉じてもログイン状態が維持されます。\n\nログイン維持機能を利用すると、次回からログインする必要がなくなります。\n\nただ、インターネットカフェ、学校など公共場所で利用する場合、個人情報が流出する恐れがありますので、必ずログアウトして下さい。'; - $lang->about_keep_warning = 'ブラウザを閉じてもログイン状態が維持されます。\n\nログイン維持機能を利用すると、次回からログインする必要がなくなります。 ただ、インターネットカフェ、学校など公共場所で利用する場合、個人情報が流出する恐れがありますので、必ずログアウトして下さい。'; - $lang->about_webmaster_name = '確認メール、またはサイト管理時に使用されるウェブマスターのお名前を入力して下さい(デフォルト : webmaster)。'; - $lang->about_webmaster_email = 'ウェブマスターのメールアドレスを入力して下さい。'; - - $lang->search_target_list = array( - 'user_id' => 'ユーザーID', - 'user_name' => 'お名前', - 'nick_name' => 'ニックネーム', - 'email_address' => 'メールアドレス', - 'regdate' => '登録日', - 'regdate_more' => '登録日(以上)', - 'regdate_less' => '登録日(以下)', - 'last_login' => '最近のログイン', - 'last_login_more' => '最近ログイン日(以上)', - 'last_login_less' => '最近ログイン日(以下)', - 'extra_vars' => '拡張変数', - ); - - $lang->cmd_login = 'ログイン'; - $lang->cmd_logout = 'ログアウト'; - $lang->cmd_signup = '会員登録'; - $lang->cmd_site_signup = '登録'; - $lang->cmd_modify_member_info = '会員情報修正'; - $lang->cmd_modify_member_password = 'パスワード変更'; - $lang->cmd_view_member_info = '会員情報確認'; - $lang->cmd_leave = '退会'; - $lang->cmd_find_member_account = 'IDとパスワードのリマインダー'; - $lang->cmd_resend_auth_mail = '認証メール再申請'; - - $lang->cmd_member_list = '会員リスト'; - $lang->cmd_module_config = '基本設定'; - $lang->cmd_member_group = 'グループ管理'; - $lang->cmd_send_mail = 'メール送信'; - $lang->cmd_manage_id = '禁止ID管理'; - $lang->cmd_manage_form = '会員登録フォーム管理'; - $lang->cmd_view_own_document = '書き込み履歴'; - $lang->cmd_manage_member_info = '会員情報管理'; - $lang->cmd_trace_document = '書き込みの追跡'; - $lang->cmd_trace_comment = 'コメント追跡'; - $lang->cmd_view_scrapped_document = 'スクラップ'; - $lang->cmd_view_saved_document = '保存ドキュメント'; - $lang->cmd_send_email = 'メール送信'; - - $lang->msg_email_not_exists = '登録されたメールアドレスがありません。'; - - $lang->msg_alreay_scrapped = '既にスクラップされたコンテンツです。'; - - $lang->msg_cart_is_null = '対象を選択して下さい。'; - $lang->msg_checked_file_is_deleted = "%d個の添付ファイルが削除されました。"; - - $lang->msg_find_account_title = '会員IDどパスワードの情報'; - $lang->msg_find_account_info = '登録された会員情報は下記の通りです。'; - $lang->msg_find_account_comment = '下のリンクをクリックすると上のパスワードに変更されます。
    ログインしてからパスワードを変更して下さい。'; - $lang->msg_confirm_account_title = '確認メールです。'; - $lang->msg_confirm_account_info = '作成した会員の情報'; - $lang->msg_confirm_account_comment = '下記のURLをクリックして会員登録手続きを完了して下さい。'; - $lang->msg_auth_mail_sent = "%s 宛に認証情報内容が送信されました。メールを確認して下さい。"; - $lang->msg_confirm_mail_sent = "%s 宛に確認メールを送信しました。メールをご確認下さい。"; - $lang->msg_invalid_auth_key = '正しくないアカウントの認証要求です。
    IDとパスワードの検索を行うか、サイト管理者にアカウント情報をお問い合わせ下さい。'; - $lang->msg_success_authed = '認証が正常に行われ、ログイン出来ました。\n必ず確認メールに記載されたパスワードを利用してお好みのパスワードに変更して下さい。'; - $lang->msg_success_confirmed = '会員登録、有難うございます。'; - - $lang->msg_new_member = '会員追加'; - $lang->msg_update_member = '会員情報修正'; - $lang->msg_leave_member = '会員退会'; - $lang->msg_group_is_null = '登録されたグループがありません。'; - $lang->msg_not_delete_default = '基本項目は削除出来ません。'; - $lang->msg_not_exists_member = '存在しないユーザIDです。'; - $lang->msg_cannot_delete_admin = '管理者IDは削除出来ません。管理者権限を解除した上で削除してみて下さい。'; - $lang->msg_exists_user_id = '既に存在するユーザIDです。他のIDを入力して下さい。'; - $lang->msg_exists_email_address = '既に存在するメールアドレスです。他のメールアドレスを入力して下さい。'; - $lang->msg_exists_nick_name = '既に存在するニックネームです。他のニックネームを入力して下さい。'; - $lang->msg_signup_disabled = '会員登録が制限されています。
    サイト管理者にお問合せ下さい。'; - $lang->msg_already_logged = '既に会員に登録されています。'; - $lang->msg_not_logged = 'ログインしていません。'; - $lang->msg_insert_group_name = 'グループ名を入力して下さい。'; - $lang->msg_check_group = 'グループを選択して下さい。'; - - $lang->msg_not_uploaded_profile_image = 'プロフィールイメージを登録することが出来ません。'; - $lang->msg_not_uploaded_image_name = 'イメージ名を登録することが出来ません。'; - $lang->msg_not_uploaded_image_mark = 'イメージマークを登録することが出来ません。'; - $lang->msg_not_uploaded_group_image_mark = 'グループ用イメージマークの登録が出来ません。'; - - $lang->msg_accept_agreement = '規約に同意しなければなりません。'; - - $lang->msg_user_denied = '入力されたユーザIDは使用が中止されました。'; - $lang->msg_user_not_confirmed = 'まだメールの確認が出来ませんでした。届いたメールをご確認下さい。'; - $lang->msg_user_limited = '入力されたユーザIDは%s以降から使用出来ます。'; - - $lang->about_user_id = 'ユーザIDは3~20の英数文字で構成され、最先頭の文字は英字でなければなりません。'; - $lang->about_password = 'パスワードは6~20文字です。'; - $lang->about_user_name = '名前は2~20文字です。'; - $lang->about_nick_name = 'ニックネームは2~20文字です。'; - $lang->about_email_address = 'メールアドレスはメール認証後、パスワード変更または検索などに使用されます。'; - $lang->about_homepage = 'ホームページがある場合は入力して下さい。'; - $lang->about_blog_url = '運用しているブログがあれば入力して下さい。'; - $lang->about_birthday = '生年月日を入力して下さい。'; - $lang->about_allow_mailing = 'メーリングリストにチェックされていない場合は、全体メールの送信時にメールを受け取りません。'; - $lang->about_denied = 'チェックするとユーザIDを使用出来ないようにします。'; - $lang->about_is_admin = 'チェックすると最高管理者権限が取得出来ます。'; - $lang->about_member_description = '会員に対する管理者のメモ帳です。'; - $lang->about_group = '一つのユーザIDは多数のグループに属することが出来ます。'; - - $lang->about_column_type = '追加する登録フォームのタイプを指定して下さい。'; - $lang->about_column_name = 'テンプレートで使用出来る英文字の名前を入力して下さい(変数名)。'; - $lang->about_column_title = '登録または情報修正・閲覧時に表示されるタイトルです。'; - $lang->about_default_value = 'デフォルトで入力される値を指定することが出来ます。'; - $lang->about_active = '活性化(有効化)にチェックを入れないと正常に表示されません。'; - $lang->about_form_description = '説明欄に入力すると登録時に表示されます。'; - $lang->about_required = 'チェックを入れると会員登録時に必須入力項目として設定されます。'; - - $lang->about_enable_openid = 'OpenIDをサポートする際にチェックを入れます。'; - $lang->about_enable_join = 'チェックを入れないとユーザが会員に登録出来ません。'; - $lang->about_enable_confirm = '登録されたメールアドレスに確認メールを送信し、会員登録を確認します。'; - $lang->about_enable_ssl = 'サーバーでSSLが可能な場合、会員登録/情報変更/ログイン等の個人情報はSSL(https)経由でサーバーにより安全に送信されます。'; - $lang->about_limit_day = '会員登録後一定の期間中、認証制限を行うことが出来ます。'; - $lang->about_limit_date = '指定された期間まで該当ユーザはログインできなくします。'; - $lang->about_after_login_url = 'ログイン後表示されるページのURLを指定出来ます。指定のない場合、現在のページが維持されます。'; - $lang->about_after_logout_url = 'ログアウト後表示されるページのURLを指定出来ます。指定のない場合、現在のページが維持されます。'; - $lang->about_redirect_url = '会員登録後、表示されるページのURLを指定出来ます。指定のない場合は会員登録する前のページに戻ります。'; - $lang->about_agreement = '会員登録規約がない場合は表示されません。'; - - $lang->about_image_name = 'ユーザの名前を文字の代わりにイメージで表示させることが出来ます。'; - $lang->about_image_mark = '使用者の名前の前にマークを付けることが出来ます。'; - $lang->about_group_image_mark = 'ユーザー名の前にグループマークを表示します。'; - $lang->about_profile_image = 'ユーザのプロフィールイメージが使用出来るようにします。'; - $lang->about_signature_max_height = '署名欄の高さのサイズを制限します。 (0 もしくは空の場合は制限なし。)'; - $lang->about_accept_agreement = '登録規約をすべて読んだ上で同意します。'; - - $lang->about_member_default = '会員登録時に基本グループとして設定されます。'; - - $lang->about_openid = 'OpenIDで登録する際、IDとメールなどの基本情報は、このサイトに保存されますが、パスワードと認証のための処理用の情報は該当するOpenID提供サービス側で行われます。'; - $lang->about_openid_leave = 'OpenIDの退会は現在のサイトから会員情報を削除することを意味します。
    退会後ログインすると新しく登録することになり、書き込んだコンテンツに対する権限を維持することが出来ません。'; - $lang->about_find_member_account = 'ID/パスワードは登録時に登録されたメールにてお知らせします。
    登録時に登録したメールアドレスを入力して「IDとパスワードのリマインダー」ボタンをクリックして下さい。
    '; - - $lang->about_member = "会員の作成・修正・削除することが出来、グループの管理、登録フォームの管理などが行える会員管理モジュールです。\nデフォルトで作成されたグループにグループを追加作成して会員管理が出来るようにし、会員登録フォーム管理では基本情報の他、フォームの入力情報を追加することが出来ます。"; - $lang->about_ssl_port = '基本ポート以外のSSLポートを利用する場合、入力して下さい。'; - $lang->add_openid = 'OpenIDの追加'; - - $lang->about_resend_auth_mail = '認証メールが届いてなかった場合、再送信の申請が可能です。
    ※申請の前に、当サイトからメールの受信が出来るように設定して下さい。'; - $lang->no_article = '書き込みがありません。'; - - $lang->find_account_question = '秘密質問'; - $lang->find_account_answer = '비밀번호 찾기 답변'; - $lang->about_find_account_question = '登録した時、入力したIDとメールアドレス、秘密質問の答えで仮のパスワードをもらえる事ができます。'; - - - $lang->find_account_question_items = array('' - ,'他のメールアドレスは?' - ,'私の一番大事なものは?' - ,'私の卒業した小学校は?' - ,'私の生まれた街は?' - ,'私の理想型は?' - ,'お母さんのお名前は?' - ,'お父さんのお名前は?' - ,'大好きな色は?' - ,'大好きな食べ物は?' - ); - - $lang->temp_password = '仮のパスワード'; - $lang->cmd_get_temp_password = '仮のパスワードをもらう'; - $lang->about_get_temp_password = 'ログインして直ちにパスワードを変更して下さい。'; - $lang->msg_question_not_exists = '秘密質問を決めていません。'; - $lang->msg_answer_not_matches = '秘密質問の答えが正しくありません。'; - - $lang->change_password_date = 'パスワード更新周期'; - $lang->about_change_password_date = '設定した更新周期によってパスワード変更のお知らせがもらえます。(0に設定すると非活性化) '; - -?> +member = '会員'; + $lang->member_default_info = '基本情報'; + $lang->member_extend_info = '追加情報'; + $lang->default_group_1 = '準会員'; + $lang->default_group_2 = '正会員'; + $lang->admin_group = '管理グループ'; + $lang->keep_signed = '次回からID入力を省略'; + $lang->remember_user_id = 'ID保存'; + $lang->already_logged = '既にログインされています。'; + $lang->denied_user_id = '使用が禁じられているIDです。'; + $lang->null_user_id = 'ユーザーIDをもう一度入力して下さい。'; + $lang->null_password = 'パスワードを入力して下さい。'; + $lang->invalid_authorization = '認証出来ませんでした。'; + $lang->invalid_user_id= '存在しないユーザIDです。'; + $lang->invalid_password = '無効なパスワードです。'; + $lang->invalid_new_password = '以前のパスワードと同じパスワードを使う事はできません。'; + $lang->allow_mailing = 'メーリングリストに登録'; + $lang->denied = '使用中止'; + $lang->is_admin = '最高管理権限'; + $lang->group = '所属グループ'; + $lang->group_title = 'グループ名'; + $lang->group_srl = 'グループ番号'; + $lang->signature = '署名'; + $lang->profile_image = 'プロフィール写真'; + $lang->profile_image_max_width = '制限横幅サイズ'; + $lang->profile_image_max_height = '制限縦幅サイズ'; + $lang->image_name = 'イメージ名'; + $lang->image_name_max_width = '制限横幅サイズ'; + $lang->image_name_max_height = '制限縦幅サイズ'; + $lang->image_mark = 'イメージマーク'; + $lang->image_mark_max_width = '制限横幅サイズ'; + $lang->image_mark_max_height = '制限縦幅サイズ'; + $lang->group_image_mark = 'グループ用イメージマーク'; + $lang->group_image_mark_max_width = '制限横幅サイズ'; + $lang->group_image_mark_max_height = '制限縦幅サイズ'; + $lang->group_image_mark_order = 'グループ用イメージマークの順番'; + $lang->signature_max_height = '制限署名欄の高さ'; + $lang->enable_openid = 'OpenIDサポート'; + $lang->enable_join = '会員登録を許可する'; + $lang->enable_confirm = 'メール認証機能を使用'; + $lang->enable_ssl = 'SSL使用'; + $lang->security_sign_in = 'セキュア(SSL)'; + $lang->limit_day = '臨時制限期間(日)'; + $lang->limit_date = '制限日'; + $lang->after_login_url = 'ログイン後、表示するページのURL'; + $lang->after_logout_url = 'ログアウト後、表示するページのURL'; + $lang->redirect_url = '会員登録後、表示するページ'; + $lang->agreement = '会員登録規約'; + $lang->accept_agreement = '規約に同意する'; + $lang->member_info = '会員情報'; + $lang->current_password = '現在のパスワード'; + $lang->openid = 'OpenID'; + $lang->allow_message = 'メッセージ許可'; + $lang->allow_message_type = array( + 'Y' => '全て許可', + 'F' => '登録した友達のみ許可', + 'N' => '全て禁止', + ); + $lang->about_allow_message = 'メッセージの許可タイプ及び対象を設定します。'; + $lang->logged_users = '現在ログイン中の会員'; + + $lang->webmaster_name = 'ウェブマスターのお名前'; + $lang->webmaster_email = 'ウェブマスターのメールアドレス'; + + $lang->about_keep_signed = 'ブラウザを閉じてもログイン状態が維持されます。\n\nログイン維持機能を利用すると、次回からログインする必要がなくなります。\n\nただ、インターネットカフェ、学校など公共場所で利用する場合、個人情報が流出する恐れがありますので、必ずログアウトして下さい。'; + $lang->about_keep_warning = 'ブラウザを閉じてもログイン状態が維持されます。\n\nログイン維持機能を利用すると、次回からログインする必要がなくなります。 ただ、インターネットカフェ、学校など公共場所で利用する場合、個人情報が流出する恐れがありますので、必ずログアウトして下さい。'; + $lang->about_webmaster_name = '確認メール、またはサイト管理時に使用されるウェブマスターのお名前を入力して下さい(デフォルト : webmaster)。'; + $lang->about_webmaster_email = 'ウェブマスターのメールアドレスを入力して下さい。'; + + $lang->search_target_list = array( + 'user_id' => 'ユーザーID', + 'user_name' => 'お名前', + 'nick_name' => 'ニックネーム', + 'email_address' => 'メールアドレス', + 'regdate' => '登録日', + 'regdate_more' => '登録日(以上)', + 'regdate_less' => '登録日(以下)', + 'last_login' => '最近のログイン', + 'last_login_more' => '最近ログイン日(以上)', + 'last_login_less' => '最近ログイン日(以下)', + 'extra_vars' => '拡張変数', + ); + + $lang->cmd_login = 'ログイン'; + $lang->cmd_logout = 'ログアウト'; + $lang->cmd_signup = '会員登録'; + $lang->cmd_site_signup = '登録'; + $lang->cmd_modify_member_info = '会員情報修正'; + $lang->cmd_modify_member_password = 'パスワード変更'; + $lang->cmd_view_member_info = '会員情報確認'; + $lang->cmd_leave = '退会'; + $lang->cmd_find_member_account = 'IDとパスワードのリマインダー'; + $lang->cmd_resend_auth_mail = '認証メール再申請'; + + $lang->cmd_member_list = '会員リスト'; + $lang->cmd_module_config = '基本設定'; + $lang->cmd_member_group = 'グループ管理'; + $lang->cmd_send_mail = 'メール送信'; + $lang->cmd_manage_id = '禁止ID管理'; + $lang->cmd_manage_form = '会員登録フォーム管理'; + $lang->cmd_view_own_document = '書き込み履歴'; + $lang->cmd_manage_member_info = '会員情報管理'; + $lang->cmd_trace_document = '書き込みの追跡'; + $lang->cmd_trace_comment = 'コメント追跡'; + $lang->cmd_view_scrapped_document = 'スクラップ'; + $lang->cmd_view_saved_document = '保存ドキュメント'; + $lang->cmd_send_email = 'メール送信'; + + $lang->msg_email_not_exists = '登録されたメールアドレスがありません。'; + + $lang->msg_alreay_scrapped = '既にスクラップされたコンテンツです。'; + + $lang->msg_cart_is_null = '対象を選択して下さい。'; + $lang->msg_checked_file_is_deleted = "%d個の添付ファイルが削除されました。"; + + $lang->msg_find_account_title = '会員IDどパスワードの情報'; + $lang->msg_find_account_info = '登録された会員情報は下記の通りです。'; + $lang->msg_find_account_comment = '下のリンクをクリックすると上のパスワードに変更されます。
    ログインしてからパスワードを変更して下さい。'; + $lang->msg_confirm_account_title = '確認メールです。'; + $lang->msg_confirm_account_info = '作成した会員の情報'; + $lang->msg_confirm_account_comment = '下記のURLをクリックして会員登録手続きを完了して下さい。'; + $lang->msg_auth_mail_sent = "%s 宛に認証情報内容が送信されました。メールを確認して下さい。"; + $lang->msg_confirm_mail_sent = "%s 宛に確認メールを送信しました。メールをご確認下さい。"; + $lang->msg_invalid_auth_key = '正しくないアカウントの認証要求です。
    IDとパスワードの検索を行うか、サイト管理者にアカウント情報をお問い合わせ下さい。'; + $lang->msg_success_authed = '認証が正常に行われ、ログイン出来ました。\n必ず確認メールに記載されたパスワードを利用してお好みのパスワードに変更して下さい。'; + $lang->msg_success_confirmed = '会員登録、有難うございます。'; + + $lang->msg_new_member = '会員追加'; + $lang->msg_update_member = '会員情報修正'; + $lang->msg_leave_member = '会員退会'; + $lang->msg_group_is_null = '登録されたグループがありません。'; + $lang->msg_not_delete_default = '基本項目は削除出来ません。'; + $lang->msg_not_exists_member = '存在しないユーザIDです。'; + $lang->msg_cannot_delete_admin = '管理者IDは削除出来ません。管理者権限を解除した上で削除してみて下さい。'; + $lang->msg_exists_user_id = '既に存在するユーザIDです。他のIDを入力して下さい。'; + $lang->msg_exists_email_address = '既に存在するメールアドレスです。他のメールアドレスを入力して下さい。'; + $lang->msg_exists_nick_name = '既に存在するニックネームです。他のニックネームを入力して下さい。'; + $lang->msg_signup_disabled = '会員登録が制限されています。
    サイト管理者にお問合せ下さい。'; + $lang->msg_already_logged = '既に会員に登録されています。'; + $lang->msg_not_logged = 'ログインしていません。'; + $lang->msg_insert_group_name = 'グループ名を入力して下さい。'; + $lang->msg_check_group = 'グループを選択して下さい。'; + + $lang->msg_not_uploaded_profile_image = 'プロフィールイメージを登録することが出来ません。'; + $lang->msg_not_uploaded_image_name = 'イメージ名を登録することが出来ません。'; + $lang->msg_not_uploaded_image_mark = 'イメージマークを登録することが出来ません。'; + $lang->msg_not_uploaded_group_image_mark = 'グループ用イメージマークの登録が出来ません。'; + + $lang->msg_accept_agreement = '規約に同意しなければなりません。'; + + $lang->msg_user_denied = '入力されたユーザIDは使用が中止されました。'; + $lang->msg_user_not_confirmed = 'まだメールの確認が出来ませんでした。届いたメールをご確認下さい。'; + $lang->msg_user_limited = '入力されたユーザIDは%s以降から使用出来ます。'; + + $lang->about_user_id = 'ユーザIDは3~20の英数文字で構成され、最先頭の文字は英字でなければなりません。'; + $lang->about_password = 'パスワードは6~20文字です。'; + $lang->about_user_name = '名前は2~20文字です。'; + $lang->about_nick_name = 'ニックネームは2~20文字です。'; + $lang->about_email_address = 'メールアドレスはメール認証後、パスワード変更または検索などに使用されます。'; + $lang->about_homepage = 'ホームページがある場合は入力して下さい。'; + $lang->about_blog_url = '運用しているブログがあれば入力して下さい。'; + $lang->about_birthday = '生年月日を入力して下さい。'; + $lang->about_allow_mailing = 'メーリングリストにチェックされていない場合は、全体メールの送信時にメールを受け取りません。'; + $lang->about_denied = 'チェックするとユーザIDを使用出来ないようにします。'; + $lang->about_is_admin = 'チェックすると最高管理者権限が取得出来ます。'; + $lang->about_member_description = '会員に対する管理者のメモ帳です。'; + $lang->about_group = '一つのユーザIDは多数のグループに属することが出来ます。'; + + $lang->about_column_type = '追加する登録フォームのタイプを指定して下さい。'; + $lang->about_column_name = 'テンプレートで使用出来る英文字の名前を入力して下さい(変数名)。'; + $lang->about_column_title = '登録または情報修正・閲覧時に表示されるタイトルです。'; + $lang->about_default_value = 'デフォルトで入力される値を指定することが出来ます。'; + $lang->about_active = '活性化(有効化)にチェックを入れないと正常に表示されません。'; + $lang->about_form_description = '説明欄に入力すると登録時に表示されます。'; + $lang->about_required = 'チェックを入れると会員登録時に必須入力項目として設定されます。'; + + $lang->about_enable_openid = 'OpenIDをサポートする際にチェックを入れます。'; + $lang->about_enable_join = 'チェックを入れないとユーザが会員に登録出来ません。'; + $lang->about_enable_confirm = '登録されたメールアドレスに確認メールを送信し、会員登録を確認します。'; + $lang->about_enable_ssl = 'サーバーでSSLが可能な場合、会員登録/情報変更/ログイン等の個人情報はSSL(https)経由でサーバーにより安全に送信されます。'; + $lang->about_limit_day = '会員登録後一定の期間中、認証制限を行うことが出来ます。'; + $lang->about_limit_date = '指定された期間まで該当ユーザはログインできなくします。'; + $lang->about_after_login_url = 'ログイン後表示されるページのURLを指定出来ます。指定のない場合、現在のページが維持されます。'; + $lang->about_after_logout_url = 'ログアウト後表示されるページのURLを指定出来ます。指定のない場合、現在のページが維持されます。'; + $lang->about_redirect_url = '会員登録後、表示されるページのURLを指定出来ます。指定のない場合は会員登録する前のページに戻ります。'; + $lang->about_agreement = '会員登録規約がない場合は表示されません。'; + + $lang->about_image_name = 'ユーザの名前を文字の代わりにイメージで表示させることが出来ます。'; + $lang->about_image_mark = '使用者の名前の前にマークを付けることが出来ます。'; + $lang->about_group_image_mark = 'ユーザー名の前にグループマークを表示します。'; + $lang->about_profile_image = 'ユーザのプロフィールイメージが使用出来るようにします。'; + $lang->about_signature_max_height = '署名欄の高さのサイズを制限します。 (0 もしくは空の場合は制限なし。)'; + $lang->about_accept_agreement = '登録規約をすべて読んだ上で同意します。'; + + $lang->about_member_default = '会員登録時に基本グループとして設定されます。'; + + $lang->about_openid = 'OpenIDで登録する際、IDとメールなどの基本情報は、このサイトに保存されますが、パスワードと認証のための処理用の情報は該当するOpenID提供サービス側で行われます。'; + $lang->about_openid_leave = 'OpenIDの退会は現在のサイトから会員情報を削除することを意味します。
    退会後ログインすると新しく登録することになり、書き込んだコンテンツに対する権限を維持することが出来ません。'; + $lang->about_find_member_account = 'ID/パスワードは登録時に登録されたメールにてお知らせします。
    登録時に登録したメールアドレスを入力して「IDとパスワードのリマインダー」ボタンをクリックして下さい。
    '; + + $lang->about_member = "会員の作成・修正・削除することが出来、グループの管理、登録フォームの管理などが行える会員管理モジュールです。\nデフォルトで作成されたグループにグループを追加作成して会員管理が出来るようにし、会員登録フォーム管理では基本情報の他、フォームの入力情報を追加することが出来ます。"; + $lang->about_ssl_port = '基本ポート以外のSSLポートを利用する場合、入力して下さい。'; + $lang->add_openid = 'OpenIDの追加'; + + $lang->about_resend_auth_mail = '認証メールが届いてなかった場合、再送信の申請が可能です。
    ※申請の前に、当サイトからメールの受信が出来るように設定して下さい。'; + $lang->no_article = '書き込みがありません。'; + + $lang->find_account_question = '秘密質問'; + $lang->find_account_answer = '비밀번호 찾기 답변'; + $lang->about_find_account_question = '登録した時、入力したIDとメールアドレス、秘密質問の答えで仮のパスワードをもらえる事ができます。'; + + + $lang->find_account_question_items = array('' + ,'他のメールアドレスは?' + ,'私の一番大事なものは?' + ,'私の卒業した小学校は?' + ,'私の生まれた街は?' + ,'私の理想型は?' + ,'お母さんのお名前は?' + ,'お父さんのお名前は?' + ,'大好きな色は?' + ,'大好きな食べ物は?' + ); + + $lang->temp_password = '仮のパスワード'; + $lang->cmd_get_temp_password = '仮のパスワードをもらう'; + $lang->about_get_temp_password = 'ログインして直ちにパスワードを変更して下さい。'; + $lang->msg_question_not_exists = '秘密質問を決めていません。'; + $lang->msg_answer_not_matches = '秘密質問の答えが正しくありません。'; + + $lang->change_password_date = 'パスワード更新周期'; + $lang->about_change_password_date = '設定した更新周期によってパスワード変更のお知らせがもらえます。(0に設定すると非活性化) '; + +?> diff --git a/modules/member/lang/ru.lang.php b/modules/member/lang/ru.lang.php index 6c07e0d87..97518c94e 100644 --- a/modules/member/lang/ru.lang.php +++ b/modules/member/lang/ru.lang.php @@ -1,240 +1,240 @@ -member = 'Пользователь'; - $lang->member_default_info = 'Основная информация'; - $lang->member_extend_info = 'Дополнительная информация'; - $lang->default_group_1 = "Новичок"; - $lang->default_group_2 = "Постоянный участник"; - $lang->admin_group = "Администратор"; - $lang->keep_signed = 'Сохранить логин'; - $lang->remember_user_id = 'Сохранить ID'; - $lang->already_logged = "Вы уже вошли"; - $lang->denied_user_id = 'Извините. Этот ID запрещен'; - $lang->null_user_id = 'Пожалуйста, введите ID'; - $lang->null_password = 'Пожалуйста, введите пароль'; - $lang->invalid_authorization = 'Вы не авторизированы'; - $lang->invalid_user_id= "Указанный ID не существует"; - $lang->invalid_password = 'Неверный пароль'; - $lang->invalid_new_password = '이전 비밀번호와 같습니다.'; - $lang->allow_mailing = 'Получать рассылки'; - $lang->denied = 'Отменить пользование'; - $lang->is_admin = 'Суперадминистративные права'; - $lang->group = 'Группа'; - $lang->group_title = 'Имя группы'; - $lang->group_srl = 'Номер группы'; - $lang->signature = 'Подпись'; - $lang->profile_image = 'Фотография участника'; - $lang->profile_image_max_width = 'Макс. ширина'; - $lang->profile_image_max_height = 'Макс. высота'; - $lang->image_name = 'Имя изображения'; - $lang->image_name_max_width = 'Макс. ширина'; - $lang->image_name_max_height = 'Макс. высота'; - $lang->image_mark = 'Image Mark'; - $lang->image_mark_max_width = 'Макс. ширина'; - $lang->image_mark_max_height = 'Макс. высота'; - $lang->group_image_mark = 'Group Image Mark'; - $lang->group_image_mark_max_width = 'Макс. ширина'; - $lang->group_image_mark_max_height = 'Макс. высота'; - $lang->group_image_mark_order = 'Group Image Mark Order'; - $lang->signature_max_height = 'Max Signature Height'; - $lang->enable_openid = 'Включить открытый ID (OpenID)'; - $lang->enable_join = 'Разрешение на регистрацию'; - $lang->enable_confirm = 'Активация по email'; - $lang->enable_ssl = 'использоватьSSL'; - $lang->security_sign_in = 'Sign in using enhanced security'; - $lang->limit_day = 'Дата временного лимит'; - $lang->limit_date = 'Дата лимита'; - $lang->after_login_url = 'URL после логин'; - $lang->after_logout_url = 'URL после логаут'; - $lang->redirect_url = 'URL после регистрации'; - $lang->agreement = 'Пользовательское соглашение о регистрации'; - $lang->accept_agreement = 'Согласен'; - $lang->member_info = 'Пользовательская информация'; - $lang->current_password = 'Текущий пароль'; - $lang->openid = 'OpenID'; - $lang->allow_message = 'Сообщения разрешены'; - $lang->allow_message_type = array( - 'Y' => 'Разрешено всем', - 'F' => 'Разрешено только зарегистрированным друзьям', - 'N' => 'Запрещено всем', - ); - $lang->about_allow_message = '쪽지 허용 방법 및 대상을 지정할 수 있습니다'; - $lang->logged_users = 'Logged Users'; - - $lang->webmaster_name = "Имя веб-мастера"; - $lang->webmaster_email = "Email веб-мастера"; - - $lang->about_keep_signed = 'Вы будете в состоянии логин, даже при закрытии окна браузера.\n\nЕсли вы пользуетесь общественным компьютером, сделайте выход в целях сохранения персональных данных'; - $lang->about_keep_warning = 'Вы будете в состоянии логин, даже при закрытии окна браузера.Если вы пользуетесь общественным компьютером, сделайте выход в целях сохранения персональных данных'; - $lang->about_webmaster_name = "Пожалуйста, введите имя вебмастера, которое будет использоваться для авторизационных писем или другого адиминистрирования сайта. (по умолчанию : webmaster)"; - $lang->about_webmaster_email = "Пожалуйста, введите email адрес вебмастера."; - - $lang->search_target_list = array( - 'user_id' => 'ID', - 'user_name' => 'Имя', - 'nick_name' => 'Ник', - 'email_address' => 'Email', - 'regdate' => 'Дата регистрации', - 'regdate_more' => 'Дата регистрации(more)', - 'regdate_less' => 'Дата регистрации(less)', - 'last_login' => 'Дата последнего входа', - 'last_login_more' => 'Last Sign in Date (more)', - 'last_login_less' => 'Last Sign in Date (less)', - 'extra_vars' => 'Экстра перем.', - ); - - $lang->cmd_login = 'Вход на сайт'; - $lang->cmd_logout = 'Выход'; - $lang->cmd_signup = 'Регистрация'; - $lang->cmd_site_signup = 'Регистрация'; - $lang->cmd_modify_member_info = 'Изменить информацию пользователя'; - $lang->cmd_modify_member_password = 'Изменить пароль'; - $lang->cmd_view_member_info = 'Личная информация'; - $lang->cmd_leave = 'Удалить аккаунт'; - $lang->cmd_find_member_account = 'Найти ID/пароль'; - $lang->cmd_resend_auth_mail = 'Послать email для авторизации'; - - $lang->cmd_member_list = 'Список пользователей'; - $lang->cmd_module_config = 'Стандартные настройки'; - $lang->cmd_member_group = 'Управление группами'; - $lang->cmd_send_mail = 'Отправить письмо'; - $lang->cmd_manage_id = 'Управление запрещенными ID'; - $lang->cmd_manage_form = 'Управление формой регистрации'; - $lang->cmd_view_own_document = 'Просмотреть написанные записи'; - $lang->cmd_manage_member_info = 'Изменить информацию пользователя'; - $lang->cmd_trace_document = 'Trace Written Articles'; - $lang->cmd_trace_comment = 'Trace Written Comments'; - $lang->cmd_view_scrapped_document = 'Просмотреть Scraps'; - $lang->cmd_view_saved_document = 'Просмотреть сохраненные записи'; - $lang->cmd_send_email = 'Отправить письмо'; - - $lang->msg_email_not_exists = "Email адрес не существует"; - - $lang->msg_alreay_scrapped = 'Эта статья уже в Scraps'; - - $lang->msg_cart_is_null = 'Пожалуйста, выберите назначение'; - $lang->msg_checked_file_is_deleted = '%d вложенные файлы удалены'; - - $lang->msg_find_account_title = 'Информация аккаунта'; - $lang->msg_find_account_info = 'Запрашиваемая информация аккаунта.'; - $lang->msg_find_account_comment = 'Кликните на ссылку ниже и пароль будет изменен на указанный вами.
    Пожалуйста, измените пароль после входа на сайт'; - $lang->msg_confirm_account_title = 'Письмо, подтверждающее регистрацию'; - $lang->msg_confirm_account_info = 'Информация аккаунта при регистрации'; - $lang->msg_confirm_account_comment = 'Подтвердите авторизацию, кликнув на ссылку ниже'; - $lang->msg_auth_mail_sent = 'Письмо с регистрационной информацией отправлено для %s. Пожалуйста, проверьте Вашу почту'; - $lang->msg_confirm_mail_sent = 'Письмо для авторизации отправлено для %s. Пожалуйста, проверьте Вашу почту'; - $lang->msg_invalid_auth_key = 'Неверный запрос на авторизацию.
    Пожалуйста, попытайтеть найти информацию аккаунта или свяжитесь с администратором.'; - $lang->msg_success_authed = 'Ваш аккаунт был успешно авторизован.\nВход произведен. Пожалуйста, измените пароль на Ваш собственный.'; - $lang->msg_success_confirmed = 'Авторизация Вашего аккаунта прошла успешно'; - - $lang->msg_new_member = 'Добавить пользователя'; - $lang->msg_update_member = 'Изменить информацию пользователя'; - $lang->msg_leave_member = 'Удалить аккаунт'; - $lang->msg_group_is_null = 'Зарегистрированной группы нет'; - $lang->msg_not_delete_default = 'Стандартные объекты не могут быть удалены'; - $lang->msg_not_exists_member = "Пользователь не существует"; - $lang->msg_cannot_delete_admin = 'Административный ID не может быть удален. Пожалуйста, удалить ID из администрации и попробуйте снова.'; - $lang->msg_exists_user_id = 'Этот ID уже существует. Пожалуйста, попробуйте другой.'; - $lang->msg_exists_email_address = 'Этот email адрес уже зарегистрирован. Пожалуйста, попробуйте другой.'; - $lang->msg_exists_nick_name = 'Этот ник уже существует. Пожалуйста, попробуйте другой.'; - $lang->msg_signup_disabled = 'Вы не можете зарегистрироваться'; - $lang->msg_already_logged = 'Вы уже зарегистрированы'; - $lang->msg_not_logged = 'Пожалуйста, сначала сделайте вход на сайт'; - $lang->msg_insert_group_name = 'Пожалуйста, введите имя группы'; - $lang->msg_check_group = 'Выберите группу'; - - $lang->msg_not_uploaded_image_name = 'Невозможно зарегистрировать фотографию профиля'; - $lang->msg_not_uploaded_image_name = 'Невозможно зарегистрировать имя фотографии'; - $lang->msg_not_uploaded_image_mark = 'Невозможно зарегистрировать марку фотографии'; - $lang->msg_not_uploaded_group_image_mark = 'Невозможно зарегистрировать марку изображения группы'; - - $lang->msg_accept_agreement = 'Вы должны принять Соглашение'; - - $lang->msg_user_denied = 'Введенный ID запрещен'; - $lang->msg_user_not_confirmed = 'Вы еще не прошли авторизацию, проверьте свою почту'; - $lang->msg_user_limited = 'Введенный ID возможно использовать после %s'; - - $lang->about_user_id = 'Юзер ID должен состоять из 3~20 знаков и содержать алфавит или цифры, начинаясь с алфавитного знака.'; - $lang->about_password = 'Пароль должен состоять из 6~20 знаков'; - $lang->about_user_name = 'Имя должно состоять из 2~20 знаков'; - $lang->about_nick_name = 'Ник должен состоять из 2~20 знаков'; - $lang->about_email_address = 'Email адрес используется для изменения/получения пароля после его авторизации.'; - $lang->about_homepage = 'Пожалуйста, введите, если у Вас есть вебсайт'; - $lang->about_blog_url = 'Пожалуйста, введите, если у Вас есть блог'; - $lang->about_birthday = 'Пожалуйста, введите Вашу дату рождения'; - $lang->about_allow_mailing = "Если Вы не присоединитесь к списку рассылки, Вы не сможете получать почтовые сообщения, направленные Вашей группе"; - $lang->about_denied = 'Запретить ID'; - $lang->about_is_admin = 'Наделить Суперадминистративными правами'; - $lang->about_member_description = "Заметки администратора о пользователях"; - $lang->about_group = 'ID может принадлежать нескольким группам'; - - $lang->about_column_type = 'Пожалуйста, установите формат дополнительной формы регистрации'; - $lang->about_column_name = 'Пожалуйста, введите английское название, которое будет использоваться в шаблоне как переменная'; - $lang->about_column_title = 'Это будет отображено, когда пользователь регистрируется или изменяет/просматривает информацию пользователя'; - $lang->about_default_value = 'Вы можете установить значения по умолчанию'; - $lang->about_active = 'Вам следует выбрать активные объекты для отображения в форме регистрации'; - $lang->about_form_description = 'Если Вы введете описание, оно будет отображено в форме регистрации'; - $lang->about_required = 'Сделать элемент обязательным в форме регистрации'; - - $lang->about_enable_openid = 'Позволить пользователям регистрироваться как OpenID'; - $lang->about_enable_join = 'Позволить пользователям регистрироваться'; - $lang->about_enable_confirm = 'Please check if you want new members to activate their accounts via their emails.'; - $lang->about_enable_ssl = 'Personal information from Sign up/Modify Member Info/Sign in can be sent as SSL(https) mode if server provides SSL service'; - $lang->about_limit_day = 'Вы можете ограничить дату авторизации после регистрации'; - $lang->about_limit_date = 'Пользователь не может войти до указанной даты'; - $lang->about_after_login_url = 'Возможен переход на указанный URL после логин. Если не укажете, то данная страница отобразиться.'; - $lang->about_after_logout_url = 'Возможен переход на указанный URL после выхода. Если не укажете, то данная страница отобразиться.'; - $lang->about_redirect_url = 'Пожалуйста, введите URL, куда пользователи попадут после регистрации. Когда поле пустое, будет установлена страница предшествующая странице регистрации.'; - $lang->about_agreement = 'Регистрационное соглашение будет показано, если оно содержит текст'; - - $lang->about_image_name = 'Возможно использование изображение вместо текста'; - $lang->about_image_mark = 'Возможно использование марки перед именем'; - $lang->about_group_image_mark = 'Возможно использование групповой марки перед именем'; - $lang->about_profile_image = 'Позволить пользователям использовать изображения профиля'; - $lang->about_signature_max_height = 'Возможно установить лимит подписи. (0 Если оставите пустым, то лимита не будет.)'; - $lang->about_accept_agreement = 'Я прочитал соглашение полностью и согласен'; - - $lang->about_member_default = 'При регистрации устанавливается стандартная группа'; - - $lang->about_openid = 'При регистраци как OpenID, основнаая информация (ID или email адрес) будет сохранена на сайте, но операции с паролем и авторизацией будут произведены над текущим OpenID в представленном сервисе'; - $lang->about_openid_leave = 'Удаление аккаунта с OpenID производит удаление Вашей информации пользователя на сайте.
    Если Вы войдете после удаления аккаунта, Вы будете разпознаны как новый пользователь и доступ к написанным Вами ранее записям будет закрыт.'; - $lang->about_find_member_account = 'ID и пароль при регистрации будут посланы Вам по имейл адресу.
    Введите имейл адрес, указанный при регистрации и кликните на кнопку "Поиск ID/пароль".
    '; - - $lang->about_member = "Этот модуль служит для создания/изменения/удаления пользователей, управления их группами и формой регистрации.\nВы можете управлять пользователями посредством создания новых групп, и получить дополнительную информацию, управляя формой регистрации"; - $lang->about_ssl_port = 'Please input if you are using different SSL port with default one'; - $lang->add_openid = 'Добавить OpenID'; - - $lang->about_resend_auth_mail = 'Вы можете получить снова письмо для авторизации, если еще не получили.'; - $lang->no_article = 'Записей нет'; - - $lang->find_account_question = '비밀번호 찾기 질문/답변'; - $lang->find_account_answer = '비밀번호 찾기 답변'; - $lang->about_find_account_question = '가입시 아이디와 이메일, 질문/답변으로 임시 비밀번호를 발급 받을 수 있습니다.'; - /* - $lang->find_account_question_items = array('' - ,'다른 이메일 주소는?' - ,'나의 보물 1호는?' - ,'나의 출신 초등학교는?' - ,'나의 출신 고향은?' - ,'나의 이상형은?' - ,'어머니 성함은?' - ,'아버지 성함은?' - ,'가장 좋아하는 색깔은?' - ,'가장 좋아하는 음식은?' - ); -*/ - $lang->temp_password = '임시 비밀번호'; - $lang->cmd_get_temp_password = '임시 비밀번호 발급'; - $lang->about_get_temp_password = '로그인 후 비밀번호 변경해 주세요.'; - $lang->msg_question_not_exists = '등록한 비밀번호 찾기 질문/답변이 없습니다.'; - $lang->msg_answer_not_matches = '비밀번호 찾기 질문/답변 또는 정보가 올바르지 않습니다.'; - - $lang->change_password_date = '비밀번호 갱신주기'; - $lang->about_change_password_date = '일정기간이 지나면 비밀번호 변경을 하도록 유도하는 기능입니다. (사용하지 않음 : 0 입력) '; - -?> +member = 'Пользователь'; + $lang->member_default_info = 'Основная информация'; + $lang->member_extend_info = 'Дополнительная информация'; + $lang->default_group_1 = "Новичок"; + $lang->default_group_2 = "Постоянный участник"; + $lang->admin_group = "Администратор"; + $lang->keep_signed = 'Сохранить логин'; + $lang->remember_user_id = 'Сохранить ID'; + $lang->already_logged = "Вы уже вошли"; + $lang->denied_user_id = 'Извините. Этот ID запрещен'; + $lang->null_user_id = 'Пожалуйста, введите ID'; + $lang->null_password = 'Пожалуйста, введите пароль'; + $lang->invalid_authorization = 'Вы не авторизированы'; + $lang->invalid_user_id= "Указанный ID не существует"; + $lang->invalid_password = 'Неверный пароль'; + $lang->invalid_new_password = '이전 비밀번호와 같습니다.'; + $lang->allow_mailing = 'Получать рассылки'; + $lang->denied = 'Отменить пользование'; + $lang->is_admin = 'Суперадминистративные права'; + $lang->group = 'Группа'; + $lang->group_title = 'Имя группы'; + $lang->group_srl = 'Номер группы'; + $lang->signature = 'Подпись'; + $lang->profile_image = 'Фотография участника'; + $lang->profile_image_max_width = 'Макс. ширина'; + $lang->profile_image_max_height = 'Макс. высота'; + $lang->image_name = 'Имя изображения'; + $lang->image_name_max_width = 'Макс. ширина'; + $lang->image_name_max_height = 'Макс. высота'; + $lang->image_mark = 'Image Mark'; + $lang->image_mark_max_width = 'Макс. ширина'; + $lang->image_mark_max_height = 'Макс. высота'; + $lang->group_image_mark = 'Group Image Mark'; + $lang->group_image_mark_max_width = 'Макс. ширина'; + $lang->group_image_mark_max_height = 'Макс. высота'; + $lang->group_image_mark_order = 'Group Image Mark Order'; + $lang->signature_max_height = 'Max Signature Height'; + $lang->enable_openid = 'Включить открытый ID (OpenID)'; + $lang->enable_join = 'Разрешение на регистрацию'; + $lang->enable_confirm = 'Активация по email'; + $lang->enable_ssl = 'использоватьSSL'; + $lang->security_sign_in = 'Sign in using enhanced security'; + $lang->limit_day = 'Дата временного лимит'; + $lang->limit_date = 'Дата лимита'; + $lang->after_login_url = 'URL после логин'; + $lang->after_logout_url = 'URL после логаут'; + $lang->redirect_url = 'URL после регистрации'; + $lang->agreement = 'Пользовательское соглашение о регистрации'; + $lang->accept_agreement = 'Согласен'; + $lang->member_info = 'Пользовательская информация'; + $lang->current_password = 'Текущий пароль'; + $lang->openid = 'OpenID'; + $lang->allow_message = 'Сообщения разрешены'; + $lang->allow_message_type = array( + 'Y' => 'Разрешено всем', + 'F' => 'Разрешено только зарегистрированным друзьям', + 'N' => 'Запрещено всем', + ); + $lang->about_allow_message = '쪽지 허용 방법 및 대상을 지정할 수 있습니다'; + $lang->logged_users = 'Logged Users'; + + $lang->webmaster_name = "Имя веб-мастера"; + $lang->webmaster_email = "Email веб-мастера"; + + $lang->about_keep_signed = 'Вы будете в состоянии логин, даже при закрытии окна браузера.\n\nЕсли вы пользуетесь общественным компьютером, сделайте выход в целях сохранения персональных данных'; + $lang->about_keep_warning = 'Вы будете в состоянии логин, даже при закрытии окна браузера.Если вы пользуетесь общественным компьютером, сделайте выход в целях сохранения персональных данных'; + $lang->about_webmaster_name = "Пожалуйста, введите имя вебмастера, которое будет использоваться для авторизационных писем или другого адиминистрирования сайта. (по умолчанию : webmaster)"; + $lang->about_webmaster_email = "Пожалуйста, введите email адрес вебмастера."; + + $lang->search_target_list = array( + 'user_id' => 'ID', + 'user_name' => 'Имя', + 'nick_name' => 'Ник', + 'email_address' => 'Email', + 'regdate' => 'Дата регистрации', + 'regdate_more' => 'Дата регистрации(more)', + 'regdate_less' => 'Дата регистрации(less)', + 'last_login' => 'Дата последнего входа', + 'last_login_more' => 'Last Sign in Date (more)', + 'last_login_less' => 'Last Sign in Date (less)', + 'extra_vars' => 'Экстра перем.', + ); + + $lang->cmd_login = 'Вход на сайт'; + $lang->cmd_logout = 'Выход'; + $lang->cmd_signup = 'Регистрация'; + $lang->cmd_site_signup = 'Регистрация'; + $lang->cmd_modify_member_info = 'Изменить информацию пользователя'; + $lang->cmd_modify_member_password = 'Изменить пароль'; + $lang->cmd_view_member_info = 'Личная информация'; + $lang->cmd_leave = 'Удалить аккаунт'; + $lang->cmd_find_member_account = 'Найти ID/пароль'; + $lang->cmd_resend_auth_mail = 'Послать email для авторизации'; + + $lang->cmd_member_list = 'Список пользователей'; + $lang->cmd_module_config = 'Стандартные настройки'; + $lang->cmd_member_group = 'Управление группами'; + $lang->cmd_send_mail = 'Отправить письмо'; + $lang->cmd_manage_id = 'Управление запрещенными ID'; + $lang->cmd_manage_form = 'Управление формой регистрации'; + $lang->cmd_view_own_document = 'Просмотреть написанные записи'; + $lang->cmd_manage_member_info = 'Изменить информацию пользователя'; + $lang->cmd_trace_document = 'Trace Written Articles'; + $lang->cmd_trace_comment = 'Trace Written Comments'; + $lang->cmd_view_scrapped_document = 'Просмотреть Scraps'; + $lang->cmd_view_saved_document = 'Просмотреть сохраненные записи'; + $lang->cmd_send_email = 'Отправить письмо'; + + $lang->msg_email_not_exists = "Email адрес не существует"; + + $lang->msg_alreay_scrapped = 'Эта статья уже в Scraps'; + + $lang->msg_cart_is_null = 'Пожалуйста, выберите назначение'; + $lang->msg_checked_file_is_deleted = '%d вложенные файлы удалены'; + + $lang->msg_find_account_title = 'Информация аккаунта'; + $lang->msg_find_account_info = 'Запрашиваемая информация аккаунта.'; + $lang->msg_find_account_comment = 'Кликните на ссылку ниже и пароль будет изменен на указанный вами.
    Пожалуйста, измените пароль после входа на сайт'; + $lang->msg_confirm_account_title = 'Письмо, подтверждающее регистрацию'; + $lang->msg_confirm_account_info = 'Информация аккаунта при регистрации'; + $lang->msg_confirm_account_comment = 'Подтвердите авторизацию, кликнув на ссылку ниже'; + $lang->msg_auth_mail_sent = 'Письмо с регистрационной информацией отправлено для %s. Пожалуйста, проверьте Вашу почту'; + $lang->msg_confirm_mail_sent = 'Письмо для авторизации отправлено для %s. Пожалуйста, проверьте Вашу почту'; + $lang->msg_invalid_auth_key = 'Неверный запрос на авторизацию.
    Пожалуйста, попытайтеть найти информацию аккаунта или свяжитесь с администратором.'; + $lang->msg_success_authed = 'Ваш аккаунт был успешно авторизован.\nВход произведен. Пожалуйста, измените пароль на Ваш собственный.'; + $lang->msg_success_confirmed = 'Авторизация Вашего аккаунта прошла успешно'; + + $lang->msg_new_member = 'Добавить пользователя'; + $lang->msg_update_member = 'Изменить информацию пользователя'; + $lang->msg_leave_member = 'Удалить аккаунт'; + $lang->msg_group_is_null = 'Зарегистрированной группы нет'; + $lang->msg_not_delete_default = 'Стандартные объекты не могут быть удалены'; + $lang->msg_not_exists_member = "Пользователь не существует"; + $lang->msg_cannot_delete_admin = 'Административный ID не может быть удален. Пожалуйста, удалить ID из администрации и попробуйте снова.'; + $lang->msg_exists_user_id = 'Этот ID уже существует. Пожалуйста, попробуйте другой.'; + $lang->msg_exists_email_address = 'Этот email адрес уже зарегистрирован. Пожалуйста, попробуйте другой.'; + $lang->msg_exists_nick_name = 'Этот ник уже существует. Пожалуйста, попробуйте другой.'; + $lang->msg_signup_disabled = 'Вы не можете зарегистрироваться'; + $lang->msg_already_logged = 'Вы уже зарегистрированы'; + $lang->msg_not_logged = 'Пожалуйста, сначала сделайте вход на сайт'; + $lang->msg_insert_group_name = 'Пожалуйста, введите имя группы'; + $lang->msg_check_group = 'Выберите группу'; + + $lang->msg_not_uploaded_image_name = 'Невозможно зарегистрировать фотографию профиля'; + $lang->msg_not_uploaded_image_name = 'Невозможно зарегистрировать имя фотографии'; + $lang->msg_not_uploaded_image_mark = 'Невозможно зарегистрировать марку фотографии'; + $lang->msg_not_uploaded_group_image_mark = 'Невозможно зарегистрировать марку изображения группы'; + + $lang->msg_accept_agreement = 'Вы должны принять Соглашение'; + + $lang->msg_user_denied = 'Введенный ID запрещен'; + $lang->msg_user_not_confirmed = 'Вы еще не прошли авторизацию, проверьте свою почту'; + $lang->msg_user_limited = 'Введенный ID возможно использовать после %s'; + + $lang->about_user_id = 'Юзер ID должен состоять из 3~20 знаков и содержать алфавит или цифры, начинаясь с алфавитного знака.'; + $lang->about_password = 'Пароль должен состоять из 6~20 знаков'; + $lang->about_user_name = 'Имя должно состоять из 2~20 знаков'; + $lang->about_nick_name = 'Ник должен состоять из 2~20 знаков'; + $lang->about_email_address = 'Email адрес используется для изменения/получения пароля после его авторизации.'; + $lang->about_homepage = 'Пожалуйста, введите, если у Вас есть вебсайт'; + $lang->about_blog_url = 'Пожалуйста, введите, если у Вас есть блог'; + $lang->about_birthday = 'Пожалуйста, введите Вашу дату рождения'; + $lang->about_allow_mailing = "Если Вы не присоединитесь к списку рассылки, Вы не сможете получать почтовые сообщения, направленные Вашей группе"; + $lang->about_denied = 'Запретить ID'; + $lang->about_is_admin = 'Наделить Суперадминистративными правами'; + $lang->about_member_description = "Заметки администратора о пользователях"; + $lang->about_group = 'ID может принадлежать нескольким группам'; + + $lang->about_column_type = 'Пожалуйста, установите формат дополнительной формы регистрации'; + $lang->about_column_name = 'Пожалуйста, введите английское название, которое будет использоваться в шаблоне как переменная'; + $lang->about_column_title = 'Это будет отображено, когда пользователь регистрируется или изменяет/просматривает информацию пользователя'; + $lang->about_default_value = 'Вы можете установить значения по умолчанию'; + $lang->about_active = 'Вам следует выбрать активные объекты для отображения в форме регистрации'; + $lang->about_form_description = 'Если Вы введете описание, оно будет отображено в форме регистрации'; + $lang->about_required = 'Сделать элемент обязательным в форме регистрации'; + + $lang->about_enable_openid = 'Позволить пользователям регистрироваться как OpenID'; + $lang->about_enable_join = 'Позволить пользователям регистрироваться'; + $lang->about_enable_confirm = 'Please check if you want new members to activate their accounts via their emails.'; + $lang->about_enable_ssl = 'Personal information from Sign up/Modify Member Info/Sign in can be sent as SSL(https) mode if server provides SSL service'; + $lang->about_limit_day = 'Вы можете ограничить дату авторизации после регистрации'; + $lang->about_limit_date = 'Пользователь не может войти до указанной даты'; + $lang->about_after_login_url = 'Возможен переход на указанный URL после логин. Если не укажете, то данная страница отобразиться.'; + $lang->about_after_logout_url = 'Возможен переход на указанный URL после выхода. Если не укажете, то данная страница отобразиться.'; + $lang->about_redirect_url = 'Пожалуйста, введите URL, куда пользователи попадут после регистрации. Когда поле пустое, будет установлена страница предшествующая странице регистрации.'; + $lang->about_agreement = 'Регистрационное соглашение будет показано, если оно содержит текст'; + + $lang->about_image_name = 'Возможно использование изображение вместо текста'; + $lang->about_image_mark = 'Возможно использование марки перед именем'; + $lang->about_group_image_mark = 'Возможно использование групповой марки перед именем'; + $lang->about_profile_image = 'Позволить пользователям использовать изображения профиля'; + $lang->about_signature_max_height = 'Возможно установить лимит подписи. (0 Если оставите пустым, то лимита не будет.)'; + $lang->about_accept_agreement = 'Я прочитал соглашение полностью и согласен'; + + $lang->about_member_default = 'При регистрации устанавливается стандартная группа'; + + $lang->about_openid = 'При регистраци как OpenID, основнаая информация (ID или email адрес) будет сохранена на сайте, но операции с паролем и авторизацией будут произведены над текущим OpenID в представленном сервисе'; + $lang->about_openid_leave = 'Удаление аккаунта с OpenID производит удаление Вашей информации пользователя на сайте.
    Если Вы войдете после удаления аккаунта, Вы будете разпознаны как новый пользователь и доступ к написанным Вами ранее записям будет закрыт.'; + $lang->about_find_member_account = 'ID и пароль при регистрации будут посланы Вам по имейл адресу.
    Введите имейл адрес, указанный при регистрации и кликните на кнопку "Поиск ID/пароль".
    '; + + $lang->about_member = "Этот модуль служит для создания/изменения/удаления пользователей, управления их группами и формой регистрации.\nВы можете управлять пользователями посредством создания новых групп, и получить дополнительную информацию, управляя формой регистрации"; + $lang->about_ssl_port = 'Please input if you are using different SSL port with default one'; + $lang->add_openid = 'Добавить OpenID'; + + $lang->about_resend_auth_mail = 'Вы можете получить снова письмо для авторизации, если еще не получили.'; + $lang->no_article = 'Записей нет'; + + $lang->find_account_question = '비밀번호 찾기 질문/답변'; + $lang->find_account_answer = '비밀번호 찾기 답변'; + $lang->about_find_account_question = '가입시 아이디와 이메일, 질문/답변으로 임시 비밀번호를 발급 받을 수 있습니다.'; + /* + $lang->find_account_question_items = array('' + ,'다른 이메일 주소는?' + ,'나의 보물 1호는?' + ,'나의 출신 초등학교는?' + ,'나의 출신 고향은?' + ,'나의 이상형은?' + ,'어머니 성함은?' + ,'아버지 성함은?' + ,'가장 좋아하는 색깔은?' + ,'가장 좋아하는 음식은?' + ); +*/ + $lang->temp_password = '임시 비밀번호'; + $lang->cmd_get_temp_password = '임시 비밀번호 발급'; + $lang->about_get_temp_password = '로그인 후 비밀번호 변경해 주세요.'; + $lang->msg_question_not_exists = '등록한 비밀번호 찾기 질문/답변이 없습니다.'; + $lang->msg_answer_not_matches = '비밀번호 찾기 질문/답변 또는 정보가 올바르지 않습니다.'; + + $lang->change_password_date = '비밀번호 갱신주기'; + $lang->about_change_password_date = '일정기간이 지나면 비밀번호 변경을 하도록 유도하는 기능입니다. (사용하지 않음 : 0 입력) '; + +?> diff --git a/modules/member/lang/tr.lang.php b/modules/member/lang/tr.lang.php index f66e139ee..4998916eb 100644 --- a/modules/member/lang/tr.lang.php +++ b/modules/member/lang/tr.lang.php @@ -1,235 +1,235 @@ -member = 'Üye'; - $lang->member_default_info = 'Temel Bilgi'; - $lang->member_extend_info = 'Detaylı Bilgi'; - $lang->default_group_1 = "Asil Üye"; - $lang->default_group_2 = "Sıradan Üye"; - $lang->admin_group = "Grup Yönetimi"; - $lang->keep_signed = 'Beni bağlı tut'; - $lang->remember_user_id = 'Kimliği Hatırla'; - $lang->already_logged = "Zaten giriş yaptınız"; - $lang->denied_user_id = 'Yasaklanmış bir kimlik girdiniz.'; - $lang->null_user_id = 'Lütfen kimliğinizi giriniz'; - $lang->null_password = 'Lütfen şifrenizi giriniz'; - $lang->invalid_authorization = 'Hesap etkinleştirilmemiş.'; - $lang->invalid_user_id= "Geçerli olmayan bir kimlik girdiniz"; - $lang->invalid_password = 'Hatalı bir şifre girdiniz'; - $lang->invalid_new_password = 'Yeni şifre, eski şifreyle aynı olmamalı.'; - $lang->allow_mailing = 'Mailleşmeyi Aç'; - $lang->denied = 'Yasaklanmış'; - $lang->is_admin = 'Süperadmin Yetkisi'; - $lang->group = 'Grup'; - $lang->group_title = 'Grup Adı'; - $lang->group_srl = 'Grup Numarası'; - $lang->signature = 'İmza'; - $lang->profile_image = 'Profil Resmi'; - $lang->profile_image_max_width = 'En Yük. Genişlik'; - $lang->profile_image_max_height = 'En Yük. Uzunluk'; - $lang->image_name = 'Resim İsmi'; - $lang->image_name_max_width = 'En Yük. Genişlik'; - $lang->image_name_max_height = 'En Yük. Uzunluk'; - $lang->image_mark = 'Resim İmi'; - $lang->image_mark_max_width = 'En Yük. Genişlik'; - $lang->image_mark_max_height = 'En Yük. Uzunluk'; - $lang->group_image_mark = 'Grup Simgesi'; - $lang->group_image_mark_max_width = 'En Yük. Genişlik'; - $lang->group_image_mark_max_height = 'En Yük. Uzunluk'; - $lang->group_image_mark_order = 'Grup Simge Sıralaması'; - $lang->signature_max_height = 'En Yük. İmza Uzunluğu'; - $lang->enable_openid = 'OpenID Aç'; - $lang->enable_join = 'Yeni Üye Kabul Et'; - $lang->enable_confirm = 'E-posta Doğrulaması'; - $lang->enable_ssl = 'SSL Etkinleştir'; - $lang->security_sign_in = 'Gelişmiş güvenliği kullanarak giriş yap'; - $lang->limit_day = 'Geçici Zaman Sınırı'; - $lang->limit_date = 'Zaman Sınırı'; - $lang->after_login_url = 'Giriş yaptıktan sonraki URL'; - $lang->after_logout_url = 'Çıkış yaptıktan sonraki URL'; - $lang->redirect_url = 'Giriş yaptıktan sonraki URL'; - $lang->agreement = 'Üyelik Sözleşmesi'; - $lang->accept_agreement = 'Kabul Et'; - $lang->member_info = 'Üye Bilgisi'; - $lang->current_password = 'Geçerli Şifre'; - $lang->openid = 'OpenID'; - $lang->allow_message = 'Mesajlaşmaya İzin Ver'; - $lang->allow_message_type = array( - 'Y' => 'Tümüne İzin Ver', - 'F' => 'Arkadaşlara İzin Ver', - 'N' => 'Tümünü Geri Çevir', - ); - $lang->about_allow_message = 'Mesajlaşmaya izin verebilir/reddedebilirsiniz.'; - $lang->logged_users = 'Giriş yapmış Kullanıcılar'; - - $lang->webmaster_name = "Webmaster İsmi"; - $lang->webmaster_email = "Webmaster E-postası"; - - $lang->about_keep_signed = 'Tarayıcıyı kapatsanız da sisteme bağlı kalacaksınız.\n\nEğer ortak bir bilgisayar kullanıyorsanız, kişisel bilgilerinizin gizliliği için bunu önermiyoruz'; - $lang->about_keep_warning = 'Tarayıcıyı kapatsanız da sisteme bağlı kalacaksınız. Eğer ortak bir bilgisayar kullanıyorsanız, kişisel bilgilerinizin gizliliği için bunu önermiyoruz'; - $lang->about_webmaster_name = "Lütfen onay maillerinde veya site yönetiminde kullanılacak webmaster ismini giriniz. (varsayılan : webmaster)"; - $lang->about_webmaster_email = "Lütfen webmaster e-posta adresini giriniz."; - - $lang->search_target_list = array( - 'user_id' => 'Kimlik', - 'user_name' => 'İsim', - 'nick_name' => 'Takma Ad', - 'email_address' => 'E-posta Adresi', - 'regdate' => 'Kayıt Tarihi', - 'regdate_more' => 'Kayıt Tarihi (detaylı)', - 'regdate_less' => 'Kayıt Tarihi (basit)', - 'last_login' => 'Son Giriş Tarihi', - 'last_login_more' => 'Son Giriş Tarihi (detaylı)', - 'last_login_less' => 'Son Giriş Tarihi (basit)', - 'extra_vars' => 'Fazladan Çeş.', - ); - - $lang->cmd_login = 'Giriş Yap'; - $lang->cmd_logout = 'Çıkış Yap'; - $lang->cmd_signup = 'Kaydol'; - $lang->cmd_site_signup = 'Kaydol'; - $lang->cmd_modify_member_info = 'Üye Bilgilerini Düzenle'; - $lang->cmd_modify_member_password = 'Şifreyi Düzenle'; - $lang->cmd_view_member_info = 'Üye Bilgisi'; - $lang->cmd_leave = 'Ayrıl'; - $lang->cmd_find_member_account = 'Hesap Bilgisi Bul'; - $lang->cmd_resend_auth_mail = 'Etkinleştirme Maili Talebinde Bulun'; - - $lang->cmd_member_list = 'Üye Listesi'; - $lang->cmd_module_config = 'Varsayılan Ayar'; - $lang->cmd_member_group = 'Üye Grupları'; - $lang->cmd_send_mail = 'Mail Gönder'; - $lang->cmd_manage_id = 'Yasaklanmış Kimlikler'; - $lang->cmd_manage_form = 'Kayıt Formu'; - $lang->cmd_view_own_document = 'Yazılmış Makaleler'; - $lang->cmd_manage_member_info = 'Üye Bilgisini Yönet'; - $lang->cmd_trace_document = 'Yazılmış Makalelerini Gör'; - $lang->cmd_trace_comment = 'Yazılmış Yorumlarını Gör'; - $lang->cmd_view_scrapped_document = 'Hasarlılar'; - $lang->cmd_view_saved_document = 'Kayıtlı Makaleler'; - $lang->cmd_send_email = 'Mail Gönder'; - - $lang->msg_email_not_exists = "Geçerli olmayan bir e-posta adresi girdiniz"; - - $lang->msg_alreay_scrapped = 'Bu makale zaten hasarlı'; - - $lang->msg_cart_is_null = 'Lütfen hedefi seçiniz'; - $lang->msg_checked_file_is_deleted = '%d isimli ek dosya silindi'; - - $lang->msg_find_account_title = 'Hesap Bilgisi'; - $lang->msg_find_account_info = 'Talep edilen hesap bilgisi.'; - $lang->msg_find_account_comment = 'Şifreniz aşağıdaki linke tıkladığınızda, yukardaki gibi değiştirilecektir.
    Lütfen giriş yaptıktan sonra şifrenizi değiştiriniz.'; - $lang->msg_confirm_account_title = 'Zeroboard XE Hesap Etkinleştirmesi'; - $lang->msg_confirm_account_info = 'Hesap Bilginiz:'; - $lang->msg_confirm_account_comment = 'Hesabınızı etkinleştirmek için takip eden linke tıklayınız.'; - $lang->msg_auth_mail_sent = 'Etknileştirme maili %s adresine gönderildi. Lütfen mailinizi kontrol ediniz.'; - $lang->msg_confirm_mail_sent = '%s adresine etkinleştirme maili gönderdik. Lütfen mailinizi kontrol ediniz.'; - $lang->msg_invalid_auth_key = 'Geçersiz doğrulama talebi.
    Lütfen hesap bilgisini tekrar bulmayı deneyin ya da yöneticilerle iletişime geçin.'; - $lang->msg_success_authed = 'Hesabınız başarıyla etkinleştirildi ve giriş yapıldı.\n Lütfen mailinize gelen şifreyi kullanarak yeni şifreinizi oluşturunuz.'; - $lang->msg_success_confirmed = 'Hesabınız başarıyla etkinleştirildi.'; - - $lang->msg_new_member = 'Üye Ekle'; - $lang->msg_update_member = 'Üye Bilgisini Düzenle'; - $lang->msg_leave_member = 'Ayrıl'; - $lang->msg_group_is_null = 'Grup yok'; - $lang->msg_not_delete_default = 'Varsayılan ögeler silinemez'; - $lang->msg_not_exists_member = "Geçersiz üye"; - $lang->msg_cannot_delete_admin = 'Admin Kimliği silinemez. Kimliği yönetimden çıkartıp tekrar deneyiniz.'; - $lang->msg_exists_user_id = 'Bu kimlik önceden alınmış. Lütfen başka bir kimlik deneyiniz.'; - $lang->msg_exists_email_address = 'Bu mail adresi zaten kullanımda. Lütfen başka bir mail adresi deneyiniz.'; - $lang->msg_exists_nick_name = 'Bu rumuz önceden alınmış. Lütfen başka bir rumuz deneyiniz.'; - $lang->msg_signup_disabled = 'Kayıt olma yetkiniz bulunmamaktadır'; - $lang->msg_already_logged = 'Zaten giriş yapmış bulunmaktasınız'; - $lang->msg_not_logged = 'Lütfen önce giriş yapınız'; - $lang->msg_insert_group_name = 'Lütfen grup ismini giriniz'; - $lang->msg_check_group = 'Lütfen grubu seçiniz'; - - $lang->msg_not_uploaded_profile_image = 'Profil resmi kaydedilemedi'; - $lang->msg_not_uploaded_image_name = 'Resim İsmi kaydedilemedi'; - $lang->msg_not_uploaded_image_mark = 'Resim İmi kaydedilemedi'; - $lang->msg_not_uploaded_group_image_mark = 'Grup resim imi kaydedilemedi'; - - $lang->msg_accept_agreement = 'Sözleşmeyi kabul etmeniz gerekmektedir'; - - $lang->msg_user_denied = 'Yasaklanmış bir Kimlik girdiniz'; - $lang->msg_user_not_confirmed = 'Hesabınız henüz etkinleştirilmemiş. Lütfen mailinizi kontrol ediniz.'; - $lang->msg_user_limited = 'Bu kimlik, %s Tarihinden sonra kullanılabilir'; - - $lang->about_user_id = 'Kullanıcı kimliği 3~20 karakter uzunluğunda ve hem harf hem rakam içermeli ve ilk bir harfle başlamalıdır.'; - $lang->about_password = 'Şifre 6~20 karakter uzunluğunda olmalıdır'; - $lang->about_user_name = 'İsim 2~20 karakter uzunluğunda olmalıdır'; - $lang->about_nick_name = 'Rumuz 2~20 karakter uzunluğunda olmalıdır'; - $lang->about_email_address = 'E-posta adresiniz, e-posta onaylamasından sonra şifre düzenlemesi için kullanılacaktır'; - $lang->about_homepage = 'Lütfen varsa website adresinizi giriniz'; - $lang->about_blog_url = 'Lütfen varsa blog adresinizi giriniz'; - $lang->about_birthday = 'Lütfen doğum tarihinizi giriniz'; - $lang->about_allow_mailing = "Eğer mailleşmeyi etkinleştirmezseniz, grup maillerini alamayacaksınız"; - $lang->about_denied = 'Kimliği yasaklanmak için işaretleyiniz'; - $lang->about_is_admin = 'Superadmin yetkisi vermek için işaretleyiniz'; - $lang->about_member_description = "Yöneticinin kullanıcılar hakkındaki kısa notu"; - $lang->about_group = 'Bir kimlik, birçok grubun üyesi olabilir'; - - $lang->about_column_type = 'Lütfen detaylı kayıt formunun biçimini ayarlayınız'; - $lang->about_column_name = 'Lütfen şablonda kullanılabilecek İngilizce bir isim giriniz. (isim değişkendir)'; - $lang->about_column_title = 'Bu girdi, kayıt veya üye bilgisi düzenleme/görüntüleme formunda gösterilecektir'; - $lang->about_default_value = 'Varsayılan değerleri ayarlayabilirsiniz'; - $lang->about_active = 'Kayıt formunu gösterebilmeniz için, öğeleri etkinleştirdiğinizden emin olun'; - $lang->about_form_description = 'Eğer tanım formuna giriş yaparsanız, bu girdiler giriş formunda görünecektir'; - $lang->about_required = 'Eğer işaretlerseniz, kayıt için gerekli bir öğe olacaktır'; - - $lang->about_enable_openid = 'Eğer OpenID hizmeti sunmak istiyorsanız, lütfen işaretleyiniz'; - $lang->about_enable_join = 'Yeni üyelerin sitenize kayıt yapmalarına izin vermek istiyorsanız lütfen işaretleyiniz'; - $lang->about_enable_confirm = 'Yeni üyelerin hesaplarını e-posta yoluyla etkinleştirmelerini istiyorsanız lütfen işaretleyiniz.'; - $lang->about_enable_ssl = 'Kayıt Ol/Üye Bilgisini Değiştir/Giriş Yap \'daki kişisel bilgiler, eğer sunucunuz da SSL servisi veriyorsa, SSL (https) olarak ayarlanabilir.'; - $lang->about_limit_day = 'Kayıttan sonraki hesap etkinleştirme süresini kısıtlayabilirsiniz'; - $lang->about_limit_date = 'Üyeler, belirlenen tarihe kadar kayıt yapamazlar'; - $lang->about_after_login_url = 'Giriş yaptıktan sonraki gidilecek URL\'yi ayarlayabilirsiniz. Boş bırakmak, geçerli sayfayı bırakır.'; - $lang->about_after_logout_url = 'Çıkış yaptıktan sonraki gidilecek URL\'yi ayarlayabilirsiniz. Boş bırakmak, geçerli sayfa manasına gelir.'; - $lang->about_redirect_url = 'Lütfen üyelerin kayıt olduktan sonraki yönlendirilecekleri URL\'yi giriniz. Bır url girilmediğinde, kayıt sayfasından bir önceki sayfaya yönlendirileceklerdir.'; - $lang->about_agreement = "Eğer boş bırakılmadıysa, Kayıt Sözleşmesi görüntülenecektir"; - - $lang->about_image_name = "Üyeler, metin yerine resim adı kullanabileceklerdir"; - $lang->about_image_mark = "Üyeler, isimlerinin önünde işaret resmi kullanabilirler"; - $lang->about_group_image_mark = "Kullanıcıların isimlerinin önlerinde görüntülenecek grup işaretleri kullanabilirsiniz"; - $lang->about_profile_image = 'Üyeler, profil resmi kullanabilirler'; - $lang->about_accept_agreement = "Anlaşmayı okudum ve kabul ediyorum"; - - $lang->about_member_default = 'Varsayılan grup, kullanıcı kayıt olduktan sonra yönlendirileceği grup olacaktır'; - - $lang->about_openid = 'OpenID olarak giriş yaptığınızda, e-posta adresi ya da kimliğiniz gibi temel bilgi sitede kaydedilecektir, şifre ve onaylama yönetimi işlemi, hizmet veren geçerli OpenID tarafından yapılacaktır'; - $lang->about_openid_leave = 'OpenID\'nin bu bölünmesi, üyelik bilginizin bu siteden silinmesi demektir.
    Bölünmeden sonra giriş yaparsanız, yeni bir üye gibi kabul edilecekseniz, bu yüzden eski makalelerinize ulaşma yetkiniz olmayacaktır.'; - - $lang->about_member = "Üye modülü size; üyeleri oluşturmada, düzenlemede, silmede ve kayıt formunu ya da grupları düzenlemede yardımcı olur.\nÜyeleri yönetmek için özel gruplar ekleyebilir ve aynı zamanda kayıt formunu değiştirerek üyeler hakkında ek bilgi alabilirsiniz."; - $lang->about_find_member_account = 'Hesap bilginiz, kayıt olduğunuz e-posta adresine gönderilecektir.
    Kayıt esnasında kullandığınız e-posta adresini giriniz ve "Hesap Bilgisini Bul" tuşuna basınız.
    '; - $lang->about_ssl_port = 'Eğer varsayılan SSL portundan farklı bir port kullanıyorsanız, lütfen giriniz'; - $lang->add_openid = 'OpenID Ekle'; - - $lang->about_resend_auth_mail = 'Eğer daha önce etkinleştirmediyseniz, etkinleştirme maili talebinde bulunabilirsiniz'; - $lang->no_article = 'Hiçbir makale bulunmuyor'; - - $lang->find_account_question = 'Geçici şifre sorusu'; - $lang->about_find_account_question = 'Kimliğinize, mail adresinize ya da cevapladığınız soruya göre geçici şifre edinebilirsiniz.'; - $lang->find_account_question_items = array('' - ,'Diğer e-posta adresiniz nedir?' - ,'En sevdiğiniz şey?' - ,'Mezun olduğunuz ilkokul?' - ,'Memleketiniz neresi?' - ,'İdeal eşiniz nasıl olmalı?' - ,"Annenizin adı?" - ,"Babanızın adı?" - ,'En sevdiğiniz renk?' - ,'En sevdiğiniz yemek?' - ); - $lang->temp_password = 'Geçici şifre'; - $lang->cmd_get_temp_password = 'Geçici bir şifre edin'; - $lang->about_get_temp_password = 'Giriş yaptıktan sonra şifrenizi değiştirin.'; - $lang->msg_question_not_exists = 'Geçici şifre için güvenlik sorusunu belirlemediniz.'; - $lang->msg_answer_not_matches = 'Soru için verdiğiniz cevap doğru değil.'; - - $lang->change_password_date = 'Şifre yenileme döngüsü'; - $lang->about_change_password_date = 'Eğer buna bir değer biçerseniz, şifrenizi belirli aralıklarla değiştirmeniz konusunda bildirim alacaksanız (eğer 0 olarak ayarlandıysa, devredışıdır)'; -?> +member = 'Üye'; + $lang->member_default_info = 'Temel Bilgi'; + $lang->member_extend_info = 'Detaylı Bilgi'; + $lang->default_group_1 = "Asil Üye"; + $lang->default_group_2 = "Sıradan Üye"; + $lang->admin_group = "Grup Yönetimi"; + $lang->keep_signed = 'Beni bağlı tut'; + $lang->remember_user_id = 'Kimliği Hatırla'; + $lang->already_logged = "Zaten giriş yaptınız"; + $lang->denied_user_id = 'Yasaklanmış bir kimlik girdiniz.'; + $lang->null_user_id = 'Lütfen kimliğinizi giriniz'; + $lang->null_password = 'Lütfen şifrenizi giriniz'; + $lang->invalid_authorization = 'Hesap etkinleştirilmemiş.'; + $lang->invalid_user_id= "Geçerli olmayan bir kimlik girdiniz"; + $lang->invalid_password = 'Hatalı bir şifre girdiniz'; + $lang->invalid_new_password = 'Yeni şifre, eski şifreyle aynı olmamalı.'; + $lang->allow_mailing = 'Mailleşmeyi Aç'; + $lang->denied = 'Yasaklanmış'; + $lang->is_admin = 'Süperadmin Yetkisi'; + $lang->group = 'Grup'; + $lang->group_title = 'Grup Adı'; + $lang->group_srl = 'Grup Numarası'; + $lang->signature = 'İmza'; + $lang->profile_image = 'Profil Resmi'; + $lang->profile_image_max_width = 'En Yük. Genişlik'; + $lang->profile_image_max_height = 'En Yük. Uzunluk'; + $lang->image_name = 'Resim İsmi'; + $lang->image_name_max_width = 'En Yük. Genişlik'; + $lang->image_name_max_height = 'En Yük. Uzunluk'; + $lang->image_mark = 'Resim İmi'; + $lang->image_mark_max_width = 'En Yük. Genişlik'; + $lang->image_mark_max_height = 'En Yük. Uzunluk'; + $lang->group_image_mark = 'Grup Simgesi'; + $lang->group_image_mark_max_width = 'En Yük. Genişlik'; + $lang->group_image_mark_max_height = 'En Yük. Uzunluk'; + $lang->group_image_mark_order = 'Grup Simge Sıralaması'; + $lang->signature_max_height = 'En Yük. İmza Uzunluğu'; + $lang->enable_openid = 'OpenID Aç'; + $lang->enable_join = 'Yeni Üye Kabul Et'; + $lang->enable_confirm = 'E-posta Doğrulaması'; + $lang->enable_ssl = 'SSL Etkinleştir'; + $lang->security_sign_in = 'Gelişmiş güvenliği kullanarak giriş yap'; + $lang->limit_day = 'Geçici Zaman Sınırı'; + $lang->limit_date = 'Zaman Sınırı'; + $lang->after_login_url = 'Giriş yaptıktan sonraki URL'; + $lang->after_logout_url = 'Çıkış yaptıktan sonraki URL'; + $lang->redirect_url = 'Giriş yaptıktan sonraki URL'; + $lang->agreement = 'Üyelik Sözleşmesi'; + $lang->accept_agreement = 'Kabul Et'; + $lang->member_info = 'Üye Bilgisi'; + $lang->current_password = 'Geçerli Şifre'; + $lang->openid = 'OpenID'; + $lang->allow_message = 'Mesajlaşmaya İzin Ver'; + $lang->allow_message_type = array( + 'Y' => 'Tümüne İzin Ver', + 'F' => 'Arkadaşlara İzin Ver', + 'N' => 'Tümünü Geri Çevir', + ); + $lang->about_allow_message = 'Mesajlaşmaya izin verebilir/reddedebilirsiniz.'; + $lang->logged_users = 'Giriş yapmış Kullanıcılar'; + + $lang->webmaster_name = "Webmaster İsmi"; + $lang->webmaster_email = "Webmaster E-postası"; + + $lang->about_keep_signed = 'Tarayıcıyı kapatsanız da sisteme bağlı kalacaksınız.\n\nEğer ortak bir bilgisayar kullanıyorsanız, kişisel bilgilerinizin gizliliği için bunu önermiyoruz'; + $lang->about_keep_warning = 'Tarayıcıyı kapatsanız da sisteme bağlı kalacaksınız. Eğer ortak bir bilgisayar kullanıyorsanız, kişisel bilgilerinizin gizliliği için bunu önermiyoruz'; + $lang->about_webmaster_name = "Lütfen onay maillerinde veya site yönetiminde kullanılacak webmaster ismini giriniz. (varsayılan : webmaster)"; + $lang->about_webmaster_email = "Lütfen webmaster e-posta adresini giriniz."; + + $lang->search_target_list = array( + 'user_id' => 'Kimlik', + 'user_name' => 'İsim', + 'nick_name' => 'Takma Ad', + 'email_address' => 'E-posta Adresi', + 'regdate' => 'Kayıt Tarihi', + 'regdate_more' => 'Kayıt Tarihi (detaylı)', + 'regdate_less' => 'Kayıt Tarihi (basit)', + 'last_login' => 'Son Giriş Tarihi', + 'last_login_more' => 'Son Giriş Tarihi (detaylı)', + 'last_login_less' => 'Son Giriş Tarihi (basit)', + 'extra_vars' => 'Fazladan Çeş.', + ); + + $lang->cmd_login = 'Giriş Yap'; + $lang->cmd_logout = 'Çıkış Yap'; + $lang->cmd_signup = 'Kaydol'; + $lang->cmd_site_signup = 'Kaydol'; + $lang->cmd_modify_member_info = 'Üye Bilgilerini Düzenle'; + $lang->cmd_modify_member_password = 'Şifreyi Düzenle'; + $lang->cmd_view_member_info = 'Üye Bilgisi'; + $lang->cmd_leave = 'Ayrıl'; + $lang->cmd_find_member_account = 'Hesap Bilgisi Bul'; + $lang->cmd_resend_auth_mail = 'Etkinleştirme Maili Talebinde Bulun'; + + $lang->cmd_member_list = 'Üye Listesi'; + $lang->cmd_module_config = 'Varsayılan Ayar'; + $lang->cmd_member_group = 'Üye Grupları'; + $lang->cmd_send_mail = 'Mail Gönder'; + $lang->cmd_manage_id = 'Yasaklanmış Kimlikler'; + $lang->cmd_manage_form = 'Kayıt Formu'; + $lang->cmd_view_own_document = 'Yazılmış Makaleler'; + $lang->cmd_manage_member_info = 'Üye Bilgisini Yönet'; + $lang->cmd_trace_document = 'Yazılmış Makalelerini Gör'; + $lang->cmd_trace_comment = 'Yazılmış Yorumlarını Gör'; + $lang->cmd_view_scrapped_document = 'Hasarlılar'; + $lang->cmd_view_saved_document = 'Kayıtlı Makaleler'; + $lang->cmd_send_email = 'Mail Gönder'; + + $lang->msg_email_not_exists = "Geçerli olmayan bir e-posta adresi girdiniz"; + + $lang->msg_alreay_scrapped = 'Bu makale zaten hasarlı'; + + $lang->msg_cart_is_null = 'Lütfen hedefi seçiniz'; + $lang->msg_checked_file_is_deleted = '%d isimli ek dosya silindi'; + + $lang->msg_find_account_title = 'Hesap Bilgisi'; + $lang->msg_find_account_info = 'Talep edilen hesap bilgisi.'; + $lang->msg_find_account_comment = 'Şifreniz aşağıdaki linke tıkladığınızda, yukardaki gibi değiştirilecektir.
    Lütfen giriş yaptıktan sonra şifrenizi değiştiriniz.'; + $lang->msg_confirm_account_title = 'Zeroboard XE Hesap Etkinleştirmesi'; + $lang->msg_confirm_account_info = 'Hesap Bilginiz:'; + $lang->msg_confirm_account_comment = 'Hesabınızı etkinleştirmek için takip eden linke tıklayınız.'; + $lang->msg_auth_mail_sent = 'Etknileştirme maili %s adresine gönderildi. Lütfen mailinizi kontrol ediniz.'; + $lang->msg_confirm_mail_sent = '%s adresine etkinleştirme maili gönderdik. Lütfen mailinizi kontrol ediniz.'; + $lang->msg_invalid_auth_key = 'Geçersiz doğrulama talebi.
    Lütfen hesap bilgisini tekrar bulmayı deneyin ya da yöneticilerle iletişime geçin.'; + $lang->msg_success_authed = 'Hesabınız başarıyla etkinleştirildi ve giriş yapıldı.\n Lütfen mailinize gelen şifreyi kullanarak yeni şifreinizi oluşturunuz.'; + $lang->msg_success_confirmed = 'Hesabınız başarıyla etkinleştirildi.'; + + $lang->msg_new_member = 'Üye Ekle'; + $lang->msg_update_member = 'Üye Bilgisini Düzenle'; + $lang->msg_leave_member = 'Ayrıl'; + $lang->msg_group_is_null = 'Grup yok'; + $lang->msg_not_delete_default = 'Varsayılan ögeler silinemez'; + $lang->msg_not_exists_member = "Geçersiz üye"; + $lang->msg_cannot_delete_admin = 'Admin Kimliği silinemez. Kimliği yönetimden çıkartıp tekrar deneyiniz.'; + $lang->msg_exists_user_id = 'Bu kimlik önceden alınmış. Lütfen başka bir kimlik deneyiniz.'; + $lang->msg_exists_email_address = 'Bu mail adresi zaten kullanımda. Lütfen başka bir mail adresi deneyiniz.'; + $lang->msg_exists_nick_name = 'Bu rumuz önceden alınmış. Lütfen başka bir rumuz deneyiniz.'; + $lang->msg_signup_disabled = 'Kayıt olma yetkiniz bulunmamaktadır'; + $lang->msg_already_logged = 'Zaten giriş yapmış bulunmaktasınız'; + $lang->msg_not_logged = 'Lütfen önce giriş yapınız'; + $lang->msg_insert_group_name = 'Lütfen grup ismini giriniz'; + $lang->msg_check_group = 'Lütfen grubu seçiniz'; + + $lang->msg_not_uploaded_profile_image = 'Profil resmi kaydedilemedi'; + $lang->msg_not_uploaded_image_name = 'Resim İsmi kaydedilemedi'; + $lang->msg_not_uploaded_image_mark = 'Resim İmi kaydedilemedi'; + $lang->msg_not_uploaded_group_image_mark = 'Grup resim imi kaydedilemedi'; + + $lang->msg_accept_agreement = 'Sözleşmeyi kabul etmeniz gerekmektedir'; + + $lang->msg_user_denied = 'Yasaklanmış bir Kimlik girdiniz'; + $lang->msg_user_not_confirmed = 'Hesabınız henüz etkinleştirilmemiş. Lütfen mailinizi kontrol ediniz.'; + $lang->msg_user_limited = 'Bu kimlik, %s Tarihinden sonra kullanılabilir'; + + $lang->about_user_id = 'Kullanıcı kimliği 3~20 karakter uzunluğunda ve hem harf hem rakam içermeli ve ilk bir harfle başlamalıdır.'; + $lang->about_password = 'Şifre 6~20 karakter uzunluğunda olmalıdır'; + $lang->about_user_name = 'İsim 2~20 karakter uzunluğunda olmalıdır'; + $lang->about_nick_name = 'Rumuz 2~20 karakter uzunluğunda olmalıdır'; + $lang->about_email_address = 'E-posta adresiniz, e-posta onaylamasından sonra şifre düzenlemesi için kullanılacaktır'; + $lang->about_homepage = 'Lütfen varsa website adresinizi giriniz'; + $lang->about_blog_url = 'Lütfen varsa blog adresinizi giriniz'; + $lang->about_birthday = 'Lütfen doğum tarihinizi giriniz'; + $lang->about_allow_mailing = "Eğer mailleşmeyi etkinleştirmezseniz, grup maillerini alamayacaksınız"; + $lang->about_denied = 'Kimliği yasaklanmak için işaretleyiniz'; + $lang->about_is_admin = 'Superadmin yetkisi vermek için işaretleyiniz'; + $lang->about_member_description = "Yöneticinin kullanıcılar hakkındaki kısa notu"; + $lang->about_group = 'Bir kimlik, birçok grubun üyesi olabilir'; + + $lang->about_column_type = 'Lütfen detaylı kayıt formunun biçimini ayarlayınız'; + $lang->about_column_name = 'Lütfen şablonda kullanılabilecek İngilizce bir isim giriniz. (isim değişkendir)'; + $lang->about_column_title = 'Bu girdi, kayıt veya üye bilgisi düzenleme/görüntüleme formunda gösterilecektir'; + $lang->about_default_value = 'Varsayılan değerleri ayarlayabilirsiniz'; + $lang->about_active = 'Kayıt formunu gösterebilmeniz için, öğeleri etkinleştirdiğinizden emin olun'; + $lang->about_form_description = 'Eğer tanım formuna giriş yaparsanız, bu girdiler giriş formunda görünecektir'; + $lang->about_required = 'Eğer işaretlerseniz, kayıt için gerekli bir öğe olacaktır'; + + $lang->about_enable_openid = 'Eğer OpenID hizmeti sunmak istiyorsanız, lütfen işaretleyiniz'; + $lang->about_enable_join = 'Yeni üyelerin sitenize kayıt yapmalarına izin vermek istiyorsanız lütfen işaretleyiniz'; + $lang->about_enable_confirm = 'Yeni üyelerin hesaplarını e-posta yoluyla etkinleştirmelerini istiyorsanız lütfen işaretleyiniz.'; + $lang->about_enable_ssl = 'Kayıt Ol/Üye Bilgisini Değiştir/Giriş Yap \'daki kişisel bilgiler, eğer sunucunuz da SSL servisi veriyorsa, SSL (https) olarak ayarlanabilir.'; + $lang->about_limit_day = 'Kayıttan sonraki hesap etkinleştirme süresini kısıtlayabilirsiniz'; + $lang->about_limit_date = 'Üyeler, belirlenen tarihe kadar kayıt yapamazlar'; + $lang->about_after_login_url = 'Giriş yaptıktan sonraki gidilecek URL\'yi ayarlayabilirsiniz. Boş bırakmak, geçerli sayfayı bırakır.'; + $lang->about_after_logout_url = 'Çıkış yaptıktan sonraki gidilecek URL\'yi ayarlayabilirsiniz. Boş bırakmak, geçerli sayfa manasına gelir.'; + $lang->about_redirect_url = 'Lütfen üyelerin kayıt olduktan sonraki yönlendirilecekleri URL\'yi giriniz. Bır url girilmediğinde, kayıt sayfasından bir önceki sayfaya yönlendirileceklerdir.'; + $lang->about_agreement = "Eğer boş bırakılmadıysa, Kayıt Sözleşmesi görüntülenecektir"; + + $lang->about_image_name = "Üyeler, metin yerine resim adı kullanabileceklerdir"; + $lang->about_image_mark = "Üyeler, isimlerinin önünde işaret resmi kullanabilirler"; + $lang->about_group_image_mark = "Kullanıcıların isimlerinin önlerinde görüntülenecek grup işaretleri kullanabilirsiniz"; + $lang->about_profile_image = 'Üyeler, profil resmi kullanabilirler'; + $lang->about_accept_agreement = "Anlaşmayı okudum ve kabul ediyorum"; + + $lang->about_member_default = 'Varsayılan grup, kullanıcı kayıt olduktan sonra yönlendirileceği grup olacaktır'; + + $lang->about_openid = 'OpenID olarak giriş yaptığınızda, e-posta adresi ya da kimliğiniz gibi temel bilgi sitede kaydedilecektir, şifre ve onaylama yönetimi işlemi, hizmet veren geçerli OpenID tarafından yapılacaktır'; + $lang->about_openid_leave = 'OpenID\'nin bu bölünmesi, üyelik bilginizin bu siteden silinmesi demektir.
    Bölünmeden sonra giriş yaparsanız, yeni bir üye gibi kabul edilecekseniz, bu yüzden eski makalelerinize ulaşma yetkiniz olmayacaktır.'; + + $lang->about_member = "Üye modülü size; üyeleri oluşturmada, düzenlemede, silmede ve kayıt formunu ya da grupları düzenlemede yardımcı olur.\nÜyeleri yönetmek için özel gruplar ekleyebilir ve aynı zamanda kayıt formunu değiştirerek üyeler hakkında ek bilgi alabilirsiniz."; + $lang->about_find_member_account = 'Hesap bilginiz, kayıt olduğunuz e-posta adresine gönderilecektir.
    Kayıt esnasında kullandığınız e-posta adresini giriniz ve "Hesap Bilgisini Bul" tuşuna basınız.
    '; + $lang->about_ssl_port = 'Eğer varsayılan SSL portundan farklı bir port kullanıyorsanız, lütfen giriniz'; + $lang->add_openid = 'OpenID Ekle'; + + $lang->about_resend_auth_mail = 'Eğer daha önce etkinleştirmediyseniz, etkinleştirme maili talebinde bulunabilirsiniz'; + $lang->no_article = 'Hiçbir makale bulunmuyor'; + + $lang->find_account_question = 'Geçici şifre sorusu'; + $lang->about_find_account_question = 'Kimliğinize, mail adresinize ya da cevapladığınız soruya göre geçici şifre edinebilirsiniz.'; + $lang->find_account_question_items = array('' + ,'Diğer e-posta adresiniz nedir?' + ,'En sevdiğiniz şey?' + ,'Mezun olduğunuz ilkokul?' + ,'Memleketiniz neresi?' + ,'İdeal eşiniz nasıl olmalı?' + ,"Annenizin adı?" + ,"Babanızın adı?" + ,'En sevdiğiniz renk?' + ,'En sevdiğiniz yemek?' + ); + $lang->temp_password = 'Geçici şifre'; + $lang->cmd_get_temp_password = 'Geçici bir şifre edin'; + $lang->about_get_temp_password = 'Giriş yaptıktan sonra şifrenizi değiştirin.'; + $lang->msg_question_not_exists = 'Geçici şifre için güvenlik sorusunu belirlemediniz.'; + $lang->msg_answer_not_matches = 'Soru için verdiğiniz cevap doğru değil.'; + + $lang->change_password_date = 'Şifre yenileme döngüsü'; + $lang->about_change_password_date = 'Eğer buna bir değer biçerseniz, şifrenizi belirli aralıklarla değiştirmeniz konusunda bildirim alacaksanız (eğer 0 olarak ayarlandıysa, devredışıdır)'; +?> diff --git a/modules/member/lang/vi.lang.php b/modules/member/lang/vi.lang.php index ba26ee270..edadad6d6 100644 --- a/modules/member/lang/vi.lang.php +++ b/modules/member/lang/vi.lang.php @@ -1,240 +1,240 @@ -member = 'Thành viên'; - $lang->member_default_info = 'Thông tin cá nhân'; - $lang->member_extend_info = 'Thông tin bổ xung'; - $lang->default_group_1 = "Member"; - $lang->default_group_2 = "Moderator"; - $lang->admin_group = "Administrator"; - $lang->keep_signed = 'Nhớ thông tin đăng nhập'; - $lang->remember_user_id = 'Lưu tên sử dụng'; - $lang->already_logged = "Bạn đã đăng nhập"; - $lang->denied_user_id = 'ID đăng nhập của bạn đã bị cấm sử dụng.'; - $lang->null_user_id = 'Xin vui lòng nhập ID đăng nhập'; - $lang->null_password = 'Xin vui lòng nhập mật khẩu'; - $lang->invalid_authorization = 'Tài khoản đăng nhập không đúng.'; - $lang->invalid_user_id= "Bạn đã nhập sai tên sử dụng"; - $lang->allow_mailing = 'Đồng ý nhận Email'; - $lang->invalid_password = 'Mật khẩu không đúng'; - $lang->invalid_new_password = '이전 비밀번호와 같습니다.'; - $lang->denied = 'Bị từ chối'; - $lang->is_admin = 'Toàn quyền Administrator'; - $lang->group = 'Phân nhóm'; - $lang->group_title = 'Tên nhóm'; - $lang->group_srl = 'Nhóm số'; - $lang->signature = 'Chữ kí'; - $lang->profile_image = 'Hình đại diện'; - $lang->profile_image_max_width = 'Chiểu rộng tối đa'; - $lang->profile_image_max_height = 'Chiều cao tối đa  '; - $lang->image_name = 'Hình thay thế tên hiển thị'; - $lang->image_name_max_width = 'Chiểu rộng tối đa'; - $lang->image_name_max_height = 'Chiều cao tối đa  '; - $lang->image_mark = 'Hình đánh dấu'; - $lang->image_mark_max_width = 'Chiểu rộng tối đa'; - $lang->image_mark_max_height = 'Chiều cao tối đa  '; - $lang->group_image_mark = 'Hình đại diện nhóm'; - $lang->group_image_mark_max_width = 'Chiểu rộng tối đa'; - $lang->group_image_mark_max_height = 'Chiều cao tối đa  '; - $lang->group_image_mark_order = 'Thứ tự hình đại diện nhóm'; - $lang->signature_max_height = 'Chiều cao lớn nhất của chữ kí'; - $lang->enable_openid = 'Kích hoạt OpenID'; - $lang->enable_join = 'Đồng ý đăng kí thành viên'; - $lang->enable_confirm = 'Xác nhận qua Email'; - $lang->enable_ssl = 'Mở SSL'; - $lang->security_sign_in = 'Bảo mật đăng nhập'; - $lang->limit_day = 'Hạn sử dụng'; - $lang->limit_date = 'Ngày giới hạn'; - $lang->after_login_url = 'URL sau khi đăng nhập'; - $lang->after_logout_url = 'URL sau khi thoát'; - $lang->redirect_url = 'URL sau khi đăng kí'; - $lang->agreement = 'Quy định sử dụng'; - $lang->accept_agreement = 'Đồng ý'; - $lang->member_info = 'Thông tin cá nhân'; - $lang->current_password = 'Mật khẩu hiện tại'; - $lang->openid = 'OpenID'; - $lang->allow_message = 'Nhận tin nhắn'; - $lang->allow_message_type = array( - 'Y' => 'Tất cả', - 'F' => 'Chỉ của bạn bè', - 'N' => 'Từ chối tất cả', - ); - $lang->about_allow_message = 'Bạn có thể chấp nhận hoặc từ chối những tin nhắn.'; - $lang->logged_users = 'Thành viên đăng nhập'; - - $lang->webmaster_name = "Tên Webmaster"; - $lang->webmaster_email = " Email Webmaster"; - - $lang->about_keep_signed = 'Mặc dù tắt trình duyệt nhưng thông tin đăng nhập của bạn vẫn được lưu lại trên máy tính này.\n\nNếu bạn sử dụng máy tính dùng chung, người khác cũng có thể đăng nhập dưới tên truy cập của bạn. Vì vậy chức năng này không nên sử dụng nếu máy tính này không phải của riêng bạn!'; - $lang->about_keep_warning = 'Mặc dù tắt trình duyệt nhưng thông tin đăng nhập của bạn vẫn được lưu lại trên máy tính này. Nếu bạn sử dụng máy tính dùng chung, người khác cũng có thể đăng nhập dưới tên truy cập của bạn. Vì vậy chức năng này không nên sử dụng nếu máy tính này không phải của riêng bạn!'; - $lang->about_webmaster_name = "Xin hãy nhập tên của Webmaster để nhận Email và quản lý. (Mặc định: webmaster)"; - $lang->about_webmaster_email = "Xin hãy nhập Email của Webmaster."; - - $lang->search_target_list = array( - 'user_id' => 'ID đăng nhập', - 'user_name' => 'Tên thật', - 'nick_name' => 'Nickname', - 'email_address' => 'Địa chỉ Email', - 'regdate' => 'Ngày đăng kí', - 'regdate_more' => 'Ngày đăng kí nhiều nhất', - 'regdate_less' => 'Ngày đăng kí ít nhất', - 'last_login' => 'Lần cuối đăng nhập', - 'last_login_more' => 'Đăng nhập nhiều nhất', - 'last_login_less' => 'Đăng nhập ít nhất', - 'extra_vars' => 'Thông tin bổ xung', - ); - - $lang->cmd_login = 'Đăng nhập'; - $lang->cmd_logout = 'Thoát'; - $lang->cmd_signup = 'Đăng kí'; - $lang->cmd_site_signup = 'Đăng kí'; - $lang->cmd_modify_member_info = 'Sửa đổi thông tin cá nhân'; - $lang->cmd_modify_member_password = 'Sửa đổi mật khẩu'; - $lang->cmd_view_member_info = 'Xem thông tin cá nhân'; - $lang->cmd_leave = 'Từ bỏ'; - $lang->cmd_find_member_account = 'Lấy lại thông tin'; - $lang->cmd_resend_auth_mail = 'Xác nhận lại Email'; - - $lang->cmd_member_list = 'Danh sách thành viên'; - $lang->cmd_module_config = 'Thiết lập mặc định'; - $lang->cmd_member_group = 'Quản lý nhóm'; - $lang->cmd_send_mail = 'Gửi Email'; - $lang->cmd_manage_id = 'Tên sử dụng cấm đăng kí'; - $lang->cmd_manage_form = 'Quản lý mẫu đăng kí'; - $lang->cmd_view_own_document = 'Bài gửi'; - $lang->cmd_manage_member_info = 'Quản lý thông tin thành viên'; - $lang->cmd_trace_document = 'Theo dõi chủ đề'; - $lang->cmd_trace_comment = 'Theo dõi thảo luận'; - $lang->cmd_view_scrapped_document = 'Phân loại'; - $lang->cmd_view_saved_document = 'Bài viết đã lưu'; - $lang->cmd_send_email = 'Gửi eMail'; - - $lang->msg_email_not_exists = "Bạn đã nhập sai Email"; - - $lang->msg_alreay_scrapped = 'Bài viết đã được phân loại.'; - - $lang->msg_cart_is_null = 'Xin vui lòng lựa chọn vị trí'; - $lang->msg_checked_file_is_deleted = '%d đính kèm đã được xóa.'; - - $lang->msg_find_account_title = 'Thông tin đăng kí tại Website http;//4all.kr'; - $lang->msg_find_account_info = 'Thông tin tài khoản.'; - $lang->msg_find_account_comment = 'Mật khẩu sẽ thay đổi khi bạn bấm vào đường Link này.
    Xin vui lòng thay đổi mật khẩu sau khi đăng nhập!'; - $lang->msg_confirm_account_title = 'Thông tin đăng kí thành viên tại Website http://4all.kr'; - $lang->msg_confirm_account_info = 'Đây là thông tin bạn đã đăng kí tại Website http://4all.kr:'; - $lang->msg_confirm_account_comment = 'Bấm vào đường Link này để hoàn tất việc đăng kí.'; - $lang->msg_auth_mail_sent = 'Email xác nhận đã được gửi đến %s. Xin vui lòng kiểm tra Inbox hoặc Bulk mail của bạn!'; - $lang->msg_confirm_mail_sent = 'Chúng tôi đã gửi Email xác nhận đến %s. Xin vui lòng bấm vào Link đi kèm trong Email để hoàn tất việc đăng kí!'; - $lang->msg_invalid_auth_key = 'Xác nhận không hợp lệ.
    Xin vui lòng kiểm tra lại hoặc liên hệ với Webmaster để được hỗ trợ!'; - $lang->msg_success_authed = 'Tài khoản của bạn đã được xác nhận.\n Xin vui lòng thay đổi mật khẩu khác với mật khẩu trong Email và dễ nhớ hơn!'; - $lang->msg_success_confirmed = 'Đã xác nhận thành công.
    Xin cảm ơn đã tham gia cùng chúng tôi!'; - - $lang->msg_new_member = 'Thêm thành viên'; - $lang->msg_update_member = 'Sửa đổi thông tin thành viên'; - $lang->msg_leave_member = 'Loại bỏ'; - $lang->msg_group_is_null = 'Không đăng kí vào nhóm nào'; - $lang->msg_not_delete_default = 'Mặc định không thể xóa'; - $lang->msg_not_exists_member = "Thành viên không hợp lệ"; - $lang->msg_cannot_delete_admin = 'Admin ID không thể xóa!'; - $lang->msg_exists_user_id = 'Tên sử dụng này đã có người dùng. Xin vui lòng thử lại với tên truy cập khác!'; - $lang->msg_exists_email_address = 'Email này đã có người sử dụng. Xin vui lòng thử lại với Email khác!'; - $lang->msg_exists_nick_name = 'Nickname này đã có người sử dụng. Xin vui lòng thử lại với Nickname khác!'; - $lang->msg_signup_disabled = 'Bạn không thể đăng kí.'; - $lang->msg_already_logged = 'Bạn đã đăng kí rồi.'; - $lang->msg_not_logged = 'Xin vui lòng đăng nhập trước!'; - $lang->msg_insert_group_name = 'Xin vui lòng nhập tên của nhóm!'; - $lang->msg_check_group = 'Xin vui lòng chọn nhóm!'; - - $lang->msg_not_uploaded_profile_image = 'Không thể đăng kí được hình đại diện.'; - $lang->msg_not_uploaded_image_name = 'Không thể gửi được hình ảnh thay Nickname.'; - $lang->msg_not_uploaded_image_mark = 'Hình đánh dấu đã không được gửi.'; - $lang->msg_not_uploaded_group_image_mark = 'Hình thay thế nhóm đã không được gửi'; - - $lang->msg_accept_agreement = 'Bạn phải đồng ý với điều khoản sử dụng của chúng tôi.'; - - $lang->msg_user_denied = 'Tên sử dụng này đã bị cấm đăng kí.'; - $lang->msg_user_not_confirmed = 'Bạn chưa xác nhận việc đăng kí. Xin vui lòng kiểm tra Email!'; - $lang->msg_user_limited = 'Bạn được phép sử dụng đến ngày %s'; - - $lang->about_user_id = 'Độ dài của tên truy cập được giới hạn từ 3 đến 20 kí tự gồm a-z và các số.'; - $lang->about_password = 'Độ dài mật khẩu giới hạn từ 6 đến 20 kí tự.'; - $lang->about_user_name = 'Giới hạn của tên từ 2 đến 20 kí tự.'; - $lang->about_nick_name = 'Độ dài của Nickname từ 2 đến 20 kí tự.'; - $lang->about_email_address = 'Email được sử dụng để lên lạc, xác nhận và lấy lại mật khẩu nếu lỡ quên.'; - $lang->about_homepage = 'Nếu bạn có Website hãy nhập vào đây.'; - $lang->about_blog_url = 'Nếu bạn có Blog hãy nhập vào đây.'; - $lang->about_birthday = 'Hãy chọn ngày sinh nhật của bạn.'; - $lang->about_allow_mailing = "Nếu không đồng ý nhận Email, bạn sẽ không thể nhận được những liên lạc của bạn bè hoặc của nhóm."; - $lang->about_denied = 'Kiểm tra tên sử dụng bị cấm.'; - $lang->about_is_admin = 'Kiểm tra toàn quyền Administrator'; - $lang->about_member_description = "Ghi nhớ của Admin về những thành viên"; - $lang->about_group = 'Một tên sử dụng có thể tham gia nhiều nhóm'; - - $lang->about_column_type = 'Hãy chọn một định dạng để sử dụng.'; - $lang->about_column_name = 'Nhập tên theo Tiếng Anh.'; - $lang->about_column_title = 'Sẽ được hiển thị khi đăng kí, sửa đổi hay xem thông tin thành viên.'; - $lang->about_default_value = 'Bạn có thể đặt giá trị mặc định.'; - $lang->about_active = 'Nếu chọn, thông tin này sẽ được hiển thị trong bảng đăng kí.'; - $lang->about_form_description = 'Nếu bạn nhập mô tả, nó sẽ được hiển thị trong bảng đăng kí.'; - $lang->about_required = 'Nếu chọn, thông tin này sẽ được hiển thị trong bảng đăng kí.'; - - $lang->about_enable_openid = 'Kích hoạt đăng nhập bằng OpenID.'; - $lang->about_enable_join = 'Cho phép thành viên đăng kí.'; - $lang->about_enable_confirm = 'Gửi Email xác nhận sau khi đăng kí.'; - $lang->about_enable_ssl = 'Thông tin cá nhân khi thành viên Đăng kí, Đăng nhập và Sủa đổi sẽ được gửi dưới dạng SSL(https). Hãy chọn nếu Server cho phép sử dụng chức năng này.'; - $lang->about_limit_day = 'Bạn có thể giới hạn ngày xác nhận sau khi đăng kí.'; - $lang->about_limit_date = 'Thành viên không thể đăng nhập nếu quá hạn xác nhận đăng kí.'; - $lang->about_after_login_url = 'Bạn có thể thiết đặt địa chỉ nào đó sẽ hiển thị sau khi đăng nhập. Để trống nếu không sử dụng.'; - $lang->about_after_logout_url = 'Bạn có thể thiết đặt địa chỉ nào đó sẽ hiển thị sau khi thoát. Để trống nếu không sử dụng.'; - $lang->about_redirect_url = 'Hãy nhập địa chỉ trang sẽ chuyển đến sau khi thành viên đăng kí. Để trống nếu không sử dụng.'; - $lang->about_agreement = "Điều khoản sử dụng sẽ hiển thị trong Form đăng kí nếu có nội dung."; - - $lang->about_image_name = "Cho phép thành viên sử dụng hình ảnh thay cho tên."; - $lang->about_image_mark = "Cho phép sử dụng hình ảnh nhỏ truóc tên của họ."; - $lang->about_group_image_mark = "Bạn có thể sử dụng biểu tượng nhóm sẽ hiển thị trước tên thành viên."; - $lang->about_profile_image = 'Cho phép thành viên sử dụng thông tin cá nhân bằng hình ảnh.'; - $lang->about_accept_agreement = "Tôi đã đọc và đồng ý với điều khoản sử dụng của Website."; - - $lang->about_member_default = 'Sẽ là nhóm mặc định khi thành viên đăng kí.'; - - $lang->about_openid = 'Khi bạn đăng nhập bằng OpenID, những thông tin cơ bản và Email của bạn sẽ lưu lại tại Website này. Việc này sẽ giúp bạn lấy lại thông tin nếu như bạn lỡ quên hoặc nhận những thông báo từ Ban Quản trị Website.'; - $lang->about_openid_leave = 'Thông tin OpenID của bạn sẽ được cập nhật tại Website này.
    Nếu bạn đăng nhập, Thông tin OpenID của bạn sẽ được lưu lại như một thành viên đã đăng kí, và bạn có thể gửi bài viết hay bình luận.'; - - $lang->about_member = "Chức năng của Module này sẽ cho phép bạn tạo, sửa, xóa thành viên và quản lý nhóm hay Form đăng kí.\nBạn có thể quản lý thành viên bằng cách tạo những nhóm mới, và thêm những thông tin trong Form đăng kí."; - $lang->about_find_member_account = 'Thông tin tài khoản của bạn sẽ được tìm thấy với Email bạn đã đăng kí.
    Xin vui lòng nhập Email mà bạn đã đăng kí và bấm "Lấy lại thông tin" để nhận được thông tin đăng nhập!.
    '; - $lang->about_ssl_port = 'Xin hãy nhập cổng kết nối mặc định cho SSL.'; - $lang->add_openid = 'Thêm OpenID'; - - $lang->about_resend_auth_mail = 'Nhận lại mã kích hoạt nếu bạn đã không nhận được Email kích hoạt khi đăng kí.'; - - $lang->find_account_question = '비밀번호 찾기 질문/답변'; - $lang->find_account_answer = '비밀번호 찾기 답변'; - $lang->about_find_account_question = '가입시 아이디와 이메일, 질문/답변으로 임시 비밀번호를 발급 받을 수 있습니다.'; -/* - $lang->find_account_question_items = array('' - ,'다른 이메일 주소는?' - ,'나의 보물 1호는?' - ,'나의 출신 초등학교는?' - ,'나의 출신 고향은?' - ,'나의 이상형은?' - ,'어머니 성함은?' - ,'아버지 성함은?' - ,'가장 좋아하는 색깔은?' - ,'가장 좋아하는 음식은?' - ); -*/ - $lang->temp_password = '임시 비밀번호'; - $lang->cmd_get_temp_password = '임시 비밀번호 발급'; - $lang->about_get_temp_password = '로그인 후 비밀번호 변경해 주세요.'; - $lang->msg_question_not_exists = '등록한 비밀번호 찾기 질문/답변이 없습니다.'; - $lang->msg_answer_not_matches = '비밀번호 찾기 질문/답변 또는 정보가 올바르지 않습니다.'; - - $lang->change_password_date = '비밀번호 갱신주기'; - $lang->about_change_password_date = '일정기간이 지나면 비밀번호 변경을 하도록 유도하는 기능입니다. (사용하지 않음 : 0 입력) '; - -?> +member = 'Thành viên'; + $lang->member_default_info = 'Thông tin cá nhân'; + $lang->member_extend_info = 'Thông tin bổ xung'; + $lang->default_group_1 = "Member"; + $lang->default_group_2 = "Moderator"; + $lang->admin_group = "Administrator"; + $lang->keep_signed = 'Nhớ thông tin đăng nhập'; + $lang->remember_user_id = 'Lưu tên sử dụng'; + $lang->already_logged = "Bạn đã đăng nhập"; + $lang->denied_user_id = 'ID đăng nhập của bạn đã bị cấm sử dụng.'; + $lang->null_user_id = 'Xin vui lòng nhập ID đăng nhập'; + $lang->null_password = 'Xin vui lòng nhập mật khẩu'; + $lang->invalid_authorization = 'Tài khoản đăng nhập không đúng.'; + $lang->invalid_user_id= "Bạn đã nhập sai tên sử dụng"; + $lang->allow_mailing = 'Đồng ý nhận Email'; + $lang->invalid_password = 'Mật khẩu không đúng'; + $lang->invalid_new_password = '이전 비밀번호와 같습니다.'; + $lang->denied = 'Bị từ chối'; + $lang->is_admin = 'Toàn quyền Administrator'; + $lang->group = 'Phân nhóm'; + $lang->group_title = 'Tên nhóm'; + $lang->group_srl = 'Nhóm số'; + $lang->signature = 'Chữ kí'; + $lang->profile_image = 'Hình đại diện'; + $lang->profile_image_max_width = 'Chiểu rộng tối đa'; + $lang->profile_image_max_height = 'Chiều cao tối đa  '; + $lang->image_name = 'Hình thay thế tên hiển thị'; + $lang->image_name_max_width = 'Chiểu rộng tối đa'; + $lang->image_name_max_height = 'Chiều cao tối đa  '; + $lang->image_mark = 'Hình đánh dấu'; + $lang->image_mark_max_width = 'Chiểu rộng tối đa'; + $lang->image_mark_max_height = 'Chiều cao tối đa  '; + $lang->group_image_mark = 'Hình đại diện nhóm'; + $lang->group_image_mark_max_width = 'Chiểu rộng tối đa'; + $lang->group_image_mark_max_height = 'Chiều cao tối đa  '; + $lang->group_image_mark_order = 'Thứ tự hình đại diện nhóm'; + $lang->signature_max_height = 'Chiều cao lớn nhất của chữ kí'; + $lang->enable_openid = 'Kích hoạt OpenID'; + $lang->enable_join = 'Đồng ý đăng kí thành viên'; + $lang->enable_confirm = 'Xác nhận qua Email'; + $lang->enable_ssl = 'Mở SSL'; + $lang->security_sign_in = 'Bảo mật đăng nhập'; + $lang->limit_day = 'Hạn sử dụng'; + $lang->limit_date = 'Ngày giới hạn'; + $lang->after_login_url = 'URL sau khi đăng nhập'; + $lang->after_logout_url = 'URL sau khi thoát'; + $lang->redirect_url = 'URL sau khi đăng kí'; + $lang->agreement = 'Quy định sử dụng'; + $lang->accept_agreement = 'Đồng ý'; + $lang->member_info = 'Thông tin cá nhân'; + $lang->current_password = 'Mật khẩu hiện tại'; + $lang->openid = 'OpenID'; + $lang->allow_message = 'Nhận tin nhắn'; + $lang->allow_message_type = array( + 'Y' => 'Tất cả', + 'F' => 'Chỉ của bạn bè', + 'N' => 'Từ chối tất cả', + ); + $lang->about_allow_message = 'Bạn có thể chấp nhận hoặc từ chối những tin nhắn.'; + $lang->logged_users = 'Thành viên đăng nhập'; + + $lang->webmaster_name = "Tên Webmaster"; + $lang->webmaster_email = " Email Webmaster"; + + $lang->about_keep_signed = 'Mặc dù tắt trình duyệt nhưng thông tin đăng nhập của bạn vẫn được lưu lại trên máy tính này.\n\nNếu bạn sử dụng máy tính dùng chung, người khác cũng có thể đăng nhập dưới tên truy cập của bạn. Vì vậy chức năng này không nên sử dụng nếu máy tính này không phải của riêng bạn!'; + $lang->about_keep_warning = 'Mặc dù tắt trình duyệt nhưng thông tin đăng nhập của bạn vẫn được lưu lại trên máy tính này. Nếu bạn sử dụng máy tính dùng chung, người khác cũng có thể đăng nhập dưới tên truy cập của bạn. Vì vậy chức năng này không nên sử dụng nếu máy tính này không phải của riêng bạn!'; + $lang->about_webmaster_name = "Xin hãy nhập tên của Webmaster để nhận Email và quản lý. (Mặc định: webmaster)"; + $lang->about_webmaster_email = "Xin hãy nhập Email của Webmaster."; + + $lang->search_target_list = array( + 'user_id' => 'ID đăng nhập', + 'user_name' => 'Tên thật', + 'nick_name' => 'Nickname', + 'email_address' => 'Địa chỉ Email', + 'regdate' => 'Ngày đăng kí', + 'regdate_more' => 'Ngày đăng kí nhiều nhất', + 'regdate_less' => 'Ngày đăng kí ít nhất', + 'last_login' => 'Lần cuối đăng nhập', + 'last_login_more' => 'Đăng nhập nhiều nhất', + 'last_login_less' => 'Đăng nhập ít nhất', + 'extra_vars' => 'Thông tin bổ xung', + ); + + $lang->cmd_login = 'Đăng nhập'; + $lang->cmd_logout = 'Thoát'; + $lang->cmd_signup = 'Đăng kí'; + $lang->cmd_site_signup = 'Đăng kí'; + $lang->cmd_modify_member_info = 'Sửa đổi thông tin cá nhân'; + $lang->cmd_modify_member_password = 'Sửa đổi mật khẩu'; + $lang->cmd_view_member_info = 'Xem thông tin cá nhân'; + $lang->cmd_leave = 'Từ bỏ'; + $lang->cmd_find_member_account = 'Lấy lại thông tin'; + $lang->cmd_resend_auth_mail = 'Xác nhận lại Email'; + + $lang->cmd_member_list = 'Danh sách thành viên'; + $lang->cmd_module_config = 'Thiết lập mặc định'; + $lang->cmd_member_group = 'Quản lý nhóm'; + $lang->cmd_send_mail = 'Gửi Email'; + $lang->cmd_manage_id = 'Tên sử dụng cấm đăng kí'; + $lang->cmd_manage_form = 'Quản lý mẫu đăng kí'; + $lang->cmd_view_own_document = 'Bài gửi'; + $lang->cmd_manage_member_info = 'Quản lý thông tin thành viên'; + $lang->cmd_trace_document = 'Theo dõi chủ đề'; + $lang->cmd_trace_comment = 'Theo dõi thảo luận'; + $lang->cmd_view_scrapped_document = 'Phân loại'; + $lang->cmd_view_saved_document = 'Bài viết đã lưu'; + $lang->cmd_send_email = 'Gửi eMail'; + + $lang->msg_email_not_exists = "Bạn đã nhập sai Email"; + + $lang->msg_alreay_scrapped = 'Bài viết đã được phân loại.'; + + $lang->msg_cart_is_null = 'Xin vui lòng lựa chọn vị trí'; + $lang->msg_checked_file_is_deleted = '%d đính kèm đã được xóa.'; + + $lang->msg_find_account_title = 'Thông tin đăng kí tại Website http;//4all.kr'; + $lang->msg_find_account_info = 'Thông tin tài khoản.'; + $lang->msg_find_account_comment = 'Mật khẩu sẽ thay đổi khi bạn bấm vào đường Link này.
    Xin vui lòng thay đổi mật khẩu sau khi đăng nhập!'; + $lang->msg_confirm_account_title = 'Thông tin đăng kí thành viên tại Website http://4all.kr'; + $lang->msg_confirm_account_info = 'Đây là thông tin bạn đã đăng kí tại Website http://4all.kr:'; + $lang->msg_confirm_account_comment = 'Bấm vào đường Link này để hoàn tất việc đăng kí.'; + $lang->msg_auth_mail_sent = 'Email xác nhận đã được gửi đến %s. Xin vui lòng kiểm tra Inbox hoặc Bulk mail của bạn!'; + $lang->msg_confirm_mail_sent = 'Chúng tôi đã gửi Email xác nhận đến %s. Xin vui lòng bấm vào Link đi kèm trong Email để hoàn tất việc đăng kí!'; + $lang->msg_invalid_auth_key = 'Xác nhận không hợp lệ.
    Xin vui lòng kiểm tra lại hoặc liên hệ với Webmaster để được hỗ trợ!'; + $lang->msg_success_authed = 'Tài khoản của bạn đã được xác nhận.\n Xin vui lòng thay đổi mật khẩu khác với mật khẩu trong Email và dễ nhớ hơn!'; + $lang->msg_success_confirmed = 'Đã xác nhận thành công.
    Xin cảm ơn đã tham gia cùng chúng tôi!'; + + $lang->msg_new_member = 'Thêm thành viên'; + $lang->msg_update_member = 'Sửa đổi thông tin thành viên'; + $lang->msg_leave_member = 'Loại bỏ'; + $lang->msg_group_is_null = 'Không đăng kí vào nhóm nào'; + $lang->msg_not_delete_default = 'Mặc định không thể xóa'; + $lang->msg_not_exists_member = "Thành viên không hợp lệ"; + $lang->msg_cannot_delete_admin = 'Admin ID không thể xóa!'; + $lang->msg_exists_user_id = 'Tên sử dụng này đã có người dùng. Xin vui lòng thử lại với tên truy cập khác!'; + $lang->msg_exists_email_address = 'Email này đã có người sử dụng. Xin vui lòng thử lại với Email khác!'; + $lang->msg_exists_nick_name = 'Nickname này đã có người sử dụng. Xin vui lòng thử lại với Nickname khác!'; + $lang->msg_signup_disabled = 'Bạn không thể đăng kí.'; + $lang->msg_already_logged = 'Bạn đã đăng kí rồi.'; + $lang->msg_not_logged = 'Xin vui lòng đăng nhập trước!'; + $lang->msg_insert_group_name = 'Xin vui lòng nhập tên của nhóm!'; + $lang->msg_check_group = 'Xin vui lòng chọn nhóm!'; + + $lang->msg_not_uploaded_profile_image = 'Không thể đăng kí được hình đại diện.'; + $lang->msg_not_uploaded_image_name = 'Không thể gửi được hình ảnh thay Nickname.'; + $lang->msg_not_uploaded_image_mark = 'Hình đánh dấu đã không được gửi.'; + $lang->msg_not_uploaded_group_image_mark = 'Hình thay thế nhóm đã không được gửi'; + + $lang->msg_accept_agreement = 'Bạn phải đồng ý với điều khoản sử dụng của chúng tôi.'; + + $lang->msg_user_denied = 'Tên sử dụng này đã bị cấm đăng kí.'; + $lang->msg_user_not_confirmed = 'Bạn chưa xác nhận việc đăng kí. Xin vui lòng kiểm tra Email!'; + $lang->msg_user_limited = 'Bạn được phép sử dụng đến ngày %s'; + + $lang->about_user_id = 'Độ dài của tên truy cập được giới hạn từ 3 đến 20 kí tự gồm a-z và các số.'; + $lang->about_password = 'Độ dài mật khẩu giới hạn từ 6 đến 20 kí tự.'; + $lang->about_user_name = 'Giới hạn của tên từ 2 đến 20 kí tự.'; + $lang->about_nick_name = 'Độ dài của Nickname từ 2 đến 20 kí tự.'; + $lang->about_email_address = 'Email được sử dụng để lên lạc, xác nhận và lấy lại mật khẩu nếu lỡ quên.'; + $lang->about_homepage = 'Nếu bạn có Website hãy nhập vào đây.'; + $lang->about_blog_url = 'Nếu bạn có Blog hãy nhập vào đây.'; + $lang->about_birthday = 'Hãy chọn ngày sinh nhật của bạn.'; + $lang->about_allow_mailing = "Nếu không đồng ý nhận Email, bạn sẽ không thể nhận được những liên lạc của bạn bè hoặc của nhóm."; + $lang->about_denied = 'Kiểm tra tên sử dụng bị cấm.'; + $lang->about_is_admin = 'Kiểm tra toàn quyền Administrator'; + $lang->about_member_description = "Ghi nhớ của Admin về những thành viên"; + $lang->about_group = 'Một tên sử dụng có thể tham gia nhiều nhóm'; + + $lang->about_column_type = 'Hãy chọn một định dạng để sử dụng.'; + $lang->about_column_name = 'Nhập tên theo Tiếng Anh.'; + $lang->about_column_title = 'Sẽ được hiển thị khi đăng kí, sửa đổi hay xem thông tin thành viên.'; + $lang->about_default_value = 'Bạn có thể đặt giá trị mặc định.'; + $lang->about_active = 'Nếu chọn, thông tin này sẽ được hiển thị trong bảng đăng kí.'; + $lang->about_form_description = 'Nếu bạn nhập mô tả, nó sẽ được hiển thị trong bảng đăng kí.'; + $lang->about_required = 'Nếu chọn, thông tin này sẽ được hiển thị trong bảng đăng kí.'; + + $lang->about_enable_openid = 'Kích hoạt đăng nhập bằng OpenID.'; + $lang->about_enable_join = 'Cho phép thành viên đăng kí.'; + $lang->about_enable_confirm = 'Gửi Email xác nhận sau khi đăng kí.'; + $lang->about_enable_ssl = 'Thông tin cá nhân khi thành viên Đăng kí, Đăng nhập và Sủa đổi sẽ được gửi dưới dạng SSL(https). Hãy chọn nếu Server cho phép sử dụng chức năng này.'; + $lang->about_limit_day = 'Bạn có thể giới hạn ngày xác nhận sau khi đăng kí.'; + $lang->about_limit_date = 'Thành viên không thể đăng nhập nếu quá hạn xác nhận đăng kí.'; + $lang->about_after_login_url = 'Bạn có thể thiết đặt địa chỉ nào đó sẽ hiển thị sau khi đăng nhập. Để trống nếu không sử dụng.'; + $lang->about_after_logout_url = 'Bạn có thể thiết đặt địa chỉ nào đó sẽ hiển thị sau khi thoát. Để trống nếu không sử dụng.'; + $lang->about_redirect_url = 'Hãy nhập địa chỉ trang sẽ chuyển đến sau khi thành viên đăng kí. Để trống nếu không sử dụng.'; + $lang->about_agreement = "Điều khoản sử dụng sẽ hiển thị trong Form đăng kí nếu có nội dung."; + + $lang->about_image_name = "Cho phép thành viên sử dụng hình ảnh thay cho tên."; + $lang->about_image_mark = "Cho phép sử dụng hình ảnh nhỏ truóc tên của họ."; + $lang->about_group_image_mark = "Bạn có thể sử dụng biểu tượng nhóm sẽ hiển thị trước tên thành viên."; + $lang->about_profile_image = 'Cho phép thành viên sử dụng thông tin cá nhân bằng hình ảnh.'; + $lang->about_accept_agreement = "Tôi đã đọc và đồng ý với điều khoản sử dụng của Website."; + + $lang->about_member_default = 'Sẽ là nhóm mặc định khi thành viên đăng kí.'; + + $lang->about_openid = 'Khi bạn đăng nhập bằng OpenID, những thông tin cơ bản và Email của bạn sẽ lưu lại tại Website này. Việc này sẽ giúp bạn lấy lại thông tin nếu như bạn lỡ quên hoặc nhận những thông báo từ Ban Quản trị Website.'; + $lang->about_openid_leave = 'Thông tin OpenID của bạn sẽ được cập nhật tại Website này.
    Nếu bạn đăng nhập, Thông tin OpenID của bạn sẽ được lưu lại như một thành viên đã đăng kí, và bạn có thể gửi bài viết hay bình luận.'; + + $lang->about_member = "Chức năng của Module này sẽ cho phép bạn tạo, sửa, xóa thành viên và quản lý nhóm hay Form đăng kí.\nBạn có thể quản lý thành viên bằng cách tạo những nhóm mới, và thêm những thông tin trong Form đăng kí."; + $lang->about_find_member_account = 'Thông tin tài khoản của bạn sẽ được tìm thấy với Email bạn đã đăng kí.
    Xin vui lòng nhập Email mà bạn đã đăng kí và bấm "Lấy lại thông tin" để nhận được thông tin đăng nhập!.
    '; + $lang->about_ssl_port = 'Xin hãy nhập cổng kết nối mặc định cho SSL.'; + $lang->add_openid = 'Thêm OpenID'; + + $lang->about_resend_auth_mail = 'Nhận lại mã kích hoạt nếu bạn đã không nhận được Email kích hoạt khi đăng kí.'; + + $lang->find_account_question = '비밀번호 찾기 질문/답변'; + $lang->find_account_answer = '비밀번호 찾기 답변'; + $lang->about_find_account_question = '가입시 아이디와 이메일, 질문/답변으로 임시 비밀번호를 발급 받을 수 있습니다.'; +/* + $lang->find_account_question_items = array('' + ,'다른 이메일 주소는?' + ,'나의 보물 1호는?' + ,'나의 출신 초등학교는?' + ,'나의 출신 고향은?' + ,'나의 이상형은?' + ,'어머니 성함은?' + ,'아버지 성함은?' + ,'가장 좋아하는 색깔은?' + ,'가장 좋아하는 음식은?' + ); +*/ + $lang->temp_password = '임시 비밀번호'; + $lang->cmd_get_temp_password = '임시 비밀번호 발급'; + $lang->about_get_temp_password = '로그인 후 비밀번호 변경해 주세요.'; + $lang->msg_question_not_exists = '등록한 비밀번호 찾기 질문/답변이 없습니다.'; + $lang->msg_answer_not_matches = '비밀번호 찾기 질문/답변 또는 정보가 올바르지 않습니다.'; + + $lang->change_password_date = '비밀번호 갱신주기'; + $lang->about_change_password_date = '일정기간이 지나면 비밀번호 변경을 하도록 유도하는 기능입니다. (사용하지 않음 : 0 입력) '; + +?> diff --git a/modules/member/lang/zh-CN.lang.php b/modules/member/lang/zh-CN.lang.php index 81e47761e..7ee2d5849 100644 --- a/modules/member/lang/zh-CN.lang.php +++ b/modules/member/lang/zh-CN.lang.php @@ -1,238 +1,238 @@ -member = '会员'; - $lang->member_default_info = '基本资料'; - $lang->member_extend_info = '扩展信息'; - $lang->default_group_1 = "准会员"; - $lang->default_group_2 = "正会员"; - $lang->admin_group = "管理组"; - $lang->keep_signed = '自动登录'; - $lang->remember_user_id = '保存ID'; - $lang->already_logged = '您已经登录!'; - $lang->denied_user_id = '被禁止的用户名。'; - $lang->null_user_id = '请输入用户名。'; - $lang->null_password = '请输入密码。'; - $lang->invalid_authorization = '还没有认证!'; - $lang->invalid_user_id= '该用户名不存在,请检查您的输入是否有误!'; - $lang->invalid_password = '您的密码不正确!'; - $lang->invalid_new_password = '이전 비밀번호와 같습니다.'; - $lang->allow_mailing = '接收邮件'; - $lang->denied = '禁止使用'; - $lang->is_admin = '最高管理权限'; - $lang->group = '用户组'; - $lang->group_title = '用户组标题'; - $lang->group_srl = '用户组编号'; - $lang->signature = '签名'; - $lang->profile_image = '个性头像'; - $lang->profile_image_max_width = '宽度限制'; - $lang->profile_image_max_height = '高度限制'; - $lang->image_name = '昵称图片'; - $lang->image_name_max_width = '宽度限制'; - $lang->image_name_max_height = '高度限制'; - $lang->image_mark = '用户图标'; - $lang->image_mark_max_width = '宽度限制'; - $lang->image_mark_max_height = '高度限制'; - $lang->group_image_mark = '用户组图标'; - $lang->group_image_mark_max_width = '宽度限制'; - $lang->group_image_mark_max_height = '高度限制'; - $lang->group_image_mark_order = '用户组图标顺序'; - $lang->signature_max_height = '签名高度限制'; - $lang->enable_openid = '支持OpenID'; - $lang->enable_join = '允许会员注册'; - $lang->enable_confirm = '使用邮件认证'; - $lang->enable_ssl = '使用SSL功能'; - $lang->security_sign_in = '使用安全登录'; - $lang->limit_day = '认证限制'; - $lang->limit_date = '限制日期'; - $lang->after_login_url = '登录后页面转向'; - $lang->after_logout_url = '退出后页面转向'; - $lang->redirect_url = '注册会员后页面转向'; - $lang->agreement = '会员注册条款'; - $lang->accept_agreement = '同意条款'; - $lang->member_info = '会员信息'; - $lang->current_password = '当前密码'; - $lang->openid = 'OpenID'; - $lang->allow_message = '接收短消息'; - $lang->allow_message_type = array( - 'Y' => '全部接收', - 'F' => '拒收', - 'N' => '只允许好友', - ); - $lang->about_allow_message = '可以指定接收短消息方法及对象。'; - $lang->logged_users = '在线用户'; - - $lang->webmaster_name = '管理员名'; - $lang->webmaster_email = '管理员电子邮件'; - - $lang->about_keep_signed = '关闭浏览器后也将维持登录状态。\n\n使用自动登录功能,可解决每次访问都要输入用户名及密码的麻烦。\n\n为防止个人信息泄露,在网吧,学校等公共场所请务必要确认解除登录状态。'; - $lang->about_keep_warning = '关闭浏览器后也将维持登录状态。\n\n使用自动登录功能,可解决每次访问都要输入用户名及密码的麻烦。 为防止个人信息泄露,在网吧,学校等公共场所请务必要确认解除登录状态。'; - $lang->about_webmaster_name = '请输入认证所需的电子邮件地址或管理其他网站时要使用的网站管理员名称。(默认 : webmaster)'; - $lang->about_webmaster_email = '请输入网站管理员的电子邮件地址。'; - - $lang->search_target_list = array( - 'user_id' => '用户名', - 'user_name' => '姓名', - 'nick_name' => '昵称', - 'email_address' => '邮箱地址', - 'regdate' => '注册日期', - 'regdate_more' => '注册日期(以上)', - 'regdate_less' => '注册日期(以下)', - 'last_login' => '最后登录', - 'last_login_more' => '最后登录(以上)', - 'last_login_less' => '最后登录시(以下)', - 'extra_vars' => '扩展信息', - ); - - - $lang->cmd_login = '登录'; - $lang->cmd_logout = '退出'; - $lang->cmd_signup = '新会员注册'; - $lang->cmd_site_signup = '注册'; - $lang->cmd_modify_member_info = '编辑个人资料'; - $lang->cmd_modify_member_password = '修改密码'; - $lang->cmd_view_member_info = '个人资料'; - $lang->cmd_leave = '注销'; - $lang->cmd_find_member_account = '查找用户名/密码'; - $lang->cmd_resend_auth_mail = '重新发送认证邮件'; - - $lang->cmd_member_list = '会员目录'; - $lang->cmd_module_config = '常规选项'; - $lang->cmd_member_group = '用户组'; - $lang->cmd_send_mail = '发送邮件'; - $lang->cmd_manage_id = '禁止用户名'; - $lang->cmd_manage_form = '扩展注册表单'; - $lang->cmd_view_own_document = '会员话题'; - $lang->cmd_manage_member_info = '管理会员信息'; - $lang->cmd_trace_document = '主题追踪'; - $lang->cmd_trace_comment = '评论追踪'; - $lang->cmd_view_scrapped_document = '我的收藏'; - $lang->cmd_view_saved_document = '临时保存箱'; - $lang->cmd_send_email = '发送邮件'; - - $lang->msg_email_not_exists = "没有找到您输入的Email地址。"; - - $lang->msg_alreay_scrapped = '已收藏的主题!'; - - $lang->msg_cart_is_null = '请选择对象。'; - $lang->msg_checked_file_is_deleted = '已删除%d个附件。'; - - $lang->msg_find_account_title = '注册信息。'; - $lang->msg_find_account_info = '您要查找的注册信息如下。'; - $lang->msg_find_account_comment = '点击下面的链接您的注册密码将更新为上述的系统自动生成密码。
    请重新登录后把密码改为您所熟悉的密码。'; - $lang->msg_confirm_account_title = '会员注册'; - $lang->msg_confirm_account_info = '您的注册信息如下:'; - $lang->msg_confirm_account_comment = '请点击下面链接完成会员认证。'; - $lang->msg_auth_mail_sent = '已向%s发送了认证邮件。请确认!!'; - $lang->msg_confirm_mail_sent = '已向%s发送了认证邮件。请确认!!'; - $lang->msg_invalid_auth_key = '错误的注册信息请求。
    请重新查找用户名及密码, 或联系管理员。'; - $lang->msg_success_authed = '新的注册信息已得到认证。请用邮件中的新密码修改您要想使用的密码。'; - $lang->msg_success_confirmed = '注册信息已成功激活!'; - - $lang->msg_new_member = '会员注册'; - $lang->msg_update_member = '修改会员信息'; - $lang->msg_leave_member = '注销会员'; - $lang->msg_group_is_null = '没有用户组。'; - $lang->msg_not_delete_default = '不能删除基本项目'; - $lang->msg_not_exists_member = '不存在的用户'; - $lang->msg_cannot_delete_admin = '不能删除管理员 ID .解除管理后再删除'; - $lang->msg_exists_user_id = '重复的用户名 ,请重新输入用户名。'; - $lang->msg_exists_email_address = '重复的电子邮件地址,请重新输入电子邮件地址。'; - $lang->msg_exists_nick_name = '重复的昵称,请重新输入昵称。'; - $lang->msg_signup_disabled = '不能注册会员'; - $lang->msg_already_logged = '您是注册会员。'; - $lang->msg_not_logged = '您还没有登录。'; - $lang->msg_insert_group_name = '请输入组名称'; - $lang->msg_check_group = '请选择组'; - - $lang->msg_not_uploaded_profile_image = '不能登录签名图像!'; - $lang->msg_not_uploaded_image_name = '不能登录昵称图像!'; - $lang->msg_not_uploaded_image_mark = '不能登录用户图标!'; - $lang->msg_not_uploaded_group_image_mark = '可以指定用户组图标。'; - - $lang->msg_accept_agreement = '您必须同意条款。'; - - $lang->msg_user_denied = '您输入的用户名已禁止使用!'; - $lang->msg_user_not_confirmed = '您的注册信息还没有被激活,请确认您的电子邮箱。'; - $lang->msg_user_limited = '您输入的用户名%s以后才可以开始使用。'; - - $lang->about_user_id = '用户名长度必须由 3 ~20 字以内的英文+数字组成,且首个字母必须是英文字母。'; - $lang->about_password = '密码长度必须在6~20字以内。'; - $lang->about_user_name = '姓名必须是2~20字以内。'; - $lang->about_nick_name = '昵称必须是2~20字以内。'; - $lang->about_email_address = '电子邮件地址除邮件认证外,在修改密码或找回密码时使用。'; - $lang->about_homepage = '请输入您的主页地址。'; - $lang->about_blog_url = '请输入博客地址。'; - $lang->about_birthday = '请输入您的出生年月日。'; - $lang->about_allow_mailing = '如不选择此项,以后不能接收站内发送的重要信息。'; - $lang->about_denied = '选择时不能使用此用户名。'; - $lang->about_is_admin = '选择时将具有最高管理权限。'; - $lang->about_member_description = '管理员对会员的备忘录。'; - $lang->about_group = '一个用户名可属多个用户组。'; - - $lang->about_column_type = '请选择要添加的注册表单格式。'; - $lang->about_column_name = '请输入在模板中可以使用的英文名称。(变数名)'; - $lang->about_column_title = '注册或修改/查看信息时要显示的标题。'; - $lang->about_default_value = '可以设置缺省值。'; - $lang->about_active = '必须选择此项后才可以正常启用。'; - $lang->about_form_description = '说明栏里输入的内容,注册时将会显示。'; - $lang->about_required = '注册时成为必填项目。'; - - $lang->about_enable_openid = '要想网站支持OpenID时请勾选此项。'; - $lang->about_enable_join = '选择此项后用户才可以注册。'; - $lang->about_enable_confirm = '为激活会员注册信息,将向会员输入的邮件地址发送注册认证邮件。'; - $lang->about_enable_ssl = '如服务器提供SSL协议服务,新会员注册/修改会员信息/登录等信息的传送将使用SSL(https)协议。'; - $lang->about_limit_day = '注册会员后的认证有效期限。'; - $lang->about_limit_date = '直到指定日期该用户不能登录。'; - $lang->about_after_login_url = '可以指定登录后的页面转向url(留空为当前页面)。'; - $lang->about_after_logout_url = '可以指定退出登录后的页面转向url(留空为当前页面)。'; - $lang->about_redirect_url = '请输入注册会员后的页面转向 url。(留空为返回前页)'; - $lang->about_agreement = '没有会员条款时不显示。'; - - $lang->about_image_name = '用户昵称可以用小图片来替代显示。'; - $lang->about_image_mark = '显示在用户昵称前的小图标。'; - $lang->about_group_image_mark = '用户名前显示用户组图标。'; - $lang->about_profile_image = '可以使用签名图片。'; - $lang->about_signature_max_height = '可以限制签名栏高度(0或留空为不限制)。'; - $lang->about_accept_agreement = '已阅读全部条款并同意。'; - - $lang->about_member_default = '将成为注册会员时的默认用户组。'; - - $lang->about_openid = '用OpenID注册时该网站只保存用户名和 邮件等基本信息,密码和认证处理是在提供OpenID服务的站点中得到解决。'; - $lang->about_openid_leave = '删除OpenID就等于永久删除站内用户的信息。
    被删除后的重新登录就等于新会员注册,因此对以前自己写的主题将失去相应权限。'; - $lang->about_find_member_account = '用户名/密码将发送到您注册时所输入的电子邮件当中。
    输入注册时的电子邮件地址后,请点击“查找用户名/密码”按钮。
    '; - - $lang->about_member = "可以添加/修改/删除会员及管理用户组或注册表单的会员管理模块。\n此模块不仅可以生成缺省用户组以外的其他用户组来管理会员,并且通过注册表单的管理获得除会员基本信息以外的扩展信息。"; - - $lang->about_resend_auth_mail = '没有收到认证邮件时,可以在此重新发送认证邮件。'; - - $lang->find_account_question = '비밀번호 찾기 질문/답변'; - $lang->find_account_answer = '비밀번호 찾기 답변'; - $lang->about_find_account_question = '가입시 아이디와 이메일, 질문/답변으로 임시 비밀번호를 발급 받을 수 있습니다.'; - /* - $lang->find_account_question_items = array('' - ,'다른 이메일 주소는?' - ,'나의 보물 1호는?' - ,'나의 출신 초등학교는?' - ,'나의 출신 고향은?' - ,'나의 이상형은?' - ,'어머니 성함은?' - ,'아버지 성함은?' - ,'가장 좋아하는 색깔은?' - ,'가장 좋아하는 음식은?' - ); -*/ - $lang->temp_password = '임시 비밀번호'; - $lang->cmd_get_temp_password = '임시 비밀번호 발급'; - $lang->about_get_temp_password = '로그인 후 비밀번호 변경해 주세요.'; - $lang->msg_question_not_exists = '등록한 비밀번호 찾기 질문/답변이 없습니다.'; - $lang->msg_answer_not_matches = '비밀번호 찾기 질문/답변 또는 정보가 올바르지 않습니다.'; - - $lang->change_password_date = '비밀번호 갱신주기'; - $lang->about_change_password_date = '일정기간이 지나면 비밀번호 변경을 하도록 유도하는 기능입니다. (사용하지 않음 : 0 입력) '; - -?> +member = '会员'; + $lang->member_default_info = '基本资料'; + $lang->member_extend_info = '扩展信息'; + $lang->default_group_1 = "准会员"; + $lang->default_group_2 = "正会员"; + $lang->admin_group = "管理组"; + $lang->keep_signed = '自动登录'; + $lang->remember_user_id = '保存ID'; + $lang->already_logged = '您已经登录!'; + $lang->denied_user_id = '被禁止的用户名。'; + $lang->null_user_id = '请输入用户名。'; + $lang->null_password = '请输入密码。'; + $lang->invalid_authorization = '还没有认证!'; + $lang->invalid_user_id= '该用户名不存在,请检查您的输入是否有误!'; + $lang->invalid_password = '您的密码不正确!'; + $lang->invalid_new_password = '이전 비밀번호와 같습니다.'; + $lang->allow_mailing = '接收邮件'; + $lang->denied = '禁止使用'; + $lang->is_admin = '最高管理权限'; + $lang->group = '用户组'; + $lang->group_title = '用户组标题'; + $lang->group_srl = '用户组编号'; + $lang->signature = '签名'; + $lang->profile_image = '个性头像'; + $lang->profile_image_max_width = '宽度限制'; + $lang->profile_image_max_height = '高度限制'; + $lang->image_name = '昵称图片'; + $lang->image_name_max_width = '宽度限制'; + $lang->image_name_max_height = '高度限制'; + $lang->image_mark = '用户图标'; + $lang->image_mark_max_width = '宽度限制'; + $lang->image_mark_max_height = '高度限制'; + $lang->group_image_mark = '用户组图标'; + $lang->group_image_mark_max_width = '宽度限制'; + $lang->group_image_mark_max_height = '高度限制'; + $lang->group_image_mark_order = '用户组图标顺序'; + $lang->signature_max_height = '签名高度限制'; + $lang->enable_openid = '支持OpenID'; + $lang->enable_join = '允许会员注册'; + $lang->enable_confirm = '使用邮件认证'; + $lang->enable_ssl = '使用SSL功能'; + $lang->security_sign_in = '使用安全登录'; + $lang->limit_day = '认证限制'; + $lang->limit_date = '限制日期'; + $lang->after_login_url = '登录后页面转向'; + $lang->after_logout_url = '退出后页面转向'; + $lang->redirect_url = '注册会员后页面转向'; + $lang->agreement = '会员注册条款'; + $lang->accept_agreement = '同意条款'; + $lang->member_info = '会员信息'; + $lang->current_password = '当前密码'; + $lang->openid = 'OpenID'; + $lang->allow_message = '接收短消息'; + $lang->allow_message_type = array( + 'Y' => '全部接收', + 'F' => '拒收', + 'N' => '只允许好友', + ); + $lang->about_allow_message = '可以指定接收短消息方法及对象。'; + $lang->logged_users = '在线用户'; + + $lang->webmaster_name = '管理员名'; + $lang->webmaster_email = '管理员电子邮件'; + + $lang->about_keep_signed = '关闭浏览器后也将维持登录状态。\n\n使用自动登录功能,可解决每次访问都要输入用户名及密码的麻烦。\n\n为防止个人信息泄露,在网吧,学校等公共场所请务必要确认解除登录状态。'; + $lang->about_keep_warning = '关闭浏览器后也将维持登录状态。\n\n使用自动登录功能,可解决每次访问都要输入用户名及密码的麻烦。 为防止个人信息泄露,在网吧,学校等公共场所请务必要确认解除登录状态。'; + $lang->about_webmaster_name = '请输入认证所需的电子邮件地址或管理其他网站时要使用的网站管理员名称。(默认 : webmaster)'; + $lang->about_webmaster_email = '请输入网站管理员的电子邮件地址。'; + + $lang->search_target_list = array( + 'user_id' => '用户名', + 'user_name' => '姓名', + 'nick_name' => '昵称', + 'email_address' => '邮箱地址', + 'regdate' => '注册日期', + 'regdate_more' => '注册日期(以上)', + 'regdate_less' => '注册日期(以下)', + 'last_login' => '最后登录', + 'last_login_more' => '最后登录(以上)', + 'last_login_less' => '最后登录시(以下)', + 'extra_vars' => '扩展信息', + ); + + + $lang->cmd_login = '登录'; + $lang->cmd_logout = '退出'; + $lang->cmd_signup = '新会员注册'; + $lang->cmd_site_signup = '注册'; + $lang->cmd_modify_member_info = '编辑个人资料'; + $lang->cmd_modify_member_password = '修改密码'; + $lang->cmd_view_member_info = '个人资料'; + $lang->cmd_leave = '注销'; + $lang->cmd_find_member_account = '查找用户名/密码'; + $lang->cmd_resend_auth_mail = '重新发送认证邮件'; + + $lang->cmd_member_list = '会员目录'; + $lang->cmd_module_config = '常规选项'; + $lang->cmd_member_group = '用户组'; + $lang->cmd_send_mail = '发送邮件'; + $lang->cmd_manage_id = '禁止用户名'; + $lang->cmd_manage_form = '扩展注册表单'; + $lang->cmd_view_own_document = '会员话题'; + $lang->cmd_manage_member_info = '管理会员信息'; + $lang->cmd_trace_document = '主题追踪'; + $lang->cmd_trace_comment = '评论追踪'; + $lang->cmd_view_scrapped_document = '我的收藏'; + $lang->cmd_view_saved_document = '临时保存箱'; + $lang->cmd_send_email = '发送邮件'; + + $lang->msg_email_not_exists = "没有找到您输入的Email地址。"; + + $lang->msg_alreay_scrapped = '已收藏的主题!'; + + $lang->msg_cart_is_null = '请选择对象。'; + $lang->msg_checked_file_is_deleted = '已删除%d个附件。'; + + $lang->msg_find_account_title = '注册信息。'; + $lang->msg_find_account_info = '您要查找的注册信息如下。'; + $lang->msg_find_account_comment = '点击下面的链接您的注册密码将更新为上述的系统自动生成密码。
    请重新登录后把密码改为您所熟悉的密码。'; + $lang->msg_confirm_account_title = '会员注册'; + $lang->msg_confirm_account_info = '您的注册信息如下:'; + $lang->msg_confirm_account_comment = '请点击下面链接完成会员认证。'; + $lang->msg_auth_mail_sent = '已向%s发送了认证邮件。请确认!!'; + $lang->msg_confirm_mail_sent = '已向%s发送了认证邮件。请确认!!'; + $lang->msg_invalid_auth_key = '错误的注册信息请求。
    请重新查找用户名及密码, 或联系管理员。'; + $lang->msg_success_authed = '新的注册信息已得到认证。请用邮件中的新密码修改您要想使用的密码。'; + $lang->msg_success_confirmed = '注册信息已成功激活!'; + + $lang->msg_new_member = '会员注册'; + $lang->msg_update_member = '修改会员信息'; + $lang->msg_leave_member = '注销会员'; + $lang->msg_group_is_null = '没有用户组。'; + $lang->msg_not_delete_default = '不能删除基本项目'; + $lang->msg_not_exists_member = '不存在的用户'; + $lang->msg_cannot_delete_admin = '不能删除管理员 ID .解除管理后再删除'; + $lang->msg_exists_user_id = '重复的用户名 ,请重新输入用户名。'; + $lang->msg_exists_email_address = '重复的电子邮件地址,请重新输入电子邮件地址。'; + $lang->msg_exists_nick_name = '重复的昵称,请重新输入昵称。'; + $lang->msg_signup_disabled = '不能注册会员'; + $lang->msg_already_logged = '您是注册会员。'; + $lang->msg_not_logged = '您还没有登录。'; + $lang->msg_insert_group_name = '请输入组名称'; + $lang->msg_check_group = '请选择组'; + + $lang->msg_not_uploaded_profile_image = '不能登录签名图像!'; + $lang->msg_not_uploaded_image_name = '不能登录昵称图像!'; + $lang->msg_not_uploaded_image_mark = '不能登录用户图标!'; + $lang->msg_not_uploaded_group_image_mark = '可以指定用户组图标。'; + + $lang->msg_accept_agreement = '您必须同意条款。'; + + $lang->msg_user_denied = '您输入的用户名已禁止使用!'; + $lang->msg_user_not_confirmed = '您的注册信息还没有被激活,请确认您的电子邮箱。'; + $lang->msg_user_limited = '您输入的用户名%s以后才可以开始使用。'; + + $lang->about_user_id = '用户名长度必须由 3 ~20 字以内的英文+数字组成,且首个字母必须是英文字母。'; + $lang->about_password = '密码长度必须在6~20字以内。'; + $lang->about_user_name = '姓名必须是2~20字以内。'; + $lang->about_nick_name = '昵称必须是2~20字以内。'; + $lang->about_email_address = '电子邮件地址除邮件认证外,在修改密码或找回密码时使用。'; + $lang->about_homepage = '请输入您的主页地址。'; + $lang->about_blog_url = '请输入博客地址。'; + $lang->about_birthday = '请输入您的出生年月日。'; + $lang->about_allow_mailing = '如不选择此项,以后不能接收站内发送的重要信息。'; + $lang->about_denied = '选择时不能使用此用户名。'; + $lang->about_is_admin = '选择时将具有最高管理权限。'; + $lang->about_member_description = '管理员对会员的备忘录。'; + $lang->about_group = '一个用户名可属多个用户组。'; + + $lang->about_column_type = '请选择要添加的注册表单格式。'; + $lang->about_column_name = '请输入在模板中可以使用的英文名称。(变数名)'; + $lang->about_column_title = '注册或修改/查看信息时要显示的标题。'; + $lang->about_default_value = '可以设置缺省值。'; + $lang->about_active = '必须选择此项后才可以正常启用。'; + $lang->about_form_description = '说明栏里输入的内容,注册时将会显示。'; + $lang->about_required = '注册时成为必填项目。'; + + $lang->about_enable_openid = '要想网站支持OpenID时请勾选此项。'; + $lang->about_enable_join = '选择此项后用户才可以注册。'; + $lang->about_enable_confirm = '为激活会员注册信息,将向会员输入的邮件地址发送注册认证邮件。'; + $lang->about_enable_ssl = '如服务器提供SSL协议服务,新会员注册/修改会员信息/登录等信息的传送将使用SSL(https)协议。'; + $lang->about_limit_day = '注册会员后的认证有效期限。'; + $lang->about_limit_date = '直到指定日期该用户不能登录。'; + $lang->about_after_login_url = '可以指定登录后的页面转向url(留空为当前页面)。'; + $lang->about_after_logout_url = '可以指定退出登录后的页面转向url(留空为当前页面)。'; + $lang->about_redirect_url = '请输入注册会员后的页面转向 url。(留空为返回前页)'; + $lang->about_agreement = '没有会员条款时不显示。'; + + $lang->about_image_name = '用户昵称可以用小图片来替代显示。'; + $lang->about_image_mark = '显示在用户昵称前的小图标。'; + $lang->about_group_image_mark = '用户名前显示用户组图标。'; + $lang->about_profile_image = '可以使用签名图片。'; + $lang->about_signature_max_height = '可以限制签名栏高度(0或留空为不限制)。'; + $lang->about_accept_agreement = '已阅读全部条款并同意。'; + + $lang->about_member_default = '将成为注册会员时的默认用户组。'; + + $lang->about_openid = '用OpenID注册时该网站只保存用户名和 邮件等基本信息,密码和认证处理是在提供OpenID服务的站点中得到解决。'; + $lang->about_openid_leave = '删除OpenID就等于永久删除站内用户的信息。
    被删除后的重新登录就等于新会员注册,因此对以前自己写的主题将失去相应权限。'; + $lang->about_find_member_account = '用户名/密码将发送到您注册时所输入的电子邮件当中。
    输入注册时的电子邮件地址后,请点击“查找用户名/密码”按钮。
    '; + + $lang->about_member = "可以添加/修改/删除会员及管理用户组或注册表单的会员管理模块。\n此模块不仅可以生成缺省用户组以外的其他用户组来管理会员,并且通过注册表单的管理获得除会员基本信息以外的扩展信息。"; + + $lang->about_resend_auth_mail = '没有收到认证邮件时,可以在此重新发送认证邮件。'; + + $lang->find_account_question = '비밀번호 찾기 질문/답변'; + $lang->find_account_answer = '비밀번호 찾기 답변'; + $lang->about_find_account_question = '가입시 아이디와 이메일, 질문/답변으로 임시 비밀번호를 발급 받을 수 있습니다.'; + /* + $lang->find_account_question_items = array('' + ,'다른 이메일 주소는?' + ,'나의 보물 1호는?' + ,'나의 출신 초등학교는?' + ,'나의 출신 고향은?' + ,'나의 이상형은?' + ,'어머니 성함은?' + ,'아버지 성함은?' + ,'가장 좋아하는 색깔은?' + ,'가장 좋아하는 음식은?' + ); +*/ + $lang->temp_password = '임시 비밀번호'; + $lang->cmd_get_temp_password = '임시 비밀번호 발급'; + $lang->about_get_temp_password = '로그인 후 비밀번호 변경해 주세요.'; + $lang->msg_question_not_exists = '등록한 비밀번호 찾기 질문/답변이 없습니다.'; + $lang->msg_answer_not_matches = '비밀번호 찾기 질문/답변 또는 정보가 올바르지 않습니다.'; + + $lang->change_password_date = '비밀번호 갱신주기'; + $lang->about_change_password_date = '일정기간이 지나면 비밀번호 변경을 하도록 유도하는 기능입니다. (사용하지 않음 : 0 입력) '; + +?> diff --git a/modules/member/lang/zh-TW.lang.php b/modules/member/lang/zh-TW.lang.php index 93a8c4d0b..ea12845ba 100644 --- a/modules/member/lang/zh-TW.lang.php +++ b/modules/member/lang/zh-TW.lang.php @@ -1,240 +1,240 @@ -member = '會員'; - $lang->member_default_info = '基本資料'; - $lang->member_extend_info = '延伸資料'; - $lang->default_group_1 = "準會員"; - $lang->default_group_2 = "正會員"; - $lang->admin_group = "管理組"; - $lang->keep_signed = '自動登入'; - $lang->remember_user_id = '儲存 ID'; - $lang->already_logged = '您已經登入!'; - $lang->denied_user_id = '被禁止的帳號。'; - $lang->null_user_id = '請輸入帳號。'; - $lang->null_password = '請輸入密碼。'; - $lang->invalid_authorization = '還沒有認證!'; - $lang->invalid_user_id= '該帳號不存在,請檢查您的輸入是否有誤!'; - $lang->invalid_password = '您的密碼不正確!'; - $lang->invalid_new_password = '新密碼不能與舊密碼相同'; - $lang->allow_mailing = '接收郵件'; - $lang->denied = '禁止使用'; - $lang->is_admin = '最高管理權限'; - $lang->group = '群組'; - $lang->group_title = '群組標題'; - $lang->group_srl = '群組編號'; - $lang->signature = '簽名檔'; - $lang->profile_image = '個人圖片'; - $lang->profile_image_max_width = '寬度限制'; - $lang->profile_image_max_height = '高度限制'; - $lang->image_name = '暱稱圖片'; - $lang->image_name_max_width = '寬度限制'; - $lang->image_name_max_height = '高度限制'; - $lang->image_mark = '用戶圖示'; - $lang->image_mark_max_width = '寬度限制'; - $lang->image_mark_max_height = '高度限制'; - $lang->group_image_mark = '群組圖示'; - $lang->group_image_mark_max_width = '寬度限制'; - $lang->group_image_mark_max_height = '高度限制'; - $lang->group_image_mark_order = '群組圖示順序'; - $lang->signature_max_height = '簽名檔高度限制'; - $lang->enable_openid = '支援 OpenID'; - $lang->enable_join = '允許會員註冊'; - $lang->enable_confirm = '使用郵件認證'; - $lang->enable_ssl = '使用 SSL 功能'; - $lang->security_sign_in = '使用安全登入'; - $lang->limit_day = '認證限制'; - $lang->limit_date = '限制日期'; - $lang->after_login_url = '登入後頁面轉向'; - $lang->after_logout_url = '登出後頁面轉向'; - $lang->redirect_url = '會員註冊後頁面轉向'; - $lang->agreement = '會員使用條款'; - $lang->accept_agreement = '同意條款'; - $lang->member_info = '會員資料'; - $lang->current_password = '舊密碼'; - $lang->openid = 'OpenID'; - $lang->allow_message = '接收短訊息'; - $lang->allow_message_type = array( - 'Y' => '全部允許', - 'F' => '允許好友', - 'N' => '全部禁止', - ); - $lang->about_allow_message = '可選擇是否接收短訊息。'; - $lang->logged_users = '線上會員'; - - $lang->webmaster_name = '管理員名稱'; - $lang->webmaster_email = '管理員電子郵件'; - - $lang->about_keep_signed = '關閉瀏覽器後也將維持登入狀態。
    使用此功能,可解決每次訪問都要輸入帳號及密碼的麻煩。
    為防止個人資料洩露,在網咖,學校等公共場所,請務必要確認解除登入狀態。'; - $lang->about_keep_warning = '關閉瀏覽器後也將維持登入狀態。
    使用此功能,可解決每次訪問都要輸入帳號及密碼的麻煩。
    為防止個人資料洩露,在網咖,學校等公共場所,請務必要確認解除登入狀態。'; - $lang->about_webmaster_name = '請輸入認證所需的電子郵件地址或管理其他網站時要使用的網站管理員名稱。(預設 : webmaster)'; - $lang->about_webmaster_email = '請輸入網站管理員的電子郵件地址。'; - - $lang->search_target_list = array( - 'user_id' => '帳號', - 'user_name' => '姓名', - 'nick_name' => '暱稱', - 'email_address' => '電子郵件', - 'regdate' => '註冊日期', - 'regdate_more' => '註冊日期(以上)', - 'regdate_less' => '註冊日期(以下)', - 'last_login' => '最近登入', - 'last_login_more' => '最近登入(以上)', - 'last_login_less' => '最近登入(以下)', - 'extra_vars' => '延伸變數', - ); - - $lang->cmd_login = '登入'; - $lang->cmd_logout = '登出'; - $lang->cmd_signup = '會員註冊'; - $lang->cmd_site_signup = '加入'; - $lang->cmd_modify_member_info = '修改會員資料'; - $lang->cmd_modify_member_password = '修改密碼'; - $lang->cmd_view_member_info = '檢視會員資料'; - $lang->cmd_leave = '退出'; - $lang->cmd_find_member_account = '查詢帳號/密碼'; - $lang->cmd_resend_auth_mail = '重寄認證郵件'; - - $lang->cmd_member_list = '會員列表'; - $lang->cmd_module_config = '基本設置'; - $lang->cmd_member_group = '群組管理'; - $lang->cmd_send_mail = '發送郵件'; - $lang->cmd_manage_id = '禁止帳號管理'; - $lang->cmd_manage_form = '註冊表單管理'; - $lang->cmd_view_own_document = '檢視發表主題'; - $lang->cmd_manage_member_info = '管理會員資料'; - $lang->cmd_trace_document = '主題追蹤'; - $lang->cmd_trace_comment = '評論追蹤'; - $lang->cmd_view_scrapped_document = '檢視收藏'; - $lang->cmd_view_saved_document = '檢視臨時儲存箱'; - $lang->cmd_send_email = '發送郵件'; - - $lang->msg_email_not_exists = '找不到您輸入的郵件地址。'; - - $lang->msg_alreay_scrapped = '已收藏的主題!'; - - $lang->msg_cart_is_null = '請選擇對象。'; - $lang->msg_checked_file_is_deleted = '已刪除%d個附檔。'; - - $lang->msg_find_account_title = '註冊資料。'; - $lang->msg_find_account_info = '您要尋找的註冊資料如下。'; - $lang->msg_find_account_comment = '按底下的連結,您的註冊密碼將更新為上述系統自動建立的密碼。
    請重新登入,將密碼更改為您想要的密碼。'; - $lang->msg_confirm_account_title = '會員註冊'; - $lang->msg_confirm_account_info = '您的註冊資料如下:'; - $lang->msg_confirm_account_comment = '請按下面連結完成會員認證。'; - $lang->msg_auth_mail_sent = '已向%s發送了認證郵件。請確認!!'; - $lang->msg_confirm_mail_sent = '已向%s發送了認證郵件。請確認!!'; - $lang->msg_invalid_auth_key = '錯誤的註冊資料請求。
    請重新尋找帳號及密碼,或聯繫管理員。'; - $lang->msg_success_authed = '新註冊的資料已得到認證。請用郵件中的新密碼修改成您要想使用的密碼。'; - $lang->msg_success_confirmed = '註冊資料已成功確認!'; - - $lang->msg_new_member = '會員註冊'; - $lang->msg_update_member = '修改會員資料'; - $lang->msg_leave_member = '會員退出'; - $lang->msg_group_is_null = '無群組。'; - $lang->msg_not_delete_default = '無法刪除基本項目'; - $lang->msg_not_exists_member = '不存在的帳號'; - $lang->msg_cannot_delete_admin = '無法解除管理員帳號,請解除管理後再刪除'; - $lang->msg_exists_user_id = '重複的帳號,請重新輸入。'; - $lang->msg_exists_email_address = '重複的電子郵件地址,請重新輸入電子郵件地址。'; - $lang->msg_exists_nick_name = '重複的暱稱,請重新輸入。'; - $lang->msg_signup_disabled = '無法註冊會員'; - $lang->msg_already_logged = '您是註冊會員。'; - $lang->msg_not_logged = '您還沒登入。'; - $lang->msg_insert_group_name = '請輸入群組名稱'; - $lang->msg_check_group = '請選擇群組'; - - $lang->msg_not_uploaded_profile_image = '無法登錄個人圖片!'; - $lang->msg_not_uploaded_image_name = '無法登錄暱稱圖片!'; - $lang->msg_not_uploaded_image_mark = '無法登錄用戶圖示!'; - $lang->msg_not_uploaded_group_image_mark = '無法登錄群組圖示!'; - - $lang->msg_accept_agreement = '您必須同意條款。'; - - $lang->msg_user_denied = '您輸入的帳號已禁止使用!'; - $lang->msg_user_not_confirmed = '您的註冊資料還沒有被確認,請確認您的電子郵箱。'; - $lang->msg_user_limited = '您輸入的帳號%s以後才可以開始使用。'; - - $lang->about_user_id = '帳號必須由 3~20 字以內的英文+數字組成,開頭必須是英文。'; - $lang->about_password = '密碼必須在 6~20 字以內。'; - $lang->about_user_name = '姓名必須是 2~20 字以內。'; - $lang->about_nick_name = '暱稱必須是 2~20 字以內。'; - $lang->about_email_address = '電子郵件地址除郵件認證外,當修改密碼或忘記密碼時也可以使用。'; - $lang->about_homepage = '請輸入您的網址。'; - $lang->about_blog_url = '請輸入部落格網址。'; - $lang->about_birthday = '請輸入您的出生年月日。'; - $lang->about_allow_mailing = '不選擇此項,以後無法接收站內發送的重要資料。'; - $lang->about_denied = '選擇時不能使用此帳號。'; - $lang->about_is_admin = '選擇時將具有最高管理權限。'; - $lang->about_member_description = '管理員對會員的註記。'; - $lang->about_group = '一個帳號可擁有多個群組。'; - - $lang->about_column_type = '請選擇要新增的註冊表單格式。'; - $lang->about_column_name = '請輸入在樣板中可以使用的英文名稱。(變數名稱)'; - $lang->about_column_title = '註冊或修改/檢視資料時要顯示的標題。'; - $lang->about_default_value = '可以設置預設值。'; - $lang->about_active = '必須選擇此項後才可以正常啟用。'; - $lang->about_form_description = '說明欄裡輸入的內容,在註冊時會顯示。'; - $lang->about_required = '註冊時成為必填項目。'; - - $lang->about_enable_openid = '想要網站支援 OpenID 時,請勾選此項。'; - $lang->about_enable_join = '選擇此項後,用戶才可以註冊。'; - $lang->about_enable_confirm = '為確認會員註冊資料,會向會員輸入的郵件地址發送註冊認證郵件。'; - $lang->about_enable_ssl = '如主機提供 SSL 認證服務,新會員註冊/修改會員資料/登入等資料的傳送將使用 SSL(https) 認證。'; - $lang->about_limit_day = '註冊會員後的認證有效期限。'; - $lang->about_limit_date = '直到指定日期,否則該帳號都無法登入。'; - $lang->about_after_login_url = '可以指定登入後的頁面轉向網址(留空為目前頁面)。'; - $lang->about_after_logout_url = '可以指定登出後的頁面轉向網址(留空為目前頁面)。'; - $lang->about_redirect_url = '請輸入會員註冊後的頁面轉向網址。(留空為返回前頁)'; - $lang->about_agreement = '沒有會員條款時不會顯示。'; - - $lang->about_image_name = '用戶暱稱可以用圖片替代。'; - $lang->about_image_mark = '顯示在用戶暱稱前的圖示。'; - $lang->about_group_image_mark = '顯示在用戶群組前的圖示。'; - $lang->about_profile_image = '可以使用個人圖片。'; - $lang->about_signature_max_height = '可以限制簽名檔高度(零或留空為不限制)。'; - $lang->about_accept_agreement = '已閱讀全部條款並同意。'; - - $lang->about_member_default = '將成為註冊會員時的預設群組。'; - - $lang->about_openid = '用 OpenID 註冊時,該網站只儲存帳號和郵件等基本資料,密碼和認證處理是在提供 OpenID 服務的網站中得到解決。'; - $lang->about_openid_leave = '刪除 OpenID 就等於永久刪除站內會員的資料。
    被刪除後,再重新登錄就等於新會員註冊,因此對以前自己寫的主題將失去其權限。'; - $lang->about_find_member_account = '帳號/密碼將發送到您註冊時,所輸入的電子郵件當中。
    輸入註冊時的電子郵件地址後,請按「查詢帳號/密碼」按鈕。
    '; - - $lang->about_member = "可以新增/修改/刪除會員及管理群組或註冊表單的會員管理模組。\n此模組不僅可以建立預設群組以外的其他群組來管理會員,並且通過註冊表單的管理獲得會員基本資料以外的延伸資料。"; - $lang->about_ssl_port = '請輸入想要使用 SSL 預設埠口以外的埠口。'; - $lang->add_openid = '新增 OpenID'; - - $lang->about_resend_auth_mail = '如果沒有收到認證郵件可以再重寄一次。'; - $lang->no_article = '主題不存在'; - - $lang->find_account_question = '密碼提示問答'; - $lang->find_account_answer = '비밀번호 찾기 답변'; - - $lang->about_find_account_question = '可透過帳號、電子郵件和設定提示問答來獲得臨時密碼。'; - $lang->find_account_question_items = array('' - ,'其他電子郵件?' - ,'我最愛的是?' - ,'我讀的國小是?' - ,'我的出生地?' - ,'我的理想?' - ,'母親的姓名?' - ,'父親的姓名?' - ,'最喜歡的顏色?' - ,'最愛的食物是?' - ); - - $lang->temp_password = '臨時密碼'; - $lang->cmd_get_temp_password = '取得臨時密碼'; - $lang->about_get_temp_password = '請再登入後變更密碼。'; - $lang->msg_question_not_exists = '尚未輸入提示問答'; - $lang->msg_answer_not_matches = '答案不正確'; - - $lang->change_password_date = '密碼更新'; - $lang->about_change_password_date = '可設定密碼更新週期,將會定期通知更換密碼。 (設為零則不使用)'; - -?> +member = '會員'; + $lang->member_default_info = '基本資料'; + $lang->member_extend_info = '延伸資料'; + $lang->default_group_1 = "準會員"; + $lang->default_group_2 = "正會員"; + $lang->admin_group = "管理組"; + $lang->keep_signed = '自動登入'; + $lang->remember_user_id = '儲存 ID'; + $lang->already_logged = '您已經登入!'; + $lang->denied_user_id = '被禁止的帳號。'; + $lang->null_user_id = '請輸入帳號。'; + $lang->null_password = '請輸入密碼。'; + $lang->invalid_authorization = '還沒有認證!'; + $lang->invalid_user_id= '該帳號不存在,請檢查您的輸入是否有誤!'; + $lang->invalid_password = '您的密碼不正確!'; + $lang->invalid_new_password = '新密碼不能與舊密碼相同'; + $lang->allow_mailing = '接收郵件'; + $lang->denied = '禁止使用'; + $lang->is_admin = '最高管理權限'; + $lang->group = '群組'; + $lang->group_title = '群組標題'; + $lang->group_srl = '群組編號'; + $lang->signature = '簽名檔'; + $lang->profile_image = '個人圖片'; + $lang->profile_image_max_width = '寬度限制'; + $lang->profile_image_max_height = '高度限制'; + $lang->image_name = '暱稱圖片'; + $lang->image_name_max_width = '寬度限制'; + $lang->image_name_max_height = '高度限制'; + $lang->image_mark = '用戶圖示'; + $lang->image_mark_max_width = '寬度限制'; + $lang->image_mark_max_height = '高度限制'; + $lang->group_image_mark = '群組圖示'; + $lang->group_image_mark_max_width = '寬度限制'; + $lang->group_image_mark_max_height = '高度限制'; + $lang->group_image_mark_order = '群組圖示順序'; + $lang->signature_max_height = '簽名檔高度限制'; + $lang->enable_openid = '支援 OpenID'; + $lang->enable_join = '允許會員註冊'; + $lang->enable_confirm = '使用郵件認證'; + $lang->enable_ssl = '使用 SSL 功能'; + $lang->security_sign_in = '使用安全登入'; + $lang->limit_day = '認證限制'; + $lang->limit_date = '限制日期'; + $lang->after_login_url = '登入後頁面轉向'; + $lang->after_logout_url = '登出後頁面轉向'; + $lang->redirect_url = '會員註冊後頁面轉向'; + $lang->agreement = '會員使用條款'; + $lang->accept_agreement = '同意條款'; + $lang->member_info = '會員資料'; + $lang->current_password = '舊密碼'; + $lang->openid = 'OpenID'; + $lang->allow_message = '接收短訊息'; + $lang->allow_message_type = array( + 'Y' => '全部允許', + 'F' => '允許好友', + 'N' => '全部禁止', + ); + $lang->about_allow_message = '可選擇是否接收短訊息。'; + $lang->logged_users = '線上會員'; + + $lang->webmaster_name = '管理員名稱'; + $lang->webmaster_email = '管理員電子郵件'; + + $lang->about_keep_signed = '關閉瀏覽器後也將維持登入狀態。
    使用此功能,可解決每次訪問都要輸入帳號及密碼的麻煩。
    為防止個人資料洩露,在網咖,學校等公共場所,請務必要確認解除登入狀態。'; + $lang->about_keep_warning = '關閉瀏覽器後也將維持登入狀態。
    使用此功能,可解決每次訪問都要輸入帳號及密碼的麻煩。
    為防止個人資料洩露,在網咖,學校等公共場所,請務必要確認解除登入狀態。'; + $lang->about_webmaster_name = '請輸入認證所需的電子郵件地址或管理其他網站時要使用的網站管理員名稱。(預設 : webmaster)'; + $lang->about_webmaster_email = '請輸入網站管理員的電子郵件地址。'; + + $lang->search_target_list = array( + 'user_id' => '帳號', + 'user_name' => '姓名', + 'nick_name' => '暱稱', + 'email_address' => '電子郵件', + 'regdate' => '註冊日期', + 'regdate_more' => '註冊日期(以上)', + 'regdate_less' => '註冊日期(以下)', + 'last_login' => '最近登入', + 'last_login_more' => '最近登入(以上)', + 'last_login_less' => '最近登入(以下)', + 'extra_vars' => '延伸變數', + ); + + $lang->cmd_login = '登入'; + $lang->cmd_logout = '登出'; + $lang->cmd_signup = '會員註冊'; + $lang->cmd_site_signup = '加入'; + $lang->cmd_modify_member_info = '修改會員資料'; + $lang->cmd_modify_member_password = '修改密碼'; + $lang->cmd_view_member_info = '檢視會員資料'; + $lang->cmd_leave = '退出'; + $lang->cmd_find_member_account = '查詢帳號/密碼'; + $lang->cmd_resend_auth_mail = '重寄認證郵件'; + + $lang->cmd_member_list = '會員列表'; + $lang->cmd_module_config = '基本設置'; + $lang->cmd_member_group = '群組管理'; + $lang->cmd_send_mail = '發送郵件'; + $lang->cmd_manage_id = '禁止帳號管理'; + $lang->cmd_manage_form = '註冊表單管理'; + $lang->cmd_view_own_document = '檢視發表主題'; + $lang->cmd_manage_member_info = '管理會員資料'; + $lang->cmd_trace_document = '主題追蹤'; + $lang->cmd_trace_comment = '評論追蹤'; + $lang->cmd_view_scrapped_document = '檢視收藏'; + $lang->cmd_view_saved_document = '檢視臨時儲存箱'; + $lang->cmd_send_email = '發送郵件'; + + $lang->msg_email_not_exists = '找不到您輸入的郵件地址。'; + + $lang->msg_alreay_scrapped = '已收藏的主題!'; + + $lang->msg_cart_is_null = '請選擇對象。'; + $lang->msg_checked_file_is_deleted = '已刪除%d個附檔。'; + + $lang->msg_find_account_title = '註冊資料。'; + $lang->msg_find_account_info = '您要尋找的註冊資料如下。'; + $lang->msg_find_account_comment = '按底下的連結,您的註冊密碼將更新為上述系統自動建立的密碼。
    請重新登入,將密碼更改為您想要的密碼。'; + $lang->msg_confirm_account_title = '會員註冊'; + $lang->msg_confirm_account_info = '您的註冊資料如下:'; + $lang->msg_confirm_account_comment = '請按下面連結完成會員認證。'; + $lang->msg_auth_mail_sent = '已向%s發送了認證郵件。請確認!!'; + $lang->msg_confirm_mail_sent = '已向%s發送了認證郵件。請確認!!'; + $lang->msg_invalid_auth_key = '錯誤的註冊資料請求。
    請重新尋找帳號及密碼,或聯繫管理員。'; + $lang->msg_success_authed = '新註冊的資料已得到認證。請用郵件中的新密碼修改成您要想使用的密碼。'; + $lang->msg_success_confirmed = '註冊資料已成功確認!'; + + $lang->msg_new_member = '會員註冊'; + $lang->msg_update_member = '修改會員資料'; + $lang->msg_leave_member = '會員退出'; + $lang->msg_group_is_null = '無群組。'; + $lang->msg_not_delete_default = '無法刪除基本項目'; + $lang->msg_not_exists_member = '不存在的帳號'; + $lang->msg_cannot_delete_admin = '無法解除管理員帳號,請解除管理後再刪除'; + $lang->msg_exists_user_id = '重複的帳號,請重新輸入。'; + $lang->msg_exists_email_address = '重複的電子郵件地址,請重新輸入電子郵件地址。'; + $lang->msg_exists_nick_name = '重複的暱稱,請重新輸入。'; + $lang->msg_signup_disabled = '無法註冊會員'; + $lang->msg_already_logged = '您是註冊會員。'; + $lang->msg_not_logged = '您還沒登入。'; + $lang->msg_insert_group_name = '請輸入群組名稱'; + $lang->msg_check_group = '請選擇群組'; + + $lang->msg_not_uploaded_profile_image = '無法登錄個人圖片!'; + $lang->msg_not_uploaded_image_name = '無法登錄暱稱圖片!'; + $lang->msg_not_uploaded_image_mark = '無法登錄用戶圖示!'; + $lang->msg_not_uploaded_group_image_mark = '無法登錄群組圖示!'; + + $lang->msg_accept_agreement = '您必須同意條款。'; + + $lang->msg_user_denied = '您輸入的帳號已禁止使用!'; + $lang->msg_user_not_confirmed = '您的註冊資料還沒有被確認,請確認您的電子郵箱。'; + $lang->msg_user_limited = '您輸入的帳號%s以後才可以開始使用。'; + + $lang->about_user_id = '帳號必須由 3~20 字以內的英文+數字組成,開頭必須是英文。'; + $lang->about_password = '密碼必須在 6~20 字以內。'; + $lang->about_user_name = '姓名必須是 2~20 字以內。'; + $lang->about_nick_name = '暱稱必須是 2~20 字以內。'; + $lang->about_email_address = '電子郵件地址除郵件認證外,當修改密碼或忘記密碼時也可以使用。'; + $lang->about_homepage = '請輸入您的網址。'; + $lang->about_blog_url = '請輸入部落格網址。'; + $lang->about_birthday = '請輸入您的出生年月日。'; + $lang->about_allow_mailing = '不選擇此項,以後無法接收站內發送的重要資料。'; + $lang->about_denied = '選擇時不能使用此帳號。'; + $lang->about_is_admin = '選擇時將具有最高管理權限。'; + $lang->about_member_description = '管理員對會員的註記。'; + $lang->about_group = '一個帳號可擁有多個群組。'; + + $lang->about_column_type = '請選擇要新增的註冊表單格式。'; + $lang->about_column_name = '請輸入在樣板中可以使用的英文名稱。(變數名稱)'; + $lang->about_column_title = '註冊或修改/檢視資料時要顯示的標題。'; + $lang->about_default_value = '可以設置預設值。'; + $lang->about_active = '必須選擇此項後才可以正常啟用。'; + $lang->about_form_description = '說明欄裡輸入的內容,在註冊時會顯示。'; + $lang->about_required = '註冊時成為必填項目。'; + + $lang->about_enable_openid = '想要網站支援 OpenID 時,請勾選此項。'; + $lang->about_enable_join = '選擇此項後,用戶才可以註冊。'; + $lang->about_enable_confirm = '為確認會員註冊資料,會向會員輸入的郵件地址發送註冊認證郵件。'; + $lang->about_enable_ssl = '如主機提供 SSL 認證服務,新會員註冊/修改會員資料/登入等資料的傳送將使用 SSL(https) 認證。'; + $lang->about_limit_day = '註冊會員後的認證有效期限。'; + $lang->about_limit_date = '直到指定日期,否則該帳號都無法登入。'; + $lang->about_after_login_url = '可以指定登入後的頁面轉向網址(留空為目前頁面)。'; + $lang->about_after_logout_url = '可以指定登出後的頁面轉向網址(留空為目前頁面)。'; + $lang->about_redirect_url = '請輸入會員註冊後的頁面轉向網址。(留空為返回前頁)'; + $lang->about_agreement = '沒有會員條款時不會顯示。'; + + $lang->about_image_name = '用戶暱稱可以用圖片替代。'; + $lang->about_image_mark = '顯示在用戶暱稱前的圖示。'; + $lang->about_group_image_mark = '顯示在用戶群組前的圖示。'; + $lang->about_profile_image = '可以使用個人圖片。'; + $lang->about_signature_max_height = '可以限制簽名檔高度(零或留空為不限制)。'; + $lang->about_accept_agreement = '已閱讀全部條款並同意。'; + + $lang->about_member_default = '將成為註冊會員時的預設群組。'; + + $lang->about_openid = '用 OpenID 註冊時,該網站只儲存帳號和郵件等基本資料,密碼和認證處理是在提供 OpenID 服務的網站中得到解決。'; + $lang->about_openid_leave = '刪除 OpenID 就等於永久刪除站內會員的資料。
    被刪除後,再重新登錄就等於新會員註冊,因此對以前自己寫的主題將失去其權限。'; + $lang->about_find_member_account = '帳號/密碼將發送到您註冊時,所輸入的電子郵件當中。
    輸入註冊時的電子郵件地址後,請按「查詢帳號/密碼」按鈕。
    '; + + $lang->about_member = "可以新增/修改/刪除會員及管理群組或註冊表單的會員管理模組。\n此模組不僅可以建立預設群組以外的其他群組來管理會員,並且通過註冊表單的管理獲得會員基本資料以外的延伸資料。"; + $lang->about_ssl_port = '請輸入想要使用 SSL 預設埠口以外的埠口。'; + $lang->add_openid = '新增 OpenID'; + + $lang->about_resend_auth_mail = '如果沒有收到認證郵件可以再重寄一次。'; + $lang->no_article = '主題不存在'; + + $lang->find_account_question = '密碼提示問答'; + $lang->find_account_answer = '비밀번호 찾기 답변'; + + $lang->about_find_account_question = '可透過帳號、電子郵件和設定提示問答來獲得臨時密碼。'; + $lang->find_account_question_items = array('' + ,'其他電子郵件?' + ,'我最愛的是?' + ,'我讀的國小是?' + ,'我的出生地?' + ,'我的理想?' + ,'母親的姓名?' + ,'父親的姓名?' + ,'最喜歡的顏色?' + ,'最愛的食物是?' + ); + + $lang->temp_password = '臨時密碼'; + $lang->cmd_get_temp_password = '取得臨時密碼'; + $lang->about_get_temp_password = '請再登入後變更密碼。'; + $lang->msg_question_not_exists = '尚未輸入提示問答'; + $lang->msg_answer_not_matches = '答案不正確'; + + $lang->change_password_date = '密碼更新'; + $lang->about_change_password_date = '可設定密碼更新週期,將會定期通知更換密碼。 (設為零則不使用)'; + +?> diff --git a/modules/member/member.admin.controller.php b/modules/member/member.admin.controller.php index 69b1773a7..caab036e7 100644 --- a/modules/member/member.admin.controller.php +++ b/modules/member/member.admin.controller.php @@ -1,539 +1,539 @@ -module); - unset($all_args->act); - if(!isset($args->limit_date)) $args->limit_date = ""; - - // 모든 request argument에서 필수 정보만 제외 한 후 추가 데이터로 입력 - $extra_vars = delObjectVars($all_args, $args); - $args->extra_vars = serialize($extra_vars); - - // member_srl이 넘어오면 원 회원이 있는지 확인 - if($args->member_srl) { - // 멤버 모델 객체 생성 - $oMemberModel = &getModel('member'); - - // 회원 정보 구하기 - $member_info = $oMemberModel->getMemberInfoByMemberSrl($args->member_srl); - - // 만약 원래 회원이 없으면 새로 입력하기 위한 처리 - if($member_info->member_srl != $args->member_srl) unset($args->member_srl); - } - - $oMemberController = &getController('member'); - - // member_srl의 값에 따라 insert/update - if(!$args->member_srl) { - $output = $oMemberController->insertMember($args); - $msg_code = 'success_registed'; - } else { - $output = $oMemberController->updateMember($args); - $msg_code = 'success_updated'; - } - - if(!$output->toBool()) return $output; - - // 서명 저장 - $signature = Context::get('signature'); - $oMemberController->putSignature($args->member_srl, $signature); - - // 결과 리턴 - $this->add('member_srl', $args->member_srl); - $this->setMessage($msg_code); - } - - /** - * @brief 사용자 삭제 (관리자용) - **/ - function procMemberAdminDelete() { - // 일단 입력된 값들을 모두 받아서 db 입력항목과 그외 것으로 분리 - $member_srl = Context::get('member_srl'); - - $oMemberController = &getController('member'); - $output = $oMemberController->deleteMember($member_srl); - if(!$output->toBool()) return $output; - - $this->add('page',Context::get('page')); - $this->setMessage("success_deleted"); - } - - /** - * @brief 회원 관리용 기본 정보의 추가 - **/ - function procMemberAdminInsertConfig() { - // 기본 정보를 받음 - $args = Context::gets( - 'webmaster_name', 'webmaster_email', - 'skin', 'colorset', - 'editor_skin', 'editor_colorset', - 'enable_openid', 'enable_join', 'enable_confirm', 'limit_day', - 'after_login_url', 'after_logout_url', 'redirect_url', 'agreement', - 'profile_image', 'profile_image_max_width', 'profile_image_max_height', - 'image_name', 'image_name_max_width', 'image_name_max_height', - 'image_mark', 'image_mark_max_width', 'image_mark_max_height', - 'group_image_mark', 'group_image_mark_max_width', 'group_image_mark_max_height', - 'signature','signature_max_height','change_password_date' - ); - - if(!$args->skin) $args->skin = "default"; - if(!$args->colorset) $args->colorset = "white"; - if(!$args->editor_skin) $args->editor_skin= "xpresseditor"; - if(!$args->editor_colorset) $args->editor_colorset = "white"; - if($args->enable_join!='Y') $args->enable_join = 'N'; - if($args->enable_openid!='Y') $args->enable_openid= 'N'; - if($args->profile_image !='Y') $args->profile_image = 'N'; - if($args->image_name!='Y') $args->image_name = 'N'; - if($args->image_mark!='Y') $args->image_mark = 'N'; - if($args->group_image_mark!='Y') $args->group_image_mark = 'N'; - if($args->signature!='Y') $args->signature = 'N'; - if(!trim(strip_tags($args->agreement))) $args->agreement = null; - $args->limit_day = (int)$args->limit_day; - if(!$args->change_password_date) $args->change_password_date = 0; - - $oMemberController = &getController('member'); - $output = $oMemberController->setMemberConfig($args); - return $output; - } - - /** - * @brief 사용자 그룹 추가 - **/ - function procMemberAdminInsertGroup() { - $args = Context::gets('title','description','is_default','image_mark'); - $output = $this->insertGroup($args); - if(!$output->toBool()) return $output; - - $this->add('group_srl',''); - $this->add('page',Context::get('page')); - $this->setMessage('success_registed'); - } - - /** - * @brief 사용자 그룹 정보 수정 - **/ - function procMemberAdminUpdateGroup() { - $group_srl = Context::get('group_srl'); - $mode = Context::get('mode'); - - switch($mode) { - case 'delete' : - $output = $this->deleteGroup($group_srl); - if(!$output->toBool()) return $output; - $msg_code = 'success_deleted'; - break; - case 'update' : - $args = Context::gets('group_srl','title','description','is_default','image_mark'); - $args->site_srl = 0; - $output = $this->updateGroup($args); - if(!$output->toBool()) return $output; - $msg_code = 'success_updated'; - break; - } - - $this->add('group_srl',''); - $this->add('page',Context::get('page')); - $this->setMessage($msg_code); - } - - /** - * @brief 가입 항목 추가 - **/ - function procMemberAdminInsertJoinForm() { - $args->member_join_form_srl = Context::get('member_join_form_srl'); - - $args->column_type = Context::get('column_type'); - $args->column_name = strtolower(Context::get('column_name')); - $args->column_title = Context::get('column_title'); - $args->default_value = explode('|@|', Context::get('default_value')); - $args->is_active = Context::get('is_active'); - if(!in_array(strtoupper($args->is_active), array('Y','N'))) $args->is_active = 'N'; - $args->required = Context::get('required'); - if(!in_array(strtoupper($args->required), array('Y','N'))) $args->required = 'N'; - $args->description = Context::get('description'); - - // 기본값의 정리 - if(in_array($args->column_type, array('checkbox','select','radio')) && count($args->default_value) ) { - $args->default_value = serialize($args->default_value); - } else { - $args->default_value = ''; - } - - // member_join_form_srl이 있으면 수정, 없으면 추가 - if(!$args->member_join_form_srl){ - $args->list_order = getNextSequence(); - $output = executeQuery('member.insertJoinForm', $args); - }else{ - $output = executeQuery('member.updateJoinForm', $args); - } - - if(!$output->toBool()) return $output; - - $this->add('act','dispJoinForm'); - $this->setMessage('success_registed'); - } - - /** - * @brief 가입 항목의 상/하 이동 및 내용 수정 - **/ - function procMemberAdminUpdateJoinForm() { - $member_join_form_srl = Context::get('member_join_form_srl'); - $mode = Context::get('mode'); - - switch($mode) { - case 'up' : - $output = $this->moveJoinFormUp($member_join_form_srl); - $msg_code = 'success_moved'; - break; - case 'down' : - $output = $this->moveJoinFormDown($member_join_form_srl); - $msg_code = 'success_moved'; - break; - case 'delete' : - $output = $this->deleteJoinForm($member_join_form_srl); - $msg_code = 'success_deleted'; - break; - case 'update' : - break; - } - if(!$output->toBool()) return $output; - - $this->setMessage($msg_code); - } - - /** - * @brief 선택된 회원들을 일괄 삭제 - */ - function procMemberAdminDeleteMembers() { - $target_member_srls = Context::get('target_member_srls'); - if(!$target_member_srls) return new Object(-1, 'msg_invalid_request'); - $member_srls = explode(',', $target_member_srls); - $oMemberController = &getController('member'); - - foreach($member_srls as $member) { - $output = $oMemberController->deleteMember($member); - if(!$output->toBool()) { - $this->setMessage('failed_deleted'); - return $output; - } - } - - $this->setMessage('success_deleted'); - } - - /** - * @brief 선택된 회원들의 그룹을 일괄 변경 - **/ - function procMemberAdminUpdateMembersGroup() { - $member_srl = Context::get('member_srl'); - if(!$member_srl) return new Object(-1,'msg_invalid_request'); - $member_srls = explode(',',$member_srl); - - $group_srl = Context::get('group_srls'); - $group_srls = explode('|@|', $group_srl); - if(!$group_srl) return new Object(-1,'msg_check_group'); - - $oDB = &DB::getInstance(); - $oDB->begin(); - - // 선택된 회원들의 그룹을 삭제 - $args->member_srl = $member_srl; - $output = executeQuery('member.deleteMembersGroup', $args); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - // 선택된 그룹으로 추가 - $group_count = count($group_srls); - $member_count = count($member_srls); - for($j=0;$j<$group_count;$j++) { - $group_srl = (int)trim($group_srls[$j]); - if(!$group_srl) continue; - for($i=0;$i<$member_count;$i++) { - $member_srl = (int)trim($member_srls[$i]); - if(!$member_srl) continue; - - $args = null; - $args->member_srl = $member_srl; - $args->group_srl = $group_srl; - - $output = executeQuery('member.addMemberToGroup', $args); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - } - } - $oDB->commit(); - - $this->setMessage('success_updated'); - } - - /** - * @brief 금지 아이디 추가 - **/ - function procMemberAdminInsertDeniedID() { - $user_id = Context::get('user_id'); - $description = Context::get('description'); - - $output = $this->insertDeniedID($user_id, $description); - if(!$output->toBool()) return $output; - - $this->add('group_srl',''); - $this->add('page',Context::get('page')); - $this->setMessage('success_registed'); - } - - /** - * @brief 금지 아이디 업데이트 - **/ - function procMemberAdminUpdateDeniedID() { - $user_id = Context::get('user_id'); - $mode = Context::get('mode'); - - switch($mode) { - case 'delete' : - $output = $this->deleteDeniedID($user_id); - if(!$output->toBool()) return $output; - $msg_code = 'success_deleted'; - break; - } - - $this->add('page',Context::get('page')); - $this->setMessage($msg_code); - } - - /** - * @brief 관리자를 추가한다 - **/ - function insertAdmin($args) { - // 관리자임을 설정 - $args->is_admin = 'Y'; - - // 관리자 그룹을 구해와서 설정 - $oMemberModel = &getModel('member'); - $admin_group = $oMemberModel->getAdminGroup(); - $args->group_srl_list = $admin_group->group_srl; - - $oMemberController = &getController('member'); - return $oMemberController->insertMember($args); - } - - /** - * @brief 회원의 그룹값을 변경 - **/ - function changeGroup($source_group_srl, $target_group_srl) { - $args->source_group_srl = $source_group_srl; - $args->target_group_srl = $target_group_srl; - - return executeQuery('member.changeGroup', $args); - } - - /** - * @brief 그룹 등록 - **/ - function insertGroup($args) { - if(!$args->site_srl) $args->site_srl = 0; - // is_default값을 체크, Y일 경우 일단 모든 is_default에 대해서 N 처리 - if($args->is_default!='Y') { - $args->is_default = 'N'; - } else { - $output = executeQuery('member.updateGroupDefaultClear', $args); - if(!$output->toBool()) return $output; - } - - return executeQuery('member.insertGroup', $args); - } - - /** - * @brief 그룹 정보 수정 - **/ - function updateGroup($args) { - // is_default값을 체크, Y일 경우 일단 모든 is_default에 대해서 N 처리 - if($args->is_default!='Y') $args->is_default = 'N'; - else { - $output = executeQuery('member.updateGroupDefaultClear', $args); - if(!$output->toBool()) return $output; - } - - return executeQuery('member.updateGroup', $args); - } - - /** - * 그룹 삭제 - **/ - function deleteGroup($group_srl, $site_srl = null) { - // 멤버모델 객체 생성 - $oMemberModel = &getModel('member'); - - // 삭제 대상 그룹을 가져와서 체크 (is_default == 'Y'일 경우 삭제 불가) - $group_info = $oMemberModel->getGroup($group_srl); - - if(!$group_info) return new Object(-1, 'lang->msg_not_founded'); - if($group_info->is_default == 'Y') return new Object(-1, 'msg_not_delete_default'); - - // is_default == 'Y'인 그룹을 가져옴 - $default_group = $oMemberModel->getDefaultGroup($site_srl); - $default_group_srl = $default_group->group_srl; - - // default_group_srl로 변경 - $this->changeGroup($group_srl, $default_group_srl); - - $args->group_srl = $group_srl; - return executeQuery('member.deleteGroup', $args); - } - - - function procMemberAdminGroupImageMarkUpdateOrder() { - $oModuleModel = &getModel('module'); - $oModuleControll = getController('module'); - - $config = $oModuleModel->getModuleConfig('member'); - // $config->group_image_mark_order = Context::get('group_image_mark_order'); - - $oModuleControll->insertModuleConfig('member', $config); - } - - /** - * @brief 금지아이디 등록 - **/ - function insertDeniedID($user_id, $description = '') { - $args->user_id = $user_id; - $args->description = $description; - $args->list_order = -1*getNextSequence(); - - return executeQuery('member.insertDeniedID', $args); - } - - /** - * @brief 금지아이디 삭제 - **/ - function deleteDeniedID($user_id) { - $args->user_id = $user_id; - return executeQuery('member.deleteDeniedID', $args); - } - - /** - * @brief 가입폼 항목을 삭제 - **/ - function deleteJoinForm($member_join_form_srl) { - $args->member_join_form_srl = $member_join_form_srl; - $output = executeQuery('member.deleteJoinForm', $args); - return $output; - } - - /** - * @brief 가입항목을 상단으로 이동 - **/ - function moveJoinFormUp($member_join_form_srl) { - $oMemberModel = &getModel('member'); - - // 선택된 가입항목의 정보를 구한다 - $args->member_join_form_srl = $member_join_form_srl; - $output = executeQuery('member.getJoinForm', $args); - - $join_form = $output->data; - $list_order = $join_form->list_order; - - // 전체 가입항목 목록을 구한다 - $join_form_list = $oMemberModel->getJoinFormList(); - $join_form_srl_list = array_keys($join_form_list); - if(count($join_form_srl_list)<2) return new Object(); - - $prev_member_join_form = NULL; - foreach($join_form_list as $key => $val) { - if($val->member_join_form_srl == $member_join_form_srl) break; - $prev_member_join_form = $val; - } - - // 이전 가입항목가 없으면 그냥 return - if(!$prev_member_join_form) return new Object(); - - // 선택한 가입항목의 정보 - $cur_args->member_join_form_srl = $member_join_form_srl; - $cur_args->list_order = $prev_member_join_form->list_order; - - // 대상 가입항목의 정보 - $prev_args->member_join_form_srl = $prev_member_join_form->member_join_form_srl; - $prev_args->list_order = $list_order; - - // DB 처리 - $output = executeQuery('member.updateMemberJoinFormListorder', $cur_args); - if(!$output->toBool()) return $output; - - executeQuery('member.updateMemberJoinFormListorder', $prev_args); - if(!$output->toBool()) return $output; - - return new Object(); - } - - /** - * @brief 가입항목을 하단으로 이동 - **/ - function moveJoinFormDown($member_join_form_srl) { - $oMemberModel = &getModel('member'); - - // 선택된 가입항목의 정보를 구한다 - $args->member_join_form_srl = $member_join_form_srl; - $output = executeQuery('member.getJoinForm', $args); - - $join_form = $output->data; - $list_order = $join_form->list_order; - - // 전체 가입항목 목록을 구한다 - $join_form_list = $oMemberModel->getJoinFormList(); - $join_form_srl_list = array_keys($join_form_list); - if(count($join_form_srl_list)<2) return new Object(); - - for($i=0;$imember_join_form_srl = $member_join_form_srl; - $cur_args->list_order = $next_member_join_form->list_order; - - // 대상 가입항목의 정보 - $next_args->member_join_form_srl = $next_member_join_form->member_join_form_srl; - $next_args->list_order = $list_order; - - // DB 처리 - $output = executeQuery('member.updateMemberJoinFormListorder', $cur_args); - if(!$output->toBool()) return $output; - - $output = executeQuery('member.updateMemberJoinFormListorder', $next_args); - if(!$output->toBool()) return $output; - - return new Object(); - } - } -?> +module); + unset($all_args->act); + if(!isset($args->limit_date)) $args->limit_date = ""; + + // 모든 request argument에서 필수 정보만 제외 한 후 추가 데이터로 입력 + $extra_vars = delObjectVars($all_args, $args); + $args->extra_vars = serialize($extra_vars); + + // member_srl이 넘어오면 원 회원이 있는지 확인 + if($args->member_srl) { + // 멤버 모델 객체 생성 + $oMemberModel = &getModel('member'); + + // 회원 정보 구하기 + $member_info = $oMemberModel->getMemberInfoByMemberSrl($args->member_srl); + + // 만약 원래 회원이 없으면 새로 입력하기 위한 처리 + if($member_info->member_srl != $args->member_srl) unset($args->member_srl); + } + + $oMemberController = &getController('member'); + + // member_srl의 값에 따라 insert/update + if(!$args->member_srl) { + $output = $oMemberController->insertMember($args); + $msg_code = 'success_registed'; + } else { + $output = $oMemberController->updateMember($args); + $msg_code = 'success_updated'; + } + + if(!$output->toBool()) return $output; + + // 서명 저장 + $signature = Context::get('signature'); + $oMemberController->putSignature($args->member_srl, $signature); + + // 결과 리턴 + $this->add('member_srl', $args->member_srl); + $this->setMessage($msg_code); + } + + /** + * @brief 사용자 삭제 (관리자용) + **/ + function procMemberAdminDelete() { + // 일단 입력된 값들을 모두 받아서 db 입력항목과 그외 것으로 분리 + $member_srl = Context::get('member_srl'); + + $oMemberController = &getController('member'); + $output = $oMemberController->deleteMember($member_srl); + if(!$output->toBool()) return $output; + + $this->add('page',Context::get('page')); + $this->setMessage("success_deleted"); + } + + /** + * @brief 회원 관리용 기본 정보의 추가 + **/ + function procMemberAdminInsertConfig() { + // 기본 정보를 받음 + $args = Context::gets( + 'webmaster_name', 'webmaster_email', + 'skin', 'colorset', + 'editor_skin', 'editor_colorset', + 'enable_openid', 'enable_join', 'enable_confirm', 'limit_day', + 'after_login_url', 'after_logout_url', 'redirect_url', 'agreement', + 'profile_image', 'profile_image_max_width', 'profile_image_max_height', + 'image_name', 'image_name_max_width', 'image_name_max_height', + 'image_mark', 'image_mark_max_width', 'image_mark_max_height', + 'group_image_mark', 'group_image_mark_max_width', 'group_image_mark_max_height', + 'signature','signature_max_height','change_password_date' + ); + + if(!$args->skin) $args->skin = "default"; + if(!$args->colorset) $args->colorset = "white"; + if(!$args->editor_skin) $args->editor_skin= "xpresseditor"; + if(!$args->editor_colorset) $args->editor_colorset = "white"; + if($args->enable_join!='Y') $args->enable_join = 'N'; + if($args->enable_openid!='Y') $args->enable_openid= 'N'; + if($args->profile_image !='Y') $args->profile_image = 'N'; + if($args->image_name!='Y') $args->image_name = 'N'; + if($args->image_mark!='Y') $args->image_mark = 'N'; + if($args->group_image_mark!='Y') $args->group_image_mark = 'N'; + if($args->signature!='Y') $args->signature = 'N'; + if(!trim(strip_tags($args->agreement))) $args->agreement = null; + $args->limit_day = (int)$args->limit_day; + if(!$args->change_password_date) $args->change_password_date = 0; + + $oMemberController = &getController('member'); + $output = $oMemberController->setMemberConfig($args); + return $output; + } + + /** + * @brief 사용자 그룹 추가 + **/ + function procMemberAdminInsertGroup() { + $args = Context::gets('title','description','is_default','image_mark'); + $output = $this->insertGroup($args); + if(!$output->toBool()) return $output; + + $this->add('group_srl',''); + $this->add('page',Context::get('page')); + $this->setMessage('success_registed'); + } + + /** + * @brief 사용자 그룹 정보 수정 + **/ + function procMemberAdminUpdateGroup() { + $group_srl = Context::get('group_srl'); + $mode = Context::get('mode'); + + switch($mode) { + case 'delete' : + $output = $this->deleteGroup($group_srl); + if(!$output->toBool()) return $output; + $msg_code = 'success_deleted'; + break; + case 'update' : + $args = Context::gets('group_srl','title','description','is_default','image_mark'); + $args->site_srl = 0; + $output = $this->updateGroup($args); + if(!$output->toBool()) return $output; + $msg_code = 'success_updated'; + break; + } + + $this->add('group_srl',''); + $this->add('page',Context::get('page')); + $this->setMessage($msg_code); + } + + /** + * @brief 가입 항목 추가 + **/ + function procMemberAdminInsertJoinForm() { + $args->member_join_form_srl = Context::get('member_join_form_srl'); + + $args->column_type = Context::get('column_type'); + $args->column_name = strtolower(Context::get('column_name')); + $args->column_title = Context::get('column_title'); + $args->default_value = explode('|@|', Context::get('default_value')); + $args->is_active = Context::get('is_active'); + if(!in_array(strtoupper($args->is_active), array('Y','N'))) $args->is_active = 'N'; + $args->required = Context::get('required'); + if(!in_array(strtoupper($args->required), array('Y','N'))) $args->required = 'N'; + $args->description = Context::get('description'); + + // 기본값의 정리 + if(in_array($args->column_type, array('checkbox','select','radio')) && count($args->default_value) ) { + $args->default_value = serialize($args->default_value); + } else { + $args->default_value = ''; + } + + // member_join_form_srl이 있으면 수정, 없으면 추가 + if(!$args->member_join_form_srl){ + $args->list_order = getNextSequence(); + $output = executeQuery('member.insertJoinForm', $args); + }else{ + $output = executeQuery('member.updateJoinForm', $args); + } + + if(!$output->toBool()) return $output; + + $this->add('act','dispJoinForm'); + $this->setMessage('success_registed'); + } + + /** + * @brief 가입 항목의 상/하 이동 및 내용 수정 + **/ + function procMemberAdminUpdateJoinForm() { + $member_join_form_srl = Context::get('member_join_form_srl'); + $mode = Context::get('mode'); + + switch($mode) { + case 'up' : + $output = $this->moveJoinFormUp($member_join_form_srl); + $msg_code = 'success_moved'; + break; + case 'down' : + $output = $this->moveJoinFormDown($member_join_form_srl); + $msg_code = 'success_moved'; + break; + case 'delete' : + $output = $this->deleteJoinForm($member_join_form_srl); + $msg_code = 'success_deleted'; + break; + case 'update' : + break; + } + if(!$output->toBool()) return $output; + + $this->setMessage($msg_code); + } + + /** + * @brief 선택된 회원들을 일괄 삭제 + */ + function procMemberAdminDeleteMembers() { + $target_member_srls = Context::get('target_member_srls'); + if(!$target_member_srls) return new Object(-1, 'msg_invalid_request'); + $member_srls = explode(',', $target_member_srls); + $oMemberController = &getController('member'); + + foreach($member_srls as $member) { + $output = $oMemberController->deleteMember($member); + if(!$output->toBool()) { + $this->setMessage('failed_deleted'); + return $output; + } + } + + $this->setMessage('success_deleted'); + } + + /** + * @brief 선택된 회원들의 그룹을 일괄 변경 + **/ + function procMemberAdminUpdateMembersGroup() { + $member_srl = Context::get('member_srl'); + if(!$member_srl) return new Object(-1,'msg_invalid_request'); + $member_srls = explode(',',$member_srl); + + $group_srl = Context::get('group_srls'); + $group_srls = explode('|@|', $group_srl); + if(!$group_srl) return new Object(-1,'msg_check_group'); + + $oDB = &DB::getInstance(); + $oDB->begin(); + + // 선택된 회원들의 그룹을 삭제 + $args->member_srl = $member_srl; + $output = executeQuery('member.deleteMembersGroup', $args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // 선택된 그룹으로 추가 + $group_count = count($group_srls); + $member_count = count($member_srls); + for($j=0;$j<$group_count;$j++) { + $group_srl = (int)trim($group_srls[$j]); + if(!$group_srl) continue; + for($i=0;$i<$member_count;$i++) { + $member_srl = (int)trim($member_srls[$i]); + if(!$member_srl) continue; + + $args = null; + $args->member_srl = $member_srl; + $args->group_srl = $group_srl; + + $output = executeQuery('member.addMemberToGroup', $args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + } + } + $oDB->commit(); + + $this->setMessage('success_updated'); + } + + /** + * @brief 금지 아이디 추가 + **/ + function procMemberAdminInsertDeniedID() { + $user_id = Context::get('user_id'); + $description = Context::get('description'); + + $output = $this->insertDeniedID($user_id, $description); + if(!$output->toBool()) return $output; + + $this->add('group_srl',''); + $this->add('page',Context::get('page')); + $this->setMessage('success_registed'); + } + + /** + * @brief 금지 아이디 업데이트 + **/ + function procMemberAdminUpdateDeniedID() { + $user_id = Context::get('user_id'); + $mode = Context::get('mode'); + + switch($mode) { + case 'delete' : + $output = $this->deleteDeniedID($user_id); + if(!$output->toBool()) return $output; + $msg_code = 'success_deleted'; + break; + } + + $this->add('page',Context::get('page')); + $this->setMessage($msg_code); + } + + /** + * @brief 관리자를 추가한다 + **/ + function insertAdmin($args) { + // 관리자임을 설정 + $args->is_admin = 'Y'; + + // 관리자 그룹을 구해와서 설정 + $oMemberModel = &getModel('member'); + $admin_group = $oMemberModel->getAdminGroup(); + $args->group_srl_list = $admin_group->group_srl; + + $oMemberController = &getController('member'); + return $oMemberController->insertMember($args); + } + + /** + * @brief 회원의 그룹값을 변경 + **/ + function changeGroup($source_group_srl, $target_group_srl) { + $args->source_group_srl = $source_group_srl; + $args->target_group_srl = $target_group_srl; + + return executeQuery('member.changeGroup', $args); + } + + /** + * @brief 그룹 등록 + **/ + function insertGroup($args) { + if(!$args->site_srl) $args->site_srl = 0; + // is_default값을 체크, Y일 경우 일단 모든 is_default에 대해서 N 처리 + if($args->is_default!='Y') { + $args->is_default = 'N'; + } else { + $output = executeQuery('member.updateGroupDefaultClear', $args); + if(!$output->toBool()) return $output; + } + + return executeQuery('member.insertGroup', $args); + } + + /** + * @brief 그룹 정보 수정 + **/ + function updateGroup($args) { + // is_default값을 체크, Y일 경우 일단 모든 is_default에 대해서 N 처리 + if($args->is_default!='Y') $args->is_default = 'N'; + else { + $output = executeQuery('member.updateGroupDefaultClear', $args); + if(!$output->toBool()) return $output; + } + + return executeQuery('member.updateGroup', $args); + } + + /** + * 그룹 삭제 + **/ + function deleteGroup($group_srl, $site_srl = null) { + // 멤버모델 객체 생성 + $oMemberModel = &getModel('member'); + + // 삭제 대상 그룹을 가져와서 체크 (is_default == 'Y'일 경우 삭제 불가) + $group_info = $oMemberModel->getGroup($group_srl); + + if(!$group_info) return new Object(-1, 'lang->msg_not_founded'); + if($group_info->is_default == 'Y') return new Object(-1, 'msg_not_delete_default'); + + // is_default == 'Y'인 그룹을 가져옴 + $default_group = $oMemberModel->getDefaultGroup($site_srl); + $default_group_srl = $default_group->group_srl; + + // default_group_srl로 변경 + $this->changeGroup($group_srl, $default_group_srl); + + $args->group_srl = $group_srl; + return executeQuery('member.deleteGroup', $args); + } + + + function procMemberAdminGroupImageMarkUpdateOrder() { + $oModuleModel = &getModel('module'); + $oModuleControll = getController('module'); + + $config = $oModuleModel->getModuleConfig('member'); + // $config->group_image_mark_order = Context::get('group_image_mark_order'); + + $oModuleControll->insertModuleConfig('member', $config); + } + + /** + * @brief 금지아이디 등록 + **/ + function insertDeniedID($user_id, $description = '') { + $args->user_id = $user_id; + $args->description = $description; + $args->list_order = -1*getNextSequence(); + + return executeQuery('member.insertDeniedID', $args); + } + + /** + * @brief 금지아이디 삭제 + **/ + function deleteDeniedID($user_id) { + $args->user_id = $user_id; + return executeQuery('member.deleteDeniedID', $args); + } + + /** + * @brief 가입폼 항목을 삭제 + **/ + function deleteJoinForm($member_join_form_srl) { + $args->member_join_form_srl = $member_join_form_srl; + $output = executeQuery('member.deleteJoinForm', $args); + return $output; + } + + /** + * @brief 가입항목을 상단으로 이동 + **/ + function moveJoinFormUp($member_join_form_srl) { + $oMemberModel = &getModel('member'); + + // 선택된 가입항목의 정보를 구한다 + $args->member_join_form_srl = $member_join_form_srl; + $output = executeQuery('member.getJoinForm', $args); + + $join_form = $output->data; + $list_order = $join_form->list_order; + + // 전체 가입항목 목록을 구한다 + $join_form_list = $oMemberModel->getJoinFormList(); + $join_form_srl_list = array_keys($join_form_list); + if(count($join_form_srl_list)<2) return new Object(); + + $prev_member_join_form = NULL; + foreach($join_form_list as $key => $val) { + if($val->member_join_form_srl == $member_join_form_srl) break; + $prev_member_join_form = $val; + } + + // 이전 가입항목가 없으면 그냥 return + if(!$prev_member_join_form) return new Object(); + + // 선택한 가입항목의 정보 + $cur_args->member_join_form_srl = $member_join_form_srl; + $cur_args->list_order = $prev_member_join_form->list_order; + + // 대상 가입항목의 정보 + $prev_args->member_join_form_srl = $prev_member_join_form->member_join_form_srl; + $prev_args->list_order = $list_order; + + // DB 처리 + $output = executeQuery('member.updateMemberJoinFormListorder', $cur_args); + if(!$output->toBool()) return $output; + + executeQuery('member.updateMemberJoinFormListorder', $prev_args); + if(!$output->toBool()) return $output; + + return new Object(); + } + + /** + * @brief 가입항목을 하단으로 이동 + **/ + function moveJoinFormDown($member_join_form_srl) { + $oMemberModel = &getModel('member'); + + // 선택된 가입항목의 정보를 구한다 + $args->member_join_form_srl = $member_join_form_srl; + $output = executeQuery('member.getJoinForm', $args); + + $join_form = $output->data; + $list_order = $join_form->list_order; + + // 전체 가입항목 목록을 구한다 + $join_form_list = $oMemberModel->getJoinFormList(); + $join_form_srl_list = array_keys($join_form_list); + if(count($join_form_srl_list)<2) return new Object(); + + for($i=0;$imember_join_form_srl = $member_join_form_srl; + $cur_args->list_order = $next_member_join_form->list_order; + + // 대상 가입항목의 정보 + $next_args->member_join_form_srl = $next_member_join_form->member_join_form_srl; + $next_args->list_order = $list_order; + + // DB 처리 + $output = executeQuery('member.updateMemberJoinFormListorder', $cur_args); + if(!$output->toBool()) return $output; + + $output = executeQuery('member.updateMemberJoinFormListorder', $next_args); + if(!$output->toBool()) return $output; + + return new Object(); + } + } +?> diff --git a/modules/member/member.admin.model.php b/modules/member/member.admin.model.php index ff195d33c..efc5cc72d 100644 --- a/modules/member/member.admin.model.php +++ b/modules/member/member.admin.model.php @@ -1,141 +1,141 @@ -is_admin = Context::get('is_admin')=='Y'?'Y':''; - $args->is_denied = Context::get('is_denied')=='Y'?'Y':''; - $args->selected_group_srl = Context::get('selected_group_srl'); - - $search_target = trim(Context::get('search_target')); - $search_keyword = trim(Context::get('search_keyword')); - - if($search_target && $search_keyword) { - switch($search_target) { - case 'user_id' : - if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); - $args->s_user_id = $search_keyword; - break; - case 'user_name' : - if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); - $args->s_user_name = $search_keyword; - break; - case 'nick_name' : - if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); - $args->s_nick_name = $search_keyword; - break; - case 'email_address' : - if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); - $args->s_email_address = $search_keyword; - break; - case 'regdate' : - $args->s_regdate = preg_replace("/[^0-9]/","",$search_keyword); - break; - case 'regdate_more' : - $args->s_regdate_more = substr(preg_replace("/[^0-9]/","",$search_keyword) . '00000000000000',0,14); - break; - case 'regdate_less' : - $args->s_regdate_less = substr(preg_replace("/[^0-9]/","",$search_keyword) . '00000000000000',0,14); - break; - case 'last_login' : - $args->s_last_login = $search_keyword; - break; - case 'last_login_more' : - $args->s_last_login_more = substr(preg_replace("/[^0-9]/","",$search_keyword) . '00000000000000',0,14); - break; - case 'last_login_less' : - $args->s_last_login_less = substr(preg_replace("/[^0-9]/","",$search_keyword) . '00000000000000',0,14); - break; - case 'extra_vars' : - $args->s_extra_vars = ereg_replace("[^0-9]","",$search_keyword); - break; - } - } - - // selected_group_srl이 있으면 query id를 변경 (table join때문에) - $sort_order = Context::get('sort_order'); - $sort_index = Context::get('sort_index'); - if($sort_index != 'last_login') { - $sort_index = "list_order"; - }else{ - $sort_order = 'desc'; - } - if($args->selected_group_srl) { - $query_id = 'member.getMemberListWithinGroup'; - $args->sort_index = "member.".$sort_index; - } else { - $query_id = 'member.getMemberList'; - $args->sort_index = $sort_index; - } - if($sort_order != "desc") $sort_order = "asc"; - $args->sort_order = $sort_order; - Context::set('sort_order', $sort_order); - - // 기타 변수들 정리 - $args->page = Context::get('page'); - $args->list_count = 40; - $args->page_count = 10; - $output = executeQuery($query_id, $args); - return $output; - } - - /** - * @brief 사이트별 회원 목록을 구함 - **/ - function getSiteMemberList($site_srl, $page = 1) { - $args->site_srl = $site_srl; - $args->page = $page; - $args->list_count = 40; - $args->page_count = 10; - $query_id = 'member.getSiteMemberList'; - $output = executeQueryArray($query_id, $args); - return $output; - } - - /** - * @brief 회원 모듈의 특정 스킨에 속한 컬러셋 목록을 return - **/ - function getMemberAdminColorset() { - $skin = Context::get('skin'); - if(!$skin) $tpl = ""; - else { - $oModuleModel = &getModel('module'); - $skin_info = $oModuleModel->loadSkinInfo($this->module_path, $skin); - Context::set('skin_info', $skin_info); - - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('member'); - if(!$config->colorset) $config->colorset = "white"; - Context::set('config', $config); - - $oTemplate = &TemplateHandler::getInstance(); - $tpl = $oTemplate->compile($this->module_path.'tpl', 'colorset_list'); - } - - $this->add('tpl', $tpl); - } - - } -?> +is_admin = Context::get('is_admin')=='Y'?'Y':''; + $args->is_denied = Context::get('is_denied')=='Y'?'Y':''; + $args->selected_group_srl = Context::get('selected_group_srl'); + + $search_target = trim(Context::get('search_target')); + $search_keyword = trim(Context::get('search_keyword')); + + if($search_target && $search_keyword) { + switch($search_target) { + case 'user_id' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_user_id = $search_keyword; + break; + case 'user_name' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_user_name = $search_keyword; + break; + case 'nick_name' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_nick_name = $search_keyword; + break; + case 'email_address' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_email_address = $search_keyword; + break; + case 'regdate' : + $args->s_regdate = preg_replace("/[^0-9]/","",$search_keyword); + break; + case 'regdate_more' : + $args->s_regdate_more = substr(preg_replace("/[^0-9]/","",$search_keyword) . '00000000000000',0,14); + break; + case 'regdate_less' : + $args->s_regdate_less = substr(preg_replace("/[^0-9]/","",$search_keyword) . '00000000000000',0,14); + break; + case 'last_login' : + $args->s_last_login = $search_keyword; + break; + case 'last_login_more' : + $args->s_last_login_more = substr(preg_replace("/[^0-9]/","",$search_keyword) . '00000000000000',0,14); + break; + case 'last_login_less' : + $args->s_last_login_less = substr(preg_replace("/[^0-9]/","",$search_keyword) . '00000000000000',0,14); + break; + case 'extra_vars' : + $args->s_extra_vars = ereg_replace("[^0-9]","",$search_keyword); + break; + } + } + + // selected_group_srl이 있으면 query id를 변경 (table join때문에) + $sort_order = Context::get('sort_order'); + $sort_index = Context::get('sort_index'); + if($sort_index != 'last_login') { + $sort_index = "list_order"; + }else{ + $sort_order = 'desc'; + } + if($args->selected_group_srl) { + $query_id = 'member.getMemberListWithinGroup'; + $args->sort_index = "member.".$sort_index; + } else { + $query_id = 'member.getMemberList'; + $args->sort_index = $sort_index; + } + if($sort_order != "desc") $sort_order = "asc"; + $args->sort_order = $sort_order; + Context::set('sort_order', $sort_order); + + // 기타 변수들 정리 + $args->page = Context::get('page'); + $args->list_count = 40; + $args->page_count = 10; + $output = executeQuery($query_id, $args); + return $output; + } + + /** + * @brief 사이트별 회원 목록을 구함 + **/ + function getSiteMemberList($site_srl, $page = 1) { + $args->site_srl = $site_srl; + $args->page = $page; + $args->list_count = 40; + $args->page_count = 10; + $query_id = 'member.getSiteMemberList'; + $output = executeQueryArray($query_id, $args); + return $output; + } + + /** + * @brief 회원 모듈의 특정 스킨에 속한 컬러셋 목록을 return + **/ + function getMemberAdminColorset() { + $skin = Context::get('skin'); + if(!$skin) $tpl = ""; + else { + $oModuleModel = &getModel('module'); + $skin_info = $oModuleModel->loadSkinInfo($this->module_path, $skin); + Context::set('skin_info', $skin_info); + + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('member'); + if(!$config->colorset) $config->colorset = "white"; + Context::set('config', $config); + + $oTemplate = &TemplateHandler::getInstance(); + $tpl = $oTemplate->compile($this->module_path.'tpl', 'colorset_list'); + } + + $this->add('tpl', $tpl); + } + + } +?> diff --git a/modules/member/member.admin.view.php b/modules/member/member.admin.view.php index acf485f20..6da3e2e9a 100644 --- a/modules/member/member.admin.view.php +++ b/modules/member/member.admin.view.php @@ -1,241 +1,241 @@ -member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); - if(!$this->member_info) Context::set('member_srl',''); - else Context::set('member_info',$this->member_info); - } - - // retrieve group list - $this->group_list = $oMemberModel->getGroups(); - Context::set('group_list', $this->group_list); - - $this->setTemplatePath($this->module_path.'tpl'); - } - - /** - * @brief display member list - **/ - function dispMemberAdminList() { - - $oMemberAdminModel = &getAdminModel('member'); - $oMemberModel = &getModel('member'); - $output = $oMemberAdminModel->getMemberList(); - - // retrieve list of groups for each member - if($output->data) { - foreach($output->data as $key => $member) { - $output->data[$key]->group_list = $oMemberModel->getMemberGroups($member->member_srl,0); - } - } - - Context::set('total_count', $output->total_count); - Context::set('total_page', $output->total_page); - Context::set('page', $output->page); - Context::set('member_list', $output->data); - Context::set('page_navigation', $output->page_navigation); - - $this->setTemplateFile('member_list'); - } - - /** - * @brief default configuration for member management - **/ - function dispMemberAdminConfig() { - // retrieve configuration via module model instance - $oModuleModel = &getModel('module'); - $oMemberModel = &getModel('member'); - $config = $oMemberModel->getMemberConfig(); - Context::set('config',$config); - - // list of skins for member module - $skin_list = $oModuleModel->getSkins($this->module_path); - Context::set('skin_list', $skin_list); - - // retrieve skins of editor - $oEditorModel = &getModel('editor'); - Context::set('editor_skin_list', $oEditorModel->getEditorSkinList()); - - // get an editor - $option->primary_key_name = 'temp_srl'; - $option->content_key_name = 'agreement'; - $option->allow_fileupload = false; - $option->enable_autosave = false; - $option->enable_default_component = true; - $option->enable_component = true; - $option->resizable = true; - $option->height = 300; - $editor = $oEditorModel->getEditor(0, $option); - Context::set('editor', $editor); - - $this->setTemplateFile('member_config'); - } - - /** - * @brief display member information - **/ - function dispMemberAdminInfo() { - $oMemberModel = &getModel('member'); - $oModuleModel = &getModel('module'); - $member_config = $oModuleModel->getModuleConfig('member'); - Context::set('member_config', $member_config); - Context::set('extend_form_list', $oMemberModel->getCombineJoinForm($this->member_info)); - $this->setTemplateFile('member_info'); - } - - /** - * @brief display member insert form - **/ - function dispMemberAdminInsert() { - // retrieve extend form - $oMemberModel = &getModel('member'); - Context::set('extend_form_list', $oMemberModel->getCombineJoinForm($this->member_info)); - - $member_info = Context::get('member_info'); - $member_info->signature = $oMemberModel->getSignature($this->member_info->member_srl); - Context::set('member_info', $member_info); - - // get an editor for the signature - if($this->member_info->member_srl) { - $oEditorModel = &getModel('editor'); - $option->primary_key_name = 'member_srl'; - $option->content_key_name = 'signature'; - $option->allow_fileupload = false; - $option->enable_autosave = false; - $option->enable_default_component = true; - $option->enable_component = false; - $option->resizable = false; - $option->height = 200; - $editor = $oEditorModel->getEditor($this->member_info->member_srl, $option); - Context::set('editor', $editor); - } - - $this->setTemplateFile('insert_member'); - } - - /** - * @brief display member delete form - **/ - function dispMemberAdminDeleteForm() { - if(!Context::get('member_srl')) return $this->dispMemberAdminList(); - $this->setTemplateFile('delete_form'); - } - - /** - * @brief display group list - **/ - function dispMemberAdminGroupList() { - $oModuleModel = &getModel('module'); - - $config = $oModuleModel->getModuleConfig('member'); - if($config->group_image_mark_order) $config->group_image_mark_order = explode(',', $config->group_image_mark_order); - Context::set('config', $config); - - $group_srl = Context::get('group_srl'); - - if($group_srl && $this->group_list[$group_srl]) { - Context::set('selected_group', $this->group_list[$group_srl]); - $this->setTemplateFile('group_update_form'); - } else { - $this->setTemplateFile('group_list'); - } - } - - /** - * @brief 회원 가입 폼 목록 출력 - **/ - function dispMemberAdminJoinFormList() { - // 멤버모델 객체 생성 - $oMemberModel = &getModel('member'); - - // 추가로 설정한 가입 항목 가져오기 - $form_list = $oMemberModel->getJoinFormList(); - Context::set('form_list', $form_list); - - $this->setTemplateFile('join_form_list'); - } - - /** - * @brief 회원 가입 폼 관리 화면 출력 - **/ - function dispMemberAdminInsertJoinForm() { - // 수정일 경우 대상 join_form의 값을 구함 - $member_join_form_srl = Context::get('member_join_form_srl'); - if($member_join_form_srl) { - $oMemberModel = &getModel('member'); - $join_form = $oMemberModel->getJoinForm($member_join_form_srl); - - if(!$join_form) Context::set('member_join_form_srl','',true); - else Context::set('join_form', $join_form); - } - $this->setTemplateFile('insert_join_form'); - } - - /** - * @brief 금지 목록 아이디 출력 - **/ - function dispMemberAdminDeniedIDList() { - // 멤버모델 객체 생성 - $oMemberModel = &getModel('member'); - - // 사용금지 목록 가져오기 - $output = $oMemberModel->getDeniedIDList(); - - Context::set('total_count', $output->total_count); - Context::set('total_page', $output->total_page); - Context::set('page', $output->page); - Context::set('member_list', $output->data); - Context::set('page_navigation', $output->page_navigation); - - $this->setTemplateFile('denied_id_list'); - } - - /** - * @brief 회원 그룹 일괄 변경 - **/ - function dispMemberAdminManageGroup() { - // 선택된 회원 목록을 구함 - $args->member_srl = trim(Context::get('member_srls')); - $output = executeQueryArray('member.getMembers', $args); - Context::set('member_list', $output->data); - - // 회원 그룹 목록을 구함 - $oMemberModel = &getModel('member'); - Context::set('member_groups', $oMemberModel->getGroups()); - - $this->setLayoutFile('popup_layout'); - $this->setTemplateFile('manage_member_group'); - } - - /** - * @brief 회원 일괄 삭제 - **/ - function dispMemberAdminDeleteMembers() { - // 선택된 회원 목록을 구함 - $args->member_srl = trim(Context::get('member_srls')); - $output = executeQueryArray('member.getMembers', $args); - Context::set('member_list', $output->data); - - $this->setLayoutFile('popup_layout'); - $this->setTemplateFile('delete_members'); - } - } -?> +member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); + if(!$this->member_info) Context::set('member_srl',''); + else Context::set('member_info',$this->member_info); + } + + // retrieve group list + $this->group_list = $oMemberModel->getGroups(); + Context::set('group_list', $this->group_list); + + $this->setTemplatePath($this->module_path.'tpl'); + } + + /** + * @brief display member list + **/ + function dispMemberAdminList() { + + $oMemberAdminModel = &getAdminModel('member'); + $oMemberModel = &getModel('member'); + $output = $oMemberAdminModel->getMemberList(); + + // retrieve list of groups for each member + if($output->data) { + foreach($output->data as $key => $member) { + $output->data[$key]->group_list = $oMemberModel->getMemberGroups($member->member_srl,0); + } + } + + Context::set('total_count', $output->total_count); + Context::set('total_page', $output->total_page); + Context::set('page', $output->page); + Context::set('member_list', $output->data); + Context::set('page_navigation', $output->page_navigation); + + $this->setTemplateFile('member_list'); + } + + /** + * @brief default configuration for member management + **/ + function dispMemberAdminConfig() { + // retrieve configuration via module model instance + $oModuleModel = &getModel('module'); + $oMemberModel = &getModel('member'); + $config = $oMemberModel->getMemberConfig(); + Context::set('config',$config); + + // list of skins for member module + $skin_list = $oModuleModel->getSkins($this->module_path); + Context::set('skin_list', $skin_list); + + // retrieve skins of editor + $oEditorModel = &getModel('editor'); + Context::set('editor_skin_list', $oEditorModel->getEditorSkinList()); + + // get an editor + $option->primary_key_name = 'temp_srl'; + $option->content_key_name = 'agreement'; + $option->allow_fileupload = false; + $option->enable_autosave = false; + $option->enable_default_component = true; + $option->enable_component = true; + $option->resizable = true; + $option->height = 300; + $editor = $oEditorModel->getEditor(0, $option); + Context::set('editor', $editor); + + $this->setTemplateFile('member_config'); + } + + /** + * @brief display member information + **/ + function dispMemberAdminInfo() { + $oMemberModel = &getModel('member'); + $oModuleModel = &getModel('module'); + $member_config = $oModuleModel->getModuleConfig('member'); + Context::set('member_config', $member_config); + Context::set('extend_form_list', $oMemberModel->getCombineJoinForm($this->member_info)); + $this->setTemplateFile('member_info'); + } + + /** + * @brief display member insert form + **/ + function dispMemberAdminInsert() { + // retrieve extend form + $oMemberModel = &getModel('member'); + Context::set('extend_form_list', $oMemberModel->getCombineJoinForm($this->member_info)); + + $member_info = Context::get('member_info'); + $member_info->signature = $oMemberModel->getSignature($this->member_info->member_srl); + Context::set('member_info', $member_info); + + // get an editor for the signature + if($this->member_info->member_srl) { + $oEditorModel = &getModel('editor'); + $option->primary_key_name = 'member_srl'; + $option->content_key_name = 'signature'; + $option->allow_fileupload = false; + $option->enable_autosave = false; + $option->enable_default_component = true; + $option->enable_component = false; + $option->resizable = false; + $option->height = 200; + $editor = $oEditorModel->getEditor($this->member_info->member_srl, $option); + Context::set('editor', $editor); + } + + $this->setTemplateFile('insert_member'); + } + + /** + * @brief display member delete form + **/ + function dispMemberAdminDeleteForm() { + if(!Context::get('member_srl')) return $this->dispMemberAdminList(); + $this->setTemplateFile('delete_form'); + } + + /** + * @brief display group list + **/ + function dispMemberAdminGroupList() { + $oModuleModel = &getModel('module'); + + $config = $oModuleModel->getModuleConfig('member'); + if($config->group_image_mark_order) $config->group_image_mark_order = explode(',', $config->group_image_mark_order); + Context::set('config', $config); + + $group_srl = Context::get('group_srl'); + + if($group_srl && $this->group_list[$group_srl]) { + Context::set('selected_group', $this->group_list[$group_srl]); + $this->setTemplateFile('group_update_form'); + } else { + $this->setTemplateFile('group_list'); + } + } + + /** + * @brief 회원 가입 폼 목록 출력 + **/ + function dispMemberAdminJoinFormList() { + // 멤버모델 객체 생성 + $oMemberModel = &getModel('member'); + + // 추가로 설정한 가입 항목 가져오기 + $form_list = $oMemberModel->getJoinFormList(); + Context::set('form_list', $form_list); + + $this->setTemplateFile('join_form_list'); + } + + /** + * @brief 회원 가입 폼 관리 화면 출력 + **/ + function dispMemberAdminInsertJoinForm() { + // 수정일 경우 대상 join_form의 값을 구함 + $member_join_form_srl = Context::get('member_join_form_srl'); + if($member_join_form_srl) { + $oMemberModel = &getModel('member'); + $join_form = $oMemberModel->getJoinForm($member_join_form_srl); + + if(!$join_form) Context::set('member_join_form_srl','',true); + else Context::set('join_form', $join_form); + } + $this->setTemplateFile('insert_join_form'); + } + + /** + * @brief 금지 목록 아이디 출력 + **/ + function dispMemberAdminDeniedIDList() { + // 멤버모델 객체 생성 + $oMemberModel = &getModel('member'); + + // 사용금지 목록 가져오기 + $output = $oMemberModel->getDeniedIDList(); + + Context::set('total_count', $output->total_count); + Context::set('total_page', $output->total_page); + Context::set('page', $output->page); + Context::set('member_list', $output->data); + Context::set('page_navigation', $output->page_navigation); + + $this->setTemplateFile('denied_id_list'); + } + + /** + * @brief 회원 그룹 일괄 변경 + **/ + function dispMemberAdminManageGroup() { + // 선택된 회원 목록을 구함 + $args->member_srl = trim(Context::get('member_srls')); + $output = executeQueryArray('member.getMembers', $args); + Context::set('member_list', $output->data); + + // 회원 그룹 목록을 구함 + $oMemberModel = &getModel('member'); + Context::set('member_groups', $oMemberModel->getGroups()); + + $this->setLayoutFile('popup_layout'); + $this->setTemplateFile('manage_member_group'); + } + + /** + * @brief 회원 일괄 삭제 + **/ + function dispMemberAdminDeleteMembers() { + // 선택된 회원 목록을 구함 + $args->member_srl = trim(Context::get('member_srls')); + $output = executeQueryArray('member.getMembers', $args); + Context::set('member_list', $output->data); + + $this->setLayoutFile('popup_layout'); + $this->setTemplateFile('delete_members'); + } + } +?> diff --git a/modules/member/member.api.php b/modules/member/member.api.php index 3aca073e7..619ae2308 100644 --- a/modules/member/member.api.php +++ b/modules/member/member.api.php @@ -1,40 +1,40 @@ -arrangeContentList(Context::get('document_list')); - $oModule->add('document_list',$document_list); - $oModule->add('page_navigation',Context::get('page_navigation')); - } - - - - function arrangeContentList($content_list) { - $output = array(); - if(count($content_list)) { - foreach($content_list as $key => $val) $output[] = $this->arrangeContent($val); - } - return $output; - } - - - function arrangeContent($content) { - $output = null; - if($content){ - $output= $content->gets('document_srl','category_srl','is_secret','nick_name','user_id','user_name','title','content','tags','voted_count','blamed_count','comment_count','regdate','last_update','extra_vars'); - } - return $output; - } - - } -?> +arrangeContentList(Context::get('document_list')); + $oModule->add('document_list',$document_list); + $oModule->add('page_navigation',Context::get('page_navigation')); + } + + + + function arrangeContentList($content_list) { + $output = array(); + if(count($content_list)) { + foreach($content_list as $key => $val) $output[] = $this->arrangeContent($val); + } + return $output; + } + + + function arrangeContent($content) { + $output = null; + if($content){ + $output= $content->gets('document_srl','category_srl','is_secret','nick_name','user_id','user_name','title','content','tags','voted_count','blamed_count','comment_count','regdate','last_update','extra_vars'); + } + return $output; + } + + } +?> diff --git a/modules/member/member.class.php b/modules/member/member.class.php index 0eb83ad9c..88a9fd88b 100644 --- a/modules/member/member.class.php +++ b/modules/member/member.class.php @@ -1,237 +1,237 @@ -getModuleConfig('member'); - - // SSL 사용시 회원가입/정보/비밀번호등과 관련된 action에 대해 SSL 전송하도록 지정 - if(Context::get('_use_ssl') == 'optional') { - Context::addSSLAction('dispMemberModifyPassword'); - Context::addSSLAction('dispMemberSignUpForm'); - Context::addSSLAction('dispMemberModifyInfo'); - Context::addSSLAction('procMemberLogin'); - Context::addSSLAction('procMemberModifyPassword'); - Context::addSSLAction('procMemberInsert'); - Context::addSSLAction('procMemberModifyInfo'); - Context::addSSLAction('procMemberFindAccount'); - } - } - - /** - * @brief 설치시 추가 작업이 필요할시 구현 - **/ - function moduleInstall() { - // action forward에 등록 (관리자 모드에서 사용하기 위함) - $oModuleController = &getController('module'); - - $oDB = &DB::getInstance(); - $oDB->addIndex("member_group","idx_site_title", array("site_srl","title"),true); - - $oModuleModel = &getModel('module'); - $args = $oModuleModel->getModuleConfig('member'); - - // 기본 정보를 세팅 - $args->enable_join = 'Y'; - if(!$args->enable_openid) $args->enable_openid = 'N'; - if(!$args->enable_auth_mail) $args->enable_auth_mail = 'N'; - if(!$args->image_name) $args->image_name = 'Y'; - if(!$args->image_mark) $args->image_mark = 'Y'; - if(!$args->profile_image) $args->profile_image = 'Y'; - if(!$args->image_name_max_width) $args->image_name_max_width = '90'; - if(!$args->image_name_max_height) $args->image_name_max_height = '20'; - if(!$args->image_mark_max_width) $args->image_mark_max_width = '20'; - if(!$args->image_mark_max_height) $args->image_mark_max_height = '20'; - if(!$args->profile_image_max_width) $args->profile_image_max_width = '80'; - if(!$args->profile_image_max_height) $args->profile_image_max_height = '80'; - if($args->group_image_mark!='Y') $args->group_image_mark = 'N'; - - $oModuleController->insertModuleConfig('member',$args); - - // 멤버 컨트롤러 객체 생성 - $oMemberModel = &getModel('member'); - $oMemberController = &getController('member'); - $oMemberAdminController = &getAdminController('member'); - - $groups = $oMemberModel->getGroups(); - if(!count($groups)) { - // 관리자, 정회원, 준회원 그룹을 입력 - $group_args->title = Context::getLang('admin_group'); - $group_args->is_default = 'N'; - $group_args->is_admin = 'Y'; - $output = $oMemberAdminController->insertGroup($group_args); - - unset($group_args); - $group_args->title = Context::getLang('default_group_1'); - $group_args->is_default = 'Y'; - $group_args->is_admin = 'N'; - $output = $oMemberAdminController->insertGroup($group_args); - - unset($group_args); - $group_args->title = Context::getLang('default_group_2'); - $group_args->is_default = 'N'; - $group_args->is_admin = 'N'; - $oMemberAdminController->insertGroup($group_args); - } - - // 관리자 정보 세팅 - $admin_args->is_admin = 'Y'; - $output = executeQuery('member.getMemberList', $admin_args); - if(!$output->data) { - $admin_info = Context::gets('user_id','password','nick_name','user_name', 'email_address'); - if($admin_info->user_id) { - // 관리자 정보 입력 - $oMemberAdminController->insertAdmin($admin_info); - - // 로그인 처리시킴 - $output = $oMemberController->doLogin($admin_info->user_id); - } - } - - // 금지 아이디 등록 (기본 + 모듈명) - $oModuleModel = &getModel('module'); - $module_list = $oModuleModel->getModuleList(); - foreach($module_list as $key => $val) { - $oMemberAdminController->insertDeniedID($val->module,''); - } - $oMemberAdminController->insertDeniedID('www',''); - $oMemberAdminController->insertDeniedID('root',''); - $oMemberAdminController->insertDeniedID('administrator',''); - $oMemberAdminController->insertDeniedID('telnet',''); - $oMemberAdminController->insertDeniedID('ftp',''); - $oMemberAdminController->insertDeniedID('http',''); - - // member 에서 사용할 cache디렉토리 생성 - FileHandler::makeDir('./files/member_extra_info/image_name'); - FileHandler::makeDir('./files/member_extra_info/image_mark'); - FileHandler::makeDir('./files/member_extra_info/profile_image'); - FileHandler::makeDir('./files/member_extra_info/signature'); - - $oDB->addIndex("member_openid_association","idx_assoc", array("server_url(255)","handle"), false); - return new Object(); - } - - /** - * @brief 설치가 이상이 없는지 체크하는 method - **/ - function checkUpdate() { - $oDB = &DB::getInstance(); - $oModuleModel = &getModel('module'); - - // member 디렉토리 체크 (2007. 8. 11 추가) - if(!is_dir("./files/member_extra_info")) return true; - - // member 디렉토리 체크 (2007. 10. 22 추가) - if(!is_dir("./files/member_extra_info/profile_image")) return true; - - // member_auth_mail 테이블에 is_register 필드 추가 (2008. 04. 22) - $act = $oDB->isColumnExists("member_auth_mail", "is_register"); - if(!$act) return true; - - // member_group_member 테이블에 site_srl 추가 (2008. 11. 15) - if(!$oDB->isColumnExists("member_group_member", "site_srl")) return true; - if(!$oDB->isColumnExists("member_group", "site_srl")) return true; - if($oDB->isIndexExists("member_group","uni_member_group_title")) return true; - - // image_mark 추가 (2009. 02. 14) - if(!$oDB->isColumnExists("member_group", "image_mark")) return true; - - // password 유효기간을 위한 추가 - if(!$oDB->isColumnExists("member", "change_password_date")) return true; - - // 비밀번호 찾기 질문/답변을 위한 추가 - if(!$oDB->isColumnExists("member", "find_account_question")) return true; - if(!$oDB->isColumnExists("member", "find_account_answer")) return true; - - if(!$oDB->isColumnExists("member", "list_order")) return true; - if(!$oDB->isIndexExists("member","idx_list_order")) return true; - - return false; - } - - /** - * @brief 업데이트 실행 - **/ - function moduleUpdate() { - $oDB = &DB::getInstance(); - $oModuleController = &getController('module'); - - // member 디렉토리 체크 - FileHandler::makeDir('./files/member_extra_info/image_name'); - FileHandler::makeDir('./files/member_extra_info/image_mark'); - FileHandler::makeDir('./files/member_extra_info/signature'); - FileHandler::makeDir('./files/member_extra_info/profile_image'); - - // DB 필드 추가 - if (!$oDB->isColumnExists("member_auth_mail", "is_register")) { - $oDB->addColumn("member_auth_mail", "is_register", "char", 1, "N", true); - } - - // member_group_member 테이블에 site_srl 추가 (2008. 11. 15) - if (!$oDB->isColumnExists("member_group_member", "site_srl")) { - $oDB->addColumn("member_group_member", "site_srl", "number", 11, 0, true); - $oDB->addIndex("member_group_member", "idx_site_srl", "site_srl", false); - } - if (!$oDB->isColumnExists("member_group", "site_srl")) { - $oDB->addColumn("member_group", "site_srl", "number", 11, 0, true); - $oDB->addIndex("member_group","idx_site_title", array("site_srl","title"),true); - } - if($oDB->isIndexExists("member_group","uni_member_group_title")) { - $oDB->dropIndex("member_group","uni_member_group_title",true); - } - - // image_mark 추가 (2009. 02. 14) - if(!$oDB->isColumnExists("member_group", "image_mark")) { - $oDB->addColumn("member_group", "image_mark", "text"); - } - - // password 유효기간을 위한 추가 - if(!$oDB->isColumnExists("member", "change_password_date")) { - $oDB->addColumn("member", "change_password_date", "date"); - executeQuery('member.updateAllChangePasswordDate'); - } - - // 비밀번호 찾기 질문/답변을 위한 추가 - if(!$oDB->isColumnExists("member", "find_account_question")) { - $oDB->addColumn("member", "find_account_question", "number", 11); - } - if(!$oDB->isColumnExists("member", "find_account_answer")) { - $oDB->addColumn("member", "find_account_answer", "varchar", 250); - } - - if(!$oDB->isColumnExists("member", "list_order")) { - $oDB->addColumn("member", "list_order", "number", 11); - set_time_limit(0); - $args->list_order = 'member_srl'; - executeQuery('member.updateMemberListOrderAll',$args); - executeQuery('member.updateMemberListOrderAll'); - } - - if(!$oDB->isIndexExists("member","idx_list_order")) { - $oDB->addIndex("member","idx_list_order", array("list_order")); - } - - return new Object(0, 'success_updated'); - } - - /** - * @brief 캐시 파일 재생성 - **/ - function recompileCache() { - set_include_path(_XE_PATH_."modules/member/php-openid-1.2.3"); - require_once('Auth/OpenID/XEStore.php'); - $store = new Auth_OpenID_XEStore(); - $store->reset(); - } - } -?> +getModuleConfig('member'); + + // SSL 사용시 회원가입/정보/비밀번호등과 관련된 action에 대해 SSL 전송하도록 지정 + if(Context::get('_use_ssl') == 'optional') { + Context::addSSLAction('dispMemberModifyPassword'); + Context::addSSLAction('dispMemberSignUpForm'); + Context::addSSLAction('dispMemberModifyInfo'); + Context::addSSLAction('procMemberLogin'); + Context::addSSLAction('procMemberModifyPassword'); + Context::addSSLAction('procMemberInsert'); + Context::addSSLAction('procMemberModifyInfo'); + Context::addSSLAction('procMemberFindAccount'); + } + } + + /** + * @brief 설치시 추가 작업이 필요할시 구현 + **/ + function moduleInstall() { + // action forward에 등록 (관리자 모드에서 사용하기 위함) + $oModuleController = &getController('module'); + + $oDB = &DB::getInstance(); + $oDB->addIndex("member_group","idx_site_title", array("site_srl","title"),true); + + $oModuleModel = &getModel('module'); + $args = $oModuleModel->getModuleConfig('member'); + + // 기본 정보를 세팅 + $args->enable_join = 'Y'; + if(!$args->enable_openid) $args->enable_openid = 'N'; + if(!$args->enable_auth_mail) $args->enable_auth_mail = 'N'; + if(!$args->image_name) $args->image_name = 'Y'; + if(!$args->image_mark) $args->image_mark = 'Y'; + if(!$args->profile_image) $args->profile_image = 'Y'; + if(!$args->image_name_max_width) $args->image_name_max_width = '90'; + if(!$args->image_name_max_height) $args->image_name_max_height = '20'; + if(!$args->image_mark_max_width) $args->image_mark_max_width = '20'; + if(!$args->image_mark_max_height) $args->image_mark_max_height = '20'; + if(!$args->profile_image_max_width) $args->profile_image_max_width = '80'; + if(!$args->profile_image_max_height) $args->profile_image_max_height = '80'; + if($args->group_image_mark!='Y') $args->group_image_mark = 'N'; + + $oModuleController->insertModuleConfig('member',$args); + + // 멤버 컨트롤러 객체 생성 + $oMemberModel = &getModel('member'); + $oMemberController = &getController('member'); + $oMemberAdminController = &getAdminController('member'); + + $groups = $oMemberModel->getGroups(); + if(!count($groups)) { + // 관리자, 정회원, 준회원 그룹을 입력 + $group_args->title = Context::getLang('admin_group'); + $group_args->is_default = 'N'; + $group_args->is_admin = 'Y'; + $output = $oMemberAdminController->insertGroup($group_args); + + unset($group_args); + $group_args->title = Context::getLang('default_group_1'); + $group_args->is_default = 'Y'; + $group_args->is_admin = 'N'; + $output = $oMemberAdminController->insertGroup($group_args); + + unset($group_args); + $group_args->title = Context::getLang('default_group_2'); + $group_args->is_default = 'N'; + $group_args->is_admin = 'N'; + $oMemberAdminController->insertGroup($group_args); + } + + // 관리자 정보 세팅 + $admin_args->is_admin = 'Y'; + $output = executeQuery('member.getMemberList', $admin_args); + if(!$output->data) { + $admin_info = Context::gets('user_id','password','nick_name','user_name', 'email_address'); + if($admin_info->user_id) { + // 관리자 정보 입력 + $oMemberAdminController->insertAdmin($admin_info); + + // 로그인 처리시킴 + $output = $oMemberController->doLogin($admin_info->user_id); + } + } + + // 금지 아이디 등록 (기본 + 모듈명) + $oModuleModel = &getModel('module'); + $module_list = $oModuleModel->getModuleList(); + foreach($module_list as $key => $val) { + $oMemberAdminController->insertDeniedID($val->module,''); + } + $oMemberAdminController->insertDeniedID('www',''); + $oMemberAdminController->insertDeniedID('root',''); + $oMemberAdminController->insertDeniedID('administrator',''); + $oMemberAdminController->insertDeniedID('telnet',''); + $oMemberAdminController->insertDeniedID('ftp',''); + $oMemberAdminController->insertDeniedID('http',''); + + // member 에서 사용할 cache디렉토리 생성 + FileHandler::makeDir('./files/member_extra_info/image_name'); + FileHandler::makeDir('./files/member_extra_info/image_mark'); + FileHandler::makeDir('./files/member_extra_info/profile_image'); + FileHandler::makeDir('./files/member_extra_info/signature'); + + $oDB->addIndex("member_openid_association","idx_assoc", array("server_url(255)","handle"), false); + return new Object(); + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + **/ + function checkUpdate() { + $oDB = &DB::getInstance(); + $oModuleModel = &getModel('module'); + + // member 디렉토리 체크 (2007. 8. 11 추가) + if(!is_dir("./files/member_extra_info")) return true; + + // member 디렉토리 체크 (2007. 10. 22 추가) + if(!is_dir("./files/member_extra_info/profile_image")) return true; + + // member_auth_mail 테이블에 is_register 필드 추가 (2008. 04. 22) + $act = $oDB->isColumnExists("member_auth_mail", "is_register"); + if(!$act) return true; + + // member_group_member 테이블에 site_srl 추가 (2008. 11. 15) + if(!$oDB->isColumnExists("member_group_member", "site_srl")) return true; + if(!$oDB->isColumnExists("member_group", "site_srl")) return true; + if($oDB->isIndexExists("member_group","uni_member_group_title")) return true; + + // image_mark 추가 (2009. 02. 14) + if(!$oDB->isColumnExists("member_group", "image_mark")) return true; + + // password 유효기간을 위한 추가 + if(!$oDB->isColumnExists("member", "change_password_date")) return true; + + // 비밀번호 찾기 질문/답변을 위한 추가 + if(!$oDB->isColumnExists("member", "find_account_question")) return true; + if(!$oDB->isColumnExists("member", "find_account_answer")) return true; + + if(!$oDB->isColumnExists("member", "list_order")) return true; + if(!$oDB->isIndexExists("member","idx_list_order")) return true; + + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + $oDB = &DB::getInstance(); + $oModuleController = &getController('module'); + + // member 디렉토리 체크 + FileHandler::makeDir('./files/member_extra_info/image_name'); + FileHandler::makeDir('./files/member_extra_info/image_mark'); + FileHandler::makeDir('./files/member_extra_info/signature'); + FileHandler::makeDir('./files/member_extra_info/profile_image'); + + // DB 필드 추가 + if (!$oDB->isColumnExists("member_auth_mail", "is_register")) { + $oDB->addColumn("member_auth_mail", "is_register", "char", 1, "N", true); + } + + // member_group_member 테이블에 site_srl 추가 (2008. 11. 15) + if (!$oDB->isColumnExists("member_group_member", "site_srl")) { + $oDB->addColumn("member_group_member", "site_srl", "number", 11, 0, true); + $oDB->addIndex("member_group_member", "idx_site_srl", "site_srl", false); + } + if (!$oDB->isColumnExists("member_group", "site_srl")) { + $oDB->addColumn("member_group", "site_srl", "number", 11, 0, true); + $oDB->addIndex("member_group","idx_site_title", array("site_srl","title"),true); + } + if($oDB->isIndexExists("member_group","uni_member_group_title")) { + $oDB->dropIndex("member_group","uni_member_group_title",true); + } + + // image_mark 추가 (2009. 02. 14) + if(!$oDB->isColumnExists("member_group", "image_mark")) { + $oDB->addColumn("member_group", "image_mark", "text"); + } + + // password 유효기간을 위한 추가 + if(!$oDB->isColumnExists("member", "change_password_date")) { + $oDB->addColumn("member", "change_password_date", "date"); + executeQuery('member.updateAllChangePasswordDate'); + } + + // 비밀번호 찾기 질문/답변을 위한 추가 + if(!$oDB->isColumnExists("member", "find_account_question")) { + $oDB->addColumn("member", "find_account_question", "number", 11); + } + if(!$oDB->isColumnExists("member", "find_account_answer")) { + $oDB->addColumn("member", "find_account_answer", "varchar", 250); + } + + if(!$oDB->isColumnExists("member", "list_order")) { + $oDB->addColumn("member", "list_order", "number", 11); + set_time_limit(0); + $args->list_order = 'member_srl'; + executeQuery('member.updateMemberListOrderAll',$args); + executeQuery('member.updateMemberListOrderAll'); + } + + if(!$oDB->isIndexExists("member","idx_list_order")) { + $oDB->addIndex("member","idx_list_order", array("list_order")); + } + + return new Object(0, 'success_updated'); + } + + /** + * @brief 캐시 파일 재생성 + **/ + function recompileCache() { + set_include_path(_XE_PATH_."modules/member/php-openid-1.2.3"); + require_once('Auth/OpenID/XEStore.php'); + $store = new Auth_OpenID_XEStore(); + $store->reset(); + } + } +?> diff --git a/modules/member/member.controller.php b/modules/member/member.controller.php index ec40f852b..26dd1560d 100644 --- a/modules/member/member.controller.php +++ b/modules/member/member.controller.php @@ -1,1937 +1,1937 @@ -doLogin($user_id, $password, $keep_signed=='Y'?true:false); - - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('member'); - if($config->after_login_url) $this->setRedirectUrl($config->after_login_url); - - // 설정된 change_password_date 확인 - $limit_date = $config->change_password_date; - - // change_password_date가 설정되어 있으면 확인 - if ($limit_date > 0) { - $oMemberModel = &getModel('member'); - $member_info = $oMemberModel->getMemberInfoByUserID($user_id); - if ($member_info->change_password_date < date ('YmdHis', strtotime ('-' . $limit_date . ' day'))) { - $this->setRedirectUrl(getNotEncodedUrl('','vid',Context::get('vid'),'mid',Context::get('mid'),'act','dispMemberModifyPassword')); - } - } - - $redirect_url = Context::get('redirect_url'); - if ($output->toBool () && Context::getRequestMethod () == "POST" && $redirect_url) { - header ("location:" . $redirect_url); - } - - return $output; - } - - /** - * @brief openid로그인 - **/ - function procMemberOpenIDLogin($validator = "procMemberOpenIDValidate") { - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('member'); - if($config->enable_openid != 'Y') $this->stop('msg_invalid_request'); - - if(!defined('Auth_OpenID_RAND_SOURCE') && !file_exists("/dev/urandom")) - { - define('Auth_OpenID_RAND_SOURCE', null); - } - - set_include_path(_XE_PATH_."modules/member/php-openid-1.2.3"); - require_once('Auth/OpenID.php'); - require_once('Auth/OpenID/Consumer.php'); - require_once('Auth/OpenID/XEStore.php'); - $store = new Auth_OpenID_XEStore(); - $consumer = new Auth_OpenID_Consumer($store); - - $user_id = Context::get('user_id'); - if (!$user_id) $user_id = Context::get('openid'); - $auth_request = $consumer->begin($user_id); - $auth_request->addExtensionArg('sreg', 'required', 'email'); - $auth_request->addExtensionArg('sreg', 'optional', 'dob'); - if(!$auth_request) - { - return new Object(-1, "association failed"); - } - - $trust_root = 'http://'.$_SERVER["HTTP_HOST"]; - $referer_url = Context::get('referer_url'); - if (!$referer_url) $referer_url = $_SERVER['HTTP_REFERER']; - if (!$referer_url) - $referer_url = htmlspecialchars_decode(getRequestUri(RELEASE_SSL)); - $goto = urlencode($referer_url); - $ApprovedURL = Context::getRequestUri(RELEASE_SSL) . "?module=member&act=" . $validator. "&goto=" . $goto; - $redirect_url = $auth_request->redirectURL($trust_root, $ApprovedURL); - $this->add("redirect_url", $redirect_url); - if (Context::getRequestMethod() == 'POST') - header("location:" . $redirect_url); - } - - function getLegacyUserIDsFromOpenID($openid_identity) { - // Issue 17515512: workaround - $result = array(); - $uri_matches = array(); - preg_match(Auth_OpenID_getURIPattern(), $openid_identity, $uri_matches); - - if (count($uri_matches) < 9) { - for ($i = count($uri_matches); $i <= 9; $i++) { - $uri_matches[] = ''; - } - } - - $scheme = $uri_matches[2]; - $authority = $uri_matches[4]; - $path = $uri_matches[5]; - $query = $uri_matches[6]; - $fragment = $uri_matches[8]; - - if ($scheme === null) $scheme = ''; - if ($authority === null) $authority = ''; - if ($path === null) $path = ''; - if ($query === null) $query = ''; - if ($fragment === null) $fragment = ''; - - if ($scheme == 'http' or $scheme == '') - $scheme_part = ''; - else - $scheme_part = $scheme."://"; - - - if ($path == '' || $path == '/') { - $result[] = $scheme_part.$authority.''.$query.$fragment; - $result[] = $scheme_part.$authority.'/'.$query.$fragment; - } - else { - $result[] = $scheme_part.$authority.$path.$query.$fragment; - } - - return $result; - } - - /** - * @brief openid 인증 체크 - **/ - function procMemberOpenIDValidate() { - set_include_path(_XE_PATH_."modules/member/php-openid-1.2.3"); - require_once('Auth/OpenID.php'); - require_once('Auth/OpenID/Consumer.php'); - require_once('Auth/OpenID/XEStore.php'); - require_once('Auth/OpenID/URINorm.php'); - - $store = new Auth_OpenID_XEStore(); - $consumer = new Auth_OpenID_Consumer($store); - $response = $consumer->complete($_GET); - switch($response->status) { - case Auth_OpenID_CANCEL : - // 사용자가 인증을 취소했을 때의 처리 - return $this->stop('authorization_canceled'); - case Auth_OpenID_FAILURE : - // 무언가의 문제로 인해 인증이 실패했을 때의 처리(인증을 요구한 openid가 없다든가..) - return $this->stop('invalid_authorization'); - case Auth_OpenID_SUCCESS : - // 인증성공!! - break; - default: - return $this->stop('invalid_authorization'); - } - - // 인증 성공 - $oMemberModel = &getModel('member'); - - // 이 오픈아이디와 연결된 (또는 연결되어 있을 가능성이 있는) 제로보드 아이디들을 받아온다. - $login_success = false; - $assoc_member_info = null; - $openid_identity = $response->signed_args["openid.identity"]; - $args->openid = $openid_identity; - $output = executeQuery('member.getMemberSrlByOpenID', $args); - - if ($output->toBool() && $output->data && !is_array($output->data)) { - $member_srl = $output->data->member_srl; - $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); - if ($member_info) { - $assoc_member_info = $member_info; - } - } - - $user_id_candidates = $this->getLegacyUserIDsFromOpenID($openid_identity); - $default_user_id = $user_id_candidates[0]; - - if ($assoc_member_info != null) { - $user_id_candidates = array_merge(array($assoc_member_info->user_id), $user_id_candidates); - } - $sreg = $response->extensionResponse('sreg'); - - foreach($user_id_candidates as $user_id) { - $args->user_id = $args->nick_name = $user_id; - // 기본 정보들을 받음 - $args->email_address = $sreg['email']; - $args->user_name = $sreg['fullname']; - if(!$args->user_name) list($args->user_name) = explode('@', $args->email_address); - $args->birthday = str_replace('-','',$sreg['dob']); - - // 자체 인증 시도 - $output = $this->doLogin($args->user_id); - - if ($output->toBool()) { - if ($assoc_member_info == null) { - $logged_info = Context::get('logged_info'); - $args->member_srl = $logged_info->member_srl; - $args->openid = $openid_identity; - executeQuery('member.addOpenIDToMember', $args); - } - $login_success = true; - break; - } - } - - // 자체 인증 실패시 회원 가입시킴 - if(!$login_success) { - $args->user_id = $args->nick_name = $default_user_id; - $args->password = md5(getmicrotime()); - - $output = $this->insertMember($args); - if(!$output->toBool()) return $this->stop($output->getMessage()); - $output = $this->doLogin($args->user_id); - if(!$output->toBool()) return $this->stop($output->getMessage()); - - $logged_info = Context::get('logged_info'); - $args->member_srl = $logged_info->member_srl; - $args->openid = $openid_identity; - executeQuery('member.addOpenIDToMember', $args); - } - - Context::close(); - - // 페이지 이동 - if(Context::get('goto')) { - $goto = Context::get('goto'); - header("location:" . $goto); - } else { - header("location:./"); - } - - exit(); - } - - /** - * @brief 오픈아이디 연결 요청 - **/ - function procMemberAddOpenIDToMember() { - return $this->procMemberOpenIDLogin("procMemberValidateAddOpenIDToMember"); - } - - /** - * @brief 오픈아이디 연결 요청 마무리 - **/ - function procMemberValidateAddOpenIDToMember() { - set_include_path(_XE_PATH_."modules/member/php-openid-1.2.3"); - require_once('Auth/OpenID.php'); - require_once('Auth/OpenID/Consumer.php'); - require_once('Auth/OpenID/XEStore.php'); - require_once('Auth/OpenID/URINorm.php'); - - $store = new Auth_OpenID_XEStore(); - $consumer = new Auth_OpenID_Consumer($store); - $response = $consumer->complete($_GET); - - switch($response->status) { - case Auth_OpenID_CANCEL : - // 사용자가 인증을 취소했을 때의 처리 - return $this->stop('authorization_canceled'); - case Auth_OpenID_FAILURE : - // 무언가의 문제로 인해 인증이 실패했을 때의 처리(인증을 요구한 openid가 없다든가..) - return $this->stop('invalid_authorization'); - case Auth_OpenID_SUCCESS : - { - $logged_info = Context::get('logged_info'); - if (!Context::get('is_logged')) return $this->stop('msg_not_logged'); - - $member_srl = $logged_info->member_srl; - - $args->member_srl = $member_srl; - $openid_identity = $response->signed_args["openid.identity"]; - $args->openid = $openid_identity; - - $output = executeQuery('member.addOpenIDToMember', $args); - if (!$output->toBool()) return $output; - - Context::close(); - - if(Context::get('goto')){ - $goto = Context::get('goto'); - header("location:" . $goto); - }else{ - header("location:./"); - } - exit(); - } - // 인증성공!! - break; - default: - return $this->stop('invalid_authorization'); - } - } - - /** - * @brief 오픈아이디 연결 해제 - **/ - function procMemberDeleteOpenIDFromMember() { - $logged_info = Context::get('logged_info'); - $openid_identity = Context::get('openid_to_delete'); - $arg->openid = $openid_identity; - $result = executeQuery('member.getMemberSrlByOpenID', $arg); - - if (!Context::get('is_logged')) { - $this->setError(-1); - $this->setMessage('msg_not_logged'); - return; - } else if (!$result->data || is_array($result->data)) { - $this->setError(-1); - $this->setMessage('msg_not_founded'); - return; - } else if ($result->data->member_srl != $logged_info->member_srl) { - $this->setError(-1); - $this->setMessage('msg_not_permitted'); - return; - } - - $arg->openid = $openid_identity; - - $output = executeQuery('member.deleteMemberOpenID', $arg); - if(!$output->toBool()) return $output; - - $this->setMessage('success_updated'); - } - - - /** - * @brief 로그아웃 - **/ - function procMemberLogout() { - // 로그아웃 이전에 trigger 호출 (before) - $logged_info = Context::get('logged_info'); - $trigger_output = ModuleHandler::triggerCall('member.doLogout', 'before', $logged_info); - if(!$trigger_output->toBool()) return $trigger_output; - - // 세션 정보 파기 - $this->destroySessionInfo(); - - // 로그아웃 이후 trigger 호출 (after) - $trigger_output = ModuleHandler::triggerCall('member.doLogout', 'after', $logged_info); - if(!$trigger_output->toBool()) return $trigger_output; - - $output = new Object(); - - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('member'); - if($config->after_logout_url) Context::set('redirect_url', $config->after_logout_url); - - return $output; - } - - /** - * @brief 스크랩 기능 - **/ - function procMemberScrapDocument() { - // 로그인 정보 체크 - if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); - $logged_info = Context::get('logged_info'); - - $document_srl = (int)Context::get('document_srl'); - if(!$document_srl) $document_srl = (int)Context::get('target_srl'); - if(!$document_srl) return new Object(-1,'msg_invalid_request'); - - // 문서 가져오기 - $oDocumentModel = &getModel('document'); - $oDocument = $oDocumentModel->getDocument($document_srl); - - // 변수 정리 - $args->document_srl = $document_srl; - $args->member_srl = $logged_info->member_srl; - $args->user_id = $oDocument->get('user_id'); - $args->user_name = $oDocument->get('user_name'); - $args->nick_name = $oDocument->get('nick_name'); - $args->target_member_srl = $oDocument->get('member_srl'); - $args->title = $oDocument->get('title'); - - // 있는지 조사 - $output = executeQuery('member.getScrapDocument', $args); - if($output->data->count) return new Object(-1, 'msg_alreay_scrapped'); - - // 입력 - $output = executeQuery('member.addScrapDocument', $args); - if(!$output->toBool()) return $output; - - $this->setError(-1); - $this->setMessage('success_registed'); - } - - /** - * @brief 스크랩 삭제 - **/ - function procMemberDeleteScrap() { - // 로그인 정보 체크 - if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); - $logged_info = Context::get('logged_info'); - - $document_srl = (int)Context::get('document_srl'); - if(!$document_srl) return new Object(-1,'msg_invalid_request'); - - // 변수 정리 - $args->member_srl = $logged_info->member_srl; - $args->document_srl = $document_srl; - return executeQuery('member.deleteScrapDocument', $args); - } - - /** - * @brief 게시글 저장 - **/ - function procMemberSaveDocument() { - // 로그인 정보 체크 - if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); - - $logged_info = Context::get('logged_info'); - - // form 정보를 모두 받음 - $obj = Context::getRequestVars(); - - // 글의 대상 모듈을 회원 정보로 변경 - $obj->module_srl = $logged_info->member_srl; - unset($obj->is_notice); - - // 제목을 사용하지 않는 방명록 등에서 내용 앞 부분을 제목 가져오기 - if(!$obj->title) { - $obj->title = cut_str(strip_tags($obj->content), 20, '...'); - } - - $oDocumentModel = &getModel('document'); - $oDocumentController = &getController('document'); - - // 이미 존재하는 글인지 체크 - $oDocument = $oDocumentModel->getDocument($obj->document_srl, $this->grant->manager); - - // 이미 존재하는 경우 수정 - if($oDocument->isExists() && $oDocument->document_srl == $obj->document_srl) { - $output = $oDocumentController->updateDocument($oDocument, $obj); - $msg_code = 'success_updated'; - - // 그렇지 않으면 신규 등록 - } else { - $output = $oDocumentController->insertDocument($obj); - $msg_code = 'success_registed'; - $obj->document_srl = $output->get('document_srl'); - $oDocument = $oDocumentModel->getDocument($obj->document_srl, $this->grant->manager); - } - - // 등록된 첨부파일의 상태를 무효로 지정 - if($oDocument->hasUploadedFiles()) { - $args->upload_target_srl = $oDocument->document_srl; - $args->isvalid = 'N'; - executeQuery('file.updateFileValid', $args); - } - - $this->setMessage('success_saved'); - $this->add('document_srl', $obj->document_srl); - } - - /** - * @brief 저장된 글 삭제 - **/ - function procMemberDeleteSavedDocument() { - // 로그인 정보 체크 - if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); - $logged_info = Context::get('logged_info'); - - $document_srl = (int)Context::get('document_srl'); - if(!$document_srl) return new Object(-1,'msg_invalid_request'); - - // 변수 정리 - $oDocumentController = &getController('document'); - $oDocumentController->deleteDocument($document_srl, true); - } - - /** - * @brief 회원 가입시 특정 항목들에 대한 값 체크 - **/ - function procMemberCheckValue() { - $name = Context::get('name'); - $value = Context::get('value'); - if(!$value) return; - - $oMemberModel = &getModel('member'); - - // 로그인 여부 체크 - $logged_info = Context::get('logged_info'); - - - switch($name) { - case 'user_id' : - // 금지 아이디 검사 - if($oMemberModel->isDeniedID($value)) return new Object(0,'denied_user_id'); - - // 중복 검사 - $member_srl = $oMemberModel->getMemberSrlByUserID($value); - if($member_srl && $logged_info->member_srl != $member_srl ) return new Object(0,'msg_exists_user_id'); - break; - case 'nick_name' : - // 중복 검사 - $member_srl = $oMemberModel->getMemberSrlByNickName($value); - if($member_srl && $logged_info->member_srl != $member_srl ) return new Object(0,'msg_exists_nick_name'); - - break; - case 'email_address' : - // 중복 검사 - $member_srl = $oMemberModel->getMemberSrlByEmailAddress($value); - if($member_srl && $logged_info->member_srl != $member_srl ) return new Object(0,'msg_exists_email_address'); - break; - } - } - - /** - * @brief 회원 가입 - **/ - function procMemberInsert() { - if (Context::getRequestMethod () == "GET") return new Object (-1, "msg_invalid_request"); - $oMemberModel = &getModel ('member'); - $config = $oMemberModel->getMemberConfig (); - - // before 트리거 호출 - $trigger_output = ModuleHandler::triggerCall ('member.procMemberInsert', 'before', $config); - if (!$trigger_output->toBool ()) return $trigger_output; - - // 관리자가 회원가입을 허락하였는지 검사 - if ($config->enable_join != 'Y') return $this->stop ('msg_signup_disabled'); - - // 약관에 동의하였는지 검사 (약관이 있을 경우만) - if ($config->agreement && Context::get('accept_agreement')!='Y') return $this->stop('msg_accept_agreement'); - - // 필수 정보들을 미리 추출 - $args = Context::gets('user_id','user_name','nick_name','homepage','blog','birthday','email_address','password','allow_mailing','find_account_question','find_account_answer'); - $args->member_srl = getNextSequence(); - $args->list_order = -1 * $args->member_srl; - - // 넘어온 모든 변수중에서 몇가지 불필요한 것들 삭제 - $all_args = Context::getRequestVars(); - unset($all_args->module); - unset($all_args->act); - unset($all_args->is_admin); - unset($all_args->description); - unset($all_args->group_srl_list); - unset($all_args->body); - unset($all_args->accept_agreement); - unset($all_args->signature); - unset($all_args->password2); - - // 메일 인증 기능 사용시 회원 상태를 denied로 설정 - if ($config->enable_confirm == 'Y') $args->denied = 'Y'; - - // 모든 request argument에서 필수 정보만 제외 한 후 추가 데이터로 입력 - $extra_vars = delObjectVars($all_args, $args); - $args->extra_vars = serialize($extra_vars); - - // member_srl의 값에 따라 insert/update - $output = $this->insertMember($args); - if(!$output->toBool()) return $output; - - // 가상사이트일 경우 사이트 가입 - $site_module_info = Context::get('site_module_info'); - if($site_module_info->site_srl > 0) { - $default_group = $oMemberModel->getDefaultGroup($site_module_info->site_srl); - if($default_group->group_srl) { - $this->addMemberToGroup($args->member_srl, $default_group->group_srl, $site_module_info->site_srl); - } - - } - - // 로그인 시킴 - if ($config->enable_confirm != 'Y') $this->doLogin($args->user_id); - - // 결과 정리 - $this->add('member_srl', $args->member_srl); - if($config->redirect_url) $this->add('redirect_url', $config->redirect_url); - if ($config->enable_confirm == 'Y') { - $msg = sprintf(Context::getLang('msg_confirm_mail_sent'), $args->email_address); - $this->setMessage($msg); - } - else $this->setMessage('success_registed'); - - // after 트리거 호출 - $trigger_output = ModuleHandler::triggerCall('member.procMemberInsert', 'after', $config); - if(!$trigger_output->toBool()) return $trigger_output; - } - - /** - * @brief 회원 정보 수정 - **/ - function procMemberModifyInfo() { - if(!Context::get('is_logged')) return $this->stop('msg_not_logged'); - - // 필수 정보들을 미리 추출 - $args = Context::gets('user_name','nick_name','homepage','blog','birthday','email_address','allow_mailing','find_account_question','find_account_answer'); - - // 로그인 정보 - $logged_info = Context::get('logged_info'); - $args->member_srl = $logged_info->member_srl; - - // 넘어온 모든 변수중에서 몇가지 불필요한 것들 삭제 - $all_args = Context::getRequestVars(); - unset($all_args->module); - unset($all_args->act); - unset($all_args->is_admin); - unset($all_args->description); - unset($all_args->group_srl_list); - unset($all_args->body); - unset($all_args->accept_agreement); - unset($all_args->signature); - unset($all_args->_filter); - - // 모든 request argument에서 필수 정보만 제외 한 후 추가 데이터로 입력 - $extra_vars = delObjectVars($all_args, $args); - $args->extra_vars = serialize($extra_vars); - - // 멤버 모델 객체 생성 - $oMemberModel = &getModel('member'); - - // member_srl의 값에 따라 insert/update - $output = $this->updateMember($args); - if(!$output->toBool()) return $output; - - // 서명 저장 - $signature = Context::get('signature'); - $this->putSignature($args->member_srl, $signature); - - // user_id 에 따른 정보 가져옴 - $member_info = $oMemberModel->getMemberInfoByMemberSrl($args->member_srl); - - // 로그인 성공후 trigger 호출 (after) - $trigger_output = ModuleHandler::triggerCall('member.doLogin', 'after', $member_info); - if(!$trigger_output->toBool()) return $trigger_output; - - $this->setSessionInfo($member_info); - - // 결과 리턴 - $this->add('member_srl', $args->member_srl); - $this->setMessage('success_updated'); - } - - /** - * @brief 회원 비밀번호 수정 - **/ - function procMemberModifyPassword() { - if(!Context::get('is_logged')) return $this->stop('msg_not_logged'); - - // 필수 정보들을 미리 추출 - $current_password = trim(Context::get('current_password')); - $password = trim(Context::get('password')); - - // 로그인한 유저의 정보를 가져옴 - $logged_info = Context::get('logged_info'); - $member_srl = $logged_info->member_srl; - - // member model 객체 생성 - $oMemberModel = &getModel('member'); - - // member_srl 에 따른 정보 가져옴 - $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); - - // 현재 비밀번호가 맞는지 확인 - if(!$oMemberModel->isValidPassword($member_info->password, $current_password)) return new Object(-1, 'invalid_password'); - - // 이전 비밀번호와 같은지 확인 - if ($current_password == $password) return new Object(-1, 'invalid_new_password'); - - // member_srl의 값에 따라 insert/update - $args->member_srl = $member_srl; - $args->password = $password; - $output = $this->updateMemberPassword($args); - if(!$output->toBool()) return $output; - - $this->add('member_srl', $args->member_srl); - $this->setMessage('success_updated'); - } - - /** - * @brief 탈퇴 - **/ - function procMemberLeave() { - if(!Context::get('is_logged')) return $this->stop('msg_not_logged'); - - // 필수 정보들을 미리 추출 - $password = trim(Context::get('password')); - - // 로그인한 유저의 정보를 가져옴 - $logged_info = Context::get('logged_info'); - $member_srl = $logged_info->member_srl; - - // member model 객체 생성 - $oMemberModel = &getModel('member'); - - // member_srl 에 따른 정보 가져옴 - $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); - - // 현재 비밀번호가 맞는지 확인 - if(!$oMemberModel->isValidPassword($member_info->password, $password)) return new Object(-1, 'invalid_password'); - - $output = $this->deleteMember($member_srl); - if(!$output->toBool()) return $output; - - // 모든 세션 정보 파기 - $this->destroySessionInfo(); - - // 성공 메세지 리턴 - $this->setMessage('success_leaved'); - } - - /** - * @brief 오픈아이디 탈퇴 - **/ - function procMemberOpenIDLeave() { - // 비로그인 상태이면 에러 - if(!Context::get('is_logged')) return $this->stop('msg_not_logged'); - - // 현재 ip와 세션 아이피 비교 - if($_SESSION['ipaddress']!=$_SERVER['REMOTE_ADDR']) return $this->stop('msg_not_permitted'); - - // 로그인한 유저의 정보를 가져옴 - $logged_info = Context::get('logged_info'); - $member_srl = $logged_info->member_srl; - - $output = $this->deleteMember($member_srl); - if(!$output->toBool()) return $output; - - // 모든 세션 정보 파기 - $this->destroySessionInfo(); - - // 성공 메세지 리턴 - $this->setMessage('success_leaved'); - } - - /** - * @brief 프로필 이미지 추가 - **/ - function procMemberInsertProfileImage() { - // 정상적으로 업로드 된 파일인지 검사 - $file = $_FILES['profile_image']; - if(!is_uploaded_file($file['tmp_name'])) return $this->stop('msg_not_uploaded_profile_image'); - - // 회원 정보를 검사해서 회원번호가 없거나 관리자가 아니고 회원번호가 틀리면 무시 - $member_srl = Context::get('member_srl'); - if(!$member_srl) return $this->stop('msg_not_uploaded_profile_image'); - - $logged_info = Context::get('logged_info'); - if($logged_info->is_admin != 'Y' && $logged_info->member_srl != $member_srl) return $this->stop('msg_not_uploaded_profile_image'); - - // 회원 모듈 설정에서 이미지 이름 사용 금지를 하였을 경우 관리자가 아니면 return; - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('member'); - if($logged_info->is_admin != 'Y' && $config->profile_image != 'Y') return $this->stop('msg_not_uploaded_profile_image'); - - $this->insertProfileImage($member_srl, $file['tmp_name']); - - // 페이지 리프레쉬 - $this->setRefreshPage(); - } - - function insertProfileImage($member_srl, $target_file) { - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('member'); - - // 정해진 사이즈를 구함 - $max_width = $config->profile_image_max_width; - if(!$max_width) $max_width = "90"; - $max_height = $config->profile_image_max_height; - if(!$max_height) $max_height = "20"; - - // 저장할 위치 구함 - $target_path = sprintf('files/member_extra_info/profile_image/%s', getNumberingPath($member_srl)); - FileHandler::makeDir($target_path); - - // 파일 정보 구함 - list($width, $height, $type, $attrs) = @getimagesize($target_file); - if($type == 3) $ext = 'png'; - elseif($type == 2) $ext = 'jpg'; - else $ext = 'gif'; - - $target_filename = sprintf('%s%d.%s', $target_path, $member_srl, $ext); - - // 지정된 사이즈보다 크거나 gif가 아니면 변환 - if($width > $max_width || $height > $max_height || $type!=1) FileHandler::createImageFile($target_file, $target_filename, $max_width, $max_height, $ext); - else @copy($target_file, $target_filename); - } - - /** - * @brief 이미지 이름을 추가 - **/ - function procMemberInsertImageName() { - // 정상적으로 업로드 된 파일인지 검사 - $file = $_FILES['image_name']; - if(!is_uploaded_file($file['tmp_name'])) return $this->stop('msg_not_uploaded_image_name'); - - // 회원 정보를 검사해서 회원번호가 없거나 관리자가 아니고 회원번호가 틀리면 무시 - $member_srl = Context::get('member_srl'); - if(!$member_srl) return $this->stop('msg_not_uploaded_image_name'); - - $logged_info = Context::get('logged_info'); - if($logged_info->is_admin != 'Y' && $logged_info->member_srl != $member_srl) return $this->stop('msg_not_uploaded_image_name'); - - // 회원 모듈 설정에서 이미지 이름 사용 금지를 하였을 경우 관리자가 아니면 return; - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('member'); - if($logged_info->is_admin != 'Y' && $config->image_name != 'Y') return $this->stop('msg_not_uploaded_image_name'); - - $this->insertImageName($member_srl, $file['tmp_name']); - - // 페이지 리프레쉬 - $this->setRefreshPage(); - } - - function insertImageName($member_srl, $target_file) { - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('member'); - - // 정해진 사이즈를 구함 - $max_width = $config->image_name_max_width; - if(!$max_width) $max_width = "90"; - $max_height = $config->image_name_max_height; - if(!$max_height) $max_height = "20"; - - // 저장할 위치 구함 - $target_path = sprintf('files/member_extra_info/image_name/%s/', getNumberingPath($member_srl)); - FileHandler::makeDir($target_path); - - $target_filename = sprintf('%s%d.gif', $target_path, $member_srl); - - // 파일 정보 구함 - list($width, $height, $type, $attrs) = @getimagesize($target_file); - - // 지정된 사이즈보다 크거나 gif가 아니면 변환 - if($width > $max_width || $height > $max_height || $type!=1) FileHandler::createImageFile($target_file, $target_filename, $max_width, $max_height, 'gif'); - else @copy($target_file, $target_filename); - } - - /** - * @brief 프로필 이미지를 삭제 - **/ - function procMemberDeleteProfileImage() { - $member_srl = Context::get('member_srl'); - if(!$member_srl) return new Object(0,'success'); - - $logged_info = Context::get('logged_info'); - - if($logged_info->is_admin != 'Y') { - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('member'); - if($config->profile_image == 'N') return new Object(0,'success'); - } - - if($logged_info->is_admin == 'Y' || $logged_info->member_srl == $member_srl) { - $oMemberModel = &getModel('member'); - $profile_image = $oMemberModel->getProfileImage($member_srl); - FileHandler::removeFile($profile_image->file); - } - return new Object(0,'success'); - } - - /** - * @brief 이미지 이름을 삭제 - **/ - function procMemberDeleteImageName() { - $member_srl = Context::get('member_srl'); - if(!$member_srl) return new Object(0,'success'); - - $logged_info = Context::get('logged_info'); - - if($logged_info->is_admin != 'Y') { - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('member'); - if($config->image_name == 'N') return new Object(0,'success'); - } - - if($logged_info->is_admin == 'Y' || $logged_info->member_srl == $member_srl) { - $oMemberModel = &getModel('member'); - $image_name = $oMemberModel->getImageName($member_srl); - FileHandler::removeFile($image_name->file); - } - return new Object(0,'success'); - } - - /** - * @brief 이미지 마크를 추가 - **/ - function procMemberInsertImageMark() { - // 정상적으로 업로드 된 파일인지 검사 - $file = $_FILES['image_mark']; - if(!is_uploaded_file($file['tmp_name'])) return $this->stop('msg_not_uploaded_image_mark'); - - // 회원 정보를 검사해서 회원번호가 없거나 관리자가 아니고 회원번호가 틀리면 무시 - $member_srl = Context::get('member_srl'); - if(!$member_srl) return $this->stop('msg_not_uploaded_image_mark'); - - $logged_info = Context::get('logged_info'); - if($logged_info->is_admin != 'Y' && $logged_info->member_srl != $member_srl) return $this->stop('msg_not_uploaded_image_mark'); - - // 회원 모듈 설정에서 이미지 마크 사용 금지를 하였을 경우 관리자가 아니면 return; - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('member'); - if($logged_info->is_admin != 'Y' && $config->image_mark != 'Y') return $this->stop('msg_not_uploaded_image_mark'); - - $this->insertImageMark($member_srl, $file['tmp_name']); - - // 페이지 리프레쉬 - $this->setRefreshPage(); - } - - function insertImageMark($member_srl, $target_file) { - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('member'); - - // 정해진 사이즈를 구함 - $max_width = $config->image_mark_max_width; - if(!$max_width) $max_width = "20"; - $max_height = $config->image_mark_max_height; - if(!$max_height) $max_height = "20"; - - $target_path = sprintf('files/member_extra_info/image_mark/%s/', getNumberingPath($member_srl)); - FileHandler::makeDir($target_path); - - $target_filename = sprintf('%s%d.gif', $target_path, $member_srl); - - // 파일 정보 구함 - list($width, $height, $type, $attrs) = @getimagesize($target_file); - - if($width > $max_width || $height > $max_height || $type!=1) FileHandler::createImageFile($target_file, $target_filename, $max_width, $max_height, 'gif'); - else @copy($target_file, $target_filename); - - } - - /** - * @brief 이미지 마크를 삭제 - **/ - function procMemberDeleteImageMark() { - $member_srl = Context::get('member_srl'); - if(!$member_srl) return new Object(0,'success'); - - $logged_info = Context::get('logged_info'); - if($logged_info->is_admin == 'Y' || $logged_info->member_srl == $member_srl) { - $oMemberModel = &getModel('member'); - $image_mark = $oMemberModel->getImageMark($member_srl); - FileHandler::removeFile($image_mark->file); - } - return new Object(0,'success'); - } - - /** - * @brief 아이디/ 비밀번호 찾기 - **/ - function procMemberFindAccount() { - $email_address = Context::get('email_address'); - if(!$email_address) return new Object(-1, 'msg_invalid_request'); - - $oMemberModel = &getModel('member'); - $oModuleModel = &getModel('module'); - - // 메일 주소에 해당하는 회원이 있는지 검사 - $member_srl = $oMemberModel->getMemberSrlByEmailAddress($email_address); - if(!$member_srl) return new Object(-1, 'msg_email_not_exists'); - - // 회원의 정보를 가져옴 - $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); - - // 아이디/비밀번호 찾기가 가능한 상태의 회원인지 검사 - if ($member_info->denied == 'Y') { - $chk_args->member_srl = $member_info->member_srl; - $output = executeQuery('member.chkAuthMail', $chk_args); - if ($output->toBool() && $output->data->count != '0') return new Object(-1, 'msg_user_not_confirmed'); - } - - // 인증 DB에 데이터를 넣음 - $args->user_id = $member_info->user_id; - $args->member_srl = $member_info->member_srl; - $args->new_password = rand(111111,999999); - $args->auth_key = md5( rand(0,999999 ) ); - $args->is_register = 'N'; - - $output = executeQuery('member.insertAuthMail', $args); - if(!$output->toBool()) return $output; - - // 메일 내용을 구함 - Context::set('auth_args', $args); - Context::set('member_info', $member_info); - - $member_config = $oModuleModel->getModuleConfig('member'); - if(!$member_config->skin) $member_config->skin = "default"; - if(!$member_config->colorset) $member_config->colorset = "white"; - - Context::set('member_config', $member_config); - - $tpl_path = sprintf('%sskins/%s', $this->module_path, $member_config->skin); - if(!is_dir($tpl_path)) $tpl_path = sprintf('%sskins/%s', $this->module_path, 'default'); - - $find_url = getFullUrl ('', 'module', 'member', 'act', 'procMemberAuthAccount', 'member_srl', $member_info->member_srl, 'auth_key', $args->auth_key); - Context::set('find_url', $find_url); - - $oTemplate = &TemplateHandler::getInstance(); - $content = $oTemplate->compile($tpl_path, 'find_member_account_mail'); - - // 사이트 웹마스터 정보를 구함 - $oModuleModel = &getModel('module'); - $member_config = $oModuleModel->getModuleConfig('member'); - - // 메일 발송 - $oMail = new Mail(); - $oMail->setTitle( Context::getLang('msg_find_account_title') ); - $oMail->setContent($content); - $oMail->setSender( $member_config->webmaster_name?$member_config->webmaster_name:'webmaster', $member_config->webmaster_email); - $oMail->setReceiptor( $member_info->user_name, $member_info->email_address ); - $oMail->send(); - - // 메세지 return - $msg = sprintf(Context::getLang('msg_auth_mail_sent'), $member_info->email_address); - return new Object(0,$msg); - } - - - /** - * @brief 질문/답변을 통한 임시 비밀번호 생성 - **/ - function procMemberFindAccountByQuestion() { - $email_address = Context::get('email_address'); - $user_id = Context::get('user_id'); - $find_account_question = trim(Context::get('find_account_question')); - $find_account_answer = trim(Context::get('find_account_answer')); - - if(!$user_id || !$email_address || !$find_account_question || !$find_account_answer) return new Object(-1, 'msg_invalid_request'); - - $oMemberModel = &getModel('member'); - $oModuleModel = &getModel('module'); - - // 메일 주소에 해당하는 회원이 있는지 검사 - $member_srl = $oMemberModel->getMemberSrlByEmailAddress($email_address); - if(!$member_srl) return new Object(-1, 'msg_email_not_exists'); - - // 회원의 정보를 가져옴 - $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); - - // 질문 응답이 없으면 - if (!$member_info->find_account_question || !$member_info->find_account_answer) return new Object(-1, 'msg_question_not_exists'); - - if(trim($member_info->find_account_question) != $find_account_question || trim($member_info->find_account_answer) != $find_account_answer) return new Object(-1, 'msg_answer_not_matches'); - - // 임시비밀번호로 변경 및 비밀번호 변경시간을 1로 설정 - $args->member_srl = $member_srl; - list($usec, $sec) = explode(" ", microtime()); - $temp_password = substr(md5($user_id . $member_info->find_account_answer. $usec . $sec),0,15); - - $args->password = $temp_password; - $args->change_password_date = '1'; - $output = $this->updateMemberPassword($args); - if(!$output->toBool()) return $output; - - $_SESSION['xe_temp_password_'.$user_id] = $temp_password; - - $this->add('user_id',$user_id); - } - - /** - * @brief 아이디/비밀번호 찾기 기능 실행 - * 메일에 등록된 링크를 선택시 호출되는 method로 비밀번호를 바꾸고 인증을 시켜버림 - **/ - function procMemberAuthAccount() { - // user_id, authkey 검사 - $member_srl = Context::get('member_srl'); - $auth_key = Context::get('auth_key'); - if(!$member_srl || !$auth_key) return $this->stop('msg_invalid_request'); - - // user_id, authkey로 비밀번호 찾기 로그 검사 - $args->member_srl = $member_srl; - $args->auth_key = $auth_key; - $output = executeQuery('member.getAuthMail', $args); - if(!$output->toBool() || $output->data->auth_key != $auth_key) return $this->stop('msg_invalid_auth_key'); - - // 인증 정보가 맞다면 새비밀번호로 비밀번호를 바꿈 - if ($output->data->is_register == 'Y') { - $args->password = $output->data->new_password; - $args->denied = 'N'; - } else { - $args->password = md5($output->data->new_password); - unset($args->denied); - } - - // $output->data->is_register 값을 백업해 둔다. - $is_register = $output->data->is_register; - - $output = executeQuery('member.updateMemberPassword', $args); - if(!$output->toBool()) return $this->stop($output->getMessage()); - - // 인증 테이블에서 member_srl에 해당하는 모든 값을 지움 - executeQuery('member.deleteAuthMail',$args); - - // 결과를 통보 - Context::set('is_register', $is_register); - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('msg_success_authed'); - } - - /** - * @brief 아이디/비밀번호 찾기 기능 실행 - * 메일에 등록된 링크를 선택시 호출되는 method로 비밀번호를 바꾸고 인증을 시켜버림 - **/ - function procMemberUpdateAuthMail() { - $member_srl = Context::get('member_srl'); - if(!$member_srl) return new Object(-1, 'msg_invalid_request'); - - $oMemberModel = &getModel('member'); - - // 회원의 정보를 가져옴 - $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); - - // 인증메일 재발송 요청이 가능한 상태의 회원인지 검사 - if ($member_info->denied != 'Y') - return new Object(-1, 'msg_invalid_request'); - - $chk_args->member_srl = $member_srl; - $output = executeQuery('member.chkAuthMail', $chk_args); - if ($output->toBool() && $output->data->count == '0') return new Object(-1, 'msg_invalid_request'); - - // 인증 DB에 데이터를 넣음 - $auth_args->member_srl = $member_srl; - $auth_args->auth_key = md5(rand(0, 999999)); - - $output = executeQuery('member.updateAuthMail', $auth_args); - if (!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - // 메일 내용을 구함 - Context::set('auth_args', $auth_args); - Context::set('member_info', $member_info); - - $oModuleModel = &getModel('module'); - $member_config = $oModuleModel->getModuleConfig('member'); - if(!$member_config->skin) $member_config->skin = "default"; - if(!$member_config->colorset) $member_config->colorset = "white"; - - Context::set('member_config', $member_config); - - $tpl_path = sprintf('%sskins/%s', $this->module_path, $member_config->skin); - if(!is_dir($tpl_path)) $tpl_path = sprintf('%sskins/%s', $this->module_path, 'default'); - - $auth_url = getFullUrl('','module','member','act','procMemberAuthAccount','member_srl',$member_info->member_srl, 'auth_key',$auth_args->auth_key); - Context::set('auth_url', $auth_url); - - $oTemplate = &TemplateHandler::getInstance(); - $content = $oTemplate->compile($tpl_path, 'confirm_member_account_mail'); - - // 사이트 웹마스터 정보를 구함 - $oModuleModel = &getModel('module'); - $member_config = $oModuleModel->getModuleConfig('member'); - - // 메일 발송 - $oMail = new Mail(); - $oMail->setTitle( Context::getLang('msg_confirm_account_title') ); - $oMail->setContent($content); - $oMail->setSender( $member_config->webmaster_name?$member_config->webmaster_name:'webmaster', $member_config->webmaster_email); - $oMail->setReceiptor( $member_info->user_name, $member_info->email_address ); - $oMail->send(); - - // 메세지 return - $msg = sprintf(Context::getLang('msg_auth_mail_sent'), $member_info->email_address); - return new Object(-1, $msg); - } - - /** - * @brief 인증 메일 재발송 - **/ - function procMemberResendAuthMail() { - // email_address 검사 - $email_address = Context::get('email_address'); - if(!$email_address) return $this->stop('msg_invalid_request'); - - // email_address로 비밀번호 찾기 로그 검사 - $oMemberModel = &getModel('member'); - - $args->email_address = $email_address; - $member_info = $oMemberModel->getMemberSrlByEmailAddress($email_address); - if(!$member_info) return $this->stop('msg_not_exists_member'); - - $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_info); - - // 이전에 인증 메일을 보냈는지 확인 - $chk_args->member_srl = $member_info->member_srl; - $output = executeQuery('member.chkAuthMail', $chk_args); - if($output->toBool() && $output->data->count == '0') return new Object(-1, 'msg_invalid_request'); - - $auth_args->member_srl = $member_info->member_srl; - $output = executeQueryArray('member.getAuthMailInfo', $auth_args); - if(!$output->data || !$output->data[0]->auth_key) return new Object(-1, 'msg_invalid_request'); - $auth_info = $output->data[0]; - - // 메일 내용을 구함 - Context::set('member_info', $member_info); - $oModuleModel = &getModel('module'); - $member_config = $oModuleModel->getModuleConfig('member'); - if(!$member_config->skin) $member_config->skin = "default"; - if(!$member_config->colorset) $member_config->colorset = "white"; - - Context::set('member_config', $member_config); - - $tpl_path = sprintf('%sskins/%s', $this->module_path, $member_config->skin); - if(!is_dir($tpl_path)) $tpl_path = sprintf('%sskins/%s', $this->module_path, 'default'); - - $auth_url = getFullUrl('','module','member','act','procMemberAuthAccount','member_srl',$member_info->member_srl, 'auth_key',$auth_info->auth_key); - Context::set('auth_url', $auth_url); - - $oTemplate = &TemplateHandler::getInstance(); - $content = $oTemplate->compile($tpl_path, 'confirm_member_account_mail'); - - // 사이트 웹마스터 정보를 구함 - $oModuleModel = &getModel('module'); - $member_config = $oModuleModel->getModuleConfig('member'); - - // 메일 발송 - $oMail = new Mail(); - $oMail->setTitle( Context::getLang('msg_confirm_account_title') ); - $oMail->setContent($content); - $oMail->setSender( $member_config->webmaster_name?$member_config->webmaster_name:'webmaster', $member_config->webmaster_email); - $oMail->setReceiptor( $args->user_name, $args->email_address ); - $oMail->send(); - - $msg = sprintf(Context::getLang('msg_confirm_mail_sent'), $args->email_address); - $this->setMessage($msg); - } - - /** - * @brief 가상 사이트 가입 - **/ - function procModuleSiteSignUp() { - $site_module_info = Context::get('site_module_info'); - $logged_info = Context::get('logged_info'); - if(!$site_module_info->site_srl || !Context::get('is_logged') || count($logged_info->group_srl_list) ) return new Object(-1,'msg_invalid_request'); - - $oMemberModel = &getModel('member'); - $default_group = $oMemberModel->getDefaultGroup($site_module_info->site_srl); - $this->addMemberToGroup($logged_info->member_srl, $default_group->group_srl, $site_module_info->site_srl); - $groups[$default_group->group_srl] = $default_group->title; - $logged_info->group_list = $groups; - } - - /** - * @brief 가상 사이트 탈퇴 - **/ - function procModuleSiteLeave() { - $site_module_info = Context::get('site_module_info'); - $logged_info = Context::get('logged_info'); - if(!$site_module_info->site_srl || !Context::get('is_logged') || count($logged_info->group_srl_list) ) return new Object(-1,'msg_invalid_request'); - - $args->site_srl= $site_module_info->site_srl; - $args->member_srl = $logged_info->member_srl; - $output = executeQuery('member.deleteMembersGroup', $args); - if(!$output->toBool()) return $output; - $this->setMessage('success_deleted'); - } - - /** - * @brief 회원 설정 정보를 저장 - **/ - function setMemberConfig($args) { - if(!$args->skin) $args->skin = "default"; - if(!$args->colorset) $args->colorset = "white"; - if(!$args->editor_skin) $args->editor_skin= "xpresseditor"; - if(!$args->editor_colorset) $args->editor_colorset = "white"; - if($args->enable_join!='Y') $args->enable_join = 'N'; - if($args->enable_openid!='Y') $args->enable_openid= 'N'; - if($args->profile_image !='Y') $args->profile_image = 'N'; - if($args->image_name!='Y') $args->image_name = 'N'; - if($args->image_mark!='Y') $args->image_mark = 'N'; - if($args->group_image_mark!='Y') $args->group_image_mark = 'N'; - if(!trim(strip_tags($args->agreement))) $args->agreement = null; - $args->limit_day = (int)$args->limit_day; - - $agreement = trim($args->agreement); - unset($args->agreement); - - $oModuleController = &getController('module'); - $output = $oModuleController->insertModuleConfig('member',$args); - if(!$output->toBool()) return $output; - - $agreement_file = _XE_PATH_.'files/member_extra_info/agreement.txt'; - FileHandler::writeFile($agreement_file, $agreement); - - return new Object(); - } - - /** - * @brief 서명을 파일로 저장 - **/ - function putSignature($member_srl, $signature) { - $signature = trim(removeHackTag($signature)); - $signature = preg_replace('/<(\/?)(embed|object|param)/is', '<$1$2', $signature); - - $check_signature = trim(str_replace(array(' ',"\n","\r"),'',strip_tags($signature,''))); - $path = sprintf('files/member_extra_info/signature/%s/', getNumberingPath($member_srl)); - $filename = sprintf('%s%d.signature.php', $path, $member_srl); - - if(!$check_signature) return FileHandler::removeFile($filename); - - $buff = sprintf('%s', $signature); - FileHandler::makeDir($path); - FileHandler::writeFile($filename, $buff); - } - - /** - * @brief 서명 파일 삭제 - **/ - function delSignature($member_srl) { - $filename = sprintf('files/member_extra_info/signature/%s%d.gif', getNumberingPath($member_srl), $member_srl); - FileHandler::removeFile($filename); - } - - /** - * @brief member_srl에 group_srl을 추가 - **/ - function addMemberToGroup($member_srl,$group_srl,$site_srl=0) { - $args->member_srl = $member_srl; - $args->group_srl = $group_srl; - if($site_srl) $args->site_srl = $site_srl; - - $oModel =& getModel('member'); - $groups = $oModel->getMemberGroups($member_srl, $site_srl, true); - if($groups[$group_srl]) return new Object(); - - // 추가 - $output = executeQuery('member.addMemberToGroup',$args); - $output2 = ModuleHandler::triggerCall('member.addMemberToGroup', 'after', $args); - - return $output; - } - - /** - * @brief 특정 회원들의 그룹을 일괄 변경 - * 가상 사이트와 같이 한 회원이 하나의 그룹만 가질 경우 사용할 수 있음 - **/ - function replaceMemberGroup($args) { - $obj->site_srl = $args->site_srl; - $obj->member_srl = implode(',',$args->member_srl); - - $output = executeQueryArray('member.getMembersGroup', $obj); - if($output->data) foreach($output->data as $key => $val) $date[$val->member_srl] = $val->regdate; - - $output = executeQuery('member.deleteMembersGroup', $obj); - if(!$output->toBool()) return $output; - - $inserted_members = array(); - foreach($args->member_srl as $key => $val) { - if($inserted_members[$val]) continue; - $inserted_members[$val] = true; - - unset($obj); - $obj->member_srl = $val; - $obj->group_srl = $args->group_srl; - $obj->site_srl = $args->site_srl; - $obj->regdate = $date[$obj->member_srl]; - $output = executeQuery('member.addMemberToGroup', $obj); - if(!$output->toBool()) return $output; - } - return new Object(); - } - - - /** - * @brief 자동 로그인 시킴 - **/ - function doAutologin() { - // 자동 로그인 키 값을 구함 - $args->autologin_key = $_COOKIE['xeak']; - - // 키값에 해당하는 정보 구함 - $output = executeQuery('member.getAutologin', $args); - - // 정보가 없으면 쿠키 삭제 - if(!$output->toBool() || !$output->data) { - setCookie('xeak',null,time()+60*60*24*365, '/'); - return; - } - - $user_id = $output->data->user_id; - $password = $output->data->password; - if(!$user_id || !$password) { - setCookie('xeak',null,time()+60*60*24*365, '/'); - return; - } - - $do_auto_login = false; - - // 정보를 바탕으로 키값 비교 - $key = md5($user_id.$password.$_SERVER['REMOTE_ADDR']); - - if($key == $args->autologin_key) { - - // 설정된 change_password_date 확인 - $oModuleModel = &getModel('module'); - $member_config = $oModuleModel->getModuleConfig('member'); - $limit_date = $member_config->change_password_date; - - // change_password_date가 설정되어 있으면 확인 - if($limit_date > 0) { - $oMemberModel = &getModel('member'); - $member_info = $oMemberModel->getMemberInfoByUserID($user_id); - - if($member_info->change_password_date >= date('YmdHis', strtotime('-'.$limit_date.' day')) ){ - $do_auto_login = true; - } - - } else { - $do_auto_login = true; - } - } - - - if($do_auto_login) { - $output = $this->doLogin($user_id); - } else { - executeQuery('member.deleteAutologin', $args); - setCookie('xeak',null,time()+60*60*24*365, '/'); - } - } - - /** - * @brief 로그인 시킴 - **/ - function doLogin($user_id, $password = '', $keep_signed = false) { - $user_id = strtolower($user_id); - - // 로그인 이전에 trigger 호출 (before) - $trigger_obj->user_id = $user_id; - $trigger_obj->password = $password; - $trigger_output = ModuleHandler::triggerCall('member.doLogin', 'before', $trigger_obj); - if(!$trigger_output->toBool()) return $trigger_output; - - // member model 객체 생성 - $oMemberModel = &getModel('member'); - - // user_id 에 따른 정보 가져옴 - $member_info = $oMemberModel->getMemberInfoByUserID($user_id); - - // return 값이 없으면 존재하지 않는 사용자로 지정 - if(!$user_id || strtolower($member_info->user_id) != strtolower($user_id)) return new Object(-1, 'invalid_user_id'); - - // 비밀번호 검사 - if($password && !$oMemberModel->isValidPassword($member_info->password, $password)) return new Object(-1, 'invalid_password'); - - // denied == 'Y' 이면 알림 - if($member_info->denied == 'Y') { - $args->member_srl = $member_info->member_srl; - $output = executeQuery('member.chkAuthMail', $args); - if ($output->toBool() && $output->data->count != '0') return new Object(-1,'msg_user_not_confirmed'); - return new Object(-1,'msg_user_denied'); - } - - // denied_date가 현 시간보다 적으면 알림 - if($member_info->limit_date && substr($member_info->limit_date,0,8) >= date("Ymd")) return new Object(-1,sprintf(Context::getLang('msg_user_limited'),zdate($member_info->limit_date,"Y-m-d"))); - - // 사용자 정보의 최근 로그인 시간을 기록 - $args->member_srl = $member_info->member_srl; - $output = executeQuery('member.updateLastLogin', $args); - - // 로그인 성공후 trigger 호출 (after) - $trigger_output = ModuleHandler::triggerCall('member.doLogin', 'after', $member_info); - if(!$trigger_output->toBool()) return $trigger_output; - - // 자동 로그인 사용시 정보 처리 - if($keep_signed) { - // 자동 로그인 키 생성 - $autologin_args->autologin_key = md5(strtolower($user_id).$member_info->password.$_SERVER['REMOTE_ADDR']); - $autologin_args->member_srl = $member_info->member_srl; - executeQuery('member.deleteAutologin', $autologin_args); - $autologin_output = executeQuery('member.insertAutologin', $autologin_args); - if($autologin_output->toBool()) setCookie('xeak',$autologin_args->autologin_key, time()+60*60*24*365, '/'); - } - - $this->setSessionInfo($member_info); - - return $output; - } - - /** - * @brief 세션 정보 갱싱 또는 생성 - **/ - function setSessionInfo($member_info = null) { - $oMemberModel = &getModel('member'); - - // 사용자 정보가 넘어오지 않았다면 현재 세션 정보에서 사용자 정보를 추출 - if(!$member_info && $_SESSION['member_srl'] && $oMemberModel->isLogged() ) { - $member_info = $oMemberModel->getMemberInfoByMemberSrl($_SESSION['member_srl']); - - // 회원정보가 없다면 세션 파기 - if($member_info->member_srl != $_SESSION['member_srl']) { - $this->destroySessionInfo(); - return; - } - } - - // 사용중지 아이디이면 세션 파기 - if($member_info->denied=='Y') { - $this->destroySessionInfo(); - return; - } - - // 오픈아이디인지 체크 (일단 아이디 형식으로만 결정) - if(preg_match("/^([_0-9a-zA-Z]+)$/is", $member_info->user_id)) $member_info->is_openid = false; - else $member_info->is_openid = true; - - // 로그인 처리를 위한 세션 설정 - $_SESSION['is_logged'] = true; - $_SESSION['ipaddress'] = $_SERVER['REMOTE_ADDR']; - $_SESSION['member_srl'] = $member_info->member_srl; - $_SESSION['is_admin'] = ''; - - // 비밀번호는 세션에 저장되지 않도록 지워줌;; - //unset($member_info->password); - - // 사용자 그룹 설정 - /* - if($member_info->group_list) { - $group_srl_list = array_keys($member_info->group_list); - $_SESSION['group_srls'] = $group_srl_list; - - // 관리자 그룹일 경우 관리자로 지정 - $oMemberModel = &getModel('member'); - $admin_group = $oMemberModel->getAdminGroup(); - if($admin_group->group_srl && in_array($admin_group->group_srl, $group_srl_list)) $_SESSION['is_admin'] = 'Y'; - } - */ - - // 세션에 로그인 사용자 정보 저장 - $_SESSION['logged_info'] = $member_info; - Context::set('is_logged', true); - Context::set('logged_info', $member_info); - - // 사용자의 전용 메뉴 구성 (이 메뉴는 애드온등으로 변경될 수 있음) - $this->addMemberMenu( 'dispMemberInfo', 'cmd_view_member_info'); - $this->addMemberMenu( 'dispMemberScrappedDocument', 'cmd_view_scrapped_document'); - $this->addMemberMenu( 'dispMemberSavedDocument', 'cmd_view_saved_document'); - $this->addMemberMenu( 'dispMemberOwnDocument', 'cmd_view_own_document'); - } - - /** - * @brief 로그인한 사용자의 개인화된 메뉴 제공을 위한 method - * 로그인 정보 출력 위젯 또는 개인화 페이지에서 사용됨 - **/ - function addMemberMenu($act, $str) { - $logged_info = Context::get('logged_info'); - - $logged_info->menu_list[$act] = Context::getLang($str); - - Context::set('logged_info', $logged_info); - $_SESSION['logged_info'] = $logged_info; - } - - /** - * @brief 로그인 회원의 닉네임등을 클릭할때 나타나는 팝업 메뉴를 추가하는 method - **/ - function addMemberPopupMenu($url, $str, $icon = '', $target = 'self') { - $member_popup_menu_list = Context::get('member_popup_menu_list'); - if(!is_array($member_popup_menu_list)) $member_popup_menu_list = array(); - - $obj->url = $url; - $obj->str = $str; - $obj->icon = $icon; - $obj->target = $target; - $member_popup_menu_list[] = $obj; - - Context::set('member_popup_menu_list', $member_popup_menu_list); - } - - /** - * @brief member 테이블에 사용자 추가 - **/ - function insertMember(&$args, $password_is_hashed = false) { - // trigger 호출 (before) - $output = ModuleHandler::triggerCall('member.insertMember', 'before', $args); - if(!$output->toBool()) return $output; - - // 멤버 설정 정보에서 가입약관 부분을 재확인 - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('member'); - - $logged_info = Context::get('logged_info'); - - // 임시 제한 일자가 있을 경우 제한 일자에 내용 추가 - if($config->limit_day) $args->limit_date = date("YmdHis", time()+$config->limit_day*60*60*24); - - // 입력할 사용자의 아이디를 소문자로 변경 - $args->user_id = strtolower($args->user_id); - - // 필수 변수들의 조절 - if($args->allow_mailing!='Y') $args->allow_mailing = 'N'; - if($args->denied!='Y') $args->denied = 'N'; - $args->allow_message= 'Y'; - - if($logged_info->is_admin == 'Y') { - if($args->is_admin!='Y') $args->is_admin = 'N'; - } else { - unset($args->is_admin); - } - - list($args->email_id, $args->email_host) = explode('@', $args->email_address); - - // 홈페이지, 블로그의 주소 검사 - if($args->homepage && !preg_match("/^[a-z]+:\/\//i",$args->homepage)) $args->homepage = 'http://'.$args->homepage; - if($args->blog && !preg_match("/^[a-z]+:\/\//i",$args->blog)) $args->blog = 'http://'.$args->blog; - - // 모델 객체 생성 - $oMemberModel = &getModel('member'); - // 금지 아이디인지 체크 - if($oMemberModel->isDeniedID($args->user_id)) return new Object(-1,'denied_user_id'); - - // 아이디, 닉네임, email address 의 중복 체크 - $member_srl = $oMemberModel->getMemberSrlByUserID($args->user_id); - if($member_srl) return new Object(-1,'msg_exists_user_id'); - - $member_srl = $oMemberModel->getMemberSrlByNickName($args->nick_name); - if($member_srl) return new Object(-1,'msg_exists_nick_name'); - - $member_srl = $oMemberModel->getMemberSrlByEmailAddress($args->email_address); - if($member_srl) return new Object(-1,'msg_exists_email_address'); - - $oDB = &DB::getInstance(); - $oDB->begin(); - - // DB에 입력 - $args->member_srl = getNextSequence(); - $args->list_order = -1 * $args->member_srl; - if($args->password && !$password_is_hashed) $args->password = md5($args->password); - elseif(!$args->password) unset($args->password); - - $output = executeQuery('member.insertMember', $args); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - // 입력된 그룹 값이 없으면 기본 그룹의 값을 등록 - if(!$args->group_srl_list) { - $default_group = $oMemberModel->getDefaultGroup(0); - - // 기본 그룹에 추가 - $output = $this->addMemberToGroup($args->member_srl,$default_group->group_srl); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - // 입력된 그룹 값이 있으면 해당 그룹의 값을 등록 - } else { - $group_srl_list = explode('|@|', $args->group_srl_list); - for($i=0;$iaddMemberToGroup($args->member_srl,$group_srl_list[$i]); - - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - } - } - - // 메일 인증 모드 사용시(가입된 회원이 denied일 때) 인증 메일 발송 - if ($args->denied == 'Y') { - // 인증 DB에 데이터를 넣음 - $auth_args->user_id = $args->user_id; - $auth_args->member_srl = $args->member_srl; - $auth_args->new_password = $args->password; - $auth_args->auth_key = md5(rand(0, 999999)); - $auth_args->is_register = 'Y'; - - $output = executeQuery('member.insertAuthMail', $auth_args); - if (!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - // 메일 내용을 구함 - Context::set('auth_args', $auth_args); - Context::set('member_info', $args); - - $member_config = $oModuleModel->getModuleConfig('member'); - if(!$member_config->skin) $member_config->skin = "default"; - if(!$member_config->colorset) $member_config->colorset = "white"; - - Context::set('member_config', $member_config); - - $tpl_path = sprintf('%sskins/%s', $this->module_path, $member_config->skin); - if(!is_dir($tpl_path)) $tpl_path = sprintf('%sskins/%s', $this->module_path, 'default'); - - $auth_url = getFullUrl('','module','member','act','procMemberAuthAccount','member_srl',$args->member_srl, 'auth_key',$auth_args->auth_key); - Context::set('auth_url', $auth_url); - - $oTemplate = &TemplateHandler::getInstance(); - $content = $oTemplate->compile($tpl_path, 'confirm_member_account_mail'); - - // 사이트 웹마스터 정보를 구함 - $oModuleModel = &getModel('module'); - $member_config = $oModuleModel->getModuleConfig('member'); - - // 메일 발송 - $oMail = new Mail(); - $oMail->setTitle( Context::getLang('msg_confirm_account_title') ); - $oMail->setContent($content); - $oMail->setSender( $member_config->webmaster_name?$member_config->webmaster_name:'webmaster', $member_config->webmaster_email); - $oMail->setReceiptor( $args->user_name, $args->email_address ); - $oMail->send(); - } - - // trigger 호출 (after) - if($output->toBool()) { - $trigger_output = ModuleHandler::triggerCall('member.insertMember', 'after', $args); - if(!$trigger_output->toBool()) { - $oDB->rollback(); - return $trigger_output; - } - } - - $oDB->commit(true); - - $output->add('member_srl', $args->member_srl); - return $output; - } - - /** - * @brief member 정보 수정 - **/ - function updateMember($args) { - // trigger 호출 (before) - $output = ModuleHandler::triggerCall('member.updateMember', 'before', $args); - if(!$output->toBool()) return $output; - - // 모델 객체 생성 - $oMemberModel = &getModel('member'); - - $logged_info = Context::get('logged_info'); - - // 수정하려는 대상의 원래 정보 가져오기 - $member_info = $oMemberModel->getMemberInfoByMemberSrl($args->member_srl); - if(!$args->user_id) $args->user_id = $member_info->user_id; - - // 필수 변수들의 조절 - if($args->allow_mailing!='Y') $args->allow_mailing = 'N'; - if($args->allow_message && !in_array($args->allow_message, array('Y','N','F'))) $args->allow_message = 'Y'; - - if($logged_info->is_admin == 'Y') { - if($args->denied!='Y') $args->denied = 'N'; - if($args->is_admin!='Y' && $logged_info->member_srl != $args->member_srl) $args->is_admin = 'N'; - } else { - unset($args->is_admin); - unset($args->denied); - } - - list($args->email_id, $args->email_host) = explode('@', $args->email_address); - - // 홈페이지, 블로그의 주소 검사 - if($args->homepage && !preg_match("/^[a-z]+:\/\//is",$args->homepage)) $args->homepage = 'http://'.$args->homepage; - if($args->blog && !preg_match("/^[a-z]+:\/\//is",$args->blog)) $args->blog = 'http://'.$args->blog; - - // 아이디, 닉네임, email address 의 중복 체크 - $member_srl = $oMemberModel->getMemberSrlByUserID($args->user_id); - if($member_srl&&$args->member_srl!=$member_srl) return new Object(-1,'msg_exists_user_id'); - - $member_srl = $oMemberModel->getMemberSrlByNickName($args->nick_name); - if($member_srl&&$args->member_srl!=$member_srl) return new Object(-1,'msg_exists_nick_name'); - - $member_srl = $oMemberModel->getMemberSrlByEmailAddress($args->email_address); - if($member_srl&&$args->member_srl!=$member_srl) return new Object(-1,'msg_exists_email_address'); - - $oDB = &DB::getInstance(); - $oDB->begin(); - - // DB에 update - if($args->password) $args->password = md5($args->password); - else $args->password = $member_info->password; - if(!$args->user_name) $args->user_name = $member_info->user_name; - - if(!$args->description) $args->description = ''; - $output = executeQuery('member.updateMember', $args); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - // 그룹 정보가 있으면 그룹 정보를 변경 - if($args->group_srl_list) { - $group_srl_list = explode('|@|', $args->group_srl_list); - $args->site_srl = 0; - - // 일단 해당 회원의 모든 그룹 정보를 삭제 - $output = executeQuery('member.deleteMemberGroupMember', $args); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - // 하나 하나 루프를 돌면서 입력 - for($i=0;$iaddMemberToGroup($args->member_srl,$group_srl_list[$i]); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - } - } - - // trigger 호출 (after) - if($output->toBool()) { - $trigger_output = ModuleHandler::triggerCall('member.updateMember', 'after', $args); - if(!$trigger_output->toBool()) { - $oDB->rollback(); - return $trigger_output; - } - } - - $oDB->commit(); - - // 세션에 저장 - $member_info = $oMemberModel->getMemberInfoByMemberSrl($args->member_srl); - - $logged_info = Context::get('logged_info'); - if($logged_info->member_srl == $member_srl) { - $_SESSION['logged_info'] = $member_info; - } - - $output->add('member_srl', $args->member_srl); - return $output; - } - - /** - * @brief member 비밀번호 수정 - **/ - function updateMemberPassword($args) { - $output = executeQuery('member.updateChangePasswordDate', $args); - $args->password = md5($args->password); - return executeQuery('member.updateMemberPassword', $args); - } - - /** - * @brief 사용자 삭제 - **/ - function deleteMember($member_srl) { - // trigger 호출 (before) - $trigger_obj->member_srl = $member_srl; - $output = ModuleHandler::triggerCall('member.deleteMember', 'before', $trigger_obj); - if(!$output->toBool()) return $output; - - // 모델 객체 생성 - $oMemberModel = &getModel('member'); - - // 해당 사용자의 정보를 가져옴 - $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); - if(!$member_info) return new Object(-1, 'msg_not_exists_member'); - - // 관리자의 경우 삭제 불가능 - if($member_info->is_admin == 'Y') return new Object(-1, 'msg_cannot_delete_admin'); - - $oDB = &DB::getInstance(); - $oDB->begin(); - - $args->member_srl = $member_srl; - // member_auth_mail에서 해당 항목들 삭제 - $output = executeQuery('member.deleteAuthMail', $args); - if (!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - // member_openid에서 해당 항목들 삭제 - $output = executeQuery('member.deleteMemberOpenIDByMemberSrl', $ags); - - // TODO: 테이블 업그레이드를 하지 않은 경우에 실패할 수 있다. - /* - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - */ - - // member_group_member에서 해당 항목들 삭제 - $output = executeQuery('member.deleteMemberGroupMember', $args); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - // member 테이블에서 삭제 - $output = executeQuery('member.deleteMember', $args); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - // trigger 호출 (after) - if($output->toBool()) { - $trigger_output = ModuleHandler::triggerCall('member.deleteMember', 'after', $trigger_obj); - if(!$trigger_output->toBool()) { - $oDB->rollback(); - return $trigger_output; - } - } - - $oDB->commit(); - - // 이름이미지, 이미지마크, 서명 삭제 - $this->procMemberDeleteImageName(); - $this->procMemberDeleteImageMark(); - $this->delSignature($member_srl); - - return $output; - } - - /** - * @brief 모든 세션 정보 파기 - **/ - function destroySessionInfo() { - if(!$_SESSION || !is_array($_SESSION)) return; - foreach($_SESSION as $key => $val) { - $_SESSION[$key] = ''; - } - session_destroy(); - setcookie(session_name(), '', time()-42000, '/'); - setcookie('sso','',time()-42000, '/'); - - if($_COOKIE['xeak']) { - $args->autologin_key = $_COOKIE['xeak']; - executeQuery('member.deleteAutologin', $args); - } - } - } -?> +doLogin($user_id, $password, $keep_signed=='Y'?true:false); + + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('member'); + if($config->after_login_url) $this->setRedirectUrl($config->after_login_url); + + // 설정된 change_password_date 확인 + $limit_date = $config->change_password_date; + + // change_password_date가 설정되어 있으면 확인 + if ($limit_date > 0) { + $oMemberModel = &getModel('member'); + $member_info = $oMemberModel->getMemberInfoByUserID($user_id); + if ($member_info->change_password_date < date ('YmdHis', strtotime ('-' . $limit_date . ' day'))) { + $this->setRedirectUrl(getNotEncodedUrl('','vid',Context::get('vid'),'mid',Context::get('mid'),'act','dispMemberModifyPassword')); + } + } + + $redirect_url = Context::get('redirect_url'); + if ($output->toBool () && Context::getRequestMethod () == "POST" && $redirect_url) { + header ("location:" . $redirect_url); + } + + return $output; + } + + /** + * @brief openid로그인 + **/ + function procMemberOpenIDLogin($validator = "procMemberOpenIDValidate") { + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('member'); + if($config->enable_openid != 'Y') $this->stop('msg_invalid_request'); + + if(!defined('Auth_OpenID_RAND_SOURCE') && !file_exists("/dev/urandom")) + { + define('Auth_OpenID_RAND_SOURCE', null); + } + + set_include_path(_XE_PATH_."modules/member/php-openid-1.2.3"); + require_once('Auth/OpenID.php'); + require_once('Auth/OpenID/Consumer.php'); + require_once('Auth/OpenID/XEStore.php'); + $store = new Auth_OpenID_XEStore(); + $consumer = new Auth_OpenID_Consumer($store); + + $user_id = Context::get('user_id'); + if (!$user_id) $user_id = Context::get('openid'); + $auth_request = $consumer->begin($user_id); + $auth_request->addExtensionArg('sreg', 'required', 'email'); + $auth_request->addExtensionArg('sreg', 'optional', 'dob'); + if(!$auth_request) + { + return new Object(-1, "association failed"); + } + + $trust_root = 'http://'.$_SERVER["HTTP_HOST"]; + $referer_url = Context::get('referer_url'); + if (!$referer_url) $referer_url = $_SERVER['HTTP_REFERER']; + if (!$referer_url) + $referer_url = htmlspecialchars_decode(getRequestUri(RELEASE_SSL)); + $goto = urlencode($referer_url); + $ApprovedURL = Context::getRequestUri(RELEASE_SSL) . "?module=member&act=" . $validator. "&goto=" . $goto; + $redirect_url = $auth_request->redirectURL($trust_root, $ApprovedURL); + $this->add("redirect_url", $redirect_url); + if (Context::getRequestMethod() == 'POST') + header("location:" . $redirect_url); + } + + function getLegacyUserIDsFromOpenID($openid_identity) { + // Issue 17515512: workaround + $result = array(); + $uri_matches = array(); + preg_match(Auth_OpenID_getURIPattern(), $openid_identity, $uri_matches); + + if (count($uri_matches) < 9) { + for ($i = count($uri_matches); $i <= 9; $i++) { + $uri_matches[] = ''; + } + } + + $scheme = $uri_matches[2]; + $authority = $uri_matches[4]; + $path = $uri_matches[5]; + $query = $uri_matches[6]; + $fragment = $uri_matches[8]; + + if ($scheme === null) $scheme = ''; + if ($authority === null) $authority = ''; + if ($path === null) $path = ''; + if ($query === null) $query = ''; + if ($fragment === null) $fragment = ''; + + if ($scheme == 'http' or $scheme == '') + $scheme_part = ''; + else + $scheme_part = $scheme."://"; + + + if ($path == '' || $path == '/') { + $result[] = $scheme_part.$authority.''.$query.$fragment; + $result[] = $scheme_part.$authority.'/'.$query.$fragment; + } + else { + $result[] = $scheme_part.$authority.$path.$query.$fragment; + } + + return $result; + } + + /** + * @brief openid 인증 체크 + **/ + function procMemberOpenIDValidate() { + set_include_path(_XE_PATH_."modules/member/php-openid-1.2.3"); + require_once('Auth/OpenID.php'); + require_once('Auth/OpenID/Consumer.php'); + require_once('Auth/OpenID/XEStore.php'); + require_once('Auth/OpenID/URINorm.php'); + + $store = new Auth_OpenID_XEStore(); + $consumer = new Auth_OpenID_Consumer($store); + $response = $consumer->complete($_GET); + switch($response->status) { + case Auth_OpenID_CANCEL : + // 사용자가 인증을 취소했을 때의 처리 + return $this->stop('authorization_canceled'); + case Auth_OpenID_FAILURE : + // 무언가의 문제로 인해 인증이 실패했을 때의 처리(인증을 요구한 openid가 없다든가..) + return $this->stop('invalid_authorization'); + case Auth_OpenID_SUCCESS : + // 인증성공!! + break; + default: + return $this->stop('invalid_authorization'); + } + + // 인증 성공 + $oMemberModel = &getModel('member'); + + // 이 오픈아이디와 연결된 (또는 연결되어 있을 가능성이 있는) 제로보드 아이디들을 받아온다. + $login_success = false; + $assoc_member_info = null; + $openid_identity = $response->signed_args["openid.identity"]; + $args->openid = $openid_identity; + $output = executeQuery('member.getMemberSrlByOpenID', $args); + + if ($output->toBool() && $output->data && !is_array($output->data)) { + $member_srl = $output->data->member_srl; + $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); + if ($member_info) { + $assoc_member_info = $member_info; + } + } + + $user_id_candidates = $this->getLegacyUserIDsFromOpenID($openid_identity); + $default_user_id = $user_id_candidates[0]; + + if ($assoc_member_info != null) { + $user_id_candidates = array_merge(array($assoc_member_info->user_id), $user_id_candidates); + } + $sreg = $response->extensionResponse('sreg'); + + foreach($user_id_candidates as $user_id) { + $args->user_id = $args->nick_name = $user_id; + // 기본 정보들을 받음 + $args->email_address = $sreg['email']; + $args->user_name = $sreg['fullname']; + if(!$args->user_name) list($args->user_name) = explode('@', $args->email_address); + $args->birthday = str_replace('-','',$sreg['dob']); + + // 자체 인증 시도 + $output = $this->doLogin($args->user_id); + + if ($output->toBool()) { + if ($assoc_member_info == null) { + $logged_info = Context::get('logged_info'); + $args->member_srl = $logged_info->member_srl; + $args->openid = $openid_identity; + executeQuery('member.addOpenIDToMember', $args); + } + $login_success = true; + break; + } + } + + // 자체 인증 실패시 회원 가입시킴 + if(!$login_success) { + $args->user_id = $args->nick_name = $default_user_id; + $args->password = md5(getmicrotime()); + + $output = $this->insertMember($args); + if(!$output->toBool()) return $this->stop($output->getMessage()); + $output = $this->doLogin($args->user_id); + if(!$output->toBool()) return $this->stop($output->getMessage()); + + $logged_info = Context::get('logged_info'); + $args->member_srl = $logged_info->member_srl; + $args->openid = $openid_identity; + executeQuery('member.addOpenIDToMember', $args); + } + + Context::close(); + + // 페이지 이동 + if(Context::get('goto')) { + $goto = Context::get('goto'); + header("location:" . $goto); + } else { + header("location:./"); + } + + exit(); + } + + /** + * @brief 오픈아이디 연결 요청 + **/ + function procMemberAddOpenIDToMember() { + return $this->procMemberOpenIDLogin("procMemberValidateAddOpenIDToMember"); + } + + /** + * @brief 오픈아이디 연결 요청 마무리 + **/ + function procMemberValidateAddOpenIDToMember() { + set_include_path(_XE_PATH_."modules/member/php-openid-1.2.3"); + require_once('Auth/OpenID.php'); + require_once('Auth/OpenID/Consumer.php'); + require_once('Auth/OpenID/XEStore.php'); + require_once('Auth/OpenID/URINorm.php'); + + $store = new Auth_OpenID_XEStore(); + $consumer = new Auth_OpenID_Consumer($store); + $response = $consumer->complete($_GET); + + switch($response->status) { + case Auth_OpenID_CANCEL : + // 사용자가 인증을 취소했을 때의 처리 + return $this->stop('authorization_canceled'); + case Auth_OpenID_FAILURE : + // 무언가의 문제로 인해 인증이 실패했을 때의 처리(인증을 요구한 openid가 없다든가..) + return $this->stop('invalid_authorization'); + case Auth_OpenID_SUCCESS : + { + $logged_info = Context::get('logged_info'); + if (!Context::get('is_logged')) return $this->stop('msg_not_logged'); + + $member_srl = $logged_info->member_srl; + + $args->member_srl = $member_srl; + $openid_identity = $response->signed_args["openid.identity"]; + $args->openid = $openid_identity; + + $output = executeQuery('member.addOpenIDToMember', $args); + if (!$output->toBool()) return $output; + + Context::close(); + + if(Context::get('goto')){ + $goto = Context::get('goto'); + header("location:" . $goto); + }else{ + header("location:./"); + } + exit(); + } + // 인증성공!! + break; + default: + return $this->stop('invalid_authorization'); + } + } + + /** + * @brief 오픈아이디 연결 해제 + **/ + function procMemberDeleteOpenIDFromMember() { + $logged_info = Context::get('logged_info'); + $openid_identity = Context::get('openid_to_delete'); + $arg->openid = $openid_identity; + $result = executeQuery('member.getMemberSrlByOpenID', $arg); + + if (!Context::get('is_logged')) { + $this->setError(-1); + $this->setMessage('msg_not_logged'); + return; + } else if (!$result->data || is_array($result->data)) { + $this->setError(-1); + $this->setMessage('msg_not_founded'); + return; + } else if ($result->data->member_srl != $logged_info->member_srl) { + $this->setError(-1); + $this->setMessage('msg_not_permitted'); + return; + } + + $arg->openid = $openid_identity; + + $output = executeQuery('member.deleteMemberOpenID', $arg); + if(!$output->toBool()) return $output; + + $this->setMessage('success_updated'); + } + + + /** + * @brief 로그아웃 + **/ + function procMemberLogout() { + // 로그아웃 이전에 trigger 호출 (before) + $logged_info = Context::get('logged_info'); + $trigger_output = ModuleHandler::triggerCall('member.doLogout', 'before', $logged_info); + if(!$trigger_output->toBool()) return $trigger_output; + + // 세션 정보 파기 + $this->destroySessionInfo(); + + // 로그아웃 이후 trigger 호출 (after) + $trigger_output = ModuleHandler::triggerCall('member.doLogout', 'after', $logged_info); + if(!$trigger_output->toBool()) return $trigger_output; + + $output = new Object(); + + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('member'); + if($config->after_logout_url) Context::set('redirect_url', $config->after_logout_url); + + return $output; + } + + /** + * @brief 스크랩 기능 + **/ + function procMemberScrapDocument() { + // 로그인 정보 체크 + if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); + $logged_info = Context::get('logged_info'); + + $document_srl = (int)Context::get('document_srl'); + if(!$document_srl) $document_srl = (int)Context::get('target_srl'); + if(!$document_srl) return new Object(-1,'msg_invalid_request'); + + // 문서 가져오기 + $oDocumentModel = &getModel('document'); + $oDocument = $oDocumentModel->getDocument($document_srl); + + // 변수 정리 + $args->document_srl = $document_srl; + $args->member_srl = $logged_info->member_srl; + $args->user_id = $oDocument->get('user_id'); + $args->user_name = $oDocument->get('user_name'); + $args->nick_name = $oDocument->get('nick_name'); + $args->target_member_srl = $oDocument->get('member_srl'); + $args->title = $oDocument->get('title'); + + // 있는지 조사 + $output = executeQuery('member.getScrapDocument', $args); + if($output->data->count) return new Object(-1, 'msg_alreay_scrapped'); + + // 입력 + $output = executeQuery('member.addScrapDocument', $args); + if(!$output->toBool()) return $output; + + $this->setError(-1); + $this->setMessage('success_registed'); + } + + /** + * @brief 스크랩 삭제 + **/ + function procMemberDeleteScrap() { + // 로그인 정보 체크 + if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); + $logged_info = Context::get('logged_info'); + + $document_srl = (int)Context::get('document_srl'); + if(!$document_srl) return new Object(-1,'msg_invalid_request'); + + // 변수 정리 + $args->member_srl = $logged_info->member_srl; + $args->document_srl = $document_srl; + return executeQuery('member.deleteScrapDocument', $args); + } + + /** + * @brief 게시글 저장 + **/ + function procMemberSaveDocument() { + // 로그인 정보 체크 + if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); + + $logged_info = Context::get('logged_info'); + + // form 정보를 모두 받음 + $obj = Context::getRequestVars(); + + // 글의 대상 모듈을 회원 정보로 변경 + $obj->module_srl = $logged_info->member_srl; + unset($obj->is_notice); + + // 제목을 사용하지 않는 방명록 등에서 내용 앞 부분을 제목 가져오기 + if(!$obj->title) { + $obj->title = cut_str(strip_tags($obj->content), 20, '...'); + } + + $oDocumentModel = &getModel('document'); + $oDocumentController = &getController('document'); + + // 이미 존재하는 글인지 체크 + $oDocument = $oDocumentModel->getDocument($obj->document_srl, $this->grant->manager); + + // 이미 존재하는 경우 수정 + if($oDocument->isExists() && $oDocument->document_srl == $obj->document_srl) { + $output = $oDocumentController->updateDocument($oDocument, $obj); + $msg_code = 'success_updated'; + + // 그렇지 않으면 신규 등록 + } else { + $output = $oDocumentController->insertDocument($obj); + $msg_code = 'success_registed'; + $obj->document_srl = $output->get('document_srl'); + $oDocument = $oDocumentModel->getDocument($obj->document_srl, $this->grant->manager); + } + + // 등록된 첨부파일의 상태를 무효로 지정 + if($oDocument->hasUploadedFiles()) { + $args->upload_target_srl = $oDocument->document_srl; + $args->isvalid = 'N'; + executeQuery('file.updateFileValid', $args); + } + + $this->setMessage('success_saved'); + $this->add('document_srl', $obj->document_srl); + } + + /** + * @brief 저장된 글 삭제 + **/ + function procMemberDeleteSavedDocument() { + // 로그인 정보 체크 + if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); + $logged_info = Context::get('logged_info'); + + $document_srl = (int)Context::get('document_srl'); + if(!$document_srl) return new Object(-1,'msg_invalid_request'); + + // 변수 정리 + $oDocumentController = &getController('document'); + $oDocumentController->deleteDocument($document_srl, true); + } + + /** + * @brief 회원 가입시 특정 항목들에 대한 값 체크 + **/ + function procMemberCheckValue() { + $name = Context::get('name'); + $value = Context::get('value'); + if(!$value) return; + + $oMemberModel = &getModel('member'); + + // 로그인 여부 체크 + $logged_info = Context::get('logged_info'); + + + switch($name) { + case 'user_id' : + // 금지 아이디 검사 + if($oMemberModel->isDeniedID($value)) return new Object(0,'denied_user_id'); + + // 중복 검사 + $member_srl = $oMemberModel->getMemberSrlByUserID($value); + if($member_srl && $logged_info->member_srl != $member_srl ) return new Object(0,'msg_exists_user_id'); + break; + case 'nick_name' : + // 중복 검사 + $member_srl = $oMemberModel->getMemberSrlByNickName($value); + if($member_srl && $logged_info->member_srl != $member_srl ) return new Object(0,'msg_exists_nick_name'); + + break; + case 'email_address' : + // 중복 검사 + $member_srl = $oMemberModel->getMemberSrlByEmailAddress($value); + if($member_srl && $logged_info->member_srl != $member_srl ) return new Object(0,'msg_exists_email_address'); + break; + } + } + + /** + * @brief 회원 가입 + **/ + function procMemberInsert() { + if (Context::getRequestMethod () == "GET") return new Object (-1, "msg_invalid_request"); + $oMemberModel = &getModel ('member'); + $config = $oMemberModel->getMemberConfig (); + + // before 트리거 호출 + $trigger_output = ModuleHandler::triggerCall ('member.procMemberInsert', 'before', $config); + if (!$trigger_output->toBool ()) return $trigger_output; + + // 관리자가 회원가입을 허락하였는지 검사 + if ($config->enable_join != 'Y') return $this->stop ('msg_signup_disabled'); + + // 약관에 동의하였는지 검사 (약관이 있을 경우만) + if ($config->agreement && Context::get('accept_agreement')!='Y') return $this->stop('msg_accept_agreement'); + + // 필수 정보들을 미리 추출 + $args = Context::gets('user_id','user_name','nick_name','homepage','blog','birthday','email_address','password','allow_mailing','find_account_question','find_account_answer'); + $args->member_srl = getNextSequence(); + $args->list_order = -1 * $args->member_srl; + + // 넘어온 모든 변수중에서 몇가지 불필요한 것들 삭제 + $all_args = Context::getRequestVars(); + unset($all_args->module); + unset($all_args->act); + unset($all_args->is_admin); + unset($all_args->description); + unset($all_args->group_srl_list); + unset($all_args->body); + unset($all_args->accept_agreement); + unset($all_args->signature); + unset($all_args->password2); + + // 메일 인증 기능 사용시 회원 상태를 denied로 설정 + if ($config->enable_confirm == 'Y') $args->denied = 'Y'; + + // 모든 request argument에서 필수 정보만 제외 한 후 추가 데이터로 입력 + $extra_vars = delObjectVars($all_args, $args); + $args->extra_vars = serialize($extra_vars); + + // member_srl의 값에 따라 insert/update + $output = $this->insertMember($args); + if(!$output->toBool()) return $output; + + // 가상사이트일 경우 사이트 가입 + $site_module_info = Context::get('site_module_info'); + if($site_module_info->site_srl > 0) { + $default_group = $oMemberModel->getDefaultGroup($site_module_info->site_srl); + if($default_group->group_srl) { + $this->addMemberToGroup($args->member_srl, $default_group->group_srl, $site_module_info->site_srl); + } + + } + + // 로그인 시킴 + if ($config->enable_confirm != 'Y') $this->doLogin($args->user_id); + + // 결과 정리 + $this->add('member_srl', $args->member_srl); + if($config->redirect_url) $this->add('redirect_url', $config->redirect_url); + if ($config->enable_confirm == 'Y') { + $msg = sprintf(Context::getLang('msg_confirm_mail_sent'), $args->email_address); + $this->setMessage($msg); + } + else $this->setMessage('success_registed'); + + // after 트리거 호출 + $trigger_output = ModuleHandler::triggerCall('member.procMemberInsert', 'after', $config); + if(!$trigger_output->toBool()) return $trigger_output; + } + + /** + * @brief 회원 정보 수정 + **/ + function procMemberModifyInfo() { + if(!Context::get('is_logged')) return $this->stop('msg_not_logged'); + + // 필수 정보들을 미리 추출 + $args = Context::gets('user_name','nick_name','homepage','blog','birthday','email_address','allow_mailing','find_account_question','find_account_answer'); + + // 로그인 정보 + $logged_info = Context::get('logged_info'); + $args->member_srl = $logged_info->member_srl; + + // 넘어온 모든 변수중에서 몇가지 불필요한 것들 삭제 + $all_args = Context::getRequestVars(); + unset($all_args->module); + unset($all_args->act); + unset($all_args->is_admin); + unset($all_args->description); + unset($all_args->group_srl_list); + unset($all_args->body); + unset($all_args->accept_agreement); + unset($all_args->signature); + unset($all_args->_filter); + + // 모든 request argument에서 필수 정보만 제외 한 후 추가 데이터로 입력 + $extra_vars = delObjectVars($all_args, $args); + $args->extra_vars = serialize($extra_vars); + + // 멤버 모델 객체 생성 + $oMemberModel = &getModel('member'); + + // member_srl의 값에 따라 insert/update + $output = $this->updateMember($args); + if(!$output->toBool()) return $output; + + // 서명 저장 + $signature = Context::get('signature'); + $this->putSignature($args->member_srl, $signature); + + // user_id 에 따른 정보 가져옴 + $member_info = $oMemberModel->getMemberInfoByMemberSrl($args->member_srl); + + // 로그인 성공후 trigger 호출 (after) + $trigger_output = ModuleHandler::triggerCall('member.doLogin', 'after', $member_info); + if(!$trigger_output->toBool()) return $trigger_output; + + $this->setSessionInfo($member_info); + + // 결과 리턴 + $this->add('member_srl', $args->member_srl); + $this->setMessage('success_updated'); + } + + /** + * @brief 회원 비밀번호 수정 + **/ + function procMemberModifyPassword() { + if(!Context::get('is_logged')) return $this->stop('msg_not_logged'); + + // 필수 정보들을 미리 추출 + $current_password = trim(Context::get('current_password')); + $password = trim(Context::get('password')); + + // 로그인한 유저의 정보를 가져옴 + $logged_info = Context::get('logged_info'); + $member_srl = $logged_info->member_srl; + + // member model 객체 생성 + $oMemberModel = &getModel('member'); + + // member_srl 에 따른 정보 가져옴 + $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); + + // 현재 비밀번호가 맞는지 확인 + if(!$oMemberModel->isValidPassword($member_info->password, $current_password)) return new Object(-1, 'invalid_password'); + + // 이전 비밀번호와 같은지 확인 + if ($current_password == $password) return new Object(-1, 'invalid_new_password'); + + // member_srl의 값에 따라 insert/update + $args->member_srl = $member_srl; + $args->password = $password; + $output = $this->updateMemberPassword($args); + if(!$output->toBool()) return $output; + + $this->add('member_srl', $args->member_srl); + $this->setMessage('success_updated'); + } + + /** + * @brief 탈퇴 + **/ + function procMemberLeave() { + if(!Context::get('is_logged')) return $this->stop('msg_not_logged'); + + // 필수 정보들을 미리 추출 + $password = trim(Context::get('password')); + + // 로그인한 유저의 정보를 가져옴 + $logged_info = Context::get('logged_info'); + $member_srl = $logged_info->member_srl; + + // member model 객체 생성 + $oMemberModel = &getModel('member'); + + // member_srl 에 따른 정보 가져옴 + $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); + + // 현재 비밀번호가 맞는지 확인 + if(!$oMemberModel->isValidPassword($member_info->password, $password)) return new Object(-1, 'invalid_password'); + + $output = $this->deleteMember($member_srl); + if(!$output->toBool()) return $output; + + // 모든 세션 정보 파기 + $this->destroySessionInfo(); + + // 성공 메세지 리턴 + $this->setMessage('success_leaved'); + } + + /** + * @brief 오픈아이디 탈퇴 + **/ + function procMemberOpenIDLeave() { + // 비로그인 상태이면 에러 + if(!Context::get('is_logged')) return $this->stop('msg_not_logged'); + + // 현재 ip와 세션 아이피 비교 + if($_SESSION['ipaddress']!=$_SERVER['REMOTE_ADDR']) return $this->stop('msg_not_permitted'); + + // 로그인한 유저의 정보를 가져옴 + $logged_info = Context::get('logged_info'); + $member_srl = $logged_info->member_srl; + + $output = $this->deleteMember($member_srl); + if(!$output->toBool()) return $output; + + // 모든 세션 정보 파기 + $this->destroySessionInfo(); + + // 성공 메세지 리턴 + $this->setMessage('success_leaved'); + } + + /** + * @brief 프로필 이미지 추가 + **/ + function procMemberInsertProfileImage() { + // 정상적으로 업로드 된 파일인지 검사 + $file = $_FILES['profile_image']; + if(!is_uploaded_file($file['tmp_name'])) return $this->stop('msg_not_uploaded_profile_image'); + + // 회원 정보를 검사해서 회원번호가 없거나 관리자가 아니고 회원번호가 틀리면 무시 + $member_srl = Context::get('member_srl'); + if(!$member_srl) return $this->stop('msg_not_uploaded_profile_image'); + + $logged_info = Context::get('logged_info'); + if($logged_info->is_admin != 'Y' && $logged_info->member_srl != $member_srl) return $this->stop('msg_not_uploaded_profile_image'); + + // 회원 모듈 설정에서 이미지 이름 사용 금지를 하였을 경우 관리자가 아니면 return; + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('member'); + if($logged_info->is_admin != 'Y' && $config->profile_image != 'Y') return $this->stop('msg_not_uploaded_profile_image'); + + $this->insertProfileImage($member_srl, $file['tmp_name']); + + // 페이지 리프레쉬 + $this->setRefreshPage(); + } + + function insertProfileImage($member_srl, $target_file) { + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('member'); + + // 정해진 사이즈를 구함 + $max_width = $config->profile_image_max_width; + if(!$max_width) $max_width = "90"; + $max_height = $config->profile_image_max_height; + if(!$max_height) $max_height = "20"; + + // 저장할 위치 구함 + $target_path = sprintf('files/member_extra_info/profile_image/%s', getNumberingPath($member_srl)); + FileHandler::makeDir($target_path); + + // 파일 정보 구함 + list($width, $height, $type, $attrs) = @getimagesize($target_file); + if($type == 3) $ext = 'png'; + elseif($type == 2) $ext = 'jpg'; + else $ext = 'gif'; + + $target_filename = sprintf('%s%d.%s', $target_path, $member_srl, $ext); + + // 지정된 사이즈보다 크거나 gif가 아니면 변환 + if($width > $max_width || $height > $max_height || $type!=1) FileHandler::createImageFile($target_file, $target_filename, $max_width, $max_height, $ext); + else @copy($target_file, $target_filename); + } + + /** + * @brief 이미지 이름을 추가 + **/ + function procMemberInsertImageName() { + // 정상적으로 업로드 된 파일인지 검사 + $file = $_FILES['image_name']; + if(!is_uploaded_file($file['tmp_name'])) return $this->stop('msg_not_uploaded_image_name'); + + // 회원 정보를 검사해서 회원번호가 없거나 관리자가 아니고 회원번호가 틀리면 무시 + $member_srl = Context::get('member_srl'); + if(!$member_srl) return $this->stop('msg_not_uploaded_image_name'); + + $logged_info = Context::get('logged_info'); + if($logged_info->is_admin != 'Y' && $logged_info->member_srl != $member_srl) return $this->stop('msg_not_uploaded_image_name'); + + // 회원 모듈 설정에서 이미지 이름 사용 금지를 하였을 경우 관리자가 아니면 return; + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('member'); + if($logged_info->is_admin != 'Y' && $config->image_name != 'Y') return $this->stop('msg_not_uploaded_image_name'); + + $this->insertImageName($member_srl, $file['tmp_name']); + + // 페이지 리프레쉬 + $this->setRefreshPage(); + } + + function insertImageName($member_srl, $target_file) { + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('member'); + + // 정해진 사이즈를 구함 + $max_width = $config->image_name_max_width; + if(!$max_width) $max_width = "90"; + $max_height = $config->image_name_max_height; + if(!$max_height) $max_height = "20"; + + // 저장할 위치 구함 + $target_path = sprintf('files/member_extra_info/image_name/%s/', getNumberingPath($member_srl)); + FileHandler::makeDir($target_path); + + $target_filename = sprintf('%s%d.gif', $target_path, $member_srl); + + // 파일 정보 구함 + list($width, $height, $type, $attrs) = @getimagesize($target_file); + + // 지정된 사이즈보다 크거나 gif가 아니면 변환 + if($width > $max_width || $height > $max_height || $type!=1) FileHandler::createImageFile($target_file, $target_filename, $max_width, $max_height, 'gif'); + else @copy($target_file, $target_filename); + } + + /** + * @brief 프로필 이미지를 삭제 + **/ + function procMemberDeleteProfileImage() { + $member_srl = Context::get('member_srl'); + if(!$member_srl) return new Object(0,'success'); + + $logged_info = Context::get('logged_info'); + + if($logged_info->is_admin != 'Y') { + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('member'); + if($config->profile_image == 'N') return new Object(0,'success'); + } + + if($logged_info->is_admin == 'Y' || $logged_info->member_srl == $member_srl) { + $oMemberModel = &getModel('member'); + $profile_image = $oMemberModel->getProfileImage($member_srl); + FileHandler::removeFile($profile_image->file); + } + return new Object(0,'success'); + } + + /** + * @brief 이미지 이름을 삭제 + **/ + function procMemberDeleteImageName() { + $member_srl = Context::get('member_srl'); + if(!$member_srl) return new Object(0,'success'); + + $logged_info = Context::get('logged_info'); + + if($logged_info->is_admin != 'Y') { + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('member'); + if($config->image_name == 'N') return new Object(0,'success'); + } + + if($logged_info->is_admin == 'Y' || $logged_info->member_srl == $member_srl) { + $oMemberModel = &getModel('member'); + $image_name = $oMemberModel->getImageName($member_srl); + FileHandler::removeFile($image_name->file); + } + return new Object(0,'success'); + } + + /** + * @brief 이미지 마크를 추가 + **/ + function procMemberInsertImageMark() { + // 정상적으로 업로드 된 파일인지 검사 + $file = $_FILES['image_mark']; + if(!is_uploaded_file($file['tmp_name'])) return $this->stop('msg_not_uploaded_image_mark'); + + // 회원 정보를 검사해서 회원번호가 없거나 관리자가 아니고 회원번호가 틀리면 무시 + $member_srl = Context::get('member_srl'); + if(!$member_srl) return $this->stop('msg_not_uploaded_image_mark'); + + $logged_info = Context::get('logged_info'); + if($logged_info->is_admin != 'Y' && $logged_info->member_srl != $member_srl) return $this->stop('msg_not_uploaded_image_mark'); + + // 회원 모듈 설정에서 이미지 마크 사용 금지를 하였을 경우 관리자가 아니면 return; + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('member'); + if($logged_info->is_admin != 'Y' && $config->image_mark != 'Y') return $this->stop('msg_not_uploaded_image_mark'); + + $this->insertImageMark($member_srl, $file['tmp_name']); + + // 페이지 리프레쉬 + $this->setRefreshPage(); + } + + function insertImageMark($member_srl, $target_file) { + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('member'); + + // 정해진 사이즈를 구함 + $max_width = $config->image_mark_max_width; + if(!$max_width) $max_width = "20"; + $max_height = $config->image_mark_max_height; + if(!$max_height) $max_height = "20"; + + $target_path = sprintf('files/member_extra_info/image_mark/%s/', getNumberingPath($member_srl)); + FileHandler::makeDir($target_path); + + $target_filename = sprintf('%s%d.gif', $target_path, $member_srl); + + // 파일 정보 구함 + list($width, $height, $type, $attrs) = @getimagesize($target_file); + + if($width > $max_width || $height > $max_height || $type!=1) FileHandler::createImageFile($target_file, $target_filename, $max_width, $max_height, 'gif'); + else @copy($target_file, $target_filename); + + } + + /** + * @brief 이미지 마크를 삭제 + **/ + function procMemberDeleteImageMark() { + $member_srl = Context::get('member_srl'); + if(!$member_srl) return new Object(0,'success'); + + $logged_info = Context::get('logged_info'); + if($logged_info->is_admin == 'Y' || $logged_info->member_srl == $member_srl) { + $oMemberModel = &getModel('member'); + $image_mark = $oMemberModel->getImageMark($member_srl); + FileHandler::removeFile($image_mark->file); + } + return new Object(0,'success'); + } + + /** + * @brief 아이디/ 비밀번호 찾기 + **/ + function procMemberFindAccount() { + $email_address = Context::get('email_address'); + if(!$email_address) return new Object(-1, 'msg_invalid_request'); + + $oMemberModel = &getModel('member'); + $oModuleModel = &getModel('module'); + + // 메일 주소에 해당하는 회원이 있는지 검사 + $member_srl = $oMemberModel->getMemberSrlByEmailAddress($email_address); + if(!$member_srl) return new Object(-1, 'msg_email_not_exists'); + + // 회원의 정보를 가져옴 + $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); + + // 아이디/비밀번호 찾기가 가능한 상태의 회원인지 검사 + if ($member_info->denied == 'Y') { + $chk_args->member_srl = $member_info->member_srl; + $output = executeQuery('member.chkAuthMail', $chk_args); + if ($output->toBool() && $output->data->count != '0') return new Object(-1, 'msg_user_not_confirmed'); + } + + // 인증 DB에 데이터를 넣음 + $args->user_id = $member_info->user_id; + $args->member_srl = $member_info->member_srl; + $args->new_password = rand(111111,999999); + $args->auth_key = md5( rand(0,999999 ) ); + $args->is_register = 'N'; + + $output = executeQuery('member.insertAuthMail', $args); + if(!$output->toBool()) return $output; + + // 메일 내용을 구함 + Context::set('auth_args', $args); + Context::set('member_info', $member_info); + + $member_config = $oModuleModel->getModuleConfig('member'); + if(!$member_config->skin) $member_config->skin = "default"; + if(!$member_config->colorset) $member_config->colorset = "white"; + + Context::set('member_config', $member_config); + + $tpl_path = sprintf('%sskins/%s', $this->module_path, $member_config->skin); + if(!is_dir($tpl_path)) $tpl_path = sprintf('%sskins/%s', $this->module_path, 'default'); + + $find_url = getFullUrl ('', 'module', 'member', 'act', 'procMemberAuthAccount', 'member_srl', $member_info->member_srl, 'auth_key', $args->auth_key); + Context::set('find_url', $find_url); + + $oTemplate = &TemplateHandler::getInstance(); + $content = $oTemplate->compile($tpl_path, 'find_member_account_mail'); + + // 사이트 웹마스터 정보를 구함 + $oModuleModel = &getModel('module'); + $member_config = $oModuleModel->getModuleConfig('member'); + + // 메일 발송 + $oMail = new Mail(); + $oMail->setTitle( Context::getLang('msg_find_account_title') ); + $oMail->setContent($content); + $oMail->setSender( $member_config->webmaster_name?$member_config->webmaster_name:'webmaster', $member_config->webmaster_email); + $oMail->setReceiptor( $member_info->user_name, $member_info->email_address ); + $oMail->send(); + + // 메세지 return + $msg = sprintf(Context::getLang('msg_auth_mail_sent'), $member_info->email_address); + return new Object(0,$msg); + } + + + /** + * @brief 질문/답변을 통한 임시 비밀번호 생성 + **/ + function procMemberFindAccountByQuestion() { + $email_address = Context::get('email_address'); + $user_id = Context::get('user_id'); + $find_account_question = trim(Context::get('find_account_question')); + $find_account_answer = trim(Context::get('find_account_answer')); + + if(!$user_id || !$email_address || !$find_account_question || !$find_account_answer) return new Object(-1, 'msg_invalid_request'); + + $oMemberModel = &getModel('member'); + $oModuleModel = &getModel('module'); + + // 메일 주소에 해당하는 회원이 있는지 검사 + $member_srl = $oMemberModel->getMemberSrlByEmailAddress($email_address); + if(!$member_srl) return new Object(-1, 'msg_email_not_exists'); + + // 회원의 정보를 가져옴 + $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); + + // 질문 응답이 없으면 + if (!$member_info->find_account_question || !$member_info->find_account_answer) return new Object(-1, 'msg_question_not_exists'); + + if(trim($member_info->find_account_question) != $find_account_question || trim($member_info->find_account_answer) != $find_account_answer) return new Object(-1, 'msg_answer_not_matches'); + + // 임시비밀번호로 변경 및 비밀번호 변경시간을 1로 설정 + $args->member_srl = $member_srl; + list($usec, $sec) = explode(" ", microtime()); + $temp_password = substr(md5($user_id . $member_info->find_account_answer. $usec . $sec),0,15); + + $args->password = $temp_password; + $args->change_password_date = '1'; + $output = $this->updateMemberPassword($args); + if(!$output->toBool()) return $output; + + $_SESSION['xe_temp_password_'.$user_id] = $temp_password; + + $this->add('user_id',$user_id); + } + + /** + * @brief 아이디/비밀번호 찾기 기능 실행 + * 메일에 등록된 링크를 선택시 호출되는 method로 비밀번호를 바꾸고 인증을 시켜버림 + **/ + function procMemberAuthAccount() { + // user_id, authkey 검사 + $member_srl = Context::get('member_srl'); + $auth_key = Context::get('auth_key'); + if(!$member_srl || !$auth_key) return $this->stop('msg_invalid_request'); + + // user_id, authkey로 비밀번호 찾기 로그 검사 + $args->member_srl = $member_srl; + $args->auth_key = $auth_key; + $output = executeQuery('member.getAuthMail', $args); + if(!$output->toBool() || $output->data->auth_key != $auth_key) return $this->stop('msg_invalid_auth_key'); + + // 인증 정보가 맞다면 새비밀번호로 비밀번호를 바꿈 + if ($output->data->is_register == 'Y') { + $args->password = $output->data->new_password; + $args->denied = 'N'; + } else { + $args->password = md5($output->data->new_password); + unset($args->denied); + } + + // $output->data->is_register 값을 백업해 둔다. + $is_register = $output->data->is_register; + + $output = executeQuery('member.updateMemberPassword', $args); + if(!$output->toBool()) return $this->stop($output->getMessage()); + + // 인증 테이블에서 member_srl에 해당하는 모든 값을 지움 + executeQuery('member.deleteAuthMail',$args); + + // 결과를 통보 + Context::set('is_register', $is_register); + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('msg_success_authed'); + } + + /** + * @brief 아이디/비밀번호 찾기 기능 실행 + * 메일에 등록된 링크를 선택시 호출되는 method로 비밀번호를 바꾸고 인증을 시켜버림 + **/ + function procMemberUpdateAuthMail() { + $member_srl = Context::get('member_srl'); + if(!$member_srl) return new Object(-1, 'msg_invalid_request'); + + $oMemberModel = &getModel('member'); + + // 회원의 정보를 가져옴 + $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); + + // 인증메일 재발송 요청이 가능한 상태의 회원인지 검사 + if ($member_info->denied != 'Y') + return new Object(-1, 'msg_invalid_request'); + + $chk_args->member_srl = $member_srl; + $output = executeQuery('member.chkAuthMail', $chk_args); + if ($output->toBool() && $output->data->count == '0') return new Object(-1, 'msg_invalid_request'); + + // 인증 DB에 데이터를 넣음 + $auth_args->member_srl = $member_srl; + $auth_args->auth_key = md5(rand(0, 999999)); + + $output = executeQuery('member.updateAuthMail', $auth_args); + if (!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // 메일 내용을 구함 + Context::set('auth_args', $auth_args); + Context::set('member_info', $member_info); + + $oModuleModel = &getModel('module'); + $member_config = $oModuleModel->getModuleConfig('member'); + if(!$member_config->skin) $member_config->skin = "default"; + if(!$member_config->colorset) $member_config->colorset = "white"; + + Context::set('member_config', $member_config); + + $tpl_path = sprintf('%sskins/%s', $this->module_path, $member_config->skin); + if(!is_dir($tpl_path)) $tpl_path = sprintf('%sskins/%s', $this->module_path, 'default'); + + $auth_url = getFullUrl('','module','member','act','procMemberAuthAccount','member_srl',$member_info->member_srl, 'auth_key',$auth_args->auth_key); + Context::set('auth_url', $auth_url); + + $oTemplate = &TemplateHandler::getInstance(); + $content = $oTemplate->compile($tpl_path, 'confirm_member_account_mail'); + + // 사이트 웹마스터 정보를 구함 + $oModuleModel = &getModel('module'); + $member_config = $oModuleModel->getModuleConfig('member'); + + // 메일 발송 + $oMail = new Mail(); + $oMail->setTitle( Context::getLang('msg_confirm_account_title') ); + $oMail->setContent($content); + $oMail->setSender( $member_config->webmaster_name?$member_config->webmaster_name:'webmaster', $member_config->webmaster_email); + $oMail->setReceiptor( $member_info->user_name, $member_info->email_address ); + $oMail->send(); + + // 메세지 return + $msg = sprintf(Context::getLang('msg_auth_mail_sent'), $member_info->email_address); + return new Object(-1, $msg); + } + + /** + * @brief 인증 메일 재발송 + **/ + function procMemberResendAuthMail() { + // email_address 검사 + $email_address = Context::get('email_address'); + if(!$email_address) return $this->stop('msg_invalid_request'); + + // email_address로 비밀번호 찾기 로그 검사 + $oMemberModel = &getModel('member'); + + $args->email_address = $email_address; + $member_info = $oMemberModel->getMemberSrlByEmailAddress($email_address); + if(!$member_info) return $this->stop('msg_not_exists_member'); + + $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_info); + + // 이전에 인증 메일을 보냈는지 확인 + $chk_args->member_srl = $member_info->member_srl; + $output = executeQuery('member.chkAuthMail', $chk_args); + if($output->toBool() && $output->data->count == '0') return new Object(-1, 'msg_invalid_request'); + + $auth_args->member_srl = $member_info->member_srl; + $output = executeQueryArray('member.getAuthMailInfo', $auth_args); + if(!$output->data || !$output->data[0]->auth_key) return new Object(-1, 'msg_invalid_request'); + $auth_info = $output->data[0]; + + // 메일 내용을 구함 + Context::set('member_info', $member_info); + $oModuleModel = &getModel('module'); + $member_config = $oModuleModel->getModuleConfig('member'); + if(!$member_config->skin) $member_config->skin = "default"; + if(!$member_config->colorset) $member_config->colorset = "white"; + + Context::set('member_config', $member_config); + + $tpl_path = sprintf('%sskins/%s', $this->module_path, $member_config->skin); + if(!is_dir($tpl_path)) $tpl_path = sprintf('%sskins/%s', $this->module_path, 'default'); + + $auth_url = getFullUrl('','module','member','act','procMemberAuthAccount','member_srl',$member_info->member_srl, 'auth_key',$auth_info->auth_key); + Context::set('auth_url', $auth_url); + + $oTemplate = &TemplateHandler::getInstance(); + $content = $oTemplate->compile($tpl_path, 'confirm_member_account_mail'); + + // 사이트 웹마스터 정보를 구함 + $oModuleModel = &getModel('module'); + $member_config = $oModuleModel->getModuleConfig('member'); + + // 메일 발송 + $oMail = new Mail(); + $oMail->setTitle( Context::getLang('msg_confirm_account_title') ); + $oMail->setContent($content); + $oMail->setSender( $member_config->webmaster_name?$member_config->webmaster_name:'webmaster', $member_config->webmaster_email); + $oMail->setReceiptor( $args->user_name, $args->email_address ); + $oMail->send(); + + $msg = sprintf(Context::getLang('msg_confirm_mail_sent'), $args->email_address); + $this->setMessage($msg); + } + + /** + * @brief 가상 사이트 가입 + **/ + function procModuleSiteSignUp() { + $site_module_info = Context::get('site_module_info'); + $logged_info = Context::get('logged_info'); + if(!$site_module_info->site_srl || !Context::get('is_logged') || count($logged_info->group_srl_list) ) return new Object(-1,'msg_invalid_request'); + + $oMemberModel = &getModel('member'); + $default_group = $oMemberModel->getDefaultGroup($site_module_info->site_srl); + $this->addMemberToGroup($logged_info->member_srl, $default_group->group_srl, $site_module_info->site_srl); + $groups[$default_group->group_srl] = $default_group->title; + $logged_info->group_list = $groups; + } + + /** + * @brief 가상 사이트 탈퇴 + **/ + function procModuleSiteLeave() { + $site_module_info = Context::get('site_module_info'); + $logged_info = Context::get('logged_info'); + if(!$site_module_info->site_srl || !Context::get('is_logged') || count($logged_info->group_srl_list) ) return new Object(-1,'msg_invalid_request'); + + $args->site_srl= $site_module_info->site_srl; + $args->member_srl = $logged_info->member_srl; + $output = executeQuery('member.deleteMembersGroup', $args); + if(!$output->toBool()) return $output; + $this->setMessage('success_deleted'); + } + + /** + * @brief 회원 설정 정보를 저장 + **/ + function setMemberConfig($args) { + if(!$args->skin) $args->skin = "default"; + if(!$args->colorset) $args->colorset = "white"; + if(!$args->editor_skin) $args->editor_skin= "xpresseditor"; + if(!$args->editor_colorset) $args->editor_colorset = "white"; + if($args->enable_join!='Y') $args->enable_join = 'N'; + if($args->enable_openid!='Y') $args->enable_openid= 'N'; + if($args->profile_image !='Y') $args->profile_image = 'N'; + if($args->image_name!='Y') $args->image_name = 'N'; + if($args->image_mark!='Y') $args->image_mark = 'N'; + if($args->group_image_mark!='Y') $args->group_image_mark = 'N'; + if(!trim(strip_tags($args->agreement))) $args->agreement = null; + $args->limit_day = (int)$args->limit_day; + + $agreement = trim($args->agreement); + unset($args->agreement); + + $oModuleController = &getController('module'); + $output = $oModuleController->insertModuleConfig('member',$args); + if(!$output->toBool()) return $output; + + $agreement_file = _XE_PATH_.'files/member_extra_info/agreement.txt'; + FileHandler::writeFile($agreement_file, $agreement); + + return new Object(); + } + + /** + * @brief 서명을 파일로 저장 + **/ + function putSignature($member_srl, $signature) { + $signature = trim(removeHackTag($signature)); + $signature = preg_replace('/<(\/?)(embed|object|param)/is', '<$1$2', $signature); + + $check_signature = trim(str_replace(array(' ',"\n","\r"),'',strip_tags($signature,''))); + $path = sprintf('files/member_extra_info/signature/%s/', getNumberingPath($member_srl)); + $filename = sprintf('%s%d.signature.php', $path, $member_srl); + + if(!$check_signature) return FileHandler::removeFile($filename); + + $buff = sprintf('%s', $signature); + FileHandler::makeDir($path); + FileHandler::writeFile($filename, $buff); + } + + /** + * @brief 서명 파일 삭제 + **/ + function delSignature($member_srl) { + $filename = sprintf('files/member_extra_info/signature/%s%d.gif', getNumberingPath($member_srl), $member_srl); + FileHandler::removeFile($filename); + } + + /** + * @brief member_srl에 group_srl을 추가 + **/ + function addMemberToGroup($member_srl,$group_srl,$site_srl=0) { + $args->member_srl = $member_srl; + $args->group_srl = $group_srl; + if($site_srl) $args->site_srl = $site_srl; + + $oModel =& getModel('member'); + $groups = $oModel->getMemberGroups($member_srl, $site_srl, true); + if($groups[$group_srl]) return new Object(); + + // 추가 + $output = executeQuery('member.addMemberToGroup',$args); + $output2 = ModuleHandler::triggerCall('member.addMemberToGroup', 'after', $args); + + return $output; + } + + /** + * @brief 특정 회원들의 그룹을 일괄 변경 + * 가상 사이트와 같이 한 회원이 하나의 그룹만 가질 경우 사용할 수 있음 + **/ + function replaceMemberGroup($args) { + $obj->site_srl = $args->site_srl; + $obj->member_srl = implode(',',$args->member_srl); + + $output = executeQueryArray('member.getMembersGroup', $obj); + if($output->data) foreach($output->data as $key => $val) $date[$val->member_srl] = $val->regdate; + + $output = executeQuery('member.deleteMembersGroup', $obj); + if(!$output->toBool()) return $output; + + $inserted_members = array(); + foreach($args->member_srl as $key => $val) { + if($inserted_members[$val]) continue; + $inserted_members[$val] = true; + + unset($obj); + $obj->member_srl = $val; + $obj->group_srl = $args->group_srl; + $obj->site_srl = $args->site_srl; + $obj->regdate = $date[$obj->member_srl]; + $output = executeQuery('member.addMemberToGroup', $obj); + if(!$output->toBool()) return $output; + } + return new Object(); + } + + + /** + * @brief 자동 로그인 시킴 + **/ + function doAutologin() { + // 자동 로그인 키 값을 구함 + $args->autologin_key = $_COOKIE['xeak']; + + // 키값에 해당하는 정보 구함 + $output = executeQuery('member.getAutologin', $args); + + // 정보가 없으면 쿠키 삭제 + if(!$output->toBool() || !$output->data) { + setCookie('xeak',null,time()+60*60*24*365, '/'); + return; + } + + $user_id = $output->data->user_id; + $password = $output->data->password; + if(!$user_id || !$password) { + setCookie('xeak',null,time()+60*60*24*365, '/'); + return; + } + + $do_auto_login = false; + + // 정보를 바탕으로 키값 비교 + $key = md5($user_id.$password.$_SERVER['REMOTE_ADDR']); + + if($key == $args->autologin_key) { + + // 설정된 change_password_date 확인 + $oModuleModel = &getModel('module'); + $member_config = $oModuleModel->getModuleConfig('member'); + $limit_date = $member_config->change_password_date; + + // change_password_date가 설정되어 있으면 확인 + if($limit_date > 0) { + $oMemberModel = &getModel('member'); + $member_info = $oMemberModel->getMemberInfoByUserID($user_id); + + if($member_info->change_password_date >= date('YmdHis', strtotime('-'.$limit_date.' day')) ){ + $do_auto_login = true; + } + + } else { + $do_auto_login = true; + } + } + + + if($do_auto_login) { + $output = $this->doLogin($user_id); + } else { + executeQuery('member.deleteAutologin', $args); + setCookie('xeak',null,time()+60*60*24*365, '/'); + } + } + + /** + * @brief 로그인 시킴 + **/ + function doLogin($user_id, $password = '', $keep_signed = false) { + $user_id = strtolower($user_id); + + // 로그인 이전에 trigger 호출 (before) + $trigger_obj->user_id = $user_id; + $trigger_obj->password = $password; + $trigger_output = ModuleHandler::triggerCall('member.doLogin', 'before', $trigger_obj); + if(!$trigger_output->toBool()) return $trigger_output; + + // member model 객체 생성 + $oMemberModel = &getModel('member'); + + // user_id 에 따른 정보 가져옴 + $member_info = $oMemberModel->getMemberInfoByUserID($user_id); + + // return 값이 없으면 존재하지 않는 사용자로 지정 + if(!$user_id || strtolower($member_info->user_id) != strtolower($user_id)) return new Object(-1, 'invalid_user_id'); + + // 비밀번호 검사 + if($password && !$oMemberModel->isValidPassword($member_info->password, $password)) return new Object(-1, 'invalid_password'); + + // denied == 'Y' 이면 알림 + if($member_info->denied == 'Y') { + $args->member_srl = $member_info->member_srl; + $output = executeQuery('member.chkAuthMail', $args); + if ($output->toBool() && $output->data->count != '0') return new Object(-1,'msg_user_not_confirmed'); + return new Object(-1,'msg_user_denied'); + } + + // denied_date가 현 시간보다 적으면 알림 + if($member_info->limit_date && substr($member_info->limit_date,0,8) >= date("Ymd")) return new Object(-1,sprintf(Context::getLang('msg_user_limited'),zdate($member_info->limit_date,"Y-m-d"))); + + // 사용자 정보의 최근 로그인 시간을 기록 + $args->member_srl = $member_info->member_srl; + $output = executeQuery('member.updateLastLogin', $args); + + // 로그인 성공후 trigger 호출 (after) + $trigger_output = ModuleHandler::triggerCall('member.doLogin', 'after', $member_info); + if(!$trigger_output->toBool()) return $trigger_output; + + // 자동 로그인 사용시 정보 처리 + if($keep_signed) { + // 자동 로그인 키 생성 + $autologin_args->autologin_key = md5(strtolower($user_id).$member_info->password.$_SERVER['REMOTE_ADDR']); + $autologin_args->member_srl = $member_info->member_srl; + executeQuery('member.deleteAutologin', $autologin_args); + $autologin_output = executeQuery('member.insertAutologin', $autologin_args); + if($autologin_output->toBool()) setCookie('xeak',$autologin_args->autologin_key, time()+60*60*24*365, '/'); + } + + $this->setSessionInfo($member_info); + + return $output; + } + + /** + * @brief 세션 정보 갱싱 또는 생성 + **/ + function setSessionInfo($member_info = null) { + $oMemberModel = &getModel('member'); + + // 사용자 정보가 넘어오지 않았다면 현재 세션 정보에서 사용자 정보를 추출 + if(!$member_info && $_SESSION['member_srl'] && $oMemberModel->isLogged() ) { + $member_info = $oMemberModel->getMemberInfoByMemberSrl($_SESSION['member_srl']); + + // 회원정보가 없다면 세션 파기 + if($member_info->member_srl != $_SESSION['member_srl']) { + $this->destroySessionInfo(); + return; + } + } + + // 사용중지 아이디이면 세션 파기 + if($member_info->denied=='Y') { + $this->destroySessionInfo(); + return; + } + + // 오픈아이디인지 체크 (일단 아이디 형식으로만 결정) + if(preg_match("/^([_0-9a-zA-Z]+)$/is", $member_info->user_id)) $member_info->is_openid = false; + else $member_info->is_openid = true; + + // 로그인 처리를 위한 세션 설정 + $_SESSION['is_logged'] = true; + $_SESSION['ipaddress'] = $_SERVER['REMOTE_ADDR']; + $_SESSION['member_srl'] = $member_info->member_srl; + $_SESSION['is_admin'] = ''; + + // 비밀번호는 세션에 저장되지 않도록 지워줌;; + //unset($member_info->password); + + // 사용자 그룹 설정 + /* + if($member_info->group_list) { + $group_srl_list = array_keys($member_info->group_list); + $_SESSION['group_srls'] = $group_srl_list; + + // 관리자 그룹일 경우 관리자로 지정 + $oMemberModel = &getModel('member'); + $admin_group = $oMemberModel->getAdminGroup(); + if($admin_group->group_srl && in_array($admin_group->group_srl, $group_srl_list)) $_SESSION['is_admin'] = 'Y'; + } + */ + + // 세션에 로그인 사용자 정보 저장 + $_SESSION['logged_info'] = $member_info; + Context::set('is_logged', true); + Context::set('logged_info', $member_info); + + // 사용자의 전용 메뉴 구성 (이 메뉴는 애드온등으로 변경될 수 있음) + $this->addMemberMenu( 'dispMemberInfo', 'cmd_view_member_info'); + $this->addMemberMenu( 'dispMemberScrappedDocument', 'cmd_view_scrapped_document'); + $this->addMemberMenu( 'dispMemberSavedDocument', 'cmd_view_saved_document'); + $this->addMemberMenu( 'dispMemberOwnDocument', 'cmd_view_own_document'); + } + + /** + * @brief 로그인한 사용자의 개인화된 메뉴 제공을 위한 method + * 로그인 정보 출력 위젯 또는 개인화 페이지에서 사용됨 + **/ + function addMemberMenu($act, $str) { + $logged_info = Context::get('logged_info'); + + $logged_info->menu_list[$act] = Context::getLang($str); + + Context::set('logged_info', $logged_info); + $_SESSION['logged_info'] = $logged_info; + } + + /** + * @brief 로그인 회원의 닉네임등을 클릭할때 나타나는 팝업 메뉴를 추가하는 method + **/ + function addMemberPopupMenu($url, $str, $icon = '', $target = 'self') { + $member_popup_menu_list = Context::get('member_popup_menu_list'); + if(!is_array($member_popup_menu_list)) $member_popup_menu_list = array(); + + $obj->url = $url; + $obj->str = $str; + $obj->icon = $icon; + $obj->target = $target; + $member_popup_menu_list[] = $obj; + + Context::set('member_popup_menu_list', $member_popup_menu_list); + } + + /** + * @brief member 테이블에 사용자 추가 + **/ + function insertMember(&$args, $password_is_hashed = false) { + // trigger 호출 (before) + $output = ModuleHandler::triggerCall('member.insertMember', 'before', $args); + if(!$output->toBool()) return $output; + + // 멤버 설정 정보에서 가입약관 부분을 재확인 + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('member'); + + $logged_info = Context::get('logged_info'); + + // 임시 제한 일자가 있을 경우 제한 일자에 내용 추가 + if($config->limit_day) $args->limit_date = date("YmdHis", time()+$config->limit_day*60*60*24); + + // 입력할 사용자의 아이디를 소문자로 변경 + $args->user_id = strtolower($args->user_id); + + // 필수 변수들의 조절 + if($args->allow_mailing!='Y') $args->allow_mailing = 'N'; + if($args->denied!='Y') $args->denied = 'N'; + $args->allow_message= 'Y'; + + if($logged_info->is_admin == 'Y') { + if($args->is_admin!='Y') $args->is_admin = 'N'; + } else { + unset($args->is_admin); + } + + list($args->email_id, $args->email_host) = explode('@', $args->email_address); + + // 홈페이지, 블로그의 주소 검사 + if($args->homepage && !preg_match("/^[a-z]+:\/\//i",$args->homepage)) $args->homepage = 'http://'.$args->homepage; + if($args->blog && !preg_match("/^[a-z]+:\/\//i",$args->blog)) $args->blog = 'http://'.$args->blog; + + // 모델 객체 생성 + $oMemberModel = &getModel('member'); + // 금지 아이디인지 체크 + if($oMemberModel->isDeniedID($args->user_id)) return new Object(-1,'denied_user_id'); + + // 아이디, 닉네임, email address 의 중복 체크 + $member_srl = $oMemberModel->getMemberSrlByUserID($args->user_id); + if($member_srl) return new Object(-1,'msg_exists_user_id'); + + $member_srl = $oMemberModel->getMemberSrlByNickName($args->nick_name); + if($member_srl) return new Object(-1,'msg_exists_nick_name'); + + $member_srl = $oMemberModel->getMemberSrlByEmailAddress($args->email_address); + if($member_srl) return new Object(-1,'msg_exists_email_address'); + + $oDB = &DB::getInstance(); + $oDB->begin(); + + // DB에 입력 + $args->member_srl = getNextSequence(); + $args->list_order = -1 * $args->member_srl; + if($args->password && !$password_is_hashed) $args->password = md5($args->password); + elseif(!$args->password) unset($args->password); + + $output = executeQuery('member.insertMember', $args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // 입력된 그룹 값이 없으면 기본 그룹의 값을 등록 + if(!$args->group_srl_list) { + $default_group = $oMemberModel->getDefaultGroup(0); + + // 기본 그룹에 추가 + $output = $this->addMemberToGroup($args->member_srl,$default_group->group_srl); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // 입력된 그룹 값이 있으면 해당 그룹의 값을 등록 + } else { + $group_srl_list = explode('|@|', $args->group_srl_list); + for($i=0;$iaddMemberToGroup($args->member_srl,$group_srl_list[$i]); + + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + } + } + + // 메일 인증 모드 사용시(가입된 회원이 denied일 때) 인증 메일 발송 + if ($args->denied == 'Y') { + // 인증 DB에 데이터를 넣음 + $auth_args->user_id = $args->user_id; + $auth_args->member_srl = $args->member_srl; + $auth_args->new_password = $args->password; + $auth_args->auth_key = md5(rand(0, 999999)); + $auth_args->is_register = 'Y'; + + $output = executeQuery('member.insertAuthMail', $auth_args); + if (!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // 메일 내용을 구함 + Context::set('auth_args', $auth_args); + Context::set('member_info', $args); + + $member_config = $oModuleModel->getModuleConfig('member'); + if(!$member_config->skin) $member_config->skin = "default"; + if(!$member_config->colorset) $member_config->colorset = "white"; + + Context::set('member_config', $member_config); + + $tpl_path = sprintf('%sskins/%s', $this->module_path, $member_config->skin); + if(!is_dir($tpl_path)) $tpl_path = sprintf('%sskins/%s', $this->module_path, 'default'); + + $auth_url = getFullUrl('','module','member','act','procMemberAuthAccount','member_srl',$args->member_srl, 'auth_key',$auth_args->auth_key); + Context::set('auth_url', $auth_url); + + $oTemplate = &TemplateHandler::getInstance(); + $content = $oTemplate->compile($tpl_path, 'confirm_member_account_mail'); + + // 사이트 웹마스터 정보를 구함 + $oModuleModel = &getModel('module'); + $member_config = $oModuleModel->getModuleConfig('member'); + + // 메일 발송 + $oMail = new Mail(); + $oMail->setTitle( Context::getLang('msg_confirm_account_title') ); + $oMail->setContent($content); + $oMail->setSender( $member_config->webmaster_name?$member_config->webmaster_name:'webmaster', $member_config->webmaster_email); + $oMail->setReceiptor( $args->user_name, $args->email_address ); + $oMail->send(); + } + + // trigger 호출 (after) + if($output->toBool()) { + $trigger_output = ModuleHandler::triggerCall('member.insertMember', 'after', $args); + if(!$trigger_output->toBool()) { + $oDB->rollback(); + return $trigger_output; + } + } + + $oDB->commit(true); + + $output->add('member_srl', $args->member_srl); + return $output; + } + + /** + * @brief member 정보 수정 + **/ + function updateMember($args) { + // trigger 호출 (before) + $output = ModuleHandler::triggerCall('member.updateMember', 'before', $args); + if(!$output->toBool()) return $output; + + // 모델 객체 생성 + $oMemberModel = &getModel('member'); + + $logged_info = Context::get('logged_info'); + + // 수정하려는 대상의 원래 정보 가져오기 + $member_info = $oMemberModel->getMemberInfoByMemberSrl($args->member_srl); + if(!$args->user_id) $args->user_id = $member_info->user_id; + + // 필수 변수들의 조절 + if($args->allow_mailing!='Y') $args->allow_mailing = 'N'; + if($args->allow_message && !in_array($args->allow_message, array('Y','N','F'))) $args->allow_message = 'Y'; + + if($logged_info->is_admin == 'Y') { + if($args->denied!='Y') $args->denied = 'N'; + if($args->is_admin!='Y' && $logged_info->member_srl != $args->member_srl) $args->is_admin = 'N'; + } else { + unset($args->is_admin); + unset($args->denied); + } + + list($args->email_id, $args->email_host) = explode('@', $args->email_address); + + // 홈페이지, 블로그의 주소 검사 + if($args->homepage && !preg_match("/^[a-z]+:\/\//is",$args->homepage)) $args->homepage = 'http://'.$args->homepage; + if($args->blog && !preg_match("/^[a-z]+:\/\//is",$args->blog)) $args->blog = 'http://'.$args->blog; + + // 아이디, 닉네임, email address 의 중복 체크 + $member_srl = $oMemberModel->getMemberSrlByUserID($args->user_id); + if($member_srl&&$args->member_srl!=$member_srl) return new Object(-1,'msg_exists_user_id'); + + $member_srl = $oMemberModel->getMemberSrlByNickName($args->nick_name); + if($member_srl&&$args->member_srl!=$member_srl) return new Object(-1,'msg_exists_nick_name'); + + $member_srl = $oMemberModel->getMemberSrlByEmailAddress($args->email_address); + if($member_srl&&$args->member_srl!=$member_srl) return new Object(-1,'msg_exists_email_address'); + + $oDB = &DB::getInstance(); + $oDB->begin(); + + // DB에 update + if($args->password) $args->password = md5($args->password); + else $args->password = $member_info->password; + if(!$args->user_name) $args->user_name = $member_info->user_name; + + if(!$args->description) $args->description = ''; + $output = executeQuery('member.updateMember', $args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // 그룹 정보가 있으면 그룹 정보를 변경 + if($args->group_srl_list) { + $group_srl_list = explode('|@|', $args->group_srl_list); + $args->site_srl = 0; + + // 일단 해당 회원의 모든 그룹 정보를 삭제 + $output = executeQuery('member.deleteMemberGroupMember', $args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // 하나 하나 루프를 돌면서 입력 + for($i=0;$iaddMemberToGroup($args->member_srl,$group_srl_list[$i]); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + } + } + + // trigger 호출 (after) + if($output->toBool()) { + $trigger_output = ModuleHandler::triggerCall('member.updateMember', 'after', $args); + if(!$trigger_output->toBool()) { + $oDB->rollback(); + return $trigger_output; + } + } + + $oDB->commit(); + + // 세션에 저장 + $member_info = $oMemberModel->getMemberInfoByMemberSrl($args->member_srl); + + $logged_info = Context::get('logged_info'); + if($logged_info->member_srl == $member_srl) { + $_SESSION['logged_info'] = $member_info; + } + + $output->add('member_srl', $args->member_srl); + return $output; + } + + /** + * @brief member 비밀번호 수정 + **/ + function updateMemberPassword($args) { + $output = executeQuery('member.updateChangePasswordDate', $args); + $args->password = md5($args->password); + return executeQuery('member.updateMemberPassword', $args); + } + + /** + * @brief 사용자 삭제 + **/ + function deleteMember($member_srl) { + // trigger 호출 (before) + $trigger_obj->member_srl = $member_srl; + $output = ModuleHandler::triggerCall('member.deleteMember', 'before', $trigger_obj); + if(!$output->toBool()) return $output; + + // 모델 객체 생성 + $oMemberModel = &getModel('member'); + + // 해당 사용자의 정보를 가져옴 + $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); + if(!$member_info) return new Object(-1, 'msg_not_exists_member'); + + // 관리자의 경우 삭제 불가능 + if($member_info->is_admin == 'Y') return new Object(-1, 'msg_cannot_delete_admin'); + + $oDB = &DB::getInstance(); + $oDB->begin(); + + $args->member_srl = $member_srl; + // member_auth_mail에서 해당 항목들 삭제 + $output = executeQuery('member.deleteAuthMail', $args); + if (!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // member_openid에서 해당 항목들 삭제 + $output = executeQuery('member.deleteMemberOpenIDByMemberSrl', $ags); + + // TODO: 테이블 업그레이드를 하지 않은 경우에 실패할 수 있다. + /* + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + */ + + // member_group_member에서 해당 항목들 삭제 + $output = executeQuery('member.deleteMemberGroupMember', $args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // member 테이블에서 삭제 + $output = executeQuery('member.deleteMember', $args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // trigger 호출 (after) + if($output->toBool()) { + $trigger_output = ModuleHandler::triggerCall('member.deleteMember', 'after', $trigger_obj); + if(!$trigger_output->toBool()) { + $oDB->rollback(); + return $trigger_output; + } + } + + $oDB->commit(); + + // 이름이미지, 이미지마크, 서명 삭제 + $this->procMemberDeleteImageName(); + $this->procMemberDeleteImageMark(); + $this->delSignature($member_srl); + + return $output; + } + + /** + * @brief 모든 세션 정보 파기 + **/ + function destroySessionInfo() { + if(!$_SESSION || !is_array($_SESSION)) return; + foreach($_SESSION as $key => $val) { + $_SESSION[$key] = ''; + } + session_destroy(); + setcookie(session_name(), '', time()-42000, '/'); + setcookie('sso','',time()-42000, '/'); + + if($_COOKIE['xeak']) { + $args->autologin_key = $_COOKIE['xeak']; + executeQuery('member.deleteAutologin', $args); + } + } + } +?> diff --git a/modules/member/member.model.php b/modules/member/member.model.php index c5670636c..e495cd87d 100644 --- a/modules/member/member.model.php +++ b/modules/member/member.model.php @@ -1,716 +1,716 @@ -getModuleConfig('member'); - - // 회원가입 약관 구함 - $agreement_file = _XE_PATH_.'files/member_extra_info/agreement.txt'; - if(file_exists($agreement_file)) $config->agreement = FileHandler::readFile($agreement_file); - - if(!$config->webmaster_name) $config->webmaster_name = 'webmaster'; - if(!$config->image_name_max_width) $config->image_name_max_width = 90; - if(!$config->image_name_max_height) $config->image_name_max_height = 20; - if(!$config->image_mark_max_width) $config->image_mark_max_width = 20; - if(!$config->image_mark_max_height) $config->image_mark_max_height = 20; - if(!$config->profile_image_max_width) $config->profile_image_max_width = 80; - if(!$config->profile_image_max_height) $config->profile_image_max_height = 80; - if(!$config->skin) $config->skin = "default"; - if(!$config->editor_skin || $config->editor_skin == 'default') $config->editor_skin = "xpresseditor"; - if(!$config->group_image_mark) $config->group_image_mark = "N"; - - return $config; - } - - /** - * @brief 선택된 회원의 간단한 메뉴를 표시 - **/ - function getMemberMenu() { - // 요청된 회원 번호와 현재 사용자의 로그인 정보 구함 - $member_srl = Context::get('target_srl'); - $mid = Context::get('cur_mid'); - $logged_info = Context::get('logged_info'); - $act = Context::get('cur_act'); - - // 자신의 아이디를 클릭한 경우 - if($member_srl == $logged_info->member_srl) $member_info = $logged_info; - - // 다른 사람의 아이디를 클릭한 경우 - else $member_info = $this->getMemberInfoByMemberSrl($member_srl); - - $member_srl = $member_info->member_srl; - if(!$member_srl) return; - - // 변수 정리 - $user_id = $member_info->user_id; - $user_name = $member_info->user_name; - - ModuleHandler::triggerCall('member.getMemberMenu', 'before', $null); - - $oMemberController = &getController('member'); - - // 회원 정보 보기 (비회원일 경우 볼 수 없도록 수정) - if($logged_info->member_srl) { - $url = getUrl('','mid',$mid,'act','dispMemberInfo','member_srl',$member_srl); - $icon_path = './modules/member/tpl/images/icon_view_info.gif'; - $oMemberController->addMemberPopupMenu($url,'cmd_view_member_info',$icon_path,'self'); - } - - // 다른 사람의 아이디를 클릭한 경우 - if($member_srl != $logged_info->member_srl) { - - // 메일 보내기 - if($member_info->email_address) { - $url = 'mailto:'.htmlspecialchars($member_info->email_address); - $icon_path = './modules/member/tpl/images/icon_sendmail.gif'; - $oMemberController->addMemberPopupMenu($url,'cmd_send_email',$icon_path); - } - } - - // 홈페이지 보기 - if($member_info->homepage) - $oMemberController->addMemberPopupMenu(htmlspecialchars($member_info->homepage), 'homepage', './modules/member/tpl/images/icon_homepage.gif','blank'); - - // 블로그 보기 - if($member_info->blog) - $oMemberController->addMemberPopupMenu(htmlspecialchars($member_info->blog), 'blog', './modules/member/tpl/images/icon_blog.gif','blank'); - - // trigger 호출 (after) - ModuleHandler::triggerCall('member.getMemberMenu', 'after', $null); - - // 최고 관리자라면 회원정보 수정 메뉴 만듬 - if($logged_info->is_admin == 'Y') { - $url = getUrl('','module','admin','act','dispMemberAdminInsert','member_srl',$member_srl); - $icon_path = './modules/member/tpl/images/icon_management.gif'; - $oMemberController->addMemberPopupMenu($url,'cmd_manage_member_info',$icon_path,'MemberModifyInfo'); - - $url = getUrl('','module','admin','act','dispDocumentAdminList','search_target','member_srl','search_keyword',$member_srl); - $icon_path = './modules/member/tpl/images/icon_trace_document.gif'; - $oMemberController->addMemberPopupMenu($url,'cmd_trace_document',$icon_path,'TraceMemberDocument'); - - $url = getUrl('','module','admin','act','dispCommentAdminList','search_target','member_srl','search_keyword',$member_srl); - $icon_path = './modules/member/tpl/images/icon_trace_comment.gif'; - $oMemberController->addMemberPopupMenu($url,'cmd_trace_comment',$icon_path,'TraceMemberComment'); - } - - // 팝업메뉴의 언어 변경 - $menus = Context::get('member_popup_menu_list'); - $menus_count = count($menus); - for($i=0;$i<$menus_count;$i++) { - $menus[$i]->str = Context::getLang($menus[$i]->str); - } - - // 최종적으로 정리된 팝업메뉴 목록을 구함 - $this->add('menus', $menus); - } - - /** - * @brief 로그인 되어 있는지에 대한 체크 - **/ - function isLogged() { - if($_SESSION['is_logged']&&$_SESSION['ipaddress']==$_SERVER['REMOTE_ADDR']) return true; - - $_SESSION['is_logged'] = false; - $_SESSION['logged_info'] = ''; - return false; - } - - /** - * @brief 인증된 사용자의 정보 return - **/ - function getLoggedInfo() { - // 로그인 되어 있고 세션 정보를 요청하면 세션 정보를 return - if($this->isLogged()) { - $logged_info = $_SESSION['logged_info']; - - // site_module_info에 따라서 관리자/ 그룹 목록을 매번 재지정 - $site_module_info = Context::get('site_module_info'); - if($site_module_info->site_srl) { - $logged_info->group_list = $this->getMemberGroups($logged_info->member_srl, $site_module_info->site_srl); - - // 사이트 관리자이면 로그인 정보에 is_site_admin bool변수를 추가 - $oModuleModel = &getModel('module'); - if($oModuleModel->isSiteAdmin($logged_info)) $logged_info->is_site_admin = true; - else $logged_info->is_site_admin = false; - } else { - // 만약 기본 사이트인데 회원 그룹이 존재하지 않으면 등록 - if(!count($logged_info->group_list)) { - $default_group = $this->getDefaultGroup(0); - $oMemberController = &getController('member'); - $oMemberController->addMemberToGroup($logged_info->member_srl, $default_group->group_srl, 0); - $groups[$default_group->group_srl] = $default_group->title; - $logged_info->group_list = $groups; - } - - $logged_info->is_site_admin = false; - } - - $_SESSION['logged_info'] = $logged_info; - - return $logged_info; - } - return NULL; - } - - /** - * @brief user_id에 해당하는 사용자 정보 return - **/ - function getMemberInfoByUserID($user_id) { - if(!$user_id) return; - - $args->user_id = $user_id; - $output = executeQuery('member.getMemberInfo', $args); - if(!$output->toBool()) return $output; - if(!$output->data) return; - - $member_info = $this->arrangeMemberInfo($output->data); - - return $member_info; - } - - /** - * @brief member_srl로 사용자 정보 return - **/ - function getMemberInfoByMemberSrl($member_srl, $site_srl = 0) { - if(!$member_srl) return; - - if(!$GLOBALS['__member_info__'][$member_srl]) { - $args->member_srl = $member_srl; - $output = executeQuery('member.getMemberInfoByMemberSrl', $args); - if(!$output->data) return; - - $this->arrangeMemberInfo($output->data, $site_srl); - } - - return $GLOBALS['__member_info__'][$member_srl]; - } - - /** - * @brief 사용자 정보 중 extra_vars와 기타 정보를 알맞게 편집 - **/ - function arrangeMemberInfo($info, $site_srl = 0) { - if(!$GLOBALS['__member_info__'][$info->member_srl]) { - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('member'); - - - $info->profile_image = $this->getProfileImage($info->member_srl); - $info->image_name = $this->getImageName($info->member_srl); - $info->image_mark = $this->getImageMark($info->member_srl); - if($config->group_image_mark=='Y'){ - $info->group_mark = $this->getGroupImageMark($info->member_srl,$site_srl); - } - $info->signature = $this->getSignature($info->member_srl); - $info->group_list = $this->getMemberGroups($info->member_srl, $site_srl); - - $extra_vars = unserialize($info->extra_vars); - unset($info->extra_vars); - if($extra_vars) { - foreach($extra_vars as $key => $val) { - if(preg_match('/\|\@\|/i', $val)) $val = explode('|@|', $val); - if(!$info->{$key}) $info->{$key} = $val; - } - } - - $GLOBALS['__member_info__'][$info->member_srl] = $info; - } - - return $GLOBALS['__member_info__'][$info->member_srl]; - } - - /** - * @brief userid에 해당하는 member_srl을 구함 - **/ - function getMemberSrlByUserID($user_id) { - $args->user_id = $user_id; - $output = executeQuery('member.getMemberSrl', $args); - return $output->data->member_srl; - } - - /** - * @brief EmailAddress에 해당하는 member_srl을 구함 - **/ - function getMemberSrlByEmailAddress($email_address) { - $args->email_address = $email_address; - $output = executeQuery('member.getMemberSrl', $args); - return $output->data->member_srl; - } - - /** - * @brief NickName에 해당하는 member_srl을 구함 - **/ - function getMemberSrlByNickName($nick_name) { - $args->nick_name = $nick_name; - $output = executeQuery('member.getMemberSrl', $args); - return $output->data->member_srl; - } - - /** - * @brief 현재 접속자의 member_srl을 return - **/ - function getLoggedMemberSrl() { - if(!$this->isLogged()) return; - return $_SESSION['member_srl']; - } - - /** - * @brief 현재 접속자의 user_id을 return - **/ - function getLoggedUserID() { - if(!$this->isLogged()) return; - $logged_info = $_SESSION['logged_info']; - return $logged_info->user_id; - } - - /** - * @brief member_srl이 속한 group 목록을 가져옴 - **/ - function getMemberGroups($member_srl, $site_srl = 0, $force_reload = false) { - static $member_groups = array(); - if(!$member_groups[$member_srl][$site_srl] || $force_reload) { - $args->member_srl = $member_srl; - $args->site_srl = $site_srl; - $output = executeQuery('member.getMemberGroups', $args); - if(!$output->data) return array(); - - $group_list = $output->data; - if(!is_array($group_list)) $group_list = array($group_list); - - foreach($group_list as $group) { - $result[$group->group_srl] = $group->title; - } - $member_groups[$member_srl][$site_srl] = $result; - } - return $member_groups[$member_srl][$site_srl]; - } - - /** - * @brief member_srl들이 속한 group 목록을 가져옴 - **/ - function getMembersGroups($member_srls, $site_srl = 0) { - $args->member_srls = implode(',',$member_srls); - $args->site_srl = $site_srl; - $output = executeQueryArray('member.getMembersGroups', $args); - if(!$output->data) return array(); - - $result = array(); - foreach($output->data as $key=>$val) { - $result[$val->member_srl][] = $val->title; - } - return $result; - } - - /** - * @brief 기본 그룹을 가져옴 - **/ - function getDefaultGroup($site_srl = 0) { - $args->site_srl = $site_srl; - $output = executeQuery('member.getDefaultGroup', $args); - return $output->data; - } - - /** - * @brief 관리자 그룹을 가져옴 - **/ - function getAdminGroup() { - $output = executeQuery('member.getAdminGroup'); - return $output->data; - } - - /** - * @brief group_srl에 해당하는 그룹 정보 가져옴 - **/ - function getGroup($group_srl) { - $args->group_srl = $group_srl; - $output = executeQuery('member.getGroup', $args); - return $output->data; - } - - /** - * @brief 그룹 목록을 가져옴 - **/ - function getGroups($site_srl = 0) { - if(!$GLOBALS['__group_info__'][$site_srl]) { - $args->site_srl = $site_srl; - $output = executeQuery('member.getGroups', $args); - if(!$output->data) return; - - $group_list = $output->data; - if(!is_array($group_list)) $group_list = array($group_list); - - foreach($group_list as $val) { - $result[$val->group_srl] = $val; - } - - $GLOBALS['__group_info__'][$site_srl] = $result; - } - return $GLOBALS['__group_info__'][$site_srl]; - } - - /** - * @brief 회원 가입폼 추가 확장 목록 가져오기 - * - * 이 메소드는 modules/member/tpl/filter/insert.xml 의 extend_filter로 동작을 한다. - * extend_filter로 사용을 하기 위해서는 인자값으로 boolean값을 받도록 규정한다. - * 이 인자값이 true일 경우 filter 타입에 맞는 형태의 object로 결과를 return하여야 한다. - **/ - function getJoinFormList($filter_response = false) { - global $lang; - - // 최고관리자는 무시하도록 설정 - $logged_info = Context::get('logged_info'); - - if(!$this->join_form_list) { - // list_order 컬럼의 정렬을 위한 인자 세팅 - $args->sort_index = "list_order"; - $output = executeQuery('member.getJoinFormList', $args); - - // 결과 데이터가 없으면 NULL return - $join_form_list = $output->data; - if(!$join_form_list) return NULL; - - // default_value의 경우 DB에 array가 serialize되어 입력되므로 unserialize가 필요 - if(!is_array($join_form_list)) $join_form_list = array($join_form_list); - $join_form_count = count($join_form_list); - for($i=0;$i<$join_form_count;$i++) { - $join_form_list[$i]->column_name = strtolower($join_form_list[$i]->column_name); - - $member_join_form_srl = $join_form_list[$i]->member_join_form_srl; - $column_type = $join_form_list[$i]->column_type; - $column_name = $join_form_list[$i]->column_name; - $column_title = $join_form_list[$i]->column_title; - $default_value = $join_form_list[$i]->default_value; - - // 언어변수에 추가 - $lang->extend_vars[$column_name] = $column_title; - - // checkbox, select등 다수 데이터 형식일 경우 unserialize해줌 - if(in_array($column_type, array('checkbox','select','radio'))) { - $join_form_list[$i]->default_value = unserialize($default_value); - if(!$join_form_list[$i]->default_value[0]) $join_form_list[$i]->default_value = ''; - } else { - $join_form_list[$i]->default_value = ''; - } - - $list[$member_join_form_srl] = $join_form_list[$i]; - } - $this->join_form_list = $list; - } - - // filter_response가 true일 경우 object 스타일을 구함 - if($filter_response && count($this->join_form_list)) { - - foreach($this->join_form_list as $key => $val) { - if($val->is_active != 'Y') continue; - unset($obj); - $obj->type = $val->column_type; - $obj->name = $val->column_name; - $obj->lang = $val->column_title; - if($logged_info->is_admin != 'Y') $obj->required = $val->required=='Y'?true:false; - else $obj->required = false; - $filter_output[] = $obj; - - unset($open_obj); - $open_obj->name = 'open_'.$val->column_name; - $open_obj->required = false; - $filter_output[] = $open_obj; - - } - return $filter_output; - - } - - // 결과 리턴 - return $this->join_form_list; - } - - /** - * @brief 추가 회원가입폼과 특정 회원의 정보를 조합 (회원정보 수정등에 사용) - **/ - function getCombineJoinForm($member_info) { - $extend_form_list = $this->getJoinFormlist(); - if(!$extend_form_list) return; - - // 관리자이거나 자기 자신이 아니면 비공개의 경우 무조건 패스해버림 - $logged_info = Context::get('logged_info'); - - foreach($extend_form_list as $srl => $item) { - $column_name = $item->column_name; - $value = $member_info->{$column_name}; - - if($logged_info->is_admin != 'Y' && $logged_info->member_srl != $member_info->member_srl && $member_info->{'open_'.$column_name}!='Y') { - $extend_form_list[$srl]->is_private = true; - continue; - } - - // 추가 확장폼의 종류에 따라 값을 변경 - switch($item->column_type) { - case 'checkbox' : - if($value && !is_array($value)) $value = array($value); - break; - case 'text' : - case 'homepage' : - case 'email_address' : - case 'tel' : - case 'textarea' : - case 'select' : - case 'kr_zip' : - break; - } - - $extend_form_list[$srl]->value = $value; - - if($member_info->{'open_'.$column_name}=='Y') $extend_form_list[$srl]->is_opened = true; - else $extend_form_list[$srl]->is_opened = false; - } - return $extend_form_list; - } - - /** - * @brief 한개의 가입항목을 가져옴 - **/ - function getJoinForm($member_join_form_srl) { - $args->member_join_form_srl = $member_join_form_srl; - $output = executeQuery('member.getJoinForm', $args); - $join_form = $output->data; - if(!$join_form) return NULL; - - $column_type = $join_form->column_type; - $default_value = $join_form->default_value; - - if(in_array($column_type, array('checkbox','select','radio'))) { - $join_form->default_value = unserialize($default_value); - } else { - $join_form->default_value = ''; - } - - return $join_form; - } - - /** - * @brief 금지 아이디 목록 가져오기 - **/ - function getDeniedIDList() { - if(!$this->denied_id_list) { - $args->sort_index = "list_order"; - $args->page = Context::get('page'); - $args->list_count = 40; - $args->page_count = 10; - - $output = executeQuery('member.getDeniedIDList', $args); - $this->denied_id_list = $output; - } - return $this->denied_id_list; - } - - /** - * @brief 금지 아이디인지 확인 - **/ - function isDeniedID($user_id) { - $args->user_id = $user_id; - $output = executeQuery('member.chkDeniedID', $args); - if($output->data->count) return true; - return false; - } - - /** - * @brief 프로필 이미지의 정보를 구함 - **/ - function getProfileImage($member_srl) { - if(!isset($GLOBALS['__member_info__']['profile_image'][$member_srl])) { - $GLOBALS['__member_info__']['profile_image'][$member_srl] = null; - $exts = array('gif','jpg','png'); - for($i=0;$i<3;$i++) { - $image_name_file = sprintf('files/member_extra_info/profile_image/%s%d.%s', getNumberingPath($member_srl), $member_srl, $exts[$i]); - if(file_exists($image_name_file)) { - list($width, $height, $type, $attrs) = getimagesize($image_name_file); - $info = null; - $info->width = $width; - $info->height = $height; - $info->src = Context::getRequestUri().$image_name_file; - $info->file = './'.$image_name_file; - $GLOBALS['__member_info__']['profile_image'][$member_srl] = $info; - break; - } - } - } - - return $GLOBALS['__member_info__']['profile_image'][$member_srl]; - } - - /** - * @brief 이미지이름의 정보를 구함 - **/ - function getImageName($member_srl) { - if(!isset($GLOBALS['__member_info__']['image_name'][$member_srl])) { - $image_name_file = sprintf('files/member_extra_info/image_name/%s%d.gif', getNumberingPath($member_srl), $member_srl); - if(file_exists($image_name_file)) { - list($width, $height, $type, $attrs) = getimagesize($image_name_file); - $info->width = $width; - $info->height = $height; - $info->src = Context::getRequestUri().$image_name_file; - $info->file = './'.$image_name_file; - $GLOBALS['__member_info__']['image_name'][$member_srl] = $info; - } else $GLOBALS['__member_info__']['image_name'][$member_srl] = null; - } - return $GLOBALS['__member_info__']['image_name'][$member_srl]; - } - - /** - * @brief 이미지마크의 정보를 구함 - **/ - function getImageMark($member_srl) { - if(!isset($GLOBALS['__member_info__']['image_mark'][$member_srl])) { - $image_mark_file = sprintf('files/member_extra_info/image_mark/%s%d.gif', getNumberingPath($member_srl), $member_srl); - if(file_exists($image_mark_file)) { - list($width, $height, $type, $attrs) = getimagesize($image_mark_file); - $info->width = $width; - $info->height = $height; - $info->src = Context::getRequestUri().$image_mark_file; - $info->file = './'.$image_mark_file; - $GLOBALS['__member_info__']['image_mark'][$member_srl] = $info; - } else $GLOBALS['__member_info__']['image_mark'][$member_srl] = null; - } - - return $GLOBALS['__member_info__']['image_mark'][$member_srl]; - } - - - /** - * @brief group의 이미지마크 정보를 구함 - **/ - function getGroupImageMark($member_srl,$site_srl=0) { - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('member'); - if($config->group_image_mark!='Y'){ - return null; - } - $member_group = $this->getMemberGroups($member_srl,$site_srl); - - $groups_info = $this->getGroups($site_srl); - $image_mark = null; - if(count($member_group) > 0 && is_array($member_group)){ - $group_srl = array_keys($member_group); - $image_mark = $groups_info[$group_srl[0]]->image_mark; - } - if($image_mark){ -// list($width, $height, $type, $attrs) = getimagesize($image_mark); -// $info->width = $width; -// $info->height = $height; - $info->src = $image_mark; - return $info; - - }else return false; - } - - /** - * @brief 사용자의 signature를 구함 - **/ - function getSignature($member_srl) { - if(!isset($GLOBALS['__member_info__']['signature'][$member_srl])) { - $filename = sprintf('files/member_extra_info/signature/%s%d.signature.php', getNumberingPath($member_srl), $member_srl); - if(file_exists($filename)) { - $buff = FileHandler::readFile($filename); - $signature = trim(substr($buff, 40)); - $GLOBALS['__member_info__']['signature'][$member_srl] = $signature; - } else $GLOBALS['__member_info__']['signature'][$member_srl] = null; - } - return $GLOBALS['__member_info__']['signature'][$member_srl]; - } - - /** - * @brief 입력된 plain text 비밀번호와 DB에 저장된 비밀번호와의 비교 - **/ - function isValidPassword($hashed_password, $password_text) { - // 입력된 비밀번호가 없으면 무조건 falase - if(!$password_text) return false; - - // md5 해쉬된값가 맞으면 return true - if($hashed_password == md5($password_text)) return true; - - // mysql_pre4_hash_password함수의 값과 동일하면 return true - if(mysql_pre4_hash_password($password_text) == $hashed_password) return true; - - // 현재 DB에서 mysql DB를 이용시 직접 old_password를 이용하여 검사하고 맞으면 비밀번호를 변경 - if(substr(Context::getDBType(),0,5)=='mysql') { - $oDB = &DB::getInstance(); - if($oDB->isValidOldPassword($password_text, $hashed_password)) return true; - } - - return false; - } - - /** - * @brief 멤버와 연결된 오픈아이디들을 모두 리턴한다. - **/ - function getMemberOpenIDByMemberSrl($member_srl) { - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('member'); - - $result = array(); - if ($config->enable_openid != 'Y') return $result; - - $args->member_srl = $member_srl; - $output = executeQuery('member.getMemberOpenIDByMemberSrl', $args); - - if (!$output->data) { - } - else if (is_array($output->data)) { - foreach($output->data as $row) { - $result[] = $row; - } - } - else { - $result[] = $output->data; - } - - foreach($result as $row) { - $openid = $row->openid; - $bookmarklet_header = "javascript:var%20U='"; - $bookmarklet_footer = "';function%20Z(W){var%20X=/(openid|ident)/i;try{var%20F=W.frames;var%20E=W.document.getElementsByTagName('input');for(var%20i=0;ibookmarklet = $bookmarklet_header . $openid . $bookmarklet_footer; - } - - return $result; - } - - /** - * @brief 오픈아이디에 연결된 멤버를 리턴한다. - **/ - function getMemberSrlByOpenID($openid) { - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('member'); - - if ($config->enable_openid != 'Y') return $result; - - $args->member_srl = $member_srl; - $output = executeQuery('member.getMemberSrlByOpenID', $args); - - if (!$output->data) return null; - return $output->data->member_srl; - } - - } -?> +getModuleConfig('member'); + + // 회원가입 약관 구함 + $agreement_file = _XE_PATH_.'files/member_extra_info/agreement.txt'; + if(file_exists($agreement_file)) $config->agreement = FileHandler::readFile($agreement_file); + + if(!$config->webmaster_name) $config->webmaster_name = 'webmaster'; + if(!$config->image_name_max_width) $config->image_name_max_width = 90; + if(!$config->image_name_max_height) $config->image_name_max_height = 20; + if(!$config->image_mark_max_width) $config->image_mark_max_width = 20; + if(!$config->image_mark_max_height) $config->image_mark_max_height = 20; + if(!$config->profile_image_max_width) $config->profile_image_max_width = 80; + if(!$config->profile_image_max_height) $config->profile_image_max_height = 80; + if(!$config->skin) $config->skin = "default"; + if(!$config->editor_skin || $config->editor_skin == 'default') $config->editor_skin = "xpresseditor"; + if(!$config->group_image_mark) $config->group_image_mark = "N"; + + return $config; + } + + /** + * @brief 선택된 회원의 간단한 메뉴를 표시 + **/ + function getMemberMenu() { + // 요청된 회원 번호와 현재 사용자의 로그인 정보 구함 + $member_srl = Context::get('target_srl'); + $mid = Context::get('cur_mid'); + $logged_info = Context::get('logged_info'); + $act = Context::get('cur_act'); + + // 자신의 아이디를 클릭한 경우 + if($member_srl == $logged_info->member_srl) $member_info = $logged_info; + + // 다른 사람의 아이디를 클릭한 경우 + else $member_info = $this->getMemberInfoByMemberSrl($member_srl); + + $member_srl = $member_info->member_srl; + if(!$member_srl) return; + + // 변수 정리 + $user_id = $member_info->user_id; + $user_name = $member_info->user_name; + + ModuleHandler::triggerCall('member.getMemberMenu', 'before', $null); + + $oMemberController = &getController('member'); + + // 회원 정보 보기 (비회원일 경우 볼 수 없도록 수정) + if($logged_info->member_srl) { + $url = getUrl('','mid',$mid,'act','dispMemberInfo','member_srl',$member_srl); + $icon_path = './modules/member/tpl/images/icon_view_info.gif'; + $oMemberController->addMemberPopupMenu($url,'cmd_view_member_info',$icon_path,'self'); + } + + // 다른 사람의 아이디를 클릭한 경우 + if($member_srl != $logged_info->member_srl) { + + // 메일 보내기 + if($member_info->email_address) { + $url = 'mailto:'.htmlspecialchars($member_info->email_address); + $icon_path = './modules/member/tpl/images/icon_sendmail.gif'; + $oMemberController->addMemberPopupMenu($url,'cmd_send_email',$icon_path); + } + } + + // 홈페이지 보기 + if($member_info->homepage) + $oMemberController->addMemberPopupMenu(htmlspecialchars($member_info->homepage), 'homepage', './modules/member/tpl/images/icon_homepage.gif','blank'); + + // 블로그 보기 + if($member_info->blog) + $oMemberController->addMemberPopupMenu(htmlspecialchars($member_info->blog), 'blog', './modules/member/tpl/images/icon_blog.gif','blank'); + + // trigger 호출 (after) + ModuleHandler::triggerCall('member.getMemberMenu', 'after', $null); + + // 최고 관리자라면 회원정보 수정 메뉴 만듬 + if($logged_info->is_admin == 'Y') { + $url = getUrl('','module','admin','act','dispMemberAdminInsert','member_srl',$member_srl); + $icon_path = './modules/member/tpl/images/icon_management.gif'; + $oMemberController->addMemberPopupMenu($url,'cmd_manage_member_info',$icon_path,'MemberModifyInfo'); + + $url = getUrl('','module','admin','act','dispDocumentAdminList','search_target','member_srl','search_keyword',$member_srl); + $icon_path = './modules/member/tpl/images/icon_trace_document.gif'; + $oMemberController->addMemberPopupMenu($url,'cmd_trace_document',$icon_path,'TraceMemberDocument'); + + $url = getUrl('','module','admin','act','dispCommentAdminList','search_target','member_srl','search_keyword',$member_srl); + $icon_path = './modules/member/tpl/images/icon_trace_comment.gif'; + $oMemberController->addMemberPopupMenu($url,'cmd_trace_comment',$icon_path,'TraceMemberComment'); + } + + // 팝업메뉴의 언어 변경 + $menus = Context::get('member_popup_menu_list'); + $menus_count = count($menus); + for($i=0;$i<$menus_count;$i++) { + $menus[$i]->str = Context::getLang($menus[$i]->str); + } + + // 최종적으로 정리된 팝업메뉴 목록을 구함 + $this->add('menus', $menus); + } + + /** + * @brief 로그인 되어 있는지에 대한 체크 + **/ + function isLogged() { + if($_SESSION['is_logged']&&$_SESSION['ipaddress']==$_SERVER['REMOTE_ADDR']) return true; + + $_SESSION['is_logged'] = false; + $_SESSION['logged_info'] = ''; + return false; + } + + /** + * @brief 인증된 사용자의 정보 return + **/ + function getLoggedInfo() { + // 로그인 되어 있고 세션 정보를 요청하면 세션 정보를 return + if($this->isLogged()) { + $logged_info = $_SESSION['logged_info']; + + // site_module_info에 따라서 관리자/ 그룹 목록을 매번 재지정 + $site_module_info = Context::get('site_module_info'); + if($site_module_info->site_srl) { + $logged_info->group_list = $this->getMemberGroups($logged_info->member_srl, $site_module_info->site_srl); + + // 사이트 관리자이면 로그인 정보에 is_site_admin bool변수를 추가 + $oModuleModel = &getModel('module'); + if($oModuleModel->isSiteAdmin($logged_info)) $logged_info->is_site_admin = true; + else $logged_info->is_site_admin = false; + } else { + // 만약 기본 사이트인데 회원 그룹이 존재하지 않으면 등록 + if(!count($logged_info->group_list)) { + $default_group = $this->getDefaultGroup(0); + $oMemberController = &getController('member'); + $oMemberController->addMemberToGroup($logged_info->member_srl, $default_group->group_srl, 0); + $groups[$default_group->group_srl] = $default_group->title; + $logged_info->group_list = $groups; + } + + $logged_info->is_site_admin = false; + } + + $_SESSION['logged_info'] = $logged_info; + + return $logged_info; + } + return NULL; + } + + /** + * @brief user_id에 해당하는 사용자 정보 return + **/ + function getMemberInfoByUserID($user_id) { + if(!$user_id) return; + + $args->user_id = $user_id; + $output = executeQuery('member.getMemberInfo', $args); + if(!$output->toBool()) return $output; + if(!$output->data) return; + + $member_info = $this->arrangeMemberInfo($output->data); + + return $member_info; + } + + /** + * @brief member_srl로 사용자 정보 return + **/ + function getMemberInfoByMemberSrl($member_srl, $site_srl = 0) { + if(!$member_srl) return; + + if(!$GLOBALS['__member_info__'][$member_srl]) { + $args->member_srl = $member_srl; + $output = executeQuery('member.getMemberInfoByMemberSrl', $args); + if(!$output->data) return; + + $this->arrangeMemberInfo($output->data, $site_srl); + } + + return $GLOBALS['__member_info__'][$member_srl]; + } + + /** + * @brief 사용자 정보 중 extra_vars와 기타 정보를 알맞게 편집 + **/ + function arrangeMemberInfo($info, $site_srl = 0) { + if(!$GLOBALS['__member_info__'][$info->member_srl]) { + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('member'); + + + $info->profile_image = $this->getProfileImage($info->member_srl); + $info->image_name = $this->getImageName($info->member_srl); + $info->image_mark = $this->getImageMark($info->member_srl); + if($config->group_image_mark=='Y'){ + $info->group_mark = $this->getGroupImageMark($info->member_srl,$site_srl); + } + $info->signature = $this->getSignature($info->member_srl); + $info->group_list = $this->getMemberGroups($info->member_srl, $site_srl); + + $extra_vars = unserialize($info->extra_vars); + unset($info->extra_vars); + if($extra_vars) { + foreach($extra_vars as $key => $val) { + if(preg_match('/\|\@\|/i', $val)) $val = explode('|@|', $val); + if(!$info->{$key}) $info->{$key} = $val; + } + } + + $GLOBALS['__member_info__'][$info->member_srl] = $info; + } + + return $GLOBALS['__member_info__'][$info->member_srl]; + } + + /** + * @brief userid에 해당하는 member_srl을 구함 + **/ + function getMemberSrlByUserID($user_id) { + $args->user_id = $user_id; + $output = executeQuery('member.getMemberSrl', $args); + return $output->data->member_srl; + } + + /** + * @brief EmailAddress에 해당하는 member_srl을 구함 + **/ + function getMemberSrlByEmailAddress($email_address) { + $args->email_address = $email_address; + $output = executeQuery('member.getMemberSrl', $args); + return $output->data->member_srl; + } + + /** + * @brief NickName에 해당하는 member_srl을 구함 + **/ + function getMemberSrlByNickName($nick_name) { + $args->nick_name = $nick_name; + $output = executeQuery('member.getMemberSrl', $args); + return $output->data->member_srl; + } + + /** + * @brief 현재 접속자의 member_srl을 return + **/ + function getLoggedMemberSrl() { + if(!$this->isLogged()) return; + return $_SESSION['member_srl']; + } + + /** + * @brief 현재 접속자의 user_id을 return + **/ + function getLoggedUserID() { + if(!$this->isLogged()) return; + $logged_info = $_SESSION['logged_info']; + return $logged_info->user_id; + } + + /** + * @brief member_srl이 속한 group 목록을 가져옴 + **/ + function getMemberGroups($member_srl, $site_srl = 0, $force_reload = false) { + static $member_groups = array(); + if(!$member_groups[$member_srl][$site_srl] || $force_reload) { + $args->member_srl = $member_srl; + $args->site_srl = $site_srl; + $output = executeQuery('member.getMemberGroups', $args); + if(!$output->data) return array(); + + $group_list = $output->data; + if(!is_array($group_list)) $group_list = array($group_list); + + foreach($group_list as $group) { + $result[$group->group_srl] = $group->title; + } + $member_groups[$member_srl][$site_srl] = $result; + } + return $member_groups[$member_srl][$site_srl]; + } + + /** + * @brief member_srl들이 속한 group 목록을 가져옴 + **/ + function getMembersGroups($member_srls, $site_srl = 0) { + $args->member_srls = implode(',',$member_srls); + $args->site_srl = $site_srl; + $output = executeQueryArray('member.getMembersGroups', $args); + if(!$output->data) return array(); + + $result = array(); + foreach($output->data as $key=>$val) { + $result[$val->member_srl][] = $val->title; + } + return $result; + } + + /** + * @brief 기본 그룹을 가져옴 + **/ + function getDefaultGroup($site_srl = 0) { + $args->site_srl = $site_srl; + $output = executeQuery('member.getDefaultGroup', $args); + return $output->data; + } + + /** + * @brief 관리자 그룹을 가져옴 + **/ + function getAdminGroup() { + $output = executeQuery('member.getAdminGroup'); + return $output->data; + } + + /** + * @brief group_srl에 해당하는 그룹 정보 가져옴 + **/ + function getGroup($group_srl) { + $args->group_srl = $group_srl; + $output = executeQuery('member.getGroup', $args); + return $output->data; + } + + /** + * @brief 그룹 목록을 가져옴 + **/ + function getGroups($site_srl = 0) { + if(!$GLOBALS['__group_info__'][$site_srl]) { + $args->site_srl = $site_srl; + $output = executeQuery('member.getGroups', $args); + if(!$output->data) return; + + $group_list = $output->data; + if(!is_array($group_list)) $group_list = array($group_list); + + foreach($group_list as $val) { + $result[$val->group_srl] = $val; + } + + $GLOBALS['__group_info__'][$site_srl] = $result; + } + return $GLOBALS['__group_info__'][$site_srl]; + } + + /** + * @brief 회원 가입폼 추가 확장 목록 가져오기 + * + * 이 메소드는 modules/member/tpl/filter/insert.xml 의 extend_filter로 동작을 한다. + * extend_filter로 사용을 하기 위해서는 인자값으로 boolean값을 받도록 규정한다. + * 이 인자값이 true일 경우 filter 타입에 맞는 형태의 object로 결과를 return하여야 한다. + **/ + function getJoinFormList($filter_response = false) { + global $lang; + + // 최고관리자는 무시하도록 설정 + $logged_info = Context::get('logged_info'); + + if(!$this->join_form_list) { + // list_order 컬럼의 정렬을 위한 인자 세팅 + $args->sort_index = "list_order"; + $output = executeQuery('member.getJoinFormList', $args); + + // 결과 데이터가 없으면 NULL return + $join_form_list = $output->data; + if(!$join_form_list) return NULL; + + // default_value의 경우 DB에 array가 serialize되어 입력되므로 unserialize가 필요 + if(!is_array($join_form_list)) $join_form_list = array($join_form_list); + $join_form_count = count($join_form_list); + for($i=0;$i<$join_form_count;$i++) { + $join_form_list[$i]->column_name = strtolower($join_form_list[$i]->column_name); + + $member_join_form_srl = $join_form_list[$i]->member_join_form_srl; + $column_type = $join_form_list[$i]->column_type; + $column_name = $join_form_list[$i]->column_name; + $column_title = $join_form_list[$i]->column_title; + $default_value = $join_form_list[$i]->default_value; + + // 언어변수에 추가 + $lang->extend_vars[$column_name] = $column_title; + + // checkbox, select등 다수 데이터 형식일 경우 unserialize해줌 + if(in_array($column_type, array('checkbox','select','radio'))) { + $join_form_list[$i]->default_value = unserialize($default_value); + if(!$join_form_list[$i]->default_value[0]) $join_form_list[$i]->default_value = ''; + } else { + $join_form_list[$i]->default_value = ''; + } + + $list[$member_join_form_srl] = $join_form_list[$i]; + } + $this->join_form_list = $list; + } + + // filter_response가 true일 경우 object 스타일을 구함 + if($filter_response && count($this->join_form_list)) { + + foreach($this->join_form_list as $key => $val) { + if($val->is_active != 'Y') continue; + unset($obj); + $obj->type = $val->column_type; + $obj->name = $val->column_name; + $obj->lang = $val->column_title; + if($logged_info->is_admin != 'Y') $obj->required = $val->required=='Y'?true:false; + else $obj->required = false; + $filter_output[] = $obj; + + unset($open_obj); + $open_obj->name = 'open_'.$val->column_name; + $open_obj->required = false; + $filter_output[] = $open_obj; + + } + return $filter_output; + + } + + // 결과 리턴 + return $this->join_form_list; + } + + /** + * @brief 추가 회원가입폼과 특정 회원의 정보를 조합 (회원정보 수정등에 사용) + **/ + function getCombineJoinForm($member_info) { + $extend_form_list = $this->getJoinFormlist(); + if(!$extend_form_list) return; + + // 관리자이거나 자기 자신이 아니면 비공개의 경우 무조건 패스해버림 + $logged_info = Context::get('logged_info'); + + foreach($extend_form_list as $srl => $item) { + $column_name = $item->column_name; + $value = $member_info->{$column_name}; + + if($logged_info->is_admin != 'Y' && $logged_info->member_srl != $member_info->member_srl && $member_info->{'open_'.$column_name}!='Y') { + $extend_form_list[$srl]->is_private = true; + continue; + } + + // 추가 확장폼의 종류에 따라 값을 변경 + switch($item->column_type) { + case 'checkbox' : + if($value && !is_array($value)) $value = array($value); + break; + case 'text' : + case 'homepage' : + case 'email_address' : + case 'tel' : + case 'textarea' : + case 'select' : + case 'kr_zip' : + break; + } + + $extend_form_list[$srl]->value = $value; + + if($member_info->{'open_'.$column_name}=='Y') $extend_form_list[$srl]->is_opened = true; + else $extend_form_list[$srl]->is_opened = false; + } + return $extend_form_list; + } + + /** + * @brief 한개의 가입항목을 가져옴 + **/ + function getJoinForm($member_join_form_srl) { + $args->member_join_form_srl = $member_join_form_srl; + $output = executeQuery('member.getJoinForm', $args); + $join_form = $output->data; + if(!$join_form) return NULL; + + $column_type = $join_form->column_type; + $default_value = $join_form->default_value; + + if(in_array($column_type, array('checkbox','select','radio'))) { + $join_form->default_value = unserialize($default_value); + } else { + $join_form->default_value = ''; + } + + return $join_form; + } + + /** + * @brief 금지 아이디 목록 가져오기 + **/ + function getDeniedIDList() { + if(!$this->denied_id_list) { + $args->sort_index = "list_order"; + $args->page = Context::get('page'); + $args->list_count = 40; + $args->page_count = 10; + + $output = executeQuery('member.getDeniedIDList', $args); + $this->denied_id_list = $output; + } + return $this->denied_id_list; + } + + /** + * @brief 금지 아이디인지 확인 + **/ + function isDeniedID($user_id) { + $args->user_id = $user_id; + $output = executeQuery('member.chkDeniedID', $args); + if($output->data->count) return true; + return false; + } + + /** + * @brief 프로필 이미지의 정보를 구함 + **/ + function getProfileImage($member_srl) { + if(!isset($GLOBALS['__member_info__']['profile_image'][$member_srl])) { + $GLOBALS['__member_info__']['profile_image'][$member_srl] = null; + $exts = array('gif','jpg','png'); + for($i=0;$i<3;$i++) { + $image_name_file = sprintf('files/member_extra_info/profile_image/%s%d.%s', getNumberingPath($member_srl), $member_srl, $exts[$i]); + if(file_exists($image_name_file)) { + list($width, $height, $type, $attrs) = getimagesize($image_name_file); + $info = null; + $info->width = $width; + $info->height = $height; + $info->src = Context::getRequestUri().$image_name_file; + $info->file = './'.$image_name_file; + $GLOBALS['__member_info__']['profile_image'][$member_srl] = $info; + break; + } + } + } + + return $GLOBALS['__member_info__']['profile_image'][$member_srl]; + } + + /** + * @brief 이미지이름의 정보를 구함 + **/ + function getImageName($member_srl) { + if(!isset($GLOBALS['__member_info__']['image_name'][$member_srl])) { + $image_name_file = sprintf('files/member_extra_info/image_name/%s%d.gif', getNumberingPath($member_srl), $member_srl); + if(file_exists($image_name_file)) { + list($width, $height, $type, $attrs) = getimagesize($image_name_file); + $info->width = $width; + $info->height = $height; + $info->src = Context::getRequestUri().$image_name_file; + $info->file = './'.$image_name_file; + $GLOBALS['__member_info__']['image_name'][$member_srl] = $info; + } else $GLOBALS['__member_info__']['image_name'][$member_srl] = null; + } + return $GLOBALS['__member_info__']['image_name'][$member_srl]; + } + + /** + * @brief 이미지마크의 정보를 구함 + **/ + function getImageMark($member_srl) { + if(!isset($GLOBALS['__member_info__']['image_mark'][$member_srl])) { + $image_mark_file = sprintf('files/member_extra_info/image_mark/%s%d.gif', getNumberingPath($member_srl), $member_srl); + if(file_exists($image_mark_file)) { + list($width, $height, $type, $attrs) = getimagesize($image_mark_file); + $info->width = $width; + $info->height = $height; + $info->src = Context::getRequestUri().$image_mark_file; + $info->file = './'.$image_mark_file; + $GLOBALS['__member_info__']['image_mark'][$member_srl] = $info; + } else $GLOBALS['__member_info__']['image_mark'][$member_srl] = null; + } + + return $GLOBALS['__member_info__']['image_mark'][$member_srl]; + } + + + /** + * @brief group의 이미지마크 정보를 구함 + **/ + function getGroupImageMark($member_srl,$site_srl=0) { + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('member'); + if($config->group_image_mark!='Y'){ + return null; + } + $member_group = $this->getMemberGroups($member_srl,$site_srl); + + $groups_info = $this->getGroups($site_srl); + $image_mark = null; + if(count($member_group) > 0 && is_array($member_group)){ + $group_srl = array_keys($member_group); + $image_mark = $groups_info[$group_srl[0]]->image_mark; + } + if($image_mark){ +// list($width, $height, $type, $attrs) = getimagesize($image_mark); +// $info->width = $width; +// $info->height = $height; + $info->src = $image_mark; + return $info; + + }else return false; + } + + /** + * @brief 사용자의 signature를 구함 + **/ + function getSignature($member_srl) { + if(!isset($GLOBALS['__member_info__']['signature'][$member_srl])) { + $filename = sprintf('files/member_extra_info/signature/%s%d.signature.php', getNumberingPath($member_srl), $member_srl); + if(file_exists($filename)) { + $buff = FileHandler::readFile($filename); + $signature = trim(substr($buff, 40)); + $GLOBALS['__member_info__']['signature'][$member_srl] = $signature; + } else $GLOBALS['__member_info__']['signature'][$member_srl] = null; + } + return $GLOBALS['__member_info__']['signature'][$member_srl]; + } + + /** + * @brief 입력된 plain text 비밀번호와 DB에 저장된 비밀번호와의 비교 + **/ + function isValidPassword($hashed_password, $password_text) { + // 입력된 비밀번호가 없으면 무조건 falase + if(!$password_text) return false; + + // md5 해쉬된값가 맞으면 return true + if($hashed_password == md5($password_text)) return true; + + // mysql_pre4_hash_password함수의 값과 동일하면 return true + if(mysql_pre4_hash_password($password_text) == $hashed_password) return true; + + // 현재 DB에서 mysql DB를 이용시 직접 old_password를 이용하여 검사하고 맞으면 비밀번호를 변경 + if(substr(Context::getDBType(),0,5)=='mysql') { + $oDB = &DB::getInstance(); + if($oDB->isValidOldPassword($password_text, $hashed_password)) return true; + } + + return false; + } + + /** + * @brief 멤버와 연결된 오픈아이디들을 모두 리턴한다. + **/ + function getMemberOpenIDByMemberSrl($member_srl) { + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('member'); + + $result = array(); + if ($config->enable_openid != 'Y') return $result; + + $args->member_srl = $member_srl; + $output = executeQuery('member.getMemberOpenIDByMemberSrl', $args); + + if (!$output->data) { + } + else if (is_array($output->data)) { + foreach($output->data as $row) { + $result[] = $row; + } + } + else { + $result[] = $output->data; + } + + foreach($result as $row) { + $openid = $row->openid; + $bookmarklet_header = "javascript:var%20U='"; + $bookmarklet_footer = "';function%20Z(W){var%20X=/(openid|ident)/i;try{var%20F=W.frames;var%20E=W.document.getElementsByTagName('input');for(var%20i=0;ibookmarklet = $bookmarklet_header . $openid . $bookmarklet_footer; + } + + return $result; + } + + /** + * @brief 오픈아이디에 연결된 멤버를 리턴한다. + **/ + function getMemberSrlByOpenID($openid) { + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('member'); + + if ($config->enable_openid != 'Y') return $result; + + $args->member_srl = $member_srl; + $output = executeQuery('member.getMemberSrlByOpenID', $args); + + if (!$output->data) return null; + return $output->data->member_srl; + } + + } +?> diff --git a/modules/member/member.view.php b/modules/member/member.view.php index 04d835635..4b9cf74f3 100644 --- a/modules/member/member.view.php +++ b/modules/member/member.view.php @@ -1,357 +1,357 @@ -member_config = $oModuleModel->getModuleConfig('member'); - if(!$this->member_config->skin) $this->member_config->skin = "default"; - if(!$this->member_config->colorset) $this->member_config->colorset = "white"; - - Context::set('member_config', $this->member_config); - $skin = $this->member_config->skin; - - // template path 지정 - $tpl_path = sprintf('%sskins/%s', $this->module_path, $skin); - if(!is_dir($tpl_path)) $tpl_path = sprintf('%sskins/%s', $this->module_path, 'default'); - $this->setTemplatePath($tpl_path); - } - - /** - * @brief 회원 정보 출력 - **/ - function dispMemberInfo() { - $oMemberModel = &getModel('member'); - $logged_info = Context::get('logged_info'); - - // 비회원일 경우 정보 열람 중지 - if(!$logged_info->member_srl) return $this->stop('msg_not_permitted'); - - $member_srl = Context::get('member_srl'); - if(!$member_srl && Context::get('is_logged')) { - $member_srl = $logged_info->member_srl; - } elseif(!$member_srl) { - return $this->dispMemberSignUpForm(); - } - - $site_module_info = Context::get('site_module_info'); - $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl, $site_module_info->site_srl); - unset($member_info->password); - unset($member_info->email_id); - unset($member_info->email_host); - unset($member_info->email_address); - - if(!$member_info->member_srl) return $this->dispMemberSignUpForm(); - - Context::set('member_info', $member_info); - Context::set('extend_form_list', $oMemberModel->getCombineJoinForm($member_info)); - if ($member_info->member_srl == $logged_info->member_srl) - Context::set('openids', $oMemberModel->getMemberOpenIDByMemberSrl($member_srl)); - - $this->setTemplateFile('member_info'); - } - - /** - * @brief 회원 가입 폼 출력 - **/ - function dispMemberSignUpForm() { - $oMemberModel = &getModel('member'); - - // 로그인한 회원일 경우 해당 회원의 정보를 받음 - if($oMemberModel->isLogged()) return $this->stop('msg_already_logged'); - - // before 트리거 호출 - $trigger_output = ModuleHandler::triggerCall('member.dispMemberSignUpForm', 'before', $this->member_config); - if(!$trigger_output->toBool()) return $trigger_output; - - // 회원가입을 중지시켰을 때는 에러 표시 - if($this->member_config->enable_join != 'Y') return $this->stop('msg_signup_disabled'); - Context::set('extend_form_list', $oMemberModel->getCombineJoinForm($member_info)); - - $member_config = $oMemberModel->getMemberConfig(); - Context::set('member_config', $member_config); - - // 템플릿 파일 지정 - $this->setTemplateFile('signup_form'); - } - - /** - * @brief 회원 정보 수정 - **/ - function dispMemberModifyInfo() { - $oMemberModel = &getModel('member'); - $oModuleModel = &getModel('module'); - $memberModuleConfig = $oModuleModel->getModuleConfig('member'); - - // 로그인 되어 있지 않을 경우 로그인 되어 있지 않다는 메세지 출력 - if(!$oMemberModel->isLogged()) return $this->stop('msg_not_logged'); - - $logged_info = Context::get('logged_info'); - $member_srl = $logged_info->member_srl; - - $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); - $member_info->signature = $oMemberModel->getSignature($member_srl); - Context::set('member_info',$member_info); - - // 추가 가입폼 목록을 받음 - Context::set('extend_form_list', $oMemberModel->getCombineJoinForm($member_info)); - - Context::set('openids', $oMemberModel->getMemberOpenIDByMemberSrl($member_srl)); - - // 에디터 모듈의 getEditor를 호출하여 서명용으로 세팅 - if($member_info->member_srl) { - $oEditorModel = &getModel('editor'); - $option->primary_key_name = 'member_srl'; - $option->content_key_name = 'signature'; - $option->allow_fileupload = false; - $option->enable_autosave = false; - $option->enable_default_component = true; - $option->enable_component = false; - $option->resizable = false; - $option->disable_html = true; - $option->height = 200; - $option->skin = $this->member_config->editor_skin; - $option->colorset = $this->member_config->editor_colorset; - $editor = $oEditorModel->getEditor($member_info->member_srl, $option); - Context::set('editor', $editor); - } - - // 템플릿 파일 지정 - $this->setTemplateFile('modify_info'); - } - - - /** - * @brief 회원 작성글 보기 - **/ - function dispMemberOwnDocument() { - $oMemberModel = &getModel('member'); - - // 로그인 되어 있지 않을 경우 로그인 되어 있지 않다는 메세지 출력 - if(!$oMemberModel->isLogged()) return $this->stop('msg_not_logged'); - - $logged_info = Context::get('logged_info'); - $member_srl = $logged_info->member_srl; - - $module_srl = Context::get('module_srl'); - Context::set('module_srl',Context::get('selected_module_srl')); - Context::set('search_target','member_srl'); - Context::set('search_keyword',$member_srl); - - $oDocumentAdminView = &getAdminView('document'); - $oDocumentAdminView->dispDocumentAdminList(); - - Context::set('module_srl', $module_srl); - $this->setTemplateFile('document_list'); - } - - /** - * @brief 회원 스크랩 게시물 보기 - **/ - function dispMemberScrappedDocument() { - $oMemberModel = &getModel('member'); - - // 로그인 되어 있지 않을 경우 로그인 되어 있지 않다는 메세지 출력 - if(!$oMemberModel->isLogged()) return $this->stop('msg_not_logged'); - - $logged_info = Context::get('logged_info'); - $args->member_srl = $logged_info->member_srl; - $args->page = (int)Context::get('page'); - - $output = executeQuery('member.getScrapDocumentList', $args); - Context::set('total_count', $output->total_count); - Context::set('total_page', $output->total_page); - Context::set('page', $output->page); - Context::set('document_list', $output->data); - Context::set('page_navigation', $output->page_navigation); - - $this->setTemplateFile('scrapped_list'); - } - - /** - * @brief 회원의 저장함 보기 - **/ - function dispMemberSavedDocument() { - $oMemberModel = &getModel('member'); - - // 로그인 되어 있지 않을 경우 로그인 되어 있지 않다는 메세지 출력 - if(!$oMemberModel->isLogged()) return $this->stop('msg_not_logged'); - - // 저장함에 보관된 글을 가져옴 (저장함은 module_srl이 member_srl로 세팅되어 있음) - $logged_info = Context::get('logged_info'); - $args->module_srl = $logged_info->member_srl; - $args->page = (int)Context::get('page'); - - $oDocumentModel = &getModel('document'); - $output = $oDocumentModel->getDocumentList($args, true); - Context::set('total_count', $output->total_count); - Context::set('total_page', $output->total_page); - Context::set('page', $output->page); - Context::set('document_list', $output->data); - Context::set('page_navigation', $output->page_navigation); - - $this->setTemplateFile('saved_list'); - } - - /** - * @brief 로그인 폼 출력 - **/ - function dispMemberLoginForm() { - if(Context::get('is_logged')) { - Context::set('redirect_url', getUrl('act','')); - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('redirect.html'); - return; - } - - // 템플릿 파일 지정 - Context::set('referer_url', $_SERVER['HTTP_REFERER']); - $this->setTemplateFile('login_form'); - } - - /** - * @brief 회원 비밀번호 수정 - **/ - function dispMemberModifyPassword() { - $oMemberModel = &getModel('member'); - - // 로그인 되어 있지 않을 경우 로그인 되어 있지 않다는 메세지 출력 - if(!$oMemberModel->isLogged()) return $this->stop('msg_not_logged'); - - $logged_info = Context::get('logged_info'); - $member_srl = $logged_info->member_srl; - - $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); - Context::set('member_info',$member_info); - - // 템플릿 파일 지정 - $this->setTemplateFile('modify_password'); - } - - /** - * @brief 탈퇴 화면 - **/ - function dispMemberLeave() { - $oMemberModel = &getModel('member'); - - // 로그인 되어 있지 않을 경우 로그인 되어 있지 않다는 메세지 출력 - if(!$oMemberModel->isLogged()) return $this->stop('msg_not_logged'); - - $logged_info = Context::get('logged_info'); - $member_srl = $logged_info->member_srl; - - $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); - Context::set('member_info',$member_info); - - // 템플릿 파일 지정 - $this->setTemplateFile('leave_form'); - } - - /** - * @brief 오픈 아이디 탈퇴 화면 - **/ - function dispMemberOpenIDLeave() { - $oMemberModel = &getModel('member'); - - // 로그인 되어 있지 않을 경우 로그인 되어 있지 않다는 메세지 출력 - if(!$oMemberModel->isLogged()) return $this->stop('msg_not_logged'); - - $logged_info = Context::get('logged_info'); - $member_srl = $logged_info->member_srl; - - $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); - Context::set('member_info',$member_info); - - // 템플릿 파일 지정 - $this->setTemplateFile('openid_leave_form'); - } - - /** - * @brief 로그아웃 출력 - **/ - function dispMemberLogout() { - $oMemberController = &getController('member'); - $oMemberController->procMemberLogout(); - - Context::set('layout','none'); - $this->setTemplatePath($this->module_path.'/tpl'); - $this->setTemplateFile('logout'); - } - - /** - * @brief 저장된 글 목록을 보여줌 - **/ - function dispSavedDocumentList() { - $this->setLayoutFile('popup_layout'); - - $oMemberModel = &getModel('member'); - - // 로그인 되어 있지 않을 경우 로그인 되어 있지 않다는 메세지 출력 - if(!$oMemberModel->isLogged()) return $this->stop('msg_not_logged'); - - // 저장함에 보관된 글을 가져옴 (저장함은 module_srl이 member_srl로 세팅되어 있음) - $logged_info = Context::get('logged_info'); - $args->module_srl = $logged_info->member_srl; - $args->page = (int)Context::get('page'); - $args->list_count = 10; - - $oDocumentModel = &getModel('document'); - $output = $oDocumentModel->getDocumentList($args, true); - Context::set('total_count', $output->total_count); - Context::set('total_page', $output->total_page); - Context::set('page', $output->page); - Context::set('document_list', $output->data); - Context::set('page_navigation', $output->page_navigation); - - $this->setTemplateFile('saved_list_popup'); - } - - /** - * @brief 아이디/ 비밀번호 찾기 기능 - **/ - function dispMemberFindAccount() { - if(Context::get('is_logged')) return $this->stop('already_logged'); - - $this->setTemplateFile('find_member_account'); - } - - /** - * @brief 임시 비밀번호 발급 - **/ - function dispMemberGetTempPassword() { - if(Context::get('is_logged')) return $this->stop('already_logged'); - - $user_id = Context::get('user_id'); - $temp_password = $_SESSION['xe_temp_password_'.$user_id]; - unset($_SESSION['xe_temp_password_'.$user_id]); - - if(!$user_id||!$temp_password) return new Object(-1,'msg_invaild_request'); - - Context::set('temp_password', $temp_password); - - $this->setTemplateFile('find_temp_password'); - } - - /** - * @brief 인증 메일 재발송 페이지 - **/ - function dispMemberResendAuthMail() { - if(Context::get('is_logged')) return $this->stop('already_logged'); - - $this->setTemplateFile('resend_auth_mail'); - } - } -?> +member_config = $oModuleModel->getModuleConfig('member'); + if(!$this->member_config->skin) $this->member_config->skin = "default"; + if(!$this->member_config->colorset) $this->member_config->colorset = "white"; + + Context::set('member_config', $this->member_config); + $skin = $this->member_config->skin; + + // template path 지정 + $tpl_path = sprintf('%sskins/%s', $this->module_path, $skin); + if(!is_dir($tpl_path)) $tpl_path = sprintf('%sskins/%s', $this->module_path, 'default'); + $this->setTemplatePath($tpl_path); + } + + /** + * @brief 회원 정보 출력 + **/ + function dispMemberInfo() { + $oMemberModel = &getModel('member'); + $logged_info = Context::get('logged_info'); + + // 비회원일 경우 정보 열람 중지 + if(!$logged_info->member_srl) return $this->stop('msg_not_permitted'); + + $member_srl = Context::get('member_srl'); + if(!$member_srl && Context::get('is_logged')) { + $member_srl = $logged_info->member_srl; + } elseif(!$member_srl) { + return $this->dispMemberSignUpForm(); + } + + $site_module_info = Context::get('site_module_info'); + $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl, $site_module_info->site_srl); + unset($member_info->password); + unset($member_info->email_id); + unset($member_info->email_host); + unset($member_info->email_address); + + if(!$member_info->member_srl) return $this->dispMemberSignUpForm(); + + Context::set('member_info', $member_info); + Context::set('extend_form_list', $oMemberModel->getCombineJoinForm($member_info)); + if ($member_info->member_srl == $logged_info->member_srl) + Context::set('openids', $oMemberModel->getMemberOpenIDByMemberSrl($member_srl)); + + $this->setTemplateFile('member_info'); + } + + /** + * @brief 회원 가입 폼 출력 + **/ + function dispMemberSignUpForm() { + $oMemberModel = &getModel('member'); + + // 로그인한 회원일 경우 해당 회원의 정보를 받음 + if($oMemberModel->isLogged()) return $this->stop('msg_already_logged'); + + // before 트리거 호출 + $trigger_output = ModuleHandler::triggerCall('member.dispMemberSignUpForm', 'before', $this->member_config); + if(!$trigger_output->toBool()) return $trigger_output; + + // 회원가입을 중지시켰을 때는 에러 표시 + if($this->member_config->enable_join != 'Y') return $this->stop('msg_signup_disabled'); + Context::set('extend_form_list', $oMemberModel->getCombineJoinForm($member_info)); + + $member_config = $oMemberModel->getMemberConfig(); + Context::set('member_config', $member_config); + + // 템플릿 파일 지정 + $this->setTemplateFile('signup_form'); + } + + /** + * @brief 회원 정보 수정 + **/ + function dispMemberModifyInfo() { + $oMemberModel = &getModel('member'); + $oModuleModel = &getModel('module'); + $memberModuleConfig = $oModuleModel->getModuleConfig('member'); + + // 로그인 되어 있지 않을 경우 로그인 되어 있지 않다는 메세지 출력 + if(!$oMemberModel->isLogged()) return $this->stop('msg_not_logged'); + + $logged_info = Context::get('logged_info'); + $member_srl = $logged_info->member_srl; + + $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); + $member_info->signature = $oMemberModel->getSignature($member_srl); + Context::set('member_info',$member_info); + + // 추가 가입폼 목록을 받음 + Context::set('extend_form_list', $oMemberModel->getCombineJoinForm($member_info)); + + Context::set('openids', $oMemberModel->getMemberOpenIDByMemberSrl($member_srl)); + + // 에디터 모듈의 getEditor를 호출하여 서명용으로 세팅 + if($member_info->member_srl) { + $oEditorModel = &getModel('editor'); + $option->primary_key_name = 'member_srl'; + $option->content_key_name = 'signature'; + $option->allow_fileupload = false; + $option->enable_autosave = false; + $option->enable_default_component = true; + $option->enable_component = false; + $option->resizable = false; + $option->disable_html = true; + $option->height = 200; + $option->skin = $this->member_config->editor_skin; + $option->colorset = $this->member_config->editor_colorset; + $editor = $oEditorModel->getEditor($member_info->member_srl, $option); + Context::set('editor', $editor); + } + + // 템플릿 파일 지정 + $this->setTemplateFile('modify_info'); + } + + + /** + * @brief 회원 작성글 보기 + **/ + function dispMemberOwnDocument() { + $oMemberModel = &getModel('member'); + + // 로그인 되어 있지 않을 경우 로그인 되어 있지 않다는 메세지 출력 + if(!$oMemberModel->isLogged()) return $this->stop('msg_not_logged'); + + $logged_info = Context::get('logged_info'); + $member_srl = $logged_info->member_srl; + + $module_srl = Context::get('module_srl'); + Context::set('module_srl',Context::get('selected_module_srl')); + Context::set('search_target','member_srl'); + Context::set('search_keyword',$member_srl); + + $oDocumentAdminView = &getAdminView('document'); + $oDocumentAdminView->dispDocumentAdminList(); + + Context::set('module_srl', $module_srl); + $this->setTemplateFile('document_list'); + } + + /** + * @brief 회원 스크랩 게시물 보기 + **/ + function dispMemberScrappedDocument() { + $oMemberModel = &getModel('member'); + + // 로그인 되어 있지 않을 경우 로그인 되어 있지 않다는 메세지 출력 + if(!$oMemberModel->isLogged()) return $this->stop('msg_not_logged'); + + $logged_info = Context::get('logged_info'); + $args->member_srl = $logged_info->member_srl; + $args->page = (int)Context::get('page'); + + $output = executeQuery('member.getScrapDocumentList', $args); + Context::set('total_count', $output->total_count); + Context::set('total_page', $output->total_page); + Context::set('page', $output->page); + Context::set('document_list', $output->data); + Context::set('page_navigation', $output->page_navigation); + + $this->setTemplateFile('scrapped_list'); + } + + /** + * @brief 회원의 저장함 보기 + **/ + function dispMemberSavedDocument() { + $oMemberModel = &getModel('member'); + + // 로그인 되어 있지 않을 경우 로그인 되어 있지 않다는 메세지 출력 + if(!$oMemberModel->isLogged()) return $this->stop('msg_not_logged'); + + // 저장함에 보관된 글을 가져옴 (저장함은 module_srl이 member_srl로 세팅되어 있음) + $logged_info = Context::get('logged_info'); + $args->module_srl = $logged_info->member_srl; + $args->page = (int)Context::get('page'); + + $oDocumentModel = &getModel('document'); + $output = $oDocumentModel->getDocumentList($args, true); + Context::set('total_count', $output->total_count); + Context::set('total_page', $output->total_page); + Context::set('page', $output->page); + Context::set('document_list', $output->data); + Context::set('page_navigation', $output->page_navigation); + + $this->setTemplateFile('saved_list'); + } + + /** + * @brief 로그인 폼 출력 + **/ + function dispMemberLoginForm() { + if(Context::get('is_logged')) { + Context::set('redirect_url', getUrl('act','')); + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('redirect.html'); + return; + } + + // 템플릿 파일 지정 + Context::set('referer_url', $_SERVER['HTTP_REFERER']); + $this->setTemplateFile('login_form'); + } + + /** + * @brief 회원 비밀번호 수정 + **/ + function dispMemberModifyPassword() { + $oMemberModel = &getModel('member'); + + // 로그인 되어 있지 않을 경우 로그인 되어 있지 않다는 메세지 출력 + if(!$oMemberModel->isLogged()) return $this->stop('msg_not_logged'); + + $logged_info = Context::get('logged_info'); + $member_srl = $logged_info->member_srl; + + $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); + Context::set('member_info',$member_info); + + // 템플릿 파일 지정 + $this->setTemplateFile('modify_password'); + } + + /** + * @brief 탈퇴 화면 + **/ + function dispMemberLeave() { + $oMemberModel = &getModel('member'); + + // 로그인 되어 있지 않을 경우 로그인 되어 있지 않다는 메세지 출력 + if(!$oMemberModel->isLogged()) return $this->stop('msg_not_logged'); + + $logged_info = Context::get('logged_info'); + $member_srl = $logged_info->member_srl; + + $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); + Context::set('member_info',$member_info); + + // 템플릿 파일 지정 + $this->setTemplateFile('leave_form'); + } + + /** + * @brief 오픈 아이디 탈퇴 화면 + **/ + function dispMemberOpenIDLeave() { + $oMemberModel = &getModel('member'); + + // 로그인 되어 있지 않을 경우 로그인 되어 있지 않다는 메세지 출력 + if(!$oMemberModel->isLogged()) return $this->stop('msg_not_logged'); + + $logged_info = Context::get('logged_info'); + $member_srl = $logged_info->member_srl; + + $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); + Context::set('member_info',$member_info); + + // 템플릿 파일 지정 + $this->setTemplateFile('openid_leave_form'); + } + + /** + * @brief 로그아웃 출력 + **/ + function dispMemberLogout() { + $oMemberController = &getController('member'); + $oMemberController->procMemberLogout(); + + Context::set('layout','none'); + $this->setTemplatePath($this->module_path.'/tpl'); + $this->setTemplateFile('logout'); + } + + /** + * @brief 저장된 글 목록을 보여줌 + **/ + function dispSavedDocumentList() { + $this->setLayoutFile('popup_layout'); + + $oMemberModel = &getModel('member'); + + // 로그인 되어 있지 않을 경우 로그인 되어 있지 않다는 메세지 출력 + if(!$oMemberModel->isLogged()) return $this->stop('msg_not_logged'); + + // 저장함에 보관된 글을 가져옴 (저장함은 module_srl이 member_srl로 세팅되어 있음) + $logged_info = Context::get('logged_info'); + $args->module_srl = $logged_info->member_srl; + $args->page = (int)Context::get('page'); + $args->list_count = 10; + + $oDocumentModel = &getModel('document'); + $output = $oDocumentModel->getDocumentList($args, true); + Context::set('total_count', $output->total_count); + Context::set('total_page', $output->total_page); + Context::set('page', $output->page); + Context::set('document_list', $output->data); + Context::set('page_navigation', $output->page_navigation); + + $this->setTemplateFile('saved_list_popup'); + } + + /** + * @brief 아이디/ 비밀번호 찾기 기능 + **/ + function dispMemberFindAccount() { + if(Context::get('is_logged')) return $this->stop('already_logged'); + + $this->setTemplateFile('find_member_account'); + } + + /** + * @brief 임시 비밀번호 발급 + **/ + function dispMemberGetTempPassword() { + if(Context::get('is_logged')) return $this->stop('already_logged'); + + $user_id = Context::get('user_id'); + $temp_password = $_SESSION['xe_temp_password_'.$user_id]; + unset($_SESSION['xe_temp_password_'.$user_id]); + + if(!$user_id||!$temp_password) return new Object(-1,'msg_invaild_request'); + + Context::set('temp_password', $temp_password); + + $this->setTemplateFile('find_temp_password'); + } + + /** + * @brief 인증 메일 재발송 페이지 + **/ + function dispMemberResendAuthMail() { + if(Context::get('is_logged')) return $this->stop('already_logged'); + + $this->setTemplateFile('resend_auth_mail'); + } + } +?> diff --git a/modules/member/skins/default/document_list.html b/modules/member/skins/default/document_list.html index 29f6639aa..e82bdebd1 100644 --- a/modules/member/skins/default/document_list.html +++ b/modules/member/skins/default/document_list.html @@ -1,63 +1,63 @@ - - -

    {$member_title = $lang->cmd_view_own_document }

    - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    Total : {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
    {$lang->no}
    {$lang->title}
    {$lang->readed_count}
    {$lang->voted_count}
    {$lang->date}
    {$no} - {$oDocument->getTitleText()} - - [{$oDocument->getCommentCount()}] - - - - [{$oDocument->getTrackbackCount()}] - - {$oDocument->get('readed_count')}{$oDocument->get('voted_count')}{$oDocument->getRegdate("Y-m-d")}
    - {$lang->cmd_back} -
    - - -

    - - + + +

    {$member_title = $lang->cmd_view_own_document }

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Total : {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
    {$lang->no}
    {$lang->title}
    {$lang->readed_count}
    {$lang->voted_count}
    {$lang->date}
    {$no} + {$oDocument->getTitleText()} + + [{$oDocument->getCommentCount()}] + + + + [{$oDocument->getTrackbackCount()}] + + {$oDocument->get('readed_count')}{$oDocument->get('voted_count')}{$oDocument->getRegdate("Y-m-d")}
    + {$lang->cmd_back} +
    + + + + + diff --git a/modules/member/skins/default/saved_list.html b/modules/member/skins/default/saved_list.html index 1f1dc08ce..6943c2adf 100644 --- a/modules/member/skins/default/saved_list.html +++ b/modules/member/skins/default/saved_list.html @@ -1,46 +1,46 @@ - - -

    {$member_title = $lang->cmd_view_saved_document}

    - - - - - - - - - - - - - - - - - - - - - - -
    Total : {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
    {$lang->date}
    {$lang->title}
    {$lang->cmd_delete}
    {$val->getRegdate("Y-m-d H:i:s")} - - - {$lang->cmd_delete}
    - {$lang->cmd_back} -
    - - - - - + + +

    {$member_title = $lang->cmd_view_saved_document}

    + + + + + + + + + + + + + + + + + + + + + + +
    Total : {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
    {$lang->date}
    {$lang->title}
    {$lang->cmd_delete}
    {$val->getRegdate("Y-m-d H:i:s")} + + + {$lang->cmd_delete}
    + {$lang->cmd_back} +
    + + + + + diff --git a/modules/member/skins/default/saved_list_popup.html b/modules/member/skins/default/saved_list_popup.html index 7743f6cd3..e791907ed 100644 --- a/modules/member/skins/default/saved_list_popup.html +++ b/modules/member/skins/default/saved_list_popup.html @@ -1,49 +1,49 @@ - - -
    - -
    -

    {$lang->cmd_view_saved_document}

    -
    - -
    -
    - - - - - - - - - - - - - - - - - - - -
    Total : {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
    {$lang->date}
    {$lang->title}
    {$lang->cmd_select}
    {$val->getRegdate("Y-m-d H:i:s")} - - - {$lang->cmd_select}
    - - - -
    -
    -
    + + +
    + +
    +

    {$lang->cmd_view_saved_document}

    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + +
    Total : {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
    {$lang->date}
    {$lang->title}
    {$lang->cmd_select}
    {$val->getRegdate("Y-m-d H:i:s")} + + + {$lang->cmd_select}
    + + + +
    +
    +
    diff --git a/modules/member/skins/default/scrapped_list.html b/modules/member/skins/default/scrapped_list.html index b20740f10..447067581 100644 --- a/modules/member/skins/default/scrapped_list.html +++ b/modules/member/skins/default/scrapped_list.html @@ -1,48 +1,48 @@ - - -

    {$member_title = $lang->cmd_view_scrapped_document}

    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Total : {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
    {$lang->no}
    {$lang->title}
    {$lang->writer}
    {$lang->date}
    {$lang->cmd_delete}
    {$no}{htmlspecialchars($val->title)}
    {$val->nick_name}
    {zdate($val->regdate, "Y-m-d H:i")}{$lang->cmd_delete}
    - {$lang->cmd_back} -
    - - - - - + + +

    {$member_title = $lang->cmd_view_scrapped_document}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Total : {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
    {$lang->no}
    {$lang->title}
    {$lang->writer}
    {$lang->date}
    {$lang->cmd_delete}
    {$no}{htmlspecialchars($val->title)}
    {$val->nick_name}
    {zdate($val->regdate, "Y-m-d H:i")}{$lang->cmd_delete}
    + {$lang->cmd_back} +
    + + + + + diff --git a/modules/member/skins/default/skin.xml b/modules/member/skins/default/skin.xml index 6142202c1..a3cf54203 100644 --- a/modules/member/skins/default/skin.xml +++ b/modules/member/skins/default/skin.xml @@ -1,76 +1,76 @@ - - - 회원 기본 스킨 - 会员模块默认皮肤 - 会員デフォルトスキン - Default Member Skin - Giao diện thành viên mặc định - Por defecto miembro piel - По умолчанию членом кожи - 會員模組預設面板 - Varsayılan Kullanıcı Dış Görünümü - - 회원모듈의 default스킨 - NHN (developers@xpressengine.com) - - - 会员模块的默认皮肤。 - NHN (developers@xpressengine.com) - - - 会員モジュールのデフォルトスキン - NHN (developers@xpressengine.com) - - - default skin of member module - NHN (developers@xpressengine.com) - - - Giao diện mặc định của Module Thành viên - NHN (developers@xpressengine.com) - - - Por defecto de la piel miembro módulo - NHN (developers@xpressengine.com) - - - умолчанию кожу члена модуль - NHN (developers@xpressengine.com) - - - 會員模組預設面板。 - NHN (developers@xpressengine.com) - - - Üye modülünün varsayılan dış görünümü - NHN (developers@xpressengine.com) - - 0.1 - 2007-02-28 - - - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - - - - - 기본 - 默认 - デフォルト - default - Mặc định - Por defecto - умолчанию - 預設 - varsayılan - - - + + + 회원 기본 스킨 + 会员模块默认皮肤 + 会員デフォルトスキン + Default Member Skin + Giao diện thành viên mặc định + Por defecto miembro piel + По умолчанию членом кожи + 會員模組預設面板 + Varsayılan Kullanıcı Dış Görünümü + + 회원모듈의 default스킨 + NHN (developers@xpressengine.com) + + + 会员模块的默认皮肤。 + NHN (developers@xpressengine.com) + + + 会員モジュールのデフォルトスキン + NHN (developers@xpressengine.com) + + + default skin of member module + NHN (developers@xpressengine.com) + + + Giao diện mặc định của Module Thành viên + NHN (developers@xpressengine.com) + + + Por defecto de la piel miembro módulo + NHN (developers@xpressengine.com) + + + умолчанию кожу члена модуль + NHN (developers@xpressengine.com) + + + 會員模組預設面板。 + NHN (developers@xpressengine.com) + + + Üye modülünün varsayılan dış görünümü + NHN (developers@xpressengine.com) + + 0.1 + 2007-02-28 + + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + + + + 기본 + 默认 + デフォルト + default + Mặc định + Por defecto + умолчанию + 預設 + varsayılan + + + diff --git a/modules/member/tpl/denied_id_list.html b/modules/member/tpl/denied_id_list.html index 2f91e3c6b..ceea725dd 100644 --- a/modules/member/tpl/denied_id_list.html +++ b/modules/member/tpl/denied_id_list.html @@ -1,70 +1,70 @@ - - - - - -
    - - -
    - - - - - - - - - - - - - - - - - - - - - - - -
    {$lang->no}
    {$lang->user_id}
    {$lang->description}
    {$lang->regdate}
     
    {$no}{$val->user_id}{$val->description} {zdate($val->regdate,"Y-m-d")}{$lang->cmd_delete}
    - - - - - -
    - - -
    - - - - - - - - - - - - -
    {$lang->user_id}
    {$lang->description}
    - -
    -
    - -
    + + + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    {$lang->no}
    {$lang->user_id}
    {$lang->description}
    {$lang->regdate}
     
    {$no}{$val->user_id}{$val->description} {zdate($val->regdate,"Y-m-d")}{$lang->cmd_delete}
    + + + + + +
    + + +
    + + + + + + + + + + + + +
    {$lang->user_id}
    {$lang->description}
    + +
    +
    + +
    diff --git a/modules/member/tpl/js/signup_check.js b/modules/member/tpl/js/signup_check.js index 78dac67f7..77116ddb4 100644 --- a/modules/member/tpl/js/signup_check.js +++ b/modules/member/tpl/js/signup_check.js @@ -1,52 +1,52 @@ -/** - * @brief 회원 가입시나 정보 수정시 각 항목의 중복 검사등을 하는 기능을 구현 - * @author NHN (developer@xpressengine.com) - **/ - -// 입력이 시작된 것과 입력후 정해진 시간동안 내용이 변하였을 경우 서버에 ajax로 체크를 하기 위한 변수 설정 -var memberCheckObj = { target:null, value:null } - -// domready시에 특정 필드들에 대해 이벤트를 걸어 놓음 -jQuery(document).ready(memberSetEvent); - -function memberSetEvent() { - jQuery('#fo_insert_member :input') - .filter('[name=user_id],[name=nick_name],[name=email_address]') - .blur(memberCheckValue); -} - - -// 실제 서버에 특정 필드의 value check를 요청하고 이상이 있으면 메세지를 뿌려주는 함수 -function memberCheckValue(event) { - var field = event.target; - var _name = field.name; - var _value = field.value; - if(!_name || !_value) return; - - var params = {name:_name, value:_value}; - var response_tags = ['error','message']; - - exec_xml('member','procMemberCheckValue', params, completeMemberCheckValue, response_tags, field); -} - -// 서버에서 응답이 올 경우 이상이 있으면 메세지를 출력 -function completeMemberCheckValue(ret_obj, response_tags, field) { - var _id = 'dummy_check'+field.name; - var dummy = jQuery('#'+_id); - - if(ret_obj['message']=='success') { - dummy.html('').hide(); - return; - } - - if (!dummy.length) { - dummy = jQuery('
    ').attr('id', _id).appendTo(field.parentNode); - } - - dummy.html(ret_obj['message']).show(); -} - -// 결과 메세지를 정리하는 함수 -function removeMemberCheckValueOutput(dummy, obj) { - dummy.style.display = "none"; -} +/** + * @brief 회원 가입시나 정보 수정시 각 항목의 중복 검사등을 하는 기능을 구현 + * @author NHN (developer@xpressengine.com) + **/ + +// 입력이 시작된 것과 입력후 정해진 시간동안 내용이 변하였을 경우 서버에 ajax로 체크를 하기 위한 변수 설정 +var memberCheckObj = { target:null, value:null } + +// domready시에 특정 필드들에 대해 이벤트를 걸어 놓음 +jQuery(document).ready(memberSetEvent); + +function memberSetEvent() { + jQuery('#fo_insert_member :input') + .filter('[name=user_id],[name=nick_name],[name=email_address]') + .blur(memberCheckValue); +} + + +// 실제 서버에 특정 필드의 value check를 요청하고 이상이 있으면 메세지를 뿌려주는 함수 +function memberCheckValue(event) { + var field = event.target; + var _name = field.name; + var _value = field.value; + if(!_name || !_value) return; + + var params = {name:_name, value:_value}; + var response_tags = ['error','message']; + + exec_xml('member','procMemberCheckValue', params, completeMemberCheckValue, response_tags, field); +} + +// 서버에서 응답이 올 경우 이상이 있으면 메세지를 출력 +function completeMemberCheckValue(ret_obj, response_tags, field) { + var _id = 'dummy_check'+field.name; + var dummy = jQuery('#'+_id); + + if(ret_obj['message']=='success') { + dummy.html('').hide(); + return; + } + + if (!dummy.length) { + dummy = jQuery('
    ').attr('id', _id).appendTo(field.parentNode); + } + + dummy.html(ret_obj['message']).show(); +} + +// 결과 메세지를 정리하는 함수 +function removeMemberCheckValueOutput(dummy, obj) { + dummy.style.display = "none"; +} diff --git a/modules/member/tpl/login_form.html b/modules/member/tpl/login_form.html index 6289ce853..87568ef1f 100644 --- a/modules/member/tpl/login_form.html +++ b/modules/member/tpl/login_form.html @@ -1,19 +1,19 @@ - -
    -
    -

    {$lang->cmd_login}

    -
    -
    - - - -
      -
    • -
    • -
    -
    -
    -
    -
    -
    -
    + +
    +
    +

    {$lang->cmd_login}

    +
    +
    + + + +
      +
    • +
    • +
    +
    +
    +
    +
    +
    +
    diff --git a/modules/member/tpl/member_list.html b/modules/member/tpl/member_list.html index 1556aa84f..3fa4d0f77 100644 --- a/modules/member/tpl/member_list.html +++ b/modules/member/tpl/member_list.html @@ -1,132 +1,132 @@ - - - - -
    - - - -
    - - - - - - - - {$lang->cmd_cancel} -
    -
    - - -
    - - - - - - - - - - - - - - - - - {@ $val->group_list = implode(', ', $val->group_list)} - - - - - - - - - - - - - - - - -
    Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
    {$lang->user_id}
    {$lang->user_name}
    {$lang->nick_name}
     
    {$no}{htmlspecialchars($val->user_id)}{htmlspecialchars($val->user_name)}{htmlspecialchars($val->nick_name)}{zdate($val->regdate,"Y-m-d H:i:s")}{zdate($val->last_login,"Y-m-d H:i:s")} - {$lang->homepage} - {$lang->blog}   - {$lang->cmd_delete}{$lang->is_admin}

    {$val->group_list} 

    - - - - - - -
    - -
    - - - -
    - - - - - - - - {$lang->cmd_cancel} -
    -
    + + + + +
    + + + +
    + + + + + + + + {$lang->cmd_cancel} +
    +
    + + +
    + + + + + + + + + + + + + + + + + {@ $val->group_list = implode(', ', $val->group_list)} + + + + + + + + + + + + + + + + +
    Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
    {$lang->user_id}
    {$lang->user_name}
    {$lang->nick_name}
     
    {$no}{htmlspecialchars($val->user_id)}{htmlspecialchars($val->user_name)}{htmlspecialchars($val->nick_name)}{zdate($val->regdate,"Y-m-d H:i:s")}{zdate($val->last_login,"Y-m-d H:i:s")} + {$lang->homepage} + {$lang->blog}   + {$lang->cmd_delete}{$lang->is_admin}

    {$val->group_list} 

    + + + + + + +
    + +
    + + + +
    + + + + + + + + {$lang->cmd_cancel} +
    +
    diff --git a/modules/menu/conf/info.xml b/modules/menu/conf/info.xml index 2405dd08e..03ff4fa10 100644 --- a/modules/menu/conf/info.xml +++ b/modules/menu/conf/info.xml @@ -1,36 +1,36 @@ - - - 메뉴 - 菜单管理 - メニュー - Menu - Menu - Menú - Меню - 選單 - Menü - 레이아웃, 모듈을 연결하는 메뉴를 생성/관리하는 모듈입니다. - 此模块将生成并管理连接布局,模块的菜单。 - レイアウト、モジュールを連動させるメニューを作成・管理するモジュールです。 - This module is for creating/managering menues that linking layouts or modules. - Module này dành cho việc tạo và quản lý Menu sẽ liên kết với giao diện hoặc Mudule. - Este módulo es para crear/manejar los menús que que son conectados con los diseños o módulos. - Этот модуль служит для создания/управления меню, соединяюще лейауты и модули. - 可建立並管理連結版面和模組的選單。 - Bu modül, yerleşim düzenlerine ya da modüllere bağlı menüleri oluşturmak/yönetmek içindir. - 0.1 - 2007-02-28 - construction - - - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - - + + + 메뉴 + 菜单管理 + メニュー + Menu + Menu + Menú + Меню + 選單 + Menü + 레이아웃, 모듈을 연결하는 메뉴를 생성/관리하는 모듈입니다. + 此模块将生成并管理连接布局,模块的菜单。 + レイアウト、モジュールを連動させるメニューを作成・管理するモジュールです。 + This module is for creating/managering menues that linking layouts or modules. + Module này dành cho việc tạo và quản lý Menu sẽ liên kết với giao diện hoặc Mudule. + Este módulo es para crear/manejar los menús que que son conectados con los diseños o módulos. + Этот модуль служит для создания/управления меню, соединяюще лейауты и модули. + 可建立並管理連結版面和模組的選單。 + Bu modül, yerleşim düzenlerine ya da modüllere bağlı menüleri oluşturmak/yönetmek içindir. + 0.1 + 2007-02-28 + construction + + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + diff --git a/modules/menu/lang/en.lang.php b/modules/menu/lang/en.lang.php index bf6bdb815..7e595b08b 100644 --- a/modules/menu/lang/en.lang.php +++ b/modules/menu/lang/en.lang.php @@ -1,53 +1,53 @@ -cmd_menu_insert = 'Create Menu'; - $lang->cmd_menu_management = 'Menu Management'; - - $lang->menu = 'Menu'; - $lang->menu_count = 'No. of menu'; - $lang->menu_management = 'Menu Management'; - $lang->depth = 'Step'; - $lang->parent_menu_name = 'Parent Menu Name'; - $lang->menu_name = 'Menu Name'; - $lang->menu_srl = 'Menu Serial Number'; - $lang->menu_id = 'Menu ID'; - $lang->menu_url = 'Menu URL'; - $lang->menu_open_window = 'Open a new window'; - $lang->menu_expand = 'Expand'; - $lang->menu_img_btn = 'Image button'; - $lang->menu_normal_btn = 'Normal'; - $lang->menu_hover_btn = 'Mouse over'; - $lang->menu_active_btn = 'When selected'; - $lang->menu_group_srls = 'Accessable Groups'; - $lang->layout_maker = "Layout Maker"; - $lang->layout_history = "Update History "; - $lang->layout_info = "Layout Info"; - $lang->layout_list = 'Layouts List'; - $lang->downloaded_list = 'Downloads List'; - $lang->limit_menu_depth = 'Display Enabled'; - - $lang->cmd_make_child = 'Add a Child Menu'; - $lang->cmd_move_to_installed_list = "View Created List"; - $lang->cmd_enable_move_menu = "Move Menu (Drag the top menu after selecting)"; - $lang->cmd_search_mid = "Search mid"; - - $lang->msg_cannot_delete_for_child = 'A menu with child menus cannot be deleted.'; - - $lang->about_title = 'Please input the title that is easy to verify when connecting to module.'; - $lang->about_menu_management = "Menu management enables you to consist menu in the selected layout.\nYou can create menu upto setted depth and can enter information in details by clicking the menu.\nMenu will be expanded by cliking the folder image.\nIf menu is not shown normally, refresh the information by clicking the button \"Re-create cache file\".\n* Menu created over the depth limit may not be shown properly."; - $lang->about_menu_name = 'The name will be shown as a menu name if it is not an admin or image button.'; - $lang->about_menu_url = "It is the menu URL when select the menu.
    You may enter only id value to link to other module.
    If no contents exist, nothing will happen even though you click the menu."; - $lang->about_menu_open_window = 'You can assign it to open a page in a new window when the menu clicked.'; - $lang->about_menu_expand = 'It enables the menu to remain expanded when the tree menu(tree_menu.js) is used.'; - $lang->about_menu_img_btn = 'If you register an image button, the image button will automatically replace the text button, and it will be shown in the layout.'; - $lang->about_menu_group_srls = 'If you select a group, only the group members can see the menu. (if xml file is directly opened, it will be shown.)'; - - $lang->about_menu = "Menu module will help you to create a complete site through the convenient menu management which arranges created modules and links to layouts without any manual works..\nMenu is not a site manager, but it just has information which can link to modules and layouts so you can express different types of menu."; - - $lang->alert_image_only = "Only image files can be registered."; -?> +cmd_menu_insert = 'Create Menu'; + $lang->cmd_menu_management = 'Menu Management'; + + $lang->menu = 'Menu'; + $lang->menu_count = 'No. of menu'; + $lang->menu_management = 'Menu Management'; + $lang->depth = 'Step'; + $lang->parent_menu_name = 'Parent Menu Name'; + $lang->menu_name = 'Menu Name'; + $lang->menu_srl = 'Menu Serial Number'; + $lang->menu_id = 'Menu ID'; + $lang->menu_url = 'Menu URL'; + $lang->menu_open_window = 'Open a new window'; + $lang->menu_expand = 'Expand'; + $lang->menu_img_btn = 'Image button'; + $lang->menu_normal_btn = 'Normal'; + $lang->menu_hover_btn = 'Mouse over'; + $lang->menu_active_btn = 'When selected'; + $lang->menu_group_srls = 'Accessable Groups'; + $lang->layout_maker = "Layout Maker"; + $lang->layout_history = "Update History "; + $lang->layout_info = "Layout Info"; + $lang->layout_list = 'Layouts List'; + $lang->downloaded_list = 'Downloads List'; + $lang->limit_menu_depth = 'Display Enabled'; + + $lang->cmd_make_child = 'Add a Child Menu'; + $lang->cmd_move_to_installed_list = "View Created List"; + $lang->cmd_enable_move_menu = "Move Menu (Drag the top menu after selecting)"; + $lang->cmd_search_mid = "Search mid"; + + $lang->msg_cannot_delete_for_child = 'A menu with child menus cannot be deleted.'; + + $lang->about_title = 'Please input the title that is easy to verify when connecting to module.'; + $lang->about_menu_management = "Menu management enables you to consist menu in the selected layout.\nYou can create menu upto setted depth and can enter information in details by clicking the menu.\nMenu will be expanded by cliking the folder image.\nIf menu is not shown normally, refresh the information by clicking the button \"Re-create cache file\".\n* Menu created over the depth limit may not be shown properly."; + $lang->about_menu_name = 'The name will be shown as a menu name if it is not an admin or image button.'; + $lang->about_menu_url = "It is the menu URL when select the menu.
    You may enter only id value to link to other module.
    If no contents exist, nothing will happen even though you click the menu."; + $lang->about_menu_open_window = 'You can assign it to open a page in a new window when the menu clicked.'; + $lang->about_menu_expand = 'It enables the menu to remain expanded when the tree menu(tree_menu.js) is used.'; + $lang->about_menu_img_btn = 'If you register an image button, the image button will automatically replace the text button, and it will be shown in the layout.'; + $lang->about_menu_group_srls = 'If you select a group, only the group members can see the menu. (if xml file is directly opened, it will be shown.)'; + + $lang->about_menu = "Menu module will help you to create a complete site through the convenient menu management which arranges created modules and links to layouts without any manual works..\nMenu is not a site manager, but it just has information which can link to modules and layouts so you can express different types of menu."; + + $lang->alert_image_only = "Only image files can be registered."; +?> diff --git a/modules/menu/lang/es.lang.php b/modules/menu/lang/es.lang.php index bfe5cb5dc..033da95e1 100644 --- a/modules/menu/lang/es.lang.php +++ b/modules/menu/lang/es.lang.php @@ -1,53 +1,53 @@ -cmd_menu_insert = 'Crear Menú'; - $lang->cmd_menu_management = 'Comfiguración del Menú'; - - $lang->menu = 'Menú'; - $lang->menu_count = 'Número del menú'; - $lang->menu_management = 'Configuración del Menú'; - $lang->depth = 'Nivel'; - $lang->parent_menu_name = 'Nombre del Menú principal'; - $lang->menu_name = 'Nombre del menú'; - $lang->menu_srl = 'Número característico del menú'; - $lang->menu_id = 'ID del menú'; - $lang->menu_url = 'URL del Menú'; - $lang->menu_open_window = 'Abrir en una nueva ventana'; - $lang->menu_expand = 'Expandir'; - $lang->menu_img_btn = 'Botón de imagen'; - $lang->menu_normal_btn = 'Normal'; - $lang->menu_hover_btn = 'Mouse arriba'; - $lang->menu_active_btn = 'Al momento de seleccionar'; - $lang->menu_group_srls = 'Grupos accesibles'; - $lang->layout_maker = "Marcar el diseño"; - $lang->layout_history = "Actualizar la historia"; - $lang->layout_info = "Información del diseño"; - $lang->layout_list = 'Lista del diseño'; - $lang->downloaded_list = 'Lista de descarga'; - $lang->limit_menu_depth = 'Exhibicion permitido'; - - $lang->cmd_make_child = 'Agregar un submenú'; - $lang->cmd_move_to_installed_list = "Ver la lista de los creadores"; - $lang->cmd_enable_move_menu = "Mover el menú (Mover el menú luego de seleccionar)"; - $lang->cmd_search_mid = "Buscar mid"; - - $lang->msg_cannot_delete_for_child = 'No se puede eliminar un menú si posee un submenú.'; - - $lang->about_title = 'Ingresar el título que sea fácil de identificar al momento de conectar al módulo.'; - $lang->about_menu_management = "Configuración del menú permite construir el menú del diseño seleccionado.\nUsted puede crear el menú hasta el nivel seleccionado y para la información más detallada debe seleccionar el menú ingresado.\nEl menú será expandido al presionar la imagen del directorio.\nSi el menú no se ve correctamente, renueva la informacion presionado el botón\"Rehacer archivo caché\".\n El menú creado sobre el nivel límite podría no verse apropiadamente."; - $lang->about_menu_name = 'El nombre se verá como un nombre de menú si no es un botón del administrador o botón de imagen.'; - $lang->about_menu_url = "Este es el URL al momento de seleccionar el menú.
    Si desea conectar a otro módulo sólo debe colocar el valor de id.
    Si no hay contenido, no pasara nada aun cuando haya presinado el menú."; - $lang->about_menu_open_window = 'Usted puede asignar si desea abrir la página en una nueva ventana al momento de presionar el menú.'; - $lang->about_menu_expand = 'Al usar el menú arbol(tree_menu.js) puede mantener el menú expandido.'; - $lang->about_menu_img_btn = 'Si Usted registra un botón de imagen, ese botón automáticamente reemplazará el botón de texto, y se mostrará en el diseño.'; - $lang->about_menu_group_srls = 'Si tu selecciona el grupo, sólo los usuarios del grupo pueden ver el menú. (Si el archivo xml es abierto directamente, lo mostrará.)'; - - $lang->about_menu = "Módulo del menú te ayudara a crear un sitio completo a través de un conveniente manejo del menú que ordena los módulos creados y conecta con el diseño sin ningún otro trabajo.\nEl menú no es un manejador del sitio, sino que permite conectar los módulos con el diseño y a través del diseño puede expresar variados estilos del menú."; - - $lang->alert_image_only = "Sólo los archivos de imagen pueden ser registradas."; -?> +cmd_menu_insert = 'Crear Menú'; + $lang->cmd_menu_management = 'Comfiguración del Menú'; + + $lang->menu = 'Menú'; + $lang->menu_count = 'Número del menú'; + $lang->menu_management = 'Configuración del Menú'; + $lang->depth = 'Nivel'; + $lang->parent_menu_name = 'Nombre del Menú principal'; + $lang->menu_name = 'Nombre del menú'; + $lang->menu_srl = 'Número característico del menú'; + $lang->menu_id = 'ID del menú'; + $lang->menu_url = 'URL del Menú'; + $lang->menu_open_window = 'Abrir en una nueva ventana'; + $lang->menu_expand = 'Expandir'; + $lang->menu_img_btn = 'Botón de imagen'; + $lang->menu_normal_btn = 'Normal'; + $lang->menu_hover_btn = 'Mouse arriba'; + $lang->menu_active_btn = 'Al momento de seleccionar'; + $lang->menu_group_srls = 'Grupos accesibles'; + $lang->layout_maker = "Marcar el diseño"; + $lang->layout_history = "Actualizar la historia"; + $lang->layout_info = "Información del diseño"; + $lang->layout_list = 'Lista del diseño'; + $lang->downloaded_list = 'Lista de descarga'; + $lang->limit_menu_depth = 'Exhibicion permitido'; + + $lang->cmd_make_child = 'Agregar un submenú'; + $lang->cmd_move_to_installed_list = "Ver la lista de los creadores"; + $lang->cmd_enable_move_menu = "Mover el menú (Mover el menú luego de seleccionar)"; + $lang->cmd_search_mid = "Buscar mid"; + + $lang->msg_cannot_delete_for_child = 'No se puede eliminar un menú si posee un submenú.'; + + $lang->about_title = 'Ingresar el título que sea fácil de identificar al momento de conectar al módulo.'; + $lang->about_menu_management = "Configuración del menú permite construir el menú del diseño seleccionado.\nUsted puede crear el menú hasta el nivel seleccionado y para la información más detallada debe seleccionar el menú ingresado.\nEl menú será expandido al presionar la imagen del directorio.\nSi el menú no se ve correctamente, renueva la informacion presionado el botón\"Rehacer archivo caché\".\n El menú creado sobre el nivel límite podría no verse apropiadamente."; + $lang->about_menu_name = 'El nombre se verá como un nombre de menú si no es un botón del administrador o botón de imagen.'; + $lang->about_menu_url = "Este es el URL al momento de seleccionar el menú.
    Si desea conectar a otro módulo sólo debe colocar el valor de id.
    Si no hay contenido, no pasara nada aun cuando haya presinado el menú."; + $lang->about_menu_open_window = 'Usted puede asignar si desea abrir la página en una nueva ventana al momento de presionar el menú.'; + $lang->about_menu_expand = 'Al usar el menú arbol(tree_menu.js) puede mantener el menú expandido.'; + $lang->about_menu_img_btn = 'Si Usted registra un botón de imagen, ese botón automáticamente reemplazará el botón de texto, y se mostrará en el diseño.'; + $lang->about_menu_group_srls = 'Si tu selecciona el grupo, sólo los usuarios del grupo pueden ver el menú. (Si el archivo xml es abierto directamente, lo mostrará.)'; + + $lang->about_menu = "Módulo del menú te ayudara a crear un sitio completo a través de un conveniente manejo del menú que ordena los módulos creados y conecta con el diseño sin ningún otro trabajo.\nEl menú no es un manejador del sitio, sino que permite conectar los módulos con el diseño y a través del diseño puede expresar variados estilos del menú."; + + $lang->alert_image_only = "Sólo los archivos de imagen pueden ser registradas."; +?> diff --git a/modules/menu/lang/fr.lang.php b/modules/menu/lang/fr.lang.php index e7bbdc8d4..a2ec4022f 100644 --- a/modules/menu/lang/fr.lang.php +++ b/modules/menu/lang/fr.lang.php @@ -1,53 +1,53 @@ - - * @brief Paque du langage en français pour le module de Menu - **/ - - $lang->cmd_menu_insert = 'Créer un Menu'; - $lang->cmd_menu_management = 'Administer des Menus'; - - $lang->menu = 'Menu'; - $lang->menu_count = 'Somme de menu'; - $lang->menu_management = 'Administration de Menu'; - $lang->depth = 'Niveau'; - $lang->parent_menu_name = 'Nom de Menu supérieur'; - $lang->menu_name = 'Nom de Menu'; - $lang->menu_srl = 'Numéro de série de Menu'; - $lang->menu_id = 'Nom d\'Identité de Menu'; - $lang->menu_url = 'URL de Menu'; - $lang->menu_open_window = 'Ouvrire une nouvelle fenêtre'; - $lang->menu_expand = 'Étendre'; - $lang->menu_img_btn = 'Bouton en Image'; - $lang->menu_normal_btn = 'Normal'; - $lang->menu_hover_btn = 'Survolé'; - $lang->menu_active_btn = 'Choisi'; - $lang->menu_group_srls = 'Groupes qui peuvent accéder'; - $lang->layout_maker = "Auteur de la Mise en Page"; - $lang->layout_history = "Histoire des Mises à Jour"; - $lang->layout_info = "Information de la Mise en Page"; - $lang->layout_list = 'Liste des Mises en Page'; - $lang->downloaded_list = 'Liste de Téléchargement'; - $lang->limit_menu_depth = 'Niveau permis d\'exposer'; - - $lang->cmd_make_child = 'Ajouter un menu inférieur'; - $lang->cmd_move_to_installed_list = "Voir la liste créé"; - $lang->cmd_enable_move_menu = "Bouger le Menu (glisser-déposer un menu après cocher)"; - $lang->cmd_search_mid = "Rechercher mid"; - - $lang->msg_cannot_delete_for_child = 'Un menu qui a des menus inférieurs ne peut pas être supprimé.'; - - $lang->about_title = 'Entrez un titre facile à vérifier quand on le connecte à un module.'; - $lang->about_menu_management = "Administration de Menu vous permet de composer le menu dans la Mise en Page que vous choisissez.\nVous pouvez créer le menu jusqu'au niveau permis et entrer des informations détaillées si vou cliquez le menu.\nMenu sera étendu si vous cliquez l'image de dossier.\nSi le menu n'est pas représenté normalement, rafraîchir les informations en cliquant le bouton \"Recréer \'antémémoire de fichier\".\n* Menu cré qui passe plus que le niveau permis pourra être représenté incorrectement."; - $lang->about_menu_name = 'Ce nom sera représenté comme le nom de menu si ce n\'est pas le bouton en image ou le bouton pour administrer.'; - $lang->about_menu_url = "C'est le URL où l'on bouge quand on choisit le menu.
    Vous pouvez entrer la valeur d'identité(nom d'idendité) seulement pour lier à un autre module.
    Si nul contenu n'existe, rien n'aura lieu même si l'on clique le menu."; - $lang->about_menu_open_window = 'Vous pouvez faire ouvrir une page dans une nouvelle fenêtre quand le menu est cliqué.'; - $lang->about_menu_expand = 'L\'Arbre de Menu(tree_menu.js) peut faire resté le menu étendu toujours.'; - $lang->about_menu_img_btn = 'Si vous enrégistez un bouton en image, l\'image remplacera automatiquement le bouton en texte, et ce sera représenté dans la Mise en Page.'; - $lang->about_menu_group_srls = 'Si vous choisissez un groupe, les membres de ce groupe seulement peuvent voir le menu. (Si l\'on ouvre un fichier xml, le fichier sera exposé.)'; - - $lang->about_menu = "Le Module de Menu vous aidrera à établir un site complet par l'administration confortable qui arrange les modules créés et liens à la mise en page sans aucun travaux manuels.\nMenu n'est pas un administrateur du Site, mais il a seulement l'information qui peut lier les modules à la mise en page, et on peut représenter les menu en formes diverses par la mise en page."; - - $lang->alert_image_only = "Fichiers d'image seulement peuvent être enrégistrés."; -?> + + * @brief Paque du langage en français pour le module de Menu + **/ + + $lang->cmd_menu_insert = 'Créer un Menu'; + $lang->cmd_menu_management = 'Administer des Menus'; + + $lang->menu = 'Menu'; + $lang->menu_count = 'Somme de menu'; + $lang->menu_management = 'Administration de Menu'; + $lang->depth = 'Niveau'; + $lang->parent_menu_name = 'Nom de Menu supérieur'; + $lang->menu_name = 'Nom de Menu'; + $lang->menu_srl = 'Numéro de série de Menu'; + $lang->menu_id = 'Nom d\'Identité de Menu'; + $lang->menu_url = 'URL de Menu'; + $lang->menu_open_window = 'Ouvrire une nouvelle fenêtre'; + $lang->menu_expand = 'Étendre'; + $lang->menu_img_btn = 'Bouton en Image'; + $lang->menu_normal_btn = 'Normal'; + $lang->menu_hover_btn = 'Survolé'; + $lang->menu_active_btn = 'Choisi'; + $lang->menu_group_srls = 'Groupes qui peuvent accéder'; + $lang->layout_maker = "Auteur de la Mise en Page"; + $lang->layout_history = "Histoire des Mises à Jour"; + $lang->layout_info = "Information de la Mise en Page"; + $lang->layout_list = 'Liste des Mises en Page'; + $lang->downloaded_list = 'Liste de Téléchargement'; + $lang->limit_menu_depth = 'Niveau permis d\'exposer'; + + $lang->cmd_make_child = 'Ajouter un menu inférieur'; + $lang->cmd_move_to_installed_list = "Voir la liste créé"; + $lang->cmd_enable_move_menu = "Bouger le Menu (glisser-déposer un menu après cocher)"; + $lang->cmd_search_mid = "Rechercher mid"; + + $lang->msg_cannot_delete_for_child = 'Un menu qui a des menus inférieurs ne peut pas être supprimé.'; + + $lang->about_title = 'Entrez un titre facile à vérifier quand on le connecte à un module.'; + $lang->about_menu_management = "Administration de Menu vous permet de composer le menu dans la Mise en Page que vous choisissez.\nVous pouvez créer le menu jusqu'au niveau permis et entrer des informations détaillées si vou cliquez le menu.\nMenu sera étendu si vous cliquez l'image de dossier.\nSi le menu n'est pas représenté normalement, rafraîchir les informations en cliquant le bouton \"Recréer \'antémémoire de fichier\".\n* Menu cré qui passe plus que le niveau permis pourra être représenté incorrectement."; + $lang->about_menu_name = 'Ce nom sera représenté comme le nom de menu si ce n\'est pas le bouton en image ou le bouton pour administrer.'; + $lang->about_menu_url = "C'est le URL où l'on bouge quand on choisit le menu.
    Vous pouvez entrer la valeur d'identité(nom d'idendité) seulement pour lier à un autre module.
    Si nul contenu n'existe, rien n'aura lieu même si l'on clique le menu."; + $lang->about_menu_open_window = 'Vous pouvez faire ouvrir une page dans une nouvelle fenêtre quand le menu est cliqué.'; + $lang->about_menu_expand = 'L\'Arbre de Menu(tree_menu.js) peut faire resté le menu étendu toujours.'; + $lang->about_menu_img_btn = 'Si vous enrégistez un bouton en image, l\'image remplacera automatiquement le bouton en texte, et ce sera représenté dans la Mise en Page.'; + $lang->about_menu_group_srls = 'Si vous choisissez un groupe, les membres de ce groupe seulement peuvent voir le menu. (Si l\'on ouvre un fichier xml, le fichier sera exposé.)'; + + $lang->about_menu = "Le Module de Menu vous aidrera à établir un site complet par l'administration confortable qui arrange les modules créés et liens à la mise en page sans aucun travaux manuels.\nMenu n'est pas un administrateur du Site, mais il a seulement l'information qui peut lier les modules à la mise en page, et on peut représenter les menu en formes diverses par la mise en page."; + + $lang->alert_image_only = "Fichiers d'image seulement peuvent être enrégistrés."; +?> diff --git a/modules/menu/lang/jp.lang.php b/modules/menu/lang/jp.lang.php index 53f64f9b8..f7bb2326f 100644 --- a/modules/menu/lang/jp.lang.php +++ b/modules/menu/lang/jp.lang.php @@ -1,53 +1,53 @@ -cmd_menu_insert = 'メニュー生成'; - $lang->cmd_menu_management = 'メニュー設定'; - - $lang->menu = 'メニュー'; - $lang->menu_count = 'メニュー数'; - $lang->menu_management = 'メニュー管理'; - $lang->depth = 'スレッド'; - $lang->parent_menu_name = '上位メニュー名'; - $lang->menu_name = 'メニュー名'; - $lang->menu_srl = 'メニュー固有番号'; - $lang->menu_id = 'メニュー名'; - $lang->menu_url = 'リンクURL'; - $lang->menu_open_window = '新しいウィンドウズで開く'; - $lang->menu_expand = '拡張表示'; - $lang->menu_img_btn = 'イメージボタン'; - $lang->menu_normal_btn = '一般ボタン'; - $lang->menu_hover_btn = 'マウスオーバー'; - $lang->menu_active_btn = '選択時のボタン'; - $lang->menu_group_srls = 'グループ制限'; - $lang->layout_maker = 'レイアウト作者'; - $lang->layout_history = '変更内容'; - $lang->layout_info = 'レイアウト情報'; - $lang->layout_list = 'レイアウトリスト'; - $lang->downloaded_list = 'ダウンロードリスト'; - $lang->limit_menu_depth = '表示スレッド'; - - $lang->cmd_make_child = '下位メニュー追加'; - $lang->cmd_move_to_installed_list = '生成されたリスト表示'; - $lang->cmd_enable_move_menu = 'メニュー移動(選択後メニューをドラッグして下さい)'; - $lang->cmd_search_mid = 'mid 検索'; - - $lang->msg_cannot_delete_for_child = '下位メニューが存在するメニューは削除出来ません。'; - - $lang->about_title = 'モジュールをリンクする際に分かりやすいタイトルを入力して下さい。'; - $lang->about_menu_management = "メニュー管理は、選択されたレイアウトで使用するメニューを構成出来るようにします。
    一定レベルまでメニューの構成が出来、入力したメニューをクリックすると詳細情報が入力出来ます。
    フォルダーのイメージをクリックするとメニューを拡張することが出来ます。
    もしメニューが正常に表示されない場合は、 「キャッシュファイル再生成」ボタンをクリックして情報を更新して下さい。
    * 一定レベル以上のメニューは正しく表示されない場合があります。"; - $lang->about_menu_name = '管理及びイメージボタンではない場合、メニュー名として表示されるタイトルです。'; - $lang->about_menu_url = 'メニュー選択時、移動するURLです。
    他のモジュールとリンクを張る場合はIDの値のみ入力して下さい。
    内容がない場合は、メニューを選択しても何の動作もありません。'; - $lang->about_menu_open_window = 'メニュー選択時、新しいウィンドウで開くかを指定することが出来ます。'; - $lang->about_menu_expand = 'ツリーメニュー(tree_menu.js)を利用すると常に拡張表示(すべて表示)の状態にすることが出来ます。'; - $lang->about_menu_img_btn = 'イメージボタンを登録するとレイアウトで自動的にイメージボタンに入れ替わって表示されます。'; - $lang->about_menu_group_srls = 'グループを選択すると該当するグループのユーザにのみメニューが表示されます(XMLファイルを直接開くと情報が表示されます)。'; - - $lang->about_menu = "メニューモジュールは、メニュー管理機能にて生成モジュールの整理やレイアウトとのリンクを設定し、簡単に管理者画面上でサイトを構築出来るようにします。\nメニューはサイトを管理するというより、モジュールとレイアウトをリンクし、様々なメニューを表示させる情報だけ持っています。"; - - $lang->alert_image_only = 'イメージ(画像)ファイルのみ登録出来ます。'; -?> +cmd_menu_insert = 'メニュー生成'; + $lang->cmd_menu_management = 'メニュー設定'; + + $lang->menu = 'メニュー'; + $lang->menu_count = 'メニュー数'; + $lang->menu_management = 'メニュー管理'; + $lang->depth = 'スレッド'; + $lang->parent_menu_name = '上位メニュー名'; + $lang->menu_name = 'メニュー名'; + $lang->menu_srl = 'メニュー固有番号'; + $lang->menu_id = 'メニュー名'; + $lang->menu_url = 'リンクURL'; + $lang->menu_open_window = '新しいウィンドウズで開く'; + $lang->menu_expand = '拡張表示'; + $lang->menu_img_btn = 'イメージボタン'; + $lang->menu_normal_btn = '一般ボタン'; + $lang->menu_hover_btn = 'マウスオーバー'; + $lang->menu_active_btn = '選択時のボタン'; + $lang->menu_group_srls = 'グループ制限'; + $lang->layout_maker = 'レイアウト作者'; + $lang->layout_history = '変更内容'; + $lang->layout_info = 'レイアウト情報'; + $lang->layout_list = 'レイアウトリスト'; + $lang->downloaded_list = 'ダウンロードリスト'; + $lang->limit_menu_depth = '表示スレッド'; + + $lang->cmd_make_child = '下位メニュー追加'; + $lang->cmd_move_to_installed_list = '生成されたリスト表示'; + $lang->cmd_enable_move_menu = 'メニュー移動(選択後メニューをドラッグして下さい)'; + $lang->cmd_search_mid = 'mid 検索'; + + $lang->msg_cannot_delete_for_child = '下位メニューが存在するメニューは削除出来ません。'; + + $lang->about_title = 'モジュールをリンクする際に分かりやすいタイトルを入力して下さい。'; + $lang->about_menu_management = "メニュー管理は、選択されたレイアウトで使用するメニューを構成出来るようにします。
    一定レベルまでメニューの構成が出来、入力したメニューをクリックすると詳細情報が入力出来ます。
    フォルダーのイメージをクリックするとメニューを拡張することが出来ます。
    もしメニューが正常に表示されない場合は、 「キャッシュファイル再生成」ボタンをクリックして情報を更新して下さい。
    * 一定レベル以上のメニューは正しく表示されない場合があります。"; + $lang->about_menu_name = '管理及びイメージボタンではない場合、メニュー名として表示されるタイトルです。'; + $lang->about_menu_url = 'メニュー選択時、移動するURLです。
    他のモジュールとリンクを張る場合はIDの値のみ入力して下さい。
    内容がない場合は、メニューを選択しても何の動作もありません。'; + $lang->about_menu_open_window = 'メニュー選択時、新しいウィンドウで開くかを指定することが出来ます。'; + $lang->about_menu_expand = 'ツリーメニュー(tree_menu.js)を利用すると常に拡張表示(すべて表示)の状態にすることが出来ます。'; + $lang->about_menu_img_btn = 'イメージボタンを登録するとレイアウトで自動的にイメージボタンに入れ替わって表示されます。'; + $lang->about_menu_group_srls = 'グループを選択すると該当するグループのユーザにのみメニューが表示されます(XMLファイルを直接開くと情報が表示されます)。'; + + $lang->about_menu = "メニューモジュールは、メニュー管理機能にて生成モジュールの整理やレイアウトとのリンクを設定し、簡単に管理者画面上でサイトを構築出来るようにします。\nメニューはサイトを管理するというより、モジュールとレイアウトをリンクし、様々なメニューを表示させる情報だけ持っています。"; + + $lang->alert_image_only = 'イメージ(画像)ファイルのみ登録出来ます。'; +?> diff --git a/modules/menu/lang/ko.lang.php b/modules/menu/lang/ko.lang.php index c2580e269..a1d72b7c0 100644 --- a/modules/menu/lang/ko.lang.php +++ b/modules/menu/lang/ko.lang.php @@ -1,53 +1,53 @@ -cmd_menu_insert = '메뉴 생성'; - $lang->cmd_menu_management = '메뉴 설정'; - - $lang->menu = '메뉴'; - $lang->menu_count = '메뉴 수'; - $lang->menu_management = '메뉴 관리'; - $lang->depth = '단계'; - $lang->parent_menu_name = '상위 메뉴명'; - $lang->menu_name = '메뉴명'; - $lang->menu_srl = '메뉴 고유 번호'; - $lang->menu_id = '메뉴 이름'; - $lang->menu_url = '연결 url'; - $lang->menu_open_window = '새 창 열기'; - $lang->menu_expand = '펼침'; - $lang->menu_img_btn = '이미지 버튼'; - $lang->menu_normal_btn = '일반'; - $lang->menu_hover_btn = '마우스 오버'; - $lang->menu_active_btn = '선택 시'; - $lang->menu_group_srls = '그룹 제한'; - $lang->layout_maker = '레이아웃 제작자'; - $lang->layout_history = '변경 사항 '; - $lang->layout_info = '레이아웃 정보'; - $lang->layout_list = '레이아웃 목록'; - $lang->downloaded_list = '다운로드 목록'; - $lang->limit_menu_depth = '표시 가능'; - - $lang->cmd_make_child = '하부 메뉴 추가'; - $lang->cmd_move_to_installed_list = '생성된 목록 보기'; - $lang->cmd_enable_move_menu = '메뉴 옮기기 (선택 후, 위 메뉴를 드래그하세요.)'; - $lang->cmd_search_mid = 'mid 찾기'; - - $lang->msg_cannot_delete_for_child = '하부 메뉴가 있는 메뉴는 삭제하실 수 없습니다.'; - - $lang->about_title = '모듈에 연결할 때, 쉽게 구분할 수 있는 제목을 입력해주세요.'; - $lang->about_menu_management = "메뉴관리는 선택하신 레이아웃에서 사용하는 메뉴를 구성할 수 있도록 합니다.\n정해진 단계까지 메뉴를 구성 가능하며 입력하신 메뉴를 클릭하시면 상세 정보를 입력할 수 있습니다.\n폴더 그림을 클릭하시면 메뉴를 확장하실 수 있습니다.\n간혹 메뉴가 정상적으로 나타나지 않으면 \"캐시파일 재생성\" 버튼을 눌러서 정보를 갱신하세요.\n* 정해진 단계 이상의 메뉴는 제대로 표시되지 않을 수 있습니다."; - $lang->about_menu_name = '관리 및 이미지 버튼이 아닐 경우 메뉴 명으로 나타날 제목입니다.'; - $lang->about_menu_url = '메뉴 선택 시 이동할 URL입니다.
    다른 모듈을 연결하고자 할 때는 mid값만 입력해주시면 됩니다.
    내용이 없으면 이 메뉴를 선택해도 아무런 동작이 없습니다.'; - $lang->about_menu_open_window = '메뉴를 선택 했을 때, 새 창을 띄울 것인지 정할 수 있습니다.'; - $lang->about_menu_expand = '트리메뉴(tree_menu.js)를 사용 하면, 메뉴가 늘 펼쳐진 상태로 있게 합니다.'; - $lang->about_menu_img_btn = '이미지 버튼을 등록하면 레이아웃에서 이 메뉴가 이미지 버튼으로 교체되어 표시 됩니다.'; - $lang->about_menu_group_srls = '그룹을 선택하시면 해당 그룹의 사용자만 메뉴가 보이게 됩니다. (xml파일을 직접 열람하면 노출이 됩니다.)'; - - $lang->about_menu = "메뉴모듈은 생성된 모듈을 편리한 메뉴관리기를 통해 정리하고 레이아웃과 연결하여 별도의 수작업 없이 완성된 사이트를 구축하도록 도와줍니다. \n메뉴는 사이트를 관리하기 보다는 모듈과 레이아웃을 연결해 주며 레이아웃을 통해 여러 가지 형태의 메뉴를 표시할 수 있도록 하는 정보만 가지고 있습니다."; - - $lang->alert_image_only = '이미지 파일만 등록 가능합니다.'; -?> +cmd_menu_insert = '메뉴 생성'; + $lang->cmd_menu_management = '메뉴 설정'; + + $lang->menu = '메뉴'; + $lang->menu_count = '메뉴 수'; + $lang->menu_management = '메뉴 관리'; + $lang->depth = '단계'; + $lang->parent_menu_name = '상위 메뉴명'; + $lang->menu_name = '메뉴명'; + $lang->menu_srl = '메뉴 고유 번호'; + $lang->menu_id = '메뉴 이름'; + $lang->menu_url = '연결 url'; + $lang->menu_open_window = '새 창 열기'; + $lang->menu_expand = '펼침'; + $lang->menu_img_btn = '이미지 버튼'; + $lang->menu_normal_btn = '일반'; + $lang->menu_hover_btn = '마우스 오버'; + $lang->menu_active_btn = '선택 시'; + $lang->menu_group_srls = '그룹 제한'; + $lang->layout_maker = '레이아웃 제작자'; + $lang->layout_history = '변경 사항 '; + $lang->layout_info = '레이아웃 정보'; + $lang->layout_list = '레이아웃 목록'; + $lang->downloaded_list = '다운로드 목록'; + $lang->limit_menu_depth = '표시 가능'; + + $lang->cmd_make_child = '하부 메뉴 추가'; + $lang->cmd_move_to_installed_list = '생성된 목록 보기'; + $lang->cmd_enable_move_menu = '메뉴 옮기기 (선택 후, 위 메뉴를 드래그하세요.)'; + $lang->cmd_search_mid = 'mid 찾기'; + + $lang->msg_cannot_delete_for_child = '하부 메뉴가 있는 메뉴는 삭제하실 수 없습니다.'; + + $lang->about_title = '모듈에 연결할 때, 쉽게 구분할 수 있는 제목을 입력해주세요.'; + $lang->about_menu_management = "메뉴관리는 선택하신 레이아웃에서 사용하는 메뉴를 구성할 수 있도록 합니다.\n정해진 단계까지 메뉴를 구성 가능하며 입력하신 메뉴를 클릭하시면 상세 정보를 입력할 수 있습니다.\n폴더 그림을 클릭하시면 메뉴를 확장하실 수 있습니다.\n간혹 메뉴가 정상적으로 나타나지 않으면 \"캐시파일 재생성\" 버튼을 눌러서 정보를 갱신하세요.\n* 정해진 단계 이상의 메뉴는 제대로 표시되지 않을 수 있습니다."; + $lang->about_menu_name = '관리 및 이미지 버튼이 아닐 경우 메뉴 명으로 나타날 제목입니다.'; + $lang->about_menu_url = '메뉴 선택 시 이동할 URL입니다.
    다른 모듈을 연결하고자 할 때는 mid값만 입력해주시면 됩니다.
    내용이 없으면 이 메뉴를 선택해도 아무런 동작이 없습니다.'; + $lang->about_menu_open_window = '메뉴를 선택 했을 때, 새 창을 띄울 것인지 정할 수 있습니다.'; + $lang->about_menu_expand = '트리메뉴(tree_menu.js)를 사용 하면, 메뉴가 늘 펼쳐진 상태로 있게 합니다.'; + $lang->about_menu_img_btn = '이미지 버튼을 등록하면 레이아웃에서 이 메뉴가 이미지 버튼으로 교체되어 표시 됩니다.'; + $lang->about_menu_group_srls = '그룹을 선택하시면 해당 그룹의 사용자만 메뉴가 보이게 됩니다. (xml파일을 직접 열람하면 노출이 됩니다.)'; + + $lang->about_menu = "메뉴모듈은 생성된 모듈을 편리한 메뉴관리기를 통해 정리하고 레이아웃과 연결하여 별도의 수작업 없이 완성된 사이트를 구축하도록 도와줍니다. \n메뉴는 사이트를 관리하기 보다는 모듈과 레이아웃을 연결해 주며 레이아웃을 통해 여러 가지 형태의 메뉴를 표시할 수 있도록 하는 정보만 가지고 있습니다."; + + $lang->alert_image_only = '이미지 파일만 등록 가능합니다.'; +?> diff --git a/modules/menu/lang/ru.lang.php b/modules/menu/lang/ru.lang.php index 6bc903385..b86dc879e 100644 --- a/modules/menu/lang/ru.lang.php +++ b/modules/menu/lang/ru.lang.php @@ -1,53 +1,53 @@ -cmd_menu_insert = 'Создать меню'; - $lang->cmd_menu_management = 'Управление меню'; - - $lang->menu = 'Меню'; - $lang->menu_count = 'Меню No.'; - $lang->menu_management = 'Управление меню'; - $lang->depth = 'Ступень'; - $lang->parent_menu_name = 'Имя верхнего меню'; - $lang->menu_name = 'Имя меню'; - $lang->menu_srl = 'SRL меню'; - $lang->menu_id = 'ID меню'; - $lang->menu_url = 'URL меню'; - $lang->menu_open_window = 'Открыть новое окно'; - $lang->menu_expand = 'Раскрыть'; - $lang->menu_img_btn = 'Изображение кнопки'; - $lang->menu_normal_btn = 'Обычное'; - $lang->menu_hover_btn = 'Мышь над'; - $lang->menu_active_btn = 'При выборе'; - $lang->menu_group_srls = 'Группы с доступом'; - $lang->layout_maker = "Маркет лейаута"; - $lang->layout_history = "История обновлений"; - $lang->layout_info = "Информация лейаутов"; - $lang->layout_list = 'Список лейаутов'; - $lang->downloaded_list = 'Список закачек'; - $lang->limit_menu_depth = 'Лимит глубины'; - - $lang->cmd_make_child = 'Добавть дочернее меню'; - $lang->cmd_move_to_installed_list = "Просмотреть созданные меню"; - $lang->cmd_enable_move_menu = "Переместить меню (Перетащите верхнее меню после выделения)"; - $lang->cmd_search_mid = "Поиск mid"; - - $lang->msg_cannot_delete_for_child = 'Невозможно удалить меню с дочерними меню'; - - $lang->about_title = 'Пожалуйста, введите название меню, которое легко проверить при подключению к модулю'; - $lang->about_menu_management = "Управление меню позволяет Вам заключить меню в вабранный лейаут.\nВы можете создать меню до установленной грубины и ввести информацию детально посредством целчка по нему\nМеню будет разкрыто щелчком по изображению папки.\nЕсли меню не отображается нормально, обновите информацию щелчком по кнопке \"Пересоздать файл кеша\".\n* Меню, созданное за пределами лимита глубины может отображаться неверно."; - $lang->about_menu_name = 'Это имя будет показано, если это не административная книпка или кнопка с изображением.'; - $lang->about_menu_url = "Это URL, связанный с меню.
    Вы можете ввести только ID значение к ссылке на другой модуль.
    Если содержания нет, ничего не произойдет при щелчке по меню."; - $lang->about_menu_open_window = 'Вы можете присвоить это для открытия ссылки в новом окне при щелчке по меню.'; - $lang->about_menu_expand = 'Это позволяет меню оставаться раскрытым, когда древовидное меню (tree_menu.js) используется.'; - $lang->about_menu_img_btn = 'Если Вы регистрируете кнопку с изображением, изображение автоматически заменит текстовую кнопку, и будет показано в лейауте.'; - $lang->about_menu_group_srls = 'Если Вы выберите группу, то только ее члены могут видеть это меню. (если XML файл открыт напрямую, оно будет показано.)'; - - $lang->about_menu = "Модуль меню поможет Вам создать полноценный сайт посредством удобного менеджмента меню, которое расставляет созданные модули и ссылки в лейауты без всякой ручной работы.\nМеню не является менеджером сайта, но оно содержит информацию, которая может связываться с модулями и лейаутами так, что Вы можете выразить различные виды меню."; - - $lang->alert_image_only = "Возможна регистрация только картинок"; -?> +cmd_menu_insert = 'Создать меню'; + $lang->cmd_menu_management = 'Управление меню'; + + $lang->menu = 'Меню'; + $lang->menu_count = 'Меню No.'; + $lang->menu_management = 'Управление меню'; + $lang->depth = 'Ступень'; + $lang->parent_menu_name = 'Имя верхнего меню'; + $lang->menu_name = 'Имя меню'; + $lang->menu_srl = 'SRL меню'; + $lang->menu_id = 'ID меню'; + $lang->menu_url = 'URL меню'; + $lang->menu_open_window = 'Открыть новое окно'; + $lang->menu_expand = 'Раскрыть'; + $lang->menu_img_btn = 'Изображение кнопки'; + $lang->menu_normal_btn = 'Обычное'; + $lang->menu_hover_btn = 'Мышь над'; + $lang->menu_active_btn = 'При выборе'; + $lang->menu_group_srls = 'Группы с доступом'; + $lang->layout_maker = "Маркет лейаута"; + $lang->layout_history = "История обновлений"; + $lang->layout_info = "Информация лейаутов"; + $lang->layout_list = 'Список лейаутов'; + $lang->downloaded_list = 'Список закачек'; + $lang->limit_menu_depth = 'Лимит глубины'; + + $lang->cmd_make_child = 'Добавть дочернее меню'; + $lang->cmd_move_to_installed_list = "Просмотреть созданные меню"; + $lang->cmd_enable_move_menu = "Переместить меню (Перетащите верхнее меню после выделения)"; + $lang->cmd_search_mid = "Поиск mid"; + + $lang->msg_cannot_delete_for_child = 'Невозможно удалить меню с дочерними меню'; + + $lang->about_title = 'Пожалуйста, введите название меню, которое легко проверить при подключению к модулю'; + $lang->about_menu_management = "Управление меню позволяет Вам заключить меню в вабранный лейаут.\nВы можете создать меню до установленной грубины и ввести информацию детально посредством целчка по нему\nМеню будет разкрыто щелчком по изображению папки.\nЕсли меню не отображается нормально, обновите информацию щелчком по кнопке \"Пересоздать файл кеша\".\n* Меню, созданное за пределами лимита глубины может отображаться неверно."; + $lang->about_menu_name = 'Это имя будет показано, если это не административная книпка или кнопка с изображением.'; + $lang->about_menu_url = "Это URL, связанный с меню.
    Вы можете ввести только ID значение к ссылке на другой модуль.
    Если содержания нет, ничего не произойдет при щелчке по меню."; + $lang->about_menu_open_window = 'Вы можете присвоить это для открытия ссылки в новом окне при щелчке по меню.'; + $lang->about_menu_expand = 'Это позволяет меню оставаться раскрытым, когда древовидное меню (tree_menu.js) используется.'; + $lang->about_menu_img_btn = 'Если Вы регистрируете кнопку с изображением, изображение автоматически заменит текстовую кнопку, и будет показано в лейауте.'; + $lang->about_menu_group_srls = 'Если Вы выберите группу, то только ее члены могут видеть это меню. (если XML файл открыт напрямую, оно будет показано.)'; + + $lang->about_menu = "Модуль меню поможет Вам создать полноценный сайт посредством удобного менеджмента меню, которое расставляет созданные модули и ссылки в лейауты без всякой ручной работы.\nМеню не является менеджером сайта, но оно содержит информацию, которая может связываться с модулями и лейаутами так, что Вы можете выразить различные виды меню."; + + $lang->alert_image_only = "Возможна регистрация только картинок"; +?> diff --git a/modules/menu/lang/tr.lang.php b/modules/menu/lang/tr.lang.php index 8d77f222b..10345866e 100644 --- a/modules/menu/lang/tr.lang.php +++ b/modules/menu/lang/tr.lang.php @@ -1,53 +1,53 @@ -cmd_menu_insert = 'Menü Oluştur'; - $lang->cmd_menu_management = 'Menü Yönetimi'; - - $lang->menu = 'Menü'; - $lang->menu_count = 'Menü numarası'; - $lang->menu_management = 'Menü Yönetimi'; - $lang->depth = 'Adım'; - $lang->parent_menu_name = 'Üst Menü İsmi'; - $lang->menu_name = 'Menü İsmi'; - $lang->menu_srl = 'Menü Seri Numarası'; - $lang->menu_id = 'Menü Kimliği'; - $lang->menu_url = 'Menü URLsi'; - $lang->menu_open_window = 'Yeni pencere aç'; - $lang->menu_expand = 'Genişlet'; - $lang->menu_img_btn = 'Resim Tuşu'; - $lang->menu_normal_btn = 'Normal'; - $lang->menu_hover_btn = 'Fare üzerine geldiğinde'; - $lang->menu_active_btn = 'Seçildiğinde'; - $lang->menu_group_srls = 'Erişilebilir Gruplar'; - $lang->layout_maker = "Yerleşim Düzeni Yapıcısı"; - $lang->layout_history = "Güncelleştirme Geçmişi "; - $lang->layout_info = "Yer. Düzeni Bilgisi"; - $lang->layout_list = 'Yer. Düzeni Listesi'; - $lang->downloaded_list = 'İndirilenler Listesi'; - $lang->limit_menu_depth = 'Görüntü Etkinleştirildi'; - - $lang->cmd_make_child = 'Alt Menü Ekle'; - $lang->cmd_move_to_installed_list = "Oluşturulanlar Listesini Görüntüle"; - $lang->cmd_enable_move_menu = "Menüyü Taşı (seçtikten sonra üst menüyü sürükleyin)"; - $lang->cmd_search_mid = "mid Ara"; - - $lang->msg_cannot_delete_for_child = 'Altmenüleri olan bir menü silinemez.'; - - $lang->about_title = 'Modüle bağlanacakken, kolayca onaylanacak başlık giriniz.'; - $lang->about_menu_management = "Menü yönetimi size, seçili yerleşim düzeninde menü oluşturma imkani sunar.\nAyarlanmış derinlikte menü oluşturabilir ve menüye tıklayarak detaylı menü bilgisi girebilirsiniz.\nDosya resmine tıklayınca menü genişletilecektir.\nEğer menü normal görüntülenmiyorsa, \"önbellek dosyasını tekrar oluştur\" tuşuna basarak bilgiyi tazeleyiniz.\n* Menü, derinlik limitini geçecek şekilde oluşturulduysa, düzgün gösterilmeyebilir."; - $lang->about_menu_name = 'İsim, eğer yönetici tuşu veya resimli tuş değilse, menü ismi olarak görünecektir.'; - $lang->about_menu_url = "Menü seçildiğindeki menü URLsidir.
    Sadece diğer menüye köprü olacak id değerini girebilirsiniz.
    Eğer hiçbir içerik yoksa, menüye tıklasanız da hiçbir eylem gerçekleşmeyecektir."; - $lang->about_menu_open_window = 'Menüye tıkladığında, sayfanın yeni pencerede açılmasını belirleyebilirsiniz.'; - $lang->about_menu_expand = 'Bu, menünün agaç-menü(tree_menu.js) haline geldiği zaman geniş kalmasını sağlar.'; - $lang->about_menu_img_btn = 'Eğer bir resimli tuş kaydederseniz, resimli tuş otomatik olarak yazı düğmeciğinin yerini alacaktır ve bu yerleşim düzeninde görüntülenecektir.'; - $lang->about_menu_group_srls = 'Eğer bir grup seçerseniz, sadece grup üyeleri menüyü göreceklerdir. (eğer xml dosyası doğrudan açılırsa, menü görüntülenecektir.)'; - - $lang->about_menu = "Menü modülü size, oluşturulmuş menüleri ve linkleri otomatik yolla yerleşim düzenine uyduran uygun menü yönetim yoluyla bütün bir site oluşturmanıza yardımcı olur.\nMenü site yöneticisi değildir fakat; yerleşim düzenlerine ve modüllere köprüleme bilgisi vardır bu şekilde kendinizi farklı şekillerde ifade edebilirsiniz."; - - $lang->alert_image_only = "Sadece resim dosyaları kaydedilebilir."; -?> +cmd_menu_insert = 'Menü Oluştur'; + $lang->cmd_menu_management = 'Menü Yönetimi'; + + $lang->menu = 'Menü'; + $lang->menu_count = 'Menü numarası'; + $lang->menu_management = 'Menü Yönetimi'; + $lang->depth = 'Adım'; + $lang->parent_menu_name = 'Üst Menü İsmi'; + $lang->menu_name = 'Menü İsmi'; + $lang->menu_srl = 'Menü Seri Numarası'; + $lang->menu_id = 'Menü Kimliği'; + $lang->menu_url = 'Menü URLsi'; + $lang->menu_open_window = 'Yeni pencere aç'; + $lang->menu_expand = 'Genişlet'; + $lang->menu_img_btn = 'Resim Tuşu'; + $lang->menu_normal_btn = 'Normal'; + $lang->menu_hover_btn = 'Fare üzerine geldiğinde'; + $lang->menu_active_btn = 'Seçildiğinde'; + $lang->menu_group_srls = 'Erişilebilir Gruplar'; + $lang->layout_maker = "Yerleşim Düzeni Yapıcısı"; + $lang->layout_history = "Güncelleştirme Geçmişi "; + $lang->layout_info = "Yer. Düzeni Bilgisi"; + $lang->layout_list = 'Yer. Düzeni Listesi'; + $lang->downloaded_list = 'İndirilenler Listesi'; + $lang->limit_menu_depth = 'Görüntü Etkinleştirildi'; + + $lang->cmd_make_child = 'Alt Menü Ekle'; + $lang->cmd_move_to_installed_list = "Oluşturulanlar Listesini Görüntüle"; + $lang->cmd_enable_move_menu = "Menüyü Taşı (seçtikten sonra üst menüyü sürükleyin)"; + $lang->cmd_search_mid = "mid Ara"; + + $lang->msg_cannot_delete_for_child = 'Altmenüleri olan bir menü silinemez.'; + + $lang->about_title = 'Modüle bağlanacakken, kolayca onaylanacak başlık giriniz.'; + $lang->about_menu_management = "Menü yönetimi size, seçili yerleşim düzeninde menü oluşturma imkani sunar.\nAyarlanmış derinlikte menü oluşturabilir ve menüye tıklayarak detaylı menü bilgisi girebilirsiniz.\nDosya resmine tıklayınca menü genişletilecektir.\nEğer menü normal görüntülenmiyorsa, \"önbellek dosyasını tekrar oluştur\" tuşuna basarak bilgiyi tazeleyiniz.\n* Menü, derinlik limitini geçecek şekilde oluşturulduysa, düzgün gösterilmeyebilir."; + $lang->about_menu_name = 'İsim, eğer yönetici tuşu veya resimli tuş değilse, menü ismi olarak görünecektir.'; + $lang->about_menu_url = "Menü seçildiğindeki menü URLsidir.
    Sadece diğer menüye köprü olacak id değerini girebilirsiniz.
    Eğer hiçbir içerik yoksa, menüye tıklasanız da hiçbir eylem gerçekleşmeyecektir."; + $lang->about_menu_open_window = 'Menüye tıkladığında, sayfanın yeni pencerede açılmasını belirleyebilirsiniz.'; + $lang->about_menu_expand = 'Bu, menünün agaç-menü(tree_menu.js) haline geldiği zaman geniş kalmasını sağlar.'; + $lang->about_menu_img_btn = 'Eğer bir resimli tuş kaydederseniz, resimli tuş otomatik olarak yazı düğmeciğinin yerini alacaktır ve bu yerleşim düzeninde görüntülenecektir.'; + $lang->about_menu_group_srls = 'Eğer bir grup seçerseniz, sadece grup üyeleri menüyü göreceklerdir. (eğer xml dosyası doğrudan açılırsa, menü görüntülenecektir.)'; + + $lang->about_menu = "Menü modülü size, oluşturulmuş menüleri ve linkleri otomatik yolla yerleşim düzenine uyduran uygun menü yönetim yoluyla bütün bir site oluşturmanıza yardımcı olur.\nMenü site yöneticisi değildir fakat; yerleşim düzenlerine ve modüllere köprüleme bilgisi vardır bu şekilde kendinizi farklı şekillerde ifade edebilirsiniz."; + + $lang->alert_image_only = "Sadece resim dosyaları kaydedilebilir."; +?> diff --git a/modules/menu/lang/vi.lang.php b/modules/menu/lang/vi.lang.php index a9ed11e80..b9443c25c 100644 --- a/modules/menu/lang/vi.lang.php +++ b/modules/menu/lang/vi.lang.php @@ -1,55 +1,55 @@ -cmd_menu_insert = 'Tạo Menu'; - $lang->cmd_menu_management = 'Quản lý Menu'; - - $lang->menu = 'Menu'; - $lang->menu_count = 'Số Menu'; - $lang->menu_management = 'Quản lý Menu'; - $lang->depth = 'Bước'; - $lang->parent_menu_name = 'Tên Menu chính'; - $lang->menu_name = 'Tên Menu'; - $lang->menu_srl = 'Số Serial của Menu'; - $lang->menu_id = 'Menu ID'; - $lang->menu_url = 'Menu URL'; - $lang->menu_open_window = 'Mở ra trang mới'; - $lang->menu_expand = 'Trải rộng'; - $lang->menu_img_btn = 'Hình nút bấm'; - $lang->menu_normal_btn = 'Bình thường'; - $lang->menu_hover_btn = 'Khi trỏ chuột'; - $lang->menu_active_btn = 'Khi chọn'; - $lang->menu_group_srls = 'Nhóm được phép'; - $lang->layout_maker = "Người tạo giao diện"; - $lang->layout_history = "Lịch sử cập nhật"; - $lang->layout_info = "Thông tin giao diện"; - $lang->layout_list = 'Danh sách giao diện'; - $lang->downloaded_list = 'Danh sách Download'; - $lang->limit_menu_depth = 'Được phép hiển thị'; - - $lang->cmd_make_child = 'Thêm Menu con'; - $lang->cmd_move_to_installed_list = "Xem danh sách đã tạo"; - $lang->cmd_enable_move_menu = "Di chuyển Menu (Kéo lên Menu trên sau khi lựa chọn)"; - $lang->cmd_search_mid = "Tìm kiếm Module"; - - $lang->msg_cannot_delete_for_child = 'Không thể xóa Menu khi có những Menu con.'; - - $lang->about_title = 'Xin hãy nhập tiêu đề để dễ dàng xác minh khi kết nối tới Module.'; - $lang->about_menu_management = "Quản lý Menu cho phép bạn bố trí, chọn cách trình bày của Menu.\nBạn có thể tạo những menu và nhập những thông tin khi menu được lựa chọn.\nMenu sẽ đuwọc trải rộng khi bấm và hình thư mục trên Menu.\nNếu Menu không hiển thị một cách bình thường, hãy làm mới thông tin bằng cách bấm \"Tạo File Cache mới\".\n* Menu được tạo quá giới hạn có thể sẽ không hiển thị được như mong muốn."; - $lang->about_menu_name = 'Tên sẽ hiển thị là Tên Menu nếu không phải là Admin hay nút hình ảnh.'; - $lang->about_menu_url = "Nó sẽ là đường dẫn khi bấm vào Menu.
    Bạn có thể chỉ nhập ID cho đường dẫn của Module.
    Nếu để trống, sẽ không thấy tác dụng gì khi bấm vào Menu."; - $lang->about_menu_open_window = 'Hãy chọn nếu bạn muốn mở ra một trang mới khi bấm vào Menu.'; - $lang->about_menu_expand = 'Cho phép Menu luôn trải ra khi (tree_menu.js) được sử dụng.'; - $lang->about_menu_img_btn = 'Nếu đăng kí nút hình ảnh, hình ảnh sẽ tự động chèn lên tên của Menu, và sẽ hiển thị trong giao diện.'; - $lang->about_menu_group_srls = 'Nếu lựa chọn nhóm, thì chỉ những nhóm được chọn mới thấy được Menu. (nếu File XML trực tiếp mở ra, nó sẽ được hiển thị).'; - - $lang->about_menu = "Menu Module sẽ giúp bạn hoàn thiện một trang Web thông qua việc quản lý và sắp xếp thuận tiện, nó sẽ liên kết tới những Module trong Website.\nMenu không phải là người quản lý, nhiệm vụ của nó chỉ là liên kết và tạo sự phong phú trong Website của bạn."; - - $lang->alert_image_only = "Chỉ được phép sử dụng File hình ảnh."; -?> +cmd_menu_insert = 'Tạo Menu'; + $lang->cmd_menu_management = 'Quản lý Menu'; + + $lang->menu = 'Menu'; + $lang->menu_count = 'Số Menu'; + $lang->menu_management = 'Quản lý Menu'; + $lang->depth = 'Bước'; + $lang->parent_menu_name = 'Tên Menu chính'; + $lang->menu_name = 'Tên Menu'; + $lang->menu_srl = 'Số Serial của Menu'; + $lang->menu_id = 'Menu ID'; + $lang->menu_url = 'Menu URL'; + $lang->menu_open_window = 'Mở ra trang mới'; + $lang->menu_expand = 'Trải rộng'; + $lang->menu_img_btn = 'Hình nút bấm'; + $lang->menu_normal_btn = 'Bình thường'; + $lang->menu_hover_btn = 'Khi trỏ chuột'; + $lang->menu_active_btn = 'Khi chọn'; + $lang->menu_group_srls = 'Nhóm được phép'; + $lang->layout_maker = "Người tạo giao diện"; + $lang->layout_history = "Lịch sử cập nhật"; + $lang->layout_info = "Thông tin giao diện"; + $lang->layout_list = 'Danh sách giao diện'; + $lang->downloaded_list = 'Danh sách Download'; + $lang->limit_menu_depth = 'Được phép hiển thị'; + + $lang->cmd_make_child = 'Thêm Menu con'; + $lang->cmd_move_to_installed_list = "Xem danh sách đã tạo"; + $lang->cmd_enable_move_menu = "Di chuyển Menu (Kéo lên Menu trên sau khi lựa chọn)"; + $lang->cmd_search_mid = "Tìm kiếm Module"; + + $lang->msg_cannot_delete_for_child = 'Không thể xóa Menu khi có những Menu con.'; + + $lang->about_title = 'Xin hãy nhập tiêu đề để dễ dàng xác minh khi kết nối tới Module.'; + $lang->about_menu_management = "Quản lý Menu cho phép bạn bố trí, chọn cách trình bày của Menu.\nBạn có thể tạo những menu và nhập những thông tin khi menu được lựa chọn.\nMenu sẽ đuwọc trải rộng khi bấm và hình thư mục trên Menu.\nNếu Menu không hiển thị một cách bình thường, hãy làm mới thông tin bằng cách bấm \"Tạo File Cache mới\".\n* Menu được tạo quá giới hạn có thể sẽ không hiển thị được như mong muốn."; + $lang->about_menu_name = 'Tên sẽ hiển thị là Tên Menu nếu không phải là Admin hay nút hình ảnh.'; + $lang->about_menu_url = "Nó sẽ là đường dẫn khi bấm vào Menu.
    Bạn có thể chỉ nhập ID cho đường dẫn của Module.
    Nếu để trống, sẽ không thấy tác dụng gì khi bấm vào Menu."; + $lang->about_menu_open_window = 'Hãy chọn nếu bạn muốn mở ra một trang mới khi bấm vào Menu.'; + $lang->about_menu_expand = 'Cho phép Menu luôn trải ra khi (tree_menu.js) được sử dụng.'; + $lang->about_menu_img_btn = 'Nếu đăng kí nút hình ảnh, hình ảnh sẽ tự động chèn lên tên của Menu, và sẽ hiển thị trong giao diện.'; + $lang->about_menu_group_srls = 'Nếu lựa chọn nhóm, thì chỉ những nhóm được chọn mới thấy được Menu. (nếu File XML trực tiếp mở ra, nó sẽ được hiển thị).'; + + $lang->about_menu = "Menu Module sẽ giúp bạn hoàn thiện một trang Web thông qua việc quản lý và sắp xếp thuận tiện, nó sẽ liên kết tới những Module trong Website.\nMenu không phải là người quản lý, nhiệm vụ của nó chỉ là liên kết và tạo sự phong phú trong Website của bạn."; + + $lang->alert_image_only = "Chỉ được phép sử dụng File hình ảnh."; +?> diff --git a/modules/menu/lang/zh-CN.lang.php b/modules/menu/lang/zh-CN.lang.php index 34108b4fe..66c614744 100644 --- a/modules/menu/lang/zh-CN.lang.php +++ b/modules/menu/lang/zh-CN.lang.php @@ -1,53 +1,53 @@ -cmd_menu_insert = '生成菜单'; - $lang->cmd_menu_management = '菜单设置'; - - $lang->menu = '菜单'; - $lang->menu_count = '菜单数'; - $lang->menu_management = '菜单管理'; - $lang->depth = '层级'; - $lang->parent_menu_name = '上级菜单名'; - $lang->menu_name = '菜单名'; - $lang->menu_srl = '菜单固有编号'; - $lang->menu_id = '菜单名称'; - $lang->menu_url = '链接'; - $lang->menu_open_window = '新窗口'; - $lang->menu_expand = '展开'; - $lang->menu_img_btn = '图片按钮'; - $lang->menu_normal_btn = '普通'; - $lang->menu_hover_btn = '鼠标滑过'; - $lang->menu_active_btn = '激活链接'; - $lang->menu_group_srls = '用户组'; - $lang->layout_maker = "布局作者"; - $lang->layout_history = "更新列表 "; - $lang->layout_info = "布局信息"; - $lang->layout_list = '布局目录'; - $lang->downloaded_list = '下载目录'; - $lang->limit_menu_depth = '可显示'; - - $lang->cmd_make_child = '添加下级菜单'; - $lang->cmd_move_to_installed_list = "查看生成目录"; - $lang->cmd_enable_move_menu = "菜单顺序(勾选后用鼠标拖动)"; - $lang->cmd_search_mid = "查找 mid"; - - $lang->msg_cannot_delete_for_child = '有下级菜单的菜单不能删除。'; - - $lang->about_title = '请输入连接模块时容易区分的标题。'; - $lang->about_menu_management = "在此创建要在布局中使用的菜单。\n点击菜单前的文件夹图标可以展开收缩菜单。\n偶尔不能正常显示菜单时,请按\"更新缓冲\"按钮更新信息。\n* 不能正常显示指定级(层级)以上的菜单,创建菜单项的时候,请确认你要使用的布局究竟支持多少级别的菜单。"; - $lang->about_menu_name = '输入不是图片按钮时显示为菜单名标题。'; - $lang->about_menu_url = "点击菜单时要移动的URL。
    连接其他模块时只输入id值即可。
    没有内容时点击菜单也不会有什么动作。"; - $lang->about_menu_open_window = '可以设置点击菜单时是否要在新窗口中打开。'; - $lang->about_menu_expand = '使用树型(tree_menu.js)菜单时总是呈展开状态。'; - $lang->about_menu_img_btn = '如登录图片按钮,在布局中自动替换显示为图片按钮。'; - $lang->about_menu_group_srls = '如选择用户组,只有所属组用户才能看到此菜单。 —(xml文件中不能隐藏)'; - - $lang->about_menu = "菜单模块可以通过菜单管理器整理已生成的模块并同布局相连接来轻松建设一个完整的网站。\n菜单模块虽然具有连接模块和布局并通过布局来显示多种形态菜单的信息,但它不具备管理网站的功能。"; - - $lang->alert_image_only = "只允许图形文件。"; -?> +cmd_menu_insert = '生成菜单'; + $lang->cmd_menu_management = '菜单设置'; + + $lang->menu = '菜单'; + $lang->menu_count = '菜单数'; + $lang->menu_management = '菜单管理'; + $lang->depth = '层级'; + $lang->parent_menu_name = '上级菜单名'; + $lang->menu_name = '菜单名'; + $lang->menu_srl = '菜单固有编号'; + $lang->menu_id = '菜单名称'; + $lang->menu_url = '链接'; + $lang->menu_open_window = '新窗口'; + $lang->menu_expand = '展开'; + $lang->menu_img_btn = '图片按钮'; + $lang->menu_normal_btn = '普通'; + $lang->menu_hover_btn = '鼠标滑过'; + $lang->menu_active_btn = '激活链接'; + $lang->menu_group_srls = '用户组'; + $lang->layout_maker = "布局作者"; + $lang->layout_history = "更新列表 "; + $lang->layout_info = "布局信息"; + $lang->layout_list = '布局目录'; + $lang->downloaded_list = '下载目录'; + $lang->limit_menu_depth = '可显示'; + + $lang->cmd_make_child = '添加下级菜单'; + $lang->cmd_move_to_installed_list = "查看生成目录"; + $lang->cmd_enable_move_menu = "菜单顺序(勾选后用鼠标拖动)"; + $lang->cmd_search_mid = "查找 mid"; + + $lang->msg_cannot_delete_for_child = '有下级菜单的菜单不能删除。'; + + $lang->about_title = '请输入连接模块时容易区分的标题。'; + $lang->about_menu_management = "在此创建要在布局中使用的菜单。\n点击菜单前的文件夹图标可以展开收缩菜单。\n偶尔不能正常显示菜单时,请按\"更新缓冲\"按钮更新信息。\n* 不能正常显示指定级(层级)以上的菜单,创建菜单项的时候,请确认你要使用的布局究竟支持多少级别的菜单。"; + $lang->about_menu_name = '输入不是图片按钮时显示为菜单名标题。'; + $lang->about_menu_url = "点击菜单时要移动的URL。
    连接其他模块时只输入id值即可。
    没有内容时点击菜单也不会有什么动作。"; + $lang->about_menu_open_window = '可以设置点击菜单时是否要在新窗口中打开。'; + $lang->about_menu_expand = '使用树型(tree_menu.js)菜单时总是呈展开状态。'; + $lang->about_menu_img_btn = '如登录图片按钮,在布局中自动替换显示为图片按钮。'; + $lang->about_menu_group_srls = '如选择用户组,只有所属组用户才能看到此菜单。 —(xml文件中不能隐藏)'; + + $lang->about_menu = "菜单模块可以通过菜单管理器整理已生成的模块并同布局相连接来轻松建设一个完整的网站。\n菜单模块虽然具有连接模块和布局并通过布局来显示多种形态菜单的信息,但它不具备管理网站的功能。"; + + $lang->alert_image_only = "只允许图形文件。"; +?> diff --git a/modules/menu/lang/zh-TW.lang.php b/modules/menu/lang/zh-TW.lang.php index af91649ed..23ba5bb6b 100644 --- a/modules/menu/lang/zh-TW.lang.php +++ b/modules/menu/lang/zh-TW.lang.php @@ -1,53 +1,53 @@ -cmd_menu_insert = '建立選單'; - $lang->cmd_menu_management = '選單設置'; - - $lang->menu = '選單'; - $lang->menu_count = '選單數'; - $lang->menu_management = '選單管理'; - $lang->depth = '層級'; - $lang->parent_menu_name = '主選單名稱'; - $lang->menu_name = '選單名稱'; - $lang->menu_srl = '選單編號'; - $lang->menu_id = '選單名稱'; - $lang->menu_url = '連結'; - $lang->menu_open_window = '新視窗'; - $lang->menu_expand = '展開'; - $lang->menu_img_btn = '圖片按鈕'; - $lang->menu_normal_btn = '普通'; - $lang->menu_hover_btn = '滑鼠移過'; - $lang->menu_active_btn = '啟動連結'; - $lang->menu_group_srls = '群組'; - $lang->layout_maker = "版面作者"; - $lang->layout_history = "更新列表"; - $lang->layout_info = "版面資料"; - $lang->layout_list = '版面列表'; - $lang->downloaded_list = '版面選擇'; - $lang->limit_menu_depth = '可顯示'; - - $lang->cmd_make_child = '新增子選單'; - $lang->cmd_move_to_installed_list = "檢視建立列表"; - $lang->cmd_enable_move_menu = "選單順序(勾選後可用滑鼠拖曳)"; - $lang->cmd_search_mid = "尋找 mid"; - - $lang->msg_cannot_delete_for_child = '有子選單的選單不能刪除。'; - - $lang->about_title = '請輸入連接模組時,容易區分的標題。'; - $lang->about_menu_management = "選單管理可以建構所選擇版面中使用的選單。\n不僅可以建構指定級(層級)選單,點擊輸入的選單名稱即可對其進行詳細設置。\n點擊選單前圖標可以展開選單。\n偶爾無法正常顯示選單時,請按\"重新建立暫存檔\"按鈕更新資料。\n* 可能無法正常顯示指定級(層級)以上的選單。"; - $lang->about_menu_name = '輸入不是圖片按鈕時,顯示為選單名標題。'; - $lang->about_menu_url = "按選單名稱後,要移往的網址。
    連結其他模組時,只要輸入模組mid即可。
    沒有內容時,點擊選單不會產生任何事情。"; - $lang->about_menu_open_window = '按選單後,是否要以新視窗開啟。'; - $lang->about_menu_expand = '使用樹型選單(tree_menu.js)時,總是呈現展開狀態。'; - $lang->about_menu_img_btn = '如果登錄圖片按鈕,在版面中會自動替換顯示為圖片按鈕。'; - $lang->about_menu_group_srls = '如果選擇群組,只有所屬群組才能看到此選單。(如果可直接連結xml檔案,內容將無法隱藏)'; - - $lang->about_menu = "選單模組可以透過選單管理器,管理已建立的模組並可和版面相互連結,輕鬆架設一個完整的網站。\n選單模組雖然可連結模組和版面,並透過版面來顯示多種類型的選單,但它不具備管理網站的功能。"; - - $lang->alert_image_only = "只允許圖形檔案。"; -?> +cmd_menu_insert = '建立選單'; + $lang->cmd_menu_management = '選單設置'; + + $lang->menu = '選單'; + $lang->menu_count = '選單數'; + $lang->menu_management = '選單管理'; + $lang->depth = '層級'; + $lang->parent_menu_name = '主選單名稱'; + $lang->menu_name = '選單名稱'; + $lang->menu_srl = '選單編號'; + $lang->menu_id = '選單名稱'; + $lang->menu_url = '連結'; + $lang->menu_open_window = '新視窗'; + $lang->menu_expand = '展開'; + $lang->menu_img_btn = '圖片按鈕'; + $lang->menu_normal_btn = '普通'; + $lang->menu_hover_btn = '滑鼠移過'; + $lang->menu_active_btn = '啟動連結'; + $lang->menu_group_srls = '群組'; + $lang->layout_maker = "版面作者"; + $lang->layout_history = "更新列表"; + $lang->layout_info = "版面資料"; + $lang->layout_list = '版面列表'; + $lang->downloaded_list = '版面選擇'; + $lang->limit_menu_depth = '可顯示'; + + $lang->cmd_make_child = '新增子選單'; + $lang->cmd_move_to_installed_list = "檢視建立列表"; + $lang->cmd_enable_move_menu = "選單順序(勾選後可用滑鼠拖曳)"; + $lang->cmd_search_mid = "尋找 mid"; + + $lang->msg_cannot_delete_for_child = '有子選單的選單不能刪除。'; + + $lang->about_title = '請輸入連接模組時,容易區分的標題。'; + $lang->about_menu_management = "選單管理可以建構所選擇版面中使用的選單。\n不僅可以建構指定級(層級)選單,點擊輸入的選單名稱即可對其進行詳細設置。\n點擊選單前圖標可以展開選單。\n偶爾無法正常顯示選單時,請按\"重新建立暫存檔\"按鈕更新資料。\n* 可能無法正常顯示指定級(層級)以上的選單。"; + $lang->about_menu_name = '輸入不是圖片按鈕時,顯示為選單名標題。'; + $lang->about_menu_url = "按選單名稱後,要移往的網址。
    連結其他模組時,只要輸入模組mid即可。
    沒有內容時,點擊選單不會產生任何事情。"; + $lang->about_menu_open_window = '按選單後,是否要以新視窗開啟。'; + $lang->about_menu_expand = '使用樹型選單(tree_menu.js)時,總是呈現展開狀態。'; + $lang->about_menu_img_btn = '如果登錄圖片按鈕,在版面中會自動替換顯示為圖片按鈕。'; + $lang->about_menu_group_srls = '如果選擇群組,只有所屬群組才能看到此選單。(如果可直接連結xml檔案,內容將無法隱藏)'; + + $lang->about_menu = "選單模組可以透過選單管理器,管理已建立的模組並可和版面相互連結,輕鬆架設一個完整的網站。\n選單模組雖然可連結模組和版面,並透過版面來顯示多種類型的選單,但它不具備管理網站的功能。"; + + $lang->alert_image_only = "只允許圖形檔案。"; +?> diff --git a/modules/menu/menu.admin.controller.php b/modules/menu/menu.admin.controller.php index 1084dc426..7645dfb51 100644 --- a/modules/menu/menu.admin.controller.php +++ b/modules/menu/menu.admin.controller.php @@ -1,654 +1,654 @@ -site_srl = (int)$site_module_info->site_srl; - $args->title = Context::get('title'); - $args->menu_srl = getNextSequence(); - $args->listorder = $args->menu_srl * -1; - - $output = executeQuery('menu.insertMenu', $args); - if(!$output->toBool()) return $output; - - $this->add('menu_srl', $args->menu_srl); - $this->setMessage('success_registed'); - } - - /** - * @brief 메뉴 제목 변경 - **/ - function procMenuAdminUpdate() { - // 입력할 변수 정리 - $args->title = Context::get('title'); - $args->menu_srl = Context::get('menu_srl'); - - $output = executeQuery('menu.updateMenu', $args); - if(!$output->toBool()) return $output; - - $this->setMessage('success_registed'); - } - - /** - * @brief 메뉴 삭제 - * menu_item과 xml 캐시 파일 모두 삭제 - **/ - function procMenuAdminDelete() { - $menu_srl = Context::get('menu_srl'); - return $this->deleteMenu($menu_srl); - } - - function deleteMenu($menu_srl) { - // 캐시 파일 삭제 - $cache_list = FileHandler::readDir("./files/cache/menu","",false,true); - if(count($cache_list)) { - foreach($cache_list as $cache_file) { - $pos = strpos($cache_file, $menu_srl.'_'); - if($pos>0)FileHandler::removeFile($cache_file); - } - } - - // 이미지 버튼 모두 삭제 - $image_path = sprintf('./files/attach/menu_button/%s', $menu_srl); - FileHandler::removeDir($image_path); - - $args->menu_srl = $menu_srl; - - // 메뉴 메뉴 삭제 - $output = executeQuery("menu.deleteMenuItems", $args); - if(!$output->toBool()) return $output; - - // 메뉴 삭제 - $output = executeQuery("menu.deleteMenu", $args); - if(!$output->toBool()) return $output; - - return new Object(0,'success_deleted'); - } - - /** - * @brief 메뉴에 아이템 추가 - **/ - function procMenuAdminInsertItem() { - // 입력할 변수 정리 - $source_args = Context::getRequestVars(); - unset($source_args->module); - unset($source_args->act); - if($source_args->menu_open_window!="Y") $source_args->menu_open_window = "N"; - if($source_args->menu_expand !="Y") $source_args->menu_expand = "N"; - $source_args->group_srls = str_replace('|@|',',',$source_args->group_srls); - $source_args->parent_srl = (int)$source_args->parent_srl; - - // 변수를 다시 정리 (form문의 column과 DB column이 달라서) - $args->menu_srl = $source_args->menu_srl; - $args->menu_item_srl = $source_args->menu_item_srl; - $args->parent_srl = $source_args->parent_srl; - $args->menu_srl = $source_args->menu_srl; - $args->menu_id = $source_args->menu_id; - $args->name = $source_args->menu_name; - $args->url = trim($source_args->menu_url); - $args->open_window = $source_args->menu_open_window; - $args->expand = $source_args->menu_expand; - $args->normal_btn = $source_args->normal_btn; - $args->hover_btn = $source_args->hover_btn; - $args->active_btn = $source_args->active_btn; - $args->group_srls = $source_args->group_srls; - - // 이미 존재하는지를 확인 - $oMenuModel = &getAdminModel('menu'); - $item_info = $oMenuModel->getMenuItemInfo($args->menu_item_srl); - - // 존재하게 되면 update를 해준다 - if($item_info->menu_item_srl == $args->menu_item_srl) { - $output = executeQuery('menu.updateMenuItem', $args); - if(!$output->toBool()) return $output; - - // 존재하지 않으면 insert를 해준다 - } else { - $args->listorder = -1*$args->menu_item_srl; - $output = executeQuery('menu.insertMenuItem', $args); - if(!$output->toBool()) return $output; - } - - // 해당 메뉴의 정보를 구함 - $menu_info = $oMenuModel->getMenu($args->menu_srl); - $menu_title = $menu_info->title; - - // XML 파일을 갱신하고 위치을 넘겨 받음 - $xml_file = $this->makeXmlFile($args->menu_srl); - - // url이 mid일 경우 기록 남김 - if(preg_match('/^([a-zA-Z0-9\_\-]+)$/', $args->url)) { - $mid = $args->url; - - $mid_args->menu_srl = $args->menu_srl; - $mid_args->mid = $mid; - - // menu_srl에 해당하는 레이아웃 값을 구함 - $output = executeQuery('menu.getMenuLayout', $args); - - // 해당 모듈에 레이아웃 값이 정해져 있지 않으면 지정 - $oModuleModel = &getModel('module'); - $module_info = $oModuleModel->getModuleInfoByMid($mid); - if(!$module_info->layout_srl&&$output->data->layout_srl) $mid_args->layout_srl = $output->data->layout_srl; - - // 해당 mid의 메뉴값을 선택된 메뉴로 변경 - $oModuleController = &getController('module'); - $oModuleController->updateModuleMenu($mid_args); - } - - $this->add('xml_file', $xml_file); - $this->add('menu_srl', $args->menu_srl); - $this->add('menu_item_srl', $args->menu_item_srl); - $this->add('menu_title', $menu_title); - $this->add('parent_srl', $args->parent_srl); - } - - /** - * @brief 메뉴 메뉴 삭제 - **/ - function procMenuAdminDeleteItem() { - // 변수 정리 - $args = Context::gets('menu_srl','menu_item_srl'); - - $oMenuAdminModel = &getAdminModel('menu'); - - // 원정보를 가져옴 - $item_info = $oMenuAdminModel->getMenuItemInfo($args->menu_item_srl); - if($item_info->parent_srl) $parent_srl = $item_info->parent_srl; - - // 자식 노드가 있는지 체크하여 있으면 삭제 못한다는 에러 출력 - $output = executeQuery('menu.getChildMenuCount', $args); - if(!$output->toBool()) return $output; - if($output->data->count>0) return new Object(-1, 'msg_cannot_delete_for_child'); - - // DB에서 삭제 - $output = executeQuery("menu.deleteMenuItem", $args); - if(!$output->toBool()) return $output; - - // 해당 메뉴의 정보를 구함 - $menu_info = $oMenuAdminModel->getMenu($args->menu_srl); - $menu_title = $menu_info->title; - - // XML 파일을 갱신하고 위치을 넘겨 받음 - $xml_file = $this->makeXmlFile($args->menu_srl); - - // 이미지 버튼 모두 삭제 - if($item_info->normal_btn) FileHandler::removeFile($item_info->normal_btn); - if($item_info->hover_btn) FileHandler::removeFile($item_info->hover_btn); - if($item_info->active_btn) FileHandler::removeFile($item_info->active_btn); - - $this->add('xml_file', $xml_file); - $this->add('menu_title', $menu_title); - $this->add('menu_item_srl', $parent_srl); - $this->setMessage('success_deleted'); - } - - /** - * @brief 메뉴의 메뉴를 이동 - **/ - function procMenuAdminMoveItem() { - $menu_srl = Context::get('menu_srl'); - $mode = Context::get('mode'); - $parent_srl = Context::get('parent_srl'); - $source_srl = Context::get('source_srl'); - $target_srl = Context::get('target_srl'); - - if(!$menu_srl || !$mode || !$target_srl) return new Object(-1,'msg_invalid_request'); - $this->moveMenuItem($menu_srl,$parent_srl,$source_srl,$target_srl,$mode); - } - - function moveMenuItem($menu_srl,$parent_srl,$source_srl,$target_srl,$mode){ - // 원본 메뉴들을 구함 - $oMenuAdminModel = &getAdminModel('menu'); - - $target_item = $oMenuAdminModel->getMenuItemInfo($target_srl); - if($target_item->menu_item_srl != $target_srl) return new Object(-1,'msg_invalid_request'); - - // 위치 이동 (순서 조절) - if($mode == 'move') { - $args->parent_srl = $parent_srl; - $args->menu_srl = $menu_srl; - - if($source_srl) { - $source_item = $oMenuAdminModel->getMenuItemInfo($source_srl); - if($source_item->menu_item_srl != $source_srl) return new Object(-1,'msg_invalid_request'); - $args->listorder = $source_item->listorder-1; - } else { - $output = executeQuery('menu.getMaxListorder', $args); - if(!$output->toBool()) return $output; - $args->listorder = (int)$output->data->listorder; - if(!$args->listorder) $args->listorder= 0; - } - $args->parent_srl = $parent_srl; - $output = executeQuery('menu.updateMenuItemListorder', $args); - if(!$output->toBool()) return $output; - - $args->parent_srl = $parent_srl; - $args->menu_item_srl = $target_srl; - $output = executeQuery('menu.updateMenuItemNode', $args); - if(!$output->toBool()) return $output; - // 자식으로 추가 - } elseif($mode == 'insert') { - $args->menu_item_srl = $target_srl; - $args->parent_srl = $parent_srl; - $args->listorder = -1*getNextSequence(); - $output = executeQuery('menu.updateMenuItemNode', $args); - if(!$output->toBool()) return $output; - } - - $xml_file = $this->makeXmlFile($menu_srl); - return $xml_file; - } - - /** - * @brief xml 파일을 갱신 - * 관리자페이지에서 메뉴 구성 후 간혹 xml파일이 재생성 안되는 경우가 있는데\n - * 이럴 경우 관리자의 수동 갱신 기능을 구현해줌\n - * 개발 중간의 문제인 것 같고 현재는 문제가 생기지 않으나 굳이 없앨 필요 없는 기능 - **/ - function procMenuAdminMakeXmlFile() { - // 입력값을 체크 - $menu_srl = Context::get('menu_srl'); - - // 해당 메뉴의 정보를 구함 - $oMenuAdminModel = &getAdminModel('menu'); - $menu_info = $oMenuAdminModel->getMenu($menu_srl); - $menu_title = $menu_info->title; - - // xml파일 재생성 - $xml_file = $this->makeXmlFile($menu_srl); - - // return 값 설정 - $this->add('menu_title',$menu_title); - $this->add('xml_file',$xml_file); - } - - /** - * @brief 메뉴 이미지 버튼을 등록 - **/ - function procMenuAdminUploadButton() { - $menu_srl = Context::get('menu_srl'); - $menu_item_srl = Context::get('menu_item_srl'); - $target = Context::get('target'); - $target_file = Context::get($target); - - // 필수 요건이 없거나 업로드된 파일이 아니면 오류 발생 - if(!$menu_srl || !$menu_item_srl || !$target_file || !is_uploaded_file($target_file['tmp_name']) || !preg_match('/\.(gif|jpeg|jpg|png)/i',$target_file['name'])) { - Context::set('error_messge', Context::getLang('msg_invalid_request')); - - // 요건을 만족하고 업로드된 파일이면 지정된 위치로 이동 - } else { - $tmp_arr = explode('.',$target_file['name']); - $ext = $tmp_arr[count($tmp_arr)-1]; - - $path = sprintf('./files/attach/menu_button/%d/', $menu_srl); - $filename = sprintf('%s%d.%s.%s', $path, $menu_item_srl, $target, $ext); - - if(!is_dir($path)) FileHandler::makeDir($path); - - move_uploaded_file($target_file['tmp_name'], $filename); - Context::set('filename', $filename); - } - - - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('menu_file_uploaded'); - } - - /** - * @brief 등록된 메뉴 이미지 제거 - **/ - function procMenuAdminDeleteButton() { - $menu_srl = Context::get('menu_srl'); - $menu_item_srl = Context::get('menu_item_srl'); - $target = Context::get('target'); - $filename = Context::get('filename'); - FileHandler::removeFile($filename); - - $this->add('target', $target); - } - - /** - * @brief 메뉴의 xml 파일을 만들고 위치를 return - **/ - function makeXmlFile($menu_srl) { - // xml파일 생성시 필요한 정보가 없으면 그냥 return - if(!$menu_srl) return; - - // 메뉴 정보를 구함 - $args->menu_srl = $menu_srl; - $output = executeQuery('menu.getMenu', $args); - if(!$output->toBool() || !$output->data) return $output; - $site_srl = (int)$output->data->site_srl; - - if($site_srl) { - $oModuleModel = &getModel('module'); - $site_info = $oModuleModel->getSiteInfo($site_srl); - $domain = $site_info->domain; - } - - // DB에서 menu_srl에 해당하는 메뉴 아이템 목록을 listorder순으로 구해옴 - $args->menu_srl = $menu_srl; - $args->sort_index = 'listorder'; - $output = executeQuery('menu.getMenuItems', $args); - if(!$output->toBool()) return; - - // 캐시 파일의 이름을 지정 - $xml_file = sprintf("./files/cache/menu/%s.xml.php", $menu_srl); - $php_file = sprintf("./files/cache/menu/%s.php", $menu_srl); - - // 구해온 데이터가 없다면 노드데이터가 없는 xml 파일만 생성 - $list = $output->data; - if(!$list) { - $xml_buff = ""; - FileHandler::writeFile($xml_file, $xml_buff); - FileHandler::writeFile($php_file, ''); - return $xml_file; - } - - // 구해온 데이터가 하나라면 array로 바꾸어줌 - if(!is_array($list)) $list = array($list); - - // 루프를 돌면서 tree 구성 - $list_count = count($list); - for($i=0;$i<$list_count;$i++) { - $node = $list[$i]; - $menu_item_srl = $node->menu_item_srl; - $parent_srl = $node->parent_srl; - - $tree[$parent_srl][$menu_item_srl] = $node; - } - - // 캐시 파일의 권한과 그룹 설정을 위한 공통 헤더 - $header_script = - '$lang_type = Context::getLangType(); '. - '$is_logged = Context::get(\'is_logged\'); '. - '$logged_info = Context::get(\'logged_info\'); '. - '$site_srl = '.$site_srl.';'. - '$site_admin = false;'. - 'if($site_srl) { '. - '$oModuleModel = &getModel(\'module\');'. - '$site_module_info = $oModuleModel->getSiteInfo($site_srl); '. - 'Context::set(\'site_module_info\',$site_module_info);'. - '$grant = $oModuleModel->getGrant($site_module_info, $logged_info); '. - 'if($grant->manager ==1) $site_admin = true;'. - '}'. - 'if($is_logged) {'. - 'if($logged_info->is_admin=="Y" || $site_admin) $is_admin = true; '. - 'else $is_admin = false; '. - '$group_srls = array_keys($logged_info->group_list); '. - '} else { '. - '$is_admin = false; '. - '$group_srsl = array(); '. - '} '; - - // xml 캐시 파일 생성 (xml캐시는 따로 동작하기에 session 지정을 해주어야 함) - $xml_buff = sprintf( - 'init(); '. - 'header("Content-Type: text/xml; charset=UTF-8"); '. - 'header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); '. - 'header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); '. - 'header("Cache-Control: no-store, no-cache, must-revalidate"); '. - 'header("Cache-Control: post-check=0, pre-check=0", false); '. - 'header("Pragma: no-cache"); '. - '%s '. - '$oContext->close(); '. - '?>'. - '%s', - $header_script, - $this->getXmlTree($tree[0], $tree, $site_srl, $domain) - ); - - // php 캐시 파일 생성 - $php_output = $this->getPhpCacheCode($tree[0], $tree, $site_srl, $domain); - $php_buff = sprintf( - 'list = array(%s); '. - '?>', - $header_script, - $php_output['name'], - $php_output['buff'] - ); - - // 파일 저장 - FileHandler::writeFile($xml_file, $xml_buff); - FileHandler::writeFile($php_file, $php_buff); - return $xml_file; - } - - /** - * @brief array로 정렬된 노드들을 parent_srl을 참조하면서 recursive하게 돌면서 xml 데이터 생성 - * 메뉴 xml파일은 node라는 tag가 중첩으로 사용되며 이 xml doc으로 관리자 페이지에서 메뉴를 구성해줌\n - * (tree_menu.js 에서 xml파일을 바로 읽고 tree menu를 구현) - **/ - function getXmlTree($source_node, $tree, $site_srl, $domain) { - if(!$source_node) return; - - $oMenuAdminModel = &getAdminModel('menu'); - - foreach($source_node as $menu_item_srl => $node) { - $child_buff = ""; - - // 자식 노드의 데이터 가져옴 - if($menu_item_srl&&$tree[$menu_item_srl]) $child_buff = $this->getXmlTree($tree[$menu_item_srl], $tree, $site_srl, $domain); - - // 변수 정리 - $names = $oMenuAdminModel->getMenuItemNames($node->name, $site_srl); - foreach($names as $key => $val) { - $name_arr_str .= sprintf('"%s"=>"%s",',$key, str_replace('\\','\\\\',htmlspecialchars($val))); - } - $name_str = sprintf('$_names = array(%s); print $_names[$lang_type];', $name_arr_str); - - $url = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->url); - if(preg_match('/^([0-9a-zA-Z\_\-]+)$/', $node->url)) { - $href = getSiteUrl($domain, '','mid',$node->url); - $pos = strpos($href, $_SERVER['HTTP_HOST']); - if($pos !== false) $href = substr($href, $pos+strlen($_SERVER['HTTP_HOST'])); - } else $href = $url; - $open_window = $node->open_window; - $expand = $node->expand; - - $normal_btn = $node->normal_btn; - if($normal_btn && preg_match('/^\.\/files\/attach\/menu_button/i',$normal_btn)) $normal_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$normal_btn); - else $normal_btn = ''; - $hover_btn = $node->hover_btn; - if($hover_btn && preg_match('/^\.\/files\/attach\/menu_button/i',$hover_btn)) $hover_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$hover_btn); - else $hover_btn = ''; - $active_btn = $node->active_btn; - if($active_btn && preg_match('/^\.\/files\/attach\/menu_button/i',$active_btn)) $active_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$active_btn); - else $active_btn = ''; - - $group_srls = $node->group_srls; - - if($normal_btn) { - if(preg_match('/\.png$/',$normal_btn)) $classname = 'class="iePngFix"'; - else $classname = ''; - if($hover_btn) $hover_str = sprintf('onmouseover="this.src=\'%s\'"', $hover_btn); else $hover_str = ''; - if($active_btn) $active_str = sprintf('onmousedown="this.src=\'%s\'"', $active_btn); else $active_str = ''; - $link = sprintf('<img src="%s" onmouseout="this.src=\'%s\'" alt="" %s %s %s />', $normal_btn, $normal_btn, $hover_str, $active_str, $classname); - } else { - $link = ''; - } - - // node->group_srls값이 있으면 - if($group_srls) $group_check_code = sprintf('($is_admin==true||(is_array($group_srls)&&count(array_intersect($group_srls, array(%s)))))',$group_srls); - else $group_check_code = "true"; - $attribute = sprintf( - 'node_srl="%s" parent_srl="%s" text="" url="" href="" open_window="%s" expand="%s" normal_btn="%s" hover_btn="%s" active_btn="%s" link="%s"', - $menu_item_srl, - $node->parent_srl, - $group_check_code, - $name_str, - $group_check_code, - $url, - $group_check_code, - $href, - $open_window, - $expand, - $normal_btn, - $hover_btn, - $active_btn, - $group_check_code, - $link - ); - - if($child_buff) $buff .= sprintf('%s', $attribute, $child_buff); - else $buff .= sprintf('', $attribute); - } - return $buff; - } - - /** - * @brief array로 정렬된 노드들을 php code로 변경하여 return - * 메뉴에서 메뉴를 tpl에 사용시 xml데이터를 사용할 수도 있지만 별도의 javascript 사용이 필요하기에 - * php로 된 캐시파일을 만들어서 db이용없이 바로 메뉴 정보를 구할 수 있도록 한다 - * 이 캐시는 ModuleHandler::displayContent() 에서 include하여 Context::set() 한다 - **/ - function getPhpCacheCode($source_node, $tree, $site_srl, $domain) { - $output = array("buff"=>"", "url_list"=>array()); - if(!$source_node) return $output; - - $oMenuAdminModel = &getAdminModel('menu'); - - foreach($source_node as $menu_item_srl => $node) { - // 자식 노드가 있으면 자식 노드의 데이터를 먼저 얻어옴 - if($menu_item_srl&&$tree[$menu_item_srl]) $child_output = $this->getPhpCacheCode($tree[$menu_item_srl], $tree, $site_srl, $domain); - else $child_output = array("buff"=>"", "url_list"=>array()); - - // 변수 정리 - $names = $oMenuAdminModel->getMenuItemNames($node->name, $site_srl); - foreach($names as $key => $val) { - $name_arr_str .= sprintf('"%s"=>"%s",',$key, str_replace(array('\\','"'),array('\\\\','"'),$val)); - } - $name_str = sprintf('$_menu_names[%d] = array(%s); %s', $node->menu_item_srl, $name_arr_str, $child_output['name']); - - // 현재 노드의 url값이 공란이 아니라면 url_list 배열값에 입력 - if($node->url) $child_output['url_list'][] = $node->url; - $output['url_list'] = array_merge($output['url_list'], $child_output['url_list']); - - // node->group_srls값이 있으면 - if($node->group_srls) $group_check_code = sprintf('($is_admin==true||(is_array($group_srls)&&count(array_intersect($group_srls, array(%s)))))',$node->group_srls); - else $group_check_code = "true"; - - // 변수 정리 - $href = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->href); - $url = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->url); - if(preg_match('/^([0-9a-zA-Z\_\-]+)$/i', $node->url)) { - $href = getSiteUrl($domain, '','mid',$node->url); - $pos = strpos($href, $_SERVER['HTTP_HOST']); - if($pos !== false) $href = substr($href, $pos+strlen($_SERVER['HTTP_HOST'])); - } else $href = $url; - $open_window = $node->open_window; - $normal_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->normal_btn); - $hover_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->hover_btn); - $active_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->active_btn); - $selected = '"'.implode('","',$child_output['url_list']).'"'; - $child_buff = $child_output['buff']; - $expand = $node->expand; - - $normal_btn = $node->normal_btn; - if($normal_btn && preg_match('/^\.\/files\/attach\/menu_button/i',$normal_btn)) $normal_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$normal_btn); - else $normal_btn = ''; - - $hover_btn = $node->hover_btn; - if($hover_btn && preg_match('/^\.\/files\/attach\/menu_button/i',$hover_btn)) $hover_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$hover_btn); - else $hover_btn = ''; - - $active_btn = $node->active_btn; - if($active_btn && preg_match('/^\.\/files\/attach\/menu_button/i',$active_btn)) $active_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$active_btn); - else $active_btn = ''; - - $group_srls = $node->group_srls; - - if($normal_btn) { - if(preg_match('/\.png$/',$normal_btn)) $classname = 'class=\"iePngFix\"'; - else $classname = ''; - if($hover_btn) $hover_str = sprintf('onmouseover=\"this.src=\'%s\'\"', $hover_btn); else $hover_str = ''; - if($active_btn) $active_str = sprintf('onmousedown=\"this.src=\'%s\'\"', $active_btn); else $active_str = ''; - $link = sprintf('"\"".$_menu_names[%d][$lang_type]."\""', $normal_btn, $normal_btn, $node->menu_item_srl, $hover_str, $active_str, $classname); - if($active_btn) $link_active = sprintf('"\"".$_menu_names[%d][$lang_type]."\""', $active_btn, $node->menu_item_srl, $classname); - else $link_active = $link; - } else { - $link_active = $link = sprintf('$_menu_names[%d][$lang_type]', $node->menu_item_srl); - } - - // 속성을 생성한다 ( url_list를 이용해서 선택된 메뉴의 노드에 속하는지를 검사한다. 꽁수지만 빠르고 강력하다고 생각;;) - $attribute = sprintf( - '"node_srl"=>"%s","parent_srl"=>"%s","text"=>(%s?$_menu_names[%d][$lang_type]:""),"href"=>(%s?"%s":""),"url"=>(%s?"%s":""),"open_window"=>"%s","normal_btn"=>"%s","hover_btn"=>"%s","active_btn"=>"%s","selected"=>(array(%s)&&in_array(Context::get("mid"),array(%s))?1:0),"expand"=>"%s", "list"=>array(%s), "link"=>(%s? ( array(%s)&&in_array(Context::get("mid"),array(%s)) ?%s:%s):""),', - $node->menu_item_srl, - $node->parent_srl, - $group_check_code, - $node->menu_item_srl, - $group_check_code, - $href, - $group_check_code, - $url, - $open_window, - $normal_btn, - $hover_btn, - $active_btn, - $selected, - $selected, - $expand, - $child_buff, - $group_check_code, - $selected, - $selected, - $link_active, - $link - ); - - // buff 데이터를 생성한다 - $output['buff'] .= sprintf('%s=>array(%s),', $node->menu_item_srl, $attribute); - $output['name'] .= $name_str; - } - return $output; - } - - /** - * @brief 메뉴와 레이아웃 매핑 - * 레이아웃에서 메뉴를 지정할때 지정된 메뉴의 기본 레이아웃을 매핑 - **/ - function updateMenuLayout($layout_srl, $menu_srl_list) { - if(!count($menu_srl_list)) return; - - // 일단 menu_srls의 값을 지움 - $args->menu_srls = implode(',',$menu_srl_list); - $output = executeQuery('menu.deleteMenuLayout', $args); - if(!$output->toBool()) return $output; - - $args->layout_srl = $layout_srl; - - // menu_srls, layout_srl 매핑 - for($i=0;$imenu_srl = $menu_srl_list[$i]; - $output = executeQuery('menu.insertMenuLayout', $args); - if(!$output->toBool()) return $output; - } - } - - } -?> +site_srl = (int)$site_module_info->site_srl; + $args->title = Context::get('title'); + $args->menu_srl = getNextSequence(); + $args->listorder = $args->menu_srl * -1; + + $output = executeQuery('menu.insertMenu', $args); + if(!$output->toBool()) return $output; + + $this->add('menu_srl', $args->menu_srl); + $this->setMessage('success_registed'); + } + + /** + * @brief 메뉴 제목 변경 + **/ + function procMenuAdminUpdate() { + // 입력할 변수 정리 + $args->title = Context::get('title'); + $args->menu_srl = Context::get('menu_srl'); + + $output = executeQuery('menu.updateMenu', $args); + if(!$output->toBool()) return $output; + + $this->setMessage('success_registed'); + } + + /** + * @brief 메뉴 삭제 + * menu_item과 xml 캐시 파일 모두 삭제 + **/ + function procMenuAdminDelete() { + $menu_srl = Context::get('menu_srl'); + return $this->deleteMenu($menu_srl); + } + + function deleteMenu($menu_srl) { + // 캐시 파일 삭제 + $cache_list = FileHandler::readDir("./files/cache/menu","",false,true); + if(count($cache_list)) { + foreach($cache_list as $cache_file) { + $pos = strpos($cache_file, $menu_srl.'_'); + if($pos>0)FileHandler::removeFile($cache_file); + } + } + + // 이미지 버튼 모두 삭제 + $image_path = sprintf('./files/attach/menu_button/%s', $menu_srl); + FileHandler::removeDir($image_path); + + $args->menu_srl = $menu_srl; + + // 메뉴 메뉴 삭제 + $output = executeQuery("menu.deleteMenuItems", $args); + if(!$output->toBool()) return $output; + + // 메뉴 삭제 + $output = executeQuery("menu.deleteMenu", $args); + if(!$output->toBool()) return $output; + + return new Object(0,'success_deleted'); + } + + /** + * @brief 메뉴에 아이템 추가 + **/ + function procMenuAdminInsertItem() { + // 입력할 변수 정리 + $source_args = Context::getRequestVars(); + unset($source_args->module); + unset($source_args->act); + if($source_args->menu_open_window!="Y") $source_args->menu_open_window = "N"; + if($source_args->menu_expand !="Y") $source_args->menu_expand = "N"; + $source_args->group_srls = str_replace('|@|',',',$source_args->group_srls); + $source_args->parent_srl = (int)$source_args->parent_srl; + + // 변수를 다시 정리 (form문의 column과 DB column이 달라서) + $args->menu_srl = $source_args->menu_srl; + $args->menu_item_srl = $source_args->menu_item_srl; + $args->parent_srl = $source_args->parent_srl; + $args->menu_srl = $source_args->menu_srl; + $args->menu_id = $source_args->menu_id; + $args->name = $source_args->menu_name; + $args->url = trim($source_args->menu_url); + $args->open_window = $source_args->menu_open_window; + $args->expand = $source_args->menu_expand; + $args->normal_btn = $source_args->normal_btn; + $args->hover_btn = $source_args->hover_btn; + $args->active_btn = $source_args->active_btn; + $args->group_srls = $source_args->group_srls; + + // 이미 존재하는지를 확인 + $oMenuModel = &getAdminModel('menu'); + $item_info = $oMenuModel->getMenuItemInfo($args->menu_item_srl); + + // 존재하게 되면 update를 해준다 + if($item_info->menu_item_srl == $args->menu_item_srl) { + $output = executeQuery('menu.updateMenuItem', $args); + if(!$output->toBool()) return $output; + + // 존재하지 않으면 insert를 해준다 + } else { + $args->listorder = -1*$args->menu_item_srl; + $output = executeQuery('menu.insertMenuItem', $args); + if(!$output->toBool()) return $output; + } + + // 해당 메뉴의 정보를 구함 + $menu_info = $oMenuModel->getMenu($args->menu_srl); + $menu_title = $menu_info->title; + + // XML 파일을 갱신하고 위치을 넘겨 받음 + $xml_file = $this->makeXmlFile($args->menu_srl); + + // url이 mid일 경우 기록 남김 + if(preg_match('/^([a-zA-Z0-9\_\-]+)$/', $args->url)) { + $mid = $args->url; + + $mid_args->menu_srl = $args->menu_srl; + $mid_args->mid = $mid; + + // menu_srl에 해당하는 레이아웃 값을 구함 + $output = executeQuery('menu.getMenuLayout', $args); + + // 해당 모듈에 레이아웃 값이 정해져 있지 않으면 지정 + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoByMid($mid); + if(!$module_info->layout_srl&&$output->data->layout_srl) $mid_args->layout_srl = $output->data->layout_srl; + + // 해당 mid의 메뉴값을 선택된 메뉴로 변경 + $oModuleController = &getController('module'); + $oModuleController->updateModuleMenu($mid_args); + } + + $this->add('xml_file', $xml_file); + $this->add('menu_srl', $args->menu_srl); + $this->add('menu_item_srl', $args->menu_item_srl); + $this->add('menu_title', $menu_title); + $this->add('parent_srl', $args->parent_srl); + } + + /** + * @brief 메뉴 메뉴 삭제 + **/ + function procMenuAdminDeleteItem() { + // 변수 정리 + $args = Context::gets('menu_srl','menu_item_srl'); + + $oMenuAdminModel = &getAdminModel('menu'); + + // 원정보를 가져옴 + $item_info = $oMenuAdminModel->getMenuItemInfo($args->menu_item_srl); + if($item_info->parent_srl) $parent_srl = $item_info->parent_srl; + + // 자식 노드가 있는지 체크하여 있으면 삭제 못한다는 에러 출력 + $output = executeQuery('menu.getChildMenuCount', $args); + if(!$output->toBool()) return $output; + if($output->data->count>0) return new Object(-1, 'msg_cannot_delete_for_child'); + + // DB에서 삭제 + $output = executeQuery("menu.deleteMenuItem", $args); + if(!$output->toBool()) return $output; + + // 해당 메뉴의 정보를 구함 + $menu_info = $oMenuAdminModel->getMenu($args->menu_srl); + $menu_title = $menu_info->title; + + // XML 파일을 갱신하고 위치을 넘겨 받음 + $xml_file = $this->makeXmlFile($args->menu_srl); + + // 이미지 버튼 모두 삭제 + if($item_info->normal_btn) FileHandler::removeFile($item_info->normal_btn); + if($item_info->hover_btn) FileHandler::removeFile($item_info->hover_btn); + if($item_info->active_btn) FileHandler::removeFile($item_info->active_btn); + + $this->add('xml_file', $xml_file); + $this->add('menu_title', $menu_title); + $this->add('menu_item_srl', $parent_srl); + $this->setMessage('success_deleted'); + } + + /** + * @brief 메뉴의 메뉴를 이동 + **/ + function procMenuAdminMoveItem() { + $menu_srl = Context::get('menu_srl'); + $mode = Context::get('mode'); + $parent_srl = Context::get('parent_srl'); + $source_srl = Context::get('source_srl'); + $target_srl = Context::get('target_srl'); + + if(!$menu_srl || !$mode || !$target_srl) return new Object(-1,'msg_invalid_request'); + $this->moveMenuItem($menu_srl,$parent_srl,$source_srl,$target_srl,$mode); + } + + function moveMenuItem($menu_srl,$parent_srl,$source_srl,$target_srl,$mode){ + // 원본 메뉴들을 구함 + $oMenuAdminModel = &getAdminModel('menu'); + + $target_item = $oMenuAdminModel->getMenuItemInfo($target_srl); + if($target_item->menu_item_srl != $target_srl) return new Object(-1,'msg_invalid_request'); + + // 위치 이동 (순서 조절) + if($mode == 'move') { + $args->parent_srl = $parent_srl; + $args->menu_srl = $menu_srl; + + if($source_srl) { + $source_item = $oMenuAdminModel->getMenuItemInfo($source_srl); + if($source_item->menu_item_srl != $source_srl) return new Object(-1,'msg_invalid_request'); + $args->listorder = $source_item->listorder-1; + } else { + $output = executeQuery('menu.getMaxListorder', $args); + if(!$output->toBool()) return $output; + $args->listorder = (int)$output->data->listorder; + if(!$args->listorder) $args->listorder= 0; + } + $args->parent_srl = $parent_srl; + $output = executeQuery('menu.updateMenuItemListorder', $args); + if(!$output->toBool()) return $output; + + $args->parent_srl = $parent_srl; + $args->menu_item_srl = $target_srl; + $output = executeQuery('menu.updateMenuItemNode', $args); + if(!$output->toBool()) return $output; + // 자식으로 추가 + } elseif($mode == 'insert') { + $args->menu_item_srl = $target_srl; + $args->parent_srl = $parent_srl; + $args->listorder = -1*getNextSequence(); + $output = executeQuery('menu.updateMenuItemNode', $args); + if(!$output->toBool()) return $output; + } + + $xml_file = $this->makeXmlFile($menu_srl); + return $xml_file; + } + + /** + * @brief xml 파일을 갱신 + * 관리자페이지에서 메뉴 구성 후 간혹 xml파일이 재생성 안되는 경우가 있는데\n + * 이럴 경우 관리자의 수동 갱신 기능을 구현해줌\n + * 개발 중간의 문제인 것 같고 현재는 문제가 생기지 않으나 굳이 없앨 필요 없는 기능 + **/ + function procMenuAdminMakeXmlFile() { + // 입력값을 체크 + $menu_srl = Context::get('menu_srl'); + + // 해당 메뉴의 정보를 구함 + $oMenuAdminModel = &getAdminModel('menu'); + $menu_info = $oMenuAdminModel->getMenu($menu_srl); + $menu_title = $menu_info->title; + + // xml파일 재생성 + $xml_file = $this->makeXmlFile($menu_srl); + + // return 값 설정 + $this->add('menu_title',$menu_title); + $this->add('xml_file',$xml_file); + } + + /** + * @brief 메뉴 이미지 버튼을 등록 + **/ + function procMenuAdminUploadButton() { + $menu_srl = Context::get('menu_srl'); + $menu_item_srl = Context::get('menu_item_srl'); + $target = Context::get('target'); + $target_file = Context::get($target); + + // 필수 요건이 없거나 업로드된 파일이 아니면 오류 발생 + if(!$menu_srl || !$menu_item_srl || !$target_file || !is_uploaded_file($target_file['tmp_name']) || !preg_match('/\.(gif|jpeg|jpg|png)/i',$target_file['name'])) { + Context::set('error_messge', Context::getLang('msg_invalid_request')); + + // 요건을 만족하고 업로드된 파일이면 지정된 위치로 이동 + } else { + $tmp_arr = explode('.',$target_file['name']); + $ext = $tmp_arr[count($tmp_arr)-1]; + + $path = sprintf('./files/attach/menu_button/%d/', $menu_srl); + $filename = sprintf('%s%d.%s.%s', $path, $menu_item_srl, $target, $ext); + + if(!is_dir($path)) FileHandler::makeDir($path); + + move_uploaded_file($target_file['tmp_name'], $filename); + Context::set('filename', $filename); + } + + + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('menu_file_uploaded'); + } + + /** + * @brief 등록된 메뉴 이미지 제거 + **/ + function procMenuAdminDeleteButton() { + $menu_srl = Context::get('menu_srl'); + $menu_item_srl = Context::get('menu_item_srl'); + $target = Context::get('target'); + $filename = Context::get('filename'); + FileHandler::removeFile($filename); + + $this->add('target', $target); + } + + /** + * @brief 메뉴의 xml 파일을 만들고 위치를 return + **/ + function makeXmlFile($menu_srl) { + // xml파일 생성시 필요한 정보가 없으면 그냥 return + if(!$menu_srl) return; + + // 메뉴 정보를 구함 + $args->menu_srl = $menu_srl; + $output = executeQuery('menu.getMenu', $args); + if(!$output->toBool() || !$output->data) return $output; + $site_srl = (int)$output->data->site_srl; + + if($site_srl) { + $oModuleModel = &getModel('module'); + $site_info = $oModuleModel->getSiteInfo($site_srl); + $domain = $site_info->domain; + } + + // DB에서 menu_srl에 해당하는 메뉴 아이템 목록을 listorder순으로 구해옴 + $args->menu_srl = $menu_srl; + $args->sort_index = 'listorder'; + $output = executeQuery('menu.getMenuItems', $args); + if(!$output->toBool()) return; + + // 캐시 파일의 이름을 지정 + $xml_file = sprintf("./files/cache/menu/%s.xml.php", $menu_srl); + $php_file = sprintf("./files/cache/menu/%s.php", $menu_srl); + + // 구해온 데이터가 없다면 노드데이터가 없는 xml 파일만 생성 + $list = $output->data; + if(!$list) { + $xml_buff = ""; + FileHandler::writeFile($xml_file, $xml_buff); + FileHandler::writeFile($php_file, ''); + return $xml_file; + } + + // 구해온 데이터가 하나라면 array로 바꾸어줌 + if(!is_array($list)) $list = array($list); + + // 루프를 돌면서 tree 구성 + $list_count = count($list); + for($i=0;$i<$list_count;$i++) { + $node = $list[$i]; + $menu_item_srl = $node->menu_item_srl; + $parent_srl = $node->parent_srl; + + $tree[$parent_srl][$menu_item_srl] = $node; + } + + // 캐시 파일의 권한과 그룹 설정을 위한 공통 헤더 + $header_script = + '$lang_type = Context::getLangType(); '. + '$is_logged = Context::get(\'is_logged\'); '. + '$logged_info = Context::get(\'logged_info\'); '. + '$site_srl = '.$site_srl.';'. + '$site_admin = false;'. + 'if($site_srl) { '. + '$oModuleModel = &getModel(\'module\');'. + '$site_module_info = $oModuleModel->getSiteInfo($site_srl); '. + 'Context::set(\'site_module_info\',$site_module_info);'. + '$grant = $oModuleModel->getGrant($site_module_info, $logged_info); '. + 'if($grant->manager ==1) $site_admin = true;'. + '}'. + 'if($is_logged) {'. + 'if($logged_info->is_admin=="Y" || $site_admin) $is_admin = true; '. + 'else $is_admin = false; '. + '$group_srls = array_keys($logged_info->group_list); '. + '} else { '. + '$is_admin = false; '. + '$group_srsl = array(); '. + '} '; + + // xml 캐시 파일 생성 (xml캐시는 따로 동작하기에 session 지정을 해주어야 함) + $xml_buff = sprintf( + 'init(); '. + 'header("Content-Type: text/xml; charset=UTF-8"); '. + 'header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); '. + 'header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); '. + 'header("Cache-Control: no-store, no-cache, must-revalidate"); '. + 'header("Cache-Control: post-check=0, pre-check=0", false); '. + 'header("Pragma: no-cache"); '. + '%s '. + '$oContext->close(); '. + '?>'. + '%s', + $header_script, + $this->getXmlTree($tree[0], $tree, $site_srl, $domain) + ); + + // php 캐시 파일 생성 + $php_output = $this->getPhpCacheCode($tree[0], $tree, $site_srl, $domain); + $php_buff = sprintf( + 'list = array(%s); '. + '?>', + $header_script, + $php_output['name'], + $php_output['buff'] + ); + + // 파일 저장 + FileHandler::writeFile($xml_file, $xml_buff); + FileHandler::writeFile($php_file, $php_buff); + return $xml_file; + } + + /** + * @brief array로 정렬된 노드들을 parent_srl을 참조하면서 recursive하게 돌면서 xml 데이터 생성 + * 메뉴 xml파일은 node라는 tag가 중첩으로 사용되며 이 xml doc으로 관리자 페이지에서 메뉴를 구성해줌\n + * (tree_menu.js 에서 xml파일을 바로 읽고 tree menu를 구현) + **/ + function getXmlTree($source_node, $tree, $site_srl, $domain) { + if(!$source_node) return; + + $oMenuAdminModel = &getAdminModel('menu'); + + foreach($source_node as $menu_item_srl => $node) { + $child_buff = ""; + + // 자식 노드의 데이터 가져옴 + if($menu_item_srl&&$tree[$menu_item_srl]) $child_buff = $this->getXmlTree($tree[$menu_item_srl], $tree, $site_srl, $domain); + + // 변수 정리 + $names = $oMenuAdminModel->getMenuItemNames($node->name, $site_srl); + foreach($names as $key => $val) { + $name_arr_str .= sprintf('"%s"=>"%s",',$key, str_replace('\\','\\\\',htmlspecialchars($val))); + } + $name_str = sprintf('$_names = array(%s); print $_names[$lang_type];', $name_arr_str); + + $url = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->url); + if(preg_match('/^([0-9a-zA-Z\_\-]+)$/', $node->url)) { + $href = getSiteUrl($domain, '','mid',$node->url); + $pos = strpos($href, $_SERVER['HTTP_HOST']); + if($pos !== false) $href = substr($href, $pos+strlen($_SERVER['HTTP_HOST'])); + } else $href = $url; + $open_window = $node->open_window; + $expand = $node->expand; + + $normal_btn = $node->normal_btn; + if($normal_btn && preg_match('/^\.\/files\/attach\/menu_button/i',$normal_btn)) $normal_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$normal_btn); + else $normal_btn = ''; + $hover_btn = $node->hover_btn; + if($hover_btn && preg_match('/^\.\/files\/attach\/menu_button/i',$hover_btn)) $hover_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$hover_btn); + else $hover_btn = ''; + $active_btn = $node->active_btn; + if($active_btn && preg_match('/^\.\/files\/attach\/menu_button/i',$active_btn)) $active_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$active_btn); + else $active_btn = ''; + + $group_srls = $node->group_srls; + + if($normal_btn) { + if(preg_match('/\.png$/',$normal_btn)) $classname = 'class="iePngFix"'; + else $classname = ''; + if($hover_btn) $hover_str = sprintf('onmouseover="this.src=\'%s\'"', $hover_btn); else $hover_str = ''; + if($active_btn) $active_str = sprintf('onmousedown="this.src=\'%s\'"', $active_btn); else $active_str = ''; + $link = sprintf('<img src="%s" onmouseout="this.src=\'%s\'" alt="" %s %s %s />', $normal_btn, $normal_btn, $hover_str, $active_str, $classname); + } else { + $link = ''; + } + + // node->group_srls값이 있으면 + if($group_srls) $group_check_code = sprintf('($is_admin==true||(is_array($group_srls)&&count(array_intersect($group_srls, array(%s)))))',$group_srls); + else $group_check_code = "true"; + $attribute = sprintf( + 'node_srl="%s" parent_srl="%s" text="" url="" href="" open_window="%s" expand="%s" normal_btn="%s" hover_btn="%s" active_btn="%s" link="%s"', + $menu_item_srl, + $node->parent_srl, + $group_check_code, + $name_str, + $group_check_code, + $url, + $group_check_code, + $href, + $open_window, + $expand, + $normal_btn, + $hover_btn, + $active_btn, + $group_check_code, + $link + ); + + if($child_buff) $buff .= sprintf('%s', $attribute, $child_buff); + else $buff .= sprintf('', $attribute); + } + return $buff; + } + + /** + * @brief array로 정렬된 노드들을 php code로 변경하여 return + * 메뉴에서 메뉴를 tpl에 사용시 xml데이터를 사용할 수도 있지만 별도의 javascript 사용이 필요하기에 + * php로 된 캐시파일을 만들어서 db이용없이 바로 메뉴 정보를 구할 수 있도록 한다 + * 이 캐시는 ModuleHandler::displayContent() 에서 include하여 Context::set() 한다 + **/ + function getPhpCacheCode($source_node, $tree, $site_srl, $domain) { + $output = array("buff"=>"", "url_list"=>array()); + if(!$source_node) return $output; + + $oMenuAdminModel = &getAdminModel('menu'); + + foreach($source_node as $menu_item_srl => $node) { + // 자식 노드가 있으면 자식 노드의 데이터를 먼저 얻어옴 + if($menu_item_srl&&$tree[$menu_item_srl]) $child_output = $this->getPhpCacheCode($tree[$menu_item_srl], $tree, $site_srl, $domain); + else $child_output = array("buff"=>"", "url_list"=>array()); + + // 변수 정리 + $names = $oMenuAdminModel->getMenuItemNames($node->name, $site_srl); + foreach($names as $key => $val) { + $name_arr_str .= sprintf('"%s"=>"%s",',$key, str_replace(array('\\','"'),array('\\\\','"'),$val)); + } + $name_str = sprintf('$_menu_names[%d] = array(%s); %s', $node->menu_item_srl, $name_arr_str, $child_output['name']); + + // 현재 노드의 url값이 공란이 아니라면 url_list 배열값에 입력 + if($node->url) $child_output['url_list'][] = $node->url; + $output['url_list'] = array_merge($output['url_list'], $child_output['url_list']); + + // node->group_srls값이 있으면 + if($node->group_srls) $group_check_code = sprintf('($is_admin==true||(is_array($group_srls)&&count(array_intersect($group_srls, array(%s)))))',$node->group_srls); + else $group_check_code = "true"; + + // 변수 정리 + $href = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->href); + $url = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->url); + if(preg_match('/^([0-9a-zA-Z\_\-]+)$/i', $node->url)) { + $href = getSiteUrl($domain, '','mid',$node->url); + $pos = strpos($href, $_SERVER['HTTP_HOST']); + if($pos !== false) $href = substr($href, $pos+strlen($_SERVER['HTTP_HOST'])); + } else $href = $url; + $open_window = $node->open_window; + $normal_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->normal_btn); + $hover_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->hover_btn); + $active_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->active_btn); + $selected = '"'.implode('","',$child_output['url_list']).'"'; + $child_buff = $child_output['buff']; + $expand = $node->expand; + + $normal_btn = $node->normal_btn; + if($normal_btn && preg_match('/^\.\/files\/attach\/menu_button/i',$normal_btn)) $normal_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$normal_btn); + else $normal_btn = ''; + + $hover_btn = $node->hover_btn; + if($hover_btn && preg_match('/^\.\/files\/attach\/menu_button/i',$hover_btn)) $hover_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$hover_btn); + else $hover_btn = ''; + + $active_btn = $node->active_btn; + if($active_btn && preg_match('/^\.\/files\/attach\/menu_button/i',$active_btn)) $active_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$active_btn); + else $active_btn = ''; + + $group_srls = $node->group_srls; + + if($normal_btn) { + if(preg_match('/\.png$/',$normal_btn)) $classname = 'class=\"iePngFix\"'; + else $classname = ''; + if($hover_btn) $hover_str = sprintf('onmouseover=\"this.src=\'%s\'\"', $hover_btn); else $hover_str = ''; + if($active_btn) $active_str = sprintf('onmousedown=\"this.src=\'%s\'\"', $active_btn); else $active_str = ''; + $link = sprintf('"\"".$_menu_names[%d][$lang_type]."\""', $normal_btn, $normal_btn, $node->menu_item_srl, $hover_str, $active_str, $classname); + if($active_btn) $link_active = sprintf('"\"".$_menu_names[%d][$lang_type]."\""', $active_btn, $node->menu_item_srl, $classname); + else $link_active = $link; + } else { + $link_active = $link = sprintf('$_menu_names[%d][$lang_type]', $node->menu_item_srl); + } + + // 속성을 생성한다 ( url_list를 이용해서 선택된 메뉴의 노드에 속하는지를 검사한다. 꽁수지만 빠르고 강력하다고 생각;;) + $attribute = sprintf( + '"node_srl"=>"%s","parent_srl"=>"%s","text"=>(%s?$_menu_names[%d][$lang_type]:""),"href"=>(%s?"%s":""),"url"=>(%s?"%s":""),"open_window"=>"%s","normal_btn"=>"%s","hover_btn"=>"%s","active_btn"=>"%s","selected"=>(array(%s)&&in_array(Context::get("mid"),array(%s))?1:0),"expand"=>"%s", "list"=>array(%s), "link"=>(%s? ( array(%s)&&in_array(Context::get("mid"),array(%s)) ?%s:%s):""),', + $node->menu_item_srl, + $node->parent_srl, + $group_check_code, + $node->menu_item_srl, + $group_check_code, + $href, + $group_check_code, + $url, + $open_window, + $normal_btn, + $hover_btn, + $active_btn, + $selected, + $selected, + $expand, + $child_buff, + $group_check_code, + $selected, + $selected, + $link_active, + $link + ); + + // buff 데이터를 생성한다 + $output['buff'] .= sprintf('%s=>array(%s),', $node->menu_item_srl, $attribute); + $output['name'] .= $name_str; + } + return $output; + } + + /** + * @brief 메뉴와 레이아웃 매핑 + * 레이아웃에서 메뉴를 지정할때 지정된 메뉴의 기본 레이아웃을 매핑 + **/ + function updateMenuLayout($layout_srl, $menu_srl_list) { + if(!count($menu_srl_list)) return; + + // 일단 menu_srls의 값을 지움 + $args->menu_srls = implode(',',$menu_srl_list); + $output = executeQuery('menu.deleteMenuLayout', $args); + if(!$output->toBool()) return $output; + + $args->layout_srl = $layout_srl; + + // menu_srls, layout_srl 매핑 + for($i=0;$imenu_srl = $menu_srl_list[$i]; + $output = executeQuery('menu.insertMenuLayout', $args); + if(!$output->toBool()) return $output; + } + } + + } +?> diff --git a/modules/menu/menu.admin.model.php b/modules/menu/menu.admin.model.php index a1714ef4c..c65dc3937 100644 --- a/modules/menu/menu.admin.model.php +++ b/modules/menu/menu.admin.model.php @@ -1,154 +1,154 @@ -site_srl) { - $site_module_info = Context::get('site_module_info'); - $obj->site_srl = (int)$site_module_info->site_srl; - } - $args->site_srl = $obj->site_srl; - $args->sort_index = $obj->sort_index; - $args->page = $obj->page?$obj->page:1; - $args->list_count = $obj->list_count?$obj->list_count:20; - $args->page_count = $obj->page_count?$obj->page_count:10; - - // document.getDocumentList 쿼리 실행 - $output = executeQuery('menu.getMenuList', $args); - - // 결과가 없거나 오류 발생시 그냥 return - if(!$output->toBool()||!count($output->data)) return $output; - - return $output; - } - - /** - * @brief 등록된 모든 메뉴를 return - **/ - function getMenus($site_srl = null) { - if(!isset($site_srl)) { - $site_module_info = Context::get('site_module_info'); - $site_srl = (int)$site_module_info->site_srl; - } - // 일단 DB에서 정보를 가져옴 - $args->site_srl = $site_srl ; - $args->menu_srl = $menu_srl; - $output = executeQuery('menu.getMenus', $args); - if(!$output->data) return; - $menus = $output->data; - if(!is_array($menus)) $menus = array($menus); - return $menus; - } - - /** - * @brief DB 에 생성된 한개의 메뉴 정보를 구함 - * 생성된 메뉴의 DB정보+XML정보를 return - **/ - function getMenu($menu_srl) { - // 일단 DB에서 정보를 가져옴 - $args->menu_srl = $menu_srl; - $output = executeQuery('menu.getMenu', $args); - if(!$output->data) return; - - $menu_info = $output->data; - $menu_info->xml_file = sprintf('./files/cache/menu/%s.xml.php',$menu_srl); - $menu_info->php_file = sprintf('./files/cache/menu/%s.php',$menu_srl); - return $menu_info; - } - - /** - * @brief 특정 menu_srl의 아이템 정보를 return - * 이 정보중에 group_srls의 경우는 , 로 연결되어 들어가며 사용시에는 explode를 통해 array로 변환 시킴 - **/ - function getMenuItemInfo($menu_item_srl) { - // menu_item_srl이 있으면 해당 메뉴의 정보를 가져온다 - $args->menu_item_srl = $menu_item_srl; - $output = executeQuery('menu.getMenuItem', $args); - $node = $output->data; - if($node->group_srls) $node->group_srls = explode(',',$node->group_srls); - else $node->group_srls = array(); - - $tmp_name = unserialize($node->name); - if($tmp_name && count($tmp_name) ) { - $selected_lang = array(); - $rand_name = $tmp_name[Context::getLangType()]; - if(!$rand_name) $rand_name = array_shift($tmp_name); - $node->name = $rand_name; - } - return $node; - } - - /** - * @brief 다국어 지원을 위해 menu의 name을 언어별로 나눠서 return - */ - function getMenuItemNames($source_name, $site_srl = null) { - if(!$site_srl) { - $site_module_info = Context::get('site_module_info'); - $site_srl = (int)$site_module_info->site_srl; - } - - // 언어코드 구함 - $oModuleAdminModel = &getAdminModel('module'); - return $oModuleAdminModel->getLangCode($site_srl, $source_name); - } - - /** - * @brief 특정 menu_srl의 정보를 이용하여 템플릿을 구한후 return - * 관리자 페이지에서 특정 메뉴의 정보를 추가하기 위해 서버에서 tpl을 컴파일 한후 컴파일 된 html을 직접 return - **/ - function getMenuAdminTplInfo() { - // 해당 메뉴의 정보를 가져오기 위한 변수 설정 - $menu_item_srl = Context::get('menu_item_srl'); - $parent_srl = Context::get('parent_srl'); - - // 회원 그룹의 목록을 가져옴 - $oMemberModel = &getModel('member'); - $group_list = $oMemberModel->getGroups(); - Context::set('group_list', $group_list); - - // parent_srl이 있고 menu_item_srl이 없으면 하부 메뉴 추가임 - if(!$menu_item_srl && $parent_srl) { - // 상위 메뉴의 정보를 가져옴 - $parent_info = $this->getMenuItemInfo($parent_srl); - - // 추가하려는 메뉴의 기본 변수 설정 - $item_info->menu_item_srl = getNextSequence(); - $item_info->parent_srl = $parent_srl; - $item_info->parent_menu_name = $parent_info->name; - - // root에 메뉴 추가하거나 기존 메뉴의 수정일 경우 - } else { - // menu_item_srl 이 있으면 해당 메뉴의 정보를 가져온다 - if($menu_item_srl) $item_info = $this->getMenuItemInfo($menu_item_srl); - - // 찾아진 값이 없다면 신규 메뉴 추가로 보고 menu_item_srl값만 구해줌 - if(!$item_info->menu_item_srl) { - $item_info->menu_item_srl = getNextSequence(); - } - } - Context::set('item_info', $item_info); - - // template 파일을 직접 컴파일한후 tpl변수에 담아서 return한다. - $oTemplate = &TemplateHandler::getInstance(); - $tpl = $oTemplate->compile($this->module_path.'tpl', 'menu_item_info'); - - $this->add('tpl', str_replace("\n"," ",$tpl)); - } - - } -?> +site_srl) { + $site_module_info = Context::get('site_module_info'); + $obj->site_srl = (int)$site_module_info->site_srl; + } + $args->site_srl = $obj->site_srl; + $args->sort_index = $obj->sort_index; + $args->page = $obj->page?$obj->page:1; + $args->list_count = $obj->list_count?$obj->list_count:20; + $args->page_count = $obj->page_count?$obj->page_count:10; + + // document.getDocumentList 쿼리 실행 + $output = executeQuery('menu.getMenuList', $args); + + // 결과가 없거나 오류 발생시 그냥 return + if(!$output->toBool()||!count($output->data)) return $output; + + return $output; + } + + /** + * @brief 등록된 모든 메뉴를 return + **/ + function getMenus($site_srl = null) { + if(!isset($site_srl)) { + $site_module_info = Context::get('site_module_info'); + $site_srl = (int)$site_module_info->site_srl; + } + // 일단 DB에서 정보를 가져옴 + $args->site_srl = $site_srl ; + $args->menu_srl = $menu_srl; + $output = executeQuery('menu.getMenus', $args); + if(!$output->data) return; + $menus = $output->data; + if(!is_array($menus)) $menus = array($menus); + return $menus; + } + + /** + * @brief DB 에 생성된 한개의 메뉴 정보를 구함 + * 생성된 메뉴의 DB정보+XML정보를 return + **/ + function getMenu($menu_srl) { + // 일단 DB에서 정보를 가져옴 + $args->menu_srl = $menu_srl; + $output = executeQuery('menu.getMenu', $args); + if(!$output->data) return; + + $menu_info = $output->data; + $menu_info->xml_file = sprintf('./files/cache/menu/%s.xml.php',$menu_srl); + $menu_info->php_file = sprintf('./files/cache/menu/%s.php',$menu_srl); + return $menu_info; + } + + /** + * @brief 특정 menu_srl의 아이템 정보를 return + * 이 정보중에 group_srls의 경우는 , 로 연결되어 들어가며 사용시에는 explode를 통해 array로 변환 시킴 + **/ + function getMenuItemInfo($menu_item_srl) { + // menu_item_srl이 있으면 해당 메뉴의 정보를 가져온다 + $args->menu_item_srl = $menu_item_srl; + $output = executeQuery('menu.getMenuItem', $args); + $node = $output->data; + if($node->group_srls) $node->group_srls = explode(',',$node->group_srls); + else $node->group_srls = array(); + + $tmp_name = unserialize($node->name); + if($tmp_name && count($tmp_name) ) { + $selected_lang = array(); + $rand_name = $tmp_name[Context::getLangType()]; + if(!$rand_name) $rand_name = array_shift($tmp_name); + $node->name = $rand_name; + } + return $node; + } + + /** + * @brief 다국어 지원을 위해 menu의 name을 언어별로 나눠서 return + */ + function getMenuItemNames($source_name, $site_srl = null) { + if(!$site_srl) { + $site_module_info = Context::get('site_module_info'); + $site_srl = (int)$site_module_info->site_srl; + } + + // 언어코드 구함 + $oModuleAdminModel = &getAdminModel('module'); + return $oModuleAdminModel->getLangCode($site_srl, $source_name); + } + + /** + * @brief 특정 menu_srl의 정보를 이용하여 템플릿을 구한후 return + * 관리자 페이지에서 특정 메뉴의 정보를 추가하기 위해 서버에서 tpl을 컴파일 한후 컴파일 된 html을 직접 return + **/ + function getMenuAdminTplInfo() { + // 해당 메뉴의 정보를 가져오기 위한 변수 설정 + $menu_item_srl = Context::get('menu_item_srl'); + $parent_srl = Context::get('parent_srl'); + + // 회원 그룹의 목록을 가져옴 + $oMemberModel = &getModel('member'); + $group_list = $oMemberModel->getGroups(); + Context::set('group_list', $group_list); + + // parent_srl이 있고 menu_item_srl이 없으면 하부 메뉴 추가임 + if(!$menu_item_srl && $parent_srl) { + // 상위 메뉴의 정보를 가져옴 + $parent_info = $this->getMenuItemInfo($parent_srl); + + // 추가하려는 메뉴의 기본 변수 설정 + $item_info->menu_item_srl = getNextSequence(); + $item_info->parent_srl = $parent_srl; + $item_info->parent_menu_name = $parent_info->name; + + // root에 메뉴 추가하거나 기존 메뉴의 수정일 경우 + } else { + // menu_item_srl 이 있으면 해당 메뉴의 정보를 가져온다 + if($menu_item_srl) $item_info = $this->getMenuItemInfo($menu_item_srl); + + // 찾아진 값이 없다면 신규 메뉴 추가로 보고 menu_item_srl값만 구해줌 + if(!$item_info->menu_item_srl) { + $item_info->menu_item_srl = getNextSequence(); + } + } + Context::set('item_info', $item_info); + + // template 파일을 직접 컴파일한후 tpl변수에 담아서 return한다. + $oTemplate = &TemplateHandler::getInstance(); + $tpl = $oTemplate->compile($this->module_path.'tpl', 'menu_item_info'); + + $this->add('tpl', str_replace("\n"," ",$tpl)); + } + + } +?> diff --git a/modules/menu/menu.admin.view.php b/modules/menu/menu.admin.view.php index 54c546b59..23435a494 100644 --- a/modules/menu/menu.admin.view.php +++ b/modules/menu/menu.admin.view.php @@ -1,104 +1,104 @@ -setTemplatePath($this->module_path.'tpl'); - } - - /** - * @brief 메뉴 관리의 첫 페이지 - **/ - function dispMenuAdminContent() { - // 등록된 메뉴 목록을 구해옴 - $obj->page = Context::get('page'); - $obj->sort_index = 'listorder'; - $obj->list_count = 20; - $obj->page_count = 20; - - $oMenuModel = &getAdminModel('menu'); - $output = $oMenuModel->getMenuList($obj); - - Context::set('total_count', $output->total_count); - Context::set('total_page', $output->total_page); - Context::set('page', $output->page); - Context::set('menu_list', $output->data); - Context::set('page_navigation', $output->page_navigation); - - $this->setTemplateFile('index'); - } - - /** - * @brief 메뉴 등록 페이지 - **/ - function dispMenuAdminInsert() { - // 선택된 메뉴의 정보르 구해서 세팅 - $menu_srl = Context::get('menu_srl'); - - if($menu_srl) { - // 메뉴의 정보를 가져옴 - $oMenuModel = &getAdminModel('menu'); - $menu_info = $oMenuModel->getMenu($menu_srl); - if($menu_info->menu_srl == $menu_srl) Context::set('menu_info', $menu_info); - } - - $this->setTemplateFile('menu_insert'); - } - - /** - * @brief 메뉴 관리 페이지 - **/ - function dispMenuAdminManagement() { - // 선택된 메뉴의 정보르 구해서 세팅 - $menu_srl = Context::get('menu_srl'); - - if(!$menu_srl) return $this->dispMenuAdminContent(); - - // 메뉴의 정보를 가져옴 - $oMenuModel = &getAdminModel('menu'); - $menu_info = $oMenuModel->getMenu($menu_srl); - if($menu_info->menu_srl != $menu_srl) return $this->dispMenuAdminContent(); - - Context::set('menu_info', $menu_info); - - // 레이아웃을 팝업으로 지정 - $this->setTemplateFile('menu_management'); - } - - - /** - * @brief 메뉴에서 선택할 수 있는 mid목록을 보여줌 - **/ - function dispMenuAdminMidList() { - $oModuleModel = &getModel('module'); - - // 모듈 카테고리 목록을 구함 - $module_category = $oModuleModel->getModuleCategories(); - Context::set('module_category', $module_category); - - // 모듈 목록을 구함 - $module_list = $oModuleModel->getModuleList(); - Context::set('module_list', $module_list); - - // mid 목록을 구해옴 - $args->module_category_srl = Context::get('module_category_srl'); - $args->module = Context::get('target_module'); - $mid_list = $oModuleModel->getMidList($args); - Context::set('mid_list', $mid_list); - - // 메뉴을 팝업으로 지정 - $this->setLayoutFile('popup_layout'); - - // 템플릿 파일 지정 - $this->setTemplateFile('mid_list'); - } - } -?> +setTemplatePath($this->module_path.'tpl'); + } + + /** + * @brief 메뉴 관리의 첫 페이지 + **/ + function dispMenuAdminContent() { + // 등록된 메뉴 목록을 구해옴 + $obj->page = Context::get('page'); + $obj->sort_index = 'listorder'; + $obj->list_count = 20; + $obj->page_count = 20; + + $oMenuModel = &getAdminModel('menu'); + $output = $oMenuModel->getMenuList($obj); + + Context::set('total_count', $output->total_count); + Context::set('total_page', $output->total_page); + Context::set('page', $output->page); + Context::set('menu_list', $output->data); + Context::set('page_navigation', $output->page_navigation); + + $this->setTemplateFile('index'); + } + + /** + * @brief 메뉴 등록 페이지 + **/ + function dispMenuAdminInsert() { + // 선택된 메뉴의 정보르 구해서 세팅 + $menu_srl = Context::get('menu_srl'); + + if($menu_srl) { + // 메뉴의 정보를 가져옴 + $oMenuModel = &getAdminModel('menu'); + $menu_info = $oMenuModel->getMenu($menu_srl); + if($menu_info->menu_srl == $menu_srl) Context::set('menu_info', $menu_info); + } + + $this->setTemplateFile('menu_insert'); + } + + /** + * @brief 메뉴 관리 페이지 + **/ + function dispMenuAdminManagement() { + // 선택된 메뉴의 정보르 구해서 세팅 + $menu_srl = Context::get('menu_srl'); + + if(!$menu_srl) return $this->dispMenuAdminContent(); + + // 메뉴의 정보를 가져옴 + $oMenuModel = &getAdminModel('menu'); + $menu_info = $oMenuModel->getMenu($menu_srl); + if($menu_info->menu_srl != $menu_srl) return $this->dispMenuAdminContent(); + + Context::set('menu_info', $menu_info); + + // 레이아웃을 팝업으로 지정 + $this->setTemplateFile('menu_management'); + } + + + /** + * @brief 메뉴에서 선택할 수 있는 mid목록을 보여줌 + **/ + function dispMenuAdminMidList() { + $oModuleModel = &getModel('module'); + + // 모듈 카테고리 목록을 구함 + $module_category = $oModuleModel->getModuleCategories(); + Context::set('module_category', $module_category); + + // 모듈 목록을 구함 + $module_list = $oModuleModel->getModuleList(); + Context::set('module_list', $module_list); + + // mid 목록을 구해옴 + $args->module_category_srl = Context::get('module_category_srl'); + $args->module = Context::get('target_module'); + $mid_list = $oModuleModel->getMidList($args); + Context::set('mid_list', $mid_list); + + // 메뉴을 팝업으로 지정 + $this->setLayoutFile('popup_layout'); + + // 템플릿 파일 지정 + $this->setTemplateFile('mid_list'); + } + } +?> diff --git a/modules/menu/menu.class.php b/modules/menu/menu.class.php index 4a2ba9f5c..f16fccce9 100644 --- a/modules/menu/menu.class.php +++ b/modules/menu/menu.class.php @@ -1,67 +1,67 @@ -isColumnExists('menu', 'site_srl')) return true; - - return false; - } - - /** - * @brief 업데이트 실행 - **/ - function moduleUpdate() { - $oDB = &DB::getInstance(); - - // 2009. 02. 11 menu 테이블에 site_srl 추가 - if(!$oDB->isColumnExists('menu', 'site_srl')) { - $oDB->addColumn('menu','site_srl','number',11,0,true); - } - - return new Object(0, 'success_updated'); - } - - /** - * @brief 캐시 파일 재생성 - **/ - function recompileCache() { - // 메뉴 모듈의 캐시 파일 모두 삭제 - FileHandler::removeFilesInDir("./files/cache/menu"); - - $oMenuAdminController = &getAdminController('menu'); - - // 블로그 모듈 목록을 모두 구함 - $output = executeQueryArray("menu.getMenus"); - $list = $output->data; - if(!count($list)) return; - - // 메뉴 모듈에서 사용되는 모든 메뉴 목록을 재 생성 - foreach($list as $menu_item) { - $menu_srl = $menu_item->menu_srl; - $oMenuAdminController->makeXmlFile($menu_srl); - } - } - } -?> +isColumnExists('menu', 'site_srl')) return true; + + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + $oDB = &DB::getInstance(); + + // 2009. 02. 11 menu 테이블에 site_srl 추가 + if(!$oDB->isColumnExists('menu', 'site_srl')) { + $oDB->addColumn('menu','site_srl','number',11,0,true); + } + + return new Object(0, 'success_updated'); + } + + /** + * @brief 캐시 파일 재생성 + **/ + function recompileCache() { + // 메뉴 모듈의 캐시 파일 모두 삭제 + FileHandler::removeFilesInDir("./files/cache/menu"); + + $oMenuAdminController = &getAdminController('menu'); + + // 블로그 모듈 목록을 모두 구함 + $output = executeQueryArray("menu.getMenus"); + $list = $output->data; + if(!count($list)) return; + + // 메뉴 모듈에서 사용되는 모든 메뉴 목록을 재 생성 + foreach($list as $menu_item) { + $menu_srl = $menu_item->menu_srl; + $oMenuAdminController->makeXmlFile($menu_srl); + } + } + } +?> diff --git a/modules/menu/tpl/css/mmenu.css b/modules/menu/tpl/css/mmenu.css index ca44f408e..9c497dfde 100644 --- a/modules/menu/tpl/css/mmenu.css +++ b/modules/menu/tpl/css/mmenu.css @@ -1,19 +1,19 @@ -@charset "utf-8"; -/* Mobile XE (/modules/menu/tpl/menu.html) */ -.bd{background:#f8f8f8;padding:1px 0} -/* Global Navigation */ -.gn{margin:0;padding:0;list-style:none;background:#d3d1cc;text-shadow:1px 1px 0 #fff;font-size:14px} -.gn li{background:#c3c3c3;border:1px solid #a3a09a;border-left:0;border-right:0;margin:0 0 -1px 0} -.gn li li{background:#f8f8f8;border:1px solid #c9c9c9;border-left:0;border-right:0} -.gn li li li{background:#e8e8e8} -.gn ul{margin:0 0 -1px 0;padding:0;list-style:none} -.gn a{position:relative;text-decoration:none;display:block;padding:10px} -.gn li a{color:#333} -.gn li a:after{position:absolute;top:7px;right:10px;content:"›";color:#888;font-size:18px;font-weight:bold;font-family:Verdana, Geneva, sans-serif} -.gn li li a:before{content:"";display:inline-block;width:6px;height:6px;border:1px dotted #666;border-top:0;border-right:0;margin:0 4px 0 0;vertical-align:top} -.gn li li a{padding-left:15px} -.gn li li li a{padding-left:30px} -.gn li li li li a{padding-left:45px} -.gn li li li li li a{padding-left:60px} -.gn em{color:#f63;font-size:12px} - +@charset "utf-8"; +/* Mobile XE (/modules/menu/tpl/menu.html) */ +.bd{background:#f8f8f8;padding:1px 0} +/* Global Navigation */ +.gn{margin:0;padding:0;list-style:none;background:#d3d1cc;text-shadow:1px 1px 0 #fff;font-size:14px} +.gn li{background:#c3c3c3;border:1px solid #a3a09a;border-left:0;border-right:0;margin:0 0 -1px 0} +.gn li li{background:#f8f8f8;border:1px solid #c9c9c9;border-left:0;border-right:0} +.gn li li li{background:#e8e8e8} +.gn ul{margin:0 0 -1px 0;padding:0;list-style:none} +.gn a{position:relative;text-decoration:none;display:block;padding:10px} +.gn li a{color:#333} +.gn li a:after{position:absolute;top:7px;right:10px;content:"›";color:#888;font-size:18px;font-weight:bold;font-family:Verdana, Geneva, sans-serif} +.gn li li a:before{content:"";display:inline-block;width:6px;height:6px;border:1px dotted #666;border-top:0;border-right:0;margin:0 4px 0 0;vertical-align:top} +.gn li li a{padding-left:15px} +.gn li li li a{padding-left:30px} +.gn li li li li a{padding-left:45px} +.gn li li li li li a{padding-left:60px} +.gn em{color:#f63;font-size:12px} + diff --git a/modules/menu/tpl/index.html b/modules/menu/tpl/index.html index 8b2823057..3dd1fff47 100644 --- a/modules/menu/tpl/index.html +++ b/modules/menu/tpl/index.html @@ -1,51 +1,51 @@ - - - - - - -
    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
    {$lang->no}
    {$lang->title}
    {$lang->regdate}
     
    {$no}{htmlspecialchars($val->title)}{zdate($val->regdate,"Y-m-d")}{$lang->cmd_setup}{$lang->cmd_delete}
    - {$lang->cmd_make} -
    - - - + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
    {$lang->no}
    {$lang->title}
    {$lang->regdate}
     
    {$no}{htmlspecialchars($val->title)}{zdate($val->regdate,"Y-m-d")}{$lang->cmd_setup}{$lang->cmd_delete}
    + {$lang->cmd_make} +
    + + + diff --git a/modules/menu/tpl/js/menu_tree.js b/modules/menu/tpl/js/menu_tree.js index adb56f8d1..ef9028a82 100644 --- a/modules/menu/tpl/js/menu_tree.js +++ b/modules/menu/tpl/js/menu_tree.js @@ -1,174 +1,174 @@ -function Tree(url){ - // clear tree; - jQuery('#menu > ul > li > ul').remove(); - - if(jQuery("ul.simpleTree > li > a").size() ==0)jQuery(''+lang_cmd_insert+'').bind("click",function(e){addNode(0,e);}).appendTo("ul.simpleTree > li"); - - //ajax get data and transeform ul il - jQuery.get(url,function(data){ - jQuery(data).find("node").each(function(i){ - var text = jQuery(this).attr("text"); - var node_srl = jQuery(this).attr("node_srl"); - var parent_srl = jQuery(this).attr("parent_srl"); - var url = jQuery(this).attr("url"); - - // node - var node = jQuery('
  • '+text+'
  • '); - - // button - jQuery(''+lang_cmd_insert+'').bind("click",function(e){ - addNode(node_srl,e); - return false; - }).appendTo(node); - - jQuery(''+lang_cmd_modify+'').bind("click",function(e){ - modifyNode(node_srl,e); - return false; - }).appendTo(node); - - jQuery(''+lang_cmd_delete+'').bind("click",function(e){ - deleteNode(node_srl); - return false; - }).appendTo(node); - - // insert parent child - if(parent_srl>0){ - if(jQuery('#tree_'+parent_srl+'>ul').length==0) jQuery('#tree_'+parent_srl).append(jQuery('
      ')); - jQuery('#tree_'+parent_srl+'> ul').append(node); - }else{ - if(jQuery('#menu ul.simpleTree > li > ul').length==0) jQuery("
        ").appendTo('#menu ul.simpleTree > li'); - jQuery('#menu ul.simpleTree > li > ul').append(node); - } - - }); - - //button show hide - jQuery("#menu li").each(function(){ - if(jQuery(this).parents('ul').size() > max_menu_depth) jQuery("a.add",this).hide(); - if(jQuery(">ul",this).size()>0) jQuery(">a.delete",this).hide(); - }); - - - // draw tree - simpleTreeCollection = jQuery('.simpleTree').simpleTree({ - autoclose: false, - afterClick:function(node){ - //alert("text-"+jQuery('span:first',node).text()); - }, - afterDblClick:function(node){ - //alert("text-"+jQuery('span:first',node).text()); - }, - afterMove:function(destination, source, pos){ - - jQuery("#menu_zone_info").html(""); - - if(destination.size() == 0){ - Tree(xml_url); - return; - } - var menu_srl = jQuery("#fo_menu input[name=menu_srl]").val(); - var parent_srl = destination.attr('id').replace(/.*_/g,''); - var target_srl = source.attr('id').replace(/.*_/g,''); - var brothers = jQuery('#'+destination.attr('id')+' > ul > li:not([class^=line])').length; - var mode = brothers >1 ? 'move':'insert'; - var source_srl = pos == 0 ? 0: source.prevAll("li:not(.line)").get(0).id.replace(/.*_/g,''); - - jQuery.exec_json("menu.procMenuAdminMoveItem",{"menu_srl":menu_srl,"parent_srl":parent_srl,"target_srl":target_srl,"source_srl":source_srl,"mode":mode}, - function(data){ - if(data.error>0) Tree(xml_url); - }); - - }, - - // i want you !! made by sol - beforeMovedToLine : function(destination, source, pos){ -// if(typeof(destination.id) == 'undefined') return false; - return (jQuery(destination).parents('ul').size() + jQuery('ul',source).size() <= max_menu_depth); - }, - - // i want you !! made by sol - beforeMovedToFolder : function(destination, source, pos){ -// if(typeof(destination.id) == 'undefined') return false; - return (jQuery(destination).parents('ul').size() + jQuery('ul',source).size() <= max_menu_depth-1); - }, - afterAjax:function() - { - //alert('Loaded'); - }, - animate:true - ,docToFolderConvert:true - }); - - - // image url replace -// jQuery("#menu ul.simpleTree img").attr("src",function(){ return jQuery(this).attr("src").replace("images/","./common/js/plugins/ui.tree/images/");}); - - - - - // open all node - nodeToggleAll(); - },"xml"); -} - -function nodeToggleAll(){ - jQuery("[class*=close]", simpleTreeCollection[0]).each(function(){ - simpleTreeCollection[0].nodeToggle(this); - }); -} - - - -function modifyNode(node_srl,e){ - jQuery('#menu_zone_info').html(''); - jQuery("#tree_"+node_srl+" > span").click(); - var params ={ - "parent_srl":0 - ,"menu_item_srl":node_srl - }; - - jQuery.exec_json('menu.getMenuAdminTplInfo', params, function(data){ - jQuery('#menu_zone_info').html(data.tpl).css('position','absolute').css("left",e.pageX).css("top",e.pageY).css('display','block'); - }); -} - -function addNode(node_srl,e){ - - jQuery('#menu_zone_info').html(''); - jQuery("#tree_"+node_srl+" > span").click(); - - var params ={ - "menu_item_srl":0 - ,"parent_srl":node_srl - }; - - jQuery.exec_json('menu.getMenuAdminTplInfo', params, function(data){ - jQuery('#menu_zone_info').html(data.tpl).css('position','absolute').css("left",e.pageX).css("top",e.pageY).css('display','block'); - }); -} - - -function deleteNode(node_srl){ - - if(confirm(lang_confirm_delete)){ - jQuery('#menu_zone_info').html(''); - var params ={ - "menu_item_srl":node_srl - ,"menu_srl":jQuery("form input[name=menu_srl]").val() - }; - jQuery.exec_json('menu.procMenuAdminDeleteItem', params, function(data){ - Tree(xml_url); - }); - } -} - - -function completeInsertMenuItem(ret_obj) { - jQuery('#menu_zone_info').html(''); - Tree(xml_url); -} - -function doMoveMenuInfo() { - var $ = jQuery; - $(function(){ $('#fo_menu').appendTo(document.body); $('#menu_zone_info').css('width', '550px'); }); -} +function Tree(url){ + // clear tree; + jQuery('#menu > ul > li > ul').remove(); + + if(jQuery("ul.simpleTree > li > a").size() ==0)jQuery(''+lang_cmd_insert+'').bind("click",function(e){addNode(0,e);}).appendTo("ul.simpleTree > li"); + + //ajax get data and transeform ul il + jQuery.get(url,function(data){ + jQuery(data).find("node").each(function(i){ + var text = jQuery(this).attr("text"); + var node_srl = jQuery(this).attr("node_srl"); + var parent_srl = jQuery(this).attr("parent_srl"); + var url = jQuery(this).attr("url"); + + // node + var node = jQuery('
      • '+text+'
      • '); + + // button + jQuery(''+lang_cmd_insert+'').bind("click",function(e){ + addNode(node_srl,e); + return false; + }).appendTo(node); + + jQuery(''+lang_cmd_modify+'').bind("click",function(e){ + modifyNode(node_srl,e); + return false; + }).appendTo(node); + + jQuery(''+lang_cmd_delete+'').bind("click",function(e){ + deleteNode(node_srl); + return false; + }).appendTo(node); + + // insert parent child + if(parent_srl>0){ + if(jQuery('#tree_'+parent_srl+'>ul').length==0) jQuery('#tree_'+parent_srl).append(jQuery('
          ')); + jQuery('#tree_'+parent_srl+'> ul').append(node); + }else{ + if(jQuery('#menu ul.simpleTree > li > ul').length==0) jQuery("
            ").appendTo('#menu ul.simpleTree > li'); + jQuery('#menu ul.simpleTree > li > ul').append(node); + } + + }); + + //button show hide + jQuery("#menu li").each(function(){ + if(jQuery(this).parents('ul').size() > max_menu_depth) jQuery("a.add",this).hide(); + if(jQuery(">ul",this).size()>0) jQuery(">a.delete",this).hide(); + }); + + + // draw tree + simpleTreeCollection = jQuery('.simpleTree').simpleTree({ + autoclose: false, + afterClick:function(node){ + //alert("text-"+jQuery('span:first',node).text()); + }, + afterDblClick:function(node){ + //alert("text-"+jQuery('span:first',node).text()); + }, + afterMove:function(destination, source, pos){ + + jQuery("#menu_zone_info").html(""); + + if(destination.size() == 0){ + Tree(xml_url); + return; + } + var menu_srl = jQuery("#fo_menu input[name=menu_srl]").val(); + var parent_srl = destination.attr('id').replace(/.*_/g,''); + var target_srl = source.attr('id').replace(/.*_/g,''); + var brothers = jQuery('#'+destination.attr('id')+' > ul > li:not([class^=line])').length; + var mode = brothers >1 ? 'move':'insert'; + var source_srl = pos == 0 ? 0: source.prevAll("li:not(.line)").get(0).id.replace(/.*_/g,''); + + jQuery.exec_json("menu.procMenuAdminMoveItem",{"menu_srl":menu_srl,"parent_srl":parent_srl,"target_srl":target_srl,"source_srl":source_srl,"mode":mode}, + function(data){ + if(data.error>0) Tree(xml_url); + }); + + }, + + // i want you !! made by sol + beforeMovedToLine : function(destination, source, pos){ +// if(typeof(destination.id) == 'undefined') return false; + return (jQuery(destination).parents('ul').size() + jQuery('ul',source).size() <= max_menu_depth); + }, + + // i want you !! made by sol + beforeMovedToFolder : function(destination, source, pos){ +// if(typeof(destination.id) == 'undefined') return false; + return (jQuery(destination).parents('ul').size() + jQuery('ul',source).size() <= max_menu_depth-1); + }, + afterAjax:function() + { + //alert('Loaded'); + }, + animate:true + ,docToFolderConvert:true + }); + + + // image url replace +// jQuery("#menu ul.simpleTree img").attr("src",function(){ return jQuery(this).attr("src").replace("images/","./common/js/plugins/ui.tree/images/");}); + + + + + // open all node + nodeToggleAll(); + },"xml"); +} + +function nodeToggleAll(){ + jQuery("[class*=close]", simpleTreeCollection[0]).each(function(){ + simpleTreeCollection[0].nodeToggle(this); + }); +} + + + +function modifyNode(node_srl,e){ + jQuery('#menu_zone_info').html(''); + jQuery("#tree_"+node_srl+" > span").click(); + var params ={ + "parent_srl":0 + ,"menu_item_srl":node_srl + }; + + jQuery.exec_json('menu.getMenuAdminTplInfo', params, function(data){ + jQuery('#menu_zone_info').html(data.tpl).css('position','absolute').css("left",e.pageX).css("top",e.pageY).css('display','block'); + }); +} + +function addNode(node_srl,e){ + + jQuery('#menu_zone_info').html(''); + jQuery("#tree_"+node_srl+" > span").click(); + + var params ={ + "menu_item_srl":0 + ,"parent_srl":node_srl + }; + + jQuery.exec_json('menu.getMenuAdminTplInfo', params, function(data){ + jQuery('#menu_zone_info').html(data.tpl).css('position','absolute').css("left",e.pageX).css("top",e.pageY).css('display','block'); + }); +} + + +function deleteNode(node_srl){ + + if(confirm(lang_confirm_delete)){ + jQuery('#menu_zone_info').html(''); + var params ={ + "menu_item_srl":node_srl + ,"menu_srl":jQuery("form input[name=menu_srl]").val() + }; + jQuery.exec_json('menu.procMenuAdminDeleteItem', params, function(data){ + Tree(xml_url); + }); + } +} + + +function completeInsertMenuItem(ret_obj) { + jQuery('#menu_zone_info').html(''); + Tree(xml_url); +} + +function doMoveMenuInfo() { + var $ = jQuery; + $(function(){ $('#fo_menu').appendTo(document.body); $('#menu_zone_info').css('width', '550px'); }); +} diff --git a/modules/menu/tpl/menu.html b/modules/menu/tpl/menu.html index 4aaf5a6b6..05198fa7d 100644 --- a/modules/menu/tpl/menu.html +++ b/modules/menu/tpl/menu.html @@ -1,30 +1,30 @@ - -
            -
              - {@ $start = true } - {@ $depth = 0 } - - - - - -
                - - - -
              - {@ $depth -= 1} - - -
            • {$val->text} - {@ $start = false } - {@ $depth = $val->depth } - - -
            • -
            - {@ $depth -= 1} - - -
          -
    + +
    +
      + {@ $start = true } + {@ $depth = 0 } + + + + + +
        + + + +
      + {@ $depth -= 1} + + +
    • {$val->text} + {@ $start = false } + {@ $depth = $val->depth } + + +
    • +
    + {@ $depth -= 1} + + + +
    diff --git a/modules/message/conf/info.xml b/modules/message/conf/info.xml index 28fdcc214..02e6186a0 100644 --- a/modules/message/conf/info.xml +++ b/modules/message/conf/info.xml @@ -1,36 +1,36 @@ - - - 오류 표시 - エラー表示 - 错误信息 - Display Errors - Hiển thị lỗi - Mostrar el error - Отображение ошибок - 錯誤訊息 - Hata Görüntüleme - 오류 및 각종 시스템 메세지 관리 모듈 - エラー及びシステムメッセージ管理モジュール - 管理错误信息及各种系统信息的模块。 - This module managers erros and system messages. - Module này quản lý những thông báo lỗi của hệ thống. - Este módulo es para manejar los errores y mensajes del sistema. - Этот модуль управляет ошибками и системными сообщениями. - 管理錯誤訊息及各種系統訊息的模組。 - Bu modül, hataları ve sistem mesajlarını yönetir. - 0.1 - 2007-02-28 - system - - - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - - + + + 오류 표시 + エラー表示 + 错误信息 + Display Errors + Hiển thị lỗi + Mostrar el error + Отображение ошибок + 錯誤訊息 + Hata Görüntüleme + 오류 및 각종 시스템 메세지 관리 모듈 + エラー及びシステムメッセージ管理モジュール + 管理错误信息及各种系统信息的模块。 + This module managers erros and system messages. + Module này quản lý những thông báo lỗi của hệ thống. + Este módulo es para manejar los errores y mensajes del sistema. + Этот модуль управляет ошибками и системными сообщениями. + 管理錯誤訊息及各種系統訊息的模組。 + Bu modül, hataları ve sistem mesajlarını yönetir. + 0.1 + 2007-02-28 + system + + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + diff --git a/modules/message/lang/en.lang.php b/modules/message/lang/en.lang.php index 147edfa1d..b24d26fd8 100644 --- a/modules/message/lang/en.lang.php +++ b/modules/message/lang/en.lang.php @@ -1,10 +1,10 @@ -message = 'Display Errors'; - $lang->about_skin = "You may select skins of error messages"; -?> +message = 'Display Errors'; + $lang->about_skin = "You may select skins of error messages"; +?> diff --git a/modules/message/lang/es.lang.php b/modules/message/lang/es.lang.php index 5182af3c0..75216e4df 100644 --- a/modules/message/lang/es.lang.php +++ b/modules/message/lang/es.lang.php @@ -1,10 +1,10 @@ -message = 'Mostrar el error'; - $lang->about_skin = "Usted puede seleccionar los temas de los mensajes del error."; -?> +message = 'Mostrar el error'; + $lang->about_skin = "Usted puede seleccionar los temas de los mensajes del error."; +?> diff --git a/modules/message/lang/fr.lang.php b/modules/message/lang/fr.lang.php index 0fb7d1446..9ac06970f 100644 --- a/modules/message/lang/fr.lang.php +++ b/modules/message/lang/fr.lang.php @@ -1,10 +1,10 @@ - - * @brief Paque du langage en français pour le module de Message - **/ - - $lang->message = 'Montrer Erreurs'; - $lang->about_skin = "Vous pouvez choisir un habillage pour le message des erreurs"; -?> + + * @brief Paque du langage en français pour le module de Message + **/ + + $lang->message = 'Montrer Erreurs'; + $lang->about_skin = "Vous pouvez choisir un habillage pour le message des erreurs"; +?> diff --git a/modules/message/lang/jp.lang.php b/modules/message/lang/jp.lang.php index 75b7a511c..ef799c25a 100644 --- a/modules/message/lang/jp.lang.php +++ b/modules/message/lang/jp.lang.php @@ -1,10 +1,10 @@ -message = 'エラー表示'; - $lang->about_skin = 'メッセージを表示する際のスキンが指定出来ます。'; -?> +message = 'エラー表示'; + $lang->about_skin = 'メッセージを表示する際のスキンが指定出来ます。'; +?> diff --git a/modules/message/lang/ko.lang.php b/modules/message/lang/ko.lang.php index a97922d3e..558dcb460 100644 --- a/modules/message/lang/ko.lang.php +++ b/modules/message/lang/ko.lang.php @@ -1,10 +1,10 @@ -message = '오류 표시'; - $lang->about_skin = '오류 메시지용 스킨을 지정하실 수 있습니다.'; -?> +message = '오류 표시'; + $lang->about_skin = '오류 메시지용 스킨을 지정하실 수 있습니다.'; +?> diff --git a/modules/message/lang/ru.lang.php b/modules/message/lang/ru.lang.php index 58da27fcc..3439797e8 100644 --- a/modules/message/lang/ru.lang.php +++ b/modules/message/lang/ru.lang.php @@ -1,10 +1,10 @@ -message = 'Отображать ошибки'; - $lang->about_skin = "Вы можете выбрать скин сообщений об ошибках"; -?> +message = 'Отображать ошибки'; + $lang->about_skin = "Вы можете выбрать скин сообщений об ошибках"; +?> diff --git a/modules/message/lang/tr.lang.php b/modules/message/lang/tr.lang.php index 231e7ab97..e8f0d0887 100644 --- a/modules/message/lang/tr.lang.php +++ b/modules/message/lang/tr.lang.php @@ -1,10 +1,10 @@ -message = 'Hata Görüntüleme'; - $lang->about_skin = "Hata mesajlarının dış görünümlerini seçebilirsiniz"; -?> +message = 'Hata Görüntüleme'; + $lang->about_skin = "Hata mesajlarının dış görünümlerini seçebilirsiniz"; +?> diff --git a/modules/message/lang/vi.lang.php b/modules/message/lang/vi.lang.php index 7b19009d9..e344fc7f9 100644 --- a/modules/message/lang/vi.lang.php +++ b/modules/message/lang/vi.lang.php @@ -1,12 +1,12 @@ -message = 'Hiển thị lỗi'; - $lang->about_skin = "Bạn có thể chọn giao diện khi hiển thị lỗi."; -?> +message = 'Hiển thị lỗi'; + $lang->about_skin = "Bạn có thể chọn giao diện khi hiển thị lỗi."; +?> diff --git a/modules/message/lang/zh-CN.lang.php b/modules/message/lang/zh-CN.lang.php index 3bcdc5760..b771cad3d 100644 --- a/modules/message/lang/zh-CN.lang.php +++ b/modules/message/lang/zh-CN.lang.php @@ -1,10 +1,10 @@ -message = '错误信息'; - $lang->about_skin = "提示信息可以指定皮肤。"; +message = '错误信息'; + $lang->about_skin = "提示信息可以指定皮肤。"; ?> \ No newline at end of file diff --git a/modules/message/lang/zh-TW.lang.php b/modules/message/lang/zh-TW.lang.php index 1cedd9fec..35ecc4836 100644 --- a/modules/message/lang/zh-TW.lang.php +++ b/modules/message/lang/zh-TW.lang.php @@ -1,10 +1,10 @@ -message = '錯誤提示'; - $lang->about_skin = "提示訊息時,可以指定面板。"; +message = '錯誤提示'; + $lang->about_skin = "提示訊息時,可以指定面板。"; ?> \ No newline at end of file diff --git a/modules/message/m.skins/default/system_message.html b/modules/message/m.skins/default/system_message.html index 483f96c8e..f732b89b8 100644 --- a/modules/message/m.skins/default/system_message.html +++ b/modules/message/m.skins/default/system_message.html @@ -1,63 +1,63 @@ - -
    -
    -

    {$system_message}

    -
    -
    - - {@ Context::addJsFile("./common/js/jquery.js", true, '', -100000) } - {@ Context::addJsFile("./common/js/js_app.js", true, '', -100000) } - {@ Context::addJsFile("./common/js/x.js", true, '', -100000) } - {@ Context::addJsFile("./common/js/common.js", true, '', -100000) } - {@ Context::addJsFile("./common/js/xml_handler.js", true, '', -100000) } - {@ Context::addJsFile("./common/js/xml_js_filter.js", true, '', -100000) } - - -
    -
    -
    -
      -
    • -
    • -
    -

    - - -

    - - -
    -
    -
    - - -
    -
    -
    -
      -
    • -
    -
    - -
    - -
    -
    -
    - - - - - -
    -
    + +
    +
    +

    {$system_message}

    +
    +
    + + {@ Context::addJsFile("./common/js/jquery.js", true, '', -100000) } + {@ Context::addJsFile("./common/js/js_app.js", true, '', -100000) } + {@ Context::addJsFile("./common/js/x.js", true, '', -100000) } + {@ Context::addJsFile("./common/js/common.js", true, '', -100000) } + {@ Context::addJsFile("./common/js/xml_handler.js", true, '', -100000) } + {@ Context::addJsFile("./common/js/xml_js_filter.js", true, '', -100000) } + + +
    +
    +
    +
      +
    • +
    • +
    +

    + + +

    + + +
    +
    +
    + + +
    +
    +
    +
      +
    • +
    +
    + +
    + +
    +
    +
    + + + + + +
    +
    diff --git a/modules/message/message.admin.controller.php b/modules/message/message.admin.controller.php index b9f22ac55..2c28995c4 100644 --- a/modules/message/message.admin.controller.php +++ b/modules/message/message.admin.controller.php @@ -1,31 +1,31 @@ -skin = Context::get('skin'); - - // module Controller 객체 생성하여 입력 - $oModuleController = &getController('module'); - $output = $oModuleController->insertModuleConfig('message',$args); - if(!$output->toBool()) return $output; - - $this->setMessage('success_updated'); - } - } -?> +skin = Context::get('skin'); + + // module Controller 객체 생성하여 입력 + $oModuleController = &getController('module'); + $output = $oModuleController->insertModuleConfig('message',$args); + if(!$output->toBool()) return $output; + + $this->setMessage('success_updated'); + } + } +?> diff --git a/modules/message/message.admin.view.php b/modules/message/message.admin.view.php index 288b91f76..a8f4855b9 100644 --- a/modules/message/message.admin.view.php +++ b/modules/message/message.admin.view.php @@ -1,35 +1,35 @@ -getskins($this->module_path); - Context::set('skin_list', $skin_list); - - // 설정 정보를 받아옴 (module model 객체를 이용) - $config = $oModuleModel->getModuleConfig('message'); - Context::set('config',$config); - - // 템플릿 파일 지정 - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('config'); - } - - } -?> +getskins($this->module_path); + Context::set('skin_list', $skin_list); + + // 설정 정보를 받아옴 (module model 객체를 이용) + $config = $oModuleModel->getModuleConfig('message'); + Context::set('config',$config); + + // 템플릿 파일 지정 + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('config'); + } + + } +?> diff --git a/modules/message/message.class.php b/modules/message/message.class.php index 1ef02f550..a3dcbcb9c 100644 --- a/modules/message/message.class.php +++ b/modules/message/message.class.php @@ -1,37 +1,37 @@ - + diff --git a/modules/message/message.view.php b/modules/message/message.view.php index e8806c152..0f5250923 100644 --- a/modules/message/message.view.php +++ b/modules/message/message.view.php @@ -1,47 +1,47 @@ -getModuleConfig('message'); - if(!$config->skin) $config->skin = 'default'; - - // 템플릿 경로를 지정 - $template_path = sprintf('%sskins/%s', $this->module_path, $config->skin); - - // 회원 관리 정보를 받음 - $oModuleModel = &getModel('module'); - $member_config = $oModuleModel->getModuleConfig('member'); - Context::set('member_config', $member_config); - - // ssl 사용시 현재 https접속상태인지에 대한 flag및 https url 생성 - $ssl_mode = false; - if($member_config->enable_ssl == 'Y') { - if(preg_match('/^https:\/\//i',Context::getRequestUri())) $ssl_mode = true; - } - Context::set('ssl_mode',$ssl_mode); - - Context::set('system_message', nl2br($this->getMessage())); - - $this->setTemplatePath($template_path); - $this->setTemplateFile('system_message'); - } - - } -?> +getModuleConfig('message'); + if(!$config->skin) $config->skin = 'default'; + + // 템플릿 경로를 지정 + $template_path = sprintf('%sskins/%s', $this->module_path, $config->skin); + + // 회원 관리 정보를 받음 + $oModuleModel = &getModel('module'); + $member_config = $oModuleModel->getModuleConfig('member'); + Context::set('member_config', $member_config); + + // ssl 사용시 현재 https접속상태인지에 대한 flag및 https url 생성 + $ssl_mode = false; + if($member_config->enable_ssl == 'Y') { + if(preg_match('/^https:\/\//i',Context::getRequestUri())) $ssl_mode = true; + } + Context::set('ssl_mode',$ssl_mode); + + Context::set('system_message', nl2br($this->getMessage())); + + $this->setTemplatePath($template_path); + $this->setTemplateFile('system_message'); + } + + } +?> diff --git a/modules/message/skins/default/message.css b/modules/message/skins/default/message.css index 42cb64378..31f23693c 100644 --- a/modules/message/skins/default/message.css +++ b/modules/message/skins/default/message.css @@ -1,39 +1,39 @@ -@charset "utf-8"; -/* NHN | dece24@nhncorp.com */ -#loginAccess{ position:relative; width:384px; border:2px solid #757575; margin:30px auto; padding:20px 0 0 0; background:#fff; font-size:12px; font-family:Tahoma; line-height:normal;} -#loginAccess form{ margin:0; padding:0;} -#loginAccess fieldset{ border:0; margin:0; padding:0;} -#loginAccess h1{ margin:0 28px 20px 28px; font-size:12px; color:#e77161;} -#loginAccess ul{ margin:0; padding:0; list-style:none;} -#loginAccess .mLogin{ display:none;} -#loginAccess .idpw{ margin:0 28px 20px 28px;} -#loginAccess .oid{ margin:0 28px 20px 28px;} -#loginAccess .idpw li{ margin:0 0 5px 0;} -#loginAccess .inputText{ font-size:12px; height:22px; color:#767676; font-weight:bold; border:1px solid #b7b7b7; border-right-color:#e1e1e1; border-bottom-color:#e1e1e1;} -#loginAccess .idpw .inputText{ width:316px; padding:8px 0 0 10px;} -#loginAccess .oid .inputText{ width:291px; padding:8px 0 0 35px; background:url(./images/openid_login_bg.gif) no-repeat 10px center;} -#loginAccess .inputCheck{ width:13px; height:13px; margin:0; padding:0; vertical-align:middle;} -#loginAccess label{ vertical-align:middle;} -#loginAccess #warning{ display:none; margin:0 0 20px 0;} -#loginAccess #warning.open{ display:block;} -#loginAccess #warning p{ margin:0;} -#loginAccess .buttonArea{ position:relative; margin:0 28px; padding:0; color:#767676; *zoom:1;} -#loginAccess .buttonArea .keeping{ position:relative; margin:0 0 20px 0; height:32px; line-height:32px;} -#loginAccess #gLogin .buttonArea .buttonAccount{ position:absolute; top:0; right:0;} -#loginAccess #oLogin .buttonArea{ text-align:center; margin-bottom:20px;} -#loginAccess .buttonAccount, -#loginAccess .buttonAccount a, -#loginAccess .buttonAccount input{ position:relative; display:inline-block; margin:0; padding:0; overflow:visible; height:32px; line-height:32px; font-size:12px; font-weight:bold; color:#fff; vertical-align:middle; cursor:pointer; border:0; text-decoration:none !important; background:transparent url(./images/buttonAction.gif) no-repeat;} -#loginAccess .buttonAccount{ margin:0 4px 0 0; background-position:left top;} -#loginAccess .buttonAccount a, -#loginAccess .buttonAccount input{ left:4px; background-position:right top; *vertical-align:top; padding:0 24px 0 36px;} -#loginAccess .help{ position:relative; padding:15px 0; background:#fafafa; border-top:1px solid #d9d9d9; text-align:center;} -#loginAccess .help li{ display:inline; border-left:1px solid #c3c3c3; padding:0 0 0 10px; margin:0 6px 0 0; line-height:1;} -#loginAccess .help li.first{ border:0; padding:0;} -#loginAccess .help a{ text-decoration:none; color:#333;} -#loginAccess .help a:hover, -#loginAccess .help a:active, -#loginAccess .help a:focus{ text-decoration:underline;} -#loginAccess .logOut{ text-align:left; margin:0 28px; padding:0 0 20px 0;} -.gLogin #gLogin, +@charset "utf-8"; +/* NHN | dece24@nhncorp.com */ +#loginAccess{ position:relative; width:384px; border:2px solid #757575; margin:30px auto; padding:20px 0 0 0; background:#fff; font-size:12px; font-family:Tahoma; line-height:normal;} +#loginAccess form{ margin:0; padding:0;} +#loginAccess fieldset{ border:0; margin:0; padding:0;} +#loginAccess h1{ margin:0 28px 20px 28px; font-size:12px; color:#e77161;} +#loginAccess ul{ margin:0; padding:0; list-style:none;} +#loginAccess .mLogin{ display:none;} +#loginAccess .idpw{ margin:0 28px 20px 28px;} +#loginAccess .oid{ margin:0 28px 20px 28px;} +#loginAccess .idpw li{ margin:0 0 5px 0;} +#loginAccess .inputText{ font-size:12px; height:22px; color:#767676; font-weight:bold; border:1px solid #b7b7b7; border-right-color:#e1e1e1; border-bottom-color:#e1e1e1;} +#loginAccess .idpw .inputText{ width:316px; padding:8px 0 0 10px;} +#loginAccess .oid .inputText{ width:291px; padding:8px 0 0 35px; background:url(./images/openid_login_bg.gif) no-repeat 10px center;} +#loginAccess .inputCheck{ width:13px; height:13px; margin:0; padding:0; vertical-align:middle;} +#loginAccess label{ vertical-align:middle;} +#loginAccess #warning{ display:none; margin:0 0 20px 0;} +#loginAccess #warning.open{ display:block;} +#loginAccess #warning p{ margin:0;} +#loginAccess .buttonArea{ position:relative; margin:0 28px; padding:0; color:#767676; *zoom:1;} +#loginAccess .buttonArea .keeping{ position:relative; margin:0 0 20px 0; height:32px; line-height:32px;} +#loginAccess #gLogin .buttonArea .buttonAccount{ position:absolute; top:0; right:0;} +#loginAccess #oLogin .buttonArea{ text-align:center; margin-bottom:20px;} +#loginAccess .buttonAccount, +#loginAccess .buttonAccount a, +#loginAccess .buttonAccount input{ position:relative; display:inline-block; margin:0; padding:0; overflow:visible; height:32px; line-height:32px; font-size:12px; font-weight:bold; color:#fff; vertical-align:middle; cursor:pointer; border:0; text-decoration:none !important; background:transparent url(./images/buttonAction.gif) no-repeat;} +#loginAccess .buttonAccount{ margin:0 4px 0 0; background-position:left top;} +#loginAccess .buttonAccount a, +#loginAccess .buttonAccount input{ left:4px; background-position:right top; *vertical-align:top; padding:0 24px 0 36px;} +#loginAccess .help{ position:relative; padding:15px 0; background:#fafafa; border-top:1px solid #d9d9d9; text-align:center;} +#loginAccess .help li{ display:inline; border-left:1px solid #c3c3c3; padding:0 0 0 10px; margin:0 6px 0 0; line-height:1;} +#loginAccess .help li.first{ border:0; padding:0;} +#loginAccess .help a{ text-decoration:none; color:#333;} +#loginAccess .help a:hover, +#loginAccess .help a:active, +#loginAccess .help a:focus{ text-decoration:underline;} +#loginAccess .logOut{ text-align:left; margin:0 28px; padding:0 0 20px 0;} +.gLogin #gLogin, .oLogin #oLogin{ display:block;} \ No newline at end of file diff --git a/modules/message/skins/default/message.js b/modules/message/skins/default/message.js index 815cb0cec..8523b8ec3 100644 --- a/modules/message/skins/default/message.js +++ b/modules/message/skins/default/message.js @@ -1,38 +1,38 @@ -/* 로그인 후 */ -function completeMessageLogin(ret_obj, response_tags, params, fo_obj) { - var url = current_url.setQuery('act',''); - location.href = url; -} - -/* 오픈아이디 로그인 후 */ -function completeMessageOpenIDLogin(ret_obj, response_tags) { - var redirect_url = ret_obj['redirect_url']; - location.href = redirect_url; -} - -function doLogin(o,filter){ - jQuery('input.inputText',o).each(function(){ - var t = jQuery(this); - if(t.attr('title').length>0 && t.attr('title') == t.val()) t.val(''); - }); - procFilter(o,filter); - initLoginTitleMsg(); - return false; -} - - -function initLoginTitleMsg(){ - jQuery('.gLogin, .mLogin').find('input.inputText').focus(function(){ - var t = jQuery(this); - if(t.attr('title').length>0 && t.attr('title')==t.val()) t.val(''); - }).blur(function(){ - var t = jQuery(this); - if(t.attr('title').length>0 && t.val()=='') t.val(t.attr('title')); - }).focus().blur(); -} - -jQuery(function(){ - initLoginTitleMsg(); -}); - - +/* 로그인 후 */ +function completeMessageLogin(ret_obj, response_tags, params, fo_obj) { + var url = current_url.setQuery('act',''); + location.href = url; +} + +/* 오픈아이디 로그인 후 */ +function completeMessageOpenIDLogin(ret_obj, response_tags) { + var redirect_url = ret_obj['redirect_url']; + location.href = redirect_url; +} + +function doLogin(o,filter){ + jQuery('input.inputText',o).each(function(){ + var t = jQuery(this); + if(t.attr('title').length>0 && t.attr('title') == t.val()) t.val(''); + }); + procFilter(o,filter); + initLoginTitleMsg(); + return false; +} + + +function initLoginTitleMsg(){ + jQuery('.gLogin, .mLogin').find('input.inputText').focus(function(){ + var t = jQuery(this); + if(t.attr('title').length>0 && t.attr('title')==t.val()) t.val(''); + }).blur(function(){ + var t = jQuery(this); + if(t.attr('title').length>0 && t.val()=='') t.val(t.attr('title')); + }).focus().blur(); +} + +jQuery(function(){ + initLoginTitleMsg(); +}); + + diff --git a/modules/message/skins/default/system_message.html b/modules/message/skins/default/system_message.html index 71f7dc475..a18c2923c 100644 --- a/modules/message/skins/default/system_message.html +++ b/modules/message/skins/default/system_message.html @@ -1,60 +1,60 @@ - - -
    -

    {$system_message}

    - - - - - -
    -
    -
    -
      -
    • -
    • -
    -
    -

    - - -

    -
    -

    {$lang->about_keep_warning}

    -
    - -
    -
    -
    - -
    - - - -
    -
    -
    -
    - -
    -
    - -
    -
    -
    - -
    - - - - - -
    + + +
    +

    {$system_message}

    + + + + + +
    +
    +
    +
      +
    • +
    • +
    +
    +

    + + +

    +
    +

    {$lang->about_keep_warning}

    +
    + +
    +
    +
    + +
    + + + +
    +
    +
    +
    + +
    +
    + +
    +
    +
    + +
    + + + + + +
    diff --git a/modules/module/conf/info.xml b/modules/module/conf/info.xml index c78197ec7..eee5c1e21 100644 --- a/modules/module/conf/info.xml +++ b/modules/module/conf/info.xml @@ -1,36 +1,36 @@ - - - 모듈 - 模块列表 - モジュール - Module - Module - Módulo - Модули - 模組 - Modül - 모듈 생성 및 관리하는 모듈입니다. - 生成及管理模块的模块。 - モジュールの生成、管理するモジュールです。 - This module is for creating/managering the other modules. - Module cho phép tạo và quản lý những Module khác. - Este módulo is para crear y manejar los otros módulos. - Этот модуль служит для создания/управления другими модулями. - 用於建立與管理其他模組。 - Bu modül, başka modüller oluşturmak ve yönetmek içindir. - 0.1 - 2007-02-28 - system - - - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - - + + + 모듈 + 模块列表 + モジュール + Module + Module + Módulo + Модули + 模組 + Modül + 모듈 생성 및 관리하는 모듈입니다. + 生成及管理模块的模块。 + モジュールの生成、管理するモジュールです。 + This module is for creating/managering the other modules. + Module cho phép tạo và quản lý những Module khác. + Este módulo is para crear y manejar los otros módulos. + Этот модуль служит для создания/управления другими модулями. + 用於建立與管理其他模組。 + Bu modül, başka modüller oluşturmak ve yönetmek içindir. + 0.1 + 2007-02-28 + system + + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + diff --git a/modules/module/lang/en.lang.php b/modules/module/lang/en.lang.php index dfda4e598..727de5ac4 100644 --- a/modules/module/lang/en.lang.php +++ b/modules/module/lang/en.lang.php @@ -1,99 +1,99 @@ -virtual_site = "Virtual Site"; - $lang->module_list = "Modules List"; - $lang->module_index = "Modules List"; - $lang->module_category = "Module Category"; - $lang->module_info = "Module Info"; - $lang->add_shortcut = "Add Shortcuts"; - $lang->module_action = "Actions"; - $lang->module_maker = "Module Developer"; - $lang->module_license = 'License'; - $lang->module_history = "Update history"; - $lang->category_title = "Category Title"; - $lang->header_text = 'Header Text'; - $lang->footer_text = 'Footer Text'; - $lang->use_category = 'Enable Category'; - $lang->category_title = 'Category Title'; - $lang->checked_count = 'Number of Checked Articles'; - $lang->skin_default_info = 'Default Skin Info'; - $lang->skin_author = 'Skin Developer'; - $lang->skin_license = 'License'; - $lang->skin_history = 'Update history'; - $lang->module_copy = "Duplicate Module"; - $lang->module_selector = "Module Selector"; - $lang->do_selected = "I want to"; - $lang->bundle_setup = "Bundle Setup"; - $lang->bundle_addition_setup = "Bundle Additional Setup"; - $lang->bundle_grant_setup = "Bundle Permission Setup"; - $lang->lang_code = "Language Code"; - $lang->filebox = "FileBox"; - - $lang->access_type = 'Access Type'; - $lang->access_domain = 'With Domain Name'; - $lang->access_vid = 'With Site ID'; - $lang->about_domain = "In order to create more than one virtual site, every club needs to have its own domain name.
    Sub-domain (e.g., aaa.bbb.com of bbb.com) also can be used. Input the address including the path where XE is installed.
    ex) www.xpressengine.com/xe"; - $lang->about_vid = 'Users can access via http://XEaddress/ID. You cannot use same site id as the existing module name(mid).
    Site id should start with an alphabet character . Alphabet characters, numbers and _ can be used for the site id.'; - $lang->msg_already_registed_vid = 'Already registered site id. Please input another ID.'; - $lang->msg_already_registed_domain = "Domain name has already been used. Please input another domain name."; - - $lang->header_script = "Header Script"; - $lang->about_header_script = "You can input the html script between <header> and </header> by yourself.
    You can use <script, <style or <meta tag"; - - $lang->grant_access = "Access"; - $lang->grant_manager = "Management"; - - $lang->grant_to_all = "All users"; - $lang->grant_to_login_user = "Logged users"; - $lang->grant_to_site_user = "Registered users"; - $lang->grant_to_group = "Specification group users"; - - $lang->cmd_add_shortcut = "Add Shortcut"; - $lang->cmd_install = "Install"; - $lang->cmd_update = "Update"; - $lang->cmd_manage_category = 'Manage Categories'; - $lang->cmd_manage_grant = 'Manage Permission'; - $lang->cmd_manage_skin = 'Manage Skins'; - $lang->cmd_manage_document = 'Manage Articles'; - $lang->cmd_find_module = 'Find Module'; - $lang->cmd_find_langcode = 'Find lang code'; - - $lang->msg_new_module = "Create new module"; - $lang->msg_update_module = "Modify module"; - $lang->msg_module_name_exists = "The name already exists. Please try another name."; - $lang->msg_category_is_null = 'There is no registered category.'; - $lang->msg_grant_is_null = 'There is no permission list.'; - $lang->msg_no_checked_document = 'No checked articles exist.'; - $lang->msg_move_failed = 'Failed to move'; - $lang->msg_cannot_delete_for_child = 'Cannot delete a category having child categories.'; - $lang->msg_limit_mid ="Only alphabets+[alphabets+numbers+_] can be used as module name."; - $lang->msg_extra_name_exists = 'Already registered extra variable name. Please input another name.'; - - $lang->about_browser_title = "It will be shown in the browser title. It will be also used in a RSS/Trackback."; - $lang->about_mid = "The module name will be used like http://address/?mid=ModuleName.\n(Only english alphabet + [english alphabet, numbers, and underscore(_)] are allowed. The maximum length is 40.)"; - $lang->about_default = "If checked, the default will be shown when access to the site without no mid value(mid=NoValue)."; - $lang->about_module_category = "It enables you to manage it through module category.\n The URL for the module manager is Manage module > Module category ."; - $lang->about_description= 'It is the description only for a manager.'; - $lang->about_default = 'If checked, this module will be shown when users access to the site without mid value (mid=NoValue).'; - $lang->about_header_text = 'The contents will be shown on the top of the module.(html tags available)'; - $lang->about_footer_text = 'The contents will be shown on the bottom of the module.(html tags available)'; - $lang->about_skin = 'You may choose a module skin.'; - $lang->about_use_category = 'If checked, category function will be enabled.'; - $lang->about_list_count = 'You can set the number of limit to show article in a page.(default is 20)'; - $lang->about_search_list_count = 'You may set the number of articles to be exposed when you use search or category function. (default is 20)'; - $lang->about_page_count = 'You can set the number of page link to move pages in a bottom of page.(default is 10)'; - $lang->about_admin_id = 'You can grant a manager to have all permissions to the module.'; - $lang->about_grant = 'If you disable all permissions for a specific object, members who has not logged in would get permission.'; - $lang->about_grant_deatil = 'Registered users mean users who signed-up to the virtual sites (e.g., cafeXE).'; - $lang->about_module = "XE consists of modules except basic library.\n [Module Manage] module will show all installed modules and help you to manage them."; - - $lang->about_extra_vars_default_value = 'If multiple default values are needed, you can link them with comma(,).'; - $lang->about_search_virtual_site = "Input domain of virtual sites.
    To search modules of non-virtual site, search with blank"; - $lang->about_langcode = "If you want to configure seperately, use 'find language code'"; - $lang->about_file_extension= "Only %s extension(s) is available."; -?> +virtual_site = "Virtual Site"; + $lang->module_list = "Modules List"; + $lang->module_index = "Modules List"; + $lang->module_category = "Module Category"; + $lang->module_info = "Module Info"; + $lang->add_shortcut = "Add Shortcuts"; + $lang->module_action = "Actions"; + $lang->module_maker = "Module Developer"; + $lang->module_license = 'License'; + $lang->module_history = "Update history"; + $lang->category_title = "Category Title"; + $lang->header_text = 'Header Text'; + $lang->footer_text = 'Footer Text'; + $lang->use_category = 'Enable Category'; + $lang->category_title = 'Category Title'; + $lang->checked_count = 'Number of Checked Articles'; + $lang->skin_default_info = 'Default Skin Info'; + $lang->skin_author = 'Skin Developer'; + $lang->skin_license = 'License'; + $lang->skin_history = 'Update history'; + $lang->module_copy = "Duplicate Module"; + $lang->module_selector = "Module Selector"; + $lang->do_selected = "I want to"; + $lang->bundle_setup = "Bundle Setup"; + $lang->bundle_addition_setup = "Bundle Additional Setup"; + $lang->bundle_grant_setup = "Bundle Permission Setup"; + $lang->lang_code = "Language Code"; + $lang->filebox = "FileBox"; + + $lang->access_type = 'Access Type'; + $lang->access_domain = 'With Domain Name'; + $lang->access_vid = 'With Site ID'; + $lang->about_domain = "In order to create more than one virtual site, every club needs to have its own domain name.
    Sub-domain (e.g., aaa.bbb.com of bbb.com) also can be used. Input the address including the path where XE is installed.
    ex) www.xpressengine.com/xe"; + $lang->about_vid = 'Users can access via http://XEaddress/ID. You cannot use same site id as the existing module name(mid).
    Site id should start with an alphabet character . Alphabet characters, numbers and _ can be used for the site id.'; + $lang->msg_already_registed_vid = 'Already registered site id. Please input another ID.'; + $lang->msg_already_registed_domain = "Domain name has already been used. Please input another domain name."; + + $lang->header_script = "Header Script"; + $lang->about_header_script = "You can input the html script between <header> and </header> by yourself.
    You can use <script, <style or <meta tag"; + + $lang->grant_access = "Access"; + $lang->grant_manager = "Management"; + + $lang->grant_to_all = "All users"; + $lang->grant_to_login_user = "Logged users"; + $lang->grant_to_site_user = "Registered users"; + $lang->grant_to_group = "Specification group users"; + + $lang->cmd_add_shortcut = "Add Shortcut"; + $lang->cmd_install = "Install"; + $lang->cmd_update = "Update"; + $lang->cmd_manage_category = 'Manage Categories'; + $lang->cmd_manage_grant = 'Manage Permission'; + $lang->cmd_manage_skin = 'Manage Skins'; + $lang->cmd_manage_document = 'Manage Articles'; + $lang->cmd_find_module = 'Find Module'; + $lang->cmd_find_langcode = 'Find lang code'; + + $lang->msg_new_module = "Create new module"; + $lang->msg_update_module = "Modify module"; + $lang->msg_module_name_exists = "The name already exists. Please try another name."; + $lang->msg_category_is_null = 'There is no registered category.'; + $lang->msg_grant_is_null = 'There is no permission list.'; + $lang->msg_no_checked_document = 'No checked articles exist.'; + $lang->msg_move_failed = 'Failed to move'; + $lang->msg_cannot_delete_for_child = 'Cannot delete a category having child categories.'; + $lang->msg_limit_mid ="Only alphabets+[alphabets+numbers+_] can be used as module name."; + $lang->msg_extra_name_exists = 'Already registered extra variable name. Please input another name.'; + + $lang->about_browser_title = "It will be shown in the browser title. It will be also used in a RSS/Trackback."; + $lang->about_mid = "The module name will be used like http://address/?mid=ModuleName.\n(Only english alphabet + [english alphabet, numbers, and underscore(_)] are allowed. The maximum length is 40.)"; + $lang->about_default = "If checked, the default will be shown when access to the site without no mid value(mid=NoValue)."; + $lang->about_module_category = "It enables you to manage it through module category.\n The URL for the module manager is Manage module > Module category ."; + $lang->about_description= 'It is the description only for a manager.'; + $lang->about_default = 'If checked, this module will be shown when users access to the site without mid value (mid=NoValue).'; + $lang->about_header_text = 'The contents will be shown on the top of the module.(html tags available)'; + $lang->about_footer_text = 'The contents will be shown on the bottom of the module.(html tags available)'; + $lang->about_skin = 'You may choose a module skin.'; + $lang->about_use_category = 'If checked, category function will be enabled.'; + $lang->about_list_count = 'You can set the number of limit to show article in a page.(default is 20)'; + $lang->about_search_list_count = 'You may set the number of articles to be exposed when you use search or category function. (default is 20)'; + $lang->about_page_count = 'You can set the number of page link to move pages in a bottom of page.(default is 10)'; + $lang->about_admin_id = 'You can grant a manager to have all permissions to the module.'; + $lang->about_grant = 'If you disable all permissions for a specific object, members who has not logged in would get permission.'; + $lang->about_grant_deatil = 'Registered users mean users who signed-up to the virtual sites (e.g., cafeXE).'; + $lang->about_module = "XE consists of modules except basic library.\n [Module Manage] module will show all installed modules and help you to manage them."; + + $lang->about_extra_vars_default_value = 'If multiple default values are needed, you can link them with comma(,).'; + $lang->about_search_virtual_site = "Input domain of virtual sites.
    To search modules of non-virtual site, search with blank"; + $lang->about_langcode = "If you want to configure seperately, use 'find language code'"; + $lang->about_file_extension= "Only %s extension(s) is available."; +?> diff --git a/modules/module/lang/es.lang.php b/modules/module/lang/es.lang.php index ad699a9a0..36d6fbc95 100644 --- a/modules/module/lang/es.lang.php +++ b/modules/module/lang/es.lang.php @@ -1,99 +1,99 @@ -virtual_site = "Virtual Site"; - $lang->module_list = "Lista de Módulos"; - $lang->module_index = "Lista de Módulos"; - $lang->module_category = "Categoría de Módulos "; - $lang->module_info = "Información"; - $lang->add_shortcut = "Añadir en el menú del administrador"; - $lang->module_action = "Acción"; - $lang->module_maker = "Módulo del desarrollador"; - $lang->module_license = 'License'; - $lang->module_history = "Historia de actualización"; - $lang->category_title = "Título de categoría"; - $lang->header_text = 'Encabezado'; - $lang->footer_text = 'Pie de página'; - $lang->use_category = 'Usar categoría'; - $lang->category_title = 'Título de categoría'; - $lang->checked_count = 'Múmero de los documentos selecionados'; - $lang->skin_default_info = 'información del tema predefinido'; - $lang->skin_author = 'Desarrollador de tema'; - $lang->skin_license = 'License'; - $lang->skin_history = 'Historia de actualización'; - $lang->module_copy = "Copy Module"; - $lang->module_selector = "Module Selector"; - $lang->do_selected = "선택된 것들을..."; - $lang->bundle_setup = "일괄 기본 설정"; - $lang->bundle_addition_setup = "일괄 추가 설정"; - $lang->bundle_grant_setup = "일괄 권한 설정"; - $lang->lang_code = "언어 코드"; - $lang->filebox = "파일박스"; - - $lang->access_type = '접속 방법'; - $lang->access_domain = 'Domain 접속'; - $lang->access_vid = 'Site ID 접속'; - $lang->about_domain = 'Para crear un dominio privado de la site requiere.
    Independiente de dominio o subdominio, y XE está instalado, el camino que en su conjunto.
    Ej.) www.xpressengine.com / zbxe'; - $lang->about_vid = '별도의 도메인이 아닌 http://XE주소/ID 로 접속할 수 있습니다. 모듈명(mid)와 중복될 수 없습니다.
    첫글자는 영문으로 시작해야 하고 영문과 숫자 그리고 _ 만 사용할 수 있습니다'; - $lang->msg_already_registed_vid = '이미 등록된 사이트 ID 입니다. 게시판등의 mid와도 중복이 되지 않습니다. 다른 ID를 입력해주세요.'; - $lang->msg_already_registed_domain = 'Ya es de dominio registrado. Por favor, use un dominio diferente'; - - $lang->header_script = "헤더 스크립트"; - $lang->about_header_script = "html의 <header>와 </header> 사이에 들어가는 코드를 직접 입력할 수 있습니다.
    <script, <style 또는 <meta 태그등을 이용하실 수 있습니다"; - - $lang->grant_access = "Access"; - $lang->grant_manager = "Management"; - - $lang->grant_to_all = "All users"; - $lang->grant_to_login_user = "Logged users"; - $lang->grant_to_site_user = "Joined users"; - $lang->grant_to_group = "Specification group users"; - - $lang->cmd_add_shortcut = "añadir acceso directo"; - $lang->cmd_install = "Instalar"; - $lang->cmd_update = "Actualizar"; - $lang->cmd_manage_category = 'Manejo de categorías'; - $lang->cmd_manage_grant = 'Manejo de atribuciones'; - $lang->cmd_manage_skin = 'Manejo de temas'; - $lang->cmd_manage_document = 'Manejo de documentos'; - $lang->cmd_find_module = '모듈 찾기'; - $lang->cmd_find_langcode = 'Find lang code'; - - $lang->msg_new_module = "Crear un nuevo módulo"; - $lang->msg_update_module = "Modificar el módulo"; - $lang->msg_module_name_exists = "El nombre ya existe. Por favor tratar con otro nombre."; - $lang->msg_category_is_null = 'No existe categoría registrada.'; - $lang->msg_grant_is_null = 'No existe el objetivo de atribución registrado.'; - $lang->msg_no_checked_document = 'No existe documento seleccionado.'; - $lang->msg_move_failed = 'No pudo moverse'; - $lang->msg_cannot_delete_for_child = 'No puede eliminar la categoría si posee subcategoría.'; - $lang->msg_limit_mid ='모듈이름은 영문+[영문+숫자+_] 만 가능합니다.'; - $lang->msg_extra_name_exists = '이미 존재하는 확장변수 이름입니다. 다른 이름을 입력해주세요.'; - - $lang->about_browser_title = "Esto es el valor que se mostrará en el título del navegador. También es usado en RSS/Trackback."; - $lang->about_mid = "El nombre del módulo será usado como http://direccion/?mid=NombreMódulo.\n(sólo alfabeto español+[alfabeto español, números y el gión abajo(_)] son permitidos. The maximum length is 40.)"; - $lang->about_default = "Si selecciona esta opción, se mostrara de manera predefinida sin el valor de mid."; - $lang->about_module_category = "Es posible manejar a traves de categoría.\n EL URL para en manejo del módulo de categoría es Manejo de módulo > Módulo de categoría ."; - $lang->about_description= 'Descripción usada para la administración.'; - $lang->about_default = 'Si selecciona esta opción, se mostrará de manera predefinida sin el valor de mid.'; - $lang->about_header_text = 'El contenido se mostrará en la parte superior del módulo.(tags de html permitido)'; - $lang->about_footer_text = 'El contenido se mostrará en la parte inferior del módulo.(tags de html permitido)'; - $lang->about_skin = 'Usted puede elegir un tema del módulo.'; - $lang->about_use_category = 'Si selecciona esta opción, la función de categoría sera activada.'; - $lang->about_list_count = 'Usted puede definir el número límite de los documentos a mostrar en una página.(Predefinido es 20)'; - $lang->about_search_list_count = 'Usted puede configurar el número de artículos que se exponen cuando se utiliza la función de búsqueda o categoría. (Por defecto es 20)'; - $lang->about_page_count = 'Usted puede definir el número de página enlazada para mover páginas en un botón de la página.(Predefinido es 10)'; - $lang->about_admin_id = 'Usted puede definir el administrador de atribuciones superiores al módulo.\n Usted puede asignar múltiples IDs.'; - $lang->about_grant = 'Si usted desea desactivar a todos los objetos teniendo atribuciones especificas, incluso el usuario no conectado pueden tener atribuciones.'; - $lang->about_grant_deatil = '가입한 사용자는 cafeXE등 분양형 가상 사이트에 가입을 한 로그인 사용자를 의미합니다'; - $lang->about_module = "XE consiste de módulos excepto la librería básica.\n Módulo del Manejo del Módulo muestra todos los módulos instalados y ayuda el manejo de ellos."; - - $lang->about_extra_vars_default_value = 'Si múltiples valores predefinidos son requeridos, usted puede enlazar con la coma(,).'; - $lang->about_search_virtual_site = "가상 사이트(카페XE등)의 도메인을 입력하신 후 검색하세요.
    가상 사이트이외의 모듈은 내용을 비우고 검색하시면 됩니다. (http:// 는 제외)"; - $lang->about_langcode = "언어별로 다르게 설정하고 싶으시면 언어코드 찾기를 이용해주세요"; - $lang->about_file_extension= "%s 파일만 가능합니다."; -?> +virtual_site = "Virtual Site"; + $lang->module_list = "Lista de Módulos"; + $lang->module_index = "Lista de Módulos"; + $lang->module_category = "Categoría de Módulos "; + $lang->module_info = "Información"; + $lang->add_shortcut = "Añadir en el menú del administrador"; + $lang->module_action = "Acción"; + $lang->module_maker = "Módulo del desarrollador"; + $lang->module_license = 'License'; + $lang->module_history = "Historia de actualización"; + $lang->category_title = "Título de categoría"; + $lang->header_text = 'Encabezado'; + $lang->footer_text = 'Pie de página'; + $lang->use_category = 'Usar categoría'; + $lang->category_title = 'Título de categoría'; + $lang->checked_count = 'Múmero de los documentos selecionados'; + $lang->skin_default_info = 'información del tema predefinido'; + $lang->skin_author = 'Desarrollador de tema'; + $lang->skin_license = 'License'; + $lang->skin_history = 'Historia de actualización'; + $lang->module_copy = "Copy Module"; + $lang->module_selector = "Module Selector"; + $lang->do_selected = "선택된 것들을..."; + $lang->bundle_setup = "일괄 기본 설정"; + $lang->bundle_addition_setup = "일괄 추가 설정"; + $lang->bundle_grant_setup = "일괄 권한 설정"; + $lang->lang_code = "언어 코드"; + $lang->filebox = "파일박스"; + + $lang->access_type = '접속 방법'; + $lang->access_domain = 'Domain 접속'; + $lang->access_vid = 'Site ID 접속'; + $lang->about_domain = 'Para crear un dominio privado de la site requiere.
    Independiente de dominio o subdominio, y XE está instalado, el camino que en su conjunto.
    Ej.) www.xpressengine.com / zbxe'; + $lang->about_vid = '별도의 도메인이 아닌 http://XE주소/ID 로 접속할 수 있습니다. 모듈명(mid)와 중복될 수 없습니다.
    첫글자는 영문으로 시작해야 하고 영문과 숫자 그리고 _ 만 사용할 수 있습니다'; + $lang->msg_already_registed_vid = '이미 등록된 사이트 ID 입니다. 게시판등의 mid와도 중복이 되지 않습니다. 다른 ID를 입력해주세요.'; + $lang->msg_already_registed_domain = 'Ya es de dominio registrado. Por favor, use un dominio diferente'; + + $lang->header_script = "헤더 스크립트"; + $lang->about_header_script = "html의 <header>와 </header> 사이에 들어가는 코드를 직접 입력할 수 있습니다.
    <script, <style 또는 <meta 태그등을 이용하실 수 있습니다"; + + $lang->grant_access = "Access"; + $lang->grant_manager = "Management"; + + $lang->grant_to_all = "All users"; + $lang->grant_to_login_user = "Logged users"; + $lang->grant_to_site_user = "Joined users"; + $lang->grant_to_group = "Specification group users"; + + $lang->cmd_add_shortcut = "añadir acceso directo"; + $lang->cmd_install = "Instalar"; + $lang->cmd_update = "Actualizar"; + $lang->cmd_manage_category = 'Manejo de categorías'; + $lang->cmd_manage_grant = 'Manejo de atribuciones'; + $lang->cmd_manage_skin = 'Manejo de temas'; + $lang->cmd_manage_document = 'Manejo de documentos'; + $lang->cmd_find_module = '모듈 찾기'; + $lang->cmd_find_langcode = 'Find lang code'; + + $lang->msg_new_module = "Crear un nuevo módulo"; + $lang->msg_update_module = "Modificar el módulo"; + $lang->msg_module_name_exists = "El nombre ya existe. Por favor tratar con otro nombre."; + $lang->msg_category_is_null = 'No existe categoría registrada.'; + $lang->msg_grant_is_null = 'No existe el objetivo de atribución registrado.'; + $lang->msg_no_checked_document = 'No existe documento seleccionado.'; + $lang->msg_move_failed = 'No pudo moverse'; + $lang->msg_cannot_delete_for_child = 'No puede eliminar la categoría si posee subcategoría.'; + $lang->msg_limit_mid ='모듈이름은 영문+[영문+숫자+_] 만 가능합니다.'; + $lang->msg_extra_name_exists = '이미 존재하는 확장변수 이름입니다. 다른 이름을 입력해주세요.'; + + $lang->about_browser_title = "Esto es el valor que se mostrará en el título del navegador. También es usado en RSS/Trackback."; + $lang->about_mid = "El nombre del módulo será usado como http://direccion/?mid=NombreMódulo.\n(sólo alfabeto español+[alfabeto español, números y el gión abajo(_)] son permitidos. The maximum length is 40.)"; + $lang->about_default = "Si selecciona esta opción, se mostrara de manera predefinida sin el valor de mid."; + $lang->about_module_category = "Es posible manejar a traves de categoría.\n EL URL para en manejo del módulo de categoría es Manejo de módulo > Módulo de categoría ."; + $lang->about_description= 'Descripción usada para la administración.'; + $lang->about_default = 'Si selecciona esta opción, se mostrará de manera predefinida sin el valor de mid.'; + $lang->about_header_text = 'El contenido se mostrará en la parte superior del módulo.(tags de html permitido)'; + $lang->about_footer_text = 'El contenido se mostrará en la parte inferior del módulo.(tags de html permitido)'; + $lang->about_skin = 'Usted puede elegir un tema del módulo.'; + $lang->about_use_category = 'Si selecciona esta opción, la función de categoría sera activada.'; + $lang->about_list_count = 'Usted puede definir el número límite de los documentos a mostrar en una página.(Predefinido es 20)'; + $lang->about_search_list_count = 'Usted puede configurar el número de artículos que se exponen cuando se utiliza la función de búsqueda o categoría. (Por defecto es 20)'; + $lang->about_page_count = 'Usted puede definir el número de página enlazada para mover páginas en un botón de la página.(Predefinido es 10)'; + $lang->about_admin_id = 'Usted puede definir el administrador de atribuciones superiores al módulo.\n Usted puede asignar múltiples IDs.'; + $lang->about_grant = 'Si usted desea desactivar a todos los objetos teniendo atribuciones especificas, incluso el usuario no conectado pueden tener atribuciones.'; + $lang->about_grant_deatil = '가입한 사용자는 cafeXE등 분양형 가상 사이트에 가입을 한 로그인 사용자를 의미합니다'; + $lang->about_module = "XE consiste de módulos excepto la librería básica.\n Módulo del Manejo del Módulo muestra todos los módulos instalados y ayuda el manejo de ellos."; + + $lang->about_extra_vars_default_value = 'Si múltiples valores predefinidos son requeridos, usted puede enlazar con la coma(,).'; + $lang->about_search_virtual_site = "가상 사이트(카페XE등)의 도메인을 입력하신 후 검색하세요.
    가상 사이트이외의 모듈은 내용을 비우고 검색하시면 됩니다. (http:// 는 제외)"; + $lang->about_langcode = "언어별로 다르게 설정하고 싶으시면 언어코드 찾기를 이용해주세요"; + $lang->about_file_extension= "%s 파일만 가능합니다."; +?> diff --git a/modules/module/lang/fr.lang.php b/modules/module/lang/fr.lang.php index ce43eb534..1ceb83453 100644 --- a/modules/module/lang/fr.lang.php +++ b/modules/module/lang/fr.lang.php @@ -1,98 +1,98 @@ - - * @brief Paque du langage en français pour le module de Module - **/ - - $lang->virtual_site = "Virtual Site"; - $lang->module_list = "Liste des Modules"; - $lang->module_index = "Liste des Modules"; - $lang->module_category = "Catégorie des Modules"; - $lang->module_info = "Information de Module"; - $lang->add_shortcut = "Ajouter un raccourci dans le menu pour l'administrateur"; - $lang->module_action = "Actions"; - $lang->module_maker = "Développeur du Module"; - $lang->module_license = 'Licence'; - $lang->module_history = "Histoire de Mise à Jour"; - $lang->category_title = "Titre de la Catégorie"; - $lang->header_text = 'Texte en-tête'; - $lang->footer_text = 'Text au bas de page'; - $lang->use_category = 'Utiliser catégorie'; - $lang->category_title = 'Titre de la Catégorie'; - $lang->checked_count = 'somme des Articles choisis'; - $lang->skin_default_info = 'Information fondamental de l\'habillage'; - $lang->skin_author = 'Developpeur de l\'habillage'; - $lang->skin_license = 'Licence'; - $lang->skin_history = 'Histoire des Mises à jour'; - $lang->module_copy = "Copier un Module"; - $lang->module_selector = "Module Selector"; - $lang->do_selected = "선택된 것들을..."; - $lang->bundle_setup = "일괄 기본 설정"; - $lang->bundle_addition_setup = "일괄 추가 설정"; - $lang->bundle_grant_setup = "일괄 권한 설정"; - $lang->lang_code = "언어 코드"; - $lang->filebox = "파일박스"; - - $lang->access_type = '접속 방법'; - $lang->access_domain = 'Domain 접속'; - $lang->access_vid = 'Site ID 접속'; - $lang->about_vid = '별도의 도메인이 아닌 http://XE주소/ID 로 접속할 수 있습니다. 모듈명(mid)와 중복될 수 없습니다.
    첫글자는 영문으로 시작해야 하고 영문과 숫자 그리고 _ 만 사용할 수 있습니다'; - $lang->msg_already_registed_vid = '이미 등록된 사이트 ID 입니다. 게시판등의 mid와도 중복이 되지 않습니다. 다른 ID를 입력해주세요.'; - $lang->msg_already_registed_domain = '이미 등록된 도메인입니다. 다른 도메인을 사용해주세요'; - - $lang->header_script = "Script en-tête"; - $lang->about_header_script = "Vous pouvez entrer un script en html par vous-même entre <header> et </header>.
    Vous pouvez utiliser <script, <style ou <meta tag"; - - $lang->grant_access = "Access"; - $lang->grant_manager = "Management"; - - $lang->grant_to_all = "All users"; - $lang->grant_to_login_user = "Logged users"; - $lang->grant_to_site_user = "Joined users"; - $lang->grant_to_group = "Specification group users"; - - $lang->cmd_add_shortcut = "Ajouter un raccourci"; - $lang->cmd_install = "Installer"; - $lang->cmd_update = "Mettre à Jour"; - $lang->cmd_manage_category = 'Administrer des Catégories'; - $lang->cmd_manage_grant = 'Administrer des Permissions'; - $lang->cmd_manage_skin = 'Administrer des Habillages'; - $lang->cmd_manage_document = 'Administrer des Articles'; - $lang->cmd_find_module = '모듈 찾기'; - $lang->cmd_find_langcode = 'Find lang code'; - - $lang->msg_new_module = "Créer un module"; - $lang->msg_update_module = "Modifier un module"; - $lang->msg_module_name_exists = "Le nom existe déjà. Essayez un autre nom, S.V.P."; - $lang->msg_category_is_null = 'Il n\'y a pas de catégorie enrégistrée.'; - $lang->msg_grant_is_null = 'Il n\'y a pas de liste de permission.'; - $lang->msg_no_checked_document = 'Pas un article est choisi.'; - $lang->msg_move_failed = 'Echoué de bouger'; - $lang->msg_cannot_delete_for_child = 'On ne peut pas supprimer une catégorie qui a des catégories inférieures.'; - $lang->msg_limit_mid ='모듈이름은 영문+[영문+숫자+_] 만 가능합니다.'; - $lang->msg_extra_name_exists = '이미 존재하는 확장변수 이름입니다. 다른 이름을 입력해주세요.'; - - $lang->about_browser_title = "C'est la valeur qui se représentera dans le titre de navigateur Web. Ce sera encore utilisé dans RSS/Rétrolien."; - $lang->about_mid = "Le nom de module sera utilisé comme http://adresse/?mid=ModuleName.\n(alphabet anglais + [alphabet anglais, nombres, et soulignement(_)] sont seulement permis. The maximum length is 40.)"; - $lang->about_default = "Si c'est coché, on verra ce module quand on connecte ce site sans aucune valeur de mid(mid=Nulle Valeur)."; - $lang->about_module_category = "Ça vous permet d'administrer le module par la catégorie.\nOn peut administrer la classification des modules à Administration des modules > Catégorie des Modules ."; - $lang->about_description= 'C\'est la description pour la facilité à administrer.'; - $lang->about_default = 'Si c\'est coché, on verra ce module quand on connecte ce site sans aucune valeur de mid(mid=Nulle Valeur).'; - $lang->about_header_text = 'Ce contenu sera exposé en tête du module.(balise en html est disponible)'; - $lang->about_footer_text = 'Ce contenu sera exposé en bas du module.(balise en html est disponible)'; - $lang->about_skin = 'Vous pouvez choisir un habillage pour le module.'; - $lang->about_use_category = 'Cochez pour utiliser la fonction de catégorie, .'; - $lang->about_list_count = 'Vous pouvez configurer combien d\'articles soient exposés dans une page.(20 par défaut)'; - $lang->about_search_list_count = 'Vous pouvez configurer combien d\'articles soient exposés quand vous utilisez la fonction de recherche ou de catégorie. (20 par défaut)'; - $lang->about_page_count = 'Vous pouvez configurer combien de liens pour les Pages à Bouger en bas de chaque page.(10 par défaut)'; - $lang->about_admin_id = 'Vous pouvez désigner un directeur qui aura tous les permissions sur le module.\nVous pouvez entrer plusieurs compte en utilisant.'; - $lang->about_grant = 'Si vous ne donnez pas la permission à aucune personne, même les membres qui n\'a pas ouvert la connexion auront la permission. '; - $lang->about_grant_deatil = '가입한 사용자는 cafeXE등 분양형 가상 사이트에 가입을 한 로그인 사용자를 의미합니다'; - $lang->about_module = "XE se compose des modules sauf la bibliothèque fondamental.\nLe module [Administration des Modules] montera tous les modules installés et vous aidera les administrer."; - - $lang->about_extra_vars_default_value = 'Si plusieurs valeurs sont nécessaires, vous pouvez les connecter avec la virgule(,).'; - $lang->about_search_virtual_site = "가상 사이트(카페XE등)의 도메인을 입력하신 후 검색하세요.
    가상 사이트이외의 모듈은 내용을 비우고 검색하시면 됩니다. (http:// 는 제외)"; - $lang->about_langcode = "언어별로 다르게 설정하고 싶으시면 언어코드 찾기를 이용해주세요"; - $lang->about_file_extension= "%s 파일만 가능합니다."; -?> + + * @brief Paque du langage en français pour le module de Module + **/ + + $lang->virtual_site = "Virtual Site"; + $lang->module_list = "Liste des Modules"; + $lang->module_index = "Liste des Modules"; + $lang->module_category = "Catégorie des Modules"; + $lang->module_info = "Information de Module"; + $lang->add_shortcut = "Ajouter un raccourci dans le menu pour l'administrateur"; + $lang->module_action = "Actions"; + $lang->module_maker = "Développeur du Module"; + $lang->module_license = 'Licence'; + $lang->module_history = "Histoire de Mise à Jour"; + $lang->category_title = "Titre de la Catégorie"; + $lang->header_text = 'Texte en-tête'; + $lang->footer_text = 'Text au bas de page'; + $lang->use_category = 'Utiliser catégorie'; + $lang->category_title = 'Titre de la Catégorie'; + $lang->checked_count = 'somme des Articles choisis'; + $lang->skin_default_info = 'Information fondamental de l\'habillage'; + $lang->skin_author = 'Developpeur de l\'habillage'; + $lang->skin_license = 'Licence'; + $lang->skin_history = 'Histoire des Mises à jour'; + $lang->module_copy = "Copier un Module"; + $lang->module_selector = "Module Selector"; + $lang->do_selected = "선택된 것들을..."; + $lang->bundle_setup = "일괄 기본 설정"; + $lang->bundle_addition_setup = "일괄 추가 설정"; + $lang->bundle_grant_setup = "일괄 권한 설정"; + $lang->lang_code = "언어 코드"; + $lang->filebox = "파일박스"; + + $lang->access_type = '접속 방법'; + $lang->access_domain = 'Domain 접속'; + $lang->access_vid = 'Site ID 접속'; + $lang->about_vid = '별도의 도메인이 아닌 http://XE주소/ID 로 접속할 수 있습니다. 모듈명(mid)와 중복될 수 없습니다.
    첫글자는 영문으로 시작해야 하고 영문과 숫자 그리고 _ 만 사용할 수 있습니다'; + $lang->msg_already_registed_vid = '이미 등록된 사이트 ID 입니다. 게시판등의 mid와도 중복이 되지 않습니다. 다른 ID를 입력해주세요.'; + $lang->msg_already_registed_domain = '이미 등록된 도메인입니다. 다른 도메인을 사용해주세요'; + + $lang->header_script = "Script en-tête"; + $lang->about_header_script = "Vous pouvez entrer un script en html par vous-même entre <header> et </header>.
    Vous pouvez utiliser <script, <style ou <meta tag"; + + $lang->grant_access = "Access"; + $lang->grant_manager = "Management"; + + $lang->grant_to_all = "All users"; + $lang->grant_to_login_user = "Logged users"; + $lang->grant_to_site_user = "Joined users"; + $lang->grant_to_group = "Specification group users"; + + $lang->cmd_add_shortcut = "Ajouter un raccourci"; + $lang->cmd_install = "Installer"; + $lang->cmd_update = "Mettre à Jour"; + $lang->cmd_manage_category = 'Administrer des Catégories'; + $lang->cmd_manage_grant = 'Administrer des Permissions'; + $lang->cmd_manage_skin = 'Administrer des Habillages'; + $lang->cmd_manage_document = 'Administrer des Articles'; + $lang->cmd_find_module = '모듈 찾기'; + $lang->cmd_find_langcode = 'Find lang code'; + + $lang->msg_new_module = "Créer un module"; + $lang->msg_update_module = "Modifier un module"; + $lang->msg_module_name_exists = "Le nom existe déjà. Essayez un autre nom, S.V.P."; + $lang->msg_category_is_null = 'Il n\'y a pas de catégorie enrégistrée.'; + $lang->msg_grant_is_null = 'Il n\'y a pas de liste de permission.'; + $lang->msg_no_checked_document = 'Pas un article est choisi.'; + $lang->msg_move_failed = 'Echoué de bouger'; + $lang->msg_cannot_delete_for_child = 'On ne peut pas supprimer une catégorie qui a des catégories inférieures.'; + $lang->msg_limit_mid ='모듈이름은 영문+[영문+숫자+_] 만 가능합니다.'; + $lang->msg_extra_name_exists = '이미 존재하는 확장변수 이름입니다. 다른 이름을 입력해주세요.'; + + $lang->about_browser_title = "C'est la valeur qui se représentera dans le titre de navigateur Web. Ce sera encore utilisé dans RSS/Rétrolien."; + $lang->about_mid = "Le nom de module sera utilisé comme http://adresse/?mid=ModuleName.\n(alphabet anglais + [alphabet anglais, nombres, et soulignement(_)] sont seulement permis. The maximum length is 40.)"; + $lang->about_default = "Si c'est coché, on verra ce module quand on connecte ce site sans aucune valeur de mid(mid=Nulle Valeur)."; + $lang->about_module_category = "Ça vous permet d'administrer le module par la catégorie.\nOn peut administrer la classification des modules à Administration des modules > Catégorie des Modules ."; + $lang->about_description= 'C\'est la description pour la facilité à administrer.'; + $lang->about_default = 'Si c\'est coché, on verra ce module quand on connecte ce site sans aucune valeur de mid(mid=Nulle Valeur).'; + $lang->about_header_text = 'Ce contenu sera exposé en tête du module.(balise en html est disponible)'; + $lang->about_footer_text = 'Ce contenu sera exposé en bas du module.(balise en html est disponible)'; + $lang->about_skin = 'Vous pouvez choisir un habillage pour le module.'; + $lang->about_use_category = 'Cochez pour utiliser la fonction de catégorie, .'; + $lang->about_list_count = 'Vous pouvez configurer combien d\'articles soient exposés dans une page.(20 par défaut)'; + $lang->about_search_list_count = 'Vous pouvez configurer combien d\'articles soient exposés quand vous utilisez la fonction de recherche ou de catégorie. (20 par défaut)'; + $lang->about_page_count = 'Vous pouvez configurer combien de liens pour les Pages à Bouger en bas de chaque page.(10 par défaut)'; + $lang->about_admin_id = 'Vous pouvez désigner un directeur qui aura tous les permissions sur le module.\nVous pouvez entrer plusieurs compte en utilisant.'; + $lang->about_grant = 'Si vous ne donnez pas la permission à aucune personne, même les membres qui n\'a pas ouvert la connexion auront la permission. '; + $lang->about_grant_deatil = '가입한 사용자는 cafeXE등 분양형 가상 사이트에 가입을 한 로그인 사용자를 의미합니다'; + $lang->about_module = "XE se compose des modules sauf la bibliothèque fondamental.\nLe module [Administration des Modules] montera tous les modules installés et vous aidera les administrer."; + + $lang->about_extra_vars_default_value = 'Si plusieurs valeurs sont nécessaires, vous pouvez les connecter avec la virgule(,).'; + $lang->about_search_virtual_site = "가상 사이트(카페XE등)의 도메인을 입력하신 후 검색하세요.
    가상 사이트이외의 모듈은 내용을 비우고 검색하시면 됩니다. (http:// 는 제외)"; + $lang->about_langcode = "언어별로 다르게 설정하고 싶으시면 언어코드 찾기를 이용해주세요"; + $lang->about_file_extension= "%s 파일만 가능합니다."; +?> diff --git a/modules/module/lang/jp.lang.php b/modules/module/lang/jp.lang.php index 0f35eb2f8..fa2b79d07 100644 --- a/modules/module/lang/jp.lang.php +++ b/modules/module/lang/jp.lang.php @@ -1,98 +1,98 @@ -virtual_site = 'バーチャル(Virtual)サイト'; - $lang->module_list = 'モジュールリスト'; - $lang->module_index = 'モジュールインデックス'; - $lang->module_category = 'モジュールカテゴリ'; - $lang->module_info = '詳細'; - $lang->add_shortcut = '管理者メニューに追加する'; - $lang->module_action = '動作'; - $lang->module_maker = 'モジュール作者'; - $lang->module_license = 'ライセンス'; - $lang->module_history = '変更履歴 '; - $lang->category_title = 'カテゴリ名'; - $lang->header_text = 'ヘッダー内容'; - $lang->footer_text = 'フッター内容'; - $lang->use_category = 'カテゴリ使用'; - $lang->category_title = 'カテゴリ名'; - $lang->checked_count = '選択された書き込み数'; - $lang->skin_default_info = 'スキン基本情報'; - $lang->skin_author = 'スキン作者'; - $lang->skin_license = 'ライセンス'; - $lang->skin_history = '変更内容'; - $lang->module_copy = 'モジュールコピー'; - $lang->module_selector = 'モジュールセレクター'; - $lang->do_selected = '選択したものを...'; - $lang->bundle_setup = '一括基本設定'; - $lang->bundle_addition_setup = '一括追加設定'; - $lang->bundle_grant_setup = '一括権限設定'; - $lang->lang_code = '言語コード'; - $lang->filebox = 'ファイルボックス'; - - $lang->access_type = 'アクセスタイプ'; - $lang->access_domain = 'Doaminアクセス'; - $lang->access_vid = 'Site IDアクセス'; - $lang->about_domain = '複数のホームページを作成するためには、「オリジナルドメイン」や「サブ ドメイン」のような専用のドメインが必要です。
    また、 XEのインストールパスも一緒に記入して下さい。
    ex) www.xpressengine.com/xe'; - $lang->about_vid = '別の違うドメインではなく、「http://XEアドレス/ID」へのアクセスが可能です。この際、モジュール名(mid)と重複しないように登録して下さい。
    必ず、頭文字は半角英文字にし、「(すべて半角の)英数字・_ 」 だけの組み合わせで入力して下さい。'; - $lang->msg_already_registed_vid = '既に登録されたサイトIDです。掲示板などのmidと重複は不可です。異なるIDを入力して下さい。'; - $lang->msg_already_registed_domain = '既に登録されているドメインです。異なるドメインを利用して下さい。'; - - $lang->header_script = 'ヘッダースクリプト'; - $lang->about_header_script = 'HTMLの<header>と</header>の間に入れるコードを直接入力出来ます。
    <script、<styleまたは<metaタグなどが利用出来ます。'; - - $lang->grant_access = 'アクセス権限'; - $lang->grant_manager = '管理権限'; - - $lang->grant_to_all = 'すべてのユーザー'; - $lang->grant_to_login_user = 'ログインユーザー'; - $lang->grant_to_site_user = '登録ユーザー'; - $lang->grant_to_group = '特定グループのユーザー'; - - $lang->cmd_add_shortcut = 'ショットカット追加'; - $lang->cmd_install = 'インストール'; - $lang->cmd_update = 'アップデート'; - $lang->cmd_manage_category = 'カテゴリ管理'; - $lang->cmd_manage_grant = '権限管理'; - $lang->cmd_manage_skin = 'スキン管理'; - $lang->cmd_manage_document = '書き込み管理'; - $lang->cmd_find_module = 'モジュール検索'; - $lang->cmd_find_langcode = '言語コード検索'; - - $lang->msg_new_module = 'モジュール作成'; - $lang->msg_update_module = 'モジュール修正'; - $lang->msg_module_name_exists = '既に存在するモジュール名です。他の名前を入力して下さい。'; - $lang->msg_category_is_null = '登録されているカテゴリがありません。'; - $lang->msg_grant_is_null = '登録された権限がありません。'; - $lang->msg_no_checked_document = '選択された書き込みがありません。'; - $lang->msg_move_failed = '移動することが出来ませんでした。'; - $lang->msg_cannot_delete_for_child = '下位カテゴリのカテゴリは削除することが出来ません。'; - $lang->msg_limit_mid ='モジュール名は「 半角英小文字+[半角英小文字+半角数字+_] 」のみ出来ます。'; - $lang->msg_extra_name_exists = '既に存在する拡張変数名です。他の拡張変数名を入力して下さい。'; - - $lang->about_browser_title = 'ブラウザのタイトルバーに表示される内容です。RSS/Trackbackでも使用します。'; - $lang->about_mid = 'モジュール名は「http://アドレス/?mid=モジュール名」のように直接呼び出せるパラメーター値です。
    ※英数の頭文字と[英数と_のみ]の組み合わせ (すべて半角、最大40文字) '; - $lang->about_default = 'チェックすると、サイトに「mid値」なしでアクセスした場合、デフォルトで表示します。'; - $lang->about_module_category = "カテゴリで管理出来るようにします。モジュールのカテゴリの管理は、「モジュール管理 > モジュールカテゴリ」にて行います。"; - $lang->about_description= '管理用として用いられる説明です。'; - $lang->about_header_text = 'モジュールのヘッダーに表示される内容です。(HTMLタグの使用可能)'; - $lang->about_footer_text = 'モジュールのフッターに表示される内容です。(HTMLタグの使用可能)'; - $lang->about_skin = 'モジュールのスキンを選択します。'; - $lang->about_use_category = 'チェックするとカテゴリ機能が使用出来ます。'; - $lang->about_list_count = '1ページ当たりに表示される書き込みの数が指定出来ます(デフォルト20個)。'; - $lang->about_search_list_count = 'お勧めの記事数を設定するにさらされるかのカテゴリ検索機能を使用する場合です。 (デフォルトは20 )'; - $lang->about_page_count = 'リストの下段に移動出来るページのリンク数が指定出来ます(デフォルト10個)。'; - $lang->about_admin_id = '該当するモジュールに対して最高権限を持つ管理者を指定することが出来ます。'; - $lang->about_grant = '特定権限の対象をすべて解除するとログインしていない会員ユーザまで権限が与えられます。'; - $lang->about_grant_deatil = '登録ユーザーとはcafeXEなど分譲型バーチャル(Virtual)サイトに登録した、ログインユーザーを意味します。'; - $lang->about_module = "XEは、基本ライブラリの他は、すべてモジュールで構成されています。モジュール管理用のモジュールはインストールされたすべてを表示し、管理出来るようにします。"; - $lang->about_extra_vars_default_value = '多重・単一選択などのデフォルト値が、複数必要な場合は、「, (コンマ)」で区切って追加することが出来ます。'; - $lang->about_search_virtual_site = 'バーチャル(Virtual)サイト(:cafeXEなど)のドメインを入力して検索して下さい。
    バーチャル(Virtual)サイト以外のモジュールは内容を空にしてから検索します。(http://は省く)'; - $lang->about_extra_vars_eid_value = '拡張変数名を入力して下さい。 (英字+[英字+数字+_]のみ可能(全て半角))'; - $lang->about_langcode = '言語ごとに異なる設定をする場合、言語コード検索を利用して下さい。'; - $lang->about_file_extension= "%s ファイルのみ可能です。"; -?> +virtual_site = 'バーチャル(Virtual)サイト'; + $lang->module_list = 'モジュールリスト'; + $lang->module_index = 'モジュールインデックス'; + $lang->module_category = 'モジュールカテゴリ'; + $lang->module_info = '詳細'; + $lang->add_shortcut = '管理者メニューに追加する'; + $lang->module_action = '動作'; + $lang->module_maker = 'モジュール作者'; + $lang->module_license = 'ライセンス'; + $lang->module_history = '変更履歴 '; + $lang->category_title = 'カテゴリ名'; + $lang->header_text = 'ヘッダー内容'; + $lang->footer_text = 'フッター内容'; + $lang->use_category = 'カテゴリ使用'; + $lang->category_title = 'カテゴリ名'; + $lang->checked_count = '選択された書き込み数'; + $lang->skin_default_info = 'スキン基本情報'; + $lang->skin_author = 'スキン作者'; + $lang->skin_license = 'ライセンス'; + $lang->skin_history = '変更内容'; + $lang->module_copy = 'モジュールコピー'; + $lang->module_selector = 'モジュールセレクター'; + $lang->do_selected = '選択したものを...'; + $lang->bundle_setup = '一括基本設定'; + $lang->bundle_addition_setup = '一括追加設定'; + $lang->bundle_grant_setup = '一括権限設定'; + $lang->lang_code = '言語コード'; + $lang->filebox = 'ファイルボックス'; + + $lang->access_type = 'アクセスタイプ'; + $lang->access_domain = 'Doaminアクセス'; + $lang->access_vid = 'Site IDアクセス'; + $lang->about_domain = '複数のホームページを作成するためには、「オリジナルドメイン」や「サブ ドメイン」のような専用のドメインが必要です。
    また、 XEのインストールパスも一緒に記入して下さい。
    ex) www.xpressengine.com/xe'; + $lang->about_vid = '別の違うドメインではなく、「http://XEアドレス/ID」へのアクセスが可能です。この際、モジュール名(mid)と重複しないように登録して下さい。
    必ず、頭文字は半角英文字にし、「(すべて半角の)英数字・_ 」 だけの組み合わせで入力して下さい。'; + $lang->msg_already_registed_vid = '既に登録されたサイトIDです。掲示板などのmidと重複は不可です。異なるIDを入力して下さい。'; + $lang->msg_already_registed_domain = '既に登録されているドメインです。異なるドメインを利用して下さい。'; + + $lang->header_script = 'ヘッダースクリプト'; + $lang->about_header_script = 'HTMLの<header>と</header>の間に入れるコードを直接入力出来ます。
    <script、<styleまたは<metaタグなどが利用出来ます。'; + + $lang->grant_access = 'アクセス権限'; + $lang->grant_manager = '管理権限'; + + $lang->grant_to_all = 'すべてのユーザー'; + $lang->grant_to_login_user = 'ログインユーザー'; + $lang->grant_to_site_user = '登録ユーザー'; + $lang->grant_to_group = '特定グループのユーザー'; + + $lang->cmd_add_shortcut = 'ショットカット追加'; + $lang->cmd_install = 'インストール'; + $lang->cmd_update = 'アップデート'; + $lang->cmd_manage_category = 'カテゴリ管理'; + $lang->cmd_manage_grant = '権限管理'; + $lang->cmd_manage_skin = 'スキン管理'; + $lang->cmd_manage_document = '書き込み管理'; + $lang->cmd_find_module = 'モジュール検索'; + $lang->cmd_find_langcode = '言語コード検索'; + + $lang->msg_new_module = 'モジュール作成'; + $lang->msg_update_module = 'モジュール修正'; + $lang->msg_module_name_exists = '既に存在するモジュール名です。他の名前を入力して下さい。'; + $lang->msg_category_is_null = '登録されているカテゴリがありません。'; + $lang->msg_grant_is_null = '登録された権限がありません。'; + $lang->msg_no_checked_document = '選択された書き込みがありません。'; + $lang->msg_move_failed = '移動することが出来ませんでした。'; + $lang->msg_cannot_delete_for_child = '下位カテゴリのカテゴリは削除することが出来ません。'; + $lang->msg_limit_mid ='モジュール名は「 半角英小文字+[半角英小文字+半角数字+_] 」のみ出来ます。'; + $lang->msg_extra_name_exists = '既に存在する拡張変数名です。他の拡張変数名を入力して下さい。'; + + $lang->about_browser_title = 'ブラウザのタイトルバーに表示される内容です。RSS/Trackbackでも使用します。'; + $lang->about_mid = 'モジュール名は「http://アドレス/?mid=モジュール名」のように直接呼び出せるパラメーター値です。
    ※英数の頭文字と[英数と_のみ]の組み合わせ (すべて半角、最大40文字) '; + $lang->about_default = 'チェックすると、サイトに「mid値」なしでアクセスした場合、デフォルトで表示します。'; + $lang->about_module_category = "カテゴリで管理出来るようにします。モジュールのカテゴリの管理は、「モジュール管理 > モジュールカテゴリ」にて行います。"; + $lang->about_description= '管理用として用いられる説明です。'; + $lang->about_header_text = 'モジュールのヘッダーに表示される内容です。(HTMLタグの使用可能)'; + $lang->about_footer_text = 'モジュールのフッターに表示される内容です。(HTMLタグの使用可能)'; + $lang->about_skin = 'モジュールのスキンを選択します。'; + $lang->about_use_category = 'チェックするとカテゴリ機能が使用出来ます。'; + $lang->about_list_count = '1ページ当たりに表示される書き込みの数が指定出来ます(デフォルト20個)。'; + $lang->about_search_list_count = 'お勧めの記事数を設定するにさらされるかのカテゴリ検索機能を使用する場合です。 (デフォルトは20 )'; + $lang->about_page_count = 'リストの下段に移動出来るページのリンク数が指定出来ます(デフォルト10個)。'; + $lang->about_admin_id = '該当するモジュールに対して最高権限を持つ管理者を指定することが出来ます。'; + $lang->about_grant = '特定権限の対象をすべて解除するとログインしていない会員ユーザまで権限が与えられます。'; + $lang->about_grant_deatil = '登録ユーザーとはcafeXEなど分譲型バーチャル(Virtual)サイトに登録した、ログインユーザーを意味します。'; + $lang->about_module = "XEは、基本ライブラリの他は、すべてモジュールで構成されています。モジュール管理用のモジュールはインストールされたすべてを表示し、管理出来るようにします。"; + $lang->about_extra_vars_default_value = '多重・単一選択などのデフォルト値が、複数必要な場合は、「, (コンマ)」で区切って追加することが出来ます。'; + $lang->about_search_virtual_site = 'バーチャル(Virtual)サイト(:cafeXEなど)のドメインを入力して検索して下さい。
    バーチャル(Virtual)サイト以外のモジュールは内容を空にしてから検索します。(http://は省く)'; + $lang->about_extra_vars_eid_value = '拡張変数名を入力して下さい。 (英字+[英字+数字+_]のみ可能(全て半角))'; + $lang->about_langcode = '言語ごとに異なる設定をする場合、言語コード検索を利用して下さい。'; + $lang->about_file_extension= "%s ファイルのみ可能です。"; +?> diff --git a/modules/module/lang/ko.lang.php b/modules/module/lang/ko.lang.php index 831f8a742..9f1f62f58 100644 --- a/modules/module/lang/ko.lang.php +++ b/modules/module/lang/ko.lang.php @@ -1,98 +1,98 @@ -virtual_site = '가상 사이트'; - $lang->module_list = '모듈 목록'; - $lang->module_index = '모듈 목록'; - $lang->module_category = '모듈 분류'; - $lang->module_info = '모듈 정보'; - $lang->add_shortcut = '관리자 메뉴에 추가'; - $lang->module_action = '동작'; - $lang->module_maker = '모듈 제작자'; - $lang->module_license = '라이선스'; - $lang->module_history = '변경 이력 '; - $lang->category_title = '분류 이름'; - $lang->header_text = '상단 내용'; - $lang->footer_text = '하단 내용'; - $lang->use_category = '분류 사용'; - $lang->category_title = '분류명'; - $lang->checked_count = '선택된 글 수'; - $lang->skin_default_info = '스킨 기본정보'; - $lang->skin_author = '스킨 제작자'; - $lang->skin_license = '라이선스'; - $lang->skin_history = '변경 이력'; - $lang->module_copy = '모듈 복사'; - $lang->module_selector = '모듈 선택기'; - $lang->do_selected = '선택된 것들을...'; - $lang->bundle_setup = '일괄 기본 설정'; - $lang->bundle_addition_setup = '일괄 추가 설정'; - $lang->bundle_grant_setup = '일괄 권한 설정'; - $lang->lang_code = '언어 코드'; - $lang->filebox = '파일박스'; - - $lang->access_type = '접속 방법'; - $lang->access_domain = 'Domain 접속'; - $lang->access_vid = 'Site ID 접속'; - $lang->about_domain = '1개 이상의 사이트를 만들기 위해서는 전용 도메인이 있어야 합니다.
    독립 도메인이나 서브 도메인이 있으면 되고 XE가 설치된 경로까지 같이 넣어주세요.
    예) www.xpressengine.com/xe'; - $lang->about_vid = '별도의 도메인이 아닌 http://XE주소/ID 로 접속할 수 있습니다. 모듈명(mid)과 중복될 수 없습니다.
    첫 글자는 영문으로 시작해야 하고 영문과 숫자 그리고 _ 만 사용할 수 있습니다'; - $lang->msg_already_registed_vid = '이미 등록된 사이트 ID 입니다. 게시판 등의 mid와도 중복이 되지 않습니다. 다른 ID를 입력해주세요.'; - $lang->msg_already_registed_domain = '이미 등록된 도메인입니다. 다른 도메인을 사용해주세요'; - - $lang->header_script = '헤더 스크립트'; - $lang->about_header_script = 'HTML의 <head>와 </head> 사이에 들어가는 코드를 직접 입력할 수 있습니다.
    <script, <style 또는 <meta 태그 등을 이용하실 수 있습니다'; - - $lang->grant_access = '접근 권한'; - $lang->grant_manager = '관리 권한'; - - $lang->grant_to_all = '모든 사용자'; - $lang->grant_to_login_user = '로그인 사용자'; - $lang->grant_to_site_user = '가입한 사용자'; - $lang->grant_to_group = '특정 그룹 사용자'; - - $lang->cmd_add_shortcut = '바로가기 추가'; - $lang->cmd_install = '설치'; - $lang->cmd_update = '업데이트'; - $lang->cmd_manage_category = '분류 관리'; - $lang->cmd_manage_grant = '권한 관리'; - $lang->cmd_manage_skin = '스킨 관리'; - $lang->cmd_manage_document = '게시글 관리'; - $lang->cmd_find_module = '모듈 찾기'; - $lang->cmd_find_langcode = '언어 코드 찾기'; - - $lang->msg_new_module = '모듈 생성'; - $lang->msg_update_module = '모듈 수정'; - $lang->msg_module_name_exists = '이미 존재하는 모듈 이름입니다. 다른 이름을 입력해주세요.'; - $lang->msg_category_is_null = '등록된 분류가 없습니다.'; - $lang->msg_grant_is_null = '등록된 권한 대상이 없습니다.'; - $lang->msg_no_checked_document = '선택된 게시물이 없습니다.'; - $lang->msg_move_failed = '이동 실패하였습니다.'; - $lang->msg_cannot_delete_for_child = '하부 분류가 있는 분류는 삭제하실 수 없습니다.'; - $lang->msg_limit_mid ='모듈 이름은 영문+[영문+숫자+_] 만 가능합니다.'; - $lang->msg_extra_name_exists = '이미 존재하는 확장 변수 이름입니다. 다른 이름을 입력해주세요.'; - - $lang->about_browser_title = '브라우저 제목에 나타나는 값입니다. RSS/Trackback에서도 사용됩니다.'; - $lang->about_mid = '모듈 이름은 http://주소/?mid=모듈이름 처럼 직접 호출할 수 있는 값입니다. (영문+[영문+숫자+_] 만 가능. 최대 40 글자)'; - $lang->about_default = '선택하시면 사이트에 mid값 없이 접속하였을 경우 기본으로 보여줍니다.'; - $lang->about_module_category = "분류를 통한 관리를 할 수 있도록 합니다. 모듈 분류 관리는 모듈관리 > 모듈분류에서 하실 수 있습니다."; - $lang->about_description= '관리용으로 사용되는 설명입니다.'; - $lang->about_header_text = '모듈 상단에 표시되는 내용입니다. (HTML 태그 사용 가능)'; - $lang->about_footer_text = '모듈 하단에 표시되는 내용입니다. (HTML 태그 사용 가능)'; - $lang->about_skin = '모듈 스킨을 선택하실 수 있습니다.'; - $lang->about_use_category = '선택하시면 분류 기능을 사용할 수 있습니다.'; - $lang->about_list_count = '한 페이지에 표시될 글 수를 지정하실 수 있습니다. (기본 20개)'; - $lang->about_search_list_count = '검색, 카테고리 선택 등을 할 경우 표시될 글 수를 지정하실 수 있습니다. (기본 20개)'; - $lang->about_page_count = '목록 하단, 페이지를 이동하는 링크 수를 지정하실 수 있습니다. (기본 10개)'; - $lang->about_admin_id = '해당 모듈에 대해 최고 권한을 가지는 관리자를 지정할 수 있습니다.'; - $lang->about_grant = '특정 권한의 대상을 모두 해제하면 로그인하지 않은 회원까지 권한을 가질 수 있습니다.'; - $lang->about_grant_deatil = '가입한 사용자는 cafeXE 등 분양형 가상 사이트에 가입을 한 로그인 사용자를 의미합니다.'; - $lang->about_module = "XE는 기본 라이브러리를 제외한 나머지는 모두 모듈로 구성되어 있습니다.\n모듈 관리 모듈은 설치된 모든 모듈을 보여주고 관리를 돕습니다."; - $lang->about_extra_vars_default_value = '다중/단일 선택 등 기본 값이 여러 개가 필요한 경우 , (콤마)로 연결하시면 됩니다.'; - $lang->about_search_virtual_site = '가상 사이트(예:cafeXE) 도메인을 입력하신 후 검색하세요.
    가상 사이트 이외의 모듈은 내용을 비우고 검색하시면 됩니다. (http:// 는 제외)'; - $lang->about_extra_vars_eid_value = '확장 변수의 이름을 적어주세요. (영문+[영문+숫자+_] 만 가능)'; - $lang->about_langcode = '언어별로 다르게 설정하고 싶으시면 언어 코드 찾기를 이용해주세요.'; - $lang->about_file_extension= "%s 파일만 가능합니다."; -?> +virtual_site = '가상 사이트'; + $lang->module_list = '모듈 목록'; + $lang->module_index = '모듈 목록'; + $lang->module_category = '모듈 분류'; + $lang->module_info = '모듈 정보'; + $lang->add_shortcut = '관리자 메뉴에 추가'; + $lang->module_action = '동작'; + $lang->module_maker = '모듈 제작자'; + $lang->module_license = '라이선스'; + $lang->module_history = '변경 이력 '; + $lang->category_title = '분류 이름'; + $lang->header_text = '상단 내용'; + $lang->footer_text = '하단 내용'; + $lang->use_category = '분류 사용'; + $lang->category_title = '분류명'; + $lang->checked_count = '선택된 글 수'; + $lang->skin_default_info = '스킨 기본정보'; + $lang->skin_author = '스킨 제작자'; + $lang->skin_license = '라이선스'; + $lang->skin_history = '변경 이력'; + $lang->module_copy = '모듈 복사'; + $lang->module_selector = '모듈 선택기'; + $lang->do_selected = '선택된 것들을...'; + $lang->bundle_setup = '일괄 기본 설정'; + $lang->bundle_addition_setup = '일괄 추가 설정'; + $lang->bundle_grant_setup = '일괄 권한 설정'; + $lang->lang_code = '언어 코드'; + $lang->filebox = '파일박스'; + + $lang->access_type = '접속 방법'; + $lang->access_domain = 'Domain 접속'; + $lang->access_vid = 'Site ID 접속'; + $lang->about_domain = '1개 이상의 사이트를 만들기 위해서는 전용 도메인이 있어야 합니다.
    독립 도메인이나 서브 도메인이 있으면 되고 XE가 설치된 경로까지 같이 넣어주세요.
    예) www.xpressengine.com/xe'; + $lang->about_vid = '별도의 도메인이 아닌 http://XE주소/ID 로 접속할 수 있습니다. 모듈명(mid)과 중복될 수 없습니다.
    첫 글자는 영문으로 시작해야 하고 영문과 숫자 그리고 _ 만 사용할 수 있습니다'; + $lang->msg_already_registed_vid = '이미 등록된 사이트 ID 입니다. 게시판 등의 mid와도 중복이 되지 않습니다. 다른 ID를 입력해주세요.'; + $lang->msg_already_registed_domain = '이미 등록된 도메인입니다. 다른 도메인을 사용해주세요'; + + $lang->header_script = '헤더 스크립트'; + $lang->about_header_script = 'HTML의 <head>와 </head> 사이에 들어가는 코드를 직접 입력할 수 있습니다.
    <script, <style 또는 <meta 태그 등을 이용하실 수 있습니다'; + + $lang->grant_access = '접근 권한'; + $lang->grant_manager = '관리 권한'; + + $lang->grant_to_all = '모든 사용자'; + $lang->grant_to_login_user = '로그인 사용자'; + $lang->grant_to_site_user = '가입한 사용자'; + $lang->grant_to_group = '특정 그룹 사용자'; + + $lang->cmd_add_shortcut = '바로가기 추가'; + $lang->cmd_install = '설치'; + $lang->cmd_update = '업데이트'; + $lang->cmd_manage_category = '분류 관리'; + $lang->cmd_manage_grant = '권한 관리'; + $lang->cmd_manage_skin = '스킨 관리'; + $lang->cmd_manage_document = '게시글 관리'; + $lang->cmd_find_module = '모듈 찾기'; + $lang->cmd_find_langcode = '언어 코드 찾기'; + + $lang->msg_new_module = '모듈 생성'; + $lang->msg_update_module = '모듈 수정'; + $lang->msg_module_name_exists = '이미 존재하는 모듈 이름입니다. 다른 이름을 입력해주세요.'; + $lang->msg_category_is_null = '등록된 분류가 없습니다.'; + $lang->msg_grant_is_null = '등록된 권한 대상이 없습니다.'; + $lang->msg_no_checked_document = '선택된 게시물이 없습니다.'; + $lang->msg_move_failed = '이동 실패하였습니다.'; + $lang->msg_cannot_delete_for_child = '하부 분류가 있는 분류는 삭제하실 수 없습니다.'; + $lang->msg_limit_mid ='모듈 이름은 영문+[영문+숫자+_] 만 가능합니다.'; + $lang->msg_extra_name_exists = '이미 존재하는 확장 변수 이름입니다. 다른 이름을 입력해주세요.'; + + $lang->about_browser_title = '브라우저 제목에 나타나는 값입니다. RSS/Trackback에서도 사용됩니다.'; + $lang->about_mid = '모듈 이름은 http://주소/?mid=모듈이름 처럼 직접 호출할 수 있는 값입니다. (영문+[영문+숫자+_] 만 가능. 최대 40 글자)'; + $lang->about_default = '선택하시면 사이트에 mid값 없이 접속하였을 경우 기본으로 보여줍니다.'; + $lang->about_module_category = "분류를 통한 관리를 할 수 있도록 합니다. 모듈 분류 관리는 모듈관리 > 모듈분류에서 하실 수 있습니다."; + $lang->about_description= '관리용으로 사용되는 설명입니다.'; + $lang->about_header_text = '모듈 상단에 표시되는 내용입니다. (HTML 태그 사용 가능)'; + $lang->about_footer_text = '모듈 하단에 표시되는 내용입니다. (HTML 태그 사용 가능)'; + $lang->about_skin = '모듈 스킨을 선택하실 수 있습니다.'; + $lang->about_use_category = '선택하시면 분류 기능을 사용할 수 있습니다.'; + $lang->about_list_count = '한 페이지에 표시될 글 수를 지정하실 수 있습니다. (기본 20개)'; + $lang->about_search_list_count = '검색, 카테고리 선택 등을 할 경우 표시될 글 수를 지정하실 수 있습니다. (기본 20개)'; + $lang->about_page_count = '목록 하단, 페이지를 이동하는 링크 수를 지정하실 수 있습니다. (기본 10개)'; + $lang->about_admin_id = '해당 모듈에 대해 최고 권한을 가지는 관리자를 지정할 수 있습니다.'; + $lang->about_grant = '특정 권한의 대상을 모두 해제하면 로그인하지 않은 회원까지 권한을 가질 수 있습니다.'; + $lang->about_grant_deatil = '가입한 사용자는 cafeXE 등 분양형 가상 사이트에 가입을 한 로그인 사용자를 의미합니다.'; + $lang->about_module = "XE는 기본 라이브러리를 제외한 나머지는 모두 모듈로 구성되어 있습니다.\n모듈 관리 모듈은 설치된 모든 모듈을 보여주고 관리를 돕습니다."; + $lang->about_extra_vars_default_value = '다중/단일 선택 등 기본 값이 여러 개가 필요한 경우 , (콤마)로 연결하시면 됩니다.'; + $lang->about_search_virtual_site = '가상 사이트(예:cafeXE) 도메인을 입력하신 후 검색하세요.
    가상 사이트 이외의 모듈은 내용을 비우고 검색하시면 됩니다. (http:// 는 제외)'; + $lang->about_extra_vars_eid_value = '확장 변수의 이름을 적어주세요. (영문+[영문+숫자+_] 만 가능)'; + $lang->about_langcode = '언어별로 다르게 설정하고 싶으시면 언어 코드 찾기를 이용해주세요.'; + $lang->about_file_extension= "%s 파일만 가능합니다."; +?> diff --git a/modules/module/lang/ru.lang.php b/modules/module/lang/ru.lang.php index a0c12a934..121149c4e 100644 --- a/modules/module/lang/ru.lang.php +++ b/modules/module/lang/ru.lang.php @@ -1,99 +1,99 @@ -virtual_site = "Virtual Site"; - $lang->module_list = "Список модулей"; - $lang->module_index = "Список модулей"; - $lang->module_category = "Категория модуля"; - $lang->module_info = "Информация"; - $lang->add_shortcut = "Добавить ярлыки"; - $lang->module_action = "Действия"; - $lang->module_maker = "Разработчик модуля"; - $lang->module_license = 'Лицензия'; - $lang->module_history = "История обновлений"; - $lang->category_title = "Название категории"; - $lang->header_text = 'Верхний колонтитул'; - $lang->footer_text = 'Нижний колонтитул'; - $lang->use_category = 'Включить категорию'; - $lang->category_title = 'Название категории'; - $lang->checked_count = 'Число выбранных статей'; // translator's note: возможно "checked" следует перевести как "проверенных" - $lang->skin_default_info = 'Информация стандартного скина'; - $lang->skin_author = 'Разработчик скина'; - $lang->skin_license = 'License'; - $lang->skin_history = 'История обновлений'; - $lang->module_selector = "Module Selector"; - $lang->do_selected = "Выбранные..."; - $lang->bundle_setup = "일괄 기본 설정"; - $lang->bundle_addition_setup = "일괄 추가 설정"; - $lang->bundle_grant_setup = "일괄 권한 설정"; - $lang->lang_code = "Код языка"; - $lang->filebox = "Файлбокс"; - - $lang->access_type = 'Способ соединения'; - $lang->access_domain = 'Domain соединения'; - $lang->access_vid = 'Site ID соединение'; - $lang->about_vid = '별도의 도메인이 아닌 http://XE주소/ID 로 접속할 수 있습니다. 모듈명(mid)와 중복될 수 없습니다.
    첫글자는 영문으로 시작해야 하고 영문과 숫자 그리고 _ 만 사용할 수 있습니다'; - $lang->msg_already_registed_vid = '이미 등록된 사이트 ID 입니다. 게시판등의 mid와도 중복이 되지 않습니다. 다른 ID를 입력해주세요.'; - $lang->msg_already_registed_domain = '이미 등록된 도메인입니다. 다른 도메인을 사용해주세요'; - - $lang->module_copy = "Копировать модуль"; - - $lang->header_script = "Скрипт Header"; - $lang->about_header_script = "html의 <header>와 </header> 사이에 들어가는 코드를 직접 입력할 수 있습니다.
    <script, <style 또는 <meta 태그등을 이용하실 수 있습니다"; - - $lang->grant_access = "Access"; - $lang->grant_manager = "Management"; - - $lang->grant_to_all = "All users"; - $lang->grant_to_login_user = "Logged users"; - $lang->grant_to_site_user = "Joined users"; - $lang->grant_to_group = "Specification group users"; - - $lang->cmd_add_shortcut = "Добавить ярлык"; - $lang->cmd_install = "Установить"; - $lang->cmd_update = "Обновить"; - $lang->cmd_manage_category = 'Управление категориями'; - $lang->cmd_manage_grant = 'Управление правами доступа'; - $lang->cmd_manage_skin = 'Управление скинами'; - $lang->cmd_manage_document = 'Управление статьями'; - $lang->cmd_find_module = 'Искать модуль'; - $lang->cmd_find_langcode = 'Find lang code'; - - $lang->msg_new_module = "Создать новый модуль"; - $lang->msg_update_module = "Изменить модуль"; - $lang->msg_module_name_exists = "Имя уже существует. Пожалуйста, попробуйте другое"; - $lang->msg_category_is_null = 'Зарегистрированной категории не существует.'; - $lang->msg_grant_is_null = 'Списка для управления правами доступа не существует.'; - $lang->msg_no_checked_document = 'Нет выбранных статей.'; // translator's note: выше... - $lang->msg_move_failed = 'Невозможно переместить'; - $lang->msg_cannot_delete_for_child = 'Невозможно удалить категорию, имеющую дочерние категории.'; - $lang->msg_limit_mid ='모듈이름은 영문+[영문+숫자+_] 만 가능합니다.'; - $lang->msg_extra_name_exists = '이미 존재하는 확장변수 이름입니다. 다른 이름을 입력해주세요.'; - - $lang->about_browser_title = "Это будет показано в заголовке браузера. Также, это будет использоваться в RSS/Трекбеке."; - $lang->about_mid = "Имя модуля будет использовано как http://address/?mid=Имя_модуля.\n(только латиница, цифры и символ подчеркивания(_) разрешены. The maximum length is 40.)"; - $lang->about_default = "Если выбрано, модуль будет главным на сайте. Для доступа не нужен будет идентификатор модуля."; - $lang->about_module_category = "Это позволяет Вам управлять посредством категорий модулей.\nURL для менеджера модулей Manage module > Категория Модуля ."; - $lang->about_description= 'Это описание только для менеджера.'; - $lang->about_default = 'Если выбрано, этот модуль будет показан, когда пользователи входят на сайт без идентификатора модуля (mid=NoValue).'; - $lang->about_header_text = 'Это содержимое будет показано сверху модуля. (HTML разрешен)'; - $lang->about_footer_text = 'Это содержимое будет показано снизу модуля. (HTML разрешен)'; - $lang->about_skin = 'Вы можете выбрать скин модуля.'; - $lang->about_use_category = 'Если выбрано, функция категорий будет включена.'; - $lang->about_list_count = 'Вы можете установить лимит показа статей на страницу. (по умолчанию: 20)'; - $lang->about_search_list_count = '검색 또는 카테고리 선택등을 할 경우 표시될 글의 수를 지정하실 수 있습니다. 기본(20개)'; - $lang->about_page_count = 'Вы можете установить число страниц внизу. (по умолчанию: 10)'; - $lang->about_admin_id = 'Вы можете разрешить менеджеру иметь полные права доступа к этому модулю.\nВы можете ввести несколько ID, используя '; - $lang->about_grant = 'Если Вы отключите все права доступа для отдельного объекта, не прошедшие процедуру входа на сайт пользователи получат доступ.'; - $lang->about_grant_deatil = '가입한 사용자는 cafeXE등 분양형 가상 사이트에 가입을 한 로그인 사용자를 의미합니다'; - $lang->about_module = "XE состоит из модулей, за исключением базовой библиотеки.\n Управление модулем покажет все установленные модули и поможет управлять ими."; - - $lang->about_extra_vars_default_value = 'Если нужно несколько значений по умолчанию, разделите их запятыми(,).'; - $lang->about_search_virtual_site = "가상 사이트(카페XE등)의 도메인을 입력하신 후 검색하세요.
    가상 사이트이외의 모듈은 내용을 비우고 검색하시면 됩니다. (http:// 는 제외)"; - $lang->about_langcode = "언어별로 다르게 설정하고 싶으시면 언어코드 찾기를 이용해주세요"; - $lang->about_file_extension= "%s 파일만 가능합니다."; -?> +virtual_site = "Virtual Site"; + $lang->module_list = "Список модулей"; + $lang->module_index = "Список модулей"; + $lang->module_category = "Категория модуля"; + $lang->module_info = "Информация"; + $lang->add_shortcut = "Добавить ярлыки"; + $lang->module_action = "Действия"; + $lang->module_maker = "Разработчик модуля"; + $lang->module_license = 'Лицензия'; + $lang->module_history = "История обновлений"; + $lang->category_title = "Название категории"; + $lang->header_text = 'Верхний колонтитул'; + $lang->footer_text = 'Нижний колонтитул'; + $lang->use_category = 'Включить категорию'; + $lang->category_title = 'Название категории'; + $lang->checked_count = 'Число выбранных статей'; // translator's note: возможно "checked" следует перевести как "проверенных" + $lang->skin_default_info = 'Информация стандартного скина'; + $lang->skin_author = 'Разработчик скина'; + $lang->skin_license = 'License'; + $lang->skin_history = 'История обновлений'; + $lang->module_selector = "Module Selector"; + $lang->do_selected = "Выбранные..."; + $lang->bundle_setup = "일괄 기본 설정"; + $lang->bundle_addition_setup = "일괄 추가 설정"; + $lang->bundle_grant_setup = "일괄 권한 설정"; + $lang->lang_code = "Код языка"; + $lang->filebox = "Файлбокс"; + + $lang->access_type = 'Способ соединения'; + $lang->access_domain = 'Domain соединения'; + $lang->access_vid = 'Site ID соединение'; + $lang->about_vid = '별도의 도메인이 아닌 http://XE주소/ID 로 접속할 수 있습니다. 모듈명(mid)와 중복될 수 없습니다.
    첫글자는 영문으로 시작해야 하고 영문과 숫자 그리고 _ 만 사용할 수 있습니다'; + $lang->msg_already_registed_vid = '이미 등록된 사이트 ID 입니다. 게시판등의 mid와도 중복이 되지 않습니다. 다른 ID를 입력해주세요.'; + $lang->msg_already_registed_domain = '이미 등록된 도메인입니다. 다른 도메인을 사용해주세요'; + + $lang->module_copy = "Копировать модуль"; + + $lang->header_script = "Скрипт Header"; + $lang->about_header_script = "html의 <header>와 </header> 사이에 들어가는 코드를 직접 입력할 수 있습니다.
    <script, <style 또는 <meta 태그등을 이용하실 수 있습니다"; + + $lang->grant_access = "Access"; + $lang->grant_manager = "Management"; + + $lang->grant_to_all = "All users"; + $lang->grant_to_login_user = "Logged users"; + $lang->grant_to_site_user = "Joined users"; + $lang->grant_to_group = "Specification group users"; + + $lang->cmd_add_shortcut = "Добавить ярлык"; + $lang->cmd_install = "Установить"; + $lang->cmd_update = "Обновить"; + $lang->cmd_manage_category = 'Управление категориями'; + $lang->cmd_manage_grant = 'Управление правами доступа'; + $lang->cmd_manage_skin = 'Управление скинами'; + $lang->cmd_manage_document = 'Управление статьями'; + $lang->cmd_find_module = 'Искать модуль'; + $lang->cmd_find_langcode = 'Find lang code'; + + $lang->msg_new_module = "Создать новый модуль"; + $lang->msg_update_module = "Изменить модуль"; + $lang->msg_module_name_exists = "Имя уже существует. Пожалуйста, попробуйте другое"; + $lang->msg_category_is_null = 'Зарегистрированной категории не существует.'; + $lang->msg_grant_is_null = 'Списка для управления правами доступа не существует.'; + $lang->msg_no_checked_document = 'Нет выбранных статей.'; // translator's note: выше... + $lang->msg_move_failed = 'Невозможно переместить'; + $lang->msg_cannot_delete_for_child = 'Невозможно удалить категорию, имеющую дочерние категории.'; + $lang->msg_limit_mid ='모듈이름은 영문+[영문+숫자+_] 만 가능합니다.'; + $lang->msg_extra_name_exists = '이미 존재하는 확장변수 이름입니다. 다른 이름을 입력해주세요.'; + + $lang->about_browser_title = "Это будет показано в заголовке браузера. Также, это будет использоваться в RSS/Трекбеке."; + $lang->about_mid = "Имя модуля будет использовано как http://address/?mid=Имя_модуля.\n(только латиница, цифры и символ подчеркивания(_) разрешены. The maximum length is 40.)"; + $lang->about_default = "Если выбрано, модуль будет главным на сайте. Для доступа не нужен будет идентификатор модуля."; + $lang->about_module_category = "Это позволяет Вам управлять посредством категорий модулей.\nURL для менеджера модулей Manage module > Категория Модуля ."; + $lang->about_description= 'Это описание только для менеджера.'; + $lang->about_default = 'Если выбрано, этот модуль будет показан, когда пользователи входят на сайт без идентификатора модуля (mid=NoValue).'; + $lang->about_header_text = 'Это содержимое будет показано сверху модуля. (HTML разрешен)'; + $lang->about_footer_text = 'Это содержимое будет показано снизу модуля. (HTML разрешен)'; + $lang->about_skin = 'Вы можете выбрать скин модуля.'; + $lang->about_use_category = 'Если выбрано, функция категорий будет включена.'; + $lang->about_list_count = 'Вы можете установить лимит показа статей на страницу. (по умолчанию: 20)'; + $lang->about_search_list_count = '검색 또는 카테고리 선택등을 할 경우 표시될 글의 수를 지정하실 수 있습니다. 기본(20개)'; + $lang->about_page_count = 'Вы можете установить число страниц внизу. (по умолчанию: 10)'; + $lang->about_admin_id = 'Вы можете разрешить менеджеру иметь полные права доступа к этому модулю.\nВы можете ввести несколько ID, используя '; + $lang->about_grant = 'Если Вы отключите все права доступа для отдельного объекта, не прошедшие процедуру входа на сайт пользователи получат доступ.'; + $lang->about_grant_deatil = '가입한 사용자는 cafeXE등 분양형 가상 사이트에 가입을 한 로그인 사용자를 의미합니다'; + $lang->about_module = "XE состоит из модулей, за исключением базовой библиотеки.\n Управление модулем покажет все установленные модули и поможет управлять ими."; + + $lang->about_extra_vars_default_value = 'Если нужно несколько значений по умолчанию, разделите их запятыми(,).'; + $lang->about_search_virtual_site = "가상 사이트(카페XE등)의 도메인을 입력하신 후 검색하세요.
    가상 사이트이외의 모듈은 내용을 비우고 검색하시면 됩니다. (http:// 는 제외)"; + $lang->about_langcode = "언어별로 다르게 설정하고 싶으시면 언어코드 찾기를 이용해주세요"; + $lang->about_file_extension= "%s 파일만 가능합니다."; +?> diff --git a/modules/module/lang/tr.lang.php b/modules/module/lang/tr.lang.php index fb8feb763..fea76234b 100644 --- a/modules/module/lang/tr.lang.php +++ b/modules/module/lang/tr.lang.php @@ -1,99 +1,99 @@ -virtual_site = "Sanal Siteler"; - $lang->module_list = "Modül Listesi"; - $lang->module_index = "Modül Listesi"; - $lang->module_category = "Modül Kategorisi"; - $lang->module_info = "Modül Bilgisi"; - $lang->add_shortcut = "Kısayol Ekle"; - $lang->module_action = "Eylemler"; - $lang->module_maker = "Modül Geliştirici"; - $lang->module_license = 'Lisans'; - $lang->module_history = "Güncelleştirme Geçmişi"; - $lang->category_title = "Kategori Başlığı"; - $lang->header_text = 'Başlık Metni'; - $lang->footer_text = 'Sayfa Altlığı Metni'; - $lang->use_category = 'Kategoriyi Etkinleştir'; - $lang->category_title = 'Kategori Başlığı'; - $lang->checked_count = 'Denetlenen Makale Sayısı'; - $lang->skin_default_info = 'Varsayılan Dış Görünüm Bilgisi'; - $lang->skin_author = 'Dış Görünüm Geliştiricisi'; - $lang->skin_license = 'Lisans'; - $lang->skin_history = 'Güncelleştirme Geçmişi'; - $lang->module_copy = "Çoğaltma Modülü"; - $lang->module_selector = "Modül Seçini"; - $lang->do_selected = "Şunu yap"; - $lang->bundle_setup = "Toplu Ayar"; - $lang->bundle_addition_setup = "Toplu Ek Ayar"; - $lang->bundle_grant_setup = "Toplu Yetki Ayarı"; - $lang->lang_code = "Dil Kodu"; - $lang->filebox = "Dosya Kutusu"; - - $lang->access_type = 'Erişim Türü'; - $lang->access_domain = 'Alan adıyla'; - $lang->access_vid = 'Site kimliğiyle'; - $lang->about_domain = "Birden fazla sanal website oluşturabilmek için, her birinin kendi alanadına ihtiyacı vardır.
    Alt-alanadı (örn., aaa.bbb.com of bbb.com) da kullanılabilir. XE'nin de içinde kurulu olduğu yolun adresini giriniz.
    örn.) www.xpressengine.com/xe"; - $lang->about_vid = 'Kullanıcılar, http://XEaddress/ID adresiyle ulaşabilirler. Varolan bir modül adıyla(mid) aynı olan site kimliği kullanamazsınız .
    Site kimliği bir harfle başlamaladır . Alfabetik karakterler, sayılar ve _ işareti site kimliği için kullanılabilir.'; - $lang->msg_already_registed_vid = 'Önceden kaydedilmiş site kimliği. Lütfen başka bir kimlik giriniz.'; - $lang->msg_already_registed_domain = "Bu alanadı önceden kullanıldı. Lütfen farklı bir alanadı giriniz."; - - $lang->header_script = "Başlık Betiği(script)"; - $lang->about_header_script = "Html betiğini(script) <header> ile </header> arasına kendiniz ekleyebilirsiniz.
    <script, <style or <meta tag kullanabilirsiniz"; - - $lang->grant_access = "Yetki"; - $lang->grant_manager = "Yönetim"; - - $lang->grant_to_all = "Tüm kullanıcılar"; - $lang->grant_to_login_user = "Oturum açmış kullanıcılar"; - $lang->grant_to_site_user = "Kayıtlı kullanıcılar"; - $lang->grant_to_group = "Belirli grup kullanıcıları"; - - $lang->cmd_add_shortcut = "Kısayol Ekle"; - $lang->cmd_install = "Kur"; - $lang->cmd_update = "Güncelleştir"; - $lang->cmd_manage_category = 'Kategorileri Yönet'; - $lang->cmd_manage_grant = 'Yetkileri Yönet'; - $lang->cmd_manage_skin = 'Dış Görünümleri Yönet'; - $lang->cmd_manage_document = 'Makaleleri Yönet'; - $lang->cmd_find_module = 'Modül Bul'; - $lang->cmd_find_langcode = 'Dil kodu bul'; - - $lang->msg_new_module = "Yeni modül oluştur"; - $lang->msg_update_module = "Modül Düzelt"; - $lang->msg_module_name_exists = "Bu isim önceden zaten alınmış. Lütfen başka bir tane deneyiniz."; - $lang->msg_category_is_null = 'Kayıtlı kategori yok.'; - $lang->msg_grant_is_null = 'Yetki listesi yok.'; - $lang->msg_no_checked_document = 'Denetlenmiş makaleler bulunmamakta.'; - $lang->msg_move_failed = 'Taşıma hatası'; - $lang->msg_cannot_delete_for_child = 'Alt kategorileri olan kategoriler silinemez.'; - $lang->msg_limit_mid ="Sadece harfler+[harfler+sayılar+_] modül ismi olarak kullanılabilir."; - $lang->msg_extra_name_exists = 'Önceden kayıtlı değişken isim. Lütfen başka bir tane giriniz.'; - - $lang->about_browser_title = "Bu girdi tarayıcı başlığında gösterilecektir. Aynı zamanda RSS/Geri İzleme(trackback)\'de de kullanılacaktır."; - $lang->about_mid = "Modül ismi, http://adres/?mid=Modulismi şeklinde kullanılacaktır.\n(Sadece ingilizce harflere + [ingilizce harflere, sayılara, ve altçizgiye (_)] izin verilmiştir. Azami uzunluk 40 karakterdir.)"; - $lang->about_default = "İşaretlenmişse, modül kimlik değeri(mid=Değer Yok) olmadan siteye erişirken varsayılan kullanılacaktır."; - $lang->about_module_category = "Size, modül kategorisi yoluyla yönetme imkanı sunar.\n Modül Yöneticisi için URL: Manage module > Modül Kategorisidir."; - $lang->about_description= 'Sadece yöneticilerin görebileceği açıklamadır.'; - $lang->about_default = 'Eğer işaretlenmişse, kullanıcılar siteye modül kimlik değeri (mid=değer yok) olmadan erişirken bu modül görüntülenecektir .'; - $lang->about_header_text = 'Modülün üst kısmında gösterilecek içeriklerdir.(html etiketleri etkin)'; - $lang->about_footer_text = 'Modülün alt kısmında gösterilecek içeriklerdir.(html etiketleri etkin)'; - $lang->about_skin = 'Modül dış görünümünü seçebilirsiniz.'; - $lang->about_use_category = 'İşaretlediğiniz taktirde, kategori özelliği etkinleştirilecektir.'; - $lang->about_list_count = 'Sayfada gösterilecek makalelerin sayı üstsınırını ayarlayabilirsiniz.(varsayılan : 20)'; - $lang->about_search_list_count = 'Kategori veya arama özelliğini kullanırken gösterilecek makalelerin sayısını ayarlayabilirsiniz. (varsayılan : 20)'; - $lang->about_page_count = 'Sayfanın alt kısmında sayfa geçiş linklerinin sayısını ayarlayabilirsiniz.(varsayılan : 10)'; - $lang->about_admin_id = 'Modüle tam yetkisi olan bir yönetici atayabilirsiniz.'; - $lang->about_grant = 'Belirli bir nesne için tüm yetkileri kapatırsanız, siteye üye girişi yapmamış üyeler yetki sahibi olacaklardır.'; - $lang->about_grant_deatil = 'Kayıtlı kullanıcı, sanal sitelere (örn., cafeXE) kayıt olmuş kullanıcı demektir .'; - $lang->about_module = "XE, temel kitaplık dışında, modüllerden oluşmaktadır.\n [Modül Yönetimi] modülü, size kurulu tüm modülleri gösterecek ve onları yönetmenize yardımcı olacaktır."; - - $lang->about_extra_vars_default_value = 'Eğer çoklu varsayılan değerler gerekiyorsa, onları virgülle(,) köprüleyebilirsiniz.'; - $lang->about_search_virtual_site = "Sanal sitelerin alanadlarını giriniz.
    Sanal olmayan sitelerin modüllerini aramak için, boş arama yapınız"; - $lang->about_langcode = "Eğer tek tek yapılandırma yapmak istiyorsanız, 'dil kodu bul'\' u kullanınız."; - $lang->about_file_extension= "Yalnızca %s uzantı(ları) mevucut."; -?> +virtual_site = "Sanal Siteler"; + $lang->module_list = "Modül Listesi"; + $lang->module_index = "Modül Listesi"; + $lang->module_category = "Modül Kategorisi"; + $lang->module_info = "Modül Bilgisi"; + $lang->add_shortcut = "Kısayol Ekle"; + $lang->module_action = "Eylemler"; + $lang->module_maker = "Modül Geliştirici"; + $lang->module_license = 'Lisans'; + $lang->module_history = "Güncelleştirme Geçmişi"; + $lang->category_title = "Kategori Başlığı"; + $lang->header_text = 'Başlık Metni'; + $lang->footer_text = 'Sayfa Altlığı Metni'; + $lang->use_category = 'Kategoriyi Etkinleştir'; + $lang->category_title = 'Kategori Başlığı'; + $lang->checked_count = 'Denetlenen Makale Sayısı'; + $lang->skin_default_info = 'Varsayılan Dış Görünüm Bilgisi'; + $lang->skin_author = 'Dış Görünüm Geliştiricisi'; + $lang->skin_license = 'Lisans'; + $lang->skin_history = 'Güncelleştirme Geçmişi'; + $lang->module_copy = "Çoğaltma Modülü"; + $lang->module_selector = "Modül Seçini"; + $lang->do_selected = "Şunu yap"; + $lang->bundle_setup = "Toplu Ayar"; + $lang->bundle_addition_setup = "Toplu Ek Ayar"; + $lang->bundle_grant_setup = "Toplu Yetki Ayarı"; + $lang->lang_code = "Dil Kodu"; + $lang->filebox = "Dosya Kutusu"; + + $lang->access_type = 'Erişim Türü'; + $lang->access_domain = 'Alan adıyla'; + $lang->access_vid = 'Site kimliğiyle'; + $lang->about_domain = "Birden fazla sanal website oluşturabilmek için, her birinin kendi alanadına ihtiyacı vardır.
    Alt-alanadı (örn., aaa.bbb.com of bbb.com) da kullanılabilir. XE'nin de içinde kurulu olduğu yolun adresini giriniz.
    örn.) www.xpressengine.com/xe"; + $lang->about_vid = 'Kullanıcılar, http://XEaddress/ID adresiyle ulaşabilirler. Varolan bir modül adıyla(mid) aynı olan site kimliği kullanamazsınız .
    Site kimliği bir harfle başlamaladır . Alfabetik karakterler, sayılar ve _ işareti site kimliği için kullanılabilir.'; + $lang->msg_already_registed_vid = 'Önceden kaydedilmiş site kimliği. Lütfen başka bir kimlik giriniz.'; + $lang->msg_already_registed_domain = "Bu alanadı önceden kullanıldı. Lütfen farklı bir alanadı giriniz."; + + $lang->header_script = "Başlık Betiği(script)"; + $lang->about_header_script = "Html betiğini(script) <header> ile </header> arasına kendiniz ekleyebilirsiniz.
    <script, <style or <meta tag kullanabilirsiniz"; + + $lang->grant_access = "Yetki"; + $lang->grant_manager = "Yönetim"; + + $lang->grant_to_all = "Tüm kullanıcılar"; + $lang->grant_to_login_user = "Oturum açmış kullanıcılar"; + $lang->grant_to_site_user = "Kayıtlı kullanıcılar"; + $lang->grant_to_group = "Belirli grup kullanıcıları"; + + $lang->cmd_add_shortcut = "Kısayol Ekle"; + $lang->cmd_install = "Kur"; + $lang->cmd_update = "Güncelleştir"; + $lang->cmd_manage_category = 'Kategorileri Yönet'; + $lang->cmd_manage_grant = 'Yetkileri Yönet'; + $lang->cmd_manage_skin = 'Dış Görünümleri Yönet'; + $lang->cmd_manage_document = 'Makaleleri Yönet'; + $lang->cmd_find_module = 'Modül Bul'; + $lang->cmd_find_langcode = 'Dil kodu bul'; + + $lang->msg_new_module = "Yeni modül oluştur"; + $lang->msg_update_module = "Modül Düzelt"; + $lang->msg_module_name_exists = "Bu isim önceden zaten alınmış. Lütfen başka bir tane deneyiniz."; + $lang->msg_category_is_null = 'Kayıtlı kategori yok.'; + $lang->msg_grant_is_null = 'Yetki listesi yok.'; + $lang->msg_no_checked_document = 'Denetlenmiş makaleler bulunmamakta.'; + $lang->msg_move_failed = 'Taşıma hatası'; + $lang->msg_cannot_delete_for_child = 'Alt kategorileri olan kategoriler silinemez.'; + $lang->msg_limit_mid ="Sadece harfler+[harfler+sayılar+_] modül ismi olarak kullanılabilir."; + $lang->msg_extra_name_exists = 'Önceden kayıtlı değişken isim. Lütfen başka bir tane giriniz.'; + + $lang->about_browser_title = "Bu girdi tarayıcı başlığında gösterilecektir. Aynı zamanda RSS/Geri İzleme(trackback)\'de de kullanılacaktır."; + $lang->about_mid = "Modül ismi, http://adres/?mid=Modulismi şeklinde kullanılacaktır.\n(Sadece ingilizce harflere + [ingilizce harflere, sayılara, ve altçizgiye (_)] izin verilmiştir. Azami uzunluk 40 karakterdir.)"; + $lang->about_default = "İşaretlenmişse, modül kimlik değeri(mid=Değer Yok) olmadan siteye erişirken varsayılan kullanılacaktır."; + $lang->about_module_category = "Size, modül kategorisi yoluyla yönetme imkanı sunar.\n Modül Yöneticisi için URL: Manage module > Modül Kategorisidir."; + $lang->about_description= 'Sadece yöneticilerin görebileceği açıklamadır.'; + $lang->about_default = 'Eğer işaretlenmişse, kullanıcılar siteye modül kimlik değeri (mid=değer yok) olmadan erişirken bu modül görüntülenecektir .'; + $lang->about_header_text = 'Modülün üst kısmında gösterilecek içeriklerdir.(html etiketleri etkin)'; + $lang->about_footer_text = 'Modülün alt kısmında gösterilecek içeriklerdir.(html etiketleri etkin)'; + $lang->about_skin = 'Modül dış görünümünü seçebilirsiniz.'; + $lang->about_use_category = 'İşaretlediğiniz taktirde, kategori özelliği etkinleştirilecektir.'; + $lang->about_list_count = 'Sayfada gösterilecek makalelerin sayı üstsınırını ayarlayabilirsiniz.(varsayılan : 20)'; + $lang->about_search_list_count = 'Kategori veya arama özelliğini kullanırken gösterilecek makalelerin sayısını ayarlayabilirsiniz. (varsayılan : 20)'; + $lang->about_page_count = 'Sayfanın alt kısmında sayfa geçiş linklerinin sayısını ayarlayabilirsiniz.(varsayılan : 10)'; + $lang->about_admin_id = 'Modüle tam yetkisi olan bir yönetici atayabilirsiniz.'; + $lang->about_grant = 'Belirli bir nesne için tüm yetkileri kapatırsanız, siteye üye girişi yapmamış üyeler yetki sahibi olacaklardır.'; + $lang->about_grant_deatil = 'Kayıtlı kullanıcı, sanal sitelere (örn., cafeXE) kayıt olmuş kullanıcı demektir .'; + $lang->about_module = "XE, temel kitaplık dışında, modüllerden oluşmaktadır.\n [Modül Yönetimi] modülü, size kurulu tüm modülleri gösterecek ve onları yönetmenize yardımcı olacaktır."; + + $lang->about_extra_vars_default_value = 'Eğer çoklu varsayılan değerler gerekiyorsa, onları virgülle(,) köprüleyebilirsiniz.'; + $lang->about_search_virtual_site = "Sanal sitelerin alanadlarını giriniz.
    Sanal olmayan sitelerin modüllerini aramak için, boş arama yapınız"; + $lang->about_langcode = "Eğer tek tek yapılandırma yapmak istiyorsanız, 'dil kodu bul'\' u kullanınız."; + $lang->about_file_extension= "Yalnızca %s uzantı(ları) mevucut."; +?> diff --git a/modules/module/lang/vi.lang.php b/modules/module/lang/vi.lang.php index f002f6473..bb25fd178 100644 --- a/modules/module/lang/vi.lang.php +++ b/modules/module/lang/vi.lang.php @@ -1,101 +1,101 @@ -virtual_site = "Site thực"; - $lang->module_list = "Danh sách Module"; - $lang->module_index = "Danh sách Module"; - $lang->module_category = "Thể loại"; - $lang->module_info = "Thông tin Module"; - $lang->add_shortcut = "Thêm phím tắt"; - $lang->module_action = "Hoạt động"; - $lang->module_maker = "Người thiết kế"; - $lang->module_license = 'Giấy phép'; - $lang->module_history = "Lịch sử cập nhật"; - $lang->category_title = "Tiêu đề phân loại"; - $lang->header_text = 'Nội dung Header'; - $lang->footer_text = 'Nội dung Footer'; - $lang->use_category = 'Mở phân loại'; - $lang->category_title = 'Tiêu đề phân loại'; - $lang->checked_count = 'Số bài viết đã chọn'; - $lang->skin_default_info = 'Thông tin Skin mặc định'; - $lang->skin_author = 'Thiết kế'; - $lang->skin_license = 'Giấy phép'; - $lang->skin_history = 'Lịch sử cập nhật'; - $lang->module_copy = "Nhân bản Module"; - $lang->module_selector = "Chọn lọc Module"; - $lang->do_selected = "Bình chọn / Phê bình."; - $lang->bundle_setup = "Gói cài đặt"; - $lang->bundle_addition_setup = "Gói cài đặt bổ xung"; - $lang->bundle_grant_setup = "Gói cài đặt cho phép"; - $lang->lang_code = "Mã ngôn ngữ"; - $lang->filebox = "FileBox"; - - $lang->access_type = 'Kiểu truy cập'; - $lang->access_domain = 'Với tên miền'; - $lang->access_vid = 'Với ID Website'; - $lang->about_domain = "Để tạo nhiều Website nhỏ, các Website nhỏ này cần những tên miền riêng của mình.
    Có thể sử dụng những Subdomain dạng aaa.bbb.com của bbb.com. Hãy nhập địa chỉ bao gồm cả Domain cài đặt XE.
    Ví dụ: www.vietxe.net/xe"; - $lang->about_vid = 'Người sử dụng có thể truy cập qua http://XEaddress/ID. Bạn không thể sử dụng ID giống nhau và giống tên Module đã có.
    Teen ID có dạng là các chữ cái, số và dấu gạch dưới (_).'; - $lang->msg_already_registed_vid = 'Tên ID này đã được đăng kí. Xin hãy chọn tên khác.'; - $lang->msg_already_registed_domain = "Tên miền đã được sử dụng. Xin hãy chọn tên khác."; - - $lang->header_script = "Header Script"; - $lang->about_header_script = "Bạn co thể nhập mã dang HTML vào giữa <header> và </header>.
    Bạn có thể sử dụng <script, <style hay <meta tag"; - - $lang->grant_access = "Truy cập"; - $lang->grant_manager = "Quản lý"; - - $lang->grant_to_all = "Tất cả"; - $lang->grant_to_login_user = "Đã đăng nhập"; - $lang->grant_to_site_user = "Đã đăng kí"; - $lang->grant_to_group = "Nhóm chỉ định"; - - $lang->cmd_add_shortcut = "Thêm phím tắt"; - $lang->cmd_install = "Cài đặt"; - $lang->cmd_update = "Cập nhật"; - $lang->cmd_manage_category = 'Quản lý thể loại'; - $lang->cmd_manage_grant = 'Quản lý quyền'; - $lang->cmd_manage_skin = 'Quản lý Skin'; - $lang->cmd_manage_document = 'Quản lý bài viết'; - $lang->cmd_find_module = 'Tìm Module'; - $lang->cmd_find_langcode = 'Tìm mã ngôn ngữ'; - - $lang->msg_new_module = "Tạo Module mới"; - $lang->msg_update_module = "Sửa Module"; - $lang->msg_module_name_exists = "Tên này đã được sử dụng. Hãy thử lại với tên khác."; - $lang->msg_category_is_null = 'Không có phân loại nào được tạo.'; - $lang->msg_grant_is_null = 'Không có danh sách quyền nào.'; - $lang->msg_no_checked_document = 'Không có bài viết nào được kiểm tra.'; - $lang->msg_move_failed = 'Không thể di chuyển'; - $lang->msg_cannot_delete_for_child = 'Không thể xóa được phân loại khi có những phân loại con.'; - $lang->msg_limit_mid ="Tên Module chỉ hỗ trợ định dạng [Kí tự], [Kí tự+Số], [Kí tự+Số+_]."; - $lang->msg_extra_name_exists = 'Tên biến đã được sử dụng. Xin hãy chọn tên khác.'; - - $lang->about_browser_title = "Nó sẽ hiển thị trên tiêu đề của trình duyệt và trong RSS/Trackback."; - $lang->about_mid = "Tên Module được sử dụng dạng http://address/?mid=ModuleName.\n(Chỉ cho phép chữ cái tiếng Anh + [chữ cái tiếng Anh, số, và dấu gạch dưới (_)] và tối đa 40 kí tự.)"; - $lang->about_default = "Nếu chọn, Sẽ hiển thị mặc định là (mid=NoValue) khi truy cập tên Module không đúng."; - $lang->about_module_category = "Nó cho phép bạn quản lý thông qua Module thể loại.\n URL quản lý có dạng Quản lý Module > Module thể loại ."; - $lang->about_description= 'Mô tả cho một quản lý.'; - $lang->about_default = 'Nếu chọn, Sẽ hiển thị mặc định là (mid=NoValue) khi truy cập tên Module không đúng.'; - $lang->about_header_text = 'Nội dung sẽ hiển thị trên đầu Module.(sau http tag có sẵn)'; - $lang->about_footer_text = 'Nội dung sẽ hiển thị phía dưới Module.(trước http tag có sẵn)'; - $lang->about_skin = 'Banj có thể chọn Skin cho Module.'; - $lang->about_use_category = 'Nếu chon, chức năng thể loại sẽ hoạt động.'; - $lang->about_list_count = 'Bạn có thể giới hạn bài viết hiển thị trên một trang.(Mặc định là 20)'; - $lang->about_search_list_count = 'Bạn có thể đặt giới hạn số bài viết sẽ hiển thị khi tìm kiếm hay chọn thể loại. (Mặc định là 20)'; - $lang->about_page_count = 'bạn có thể giới hạn số trang liên kết hiển thị phía dưới.(Mặc định là 10)'; - $lang->about_admin_id = 'Bạn có thể đặt quyền hạn cho người sử dụng khi truy cập tới Module.'; - $lang->about_grant = 'Nếu bạn khóa tất cả quyền hạn cho một thành viên đặc biệt nào đó, những thành viên đó sẽ không được phép đăng nhập.'; - $lang->about_grant_deatil = 'Khi thành viên dăng kí tại trang chủ, nghĩa là họ cũng là thành viên của những trang khác (Ví dụ: cafeXE,...).'; - $lang->about_module = "Khu vực Module trong XE ngoại trừ Library là tại [Module Manage]. Tất cả những Module đang có sẽ hiển thị, giúp bạn quản lý một cách dễ dàng."; - - $lang->about_extra_vars_default_value = 'Nếu cần nhiều giá trị mặc định, bạn có thể thêm dấu (,) và giữa các kết nối.'; - $lang->about_search_virtual_site = "Hãy nhập tên miền thực tế của Website.
    Để tìm kiếm những Module không thực tế của Website hãy để trống."; - $lang->about_langcode = "Nếu bạn muốn sử dụng định hình riêng, hãy sử dụng 'Tìm kiếm mã ngôn ngữ'"; - $lang->about_file_extension= "Chỉ cho phép những phần mở rộng là: %s."; -?> +virtual_site = "Site thực"; + $lang->module_list = "Danh sách Module"; + $lang->module_index = "Danh sách Module"; + $lang->module_category = "Thể loại"; + $lang->module_info = "Thông tin Module"; + $lang->add_shortcut = "Thêm phím tắt"; + $lang->module_action = "Hoạt động"; + $lang->module_maker = "Người thiết kế"; + $lang->module_license = 'Giấy phép'; + $lang->module_history = "Lịch sử cập nhật"; + $lang->category_title = "Tiêu đề phân loại"; + $lang->header_text = 'Nội dung Header'; + $lang->footer_text = 'Nội dung Footer'; + $lang->use_category = 'Mở phân loại'; + $lang->category_title = 'Tiêu đề phân loại'; + $lang->checked_count = 'Số bài viết đã chọn'; + $lang->skin_default_info = 'Thông tin Skin mặc định'; + $lang->skin_author = 'Thiết kế'; + $lang->skin_license = 'Giấy phép'; + $lang->skin_history = 'Lịch sử cập nhật'; + $lang->module_copy = "Nhân bản Module"; + $lang->module_selector = "Chọn lọc Module"; + $lang->do_selected = "Bình chọn / Phê bình."; + $lang->bundle_setup = "Gói cài đặt"; + $lang->bundle_addition_setup = "Gói cài đặt bổ xung"; + $lang->bundle_grant_setup = "Gói cài đặt cho phép"; + $lang->lang_code = "Mã ngôn ngữ"; + $lang->filebox = "FileBox"; + + $lang->access_type = 'Kiểu truy cập'; + $lang->access_domain = 'Với tên miền'; + $lang->access_vid = 'Với ID Website'; + $lang->about_domain = "Để tạo nhiều Website nhỏ, các Website nhỏ này cần những tên miền riêng của mình.
    Có thể sử dụng những Subdomain dạng aaa.bbb.com của bbb.com. Hãy nhập địa chỉ bao gồm cả Domain cài đặt XE.
    Ví dụ: www.vietxe.net/xe"; + $lang->about_vid = 'Người sử dụng có thể truy cập qua http://XEaddress/ID. Bạn không thể sử dụng ID giống nhau và giống tên Module đã có.
    Teen ID có dạng là các chữ cái, số và dấu gạch dưới (_).'; + $lang->msg_already_registed_vid = 'Tên ID này đã được đăng kí. Xin hãy chọn tên khác.'; + $lang->msg_already_registed_domain = "Tên miền đã được sử dụng. Xin hãy chọn tên khác."; + + $lang->header_script = "Header Script"; + $lang->about_header_script = "Bạn co thể nhập mã dang HTML vào giữa <header> và </header>.
    Bạn có thể sử dụng <script, <style hay <meta tag"; + + $lang->grant_access = "Truy cập"; + $lang->grant_manager = "Quản lý"; + + $lang->grant_to_all = "Tất cả"; + $lang->grant_to_login_user = "Đã đăng nhập"; + $lang->grant_to_site_user = "Đã đăng kí"; + $lang->grant_to_group = "Nhóm chỉ định"; + + $lang->cmd_add_shortcut = "Thêm phím tắt"; + $lang->cmd_install = "Cài đặt"; + $lang->cmd_update = "Cập nhật"; + $lang->cmd_manage_category = 'Quản lý thể loại'; + $lang->cmd_manage_grant = 'Quản lý quyền'; + $lang->cmd_manage_skin = 'Quản lý Skin'; + $lang->cmd_manage_document = 'Quản lý bài viết'; + $lang->cmd_find_module = 'Tìm Module'; + $lang->cmd_find_langcode = 'Tìm mã ngôn ngữ'; + + $lang->msg_new_module = "Tạo Module mới"; + $lang->msg_update_module = "Sửa Module"; + $lang->msg_module_name_exists = "Tên này đã được sử dụng. Hãy thử lại với tên khác."; + $lang->msg_category_is_null = 'Không có phân loại nào được tạo.'; + $lang->msg_grant_is_null = 'Không có danh sách quyền nào.'; + $lang->msg_no_checked_document = 'Không có bài viết nào được kiểm tra.'; + $lang->msg_move_failed = 'Không thể di chuyển'; + $lang->msg_cannot_delete_for_child = 'Không thể xóa được phân loại khi có những phân loại con.'; + $lang->msg_limit_mid ="Tên Module chỉ hỗ trợ định dạng [Kí tự], [Kí tự+Số], [Kí tự+Số+_]."; + $lang->msg_extra_name_exists = 'Tên biến đã được sử dụng. Xin hãy chọn tên khác.'; + + $lang->about_browser_title = "Nó sẽ hiển thị trên tiêu đề của trình duyệt và trong RSS/Trackback."; + $lang->about_mid = "Tên Module được sử dụng dạng http://address/?mid=ModuleName.\n(Chỉ cho phép chữ cái tiếng Anh + [chữ cái tiếng Anh, số, và dấu gạch dưới (_)] và tối đa 40 kí tự.)"; + $lang->about_default = "Nếu chọn, Sẽ hiển thị mặc định là (mid=NoValue) khi truy cập tên Module không đúng."; + $lang->about_module_category = "Nó cho phép bạn quản lý thông qua Module thể loại.\n URL quản lý có dạng Quản lý Module > Module thể loại ."; + $lang->about_description= 'Mô tả cho một quản lý.'; + $lang->about_default = 'Nếu chọn, Sẽ hiển thị mặc định là (mid=NoValue) khi truy cập tên Module không đúng.'; + $lang->about_header_text = 'Nội dung sẽ hiển thị trên đầu Module.(sau http tag có sẵn)'; + $lang->about_footer_text = 'Nội dung sẽ hiển thị phía dưới Module.(trước http tag có sẵn)'; + $lang->about_skin = 'Banj có thể chọn Skin cho Module.'; + $lang->about_use_category = 'Nếu chon, chức năng thể loại sẽ hoạt động.'; + $lang->about_list_count = 'Bạn có thể giới hạn bài viết hiển thị trên một trang.(Mặc định là 20)'; + $lang->about_search_list_count = 'Bạn có thể đặt giới hạn số bài viết sẽ hiển thị khi tìm kiếm hay chọn thể loại. (Mặc định là 20)'; + $lang->about_page_count = 'bạn có thể giới hạn số trang liên kết hiển thị phía dưới.(Mặc định là 10)'; + $lang->about_admin_id = 'Bạn có thể đặt quyền hạn cho người sử dụng khi truy cập tới Module.'; + $lang->about_grant = 'Nếu bạn khóa tất cả quyền hạn cho một thành viên đặc biệt nào đó, những thành viên đó sẽ không được phép đăng nhập.'; + $lang->about_grant_deatil = 'Khi thành viên dăng kí tại trang chủ, nghĩa là họ cũng là thành viên của những trang khác (Ví dụ: cafeXE,...).'; + $lang->about_module = "Khu vực Module trong XE ngoại trừ Library là tại [Module Manage]. Tất cả những Module đang có sẽ hiển thị, giúp bạn quản lý một cách dễ dàng."; + + $lang->about_extra_vars_default_value = 'Nếu cần nhiều giá trị mặc định, bạn có thể thêm dấu (,) và giữa các kết nối.'; + $lang->about_search_virtual_site = "Hãy nhập tên miền thực tế của Website.
    Để tìm kiếm những Module không thực tế của Website hãy để trống."; + $lang->about_langcode = "Nếu bạn muốn sử dụng định hình riêng, hãy sử dụng 'Tìm kiếm mã ngôn ngữ'"; + $lang->about_file_extension= "Chỉ cho phép những phần mở rộng là: %s."; +?> diff --git a/modules/module/lang/zh-CN.lang.php b/modules/module/lang/zh-CN.lang.php index 0a47be86e..afb84b650 100644 --- a/modules/module/lang/zh-CN.lang.php +++ b/modules/module/lang/zh-CN.lang.php @@ -1,99 +1,99 @@ -virtual_site = "站点"; - $lang->module_list = "模块目录"; - $lang->module_index = "模块列表"; - $lang->module_category = "模块分类"; - $lang->module_info = "模块信息"; - $lang->add_shortcut = "添加到快捷菜单"; - $lang->module_action = "动作"; - $lang->module_maker = "模块作者"; - $lang->module_license = '版权'; - $lang->module_history = "更新事项 "; - $lang->category_title = "分类名称"; - $lang->header_text = '头部修饰'; - $lang->footer_text = '尾部修饰'; - $lang->use_category = '使用分类'; - $lang->category_title = '分类名'; - $lang->checked_count = '所选主题数'; - $lang->skin_default_info = '皮肤默认信息'; - $lang->skin_author = '皮肤作者'; - $lang->skin_license = '版权'; - $lang->skin_history = '更新日志'; - $lang->module_copy = "模块复制"; - $lang->module_selector = "模块选择器"; - $lang->do_selected = "把所选模块..."; - $lang->bundle_setup = "批量设置-常规选项"; - $lang->bundle_addition_setup = "批量设置-高级选项"; - $lang->bundle_grant_setup = "批量设置-权限"; - $lang->lang_code = "语言变量"; - $lang->filebox = "文件管理"; - - $lang->access_type = '访问方式'; - $lang->access_domain = '域名'; - $lang->access_vid = '站点ID'; - $lang->about_domain = "要创建一个站点必须有一个专用域名。
    一级域名或二级域名皆可。输入的时候请把XE安装路径也一起输入。
    ex) www.xpressengine.com/xe"; - $lang->about_vid = '直接以http://XE安装地址/ID的方式访问。
    模块名(mid)不能重复。
    模块名要以英文字母开头,且只允许使用英文字母,数字及"_"。'; - $lang->msg_already_registed_vid = '重复的站点ID,请重新输入(注:站点ID不能重复,而且也不能与版面mid重复)。'; - $lang->msg_already_registed_domain = "对不起!已有相同的域名。请重新输入。"; - - $lang->header_script = "文件头部脚本"; - $lang->about_header_script = "可以直接输入插入到html中<head>区的代码。
    可使用<script, <style 或 <meta 等标签。"; - - $lang->grant_access = "访问权限"; - $lang->grant_manager = "管理权限"; - - $lang->grant_to_all = "不限制"; - $lang->grant_to_login_user = "已登录用户"; - $lang->grant_to_site_user = "子站会员"; - $lang->grant_to_group = "特定用户组"; - - $lang->cmd_add_shortcut = "添加到快捷菜单"; - $lang->cmd_install = "安装"; - $lang->cmd_update = "升级"; - $lang->cmd_manage_category = '分类管理'; - $lang->cmd_manage_grant = '权限管理'; - $lang->cmd_manage_skin = '皮肤管理'; - $lang->cmd_manage_document = '主题管理'; - $lang->cmd_find_module = '查找模块'; - $lang->cmd_find_langcode = '选择语言变量'; - - $lang->msg_new_module = "模块生成"; - $lang->msg_update_module = "模块修改"; - $lang->msg_module_name_exists = "已存在的模块名称。请输入其他名称。"; - $lang->msg_category_is_null = '没有登录的分类'; - $lang->msg_grant_is_null = '没有登录的权限对象'; - $lang->msg_no_checked_document = '没有被选择的主题'; - $lang->msg_move_failed = '移动失败!'; - $lang->msg_cannot_delete_for_child = '不能删除有下级分类的分类!'; - $lang->msg_limit_mid ="模块名称只允许英文字母+[英文字母+数字]。"; - $lang->msg_extra_name_exists = '已有的扩展变量名称,请重新输入!'; - - $lang->about_browser_title = "显示在浏览器窗口的标题值。 在RSS/Trackback也可以使用。"; - $lang->about_mid = "模块名称只允许使用英文,数字和下划线(最多不能超过40字节)。"; - $lang->about_default = "用没有mid值的网址访问网站时,将会显示默认。"; - $lang->about_module_category = "可以分类管理模块。 模块分类可以在 模块管理 > 模块分类 中进行管理。"; - $lang->about_description= '管理用使用说明。'; - $lang->about_default = '用没有mid值的网址访问网站时,将会显示默认。'; - $lang->about_header_text = '模块头部修饰内容。(可以使用HTML)'; - $lang->about_footer_text = '模块尾部修饰内容。(可以使用HTML)'; - $lang->about_skin = '可以选择模块皮肤。'; - $lang->about_use_category = '选择此项可以使用分类功能。'; - $lang->about_list_count = '可以指定每页显示的主题数。(默认为20个)'; - $lang->about_search_list_count = '可以指定搜索或选择分类时每页要显示的帖子数(默认为20个)。'; - $lang->about_page_count = '可以指定显示在目录下方的页面数(默认为10个)。 '; - $lang->about_admin_id = '可以对该模块指定拥有最高管理权限的管理员。'; - $lang->about_grant = '全部解除特定权限的对象时,没有登录的会员也将具有相关权限。'; - $lang->about_grant_deatil = '子站会员是指注册到子站点已在线的用户.'; - $lang->about_module = "除基本library以外XE全部由模块组成。\n模块管理中列出所有已安装的模块,因此易于管理。"; - $lang->about_extra_vars_default_value = '复选/单选缺省值需要多个时,用,(逗号)来分隔。'; - $lang->about_search_virtual_site = "请输入子站点域名后再进行搜索。
    子站点以外的模块可以留空搜索。(输入时http://除外)。"; - $lang->about_extra_vars_eid_value = '请输入扩展变量名称(只允许英文字母+[英文字母+数字+_])。'; - $lang->about_langcode = "要想实现多国语言切换请点击[选择语言变量]按钮。"; - $lang->about_file_extension= "只允许%s文件。"; -?> +virtual_site = "站点"; + $lang->module_list = "模块目录"; + $lang->module_index = "模块列表"; + $lang->module_category = "模块分类"; + $lang->module_info = "模块信息"; + $lang->add_shortcut = "添加到快捷菜单"; + $lang->module_action = "动作"; + $lang->module_maker = "模块作者"; + $lang->module_license = '版权'; + $lang->module_history = "更新事项 "; + $lang->category_title = "分类名称"; + $lang->header_text = '头部修饰'; + $lang->footer_text = '尾部修饰'; + $lang->use_category = '使用分类'; + $lang->category_title = '分类名'; + $lang->checked_count = '所选主题数'; + $lang->skin_default_info = '皮肤默认信息'; + $lang->skin_author = '皮肤作者'; + $lang->skin_license = '版权'; + $lang->skin_history = '更新日志'; + $lang->module_copy = "模块复制"; + $lang->module_selector = "模块选择器"; + $lang->do_selected = "把所选模块..."; + $lang->bundle_setup = "批量设置-常规选项"; + $lang->bundle_addition_setup = "批量设置-高级选项"; + $lang->bundle_grant_setup = "批量设置-权限"; + $lang->lang_code = "语言变量"; + $lang->filebox = "文件管理"; + + $lang->access_type = '访问方式'; + $lang->access_domain = '域名'; + $lang->access_vid = '站点ID'; + $lang->about_domain = "要创建一个站点必须有一个专用域名。
    一级域名或二级域名皆可。输入的时候请把XE安装路径也一起输入。
    ex) www.xpressengine.com/xe"; + $lang->about_vid = '直接以http://XE安装地址/ID的方式访问。
    模块名(mid)不能重复。
    模块名要以英文字母开头,且只允许使用英文字母,数字及"_"。'; + $lang->msg_already_registed_vid = '重复的站点ID,请重新输入(注:站点ID不能重复,而且也不能与版面mid重复)。'; + $lang->msg_already_registed_domain = "对不起!已有相同的域名。请重新输入。"; + + $lang->header_script = "文件头部脚本"; + $lang->about_header_script = "可以直接输入插入到html中<head>区的代码。
    可使用<script, <style 或 <meta 等标签。"; + + $lang->grant_access = "访问权限"; + $lang->grant_manager = "管理权限"; + + $lang->grant_to_all = "不限制"; + $lang->grant_to_login_user = "已登录用户"; + $lang->grant_to_site_user = "子站会员"; + $lang->grant_to_group = "特定用户组"; + + $lang->cmd_add_shortcut = "添加到快捷菜单"; + $lang->cmd_install = "安装"; + $lang->cmd_update = "升级"; + $lang->cmd_manage_category = '分类管理'; + $lang->cmd_manage_grant = '权限管理'; + $lang->cmd_manage_skin = '皮肤管理'; + $lang->cmd_manage_document = '主题管理'; + $lang->cmd_find_module = '查找模块'; + $lang->cmd_find_langcode = '选择语言变量'; + + $lang->msg_new_module = "模块生成"; + $lang->msg_update_module = "模块修改"; + $lang->msg_module_name_exists = "已存在的模块名称。请输入其他名称。"; + $lang->msg_category_is_null = '没有登录的分类'; + $lang->msg_grant_is_null = '没有登录的权限对象'; + $lang->msg_no_checked_document = '没有被选择的主题'; + $lang->msg_move_failed = '移动失败!'; + $lang->msg_cannot_delete_for_child = '不能删除有下级分类的分类!'; + $lang->msg_limit_mid ="模块名称只允许英文字母+[英文字母+数字]。"; + $lang->msg_extra_name_exists = '已有的扩展变量名称,请重新输入!'; + + $lang->about_browser_title = "显示在浏览器窗口的标题值。 在RSS/Trackback也可以使用。"; + $lang->about_mid = "模块名称只允许使用英文,数字和下划线(最多不能超过40字节)。"; + $lang->about_default = "用没有mid值的网址访问网站时,将会显示默认。"; + $lang->about_module_category = "可以分类管理模块。 模块分类可以在 模块管理 > 模块分类 中进行管理。"; + $lang->about_description= '管理用使用说明。'; + $lang->about_default = '用没有mid值的网址访问网站时,将会显示默认。'; + $lang->about_header_text = '模块头部修饰内容。(可以使用HTML)'; + $lang->about_footer_text = '模块尾部修饰内容。(可以使用HTML)'; + $lang->about_skin = '可以选择模块皮肤。'; + $lang->about_use_category = '选择此项可以使用分类功能。'; + $lang->about_list_count = '可以指定每页显示的主题数。(默认为20个)'; + $lang->about_search_list_count = '可以指定搜索或选择分类时每页要显示的帖子数(默认为20个)。'; + $lang->about_page_count = '可以指定显示在目录下方的页面数(默认为10个)。 '; + $lang->about_admin_id = '可以对该模块指定拥有最高管理权限的管理员。'; + $lang->about_grant = '全部解除特定权限的对象时,没有登录的会员也将具有相关权限。'; + $lang->about_grant_deatil = '子站会员是指注册到子站点已在线的用户.'; + $lang->about_module = "除基本library以外XE全部由模块组成。\n模块管理中列出所有已安装的模块,因此易于管理。"; + $lang->about_extra_vars_default_value = '复选/单选缺省值需要多个时,用,(逗号)来分隔。'; + $lang->about_search_virtual_site = "请输入子站点域名后再进行搜索。
    子站点以外的模块可以留空搜索。(输入时http://除外)。"; + $lang->about_extra_vars_eid_value = '请输入扩展变量名称(只允许英文字母+[英文字母+数字+_])。'; + $lang->about_langcode = "要想实现多国语言切换请点击[选择语言变量]按钮。"; + $lang->about_file_extension= "只允许%s文件。"; +?> diff --git a/modules/module/lang/zh-TW.lang.php b/modules/module/lang/zh-TW.lang.php index f968c6ab1..70ca82317 100644 --- a/modules/module/lang/zh-TW.lang.php +++ b/modules/module/lang/zh-TW.lang.php @@ -1,98 +1,98 @@ -virtual_site = "虛擬網站"; - $lang->module_list = "模組列表"; - $lang->module_index = "模組列表"; - $lang->module_category = "模組分類"; - $lang->module_info = "模組資料"; - $lang->add_shortcut = "新增到快捷選單"; - $lang->module_action = "動作"; - $lang->module_maker = "模組作者"; - $lang->module_license = '版權'; - $lang->module_history = "更新紀錄"; - $lang->category_title = "分類名稱"; - $lang->header_text = '頂端內容'; - $lang->footer_text = '底端內容'; - $lang->use_category = '使用分類'; - $lang->category_title = '分類名稱'; - $lang->checked_count = '所選擇的主題數'; - $lang->skin_default_info = '預設面板資料'; - $lang->skin_author = '面板作者'; - $lang->skin_license = '版權'; - $lang->skin_history = '更新事項'; - $lang->module_copy = '複製模組'; - $lang->module_selector = '模組選擇器'; - $lang->do_selected = '選擇項目...'; - $lang->bundle_setup = '批次設定-設置'; - $lang->bundle_addition_setup = '批次設定-延伸設置'; - $lang->bundle_grant_setup = '批次設定-權限管理'; - $lang->lang_code = '語言代碼'; - $lang->filebox = '檔案管理'; - $lang->access_type = '訪問類型'; - $lang->access_domain = 'Domain'; - $lang->access_vid = 'Site ID'; - $lang->about_domain = "要建立網站必須要有個專屬域名。
    頂級域名或次級域名都可以。輸入時,請將 XE 安裝路徑也一起輸入。
    例) www.xpressengine.com/xe"; - $lang->about_vid = '直接以 http://程式安裝位址/ID 的方式訪問。模組名稱(mid)不能重複。
    必須要以英文字母開頭,只允許使用底線、英文及數字。'; - $lang->msg_already_registed_vid = '已註冊的 Site ID。不可與討論板的 mid 相同。請輸入其他 ID 名稱。'; - $lang->msg_already_registed_domain = "已註冊的域名。請使用其他的網域。"; - - $lang->header_script = "Header Script"; - $lang->about_header_script = "可以直接輸入,並插入到 HTML 的<head>之間。
    可使用<script>,<style>或<meta>等標籤。"; - - $lang->grant_access = "訪問"; - $lang->grant_manager = "管理"; - - $lang->grant_to_all = "所有用戶"; - $lang->grant_to_login_user = "已登入用戶"; - $lang->grant_to_site_user = "網站用戶"; - $lang->grant_to_group = "特定群組"; - - $lang->cmd_add_shortcut = "新增到快捷選單"; - $lang->cmd_install = "安裝"; - $lang->cmd_update = "升級"; - $lang->cmd_manage_category = '分類管理'; - $lang->cmd_manage_grant = '權限管理'; - $lang->cmd_manage_skin = '面板管理'; - $lang->cmd_manage_document = '主題管理'; - $lang->cmd_find_module = '搜尋模組'; - $lang->cmd_find_langcode = '搜尋語言代碼'; - - $lang->msg_new_module = "建立模組"; - $lang->msg_update_module = "修改模組"; - $lang->msg_module_name_exists = "已存在的模組名稱。請輸入其他名稱。"; - $lang->msg_category_is_null = '沒有登錄的分類'; - $lang->msg_grant_is_null = '沒有權限'; - $lang->msg_no_checked_document = '沒有被選擇的主題'; - $lang->msg_move_failed = '移動失敗!'; - $lang->msg_cannot_delete_for_child = '無法刪除有子分類的分類!'; - $lang->msg_limit_mid ="模組名稱可由英文 + [ 英文,數字及底線 ]等非常多種組合。"; - $lang->msg_extra_name_exists = '已存在的延伸變數名稱。請輸入其他名稱。'; - - $lang->about_browser_title = "顯示在瀏覽器視窗的標題。在 RSS/Trackback 也可以使用。"; - $lang->about_mid = "模組名稱只允許使用英文,數字和底線。最大長度 40 個字元。"; - $lang->about_default = "用沒有 mid 值的網址訪問網站時,將會顯示預設。"; - $lang->about_module_category = "可以分類管理模組。模組分類可以在模組管理 > 模組分類 中進行管理。"; - $lang->about_description= '管理使用說明。'; - $lang->about_default = '用沒有 mid 值的網址訪問網站時,將會顯示預設。'; - $lang->about_header_text = '顯示在模組頂部的內容。(可使用 HTML)'; - $lang->about_footer_text = '顯示在模組底部的內容。(可使用 HTML)'; - $lang->about_skin = '可以選擇模組面板。'; - $lang->about_use_category = '選擇此項可以使用分類功能。'; - $lang->about_list_count = '可以指定每頁顯示的主題數。(預設為 20 個)'; - $lang->about_search_list_count = '可以指定搜尋或選擇分類時,每頁要顯示的文章數(預設為 20 個)。'; - $lang->about_page_count = '可以指定顯示在清單下方的頁面數(預設為 10 個)。 '; - $lang->about_admin_id = '可以對該模組指定最高管理權限。'; - $lang->about_grant = '全部解除特定權限的對象時,沒有登錄的會員也將具有相關權限。'; - $lang->about_grant_deatil = '已註冊的用戶是指在虛擬網站註冊的用戶'; - $lang->about_module = "除基本函式庫以外 XE 全部由模組組成。\n模組管理中列出所有已安裝的模組,因此易於管理。"; - $lang->about_extra_vars_default_value = '當復選或單選的預設值需要很多個時,用逗號(,)區隔。'; - $lang->about_search_virtual_site = "請輸入網站域名後再搜尋。
    網站以外的模組可直接進行搜尋。(http://不用輸入)。"; - $lang->about_extra_vars_eid_value = '請輸入延伸變數名稱。( 只允許使用英文 + [ 英文,數字及底線 ] )'; - $lang->about_langcode = "想要實現多國語言功能,請按[語言代碼]按鈕。"; - $lang->about_file_extension= "只允許 %s 檔案。"; -?> +virtual_site = "虛擬網站"; + $lang->module_list = "模組列表"; + $lang->module_index = "模組列表"; + $lang->module_category = "模組分類"; + $lang->module_info = "模組資料"; + $lang->add_shortcut = "新增到快捷選單"; + $lang->module_action = "動作"; + $lang->module_maker = "模組作者"; + $lang->module_license = '版權'; + $lang->module_history = "更新紀錄"; + $lang->category_title = "分類名稱"; + $lang->header_text = '頂端內容'; + $lang->footer_text = '底端內容'; + $lang->use_category = '使用分類'; + $lang->category_title = '分類名稱'; + $lang->checked_count = '所選擇的主題數'; + $lang->skin_default_info = '預設面板資料'; + $lang->skin_author = '面板作者'; + $lang->skin_license = '版權'; + $lang->skin_history = '更新事項'; + $lang->module_copy = '複製模組'; + $lang->module_selector = '模組選擇器'; + $lang->do_selected = '選擇項目...'; + $lang->bundle_setup = '批次設定-設置'; + $lang->bundle_addition_setup = '批次設定-延伸設置'; + $lang->bundle_grant_setup = '批次設定-權限管理'; + $lang->lang_code = '語言代碼'; + $lang->filebox = '檔案管理'; + $lang->access_type = '訪問類型'; + $lang->access_domain = 'Domain'; + $lang->access_vid = 'Site ID'; + $lang->about_domain = "要建立網站必須要有個專屬域名。
    頂級域名或次級域名都可以。輸入時,請將 XE 安裝路徑也一起輸入。
    例) www.xpressengine.com/xe"; + $lang->about_vid = '直接以 http://程式安裝位址/ID 的方式訪問。模組名稱(mid)不能重複。
    必須要以英文字母開頭,只允許使用底線、英文及數字。'; + $lang->msg_already_registed_vid = '已註冊的 Site ID。不可與討論板的 mid 相同。請輸入其他 ID 名稱。'; + $lang->msg_already_registed_domain = "已註冊的域名。請使用其他的網域。"; + + $lang->header_script = "Header Script"; + $lang->about_header_script = "可以直接輸入,並插入到 HTML 的<head>之間。
    可使用<script>,<style>或<meta>等標籤。"; + + $lang->grant_access = "訪問"; + $lang->grant_manager = "管理"; + + $lang->grant_to_all = "所有用戶"; + $lang->grant_to_login_user = "已登入用戶"; + $lang->grant_to_site_user = "網站用戶"; + $lang->grant_to_group = "特定群組"; + + $lang->cmd_add_shortcut = "新增到快捷選單"; + $lang->cmd_install = "安裝"; + $lang->cmd_update = "升級"; + $lang->cmd_manage_category = '分類管理'; + $lang->cmd_manage_grant = '權限管理'; + $lang->cmd_manage_skin = '面板管理'; + $lang->cmd_manage_document = '主題管理'; + $lang->cmd_find_module = '搜尋模組'; + $lang->cmd_find_langcode = '搜尋語言代碼'; + + $lang->msg_new_module = "建立模組"; + $lang->msg_update_module = "修改模組"; + $lang->msg_module_name_exists = "已存在的模組名稱。請輸入其他名稱。"; + $lang->msg_category_is_null = '沒有登錄的分類'; + $lang->msg_grant_is_null = '沒有權限'; + $lang->msg_no_checked_document = '沒有被選擇的主題'; + $lang->msg_move_failed = '移動失敗!'; + $lang->msg_cannot_delete_for_child = '無法刪除有子分類的分類!'; + $lang->msg_limit_mid ="模組名稱可由英文 + [ 英文,數字及底線 ]等非常多種組合。"; + $lang->msg_extra_name_exists = '已存在的延伸變數名稱。請輸入其他名稱。'; + + $lang->about_browser_title = "顯示在瀏覽器視窗的標題。在 RSS/Trackback 也可以使用。"; + $lang->about_mid = "模組名稱只允許使用英文,數字和底線。最大長度 40 個字元。"; + $lang->about_default = "用沒有 mid 值的網址訪問網站時,將會顯示預設。"; + $lang->about_module_category = "可以分類管理模組。模組分類可以在模組管理 > 模組分類 中進行管理。"; + $lang->about_description= '管理使用說明。'; + $lang->about_default = '用沒有 mid 值的網址訪問網站時,將會顯示預設。'; + $lang->about_header_text = '顯示在模組頂部的內容。(可使用 HTML)'; + $lang->about_footer_text = '顯示在模組底部的內容。(可使用 HTML)'; + $lang->about_skin = '可以選擇模組面板。'; + $lang->about_use_category = '選擇此項可以使用分類功能。'; + $lang->about_list_count = '可以指定每頁顯示的主題數。(預設為 20 個)'; + $lang->about_search_list_count = '可以指定搜尋或選擇分類時,每頁要顯示的文章數(預設為 20 個)。'; + $lang->about_page_count = '可以指定顯示在清單下方的頁面數(預設為 10 個)。 '; + $lang->about_admin_id = '可以對該模組指定最高管理權限。'; + $lang->about_grant = '全部解除特定權限的對象時,沒有登錄的會員也將具有相關權限。'; + $lang->about_grant_deatil = '已註冊的用戶是指在虛擬網站註冊的用戶'; + $lang->about_module = "除基本函式庫以外 XE 全部由模組組成。\n模組管理中列出所有已安裝的模組,因此易於管理。"; + $lang->about_extra_vars_default_value = '當復選或單選的預設值需要很多個時,用逗號(,)區隔。'; + $lang->about_search_virtual_site = "請輸入網站域名後再搜尋。
    網站以外的模組可直接進行搜尋。(http://不用輸入)。"; + $lang->about_extra_vars_eid_value = '請輸入延伸變數名稱。( 只允許使用英文 + [ 英文,數字及底線 ] )'; + $lang->about_langcode = "想要實現多國語言功能,請按[語言代碼]按鈕。"; + $lang->about_file_extension= "只允許 %s 檔案。"; +?> diff --git a/modules/module/module.admin.controller.php b/modules/module/module.admin.controller.php index 076291a32..a4eadaa7a 100644 --- a/modules/module/module.admin.controller.php +++ b/modules/module/module.admin.controller.php @@ -1,485 +1,485 @@ -title = Context::get('title'); - $output = executeQuery('module.insertModuleCategory', $args); - if(!$output->toBool()) return $output; - - $this->setMessage("success_registed"); - } - - /** - * @brief 카테고리의 내용 수정 - **/ - function procModuleAdminUpdateCategory() { - $mode = Context::get('mode'); - - switch($mode) { - case 'delete' : - $output = $this->doDeleteModuleCategory(); - $msg_code = 'success_deleted'; - break; - case 'update' : - $output = $this->doUpdateModuleCategory(); - $msg_code = 'success_updated'; - break; - } - if(!$output->toBool()) return $output; - - $this->setMessage($msg_code); - } - - /** - * @brief 모듈 카테고리의 제목 변경 - **/ - function doUpdateModuleCategory() { - $args->title = Context::get('title'); - $args->module_category_srl = Context::get('module_category_srl'); - return executeQuery('module.updateModuleCategory', $args); - } - - /** - * @brief 모듈 카테고리 삭제 - **/ - function doDeleteModuleCategory() { - $args->module_category_srl = Context::get('module_category_srl'); - return executeQuery('module.deleteModuleCategory', $args); - } - - /** - * @brief 모듈 복사 - **/ - function procModuleAdminCopyModule() { - // 복사하려는 대상 모듈의 정보를 구함 - $module_srl = Context::get('module_srl'); - if(!$module_srl) return; - - // 새로 생성하려는 모듈들의 이름/브라우저 제목을 구함 - $clones = array(); - $args = Context::getAll(); - for($i=1;$i<=10;$i++) { - $mid = trim($args->{"mid_".$i}); - if(!$mid) continue; - if(!preg_match("/^[a-zA-Z]([a-zA-Z0-9_]*)$/i", $mid)) return new Object(-1, 'msg_limit_mid'); - $browser_title = $args->{"browser_title_".$i}; - if(!$mid) continue; - if($mid && !$browser_title) $browser_title = $mid; - $clones[$mid] = $browser_title; - } - if(!count($clones)) return; - - $oModuleModel = &getModel('module'); - $oModuleController = &getController('module'); - - // 모듈 정보 가져옴 - $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); - - // 권한 정보 가져옴 - $module_args->module_srl = $module_srl; - $output = executeQueryArray('module.getModuleGrants', $module_args); - $grant = array(); - if($output->data) { - foreach($output->data as $key => $val) $grant[$val->name][] = $val->group_srl; - } - - - $oDB = &DB::getInstance(); - $oDB->begin(); - - // 모듈 복사 - foreach($clones as $mid => $browser_title) { - $clone_args = null; - $clone_args = clone($module_info); - $clone_args->module_srl = null; - $clone_args->content = null; - $clone_args->mid = $mid; - $clone_args->browser_title = $browser_title; - $clone_args->is_default = 'N'; - - // 모듈 생성 - $output = $oModuleController->insertModule($clone_args); - $module_srl = $output->get('module_srl'); - - // 권한 정보 등록 - if(count($grant)) $oModuleController->insertModuleGrants($module_srl, $grant); - } - - $oDB->commit(); - $this->setMessage('success_registed'); - } - - /** - * @brief 모듈 권한 저장 - **/ - function procModuleAdminInsertGrant() { - $oModuleController = &getController('module'); - $oModuleModel = &getModel('module'); - - // 모듈 번호 구함 - $module_srl = Context::get('module_srl'); - - // 해당 모듈의 정보를 구함 - $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); - if(!$module_info) return new Object(-1,'msg_invalid_request'); - - // 관리자 아이디 등록 - $oModuleController->deleteAdminId($module_srl); - $admin_member = Context::get('admin_member'); - if($admin_member) { - $admin_members = explode(',',$admin_member); - for($i=0;$iinsertAdminId($module_srl, $admin_id); - - } - } - - // 권한 정리 - $xml_info = $oModuleModel->getModuleActionXML($module_info->module); - - $grant_list = $xml_info->grant; - - $grant_list->access->default = 'guest'; - $grant_list->manager->default = 'manager'; - - foreach($grant_list as $grant_name => $grant_info) { - // default값을 구함 - $default = Context::get($grant_name.'_default'); - - // -1 = 로그인 사용자만, -2 = 사이트 가입자만, 0 = 모든 사용자 - if(strlen($default)){ - $grant->{$grant_name}[] = $default; - continue; - - // 특정 그룹 사용자 - } else { - $group_srls = Context::get($grant_name); - if($group_srls) { - if(strpos($group_srls,'|@|')!==false) $group_srls = explode('|@|',$group_srls); - elseif(strpos($group_srls,',')!==false) $group_srls = explode(',',$group_srls); - else $group_srls = array($group_srls); - $grant->{$grant_name} = $group_srls; - } - continue; - } - $grant->{$group_srls} = array(); - } - - // DB에 저장 - $args->module_srl = $module_srl; - $output = executeQuery('module.deleteModuleGrants', $args); - if(!$output->toBool()) return $output; - - // DB에 권한 저장 - foreach($grant as $grant_name => $group_srls) { - foreach($group_srls as $key => $val) { - $args = null; - $args->module_srl = $module_srl; - $args->name = $grant_name; - $args->group_srl = $val; - $output = executeQuery('module.insertModuleGrant', $args); - if(!$output->toBool()) return $output; - } - } - $this->setMessage('success_registed'); - } - - /** - * @brief 스킨 정보 업데이트 - **/ - function procModuleAdminUpdateSkinInfo() { - // module_srl에 해당하는 정보들을 가져오기 - $module_srl = Context::get('module_srl'); - - $oModuleModel = &getModel('module'); - $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); - if($module_info->module_srl) { - $skin = $module_info->skin; - - // 스킨의 정보를 구해옴 (extra_vars를 체크하기 위해서) - $module_path = './modules/'.$module_info->module; - $skin_info = $oModuleModel->loadSkinInfo($module_path, $skin); - $skin_vars = $oModuleModel->getModuleSkinVars($module_srl); - // 입력받은 변수들을 체크 (mo, act, module_srl, page등 기본적인 변수들 없앰) - $obj = Context::getRequestVars(); - unset($obj->act); - unset($obj->module_srl); - unset($obj->page); - unset($obj->mid); - unset($obj->module); - - // 원 skin_info에서 extra_vars의 type이 image일 경우 별도 처리를 해줌 - if($skin_info->extra_vars) { - foreach($skin_info->extra_vars as $vars) { - if($vars->type!='image') continue; - - $image_obj = $obj->{$vars->name}; - - // 삭제 요청에 대한 변수를 구함 - $del_var = $obj->{"del_".$vars->name}; - unset($obj->{"del_".$vars->name}); - if($del_var == 'Y') { - FileHandler::removeFile($skin_vars[$vars->name]->value); - continue; - } - - // 업로드 되지 않았다면 이전 데이터를 그대로 사용 - if(!$image_obj['tmp_name']) { - $obj->{$vars->name} = $skin_vars[$vars->name]->value; - continue; - } - - // 정상적으로 업로드된 파일이 아니면 무시 - if(!is_uploaded_file($image_obj['tmp_name'])) { - unset($obj->{$vars->name}); - continue; - } - - // 이미지 파일이 아니어도 무시 - if(!preg_match("/\.(jpg|jpeg|gif|png)$/i", $image_obj['name'])) { - unset($obj->{$vars->name}); - continue; - } - - // 경로를 정해서 업로드 - $path = sprintf("./files/attach/images/%s/", $module_srl); - - // 디렉토리 생성 - if(!FileHandler::makeDir($path)) return false; - - $filename = $path.$image_obj['name']; - - // 파일 이동 - if(!move_uploaded_file($image_obj['tmp_name'], $filename)) { - unset($obj->{$vars->name}); - continue; - } - - // 정상 파일 업로드 - FileHandler::removeFile($skin_vars[$vars->name]->value); - // 변수를 바꿈 - unset($obj->{$vars->name}); - $obj->{$vars->name} = $filename; - } - } - // 해당 모듈의 전체 스킨 불러와서 이미지는 제거 - /* - if($skin_info->extra_vars) { - foreach($skin_info->extra_vars as $vars) { - if($vars->type!='image') continue; - $value = $skin_vars[$vars->name]; - if(file_exists($value)) @unlink($value); - } - } - */ - $oModuleController = &getController('module'); - $oModuleController->deleteModuleSkinVars($module_srl); - - // 등록 - $oModuleController->insertModuleSkinVars($module_srl, $obj); - } - - $this->setLayoutPath('./common/tpl'); - $this->setLayoutFile('default_layout.html'); - $this->setTemplatePath('./modules/module/tpl'); - $this->setTemplateFile("top_refresh.html"); - } - - /** - * @brief 모듈 일괄 정리 - **/ - function procModuleAdminModuleSetup() { - $vars = Context::getRequestVars(); - - if(!$vars->module_srls) return new Object(-1,'msg_invalid_request'); - - $module_srls = explode(',',$vars->module_srls); - if(!count($module_srls)) return new Object(-1,'msg_invalid_request'); - - $oModuleModel = &getModel('module'); - $oModuleController= &getController('module'); - foreach($module_srls as $module_srl) { - $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); - $module_info->module_category_srl = $vars->module_category_srl; - $module_info->layout_srl = $vars->layout_srl; - $module_info->skin = $vars->skin; - $module_info->description = $vars->description; - $module_info->header_text = $vars->header_text; - $module_info->footer_text = $vars->footer_text; - $oModuleController->updateModule($module_info); - } - - $this->setMessage('success_registed'); - } - - /** - * @brief 모듈 권한 일괄 정리 - **/ - function procModuleAdminModuleGrantSetup() { - $module_srls = Context::get('module_srls'); - if(!$module_srls) return new Object(-1,'msg_invalid_request'); - - $modules = explode(',',$module_srls); - if(!count($modules)) return new Object(-1,'msg_invalid_request'); - - $oModuleController = &getController('module'); - $oModuleModel = &getModel('module'); - - $module_info = $oModuleModel->getModuleInfoByModuleSrl($modules[0]); - $xml_info = $oModuleModel->getModuleActionXml($module_info->module); - $grant_list = $xml_info->grant; - - $grant_list->access->default = 'guest'; - $grant_list->manager->default = 'manager'; - - foreach($grant_list as $grant_name => $grant_info) { - // default값을 구함 - $default = Context::get($grant_name.'_default'); - - // -1 = 로그인 사용자만, 0 = 모든 사용자 - if(strlen($default)){ - $grant->{$grant_name}[] = $default; - continue; - - // 특정 그룹 사용자 - } else { - $group_srls = Context::get($grant_name); - if($group_srls) { - if(strpos($group_srls,'|@|')!==false) $group_srls = explode('|@|',$group_srls); - elseif(strpos($group_srls,',')!==false) $group_srls = explode(',',$group_srls); - else $group_srls = array($group_srls); - $grant->{$grant_name} = $group_srls; - } - continue; - } - $grant->{$group_srls} = array(); - } - - - // DB에 저장 - foreach($modules as $module_srl) { - $args = null; - $args->module_srl = $module_srl; - $output = executeQuery('module.deleteModuleGrants', $args); - if(!$output->toBool()) continue; - - // DB에 권한 저장 - foreach($grant as $grant_name => $group_srls) { - foreach($group_srls as $key => $val) { - $args = null; - $args->module_srl = $module_srl; - $args->name = $grant_name; - $args->group_srl = $val; - $output = executeQuery('module.insertModuleGrant', $args); - if(!$output->toBool()) return $output; - } - } - } - $this->setMessage('success_registed'); - } - - /** - * @brief 언어 추가/ 업데이트 - **/ - function procModuleAdminInsertLang() { - // 언어코드명 가져옴 - $site_module_info = Context::get('site_module_info'); - $args->site_srl = (int)$site_module_info->site_srl; - $args->name = str_replace(' ','_',Context::get('lang_code')); - if(!$args->name) return new Object(-1,'msg_invalid_request'); - - // 언어코드가 있는지 조사 - $output = executeQueryArray('module.getLang', $args); - if(!$output->toBool()) return $output; - - // 있으면 업데이트를 위해 기존 값들을 지움 - if($output->data) $output = executeQuery('module.deleteLang', $args); - if(!$output->toBool()) return $output; - - // 입력 - $lang_supported = Context::get('lang_supported'); - foreach($lang_supported as $key => $val) { - $args->lang_code = $key; - $args->value = trim(Context::get($key)); - if(!$args->value) { - $args->value = Context::get(strtolower($key)); - if(!$args->value) $args->value = $args->name; - } - $output = executeQuery('module.insertLang', $args); - if(!$output->toBool()) return $output; - } - $this->makeCacheDefinedLangCode($args->site_srl); - - $this->add('name', $args->name); - } - - /** - * @brief 언어 제거 - **/ - function procModuleAdminDeleteLang() { - // 언어코드명 가져옴 - $site_module_info = Context::get('site_module_info'); - $args->site_srl = (int)$site_module_info->site_srl; - $args->name = str_replace(' ','_',Context::get('name')); - if(!$args->name) return new Object(-1,'msg_invalid_request'); - - $output = executeQuery('module.deleteLang', $args); - if(!$output->toBool()) return $output; - $this->makeCacheDefinedLangCode($args->site_srl); - } - - /** - * @brief 사용자 정이 언어코드 파일 저장 - **/ - function makeCacheDefinedLangCode($site_srl = 0) { - // 현재 사이트의 언어파일 가져오기 - if(!$site_srl) { - $site_module_info = Context::get('site_module_info'); - $args->site_srl = (int)$site_module_info->site_srl; - } else { - $args->site_srl = $site_srl; - } - $output = executeQueryArray('module.getLang', $args); - if(!$output->toBool() || !$output->data) return; - - // 캐시 디렉토리 설정 - $cache_path = _XE_PATH_.'files/cache/lang_defined/'; - if(!is_dir($cache_path)) FileHandler::makeDir($cache_path); - - $lang_supported = Context::get('lang_supported'); - foreach($lang_supported as $key => $val) { - $fp[$key] = fopen( sprintf('%s/%d.%s.php', $cache_path, $args->site_srl, $key), 'w' ); - if(!$fp[$key]) return; - fwrite($fp[$key],"data as $key => $val) { - if($fp[$val->lang_code]) fwrite($fp[$val->lang_code], sprintf('$lang["%s"] = "%s";'."\r\n", $val->name, str_replace('"','\\"',$val->value))); - } - - foreach($lang_supported as $key => $val) { - if(!$fp[$key]) continue; - fwrite($fp[$key],"?>"); - fclose($fp[$key]); - } - } - - } -?> +title = Context::get('title'); + $output = executeQuery('module.insertModuleCategory', $args); + if(!$output->toBool()) return $output; + + $this->setMessage("success_registed"); + } + + /** + * @brief 카테고리의 내용 수정 + **/ + function procModuleAdminUpdateCategory() { + $mode = Context::get('mode'); + + switch($mode) { + case 'delete' : + $output = $this->doDeleteModuleCategory(); + $msg_code = 'success_deleted'; + break; + case 'update' : + $output = $this->doUpdateModuleCategory(); + $msg_code = 'success_updated'; + break; + } + if(!$output->toBool()) return $output; + + $this->setMessage($msg_code); + } + + /** + * @brief 모듈 카테고리의 제목 변경 + **/ + function doUpdateModuleCategory() { + $args->title = Context::get('title'); + $args->module_category_srl = Context::get('module_category_srl'); + return executeQuery('module.updateModuleCategory', $args); + } + + /** + * @brief 모듈 카테고리 삭제 + **/ + function doDeleteModuleCategory() { + $args->module_category_srl = Context::get('module_category_srl'); + return executeQuery('module.deleteModuleCategory', $args); + } + + /** + * @brief 모듈 복사 + **/ + function procModuleAdminCopyModule() { + // 복사하려는 대상 모듈의 정보를 구함 + $module_srl = Context::get('module_srl'); + if(!$module_srl) return; + + // 새로 생성하려는 모듈들의 이름/브라우저 제목을 구함 + $clones = array(); + $args = Context::getAll(); + for($i=1;$i<=10;$i++) { + $mid = trim($args->{"mid_".$i}); + if(!$mid) continue; + if(!preg_match("/^[a-zA-Z]([a-zA-Z0-9_]*)$/i", $mid)) return new Object(-1, 'msg_limit_mid'); + $browser_title = $args->{"browser_title_".$i}; + if(!$mid) continue; + if($mid && !$browser_title) $browser_title = $mid; + $clones[$mid] = $browser_title; + } + if(!count($clones)) return; + + $oModuleModel = &getModel('module'); + $oModuleController = &getController('module'); + + // 모듈 정보 가져옴 + $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); + + // 권한 정보 가져옴 + $module_args->module_srl = $module_srl; + $output = executeQueryArray('module.getModuleGrants', $module_args); + $grant = array(); + if($output->data) { + foreach($output->data as $key => $val) $grant[$val->name][] = $val->group_srl; + } + + + $oDB = &DB::getInstance(); + $oDB->begin(); + + // 모듈 복사 + foreach($clones as $mid => $browser_title) { + $clone_args = null; + $clone_args = clone($module_info); + $clone_args->module_srl = null; + $clone_args->content = null; + $clone_args->mid = $mid; + $clone_args->browser_title = $browser_title; + $clone_args->is_default = 'N'; + + // 모듈 생성 + $output = $oModuleController->insertModule($clone_args); + $module_srl = $output->get('module_srl'); + + // 권한 정보 등록 + if(count($grant)) $oModuleController->insertModuleGrants($module_srl, $grant); + } + + $oDB->commit(); + $this->setMessage('success_registed'); + } + + /** + * @brief 모듈 권한 저장 + **/ + function procModuleAdminInsertGrant() { + $oModuleController = &getController('module'); + $oModuleModel = &getModel('module'); + + // 모듈 번호 구함 + $module_srl = Context::get('module_srl'); + + // 해당 모듈의 정보를 구함 + $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); + if(!$module_info) return new Object(-1,'msg_invalid_request'); + + // 관리자 아이디 등록 + $oModuleController->deleteAdminId($module_srl); + $admin_member = Context::get('admin_member'); + if($admin_member) { + $admin_members = explode(',',$admin_member); + for($i=0;$iinsertAdminId($module_srl, $admin_id); + + } + } + + // 권한 정리 + $xml_info = $oModuleModel->getModuleActionXML($module_info->module); + + $grant_list = $xml_info->grant; + + $grant_list->access->default = 'guest'; + $grant_list->manager->default = 'manager'; + + foreach($grant_list as $grant_name => $grant_info) { + // default값을 구함 + $default = Context::get($grant_name.'_default'); + + // -1 = 로그인 사용자만, -2 = 사이트 가입자만, 0 = 모든 사용자 + if(strlen($default)){ + $grant->{$grant_name}[] = $default; + continue; + + // 특정 그룹 사용자 + } else { + $group_srls = Context::get($grant_name); + if($group_srls) { + if(strpos($group_srls,'|@|')!==false) $group_srls = explode('|@|',$group_srls); + elseif(strpos($group_srls,',')!==false) $group_srls = explode(',',$group_srls); + else $group_srls = array($group_srls); + $grant->{$grant_name} = $group_srls; + } + continue; + } + $grant->{$group_srls} = array(); + } + + // DB에 저장 + $args->module_srl = $module_srl; + $output = executeQuery('module.deleteModuleGrants', $args); + if(!$output->toBool()) return $output; + + // DB에 권한 저장 + foreach($grant as $grant_name => $group_srls) { + foreach($group_srls as $key => $val) { + $args = null; + $args->module_srl = $module_srl; + $args->name = $grant_name; + $args->group_srl = $val; + $output = executeQuery('module.insertModuleGrant', $args); + if(!$output->toBool()) return $output; + } + } + $this->setMessage('success_registed'); + } + + /** + * @brief 스킨 정보 업데이트 + **/ + function procModuleAdminUpdateSkinInfo() { + // module_srl에 해당하는 정보들을 가져오기 + $module_srl = Context::get('module_srl'); + + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); + if($module_info->module_srl) { + $skin = $module_info->skin; + + // 스킨의 정보를 구해옴 (extra_vars를 체크하기 위해서) + $module_path = './modules/'.$module_info->module; + $skin_info = $oModuleModel->loadSkinInfo($module_path, $skin); + $skin_vars = $oModuleModel->getModuleSkinVars($module_srl); + // 입력받은 변수들을 체크 (mo, act, module_srl, page등 기본적인 변수들 없앰) + $obj = Context::getRequestVars(); + unset($obj->act); + unset($obj->module_srl); + unset($obj->page); + unset($obj->mid); + unset($obj->module); + + // 원 skin_info에서 extra_vars의 type이 image일 경우 별도 처리를 해줌 + if($skin_info->extra_vars) { + foreach($skin_info->extra_vars as $vars) { + if($vars->type!='image') continue; + + $image_obj = $obj->{$vars->name}; + + // 삭제 요청에 대한 변수를 구함 + $del_var = $obj->{"del_".$vars->name}; + unset($obj->{"del_".$vars->name}); + if($del_var == 'Y') { + FileHandler::removeFile($skin_vars[$vars->name]->value); + continue; + } + + // 업로드 되지 않았다면 이전 데이터를 그대로 사용 + if(!$image_obj['tmp_name']) { + $obj->{$vars->name} = $skin_vars[$vars->name]->value; + continue; + } + + // 정상적으로 업로드된 파일이 아니면 무시 + if(!is_uploaded_file($image_obj['tmp_name'])) { + unset($obj->{$vars->name}); + continue; + } + + // 이미지 파일이 아니어도 무시 + if(!preg_match("/\.(jpg|jpeg|gif|png)$/i", $image_obj['name'])) { + unset($obj->{$vars->name}); + continue; + } + + // 경로를 정해서 업로드 + $path = sprintf("./files/attach/images/%s/", $module_srl); + + // 디렉토리 생성 + if(!FileHandler::makeDir($path)) return false; + + $filename = $path.$image_obj['name']; + + // 파일 이동 + if(!move_uploaded_file($image_obj['tmp_name'], $filename)) { + unset($obj->{$vars->name}); + continue; + } + + // 정상 파일 업로드 + FileHandler::removeFile($skin_vars[$vars->name]->value); + // 변수를 바꿈 + unset($obj->{$vars->name}); + $obj->{$vars->name} = $filename; + } + } + // 해당 모듈의 전체 스킨 불러와서 이미지는 제거 + /* + if($skin_info->extra_vars) { + foreach($skin_info->extra_vars as $vars) { + if($vars->type!='image') continue; + $value = $skin_vars[$vars->name]; + if(file_exists($value)) @unlink($value); + } + } + */ + $oModuleController = &getController('module'); + $oModuleController->deleteModuleSkinVars($module_srl); + + // 등록 + $oModuleController->insertModuleSkinVars($module_srl, $obj); + } + + $this->setLayoutPath('./common/tpl'); + $this->setLayoutFile('default_layout.html'); + $this->setTemplatePath('./modules/module/tpl'); + $this->setTemplateFile("top_refresh.html"); + } + + /** + * @brief 모듈 일괄 정리 + **/ + function procModuleAdminModuleSetup() { + $vars = Context::getRequestVars(); + + if(!$vars->module_srls) return new Object(-1,'msg_invalid_request'); + + $module_srls = explode(',',$vars->module_srls); + if(!count($module_srls)) return new Object(-1,'msg_invalid_request'); + + $oModuleModel = &getModel('module'); + $oModuleController= &getController('module'); + foreach($module_srls as $module_srl) { + $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); + $module_info->module_category_srl = $vars->module_category_srl; + $module_info->layout_srl = $vars->layout_srl; + $module_info->skin = $vars->skin; + $module_info->description = $vars->description; + $module_info->header_text = $vars->header_text; + $module_info->footer_text = $vars->footer_text; + $oModuleController->updateModule($module_info); + } + + $this->setMessage('success_registed'); + } + + /** + * @brief 모듈 권한 일괄 정리 + **/ + function procModuleAdminModuleGrantSetup() { + $module_srls = Context::get('module_srls'); + if(!$module_srls) return new Object(-1,'msg_invalid_request'); + + $modules = explode(',',$module_srls); + if(!count($modules)) return new Object(-1,'msg_invalid_request'); + + $oModuleController = &getController('module'); + $oModuleModel = &getModel('module'); + + $module_info = $oModuleModel->getModuleInfoByModuleSrl($modules[0]); + $xml_info = $oModuleModel->getModuleActionXml($module_info->module); + $grant_list = $xml_info->grant; + + $grant_list->access->default = 'guest'; + $grant_list->manager->default = 'manager'; + + foreach($grant_list as $grant_name => $grant_info) { + // default값을 구함 + $default = Context::get($grant_name.'_default'); + + // -1 = 로그인 사용자만, 0 = 모든 사용자 + if(strlen($default)){ + $grant->{$grant_name}[] = $default; + continue; + + // 특정 그룹 사용자 + } else { + $group_srls = Context::get($grant_name); + if($group_srls) { + if(strpos($group_srls,'|@|')!==false) $group_srls = explode('|@|',$group_srls); + elseif(strpos($group_srls,',')!==false) $group_srls = explode(',',$group_srls); + else $group_srls = array($group_srls); + $grant->{$grant_name} = $group_srls; + } + continue; + } + $grant->{$group_srls} = array(); + } + + + // DB에 저장 + foreach($modules as $module_srl) { + $args = null; + $args->module_srl = $module_srl; + $output = executeQuery('module.deleteModuleGrants', $args); + if(!$output->toBool()) continue; + + // DB에 권한 저장 + foreach($grant as $grant_name => $group_srls) { + foreach($group_srls as $key => $val) { + $args = null; + $args->module_srl = $module_srl; + $args->name = $grant_name; + $args->group_srl = $val; + $output = executeQuery('module.insertModuleGrant', $args); + if(!$output->toBool()) return $output; + } + } + } + $this->setMessage('success_registed'); + } + + /** + * @brief 언어 추가/ 업데이트 + **/ + function procModuleAdminInsertLang() { + // 언어코드명 가져옴 + $site_module_info = Context::get('site_module_info'); + $args->site_srl = (int)$site_module_info->site_srl; + $args->name = str_replace(' ','_',Context::get('lang_code')); + if(!$args->name) return new Object(-1,'msg_invalid_request'); + + // 언어코드가 있는지 조사 + $output = executeQueryArray('module.getLang', $args); + if(!$output->toBool()) return $output; + + // 있으면 업데이트를 위해 기존 값들을 지움 + if($output->data) $output = executeQuery('module.deleteLang', $args); + if(!$output->toBool()) return $output; + + // 입력 + $lang_supported = Context::get('lang_supported'); + foreach($lang_supported as $key => $val) { + $args->lang_code = $key; + $args->value = trim(Context::get($key)); + if(!$args->value) { + $args->value = Context::get(strtolower($key)); + if(!$args->value) $args->value = $args->name; + } + $output = executeQuery('module.insertLang', $args); + if(!$output->toBool()) return $output; + } + $this->makeCacheDefinedLangCode($args->site_srl); + + $this->add('name', $args->name); + } + + /** + * @brief 언어 제거 + **/ + function procModuleAdminDeleteLang() { + // 언어코드명 가져옴 + $site_module_info = Context::get('site_module_info'); + $args->site_srl = (int)$site_module_info->site_srl; + $args->name = str_replace(' ','_',Context::get('name')); + if(!$args->name) return new Object(-1,'msg_invalid_request'); + + $output = executeQuery('module.deleteLang', $args); + if(!$output->toBool()) return $output; + $this->makeCacheDefinedLangCode($args->site_srl); + } + + /** + * @brief 사용자 정이 언어코드 파일 저장 + **/ + function makeCacheDefinedLangCode($site_srl = 0) { + // 현재 사이트의 언어파일 가져오기 + if(!$site_srl) { + $site_module_info = Context::get('site_module_info'); + $args->site_srl = (int)$site_module_info->site_srl; + } else { + $args->site_srl = $site_srl; + } + $output = executeQueryArray('module.getLang', $args); + if(!$output->toBool() || !$output->data) return; + + // 캐시 디렉토리 설정 + $cache_path = _XE_PATH_.'files/cache/lang_defined/'; + if(!is_dir($cache_path)) FileHandler::makeDir($cache_path); + + $lang_supported = Context::get('lang_supported'); + foreach($lang_supported as $key => $val) { + $fp[$key] = fopen( sprintf('%s/%d.%s.php', $cache_path, $args->site_srl, $key), 'w' ); + if(!$fp[$key]) return; + fwrite($fp[$key],"data as $key => $val) { + if($fp[$val->lang_code]) fwrite($fp[$val->lang_code], sprintf('$lang["%s"] = "%s";'."\r\n", $val->name, str_replace('"','\\"',$val->value))); + } + + foreach($lang_supported as $key => $val) { + if(!$fp[$key]) continue; + fwrite($fp[$key],"?>"); + fclose($fp[$key]); + } + } + + } +?> diff --git a/modules/module/module.admin.model.php b/modules/module/module.admin.model.php index a4b640b43..12faafa23 100644 --- a/modules/module/module.admin.model.php +++ b/modules/module/module.admin.model.php @@ -1,190 +1,190 @@ -module_srls = Context::get('module_srls'); - $output = executeQueryArray('module.getModulesInfo', $args); - if(!$output->toBool() || !$output->data) return new Object(); - - foreach($output->data as $key => $val) { - $list[$val->module_srl] = array('module_srl'=>$val->module_srl,'mid'=>$val->mid,'browser_title'=>$val->browser_title); - } - $modules = explode(',',$args->module_srls); - for($i=0;$iadd('id', Context::get('id')); - $this->add('module_list', $module_list); - } - - function getModuleMidList($args){ - $args->list_count = 20; - $args->page_count = 10; - $output = executeQueryArray('module.getModuleMidList', $args); - if(!$output->toBool()) return $output; - - ModuleModel::syncModuleToSite($output->data); - - return $output; - } - - /** - * @brief 공통 :: 모듈의 모듈 권한 출력 페이지 - * 모듈의 모듈 권한 출력은 모든 모듈에서 module instance를 이용할때 사용할 수 있음 - **/ - function getModuleGrantHTML($module_srl, $source_grant_list) { - - $oModuleModel = &getModel('module'); - $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); - - // access, manager 권한은 가상 권한으로 설정 - $grant_list->access->title = Context::getLang('grant_access'); - $grant_list->access->default = 'guest'; - if(count($source_grant_list)) { - foreach($source_grant_list as $key => $val) { - if(!$val->default) $val->default = 'guest'; - if($val->default == 'root') $val->default = 'manager'; - $grant_list->{$key} = $val; - } - } - $grant_list->manager->title = Context::getLang('grant_manager'); - $grant_list->manager->default = 'manager'; - Context::set('grant_list', $grant_list); - - // 현재 모듈에 설정된 권한 그룹을 가져옴 - $default_grant = array(); - $args->module_srl = $module_srl; - $output = executeQueryArray('module.getModuleGrants', $args); - if($output->data) { - foreach($output->data as $val) { - if($val->group_srl == 0) $default_grant[$val->name] = 'all'; - else if($val->group_srl == -1) $default_grant[$val->name] = 'member'; - else if($val->group_srl == -2) $default_grant[$val->name] = 'site'; - else { - $selected_group[$val->name][] = $val->group_srl; - $default_grant[$val->name] = 'group'; - } - } - } - Context::set('selected_group', $selected_group); - Context::set('default_grant', $default_grant); - Context::set('module_srl', $module_srl); - // 현재 모듈에 설정된 관리자 아이디를 추출 - $admin_member = $oModuleModel->getAdminId($module_srl); - Context::set('admin_member', $admin_member); - - // 그룹을 가져옴 - $oMemberModel = &getModel('member'); - $group_list = $oMemberModel->getGroups($module_info->site_srl); - Context::set('group_list', $group_list); - - // grant 정보를 추출 - $oTemplate = &TemplateHandler::getInstance(); - return $oTemplate->compile($this->module_path.'tpl', 'module_grants'); - } - - /** - * @brief 공통 :: 모듈의 스킨 설정 출력 페이지 - **/ - function getModuleSkinHTML($module_srl) { - $oModuleModel = &getModel('module'); - $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); - if(!$module_info) return; - - $skin = $module_info->skin; - $module_path = './modules/'.$module_info->module; - - // 스킨의 XML 정보를 구함 - $skin_info = $oModuleModel->loadSkinInfo($module_path, $skin); - - // DB에 설정된 스킨 정보를 구함 - $skin_vars = $oModuleModel->getModuleSkinVars($module_srl); - - if(count($skin_info->extra_vars)) { - foreach($skin_info->extra_vars as $key => $val) { - $group = $val->group; - $name = $val->name; - $type = $val->type; - if($skin_vars[$name]) $value = $skin_vars[$name]->value; - else $value = ''; - if($type=="checkbox") $value = $value?unserialize($value):array(); - - $skin_info->extra_vars[$key]->value= $value; - } - } - - Context::set('module_info', $module_info); - Context::set('mid', $module_info->mid); - Context::set('skin_info', $skin_info); - Context::set('skin_vars', $skin_vars); - - $oTemplate = &TemplateHandler::getInstance(); - return $oTemplate->compile($this->module_path.'tpl', 'skin_config'); - } - - /** - * @brief 특정 언어 코드에 대한 값들을 가져오기 - * lang_code를 직접 기입하면 해당 언어코드에 대해서만 가져오고 값이 없으면 $name을 그대로 return - **/ - function getLangCode($site_srl, $name) { - $lang_supported = Context::get('lang_supported'); - - if(substr($name,0,12)=='$user_lang->') { - $args->site_srl = (int)$site_srl; - $args->name = substr($name,12); - $output = executeQueryArray('module.getLang', $args); - if($output->data) { - foreach($output->data as $key => $val) { - $selected_lang[$val->lang_code] = $val->value; - } - } - } else { - $tmp = unserialize($name); - if($tmp) { - $selected_lang = array(); - $rand_name = $tmp[Context::getLangType()]; - if(!$rand_name) $rand_name = array_shift($tmp); - foreach($lang_supported as $key => $val) { - $selected_lang[$key] = $tmp[$key]?$tmp[$key]:$rand_name; - } - } - } - - $output = array(); - foreach($lang_supported as $key => $val) { - $output[$key] = $selected_lang[$key]?$selected_lang[$key]:$name; - } - return $output; - } - - /** - * @brief 모듈 언어를 ajax로 요청시 return - **/ - function getModuleAdminLangCode() { - $name = Context::get('name'); - if(!$name) return new Object(-1,'msg_invalid_request'); - $site_module_info = Context::get('site_module_info'); - $this->add('name', $name); - $output = $this->getLangCode($site_module_info->site_srl, '$user_lang->'.$name); - $this->add('langs', $output); - } - } -?> +module_srls = Context::get('module_srls'); + $output = executeQueryArray('module.getModulesInfo', $args); + if(!$output->toBool() || !$output->data) return new Object(); + + foreach($output->data as $key => $val) { + $list[$val->module_srl] = array('module_srl'=>$val->module_srl,'mid'=>$val->mid,'browser_title'=>$val->browser_title); + } + $modules = explode(',',$args->module_srls); + for($i=0;$iadd('id', Context::get('id')); + $this->add('module_list', $module_list); + } + + function getModuleMidList($args){ + $args->list_count = 20; + $args->page_count = 10; + $output = executeQueryArray('module.getModuleMidList', $args); + if(!$output->toBool()) return $output; + + ModuleModel::syncModuleToSite($output->data); + + return $output; + } + + /** + * @brief 공통 :: 모듈의 모듈 권한 출력 페이지 + * 모듈의 모듈 권한 출력은 모든 모듈에서 module instance를 이용할때 사용할 수 있음 + **/ + function getModuleGrantHTML($module_srl, $source_grant_list) { + + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); + + // access, manager 권한은 가상 권한으로 설정 + $grant_list->access->title = Context::getLang('grant_access'); + $grant_list->access->default = 'guest'; + if(count($source_grant_list)) { + foreach($source_grant_list as $key => $val) { + if(!$val->default) $val->default = 'guest'; + if($val->default == 'root') $val->default = 'manager'; + $grant_list->{$key} = $val; + } + } + $grant_list->manager->title = Context::getLang('grant_manager'); + $grant_list->manager->default = 'manager'; + Context::set('grant_list', $grant_list); + + // 현재 모듈에 설정된 권한 그룹을 가져옴 + $default_grant = array(); + $args->module_srl = $module_srl; + $output = executeQueryArray('module.getModuleGrants', $args); + if($output->data) { + foreach($output->data as $val) { + if($val->group_srl == 0) $default_grant[$val->name] = 'all'; + else if($val->group_srl == -1) $default_grant[$val->name] = 'member'; + else if($val->group_srl == -2) $default_grant[$val->name] = 'site'; + else { + $selected_group[$val->name][] = $val->group_srl; + $default_grant[$val->name] = 'group'; + } + } + } + Context::set('selected_group', $selected_group); + Context::set('default_grant', $default_grant); + Context::set('module_srl', $module_srl); + // 현재 모듈에 설정된 관리자 아이디를 추출 + $admin_member = $oModuleModel->getAdminId($module_srl); + Context::set('admin_member', $admin_member); + + // 그룹을 가져옴 + $oMemberModel = &getModel('member'); + $group_list = $oMemberModel->getGroups($module_info->site_srl); + Context::set('group_list', $group_list); + + // grant 정보를 추출 + $oTemplate = &TemplateHandler::getInstance(); + return $oTemplate->compile($this->module_path.'tpl', 'module_grants'); + } + + /** + * @brief 공통 :: 모듈의 스킨 설정 출력 페이지 + **/ + function getModuleSkinHTML($module_srl) { + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); + if(!$module_info) return; + + $skin = $module_info->skin; + $module_path = './modules/'.$module_info->module; + + // 스킨의 XML 정보를 구함 + $skin_info = $oModuleModel->loadSkinInfo($module_path, $skin); + + // DB에 설정된 스킨 정보를 구함 + $skin_vars = $oModuleModel->getModuleSkinVars($module_srl); + + if(count($skin_info->extra_vars)) { + foreach($skin_info->extra_vars as $key => $val) { + $group = $val->group; + $name = $val->name; + $type = $val->type; + if($skin_vars[$name]) $value = $skin_vars[$name]->value; + else $value = ''; + if($type=="checkbox") $value = $value?unserialize($value):array(); + + $skin_info->extra_vars[$key]->value= $value; + } + } + + Context::set('module_info', $module_info); + Context::set('mid', $module_info->mid); + Context::set('skin_info', $skin_info); + Context::set('skin_vars', $skin_vars); + + $oTemplate = &TemplateHandler::getInstance(); + return $oTemplate->compile($this->module_path.'tpl', 'skin_config'); + } + + /** + * @brief 특정 언어 코드에 대한 값들을 가져오기 + * lang_code를 직접 기입하면 해당 언어코드에 대해서만 가져오고 값이 없으면 $name을 그대로 return + **/ + function getLangCode($site_srl, $name) { + $lang_supported = Context::get('lang_supported'); + + if(substr($name,0,12)=='$user_lang->') { + $args->site_srl = (int)$site_srl; + $args->name = substr($name,12); + $output = executeQueryArray('module.getLang', $args); + if($output->data) { + foreach($output->data as $key => $val) { + $selected_lang[$val->lang_code] = $val->value; + } + } + } else { + $tmp = unserialize($name); + if($tmp) { + $selected_lang = array(); + $rand_name = $tmp[Context::getLangType()]; + if(!$rand_name) $rand_name = array_shift($tmp); + foreach($lang_supported as $key => $val) { + $selected_lang[$key] = $tmp[$key]?$tmp[$key]:$rand_name; + } + } + } + + $output = array(); + foreach($lang_supported as $key => $val) { + $output[$key] = $selected_lang[$key]?$selected_lang[$key]:$name; + } + return $output; + } + + /** + * @brief 모듈 언어를 ajax로 요청시 return + **/ + function getModuleAdminLangCode() { + $name = Context::get('name'); + if(!$name) return new Object(-1,'msg_invalid_request'); + $site_module_info = Context::get('site_module_info'); + $this->add('name', $name); + $output = $this->getLangCode($site_module_info->site_srl, '$user_lang->'.$name); + $this->add('langs', $output); + } + } +?> diff --git a/modules/module/module.admin.view.php b/modules/module/module.admin.view.php index ae7615173..c4445c659 100644 --- a/modules/module/module.admin.view.php +++ b/modules/module/module.admin.view.php @@ -1,224 +1,224 @@ -setTemplatePath($this->module_path.'tpl'); - } - - /** - * @brief 모듈 관리자 페이지 - **/ - function dispModuleAdminContent() { - $this->dispModuleAdminList(); - } - - /** - * @brief 모듈 목록 출력 - **/ - function dispModuleAdminList() { - // 모듈 목록을 구해서 - $oModuleModel = &getModel('module'); - $module_list = $oModuleModel->getModuleList(); - Context::set('module_list', $module_list); - - // 템플릿 파일 지정 - $this->setTemplateFile('module_list'); - } - - /** - * @brief 모듈의 상세 정보(conf/info.xml)를 팝업 출력 - **/ - function dispModuleAdminInfo() { - // 모듈 목록을 구해서 - $oModuleModel = &getModel('module'); - $module_info = $oModuleModel->getModuleInfoXml(Context::get('selected_module')); - Context::set('module_info', $module_info); - - // 레이아웃을 팝업으로 지정 - $this->setLayoutFile('popup_layout'); - - // 템플릿 파일 지정 - $this->setTemplateFile('module_info'); - } - - /** - * @brief 모듈 카테고리 목록 - **/ - function dispModuleAdminCategory() { - $module_category_srl = Context::get('module_category_srl'); - - // 모듈 목록을 구해서 - $oModuleModel = &getModel('module'); - - // 선택된 카테고리가 있으면 해당 카테고리의 정보 수정 페이지로 - if($module_category_srl) { - $selected_category = $oModuleModel->getModuleCategory($module_category_srl); - Context::set('selected_category', $selected_category); - - // 템플릿 파일 지정 - $this->setTemplateFile('category_update_form'); - - // 아니면 전체 목록 - } else { - $category_list = $oModuleModel->getModuleCategories(); - Context::set('category_list', $category_list); - - // 템플릿 파일 지정 - $this->setTemplateFile('category_list'); - } - } - - /** - * @brief 모듈 복사 기능 - **/ - function dispModuleAdminCopyModule() { - // 복사하려는 대상 모듈을 구함 - $module_srl = Context::get('module_srl'); - - // 해당 모듈의 정보를 구함 - $oModuleModel = &getModel('module'); - $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); - Context::set('module_info', $module_info); - - // 레이아웃을 팝업으로 지정 - $this->setLayoutFile('popup_layout'); - - // 템플릿 파일 지정 - $this->setTemplateFile('copy_module'); - } - - /** - * @brief 모듈 기본 설정 일괄 적용 - **/ - function dispModuleAdminModuleSetup() { - $module_srls = Context::get('module_srls'); - - $modules = explode(',',$module_srls); - if(!count($modules)) if(!$module_srls) return new Object(-1,'msg_invalid_request'); - - $oModuleModel = &getModel('module'); - $module_info = $oModuleModel->getModuleInfoByModuleSrl($modules[0]); - - // 모듈의 스킨 목록을 구함 - $skin_list = $oModuleModel->getSkins('./modules/'.$module_info->module); - Context::set('skin_list',$skin_list); - - // 레이아웃 목록을 구해옴 - $oLayoutMode = &getModel('layout'); - $layout_list = $oLayoutMode->getLayoutList(); - Context::set('layout_list', $layout_list); - - // 모듈 카테고리 목록을 구함 - $module_category = $oModuleModel->getModuleCategories(); - Context::set('module_category', $module_category); - - // 레이아웃을 팝업으로 지정 - $this->setLayoutFile('popup_layout'); - - // 템플릿 파일 지정 - $this->setTemplateFile('module_setup'); - } - - /** - * @brief 모듈 추가 설정 일괄 적용 - **/ - function dispModuleAdminModuleAdditionSetup() { - $module_srls = Context::get('module_srls'); - - $modules = explode(',',$module_srls); - if(!count($modules)) if(!$module_srls) return new Object(-1,'msg_invalid_request'); - - // content는 다른 모듈에서 call by reference로 받아오기에 미리 변수 선언만 해 놓음 - $content = ''; - - // 추가 설정을 위한 트리거 호출 - // 게시판 모듈이지만 차후 다른 모듈에서의 사용도 고려하여 trigger 이름을 공용으로 사용할 수 있도록 하였음 - $output = ModuleHandler::triggerCall('module.dispAdditionSetup', 'before', $content); - $output = ModuleHandler::triggerCall('module.dispAdditionSetup', 'after', $content); - Context::set('setup_content', $content); - - // 레이아웃을 팝업으로 지정 - $this->setLayoutFile('popup_layout'); - - // 템플릿 파일 지정 - $this->setTemplateFile('module_addition_setup'); - } - - /** - * @brief 모듈 권한 설정 일괄 적용 - **/ - function dispModuleAdminModuleGrantSetup() { - $module_srls = Context::get('module_srls'); - - $modules = explode(',',$module_srls); - if(!count($modules)) if(!$module_srls) return new Object(-1,'msg_invalid_request'); - - $oModuleModel = &getModel('module'); - $module_info = $oModuleModel->getModuleInfoByModuleSrl($modules[0]); - $xml_info = $oModuleModel->getModuleActionXml($module_info->module); - $source_grant_list = $xml_info->grant; - - // access, manager 권한은 가상 권한으로 설정 - $grant_list->access->title = Context::getLang('grant_access'); - $grant_list->access->default = 'guest'; - if(count($source_grant_list)) { - foreach($source_grant_list as $key => $val) { - if(!$val->default) $val->default = 'guest'; - if($val->default == 'root') $val->default = 'manager'; - $grant_list->{$key} = $val; - } - } - $grant_list->manager->title = Context::getLang('grant_manager'); - $grant_list->manager->default = 'manager'; - Context::set('grant_list', $grant_list); - - // 그룹을 가져옴 - $oMemberModel = &getModel('member'); - $group_list = $oMemberModel->getGroups($module_info->site_srl); - Context::set('group_list', $group_list); - - // 레이아웃을 팝업으로 지정 - $this->setLayoutFile('popup_layout'); - - // 템플릿 파일 지정 - $this->setTemplateFile('module_grant_setup'); - } - - /** - * @brief 언어 코드 - **/ - function dispModuleAdminLangcode() { - // 현재 사이트의 언어파일 가져오기 - $site_module_info = Context::get('site_module_info'); - $args->site_srl = (int)$site_module_info->site_srl; - $args->sort_index = 'name'; - $args->order_type = 'asc'; - $output = executeQueryArray('module.getLangList', $args); - Context::set('lang_list', $output->data); - - // 현재 선택된 언어 가져오기 - $name = Context::get('name'); - if($name) { - $oModuleAdminModel = &getAdminModel('module'); - Context::set('selected_lang', $oModuleAdminModel->getLangCode($args->site_srl,'$user_lang->'.$name)); - } - - // 레이아웃을 팝업으로 지정 - $this->setLayoutFile('popup_layout'); - - // 템플릿 파일 지정 - $this->setTemplateFile('module_langcode'); - } - - } -?> +setTemplatePath($this->module_path.'tpl'); + } + + /** + * @brief 모듈 관리자 페이지 + **/ + function dispModuleAdminContent() { + $this->dispModuleAdminList(); + } + + /** + * @brief 모듈 목록 출력 + **/ + function dispModuleAdminList() { + // 모듈 목록을 구해서 + $oModuleModel = &getModel('module'); + $module_list = $oModuleModel->getModuleList(); + Context::set('module_list', $module_list); + + // 템플릿 파일 지정 + $this->setTemplateFile('module_list'); + } + + /** + * @brief 모듈의 상세 정보(conf/info.xml)를 팝업 출력 + **/ + function dispModuleAdminInfo() { + // 모듈 목록을 구해서 + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoXml(Context::get('selected_module')); + Context::set('module_info', $module_info); + + // 레이아웃을 팝업으로 지정 + $this->setLayoutFile('popup_layout'); + + // 템플릿 파일 지정 + $this->setTemplateFile('module_info'); + } + + /** + * @brief 모듈 카테고리 목록 + **/ + function dispModuleAdminCategory() { + $module_category_srl = Context::get('module_category_srl'); + + // 모듈 목록을 구해서 + $oModuleModel = &getModel('module'); + + // 선택된 카테고리가 있으면 해당 카테고리의 정보 수정 페이지로 + if($module_category_srl) { + $selected_category = $oModuleModel->getModuleCategory($module_category_srl); + Context::set('selected_category', $selected_category); + + // 템플릿 파일 지정 + $this->setTemplateFile('category_update_form'); + + // 아니면 전체 목록 + } else { + $category_list = $oModuleModel->getModuleCategories(); + Context::set('category_list', $category_list); + + // 템플릿 파일 지정 + $this->setTemplateFile('category_list'); + } + } + + /** + * @brief 모듈 복사 기능 + **/ + function dispModuleAdminCopyModule() { + // 복사하려는 대상 모듈을 구함 + $module_srl = Context::get('module_srl'); + + // 해당 모듈의 정보를 구함 + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); + Context::set('module_info', $module_info); + + // 레이아웃을 팝업으로 지정 + $this->setLayoutFile('popup_layout'); + + // 템플릿 파일 지정 + $this->setTemplateFile('copy_module'); + } + + /** + * @brief 모듈 기본 설정 일괄 적용 + **/ + function dispModuleAdminModuleSetup() { + $module_srls = Context::get('module_srls'); + + $modules = explode(',',$module_srls); + if(!count($modules)) if(!$module_srls) return new Object(-1,'msg_invalid_request'); + + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoByModuleSrl($modules[0]); + + // 모듈의 스킨 목록을 구함 + $skin_list = $oModuleModel->getSkins('./modules/'.$module_info->module); + Context::set('skin_list',$skin_list); + + // 레이아웃 목록을 구해옴 + $oLayoutMode = &getModel('layout'); + $layout_list = $oLayoutMode->getLayoutList(); + Context::set('layout_list', $layout_list); + + // 모듈 카테고리 목록을 구함 + $module_category = $oModuleModel->getModuleCategories(); + Context::set('module_category', $module_category); + + // 레이아웃을 팝업으로 지정 + $this->setLayoutFile('popup_layout'); + + // 템플릿 파일 지정 + $this->setTemplateFile('module_setup'); + } + + /** + * @brief 모듈 추가 설정 일괄 적용 + **/ + function dispModuleAdminModuleAdditionSetup() { + $module_srls = Context::get('module_srls'); + + $modules = explode(',',$module_srls); + if(!count($modules)) if(!$module_srls) return new Object(-1,'msg_invalid_request'); + + // content는 다른 모듈에서 call by reference로 받아오기에 미리 변수 선언만 해 놓음 + $content = ''; + + // 추가 설정을 위한 트리거 호출 + // 게시판 모듈이지만 차후 다른 모듈에서의 사용도 고려하여 trigger 이름을 공용으로 사용할 수 있도록 하였음 + $output = ModuleHandler::triggerCall('module.dispAdditionSetup', 'before', $content); + $output = ModuleHandler::triggerCall('module.dispAdditionSetup', 'after', $content); + Context::set('setup_content', $content); + + // 레이아웃을 팝업으로 지정 + $this->setLayoutFile('popup_layout'); + + // 템플릿 파일 지정 + $this->setTemplateFile('module_addition_setup'); + } + + /** + * @brief 모듈 권한 설정 일괄 적용 + **/ + function dispModuleAdminModuleGrantSetup() { + $module_srls = Context::get('module_srls'); + + $modules = explode(',',$module_srls); + if(!count($modules)) if(!$module_srls) return new Object(-1,'msg_invalid_request'); + + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoByModuleSrl($modules[0]); + $xml_info = $oModuleModel->getModuleActionXml($module_info->module); + $source_grant_list = $xml_info->grant; + + // access, manager 권한은 가상 권한으로 설정 + $grant_list->access->title = Context::getLang('grant_access'); + $grant_list->access->default = 'guest'; + if(count($source_grant_list)) { + foreach($source_grant_list as $key => $val) { + if(!$val->default) $val->default = 'guest'; + if($val->default == 'root') $val->default = 'manager'; + $grant_list->{$key} = $val; + } + } + $grant_list->manager->title = Context::getLang('grant_manager'); + $grant_list->manager->default = 'manager'; + Context::set('grant_list', $grant_list); + + // 그룹을 가져옴 + $oMemberModel = &getModel('member'); + $group_list = $oMemberModel->getGroups($module_info->site_srl); + Context::set('group_list', $group_list); + + // 레이아웃을 팝업으로 지정 + $this->setLayoutFile('popup_layout'); + + // 템플릿 파일 지정 + $this->setTemplateFile('module_grant_setup'); + } + + /** + * @brief 언어 코드 + **/ + function dispModuleAdminLangcode() { + // 현재 사이트의 언어파일 가져오기 + $site_module_info = Context::get('site_module_info'); + $args->site_srl = (int)$site_module_info->site_srl; + $args->sort_index = 'name'; + $args->order_type = 'asc'; + $output = executeQueryArray('module.getLangList', $args); + Context::set('lang_list', $output->data); + + // 현재 선택된 언어 가져오기 + $name = Context::get('name'); + if($name) { + $oModuleAdminModel = &getAdminModel('module'); + Context::set('selected_lang', $oModuleAdminModel->getLangCode($args->site_srl,'$user_lang->'.$name)); + } + + // 레이아웃을 팝업으로 지정 + $this->setLayoutFile('popup_layout'); + + // 템플릿 파일 지정 + $this->setTemplateFile('module_langcode'); + } + + } +?> diff --git a/modules/module/module.class.php b/modules/module/module.class.php index c8809298f..487e8c100 100644 --- a/modules/module/module.class.php +++ b/modules/module/module.class.php @@ -1,367 +1,367 @@ -addIndex("modules","idx_site_mid", array("site_srl","mid"), true); - $oDB->addIndex('sites','unique_domain',array('domain'),true); - - // module 모듈에서 사용할 디렉토리 생성 - FileHandler::makeDir('./files/cache/module_info'); - FileHandler::makeDir('./files/cache/triggers'); - - // sites 테이블에 기본 사이트 정보 입력 - $args->site_srl = 0; - $output = $oDB->executeQuery('module.getSite', $args); - if(!$output->data || !$output->data->index_module_srl) { - $db_info = Context::getDBInfo(); - $domain = Context::getDefaultUrl(); - $url_info = parse_url($domain); - $domain = $url_info['host'].( (!empty($url_info['port'])&&$url_info['port']!=80)?':'.$url_info['port']:'').$url_info['path']; - $site_args->site_srl = 0; - $site_args->index_module_srl = 0; - $site_args->domain = $domain; - $site_args->default_language = $db_info->lang_type; - - $output = executeQuery('module.insertSite', $site_args); - if(!$output->toBool()) return $output; - } - - return new Object(); - } - - /** - * @brief 설치가 이상이 없는지 체크하는 method - **/ - function checkUpdate() { - $oDB = &DB::getInstance(); - - // 2008. 10. 27 module_part_config 테이블의 결합 인덱스 추가 - if(!$oDB->isIndexExists("module_part_config","idx_module_part_config")) return true; - - // 2008. 11. 13 modules 의 mid를 unique를 없애고 site_srl을 추가 후에 site_srl + mid unique index - if(!$oDB->isIndexExists('modules',"idx_site_mid")) return true; - - // 모든 모듈의 권한/스킨정보를 grants 테이블로 이전시키는 업데이트 - if($oDB->isColumnExists('modules', 'grants')) return true; - - // 모든 모듈의 권한/스킨정보를 grants 테이블로 이전시키는 업데이트 - if(!$oDB->isColumnExists('sites', 'default_language')) return true; - - // extra_vars* 컬럼 제거 - for($i=1;$i<=20;$i++) { - if($oDB->isColumnExists("documents","extra_vars".$i)) return true; - } - - // sites 테이블에 기본 사이트 정보 입력 - $args->site_srl = 0; - $output = $oDB->executeQuery('module.getSite', $args); - if(!$output->data) return true; - - // sites 테이블에서 도메인이 인덱스로 걸린경우 - if($oDB->isIndexExists('sites', 'idx_domain')) return true; - if(!$oDB->isIndexExists('sites','unique_domain')) return true; - - if(!$oDB->isColumnExists("modules", "use_mobile")) return true; - if(!$oDB->isColumnExists("modules", "mlayout_srl")) return true; - if(!$oDB->isColumnExists("modules", "mcontent")) return true; - if(!$oDB->isColumnExists("modules", "mskin")) return true; - - return false; - } - - /** - * @brief 업데이트 실행 - **/ - function moduleUpdate() { - $oDB = &DB::getInstance(); - - // 2008. 10. 27 module_part_config 테이블의 결합 인덱스 추가하고 기존에 module_config에 몰려 있던 모든 정보를 재점검 - if(!$oDB->isIndexExists("module_part_config","idx_module_part_config")) { - $oModuleModel = &getModel('module'); - $oModuleController = &getController('module'); - $modules = $oModuleModel->getModuleList(); - foreach($modules as $key => $module_info) { - $module = $module_info->module; - if(!in_array($module, array('point','trackback','layout','rss','file','comment','editor'))) continue; - $config = $oModuleModel->getModuleConfig($module); - - $module_config = null; - switch($module) { - case 'point' : - $module_config = $config->module_point; - unset($config->module_point); - break; - case 'trackback' : - case 'rss' : - case 'file' : - case 'comment' : - case 'editor' : - $module_config = $config->module_config; - unset($config->module_config); - if(is_array($module_config) && count($module_config)) { - foreach($module_config as $key => $val) { - if(isset($module_config[$key]->module_srl)) unset($module_config[$key]->module_srl); - } - } - break; - case 'layout' : - $tmp = $config->header_script; - if(is_array($tmp) && count($tmp)) { - foreach($tmp as $k => $v) { - if(!$v && !trim($v)) continue; - $module_config[$k]->header_script = $v; - } - } - $config = null; - break; - - } - - $oModuleController->insertModuleConfig($module, $config); - - if(is_array($module_config) && count($module_config)) { - foreach($module_config as $module_srl => $module_part_config) { - $oModuleController->insertModulePartConfig($module,$module_srl,$module_part_config); - } - } - } - $oDB->addIndex("module_part_config","idx_module_part_config", array("module","module_srl")); - } - - // 2008. 11. 13 modules 의 mid를 unique를 없애고 site_srl을 추가 후에 site_srl + mid unique index - if(!$oDB->isIndexExists('modules',"idx_site_mid")) { - $oDB->dropIndex("modules","unique_mid",true); - $oDB->addColumn('modules','site_srl','number',11,0,true); - $oDB->addIndex("modules","idx_site_mid", array("site_srl","mid"),true); - } - - // document 확장변수의 확장을 위한 처리 - if(!$oDB->isTableExists('document_extra_vars')) $oDB->createTableByXmlFile('./modules/document/schemas/document_extra_vars.xml'); - - if(!$oDB->isTableExists('document_extra_keys')) $oDB->createTableByXmlFile('./modules/document/schemas/document_extra_keys.xml'); - - // 모든 모듈의 권한, 스킨정보, 확장정보, 관리자 아이디를 grants 테이블로 이전시키는 업데이트 - if($oDB->isColumnExists('modules', 'grants')) { - $oModuleController = &getController('module'); - $oDocumentController = &getController('document'); - - // 현재 시스템 언어 코드값을 가져옴 - $lang_code = Context::getLangType(); - - // 모든 모듈의 module_info를 가져옴 - $output = executeQueryArray('module.getModuleInfos'); - if(count($output->data)) { - foreach($output->data as $module_info) { - // 모듈들의 권한/ 확장변수(게시글 확장 포함)/ 스킨 변수/ 최고관리권한 정보 분리 - $module_srl = trim($module_info->module_srl); - - // 권한 등록 - $grants = unserialize($module_info->grants); - if($grants) $oModuleController->insertModuleGrants($module_srl, $grants); - - // 스킨 변수 등록 - $skin_vars = unserialize($module_info->skin_vars); - if($skin_vars) $oModuleController->insertModuleSkinVars($module_srl, $skin_vars); - - // 최고 관리자 아이디 등록 - $admin_id = trim($module_info->admin_id); - if($admin_id && $admin_id != 'Array') { - $admin_ids = explode(',',$admin_id); - if(count($admin_id)) { - foreach($admin_ids as $admin_id) { - $oModuleController->insertAdminId($module_srl, $admin_id); - } - } - } - - // 모듈별 추가 설정 저장 (기본 modules에 없던 컬럼 데이터) - $extra_vars = unserialize($module_info->extra_vars); - $document_extra_keys = null; - if($extra_vars->extra_vars && count($extra_vars->extra_vars)) { - $document_extra_keys = $extra_vars->extra_vars; - unset($extra_vars->extra_vars); - } - if($extra_vars) $oModuleController->insertModuleExtraVars($module_srl, $extra_vars); - - /** - * 게시글 확장변수 이동 (documents모듈에서 해야 하지만 modules 테이블의 추가 변수들이 정리되기에 여기서 함) - **/ - // 플래닛모듈의 경우 직접 추가 변수 입력 - if($module_info->module == 'planet') { - if(!$document_extra_keys || !is_array($document_extra_keys)) $document_extra_keys = array(); - $planet_extra_keys->name = 'postscript'; - $planet_extra_keys->type = 'text'; - $planet_extra_keys->is_required = 'N'; - $planet_extra_keys->search = 'N'; - $planet_extra_keys->default = ''; - $planet_extra_keys->desc = ''; - $document_extra_keys[20] = $planet_extra_keys; - } - - // 게시글 확장변수 키 등록 - if(count($document_extra_keys)) { - foreach($document_extra_keys as $var_idx => $val) { - $oDocumentController->insertDocumentExtraKey($module_srl, $var_idx, $val->name, $val->type, $val->is_required, $val->search, $val->default, $val->desc, 'extra_vars'.$var_idx); - } - - // 2009-04-14 #17923809 게시물 100개의 확장 변수만 이전되는 문제점 수정 - $oDocumentModel = &getModel('document'); - $total_count = $oDocumentModel->getDocumentCount($module_srl); - - if ($total_count > 0) { - $per_page = 100; - $total_pages = (int) (($total_count - 1) / $per_page) + 1; - - // 확장변수가 존재하면 확장변수 가져오기 - $doc_args = null; - $doc_args->module_srl = $module_srl; - $doc_args->list_count = $per_page; - $doc_args->sort_index = 'list_order'; - $doc_args->order_type = 'asc'; - - for ($doc_args->page = 1; $doc_args->page <= $total_pages; $doc_args->page++) { - $output = executeQueryArray('document.getDocumentList', $doc_args); - - if ($output->toBool() && $output->data && count($output->data)) { - foreach ($output->data as $document) { - if (!$document) continue; - foreach ($document as $key => $var) { - if (strpos($key, 'extra_vars') !== 0 || !trim($var) || $var == 'N;') continue; - $var_idx = str_replace('extra_vars','',$key); - $oDocumentController->insertDocumentExtraVar($module_srl, $document->document_srl, $var_idx, $var, 'extra_vars'.$var_idx, $lang_code); - } - } - } - } // for total_pages - } // if count - } - - // 해당 모듈들의 추가 변수들 제거 - $module_info->grant = null; - $module_info->extra_vars = null; - $module_info->skin_vars = null; - $module_info->admin_id = null; - executeQuery('module.updateModule', $module_info); - } - } - - // 각종 column drop - $oDB->dropColumn('modules','grants'); - $oDB->dropColumn('modules','admin_id'); - $oDB->dropColumn('modules','skin_vars'); - $oDB->dropColumn('modules','extra_vars'); - } - - // 모든 모듈의 권한/스킨정보를 grants 테이블로 이전시키는 업데이트 - if(!$oDB->isColumnExists('sites', 'default_language')) { - $oDB->addColumn('sites','default_language','varchar',255,0,false); - } - - // extra_vars* 컬럼 제거 - for($i=1;$i<=20;$i++) { - if(!$oDB->isColumnExists("documents","extra_vars".$i)) continue; - $oDB->dropColumn('documents','extra_vars'.$i); - } - - // sites 테이블에 기본 사이트 정보 입력 - $args->site_srl = 0; - $output = $oDB->executeQuery('module.getSite', $args); - if(!$output->data) { - // 기본 mid, 언어 구함 - $mid_output = $oDB->executeQuery('module.getDefaultMidInfo', $args); - $db_info = Context::getDBInfo(); - $domain = Context::getDefaultUrl(); - $url_info = parse_url($domain); - $domain = $url_info['host'].( (!empty($url_info['port'])&&$url_info['port']!=80)?':'.$url_info['port']:'').$url_info['path']; - $site_args->site_srl = 0; - $site_args->index_module_srl = $mid_output->data->module_srl; - $site_args->domain = $domain; - $site_args->default_language = $db_info->lang_type; - - $output = executeQuery('module.insertSite', $site_args); - if(!$output->toBool()) return $output; - } - - if($oDB->isIndexExists('sites','idx_domain')){ - $oDB->dropIndex('sites','idx_domain'); - } - if(!$oDB->isIndexExists('sites','unique_domain')){ - $this->updateForUniqueSiteDomain(); - $oDB->addIndex('sites','unique_domain',array('domain'),true); - } - - if(!$oDB->isColumnExists("modules", "use_mobile")) { - $oDB->addColumn('modules','use_mobile','char',1,'N'); - } - if(!$oDB->isColumnExists("modules", "mlayout_srl")) { - $oDB->addColumn('modules','mlayout_srl','number',11, 0); - } - if(!$oDB->isColumnExists("modules", "mcontent")) { - $oDB->addColumn('modules','mcontent','bigtext'); - } - if(!$oDB->isColumnExists("modules", "mskin")) { - $oDB->addColumn('modules','mskin','varchar',250); - } - - return new Object(0, 'success_updated'); - } - - function updateForUniqueSiteDomain() - { - $output = executeQueryArray("module.getNonuniqueDomains"); - if(!$output->data) return; - foreach($output->data as $data) - { - if($data->count == 1) continue; - $domain = $data->domain; - $args = null; - $args->domain = $domain; - $output2 = executeQueryArray("module.getSiteByDomain", $args); - $bFirst = true; - foreach($output2->data as $site) - { - if($bFirst) - { - $bFirst = false; - continue; - } - $domain .= "_"; - $args = null; - $args->domain = $domain; - $args->site_srl = $site->site_srl; - $output3 = executeQuery("module.updateSite", $args); - } - } - } - - /** - * @brief 캐시 파일 재생성 - **/ - function recompileCache() { - // 모듈 정보 캐시 파일 모두 삭제 - FileHandler::removeFilesInDir("./files/cache/module_info"); - - // 트리거 정보가 있는 파일 모두 삭제 - FileHandler::removeFilesInDir("./files/cache/triggers"); - - // DB캐시 파일을 모두 삭제 - FileHandler::removeFilesInDir("./files/cache/db"); - - // 기타 캐시 삭제 - FileHandler::removeDir("./files/cache/tmp"); - } - } -?> +addIndex("modules","idx_site_mid", array("site_srl","mid"), true); + $oDB->addIndex('sites','unique_domain',array('domain'),true); + + // module 모듈에서 사용할 디렉토리 생성 + FileHandler::makeDir('./files/cache/module_info'); + FileHandler::makeDir('./files/cache/triggers'); + + // sites 테이블에 기본 사이트 정보 입력 + $args->site_srl = 0; + $output = $oDB->executeQuery('module.getSite', $args); + if(!$output->data || !$output->data->index_module_srl) { + $db_info = Context::getDBInfo(); + $domain = Context::getDefaultUrl(); + $url_info = parse_url($domain); + $domain = $url_info['host'].( (!empty($url_info['port'])&&$url_info['port']!=80)?':'.$url_info['port']:'').$url_info['path']; + $site_args->site_srl = 0; + $site_args->index_module_srl = 0; + $site_args->domain = $domain; + $site_args->default_language = $db_info->lang_type; + + $output = executeQuery('module.insertSite', $site_args); + if(!$output->toBool()) return $output; + } + + return new Object(); + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + **/ + function checkUpdate() { + $oDB = &DB::getInstance(); + + // 2008. 10. 27 module_part_config 테이블의 결합 인덱스 추가 + if(!$oDB->isIndexExists("module_part_config","idx_module_part_config")) return true; + + // 2008. 11. 13 modules 의 mid를 unique를 없애고 site_srl을 추가 후에 site_srl + mid unique index + if(!$oDB->isIndexExists('modules',"idx_site_mid")) return true; + + // 모든 모듈의 권한/스킨정보를 grants 테이블로 이전시키는 업데이트 + if($oDB->isColumnExists('modules', 'grants')) return true; + + // 모든 모듈의 권한/스킨정보를 grants 테이블로 이전시키는 업데이트 + if(!$oDB->isColumnExists('sites', 'default_language')) return true; + + // extra_vars* 컬럼 제거 + for($i=1;$i<=20;$i++) { + if($oDB->isColumnExists("documents","extra_vars".$i)) return true; + } + + // sites 테이블에 기본 사이트 정보 입력 + $args->site_srl = 0; + $output = $oDB->executeQuery('module.getSite', $args); + if(!$output->data) return true; + + // sites 테이블에서 도메인이 인덱스로 걸린경우 + if($oDB->isIndexExists('sites', 'idx_domain')) return true; + if(!$oDB->isIndexExists('sites','unique_domain')) return true; + + if(!$oDB->isColumnExists("modules", "use_mobile")) return true; + if(!$oDB->isColumnExists("modules", "mlayout_srl")) return true; + if(!$oDB->isColumnExists("modules", "mcontent")) return true; + if(!$oDB->isColumnExists("modules", "mskin")) return true; + + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + $oDB = &DB::getInstance(); + + // 2008. 10. 27 module_part_config 테이블의 결합 인덱스 추가하고 기존에 module_config에 몰려 있던 모든 정보를 재점검 + if(!$oDB->isIndexExists("module_part_config","idx_module_part_config")) { + $oModuleModel = &getModel('module'); + $oModuleController = &getController('module'); + $modules = $oModuleModel->getModuleList(); + foreach($modules as $key => $module_info) { + $module = $module_info->module; + if(!in_array($module, array('point','trackback','layout','rss','file','comment','editor'))) continue; + $config = $oModuleModel->getModuleConfig($module); + + $module_config = null; + switch($module) { + case 'point' : + $module_config = $config->module_point; + unset($config->module_point); + break; + case 'trackback' : + case 'rss' : + case 'file' : + case 'comment' : + case 'editor' : + $module_config = $config->module_config; + unset($config->module_config); + if(is_array($module_config) && count($module_config)) { + foreach($module_config as $key => $val) { + if(isset($module_config[$key]->module_srl)) unset($module_config[$key]->module_srl); + } + } + break; + case 'layout' : + $tmp = $config->header_script; + if(is_array($tmp) && count($tmp)) { + foreach($tmp as $k => $v) { + if(!$v && !trim($v)) continue; + $module_config[$k]->header_script = $v; + } + } + $config = null; + break; + + } + + $oModuleController->insertModuleConfig($module, $config); + + if(is_array($module_config) && count($module_config)) { + foreach($module_config as $module_srl => $module_part_config) { + $oModuleController->insertModulePartConfig($module,$module_srl,$module_part_config); + } + } + } + $oDB->addIndex("module_part_config","idx_module_part_config", array("module","module_srl")); + } + + // 2008. 11. 13 modules 의 mid를 unique를 없애고 site_srl을 추가 후에 site_srl + mid unique index + if(!$oDB->isIndexExists('modules',"idx_site_mid")) { + $oDB->dropIndex("modules","unique_mid",true); + $oDB->addColumn('modules','site_srl','number',11,0,true); + $oDB->addIndex("modules","idx_site_mid", array("site_srl","mid"),true); + } + + // document 확장변수의 확장을 위한 처리 + if(!$oDB->isTableExists('document_extra_vars')) $oDB->createTableByXmlFile('./modules/document/schemas/document_extra_vars.xml'); + + if(!$oDB->isTableExists('document_extra_keys')) $oDB->createTableByXmlFile('./modules/document/schemas/document_extra_keys.xml'); + + // 모든 모듈의 권한, 스킨정보, 확장정보, 관리자 아이디를 grants 테이블로 이전시키는 업데이트 + if($oDB->isColumnExists('modules', 'grants')) { + $oModuleController = &getController('module'); + $oDocumentController = &getController('document'); + + // 현재 시스템 언어 코드값을 가져옴 + $lang_code = Context::getLangType(); + + // 모든 모듈의 module_info를 가져옴 + $output = executeQueryArray('module.getModuleInfos'); + if(count($output->data)) { + foreach($output->data as $module_info) { + // 모듈들의 권한/ 확장변수(게시글 확장 포함)/ 스킨 변수/ 최고관리권한 정보 분리 + $module_srl = trim($module_info->module_srl); + + // 권한 등록 + $grants = unserialize($module_info->grants); + if($grants) $oModuleController->insertModuleGrants($module_srl, $grants); + + // 스킨 변수 등록 + $skin_vars = unserialize($module_info->skin_vars); + if($skin_vars) $oModuleController->insertModuleSkinVars($module_srl, $skin_vars); + + // 최고 관리자 아이디 등록 + $admin_id = trim($module_info->admin_id); + if($admin_id && $admin_id != 'Array') { + $admin_ids = explode(',',$admin_id); + if(count($admin_id)) { + foreach($admin_ids as $admin_id) { + $oModuleController->insertAdminId($module_srl, $admin_id); + } + } + } + + // 모듈별 추가 설정 저장 (기본 modules에 없던 컬럼 데이터) + $extra_vars = unserialize($module_info->extra_vars); + $document_extra_keys = null; + if($extra_vars->extra_vars && count($extra_vars->extra_vars)) { + $document_extra_keys = $extra_vars->extra_vars; + unset($extra_vars->extra_vars); + } + if($extra_vars) $oModuleController->insertModuleExtraVars($module_srl, $extra_vars); + + /** + * 게시글 확장변수 이동 (documents모듈에서 해야 하지만 modules 테이블의 추가 변수들이 정리되기에 여기서 함) + **/ + // 플래닛모듈의 경우 직접 추가 변수 입력 + if($module_info->module == 'planet') { + if(!$document_extra_keys || !is_array($document_extra_keys)) $document_extra_keys = array(); + $planet_extra_keys->name = 'postscript'; + $planet_extra_keys->type = 'text'; + $planet_extra_keys->is_required = 'N'; + $planet_extra_keys->search = 'N'; + $planet_extra_keys->default = ''; + $planet_extra_keys->desc = ''; + $document_extra_keys[20] = $planet_extra_keys; + } + + // 게시글 확장변수 키 등록 + if(count($document_extra_keys)) { + foreach($document_extra_keys as $var_idx => $val) { + $oDocumentController->insertDocumentExtraKey($module_srl, $var_idx, $val->name, $val->type, $val->is_required, $val->search, $val->default, $val->desc, 'extra_vars'.$var_idx); + } + + // 2009-04-14 #17923809 게시물 100개의 확장 변수만 이전되는 문제점 수정 + $oDocumentModel = &getModel('document'); + $total_count = $oDocumentModel->getDocumentCount($module_srl); + + if ($total_count > 0) { + $per_page = 100; + $total_pages = (int) (($total_count - 1) / $per_page) + 1; + + // 확장변수가 존재하면 확장변수 가져오기 + $doc_args = null; + $doc_args->module_srl = $module_srl; + $doc_args->list_count = $per_page; + $doc_args->sort_index = 'list_order'; + $doc_args->order_type = 'asc'; + + for ($doc_args->page = 1; $doc_args->page <= $total_pages; $doc_args->page++) { + $output = executeQueryArray('document.getDocumentList', $doc_args); + + if ($output->toBool() && $output->data && count($output->data)) { + foreach ($output->data as $document) { + if (!$document) continue; + foreach ($document as $key => $var) { + if (strpos($key, 'extra_vars') !== 0 || !trim($var) || $var == 'N;') continue; + $var_idx = str_replace('extra_vars','',$key); + $oDocumentController->insertDocumentExtraVar($module_srl, $document->document_srl, $var_idx, $var, 'extra_vars'.$var_idx, $lang_code); + } + } + } + } // for total_pages + } // if count + } + + // 해당 모듈들의 추가 변수들 제거 + $module_info->grant = null; + $module_info->extra_vars = null; + $module_info->skin_vars = null; + $module_info->admin_id = null; + executeQuery('module.updateModule', $module_info); + } + } + + // 각종 column drop + $oDB->dropColumn('modules','grants'); + $oDB->dropColumn('modules','admin_id'); + $oDB->dropColumn('modules','skin_vars'); + $oDB->dropColumn('modules','extra_vars'); + } + + // 모든 모듈의 권한/스킨정보를 grants 테이블로 이전시키는 업데이트 + if(!$oDB->isColumnExists('sites', 'default_language')) { + $oDB->addColumn('sites','default_language','varchar',255,0,false); + } + + // extra_vars* 컬럼 제거 + for($i=1;$i<=20;$i++) { + if(!$oDB->isColumnExists("documents","extra_vars".$i)) continue; + $oDB->dropColumn('documents','extra_vars'.$i); + } + + // sites 테이블에 기본 사이트 정보 입력 + $args->site_srl = 0; + $output = $oDB->executeQuery('module.getSite', $args); + if(!$output->data) { + // 기본 mid, 언어 구함 + $mid_output = $oDB->executeQuery('module.getDefaultMidInfo', $args); + $db_info = Context::getDBInfo(); + $domain = Context::getDefaultUrl(); + $url_info = parse_url($domain); + $domain = $url_info['host'].( (!empty($url_info['port'])&&$url_info['port']!=80)?':'.$url_info['port']:'').$url_info['path']; + $site_args->site_srl = 0; + $site_args->index_module_srl = $mid_output->data->module_srl; + $site_args->domain = $domain; + $site_args->default_language = $db_info->lang_type; + + $output = executeQuery('module.insertSite', $site_args); + if(!$output->toBool()) return $output; + } + + if($oDB->isIndexExists('sites','idx_domain')){ + $oDB->dropIndex('sites','idx_domain'); + } + if(!$oDB->isIndexExists('sites','unique_domain')){ + $this->updateForUniqueSiteDomain(); + $oDB->addIndex('sites','unique_domain',array('domain'),true); + } + + if(!$oDB->isColumnExists("modules", "use_mobile")) { + $oDB->addColumn('modules','use_mobile','char',1,'N'); + } + if(!$oDB->isColumnExists("modules", "mlayout_srl")) { + $oDB->addColumn('modules','mlayout_srl','number',11, 0); + } + if(!$oDB->isColumnExists("modules", "mcontent")) { + $oDB->addColumn('modules','mcontent','bigtext'); + } + if(!$oDB->isColumnExists("modules", "mskin")) { + $oDB->addColumn('modules','mskin','varchar',250); + } + + return new Object(0, 'success_updated'); + } + + function updateForUniqueSiteDomain() + { + $output = executeQueryArray("module.getNonuniqueDomains"); + if(!$output->data) return; + foreach($output->data as $data) + { + if($data->count == 1) continue; + $domain = $data->domain; + $args = null; + $args->domain = $domain; + $output2 = executeQueryArray("module.getSiteByDomain", $args); + $bFirst = true; + foreach($output2->data as $site) + { + if($bFirst) + { + $bFirst = false; + continue; + } + $domain .= "_"; + $args = null; + $args->domain = $domain; + $args->site_srl = $site->site_srl; + $output3 = executeQuery("module.updateSite", $args); + } + } + } + + /** + * @brief 캐시 파일 재생성 + **/ + function recompileCache() { + // 모듈 정보 캐시 파일 모두 삭제 + FileHandler::removeFilesInDir("./files/cache/module_info"); + + // 트리거 정보가 있는 파일 모두 삭제 + FileHandler::removeFilesInDir("./files/cache/triggers"); + + // DB캐시 파일을 모두 삭제 + FileHandler::removeFilesInDir("./files/cache/db"); + + // 기타 캐시 삭제 + FileHandler::removeDir("./files/cache/tmp"); + } + } +?> diff --git a/modules/module/module.controller.php b/modules/module/module.controller.php index 5c367b229..298455ccf 100644 --- a/modules/module/module.controller.php +++ b/modules/module/module.controller.php @@ -1,757 +1,757 @@ -module = $module; - $args->type = $type; - $args->act = $act; - - $output = executeQuery('module.insertActionForward', $args); - return $output; - } - - /** - * @brief action forward 삭제 - **/ - function deleteActionForward($module, $type, $act) { - $args->module = $module; - $args->type = $type; - $args->act = $act; - - $output = executeQuery('module.deleteActionForward', $args); - return $output; - } - - /** - * @brief module trigger 추가 - * module trigger는 trigger 대상이 등록된 대상을 호출하는 방법이다. - * - **/ - function insertTrigger($trigger_name, $module, $type, $called_method, $called_position) { - $args->trigger_name = $trigger_name; - $args->module = $module; - $args->type = $type; - $args->called_method = $called_method; - $args->called_position = $called_position; - - $output = executeQuery('module.insertTrigger', $args); - - // 트리거 정보가 있는 파일 모두 삭제 - FileHandler::removeFilesInDir("./files/cache/triggers"); - - return $output; - } - - /** - * @brief module trigger 삭제 - * - **/ - function deleteTrigger($trigger_name, $module, $type, $called_method, $called_position) { - $args->trigger_name = $trigger_name; - $args->module = $module; - $args->type = $type; - $args->called_method = $called_method; - $args->called_position = $called_position; - - $output = executeQuery('module.deleteTrigger', $args); - - // 트리거 캐시 삭제 - FileHandler::removeFilesInDir('./files/cache/triggers'); - - return $output; - } - - /** - * @brief module extend 추가 - * - **/ - function insertModuleExtend($parent_module, $extend_module, $type, $kind=''){ - if($kind != 'admin') $kind = ''; - if(!in_array($type,array('model','controller','view','api','mobile'))) return false; - if(in_array($parent_module, array('module','addon','widget','layout'))) return false; - - $cache_file = './files/config/module_extend.php'; - FileHandler::removeFile($cache_file); - - $args->parent_module = $parent_module; - $args->extend_module = $extend_module; - $args->type = $type; - $args->kind = $kind; - - $output = executeQuery('module.getModuleExtendCount', $args); - if($output->data->count>0) return false; - - $output = executeQuery('module.insertModuleExtend', $args); - return $output; - } - - /** - * @brief module extend 삭제 - * - **/ - function deleteModuleExtend($parent_module, $extend_module, $type, $kind=''){ - $cache_file = './files/config/module_extend.php'; - FileHandler::removeFile($cache_file); - - $args->parent_module = $parent_module; - $args->extend_module = $extend_module; - $args->type = $type; - $args->kind = $kind; - - $output = executeQuery('module.deleteModuleExtend', $args); - - return $output; - } - - /** - * @brief 특정 모듈의 설정 입력 - * board, member등 특정 모듈의 global config 관리용 - **/ - function insertModuleConfig($module, $config) { - $args->module = $module; - $args->config = serialize($config); - - $output = executeQuery('module.deleteModuleConfig', $args); - if(!$output->toBool()) return $output; - - $output = executeQuery('module.insertModuleConfig', $args); - return $output; - } - - /** - * @brief 특정 mid의 모듈 설정 정보 저장 - * mid의 모듈 의존적인 설정을 관리 - **/ - function insertModulePartConfig($module, $module_srl, $config) { - $args->module = $module; - $args->module_srl = $module_srl; - $args->config = serialize($config); - - $output = executeQuery('module.deleteModulePartConfig', $args); - if(!$output->toBool()) return $output; - - $output = executeQuery('module.insertModulePartConfig', $args); - return $output; - } - - /** - * @brief virtual site 생성 - **/ - function insertSite($domain, $index_module_srl) { - if(isSiteID($domain)) { - $oModuleModel = &getModel('module'); - if($oModuleModel->isIDExists($domain, 0)) return new Object(-1,'msg_already_registed_vid'); - }else{ - $domain = strtolower($domain); - } - - $args->site_srl = getNextSequence(); - $args->domain = preg_replace('/\/$/','',$domain); - $args->index_module_srl = $index_module_srl; - $args->default_language = Context::getLangType(); - $output = executeQuery('module.getSiteInfoByDomain', $args); - if($output->data) return new Object(-1,'msg_already_registed_vid'); - - $output = executeQuery('module.insertSite', $args); - if(!$output->toBool()) return $output; - - $output->add('site_srl', $args->site_srl); - return $output; - } - - /** - * @brief virtual site 수정 - **/ - function updateSite($args) { - $oModuleModel = &getModel('module'); - $site_info = $oModuleModel->getSiteInfo($args->site_srl); - if($site_info->domain != $args->domain) { - $info = $oModuleModel->getSiteInfoByDomain($args->domain); - if($info->site_srl && $info->site_srl != $args->site_srl) return new Object(-1,'msg_already_registed_domain'); - if(isSiteID($args->domain) && $oModuleModel->isIDExists($args->domain)) return new Object(-1,'msg_already_registed_vid'); - - if($args->domain && !isSiteID($args->domain)) { - $args->domain = strtolower($args->domain); - } - - } - $output = executeQuery('module.updateSite', $args); - return $output; - } - - /** - * @brief 모듈 정보 정리 - **/ - function arrangeModuleInfo(&$args, &$extra_vars) { - // 불필요한 내용 제거 - unset($args->body); - unset($args->act); - unset($args->page); - - // mid값 검사 - if(!preg_match("/^[a-z][a-z0-9_]+$/i", $args->mid)) return new Object(-1, 'msg_limit_mid'); - - // 변수를 검사 (modules의 기본 변수와 그렇지 않은 변수로 분리) - $extra_vars = clone($args); - unset($extra_vars->module_srl); - unset($extra_vars->module); - unset($extra_vars->module_category_srl); - unset($extra_vars->layout_srl); - unset($extra_vars->mlayout_srl); - unset($extra_vars->use_mobile); - unset($extra_vars->menu_srl); - unset($extra_vars->site_srl); - unset($extra_vars->mid); - unset($extra_vars->skin); - unset($extra_vars->mskin); - unset($extra_vars->browser_title); - unset($extra_vars->description); - unset($extra_vars->is_default); - unset($extra_vars->content); - unset($extra_vars->mcontent); - unset($extra_vars->open_rss); - unset($extra_vars->header_text); - unset($extra_vars->footer_text); - $args = delObjectVars($args, $extra_vars); - - return new Object(); - } - - /** - * @brief 모듈 입력 - **/ - function insertModule($args) { - $output = $this->arrangeModuleInfo($args, $extra_vars); - if(!$output->toBool()) return $output; - - // 이미 존재하는 모듈 이름인지 체크 - if(!$args->site_srl) $args->site_srl = 0; - $oModuleModel = &getModel('module'); - if($oModuleModel->isIDExists($args->mid, $args->site_srl)) return new Object(-1, 'msg_module_name_exists'); - - // begin transaction - $oDB = &DB::getInstance(); - $oDB->begin(); - - // 선택된 스킨정보에서 colorset을 구함 - $module_path = ModuleHandler::getModulePath($args->module); - $skin_info = $oModuleModel->loadSkinInfo($module_path, $args->skin); - $skin_vars->colorset = $skin_info->colorset[0]->name; - - // 변수 정리후 query 실행 - if(!$args->module_srl) $args->module_srl = getNextSequence(); - - // 모듈 등록 - $output = executeQuery('module.insertModule', $args); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - // 모듈 추가 변수 등록 - $this->insertModuleExtraVars($args->module_srl, $extra_vars); - - // commit - $oDB->commit(); - - $output->add('module_srl',$args->module_srl); - return $output; - } - - /** - * @brief 모듈의 정보를 수정 - **/ - function updateModule($args) { - $output = $this->arrangeModuleInfo($args, $extra_vars); - if(!$output->toBool()) return $output; - - // begin transaction - $oDB = &DB::getInstance(); - $oDB->begin(); - - $oModuleModel = &getModel('module'); - $module_info = $oModuleModel->getModuleInfoByModuleSrl($args->module_srl); - - $args->site_srl = (int)$module_info->site_srl; - if(!$args->browser_title) $args->browser_title = $module_info->browser_title; - - $output = executeQuery('module.isExistsModuleName', $args); - if(!$output->toBool() || $output->data->count) { - $oDB->rollback(); - return new Object(-1, 'msg_module_name_exists'); - } - - $output = executeQuery('module.updateModule', $args); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - // 모듈 추가 변수 등록 - $this->insertModuleExtraVars($args->module_srl, $extra_vars); - - $oDB->commit(); - - $output->add('module_srl',$args->module_srl); - return $output; - } - - /** - * @brief 모듈의 가상사이트 변경 - **/ - function updateModuleSite($module_srl, $site_srl, $layout_srl = 0) { - $args->module_srl = $module_srl; - $args->site_srl = $site_srl; - $args->layout_srl = $layout_srl; - return executeQuery('module.updateModuleSite', $args); - } - - /** - * @brief 모듈을 삭제 - * - * 모듈 삭제시는 관련 정보들을 모두 삭제 시도한다. - **/ - function deleteModule($module_srl) { - if(!$module_srl) return new Object(-1,'msg_invalid_request'); - - // trigger 호출 (before) - $trigger_obj->module_srl = $module_srl; - $output = ModuleHandler::triggerCall('module.deleteModule', 'before', $trigger_obj); - if(!$output->toBool()) return $output; - - // begin transaction - $oDB = &DB::getInstance(); - $oDB->begin(); - - $args->module_srl = $module_srl; - - // module 정보를 DB에서 삭제 - $output = executeQuery('module.deleteModule', $args); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - // 권한 정보 삭제 - $this->deleteModuleGrants($module_srl); - - // 스킨 정보 삭제 - $this->deleteModuleSkinVars($module_srl); - - // 모듈 추가 변수 삭제 - $this->deleteModuleExtraVars($module_srl); - - // 모듈 관리자 제거 - $this->deleteAdminId($module_srl); - - // trigger 호출 (after) - if($output->toBool()) { - $trigger_output = ModuleHandler::triggerCall('module.deleteModule', 'after', $trigger_obj); - if(!$trigger_output->toBool()) { - $oDB->rollback(); - return $trigger_output; - } - } - - // commit - $oDB->commit(); - - return $output; - } - - /** - * @brief 모듈의 기타 정보를 변경 - **/ - function updateModuleSkinVars($module_srl, $skin_vars) { - // skin_vars 정보 세팅 - $args->module_srl = $module_srl; - $args->skin_vars = $skin_vars; - $output = executeQuery('module.updateModuleSkinVars', $args); - if(!$output->toBool()) return $output; - - return $output; - } - - /** - * @brief 모든 모듈의 is_default값을 N 으로 세팅 (기본 모듈 해제) - **/ - function clearDefaultModule() { - $output = executeQuery('module.clearDefaultModule'); - if(!$output->toBool()) return $output; - - return $output; - } - - /** - * @brief 지정된 menu_srl에 속한 mid 의 menu_srl 을 변경 - **/ - function updateModuleMenu($args) { - return executeQuery('module.updateModuleMenu', $args); - } - - /** - * @brief 지정된 menu_srl에 속한 mid 의 layout_srl을 변경 - **/ - function updateModuleLayout($layout_srl, $menu_srl_list) { - if(!count($menu_srl_list)) return; - - $args->layout_srl = $layout_srl; - $args->menu_srls = implode(',',$menu_srl_list); - $output = executeQuery('module.updateModuleLayout', $args); - return $output; - } - - /** - * @brief 사이트의 관리를 변경 - **/ - function insertSiteAdmin($site_srl, $arr_admins) { - // 사이트 관리자 제거 - $args->site_srl = $site_srl; - $output = executeQuery('module.deleteSiteAdmin', $args); - if(!$output->toBool()) return $output; - - // 관리자 대상 멤버 번호를 구함 - if(!is_array($arr_admins) || !count($arr_admins)) return new Object(); - foreach($arr_admins as $key => $user_id) { - if(!trim($user_id)) continue; - $admins[] = trim($user_id); - } - if(!count($admins)) return new Object(); - - $args->user_ids = '\''.implode('\',\'',$admins).'\''; - $output = executeQueryArray('module.getAdminSrls', $args); - if(!$output->toBool()||!$output->data) return $output; - - foreach($output->data as $key => $val) { - unset($args); - $args->site_srl = $site_srl; - $args->member_srl = $val->member_srl; - $output = executeQueryArray('module.insertSiteAdmin', $args); - if(!$output->toBool()) return $output; - } - return new Object(); - } - - /** - * @brief 특정 모듈에 관리자 아이디 지정 - **/ - function insertAdminId($module_srl, $admin_id) { - $oMemberModel = &getModel('member'); - $member_info = $oMemberModel->getMemberInfoByUserID($admin_id); - if(!$member_info->member_srl) return; - $args->module_srl = $module_srl; - $args->member_srl = $member_info->member_srl; - return executeQuery('module.insertAdminId', $args); - } - - /** - * @brief 특정 모듈의 관리자 아이디 제거 - **/ - function deleteAdminId($module_srl, $admin_id = '') { - $args->module_srl = $module_srl; - - if($admin_id) { - $oMemberModel = &getModel('member'); - $member_info = $oMemberModel->getMemberInfoByUserID($admin_id); - if($member_info->member_srl) $args->member_srl = $member_info->member_srl; - } - return executeQuery('module.deleteAdminId', $args); - } - - /** - * @brief 특정 모듈에 스킨 변수 등록 - **/ - function insertModuleSkinVars($module_srl, $obj) { - $this->deleteModuleSkinVars($module_srl); - if(!$obj || !count($obj)) return; - - $args->module_srl = $module_srl; - foreach($obj as $key => $val) { - // #17927989 예전 블로그 모듈을 사용하던 게시판의 경우 - // 스킨 정보 필드에 메뉴 항목(stdClass)을 저장해놓은 경우가 있어 - // 1.2.0 이상 버전으로 업그레이드한 후 모듈 업데이트할 때 - // 오류가 발생하는 문제 수정 - if (is_object($val)) continue; - if (is_array($val)) $val = serialize($val); - - $args->name = trim($key); - $args->value = trim($val); - if(!$args->name || !$args->value) continue; - executeQuery('module.insertModuleSkinVars', $args); - } - } - - /** - * @brief 특정 모듈의 스킨 변수 제거 - **/ - function deleteModuleSkinVars($module_srl) { - $args->module_srl = $module_srl; - return executeQuery('module.deleteModuleSkinVars', $args); - } - - /** - * @brief 특정 모듈에 확장 변수 등록 - **/ - function insertModuleExtraVars($module_srl, $obj) { - $this->deleteModuleExtraVars($module_srl); - if(!$obj || !count($obj)) return; - - foreach($obj as $key => $val) { - $args = null; - $args->module_srl = $module_srl; - $args->name = trim($key); - $args->value = trim($val); - if(!$args->name || !$args->value) continue; - executeQuery('module.insertModuleExtraVars', $args); - } - } - - /** - * @brief 특정 모듈의 확장 변수 제거 - **/ - function deleteModuleExtraVars($module_srl) { - $args->module_srl = $module_srl; - return executeQuery('module.deleteModuleExtraVars', $args); - } - - /** - * @brief 특정 모듈에 권한 등록 - **/ - function insertModuleGrants($module_srl, $obj) { - $this->deleteModuleGrants($module_srl); - if(!$obj || !count($obj)) return; - - foreach($obj as $name => $val) { - if(!$val || !count($val)) continue; - - foreach($val as $group_srl) { - $args = null; - $args->module_srl = $module_srl; - $args->name = $name; - $args->group_srl = trim($group_srl); - if(!$args->name || !$args->group_srl) continue; - executeQuery('module.insertModuleGrant', $args); - - } - } - } - - /** - * @brief 특정 모듈의 권한 제거 - **/ - function deleteModuleGrants($module_srl) { - $args->module_srl = $module_srl; - return executeQuery('module.deleteModuleGrants', $args); - } - - /** - * @brief 사용자 정의 언어 변경 - **/ - function replaceDefinedLangCode(&$output) { - $output = preg_replace_callback('!\$user_lang->([a-z0-9\_]+)!is', array($this,'_replaceLangCode'), $output); - } - function _replaceLangCode($matches) { - static $lang = null; - if(is_null($lang)) { - $site_module_info = Context::get('site_module_info'); - $cache_file = sprintf('%sfiles/cache/lang_defined/%d.%s.php', _XE_PATH_, $site_module_info->site_srl, Context::getLangType()); - if(!file_exists($cache_file)) { - $oModuleAdminController = &getAdminController('module'); - $oModuleAdminController->makeCacheDefinedLangCode($site_module_info->site_srl); - } - - if(file_exists($cache_file)) require_once($cache_file); - } - if(!Context::get($matches[1]) && $lang[$matches[1]]) return $lang[$matches[1]]; - - return str_replace('$user_lang->','',$matches[0]); - } - - - /** - * @brief 파일박스에 파일 추가 및 업데이트 - **/ - function procModuleFileBoxAdd(){ - - $logged_info = Context::get('logged_info'); - if($logged_info->is_admin !='Y' && !$logged_info->is_site_admin) return new Object(-1, 'msg_not_permitted'); - - $vars = Context::gets('comment','addfile','filter'); - $module_filebox_srl = Context::get('module_filebox_srl'); - - $ext = strtolower(substr(strrchr($vars->addfile['name'],'.'),1)); - $vars->ext = $ext; - if($vars->filter) $filter = explode(',',$vars->filter); - else $filter = array('jpg','jpeg','gif','png'); - if(!in_array($ext,$filter)) return new Object(-1, 'msg_error_occured'); - - $vars->member_srl = $logged_info->member_srl; - - // update - if($module_filebox_srl > 0){ - $vars->module_filebox_srl = $module_filebox_srl; - $output = $this->updateModuleFileBox($vars); - - // insert - }else{ - if(!Context::isUploaded()) return new Object(-1, 'msg_error_occured'); - $addfile = Context::get('addfile'); - if(!is_uploaded_file($addfile['tmp_name'])) return new Object(-1, 'msg_error_occured'); - if($vars->addfile['error'] != 0) return new Object(-1, 'msg_error_occured'); - $output = $this->insertModuleFileBox($vars); - } - - $url = getUrl('','module','module','act','dispModuleFileBox','input',Context::get('input'),'filter',$vars->filter); - $url = html_entity_decode($url); - $vars = Context::set('url',$url); - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('move_filebox_list'); - } - - - /** - * @brief 파일박스에 파일 업데이트 - **/ - function updateModuleFileBox($vars){ - - // have file - if($vars->addfile['tmp_name'] && is_uploaded_file($vars->addfile['tmp_name'])){ - $oModuleModel = &getModel('module'); - $output = $oModuleModel->getModuleFileBox($vars->module_filebox_srl); - FileHandler::removeFile($output->data->filename); - - $path = $oModuleModel->getModuleFileBoxPath($vars->module_filebox_srl); - FileHandler::makeDir($path); - - $save_filename = sprintf('%s%s.%s',$path, $vars->module_filebox_srl, $ext); - $tmp = $vars->addfile['tmp_name']; - - if(!@move_uploaded_file($tmp, $save_filename)) { - return false; - } - - $args->fileextension = strtolower(substr(strrchr($vars->addfile['name'],'.'),1)); - $args->filename = $save_filename; - $args->filesize = $vars->addfile['size']; - - } - - $args->module_filebox_srl = $vars->module_filebox_srl; - $args->comment = $vars->comment; - - return executeQuery('module.updateModuleFileBox', $vars); - } - - - /** - * @brief 파일박스에 파일 추가 - **/ - function insertModuleFileBox($vars){ - // set module_filebox_srl - $vars->module_filebox_srl = getNextSequence(); - - // get file path - $oModuleModel = &getModel('module'); - $path = $oModuleModel->getModuleFileBoxPath($vars->module_filebox_srl); - FileHandler::makeDir($path); - $save_filename = sprintf('%s%s.%s',$path, $vars->module_filebox_srl, $vars->ext); - $tmp = $vars->addfile['tmp_name']; - - // upload - if(!@move_uploaded_file($tmp, $save_filename)) { - return false; - } - - - // insert - $args->module_filebox_srl = $vars->module_filebox_srl; - $args->member_srl = $vars->member_srl; - $args->comment = $vars->comment; - $args->filename = $save_filename; - $args->fileextension = strtolower(substr(strrchr($vars->addfile['name'],'.'),1)); - $args->filesize = $vars->addfile['size']; - - $output = executeQuery('module.insertModuleFileBox', $args); - return $output; - } - - - /** - * @brief 파일박스에 파일 삭제 - **/ - - function procModuleFileBoxDelete(){ - $logged_info = Context::get('logged_info'); - if($logged_info->is_admin !='Y' && !$logged_info->is_site_admin) return new Object(-1, 'msg_not_permitted'); - - $module_filebox_srl = Context::get('module_filebox_srl'); - if(!$module_filebox_srl) return new Object(-1, 'msg_invalid_request'); - $vars->module_filebox_srl = $module_filebox_srl; - $output = $this->deleteModuleFileBox($vars); - if(!$output->toBool()) return $output; - } - - function deleteModuleFileBox($vars){ - - // delete real file - $oModuleModel = &getModel('module'); - $output = $oModuleModel->getModuleFileBox($vars->module_filebox_srl); - FileHandler::removeFile($output->data->filename); - - $args->module_filebox_srl = $vars->module_filebox_srl; - return executeQuery('module.deleteModuleFileBox', $args); - } - - /** - * @brief function of locking (timeout is in seconds) - */ - function lock($lock_name, $timeout, $member_srl = null) { - $this->unlockTimeoutPassed(); - $args->lock_name = $lock_name; - if(!$timeout) $timeout = 60; - $args->deadline = date("YmdHis", time() + $timeout); - if($member_srl) $args->member_srl = $member_srl; - $output = executeQuery('module.insertLock', $args); - if($output->toBool()) { - $output->add('lock_name', $lock_name); - $output->add('deadline', $args->deadline); - } - return $output; - } - - function unlockTimeoutPassed() { - executeQuery('module.deleteLocksTimeoutPassed'); - } - - function unlock($lock_name, $deadline) { - $args->lock_name = $lock_name; - $args->deadline = $deadline; - $output = executeQuery('module.deleteLock', $args); - return $output; - } - - function updateModuleInSites($site_srls, $args) - { - $args->site_srls = $site_srls; - $output = executeQuery('module.updateModuleInSites', $args); - return $output; - } - } -?> +module = $module; + $args->type = $type; + $args->act = $act; + + $output = executeQuery('module.insertActionForward', $args); + return $output; + } + + /** + * @brief action forward 삭제 + **/ + function deleteActionForward($module, $type, $act) { + $args->module = $module; + $args->type = $type; + $args->act = $act; + + $output = executeQuery('module.deleteActionForward', $args); + return $output; + } + + /** + * @brief module trigger 추가 + * module trigger는 trigger 대상이 등록된 대상을 호출하는 방법이다. + * + **/ + function insertTrigger($trigger_name, $module, $type, $called_method, $called_position) { + $args->trigger_name = $trigger_name; + $args->module = $module; + $args->type = $type; + $args->called_method = $called_method; + $args->called_position = $called_position; + + $output = executeQuery('module.insertTrigger', $args); + + // 트리거 정보가 있는 파일 모두 삭제 + FileHandler::removeFilesInDir("./files/cache/triggers"); + + return $output; + } + + /** + * @brief module trigger 삭제 + * + **/ + function deleteTrigger($trigger_name, $module, $type, $called_method, $called_position) { + $args->trigger_name = $trigger_name; + $args->module = $module; + $args->type = $type; + $args->called_method = $called_method; + $args->called_position = $called_position; + + $output = executeQuery('module.deleteTrigger', $args); + + // 트리거 캐시 삭제 + FileHandler::removeFilesInDir('./files/cache/triggers'); + + return $output; + } + + /** + * @brief module extend 추가 + * + **/ + function insertModuleExtend($parent_module, $extend_module, $type, $kind=''){ + if($kind != 'admin') $kind = ''; + if(!in_array($type,array('model','controller','view','api','mobile'))) return false; + if(in_array($parent_module, array('module','addon','widget','layout'))) return false; + + $cache_file = './files/config/module_extend.php'; + FileHandler::removeFile($cache_file); + + $args->parent_module = $parent_module; + $args->extend_module = $extend_module; + $args->type = $type; + $args->kind = $kind; + + $output = executeQuery('module.getModuleExtendCount', $args); + if($output->data->count>0) return false; + + $output = executeQuery('module.insertModuleExtend', $args); + return $output; + } + + /** + * @brief module extend 삭제 + * + **/ + function deleteModuleExtend($parent_module, $extend_module, $type, $kind=''){ + $cache_file = './files/config/module_extend.php'; + FileHandler::removeFile($cache_file); + + $args->parent_module = $parent_module; + $args->extend_module = $extend_module; + $args->type = $type; + $args->kind = $kind; + + $output = executeQuery('module.deleteModuleExtend', $args); + + return $output; + } + + /** + * @brief 특정 모듈의 설정 입력 + * board, member등 특정 모듈의 global config 관리용 + **/ + function insertModuleConfig($module, $config) { + $args->module = $module; + $args->config = serialize($config); + + $output = executeQuery('module.deleteModuleConfig', $args); + if(!$output->toBool()) return $output; + + $output = executeQuery('module.insertModuleConfig', $args); + return $output; + } + + /** + * @brief 특정 mid의 모듈 설정 정보 저장 + * mid의 모듈 의존적인 설정을 관리 + **/ + function insertModulePartConfig($module, $module_srl, $config) { + $args->module = $module; + $args->module_srl = $module_srl; + $args->config = serialize($config); + + $output = executeQuery('module.deleteModulePartConfig', $args); + if(!$output->toBool()) return $output; + + $output = executeQuery('module.insertModulePartConfig', $args); + return $output; + } + + /** + * @brief virtual site 생성 + **/ + function insertSite($domain, $index_module_srl) { + if(isSiteID($domain)) { + $oModuleModel = &getModel('module'); + if($oModuleModel->isIDExists($domain, 0)) return new Object(-1,'msg_already_registed_vid'); + }else{ + $domain = strtolower($domain); + } + + $args->site_srl = getNextSequence(); + $args->domain = preg_replace('/\/$/','',$domain); + $args->index_module_srl = $index_module_srl; + $args->default_language = Context::getLangType(); + $output = executeQuery('module.getSiteInfoByDomain', $args); + if($output->data) return new Object(-1,'msg_already_registed_vid'); + + $output = executeQuery('module.insertSite', $args); + if(!$output->toBool()) return $output; + + $output->add('site_srl', $args->site_srl); + return $output; + } + + /** + * @brief virtual site 수정 + **/ + function updateSite($args) { + $oModuleModel = &getModel('module'); + $site_info = $oModuleModel->getSiteInfo($args->site_srl); + if($site_info->domain != $args->domain) { + $info = $oModuleModel->getSiteInfoByDomain($args->domain); + if($info->site_srl && $info->site_srl != $args->site_srl) return new Object(-1,'msg_already_registed_domain'); + if(isSiteID($args->domain) && $oModuleModel->isIDExists($args->domain)) return new Object(-1,'msg_already_registed_vid'); + + if($args->domain && !isSiteID($args->domain)) { + $args->domain = strtolower($args->domain); + } + + } + $output = executeQuery('module.updateSite', $args); + return $output; + } + + /** + * @brief 모듈 정보 정리 + **/ + function arrangeModuleInfo(&$args, &$extra_vars) { + // 불필요한 내용 제거 + unset($args->body); + unset($args->act); + unset($args->page); + + // mid값 검사 + if(!preg_match("/^[a-z][a-z0-9_]+$/i", $args->mid)) return new Object(-1, 'msg_limit_mid'); + + // 변수를 검사 (modules의 기본 변수와 그렇지 않은 변수로 분리) + $extra_vars = clone($args); + unset($extra_vars->module_srl); + unset($extra_vars->module); + unset($extra_vars->module_category_srl); + unset($extra_vars->layout_srl); + unset($extra_vars->mlayout_srl); + unset($extra_vars->use_mobile); + unset($extra_vars->menu_srl); + unset($extra_vars->site_srl); + unset($extra_vars->mid); + unset($extra_vars->skin); + unset($extra_vars->mskin); + unset($extra_vars->browser_title); + unset($extra_vars->description); + unset($extra_vars->is_default); + unset($extra_vars->content); + unset($extra_vars->mcontent); + unset($extra_vars->open_rss); + unset($extra_vars->header_text); + unset($extra_vars->footer_text); + $args = delObjectVars($args, $extra_vars); + + return new Object(); + } + + /** + * @brief 모듈 입력 + **/ + function insertModule($args) { + $output = $this->arrangeModuleInfo($args, $extra_vars); + if(!$output->toBool()) return $output; + + // 이미 존재하는 모듈 이름인지 체크 + if(!$args->site_srl) $args->site_srl = 0; + $oModuleModel = &getModel('module'); + if($oModuleModel->isIDExists($args->mid, $args->site_srl)) return new Object(-1, 'msg_module_name_exists'); + + // begin transaction + $oDB = &DB::getInstance(); + $oDB->begin(); + + // 선택된 스킨정보에서 colorset을 구함 + $module_path = ModuleHandler::getModulePath($args->module); + $skin_info = $oModuleModel->loadSkinInfo($module_path, $args->skin); + $skin_vars->colorset = $skin_info->colorset[0]->name; + + // 변수 정리후 query 실행 + if(!$args->module_srl) $args->module_srl = getNextSequence(); + + // 모듈 등록 + $output = executeQuery('module.insertModule', $args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // 모듈 추가 변수 등록 + $this->insertModuleExtraVars($args->module_srl, $extra_vars); + + // commit + $oDB->commit(); + + $output->add('module_srl',$args->module_srl); + return $output; + } + + /** + * @brief 모듈의 정보를 수정 + **/ + function updateModule($args) { + $output = $this->arrangeModuleInfo($args, $extra_vars); + if(!$output->toBool()) return $output; + + // begin transaction + $oDB = &DB::getInstance(); + $oDB->begin(); + + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoByModuleSrl($args->module_srl); + + $args->site_srl = (int)$module_info->site_srl; + if(!$args->browser_title) $args->browser_title = $module_info->browser_title; + + $output = executeQuery('module.isExistsModuleName', $args); + if(!$output->toBool() || $output->data->count) { + $oDB->rollback(); + return new Object(-1, 'msg_module_name_exists'); + } + + $output = executeQuery('module.updateModule', $args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // 모듈 추가 변수 등록 + $this->insertModuleExtraVars($args->module_srl, $extra_vars); + + $oDB->commit(); + + $output->add('module_srl',$args->module_srl); + return $output; + } + + /** + * @brief 모듈의 가상사이트 변경 + **/ + function updateModuleSite($module_srl, $site_srl, $layout_srl = 0) { + $args->module_srl = $module_srl; + $args->site_srl = $site_srl; + $args->layout_srl = $layout_srl; + return executeQuery('module.updateModuleSite', $args); + } + + /** + * @brief 모듈을 삭제 + * + * 모듈 삭제시는 관련 정보들을 모두 삭제 시도한다. + **/ + function deleteModule($module_srl) { + if(!$module_srl) return new Object(-1,'msg_invalid_request'); + + // trigger 호출 (before) + $trigger_obj->module_srl = $module_srl; + $output = ModuleHandler::triggerCall('module.deleteModule', 'before', $trigger_obj); + if(!$output->toBool()) return $output; + + // begin transaction + $oDB = &DB::getInstance(); + $oDB->begin(); + + $args->module_srl = $module_srl; + + // module 정보를 DB에서 삭제 + $output = executeQuery('module.deleteModule', $args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // 권한 정보 삭제 + $this->deleteModuleGrants($module_srl); + + // 스킨 정보 삭제 + $this->deleteModuleSkinVars($module_srl); + + // 모듈 추가 변수 삭제 + $this->deleteModuleExtraVars($module_srl); + + // 모듈 관리자 제거 + $this->deleteAdminId($module_srl); + + // trigger 호출 (after) + if($output->toBool()) { + $trigger_output = ModuleHandler::triggerCall('module.deleteModule', 'after', $trigger_obj); + if(!$trigger_output->toBool()) { + $oDB->rollback(); + return $trigger_output; + } + } + + // commit + $oDB->commit(); + + return $output; + } + + /** + * @brief 모듈의 기타 정보를 변경 + **/ + function updateModuleSkinVars($module_srl, $skin_vars) { + // skin_vars 정보 세팅 + $args->module_srl = $module_srl; + $args->skin_vars = $skin_vars; + $output = executeQuery('module.updateModuleSkinVars', $args); + if(!$output->toBool()) return $output; + + return $output; + } + + /** + * @brief 모든 모듈의 is_default값을 N 으로 세팅 (기본 모듈 해제) + **/ + function clearDefaultModule() { + $output = executeQuery('module.clearDefaultModule'); + if(!$output->toBool()) return $output; + + return $output; + } + + /** + * @brief 지정된 menu_srl에 속한 mid 의 menu_srl 을 변경 + **/ + function updateModuleMenu($args) { + return executeQuery('module.updateModuleMenu', $args); + } + + /** + * @brief 지정된 menu_srl에 속한 mid 의 layout_srl을 변경 + **/ + function updateModuleLayout($layout_srl, $menu_srl_list) { + if(!count($menu_srl_list)) return; + + $args->layout_srl = $layout_srl; + $args->menu_srls = implode(',',$menu_srl_list); + $output = executeQuery('module.updateModuleLayout', $args); + return $output; + } + + /** + * @brief 사이트의 관리를 변경 + **/ + function insertSiteAdmin($site_srl, $arr_admins) { + // 사이트 관리자 제거 + $args->site_srl = $site_srl; + $output = executeQuery('module.deleteSiteAdmin', $args); + if(!$output->toBool()) return $output; + + // 관리자 대상 멤버 번호를 구함 + if(!is_array($arr_admins) || !count($arr_admins)) return new Object(); + foreach($arr_admins as $key => $user_id) { + if(!trim($user_id)) continue; + $admins[] = trim($user_id); + } + if(!count($admins)) return new Object(); + + $args->user_ids = '\''.implode('\',\'',$admins).'\''; + $output = executeQueryArray('module.getAdminSrls', $args); + if(!$output->toBool()||!$output->data) return $output; + + foreach($output->data as $key => $val) { + unset($args); + $args->site_srl = $site_srl; + $args->member_srl = $val->member_srl; + $output = executeQueryArray('module.insertSiteAdmin', $args); + if(!$output->toBool()) return $output; + } + return new Object(); + } + + /** + * @brief 특정 모듈에 관리자 아이디 지정 + **/ + function insertAdminId($module_srl, $admin_id) { + $oMemberModel = &getModel('member'); + $member_info = $oMemberModel->getMemberInfoByUserID($admin_id); + if(!$member_info->member_srl) return; + $args->module_srl = $module_srl; + $args->member_srl = $member_info->member_srl; + return executeQuery('module.insertAdminId', $args); + } + + /** + * @brief 특정 모듈의 관리자 아이디 제거 + **/ + function deleteAdminId($module_srl, $admin_id = '') { + $args->module_srl = $module_srl; + + if($admin_id) { + $oMemberModel = &getModel('member'); + $member_info = $oMemberModel->getMemberInfoByUserID($admin_id); + if($member_info->member_srl) $args->member_srl = $member_info->member_srl; + } + return executeQuery('module.deleteAdminId', $args); + } + + /** + * @brief 특정 모듈에 스킨 변수 등록 + **/ + function insertModuleSkinVars($module_srl, $obj) { + $this->deleteModuleSkinVars($module_srl); + if(!$obj || !count($obj)) return; + + $args->module_srl = $module_srl; + foreach($obj as $key => $val) { + // #17927989 예전 블로그 모듈을 사용하던 게시판의 경우 + // 스킨 정보 필드에 메뉴 항목(stdClass)을 저장해놓은 경우가 있어 + // 1.2.0 이상 버전으로 업그레이드한 후 모듈 업데이트할 때 + // 오류가 발생하는 문제 수정 + if (is_object($val)) continue; + if (is_array($val)) $val = serialize($val); + + $args->name = trim($key); + $args->value = trim($val); + if(!$args->name || !$args->value) continue; + executeQuery('module.insertModuleSkinVars', $args); + } + } + + /** + * @brief 특정 모듈의 스킨 변수 제거 + **/ + function deleteModuleSkinVars($module_srl) { + $args->module_srl = $module_srl; + return executeQuery('module.deleteModuleSkinVars', $args); + } + + /** + * @brief 특정 모듈에 확장 변수 등록 + **/ + function insertModuleExtraVars($module_srl, $obj) { + $this->deleteModuleExtraVars($module_srl); + if(!$obj || !count($obj)) return; + + foreach($obj as $key => $val) { + $args = null; + $args->module_srl = $module_srl; + $args->name = trim($key); + $args->value = trim($val); + if(!$args->name || !$args->value) continue; + executeQuery('module.insertModuleExtraVars', $args); + } + } + + /** + * @brief 특정 모듈의 확장 변수 제거 + **/ + function deleteModuleExtraVars($module_srl) { + $args->module_srl = $module_srl; + return executeQuery('module.deleteModuleExtraVars', $args); + } + + /** + * @brief 특정 모듈에 권한 등록 + **/ + function insertModuleGrants($module_srl, $obj) { + $this->deleteModuleGrants($module_srl); + if(!$obj || !count($obj)) return; + + foreach($obj as $name => $val) { + if(!$val || !count($val)) continue; + + foreach($val as $group_srl) { + $args = null; + $args->module_srl = $module_srl; + $args->name = $name; + $args->group_srl = trim($group_srl); + if(!$args->name || !$args->group_srl) continue; + executeQuery('module.insertModuleGrant', $args); + + } + } + } + + /** + * @brief 특정 모듈의 권한 제거 + **/ + function deleteModuleGrants($module_srl) { + $args->module_srl = $module_srl; + return executeQuery('module.deleteModuleGrants', $args); + } + + /** + * @brief 사용자 정의 언어 변경 + **/ + function replaceDefinedLangCode(&$output) { + $output = preg_replace_callback('!\$user_lang->([a-z0-9\_]+)!is', array($this,'_replaceLangCode'), $output); + } + function _replaceLangCode($matches) { + static $lang = null; + if(is_null($lang)) { + $site_module_info = Context::get('site_module_info'); + $cache_file = sprintf('%sfiles/cache/lang_defined/%d.%s.php', _XE_PATH_, $site_module_info->site_srl, Context::getLangType()); + if(!file_exists($cache_file)) { + $oModuleAdminController = &getAdminController('module'); + $oModuleAdminController->makeCacheDefinedLangCode($site_module_info->site_srl); + } + + if(file_exists($cache_file)) require_once($cache_file); + } + if(!Context::get($matches[1]) && $lang[$matches[1]]) return $lang[$matches[1]]; + + return str_replace('$user_lang->','',$matches[0]); + } + + + /** + * @brief 파일박스에 파일 추가 및 업데이트 + **/ + function procModuleFileBoxAdd(){ + + $logged_info = Context::get('logged_info'); + if($logged_info->is_admin !='Y' && !$logged_info->is_site_admin) return new Object(-1, 'msg_not_permitted'); + + $vars = Context::gets('comment','addfile','filter'); + $module_filebox_srl = Context::get('module_filebox_srl'); + + $ext = strtolower(substr(strrchr($vars->addfile['name'],'.'),1)); + $vars->ext = $ext; + if($vars->filter) $filter = explode(',',$vars->filter); + else $filter = array('jpg','jpeg','gif','png'); + if(!in_array($ext,$filter)) return new Object(-1, 'msg_error_occured'); + + $vars->member_srl = $logged_info->member_srl; + + // update + if($module_filebox_srl > 0){ + $vars->module_filebox_srl = $module_filebox_srl; + $output = $this->updateModuleFileBox($vars); + + // insert + }else{ + if(!Context::isUploaded()) return new Object(-1, 'msg_error_occured'); + $addfile = Context::get('addfile'); + if(!is_uploaded_file($addfile['tmp_name'])) return new Object(-1, 'msg_error_occured'); + if($vars->addfile['error'] != 0) return new Object(-1, 'msg_error_occured'); + $output = $this->insertModuleFileBox($vars); + } + + $url = getUrl('','module','module','act','dispModuleFileBox','input',Context::get('input'),'filter',$vars->filter); + $url = html_entity_decode($url); + $vars = Context::set('url',$url); + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('move_filebox_list'); + } + + + /** + * @brief 파일박스에 파일 업데이트 + **/ + function updateModuleFileBox($vars){ + + // have file + if($vars->addfile['tmp_name'] && is_uploaded_file($vars->addfile['tmp_name'])){ + $oModuleModel = &getModel('module'); + $output = $oModuleModel->getModuleFileBox($vars->module_filebox_srl); + FileHandler::removeFile($output->data->filename); + + $path = $oModuleModel->getModuleFileBoxPath($vars->module_filebox_srl); + FileHandler::makeDir($path); + + $save_filename = sprintf('%s%s.%s',$path, $vars->module_filebox_srl, $ext); + $tmp = $vars->addfile['tmp_name']; + + if(!@move_uploaded_file($tmp, $save_filename)) { + return false; + } + + $args->fileextension = strtolower(substr(strrchr($vars->addfile['name'],'.'),1)); + $args->filename = $save_filename; + $args->filesize = $vars->addfile['size']; + + } + + $args->module_filebox_srl = $vars->module_filebox_srl; + $args->comment = $vars->comment; + + return executeQuery('module.updateModuleFileBox', $vars); + } + + + /** + * @brief 파일박스에 파일 추가 + **/ + function insertModuleFileBox($vars){ + // set module_filebox_srl + $vars->module_filebox_srl = getNextSequence(); + + // get file path + $oModuleModel = &getModel('module'); + $path = $oModuleModel->getModuleFileBoxPath($vars->module_filebox_srl); + FileHandler::makeDir($path); + $save_filename = sprintf('%s%s.%s',$path, $vars->module_filebox_srl, $vars->ext); + $tmp = $vars->addfile['tmp_name']; + + // upload + if(!@move_uploaded_file($tmp, $save_filename)) { + return false; + } + + + // insert + $args->module_filebox_srl = $vars->module_filebox_srl; + $args->member_srl = $vars->member_srl; + $args->comment = $vars->comment; + $args->filename = $save_filename; + $args->fileextension = strtolower(substr(strrchr($vars->addfile['name'],'.'),1)); + $args->filesize = $vars->addfile['size']; + + $output = executeQuery('module.insertModuleFileBox', $args); + return $output; + } + + + /** + * @brief 파일박스에 파일 삭제 + **/ + + function procModuleFileBoxDelete(){ + $logged_info = Context::get('logged_info'); + if($logged_info->is_admin !='Y' && !$logged_info->is_site_admin) return new Object(-1, 'msg_not_permitted'); + + $module_filebox_srl = Context::get('module_filebox_srl'); + if(!$module_filebox_srl) return new Object(-1, 'msg_invalid_request'); + $vars->module_filebox_srl = $module_filebox_srl; + $output = $this->deleteModuleFileBox($vars); + if(!$output->toBool()) return $output; + } + + function deleteModuleFileBox($vars){ + + // delete real file + $oModuleModel = &getModel('module'); + $output = $oModuleModel->getModuleFileBox($vars->module_filebox_srl); + FileHandler::removeFile($output->data->filename); + + $args->module_filebox_srl = $vars->module_filebox_srl; + return executeQuery('module.deleteModuleFileBox', $args); + } + + /** + * @brief function of locking (timeout is in seconds) + */ + function lock($lock_name, $timeout, $member_srl = null) { + $this->unlockTimeoutPassed(); + $args->lock_name = $lock_name; + if(!$timeout) $timeout = 60; + $args->deadline = date("YmdHis", time() + $timeout); + if($member_srl) $args->member_srl = $member_srl; + $output = executeQuery('module.insertLock', $args); + if($output->toBool()) { + $output->add('lock_name', $lock_name); + $output->add('deadline', $args->deadline); + } + return $output; + } + + function unlockTimeoutPassed() { + executeQuery('module.deleteLocksTimeoutPassed'); + } + + function unlock($lock_name, $deadline) { + $args->lock_name = $lock_name; + $args->deadline = $deadline; + $output = executeQuery('module.deleteLock', $args); + return $output; + } + + function updateModuleInSites($site_srls, $args) + { + $args->site_srls = $site_srls; + $output = executeQuery('module.updateModuleInSites', $args); + return $output; + } + } +?> diff --git a/modules/module/module.model.php b/modules/module/module.model.php index 88874af95..86f47fca0 100644 --- a/modules/module/module.model.php +++ b/modules/module/module.model.php @@ -1,1333 +1,1333 @@ -mid = $id; - $args->site_srl = $site_srl; - $output = executeQuery('module.isExistsModuleName', $args); - if($output->data->count) return true; - - // vid 검사 (site_srl이 0일때 즉 가상사이트가 아닌 경우 mid != vid임을 체크) - if(!$site_srl) { - $site_args->domain = $id; - $output = executeQuery('module.isExistsSiteDomain', $site_args); - if($output->data->count) return true; - } - - return false; - } - - /** - * @brief site 정보를 구함 - **/ - function getSiteInfo($site_srl) { - $args->site_srl = $site_srl; - $output = executeQuery('module.getSiteInfo', $args); - return $output->data; - } - - function getSiteInfoByDomain($domain) { - $args->domain= $domain; - $output = executeQuery('module.getSiteInfoByDomain', $args); - return $output->data; - } - - /** - * @brief document_srl로 모듈의 정보르 구함 - * 이 경우는 캐시파일을 이용할 수가 없음 - **/ - function getModuleInfoByDocumentSrl($document_srl) { - $args->document_srl = $document_srl; - $output = executeQuery('module.getModuleInfoByDocument', $args); - return $this->addModuleExtraVars($output->data); - } - - /** - * @brief domain에 따른 기본 mid를 구함 - **/ - function getDefaultMid() { - $default_url = preg_replace('/\/$/','',Context::getDefaultUrl()); - $request_url = preg_replace('/\/$/','',Context::getRequestUri()); - $vid = Context::get('vid'); - $mid = Context::get('mid'); - - // 기본 URL이 설정되어 있고 이 기본 URL과 요청 URL이 다르면 가상 사이트 확인 - if($default_url && $default_url != $request_url) { - $url_info = parse_url($request_url); - $hostname = $url_info['host']; - $path = preg_replace('/\/$/','',$url_info['path']); - $sites_args->domain = sprintf('%s%s%s', $hostname, $url_info['port']&&$url_info['port']!=80?':'.$url_info['port']:'',$path); - $output = executeQuery('module.getSiteInfoByDomain', $sites_args); - } - if(!$output || !$output->data) - { - if(!$vid) $vid = $mid; - if($vid) { - $vid_args->domain = $vid; - $output = executeQuery('module.getSiteInfoByDomain', $vid_args); - if($output->toBool() && $output->data) { - Context::set('vid', $output->data->domain, true); - if($mid==$output->data->domain) Context::set('mid',$output->data->mid,true); - } - } - } - - // 가상 사이트가 아닐 경우 기본 사이트 정보를 구함 - if(!$output->data) { - $args->site_srl = 0; - $output = executeQuery('module.getSiteInfo', $args); - - // 기본 사이트 정보가 없으면 관련된 정보를 갱신 - if(!$output->data) { - // sites 테이블이 없을 경우 생성 - $oDB = &DB::getInstance(); - if(!$oDB->isTableExists('sites')) $oDB->createTableByXmlFile(_XE_PATH_.'modules/module/schemas/sites.xml'); - if(!$oDB->isTableExists('sites')) return; - - // 기본 mid, 언어 구함 - $mid_output = $oDB->executeQuery('module.getDefaultMidInfo', $args); - $db_info = Context::getDBInfo(); - $domain = Context::getDefaultUrl(); - $url_info = parse_url($domain); - $domain = $url_info['host'].( (!empty($url_info['port'])&&$url_info['port']!=80)?':'.$url_info['port']:'').$url_info['path']; - $site_args->site_srl = 0; - $site_args->index_module_srl = $mid_output->data->module_srl; - $site_args->domain = $domain; - $site_args->default_language = $db_info->lang_type; - - if($output->data && !$output->data->index_module_srl) { - $output = executeQuery('module.updateSite', $site_args); - } else { - $output = executeQuery('module.insertSite', $site_args); - if(!$output->toBool()) return $output; - } - $output = executeQuery('module.getSiteInfo', $args); - } - } - $module_info = $output->data; - if(!$module_info->module_srl) return $module_info; - if(is_array($module_info) && $module_info->data[0]) $module_info = $module_info[0]; - return $this->addModuleExtraVars($module_info); - } - - /** - * @brief mid로 모듈의 정보를 구함 - **/ - function getModuleInfoByMid($mid, $site_srl = 0) { - $args->mid = $mid; - $args->site_srl = (int)$site_srl; - $output = executeQuery('module.getMidInfo', $args); - $module_info = $output->data; - if(!$module_info->module_srl && $module_info->data[0]) $module_info = $module_info->data[0]; - return $this->addModuleExtraVars($module_info); - } - - /** - * @brief module_srl에 해당하는 모듈의 정보를 구함 - **/ - function getModuleInfoByModuleSrl($module_srl) { - // 데이터를 가져옴 - $args->module_srl = $module_srl; - $output = executeQuery('module.getMidInfo', $args); - if(!$output->data) return; - $module_info = $this->addModuleExtraVars($output->data); - return $module_info; - } - - /** - * @brief layout_srl에 해당하는 모듈의 정보를 구함 - **/ - function getModulesInfoByLayout($layout_srl) { - // 데이터를 가져옴 - $args->layout_srl = $layout_srl; - $output = executeQueryArray('module.getModulesByLayout', $args); - - $count = count($output->data); - - $modules = array(); - for($i=0;$i<$count;$i++) { - $modules[] = $output->data[$i]; - } - return $this->addModuleExtraVars($modules); - } - - /** - * @brief 여러개의 module_srl에 해당하는 모듈의 정보를 구함 - **/ - function getModulesInfo($module_srls) { - if(is_array($module_srls)) $module_srls = implode(',',$module_srls); - $args->module_srls = $module_srls; - $output = executeQueryArray('module.getModulesInfo', $args); - if(!$output->toBool()) return; - return $this->addModuleExtraVars($output->data); - } - - /** - * @brief 모듈의 기본 정보에 추가 변수 구함 - **/ - function addModuleExtraVars($module_info) { - // 1개 이상의 모듈정보를 요청받아도 처리 가능하도록 - if(!is_array($module_info)) $target_module_info = array($module_info); - else $target_module_info = $module_info; - - // 모듈 번호를 구함 - $module_srls = array(); - foreach($target_module_info as $key => $val) { - $module_srl = $val->module_srl; - if(!$module_srl) continue; - $module_srls[] = $val->module_srl; - } - - // 모듈의 추가정보/ 스킨 정보를 추출 - $extra_vars = $this->getModuleExtraVars($module_srls); - if(!count($module_srls) || !count($extra_vars)) return $module_info; - - foreach($target_module_info as $key => $val) { - if(!$extra_vars[$val->module_srl] || !count($extra_vars[$val->module_srl])) continue; - foreach($extra_vars[$val->module_srl] as $k => $v) { - if($target_module_info[$key]->{$k}) continue; - $target_module_info[$key]->{$k} = $v; - } - } - if(is_array($module_info)) return $target_module_info; - return $target_module_info[0]; - } - - /** - * @brief DB에 생성된 mid 전체 목록을 구해옴 - **/ - function getMidList($args = null) { - $output = executeQuery('module.getMidList', $args); - if(!$output->toBool()) return $output; - - $list = $output->data; - if(!$list) return; - - if(!is_array($list)) $list = array($list); - - foreach($list as $val) { - $mid_list[$val->mid] = $val; - } - return $mid_list; - } - - /** - * @brief mid 목록에 대응하는 module_srl을 배열로 return - **/ - function getModuleSrlByMid($mid) { - if($mid && !is_array($mid)) $mid = explode(',',$mid); - if(is_array($mid)) $mid = "'".implode("','",$mid)."'"; - - $site_module_info = Context::get('site_module_info'); - - $args->mid = $mid; - if($site_module_info) $args->site_srl = $site_module_info->site_srl; - $output = executeQuery('module.getModuleSrlByMid', $args); - if(!$output->toBool()) return $output; - - $list = $output->data; - if(!$list) return; - if(!is_array($list)) $list = array($list); - - foreach($list as $key => $val) { - $module_srl_list[] = $val->module_srl; - } - - return $module_srl_list; - } - - /** - * @brief act 값에 의한 forward 값을 구함 - **/ - function getActionForward($act, $module = "") { - $args->act = $act; - $args->module = ($module)?$module:null; - if (strlen ($args->module) > 0) $output = executeQuery ('module.getActionForwardWithModule', $args); - else $output = executeQuery('module.getActionForward',$args); - return $output->data; - } - - /** - * @brief trigger_name에 등록된 모든 목록을 추출 - **/ - function getTriggers($trigger_name, $called_position) { - $args->trigger_name = $trigger_name; - $args->called_position = $called_position; - $output = executeQueryArray('module.getTriggers',$args); - return $output->data; - } - - /** - * @brief 특정 trigger_name의 특정 대상을 추출 - **/ - function getTrigger($trigger_name, $module, $type, $called_method, $called_position) { - $args->trigger_name = $trigger_name; - $args->module = $module; - $args->type = $type; - $args->called_method = $called_method; - $args->called_position = $called_position; - $output = executeQuery('module.getTrigger',$args); - return $output->data; - } - - /** - * @brief 특정 module extend 가져옴 - **/ - function getModuleExtend($parent_module, $type, $kind='') { - $key = $parent_module.'.'.$kind.'.'.$type; - - $module_extend_info = $this->loadModuleExtends(); - if(array_key_exists($key, $module_extend_info)) - { - return $module_extend_info[$key]; - } - - return false; - } - - /** - * @brief 모든 module extend 가져옴 - **/ - function loadModuleExtends() { - $cache_file = './files/config/module_extend.php'; - $cache_file = FileHandler::getRealPath($cache_file); - - if(!isset($GLOBALS['__MODULE_EXTEND__'])){ - - // check pre install - if(file_exists(FileHandler::getRealPath('./files')) && !file_exists($cache_file)) { - $arr = array(); - $output = executeQueryArray('module.getModuleExtend'); - if($output->data){ - foreach($output->data as $v){ - $arr[] = sprintf("'%s.%s.%s' => '%s'", $v->parent_module, $v->kind, $v->type, $v->extend_module); - } - } - - $str = ''; - $str = sprintf($str, join(',',$arr)); - - FileHandler::writeFile($cache_file, $str); - } - - - if(file_exists($cache_file)) { - $GLOBALS['__MODULE_EXTEND__'] = include($cache_file); - } else { - $GLOBALS['__MODULE_EXTEND__'] = array(); - } - } - - return $GLOBALS['__MODULE_EXTEND__']; - } - - /** - * @brief 모듈의 conf/info.xml 을 읽어서 정보를 구함 - **/ - function getModuleInfoXml($module) { - // 요청된 모듈의 경로를 구한다. 없으면 return - $module_path = ModuleHandler::getModulePath($module); - if(!$module_path) return; - - // 현재 선택된 모듈의 스킨의 정보 xml 파일을 읽음 - $xml_file = sprintf("%s/conf/info.xml", $module_path); - if(!file_exists($xml_file)) return; - - $oXmlParser = new XmlParser(); - $tmp_xml_obj = $oXmlParser->loadXmlFile($xml_file); - $xml_obj = $tmp_xml_obj->module; - - if(!$xml_obj) return; - - // 모듈 정보 - if($xml_obj->version && $xml_obj->attrs->version == '0.2') { - // module format 0.2 - $module_info->title = $xml_obj->title->body; - $module_info->description = $xml_obj->description->body; - $module_info->version = $xml_obj->version->body; - $module_info->homepage = $xml_obj->link->body; - $module_info->category = $xml_obj->category->body; - if(!$module_info->category) $module_info->category = 'service'; - sscanf($xml_obj->date->body, '%d-%d-%d', $date_obj->y, $date_obj->m, $date_obj->d); - $module_info->date = sprintf('%04d%02d%02d', $date_obj->y, $date_obj->m, $date_obj->d); - $module_info->license = $xml_obj->license->body; - $module_info->license_link = $xml_obj->license->attrs->link; - - if(!is_array($xml_obj->author)) $author_list[] = $xml_obj->author; - else $author_list = $xml_obj->author; - - foreach($author_list as $author) { - unset($author_obj); - $author_obj->name = $author->name->body; - $author_obj->email_address = $author->attrs->email_address; - $author_obj->homepage = $author->attrs->link; - $module_info->author[] = $author_obj; - } - - // history - if($xml_obj->history) { - if(!is_array($xml_obj->history)) $history[] = $xml_obj->history; - else $history = $xml_obj->history; - - foreach($history as $item) { - unset($obj); - - if($item->author) { - (!is_array($item->author)) ? $obj->author_list[] = $item->author : $obj->author_list = $item->author; - - foreach($obj->author_list as $author) { - unset($author_obj); - $author_obj->name = $author->name->body; - $author_obj->email_address = $author->attrs->email_address; - $author_obj->homepage = $author->attrs->link; - $obj->author[] = $author_obj; - } - } - - $obj->name = $item->name->body; - $obj->email_address = $item->attrs->email_address; - $obj->homepage = $item->attrs->link; - $obj->version = $item->attrs->version; - $obj->date = $item->attrs->date; - $obj->description = $item->description->body; - - if($item->log) { - (!is_array($item->log)) ? $obj->log[] = $item->log : $obj->log = $item->log; - - foreach($obj->log as $log) { - unset($logs_obj); - $logs_obj->text = $log->body; - $logs_obj->link = $log->attrs->link; - $obj->logs[] = $logs_obj; - } - } - - $module_info->history[] = $obj; - } - } - - - } else { - // module format 0.1 - $module_info->title = $xml_obj->title->body; - $module_info->description = $xml_obj->author->description->body; - $module_info->version = $xml_obj->attrs->version; - $module_info->category = $xml_obj->attrs->category; - if(!$module_info->category) $module_info->category = 'service'; - sscanf($xml_obj->author->attrs->date, '%d. %d. %d', $date_obj->y, $date_obj->m, $date_obj->d); - $module_info->date = sprintf('%04d%02d%02d', $date_obj->y, $date_obj->m, $date_obj->d); - $author_obj->name = $xml_obj->author->name->body; - $author_obj->email_address = $xml_obj->author->attrs->email_address; - $author_obj->homepage = $xml_obj->author->attrs->link; - $module_info->author[] = $author_obj; - } - - // action 정보를 얻어서 admin_index를 추가 - $action_info = $this->getModuleActionXml($module); - $module_info->admin_index_act = $action_info->admin_index_act; - $module_info->default_index_act = $action_info->default_index_act; - $module_info->setup_index_act = $action_info->setup_index_act; - - return $module_info; - } - - /** - * @brief module의 conf/module.xml 을 통해 grant(권한) 및 action 데이터를 return - * module.xml 파일의 경우 파싱하는데 시간이 걸리기에 캐싱을 한다... - * 캐싱을 할때 바로 include 할 수 있도록 역시 코드까지 추가하여 캐싱을 한다. - * 이게 퍼포먼스 상으로는 좋은데 어떤 부정적인 결과를 유도할지는 잘 모르겠... - **/ - function getModuleActionXml($module) { - // 요청된 모듈의 경로를 구한다. 없으면 return - $class_path = ModuleHandler::getModulePath($module); - if(!$class_path) return; - - // 해당 경로에 module.xml 파일이 있는지 체크한다. 없으면 return - $xml_file = sprintf("%sconf/module.xml", $class_path); - if(!file_exists($xml_file)) return; - - // 캐시된 파일이 있는지 확인 - $cache_file = sprintf("./files/cache/module_info/%s.%s.php", $module, Context::getLangType()); - - // 캐시 파일이 없거나 캐시 파일이 xml 파일보다 오래되었으면 내용 다시 갱신 - if(!file_exists($cache_file) || filemtime($cache_file)module)) return; ///< xml 내용중에 module 태그가 없다면 오류;; - - $grants = $xml_obj->module->grants->grant; ///< 권한 정보 (없는 경우도 있음) - $permissions = $xml_obj->module->permissions->permission; ///< 권한 대행 (없는 경우도 있음) - $actions = $xml_obj->module->actions->action; ///< action list (필수) - - $default_index = $admin_index = ''; - - // 권한 정보의 정리 - if($grants) { - if(is_array($grants)) $grant_list = $grants; - else $grant_list[] = $grants; - - foreach($grant_list as $grant) { - $name = $grant->attrs->name; - $default = $grant->attrs->default?$grant->attrs->default:'guest'; - $title = $grant->title->body; - - $info->grant->{$name}->title = $title; - $info->grant->{$name}->default = $default; - - $buff .= sprintf('$info->grant->%s->title=\'%s\';', $name, $title); - $buff .= sprintf('$info->grant->%s->default=\'%s\';', $name, $default); - } - } - - // 권한 허용 정리 - if($permissions) { - if(is_array($permissions)) $permission_list = $permissions; - else $permission_list[] = $permissions; - - foreach($permission_list as $permission) { - $action = $permission->attrs->action; - $target = $permission->attrs->target; - - $info->permission->{$action} = $target; - - $buff .= sprintf('$info->permission->%s = \'%s\';', $action, $target); - } - } - - // actions 정리 - if($actions) { - if(is_array($actions)) $action_list = $actions; - else $action_list[] = $actions; - - foreach($action_list as $action) { - $name = $action->attrs->name; - - $type = $action->attrs->type; - $grant = $action->attrs->grant?$action->attrs->grant:'guest'; - $standalone = $action->attrs->standalone=='true'?'true':'false'; - - $index = $action->attrs->index; - $admin_index = $action->attrs->admin_index; - $setup_index = $action->attrs->setup_index; - - $output->action->{$name}->type = $type; - $output->action->{$name}->grant = $grant; - $output->action->{$name}->standalone= $standalone; - - $info->action->{$name}->type = $type; - $info->action->{$name}->grant = $grant; - $info->action->{$name}->standalone = $standalone=='true'?true:false; - - $buff .= sprintf('$info->action->%s->type=\'%s\';', $name, $type); - $buff .= sprintf('$info->action->%s->grant=\'%s\';', $name, $grant); - $buff .= sprintf('$info->action->%s->standalone=%s;', $name, $standalone); - - if($index=='true') { - $default_index_act = $name; - $info->default_index_act = $name; - } - if($admin_index=='true') { - $admin_index_act = $name; - $info->admin_index_act = $name; - } - if($setup_index=='true') { - $setup_index_act = $name; - $info->setup_index_act = $name; - } - } - } - $buff = sprintf('default_index_act = \'%s\';$info->setup_index_act=\'%s\';$info->admin_index_act = \'%s\';%s?>', $default_index_act, $setup_index_act, $admin_index_act, $buff); - - FileHandler::writeFile($cache_file, $buff); - - return $info; - } - - @include($cache_file); - - return $info; - } - - - /** - * @brief 주어진 곳의 스킨 목록을 구함 - * 스킨과 skin.xml 파일을 분석 정리한 결과를 return - **/ - function getSkins($path, $dir = 'skins') { - $skin_path = sprintf("%s/%s/", $path, $dir); - $list = FileHandler::readDir($skin_path); - if(!count($list)) return; - - natcasesort($list); - - foreach($list as $skin_name) { - unset($skin_info); - $skin_info = $this->loadSkinInfo($path, $skin_name, $dir); - if(!$skin_info) $skin_info->title = $skin_name; - - $skin_list[$skin_name] = $skin_info; - } - - return $skin_list; - } - - /** - * @brief 특정 위치의 특정 스킨의 정보를 구해옴 - **/ - function loadSkinInfo($path, $skin, $dir = 'skins') { - - // 모듈의 스킨의 정보 xml 파일을 읽음 - if(substr($path,-1)!='/') $path .= '/'; - $skin_xml_file = sprintf("%s%s/%s/skin.xml", $path, $dir, $skin); - if(!file_exists($skin_xml_file)) return; - - // XmlParser 객체 생성 - $oXmlParser = new XmlParser(); - $_xml_obj = $oXmlParser->loadXmlFile($skin_xml_file); - - // 스킨 정보가 없으면 return - if(!$_xml_obj->skin) return; - $xml_obj = $_xml_obj->skin; - - // 스킨이름 - $skin_info->title = $xml_obj->title->body; - - - // 작성자 정보 - if($xml_obj->version && $xml_obj->attrs->version == '0.2') { - // skin format v0.2 - sscanf($xml_obj->date->body, '%d-%d-%d', $date_obj->y, $date_obj->m, $date_obj->d); - $skin_info->version = $xml_obj->version->body; - $skin_info->date = sprintf('%04d%02d%02d', $date_obj->y, $date_obj->m, $date_obj->d); - $skin_info->homepage = $xml_obj->link->body; - $skin_info->license = $xml_obj->license->body; - $skin_info->license_link = $xml_obj->license->attrs->link; - $skin_info->description = $xml_obj->description->body; - - if(!is_array($xml_obj->author)) $author_list[] = $xml_obj->author; - else $author_list = $xml_obj->author; - - foreach($author_list as $author) { - unset($author_obj); - $author_obj->name = $author->name->body; - $author_obj->email_address = $author->attrs->email_address; - $author_obj->homepage = $author->attrs->link; - $skin_info->author[] = $author_obj; - } - - // 확장변수를 정리 - if($xml_obj->extra_vars) { - $extra_var_groups = $xml_obj->extra_vars->group; - if(!$extra_var_groups) $extra_var_groups = $xml_obj->extra_vars; - if(!is_array($extra_var_groups)) $extra_var_groups = array($extra_var_groups); - - foreach($extra_var_groups as $group) { - $extra_vars = $group->var; - if(!is_array($group->var)) $extra_vars = array($group->var); - - foreach($extra_vars as $key => $val) { - unset($obj); - if(!$val->attrs->type) { $val->attrs->type = 'text'; } - - $obj->group = $group->title->body; - $obj->name = $val->attrs->name; - $obj->title = $val->title->body; - $obj->type = $val->attrs->type; - $obj->description = $val->description->body; - $obj->value = $extra_vals->{$obj->name}; - $obj->default = $val->attrs->default; - if(strpos($obj->value, '|@|') != false) { $obj->value = explode('|@|', $obj->value); } - if($obj->type == 'mid_list' && !is_array($obj->value)) { $obj->value = array($obj->value); } - - // 'select'type에서 option목록을 구한다. - if(is_array($val->options)) { - $option_count = count($val->options); - - for($i = 0; $i < $option_count; $i++) { - $obj->options[$i]->title = $val->options[$i]->title->body; - $obj->options[$i]->value = $val->options[$i]->attrs->value; - } - } else { - $obj->options[0]->title = $val->options->title->body; - $obj->options[0]->value = $val->options->attrs->value; - } - - $skin_info->extra_vars[] = $obj; - } - } - } - - // history - if($xml_obj->history) { - if(!is_array($xml_obj->history)) $history[] = $xml_obj->history; - else $history = $xml_obj->history; - - foreach($history as $item) { - unset($obj); - - if($item->author) { - (!is_array($item->author)) ? $obj->author_list[] = $item->author : $obj->author_list = $item->author; - - foreach($obj->author_list as $author) { - unset($author_obj); - $author_obj->name = $author->name->body; - $author_obj->email_address = $author->attrs->email_address; - $author_obj->homepage = $author->attrs->link; - $obj->author[] = $author_obj; - } - } - - $obj->name = $item->name->body; - $obj->email_address = $item->attrs->email_address; - $obj->homepage = $item->attrs->link; - $obj->version = $item->attrs->version; - $obj->date = $item->attrs->date; - $obj->description = $item->description->body; - - if($item->log) { - (!is_array($item->log)) ? $obj->log[] = $item->log : $obj->log = $item->log; - - foreach($obj->log as $log) { - unset($log_obj); - $log_obj->text = $log->body; - $log_obj->link = $log->attrs->link; - $obj->logs[] = $log_obj; - } - } - - $skin_info->history[] = $obj; - } - } - - - } else { - - // skin format v0.1 - sscanf($xml_obj->maker->attrs->date, '%d-%d-%d', $date_obj->y, $date_obj->m, $date_obj->d); - - $skin_info->version = $xml_obj->version->body; - $skin_info->date = sprintf('%04d%02d%02d', $date_obj->y, $date_obj->m, $date_obj->d); - $skin_info->homepage = $xml_obj->link->body; - $skin_info->license = $xml_obj->license->body; - $skin_info->license_link = $xml_obj->license->attrs->link; - $skin_info->description = $xml_obj->maker->description->body; - - $skin_info->author[0]->name = $xml_obj->maker->name->body; - $skin_info->author[0]->email_address = $xml_obj->maker->attrs->email_address; - $skin_info->author[0]->homepage = $xml_obj->maker->attrs->link; - - // 스킨에서 사용되는 변수들 - $extra_var_groups = $xml_obj->extra_vars->group; - if(!$extra_var_groups) $extra_var_groups = $xml_obj->extra_vars; - if(!is_array($extra_var_groups)) $extra_var_groups = array($extra_var_groups); - - foreach($extra_var_groups as $group){ - $extra_vars = $group->var; - - if($extra_vars) { - - if(!is_array($extra_vars)) $extra_vars = array($extra_vars); - - foreach($extra_vars as $var) { - unset($obj); - unset($options); - - $group = $group->title->body; - $name = $var->attrs->name; - $type = $var->attrs->type; - $title = $var->title->body; - $description = $var->description->body; - - // 'select'type에서 option목록을 구한다. - if(is_array($var->default)) { - $option_count = count($var->default); - - for($i = 0; $i < $option_count; $i++) { - $options[$i]->title = $var->default[$i]->body; - $options[$i]->value = $var->default[$i]->body; - } - } else { - $options[0]->title = $var->default->body; - $options[0]->value = $var->default->body; - } - - $width = $var->attrs->width; - $height = $var->attrs->height; - - unset($obj); - $obj->group = $group; - $obj->title = $title; - $obj->description = $description; - $obj->name = $name; - $obj->type = $type; - $obj->options = $options; - $obj->width = $width; - $obj->height = $height; - $obj->default = $options[0]->value; - - $skin_info->extra_vars[] = $obj; - } - } - } - } - - // colorset - $colorset = $xml_obj->colorset->color; - if($colorset) { - if(!is_array($colorset)) $colorset = array($colorset); - - foreach($colorset as $color) { - $name = $color->attrs->name; - $title = $color->title->body; - $screenshot = $color->attrs->src; - if($screenshot) { - $screenshot = sprintf("%sskins/%s/%s", $path, $skin, $screenshot); - if(!file_exists($screenshot)) $screenshot = ""; - } else $screenshot = ""; - - unset($obj); - $obj->name = $name; - $obj->title = $title; - $obj->screenshot = $screenshot; - $skin_info->colorset[] = $obj; - } - } - - // 메뉴 종류 (레이아웃을 위한 설정) - if($xml_obj->menus->menu) { - $menus = $xml_obj->menus->menu; - if(!is_array($menus)) $menus = array($menus); - - $menu_count = count($menus); - $skin_info->menu_count = $menu_count; - for($i=0;$i<$menu_count;$i++) { - unset($obj); - - $obj->name = $menus[$i]->attrs->name; - if($menus[$i]->attrs->default == "true") $obj->default = true; - $obj->title = $menus[$i]->title->body; - $obj->maxdepth = $menus[$i]->maxdepth->body; - - $skin_info->menu->{$obj->name} = $obj; - } - } - - return $skin_info; - } - - /** - * @brief 특정 가상 사이트에 등록된 특정 모듈의 개수를 return - **/ - function getModuleCount($site_srl, $module = null) { - $args->site_srl = $site_srl; - if(!is_null($module)) $args->module = $module; - $output = executeQuery('module.getModuleCount', $args); - return $output->data->count; - } - - /** - * @brief 특정 모듈의 설정 return - * board, member등 특정 모듈의 global config 관리용 - **/ - function getModuleConfig($module) { - if(!$GLOBALS['__ModuleConfig__'][$module]) { - $args->module = $module; - $output = executeQuery('module.getModuleConfig', $args); - $config = unserialize($output->data->config); - $GLOBALS['__ModuleConfig__'][$module] = $config; - } - return $GLOBALS['__ModuleConfig__'][$module]; - } - - /** - * @brief 특정 mid의 모듈 설정 정보 return - * mid의 모듈 의존적인 설정을 관리 - **/ - function getModulePartConfig($module, $module_srl) { - if(!$GLOBALS['__ModulePartConfig__'][$module][$module_srl]) { - $args->module = $module; - $args->module_srl = $module_srl; - $output = executeQuery('module.getModulePartConfig', $args); - $config = unserialize($output->data->config); - $GLOBALS['__ModulePartConfig__'][$module][$module_srl] = $config; - } - return $GLOBALS['__ModulePartConfig__'][$module][$module_srl]; - } - - /** - * @brief mid별 모듈 설정 정보 전체를 구함 - **/ - function getModulePartConfigs($module, $site_srl = 0) { - $args->module = $module; - if($site_srl) $args->site_srl = $site_srl; - $output = executeQueryArray('module.getModulePartConfigs', $args); - if(!$output->toBool() || !$output->data) return array(); - - foreach($output->data as $key => $val) { - $result[$val->module_srl] = unserialize($val->config); - } - return $result; - } - - - /** - * @brief 모듈 카테고리의 목록을 구함 - **/ - function getModuleCategories() { - // 데이터를 DB에서 가져옴 - $output = executeQuery('module.getModuleCategories'); - if(!$output->toBool()) return $output; - $list = $output->data; - if(!$list) return; - if(!is_array($list)) $list = array($list); - - foreach($list as $val) { - $category_list[$val->module_category_srl] = $val; - } - return $category_list; - } - - /** - * @brief 특정 모듈 카테고리의 내용을 구함 - **/ - function getModuleCategory($module_category_srl) { - // 데이터를 DB에서 가져옴 - $args->module_category_srl = $module_category_srl; - $output = executeQuery('module.getModuleCategory', $args); - if(!$output->toBool()) return $output; - return $output->data; - } - - /** - * @brief 모듈의 xml 정보만 구함 - **/ - function getModulesXmlInfo() { - // 다운받은 모듈과 설치된 모듈의 목록을 구함 - $searched_list = FileHandler::readDir('./modules'); - $searched_count = count($searched_list); - if(!$searched_count) return; - sort($searched_list); - - for($i=0;$i<$searched_count;$i++) { - // 모듈의 이름 - $module_name = $searched_list[$i]; - - $path = ModuleHandler::getModulePath($module_name); - - // 해당 모듈의 정보를 구함 - $info = $this->getModuleInfoXml($module_name); - unset($obj); - - $info->module = $module_name; - $info->created_table_count = $created_table_count; - $info->table_count = $table_count; - $info->path = $path; - $info->admin_index_act = $info->admin_index_act; - $list[] = $info; - } - return $list; - } - - function checkNeedInstall($module_name) - { - $oDB = &DB::getInstance(); - $info = null; - - $moduledir = ModuleHandler::getModulePath($module_name); - if(file_exists(FileHandler::getRealPath($moduledir."schemas"))) - { - $tmp_files = FileHandler::readDir($moduledir."schemas", '/(\.xml)$/'); - $table_count = count($tmp_files); - - // 테이블이 설치되어 있는지 체크 - $created_table_count = 0; - for($j=0;$jisTableExists($table_name)) $created_table_count ++; - } - - // 설치 유무 체크 (설치는 DB의 설치만 관리) - if($table_count > $created_table_count) return true; - else return false; - } - return false; - } - - function checkNeedUpdate($module_name) - { - // 각 모듈의 module.class.php로 upgrade 유무 체크 - $oDummy = &getModule($module_name, 'class'); - if($oDummy && method_exists($oDummy, "checkUpdate")) { - return $oDummy->checkUpdate(); - } - return false; - } - - /** - * @brief 모듈의 종류와 정보를 구함 - **/ - function getModuleList() { - // DB 객체 생성 - $oDB = &DB::getInstance(); - - // 다운받은 모듈과 설치된 모듈의 목록을 구함 - $searched_list = FileHandler::readDir('./modules'); - sort($searched_list); - - $searched_count = count($searched_list); - if(!$searched_count) return; - - for($i=0;$i<$searched_count;$i++) { - // 모듈의 이름 - $module_name = $searched_list[$i]; - - $path = ModuleHandler::getModulePath($module_name); - - // schemas내의 테이블 생성 xml파일수를 구함 - $tmp_files = FileHandler::readDir($path."schemas", '/(\.xml)$/'); - $table_count = count($tmp_files); - - // 테이블이 설치되어 있는지 체크 - $created_table_count = 0; - for($j=0;$jisTableExists($table_name)) $created_table_count ++; - } - - // 해당 모듈의 정보를 구함 - $info = $this->getModuleInfoXml($module_name); - unset($obj); - - $info->module = $module_name; - $info->category = $info->category; - $info->created_table_count = $created_table_count; - $info->table_count = $table_count; - $info->path = $path; - $info->admin_index_act = $info->admin_index_act; - - // 설치 유무 체크 (설치는 DB의 설치만 관리) - if($table_count > $created_table_count) $info->need_install = true; - else $info->need_install = false; - - // 각 모듈의 module.class.php로 upgrade 유무 체크 - $oDummy = null; - $oDummy = &getModule($module_name, 'class'); - if($oDummy && method_exists($oDummy, "checkUpdate")) { - $info->need_update = $oDummy->checkUpdate(); - } - else - { - continue; - } - - $list[] = $info; - } - return $list; - } - - /** - * @brief 특정 module srls를 sites의 domain과 결합 - * 아직 XE DBHandler에서 left outer join이 안되어서.. - * $output->data[]->module_srl 과 같은 구조여야 함 - **/ - function syncModuleToSite(&$data) { - if(!$data) return; - - if(is_array($data)) { - foreach($data as $key => $val) { - $module_srls[] = $val->module_srl; - } - if(!count($module_srls)) return; - } else { - $module_srls[] = $data->module_srl; - } - - $args->module_srls = implode(',',$module_srls); - $output = executeQueryArray('module.getModuleSites', $args); - if(!$output->data) return array(); - foreach($output->data as $key => $val) { - $modules[$val->module_srl] = $val; - } - - if(is_array($data)) { - foreach($data as $key => $val) { - $data[$key]->domain = $modules[$val->module_srl]->domain; - } - } else { - $data->domain = $modules[$data->module_srl]->domain; - } - } - - /** - * @brief site_module_info의 관리자 인지 체크 - **/ - function isSiteAdmin($member_info, $site_srl = null) { - if(!$member_info->member_srl) return false; - if($member_info->is_admin == 'Y') return true; - - if(!isset($site_srl)) - { - $site_module_info = Context::get('site_module_info'); - if(!$site_module_info) return; - $args->site_srl = $site_module_info->site_srl; - } - else - { - $args->site_srl = $site_srl; - } - - $args->member_srl = $member_info->member_srl; - $output = executeQuery('module.isSiteAdmin', $args); - if($output->data->member_srl == $args->member_srl) return true; - return false; - - } - - /** - * @brief site의 관리자 정보를 구함 - **/ - function getSiteAdmin($site_srl) { - $args->site_srl = $site_srl; - $output = executeQueryArray('module.getSiteAdmin', $args); - return $output->data; - } - - /** - * @brief 특정 모듈의 관리자 아이디 구함 - **/ - function getAdminId($module_srl) { - $obj->module_srl = $module_srl; - $output = executeQueryArray('module.getAdminID', $obj); - if(!$output->toBool() || !$output->data) return; - - return $output->data; - } - - /** - * @brief 특정 모듈의 추가 변수를 구함 - * modules 테이블의 기본 정보 이외의 것 - **/ - function getModuleExtraVars($module_srl) { - if(is_array($module_srl)) $module_srl = implode(',',$module_srl); - $args->module_srl = $module_srl; - $output = executeQueryArray('module.getModuleExtraVars',$args); - if(!$output->toBool() || !$output->data) return; - - $vars = array(); - foreach($output->data as $key => $val) { - if(in_array($val->name, array('mid','module')) || $val->value == 'Array') continue; - $vars[$val->module_srl]->{$val->name} = $val->value; - } - return $vars; - } - - /** - * @brief 특정 모듈의 스킨 정보를 구함 - **/ - function getModuleSkinVars($module_srl) { - $args->module_srl = $module_srl; - $output = executeQueryArray('module.getModuleSkinVars',$args); - if(!$output->toBool() || !$output->data) return; - - $skin_vars = array(); - foreach($output->data as $val) $skin_vars[$val->name] = $val; - return $skin_vars; - } - - /** - * @brief 특정 모듈의 스킨 정보를 모듈 정보와 결합 - **/ - function syncSkinInfoToModuleInfo(&$module_info) { - if(!$module_info->module_srl) return; - - $args->module_srl = $module_info->module_srl; - $output = executeQueryArray('module.getModuleSkinVars',$args); - if(!$output->toBool() || !$output->data) return; - - foreach($output->data as $val) { - if(isset($module_info->{$val->name})) continue; - $module_info->{$val->name} = $val->value; - } - } - - /** - * @brief 특정 모듈정보와 XML, 그리고 회원 정보로 권한을 return - **/ - function getGrant($module_info, $member_info, $xml_info = '') { - if(!$xml_info) { - $module = $module_info->module; - $xml_info = $this->getModuleActionXml($module); - } - // 그룹 권한 설정에 필요한 변수를 세팅 - $module_srl = $module_info->module_srl; - $grant_info = $xml_info->grant; - if($member_info->member_srl) { - if(is_array($member_info->group_list)) $group_list = array_keys($member_info->group_list); - else $group_list = array(); - } else { - $group_list = array(); - } - - // module_srl이 없는 즉 별도의 권한 설정이 안되는 경우 - if(!$module_srl) { - $grant->access = true; - if($this->isSiteAdmin($member_info)) $grant->access = $grant->is_admin = $grant->manager = true; - else $grant->is_admin = $grant->manager = $member_info->is_admin=='Y'?true:false; - - // module_srl이 있는 경우 - } else { - - // grant 종류를 구함 - $grant->access = $grant->is_admin = $grant->manager = ($member_info->is_admin=='Y'||$this->isSiteAdmin($member_info))?true:false; - - // 관리자가 아니라 로그인 회원일 경우 이 모듈의 관리자인지 확인 - if(!$grant->manager && $member_info->member_srl) { - $args->module_srl = $module_srl; - $args->member_srl = $member_info->member_srl; - $output = executeQuery('module.getModuleAdmin',$args); - if($output->data && $output->data->member_srl == $member_info->member_srl) $grant->manager = $grant->is_admin = true; - } - - // 관리자가 아니면 직접 DB에서 정보를 구해서 권한 설정 - if(!$grant->manager) { - $args = null; - - // 플래닛인 경우 planet home의 권한 설정을 가져온다 - if ($module_info->module == 'planet') { - $output = executeQueryArray('module.getPlanetGrants', $args); - } - else { - $args->module_srl = $module_srl; - $output = executeQueryArray('module.getModuleGrants', $args); - } - - $grant_exists = $granted = array(); - - if($output->data) { - // 1차적으로 권한 대상 이름과 그룹을 정리 - foreach($output->data as $val) { - $grant_exists[$val->name] = true; - if($granted[$val->name]) continue; - - // 로그인 회원만 - if($val->group_srl == -1) { - $granted[$val->name] = true; - if($member_info->member_srl) $grant->{$val->name} = true; - - // 사이트 가입한 회원만 - } elseif($val->group_srl == -2) { - $granted[$val->name] = true; - // 비로그인 회원이면 권한 미부여 - if(!$member_info->member_srl) $grant->{$val->name} = false; - // 로그인 회원 - else { - $site_module_info = Context::get('site_module_info'); - // 현재 접속된 사이트 정보가 없으면 권한 부여 - if(!$site_module_info->site_srl) $grant->{$val->name} = true; - // 현재 접속된 사이트의 그룹 정보가 있 으면 권한 미부여 - elseif(count($group_list)) $grant->{$val->name} = true; - } - - // 비로그인 회원 모두 - } elseif($val->group_srl == 0) { - $granted[$val->name] = true; - $grant->{$val->name} = true; - // 특정 그룹 대상일 경우 - } else { - if($group_list && count($group_list) && in_array($val->group_srl, $group_list)) { - $grant->{$val->name} = true; - $granted[$val->name] = true; - } - } - } - } - - // 가상 그룹인 access에 대해서 별도 처리 - if(!$grant_exists['access']) $grant->access = true; - if(count($grant_info)) { - foreach($grant_info as $grant_name => $grant_item) { - if($grant_exists[$grant_name]) continue; - switch($grant_item->default) { - case 'guest' : - $grant->{$grant_name} = true; - break; - case 'member' : - if($member_info->member_srl) $grant->{$grant_name} = true; - else $grant->{$grant_name} = false; - break; - case 'site' : - $site_module_info = Context::get('site_module_info'); - if($member_info->member_srl && (($site_module_info->site_srl && count($group_list)) || !$site_module_info->site_srl)) $grant->{$grant_name} = true; - else $grant->{$grant_name} = false; - break; - case 'manager' : - case 'root' : - if($member_info->is_admin == 'Y') $grant->{$grant_name} = true; - else $grant->{$grant_name} = false; - break; - } - } - } - } - - // 관리자일 경우 모든 권한에 대해 true 지정 - if($grant->manager) { - $grant->access = true; - if(count($grant_info)) { - foreach($grant_info as $key => $val) { - $grant->{$key} = true; - } - } - } - - } - return $grant; - } - - - - function getModuleFileBox($module_filebox_srl){ - $args->module_filebox_srl = $module_filebox_srl; - return executeQuery('module.getModuleFileBox', $args); - } - - function getModuleFileBoxList(){ - $args->page = Context::get('page'); - $args->list_count = 10; - $args->page_count = 10; - return executeQuery('module.getModuleFileBoxList', $args); - } - - function getModuleFileBoxPath($module_filebox_srl){ - return sprintf("./files/attach/filebox/%s",getNumberingPath($module_filebox_srl,3)); - } - } -?> +mid = $id; + $args->site_srl = $site_srl; + $output = executeQuery('module.isExistsModuleName', $args); + if($output->data->count) return true; + + // vid 검사 (site_srl이 0일때 즉 가상사이트가 아닌 경우 mid != vid임을 체크) + if(!$site_srl) { + $site_args->domain = $id; + $output = executeQuery('module.isExistsSiteDomain', $site_args); + if($output->data->count) return true; + } + + return false; + } + + /** + * @brief site 정보를 구함 + **/ + function getSiteInfo($site_srl) { + $args->site_srl = $site_srl; + $output = executeQuery('module.getSiteInfo', $args); + return $output->data; + } + + function getSiteInfoByDomain($domain) { + $args->domain= $domain; + $output = executeQuery('module.getSiteInfoByDomain', $args); + return $output->data; + } + + /** + * @brief document_srl로 모듈의 정보르 구함 + * 이 경우는 캐시파일을 이용할 수가 없음 + **/ + function getModuleInfoByDocumentSrl($document_srl) { + $args->document_srl = $document_srl; + $output = executeQuery('module.getModuleInfoByDocument', $args); + return $this->addModuleExtraVars($output->data); + } + + /** + * @brief domain에 따른 기본 mid를 구함 + **/ + function getDefaultMid() { + $default_url = preg_replace('/\/$/','',Context::getDefaultUrl()); + $request_url = preg_replace('/\/$/','',Context::getRequestUri()); + $vid = Context::get('vid'); + $mid = Context::get('mid'); + + // 기본 URL이 설정되어 있고 이 기본 URL과 요청 URL이 다르면 가상 사이트 확인 + if($default_url && $default_url != $request_url) { + $url_info = parse_url($request_url); + $hostname = $url_info['host']; + $path = preg_replace('/\/$/','',$url_info['path']); + $sites_args->domain = sprintf('%s%s%s', $hostname, $url_info['port']&&$url_info['port']!=80?':'.$url_info['port']:'',$path); + $output = executeQuery('module.getSiteInfoByDomain', $sites_args); + } + if(!$output || !$output->data) + { + if(!$vid) $vid = $mid; + if($vid) { + $vid_args->domain = $vid; + $output = executeQuery('module.getSiteInfoByDomain', $vid_args); + if($output->toBool() && $output->data) { + Context::set('vid', $output->data->domain, true); + if($mid==$output->data->domain) Context::set('mid',$output->data->mid,true); + } + } + } + + // 가상 사이트가 아닐 경우 기본 사이트 정보를 구함 + if(!$output->data) { + $args->site_srl = 0; + $output = executeQuery('module.getSiteInfo', $args); + + // 기본 사이트 정보가 없으면 관련된 정보를 갱신 + if(!$output->data) { + // sites 테이블이 없을 경우 생성 + $oDB = &DB::getInstance(); + if(!$oDB->isTableExists('sites')) $oDB->createTableByXmlFile(_XE_PATH_.'modules/module/schemas/sites.xml'); + if(!$oDB->isTableExists('sites')) return; + + // 기본 mid, 언어 구함 + $mid_output = $oDB->executeQuery('module.getDefaultMidInfo', $args); + $db_info = Context::getDBInfo(); + $domain = Context::getDefaultUrl(); + $url_info = parse_url($domain); + $domain = $url_info['host'].( (!empty($url_info['port'])&&$url_info['port']!=80)?':'.$url_info['port']:'').$url_info['path']; + $site_args->site_srl = 0; + $site_args->index_module_srl = $mid_output->data->module_srl; + $site_args->domain = $domain; + $site_args->default_language = $db_info->lang_type; + + if($output->data && !$output->data->index_module_srl) { + $output = executeQuery('module.updateSite', $site_args); + } else { + $output = executeQuery('module.insertSite', $site_args); + if(!$output->toBool()) return $output; + } + $output = executeQuery('module.getSiteInfo', $args); + } + } + $module_info = $output->data; + if(!$module_info->module_srl) return $module_info; + if(is_array($module_info) && $module_info->data[0]) $module_info = $module_info[0]; + return $this->addModuleExtraVars($module_info); + } + + /** + * @brief mid로 모듈의 정보를 구함 + **/ + function getModuleInfoByMid($mid, $site_srl = 0) { + $args->mid = $mid; + $args->site_srl = (int)$site_srl; + $output = executeQuery('module.getMidInfo', $args); + $module_info = $output->data; + if(!$module_info->module_srl && $module_info->data[0]) $module_info = $module_info->data[0]; + return $this->addModuleExtraVars($module_info); + } + + /** + * @brief module_srl에 해당하는 모듈의 정보를 구함 + **/ + function getModuleInfoByModuleSrl($module_srl) { + // 데이터를 가져옴 + $args->module_srl = $module_srl; + $output = executeQuery('module.getMidInfo', $args); + if(!$output->data) return; + $module_info = $this->addModuleExtraVars($output->data); + return $module_info; + } + + /** + * @brief layout_srl에 해당하는 모듈의 정보를 구함 + **/ + function getModulesInfoByLayout($layout_srl) { + // 데이터를 가져옴 + $args->layout_srl = $layout_srl; + $output = executeQueryArray('module.getModulesByLayout', $args); + + $count = count($output->data); + + $modules = array(); + for($i=0;$i<$count;$i++) { + $modules[] = $output->data[$i]; + } + return $this->addModuleExtraVars($modules); + } + + /** + * @brief 여러개의 module_srl에 해당하는 모듈의 정보를 구함 + **/ + function getModulesInfo($module_srls) { + if(is_array($module_srls)) $module_srls = implode(',',$module_srls); + $args->module_srls = $module_srls; + $output = executeQueryArray('module.getModulesInfo', $args); + if(!$output->toBool()) return; + return $this->addModuleExtraVars($output->data); + } + + /** + * @brief 모듈의 기본 정보에 추가 변수 구함 + **/ + function addModuleExtraVars($module_info) { + // 1개 이상의 모듈정보를 요청받아도 처리 가능하도록 + if(!is_array($module_info)) $target_module_info = array($module_info); + else $target_module_info = $module_info; + + // 모듈 번호를 구함 + $module_srls = array(); + foreach($target_module_info as $key => $val) { + $module_srl = $val->module_srl; + if(!$module_srl) continue; + $module_srls[] = $val->module_srl; + } + + // 모듈의 추가정보/ 스킨 정보를 추출 + $extra_vars = $this->getModuleExtraVars($module_srls); + if(!count($module_srls) || !count($extra_vars)) return $module_info; + + foreach($target_module_info as $key => $val) { + if(!$extra_vars[$val->module_srl] || !count($extra_vars[$val->module_srl])) continue; + foreach($extra_vars[$val->module_srl] as $k => $v) { + if($target_module_info[$key]->{$k}) continue; + $target_module_info[$key]->{$k} = $v; + } + } + if(is_array($module_info)) return $target_module_info; + return $target_module_info[0]; + } + + /** + * @brief DB에 생성된 mid 전체 목록을 구해옴 + **/ + function getMidList($args = null) { + $output = executeQuery('module.getMidList', $args); + if(!$output->toBool()) return $output; + + $list = $output->data; + if(!$list) return; + + if(!is_array($list)) $list = array($list); + + foreach($list as $val) { + $mid_list[$val->mid] = $val; + } + return $mid_list; + } + + /** + * @brief mid 목록에 대응하는 module_srl을 배열로 return + **/ + function getModuleSrlByMid($mid) { + if($mid && !is_array($mid)) $mid = explode(',',$mid); + if(is_array($mid)) $mid = "'".implode("','",$mid)."'"; + + $site_module_info = Context::get('site_module_info'); + + $args->mid = $mid; + if($site_module_info) $args->site_srl = $site_module_info->site_srl; + $output = executeQuery('module.getModuleSrlByMid', $args); + if(!$output->toBool()) return $output; + + $list = $output->data; + if(!$list) return; + if(!is_array($list)) $list = array($list); + + foreach($list as $key => $val) { + $module_srl_list[] = $val->module_srl; + } + + return $module_srl_list; + } + + /** + * @brief act 값에 의한 forward 값을 구함 + **/ + function getActionForward($act, $module = "") { + $args->act = $act; + $args->module = ($module)?$module:null; + if (strlen ($args->module) > 0) $output = executeQuery ('module.getActionForwardWithModule', $args); + else $output = executeQuery('module.getActionForward',$args); + return $output->data; + } + + /** + * @brief trigger_name에 등록된 모든 목록을 추출 + **/ + function getTriggers($trigger_name, $called_position) { + $args->trigger_name = $trigger_name; + $args->called_position = $called_position; + $output = executeQueryArray('module.getTriggers',$args); + return $output->data; + } + + /** + * @brief 특정 trigger_name의 특정 대상을 추출 + **/ + function getTrigger($trigger_name, $module, $type, $called_method, $called_position) { + $args->trigger_name = $trigger_name; + $args->module = $module; + $args->type = $type; + $args->called_method = $called_method; + $args->called_position = $called_position; + $output = executeQuery('module.getTrigger',$args); + return $output->data; + } + + /** + * @brief 특정 module extend 가져옴 + **/ + function getModuleExtend($parent_module, $type, $kind='') { + $key = $parent_module.'.'.$kind.'.'.$type; + + $module_extend_info = $this->loadModuleExtends(); + if(array_key_exists($key, $module_extend_info)) + { + return $module_extend_info[$key]; + } + + return false; + } + + /** + * @brief 모든 module extend 가져옴 + **/ + function loadModuleExtends() { + $cache_file = './files/config/module_extend.php'; + $cache_file = FileHandler::getRealPath($cache_file); + + if(!isset($GLOBALS['__MODULE_EXTEND__'])){ + + // check pre install + if(file_exists(FileHandler::getRealPath('./files')) && !file_exists($cache_file)) { + $arr = array(); + $output = executeQueryArray('module.getModuleExtend'); + if($output->data){ + foreach($output->data as $v){ + $arr[] = sprintf("'%s.%s.%s' => '%s'", $v->parent_module, $v->kind, $v->type, $v->extend_module); + } + } + + $str = ''; + $str = sprintf($str, join(',',$arr)); + + FileHandler::writeFile($cache_file, $str); + } + + + if(file_exists($cache_file)) { + $GLOBALS['__MODULE_EXTEND__'] = include($cache_file); + } else { + $GLOBALS['__MODULE_EXTEND__'] = array(); + } + } + + return $GLOBALS['__MODULE_EXTEND__']; + } + + /** + * @brief 모듈의 conf/info.xml 을 읽어서 정보를 구함 + **/ + function getModuleInfoXml($module) { + // 요청된 모듈의 경로를 구한다. 없으면 return + $module_path = ModuleHandler::getModulePath($module); + if(!$module_path) return; + + // 현재 선택된 모듈의 스킨의 정보 xml 파일을 읽음 + $xml_file = sprintf("%s/conf/info.xml", $module_path); + if(!file_exists($xml_file)) return; + + $oXmlParser = new XmlParser(); + $tmp_xml_obj = $oXmlParser->loadXmlFile($xml_file); + $xml_obj = $tmp_xml_obj->module; + + if(!$xml_obj) return; + + // 모듈 정보 + if($xml_obj->version && $xml_obj->attrs->version == '0.2') { + // module format 0.2 + $module_info->title = $xml_obj->title->body; + $module_info->description = $xml_obj->description->body; + $module_info->version = $xml_obj->version->body; + $module_info->homepage = $xml_obj->link->body; + $module_info->category = $xml_obj->category->body; + if(!$module_info->category) $module_info->category = 'service'; + sscanf($xml_obj->date->body, '%d-%d-%d', $date_obj->y, $date_obj->m, $date_obj->d); + $module_info->date = sprintf('%04d%02d%02d', $date_obj->y, $date_obj->m, $date_obj->d); + $module_info->license = $xml_obj->license->body; + $module_info->license_link = $xml_obj->license->attrs->link; + + if(!is_array($xml_obj->author)) $author_list[] = $xml_obj->author; + else $author_list = $xml_obj->author; + + foreach($author_list as $author) { + unset($author_obj); + $author_obj->name = $author->name->body; + $author_obj->email_address = $author->attrs->email_address; + $author_obj->homepage = $author->attrs->link; + $module_info->author[] = $author_obj; + } + + // history + if($xml_obj->history) { + if(!is_array($xml_obj->history)) $history[] = $xml_obj->history; + else $history = $xml_obj->history; + + foreach($history as $item) { + unset($obj); + + if($item->author) { + (!is_array($item->author)) ? $obj->author_list[] = $item->author : $obj->author_list = $item->author; + + foreach($obj->author_list as $author) { + unset($author_obj); + $author_obj->name = $author->name->body; + $author_obj->email_address = $author->attrs->email_address; + $author_obj->homepage = $author->attrs->link; + $obj->author[] = $author_obj; + } + } + + $obj->name = $item->name->body; + $obj->email_address = $item->attrs->email_address; + $obj->homepage = $item->attrs->link; + $obj->version = $item->attrs->version; + $obj->date = $item->attrs->date; + $obj->description = $item->description->body; + + if($item->log) { + (!is_array($item->log)) ? $obj->log[] = $item->log : $obj->log = $item->log; + + foreach($obj->log as $log) { + unset($logs_obj); + $logs_obj->text = $log->body; + $logs_obj->link = $log->attrs->link; + $obj->logs[] = $logs_obj; + } + } + + $module_info->history[] = $obj; + } + } + + + } else { + // module format 0.1 + $module_info->title = $xml_obj->title->body; + $module_info->description = $xml_obj->author->description->body; + $module_info->version = $xml_obj->attrs->version; + $module_info->category = $xml_obj->attrs->category; + if(!$module_info->category) $module_info->category = 'service'; + sscanf($xml_obj->author->attrs->date, '%d. %d. %d', $date_obj->y, $date_obj->m, $date_obj->d); + $module_info->date = sprintf('%04d%02d%02d', $date_obj->y, $date_obj->m, $date_obj->d); + $author_obj->name = $xml_obj->author->name->body; + $author_obj->email_address = $xml_obj->author->attrs->email_address; + $author_obj->homepage = $xml_obj->author->attrs->link; + $module_info->author[] = $author_obj; + } + + // action 정보를 얻어서 admin_index를 추가 + $action_info = $this->getModuleActionXml($module); + $module_info->admin_index_act = $action_info->admin_index_act; + $module_info->default_index_act = $action_info->default_index_act; + $module_info->setup_index_act = $action_info->setup_index_act; + + return $module_info; + } + + /** + * @brief module의 conf/module.xml 을 통해 grant(권한) 및 action 데이터를 return + * module.xml 파일의 경우 파싱하는데 시간이 걸리기에 캐싱을 한다... + * 캐싱을 할때 바로 include 할 수 있도록 역시 코드까지 추가하여 캐싱을 한다. + * 이게 퍼포먼스 상으로는 좋은데 어떤 부정적인 결과를 유도할지는 잘 모르겠... + **/ + function getModuleActionXml($module) { + // 요청된 모듈의 경로를 구한다. 없으면 return + $class_path = ModuleHandler::getModulePath($module); + if(!$class_path) return; + + // 해당 경로에 module.xml 파일이 있는지 체크한다. 없으면 return + $xml_file = sprintf("%sconf/module.xml", $class_path); + if(!file_exists($xml_file)) return; + + // 캐시된 파일이 있는지 확인 + $cache_file = sprintf("./files/cache/module_info/%s.%s.php", $module, Context::getLangType()); + + // 캐시 파일이 없거나 캐시 파일이 xml 파일보다 오래되었으면 내용 다시 갱신 + if(!file_exists($cache_file) || filemtime($cache_file)module)) return; ///< xml 내용중에 module 태그가 없다면 오류;; + + $grants = $xml_obj->module->grants->grant; ///< 권한 정보 (없는 경우도 있음) + $permissions = $xml_obj->module->permissions->permission; ///< 권한 대행 (없는 경우도 있음) + $actions = $xml_obj->module->actions->action; ///< action list (필수) + + $default_index = $admin_index = ''; + + // 권한 정보의 정리 + if($grants) { + if(is_array($grants)) $grant_list = $grants; + else $grant_list[] = $grants; + + foreach($grant_list as $grant) { + $name = $grant->attrs->name; + $default = $grant->attrs->default?$grant->attrs->default:'guest'; + $title = $grant->title->body; + + $info->grant->{$name}->title = $title; + $info->grant->{$name}->default = $default; + + $buff .= sprintf('$info->grant->%s->title=\'%s\';', $name, $title); + $buff .= sprintf('$info->grant->%s->default=\'%s\';', $name, $default); + } + } + + // 권한 허용 정리 + if($permissions) { + if(is_array($permissions)) $permission_list = $permissions; + else $permission_list[] = $permissions; + + foreach($permission_list as $permission) { + $action = $permission->attrs->action; + $target = $permission->attrs->target; + + $info->permission->{$action} = $target; + + $buff .= sprintf('$info->permission->%s = \'%s\';', $action, $target); + } + } + + // actions 정리 + if($actions) { + if(is_array($actions)) $action_list = $actions; + else $action_list[] = $actions; + + foreach($action_list as $action) { + $name = $action->attrs->name; + + $type = $action->attrs->type; + $grant = $action->attrs->grant?$action->attrs->grant:'guest'; + $standalone = $action->attrs->standalone=='true'?'true':'false'; + + $index = $action->attrs->index; + $admin_index = $action->attrs->admin_index; + $setup_index = $action->attrs->setup_index; + + $output->action->{$name}->type = $type; + $output->action->{$name}->grant = $grant; + $output->action->{$name}->standalone= $standalone; + + $info->action->{$name}->type = $type; + $info->action->{$name}->grant = $grant; + $info->action->{$name}->standalone = $standalone=='true'?true:false; + + $buff .= sprintf('$info->action->%s->type=\'%s\';', $name, $type); + $buff .= sprintf('$info->action->%s->grant=\'%s\';', $name, $grant); + $buff .= sprintf('$info->action->%s->standalone=%s;', $name, $standalone); + + if($index=='true') { + $default_index_act = $name; + $info->default_index_act = $name; + } + if($admin_index=='true') { + $admin_index_act = $name; + $info->admin_index_act = $name; + } + if($setup_index=='true') { + $setup_index_act = $name; + $info->setup_index_act = $name; + } + } + } + $buff = sprintf('default_index_act = \'%s\';$info->setup_index_act=\'%s\';$info->admin_index_act = \'%s\';%s?>', $default_index_act, $setup_index_act, $admin_index_act, $buff); + + FileHandler::writeFile($cache_file, $buff); + + return $info; + } + + @include($cache_file); + + return $info; + } + + + /** + * @brief 주어진 곳의 스킨 목록을 구함 + * 스킨과 skin.xml 파일을 분석 정리한 결과를 return + **/ + function getSkins($path, $dir = 'skins') { + $skin_path = sprintf("%s/%s/", $path, $dir); + $list = FileHandler::readDir($skin_path); + if(!count($list)) return; + + natcasesort($list); + + foreach($list as $skin_name) { + unset($skin_info); + $skin_info = $this->loadSkinInfo($path, $skin_name, $dir); + if(!$skin_info) $skin_info->title = $skin_name; + + $skin_list[$skin_name] = $skin_info; + } + + return $skin_list; + } + + /** + * @brief 특정 위치의 특정 스킨의 정보를 구해옴 + **/ + function loadSkinInfo($path, $skin, $dir = 'skins') { + + // 모듈의 스킨의 정보 xml 파일을 읽음 + if(substr($path,-1)!='/') $path .= '/'; + $skin_xml_file = sprintf("%s%s/%s/skin.xml", $path, $dir, $skin); + if(!file_exists($skin_xml_file)) return; + + // XmlParser 객체 생성 + $oXmlParser = new XmlParser(); + $_xml_obj = $oXmlParser->loadXmlFile($skin_xml_file); + + // 스킨 정보가 없으면 return + if(!$_xml_obj->skin) return; + $xml_obj = $_xml_obj->skin; + + // 스킨이름 + $skin_info->title = $xml_obj->title->body; + + + // 작성자 정보 + if($xml_obj->version && $xml_obj->attrs->version == '0.2') { + // skin format v0.2 + sscanf($xml_obj->date->body, '%d-%d-%d', $date_obj->y, $date_obj->m, $date_obj->d); + $skin_info->version = $xml_obj->version->body; + $skin_info->date = sprintf('%04d%02d%02d', $date_obj->y, $date_obj->m, $date_obj->d); + $skin_info->homepage = $xml_obj->link->body; + $skin_info->license = $xml_obj->license->body; + $skin_info->license_link = $xml_obj->license->attrs->link; + $skin_info->description = $xml_obj->description->body; + + if(!is_array($xml_obj->author)) $author_list[] = $xml_obj->author; + else $author_list = $xml_obj->author; + + foreach($author_list as $author) { + unset($author_obj); + $author_obj->name = $author->name->body; + $author_obj->email_address = $author->attrs->email_address; + $author_obj->homepage = $author->attrs->link; + $skin_info->author[] = $author_obj; + } + + // 확장변수를 정리 + if($xml_obj->extra_vars) { + $extra_var_groups = $xml_obj->extra_vars->group; + if(!$extra_var_groups) $extra_var_groups = $xml_obj->extra_vars; + if(!is_array($extra_var_groups)) $extra_var_groups = array($extra_var_groups); + + foreach($extra_var_groups as $group) { + $extra_vars = $group->var; + if(!is_array($group->var)) $extra_vars = array($group->var); + + foreach($extra_vars as $key => $val) { + unset($obj); + if(!$val->attrs->type) { $val->attrs->type = 'text'; } + + $obj->group = $group->title->body; + $obj->name = $val->attrs->name; + $obj->title = $val->title->body; + $obj->type = $val->attrs->type; + $obj->description = $val->description->body; + $obj->value = $extra_vals->{$obj->name}; + $obj->default = $val->attrs->default; + if(strpos($obj->value, '|@|') != false) { $obj->value = explode('|@|', $obj->value); } + if($obj->type == 'mid_list' && !is_array($obj->value)) { $obj->value = array($obj->value); } + + // 'select'type에서 option목록을 구한다. + if(is_array($val->options)) { + $option_count = count($val->options); + + for($i = 0; $i < $option_count; $i++) { + $obj->options[$i]->title = $val->options[$i]->title->body; + $obj->options[$i]->value = $val->options[$i]->attrs->value; + } + } else { + $obj->options[0]->title = $val->options->title->body; + $obj->options[0]->value = $val->options->attrs->value; + } + + $skin_info->extra_vars[] = $obj; + } + } + } + + // history + if($xml_obj->history) { + if(!is_array($xml_obj->history)) $history[] = $xml_obj->history; + else $history = $xml_obj->history; + + foreach($history as $item) { + unset($obj); + + if($item->author) { + (!is_array($item->author)) ? $obj->author_list[] = $item->author : $obj->author_list = $item->author; + + foreach($obj->author_list as $author) { + unset($author_obj); + $author_obj->name = $author->name->body; + $author_obj->email_address = $author->attrs->email_address; + $author_obj->homepage = $author->attrs->link; + $obj->author[] = $author_obj; + } + } + + $obj->name = $item->name->body; + $obj->email_address = $item->attrs->email_address; + $obj->homepage = $item->attrs->link; + $obj->version = $item->attrs->version; + $obj->date = $item->attrs->date; + $obj->description = $item->description->body; + + if($item->log) { + (!is_array($item->log)) ? $obj->log[] = $item->log : $obj->log = $item->log; + + foreach($obj->log as $log) { + unset($log_obj); + $log_obj->text = $log->body; + $log_obj->link = $log->attrs->link; + $obj->logs[] = $log_obj; + } + } + + $skin_info->history[] = $obj; + } + } + + + } else { + + // skin format v0.1 + sscanf($xml_obj->maker->attrs->date, '%d-%d-%d', $date_obj->y, $date_obj->m, $date_obj->d); + + $skin_info->version = $xml_obj->version->body; + $skin_info->date = sprintf('%04d%02d%02d', $date_obj->y, $date_obj->m, $date_obj->d); + $skin_info->homepage = $xml_obj->link->body; + $skin_info->license = $xml_obj->license->body; + $skin_info->license_link = $xml_obj->license->attrs->link; + $skin_info->description = $xml_obj->maker->description->body; + + $skin_info->author[0]->name = $xml_obj->maker->name->body; + $skin_info->author[0]->email_address = $xml_obj->maker->attrs->email_address; + $skin_info->author[0]->homepage = $xml_obj->maker->attrs->link; + + // 스킨에서 사용되는 변수들 + $extra_var_groups = $xml_obj->extra_vars->group; + if(!$extra_var_groups) $extra_var_groups = $xml_obj->extra_vars; + if(!is_array($extra_var_groups)) $extra_var_groups = array($extra_var_groups); + + foreach($extra_var_groups as $group){ + $extra_vars = $group->var; + + if($extra_vars) { + + if(!is_array($extra_vars)) $extra_vars = array($extra_vars); + + foreach($extra_vars as $var) { + unset($obj); + unset($options); + + $group = $group->title->body; + $name = $var->attrs->name; + $type = $var->attrs->type; + $title = $var->title->body; + $description = $var->description->body; + + // 'select'type에서 option목록을 구한다. + if(is_array($var->default)) { + $option_count = count($var->default); + + for($i = 0; $i < $option_count; $i++) { + $options[$i]->title = $var->default[$i]->body; + $options[$i]->value = $var->default[$i]->body; + } + } else { + $options[0]->title = $var->default->body; + $options[0]->value = $var->default->body; + } + + $width = $var->attrs->width; + $height = $var->attrs->height; + + unset($obj); + $obj->group = $group; + $obj->title = $title; + $obj->description = $description; + $obj->name = $name; + $obj->type = $type; + $obj->options = $options; + $obj->width = $width; + $obj->height = $height; + $obj->default = $options[0]->value; + + $skin_info->extra_vars[] = $obj; + } + } + } + } + + // colorset + $colorset = $xml_obj->colorset->color; + if($colorset) { + if(!is_array($colorset)) $colorset = array($colorset); + + foreach($colorset as $color) { + $name = $color->attrs->name; + $title = $color->title->body; + $screenshot = $color->attrs->src; + if($screenshot) { + $screenshot = sprintf("%sskins/%s/%s", $path, $skin, $screenshot); + if(!file_exists($screenshot)) $screenshot = ""; + } else $screenshot = ""; + + unset($obj); + $obj->name = $name; + $obj->title = $title; + $obj->screenshot = $screenshot; + $skin_info->colorset[] = $obj; + } + } + + // 메뉴 종류 (레이아웃을 위한 설정) + if($xml_obj->menus->menu) { + $menus = $xml_obj->menus->menu; + if(!is_array($menus)) $menus = array($menus); + + $menu_count = count($menus); + $skin_info->menu_count = $menu_count; + for($i=0;$i<$menu_count;$i++) { + unset($obj); + + $obj->name = $menus[$i]->attrs->name; + if($menus[$i]->attrs->default == "true") $obj->default = true; + $obj->title = $menus[$i]->title->body; + $obj->maxdepth = $menus[$i]->maxdepth->body; + + $skin_info->menu->{$obj->name} = $obj; + } + } + + return $skin_info; + } + + /** + * @brief 특정 가상 사이트에 등록된 특정 모듈의 개수를 return + **/ + function getModuleCount($site_srl, $module = null) { + $args->site_srl = $site_srl; + if(!is_null($module)) $args->module = $module; + $output = executeQuery('module.getModuleCount', $args); + return $output->data->count; + } + + /** + * @brief 특정 모듈의 설정 return + * board, member등 특정 모듈의 global config 관리용 + **/ + function getModuleConfig($module) { + if(!$GLOBALS['__ModuleConfig__'][$module]) { + $args->module = $module; + $output = executeQuery('module.getModuleConfig', $args); + $config = unserialize($output->data->config); + $GLOBALS['__ModuleConfig__'][$module] = $config; + } + return $GLOBALS['__ModuleConfig__'][$module]; + } + + /** + * @brief 특정 mid의 모듈 설정 정보 return + * mid의 모듈 의존적인 설정을 관리 + **/ + function getModulePartConfig($module, $module_srl) { + if(!$GLOBALS['__ModulePartConfig__'][$module][$module_srl]) { + $args->module = $module; + $args->module_srl = $module_srl; + $output = executeQuery('module.getModulePartConfig', $args); + $config = unserialize($output->data->config); + $GLOBALS['__ModulePartConfig__'][$module][$module_srl] = $config; + } + return $GLOBALS['__ModulePartConfig__'][$module][$module_srl]; + } + + /** + * @brief mid별 모듈 설정 정보 전체를 구함 + **/ + function getModulePartConfigs($module, $site_srl = 0) { + $args->module = $module; + if($site_srl) $args->site_srl = $site_srl; + $output = executeQueryArray('module.getModulePartConfigs', $args); + if(!$output->toBool() || !$output->data) return array(); + + foreach($output->data as $key => $val) { + $result[$val->module_srl] = unserialize($val->config); + } + return $result; + } + + + /** + * @brief 모듈 카테고리의 목록을 구함 + **/ + function getModuleCategories() { + // 데이터를 DB에서 가져옴 + $output = executeQuery('module.getModuleCategories'); + if(!$output->toBool()) return $output; + $list = $output->data; + if(!$list) return; + if(!is_array($list)) $list = array($list); + + foreach($list as $val) { + $category_list[$val->module_category_srl] = $val; + } + return $category_list; + } + + /** + * @brief 특정 모듈 카테고리의 내용을 구함 + **/ + function getModuleCategory($module_category_srl) { + // 데이터를 DB에서 가져옴 + $args->module_category_srl = $module_category_srl; + $output = executeQuery('module.getModuleCategory', $args); + if(!$output->toBool()) return $output; + return $output->data; + } + + /** + * @brief 모듈의 xml 정보만 구함 + **/ + function getModulesXmlInfo() { + // 다운받은 모듈과 설치된 모듈의 목록을 구함 + $searched_list = FileHandler::readDir('./modules'); + $searched_count = count($searched_list); + if(!$searched_count) return; + sort($searched_list); + + for($i=0;$i<$searched_count;$i++) { + // 모듈의 이름 + $module_name = $searched_list[$i]; + + $path = ModuleHandler::getModulePath($module_name); + + // 해당 모듈의 정보를 구함 + $info = $this->getModuleInfoXml($module_name); + unset($obj); + + $info->module = $module_name; + $info->created_table_count = $created_table_count; + $info->table_count = $table_count; + $info->path = $path; + $info->admin_index_act = $info->admin_index_act; + $list[] = $info; + } + return $list; + } + + function checkNeedInstall($module_name) + { + $oDB = &DB::getInstance(); + $info = null; + + $moduledir = ModuleHandler::getModulePath($module_name); + if(file_exists(FileHandler::getRealPath($moduledir."schemas"))) + { + $tmp_files = FileHandler::readDir($moduledir."schemas", '/(\.xml)$/'); + $table_count = count($tmp_files); + + // 테이블이 설치되어 있는지 체크 + $created_table_count = 0; + for($j=0;$jisTableExists($table_name)) $created_table_count ++; + } + + // 설치 유무 체크 (설치는 DB의 설치만 관리) + if($table_count > $created_table_count) return true; + else return false; + } + return false; + } + + function checkNeedUpdate($module_name) + { + // 각 모듈의 module.class.php로 upgrade 유무 체크 + $oDummy = &getModule($module_name, 'class'); + if($oDummy && method_exists($oDummy, "checkUpdate")) { + return $oDummy->checkUpdate(); + } + return false; + } + + /** + * @brief 모듈의 종류와 정보를 구함 + **/ + function getModuleList() { + // DB 객체 생성 + $oDB = &DB::getInstance(); + + // 다운받은 모듈과 설치된 모듈의 목록을 구함 + $searched_list = FileHandler::readDir('./modules'); + sort($searched_list); + + $searched_count = count($searched_list); + if(!$searched_count) return; + + for($i=0;$i<$searched_count;$i++) { + // 모듈의 이름 + $module_name = $searched_list[$i]; + + $path = ModuleHandler::getModulePath($module_name); + + // schemas내의 테이블 생성 xml파일수를 구함 + $tmp_files = FileHandler::readDir($path."schemas", '/(\.xml)$/'); + $table_count = count($tmp_files); + + // 테이블이 설치되어 있는지 체크 + $created_table_count = 0; + for($j=0;$jisTableExists($table_name)) $created_table_count ++; + } + + // 해당 모듈의 정보를 구함 + $info = $this->getModuleInfoXml($module_name); + unset($obj); + + $info->module = $module_name; + $info->category = $info->category; + $info->created_table_count = $created_table_count; + $info->table_count = $table_count; + $info->path = $path; + $info->admin_index_act = $info->admin_index_act; + + // 설치 유무 체크 (설치는 DB의 설치만 관리) + if($table_count > $created_table_count) $info->need_install = true; + else $info->need_install = false; + + // 각 모듈의 module.class.php로 upgrade 유무 체크 + $oDummy = null; + $oDummy = &getModule($module_name, 'class'); + if($oDummy && method_exists($oDummy, "checkUpdate")) { + $info->need_update = $oDummy->checkUpdate(); + } + else + { + continue; + } + + $list[] = $info; + } + return $list; + } + + /** + * @brief 특정 module srls를 sites의 domain과 결합 + * 아직 XE DBHandler에서 left outer join이 안되어서.. + * $output->data[]->module_srl 과 같은 구조여야 함 + **/ + function syncModuleToSite(&$data) { + if(!$data) return; + + if(is_array($data)) { + foreach($data as $key => $val) { + $module_srls[] = $val->module_srl; + } + if(!count($module_srls)) return; + } else { + $module_srls[] = $data->module_srl; + } + + $args->module_srls = implode(',',$module_srls); + $output = executeQueryArray('module.getModuleSites', $args); + if(!$output->data) return array(); + foreach($output->data as $key => $val) { + $modules[$val->module_srl] = $val; + } + + if(is_array($data)) { + foreach($data as $key => $val) { + $data[$key]->domain = $modules[$val->module_srl]->domain; + } + } else { + $data->domain = $modules[$data->module_srl]->domain; + } + } + + /** + * @brief site_module_info의 관리자 인지 체크 + **/ + function isSiteAdmin($member_info, $site_srl = null) { + if(!$member_info->member_srl) return false; + if($member_info->is_admin == 'Y') return true; + + if(!isset($site_srl)) + { + $site_module_info = Context::get('site_module_info'); + if(!$site_module_info) return; + $args->site_srl = $site_module_info->site_srl; + } + else + { + $args->site_srl = $site_srl; + } + + $args->member_srl = $member_info->member_srl; + $output = executeQuery('module.isSiteAdmin', $args); + if($output->data->member_srl == $args->member_srl) return true; + return false; + + } + + /** + * @brief site의 관리자 정보를 구함 + **/ + function getSiteAdmin($site_srl) { + $args->site_srl = $site_srl; + $output = executeQueryArray('module.getSiteAdmin', $args); + return $output->data; + } + + /** + * @brief 특정 모듈의 관리자 아이디 구함 + **/ + function getAdminId($module_srl) { + $obj->module_srl = $module_srl; + $output = executeQueryArray('module.getAdminID', $obj); + if(!$output->toBool() || !$output->data) return; + + return $output->data; + } + + /** + * @brief 특정 모듈의 추가 변수를 구함 + * modules 테이블의 기본 정보 이외의 것 + **/ + function getModuleExtraVars($module_srl) { + if(is_array($module_srl)) $module_srl = implode(',',$module_srl); + $args->module_srl = $module_srl; + $output = executeQueryArray('module.getModuleExtraVars',$args); + if(!$output->toBool() || !$output->data) return; + + $vars = array(); + foreach($output->data as $key => $val) { + if(in_array($val->name, array('mid','module')) || $val->value == 'Array') continue; + $vars[$val->module_srl]->{$val->name} = $val->value; + } + return $vars; + } + + /** + * @brief 특정 모듈의 스킨 정보를 구함 + **/ + function getModuleSkinVars($module_srl) { + $args->module_srl = $module_srl; + $output = executeQueryArray('module.getModuleSkinVars',$args); + if(!$output->toBool() || !$output->data) return; + + $skin_vars = array(); + foreach($output->data as $val) $skin_vars[$val->name] = $val; + return $skin_vars; + } + + /** + * @brief 특정 모듈의 스킨 정보를 모듈 정보와 결합 + **/ + function syncSkinInfoToModuleInfo(&$module_info) { + if(!$module_info->module_srl) return; + + $args->module_srl = $module_info->module_srl; + $output = executeQueryArray('module.getModuleSkinVars',$args); + if(!$output->toBool() || !$output->data) return; + + foreach($output->data as $val) { + if(isset($module_info->{$val->name})) continue; + $module_info->{$val->name} = $val->value; + } + } + + /** + * @brief 특정 모듈정보와 XML, 그리고 회원 정보로 권한을 return + **/ + function getGrant($module_info, $member_info, $xml_info = '') { + if(!$xml_info) { + $module = $module_info->module; + $xml_info = $this->getModuleActionXml($module); + } + // 그룹 권한 설정에 필요한 변수를 세팅 + $module_srl = $module_info->module_srl; + $grant_info = $xml_info->grant; + if($member_info->member_srl) { + if(is_array($member_info->group_list)) $group_list = array_keys($member_info->group_list); + else $group_list = array(); + } else { + $group_list = array(); + } + + // module_srl이 없는 즉 별도의 권한 설정이 안되는 경우 + if(!$module_srl) { + $grant->access = true; + if($this->isSiteAdmin($member_info)) $grant->access = $grant->is_admin = $grant->manager = true; + else $grant->is_admin = $grant->manager = $member_info->is_admin=='Y'?true:false; + + // module_srl이 있는 경우 + } else { + + // grant 종류를 구함 + $grant->access = $grant->is_admin = $grant->manager = ($member_info->is_admin=='Y'||$this->isSiteAdmin($member_info))?true:false; + + // 관리자가 아니라 로그인 회원일 경우 이 모듈의 관리자인지 확인 + if(!$grant->manager && $member_info->member_srl) { + $args->module_srl = $module_srl; + $args->member_srl = $member_info->member_srl; + $output = executeQuery('module.getModuleAdmin',$args); + if($output->data && $output->data->member_srl == $member_info->member_srl) $grant->manager = $grant->is_admin = true; + } + + // 관리자가 아니면 직접 DB에서 정보를 구해서 권한 설정 + if(!$grant->manager) { + $args = null; + + // 플래닛인 경우 planet home의 권한 설정을 가져온다 + if ($module_info->module == 'planet') { + $output = executeQueryArray('module.getPlanetGrants', $args); + } + else { + $args->module_srl = $module_srl; + $output = executeQueryArray('module.getModuleGrants', $args); + } + + $grant_exists = $granted = array(); + + if($output->data) { + // 1차적으로 권한 대상 이름과 그룹을 정리 + foreach($output->data as $val) { + $grant_exists[$val->name] = true; + if($granted[$val->name]) continue; + + // 로그인 회원만 + if($val->group_srl == -1) { + $granted[$val->name] = true; + if($member_info->member_srl) $grant->{$val->name} = true; + + // 사이트 가입한 회원만 + } elseif($val->group_srl == -2) { + $granted[$val->name] = true; + // 비로그인 회원이면 권한 미부여 + if(!$member_info->member_srl) $grant->{$val->name} = false; + // 로그인 회원 + else { + $site_module_info = Context::get('site_module_info'); + // 현재 접속된 사이트 정보가 없으면 권한 부여 + if(!$site_module_info->site_srl) $grant->{$val->name} = true; + // 현재 접속된 사이트의 그룹 정보가 있 으면 권한 미부여 + elseif(count($group_list)) $grant->{$val->name} = true; + } + + // 비로그인 회원 모두 + } elseif($val->group_srl == 0) { + $granted[$val->name] = true; + $grant->{$val->name} = true; + // 특정 그룹 대상일 경우 + } else { + if($group_list && count($group_list) && in_array($val->group_srl, $group_list)) { + $grant->{$val->name} = true; + $granted[$val->name] = true; + } + } + } + } + + // 가상 그룹인 access에 대해서 별도 처리 + if(!$grant_exists['access']) $grant->access = true; + if(count($grant_info)) { + foreach($grant_info as $grant_name => $grant_item) { + if($grant_exists[$grant_name]) continue; + switch($grant_item->default) { + case 'guest' : + $grant->{$grant_name} = true; + break; + case 'member' : + if($member_info->member_srl) $grant->{$grant_name} = true; + else $grant->{$grant_name} = false; + break; + case 'site' : + $site_module_info = Context::get('site_module_info'); + if($member_info->member_srl && (($site_module_info->site_srl && count($group_list)) || !$site_module_info->site_srl)) $grant->{$grant_name} = true; + else $grant->{$grant_name} = false; + break; + case 'manager' : + case 'root' : + if($member_info->is_admin == 'Y') $grant->{$grant_name} = true; + else $grant->{$grant_name} = false; + break; + } + } + } + } + + // 관리자일 경우 모든 권한에 대해 true 지정 + if($grant->manager) { + $grant->access = true; + if(count($grant_info)) { + foreach($grant_info as $key => $val) { + $grant->{$key} = true; + } + } + } + + } + return $grant; + } + + + + function getModuleFileBox($module_filebox_srl){ + $args->module_filebox_srl = $module_filebox_srl; + return executeQuery('module.getModuleFileBox', $args); + } + + function getModuleFileBoxList(){ + $args->page = Context::get('page'); + $args->list_count = 10; + $args->page_count = 10; + return executeQuery('module.getModuleFileBoxList', $args); + } + + function getModuleFileBoxPath($module_filebox_srl){ + return sprintf("./files/attach/filebox/%s",getNumberingPath($module_filebox_srl,3)); + } + } +?> diff --git a/modules/module/module.view.php b/modules/module/module.view.php index 65ec532ab..16982fcc6 100644 --- a/modules/module/module.view.php +++ b/modules/module/module.view.php @@ -1,161 +1,161 @@ -setTemplatePath($this->module_path.'tpl'); - } - - /** - * @brief 스킨 정보 출력 - **/ - function dispModuleSkinInfo() { - $selected_module = Context::get('selected_module'); - $skin = Context::get('skin'); - - // 모듈/스킨 정보를 구함 - $module_path = sprintf("./modules/%s/", $selected_module); - if(!is_dir($module_path)) $this->stop("msg_invalid_request"); - - $skin_info_xml = sprintf("%sskins/%s/skin.xml", $module_path, $skin); - if(!file_exists($skin_info_xml)) $this->stop("msg_invalid_request"); - - $oModuleModel = &getModel('module'); - $skin_info = $oModuleModel->loadSkinInfo($module_path, $skin); - Context::set('skin_info',$skin_info); - - $this->setLayoutFile("popup_layout"); - $this->setTemplateFile("skin_info"); - } - - /** - * @brief 모듈 선택기 - **/ - function dispModuleSelectList() { - if(!Context::get('is_logged')) return new Object(-1, 'msg_not_permitted'); - - $oModuleModel = &getModel('module'); - - // virtual site의 개수를 추출 - $output = executeQuery('module.getSiteCount'); - $site_count = $output->data->count; - Context::set('site_count', $site_count); - - // 사이트 검색어 변수 설정 - $site_keyword = Context::get('site_keyword'); - - // 사이트 검색어가 없으면 현재 가상 사이트의 정보를 설정 - $args = null; - $logged_info = Context::get('logged_info'); - if($logged_info->is_admin == 'Y') { - $query_id = 'module.getSiteModules'; - $module_category_exists = false; - if(!$site_keyword) { - $site_module_info = Context::get('site_module_info'); - if($site_module_info && $logged_info->is_admin != 'Y') { - $site_keyword = $site_module_info->domain; - $args->site_srl = (int)$site_module_info->site_srl; - Context::set('site_keyword', $site_keyword); - } else { - $query_id = 'module.getDefaultModules'; - $args->site_srl = 0; - $module_category_exists = true; - } - // 사이트 검색어가 있으면 해당 사이트(들)의 정보를 추출 - } else { - $args->site_keyword = $site_keyword; - } - } else { - $query_id = 'module.getSiteModules'; - $site_module_info = Context::get('site_module_info'); - $args->site_srl = (int)$site_module_info->site_srl; - } - //if(is_null($args->site_srl)) $query_id = 'module.getDefaultModules'; - - // 지정된 사이트(혹은 전체)의 module 목록을 구함 - $output = executeQueryArray($query_id, $args); - $category_list = $mid_list = array(); - if(count($output->data)) { - foreach($output->data as $key => $val) { - $module = trim($val->module); - if(!$module) continue; - - $category = $val->category; - $obj = null; - $obj->module_srl = $val->module_srl; - $obj->browser_title = $val->browser_title; - $mid_list[$module]->list[$category][$val->mid] = $obj; - } - } - - $selected_module = Context::get('selected_module'); - if(count($mid_list)) { - foreach($mid_list as $module => $val) { - if(!$selected_module) $selected_module = $module; - $xml_info = $oModuleModel->getModuleInfoXml($module); - $mid_list[$module]->title = $xml_info->title; - } - } - - Context::set('mid_list', $mid_list); - Context::set('selected_module', $selected_module); - Context::set('selected_mids', $mid_list[$selected_module]->list); - Context::set('module_category_exists', $module_category_exists); - - // 레이아웃을 팝업으로 지정 - $this->setLayoutFile('popup_layout'); - - // 템플릿 파일 지정 - $this->setTemplateFile('module_selector'); - } - - - // 파일 박스 보기 - function dispModuleFileBox(){ - $logged_info = Context::get('logged_info'); - if($logged_info->is_admin !='Y' && !$logged_info->is_site_admin) return new Object(-1, 'msg_not_permitted'); - - $input_name = Context::get('input'); - - if(!$input_name) return new Object(-1, 'msg_not_permitted'); - - - $addscript = sprintf('',$input_name); - Context::addHtmlHeader($addscript); - - $oModuleModel = &getModel('module'); - $output = $oModuleModel->getModuleFileBoxList(); - Context::set('filebox_list', $output->data); - - $filter = Context::get('filter'); - if($filter) Context::set('arrfilter',explode(',',$filter)); - - Context::set('page_navigation', $output->page_navigation); - $this->setLayoutFile('popup_layout'); - $this->setTemplateFile('filebox_list'); - } - - // 파일 박스 등록화면 - function dispModuleFileBoxAdd(){ - $logged_info = Context::get('logged_info'); - if($logged_info->is_admin !='Y' && !$logged_info->is_site_admin) return new Object(-1, 'msg_not_permitted'); - - $filter = Context::get('filter'); - if($filter) Context::set('arrfilter',explode(',',$filter)); - - $this->setLayoutFile('popup_layout'); - $this->setTemplateFile('filebox_add'); - } - } -?> +setTemplatePath($this->module_path.'tpl'); + } + + /** + * @brief 스킨 정보 출력 + **/ + function dispModuleSkinInfo() { + $selected_module = Context::get('selected_module'); + $skin = Context::get('skin'); + + // 모듈/스킨 정보를 구함 + $module_path = sprintf("./modules/%s/", $selected_module); + if(!is_dir($module_path)) $this->stop("msg_invalid_request"); + + $skin_info_xml = sprintf("%sskins/%s/skin.xml", $module_path, $skin); + if(!file_exists($skin_info_xml)) $this->stop("msg_invalid_request"); + + $oModuleModel = &getModel('module'); + $skin_info = $oModuleModel->loadSkinInfo($module_path, $skin); + Context::set('skin_info',$skin_info); + + $this->setLayoutFile("popup_layout"); + $this->setTemplateFile("skin_info"); + } + + /** + * @brief 모듈 선택기 + **/ + function dispModuleSelectList() { + if(!Context::get('is_logged')) return new Object(-1, 'msg_not_permitted'); + + $oModuleModel = &getModel('module'); + + // virtual site의 개수를 추출 + $output = executeQuery('module.getSiteCount'); + $site_count = $output->data->count; + Context::set('site_count', $site_count); + + // 사이트 검색어 변수 설정 + $site_keyword = Context::get('site_keyword'); + + // 사이트 검색어가 없으면 현재 가상 사이트의 정보를 설정 + $args = null; + $logged_info = Context::get('logged_info'); + if($logged_info->is_admin == 'Y') { + $query_id = 'module.getSiteModules'; + $module_category_exists = false; + if(!$site_keyword) { + $site_module_info = Context::get('site_module_info'); + if($site_module_info && $logged_info->is_admin != 'Y') { + $site_keyword = $site_module_info->domain; + $args->site_srl = (int)$site_module_info->site_srl; + Context::set('site_keyword', $site_keyword); + } else { + $query_id = 'module.getDefaultModules'; + $args->site_srl = 0; + $module_category_exists = true; + } + // 사이트 검색어가 있으면 해당 사이트(들)의 정보를 추출 + } else { + $args->site_keyword = $site_keyword; + } + } else { + $query_id = 'module.getSiteModules'; + $site_module_info = Context::get('site_module_info'); + $args->site_srl = (int)$site_module_info->site_srl; + } + //if(is_null($args->site_srl)) $query_id = 'module.getDefaultModules'; + + // 지정된 사이트(혹은 전체)의 module 목록을 구함 + $output = executeQueryArray($query_id, $args); + $category_list = $mid_list = array(); + if(count($output->data)) { + foreach($output->data as $key => $val) { + $module = trim($val->module); + if(!$module) continue; + + $category = $val->category; + $obj = null; + $obj->module_srl = $val->module_srl; + $obj->browser_title = $val->browser_title; + $mid_list[$module]->list[$category][$val->mid] = $obj; + } + } + + $selected_module = Context::get('selected_module'); + if(count($mid_list)) { + foreach($mid_list as $module => $val) { + if(!$selected_module) $selected_module = $module; + $xml_info = $oModuleModel->getModuleInfoXml($module); + $mid_list[$module]->title = $xml_info->title; + } + } + + Context::set('mid_list', $mid_list); + Context::set('selected_module', $selected_module); + Context::set('selected_mids', $mid_list[$selected_module]->list); + Context::set('module_category_exists', $module_category_exists); + + // 레이아웃을 팝업으로 지정 + $this->setLayoutFile('popup_layout'); + + // 템플릿 파일 지정 + $this->setTemplateFile('module_selector'); + } + + + // 파일 박스 보기 + function dispModuleFileBox(){ + $logged_info = Context::get('logged_info'); + if($logged_info->is_admin !='Y' && !$logged_info->is_site_admin) return new Object(-1, 'msg_not_permitted'); + + $input_name = Context::get('input'); + + if(!$input_name) return new Object(-1, 'msg_not_permitted'); + + + $addscript = sprintf('',$input_name); + Context::addHtmlHeader($addscript); + + $oModuleModel = &getModel('module'); + $output = $oModuleModel->getModuleFileBoxList(); + Context::set('filebox_list', $output->data); + + $filter = Context::get('filter'); + if($filter) Context::set('arrfilter',explode(',',$filter)); + + Context::set('page_navigation', $output->page_navigation); + $this->setLayoutFile('popup_layout'); + $this->setTemplateFile('filebox_list'); + } + + // 파일 박스 등록화면 + function dispModuleFileBoxAdd(){ + $logged_info = Context::get('logged_info'); + if($logged_info->is_admin !='Y' && !$logged_info->is_site_admin) return new Object(-1, 'msg_not_permitted'); + + $filter = Context::get('filter'); + if($filter) Context::set('arrfilter',explode(',',$filter)); + + $this->setLayoutFile('popup_layout'); + $this->setTemplateFile('filebox_add'); + } + } +?> diff --git a/modules/module/queries/deleteModuleExtend.xml b/modules/module/queries/deleteModuleExtend.xml index e0b1d1f3a..8a4b45e81 100644 --- a/modules/module/queries/deleteModuleExtend.xml +++ b/modules/module/queries/deleteModuleExtend.xml @@ -1,11 +1,11 @@ - - - - - - - - - - - + + +
    + + + + + + + + diff --git a/modules/module/queries/deleteModuleFileBox.xml b/modules/module/queries/deleteModuleFileBox.xml index 5c9473ce5..d8c416f9c 100644 --- a/modules/module/queries/deleteModuleFileBox.xml +++ b/modules/module/queries/deleteModuleFileBox.xml @@ -1,8 +1,8 @@ - - -
    - - - - + + +
    + + + + \ No newline at end of file diff --git a/modules/module/queries/deleteTrigger.xml b/modules/module/queries/deleteTrigger.xml index 9327799b7..8760bdeac 100644 --- a/modules/module/queries/deleteTrigger.xml +++ b/modules/module/queries/deleteTrigger.xml @@ -1,12 +1,12 @@ - - -
    - - - - - - - - + + +
    + + + + + + + + \ No newline at end of file diff --git a/modules/module/queries/getModuleFileBox.xml b/modules/module/queries/getModuleFileBox.xml index b8faa2112..c2818239b 100644 --- a/modules/module/queries/getModuleFileBox.xml +++ b/modules/module/queries/getModuleFileBox.xml @@ -1,9 +1,9 @@ - - -
    - - - - - + + +
    + + + + + \ No newline at end of file diff --git a/modules/module/queries/getModuleFileBoxList.xml b/modules/module/queries/getModuleFileBoxList.xml index 76aa291c0..68ff42b85 100644 --- a/modules/module/queries/getModuleFileBoxList.xml +++ b/modules/module/queries/getModuleFileBoxList.xml @@ -1,15 +1,15 @@ - - -
    - - - - - - - - - - - + + +
    + + + + + + + + + + + \ No newline at end of file diff --git a/modules/module/queries/insertModuleFileBox.xml b/modules/module/queries/insertModuleFileBox.xml index e9fc56203..59b0410d8 100644 --- a/modules/module/queries/insertModuleFileBox.xml +++ b/modules/module/queries/insertModuleFileBox.xml @@ -1,14 +1,14 @@ - - -
    - - - - - - - - - - - + + +
    + + + + + + + + + + + diff --git a/modules/module/schemas/module_filebox.xml b/modules/module/schemas/module_filebox.xml index d2b4dfc29..939dcb0ab 100644 --- a/modules/module/schemas/module_filebox.xml +++ b/modules/module/schemas/module_filebox.xml @@ -1,9 +1,9 @@ -
    - - - - - - - +
    + + + + + + +
    \ No newline at end of file diff --git a/modules/module/tpl/css/mlang.css b/modules/module/tpl/css/mlang.css index e222155d8..add8b113c 100644 --- a/modules/module/tpl/css/mlang.css +++ b/modules/module/tpl/css/mlang.css @@ -1,24 +1,24 @@ -@charset "utf-8"; -/* Mobile XE Language (/modules/module/tpl/lang.html) */ -body{margin:0} -.bd{background:#f8f8f8;padding:1px 0} -/* Hx */ -.hx{position:relative;border-bottom:1px solid #ccc8be;padding:8px 10px;margin:0} -.hx:after{content:"";margin:0 -10px;position:relative;top:10px;display:block;clear:both;height:1px;background:#fff} -.hx.h2{background:#e5e5e5;text-shadow:1px 1px 0 #fff} -.hx h2{margin:0 10px 0 0;display:inline;font-size:16px;line-height:1.4} -/* Global Navigation */ -.gn{margin:0;padding:0;list-style:none;background:#d3d1cc;text-shadow:1px 1px 0 #fff} -.gn li{background:#c3c3c3;border:1px solid #a3a09a;border-left:0;border-right:0;margin:0 0 -1px 0} -.gn li li{background:#f8f8f8;border:1px solid #c9c9c9;border-left:0;border-right:0} -.gn li li li{background:#e8e8e8} -.gn ul{margin:0 0 -1px 0;padding:0;list-style:none} -.gn a,.gn strong{position:relative;text-decoration:none;display:block;padding:10px;font-size:16px} -.gn li a{color:#333} -.gn li a:after{position:absolute;top:7px;right:10px;content:"›";color:#888;font-size:18px;font-weight:bold;font-family:Verdana, Geneva, sans-serif} -.gn li li a:before{content:"";display:inline-block;width:6px;height:6px;border:1px dotted #666;border-top:0;border-right:0;margin:0 4px 0 0;vertical-align:top} -.gn li li a{padding-left:15px} -.gn li li li a{padding-left:30px} -.gn li li li li a{padding-left:45px} -.gn li li li li li a{padding-left:60px} -.gn em{color:#f63;font-size:12px} +@charset "utf-8"; +/* Mobile XE Language (/modules/module/tpl/lang.html) */ +body{margin:0} +.bd{background:#f8f8f8;padding:1px 0} +/* Hx */ +.hx{position:relative;border-bottom:1px solid #ccc8be;padding:8px 10px;margin:0} +.hx:after{content:"";margin:0 -10px;position:relative;top:10px;display:block;clear:both;height:1px;background:#fff} +.hx.h2{background:#e5e5e5;text-shadow:1px 1px 0 #fff} +.hx h2{margin:0 10px 0 0;display:inline;font-size:16px;line-height:1.4} +/* Global Navigation */ +.gn{margin:0;padding:0;list-style:none;background:#d3d1cc;text-shadow:1px 1px 0 #fff} +.gn li{background:#c3c3c3;border:1px solid #a3a09a;border-left:0;border-right:0;margin:0 0 -1px 0} +.gn li li{background:#f8f8f8;border:1px solid #c9c9c9;border-left:0;border-right:0} +.gn li li li{background:#e8e8e8} +.gn ul{margin:0 0 -1px 0;padding:0;list-style:none} +.gn a,.gn strong{position:relative;text-decoration:none;display:block;padding:10px;font-size:16px} +.gn li a{color:#333} +.gn li a:after{position:absolute;top:7px;right:10px;content:"›";color:#888;font-size:18px;font-weight:bold;font-family:Verdana, Geneva, sans-serif} +.gn li li a:before{content:"";display:inline-block;width:6px;height:6px;border:1px dotted #666;border-top:0;border-right:0;margin:0 4px 0 0;vertical-align:top} +.gn li li a{padding-left:15px} +.gn li li li a{padding-left:30px} +.gn li li li li a{padding-left:45px} +.gn li li li li li a{padding-left:60px} +.gn em{color:#f63;font-size:12px} diff --git a/modules/module/tpl/filebox_add.html b/modules/module/tpl/filebox_add.html index b95dcc392..6e91496c7 100644 --- a/modules/module/tpl/filebox_add.html +++ b/modules/module/tpl/filebox_add.html @@ -1,37 +1,37 @@ - - -
    -

    {$lang->filebox}

    -
    - -
    - - - - - - -
    - - - - - - - - - - - -
    {$lang->description}
    {$lang->file} -

    - - {@sprintf($lang->about_file_extension,join(", ",$arrfilter ))} - -

    -
    -
    -
    - -
    -
    + + +
    +

    {$lang->filebox}

    +
    + +
    + + + + + + +
    + + + + + + + + + + + +
    {$lang->description}
    {$lang->file} +

    + + {@sprintf($lang->about_file_extension,join(", ",$arrfilter ))} + +

    +
    +
    +
    + +
    +
    diff --git a/modules/module/tpl/filebox_list.html b/modules/module/tpl/filebox_list.html index 8c3fd4380..124f68ce1 100644 --- a/modules/module/tpl/filebox_list.html +++ b/modules/module/tpl/filebox_list.html @@ -1,65 +1,65 @@ - - -
    -

    {$lang->filebox}

    -
    - -
    - - - - - - - - - - - - - - - - - - - -
    {$lang->file}
    {$lang->description}
    {$lang->regdate}
     
    -
    - - - - - - - - - - - - - -
    -
    {$val->comment} {zdate($val->regdate,'Y-m-d H:i')} - - - - -
    - - -
    - - + + +
    +

    {$lang->filebox}

    +
    + +
    + + + + + + + + + + + + + + + + + + + +
    {$lang->file}
    {$lang->description}
    {$lang->regdate}
     
    +
    + + + + + + + + + + + + + +
    +
    {$val->comment} {zdate($val->regdate,'Y-m-d H:i')} + + + + +
    + + +
    + + diff --git a/modules/module/tpl/js/filebox.js b/modules/module/tpl/js/filebox.js index 1bf65d1d2..70717734f 100644 --- a/modules/module/tpl/js/filebox.js +++ b/modules/module/tpl/js/filebox.js @@ -1,44 +1,44 @@ -var selected_filebox = {}; - -// popup -function openFileBox(file_obj, filter){ - selected_filebox[file_obj.name] = file_obj; - var url = request_uri.setQuery('module','module').setQuery('act','dispModuleFileBox').setQuery('input',file_obj.name).setQuery('filter',filter); - popopen(url, "filebox"); -} - -function selectFileBoxFile(file_url, module_filebox_srl){ - if(!selected_filebox_input_name) return; - opener.selected_filebox[selected_filebox_input_name].value = file_url; - opener.document.getElementById('filebox_preview_'+selected_filebox_input_name).innerHTML = document.getElementById('filebox_preview_' + module_filebox_srl).innerHTML; - opener.document.getElementById('filebox_preview_'+selected_filebox_input_name).style.display=''; - opener.document.getElementById('filebox_unselect_'+selected_filebox_input_name).style.display=''; - window.close(); -} - -function deleteFileBoxFile(module_filebox_srl){ - var params ={ - "module_filebox_srl":module_filebox_srl - }; - - jQuery.exec_json('module.procModuleFileBoxDelete', params, function(data){ - document.location.reload(); - }); -} - -function unselectFileBox(id){ - jQuery("[name="+id+"]").val(''); - jQuery('#filebox_preview_'+id).html('').hide(); - jQuery('#filebox_unselect_'+id).hide(); -} - -function initFileBox(id){ - if(opener && opener.selectedWidget && opener.selectedWidget.getAttribute("widget")){ - var file = opener.selectedWidget.getAttribute(id); - if(file){ - var html = _displayMultimedia(file,"100%","100%"); - jQuery('#filebox_preview_'+id).html(html).show(); - jQuery('#filebox_unselect_'+id).show(); - } - } +var selected_filebox = {}; + +// popup +function openFileBox(file_obj, filter){ + selected_filebox[file_obj.name] = file_obj; + var url = request_uri.setQuery('module','module').setQuery('act','dispModuleFileBox').setQuery('input',file_obj.name).setQuery('filter',filter); + popopen(url, "filebox"); +} + +function selectFileBoxFile(file_url, module_filebox_srl){ + if(!selected_filebox_input_name) return; + opener.selected_filebox[selected_filebox_input_name].value = file_url; + opener.document.getElementById('filebox_preview_'+selected_filebox_input_name).innerHTML = document.getElementById('filebox_preview_' + module_filebox_srl).innerHTML; + opener.document.getElementById('filebox_preview_'+selected_filebox_input_name).style.display=''; + opener.document.getElementById('filebox_unselect_'+selected_filebox_input_name).style.display=''; + window.close(); +} + +function deleteFileBoxFile(module_filebox_srl){ + var params ={ + "module_filebox_srl":module_filebox_srl + }; + + jQuery.exec_json('module.procModuleFileBoxDelete', params, function(data){ + document.location.reload(); + }); +} + +function unselectFileBox(id){ + jQuery("[name="+id+"]").val(''); + jQuery('#filebox_preview_'+id).html('').hide(); + jQuery('#filebox_unselect_'+id).hide(); +} + +function initFileBox(id){ + if(opener && opener.selectedWidget && opener.selectedWidget.getAttribute("widget")){ + var file = opener.selectedWidget.getAttribute(id); + if(file){ + var html = _displayMultimedia(file,"100%","100%"); + jQuery('#filebox_preview_'+id).html(html).show(); + jQuery('#filebox_unselect_'+id).show(); + } + } } \ No newline at end of file diff --git a/modules/module/tpl/js/module_admin.js b/modules/module/tpl/js/module_admin.js index 944082d76..ec069f5fc 100644 --- a/modules/module/tpl/js/module_admin.js +++ b/modules/module/tpl/js/module_admin.js @@ -1,190 +1,190 @@ -/** - * @file modules/module/js/module_admin.js - * @author NHN (developers@xpressengine.com) - * @brief module 모듈의 관리자용 javascript - **/ - -/* 카테고리 관련 작업들 */ -function doUpdateCategory(module_category_srl, mode, message) { - if(typeof(message)!='undefined'&&!confirm(message)) return; - - var fo_obj = xGetElementById('fo_category_info'); - fo_obj.module_category_srl.value = module_category_srl; - fo_obj.mode.value = mode; - - procFilter(fo_obj, update_category); -} - -/* 카테고리 정보 수정 후 */ -function completeUpdateCategory(ret_obj) { - var error = ret_obj['error']; - var message = ret_obj['message']; - - alert(message); - - location.href = current_url.setQuery('module_category_srl',''); -} - -/* 선택된 모듈을 관리자 메뉴의 바로가기에 등록 */ -function doAddShortCut(module) { - var fo_obj = xGetElementById("fo_shortcut"); - fo_obj.selected_module.value = module; - procFilter(fo_obj, insert_shortcut); -} - -/* 모듈 설치 */ -function doInstallModule(module) { - var params = new Array(); - params['module_name'] = module; - exec_xml('install','procInstallAdminInstall',params, completeInstallModule); -} - -function completeInstallModule(ret_obj) { - alert(ret_obj['message']); - location.reload(); -} - -/* 모듈 업그레이드 */ -function doUpdateModule(module) { - var params = new Array(); - params['module_name'] = module; - exec_xml('install','procInstallAdminUpdate',params, completeInstallModule); -} - -/* 모듈 복사후 */ -function completeCopyModule() { - if(typeof(opener)!='undefined') opener.location.href = opener.location.href; - window.close(); -} - -/* 모듈 선택기에서 선택된 모듈의 입력 */ -function insertModule(id, module_srl, mid, browser_title, multi_select) { - if(typeof(multi_select)=='undefined') multi_select = true; - if(!window.opener) window.close(); - - if(multi_select) { - if(typeof(opener.insertSelectedModules)=='undefined') return; - opener.insertSelectedModules(id, module_srl, mid, browser_title); - } else { - if(typeof(opener.insertSelectedModule)=='undefined') return; - opener.insertSelectedModule(id, module_srl, mid, browser_title); - window.close(); - } -} - -/* 권한 선택용 */ -function doShowGrantZone() { - jQuery(".grant_default").each( function() { - var id = "#zone_"+this.name.replace(/_default$/,''); - if(!jQuery(this).val()) jQuery(id).css("display","block"); - else jQuery(id).css("display","none"); - } ); -} - -/* 권한 등록 후 알림 메세지 */ -function completeInsertGrant(ret_obj) { - alert(ret_obj['message']); - location.reload(); -} - -/* 관리자 아이디 등록/ 제거 */ -function doInsertAdmin() { - var fo_obj = xGetElementById("fo_obj"); - var sel_obj = fo_obj._admin_member; - var admin_id = fo_obj.admin_id.value; - if(!admin_id) return; - - var opt = new Option(admin_id,admin_id,true,true); - sel_obj.options[sel_obj.options.length] = opt; - - fo_obj.admin_id.value = ''; - sel_obj.size = sel_obj.options.length; - sel_obj.selectedIndex = -1; - - var members = new Array(); - for(var i=0;i/.test(value)) { - var param = new Array(); - param['name'] = value.replace(/^\$user_lang->/,''); - var response_tags = new Array('error','message','name','langs'); - exec_xml('module','getModuleAdminLangCode',param,completeFillLangName, response_tags); - } - } -} - -function completeFillLangName(ret_obj, response_tags) { - var name = ret_obj['name']; - var langs = ret_obj['langs']; - if(typeof(langs)=='undefined') return; - var $form = jQuery("#menu_fo"); - $form[0].lang_code.value = name; - for(var i in langs) { - $form[0][i].value = langs[i]; - } - -} +/** + * @file modules/module/js/module_admin.js + * @author NHN (developers@xpressengine.com) + * @brief module 모듈의 관리자용 javascript + **/ + +/* 카테고리 관련 작업들 */ +function doUpdateCategory(module_category_srl, mode, message) { + if(typeof(message)!='undefined'&&!confirm(message)) return; + + var fo_obj = xGetElementById('fo_category_info'); + fo_obj.module_category_srl.value = module_category_srl; + fo_obj.mode.value = mode; + + procFilter(fo_obj, update_category); +} + +/* 카테고리 정보 수정 후 */ +function completeUpdateCategory(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + + alert(message); + + location.href = current_url.setQuery('module_category_srl',''); +} + +/* 선택된 모듈을 관리자 메뉴의 바로가기에 등록 */ +function doAddShortCut(module) { + var fo_obj = xGetElementById("fo_shortcut"); + fo_obj.selected_module.value = module; + procFilter(fo_obj, insert_shortcut); +} + +/* 모듈 설치 */ +function doInstallModule(module) { + var params = new Array(); + params['module_name'] = module; + exec_xml('install','procInstallAdminInstall',params, completeInstallModule); +} + +function completeInstallModule(ret_obj) { + alert(ret_obj['message']); + location.reload(); +} + +/* 모듈 업그레이드 */ +function doUpdateModule(module) { + var params = new Array(); + params['module_name'] = module; + exec_xml('install','procInstallAdminUpdate',params, completeInstallModule); +} + +/* 모듈 복사후 */ +function completeCopyModule() { + if(typeof(opener)!='undefined') opener.location.href = opener.location.href; + window.close(); +} + +/* 모듈 선택기에서 선택된 모듈의 입력 */ +function insertModule(id, module_srl, mid, browser_title, multi_select) { + if(typeof(multi_select)=='undefined') multi_select = true; + if(!window.opener) window.close(); + + if(multi_select) { + if(typeof(opener.insertSelectedModules)=='undefined') return; + opener.insertSelectedModules(id, module_srl, mid, browser_title); + } else { + if(typeof(opener.insertSelectedModule)=='undefined') return; + opener.insertSelectedModule(id, module_srl, mid, browser_title); + window.close(); + } +} + +/* 권한 선택용 */ +function doShowGrantZone() { + jQuery(".grant_default").each( function() { + var id = "#zone_"+this.name.replace(/_default$/,''); + if(!jQuery(this).val()) jQuery(id).css("display","block"); + else jQuery(id).css("display","none"); + } ); +} + +/* 권한 등록 후 알림 메세지 */ +function completeInsertGrant(ret_obj) { + alert(ret_obj['message']); + location.reload(); +} + +/* 관리자 아이디 등록/ 제거 */ +function doInsertAdmin() { + var fo_obj = xGetElementById("fo_obj"); + var sel_obj = fo_obj._admin_member; + var admin_id = fo_obj.admin_id.value; + if(!admin_id) return; + + var opt = new Option(admin_id,admin_id,true,true); + sel_obj.options[sel_obj.options.length] = opt; + + fo_obj.admin_id.value = ''; + sel_obj.size = sel_obj.options.length; + sel_obj.selectedIndex = -1; + + var members = new Array(); + for(var i=0;i/.test(value)) { + var param = new Array(); + param['name'] = value.replace(/^\$user_lang->/,''); + var response_tags = new Array('error','message','name','langs'); + exec_xml('module','getModuleAdminLangCode',param,completeFillLangName, response_tags); + } + } +} + +function completeFillLangName(ret_obj, response_tags) { + var name = ret_obj['name']; + var langs = ret_obj['langs']; + if(typeof(langs)=='undefined') return; + var $form = jQuery("#menu_fo"); + $form[0].lang_code.value = name; + for(var i in langs) { + $form[0][i].value = langs[i]; + } + +} diff --git a/modules/module/tpl/lang.html b/modules/module/tpl/lang.html index 35c350663..2f02ea854 100644 --- a/modules/module/tpl/lang.html +++ b/modules/module/tpl/lang.html @@ -1,15 +1,15 @@ - -
    -
    -

    Select Your Language

    -
    -
      - - -
    • {$val}
    • - -
    • {$val}
    • - - -
    -
    + +
    +
    +

    Select Your Language

    +
    +
      + + +
    • {$val}
    • + +
    • {$val}
    • + + +
    +
    diff --git a/modules/module/tpl/move_filebox_list.html b/modules/module/tpl/move_filebox_list.html index fe25e5d99..97f9a7392 100644 --- a/modules/module/tpl/move_filebox_list.html +++ b/modules/module/tpl/move_filebox_list.html @@ -1,3 +1,3 @@ - \ No newline at end of file diff --git a/modules/opage/conf/info.xml b/modules/opage/conf/info.xml index 3f662b7f2..f5e40817e 100644 --- a/modules/opage/conf/info.xml +++ b/modules/opage/conf/info.xml @@ -1,37 +1,37 @@ - - - 외부 페이지 - 外部页面 - 外部ページ - External Page - Trang ngoài - Afuera Página - Внешние страницы - 外部頁面 - Harici Sayfa - 외부페이지를 XE내부로 삽입시키는 모듈 - 可以把外部页面插入到 Zeroboard XE内部的模块。 - 外部ページをXE内部に挿入させるモジュール - Module for inserting external pages into inside of Zeroboard XE. - Module cho phépchèn một trang từ bên ngoài vào bên trong Zeroboard XE. - 외부페이지를 XE내부로 삽입시키는 모듈 - Модуль для вставки внешних страниц внутрь Zeroboard XE. - 可將外部頁面插入至XE裡面的模組。 - Harici sayfaları, Zeroboard XE\'nin içine yerleştirmek için kullanılan modüldür. - 0.1 - 2007-09-17 - service - http://xpressengine.com/ - - - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - - + + + 외부 페이지 + 外部页面 + 外部ページ + External Page + Trang ngoài + Afuera Página + Внешние страницы + 外部頁面 + Harici Sayfa + 외부페이지를 XE내부로 삽입시키는 모듈 + 可以把外部页面插入到 Zeroboard XE内部的模块。 + 外部ページをXE内部に挿入させるモジュール + Module for inserting external pages into inside of Zeroboard XE. + Module cho phépchèn một trang từ bên ngoài vào bên trong Zeroboard XE. + 외부페이지를 XE내부로 삽입시키는 모듈 + Модуль для вставки внешних страниц внутрь Zeroboard XE. + 可將外部頁面插入至XE裡面的模組。 + Harici sayfaları, Zeroboard XE\'nin içine yerleştirmek için kullanılan modüldür. + 0.1 + 2007-09-17 + service + http://xpressengine.com/ + + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + diff --git a/modules/opage/lang/en.lang.php b/modules/opage/lang/en.lang.php index 27141ef49..4e0ee1792 100644 --- a/modules/opage/lang/en.lang.php +++ b/modules/opage/lang/en.lang.php @@ -1,18 +1,18 @@ -opage = "External Page"; - $lang->opage_path = "Location of External Document"; - $lang->opage_caching_interval = "Caching Time"; - - $lang->about_opage = "This module enables usage of external html or php files in XE.
    It allows absolute or relative path, and if the url starts with 'http://' , it can display the external page of the server."; - $lang->about_opage_path= "Please input the location of external document.
    Both absolute path such as '/path1/path2/sample.php' or relative path such as '../path2/sample.php' can be used.
    If you input the path like 'http://url/sample.php' , the result will be received and then displayed.
    This is current XE's absolute path.
    "; - $lang->about_opage_caching_interval = "The unit is minute, and it displays temporary saved data for assigned time.
    It is recommended to cache for proper time if a lot of resources are needed when displaying other servers' data or information.
    A value of 0 will not cache."; - - $lang->opage_mobile_path = 'Location of External Document for Mobile View'; - $lang->about_opage_mobile_path= "Please input the location of external document for mobile view. If not inputted, it uses the the external document specified above.
    Both absolute path such as '/path1/path2/sample.php' or relative path such as '../path2/sample.php' can be used.
    If you input the path like 'http://url/sample.php' , the result will be received and then displayed.
    This is current XE's absolute path.
    "; -?> +opage = "External Page"; + $lang->opage_path = "Location of External Document"; + $lang->opage_caching_interval = "Caching Time"; + + $lang->about_opage = "This module enables usage of external html or php files in XE.
    It allows absolute or relative path, and if the url starts with 'http://' , it can display the external page of the server."; + $lang->about_opage_path= "Please input the location of external document.
    Both absolute path such as '/path1/path2/sample.php' or relative path such as '../path2/sample.php' can be used.
    If you input the path like 'http://url/sample.php' , the result will be received and then displayed.
    This is current XE's absolute path.
    "; + $lang->about_opage_caching_interval = "The unit is minute, and it displays temporary saved data for assigned time.
    It is recommended to cache for proper time if a lot of resources are needed when displaying other servers' data or information.
    A value of 0 will not cache."; + + $lang->opage_mobile_path = 'Location of External Document for Mobile View'; + $lang->about_opage_mobile_path= "Please input the location of external document for mobile view. If not inputted, it uses the the external document specified above.
    Both absolute path such as '/path1/path2/sample.php' or relative path such as '../path2/sample.php' can be used.
    If you input the path like 'http://url/sample.php' , the result will be received and then displayed.
    This is current XE's absolute path.
    "; +?> diff --git a/modules/opage/lang/es.lang.php b/modules/opage/lang/es.lang.php index 27cb800f9..6ca78ebd7 100644 --- a/modules/opage/lang/es.lang.php +++ b/modules/opage/lang/es.lang.php @@ -1,17 +1,17 @@ -opage = "Page Exteriores"; - $lang->opage_path = "Ubicacion del documento externo"; - $lang->opage_caching_interval = "Establezca el tiempo de cache"; - - $lang->about_opage = 'Este modulo permite el uso externo de archivos html o php en XE.
    Permite ruta absoluta o relativa, y si la URL comienza con "http://", se puede mostrar la pagina externa del servidor.'; - $lang->about_opage_path= "Por favor ingrese la ubicacion del documento externos.
    Ambos ruta absoluta como '/ path1/path2/sample.php' o ruta relativa como \"../path2/sample.php\" puede ser utilizado.
    Si la via de entrada, como \"http://url/sample.php\", el resultado sera recibido y, a continuacion se muestran.
    Esta es la actual XE ruta absoluta.
    "; - $lang->about_opage_caching_interval = "La unidad es minuto, y se muestra temporal de los datos guardados por el tiempo asignado.
    Se recomienda a la cache para una buena vez si una gran cantidad de recursos se necesitan otros servidores cuando se muestran los datos o la informacion.
    Un valor de 0 no cache."; - $lang->opage_mobile_path = 'Location of External Document for Mobile View'; - $lang->about_opage_mobile_path= "Please input the location of external document for mobile view. If not inputted, it uses the the external document specified above.
    Both absolute path such as '/path1/path2/sample.php' or relative path such as '../path2/sample.php' can be used.
    If you input the path like 'http://url/sample.php' , the result will be received and then displayed.
    This is current XE's absolute path.
    "; -?> +opage = "Page Exteriores"; + $lang->opage_path = "Ubicacion del documento externo"; + $lang->opage_caching_interval = "Establezca el tiempo de cache"; + + $lang->about_opage = 'Este modulo permite el uso externo de archivos html o php en XE.
    Permite ruta absoluta o relativa, y si la URL comienza con "http://", se puede mostrar la pagina externa del servidor.'; + $lang->about_opage_path= "Por favor ingrese la ubicacion del documento externos.
    Ambos ruta absoluta como '/ path1/path2/sample.php' o ruta relativa como \"../path2/sample.php\" puede ser utilizado.
    Si la via de entrada, como \"http://url/sample.php\", el resultado sera recibido y, a continuacion se muestran.
    Esta es la actual XE ruta absoluta.
    "; + $lang->about_opage_caching_interval = "La unidad es minuto, y se muestra temporal de los datos guardados por el tiempo asignado.
    Se recomienda a la cache para una buena vez si una gran cantidad de recursos se necesitan otros servidores cuando se muestran los datos o la informacion.
    Un valor de 0 no cache."; + $lang->opage_mobile_path = 'Location of External Document for Mobile View'; + $lang->about_opage_mobile_path= "Please input the location of external document for mobile view. If not inputted, it uses the the external document specified above.
    Both absolute path such as '/path1/path2/sample.php' or relative path such as '../path2/sample.php' can be used.
    If you input the path like 'http://url/sample.php' , the result will be received and then displayed.
    This is current XE's absolute path.
    "; +?> diff --git a/modules/opage/lang/fr.lang.php b/modules/opage/lang/fr.lang.php index 8ee06ec29..8a6a4b080 100644 --- a/modules/opage/lang/fr.lang.php +++ b/modules/opage/lang/fr.lang.php @@ -1,17 +1,17 @@ -opage = "Page Extérieure"; - $lang->opage_path = "Localisation du Document Extérieur"; - $lang->opage_caching_interval = "Temps de antémémoire"; - - $lang->about_opage = "Ce module vous fait pouvoir utiliser des documents extérieurs en html ou en php dans XE.
    Il est possible d'utiliser le chemin absolu ou relatif, et si l'URL commence avec 'http://' , il est possible de représenter des pages extérieurs du serveur."; - $lang->about_opage_path= "Entrez la localisation du document extérieur.
    Non seulement le chemin absolu comme '/path1/path2/sample.php' mais aussi le chemin relatif comme '../path2/sample.php' peuvent être utilisés.
    Si vous entrez le chemin comme 'http://url/sample.php', le résultat sera reçu et puis exposé
    Le chemin suivant, c'est le chemin absolu de XE.
    "; - $lang->about_opage_caching_interval = "L'unité est minute, et ça exposera des données conservées temporairement pendant le temps assigné.
    Il est recommandé d'utiliser l'antémémoire pendant le temps convenable si beaucoup de ressource est nécessaire pour représenter les données ou l'information d'autre serveur.
    La valeur 0 signifie de ne pas utiliser antémémoire."; - $lang->opage_mobile_path = 'Location of External Document for Mobile View'; - $lang->about_opage_mobile_path= "Please input the location of external document for mobile view. If not inputted, it uses the the external document specified above.
    Both absolute path such as '/path1/path2/sample.php' or relative path such as '../path2/sample.php' can be used.
    If you input the path like 'http://url/sample.php' , the result will be received and then displayed.
    This is current XE's absolute path.
    "; -?> +opage = "Page Extérieure"; + $lang->opage_path = "Localisation du Document Extérieur"; + $lang->opage_caching_interval = "Temps de antémémoire"; + + $lang->about_opage = "Ce module vous fait pouvoir utiliser des documents extérieurs en html ou en php dans XE.
    Il est possible d'utiliser le chemin absolu ou relatif, et si l'URL commence avec 'http://' , il est possible de représenter des pages extérieurs du serveur."; + $lang->about_opage_path= "Entrez la localisation du document extérieur.
    Non seulement le chemin absolu comme '/path1/path2/sample.php' mais aussi le chemin relatif comme '../path2/sample.php' peuvent être utilisés.
    Si vous entrez le chemin comme 'http://url/sample.php', le résultat sera reçu et puis exposé
    Le chemin suivant, c'est le chemin absolu de XE.
    "; + $lang->about_opage_caching_interval = "L'unité est minute, et ça exposera des données conservées temporairement pendant le temps assigné.
    Il est recommandé d'utiliser l'antémémoire pendant le temps convenable si beaucoup de ressource est nécessaire pour représenter les données ou l'information d'autre serveur.
    La valeur 0 signifie de ne pas utiliser antémémoire."; + $lang->opage_mobile_path = 'Location of External Document for Mobile View'; + $lang->about_opage_mobile_path= "Please input the location of external document for mobile view. If not inputted, it uses the the external document specified above.
    Both absolute path such as '/path1/path2/sample.php' or relative path such as '../path2/sample.php' can be used.
    If you input the path like 'http://url/sample.php' , the result will be received and then displayed.
    This is current XE's absolute path.
    "; +?> diff --git a/modules/opage/lang/jp.lang.php b/modules/opage/lang/jp.lang.php index b29544fd4..306506826 100644 --- a/modules/opage/lang/jp.lang.php +++ b/modules/opage/lang/jp.lang.php @@ -1,17 +1,17 @@ -opage = '外部ページ'; - $lang->opage_path = '外部ドキュメントの場所'; - $lang->opage_caching_interval = 'キャッシング時間設定'; - - $lang->about_opage = '外部のHTMLまたはPHPファイルをXE内部で使用出来るようにするモジュールです。
    絶対パス、相対パスで指定出来、「http://」で始まるサーバの外部ページも表示出来ます。'; - $lang->about_opage_path= '外部ドキュメントの場所を入力して下さい。
    「/path1/path2/sample.php」のような絶対パス、「../path2/sample.php」のような相対パスが使用出来ます。
    「http://URL/sample.php」のように使用すると結果を読み込んで表示します。
    現在XEがインストールされている絶対パスは次のようになっています。
    '; - $lang->about_opage_caching_interval = '分単位で指定出来、設定された時間の間は、臨時保存されたデータを出力します。
    他のサーバの情報を出力したり、データを出力する際、リソースが多く使われるため、数分単位でキャッシングすることをお勧めします。
    「0」に指定するとキャッシングされません。'; - $lang->opage_mobile_path = 'モバイルバージョン文書へのパス'; - $lang->about_opage_mobile_path= "モバイルバージョンドキュメントへのパスを指定して下さい。 指定してないと一般ドキュメントのパスに指定されます。
    /path1/path2/sample.php のような絶対パスや ../path2/sample.phpのような相対パス両方とも指定できます。
    指定すると対応するドキュメントをウェブからダウンロードして表示します。
    現在、XEの設置されている絶対パスは次のようになります。"; -?> +opage = '外部ページ'; + $lang->opage_path = '外部ドキュメントの場所'; + $lang->opage_caching_interval = 'キャッシング時間設定'; + + $lang->about_opage = '外部のHTMLまたはPHPファイルをXE内部で使用出来るようにするモジュールです。
    絶対パス、相対パスで指定出来、「http://」で始まるサーバの外部ページも表示出来ます。'; + $lang->about_opage_path= '外部ドキュメントの場所を入力して下さい。
    「/path1/path2/sample.php」のような絶対パス、「../path2/sample.php」のような相対パスが使用出来ます。
    「http://URL/sample.php」のように使用すると結果を読み込んで表示します。
    現在XEがインストールされている絶対パスは次のようになっています。
    '; + $lang->about_opage_caching_interval = '分単位で指定出来、設定された時間の間は、臨時保存されたデータを出力します。
    他のサーバの情報を出力したり、データを出力する際、リソースが多く使われるため、数分単位でキャッシングすることをお勧めします。
    「0」に指定するとキャッシングされません。'; + $lang->opage_mobile_path = 'モバイルバージョン文書へのパス'; + $lang->about_opage_mobile_path= "モバイルバージョンドキュメントへのパスを指定して下さい。 指定してないと一般ドキュメントのパスに指定されます。
    /path1/path2/sample.php のような絶対パスや ../path2/sample.phpのような相対パス両方とも指定できます。
    指定すると対応するドキュメントをウェブからダウンロードして表示します。
    現在、XEの設置されている絶対パスは次のようになります。"; +?> diff --git a/modules/opage/lang/ko.lang.php b/modules/opage/lang/ko.lang.php index 72e5b2ebc..448ce2f45 100644 --- a/modules/opage/lang/ko.lang.php +++ b/modules/opage/lang/ko.lang.php @@ -1,18 +1,18 @@ -opage = '외부 페이지'; - $lang->opage_path = '외부 문서 위치'; - $lang->opage_caching_interval = '캐싱 시간 설정'; - - $lang->about_opage = 'XE가 아닌 외부 HTML 또는 PHP파일을 XE에서 사용할 수 있도록 하는 모듈입니다.
    절대경로, 상대경로를 이용할 수 있으며 http:// 로 시작할 경우 서버 외부의 페이지도 표시할 수 있습니다'; - $lang->about_opage_path= '외부문서의 위치를 입력해주세요.
    /path1/path2/sample.php 와 같이 절대경로나 ../path2/sample.php와 같은 상대경로 모두 사용가능합니다.
    http://url/sample.php 와 같이 사용하면 해당 페이지를 웹으로 전송 받아 출력 하게 됩니다.
    현재 XE가 설치된 절대경로는 다음과 같습니다.
    '; - $lang->about_opage_caching_interval = '분 단위이며 정해진 시간동안은 임시 저장한 데이터를 출력합니다.
    다른 서버의 정보를 출력하거나, 데이터 출력하는데 많은 자원이 필요한 경우, 원하시는 분 단위 시간 간격으로 캐싱하는 것을 추천합니다.
    0 으로 하시면 캐싱을 하지 않습니다.'; - - $lang->opage_mobile_path = '모바일용 외부 문서 위치'; - $lang->about_opage_mobile_path= '모바일용 외부문서의 위치를 입력해주세요. 입력하지 않으면 위에서 지정한 외부문서 위치의 페이지를 이용합니다.
    /path1/path2/sample.php 와 같이 절대경로나 ../path2/sample.php와 같은 상대경로 모두 사용가능합니다.
    http://url/sample.php 와 같이 사용하면 해당 페이지를 웹으로 전송 받아 출력 하게 됩니다.
    현재 XE가 설치된 절대경로는 다음과 같습니다.
    '; -?> +opage = '외부 페이지'; + $lang->opage_path = '외부 문서 위치'; + $lang->opage_caching_interval = '캐싱 시간 설정'; + + $lang->about_opage = 'XE가 아닌 외부 HTML 또는 PHP파일을 XE에서 사용할 수 있도록 하는 모듈입니다.
    절대경로, 상대경로를 이용할 수 있으며 http:// 로 시작할 경우 서버 외부의 페이지도 표시할 수 있습니다'; + $lang->about_opage_path= '외부문서의 위치를 입력해주세요.
    /path1/path2/sample.php 와 같이 절대경로나 ../path2/sample.php와 같은 상대경로 모두 사용가능합니다.
    http://url/sample.php 와 같이 사용하면 해당 페이지를 웹으로 전송 받아 출력 하게 됩니다.
    현재 XE가 설치된 절대경로는 다음과 같습니다.
    '; + $lang->about_opage_caching_interval = '분 단위이며 정해진 시간동안은 임시 저장한 데이터를 출력합니다.
    다른 서버의 정보를 출력하거나, 데이터 출력하는데 많은 자원이 필요한 경우, 원하시는 분 단위 시간 간격으로 캐싱하는 것을 추천합니다.
    0 으로 하시면 캐싱을 하지 않습니다.'; + + $lang->opage_mobile_path = '모바일용 외부 문서 위치'; + $lang->about_opage_mobile_path= '모바일용 외부문서의 위치를 입력해주세요. 입력하지 않으면 위에서 지정한 외부문서 위치의 페이지를 이용합니다.
    /path1/path2/sample.php 와 같이 절대경로나 ../path2/sample.php와 같은 상대경로 모두 사용가능합니다.
    http://url/sample.php 와 같이 사용하면 해당 페이지를 웹으로 전송 받아 출력 하게 됩니다.
    현재 XE가 설치된 절대경로는 다음과 같습니다.
    '; +?> diff --git a/modules/opage/lang/ru.lang.php b/modules/opage/lang/ru.lang.php index a9d3600c1..91d8766d7 100644 --- a/modules/opage/lang/ru.lang.php +++ b/modules/opage/lang/ru.lang.php @@ -1,17 +1,17 @@ -opage = "Внешняя страница"; - $lang->opage_path = "Расположение внешнего документа"; - $lang->opage_caching_interval = "Установить время кеширования"; - - $lang->about_opage = "Этот модуль позволяет использовать внешние HTML или PHP файлы в XE.
    Требует ввода абсолютного или относительного пути. Если URL начинается с 'http://', внешняя страница с другого сервера будет показана."; - $lang->about_opage_path= "Пожалуйста, введите размещение внешнего документа.
    Абсолютный путь как '/path1/path2/sample.php', так и относительный как '../path2/sample.php' могут быть использованы.
    Если Вы введете путь как 'http://url/sample.php', результат будет сначала получен и затем показан.
    Это текущий абсолютный путь к XE.
    "; - $lang->about_opage_caching_interval = "Единица измерения равна одной минуте. Это отображает временно сохраненные данные для присвоенного времени.
    Рекомендуется устанавливать разумное время кеширования, если множество ресурсов нуждаются в показе данных с других серверов.
    Значение 0 отключает кеширование."; - $lang->opage_mobile_path = 'Location of External Document for Mobile View'; - $lang->about_opage_mobile_path= "Please input the location of external document for mobile view. If not inputted, it uses the the external document specified above.
    Both absolute path such as '/path1/path2/sample.php' or relative path such as '../path2/sample.php' can be used.
    If you input the path like 'http://url/sample.php' , the result will be received and then displayed.
    This is current XE's absolute path.
    "; -?> +opage = "Внешняя страница"; + $lang->opage_path = "Расположение внешнего документа"; + $lang->opage_caching_interval = "Установить время кеширования"; + + $lang->about_opage = "Этот модуль позволяет использовать внешние HTML или PHP файлы в XE.
    Требует ввода абсолютного или относительного пути. Если URL начинается с 'http://', внешняя страница с другого сервера будет показана."; + $lang->about_opage_path= "Пожалуйста, введите размещение внешнего документа.
    Абсолютный путь как '/path1/path2/sample.php', так и относительный как '../path2/sample.php' могут быть использованы.
    Если Вы введете путь как 'http://url/sample.php', результат будет сначала получен и затем показан.
    Это текущий абсолютный путь к XE.
    "; + $lang->about_opage_caching_interval = "Единица измерения равна одной минуте. Это отображает временно сохраненные данные для присвоенного времени.
    Рекомендуется устанавливать разумное время кеширования, если множество ресурсов нуждаются в показе данных с других серверов.
    Значение 0 отключает кеширование."; + $lang->opage_mobile_path = 'Location of External Document for Mobile View'; + $lang->about_opage_mobile_path= "Please input the location of external document for mobile view. If not inputted, it uses the the external document specified above.
    Both absolute path such as '/path1/path2/sample.php' or relative path such as '../path2/sample.php' can be used.
    If you input the path like 'http://url/sample.php' , the result will be received and then displayed.
    This is current XE's absolute path.
    "; +?> diff --git a/modules/opage/lang/tr.lang.php b/modules/opage/lang/tr.lang.php index 657a0accf..9a96354be 100644 --- a/modules/opage/lang/tr.lang.php +++ b/modules/opage/lang/tr.lang.php @@ -1,18 +1,18 @@ -opage = "Harici Sayfa"; - $lang->opage_path = "Harici Belgenin Konumu"; - $lang->opage_caching_interval = "Önbelleğe Alma Zamanı"; - - $lang->about_opage = "Bu modül, harici html veya php dosyalarının XE\'nin içinde kullanılmasına olanak tanır.
    Kesin ya da ilgili yola izin verir ve eğer url 'http://' ile başlıyorsa , modül sunucunun harici sayfasını gösterebilir."; - $lang->about_opage_path= "Lütfen harici dosyaların konumunu giriniz.
    '/path1/path2/sample.php' gibi kesin yollar ve '../path2/sample.php' gibi ilgili yollar kullanılabilir.
    Eğer 'http://url/sample.php' gibi bir yol giriyorsanız, sonuç önce alınacak sonra gösterilecektir.
    Bu XE\'nin kesin yoludur.
    "; - $lang->about_opage_caching_interval = "Birim dakikadır ve belirlenen zaman için kaydedilmiş geçici dosyayı gösterir.
    Diğer sunucuların veri veya bilgileri gösterilirken, eğer fazla sayıda kaynağın gösterilmesi gerekiyorsa, uygun zamanın önbelleğe alınması önerilmiştir.
    0 değeri verilirse, önbelleğe alınma işlemi gerçekleşmeyecektir."; - - $lang->opage_mobile_path = 'Harici Dosyanın Hareketli Görünüm için Konumu'; - $lang->about_opage_mobile_path= "Lütfen hareketli görünüm için harici dosyanın konumunu giriniz. Eğer konum girilmediyse, harici belgenin belirlenmişini kullanır.
    '/path1/path2/sample.php' gibi kesin yol veya '../path2/sample.php' gibi ilgili yol kullanılabilir.
    Eğer 'http://url/sample.php' gibi bir adres girdiyseniz , sonuç önce alınacak sonra görüntülenecektir.
    Bu XE\'nin kesin yoludur.
    "; -?> +opage = "Harici Sayfa"; + $lang->opage_path = "Harici Belgenin Konumu"; + $lang->opage_caching_interval = "Önbelleğe Alma Zamanı"; + + $lang->about_opage = "Bu modül, harici html veya php dosyalarının XE\'nin içinde kullanılmasına olanak tanır.
    Kesin ya da ilgili yola izin verir ve eğer url 'http://' ile başlıyorsa , modül sunucunun harici sayfasını gösterebilir."; + $lang->about_opage_path= "Lütfen harici dosyaların konumunu giriniz.
    '/path1/path2/sample.php' gibi kesin yollar ve '../path2/sample.php' gibi ilgili yollar kullanılabilir.
    Eğer 'http://url/sample.php' gibi bir yol giriyorsanız, sonuç önce alınacak sonra gösterilecektir.
    Bu XE\'nin kesin yoludur.
    "; + $lang->about_opage_caching_interval = "Birim dakikadır ve belirlenen zaman için kaydedilmiş geçici dosyayı gösterir.
    Diğer sunucuların veri veya bilgileri gösterilirken, eğer fazla sayıda kaynağın gösterilmesi gerekiyorsa, uygun zamanın önbelleğe alınması önerilmiştir.
    0 değeri verilirse, önbelleğe alınma işlemi gerçekleşmeyecektir."; + + $lang->opage_mobile_path = 'Harici Dosyanın Hareketli Görünüm için Konumu'; + $lang->about_opage_mobile_path= "Lütfen hareketli görünüm için harici dosyanın konumunu giriniz. Eğer konum girilmediyse, harici belgenin belirlenmişini kullanır.
    '/path1/path2/sample.php' gibi kesin yol veya '../path2/sample.php' gibi ilgili yol kullanılabilir.
    Eğer 'http://url/sample.php' gibi bir adres girdiyseniz , sonuç önce alınacak sonra görüntülenecektir.
    Bu XE\'nin kesin yoludur.
    "; +?> diff --git a/modules/opage/lang/vi.lang.php b/modules/opage/lang/vi.lang.php index cc4d772c4..72e41e978 100644 --- a/modules/opage/lang/vi.lang.php +++ b/modules/opage/lang/vi.lang.php @@ -1,19 +1,19 @@ -opage = "Trang ngoài"; - $lang->opage_path = "Đường dẫn thư mục"; - $lang->opage_caching_interval = "Thời gian lưu trữ"; - - $lang->about_opage = "Module này tạo ra một trang từ bên ngoài tại XE thông qua File HTML hoặc PHP.
    Nó cho phép đường dẫn tuyệt đối hay tương đối, nếu bắt đầu bằng 'http://' , nó sẽ hiển thị một trang từ bên ngoài Server."; - $lang->about_opage_path= "Xin hãy nhập đường dẫn của thư mục.
    Có thể sử dụng đường dẫn tuyệt đối dạng '/path1/path2/sample.php' hay tương đối dạng '../path2/sample.php'.
    Nếu nhập đường dẫn dạng 'http://url/sample.php', nó sẽ nhận và hiển thị nội dung của File đó.
    Đây là đường dẫn tuyệt đối thư mục cài đặt XE.
    "; - $lang->about_opage_caching_interval = "Đơn vị được tính bằng phút, nó sẽ là thời gian lưu trữ tạm thời.
    Đó là khuyến cáo thời gian lưu trữ tạm thời thích hợp khi cần để hiển thị.
    Nhập 0 nếu không sử dụng tính năng này."; - $lang->opage_mobile_path = 'Location of External Document for Mobile View'; - $lang->about_opage_mobile_path= "Please input the location of external document for mobile view. If not inputted, it uses the the external document specified above.
    Both absolute path such as '/path1/path2/sample.php' or relative path such as '../path2/sample.php' can be used.
    If you input the path like 'http://url/sample.php' , the result will be received and then displayed.
    This is current XE's absolute path.
    "; -?> +opage = "Trang ngoài"; + $lang->opage_path = "Đường dẫn thư mục"; + $lang->opage_caching_interval = "Thời gian lưu trữ"; + + $lang->about_opage = "Module này tạo ra một trang từ bên ngoài tại XE thông qua File HTML hoặc PHP.
    Nó cho phép đường dẫn tuyệt đối hay tương đối, nếu bắt đầu bằng 'http://' , nó sẽ hiển thị một trang từ bên ngoài Server."; + $lang->about_opage_path= "Xin hãy nhập đường dẫn của thư mục.
    Có thể sử dụng đường dẫn tuyệt đối dạng '/path1/path2/sample.php' hay tương đối dạng '../path2/sample.php'.
    Nếu nhập đường dẫn dạng 'http://url/sample.php', nó sẽ nhận và hiển thị nội dung của File đó.
    Đây là đường dẫn tuyệt đối thư mục cài đặt XE.
    "; + $lang->about_opage_caching_interval = "Đơn vị được tính bằng phút, nó sẽ là thời gian lưu trữ tạm thời.
    Đó là khuyến cáo thời gian lưu trữ tạm thời thích hợp khi cần để hiển thị.
    Nhập 0 nếu không sử dụng tính năng này."; + $lang->opage_mobile_path = 'Location of External Document for Mobile View'; + $lang->about_opage_mobile_path= "Please input the location of external document for mobile view. If not inputted, it uses the the external document specified above.
    Both absolute path such as '/path1/path2/sample.php' or relative path such as '../path2/sample.php' can be used.
    If you input the path like 'http://url/sample.php' , the result will be received and then displayed.
    This is current XE's absolute path.
    "; +?> diff --git a/modules/opage/lang/zh-CN.lang.php b/modules/opage/lang/zh-CN.lang.php index e15e8bb3f..8c97eff54 100644 --- a/modules/opage/lang/zh-CN.lang.php +++ b/modules/opage/lang/zh-CN.lang.php @@ -1,18 +1,18 @@ -opage = "外部页面"; - $lang->opage_path = "外部页面路径"; - $lang->opage_caching_interval = "缓冲时间设置"; - - $lang->about_opage = "此模块是一种可以把外部html或php文件插入到XE内部的模块。
    可以使用绝对路径及相对路径。而且使用以http:// 开头的地址时,可以把外部服务器中的页面插入到XE当中。"; - $lang->about_opage_path= "请输入外部文件路径。
    可以使用如同 /path1/path2/sample.php的绝对路径或如 ../path2/sample.php的相对路径。
    如使用http://url/sample.php之类的地址,可以把此页面的输出结果显示到XE内部的指定位置。
    现安装的XE绝对路径如下:
    "; - $lang->about_opage_caching_interval = "单位为分。缓冲时间内页面将输出临时储存的数据。
    输出外部服务器信息或数据时,如消耗资源很大,尽量把缓冲时间设置为大一点的相应值。
    0 表示无缓冲。"; - - $lang->opage_mobile_path = '移动版外部页面路径'; - $lang->about_opage_mobile_path= '请输入移动版外部文件路径。留空默认使用上面指定的的普通外部页面。
    可以使用如同 /path1/path2/sample.php的绝对路径或如 ../path2/sample.php的相对路径。
    如使用http://url/sample.php之类的地址,可以把此页面的输出结果显示到XE内部的指定位置。
    现安装的XE绝对路径如下:
    '; -?> +opage = "外部页面"; + $lang->opage_path = "外部页面路径"; + $lang->opage_caching_interval = "缓冲时间设置"; + + $lang->about_opage = "此模块是一种可以把外部html或php文件插入到XE内部的模块。
    可以使用绝对路径及相对路径。而且使用以http:// 开头的地址时,可以把外部服务器中的页面插入到XE当中。"; + $lang->about_opage_path= "请输入外部文件路径。
    可以使用如同 /path1/path2/sample.php的绝对路径或如 ../path2/sample.php的相对路径。
    如使用http://url/sample.php之类的地址,可以把此页面的输出结果显示到XE内部的指定位置。
    现安装的XE绝对路径如下:
    "; + $lang->about_opage_caching_interval = "单位为分。缓冲时间内页面将输出临时储存的数据。
    输出外部服务器信息或数据时,如消耗资源很大,尽量把缓冲时间设置为大一点的相应值。
    0 表示无缓冲。"; + + $lang->opage_mobile_path = '移动版外部页面路径'; + $lang->about_opage_mobile_path= '请输入移动版外部文件路径。留空默认使用上面指定的的普通外部页面。
    可以使用如同 /path1/path2/sample.php的绝对路径或如 ../path2/sample.php的相对路径。
    如使用http://url/sample.php之类的地址,可以把此页面的输出结果显示到XE内部的指定位置。
    现安装的XE绝对路径如下:
    '; +?> diff --git a/modules/opage/lang/zh-TW.lang.php b/modules/opage/lang/zh-TW.lang.php index 5e3145b8e..91b9938b3 100644 --- a/modules/opage/lang/zh-TW.lang.php +++ b/modules/opage/lang/zh-TW.lang.php @@ -1,17 +1,17 @@ -opage = "外部頁面"; - $lang->opage_path = "外部頁面路徑"; - $lang->opage_caching_interval = "暫存時間設置"; - - $lang->about_opage = "此模組可把外部HTML或PHP檔案插入到XE中的模組。
    可以使用絕對路徑及相對路徑。而且使用以『http://』開頭的網址時,可以把外部主機中的頁面插入到XE當中。"; - $lang->about_opage_path= "請輸入外部檔案路徑。
    可以使用像『/path1/path2/sample.php』的絕對路徑或是『../path2/sample.php』的相對路徑。
    如果是用『http://url/sample.php』之類的網址,會將此頁面的結果顯示到XE內部的指定位置。
    目前安裝的XE絕對路徑如下:
    "; - $lang->about_opage_caching_interval = "單位為分。暫存時間內頁面將輸出臨時儲存的資料。
    輸出外部主機訊息或資料時,如消耗資源很大,盡量把暫存時間設大一點。
    『0』表示不暫存。"; - $lang->opage_mobile_path = 'Location of External Document for Mobile View'; - $lang->about_opage_mobile_path= "Please input the location of external document for mobile view. If not inputted, it uses the the external document specified above.
    Both absolute path such as '/path1/path2/sample.php' or relative path such as '../path2/sample.php' can be used.
    If you input the path like 'http://url/sample.php' , the result will be received and then displayed.
    This is current XE's absolute path.
    "; -?> +opage = "外部頁面"; + $lang->opage_path = "外部頁面路徑"; + $lang->opage_caching_interval = "暫存時間設置"; + + $lang->about_opage = "此模組可把外部HTML或PHP檔案插入到XE中的模組。
    可以使用絕對路徑及相對路徑。而且使用以『http://』開頭的網址時,可以把外部主機中的頁面插入到XE當中。"; + $lang->about_opage_path= "請輸入外部檔案路徑。
    可以使用像『/path1/path2/sample.php』的絕對路徑或是『../path2/sample.php』的相對路徑。
    如果是用『http://url/sample.php』之類的網址,會將此頁面的結果顯示到XE內部的指定位置。
    目前安裝的XE絕對路徑如下:
    "; + $lang->about_opage_caching_interval = "單位為分。暫存時間內頁面將輸出臨時儲存的資料。
    輸出外部主機訊息或資料時,如消耗資源很大,盡量把暫存時間設大一點。
    『0』表示不暫存。"; + $lang->opage_mobile_path = 'Location of External Document for Mobile View'; + $lang->about_opage_mobile_path= "Please input the location of external document for mobile view. If not inputted, it uses the the external document specified above.
    Both absolute path such as '/path1/path2/sample.php' or relative path such as '../path2/sample.php' can be used.
    If you input the path like 'http://url/sample.php' , the result will be received and then displayed.
    This is current XE's absolute path.
    "; +?> diff --git a/modules/opage/opage.admin.controller.php b/modules/opage/opage.admin.controller.php index d603c0fef..532c6d032 100644 --- a/modules/opage/opage.admin.controller.php +++ b/modules/opage/opage.admin.controller.php @@ -1,84 +1,84 @@ -module = 'opage'; - $args->mid = $args->opage_name; - unset($args->opage_name); - - // module_srl이 넘어오면 원 모듈이 있는지 확인 - if($args->module_srl) { - $module_info = $oModuleModel->getModuleInfoByModuleSrl($args->module_srl); - if($module_info->module_srl != $args->module_srl) unset($args->module_srl); - } - - // module_srl의 값에 따라 insert/update - if(!$args->module_srl) { - $args->module_srl = getNextSequence(); - $output = $oModuleController->insertModule($args); - $msg_code = 'success_registed'; - } else { - $output = $oModuleController->updateModule($args); - $msg_code = 'success_updated'; - - // 캐시 파일 삭제 - $cache_file = sprintf("./files/cache/opage/%d.cache.php", $module_info->module_srl); - if(file_exists($cache_file)) FileHandler::removeFile($cache_file); - } - - if(!$output->toBool()) return $output; - - // 등록 성공후 return될 메세지 정리 - $this->add("module_srl", $output->get('module_srl')); - $this->add("opage", Context::get('opage')); - $this->setMessage($msg_code); - } - - /** - * @brief 외부페이지 삭제 - **/ - function procOpageAdminDelete() { - $module_srl = Context::get('module_srl'); - - // 원본을 구해온다 - $oModuleController = &getController('module'); - $output = $oModuleController->deleteModule($module_srl); - if(!$output->toBool()) return $output; - - $this->add('module','opage'); - $this->add('opage',Context::get('opage')); - $this->setMessage('success_deleted'); - } - - /** - * @brief 외부페이지 기본 정보의 추가 - **/ - function procOpageAdminInsertConfig() { - // 기본 정보를 받음 - $args = Context::gets('test'); - - } - - } -?> +module = 'opage'; + $args->mid = $args->opage_name; + unset($args->opage_name); + + // module_srl이 넘어오면 원 모듈이 있는지 확인 + if($args->module_srl) { + $module_info = $oModuleModel->getModuleInfoByModuleSrl($args->module_srl); + if($module_info->module_srl != $args->module_srl) unset($args->module_srl); + } + + // module_srl의 값에 따라 insert/update + if(!$args->module_srl) { + $args->module_srl = getNextSequence(); + $output = $oModuleController->insertModule($args); + $msg_code = 'success_registed'; + } else { + $output = $oModuleController->updateModule($args); + $msg_code = 'success_updated'; + + // 캐시 파일 삭제 + $cache_file = sprintf("./files/cache/opage/%d.cache.php", $module_info->module_srl); + if(file_exists($cache_file)) FileHandler::removeFile($cache_file); + } + + if(!$output->toBool()) return $output; + + // 등록 성공후 return될 메세지 정리 + $this->add("module_srl", $output->get('module_srl')); + $this->add("opage", Context::get('opage')); + $this->setMessage($msg_code); + } + + /** + * @brief 외부페이지 삭제 + **/ + function procOpageAdminDelete() { + $module_srl = Context::get('module_srl'); + + // 원본을 구해온다 + $oModuleController = &getController('module'); + $output = $oModuleController->deleteModule($module_srl); + if(!$output->toBool()) return $output; + + $this->add('module','opage'); + $this->add('opage',Context::get('opage')); + $this->setMessage('success_deleted'); + } + + /** + * @brief 외부페이지 기본 정보의 추가 + **/ + function procOpageAdminInsertConfig() { + // 기본 정보를 받음 + $args = Context::gets('test'); + + } + + } +?> diff --git a/modules/opage/opage.admin.view.php b/modules/opage/opage.admin.view.php index 8f982248e..b4e5bd8c3 100644 --- a/modules/opage/opage.admin.view.php +++ b/modules/opage/opage.admin.view.php @@ -1,139 +1,139 @@ -getModuleCategories(); - Context::set('module_category', $module_category); - - // 템플릿 경로 구함 (opage의 경우 tpl에 관리자용 템플릿 모아놓음) - $this->setTemplatePath($this->module_path.'tpl'); - } - - /** - * @brief 외부페이지 관리 목록 보여줌 - **/ - function dispOpageAdminContent() { - $args->sort_index = "module_srl"; - $args->page = Context::get('page'); - $args->list_count = 40; - $args->page_count = 10; - $args->s_module_category_srl = Context::get('module_category_srl'); - $output = executeQuery('opage.getOpageList', $args); - - // 템플릿에 쓰기 위해서 context::set - Context::set('total_count', $output->total_count); - Context::set('total_page', $output->total_page); - Context::set('page', $output->page); - Context::set('opage_list', $output->data); - Context::set('page_navigation', $output->page_navigation); - - // 템플릿 파일 지정 - $this->setTemplateFile('index'); - } - - /** - * @brief 외부페이지 추가 폼 출력 - **/ - function dispOpageAdminInsert() { - // 권한 그룹의 목록을 가져온다 - $oMemberModel = &getModel('member'); - $group_list = $oMemberModel->getGroups(); - Context::set('group_list', $group_list); - - // module.xml에서 권한 관련 목록을 구해옴 - $grant_list = $this->xml_info->grant; - Context::set('grant_list', $grant_list); - - // GET parameter에서 module_srl을 가져옴 - $module_srl = Context::get('module_srl'); - - // module_srl이 있으면 해당 모듈의 정보를 구해서 세팅 - if($module_srl) { - $oModuleModel = &getModel('module'); - $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); - if($module_info->module_srl == $module_srl) Context::set('module_info',$module_info); - else { - unset($module_info); - unset($module_srl); - } - } - - // 레이아웃 목록을 구해옴 - $oLayoutModel = &getModel('layout'); - $layout_list = $oLayoutModel->getLayoutList(); - Context::set('layout_list', $layout_list); - - $mobile_layout_list = $oLayoutModel->getLayoutList(0,"M"); - Context::set('mlayout_list', $mobile_layout_list); - - // 템플릿 파일 지정 - $this->setTemplateFile('opage_insert'); - } - - - /** - * @brief 외부페이지 삭제 화면 출력 - **/ - function dispOpageAdminDelete() { - $module_srl = Context::get('module_srl'); - if(!$module_srl) return $this->dispContent(); - - $oModuleModel = &getModel('module'); - $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); - Context::set('module_info',$module_info); - - // 템플릿 파일 지정 - $this->setTemplateFile('opage_delete'); - } - - /** - * @brief 권한 목록 출력 - **/ - function dispOpageAdminGrantInfo() { - - - // GET parameter에서 module_srl을 가져옴 - $module_srl = Context::get('module_srl'); - - // module_srl이 있으면 해당 모듈의 정보를 구해서 세팅 - if($module_srl) { - $oModuleModel = &getModel('module'); - $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); - if($module_info->module_srl == $module_srl) Context::set('module_info',$module_info); - else { - unset($module_info); - unset($module_srl); - } - } - - $this->module_info = $module_info; - - // 공통 모듈 권한 설정 페이지 호출 - $oModuleAdminModel = &getAdminModel('module'); - $grant_content = $oModuleAdminModel->getModuleGrantHTML($this->module_info->module_srl, $this->xml_info->grant); - Context::set('grant_content', $grant_content); - - $this->setTemplateFile('grant_list'); - } - } -?> +getModuleCategories(); + Context::set('module_category', $module_category); + + // 템플릿 경로 구함 (opage의 경우 tpl에 관리자용 템플릿 모아놓음) + $this->setTemplatePath($this->module_path.'tpl'); + } + + /** + * @brief 외부페이지 관리 목록 보여줌 + **/ + function dispOpageAdminContent() { + $args->sort_index = "module_srl"; + $args->page = Context::get('page'); + $args->list_count = 40; + $args->page_count = 10; + $args->s_module_category_srl = Context::get('module_category_srl'); + $output = executeQuery('opage.getOpageList', $args); + + // 템플릿에 쓰기 위해서 context::set + Context::set('total_count', $output->total_count); + Context::set('total_page', $output->total_page); + Context::set('page', $output->page); + Context::set('opage_list', $output->data); + Context::set('page_navigation', $output->page_navigation); + + // 템플릿 파일 지정 + $this->setTemplateFile('index'); + } + + /** + * @brief 외부페이지 추가 폼 출력 + **/ + function dispOpageAdminInsert() { + // 권한 그룹의 목록을 가져온다 + $oMemberModel = &getModel('member'); + $group_list = $oMemberModel->getGroups(); + Context::set('group_list', $group_list); + + // module.xml에서 권한 관련 목록을 구해옴 + $grant_list = $this->xml_info->grant; + Context::set('grant_list', $grant_list); + + // GET parameter에서 module_srl을 가져옴 + $module_srl = Context::get('module_srl'); + + // module_srl이 있으면 해당 모듈의 정보를 구해서 세팅 + if($module_srl) { + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); + if($module_info->module_srl == $module_srl) Context::set('module_info',$module_info); + else { + unset($module_info); + unset($module_srl); + } + } + + // 레이아웃 목록을 구해옴 + $oLayoutModel = &getModel('layout'); + $layout_list = $oLayoutModel->getLayoutList(); + Context::set('layout_list', $layout_list); + + $mobile_layout_list = $oLayoutModel->getLayoutList(0,"M"); + Context::set('mlayout_list', $mobile_layout_list); + + // 템플릿 파일 지정 + $this->setTemplateFile('opage_insert'); + } + + + /** + * @brief 외부페이지 삭제 화면 출력 + **/ + function dispOpageAdminDelete() { + $module_srl = Context::get('module_srl'); + if(!$module_srl) return $this->dispContent(); + + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); + Context::set('module_info',$module_info); + + // 템플릿 파일 지정 + $this->setTemplateFile('opage_delete'); + } + + /** + * @brief 권한 목록 출력 + **/ + function dispOpageAdminGrantInfo() { + + + // GET parameter에서 module_srl을 가져옴 + $module_srl = Context::get('module_srl'); + + // module_srl이 있으면 해당 모듈의 정보를 구해서 세팅 + if($module_srl) { + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); + if($module_info->module_srl == $module_srl) Context::set('module_info',$module_info); + else { + unset($module_info); + unset($module_srl); + } + } + + $this->module_info = $module_info; + + // 공통 모듈 권한 설정 페이지 호출 + $oModuleAdminModel = &getAdminModel('module'); + $grant_content = $oModuleAdminModel->getModuleGrantHTML($this->module_info->module_srl, $this->xml_info->grant); + Context::set('grant_content', $grant_content); + + $this->setTemplateFile('grant_list'); + } + } +?> diff --git a/modules/opage/opage.class.php b/modules/opage/opage.class.php index 43eac3954..a83a81421 100644 --- a/modules/opage/opage.class.php +++ b/modules/opage/opage.class.php @@ -1,45 +1,45 @@ - + diff --git a/modules/opage/opage.controller.php b/modules/opage/opage.controller.php index 9d2a179a5..eb86d8c7e 100644 --- a/modules/opage/opage.controller.php +++ b/modules/opage/opage.controller.php @@ -1,105 +1,105 @@ -]*)>(.*?)<\/title>!is', $content, $buff); - return trim($buff[2]); - } - - /** - * @brief header script 추출 - **/ - function getHeadScript($content) { - // title 태그 제거 - $content = preg_replace('!]*)>(.*?)<\/title>!is','', $content); - - // meta 태그 제거 - $content = preg_replace('!<(\/){0,1}meta([^>]*)>!is','', $content); - - // ]*)>!is', $content, $link_buff); - for($i=0;$i!is', $content, $script_buff); - for($i=0;$i]*)>(.*?)<\/body>!is', $content, $body_buff); - $body_script = $body_buff[2]; - - // link, style, script등 제거 - $body_script = preg_replace('!]*)>!is', '', $body_script); - $body_script = preg_replace('!<(style|script)(.*?)<\/(style|script)>!is', '', $body_script); - return $body_script; - } - - /** - * @brief 내용에 포함된 src, href의 값을 변경 - **/ - function replaceSrc($content, $path) { - $url_info = parse_url($path); - $host = sprintf("%s://%s%s",$url_info['scheme'],$url_info['host'],$url_info['port']?':'.$url_info['port']:''); - $this->host = $host.'/'; - $path = $url_info['path']; - if(substr($path,-1)=='/') $path = substr($path,-1); - $t = explode('/',$path); - $_t = array(); - for($i=0,$c=count($t)-1;$i<$c;$i++) { - $v = trim($t[$i]); - if(!$v) continue; - $_t[] = $v; - } - $path = $host.'/'.implode('/',$_t); - if(substr($path,-1)!='/') $path .= '/'; - $this->path = $path; - $content = preg_replace_callback('/(src=|href=|url\()("|\')?([^"\'\)]+)("|\'\))?/is',array($this,'_replacePath'),$content); - - return $content; - } - - function _replacePath($matches) { - $val = trim($matches[3]); - if(preg_match('/^(http|https|ftp|telnet|mms|mailto)/i',$val)) return $matches[0]; - if(substr($val,0,2)=='./') { - $path = $this->path.substr($val,2); - } elseif(substr($val,0,1)=='/') { - $path = $this->host.substr($val,1); - } else { - $path = $this->path.$val; - } - return sprintf("%s%s%s%s", $matches[1], $matches[2], $path, $matches[4]); - } - - } -?> +]*)>(.*?)<\/title>!is', $content, $buff); + return trim($buff[2]); + } + + /** + * @brief header script 추출 + **/ + function getHeadScript($content) { + // title 태그 제거 + $content = preg_replace('!]*)>(.*?)<\/title>!is','', $content); + + // meta 태그 제거 + $content = preg_replace('!<(\/){0,1}meta([^>]*)>!is','', $content); + + // ]*)>!is', $content, $link_buff); + for($i=0;$i!is', $content, $script_buff); + for($i=0;$i]*)>(.*?)<\/body>!is', $content, $body_buff); + $body_script = $body_buff[2]; + + // link, style, script등 제거 + $body_script = preg_replace('!]*)>!is', '', $body_script); + $body_script = preg_replace('!<(style|script)(.*?)<\/(style|script)>!is', '', $body_script); + return $body_script; + } + + /** + * @brief 내용에 포함된 src, href의 값을 변경 + **/ + function replaceSrc($content, $path) { + $url_info = parse_url($path); + $host = sprintf("%s://%s%s",$url_info['scheme'],$url_info['host'],$url_info['port']?':'.$url_info['port']:''); + $this->host = $host.'/'; + $path = $url_info['path']; + if(substr($path,-1)=='/') $path = substr($path,-1); + $t = explode('/',$path); + $_t = array(); + for($i=0,$c=count($t)-1;$i<$c;$i++) { + $v = trim($t[$i]); + if(!$v) continue; + $_t[] = $v; + } + $path = $host.'/'.implode('/',$_t); + if(substr($path,-1)!='/') $path .= '/'; + $this->path = $path; + $content = preg_replace_callback('/(src=|href=|url\()("|\')?([^"\'\)]+)("|\'\))?/is',array($this,'_replacePath'),$content); + + return $content; + } + + function _replacePath($matches) { + $val = trim($matches[3]); + if(preg_match('/^(http|https|ftp|telnet|mms|mailto)/i',$val)) return $matches[0]; + if(substr($val,0,2)=='./') { + $path = $this->path.substr($val,2); + } elseif(substr($val,0,1)=='/') { + $path = $this->host.substr($val,1); + } else { + $path = $this->path.$val; + } + return sprintf("%s%s%s%s", $matches[1], $matches[2], $path, $matches[4]); + } + + } +?> diff --git a/modules/opage/opage.model.php b/modules/opage/opage.model.php index 99a2254f6..b1856a62d 100644 --- a/modules/opage/opage.model.php +++ b/modules/opage/opage.model.php @@ -1,33 +1,33 @@ -getModuleInfoByModuleSrl($module_srl); - if($module_info->module_srl != $module_srl) return; - - $extra_vars = unserialize($module_info->extra_vars); - if($extra_vars) { - foreach($extra_vars as $key => $val) $module_info->{$key} = $val; - unset($module_info->extra_vars); - } - return $module_info; - } - - } -?> +getModuleInfoByModuleSrl($module_srl); + if($module_info->module_srl != $module_srl) return; + + $extra_vars = unserialize($module_info->extra_vars); + if($extra_vars) { + foreach($extra_vars as $key => $val) $module_info->{$key} = $val; + unset($module_info->extra_vars); + } + return $module_info; + } + + } +?> diff --git a/modules/opage/opage.view.php b/modules/opage/opage.view.php index b09b7fb62..b86a7c156 100644 --- a/modules/opage/opage.view.php +++ b/modules/opage/opage.view.php @@ -1,166 +1,166 @@ -setTemplatePath($this->module_path.'tpl'); - - // 외부 페이지 모듈의 정보를 구함 - $oOpageModel = &getModel('opage'); - $module_info = $oOpageModel->getOpage($this->module_srl); - Context::set('module_info', $module_info); - - // 외부 페이지에서 명시된 외부 페이지 경로/ 캐싱 간격을 를 구함 - $this->path = $module_info->path; - $this->caching_interval = $module_info->caching_interval; - - // 캐시 파일 지정 - $this->cache_file = sprintf("./files/cache/opage/%d.cache.php", $module_info->module_srl); - } - - /** - * @brief 일반 요청시 출력 - **/ - function dispOpageIndex() { - - // http 인지 내부 파일인지 점검 - if($this->path) { - if(preg_match("/^([a-z]+):\/\//i",$this->path)) $content = $this->getHtmlPage($this->path, $this->caching_interval, $this->cache_file); - else $content = $this->executeFile($this->path, $this->caching_interval, $this->cache_file); - } - - Context::set('opage_content', $content); - - // 결과 출력 템플릿 지정 - $this->setTemplateFile('content'); - } - - /** - * @brief 외부 http로 요청되는 파일일 경우 파일을 받아와서 저장 후 return - **/ - function getHtmlPage($path, $caching_interval, $cache_file) { - - // 캐시 검사 - if($caching_interval > 0 && file_exists($cache_file) && filemtime($cache_file) + $caching_interval*60 > time()) { - - $content = FileHandler::readFile($cache_file); - - } else { - - FileHandler::getRemoteFile($path, $cache_file); - $content = FileHandler::readFile($cache_file); - - } - - // opage controller 생성 - $oOpageController = &getController('opage'); - - // 외부 서버의 페이지 일 경우 이미지, css, javascript등의 url을 변경 - $content = $oOpageController->replaceSrc($content, $path); - - // 해당 문서를 utf-8로 변경 - $buff->content = $content; - $buff = Context::convertEncoding($buff); - $content = $buff->content; - - // title 추출 - $title = $oOpageController->getTitle($content); - if($title) Context::setBrowserTitle($title); - - // header script 추출 - $head_script = $oOpageController->getHeadScript($content); - if($head_script) Context::addHtmlHeader($head_script); - - // body 내용 추출 - $body_script = $oOpageController->getBodyScript($content); - if(!$body_script) $body_script = $content; - - return $content; - } - - /** - * @brief 내부 파일일 경우 include하도록 캐시파일을 만들고 처리 - **/ - function executeFile($path, $caching_interval, $cache_file) { - // 파일이 없으면 취소 - if(!file_exists($path)) return; - - // 경로와 파일이름을 구함 - $tmp_path = explode('/',$cache_file); - $filename = $tmp_path[count($tmp_path)-1]; - $filepath = preg_replace('/'.$filename."$/i","",$cache_file); - - // 캐시 검사 - if($caching_interval <1 || !file_exists($cache_file) || filemtime($cache_file) + $caching_interval*60 <= time() || filemtime($cache_file)path = str_replace('\\', '/', realpath($path_info['dirname'])).'/'; - $content = preg_replace_callback('/(target=|src=|href=|url\()("|\')?([^"\'\)]+)("|\'\))?/is',array($this,'_replacePath'),$content); - $content = preg_replace_callback('/( -

    {$lang->opage} {$lang->cmd_management}

    - -
    {nl2br($lang->about_opage)}
    - - -
    - -

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

    - - - -
    - + +

    {$lang->opage} {$lang->cmd_management}

    + +
    {nl2br($lang->about_opage)}
    + + +
    + +

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

    + + + +
    + diff --git a/modules/opage/tpl/index.html b/modules/opage/tpl/index.html index 892d630d4..d1099314b 100644 --- a/modules/opage/tpl/index.html +++ b/modules/opage/tpl/index.html @@ -1,85 +1,85 @@ - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Total {number_format($total_count)}, page {number_format($page)}/{number_format($total_page)}
    {$lang->no}
    -
    - - - - -
    -
    {$lang->mid}
    {$lang->browser_title}
    {$lang->regdate}
     
    {$no} - - {$lang->not_exists} - - {$module_category[$val->module_category_srl]->title} - - {htmlspecialchars($val->mid)}{$val->browser_title}{zdate($val->regdate,"Y-m-d")}{$lang->cmd_setup}{$lang->cmd_copy}{$lang->cmd_delete}
    - - - - -
    - - - + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Total {number_format($total_count)}, page {number_format($page)}/{number_format($total_page)}
    {$lang->no}
    +
    + + + + +
    +
    {$lang->mid}
    {$lang->browser_title}
    {$lang->regdate}
     
    {$no} + + {$lang->not_exists} + + {$module_category[$val->module_category_srl]->title} + + {htmlspecialchars($val->mid)}{$val->browser_title}{zdate($val->regdate,"Y-m-d")}{$lang->cmd_setup}{$lang->cmd_copy}{$lang->cmd_delete}
    + + + + +
    + + + diff --git a/modules/opage/tpl/js/opage_admin.js b/modules/opage/tpl/js/opage_admin.js index 737d7372f..27a8d2d28 100644 --- a/modules/opage/tpl/js/opage_admin.js +++ b/modules/opage/tpl/js/opage_admin.js @@ -1,62 +1,62 @@ -/** - * @file modules/opage/js/opage_admin.js - * @author NHN (developers@xpressengine.com) - * @brief opage모듈의 관리자용 javascript - **/ - -/* 모듈 생성 후 */ -function completeInsertOpage(ret_obj) { - var error = ret_obj['error']; - var message = ret_obj['message']; - - var opage = ret_obj['opage']; - var module_srl = ret_obj['module_srl']; - - alert(message); - - var url = ''; - if(location.href.getQuery('module')=='admin') { - url = current_url.setQuery('module_srl',module_srl).setQuery('act','dispOpageAdminInsert'); - if(opage) url = url.setQuery('opage',opage); - } else { - url = current_url.setQuery('act','').setQuery('module_srl',''); - } - - location.href = url; -} - -/* 모듈 삭제 후 */ -function completeDeleteOpage(ret_obj) { - var error = ret_obj['error']; - var message = ret_obj['message']; - var opage = ret_obj['opage']; - alert(message); - - var url = current_url.setQuery('act','dispOpageAdminContent'); - if(opage) url = url.setQuery('opage',opage); - - location.href = url; -} - -/* 카테고리 이동 */ -function doChangeCategory(fo_obj) { - var module_category_srl = fo_obj.module_category_srl.options[fo_obj.module_category_srl.selectedIndex].value; - if(module_category_srl==-1) { - location.href = current_url.setQuery('act','dispModuleAdminCategory'); - return false; - } - return true; -} - -/* 일괄 설정 */ -function doCartSetup(url) { - var module_srl = new Array(); - jQuery('#fo_list input[name=cart]:checked').each(function() { - module_srl[module_srl.length] = jQuery(this).val(); - }); - - if(module_srl.length<1) return; - - url += "&module_srls="+module_srl.join(','); - popopen(url,'modulesSetup'); -} +/** + * @file modules/opage/js/opage_admin.js + * @author NHN (developers@xpressengine.com) + * @brief opage모듈의 관리자용 javascript + **/ + +/* 모듈 생성 후 */ +function completeInsertOpage(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + + var opage = ret_obj['opage']; + var module_srl = ret_obj['module_srl']; + + alert(message); + + var url = ''; + if(location.href.getQuery('module')=='admin') { + url = current_url.setQuery('module_srl',module_srl).setQuery('act','dispOpageAdminInsert'); + if(opage) url = url.setQuery('opage',opage); + } else { + url = current_url.setQuery('act','').setQuery('module_srl',''); + } + + location.href = url; +} + +/* 모듈 삭제 후 */ +function completeDeleteOpage(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var opage = ret_obj['opage']; + alert(message); + + var url = current_url.setQuery('act','dispOpageAdminContent'); + if(opage) url = url.setQuery('opage',opage); + + location.href = url; +} + +/* 카테고리 이동 */ +function doChangeCategory(fo_obj) { + var module_category_srl = fo_obj.module_category_srl.options[fo_obj.module_category_srl.selectedIndex].value; + if(module_category_srl==-1) { + location.href = current_url.setQuery('act','dispModuleAdminCategory'); + return false; + } + return true; +} + +/* 일괄 설정 */ +function doCartSetup(url) { + var module_srl = new Array(); + jQuery('#fo_list input[name=cart]:checked').each(function() { + module_srl[module_srl.length] = jQuery(this).val(); + }); + + if(module_srl.length<1) return; + + url += "&module_srls="+module_srl.join(','); + popopen(url,'modulesSetup'); +} diff --git a/modules/page/conf/info.xml b/modules/page/conf/info.xml index 72465184d..1adb4feab 100644 --- a/modules/page/conf/info.xml +++ b/modules/page/conf/info.xml @@ -1,36 +1,36 @@ - - - 페이지 - 页面管理 - ページ - Page - Trang - Página - Страницы - 頁面 - Sayfa - 페이지를 제작하여 컨텐츠로 연결할 수 있는 모듈 - 制作页面并能连接到内容区的模块。 - ページを作成してコンテンツとしてリンク出来るようにするモジュールです。 - This module is for creating pages to link with contents. - Module này dành cho việc tạo trang cho liên kết với nội dung. - Este módulo is para crear página para enlazar con contenidos. - Этот модуль служит для создания страниц, чтобы связать их с содержимым. - 製作頁面並連結內容的模組。 - Bu modül içeriklere bağlanacak sayfaları oluşturmak içindir. - 0.1 - 2007-02-28 - service - - - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - - + + + 페이지 + 页面管理 + ページ + Page + Trang + Página + Страницы + 頁面 + Sayfa + 페이지를 제작하여 컨텐츠로 연결할 수 있는 모듈 + 制作页面并能连接到内容区的模块。 + ページを作成してコンテンツとしてリンク出来るようにするモジュールです。 + This module is for creating pages to link with contents. + Module này dành cho việc tạo trang cho liên kết với nội dung. + Este módulo is para crear página para enlazar con contenidos. + Этот модуль служит для создания страниц, чтобы связать их с содержимым. + 製作頁面並連結內容的模組。 + Bu modül içeriklere bağlanacak sayfaları oluşturmak içindir. + 0.1 + 2007-02-28 + service + + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + diff --git a/modules/page/lang/en.lang.php b/modules/page/lang/en.lang.php index ff56151e2..a4526b825 100644 --- a/modules/page/lang/en.lang.php +++ b/modules/page/lang/en.lang.php @@ -1,16 +1,16 @@ -page = "Page"; - $lang->about_page = "It is a blog module which you can create a complete page.\nUsing latest or other widgets, you can create a dynamic page. Through the editor component, you can also create a great variety of pages.\nIts URL is same as other module's such as mid=module name.\n If it is selected as a default, it will be the main page of the site."; - $lang->cmd_page_modify = "Modify"; - $lang->cmd_page_create = 'Create a Page'; - $lang->page_caching_interval = "Caching Time"; - $lang->about_page_caching_interval = "The unit is minute, and it displays temporary saved data for assigned time.
    It is recommended to cache for proper time if a lot of resources are needed when displaying other servers' data or information.
    A value of 0 will not cache."; - $lang->about_mcontent = 'This is the page you will see from mobile devices. If you have not set this page, rearranged default page will be displayed.'; - $lang->page_management = 'Page Management'; -?> +page = "Page"; + $lang->about_page = "It is a blog module which you can create a complete page.\nUsing latest or other widgets, you can create a dynamic page. Through the editor component, you can also create a great variety of pages.\nIts URL is same as other module's such as mid=module name.\n If it is selected as a default, it will be the main page of the site."; + $lang->cmd_page_modify = "Modify"; + $lang->cmd_page_create = 'Create a Page'; + $lang->page_caching_interval = "Caching Time"; + $lang->about_page_caching_interval = "The unit is minute, and it displays temporary saved data for assigned time.
    It is recommended to cache for proper time if a lot of resources are needed when displaying other servers' data or information.
    A value of 0 will not cache."; + $lang->about_mcontent = 'This is the page you will see from mobile devices. If you have not set this page, rearranged default page will be displayed.'; + $lang->page_management = 'Page Management'; +?> diff --git a/modules/page/lang/es.lang.php b/modules/page/lang/es.lang.php index 7161fb256..73d59727c 100644 --- a/modules/page/lang/es.lang.php +++ b/modules/page/lang/es.lang.php @@ -1,16 +1,16 @@ -page = "Página"; - $lang->about_page = "Esto es un módulo de blog, lo cual usted puede crear una página completa.\nUsando los últimos u otros widgets, Usted puede crear una página dinámica. A través del componente del editor, también puede crear páginas de gran variedad.\nURL de conección es el mismo que de los otros módulos como mid=Nombre del módulo.\n Si selcciona como predefinido esta página será la página principal del sitio."; - $lang->page_caching_interval = "Establezca el tiempo de cache"; - $lang->about_page_caching_interval = "La unidad es minuto, y se muestra temporal de los datos guardados por el tiempo asignado.
    Se recomienda a la cache para una buena vez si una gran cantidad de recursos se necesitan otros servidores cuando se muestran los datos o la informacion.
    Un valor de 0 no cache."; - $lang->cmd_page_modify = "Modificar"; - $lang->cmd_page_create = '페이지 생성'; - $lang->about_mcontent = 'This is the page for the mobile view. If you do not write this page, the mobile view display reoragnized PC view\'s page.'; - $lang->page_management = '페이지 관리'; -?> +page = "Página"; + $lang->about_page = "Esto es un módulo de blog, lo cual usted puede crear una página completa.\nUsando los últimos u otros widgets, Usted puede crear una página dinámica. A través del componente del editor, también puede crear páginas de gran variedad.\nURL de conección es el mismo que de los otros módulos como mid=Nombre del módulo.\n Si selcciona como predefinido esta página será la página principal del sitio."; + $lang->page_caching_interval = "Establezca el tiempo de cache"; + $lang->about_page_caching_interval = "La unidad es minuto, y se muestra temporal de los datos guardados por el tiempo asignado.
    Se recomienda a la cache para una buena vez si una gran cantidad de recursos se necesitan otros servidores cuando se muestran los datos o la informacion.
    Un valor de 0 no cache."; + $lang->cmd_page_modify = "Modificar"; + $lang->cmd_page_create = '페이지 생성'; + $lang->about_mcontent = 'This is the page for the mobile view. If you do not write this page, the mobile view display reoragnized PC view\'s page.'; + $lang->page_management = '페이지 관리'; +?> diff --git a/modules/page/lang/fr.lang.php b/modules/page/lang/fr.lang.php index 7f43fd38d..cbd0c62ec 100644 --- a/modules/page/lang/fr.lang.php +++ b/modules/page/lang/fr.lang.php @@ -1,16 +1,16 @@ -page = "Page"; - $lang->about_page = "C'est un module qui peut créer une page complet.\nVous pouvez créer une page dynamique en utilisant des gadgets des Documents derniers ou d'autres. Vous pouvez aussi créer une page avec variété par le composant d'editeur.\nL'URL d'accès est égal celui d'autre module comme mid=module.\nSi c'est choisi par défaut, ce sera la première page du site."; - $lang->cmd_page_modify = "Modifier"; - $lang->cmd_page_create = '페이지 생성'; - $lang->page_caching_interval = "Temps de antémémoire"; - $lang->about_page_caching_interval = "L'unité est minute, et ça exposera des données conservées temporairement pendant le temps assigné.
    Il est recommandé d'utiliser l'antémémoire pendant le temps convenable si beaucoup de ressource est nécessaire pour représenter les données ou l'information d'autre serveur.
    La valeur 0 signifie de ne pas utiliser antémémoire."; - $lang->about_mcontent = 'This is the page for the mobile view. If you do not write this page, the mobile view display reoragnized PC view\'s page.'; - $lang->page_management = '페이지 관리'; -?> +page = "Page"; + $lang->about_page = "C'est un module qui peut créer une page complet.\nVous pouvez créer une page dynamique en utilisant des gadgets des Documents derniers ou d'autres. Vous pouvez aussi créer une page avec variété par le composant d'editeur.\nL'URL d'accès est égal celui d'autre module comme mid=module.\nSi c'est choisi par défaut, ce sera la première page du site."; + $lang->cmd_page_modify = "Modifier"; + $lang->cmd_page_create = '페이지 생성'; + $lang->page_caching_interval = "Temps de antémémoire"; + $lang->about_page_caching_interval = "L'unité est minute, et ça exposera des données conservées temporairement pendant le temps assigné.
    Il est recommandé d'utiliser l'antémémoire pendant le temps convenable si beaucoup de ressource est nécessaire pour représenter les données ou l'information d'autre serveur.
    La valeur 0 signifie de ne pas utiliser antémémoire."; + $lang->about_mcontent = 'This is the page for the mobile view. If you do not write this page, the mobile view display reoragnized PC view\'s page.'; + $lang->page_management = '페이지 관리'; +?> diff --git a/modules/page/lang/jp.lang.php b/modules/page/lang/jp.lang.php index c104431ca..81bcf57a7 100644 --- a/modules/page/lang/jp.lang.php +++ b/modules/page/lang/jp.lang.php @@ -1,16 +1,16 @@ -page = 'ページ'; - $lang->about_page = "一枚のページを作成出来るモジュールです。\n最新書き込みウィジェットや他のウィジェットを用いて動的なページが作成が出来、さらにエディターのコンポネントで様々なデザインも出来ます。\n接続URLは、他のモジュールと同様に、「mid=モジュール名」でアクセスし、デフォルトとして指定するとサイトにアクセスする際、メインページとして使われます。"; - $lang->cmd_page_modify = 'ページ修正'; - $lang->cmd_page_create = 'ページ作成'; - $lang->page_caching_interval = 'キャッシング時間設定'; - $lang->about_page_caching_interval = '分単位で指定出来、設定された時間の間は、臨時保存されたデータを出力します。
    他のサーバの情報を出力したり、データを出力する際、リソースが多く使われるため、数分単位でキャッシングすることをお勧めします。
    「0」に指定するとキャッシングされません。'; - $lang->about_mcontent = 'モバイルスキン用のページです。作成しないとPC向けのページを再構成して表示します。'; - $lang->page_management = 'ページ管理'; -?> +page = 'ページ'; + $lang->about_page = "一枚のページを作成出来るモジュールです。\n最新書き込みウィジェットや他のウィジェットを用いて動的なページが作成が出来、さらにエディターのコンポネントで様々なデザインも出来ます。\n接続URLは、他のモジュールと同様に、「mid=モジュール名」でアクセスし、デフォルトとして指定するとサイトにアクセスする際、メインページとして使われます。"; + $lang->cmd_page_modify = 'ページ修正'; + $lang->cmd_page_create = 'ページ作成'; + $lang->page_caching_interval = 'キャッシング時間設定'; + $lang->about_page_caching_interval = '分単位で指定出来、設定された時間の間は、臨時保存されたデータを出力します。
    他のサーバの情報を出力したり、データを出力する際、リソースが多く使われるため、数分単位でキャッシングすることをお勧めします。
    「0」に指定するとキャッシングされません。'; + $lang->about_mcontent = 'モバイルスキン用のページです。作成しないとPC向けのページを再構成して表示します。'; + $lang->page_management = 'ページ管理'; +?> diff --git a/modules/page/lang/ko.lang.php b/modules/page/lang/ko.lang.php index 2474f4322..f1e1a259a 100644 --- a/modules/page/lang/ko.lang.php +++ b/modules/page/lang/ko.lang.php @@ -1,16 +1,16 @@ -page = '페이지'; - $lang->about_page = "하나의 완성된 페이지를 제작할 수 있는 페이지 모듈입니다.\n최근게시물이나 기타 위젯을 이용해서 동적인 페이지 생성이 가능하고 에디터 컴포넌트를 통해서 다양한 모습으로 꾸밀 수 있습니다.\n접속 URL은 다른 모듈과 같이 mid=모듈이름 으로 접속 가능하며 기본으로 선택하면 접속 시 메인 페이지가 됩니다."; - $lang->cmd_page_modify = '페이지 수정'; - $lang->cmd_page_create = '페이지 생성'; - $lang->page_caching_interval = '캐싱 시간 설정'; - $lang->about_page_caching_interval = '분 단위이며 정해진 시간동안은 임시 저장한 데이터를 출력합니다.
    다른 서버의 정보를 출력하거나, 데이터 출력하는데 많은 자원이 필요한 경우, 원하시는 분 단위 시간 간격으로 캐싱하는 것을 추천합니다.
    0 으로 하시면 캐싱을 하지 않습니다.'; - $lang->about_mcontent = '모바일에서 보여질 페이지입니다. 만약 작성하지 않으면 기본 페이지 데이터를 재정렬해서 보여줍니다.'; - $lang->page_management = '페이지 관리'; -?> +page = '페이지'; + $lang->about_page = "하나의 완성된 페이지를 제작할 수 있는 페이지 모듈입니다.\n최근게시물이나 기타 위젯을 이용해서 동적인 페이지 생성이 가능하고 에디터 컴포넌트를 통해서 다양한 모습으로 꾸밀 수 있습니다.\n접속 URL은 다른 모듈과 같이 mid=모듈이름 으로 접속 가능하며 기본으로 선택하면 접속 시 메인 페이지가 됩니다."; + $lang->cmd_page_modify = '페이지 수정'; + $lang->cmd_page_create = '페이지 생성'; + $lang->page_caching_interval = '캐싱 시간 설정'; + $lang->about_page_caching_interval = '분 단위이며 정해진 시간동안은 임시 저장한 데이터를 출력합니다.
    다른 서버의 정보를 출력하거나, 데이터 출력하는데 많은 자원이 필요한 경우, 원하시는 분 단위 시간 간격으로 캐싱하는 것을 추천합니다.
    0 으로 하시면 캐싱을 하지 않습니다.'; + $lang->about_mcontent = '모바일에서 보여질 페이지입니다. 만약 작성하지 않으면 기본 페이지 데이터를 재정렬해서 보여줍니다.'; + $lang->page_management = '페이지 관리'; +?> diff --git a/modules/page/lang/ru.lang.php b/modules/page/lang/ru.lang.php index 4538b1dd6..69ebbdadb 100644 --- a/modules/page/lang/ru.lang.php +++ b/modules/page/lang/ru.lang.php @@ -1,16 +1,16 @@ -page = "Страница"; - $lang->about_page = "Это модуль блога, который создает полную страницу.\nИспользуя последние и другие виджеты, Вы можете создавать динамические страницы. Посредством компонента редактора, Вы можете также создать различные вариации страницы.\nURL модуля следует тем же правилам, что и другие модули: mid=имя_модуля.\n Если он выбран как модуль по умолчанию, то он будет главной страницей сайта."; - $lang->page_caching_interval = "Установить время кеширования"; - $lang->about_page_caching_interval = "Единица измерения равна одной минуте. Это отображает временно сохраненные данные для присвоенного времени.
    Рекомендуется устанавливать разумное время кеширования, если множество ресурсов нуждаются в показе данных с других серверов.
    Значение 0 отключает кеширование."; - $lang->cmd_page_modify = "Изменить"; - $lang->cmd_page_create = '페이지 생성'; - $lang->about_mcontent = 'This is the page for the mobile view. If you do not write this page, the mobile view display reoragnized PC view\'s page.'; - $lang->page_management = '페이지 관리'; -?> +page = "Страница"; + $lang->about_page = "Это модуль блога, который создает полную страницу.\nИспользуя последние и другие виджеты, Вы можете создавать динамические страницы. Посредством компонента редактора, Вы можете также создать различные вариации страницы.\nURL модуля следует тем же правилам, что и другие модули: mid=имя_модуля.\n Если он выбран как модуль по умолчанию, то он будет главной страницей сайта."; + $lang->page_caching_interval = "Установить время кеширования"; + $lang->about_page_caching_interval = "Единица измерения равна одной минуте. Это отображает временно сохраненные данные для присвоенного времени.
    Рекомендуется устанавливать разумное время кеширования, если множество ресурсов нуждаются в показе данных с других серверов.
    Значение 0 отключает кеширование."; + $lang->cmd_page_modify = "Изменить"; + $lang->cmd_page_create = '페이지 생성'; + $lang->about_mcontent = 'This is the page for the mobile view. If you do not write this page, the mobile view display reoragnized PC view\'s page.'; + $lang->page_management = '페이지 관리'; +?> diff --git a/modules/page/lang/tr.lang.php b/modules/page/lang/tr.lang.php index 7945917ba..b9c319b0d 100644 --- a/modules/page/lang/tr.lang.php +++ b/modules/page/lang/tr.lang.php @@ -1,16 +1,16 @@ -page = "Sayfa"; - $lang->about_page = "Eksiksiz sayfa oluşturabileceğiniz bir blog modülüdür.\nEnson veya diğer widgetları kullanarak, dinamik sayfa oluşturabilirsiniz. Editör bileşeni yoluyla, çok farklı sayıda sayfalar oluşturabilirsiniz.\nURL\'si diğer modülleriyle aynıdır(mid=module name).\n Varsayılan olarak seçilirse, sitenin anasayfası olacaktır."; - $lang->cmd_page_modify = "Değiştir"; - $lang->cmd_page_create = 'Sayfa Oluştur'; - $lang->page_caching_interval = "Önbelleğe Alma Zamanı"; - $lang->about_page_caching_interval = "Birim dakikadır ve belirlenen zaman için geçici olarak kaydedilmiş veriyi gösterir.
    Diğer sunucuların veri veya bilgileri gösterilirken, eğer fazla sayıda kaynağın gösterilmesi gerekiyorsa, uygun zamanın önbelleğe alınması önerilmiştir.
    0 değeri verilirse, önbelleğe alınmayacaktır."; - $lang->about_mcontent = 'Bu sayfa, sizin hareketli cihazlardan göreceğiniz sayfadır. Eğer bu sayfayı ayarlamadıysanız, düzenlenmiş varsayılan sayfa gösterilecektir.'; - $lang->page_management = 'Sayfa Yönetimi'; -?> +page = "Sayfa"; + $lang->about_page = "Eksiksiz sayfa oluşturabileceğiniz bir blog modülüdür.\nEnson veya diğer widgetları kullanarak, dinamik sayfa oluşturabilirsiniz. Editör bileşeni yoluyla, çok farklı sayıda sayfalar oluşturabilirsiniz.\nURL\'si diğer modülleriyle aynıdır(mid=module name).\n Varsayılan olarak seçilirse, sitenin anasayfası olacaktır."; + $lang->cmd_page_modify = "Değiştir"; + $lang->cmd_page_create = 'Sayfa Oluştur'; + $lang->page_caching_interval = "Önbelleğe Alma Zamanı"; + $lang->about_page_caching_interval = "Birim dakikadır ve belirlenen zaman için geçici olarak kaydedilmiş veriyi gösterir.
    Diğer sunucuların veri veya bilgileri gösterilirken, eğer fazla sayıda kaynağın gösterilmesi gerekiyorsa, uygun zamanın önbelleğe alınması önerilmiştir.
    0 değeri verilirse, önbelleğe alınmayacaktır."; + $lang->about_mcontent = 'Bu sayfa, sizin hareketli cihazlardan göreceğiniz sayfadır. Eğer bu sayfayı ayarlamadıysanız, düzenlenmiş varsayılan sayfa gösterilecektir.'; + $lang->page_management = 'Sayfa Yönetimi'; +?> diff --git a/modules/page/lang/vi.lang.php b/modules/page/lang/vi.lang.php index 3cbd72864..182a2475b 100644 --- a/modules/page/lang/vi.lang.php +++ b/modules/page/lang/vi.lang.php @@ -1,18 +1,18 @@ -page = "Trang"; - $lang->about_page = "Là Module tạo ra một trang đầy đủ.\nSử dụng Widget mới nhất hoặc những Widget khác giúp bạn có thể tạo một trang động. Thông qua trình bên tập Component, bạn có thể tạo ra sự phong phú cho những trang khác nhau.\nĐịa chỉ của nó như một Module dạng 'mid=module name'.\nNếu chọn là mặc định, nó sẽ là trang chủ của Website."; - $lang->cmd_page_modify = "Sửa đổi"; - $lang->cmd_page_create = '페이지 생성'; - $lang->page_caching_interval = "Thời gian lưu trữ"; - $lang->about_page_caching_interval = "Đơn vị được tính bằng phút, nó sẽ là thời gian lưu trữ tạm thời.
    Đó là khuyến cáo thời gian lưu trữ tạm thời thích hợp khi cần để hiển thị.
    Nhập 0 nếu không sử dụng tính năng này."; - $lang->about_mcontent = 'This is the page for the mobile view. If you do not write this page, the mobile view display reoragnized PC view\'s page.'; - $lang->page_management = '페이지 관리'; -?> +page = "Trang"; + $lang->about_page = "Là Module tạo ra một trang đầy đủ.\nSử dụng Widget mới nhất hoặc những Widget khác giúp bạn có thể tạo một trang động. Thông qua trình bên tập Component, bạn có thể tạo ra sự phong phú cho những trang khác nhau.\nĐịa chỉ của nó như một Module dạng 'mid=module name'.\nNếu chọn là mặc định, nó sẽ là trang chủ của Website."; + $lang->cmd_page_modify = "Sửa đổi"; + $lang->cmd_page_create = '페이지 생성'; + $lang->page_caching_interval = "Thời gian lưu trữ"; + $lang->about_page_caching_interval = "Đơn vị được tính bằng phút, nó sẽ là thời gian lưu trữ tạm thời.
    Đó là khuyến cáo thời gian lưu trữ tạm thời thích hợp khi cần để hiển thị.
    Nhập 0 nếu không sử dụng tính năng này."; + $lang->about_mcontent = 'This is the page for the mobile view. If you do not write this page, the mobile view display reoragnized PC view\'s page.'; + $lang->page_management = '페이지 관리'; +?> diff --git a/modules/page/lang/zh-CN.lang.php b/modules/page/lang/zh-CN.lang.php index f6a4eae7d..bb66c91bd 100644 --- a/modules/page/lang/zh-CN.lang.php +++ b/modules/page/lang/zh-CN.lang.php @@ -1,16 +1,16 @@ -page = "页面"; - $lang->about_page = "可制作完整页面的模块。\n利用最新主题列表或其他控件可以生成动态的页面,且通过网页编辑器做出形式多样的页面。\n连接页面URL同其他模块链接相同。即:mid=模块名称。选择默认选项此页面将变为首页。"; - $lang->cmd_page_modify = "页面编辑"; - $lang->cmd_page_create = '페이지 생성'; - $lang->page_caching_interval = "缓冲时间设置"; - $lang->about_page_caching_interval = "单位为分。缓冲时间间隔内页面将输出临时储存的数据。
    显示外链服务器信息或数据时,如消耗资源很大,尽量把缓冲时间设置为大一点的相应值。
    0 表示无缓冲。"; - $lang->about_mcontent = '此页为移动版页面,如您没有对此页面进行布局,它会自动将PC版页面数据重排序显示。'; - $lang->page_management = '페이지 관리'; -?> +page = "页面"; + $lang->about_page = "可制作完整页面的模块。\n利用最新主题列表或其他控件可以生成动态的页面,且通过网页编辑器做出形式多样的页面。\n连接页面URL同其他模块链接相同。即:mid=模块名称。选择默认选项此页面将变为首页。"; + $lang->cmd_page_modify = "页面编辑"; + $lang->cmd_page_create = '페이지 생성'; + $lang->page_caching_interval = "缓冲时间设置"; + $lang->about_page_caching_interval = "单位为分。缓冲时间间隔内页面将输出临时储存的数据。
    显示外链服务器信息或数据时,如消耗资源很大,尽量把缓冲时间设置为大一点的相应值。
    0 表示无缓冲。"; + $lang->about_mcontent = '此页为移动版页面,如您没有对此页面进行布局,它会自动将PC版页面数据重排序显示。'; + $lang->page_management = '페이지 관리'; +?> diff --git a/modules/page/lang/zh-TW.lang.php b/modules/page/lang/zh-TW.lang.php index ab493c136..ea4ba7b97 100644 --- a/modules/page/lang/zh-TW.lang.php +++ b/modules/page/lang/zh-TW.lang.php @@ -1,16 +1,16 @@ -page = "頁面"; - $lang->about_page = "可製作完整頁面的模組。\n利用最新主題列表或其他 Widgets 可以建立動態的頁面,且通過網頁編輯器做出多樣化的頁面。\n連結頁面網址和其他模組連結的方式相同。即:mid=模組名稱。選擇預設選項時,此頁面將變為首頁。"; - $lang->cmd_page_modify = "頁面編輯"; - $lang->cmd_page_create = '建立頁面'; - $lang->page_caching_interval = "暫存時間設置"; - $lang->about_page_caching_interval = "單位為分。暫存時間內頁面將輸出臨時儲存的資料。
    輸出外部主機訊息或資料時,如消耗資源很大,盡量把暫存時間設大一點。
    『0』表示不暫存。"; - $lang->about_mcontent = '此頁面為手機瀏覽頁面。如果沒有編輯此頁面,則會將預設頁面改編重新顯示。'; - $lang->page_management = '頁面管理'; -?> +page = "頁面"; + $lang->about_page = "可製作完整頁面的模組。\n利用最新主題列表或其他 Widgets 可以建立動態的頁面,且通過網頁編輯器做出多樣化的頁面。\n連結頁面網址和其他模組連結的方式相同。即:mid=模組名稱。選擇預設選項時,此頁面將變為首頁。"; + $lang->cmd_page_modify = "頁面編輯"; + $lang->cmd_page_create = '建立頁面'; + $lang->page_caching_interval = "暫存時間設置"; + $lang->about_page_caching_interval = "單位為分。暫存時間內頁面將輸出臨時儲存的資料。
    輸出外部主機訊息或資料時,如消耗資源很大,盡量把暫存時間設大一點。
    『0』表示不暫存。"; + $lang->about_mcontent = '此頁面為手機瀏覽頁面。如果沒有編輯此頁面,則會將預設頁面改編重新顯示。'; + $lang->page_management = '頁面管理'; +?> diff --git a/modules/page/page.admin.controller.php b/modules/page/page.admin.controller.php index 0e6739c87..309302686 100644 --- a/modules/page/page.admin.controller.php +++ b/modules/page/page.admin.controller.php @@ -1,221 +1,221 @@ -module = 'page'; - $args->mid = $args->page_name; - unset($args->page_name); - - if($args->use_mobile != 'Y') $args->use_mobile = ''; - - // module_srl이 넘어오면 원 모듈이 있는지 확인 - if($args->module_srl) { - $module_info = $oModuleModel->getModuleInfoByModuleSrl($args->module_srl); - if($module_info->module_srl != $args->module_srl) { - unset($args->module_srl); - } - else - { - foreach($args as $key=>$val) - { - $module_info->{$key} = $val; - } - $args = $module_info; - } - } - - // module_srl의 값에 따라 insert/update - if(!$args->module_srl) { - $output = $oModuleController->insertModule($args); - $msg_code = 'success_registed'; - } else { - $output = $oModuleController->updateModule($args); - $msg_code = 'success_updated'; - } - - if(!$output->toBool()) return $output; - - $this->add("page", Context::get('page')); - $this->add('module_srl',$output->get('module_srl')); - $this->setMessage($msg_code); - } - - function putDocumentsInPageToArray($target, &$array) - { - if(!$target) return; - preg_match_all('!]+)!is', $target, $matches); - $pattern = '!document_srl="(\d+)"!'; - foreach($matches[1] as $match) - { - $match2 = null; - preg_match($pattern, $match, $match2); - if(count($match2)) - { - $array[(int)$match2[1]] = 1; - } - } - } - - /** - * @brief 페이지 수정 내용 저장 - **/ - function procPageAdminInsertContent() { - $module_srl = Context::get('module_srl'); - $content = Context::get('content'); - if(!$module_srl) return new Object(-1,'msg_invalid_request'); - $mcontent = Context::get('mcontent'); - $type = Context::get('type'); - - // 페이지의 원 정보를 구해옴 - $oModuleModel = &getModel('module'); - $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); - if($type == "mobile") { - if(!$mcontent) $mcontent = ''; - $module_info->mcontent = $mcontent; - } - else { - if(!isset($content)) $content =''; - $module_info->content = $content; - } - - $document_srls = array(); - $this->putDocumentsInPageToArray($module_info->content, $document_srls); - $this->putDocumentsInPageToArray($module_info->mcontent, $document_srls); - - $oDocumentModel = &getModel('document'); - $oDocumentController = &getController('document'); - $obj->module_srl = $module_srl; - $obj->list_count = 99999999; - $output = $oDocumentModel->getDocumentList($obj); - if(count($output->data)) { - foreach($output->data as $document) - { - if($document_srls[$document->document_srl]) continue; - $oDocumentController->deleteDocument($document->document_srl, true); - } - } - // module 모듈의 controller 객체 생성 - $oModuleController = &getController('module'); - - // 저장 - $output = $oModuleController->updateModule($module_info); - if(!$output->toBool()) return $output; - - // 해당 페이지에 첨부된 파일의 상태를 유효로 변경 - $oFileController = &getController('file'); - $oFileController->setFilesValid($module_info->module_srl); - - // 캐시파일 재생성 - //$this->procPageAdminRemoveWidgetCache(); - - $this->add("module_srl", $module_info->module_srl); - $this->add("page", Context::get('page')); - $this->add("mid", $module_info->mid); - $this->setMessage($msg_code); - } - - /** - * @brief 페이지 삭제 - **/ - function procPageAdminDelete() { - $module_srl = Context::get('module_srl'); - - // 원본을 구해온다 - $oModuleController = &getController('module'); - $output = $oModuleController->deleteModule($module_srl); - if(!$output->toBool()) return $output; - - $this->add('module','page'); - $this->add('page',Context::get('page')); - $this->setMessage('success_deleted'); - } - - /** - * @brief 페이지 기본 정보의 추가 - **/ - function procPageAdminInsertConfig() { - // 기본 정보를 받음 - $args = Context::getRequestVars(); - - // module Controller 객체 생성하여 입력 - $oModuleController = &getController('module'); - $output = $oModuleController->insertModuleConfig('page',$args); - return $output; - } - - /** - * @brief 첨부파일 업로드 - **/ - function procUploadFile() { - // 기본적으로 필요한 변수 설정 - $upload_target_srl = Context::get('upload_target_srl'); - $module_srl = Context::get('module_srl'); - - // file class의 controller 객체 생성 - $oFileController = &getController('file'); - $output = $oFileController->insertFile($module_srl, $upload_target_srl); - - // 첨부파일의 목록을 java script로 출력 - $oFileController->printUploadedFileList($upload_target_srl); - } - - /** - * @brief 첨부파일 삭제 - * 에디터에서 개별 파일 삭제시 사용 - **/ - function procDeleteFile() { - // 기본적으로 필요한 변수인 upload_target_srl, module_srl을 설정 - $upload_target_srl = Context::get('upload_target_srl'); - $module_srl = Context::get('module_srl'); - $file_srl = Context::get('file_srl'); - - // file class의 controller 객체 생성 - $oFileController = &getController('file'); - if($file_srl) $output = $oFileController->deleteFile($file_srl, $this->grant->manager); - - // 첨부파일의 목록을 java script로 출력 - $oFileController->printUploadedFileList($upload_target_srl); - } - - /** - * @brief 지정된 페이지의 위젯 캐시 파일 지우기 - **/ - function procPageAdminRemoveWidgetCache() { - $module_srl = Context::get('module_srl'); - - $oModuleModel = &getModel('module'); - $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); - - $content = $module_info->content; - - $cache_file = sprintf("%sfiles/cache/page/%d.%s.cache.php", _XE_PATH_, $module_info->module_srl, Context::getLangType()); - if(file_exists($cache_file)) FileHandler::removeFile($cache_file); - - // widget controller 의 캐시파일 재생성 실행 - $oWidgetController = &getController('widget'); - $oWidgetController->recompileWidget($content); - } - - } -?> +module = 'page'; + $args->mid = $args->page_name; + unset($args->page_name); + + if($args->use_mobile != 'Y') $args->use_mobile = ''; + + // module_srl이 넘어오면 원 모듈이 있는지 확인 + if($args->module_srl) { + $module_info = $oModuleModel->getModuleInfoByModuleSrl($args->module_srl); + if($module_info->module_srl != $args->module_srl) { + unset($args->module_srl); + } + else + { + foreach($args as $key=>$val) + { + $module_info->{$key} = $val; + } + $args = $module_info; + } + } + + // module_srl의 값에 따라 insert/update + if(!$args->module_srl) { + $output = $oModuleController->insertModule($args); + $msg_code = 'success_registed'; + } else { + $output = $oModuleController->updateModule($args); + $msg_code = 'success_updated'; + } + + if(!$output->toBool()) return $output; + + $this->add("page", Context::get('page')); + $this->add('module_srl',$output->get('module_srl')); + $this->setMessage($msg_code); + } + + function putDocumentsInPageToArray($target, &$array) + { + if(!$target) return; + preg_match_all('!]+)!is', $target, $matches); + $pattern = '!document_srl="(\d+)"!'; + foreach($matches[1] as $match) + { + $match2 = null; + preg_match($pattern, $match, $match2); + if(count($match2)) + { + $array[(int)$match2[1]] = 1; + } + } + } + + /** + * @brief 페이지 수정 내용 저장 + **/ + function procPageAdminInsertContent() { + $module_srl = Context::get('module_srl'); + $content = Context::get('content'); + if(!$module_srl) return new Object(-1,'msg_invalid_request'); + $mcontent = Context::get('mcontent'); + $type = Context::get('type'); + + // 페이지의 원 정보를 구해옴 + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); + if($type == "mobile") { + if(!$mcontent) $mcontent = ''; + $module_info->mcontent = $mcontent; + } + else { + if(!isset($content)) $content =''; + $module_info->content = $content; + } + + $document_srls = array(); + $this->putDocumentsInPageToArray($module_info->content, $document_srls); + $this->putDocumentsInPageToArray($module_info->mcontent, $document_srls); + + $oDocumentModel = &getModel('document'); + $oDocumentController = &getController('document'); + $obj->module_srl = $module_srl; + $obj->list_count = 99999999; + $output = $oDocumentModel->getDocumentList($obj); + if(count($output->data)) { + foreach($output->data as $document) + { + if($document_srls[$document->document_srl]) continue; + $oDocumentController->deleteDocument($document->document_srl, true); + } + } + // module 모듈의 controller 객체 생성 + $oModuleController = &getController('module'); + + // 저장 + $output = $oModuleController->updateModule($module_info); + if(!$output->toBool()) return $output; + + // 해당 페이지에 첨부된 파일의 상태를 유효로 변경 + $oFileController = &getController('file'); + $oFileController->setFilesValid($module_info->module_srl); + + // 캐시파일 재생성 + //$this->procPageAdminRemoveWidgetCache(); + + $this->add("module_srl", $module_info->module_srl); + $this->add("page", Context::get('page')); + $this->add("mid", $module_info->mid); + $this->setMessage($msg_code); + } + + /** + * @brief 페이지 삭제 + **/ + function procPageAdminDelete() { + $module_srl = Context::get('module_srl'); + + // 원본을 구해온다 + $oModuleController = &getController('module'); + $output = $oModuleController->deleteModule($module_srl); + if(!$output->toBool()) return $output; + + $this->add('module','page'); + $this->add('page',Context::get('page')); + $this->setMessage('success_deleted'); + } + + /** + * @brief 페이지 기본 정보의 추가 + **/ + function procPageAdminInsertConfig() { + // 기본 정보를 받음 + $args = Context::getRequestVars(); + + // module Controller 객체 생성하여 입력 + $oModuleController = &getController('module'); + $output = $oModuleController->insertModuleConfig('page',$args); + return $output; + } + + /** + * @brief 첨부파일 업로드 + **/ + function procUploadFile() { + // 기본적으로 필요한 변수 설정 + $upload_target_srl = Context::get('upload_target_srl'); + $module_srl = Context::get('module_srl'); + + // file class의 controller 객체 생성 + $oFileController = &getController('file'); + $output = $oFileController->insertFile($module_srl, $upload_target_srl); + + // 첨부파일의 목록을 java script로 출력 + $oFileController->printUploadedFileList($upload_target_srl); + } + + /** + * @brief 첨부파일 삭제 + * 에디터에서 개별 파일 삭제시 사용 + **/ + function procDeleteFile() { + // 기본적으로 필요한 변수인 upload_target_srl, module_srl을 설정 + $upload_target_srl = Context::get('upload_target_srl'); + $module_srl = Context::get('module_srl'); + $file_srl = Context::get('file_srl'); + + // file class의 controller 객체 생성 + $oFileController = &getController('file'); + if($file_srl) $output = $oFileController->deleteFile($file_srl, $this->grant->manager); + + // 첨부파일의 목록을 java script로 출력 + $oFileController->printUploadedFileList($upload_target_srl); + } + + /** + * @brief 지정된 페이지의 위젯 캐시 파일 지우기 + **/ + function procPageAdminRemoveWidgetCache() { + $module_srl = Context::get('module_srl'); + + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); + + $content = $module_info->content; + + $cache_file = sprintf("%sfiles/cache/page/%d.%s.cache.php", _XE_PATH_, $module_info->module_srl, Context::getLangType()); + if(file_exists($cache_file)) FileHandler::removeFile($cache_file); + + // widget controller 의 캐시파일 재생성 실행 + $oWidgetController = &getController('widget'); + $oWidgetController->recompileWidget($content); + } + + } +?> diff --git a/modules/page/page.admin.view.php b/modules/page/page.admin.view.php index 60183644e..4beac6f08 100644 --- a/modules/page/page.admin.view.php +++ b/modules/page/page.admin.view.php @@ -1,258 +1,258 @@ -getModuleInfoByModuleSrl($module_srl); - if(!$module_info) { - Context::set('module_srl',''); - $this->act = 'list'; - } else { - ModuleModel::syncModuleToSite($module_info); - $this->module_info = $module_info; - Context::set('module_info',$module_info); - } - } - - // 모듈 카테고리 목록을 구함 - $module_category = $oModuleModel->getModuleCategories(); - Context::set('module_category', $module_category); - - // 템플릿 경로 구함 (page의 경우 tpl에 관리자용 템플릿 모아놓음) - $this->setTemplatePath($this->module_path.'tpl'); - - } - - /** - * @brief 페이지 관리 목록 보여줌 - **/ - function dispPageAdminContent() { - $args->sort_index = "module_srl"; - $args->page = Context::get('page'); - $args->list_count = 40; - $args->page_count = 10; - $args->s_module_category_srl = Context::get('module_category_srl'); - - $s_mid = Context::get('s_mid'); - if($s_mid) $args->s_mid = $s_mid; - - $s_browser_title = Context::get('s_browser_title'); - if($s_browser_title) $args->s_browser_title = $s_browser_title; - - $output = executeQuery('page.getPageList', $args); - moduleModel::syncModuleToSite($output->data); - - // 템플릿에 쓰기 위해서 context::set - Context::set('total_count', $output->total_count); - Context::set('total_page', $output->total_page); - Context::set('page', $output->page); - Context::set('page_list', $output->data); - Context::set('page_navigation', $output->page_navigation); - - // 템플릿 파일 지정 - $this->setTemplateFile('index'); - } - - /** - * @brief 선택된 페이지의 정보 출력 - **/ - function dispPageAdminInfo() { - // GET parameter에서 module_srl을 가져옴 - $module_srl = Context::get('module_srl'); - - $module_info = Context::get('module_info'); - - // module_srl 값이 없다면 그냥 index 페이지를 보여줌 - if(!$module_srl) return $this->dispPageAdminContent(); - - // 레이아웃이 정해져 있다면 레이아웃 정보를 추가해줌(layout_title, layout) - if($module_info->layout_srl) { - $oLayoutModel = &getModel('layout'); - $layout_info = $oLayoutModel->getLayout($module_info->layout_srl); - $module_info->layout = $layout_info->layout; - $module_info->layout_title = $layout_info->layout_title; - } - - // 레이아웃 목록을 구해옴 - $oLayoutModel = &getModel('layout'); - $layout_list = $oLayoutModel->getLayoutList(); - Context::set('layout_list', $layout_list); - - $mobile_layout_list = $oLayoutModel->getLayoutList(0,"M"); - Context::set('mlayout_list', $mobile_layout_list); - - // 템플릿 파일 지정 - $this->setTemplateFile('page_info'); - } - - /** - * @brief 페이지 추가 설정 보여줌 - * 추가설정은 서비스형 모듈들에서 다른 모듈과의 연계를 위해서 설정하는 페이지임 - **/ - function dispPageAdminPageAdditionSetup() { - // content는 다른 모듈에서 call by reference로 받아오기에 미리 변수 선언만 해 놓음 - $content = ''; - - $oEditorView = &getView('editor'); - $oEditorView->triggerDispEditorAdditionSetup($content); - Context::set('setup_content', $content); - - // 템플릿 파일 지정 - $this->setTemplateFile('addition_setup'); - } - - /** - * @brief 페이지 추가 폼 출력 - **/ - function dispPageAdminInsert() { - - // GET parameter에서 module_srl을 가져옴 - $module_srl = Context::get('module_srl'); - - // module_srl이 있으면 해당 모듈의 정보를 구해서 세팅 - if($module_srl) { - $oModuleModel = &getModel('module'); - $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); - if($module_info->module_srl == $module_srl) Context::set('module_info',$module_info); - else { - unset($module_info); - unset($module_srl); - } - } - - // 레이아웃 목록을 구해옴 - $oLayoutModel = &getModel('layout'); - $layout_list = $oLayoutModel->getLayoutList(); - Context::set('layout_list', $layout_list); - - $mobile_layout_list = $oLayoutModel->getLayoutList(0,"M"); - Context::set('mlayout_list', $mobile_layout_list); - - // 템플릿 파일 지정 - $this->setTemplateFile('page_insert'); - } - - function dispPageAdminMobileContent() { - if($this->module_srl) Context::set('module_srl',$this->module_srl); - - // 캐시 파일 지정 - $cache_file = sprintf("%sfiles/cache/page/%d.%s.m.cache.php", _XE_PATH_, $this->module_info->module_srl, Context::getLangType()); - $interval = (int)($this->module_info->page_caching_interval); - if($interval>0) { - if(!file_exists($cache_file)) $mtime = 0; - else $mtime = filemtime($cache_file); - - if($mtime + $interval*60 > time()) { - $page_content = FileHandler::readFile($cache_file); - } else { - $oWidgetController = &getController('widget'); - $page_content = $oWidgetController->transWidgetCode($this->module_info->mcontent); - FileHandler::writeFile($cache_file, $page_content); - } - } else { - if(file_exists($cache_file)) FileHandler::removeFile($cache_file); - $page_content = $this->module_info->mcontent; - } - - Context::set('module_info', $this->module_info); - Context::set('page_content', $page_content); - - $this->setTemplateFile('mcontent'); - } - - function dispPageAdminMobileContentModify() { - Context::set('module_info', $this->module_info); - - // 내용을 세팅 - $content = Context::get('mcontent'); - if(!$content) $content = $this->module_info->mcontent; - Context::set('content', $content); - - // 내용중 위젯들을 변환 - $oWidgetController = &getController('widget'); - $content = $oWidgetController->transWidgetCode($content, true); - Context::set('page_content', $content); - - // 위젯 목록을 세팅 - $oWidgetModel = &getModel('widget'); - $widget_list = $oWidgetModel->getDownloadedWidgetList(); - Context::set('widget_list', $widget_list); - - // 템플릿 파일 지정 - $this->setTemplateFile('page_mobile_content_modify'); - } - - /** - * @brief 페이지 내용 수정 - **/ - function dispPageAdminContentModify() { - // 모듈 정보를 세팅 - Context::set('module_info', $this->module_info); - - // 내용을 세팅 - $content = Context::get('content'); - if(!$content) $content = $this->module_info->content; - Context::set('content', $content); - - // 내용중 위젯들을 변환 - $oWidgetController = &getController('widget'); - $content = $oWidgetController->transWidgetCode($content, true); - Context::set('page_content', $content); - - // 위젯 목록을 세팅 - $oWidgetModel = &getModel('widget'); - $widget_list = $oWidgetModel->getDownloadedWidgetList(); - Context::set('widget_list', $widget_list); - - // 템플릿 파일 지정 - $this->setTemplateFile('page_content_modify'); - } - - /** - * @brief 페이지 삭제 화면 출력 - **/ - function dispPageAdminDelete() { - $module_srl = Context::get('module_srl'); - if(!$module_srl) return $this->dispContent(); - - $oModuleModel = &getModel('module'); - $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); - Context::set('module_info',$module_info); - - // 템플릿 파일 지정 - $this->setTemplateFile('page_delete'); - } - - /** - * @brief 권한 목록 출력 - **/ - function dispPageAdminGrantInfo() { - // 공통 모듈 권한 설정 페이지 호출 - $oModuleAdminModel = &getAdminModel('module'); - $grant_content = $oModuleAdminModel->getModuleGrantHTML($this->module_info->module_srl, $this->xml_info->grant); - Context::set('grant_content', $grant_content); - - $this->setTemplateFile('grant_list'); - } - } -?> +getModuleInfoByModuleSrl($module_srl); + if(!$module_info) { + Context::set('module_srl',''); + $this->act = 'list'; + } else { + ModuleModel::syncModuleToSite($module_info); + $this->module_info = $module_info; + Context::set('module_info',$module_info); + } + } + + // 모듈 카테고리 목록을 구함 + $module_category = $oModuleModel->getModuleCategories(); + Context::set('module_category', $module_category); + + // 템플릿 경로 구함 (page의 경우 tpl에 관리자용 템플릿 모아놓음) + $this->setTemplatePath($this->module_path.'tpl'); + + } + + /** + * @brief 페이지 관리 목록 보여줌 + **/ + function dispPageAdminContent() { + $args->sort_index = "module_srl"; + $args->page = Context::get('page'); + $args->list_count = 40; + $args->page_count = 10; + $args->s_module_category_srl = Context::get('module_category_srl'); + + $s_mid = Context::get('s_mid'); + if($s_mid) $args->s_mid = $s_mid; + + $s_browser_title = Context::get('s_browser_title'); + if($s_browser_title) $args->s_browser_title = $s_browser_title; + + $output = executeQuery('page.getPageList', $args); + moduleModel::syncModuleToSite($output->data); + + // 템플릿에 쓰기 위해서 context::set + Context::set('total_count', $output->total_count); + Context::set('total_page', $output->total_page); + Context::set('page', $output->page); + Context::set('page_list', $output->data); + Context::set('page_navigation', $output->page_navigation); + + // 템플릿 파일 지정 + $this->setTemplateFile('index'); + } + + /** + * @brief 선택된 페이지의 정보 출력 + **/ + function dispPageAdminInfo() { + // GET parameter에서 module_srl을 가져옴 + $module_srl = Context::get('module_srl'); + + $module_info = Context::get('module_info'); + + // module_srl 값이 없다면 그냥 index 페이지를 보여줌 + if(!$module_srl) return $this->dispPageAdminContent(); + + // 레이아웃이 정해져 있다면 레이아웃 정보를 추가해줌(layout_title, layout) + if($module_info->layout_srl) { + $oLayoutModel = &getModel('layout'); + $layout_info = $oLayoutModel->getLayout($module_info->layout_srl); + $module_info->layout = $layout_info->layout; + $module_info->layout_title = $layout_info->layout_title; + } + + // 레이아웃 목록을 구해옴 + $oLayoutModel = &getModel('layout'); + $layout_list = $oLayoutModel->getLayoutList(); + Context::set('layout_list', $layout_list); + + $mobile_layout_list = $oLayoutModel->getLayoutList(0,"M"); + Context::set('mlayout_list', $mobile_layout_list); + + // 템플릿 파일 지정 + $this->setTemplateFile('page_info'); + } + + /** + * @brief 페이지 추가 설정 보여줌 + * 추가설정은 서비스형 모듈들에서 다른 모듈과의 연계를 위해서 설정하는 페이지임 + **/ + function dispPageAdminPageAdditionSetup() { + // content는 다른 모듈에서 call by reference로 받아오기에 미리 변수 선언만 해 놓음 + $content = ''; + + $oEditorView = &getView('editor'); + $oEditorView->triggerDispEditorAdditionSetup($content); + Context::set('setup_content', $content); + + // 템플릿 파일 지정 + $this->setTemplateFile('addition_setup'); + } + + /** + * @brief 페이지 추가 폼 출력 + **/ + function dispPageAdminInsert() { + + // GET parameter에서 module_srl을 가져옴 + $module_srl = Context::get('module_srl'); + + // module_srl이 있으면 해당 모듈의 정보를 구해서 세팅 + if($module_srl) { + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); + if($module_info->module_srl == $module_srl) Context::set('module_info',$module_info); + else { + unset($module_info); + unset($module_srl); + } + } + + // 레이아웃 목록을 구해옴 + $oLayoutModel = &getModel('layout'); + $layout_list = $oLayoutModel->getLayoutList(); + Context::set('layout_list', $layout_list); + + $mobile_layout_list = $oLayoutModel->getLayoutList(0,"M"); + Context::set('mlayout_list', $mobile_layout_list); + + // 템플릿 파일 지정 + $this->setTemplateFile('page_insert'); + } + + function dispPageAdminMobileContent() { + if($this->module_srl) Context::set('module_srl',$this->module_srl); + + // 캐시 파일 지정 + $cache_file = sprintf("%sfiles/cache/page/%d.%s.m.cache.php", _XE_PATH_, $this->module_info->module_srl, Context::getLangType()); + $interval = (int)($this->module_info->page_caching_interval); + if($interval>0) { + if(!file_exists($cache_file)) $mtime = 0; + else $mtime = filemtime($cache_file); + + if($mtime + $interval*60 > time()) { + $page_content = FileHandler::readFile($cache_file); + } else { + $oWidgetController = &getController('widget'); + $page_content = $oWidgetController->transWidgetCode($this->module_info->mcontent); + FileHandler::writeFile($cache_file, $page_content); + } + } else { + if(file_exists($cache_file)) FileHandler::removeFile($cache_file); + $page_content = $this->module_info->mcontent; + } + + Context::set('module_info', $this->module_info); + Context::set('page_content', $page_content); + + $this->setTemplateFile('mcontent'); + } + + function dispPageAdminMobileContentModify() { + Context::set('module_info', $this->module_info); + + // 내용을 세팅 + $content = Context::get('mcontent'); + if(!$content) $content = $this->module_info->mcontent; + Context::set('content', $content); + + // 내용중 위젯들을 변환 + $oWidgetController = &getController('widget'); + $content = $oWidgetController->transWidgetCode($content, true); + Context::set('page_content', $content); + + // 위젯 목록을 세팅 + $oWidgetModel = &getModel('widget'); + $widget_list = $oWidgetModel->getDownloadedWidgetList(); + Context::set('widget_list', $widget_list); + + // 템플릿 파일 지정 + $this->setTemplateFile('page_mobile_content_modify'); + } + + /** + * @brief 페이지 내용 수정 + **/ + function dispPageAdminContentModify() { + // 모듈 정보를 세팅 + Context::set('module_info', $this->module_info); + + // 내용을 세팅 + $content = Context::get('content'); + if(!$content) $content = $this->module_info->content; + Context::set('content', $content); + + // 내용중 위젯들을 변환 + $oWidgetController = &getController('widget'); + $content = $oWidgetController->transWidgetCode($content, true); + Context::set('page_content', $content); + + // 위젯 목록을 세팅 + $oWidgetModel = &getModel('widget'); + $widget_list = $oWidgetModel->getDownloadedWidgetList(); + Context::set('widget_list', $widget_list); + + // 템플릿 파일 지정 + $this->setTemplateFile('page_content_modify'); + } + + /** + * @brief 페이지 삭제 화면 출력 + **/ + function dispPageAdminDelete() { + $module_srl = Context::get('module_srl'); + if(!$module_srl) return $this->dispContent(); + + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); + Context::set('module_info',$module_info); + + // 템플릿 파일 지정 + $this->setTemplateFile('page_delete'); + } + + /** + * @brief 권한 목록 출력 + **/ + function dispPageAdminGrantInfo() { + // 공통 모듈 권한 설정 페이지 호출 + $oModuleAdminModel = &getAdminModel('module'); + $grant_content = $oModuleAdminModel->getModuleGrantHTML($this->module_info->module_srl, $this->xml_info->grant); + Context::set('grant_content', $grant_content); + + $this->setTemplateFile('grant_list'); + } + } +?> diff --git a/modules/page/page.api.php b/modules/page/page.api.php index 40be8ce4f..5f0b839c9 100644 --- a/modules/page/page.api.php +++ b/modules/page/page.api.php @@ -1,25 +1,25 @@ -triggerWidgetCompile(&$page_content); - Context::setResponseMethod($requestMethod); - - $oModule->add('page_content',$page_content); - } - } -?> +triggerWidgetCompile(&$page_content); + Context::setResponseMethod($requestMethod); + + $oModule->add('page_content',$page_content); + } + } +?> diff --git a/modules/page/page.class.php b/modules/page/page.class.php index 584f88637..116bc3261 100644 --- a/modules/page/page.class.php +++ b/modules/page/page.class.php @@ -1,42 +1,42 @@ - + diff --git a/modules/page/page.view.php b/modules/page/page.view.php index 6dd65e384..44b73ce5e 100644 --- a/modules/page/page.view.php +++ b/modules/page/page.view.php @@ -1,54 +1,54 @@ -setTemplatePath($this->module_path.'tpl'); - } - - /** - * @brief 일반 요청시 출력 - **/ - function dispPageIndex() { - // 템플릿에서 사용할 변수를 Context::set() - if($this->module_srl) Context::set('module_srl',$this->module_srl); - - // 캐시 파일 지정 - $cache_file = sprintf("%sfiles/cache/page/%d.%s.cache.php", _XE_PATH_, $this->module_info->module_srl, Context::getLangType()); - $interval = (int)($this->module_info->page_caching_interval); - if($interval>0) { - if(!file_exists($cache_file)) $mtime = 0; - else $mtime = filemtime($cache_file); - - if($mtime + $interval*60 > time()) { - $page_content = FileHandler::readFile($cache_file); - } else { - $oWidgetController = &getController('widget'); - $page_content = $oWidgetController->transWidgetCode($this->module_info->content); - FileHandler::writeFile($cache_file, $page_content); - } - } else { - if(file_exists($cache_file)) FileHandler::removeFile($cache_file); - $page_content = $this->module_info->content; - } - - Context::set('module_info', $this->module_info); - Context::set('page_content', $page_content); - - $this->setTemplateFile('content'); - } - } -?> +setTemplatePath($this->module_path.'tpl'); + } + + /** + * @brief 일반 요청시 출력 + **/ + function dispPageIndex() { + // 템플릿에서 사용할 변수를 Context::set() + if($this->module_srl) Context::set('module_srl',$this->module_srl); + + // 캐시 파일 지정 + $cache_file = sprintf("%sfiles/cache/page/%d.%s.cache.php", _XE_PATH_, $this->module_info->module_srl, Context::getLangType()); + $interval = (int)($this->module_info->page_caching_interval); + if($interval>0) { + if(!file_exists($cache_file)) $mtime = 0; + else $mtime = filemtime($cache_file); + + if($mtime + $interval*60 > time()) { + $page_content = FileHandler::readFile($cache_file); + } else { + $oWidgetController = &getController('widget'); + $page_content = $oWidgetController->transWidgetCode($this->module_info->content); + FileHandler::writeFile($cache_file, $page_content); + } + } else { + if(file_exists($cache_file)) FileHandler::removeFile($cache_file); + $page_content = $this->module_info->content; + } + + Context::set('module_info', $this->module_info); + Context::set('page_content', $page_content); + + $this->setTemplateFile('content'); + } + } +?> diff --git a/modules/page/page.wap.php b/modules/page/page.wap.php index 0754cee6e..81aafa878 100644 --- a/modules/page/page.wap.php +++ b/modules/page/page.wap.php @@ -1,26 +1,26 @@ -grant->access) return $oMobile->setContent(Context::getLang('msg_not_permitted')); - - // 위젯의 내용을 추출함 - $oWidgetController = &getController('widget'); - $content = $oWidgetController->transWidgetCode($this->module_info->content); - $oMobile->setContent($content); - } - - } -?> +grant->access) return $oMobile->setContent(Context::getLang('msg_not_permitted')); + + // 위젯의 내용을 추출함 + $oWidgetController = &getController('widget'); + $content = $oWidgetController->transWidgetCode($this->module_info->content); + $oMobile->setContent($content); + } + + } +?> diff --git a/modules/page/tpl/index.html b/modules/page/tpl/index.html index 8ccbbb8d6..6108ae239 100644 --- a/modules/page/tpl/index.html +++ b/modules/page/tpl/index.html @@ -1,101 +1,101 @@ - - - - -
    - - - - - -
    - {$lang->mid} - {$lang->browser_title} - - {$lang->cmd_cancel} -
    -
    - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
    {$lang->no}
    -
    - - - - -
    -
    {$lang->mid}
    {$lang->browser_title}
    {$lang->regdate}
     
    {$no} - - - {$lang->virtual_site} - - {$lang->not_exists} - - - {$module_category[$val->module_category_srl]->title} - - {htmlspecialchars($val->mid)}{$val->browser_title}{zdate($val->regdate,"Y-m-d")}{$lang->cmd_setup}{$lang->cmd_copy}{$lang->cmd_delete}
    - - - - -
    - - - + + + + +
    + + + + + +
    + {$lang->mid} + {$lang->browser_title} + + {$lang->cmd_cancel} +
    +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
    {$lang->no}
    +
    + + + + +
    +
    {$lang->mid}
    {$lang->browser_title}
    {$lang->regdate}
     
    {$no} + + + {$lang->virtual_site} + + {$lang->not_exists} + + + {$module_category[$val->module_category_srl]->title} + + {htmlspecialchars($val->mid)}{$val->browser_title}{zdate($val->regdate,"Y-m-d")}{$lang->cmd_setup}{$lang->cmd_copy}{$lang->cmd_delete}
    + + + + +
    + + + diff --git a/modules/page/tpl/js/page_admin.js b/modules/page/tpl/js/page_admin.js index 61bb7ed7c..7568e9599 100644 --- a/modules/page/tpl/js/page_admin.js +++ b/modules/page/tpl/js/page_admin.js @@ -1,110 +1,110 @@ -/** - * @file modules/page/js/page_admin.js - * @author NHN (developers@xpressengine.com) - * @brief page모듈의 관리자용 javascript - **/ - -/* 모듈 생성 후 */ -function completeInsertPage(ret_obj) { - var error = ret_obj['error']; - var message = ret_obj['message']; - - var page = ret_obj['page']; - var module_srl = ret_obj['module_srl']; - - alert(message); - - var url = ''; - if(location.href.getQuery('module')=='admin') { - url = current_url.setQuery('module_srl',module_srl).setQuery('act','dispPageAdminInfo'); - if(page) url = url.setQuery('page',page); - } else { - url = current_url; - } - - location.href = url; -} - -/* 내용 저장 후 */ -function completeInsertPageContent(ret_obj) { - var error = ret_obj['error']; - var message = ret_obj['message']; - - var page = ret_obj['page']; - var module_srl = ret_obj['module_srl']; - var mid = ret_obj['mid']; - - location.href = current_url.setQuery('mid',mid).setQuery('act',''); -} - -function completeInsertMobilePageContent(ret_obj) { - var error = ret_obj['error']; - var message = ret_obj['message']; - - var page = ret_obj['page']; - var module_srl = ret_obj['module_srl']; - var mid = ret_obj['mid']; - - location.href = current_url.setQuery('mid',mid).setQuery('act','dispPageAdminMobileContent'); -} - -/* 수정한 페이지 컨텐츠를 저장 */ -function doSubmitPageContent(fo_obj) { - var html = getWidgetContent(); - fo_obj.content.value = html; - return procFilter(fo_obj, insert_page_content); -} - -function doSubmitMPageContent(fo_obj) { - var html = getWidgetContent(); - fo_obj.content.value = html; - return procFilter(fo_obj, insert_mpage_content); -} - -/* 모듈 삭제 후 */ -function completeDeletePage(ret_obj) { - var error = ret_obj['error']; - var message = ret_obj['message']; - var page = ret_obj['page']; - alert(message); - - var url = current_url.setQuery('act','dispPageAdminContent').setQuery('module_srl',''); - if(page) url = url.setQuery('page',page); - - location.href = url; -} - -/* 카테고리 이동 */ -function doChangeCategory(fo_obj) { - var module_category_srl = fo_obj.module_category_srl.options[fo_obj.module_category_srl.selectedIndex].value; - if(module_category_srl==-1) { - location.href = current_url.setQuery('act','dispModuleAdminCategory'); - return false; - } - return true; -} - -/* 위젯 재컴파일 */ -function doRemoveWidgetCache(module_srl) { - var params = new Array(); - params["module_srl"] = module_srl; - exec_xml('page', 'procPageAdminRemoveWidgetCache', params, completeRemoveWidgetCache); -} - -function completeRemoveWidgetCache(ret_obj) { - var message = ret_obj['message']; - location.reload(); -} - -/* 일괄 설정 */ -function doCartSetup(url) { - var module_srl = new Array(); - jQuery('#fo_list input[name=cart]:checked').each(function() { - module_srl[module_srl.length] = jQuery(this).val(); - }); - - if(module_srl.length<1) return; - - url += "&module_srls="+module_srl.join(','); - popopen(url,'modulesSetup'); -} +/** + * @file modules/page/js/page_admin.js + * @author NHN (developers@xpressengine.com) + * @brief page모듈의 관리자용 javascript + **/ + +/* 모듈 생성 후 */ +function completeInsertPage(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + + var page = ret_obj['page']; + var module_srl = ret_obj['module_srl']; + + alert(message); + + var url = ''; + if(location.href.getQuery('module')=='admin') { + url = current_url.setQuery('module_srl',module_srl).setQuery('act','dispPageAdminInfo'); + if(page) url = url.setQuery('page',page); + } else { + url = current_url; + } + + location.href = url; +} + +/* 내용 저장 후 */ +function completeInsertPageContent(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + + var page = ret_obj['page']; + var module_srl = ret_obj['module_srl']; + var mid = ret_obj['mid']; + + location.href = current_url.setQuery('mid',mid).setQuery('act',''); +} + +function completeInsertMobilePageContent(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + + var page = ret_obj['page']; + var module_srl = ret_obj['module_srl']; + var mid = ret_obj['mid']; + + location.href = current_url.setQuery('mid',mid).setQuery('act','dispPageAdminMobileContent'); +} + +/* 수정한 페이지 컨텐츠를 저장 */ +function doSubmitPageContent(fo_obj) { + var html = getWidgetContent(); + fo_obj.content.value = html; + return procFilter(fo_obj, insert_page_content); +} + +function doSubmitMPageContent(fo_obj) { + var html = getWidgetContent(); + fo_obj.content.value = html; + return procFilter(fo_obj, insert_mpage_content); +} + +/* 모듈 삭제 후 */ +function completeDeletePage(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + var page = ret_obj['page']; + alert(message); + + var url = current_url.setQuery('act','dispPageAdminContent').setQuery('module_srl',''); + if(page) url = url.setQuery('page',page); + + location.href = url; +} + +/* 카테고리 이동 */ +function doChangeCategory(fo_obj) { + var module_category_srl = fo_obj.module_category_srl.options[fo_obj.module_category_srl.selectedIndex].value; + if(module_category_srl==-1) { + location.href = current_url.setQuery('act','dispModuleAdminCategory'); + return false; + } + return true; +} + +/* 위젯 재컴파일 */ +function doRemoveWidgetCache(module_srl) { + var params = new Array(); + params["module_srl"] = module_srl; + exec_xml('page', 'procPageAdminRemoveWidgetCache', params, completeRemoveWidgetCache); +} + +function completeRemoveWidgetCache(ret_obj) { + var message = ret_obj['message']; + location.reload(); +} + +/* 일괄 설정 */ +function doCartSetup(url) { + var module_srl = new Array(); + jQuery('#fo_list input[name=cart]:checked').each(function() { + module_srl[module_srl.length] = jQuery(this).val(); + }); + + if(module_srl.length<1) return; + + url += "&module_srls="+module_srl.join(','); + popopen(url,'modulesSetup'); +} diff --git a/modules/point/conf/info.xml b/modules/point/conf/info.xml index 8d8cabad2..acffe7446 100644 --- a/modules/point/conf/info.xml +++ b/modules/point/conf/info.xml @@ -1,72 +1,72 @@ - - - 포인트 시스템 - 积分系统 - ポイントシステム - Point System - Hệ thống điểm - Sistema de Punto - Система поитов - 點數系統 - Puanlama Sistemi - - 글작성/삭제/댓글작성/삭제시에 포인트를 부여할 수 있습니다. - 포인트마다 레벨을 지정하여 사용자 이름 앞에 아이콘을 표시할 수도 있습니다. - 단 포인트 관련 애드온을 활성화 시키셔야 됩니다. - - - 可以在发表/删除新帖,发表/删除评论时,付与相应积分。 - 也可以以积分设置级别,并在用户名前显示级别图标。 - 必须是先激活积分系统才可以使用。 - - - 書き込み作成・削除/コメント作成・削除の活動に対するポイントを計算するシステムです。 - ポイントごとレベルを指定してユーザ名の前にアイコンを表示させることが出来ます。 - 但し、ポイントシステムアドオンを「使用」に設定しないと作動しません。 - - - You can grant point on writing/deleting/adding comments/deleting comments. - You can also display point icon in front of user name by selecting level on each point. - But to enable these functions, you need to activate point related addons. - - - Yazmaya/silmeye, yorum eklemeye/yorum silmeye puan atayabilirsiniz. - Her puanın seviyesini seçerek, kullanıcı isimlerinin başında puan simgesi gösterebilirsiniz. - Bu özellikleri mümkün kılmak için, puanlamayla alakalı eklentileri etkinleştirmeniz gerekmektedir. - - - Bạn có thể cho hay trừ điểm của các thành viên khi Gửi bài, Xóa bài, Thêm bình luận, Xóa bình luận. - bạn cũng có thể cho phép hiển thị Icon của cấp độ điểm trước tên sử dụng bằng việc lụa chọn Icon cấp độ điểm. - Để kích hoạt chức năng này, bạn phải kích hoạt Addon Hệ thống điểm. - - - Usted puede entregar puntos a las acciones de escribir/eliminar/agregar comentarios/eliminar comentarios. - Usted también puede mostrar el ícono de punto delande del nombre del usuario seleccionando el nivel sobre cada puntos. - Pero para activar esas funciones, Usted necesita activar addon relacionado a los puntos. - - - Вы можете назначать поинты за написание/удаление/добавление комментариев/удаление комментариев. - Вы также можете отображать икнку поинтов напротив имени пользователя, установив уровени для поинтов. - Но чтобы включить эти функции, Вам надо активировать аддоны, относящиеся к поинтам. - - - 可在發表/刪除評論時,付出相對應的點數。 - 也能以點數設置等級,並在用戶名稱前顯示等級圖示。 - 但是必須先啟用點數系統才能使用。 - - 0.1 - 2007-07-26 - member - - - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - - + + + 포인트 시스템 + 积分系统 + ポイントシステム + Point System + Hệ thống điểm + Sistema de Punto + Система поитов + 點數系統 + Puanlama Sistemi + + 글작성/삭제/댓글작성/삭제시에 포인트를 부여할 수 있습니다. + 포인트마다 레벨을 지정하여 사용자 이름 앞에 아이콘을 표시할 수도 있습니다. + 단 포인트 관련 애드온을 활성화 시키셔야 됩니다. + + + 可以在发表/删除新帖,发表/删除评论时,付与相应积分。 + 也可以以积分设置级别,并在用户名前显示级别图标。 + 必须是先激活积分系统才可以使用。 + + + 書き込み作成・削除/コメント作成・削除の活動に対するポイントを計算するシステムです。 + ポイントごとレベルを指定してユーザ名の前にアイコンを表示させることが出来ます。 + 但し、ポイントシステムアドオンを「使用」に設定しないと作動しません。 + + + You can grant point on writing/deleting/adding comments/deleting comments. + You can also display point icon in front of user name by selecting level on each point. + But to enable these functions, you need to activate point related addons. + + + Yazmaya/silmeye, yorum eklemeye/yorum silmeye puan atayabilirsiniz. + Her puanın seviyesini seçerek, kullanıcı isimlerinin başında puan simgesi gösterebilirsiniz. + Bu özellikleri mümkün kılmak için, puanlamayla alakalı eklentileri etkinleştirmeniz gerekmektedir. + + + Bạn có thể cho hay trừ điểm của các thành viên khi Gửi bài, Xóa bài, Thêm bình luận, Xóa bình luận. + bạn cũng có thể cho phép hiển thị Icon của cấp độ điểm trước tên sử dụng bằng việc lụa chọn Icon cấp độ điểm. + Để kích hoạt chức năng này, bạn phải kích hoạt Addon Hệ thống điểm. + + + Usted puede entregar puntos a las acciones de escribir/eliminar/agregar comentarios/eliminar comentarios. + Usted también puede mostrar el ícono de punto delande del nombre del usuario seleccionando el nivel sobre cada puntos. + Pero para activar esas funciones, Usted necesita activar addon relacionado a los puntos. + + + Вы можете назначать поинты за написание/удаление/добавление комментариев/удаление комментариев. + Вы также можете отображать икнку поинтов напротив имени пользователя, установив уровени для поинтов. + Но чтобы включить эти функции, Вам надо активировать аддоны, относящиеся к поинтам. + + + 可在發表/刪除評論時,付出相對應的點數。 + 也能以點數設置等級,並在用戶名稱前顯示等級圖示。 + 但是必須先啟用點數系統才能使用。 + + 0.1 + 2007-07-26 + member + + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + diff --git a/modules/point/lang/en.lang.php b/modules/point/lang/en.lang.php index 77c4a731a..5d36ef457 100644 --- a/modules/point/lang/en.lang.php +++ b/modules/point/lang/en.lang.php @@ -1,69 +1,69 @@ -point = "Point"; - $lang->level = "Level"; - - $lang->about_point_module = "You can grant points on writing/adding comments/uploading/downloading."; - $lang->about_act_config = "Each module like board/blog has its own actions such as \"writing/deleting/adding comments/deleting comments\".
    You can just add act values to link modules with point system except board/blog.
    Comma(,) will distinguish multiple values."; - - $lang->max_level = 'Max Level'; - $lang->about_max_level = 'You may set the max level. Level icons should be considered and the level of 1000 is the maximum value you can set'; - - $lang->level_icon = 'Level Icon'; - $lang->about_level_icon = 'Path of level icon is "./module/point/icons/[level].gif" and max level could be different with icon set. So please be careful'; - - $lang->point_name = 'Point Name'; - $lang->about_point_name = 'You may give a name or unit for point'; - - $lang->level_point = 'Level Point'; - $lang->about_level_point = 'Level will be adjusted when point gets to each level point or drops under each level point'; - - $lang->disable_download = 'Prohibit Downloads'; - $lang->about_disable_download = "This will prohibit downloads when there are not enough points. (Exclude image files)"; - $lang->disable_read_document = 'Prohibit Readings'; - $lang->about_disable_read_document = 'Users will be unable to read articles when they do not have enough points'; - - $lang->level_point_calc = 'Point Calculation per Point'; - $lang->expression = 'Please input Javascript formula by using level variable i. ex) Math.pow(i, 2) * 90'; - $lang->cmd_exp_calc = 'Calculate'; - $lang->cmd_exp_reset = 'Reset'; - - $lang->cmd_point_recal = 'Reset Point'; - $lang->about_cmd_point_recal = 'All point will be initialized only with articles/comments/attachments/join points.
    Only members who do website activities will get signup points after reset.
    Please use this function when complete initialization is required in case of data transferring or other situations.'; - - $lang->point_link_group = 'Group Change by Level'; - $lang->point_group_reset_and_add = 'Reset adjusted groups and add new groups'; - $lang->point_group_add_only = 'Only to new groups'; - $lang->about_point_link_group = 'If you specify level for a specific group, users are assigned into the group when they adavnce to the level by getting points.'; - - $lang->about_module_point = "You can set point for each module and modules which don't have any value will use default point.
    All point will be restored on acting reverse."; - - $lang->point_signup = 'Signup'; - $lang->point_insert_document = 'On Writing'; - $lang->point_delete_document = 'On Deleting'; - $lang->point_insert_comment = 'On Adding Comments'; - $lang->point_delete_comment = 'On Deleting Comments'; - $lang->point_upload_file = 'On Uploading'; - $lang->point_delete_file = 'On Deleting Files'; - $lang->point_download_file = 'On Downloading Files (Exclude images)'; - $lang->point_read_document = 'On Reading'; - $lang->point_voted = 'On Recommended'; - $lang->point_blamed = 'On Accused'; - - - $lang->cmd_point_config = 'Default Setting'; - $lang->cmd_point_module_config = 'Module Setting'; - $lang->cmd_point_act_config = 'Act Setting'; - $lang->cmd_point_member_list = 'Member Point List'; - - $lang->msg_cannot_download = "You don't have enough point to download"; - $lang->msg_disallow_by_point = "You need more points to read the article (You need %d, but you have %d)"; - - $lang->point_recal_message = 'Adjusting Point. (%d / %d)'; - $lang->point_recal_finished = 'Point recalculation is finished.'; -?> +point = "Point"; + $lang->level = "Level"; + + $lang->about_point_module = "You can grant points on writing/adding comments/uploading/downloading."; + $lang->about_act_config = "Each module like board/blog has its own actions such as \"writing/deleting/adding comments/deleting comments\".
    You can just add act values to link modules with point system except board/blog.
    Comma(,) will distinguish multiple values."; + + $lang->max_level = 'Max Level'; + $lang->about_max_level = 'You may set the max level. Level icons should be considered and the level of 1000 is the maximum value you can set'; + + $lang->level_icon = 'Level Icon'; + $lang->about_level_icon = 'Path of level icon is "./module/point/icons/[level].gif" and max level could be different with icon set. So please be careful'; + + $lang->point_name = 'Point Name'; + $lang->about_point_name = 'You may give a name or unit for point'; + + $lang->level_point = 'Level Point'; + $lang->about_level_point = 'Level will be adjusted when point gets to each level point or drops under each level point'; + + $lang->disable_download = 'Prohibit Downloads'; + $lang->about_disable_download = "This will prohibit downloads when there are not enough points. (Exclude image files)"; + $lang->disable_read_document = 'Prohibit Readings'; + $lang->about_disable_read_document = 'Users will be unable to read articles when they do not have enough points'; + + $lang->level_point_calc = 'Point Calculation per Point'; + $lang->expression = 'Please input Javascript formula by using level variable i. ex) Math.pow(i, 2) * 90'; + $lang->cmd_exp_calc = 'Calculate'; + $lang->cmd_exp_reset = 'Reset'; + + $lang->cmd_point_recal = 'Reset Point'; + $lang->about_cmd_point_recal = 'All point will be initialized only with articles/comments/attachments/join points.
    Only members who do website activities will get signup points after reset.
    Please use this function when complete initialization is required in case of data transferring or other situations.'; + + $lang->point_link_group = 'Group Change by Level'; + $lang->point_group_reset_and_add = 'Reset adjusted groups and add new groups'; + $lang->point_group_add_only = 'Only to new groups'; + $lang->about_point_link_group = 'If you specify level for a specific group, users are assigned into the group when they adavnce to the level by getting points.'; + + $lang->about_module_point = "You can set point for each module and modules which don't have any value will use default point.
    All point will be restored on acting reverse."; + + $lang->point_signup = 'Signup'; + $lang->point_insert_document = 'On Writing'; + $lang->point_delete_document = 'On Deleting'; + $lang->point_insert_comment = 'On Adding Comments'; + $lang->point_delete_comment = 'On Deleting Comments'; + $lang->point_upload_file = 'On Uploading'; + $lang->point_delete_file = 'On Deleting Files'; + $lang->point_download_file = 'On Downloading Files (Exclude images)'; + $lang->point_read_document = 'On Reading'; + $lang->point_voted = 'On Recommended'; + $lang->point_blamed = 'On Accused'; + + + $lang->cmd_point_config = 'Default Setting'; + $lang->cmd_point_module_config = 'Module Setting'; + $lang->cmd_point_act_config = 'Act Setting'; + $lang->cmd_point_member_list = 'Member Point List'; + + $lang->msg_cannot_download = "You don't have enough point to download"; + $lang->msg_disallow_by_point = "You need more points to read the article (You need %d, but you have %d)"; + + $lang->point_recal_message = 'Adjusting Point. (%d / %d)'; + $lang->point_recal_finished = 'Point recalculation is finished.'; +?> diff --git a/modules/point/lang/es.lang.php b/modules/point/lang/es.lang.php index 6af8099c6..58e60391c 100644 --- a/modules/point/lang/es.lang.php +++ b/modules/point/lang/es.lang.php @@ -1,69 +1,69 @@ -point = "Punto"; - $lang->level = "Nivel"; - - $lang->about_point_module = "Usted puede entregar puntos a las acciones de escribir/agregar comentarios/subir/descargar."; - $lang->about_act_config = "Cada módulo ya sea el tablero o blog tiene sus propias actiones como escribir/eliminar/agregar comentarios/eliminar comentarios/etc.
    Usted puede añadir valores de actos para enlazar con sistema de módulo de puntos excepto el tablero y blog.
    El enlace debe hacerse con una coma(,)."; - - $lang->max_level = 'Nivel Máximo'; - $lang->about_max_level = 'Usted puede definir el nivel máximo. Los íconos del nivel deberan ser considerados y el nivel máximo de puntos límite es 1000'; - - $lang->level_icon = 'Iconos del nivel'; - $lang->about_level_icon = 'Ruta de íconos del nivel es ./module/point/icons/[level].gif y el nivel máximo puede ser diferente con el conjunto de íconos. Tenga cuidado'; - - $lang->point_name = 'Nombre del punto'; - $lang->about_point_name = 'Usted puede otorgar nombre o unidad de punto'; - - $lang->level_point = 'Nivel del punto'; - $lang->about_level_point = 'El nivel sera ajustado cuando los puntos alcancen a cada nivel de puntos o cuando disminuyen a cada nivel de puntos'; - - $lang->disable_download = 'Prohibida la descarga'; - $lang->about_disable_download = "Se prohibe la descarga de archivos al tener los puntos insuficientes.. (Excepto los archivos de imagen)"; - $lang->disable_read_document = '글 열람 금지'; - $lang->about_disable_read_document = '포인트가 없을 경우 글 열람을 금지하게 됩니다'; - - $lang->level_point_calc = 'Punto por punto cálculo'; - $lang->expression = 'Por favor, de entrada mediante el uso de Javascript fórmula nivel variable i . Ex) Math.pow (i, 2) * 90'; - $lang->cmd_exp_calc = 'Calcular'; - $lang->cmd_exp_reset = 'Restablecer'; - - $lang->cmd_point_recal = '포인트 초기화'; - $lang->about_cmd_point_recal = '게시글/댓글/첨부파일/회원가입 점수만 이용하여 모든 포인트 점수를 초기화 합니다.
    회원 가입 점수는 초기화 후 해당 회원이 활동을 하면 부여되고 그 전에는 부여되지 않습니다.
    데이터 이전등을 하여 포인트를 완전히 초기화 해야 할 경우에만 사용하세요.'; - - $lang->point_link_group = 'Grupo de cambio de nivel'; - $lang->point_group_reset_and_add = '설정된 그룹 초기화 후 새 그룹 부여'; - $lang->point_group_add_only = '새 그룹만 부여'; - $lang->about_point_link_group = 'Si especifica nivel para un grupo específico, a los usuarios se les asigna en el grupo cuando se adavnce al nivel por conseguir puntos.'; - - $lang->about_module_point = "Usted puede definir los puntos para cada módulo y los módulos que no tengan ningun valor usarán punto predefinido.
    Todos los puntos serán restituidos al actuar en forma contraria."; - - $lang->point_signup = 'Fecha del'; - $lang->point_insert_document = 'Al escribir documento'; - $lang->point_delete_document = 'Al borrar documento'; - $lang->point_insert_comment = 'Al agregar comentarios'; - $lang->point_delete_comment = 'Al eliminar comentarios'; - $lang->point_upload_file = 'Al subri archivos'; - $lang->point_delete_file = 'Al borrar archivos'; - $lang->point_download_file = 'Al descargar archivos (Excepto imágenes)'; - $lang->point_read_document = 'El Reading'; - $lang->point_voted = '추천 받음'; - $lang->point_blamed = '비추천 받음'; - - - $lang->cmd_point_config = 'Configuración predefinida'; - $lang->cmd_point_module_config = 'Configuración del módulo'; - $lang->cmd_point_act_config = 'Configuración de actos'; - $lang->cmd_point_member_list = 'Lista de puntos del usuario'; - - $lang->msg_cannot_download = "No tiene puntos suficientes para descagar"; - $lang->msg_disallow_by_point = "포인트가 부족하여 글을 읽을 수 없습니다 (필요포인트 : %d, 현재포인트 : %d)"; - - $lang->point_recal_message = 'Ajuste de Punto. (%d / %d)'; - $lang->point_recal_finished = 'Punto cálculo está acabado.'; -?> +point = "Punto"; + $lang->level = "Nivel"; + + $lang->about_point_module = "Usted puede entregar puntos a las acciones de escribir/agregar comentarios/subir/descargar."; + $lang->about_act_config = "Cada módulo ya sea el tablero o blog tiene sus propias actiones como escribir/eliminar/agregar comentarios/eliminar comentarios/etc.
    Usted puede añadir valores de actos para enlazar con sistema de módulo de puntos excepto el tablero y blog.
    El enlace debe hacerse con una coma(,)."; + + $lang->max_level = 'Nivel Máximo'; + $lang->about_max_level = 'Usted puede definir el nivel máximo. Los íconos del nivel deberan ser considerados y el nivel máximo de puntos límite es 1000'; + + $lang->level_icon = 'Iconos del nivel'; + $lang->about_level_icon = 'Ruta de íconos del nivel es ./module/point/icons/[level].gif y el nivel máximo puede ser diferente con el conjunto de íconos. Tenga cuidado'; + + $lang->point_name = 'Nombre del punto'; + $lang->about_point_name = 'Usted puede otorgar nombre o unidad de punto'; + + $lang->level_point = 'Nivel del punto'; + $lang->about_level_point = 'El nivel sera ajustado cuando los puntos alcancen a cada nivel de puntos o cuando disminuyen a cada nivel de puntos'; + + $lang->disable_download = 'Prohibida la descarga'; + $lang->about_disable_download = "Se prohibe la descarga de archivos al tener los puntos insuficientes.. (Excepto los archivos de imagen)"; + $lang->disable_read_document = '글 열람 금지'; + $lang->about_disable_read_document = '포인트가 없을 경우 글 열람을 금지하게 됩니다'; + + $lang->level_point_calc = 'Punto por punto cálculo'; + $lang->expression = 'Por favor, de entrada mediante el uso de Javascript fórmula nivel variable i . Ex) Math.pow (i, 2) * 90'; + $lang->cmd_exp_calc = 'Calcular'; + $lang->cmd_exp_reset = 'Restablecer'; + + $lang->cmd_point_recal = '포인트 초기화'; + $lang->about_cmd_point_recal = '게시글/댓글/첨부파일/회원가입 점수만 이용하여 모든 포인트 점수를 초기화 합니다.
    회원 가입 점수는 초기화 후 해당 회원이 활동을 하면 부여되고 그 전에는 부여되지 않습니다.
    데이터 이전등을 하여 포인트를 완전히 초기화 해야 할 경우에만 사용하세요.'; + + $lang->point_link_group = 'Grupo de cambio de nivel'; + $lang->point_group_reset_and_add = '설정된 그룹 초기화 후 새 그룹 부여'; + $lang->point_group_add_only = '새 그룹만 부여'; + $lang->about_point_link_group = 'Si especifica nivel para un grupo específico, a los usuarios se les asigna en el grupo cuando se adavnce al nivel por conseguir puntos.'; + + $lang->about_module_point = "Usted puede definir los puntos para cada módulo y los módulos que no tengan ningun valor usarán punto predefinido.
    Todos los puntos serán restituidos al actuar en forma contraria."; + + $lang->point_signup = 'Fecha del'; + $lang->point_insert_document = 'Al escribir documento'; + $lang->point_delete_document = 'Al borrar documento'; + $lang->point_insert_comment = 'Al agregar comentarios'; + $lang->point_delete_comment = 'Al eliminar comentarios'; + $lang->point_upload_file = 'Al subri archivos'; + $lang->point_delete_file = 'Al borrar archivos'; + $lang->point_download_file = 'Al descargar archivos (Excepto imágenes)'; + $lang->point_read_document = 'El Reading'; + $lang->point_voted = '추천 받음'; + $lang->point_blamed = '비추천 받음'; + + + $lang->cmd_point_config = 'Configuración predefinida'; + $lang->cmd_point_module_config = 'Configuración del módulo'; + $lang->cmd_point_act_config = 'Configuración de actos'; + $lang->cmd_point_member_list = 'Lista de puntos del usuario'; + + $lang->msg_cannot_download = "No tiene puntos suficientes para descagar"; + $lang->msg_disallow_by_point = "포인트가 부족하여 글을 읽을 수 없습니다 (필요포인트 : %d, 현재포인트 : %d)"; + + $lang->point_recal_message = 'Ajuste de Punto. (%d / %d)'; + $lang->point_recal_finished = 'Punto cálculo está acabado.'; +?> diff --git a/modules/point/lang/fr.lang.php b/modules/point/lang/fr.lang.php index 2da5826d2..8ce1c2e25 100644 --- a/modules/point/lang/fr.lang.php +++ b/modules/point/lang/fr.lang.php @@ -1,69 +1,69 @@ - - * @brief Paquet du langage en français pour le module de Point - **/ - - $lang->point = "Point"; - $lang->level = "Niveau"; - - $lang->about_point_module = "Vous pouvez donnez des poins sur l'action d'écrire/d'ajouter commentaire/de télécharger vers le serveur/de télécharger vers le PC etc."; - $lang->about_act_config = "Chaque module comme celui de panneau ou de blogue a les actions propres comme \"écrire/supprimer/ajouter un commentaire/supprimer un commentaire\".
    Vous pouvez ajouter seulement les valeurs des actions pour appliquer le Système de Point au module excepté celui de panneau ou de blogue.
    Vous pouvez délimiter chaque valeur avec virgule(,)."; - - $lang->max_level = 'Niveau le plus haut'; - $lang->about_max_level = 'Vous pouvez configurer le niveau le plus haut. Les icônes des niveaux doit être réflechissés et le niveau de 1 000 est la valeur maximum que vous pouvez configurer.'; - - $lang->level_icon = 'Icône de Niveau'; - $lang->about_level_icon = 'Le Chemin d\'icône est "./module/point/icons/[niveau].gif" et le niveau le plus haut peut différer de l\'ensemble des icônes. Alors faites attention, S.V.P.'; - - $lang->point_name = 'Nom de Point'; - $lang->about_point_name = 'Vous pouvez nommer le point ou configurer l\'unité du point'; - - $lang->level_point = 'Point de niveau'; - $lang->about_level_point = 'Le Niveau sera ajusté quand le point devient les valeurs aux Points de Niveaux ci-dessous.'; - - $lang->disable_download = 'Interdire de télécharger'; - $lang->about_disable_download = "Il est impossible de télécharger quand il n'y a pas de points suffisants. (Sauf les fichier d'images)"; - $lang->disable_read_document = '글 열람 금지'; - $lang->about_disable_read_document = '포인트가 없을 경우 글 열람을 금지하게 됩니다'; - - $lang->level_point_calc = 'Calcul des Points par Niveau'; - $lang->expression = 'Entrez la formule en Javascript en utilisant la Variable de Niveau i. ex) Math.pow(i, 2) * 90'; - $lang->cmd_exp_calc = 'Calculer'; - $lang->cmd_exp_reset = 'Restaurer'; - - $lang->cmd_point_recal = 'Restaurer le Point'; - $lang->about_cmd_point_recal = 'Tous les points seront recalculés basé seulement sur les points des articles/commentaires/annexes/inscription.
    Après la restauration, Les membres gagneront le point d\'inscription seulement quand il fait de l\'activité dans le site Web.
    Utilisez cette fonction seulement quand l\'initialisation complète est necessaire comme le cas de transfert des données etc.'; - - $lang->point_link_group = 'Changement du Groupe lié à celui du Niveau'; - $lang->point_group_reset_and_add = '설정된 그룹 초기화 후 새 그룹 부여'; - $lang->point_group_add_only = '새 그룹만 부여'; - $lang->about_point_link_group = 'Si vous designez un niveau à un groupe particulier, les utilisateur s sont assignés dans le groupe quand ils s\'avancent au groupe en gagnant des points.'; - - $lang->about_module_point = "Vous pouvez configurer les points pour chaque module. Le module qui n'a pas de valeurs utilisera les points par défaut.
    Tous les points seront restaurés quand on fait de l'action inverse."; - - $lang->point_signup = 'Inscription'; - $lang->point_insert_document = 'Écrire'; - $lang->point_delete_document = 'Supprimer'; - $lang->point_insert_comment = 'Ajouter un Commentaire'; - $lang->point_delete_comment = 'Supprimer un Commentaire'; - $lang->point_upload_file = 'Télécharger les Fichiers sur Serveur'; - $lang->point_delete_file = 'Supprimer un Fichier'; - $lang->point_download_file = 'Télécharger les Fichiers sur PC(Sauf des images)'; - $lang->point_read_document = 'lire'; - $lang->point_voted = 'Être Recommandé'; - $lang->point_blamed = 'Être Blâmé'; - - - $lang->cmd_point_config = 'Configuration primaire'; - $lang->cmd_point_module_config = 'Configuration du Module'; - $lang->cmd_point_act_config = 'Configuration des Actions de chaque fonction'; - $lang->cmd_point_member_list = 'Liste des Points des Membres'; - - $lang->msg_cannot_download = "Vous n'avez pas assez de point pour télécharger"; - $lang->msg_disallow_by_point = "포인트가 부족하여 글을 읽을 수 없습니다 (필요포인트 : %d, 현재포인트 : %d)"; - - $lang->point_recal_message = 'En train d\'Adjuster le Point. (%d / %d)'; - $lang->point_recal_finished = 'Recalcul des Points est fini.'; -?> + + * @brief Paquet du langage en français pour le module de Point + **/ + + $lang->point = "Point"; + $lang->level = "Niveau"; + + $lang->about_point_module = "Vous pouvez donnez des poins sur l'action d'écrire/d'ajouter commentaire/de télécharger vers le serveur/de télécharger vers le PC etc."; + $lang->about_act_config = "Chaque module comme celui de panneau ou de blogue a les actions propres comme \"écrire/supprimer/ajouter un commentaire/supprimer un commentaire\".
    Vous pouvez ajouter seulement les valeurs des actions pour appliquer le Système de Point au module excepté celui de panneau ou de blogue.
    Vous pouvez délimiter chaque valeur avec virgule(,)."; + + $lang->max_level = 'Niveau le plus haut'; + $lang->about_max_level = 'Vous pouvez configurer le niveau le plus haut. Les icônes des niveaux doit être réflechissés et le niveau de 1 000 est la valeur maximum que vous pouvez configurer.'; + + $lang->level_icon = 'Icône de Niveau'; + $lang->about_level_icon = 'Le Chemin d\'icône est "./module/point/icons/[niveau].gif" et le niveau le plus haut peut différer de l\'ensemble des icônes. Alors faites attention, S.V.P.'; + + $lang->point_name = 'Nom de Point'; + $lang->about_point_name = 'Vous pouvez nommer le point ou configurer l\'unité du point'; + + $lang->level_point = 'Point de niveau'; + $lang->about_level_point = 'Le Niveau sera ajusté quand le point devient les valeurs aux Points de Niveaux ci-dessous.'; + + $lang->disable_download = 'Interdire de télécharger'; + $lang->about_disable_download = "Il est impossible de télécharger quand il n'y a pas de points suffisants. (Sauf les fichier d'images)"; + $lang->disable_read_document = '글 열람 금지'; + $lang->about_disable_read_document = '포인트가 없을 경우 글 열람을 금지하게 됩니다'; + + $lang->level_point_calc = 'Calcul des Points par Niveau'; + $lang->expression = 'Entrez la formule en Javascript en utilisant la Variable de Niveau i. ex) Math.pow(i, 2) * 90'; + $lang->cmd_exp_calc = 'Calculer'; + $lang->cmd_exp_reset = 'Restaurer'; + + $lang->cmd_point_recal = 'Restaurer le Point'; + $lang->about_cmd_point_recal = 'Tous les points seront recalculés basé seulement sur les points des articles/commentaires/annexes/inscription.
    Après la restauration, Les membres gagneront le point d\'inscription seulement quand il fait de l\'activité dans le site Web.
    Utilisez cette fonction seulement quand l\'initialisation complète est necessaire comme le cas de transfert des données etc.'; + + $lang->point_link_group = 'Changement du Groupe lié à celui du Niveau'; + $lang->point_group_reset_and_add = '설정된 그룹 초기화 후 새 그룹 부여'; + $lang->point_group_add_only = '새 그룹만 부여'; + $lang->about_point_link_group = 'Si vous designez un niveau à un groupe particulier, les utilisateur s sont assignés dans le groupe quand ils s\'avancent au groupe en gagnant des points.'; + + $lang->about_module_point = "Vous pouvez configurer les points pour chaque module. Le module qui n'a pas de valeurs utilisera les points par défaut.
    Tous les points seront restaurés quand on fait de l'action inverse."; + + $lang->point_signup = 'Inscription'; + $lang->point_insert_document = 'Écrire'; + $lang->point_delete_document = 'Supprimer'; + $lang->point_insert_comment = 'Ajouter un Commentaire'; + $lang->point_delete_comment = 'Supprimer un Commentaire'; + $lang->point_upload_file = 'Télécharger les Fichiers sur Serveur'; + $lang->point_delete_file = 'Supprimer un Fichier'; + $lang->point_download_file = 'Télécharger les Fichiers sur PC(Sauf des images)'; + $lang->point_read_document = 'lire'; + $lang->point_voted = 'Être Recommandé'; + $lang->point_blamed = 'Être Blâmé'; + + + $lang->cmd_point_config = 'Configuration primaire'; + $lang->cmd_point_module_config = 'Configuration du Module'; + $lang->cmd_point_act_config = 'Configuration des Actions de chaque fonction'; + $lang->cmd_point_member_list = 'Liste des Points des Membres'; + + $lang->msg_cannot_download = "Vous n'avez pas assez de point pour télécharger"; + $lang->msg_disallow_by_point = "포인트가 부족하여 글을 읽을 수 없습니다 (필요포인트 : %d, 현재포인트 : %d)"; + + $lang->point_recal_message = 'En train d\'Adjuster le Point. (%d / %d)'; + $lang->point_recal_finished = 'Recalcul des Points est fini.'; +?> diff --git a/modules/point/lang/jp.lang.php b/modules/point/lang/jp.lang.php index 146418eff..bd8aaa6e4 100644 --- a/modules/point/lang/jp.lang.php +++ b/modules/point/lang/jp.lang.php @@ -1,68 +1,68 @@ -point = 'ポイント'; - $lang->level = 'レベル'; - - $lang->about_point_module = 'ポイントモジュールでは、書き込み作成/コメント作成/アップロード/ダウンロードなどのユーザの活動に対してポイントの計算を行います。'; - $lang->about_act_config = '掲示板、ブログなどのモジュールごとに「書き込み作成・削除/コメント作成・削除」などのアクションがあります。掲示板/ブログ以外のモジュールにポイントシステムを連動させたい場合は、各機能のアクションの「act値」を追加します。連動は半角「,(コンマ)」で区切って追加します。'; - - $lang->max_level = '最高レベル'; - $lang->about_max_level = '最高レベルを指定することが出来ます。最高レベルは「1000」がマクシマムなので、レベルアイコンに注意が必要です。'; - - $lang->level_icon = 'レベルアイコン'; - $lang->about_level_icon = 'レベルアイコンは、「./modules/point/icons/レベル.gif」で指定されるため、最高レベルとアイコンセットが異なる場合があります。ご注意下さい。'; - - $lang->point_name = 'ポイント名'; - $lang->about_point_name = 'ポイントの名前、単位が指定出来ます。'; - - $lang->level_point = 'レベルポイント'; - $lang->about_level_point = '下の各レベルのポイントが増加したり、減少するとレベルが調整されます。'; - - $lang->disable_download = 'ダウンロード禁止'; - $lang->about_disable_download = 'チェックするとポイントがない場合、ダウンロードを禁止します(イメージファイル除外)。'; - $lang->disable_read_document = '閲覧禁止'; - $lang->about_disable_read_document = 'ポイントがない場合、閲覧を禁止します。'; - - $lang->level_point_calc = 'レベル別ポイント計算'; - $lang->expression = 'レベル変数iを使用してJavaスクリプト数式を入力して下さい(例: Math.pow(i, 2) * 90)。'; - $lang->cmd_exp_calc = '計算'; - $lang->cmd_exp_reset = '初期化'; - - $lang->cmd_point_recal = 'ポイントの初期化'; - $lang->about_cmd_point_recal = '書き込み/コメント/添付ファイル/会員登録のポイントのみ取り、全ての他のポイントを初期化します。
    但し、会員登録ポイントは初期化後、該当会員の活動がスタートしたら付与されます。
    データ移管などによるポイントを完全に初期化する必要がある場合など、利用は慎重に行なって下さい。'; - - $lang->point_link_group = 'グループ連動'; - $lang->point_group_reset_and_add = '設定されたグループの初期化後、新規グループに付与'; - $lang->point_group_add_only = '新規グループのみ付与'; - $lang->about_point_link_group = 'グループにレベルを指定すると、該当レベルになったらグループが変更されます。'; - - $lang->about_module_point = 'モジュール別にポイントを指定することが出来ますが、指定されていないモジュールでは、デフォルトポイントが使用されます。すべてのポイント数は、反対のアクションを行った際には原状復帰されます。'; - - $lang->point_signup = '加入'; - $lang->point_insert_document = '書き込み作成'; - $lang->point_delete_document = '書き込み削除'; - $lang->point_insert_comment = 'コメント作成'; - $lang->point_delete_comment = 'コメント削除'; - $lang->point_upload_file = 'アップロード'; - $lang->point_delete_file = 'ファイル削除'; - $lang->point_download_file = 'ダウンロード'; - $lang->point_read_document = '書き込み閲覧'; - $lang->point_voted = '推薦'; - $lang->point_blamed = '非推薦'; - - $lang->cmd_point_config = 'デフォルト設定'; - $lang->cmd_point_module_config = 'モジュール別設定'; - $lang->cmd_point_act_config = '機能別アクション設定'; - $lang->cmd_point_member_list = '会員ポイントリスト'; - - $lang->msg_cannot_download = 'ポイントが不足しているため、ダウンロード出来ません。'; - $lang->msg_disallow_by_point = "ポイントが不足しているため、閲覧が出来ません。(必要ポイント : %d、 保有ポイント : %d)"; - - $lang->point_recal_message = 'ただ今ポイントを適用しています。 (%d / %d)'; - $lang->point_recal_finished = 'ポイント再計算が完了しました。'; -?> +point = 'ポイント'; + $lang->level = 'レベル'; + + $lang->about_point_module = 'ポイントモジュールでは、書き込み作成/コメント作成/アップロード/ダウンロードなどのユーザの活動に対してポイントの計算を行います。'; + $lang->about_act_config = '掲示板、ブログなどのモジュールごとに「書き込み作成・削除/コメント作成・削除」などのアクションがあります。掲示板/ブログ以外のモジュールにポイントシステムを連動させたい場合は、各機能のアクションの「act値」を追加します。連動は半角「,(コンマ)」で区切って追加します。'; + + $lang->max_level = '最高レベル'; + $lang->about_max_level = '最高レベルを指定することが出来ます。最高レベルは「1000」がマクシマムなので、レベルアイコンに注意が必要です。'; + + $lang->level_icon = 'レベルアイコン'; + $lang->about_level_icon = 'レベルアイコンは、「./modules/point/icons/レベル.gif」で指定されるため、最高レベルとアイコンセットが異なる場合があります。ご注意下さい。'; + + $lang->point_name = 'ポイント名'; + $lang->about_point_name = 'ポイントの名前、単位が指定出来ます。'; + + $lang->level_point = 'レベルポイント'; + $lang->about_level_point = '下の各レベルのポイントが増加したり、減少するとレベルが調整されます。'; + + $lang->disable_download = 'ダウンロード禁止'; + $lang->about_disable_download = 'チェックするとポイントがない場合、ダウンロードを禁止します(イメージファイル除外)。'; + $lang->disable_read_document = '閲覧禁止'; + $lang->about_disable_read_document = 'ポイントがない場合、閲覧を禁止します。'; + + $lang->level_point_calc = 'レベル別ポイント計算'; + $lang->expression = 'レベル変数iを使用してJavaスクリプト数式を入力して下さい(例: Math.pow(i, 2) * 90)。'; + $lang->cmd_exp_calc = '計算'; + $lang->cmd_exp_reset = '初期化'; + + $lang->cmd_point_recal = 'ポイントの初期化'; + $lang->about_cmd_point_recal = '書き込み/コメント/添付ファイル/会員登録のポイントのみ取り、全ての他のポイントを初期化します。
    但し、会員登録ポイントは初期化後、該当会員の活動がスタートしたら付与されます。
    データ移管などによるポイントを完全に初期化する必要がある場合など、利用は慎重に行なって下さい。'; + + $lang->point_link_group = 'グループ連動'; + $lang->point_group_reset_and_add = '設定されたグループの初期化後、新規グループに付与'; + $lang->point_group_add_only = '新規グループのみ付与'; + $lang->about_point_link_group = 'グループにレベルを指定すると、該当レベルになったらグループが変更されます。'; + + $lang->about_module_point = 'モジュール別にポイントを指定することが出来ますが、指定されていないモジュールでは、デフォルトポイントが使用されます。すべてのポイント数は、反対のアクションを行った際には原状復帰されます。'; + + $lang->point_signup = '加入'; + $lang->point_insert_document = '書き込み作成'; + $lang->point_delete_document = '書き込み削除'; + $lang->point_insert_comment = 'コメント作成'; + $lang->point_delete_comment = 'コメント削除'; + $lang->point_upload_file = 'アップロード'; + $lang->point_delete_file = 'ファイル削除'; + $lang->point_download_file = 'ダウンロード'; + $lang->point_read_document = '書き込み閲覧'; + $lang->point_voted = '推薦'; + $lang->point_blamed = '非推薦'; + + $lang->cmd_point_config = 'デフォルト設定'; + $lang->cmd_point_module_config = 'モジュール別設定'; + $lang->cmd_point_act_config = '機能別アクション設定'; + $lang->cmd_point_member_list = '会員ポイントリスト'; + + $lang->msg_cannot_download = 'ポイントが不足しているため、ダウンロード出来ません。'; + $lang->msg_disallow_by_point = "ポイントが不足しているため、閲覧が出来ません。(必要ポイント : %d、 保有ポイント : %d)"; + + $lang->point_recal_message = 'ただ今ポイントを適用しています。 (%d / %d)'; + $lang->point_recal_finished = 'ポイント再計算が完了しました。'; +?> diff --git a/modules/point/lang/ko.lang.php b/modules/point/lang/ko.lang.php index 685c0139e..b55d89f32 100644 --- a/modules/point/lang/ko.lang.php +++ b/modules/point/lang/ko.lang.php @@ -1,68 +1,68 @@ -point = '포인트'; - $lang->level = '레벨'; - - $lang->about_point_module = '포인트 모듈은 글 작성/댓글작성/업로드/다운로드 등의 행동을 할 때 포인트를 부여할 수 있게 합니다.'; - $lang->about_act_config = '게시판, 블로그 등 각 모듈마다 글 작성/삭제/댓글작성/삭제 등의 action이 있습니다.
    게시판/블로그 외에 다른 모듈에 포인트 기능 연동을 하고 싶을 때는 각 기능에 맞는 act값을 추가 하시면 됩니다.
    연결은 ,(콤마)로 하시면 됩니다.'; - - $lang->max_level = '최고 레벨'; - $lang->about_max_level = '최고레벨을 지정할 수 있습니다. 레벨 아이콘을 염두에 두셔야 하고 최고 레벨은 1000이 한계입니다.'; - - $lang->level_icon = '레벨 아이콘'; - $lang->about_level_icon = '레벨 아이콘은 ./modules/point/icons/레벨.gif 로 지정되며 최고레벨과 아이콘셋이 다를 수 있으니 주의해주세요!'; - - $lang->point_name = '포인트 명칭'; - $lang->about_point_name = '포인트 이름이나 단위를 정할 수 있습니다.'; - - $lang->level_point = '레벨 포인트'; - $lang->about_level_point = '각 회원의 포인트가 아래 레벨별 포인트에 도달하거나 미달하게 되면 해당 회원의 레벨이 조절됩니다.'; - - $lang->disable_download = '다운로드 금지'; - $lang->about_disable_download = '포인트가 부족할 경우 다운로드를 금지 합니다. (이미지 파일, 동영상 파일등 직접 링크가 가능한 파일들은 예외입니다.)'; - $lang->disable_read_document = '글 열람 금지'; - $lang->about_disable_read_document = '포인트가 부족할 경우 글 열람을 금지 합니다'; - - $lang->level_point_calc = '레벨별 포인트 계산'; - $lang->expression = '레벨 변수 i를 사용하여 자바스크립트 수식을 입력하세요. 예: Math.pow(i, 2) * 90'; - $lang->cmd_exp_calc = '계산'; - $lang->cmd_exp_reset = '초기화'; - - $lang->cmd_point_recal = '포인트 초기화'; - $lang->about_cmd_point_recal = '게시글/댓글/첨부파일/회원가입 점수만 이용하여 모든 포인트 점수를 초기화 합니다.
    회원 가입 점수는 초기화 후 해당 회원이 활동을 하면 부여되고 그 전에는 부여되지 않습니다.
    데이터 이전 등을 하여 포인트를 완전히 초기화해야 할 경우에만 사용하세요.'; - - $lang->point_link_group = '그룹 연동'; - $lang->point_group_reset_and_add = '설정된 그룹 초기화 후 새 그룹 부여'; - $lang->point_group_add_only = '새 그룹만 부여'; - $lang->about_point_link_group = '그룹에 원하는 레벨을 지정하면, 회원의 포인트가 해당 레벨의 포인트에 도달할 때 그룹이 변경됩니다.'; - - $lang->about_module_point = '모듈별 포인트를 지정할 수 있으며 지정되지 않은 모듈은 기본 포인트를 이용합니다.
    모든 점수는 반대 행동을 하였을 경우 원상복구 됩니다.'; - - $lang->point_signup = '가입'; - $lang->point_insert_document = '글 작성'; - $lang->point_delete_document = '글 삭제'; - $lang->point_insert_comment = '댓글 작성'; - $lang->point_delete_comment = '댓글 삭제'; - $lang->point_upload_file = '파일 업로드'; - $lang->point_delete_file = '파일 삭제'; - $lang->point_download_file = '파일 다운로드 (이미지 제외)'; - $lang->point_read_document = '게시글 조회'; - $lang->point_voted = '추천 받음'; - $lang->point_blamed = '비추천 받음'; - - $lang->cmd_point_config = '기본 설정'; - $lang->cmd_point_module_config = '모듈별 설정'; - $lang->cmd_point_act_config = '기능별 act 설정'; - $lang->cmd_point_member_list = '회원 포인트 목록'; - - $lang->msg_cannot_download = '포인트가 부족하여 다운로드를 하실 수 없습니다.'; - $lang->msg_disallow_by_point = "포인트가 부족하여 글을 읽으실 수 없습니다. (필요한 포인트 : %d, 현재 포인트 : %d)"; - - $lang->point_recal_message = '포인트 적용중입니다. (%d / %d)'; - $lang->point_recal_finished = '포인트 재계산이 완료되었습니다.'; -?> +point = '포인트'; + $lang->level = '레벨'; + + $lang->about_point_module = '포인트 모듈은 글 작성/댓글작성/업로드/다운로드 등의 행동을 할 때 포인트를 부여할 수 있게 합니다.'; + $lang->about_act_config = '게시판, 블로그 등 각 모듈마다 글 작성/삭제/댓글작성/삭제 등의 action이 있습니다.
    게시판/블로그 외에 다른 모듈에 포인트 기능 연동을 하고 싶을 때는 각 기능에 맞는 act값을 추가 하시면 됩니다.
    연결은 ,(콤마)로 하시면 됩니다.'; + + $lang->max_level = '최고 레벨'; + $lang->about_max_level = '최고레벨을 지정할 수 있습니다. 레벨 아이콘을 염두에 두셔야 하고 최고 레벨은 1000이 한계입니다.'; + + $lang->level_icon = '레벨 아이콘'; + $lang->about_level_icon = '레벨 아이콘은 ./modules/point/icons/레벨.gif 로 지정되며 최고레벨과 아이콘셋이 다를 수 있으니 주의해주세요!'; + + $lang->point_name = '포인트 명칭'; + $lang->about_point_name = '포인트 이름이나 단위를 정할 수 있습니다.'; + + $lang->level_point = '레벨 포인트'; + $lang->about_level_point = '각 회원의 포인트가 아래 레벨별 포인트에 도달하거나 미달하게 되면 해당 회원의 레벨이 조절됩니다.'; + + $lang->disable_download = '다운로드 금지'; + $lang->about_disable_download = '포인트가 부족할 경우 다운로드를 금지 합니다. (이미지 파일, 동영상 파일등 직접 링크가 가능한 파일들은 예외입니다.)'; + $lang->disable_read_document = '글 열람 금지'; + $lang->about_disable_read_document = '포인트가 부족할 경우 글 열람을 금지 합니다'; + + $lang->level_point_calc = '레벨별 포인트 계산'; + $lang->expression = '레벨 변수 i를 사용하여 자바스크립트 수식을 입력하세요. 예: Math.pow(i, 2) * 90'; + $lang->cmd_exp_calc = '계산'; + $lang->cmd_exp_reset = '초기화'; + + $lang->cmd_point_recal = '포인트 초기화'; + $lang->about_cmd_point_recal = '게시글/댓글/첨부파일/회원가입 점수만 이용하여 모든 포인트 점수를 초기화 합니다.
    회원 가입 점수는 초기화 후 해당 회원이 활동을 하면 부여되고 그 전에는 부여되지 않습니다.
    데이터 이전 등을 하여 포인트를 완전히 초기화해야 할 경우에만 사용하세요.'; + + $lang->point_link_group = '그룹 연동'; + $lang->point_group_reset_and_add = '설정된 그룹 초기화 후 새 그룹 부여'; + $lang->point_group_add_only = '새 그룹만 부여'; + $lang->about_point_link_group = '그룹에 원하는 레벨을 지정하면, 회원의 포인트가 해당 레벨의 포인트에 도달할 때 그룹이 변경됩니다.'; + + $lang->about_module_point = '모듈별 포인트를 지정할 수 있으며 지정되지 않은 모듈은 기본 포인트를 이용합니다.
    모든 점수는 반대 행동을 하였을 경우 원상복구 됩니다.'; + + $lang->point_signup = '가입'; + $lang->point_insert_document = '글 작성'; + $lang->point_delete_document = '글 삭제'; + $lang->point_insert_comment = '댓글 작성'; + $lang->point_delete_comment = '댓글 삭제'; + $lang->point_upload_file = '파일 업로드'; + $lang->point_delete_file = '파일 삭제'; + $lang->point_download_file = '파일 다운로드 (이미지 제외)'; + $lang->point_read_document = '게시글 조회'; + $lang->point_voted = '추천 받음'; + $lang->point_blamed = '비추천 받음'; + + $lang->cmd_point_config = '기본 설정'; + $lang->cmd_point_module_config = '모듈별 설정'; + $lang->cmd_point_act_config = '기능별 act 설정'; + $lang->cmd_point_member_list = '회원 포인트 목록'; + + $lang->msg_cannot_download = '포인트가 부족하여 다운로드를 하실 수 없습니다.'; + $lang->msg_disallow_by_point = "포인트가 부족하여 글을 읽으실 수 없습니다. (필요한 포인트 : %d, 현재 포인트 : %d)"; + + $lang->point_recal_message = '포인트 적용중입니다. (%d / %d)'; + $lang->point_recal_finished = '포인트 재계산이 완료되었습니다.'; +?> diff --git a/modules/point/lang/ru.lang.php b/modules/point/lang/ru.lang.php index 7cd7ff58a..4c5ff441f 100644 --- a/modules/point/lang/ru.lang.php +++ b/modules/point/lang/ru.lang.php @@ -1,69 +1,69 @@ -point = "Поинты"; - $lang->level = "Уровень"; - - $lang->about_point_module = "Вы можете распределять поинты за написание/добавление комментариев, закачку/скачку файлов."; - $lang->about_act_config = "Каждый модуль, такой как форум/блог, имеет имеет свои действия, такие как\"написание/удаление/добавление комментариев/удаление комментариев\".
    Вы можете просто добавить значения действий, чтобы связать ситему поинтов, за исключением форума/блога.
    Запятая(,) используется как разделитель значений."; - - $lang->max_level = 'Макс. уровень'; - $lang->about_max_level = 'Вы можете установить максимальный уровень. Иконки уровней должны быть присвоены. (макс. значение равно 1000)'; - - $lang->level_icon = 'Иконка уровня'; - $lang->about_level_icon = 'Путь иконок уровней "./module/point/icons/[level].gif" и максимальный уровень может меняться с набором иконок. Поэтому будте осторожны'; - - $lang->point_name = 'Имя поинта'; - $lang->about_point_name = 'Вы можете дать имя или единицу измерения для поинта'; - - $lang->level_point = 'Уровень поинтов'; - $lang->about_level_point = 'Уровень будет изменен, когда поинты достигают каждого уровня поинтов или падают ниже его'; - - $lang->disable_download = 'Запретить скачивание'; - $lang->about_disable_download = "Это запретит скачивание файлов, когда не хватает достаточного кол-ва поинтов. (За исключением файлов изображений)"; - $lang->disable_read_document = '글 열람 금지'; - $lang->about_disable_read_document = '포인트가 없을 경우 글 열람을 금지하게 됩니다'; - - $lang->level_point_calc = '레벨별 포인트 계산'; - $lang->expression = '레벨 변수 i를 사용하여 자바스크립트 수식을 입력하세요. 예: Math.pow(i, 2) * 90'; - $lang->cmd_exp_calc = '계산'; - $lang->cmd_exp_reset = '초기화'; - - $lang->cmd_point_recal = '포인트 초기화'; - $lang->about_cmd_point_recal = '게시글/댓글/첨부파일/회원가입 점수만 이용하여 모든 포인트 점수를 초기화 합니다.
    회원 가입 점수는 초기화 후 해당 회원이 활동을 하면 부여되고 그 전에는 부여되지 않습니다.
    데이터 이전등을 하여 포인트를 완전히 초기화 해야 할 경우에만 사용하세요.'; - - $lang->point_link_group = '그룹 연동'; - $lang->point_group_reset_and_add = '설정된 그룹 초기화 후 새 그룹 부여'; - $lang->point_group_add_only = '새 그룹만 부여'; - $lang->about_point_link_group = '그룹에 원하는 레벨을 지정하면 해당 레벨에 도달할때 그룹이 변경됩니다.'; - - $lang->about_module_point = "Вы можете установть поинты для каждого модуля, а модули, не имеющие значения будут использовать значение по умолчанию для поинтов.
    Все поинты будут восстановлены при обратном действии."; - - $lang->point_signup = 'Присвоить'; - $lang->point_insert_document = 'При написании'; - $lang->point_delete_document = 'При удалении'; - $lang->point_insert_comment = 'При добавлении комментариев'; - $lang->point_delete_comment = 'При удалении комментариев'; - $lang->point_upload_file = 'При закачке файлов'; - $lang->point_delete_file = 'При скачке файлов'; - $lang->point_download_file = 'При скачке файлов (кроме изображений)'; - $lang->point_read_document = '게시글 조회'; - $lang->point_voted = '추천 받음'; - $lang->point_blamed = '비추천 받음'; - - - $lang->cmd_point_config = 'Настройки по умолчанию'; - $lang->cmd_point_module_config = 'Настройки модуля'; - $lang->cmd_point_act_config = 'Настройки действий'; - $lang->cmd_point_member_list = 'Список поинтов пользователей'; - - $lang->msg_cannot_download = "У Вас нет достаточного количества поитов, чтобы иметь разрешение скачивать файлы."; - $lang->msg_disallow_by_point = "포인트가 부족하여 글을 읽을 수 없습니다 (필요포인트 : %d, 현재포인트 : %d)"; - - $lang->point_recal_message = '포인트 적용중입니다. (%d / %d)'; - $lang->point_recal_finished = '포인트 재계산이 모두 완료되었습니다'; -?> +point = "Поинты"; + $lang->level = "Уровень"; + + $lang->about_point_module = "Вы можете распределять поинты за написание/добавление комментариев, закачку/скачку файлов."; + $lang->about_act_config = "Каждый модуль, такой как форум/блог, имеет имеет свои действия, такие как\"написание/удаление/добавление комментариев/удаление комментариев\".
    Вы можете просто добавить значения действий, чтобы связать ситему поинтов, за исключением форума/блога.
    Запятая(,) используется как разделитель значений."; + + $lang->max_level = 'Макс. уровень'; + $lang->about_max_level = 'Вы можете установить максимальный уровень. Иконки уровней должны быть присвоены. (макс. значение равно 1000)'; + + $lang->level_icon = 'Иконка уровня'; + $lang->about_level_icon = 'Путь иконок уровней "./module/point/icons/[level].gif" и максимальный уровень может меняться с набором иконок. Поэтому будте осторожны'; + + $lang->point_name = 'Имя поинта'; + $lang->about_point_name = 'Вы можете дать имя или единицу измерения для поинта'; + + $lang->level_point = 'Уровень поинтов'; + $lang->about_level_point = 'Уровень будет изменен, когда поинты достигают каждого уровня поинтов или падают ниже его'; + + $lang->disable_download = 'Запретить скачивание'; + $lang->about_disable_download = "Это запретит скачивание файлов, когда не хватает достаточного кол-ва поинтов. (За исключением файлов изображений)"; + $lang->disable_read_document = '글 열람 금지'; + $lang->about_disable_read_document = '포인트가 없을 경우 글 열람을 금지하게 됩니다'; + + $lang->level_point_calc = '레벨별 포인트 계산'; + $lang->expression = '레벨 변수 i를 사용하여 자바스크립트 수식을 입력하세요. 예: Math.pow(i, 2) * 90'; + $lang->cmd_exp_calc = '계산'; + $lang->cmd_exp_reset = '초기화'; + + $lang->cmd_point_recal = '포인트 초기화'; + $lang->about_cmd_point_recal = '게시글/댓글/첨부파일/회원가입 점수만 이용하여 모든 포인트 점수를 초기화 합니다.
    회원 가입 점수는 초기화 후 해당 회원이 활동을 하면 부여되고 그 전에는 부여되지 않습니다.
    데이터 이전등을 하여 포인트를 완전히 초기화 해야 할 경우에만 사용하세요.'; + + $lang->point_link_group = '그룹 연동'; + $lang->point_group_reset_and_add = '설정된 그룹 초기화 후 새 그룹 부여'; + $lang->point_group_add_only = '새 그룹만 부여'; + $lang->about_point_link_group = '그룹에 원하는 레벨을 지정하면 해당 레벨에 도달할때 그룹이 변경됩니다.'; + + $lang->about_module_point = "Вы можете установть поинты для каждого модуля, а модули, не имеющие значения будут использовать значение по умолчанию для поинтов.
    Все поинты будут восстановлены при обратном действии."; + + $lang->point_signup = 'Присвоить'; + $lang->point_insert_document = 'При написании'; + $lang->point_delete_document = 'При удалении'; + $lang->point_insert_comment = 'При добавлении комментариев'; + $lang->point_delete_comment = 'При удалении комментариев'; + $lang->point_upload_file = 'При закачке файлов'; + $lang->point_delete_file = 'При скачке файлов'; + $lang->point_download_file = 'При скачке файлов (кроме изображений)'; + $lang->point_read_document = '게시글 조회'; + $lang->point_voted = '추천 받음'; + $lang->point_blamed = '비추천 받음'; + + + $lang->cmd_point_config = 'Настройки по умолчанию'; + $lang->cmd_point_module_config = 'Настройки модуля'; + $lang->cmd_point_act_config = 'Настройки действий'; + $lang->cmd_point_member_list = 'Список поинтов пользователей'; + + $lang->msg_cannot_download = "У Вас нет достаточного количества поитов, чтобы иметь разрешение скачивать файлы."; + $lang->msg_disallow_by_point = "포인트가 부족하여 글을 읽을 수 없습니다 (필요포인트 : %d, 현재포인트 : %d)"; + + $lang->point_recal_message = '포인트 적용중입니다. (%d / %d)'; + $lang->point_recal_finished = '포인트 재계산이 모두 완료되었습니다'; +?> diff --git a/modules/point/lang/tr.lang.php b/modules/point/lang/tr.lang.php index 5e60f0c73..8e38b4fb1 100644 --- a/modules/point/lang/tr.lang.php +++ b/modules/point/lang/tr.lang.php @@ -1,69 +1,69 @@ -point = "Puan"; - $lang->level = "Seviye"; - - $lang->about_point_module = "Yazmaya/silmeye, yorum eklemeye/yorum silmeye puan atayabilirsiniz."; - $lang->about_act_config = "Pano/blog gibi her modülün, \"yazma/silme/yorum ekleme/yorum silme gibi kendi eylemleri bulunmaktadır. \".
    Pano/blog harici, puan sistemli link modüllerine davranış değerleri ekleyebilirsiniz.
    Virgül(,) çoklu değerleri ayıracaktır."; - - $lang->max_level = 'Azami Seviye'; - $lang->about_max_level = 'Azami seviyeyi ayarlayabilirsiniz. Seviye simgelerine değer verirken dikkate alınmalıdır. Verebileceğiniz en yüksek değer 1000dir.'; - - $lang->level_icon = 'Seviye Simgesi'; - $lang->about_level_icon = 'Seviye simgesi yolu "./module/point/icons/[seviye].gif" olmalıdır. Azami seviye farklı simge setiyle gösterilebilir. Bu yüzden lütfen dikkatli olunuz.'; - - $lang->point_name = 'Puan Adı'; - $lang->about_point_name = 'Puan için bir isim veya birim belirleyebilirsiniz'; - - $lang->level_point = 'Seviye Puanı'; - $lang->about_level_point = 'Puan herhangi bir seviyeye gelince veya bir puan seviyesinin altına düşünce, seviye otomatik ayarlanacaktır.'; - - $lang->disable_download = 'İndirmeleri Yasakla'; - $lang->about_disable_download = "Yeterli puan olmadığı zaman indirme yapamayacaklardır. (Resim dosyaları harici)"; - $lang->disable_read_document = 'Okumayı Yasakla'; - $lang->about_disable_read_document = 'Kullanıcıların yeterli puanı olmadığında, makaleleri okuyamayacaklardır.'; - - $lang->level_point_calc = 'Puan başına Puan Hesaplaması'; - $lang->expression = 'Lütfen seviye değişkenini kullanarak Javascript formülü ekleyiniz . örn) Math.pow(i, 2) * 90'; - $lang->cmd_exp_calc = 'Hesapla'; - $lang->cmd_exp_reset = 'Sıfırla'; - - $lang->cmd_point_recal = 'Puan Sıfırla'; - $lang->about_cmd_point_recal = 'Sadece makalelerdeki/yorumlardaki/eklerdeki/katılımlardaki tüm puanlar sıfırlanacaktır.
    Sıfırlamadan sonra sadece, website aktiviteleri yapan üyeler, giriş puanı alacaklardır.
    Lütfen bu özelliği sadece veri taşıma veya cidden gerekliliği olduğu durumlarda kullanınız.'; - - $lang->point_link_group = 'Seviyeye Göre Grup Değiştirme'; - $lang->point_group_reset_and_add = 'Düzenlenmiş grupları sıfırla ve yeni gruplar ekle'; - $lang->point_group_add_only = 'Sadece yeni gruplara'; - $lang->about_point_link_group = 'Belirli bir grup için seviye belirliyorsanız, kullanıcılar gruba o seviyenin puanına eriştiklerinde atanacaklardır.'; - - $lang->about_module_point = "Her modül için puan ayarlayabilirsiniz. Hiçbir değer atanmayan modüller varsayılan puan sistemini kullanacaktır.
    Tersi hareket durumunda tüm puanlar iade edilecektir."; - - $lang->point_signup = 'Kayıt Olmaya'; - $lang->point_insert_document = 'Yazıya'; - $lang->point_delete_document = 'Silmeye'; - $lang->point_insert_comment = 'Yorum Eklemeye'; - $lang->point_delete_comment = 'Yorum Silmeye'; - $lang->point_upload_file = 'Karşıya Yüklemeye (upload)'; - $lang->point_delete_file = 'Dosyaları Silmeye'; - $lang->point_download_file = 'Dosyaları İndirmeye (resimler hariç)'; - $lang->point_read_document = 'Okumaya'; - $lang->point_voted = 'Önerilene'; - $lang->point_blamed = 'Suçlanana'; - - - $lang->cmd_point_config = 'Varsayılan Ayar'; - $lang->cmd_point_module_config = 'Modül Ayarı'; - $lang->cmd_point_act_config = 'Eylem Ayarı'; - $lang->cmd_point_member_list = 'Üye Puan listesi'; - - $lang->msg_cannot_download = "İndirmek için yeteri puanınız bulunmamaktadır"; - $lang->msg_disallow_by_point = "Makaleyi okumak için daha fazla puana ihtiyacınız var (%d lazımken, %d puanınız var)"; - - $lang->point_recal_message = 'Puan Düzeltiliyor. (%d / %d)'; - $lang->point_recal_finished = 'Puan tekrar hesaplaması bitti.'; -?> +point = "Puan"; + $lang->level = "Seviye"; + + $lang->about_point_module = "Yazmaya/silmeye, yorum eklemeye/yorum silmeye puan atayabilirsiniz."; + $lang->about_act_config = "Pano/blog gibi her modülün, \"yazma/silme/yorum ekleme/yorum silme gibi kendi eylemleri bulunmaktadır. \".
    Pano/blog harici, puan sistemli link modüllerine davranış değerleri ekleyebilirsiniz.
    Virgül(,) çoklu değerleri ayıracaktır."; + + $lang->max_level = 'Azami Seviye'; + $lang->about_max_level = 'Azami seviyeyi ayarlayabilirsiniz. Seviye simgelerine değer verirken dikkate alınmalıdır. Verebileceğiniz en yüksek değer 1000dir.'; + + $lang->level_icon = 'Seviye Simgesi'; + $lang->about_level_icon = 'Seviye simgesi yolu "./module/point/icons/[seviye].gif" olmalıdır. Azami seviye farklı simge setiyle gösterilebilir. Bu yüzden lütfen dikkatli olunuz.'; + + $lang->point_name = 'Puan Adı'; + $lang->about_point_name = 'Puan için bir isim veya birim belirleyebilirsiniz'; + + $lang->level_point = 'Seviye Puanı'; + $lang->about_level_point = 'Puan herhangi bir seviyeye gelince veya bir puan seviyesinin altına düşünce, seviye otomatik ayarlanacaktır.'; + + $lang->disable_download = 'İndirmeleri Yasakla'; + $lang->about_disable_download = "Yeterli puan olmadığı zaman indirme yapamayacaklardır. (Resim dosyaları harici)"; + $lang->disable_read_document = 'Okumayı Yasakla'; + $lang->about_disable_read_document = 'Kullanıcıların yeterli puanı olmadığında, makaleleri okuyamayacaklardır.'; + + $lang->level_point_calc = 'Puan başına Puan Hesaplaması'; + $lang->expression = 'Lütfen seviye değişkenini kullanarak Javascript formülü ekleyiniz . örn) Math.pow(i, 2) * 90'; + $lang->cmd_exp_calc = 'Hesapla'; + $lang->cmd_exp_reset = 'Sıfırla'; + + $lang->cmd_point_recal = 'Puan Sıfırla'; + $lang->about_cmd_point_recal = 'Sadece makalelerdeki/yorumlardaki/eklerdeki/katılımlardaki tüm puanlar sıfırlanacaktır.
    Sıfırlamadan sonra sadece, website aktiviteleri yapan üyeler, giriş puanı alacaklardır.
    Lütfen bu özelliği sadece veri taşıma veya cidden gerekliliği olduğu durumlarda kullanınız.'; + + $lang->point_link_group = 'Seviyeye Göre Grup Değiştirme'; + $lang->point_group_reset_and_add = 'Düzenlenmiş grupları sıfırla ve yeni gruplar ekle'; + $lang->point_group_add_only = 'Sadece yeni gruplara'; + $lang->about_point_link_group = 'Belirli bir grup için seviye belirliyorsanız, kullanıcılar gruba o seviyenin puanına eriştiklerinde atanacaklardır.'; + + $lang->about_module_point = "Her modül için puan ayarlayabilirsiniz. Hiçbir değer atanmayan modüller varsayılan puan sistemini kullanacaktır.
    Tersi hareket durumunda tüm puanlar iade edilecektir."; + + $lang->point_signup = 'Kayıt Olmaya'; + $lang->point_insert_document = 'Yazıya'; + $lang->point_delete_document = 'Silmeye'; + $lang->point_insert_comment = 'Yorum Eklemeye'; + $lang->point_delete_comment = 'Yorum Silmeye'; + $lang->point_upload_file = 'Karşıya Yüklemeye (upload)'; + $lang->point_delete_file = 'Dosyaları Silmeye'; + $lang->point_download_file = 'Dosyaları İndirmeye (resimler hariç)'; + $lang->point_read_document = 'Okumaya'; + $lang->point_voted = 'Önerilene'; + $lang->point_blamed = 'Suçlanana'; + + + $lang->cmd_point_config = 'Varsayılan Ayar'; + $lang->cmd_point_module_config = 'Modül Ayarı'; + $lang->cmd_point_act_config = 'Eylem Ayarı'; + $lang->cmd_point_member_list = 'Üye Puan listesi'; + + $lang->msg_cannot_download = "İndirmek için yeteri puanınız bulunmamaktadır"; + $lang->msg_disallow_by_point = "Makaleyi okumak için daha fazla puana ihtiyacınız var (%d lazımken, %d puanınız var)"; + + $lang->point_recal_message = 'Puan Düzeltiliyor. (%d / %d)'; + $lang->point_recal_finished = 'Puan tekrar hesaplaması bitti.'; +?> diff --git a/modules/point/lang/vi.lang.php b/modules/point/lang/vi.lang.php index 2111d9700..97944b888 100644 --- a/modules/point/lang/vi.lang.php +++ b/modules/point/lang/vi.lang.php @@ -1,71 +1,71 @@ -point = "Điểm"; - $lang->level = "Cấp bậc"; - - $lang->about_point_module = "Bạn có thể đặt mức điểm khi thành viên gửi, thêm bài viết, bình luận, Download, Upload.
    Nhưng điểm chỉ có thể cho và tích lũy khi Addon điểm được kích hoạt."; - $lang->about_act_config = "Mỗi Module, Board hay Blog có một mức cho điểm khác nhau khi \"gửi bài, xóa bài, thêm bài, gửi bình luận, xóa bình luận\".
    Bạn có thể chỉ thêm những giá trị liên kết với hệ thống điểm vào mỗi Module Blog, Board.
    Để thêm nhiều giá trị bằng cách sử dụng dấu (,) giữa các giá trị."; - - $lang->max_level = 'Cấp bậc lớn nhất'; - $lang->about_max_level = 'Bạn có thể quy định cấp bậc lớn nhất. Kiểm tra lại Icon của cấp bậc, và bạn có thể đặt cấp bậc tối đa là 1000.'; - - $lang->level_icon = 'Icon của cấp bậc'; - $lang->about_level_icon = 'Thư mục chứa Icon của cấp bậc có dạng "./module/point/icons/[level].gif" và cấp độ lớn nhất có thể khác với bộ Icon hiện tại. Vì vậy xin hãy cẩn thận.'; - - $lang->point_name = 'Tên điểm'; - $lang->about_point_name = 'Bạn có thể đặt tên hay đặt một giá trị nào đó cho điểm.'; - - $lang->level_point = 'Điểm thăng cấp'; - $lang->about_level_point = 'Cấp độ sẽ được thay đổi khi đạt tới số điểm giới hạn.'; - - $lang->disable_download = 'Cấm Download'; - $lang->about_disable_download = "Điều này sẽ cấm thành viên Download khi không đủ điểm. (Ngoại trừ File hình ảnh)"; - $lang->disable_read_document = 'Cấm đọc bài'; - $lang->about_disable_read_document = 'Nếu số điểm không đủ, thành viên sẽ không thể đọc được bài viết.'; - - $lang->level_point_calc = 'Tính toán trên điểm'; - $lang->expression = 'Hãy nhập công thức cần sử dụng i. Ví dụ: Math.pow(i, 2) * 90'; - $lang->cmd_exp_calc = 'Tính toán'; - $lang->cmd_exp_reset = 'Thiết lập lại'; - - $lang->cmd_point_recal = 'Thiết lập lại điểm'; - $lang->about_cmd_point_recal = 'Điểm chỉ có thể có được khi gửi bài, bình luận, đính kèm và khi đăng kí.
    Chỉ có thể thiết lập lại điểm của những thành viên đã đăng kí là thành viên.
    Xin hãy chỉ sử dụng chức năng này khi bạn chuyển nội dung của Website qua một Website khác.'; - - $lang->point_link_group = 'Chuyển nhóm với cấp độ'; - $lang->point_group_reset_and_add = 'Điểm số để thăng cấp cho nhóm mới.'; - $lang->point_group_add_only = 'Chỉ cấp cho nhóm mới'; - $lang->about_point_link_group = 'Nếu bạn đặt cấp độ cho một nhóm đặc biệt nào đó, người sử dụng trong nhóm đó khi đạt đến số điểm giới hạn sẽ tự động được chuyển sang nhóm mới.'; - - $lang->about_module_point = "Bạn có thể đặt thang điểm riêng cho mỗi Module, Module nào không được đặt sẽ sử dụng sự thiết lập mặc định.
    Tất cả điểm sẽ khác khi sử dụng chức năng này."; - - $lang->point_signup = 'Khi đăng kí'; - $lang->point_insert_document = 'Khi gửi bài'; - $lang->point_delete_document = 'Khi xóa bài'; - $lang->point_insert_comment = 'Khi thêm bình luận'; - $lang->point_delete_comment = 'Khi xóa bình luận'; - $lang->point_upload_file = 'Khi Upload'; - $lang->point_delete_file = 'Khi xóa File'; - $lang->point_download_file = 'Khi Download (Trừ hình ảnh)'; - $lang->point_read_document = 'Khi đọc bài'; - $lang->point_voted = 'Khi bình chọn'; - $lang->point_blamed = 'Khi phê bình'; - - - $lang->cmd_point_config = 'Thiết lập mặc định'; - $lang->cmd_point_module_config = 'Thiết lập Module'; - $lang->cmd_point_act_config = 'Thiết lập khác'; - $lang->cmd_point_member_list = 'Danh sách điểm thành viên'; - - $lang->msg_cannot_download = "Bạn không đủ điểm để Download."; - $lang->msg_disallow_by_point = "Bạn không thể xem được bài viết vì điểm của bạn không đủ. (Điểm yêu cầu: %d, Điểm hiện tại: %d)"; - - $lang->point_recal_message = 'Điều chỉnh điểm. (%d / %d)'; - $lang->point_recal_finished = 'Đã kết thúc việc tính toán lại điểm.'; -?> +point = "Điểm"; + $lang->level = "Cấp bậc"; + + $lang->about_point_module = "Bạn có thể đặt mức điểm khi thành viên gửi, thêm bài viết, bình luận, Download, Upload.
    Nhưng điểm chỉ có thể cho và tích lũy khi Addon điểm được kích hoạt."; + $lang->about_act_config = "Mỗi Module, Board hay Blog có một mức cho điểm khác nhau khi \"gửi bài, xóa bài, thêm bài, gửi bình luận, xóa bình luận\".
    Bạn có thể chỉ thêm những giá trị liên kết với hệ thống điểm vào mỗi Module Blog, Board.
    Để thêm nhiều giá trị bằng cách sử dụng dấu (,) giữa các giá trị."; + + $lang->max_level = 'Cấp bậc lớn nhất'; + $lang->about_max_level = 'Bạn có thể quy định cấp bậc lớn nhất. Kiểm tra lại Icon của cấp bậc, và bạn có thể đặt cấp bậc tối đa là 1000.'; + + $lang->level_icon = 'Icon của cấp bậc'; + $lang->about_level_icon = 'Thư mục chứa Icon của cấp bậc có dạng "./module/point/icons/[level].gif" và cấp độ lớn nhất có thể khác với bộ Icon hiện tại. Vì vậy xin hãy cẩn thận.'; + + $lang->point_name = 'Tên điểm'; + $lang->about_point_name = 'Bạn có thể đặt tên hay đặt một giá trị nào đó cho điểm.'; + + $lang->level_point = 'Điểm thăng cấp'; + $lang->about_level_point = 'Cấp độ sẽ được thay đổi khi đạt tới số điểm giới hạn.'; + + $lang->disable_download = 'Cấm Download'; + $lang->about_disable_download = "Điều này sẽ cấm thành viên Download khi không đủ điểm. (Ngoại trừ File hình ảnh)"; + $lang->disable_read_document = 'Cấm đọc bài'; + $lang->about_disable_read_document = 'Nếu số điểm không đủ, thành viên sẽ không thể đọc được bài viết.'; + + $lang->level_point_calc = 'Tính toán trên điểm'; + $lang->expression = 'Hãy nhập công thức cần sử dụng i. Ví dụ: Math.pow(i, 2) * 90'; + $lang->cmd_exp_calc = 'Tính toán'; + $lang->cmd_exp_reset = 'Thiết lập lại'; + + $lang->cmd_point_recal = 'Thiết lập lại điểm'; + $lang->about_cmd_point_recal = 'Điểm chỉ có thể có được khi gửi bài, bình luận, đính kèm và khi đăng kí.
    Chỉ có thể thiết lập lại điểm của những thành viên đã đăng kí là thành viên.
    Xin hãy chỉ sử dụng chức năng này khi bạn chuyển nội dung của Website qua một Website khác.'; + + $lang->point_link_group = 'Chuyển nhóm với cấp độ'; + $lang->point_group_reset_and_add = 'Điểm số để thăng cấp cho nhóm mới.'; + $lang->point_group_add_only = 'Chỉ cấp cho nhóm mới'; + $lang->about_point_link_group = 'Nếu bạn đặt cấp độ cho một nhóm đặc biệt nào đó, người sử dụng trong nhóm đó khi đạt đến số điểm giới hạn sẽ tự động được chuyển sang nhóm mới.'; + + $lang->about_module_point = "Bạn có thể đặt thang điểm riêng cho mỗi Module, Module nào không được đặt sẽ sử dụng sự thiết lập mặc định.
    Tất cả điểm sẽ khác khi sử dụng chức năng này."; + + $lang->point_signup = 'Khi đăng kí'; + $lang->point_insert_document = 'Khi gửi bài'; + $lang->point_delete_document = 'Khi xóa bài'; + $lang->point_insert_comment = 'Khi thêm bình luận'; + $lang->point_delete_comment = 'Khi xóa bình luận'; + $lang->point_upload_file = 'Khi Upload'; + $lang->point_delete_file = 'Khi xóa File'; + $lang->point_download_file = 'Khi Download (Trừ hình ảnh)'; + $lang->point_read_document = 'Khi đọc bài'; + $lang->point_voted = 'Khi bình chọn'; + $lang->point_blamed = 'Khi phê bình'; + + + $lang->cmd_point_config = 'Thiết lập mặc định'; + $lang->cmd_point_module_config = 'Thiết lập Module'; + $lang->cmd_point_act_config = 'Thiết lập khác'; + $lang->cmd_point_member_list = 'Danh sách điểm thành viên'; + + $lang->msg_cannot_download = "Bạn không đủ điểm để Download."; + $lang->msg_disallow_by_point = "Bạn không thể xem được bài viết vì điểm của bạn không đủ. (Điểm yêu cầu: %d, Điểm hiện tại: %d)"; + + $lang->point_recal_message = 'Điều chỉnh điểm. (%d / %d)'; + $lang->point_recal_finished = 'Đã kết thúc việc tính toán lại điểm.'; +?> diff --git a/modules/point/lang/zh-CN.lang.php b/modules/point/lang/zh-CN.lang.php index b5790224d..12ff9a266 100644 --- a/modules/point/lang/zh-CN.lang.php +++ b/modules/point/lang/zh-CN.lang.php @@ -1,68 +1,68 @@ -point = "积分"; - $lang->level = "级别"; - - $lang->about_point_module = "积分系统可以在发表新帖及评论,上传/下载文件等动作时,付与其相应的积分的模块。"; - $lang->about_act_config = "版面,博客等模块都有发表/删除新帖,发表/删除评论等动作。
    要想与版面/博客之外的模块关联积分功能时,添加与其各模块功能相适合的act值即可。"; - - $lang->max_level = '最高级别'; - $lang->about_max_level = '可以指定最高级别。级别共设1000级,因此制作级别图标时要好好考虑一下。'; - - $lang->level_icon = '级别图标'; - $lang->about_level_icon = '级别图标要以 ./modules/point/icons/级别.gif形式指定,有时出现最高级别的图标跟您指定的最高级别图标不同的现象,敬请注意。'; - - $lang->point_name = '积分名'; - $lang->about_point_name = '可以指定积分名或积分单位。'; - - $lang->level_point = '级别积分'; - $lang->about_level_point = '积分达到或减少到下列各级别所设置的积分值时,将会自动调节相应级别。'; - - $lang->disable_download = '禁止下载'; - $lang->about_disable_download = '没有积分时,将禁止下载。 (图片除外)'; - $lang->disable_read_document = '禁止查看主题'; - $lang->about_disable_read_document = '没有积分时,将禁止查看主题。'; - - $lang->level_point_calc = '计算级别积分'; - $lang->expression = '使用级别变数"i"输入JS数学函数。例: Math.pow(i, 2) * 90'; - $lang->cmd_exp_calc = '计算'; - $lang->cmd_exp_reset = '初始化'; - - $lang->cmd_point_recal = '积分初始化'; - $lang->about_cmd_point_recal = '积分初始化。即只保留文章/评论/附件/新会员注册的相关积分项。
    其中,初始化后的新会员注册积分项,将在会员有相关动作(发表主题/评论等)时,才付与其相应的积分。
    此项功能请务必慎用!此项功能只能在数据转移或真的需要初始化所有积分时才可以使用。'; - - $lang->point_link_group = '用户组绑定'; - $lang->point_group_reset_and_add = '初始化已有用户组重新设置'; - $lang->point_group_add_only = '只应用到新用户组'; - $lang->about_point_link_group = '即级别绑定用户组。当级别达到指定级别时,会员所属用户组将自动更新为与其相对应的用户组。'; - - $lang->about_module_point = '可以分别对各模块进行积分设置,没有被设置的模块将使用默认值。
    所有积分在相反动作下恢复原始值。即:发表新帖后再删除得到的积分为0分。'; - - $lang->point_signup = '注册'; - $lang->point_insert_document = '发表新帖'; - $lang->point_delete_document = '删除主题'; - $lang->point_insert_comment = '发表评论'; - $lang->point_delete_comment = '删除评论'; - $lang->point_upload_file = '上传文件'; - $lang->point_delete_file = '删除文件'; - $lang->point_download_file = '下载文件 (图片除外)'; - $lang->point_read_document = '查看主题'; - $lang->point_voted = '推荐'; - $lang->point_blamed = '反对'; - - $lang->cmd_point_config = '常规选项'; - $lang->cmd_point_module_config = '对象模块设置'; - $lang->cmd_point_act_config = '功能act设置'; - $lang->cmd_point_member_list = '会员积分目录'; - - $lang->msg_cannot_download = '积分不足无法下载!'; - $lang->msg_disallow_by_point = "积分不够,无法查看主题。(所需积分 : %d, 当前积分 : %d)"; - - $lang->point_recal_message = '计算并应用中(%d / %d)。'; - $lang->point_recal_finished = '积分重新计算并应用完毕。'; -?> +point = "积分"; + $lang->level = "级别"; + + $lang->about_point_module = "积分系统可以在发表新帖及评论,上传/下载文件等动作时,付与其相应的积分的模块。"; + $lang->about_act_config = "版面,博客等模块都有发表/删除新帖,发表/删除评论等动作。
    要想与版面/博客之外的模块关联积分功能时,添加与其各模块功能相适合的act值即可。"; + + $lang->max_level = '最高级别'; + $lang->about_max_level = '可以指定最高级别。级别共设1000级,因此制作级别图标时要好好考虑一下。'; + + $lang->level_icon = '级别图标'; + $lang->about_level_icon = '级别图标要以 ./modules/point/icons/级别.gif形式指定,有时出现最高级别的图标跟您指定的最高级别图标不同的现象,敬请注意。'; + + $lang->point_name = '积分名'; + $lang->about_point_name = '可以指定积分名或积分单位。'; + + $lang->level_point = '级别积分'; + $lang->about_level_point = '积分达到或减少到下列各级别所设置的积分值时,将会自动调节相应级别。'; + + $lang->disable_download = '禁止下载'; + $lang->about_disable_download = '没有积分时,将禁止下载。 (图片除外)'; + $lang->disable_read_document = '禁止查看主题'; + $lang->about_disable_read_document = '没有积分时,将禁止查看主题。'; + + $lang->level_point_calc = '计算级别积分'; + $lang->expression = '使用级别变数"i"输入JS数学函数。例: Math.pow(i, 2) * 90'; + $lang->cmd_exp_calc = '计算'; + $lang->cmd_exp_reset = '初始化'; + + $lang->cmd_point_recal = '积分初始化'; + $lang->about_cmd_point_recal = '积分初始化。即只保留文章/评论/附件/新会员注册的相关积分项。
    其中,初始化后的新会员注册积分项,将在会员有相关动作(发表主题/评论等)时,才付与其相应的积分。
    此项功能请务必慎用!此项功能只能在数据转移或真的需要初始化所有积分时才可以使用。'; + + $lang->point_link_group = '用户组绑定'; + $lang->point_group_reset_and_add = '初始化已有用户组重新设置'; + $lang->point_group_add_only = '只应用到新用户组'; + $lang->about_point_link_group = '即级别绑定用户组。当级别达到指定级别时,会员所属用户组将自动更新为与其相对应的用户组。'; + + $lang->about_module_point = '可以分别对各模块进行积分设置,没有被设置的模块将使用默认值。
    所有积分在相反动作下恢复原始值。即:发表新帖后再删除得到的积分为0分。'; + + $lang->point_signup = '注册'; + $lang->point_insert_document = '发表新帖'; + $lang->point_delete_document = '删除主题'; + $lang->point_insert_comment = '发表评论'; + $lang->point_delete_comment = '删除评论'; + $lang->point_upload_file = '上传文件'; + $lang->point_delete_file = '删除文件'; + $lang->point_download_file = '下载文件 (图片除外)'; + $lang->point_read_document = '查看主题'; + $lang->point_voted = '推荐'; + $lang->point_blamed = '反对'; + + $lang->cmd_point_config = '常规选项'; + $lang->cmd_point_module_config = '对象模块设置'; + $lang->cmd_point_act_config = '功能act设置'; + $lang->cmd_point_member_list = '会员积分目录'; + + $lang->msg_cannot_download = '积分不足无法下载!'; + $lang->msg_disallow_by_point = "积分不够,无法查看主题。(所需积分 : %d, 当前积分 : %d)"; + + $lang->point_recal_message = '计算并应用中(%d / %d)。'; + $lang->point_recal_finished = '积分重新计算并应用完毕。'; +?> diff --git a/modules/point/lang/zh-TW.lang.php b/modules/point/lang/zh-TW.lang.php index c09e1d9ea..93185d25f 100644 --- a/modules/point/lang/zh-TW.lang.php +++ b/modules/point/lang/zh-TW.lang.php @@ -1,69 +1,69 @@ -point = "點數"; - $lang->level = "等級"; - - $lang->about_point_module = "點數系統可以在發表/刪除主題,發表/刪除評論,上傳/下載/刪除/檔案等動作時,付出相對應的點數。"; - $lang->about_act_config = "討論板,部落格等模組都有發表/刪除主題,發表/刪除評論等動作。
    想要與討論板/部落格之外的模組關聯點數功能時,新增與其各模組功能適合的act值即可。"; - - $lang->max_level = '最高等級'; - $lang->about_max_level = '可以指定最高等級。等級共設1000級,因此製作等級圖示時要好好考慮一下。'; - - $lang->level_icon = '等級圖示'; - $lang->about_level_icon = '等級圖示格式與位置 ./modules/point/icons/等級.gif,請注意,有時出現最高等級的圖示跟您指定的最高等級圖示不同的現象。'; - - $lang->point_name = '點數名稱'; - $lang->about_point_name = '可指定點數名稱或點數單位。'; - - $lang->level_point = '等級點數'; - $lang->about_level_point = '點數達到或減少到下列各等級所設置的點數時,將會自動調節相對應等級。'; - - $lang->disable_download = '禁止下載'; - $lang->about_disable_download = '沒有點數時,將禁止下載。(圖片除外)'; - $lang->disable_read_document = '禁止閱讀文章'; - $lang->about_disable_read_document = '沒有點數時,將禁止閱讀文章。'; - - $lang->level_point_calc = '計算等級點數'; - $lang->expression = '使用等級變數"i"輸入JS數學函數。例: Math.pow(i,2) * 90'; - $lang->cmd_exp_calc = '計算'; - $lang->cmd_exp_reset = '重置'; - - $lang->cmd_point_recal = '重置點數'; - $lang->about_cmd_point_recal = '重置點數。即只保留文章/評論/附加檔案/新會員註冊的相關點數項目。
    其中,重置後的新會員註冊點數,將在會員有相關動作(例如:發表主題/評論等)時,才付與其相對應的點數。
    此項功能請務必慎用!此項功能只能在資料轉移或真的需要重置所有點數時才可以使用。'; - - $lang->point_link_group = '自動升級'; - $lang->point_group_reset_and_add = '重新調整與新增群組'; - $lang->point_group_add_only = '只限新群組'; - $lang->about_point_link_group = '即群組隨等級變化。當等級達到指定等級時,會員所屬群組將自動更新成相對應的群組。'; - - $lang->about_module_point = '可以分別對各模組進行點數設置,沒有設置的模組將使用預設值。
    所有動作在反向操作下將恢復原始值。即:發表主題後再刪除得到的點數為零。'; - - $lang->point_signup = '註冊'; - $lang->point_insert_document = '發表主題'; - $lang->point_delete_document = '刪除主題'; - $lang->point_insert_comment = '發表評論'; - $lang->point_delete_comment = '刪除評論'; - $lang->point_upload_file = '上傳檔案'; - $lang->point_delete_file = '刪除檔案'; - $lang->point_download_file = '下載檔案 (圖片除外)'; - $lang->point_read_document = '檢視主題'; - $lang->point_voted = '推薦'; - $lang->point_blamed = '反對'; - - - $lang->cmd_point_config = '基本設置'; - $lang->cmd_point_module_config = '目標模組設置'; - $lang->cmd_point_act_config = 'Act設置'; - $lang->cmd_point_member_list = '會員點數列表'; - - $lang->msg_cannot_download = '點數不足無法下載!'; - $lang->msg_disallow_by_point = "點數不足無法閱讀文章 (需要 : %d, 目前 : %d)"; - - $lang->point_recal_message = '計算並套用中(%d / %d)。'; - $lang->point_recal_finished = '點數重新計算並套用完畢。'; -?> +point = "點數"; + $lang->level = "等級"; + + $lang->about_point_module = "點數系統可以在發表/刪除主題,發表/刪除評論,上傳/下載/刪除/檔案等動作時,付出相對應的點數。"; + $lang->about_act_config = "討論板,部落格等模組都有發表/刪除主題,發表/刪除評論等動作。
    想要與討論板/部落格之外的模組關聯點數功能時,新增與其各模組功能適合的act值即可。"; + + $lang->max_level = '最高等級'; + $lang->about_max_level = '可以指定最高等級。等級共設1000級,因此製作等級圖示時要好好考慮一下。'; + + $lang->level_icon = '等級圖示'; + $lang->about_level_icon = '等級圖示格式與位置 ./modules/point/icons/等級.gif,請注意,有時出現最高等級的圖示跟您指定的最高等級圖示不同的現象。'; + + $lang->point_name = '點數名稱'; + $lang->about_point_name = '可指定點數名稱或點數單位。'; + + $lang->level_point = '等級點數'; + $lang->about_level_point = '點數達到或減少到下列各等級所設置的點數時,將會自動調節相對應等級。'; + + $lang->disable_download = '禁止下載'; + $lang->about_disable_download = '沒有點數時,將禁止下載。(圖片除外)'; + $lang->disable_read_document = '禁止閱讀文章'; + $lang->about_disable_read_document = '沒有點數時,將禁止閱讀文章。'; + + $lang->level_point_calc = '計算等級點數'; + $lang->expression = '使用等級變數"i"輸入JS數學函數。例: Math.pow(i,2) * 90'; + $lang->cmd_exp_calc = '計算'; + $lang->cmd_exp_reset = '重置'; + + $lang->cmd_point_recal = '重置點數'; + $lang->about_cmd_point_recal = '重置點數。即只保留文章/評論/附加檔案/新會員註冊的相關點數項目。
    其中,重置後的新會員註冊點數,將在會員有相關動作(例如:發表主題/評論等)時,才付與其相對應的點數。
    此項功能請務必慎用!此項功能只能在資料轉移或真的需要重置所有點數時才可以使用。'; + + $lang->point_link_group = '自動升級'; + $lang->point_group_reset_and_add = '重新調整與新增群組'; + $lang->point_group_add_only = '只限新群組'; + $lang->about_point_link_group = '即群組隨等級變化。當等級達到指定等級時,會員所屬群組將自動更新成相對應的群組。'; + + $lang->about_module_point = '可以分別對各模組進行點數設置,沒有設置的模組將使用預設值。
    所有動作在反向操作下將恢復原始值。即:發表主題後再刪除得到的點數為零。'; + + $lang->point_signup = '註冊'; + $lang->point_insert_document = '發表主題'; + $lang->point_delete_document = '刪除主題'; + $lang->point_insert_comment = '發表評論'; + $lang->point_delete_comment = '刪除評論'; + $lang->point_upload_file = '上傳檔案'; + $lang->point_delete_file = '刪除檔案'; + $lang->point_download_file = '下載檔案 (圖片除外)'; + $lang->point_read_document = '檢視主題'; + $lang->point_voted = '推薦'; + $lang->point_blamed = '反對'; + + + $lang->cmd_point_config = '基本設置'; + $lang->cmd_point_module_config = '目標模組設置'; + $lang->cmd_point_act_config = 'Act設置'; + $lang->cmd_point_member_list = '會員點數列表'; + + $lang->msg_cannot_download = '點數不足無法下載!'; + $lang->msg_disallow_by_point = "點數不足無法閱讀文章 (需要 : %d, 目前 : %d)"; + + $lang->point_recal_message = '計算並套用中(%d / %d)。'; + $lang->point_recal_finished = '點數重新計算並套用完畢。'; +?> diff --git a/modules/point/point.admin.controller.php b/modules/point/point.admin.controller.php index 78b52f1ca..bba7f823d 100644 --- a/modules/point/point.admin.controller.php +++ b/modules/point/point.admin.controller.php @@ -1,311 +1,311 @@ -getModuleConfig('point'); - - // 변수 정리 - $args = Context::getRequestVars(); - - // 포인트 이름 체크 - $config->point_name = $args->point_name; - if(!$config->point_name) $config->point_name = 'point'; - - // 기본 포인트 지정 - $config->signup_point = (int)$args->signup_point; - $config->login_point = (int)$args->login_point; - $config->insert_document = (int)$args->insert_document; - $config->read_document = (int)$args->read_document; - $config->insert_comment = (int)$args->insert_comment; - $config->upload_file = (int)$args->upload_file; - $config->download_file = (int)$args->download_file; - $config->voted = (int)$args->voted; - $config->blamed = (int)$args->blamed; - - // 최고 레벨 - $config->max_level = $args->max_level; - if($config->max_level>1000) $config->max_level = 1000; - if($config->max_level<1) $config->max_level = 1; - - // 레벨 아이콘 설정 - $config->level_icon = $args->level_icon; - - // 포인트 미달시 다운로드 금지 여부 체크 - if($args->disable_download == 'Y') $config->disable_download = 'Y'; - else $config->disable_download = 'N'; - - // 포인트 미달시 글 열람 금지 여부 체크 - if($args->disable_read_document == 'Y') $config->disable_read_document = 'Y'; - else $config->disable_read_document = 'N'; - - // 레벨별 그룹 설정 - foreach($args as $key => $val) { - if(substr($key, 0, strlen('point_group_')) != 'point_group_') continue; - $group_srl = substr($key, strlen('point_group_')); - $level = $val; - if(!$level) unset($config->point_group[$group_srl]); - else $config->point_group[$group_srl] = $level; - } - $config->group_reset = $args->group_reset; - - // 레벨별 포인트 설정 - unset($config->level_step); - for($i=1;$i<=$config->max_level;$i++) { - $key = "level_step_".$i; - $config->level_step[$i] = (int)$args->{$key}; - } - - // 레벨별 포인트 계산 함수 - $config->expression = $args->expression; - - // 저장 - $oModuleController = &getController('module'); - $oModuleController->insertModuleConfig('point', $config); - - $this->cacheActList(); - - $this->setMessage('success_updated'); - } - - /** - * @brief 모듈별 설정 저장 - **/ - function procPointAdminInsertModuleConfig() { - $args = Context::getRequestVars(); - - foreach($args as $key => $val) { - preg_match("/^(insert_document|insert_comment|upload_file|download_file|read_document|voted|blamed)_([0-9]+)$/", $key, $matches); - if(!$matches[1]) continue; - $name = $matches[1]; - $module_srl = $matches[2]; - if(strlen($val)>0) $module_config[$module_srl][$name] = (int)$val; - } - - $oModuleController = &getController('module'); - if(count($module_config)) { - foreach($module_config as $module_srl => $config) { - $oModuleController->insertModulePartConfig('point',$module_srl,$config); - } - } - - $this->cacheActList(); - - $this->setMessage('success_updated'); - } - - /** - * @brief 모듈별 개별 포인트 저장 - **/ - function procPointAdminInsertPointModuleConfig() { - $module_srl = Context::get('target_module_srl'); - if(!$module_srl) return new Object(-1, 'msg_invalid_request'); - - // 여러개의 모듈 일괄 설정일 경우 - if(preg_match('/^([0-9,]+)$/',$module_srl)) $module_srl = explode(',',$module_srl); - else $module_srl = array($module_srl); - - // 설정 저장 - $oModuleController = &getController('module'); - for($i=0;$iinsertModulePartConfig('point', $srl, $config); - } - - $this->setError(-1); - $this->setMessage('success_updated'); - } - - /** - * @brief 회원 포인트 변경 - **/ - function procPointAdminUpdatePoint() { - $action = Context::get('action'); - $member_srl = Context::get('member_srl'); - $point = Context::get('point'); - - $oPointController = &getController('point'); - return $oPointController->setPoint($member_srl, (int)$point, $action); - } - - /** - * @brief 전체글/ 댓글/ 첨부파일과 가입정보를 바탕으로 포인트를 재계산함. 단 로그인 점수는 1번만 부여됨 - **/ - function procPointAdminReCal() { - set_time_limit(0); - - // 모듈별 포인트 정보를 가져옴 - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('point'); - - $module_config = $oModuleModel->getModulePartConfigs('point'); - - // 회원의 포인트 저장을 위한 변수 - $member = array(); - - // 게시글 정보를 가져옴 - $output = executeQueryArray('point.getDocumentPoint'); - if(!$output->toBool()) return $output; - - if($output->data) { - foreach($output->data as $key => $val) { - if($module_config[$val->module_srl]['insert_document']) $insert_point = $module_config[$val->module_srl]['insert_document']; - else $insert_point = $config->insert_document; - - if(!$val->member_srl) continue; - $point = $insert_point * $val->count; - $member[$val->member_srl] += $point; - } - } - $output = null; - - // 댓글 정보를 가져옴 - $output = executeQueryArray('point.getCommentPoint'); - if(!$output->toBool()) return $output; - - if($output->data) { - foreach($output->data as $key => $val) { - if($module_config[$val->module_srl]['insert_comment']) $insert_point = $module_config[$val->module_srl]['insert_comment']; - else $insert_point = $config->insert_comment; - - if(!$val->member_srl) continue; - $point = $insert_point * $val->count; - $member[$val->member_srl] += $point; - } - } - $output = null; - - // 첨부파일 정보를 가져옴 - $output = executeQueryArray('point.getFilePoint'); - if(!$output->toBool()) return $output; - - if($output->data) { - foreach($output->data as $key => $val) { - if($module_config[$val->module_srl]['upload_file']) $insert_point = $module_config[$val->module_srl]['upload_file']; - else $insert_point = $config->upload_file; - - if(!$val->member_srl) continue; - $point = $insert_point * $val->count; - $member[$val->member_srl] += $point; - } - } - $output = null; - - // 모든 회원의 포인트를 0으로 세팅 - $output = executeQuery("point.initMemberPoint"); - if(!$output->toBool()) return $output; - - // 임시로 파일 저장 - $f = fopen("./files/cache/pointRecal.txt","w"); - foreach($member as $key => $val) { - $val += (int)$config->signup_point; - fwrite($f, $key.','.$val."\r\n"); - } - fclose($f); - - $this->add('total', count($member)); - $this->add('position', 0); - $this->setMessage( sprintf(Context::getLang('point_recal_message'), 0, $this->get('total')) ); - } - - /** - * @brief 파일로 저장한 회원 포인트를 5000명 단위로 적용 - **/ - function procPointAdminApplyPoint() { - $position = (int)Context::get('position'); - $total = (int)Context::get('total'); - - if(!file_exists('./files/cache/pointRecal.txt')) return new Object(-1, 'msg_invalid_request'); - - $idx = 0; - $f = fopen("./files/cache/pointRecal.txt","r"); - while(!feof($f)) { - $str = trim(fgets($f, 1024)); - $idx ++; - if($idx > $position) { - list($member_srl, $point) = explode(',',$str); - - $args = null; - $args->member_srl = $member_srl; - $args->point = $point; - $output = executeQuery('point.insertPoint',$args); - if($idx%5000==0) break; - } - } - - if(feof($f)) { - FileHandler::removeFile('./files/cache/pointRecal.txt'); - $idx = $total; - - FileHandler::rename('./files/member_extra_info/point','./files/member_extra_info/point.old'); - - FileHandler::removeDir('./files/member_extra_info/point.old'); - } - fclose($f); - - - $this->add('total', $total); - $this->add('position', $idx); - $this->setMessage(sprintf(Context::getLang('point_recal_message'), $idx, $total)); - - } - - /** - * @brief 개별 모듈의 포인트 리셋 - **/ - function procPointAdminReset() { - $module_srl = Context::get('module_srls'); - if(!$module_srl) return new Object(-1, 'msg_invalid_request'); - - // 여러개의 모듈 일괄 설정일 경우 - if(preg_match('/^([0-9,]+)$/',$module_srl)) $module_srl = explode(',',$module_srl); - else $module_srl = array($module_srl); - - // 설정 저장 - $oModuleController = &getController('module'); - for($i=0;$imodule = 'point'; - $args->module_srl = $srl; - executeQuery('module.deleteModulePartConfig', $args); - } - - $this->setMessage('success_updated'); - } - - /** - * @brief 캐시파일 저장 - **/ - function cacheActList() { - return; - } - - } -?> +getModuleConfig('point'); + + // 변수 정리 + $args = Context::getRequestVars(); + + // 포인트 이름 체크 + $config->point_name = $args->point_name; + if(!$config->point_name) $config->point_name = 'point'; + + // 기본 포인트 지정 + $config->signup_point = (int)$args->signup_point; + $config->login_point = (int)$args->login_point; + $config->insert_document = (int)$args->insert_document; + $config->read_document = (int)$args->read_document; + $config->insert_comment = (int)$args->insert_comment; + $config->upload_file = (int)$args->upload_file; + $config->download_file = (int)$args->download_file; + $config->voted = (int)$args->voted; + $config->blamed = (int)$args->blamed; + + // 최고 레벨 + $config->max_level = $args->max_level; + if($config->max_level>1000) $config->max_level = 1000; + if($config->max_level<1) $config->max_level = 1; + + // 레벨 아이콘 설정 + $config->level_icon = $args->level_icon; + + // 포인트 미달시 다운로드 금지 여부 체크 + if($args->disable_download == 'Y') $config->disable_download = 'Y'; + else $config->disable_download = 'N'; + + // 포인트 미달시 글 열람 금지 여부 체크 + if($args->disable_read_document == 'Y') $config->disable_read_document = 'Y'; + else $config->disable_read_document = 'N'; + + // 레벨별 그룹 설정 + foreach($args as $key => $val) { + if(substr($key, 0, strlen('point_group_')) != 'point_group_') continue; + $group_srl = substr($key, strlen('point_group_')); + $level = $val; + if(!$level) unset($config->point_group[$group_srl]); + else $config->point_group[$group_srl] = $level; + } + $config->group_reset = $args->group_reset; + + // 레벨별 포인트 설정 + unset($config->level_step); + for($i=1;$i<=$config->max_level;$i++) { + $key = "level_step_".$i; + $config->level_step[$i] = (int)$args->{$key}; + } + + // 레벨별 포인트 계산 함수 + $config->expression = $args->expression; + + // 저장 + $oModuleController = &getController('module'); + $oModuleController->insertModuleConfig('point', $config); + + $this->cacheActList(); + + $this->setMessage('success_updated'); + } + + /** + * @brief 모듈별 설정 저장 + **/ + function procPointAdminInsertModuleConfig() { + $args = Context::getRequestVars(); + + foreach($args as $key => $val) { + preg_match("/^(insert_document|insert_comment|upload_file|download_file|read_document|voted|blamed)_([0-9]+)$/", $key, $matches); + if(!$matches[1]) continue; + $name = $matches[1]; + $module_srl = $matches[2]; + if(strlen($val)>0) $module_config[$module_srl][$name] = (int)$val; + } + + $oModuleController = &getController('module'); + if(count($module_config)) { + foreach($module_config as $module_srl => $config) { + $oModuleController->insertModulePartConfig('point',$module_srl,$config); + } + } + + $this->cacheActList(); + + $this->setMessage('success_updated'); + } + + /** + * @brief 모듈별 개별 포인트 저장 + **/ + function procPointAdminInsertPointModuleConfig() { + $module_srl = Context::get('target_module_srl'); + if(!$module_srl) return new Object(-1, 'msg_invalid_request'); + + // 여러개의 모듈 일괄 설정일 경우 + if(preg_match('/^([0-9,]+)$/',$module_srl)) $module_srl = explode(',',$module_srl); + else $module_srl = array($module_srl); + + // 설정 저장 + $oModuleController = &getController('module'); + for($i=0;$iinsertModulePartConfig('point', $srl, $config); + } + + $this->setError(-1); + $this->setMessage('success_updated'); + } + + /** + * @brief 회원 포인트 변경 + **/ + function procPointAdminUpdatePoint() { + $action = Context::get('action'); + $member_srl = Context::get('member_srl'); + $point = Context::get('point'); + + $oPointController = &getController('point'); + return $oPointController->setPoint($member_srl, (int)$point, $action); + } + + /** + * @brief 전체글/ 댓글/ 첨부파일과 가입정보를 바탕으로 포인트를 재계산함. 단 로그인 점수는 1번만 부여됨 + **/ + function procPointAdminReCal() { + set_time_limit(0); + + // 모듈별 포인트 정보를 가져옴 + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('point'); + + $module_config = $oModuleModel->getModulePartConfigs('point'); + + // 회원의 포인트 저장을 위한 변수 + $member = array(); + + // 게시글 정보를 가져옴 + $output = executeQueryArray('point.getDocumentPoint'); + if(!$output->toBool()) return $output; + + if($output->data) { + foreach($output->data as $key => $val) { + if($module_config[$val->module_srl]['insert_document']) $insert_point = $module_config[$val->module_srl]['insert_document']; + else $insert_point = $config->insert_document; + + if(!$val->member_srl) continue; + $point = $insert_point * $val->count; + $member[$val->member_srl] += $point; + } + } + $output = null; + + // 댓글 정보를 가져옴 + $output = executeQueryArray('point.getCommentPoint'); + if(!$output->toBool()) return $output; + + if($output->data) { + foreach($output->data as $key => $val) { + if($module_config[$val->module_srl]['insert_comment']) $insert_point = $module_config[$val->module_srl]['insert_comment']; + else $insert_point = $config->insert_comment; + + if(!$val->member_srl) continue; + $point = $insert_point * $val->count; + $member[$val->member_srl] += $point; + } + } + $output = null; + + // 첨부파일 정보를 가져옴 + $output = executeQueryArray('point.getFilePoint'); + if(!$output->toBool()) return $output; + + if($output->data) { + foreach($output->data as $key => $val) { + if($module_config[$val->module_srl]['upload_file']) $insert_point = $module_config[$val->module_srl]['upload_file']; + else $insert_point = $config->upload_file; + + if(!$val->member_srl) continue; + $point = $insert_point * $val->count; + $member[$val->member_srl] += $point; + } + } + $output = null; + + // 모든 회원의 포인트를 0으로 세팅 + $output = executeQuery("point.initMemberPoint"); + if(!$output->toBool()) return $output; + + // 임시로 파일 저장 + $f = fopen("./files/cache/pointRecal.txt","w"); + foreach($member as $key => $val) { + $val += (int)$config->signup_point; + fwrite($f, $key.','.$val."\r\n"); + } + fclose($f); + + $this->add('total', count($member)); + $this->add('position', 0); + $this->setMessage( sprintf(Context::getLang('point_recal_message'), 0, $this->get('total')) ); + } + + /** + * @brief 파일로 저장한 회원 포인트를 5000명 단위로 적용 + **/ + function procPointAdminApplyPoint() { + $position = (int)Context::get('position'); + $total = (int)Context::get('total'); + + if(!file_exists('./files/cache/pointRecal.txt')) return new Object(-1, 'msg_invalid_request'); + + $idx = 0; + $f = fopen("./files/cache/pointRecal.txt","r"); + while(!feof($f)) { + $str = trim(fgets($f, 1024)); + $idx ++; + if($idx > $position) { + list($member_srl, $point) = explode(',',$str); + + $args = null; + $args->member_srl = $member_srl; + $args->point = $point; + $output = executeQuery('point.insertPoint',$args); + if($idx%5000==0) break; + } + } + + if(feof($f)) { + FileHandler::removeFile('./files/cache/pointRecal.txt'); + $idx = $total; + + FileHandler::rename('./files/member_extra_info/point','./files/member_extra_info/point.old'); + + FileHandler::removeDir('./files/member_extra_info/point.old'); + } + fclose($f); + + + $this->add('total', $total); + $this->add('position', $idx); + $this->setMessage(sprintf(Context::getLang('point_recal_message'), $idx, $total)); + + } + + /** + * @brief 개별 모듈의 포인트 리셋 + **/ + function procPointAdminReset() { + $module_srl = Context::get('module_srls'); + if(!$module_srl) return new Object(-1, 'msg_invalid_request'); + + // 여러개의 모듈 일괄 설정일 경우 + if(preg_match('/^([0-9,]+)$/',$module_srl)) $module_srl = explode(',',$module_srl); + else $module_srl = array($module_srl); + + // 설정 저장 + $oModuleController = &getController('module'); + for($i=0;$imodule = 'point'; + $args->module_srl = $srl; + executeQuery('module.deleteModulePartConfig', $args); + } + + $this->setMessage('success_updated'); + } + + /** + * @brief 캐시파일 저장 + **/ + function cacheActList() { + return; + } + + } +?> diff --git a/modules/point/point.admin.view.php b/modules/point/point.admin.view.php index ec4507b79..d999683ac 100644 --- a/modules/point/point.admin.view.php +++ b/modules/point/point.admin.view.php @@ -1,101 +1,101 @@ -getModuleConfig('point'); - - // 설정 변수 지정 - Context::set('config', $config); - - // template path지정 - $this->setTemplatePath($this->module_path.'tpl'); - } - - /** - * @brief 기본 설정 - **/ - function dispPointAdminConfig() { - // 레벨 아이콘 목록 구함 - $level_icon_list = FileHandler::readDir("./modules/point/icons"); - Context::set('level_icon_list', $level_icon_list); - - // 그룹 목록 가져오기 - $oMemberModel = &getModel('member'); - $group_list = $oMemberModel->getGroups(); - $selected_group_list = array(); - if(count($group_list)) { - foreach($group_list as $key => $val) { - if($val->is_admin == 'Y' || $val->is_default == 'Y') continue; - $selected_group_list[$key] = $val; - } - } - Context::set('group_list', $selected_group_list); - - // 템플릿 지정 - $this->setTemplateFile('config'); - } - - /** - * @brief 모듈별 점수 지정 - **/ - function dispPointAdminModuleConfig() { - // mid 목록 가져오기 - $oModuleModel = &getModel('module'); - $mid_list = $oModuleModel->getMidList(); - Context::set('mid_list', $mid_list); - - Context::set('module_config', $oModuleModel->getModulePartConfigs('point')); - - // 템플릿 지정 - $this->setTemplateFile('module_config'); - } - - /** - * @brief 기능별 act 설정 - **/ - function dispPointAdminActConfig() { - // 템플릿 지정 - $this->setTemplateFile('action_config'); - } - - /** - * @brief 회원 포인트순 목록 가져오기 - **/ - function dispPointAdminPointList() { - $oPointModel = &getModel('point'); - - $args->list_count = 20; - $args->page = Context::get('page'); - - $output = $oPointModel->getMemberList($args); - - // 템플릿에 쓰기 위해서 context::set - Context::set('total_count', $output->total_count); - Context::set('total_page', $output->total_page); - Context::set('page', $output->page); - Context::set('member_list', $output->data); - Context::set('page_navigation', $output->page_navigation); - - // 멤버모델 객체 생성 - $oMemberModel = &getModel('member'); - - // group 목록 가져오기 - $this->group_list = $oMemberModel->getGroups(); - Context::set('group_list', $this->group_list); - - // 템플릿 지정 - $this->setTemplateFile('member_list'); - } - } -?> +getModuleConfig('point'); + + // 설정 변수 지정 + Context::set('config', $config); + + // template path지정 + $this->setTemplatePath($this->module_path.'tpl'); + } + + /** + * @brief 기본 설정 + **/ + function dispPointAdminConfig() { + // 레벨 아이콘 목록 구함 + $level_icon_list = FileHandler::readDir("./modules/point/icons"); + Context::set('level_icon_list', $level_icon_list); + + // 그룹 목록 가져오기 + $oMemberModel = &getModel('member'); + $group_list = $oMemberModel->getGroups(); + $selected_group_list = array(); + if(count($group_list)) { + foreach($group_list as $key => $val) { + if($val->is_admin == 'Y' || $val->is_default == 'Y') continue; + $selected_group_list[$key] = $val; + } + } + Context::set('group_list', $selected_group_list); + + // 템플릿 지정 + $this->setTemplateFile('config'); + } + + /** + * @brief 모듈별 점수 지정 + **/ + function dispPointAdminModuleConfig() { + // mid 목록 가져오기 + $oModuleModel = &getModel('module'); + $mid_list = $oModuleModel->getMidList(); + Context::set('mid_list', $mid_list); + + Context::set('module_config', $oModuleModel->getModulePartConfigs('point')); + + // 템플릿 지정 + $this->setTemplateFile('module_config'); + } + + /** + * @brief 기능별 act 설정 + **/ + function dispPointAdminActConfig() { + // 템플릿 지정 + $this->setTemplateFile('action_config'); + } + + /** + * @brief 회원 포인트순 목록 가져오기 + **/ + function dispPointAdminPointList() { + $oPointModel = &getModel('point'); + + $args->list_count = 20; + $args->page = Context::get('page'); + + $output = $oPointModel->getMemberList($args); + + // 템플릿에 쓰기 위해서 context::set + Context::set('total_count', $output->total_count); + Context::set('total_page', $output->total_page); + Context::set('page', $output->page); + Context::set('member_list', $output->data); + Context::set('page_navigation', $output->page_navigation); + + // 멤버모델 객체 생성 + $oMemberModel = &getModel('member'); + + // group 목록 가져오기 + $this->group_list = $oMemberModel->getGroups(); + Context::set('group_list', $this->group_list); + + // 템플릿 지정 + $this->setTemplateFile('member_list'); + } + } +?> diff --git a/modules/point/point.class.php b/modules/point/point.class.php index 5df190bac..83a85381a 100644 --- a/modules/point/point.class.php +++ b/modules/point/point.class.php @@ -1,197 +1,197 @@ -max_level = 30; - - // 레벨별 점수 - for($i=1;$i<=30;$i++) { - $config->level_step[$i] = pow($i,2)*90; - } - - // 회원가입 - $config->signup_point = 10; - - // 로그인 가입 - $config->login_point = 5; - - // 포인트 호칭 - $config->point_name = 'point'; - - // 레벨 아이콘 디렉토리 - $config->level_icon = "default"; - - // 점수가 없을때 다운로드 금지 기능 - $config->disable_download = false; - - /** - * 모듈별 기본 점수 및 각 action 정의 (게시판,블로그외에 어떤 모듈이 생길지 모르니 act값을 명시한다 - **/ - - // 글작성 - $config->insert_document = 10; - - $config->insert_document_act = 'procBoardInsertDocument'; - $config->delete_document_act = 'procBoardDeleteDocument'; - - // 댓글작성 - $config->insert_comment = 5; - - $config->insert_comment_act = 'procBoardInsertComment,procBlogInsertComment'; - $config->delete_comment_act = 'procBoardDeleteComment,procBlogDeleteComment'; - - // 업로드 - $config->upload_file = 5; - - $config->upload_file_act = 'procFileUpload'; - $config->delete_file_act = 'procFileDelete'; - - // 다운로드 - $config->download_file = -5; - $config->download_file_act = 'procFileDownload'; - - // 조회 - $config->read_document = 0; - - // 추천 / 비추천 - $config->voted = 0; - $config->blamed = 0; - - // 설정 저장 - $oModuleController->insertModuleConfig('point', $config); - - // 빠른 실행을 위해서 act list를 캐싱 - $oPointController = &getAdminController('point'); - $oPointController->cacheActList(); - - // 가입/글작성/댓글작성/파일업로드/다운로드에 대한 트리거 추가 - $oModuleController->insertTrigger('member.insertMember', 'point', 'controller', 'triggerInsertMember', 'after'); - $oModuleController->insertTrigger('document.insertDocument', 'point', 'controller', 'triggerInsertDocument', 'after'); - $oModuleController->insertTrigger('document.deleteDocument', 'point', 'controller', 'triggerBeforeDeleteDocument', 'before'); - $oModuleController->insertTrigger('document.deleteDocument', 'point', 'controller', 'triggerDeleteDocument', 'after'); - $oModuleController->insertTrigger('comment.insertComment', 'point', 'controller', 'triggerInsertComment', 'after'); - $oModuleController->insertTrigger('comment.deleteComment', 'point', 'controller', 'triggerDeleteComment', 'after'); - $oModuleController->insertTrigger('file.insertFile', 'point', 'controller', 'triggerInsertFile', 'after'); - $oModuleController->insertTrigger('file.deleteFile', 'point', 'controller', 'triggerDeleteFile', 'after'); - $oModuleController->insertTrigger('file.downloadFile', 'point', 'controller', 'triggerBeforeDownloadFile', 'before'); - $oModuleController->insertTrigger('file.downloadFile', 'point', 'controller', 'triggerDownloadFile', 'after'); - $oModuleController->insertTrigger('member.doLogin', 'point', 'controller', 'triggerAfterLogin', 'after'); - $oModuleController->insertTrigger('module.dispAdditionSetup', 'point', 'view', 'triggerDispPointAdditionSetup', 'after'); - $oModuleController->insertTrigger('document.updateReadedCount', 'point', 'controller', 'triggerUpdateReadedCount', 'after'); - - // 추천 / 비추천에 대한 트리거 추가 2008.05.13 haneul - $oModuleController->insertTrigger('document.updateVotedCount', 'point', 'controller', 'triggerUpdateVotedCount', 'after'); - - // 임시저장글을 정상 저장시 포인트 지급하도록 트리거 추가 2009. 05. 19 zero - $oModuleController->insertTrigger('document.updateDocument', 'point', 'controller', 'triggerUpdateDocument', 'before'); - - return new Object(); - } - - /** - * @brief 설치가 이상이 없는지 체크하는 method - **/ - function checkUpdate() { - // point 모듈 정보 가져옴 - $oModuleModel = &getModel('module'); - - // 가입/글작성/댓글작성/파일업로드/다운로드에 대한 트리거 추가 - if(!$oModuleModel->getTrigger('member.insertMember', 'point', 'controller', 'triggerInsertMember', 'after')) return true; - if(!$oModuleModel->getTrigger('document.insertDocument', 'point', 'controller', 'triggerInsertDocument', 'after')) return true; - if(!$oModuleModel->getTrigger('document.deleteDocument', 'point', 'controller', 'triggerBeforeDeleteDocument', 'before')) return true; - if(!$oModuleModel->getTrigger('document.deleteDocument', 'point', 'controller', 'triggerDeleteDocument', 'after')) return true; - if(!$oModuleModel->getTrigger('comment.insertComment', 'point', 'controller', 'triggerInsertComment', 'after')) return true; - if(!$oModuleModel->getTrigger('comment.deleteComment', 'point', 'controller', 'triggerDeleteComment', 'after')) return true; - if(!$oModuleModel->getTrigger('file.insertFile', 'point', 'controller', 'triggerInsertFile', 'after')) return true; - if(!$oModuleModel->getTrigger('file.deleteFile', 'point', 'controller', 'triggerDeleteFile', 'after')) return true; - if(!$oModuleModel->getTrigger('file.downloadFile', 'point', 'controller', 'triggerBeforeDownloadFile', 'before')) return true; - if(!$oModuleModel->getTrigger('file.downloadFile', 'point', 'controller', 'triggerDownloadFile', 'after')) return true; - if(!$oModuleModel->getTrigger('member.doLogin', 'point', 'controller', 'triggerAfterLogin', 'after')) return true; - if(!$oModuleModel->getTrigger('module.dispAdditionSetup', 'point', 'view', 'triggerDispPointAdditionSetup', 'after')) return true; - if(!$oModuleModel->getTrigger('document.updateReadedCount', 'point', 'controller', 'triggerUpdateReadedCount', 'after')) return true; - - // 추천 / 비추천에 대한 트리거 추가 2008.05.13 haneul - if(!$oModuleModel->getTrigger('document.updateVotedCount', 'point', 'controller', 'triggerUpdateVotedCount', 'after')) return true; - - // 임시저장글을 정상 저장시 포인트 지급하도록 트리거 추가 2009. 05. 19 zero - if(!$oModuleModel->getTrigger('document.updateDocument', 'point', 'controller', 'triggerUpdateDocument', 'before')) return true; - - return false; - } - - /** - * @brief 업데이트 실행 - **/ - function moduleUpdate() { - // point 모듈 정보 가져옴 - $oModuleModel = &getModel('module'); - $oModuleController = &getController('module'); - - // 가입/글작성/댓글작성/파일업로드/다운로드에 대한 트리거 추가 - if(!$oModuleModel->getTrigger('member.insertMember', 'point', 'controller', 'triggerInsertMember', 'after')) - $oModuleController->insertTrigger('member.insertMember', 'point', 'controller', 'triggerInsertMember', 'after'); - if(!$oModuleModel->getTrigger('document.insertDocument', 'point', 'controller', 'triggerInsertDocument', 'after')) - $oModuleController->insertTrigger('document.insertDocument', 'point', 'controller', 'triggerInsertDocument', 'after'); - if(!$oModuleModel->getTrigger('document.deleteDocument', 'point', 'controller', 'triggerBeforeDeleteDocument', 'before')) - $oModuleController->insertTrigger('document.deleteDocument', 'point', 'controller', 'triggerBeforeDeleteDocument', 'before'); - if(!$oModuleModel->getTrigger('document.deleteDocument', 'point', 'controller', 'triggerDeleteDocument', 'after')) - $oModuleController->insertTrigger('document.deleteDocument', 'point', 'controller', 'triggerDeleteDocument', 'after'); - if(!$oModuleModel->getTrigger('comment.insertComment', 'point', 'controller', 'triggerInsertComment', 'after')) - $oModuleController->insertTrigger('comment.insertComment', 'point', 'controller', 'triggerInsertComment', 'after'); - if(!$oModuleModel->getTrigger('comment.deleteComment', 'point', 'controller', 'triggerDeleteComment', 'after')) - $oModuleController->insertTrigger('comment.deleteComment', 'point', 'controller', 'triggerDeleteComment', 'after'); - if(!$oModuleModel->getTrigger('file.insertFile', 'point', 'controller', 'triggerInsertFile', 'after')) - $oModuleController->insertTrigger('file.insertFile', 'point', 'controller', 'triggerInsertFile', 'after'); - if(!$oModuleModel->getTrigger('file.deleteFile', 'point', 'controller', 'triggerDeleteFile', 'after')) - $oModuleController->insertTrigger('file.deleteFile', 'point', 'controller', 'triggerDeleteFile', 'after'); - if(!$oModuleModel->getTrigger('file.downloadFile', 'point', 'controller', 'triggerBeforeDownloadFile', 'before')) - $oModuleController->insertTrigger('file.downloadFile', 'point', 'controller', 'triggerBeforeDownloadFile', 'before'); - if(!$oModuleModel->getTrigger('file.downloadFile', 'point', 'controller', 'triggerDownloadFile', 'after')) - $oModuleController->insertTrigger('file.downloadFile', 'point', 'controller', 'triggerDownloadFile', 'after'); - if(!$oModuleModel->getTrigger('member.doLogin', 'point', 'controller', 'triggerAfterLogin', 'after')) - $oModuleController->insertTrigger('member.doLogin', 'point', 'controller', 'triggerAfterLogin', 'after'); - if(!$oModuleModel->getTrigger('module.dispAdditionSetup', 'point', 'view', 'triggerDispPointAdditionSetup', 'after')) - $oModuleController->insertTrigger('module.dispAdditionSetup', 'point', 'view', 'triggerDispPointAdditionSetup', 'after'); - if(!$oModuleModel->getTrigger('document.updateReadedCount', 'point', 'controller', 'triggerUpdateReadedCount', 'after')) - $oModuleController->insertTrigger('document.updateReadedCount', 'point', 'controller', 'triggerUpdateReadedCount', 'after'); - - // 추천 / 비추천에 대한 트리거 추가 2008.05.13 haneul - if(!$oModuleModel->getTrigger('document.updateVotedCount', 'point', 'controller', 'triggerUpdateVotedCount', 'after')) - $oModuleController->insertTrigger('document.updateVotedCount', 'point', 'controller', 'triggerUpdateVotedCount', 'after'); - - // 임시저장글을 정상 저장시 포인트 지급하도록 트리거 추가 2009. 05. 19 zero - if(!$oModuleModel->getTrigger('document.updateDocument', 'point', 'controller', 'triggerUpdateDocument', 'before')) - $oModuleController->insertTrigger('document.updateDocument', 'point', 'controller', 'triggerUpdateDocument', 'before'); - - return new Object(0, 'success_updated'); - } - - /** - * @brief 캐시 파일 재생성 - **/ - function recompileCache() { - // point action 파일 재정의 - $oPointAdminController = &getAdminController('point'); - $oPointAdminController->cacheActList(); - - } - } -?> +max_level = 30; + + // 레벨별 점수 + for($i=1;$i<=30;$i++) { + $config->level_step[$i] = pow($i,2)*90; + } + + // 회원가입 + $config->signup_point = 10; + + // 로그인 가입 + $config->login_point = 5; + + // 포인트 호칭 + $config->point_name = 'point'; + + // 레벨 아이콘 디렉토리 + $config->level_icon = "default"; + + // 점수가 없을때 다운로드 금지 기능 + $config->disable_download = false; + + /** + * 모듈별 기본 점수 및 각 action 정의 (게시판,블로그외에 어떤 모듈이 생길지 모르니 act값을 명시한다 + **/ + + // 글작성 + $config->insert_document = 10; + + $config->insert_document_act = 'procBoardInsertDocument'; + $config->delete_document_act = 'procBoardDeleteDocument'; + + // 댓글작성 + $config->insert_comment = 5; + + $config->insert_comment_act = 'procBoardInsertComment,procBlogInsertComment'; + $config->delete_comment_act = 'procBoardDeleteComment,procBlogDeleteComment'; + + // 업로드 + $config->upload_file = 5; + + $config->upload_file_act = 'procFileUpload'; + $config->delete_file_act = 'procFileDelete'; + + // 다운로드 + $config->download_file = -5; + $config->download_file_act = 'procFileDownload'; + + // 조회 + $config->read_document = 0; + + // 추천 / 비추천 + $config->voted = 0; + $config->blamed = 0; + + // 설정 저장 + $oModuleController->insertModuleConfig('point', $config); + + // 빠른 실행을 위해서 act list를 캐싱 + $oPointController = &getAdminController('point'); + $oPointController->cacheActList(); + + // 가입/글작성/댓글작성/파일업로드/다운로드에 대한 트리거 추가 + $oModuleController->insertTrigger('member.insertMember', 'point', 'controller', 'triggerInsertMember', 'after'); + $oModuleController->insertTrigger('document.insertDocument', 'point', 'controller', 'triggerInsertDocument', 'after'); + $oModuleController->insertTrigger('document.deleteDocument', 'point', 'controller', 'triggerBeforeDeleteDocument', 'before'); + $oModuleController->insertTrigger('document.deleteDocument', 'point', 'controller', 'triggerDeleteDocument', 'after'); + $oModuleController->insertTrigger('comment.insertComment', 'point', 'controller', 'triggerInsertComment', 'after'); + $oModuleController->insertTrigger('comment.deleteComment', 'point', 'controller', 'triggerDeleteComment', 'after'); + $oModuleController->insertTrigger('file.insertFile', 'point', 'controller', 'triggerInsertFile', 'after'); + $oModuleController->insertTrigger('file.deleteFile', 'point', 'controller', 'triggerDeleteFile', 'after'); + $oModuleController->insertTrigger('file.downloadFile', 'point', 'controller', 'triggerBeforeDownloadFile', 'before'); + $oModuleController->insertTrigger('file.downloadFile', 'point', 'controller', 'triggerDownloadFile', 'after'); + $oModuleController->insertTrigger('member.doLogin', 'point', 'controller', 'triggerAfterLogin', 'after'); + $oModuleController->insertTrigger('module.dispAdditionSetup', 'point', 'view', 'triggerDispPointAdditionSetup', 'after'); + $oModuleController->insertTrigger('document.updateReadedCount', 'point', 'controller', 'triggerUpdateReadedCount', 'after'); + + // 추천 / 비추천에 대한 트리거 추가 2008.05.13 haneul + $oModuleController->insertTrigger('document.updateVotedCount', 'point', 'controller', 'triggerUpdateVotedCount', 'after'); + + // 임시저장글을 정상 저장시 포인트 지급하도록 트리거 추가 2009. 05. 19 zero + $oModuleController->insertTrigger('document.updateDocument', 'point', 'controller', 'triggerUpdateDocument', 'before'); + + return new Object(); + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + **/ + function checkUpdate() { + // point 모듈 정보 가져옴 + $oModuleModel = &getModel('module'); + + // 가입/글작성/댓글작성/파일업로드/다운로드에 대한 트리거 추가 + if(!$oModuleModel->getTrigger('member.insertMember', 'point', 'controller', 'triggerInsertMember', 'after')) return true; + if(!$oModuleModel->getTrigger('document.insertDocument', 'point', 'controller', 'triggerInsertDocument', 'after')) return true; + if(!$oModuleModel->getTrigger('document.deleteDocument', 'point', 'controller', 'triggerBeforeDeleteDocument', 'before')) return true; + if(!$oModuleModel->getTrigger('document.deleteDocument', 'point', 'controller', 'triggerDeleteDocument', 'after')) return true; + if(!$oModuleModel->getTrigger('comment.insertComment', 'point', 'controller', 'triggerInsertComment', 'after')) return true; + if(!$oModuleModel->getTrigger('comment.deleteComment', 'point', 'controller', 'triggerDeleteComment', 'after')) return true; + if(!$oModuleModel->getTrigger('file.insertFile', 'point', 'controller', 'triggerInsertFile', 'after')) return true; + if(!$oModuleModel->getTrigger('file.deleteFile', 'point', 'controller', 'triggerDeleteFile', 'after')) return true; + if(!$oModuleModel->getTrigger('file.downloadFile', 'point', 'controller', 'triggerBeforeDownloadFile', 'before')) return true; + if(!$oModuleModel->getTrigger('file.downloadFile', 'point', 'controller', 'triggerDownloadFile', 'after')) return true; + if(!$oModuleModel->getTrigger('member.doLogin', 'point', 'controller', 'triggerAfterLogin', 'after')) return true; + if(!$oModuleModel->getTrigger('module.dispAdditionSetup', 'point', 'view', 'triggerDispPointAdditionSetup', 'after')) return true; + if(!$oModuleModel->getTrigger('document.updateReadedCount', 'point', 'controller', 'triggerUpdateReadedCount', 'after')) return true; + + // 추천 / 비추천에 대한 트리거 추가 2008.05.13 haneul + if(!$oModuleModel->getTrigger('document.updateVotedCount', 'point', 'controller', 'triggerUpdateVotedCount', 'after')) return true; + + // 임시저장글을 정상 저장시 포인트 지급하도록 트리거 추가 2009. 05. 19 zero + if(!$oModuleModel->getTrigger('document.updateDocument', 'point', 'controller', 'triggerUpdateDocument', 'before')) return true; + + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + // point 모듈 정보 가져옴 + $oModuleModel = &getModel('module'); + $oModuleController = &getController('module'); + + // 가입/글작성/댓글작성/파일업로드/다운로드에 대한 트리거 추가 + if(!$oModuleModel->getTrigger('member.insertMember', 'point', 'controller', 'triggerInsertMember', 'after')) + $oModuleController->insertTrigger('member.insertMember', 'point', 'controller', 'triggerInsertMember', 'after'); + if(!$oModuleModel->getTrigger('document.insertDocument', 'point', 'controller', 'triggerInsertDocument', 'after')) + $oModuleController->insertTrigger('document.insertDocument', 'point', 'controller', 'triggerInsertDocument', 'after'); + if(!$oModuleModel->getTrigger('document.deleteDocument', 'point', 'controller', 'triggerBeforeDeleteDocument', 'before')) + $oModuleController->insertTrigger('document.deleteDocument', 'point', 'controller', 'triggerBeforeDeleteDocument', 'before'); + if(!$oModuleModel->getTrigger('document.deleteDocument', 'point', 'controller', 'triggerDeleteDocument', 'after')) + $oModuleController->insertTrigger('document.deleteDocument', 'point', 'controller', 'triggerDeleteDocument', 'after'); + if(!$oModuleModel->getTrigger('comment.insertComment', 'point', 'controller', 'triggerInsertComment', 'after')) + $oModuleController->insertTrigger('comment.insertComment', 'point', 'controller', 'triggerInsertComment', 'after'); + if(!$oModuleModel->getTrigger('comment.deleteComment', 'point', 'controller', 'triggerDeleteComment', 'after')) + $oModuleController->insertTrigger('comment.deleteComment', 'point', 'controller', 'triggerDeleteComment', 'after'); + if(!$oModuleModel->getTrigger('file.insertFile', 'point', 'controller', 'triggerInsertFile', 'after')) + $oModuleController->insertTrigger('file.insertFile', 'point', 'controller', 'triggerInsertFile', 'after'); + if(!$oModuleModel->getTrigger('file.deleteFile', 'point', 'controller', 'triggerDeleteFile', 'after')) + $oModuleController->insertTrigger('file.deleteFile', 'point', 'controller', 'triggerDeleteFile', 'after'); + if(!$oModuleModel->getTrigger('file.downloadFile', 'point', 'controller', 'triggerBeforeDownloadFile', 'before')) + $oModuleController->insertTrigger('file.downloadFile', 'point', 'controller', 'triggerBeforeDownloadFile', 'before'); + if(!$oModuleModel->getTrigger('file.downloadFile', 'point', 'controller', 'triggerDownloadFile', 'after')) + $oModuleController->insertTrigger('file.downloadFile', 'point', 'controller', 'triggerDownloadFile', 'after'); + if(!$oModuleModel->getTrigger('member.doLogin', 'point', 'controller', 'triggerAfterLogin', 'after')) + $oModuleController->insertTrigger('member.doLogin', 'point', 'controller', 'triggerAfterLogin', 'after'); + if(!$oModuleModel->getTrigger('module.dispAdditionSetup', 'point', 'view', 'triggerDispPointAdditionSetup', 'after')) + $oModuleController->insertTrigger('module.dispAdditionSetup', 'point', 'view', 'triggerDispPointAdditionSetup', 'after'); + if(!$oModuleModel->getTrigger('document.updateReadedCount', 'point', 'controller', 'triggerUpdateReadedCount', 'after')) + $oModuleController->insertTrigger('document.updateReadedCount', 'point', 'controller', 'triggerUpdateReadedCount', 'after'); + + // 추천 / 비추천에 대한 트리거 추가 2008.05.13 haneul + if(!$oModuleModel->getTrigger('document.updateVotedCount', 'point', 'controller', 'triggerUpdateVotedCount', 'after')) + $oModuleController->insertTrigger('document.updateVotedCount', 'point', 'controller', 'triggerUpdateVotedCount', 'after'); + + // 임시저장글을 정상 저장시 포인트 지급하도록 트리거 추가 2009. 05. 19 zero + if(!$oModuleModel->getTrigger('document.updateDocument', 'point', 'controller', 'triggerUpdateDocument', 'before')) + $oModuleController->insertTrigger('document.updateDocument', 'point', 'controller', 'triggerUpdateDocument', 'before'); + + return new Object(0, 'success_updated'); + } + + /** + * @brief 캐시 파일 재생성 + **/ + function recompileCache() { + // point action 파일 재정의 + $oPointAdminController = &getAdminController('point'); + $oPointAdminController->cacheActList(); + + } + } +?> diff --git a/modules/point/point.controller.php b/modules/point/point.controller.php index 2be6a7172..c41566fd1 100644 --- a/modules/point/point.controller.php +++ b/modules/point/point.controller.php @@ -1,661 +1,661 @@ -getModuleConfig('point'); - - // 가입한 회원의 member_srl을 구함 - $member_srl = $obj->member_srl; - - // 대상 회원의 포인트를 구함 - $oPointModel = &getModel('point'); - $cur_point = $oPointModel->getPoint($member_srl, true); - - $point = $config->signup_point; - - // 포인트 증감 - $cur_point += $point; - $this->setPoint($member_srl,$cur_point, 'signup'); - - return new Object(); - } - - /** - * @brief 회원 로그인 포인트 적용 trigger - **/ - function triggerAfterLogin(&$obj) { - $member_srl = $obj->member_srl; - if(!$member_srl) return new Object(); - - // 바로 이전 로그인이 오늘이 아니어야 포인트를 줌 - if(substr($obj->last_login,0,8)==date("Ymd")) return new Object(); - - // point 모듈 정보 가져옴 - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('point'); - - // 대상 회원의 포인트를 구함 - $oPointModel = &getModel('point'); - $cur_point = $oPointModel->getPoint($member_srl, true); - - $point = $config->login_point; - - // 포인트 증감 - $cur_point += $point; - $this->setPoint($member_srl,$cur_point); - - return new Object(); - } - - /** - * @brief 게시글 등록 포인트 적용 trigger - **/ - function triggerInsertDocument(&$obj) { - $module_srl = $obj->module_srl; - $member_srl = $obj->member_srl; - if(!$module_srl || !$member_srl) return new Object(); - - // 임시저장일 경우 포인트를 지급하지 않도록 수정 - if($module_srl == $member_srl) return new Object(); - - // point 모듈 정보 가져옴 - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('point'); - $module_config = $oModuleModel->getModulePartConfig('point',$module_srl); - - // 대상 회원의 포인트를 구함 - $oPointModel = &getModel('point'); - $cur_point = $oPointModel->getPoint($member_srl, true); - - $point = $module_config['insert_document']; - if(!isset($point)) $point = $config->insert_document; - $cur_point += $point; - - // 첨부파일 등록에 대한 포인트 추가 - $point = $module_config['upload_file']; - if(!isset($point)) $point = $config->upload_file; - if($obj->uploaded_count) $cur_point += $point * $obj->uploaded_count; - - // 포인트 증감 - $this->setPoint($member_srl,$cur_point); - - return new Object(); - } - - /** - * @brief 임시저장된 글을 정상 등록시 포인트 적용하는 trigger - * 1.2.3 에서 임시저장시에 포인트 지급되지 않도록 변경됨 - **/ - function triggerUpdateDocument(&$obj) { - $oDocumentModel = &getModel('document'); - $oModuleModel = &getModel('module'); - - $document_srl = $obj->document_srl; - $oDocument = $oDocumentModel->getDocument($document_srl); - - $module_srl = $oDocument->get('module_srl'); - $member_srl = $oDocument->get('member_srl'); - if(!$module_srl || !$member_srl) return new Object(); - - // 임시저장된 것이 아니면 return - if($module_srl != $member_srl) return new Object(); - - // point 모듈 정보 가져옴 - $config = $oModuleModel->getModuleConfig('point'); - $module_config = $oModuleModel->getModulePartConfig('point',$obj->module_srl); - - // 대상 회원의 포인트를 구함 - $oPointModel = &getModel('point'); - $cur_point = $oPointModel->getPoint($member_srl, true); - - $point = $module_config['insert_document']; - if(!isset($point)) $point = $config->insert_document; - $cur_point += $point; - - // 첨부파일 등록에 대한 포인트 추가 - $point = $module_config['upload_file']; - if(!isset($point)) $point = $config->upload_file; - if($obj->uploaded_count) $cur_point += $point * $obj->uploaded_count; - - // 포인트 증감 - $this->setPoint($member_srl,$cur_point); - - return new Object(); - - } - - /** - * @brief 게시글 삭제 이전에 게시글의 댓글에 대한 포인트 감소 처리를 하는 trigger - **/ - function triggerBeforeDeleteDocument(&$obj) { - $document_srl = $obj->document_srl; - $member_srl = $obj->member_srl; - - $oDocumentModel = &getModel('document'); - $oDocument = $oDocumentModel->getDocument($document_srl); - if(!$oDocument->isExists()) return new Object(); - - // point 모듈 정보 가져옴 - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('point'); - $module_config = $oModuleModel->getModulePartConfig('point',$oDocument->get('module_srl')); - - // 지울 대상 글의 댓글에 대한 처리 - $comment_point = $module_config['insert_comment']; - if(!isset($comment_point)) $comment_point = $config->insert_comment; - - // 댓글 포인트가 있으면 증감(+) 이면 차감 시도 - if($comment_point>0) return new Object(); - - // 해당 글에 포함된 모든 댓글을 추출 - $cp_args->document_srl = $document_srl; - $output = executeQueryArray('point.getCommentUsers', $cp_args); - - // 대상이 없으면 return - if(!$output->data) return new Object(); - - // 대상 회원 번호를 정리 - $member_srls = array(); - $cnt = count($output->data); - for($i=0;$i<$cnt;$i++) { - if($output->data[$i]->member_srl<1) continue; - $member_srls[abs($output->data[$i]->member_srl)] = $output->data[$i]->count; - } - - // 원글 작성 회원의 번호는 제거 - if($member_srl) unset($member_srls[abs($member_srl)]); - if(!count($member_srls)) return new Object(); - - // 각 회원들을 모두 돌면서 포인트 감소 - $oPointModel = &getModel('point'); - - // 포인트를 구해옴 - $point = $module_config['download_file']; - foreach($member_srls as $member_srl => $cnt) { - $cur_point = $oPointModel->getPoint($member_srl, true); - $cur_point -= $cnt * $comment_point; - $this->setPoint($member_srl,$cur_point); - } - - return new Object(); - } - - /** - * @brief 게시글 삭제 포인트 적용 trigger - **/ - function triggerDeleteDocument(&$obj) { - $module_srl = $obj->module_srl; - $member_srl = $obj->member_srl; - - // 지울 대상 글에 대한 처리 - if(!$module_srl || !$member_srl) return new Object(); - - // 로그인 상태일때만 실행 - $logged_info = Context::get('logged_info'); - if(!$logged_info->member_srl) return new Object(); - - // 대상 회원의 포인트를 구함 - $oPointModel = &getModel('point'); - $cur_point = $oPointModel->getPoint($member_srl, true); - - // point 모듈 정보 가져옴 - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('point'); - $module_config = $oModuleModel->getModulePartConfig('point', $module_srl); - - $point = $module_config['insert_document']; - if(!isset($point)) $point = $config->insert_document; - - // 포인트가 마이너스 즉 글을 작성시 마다 차감되는 경우라면 글 삭제시 증가시켜주지 않도록 수정 - if($point < 0) return new Object(); - $cur_point -= $point; - - // 첨부파일 삭제에 대한 포인트 추가 - $point = $module_config['upload_file']; - if(!isset($point)) $point = $config->upload_file; - if($obj->uploaded_count) $cur_point -= $point * $obj->uploaded_count; - - // 포인트 증감 - $this->setPoint($member_srl,$cur_point); - - return new Object(); - } - - /** - * @brief 댓글 등록 포인트 적용 trigger - **/ - function triggerInsertComment(&$obj) { - $module_srl = $obj->module_srl; - $member_srl = $obj->member_srl; - if(!$module_srl || !$member_srl) return new Object(); - - // 원글이 본인의 글이라면 포인트를 올리지 않음 - $document_srl = $obj->document_srl; - $oDocumentModel = &getModel('document'); - $oDocument = $oDocumentModel->getDocument($document_srl); - if(!$oDocument->isExists() || abs($oDocument->get('member_srl'))==abs($member_srl)) return new Object(); - - // point 모듈 정보 가져옴 - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('point'); - $module_config = $oModuleModel->getModulePartConfig('point', $module_srl); - - // 대상 회원의 포인트를 구함 - $oPointModel = &getModel('point'); - $cur_point = $oPointModel->getPoint($member_srl, true); - - $point = $module_config['insert_comment']; - if(!isset($point)) $point = $config->insert_comment; - - // 포인트 증감 - $cur_point += $point; - $this->setPoint($member_srl,$cur_point); - - return new Object(); - } - - /** - * @brief 댓글 삭제 포인트 적용 trigger - **/ - function triggerDeleteComment(&$obj) { - $oModuleModel = &getModel('module'); - $oPointModel = &getModel('point'); - $oDocumentModel = &getModel('document'); - - $module_srl = $obj->module_srl; - $member_srl = abs($obj->member_srl); - $document_srl = $obj->document_srl; - if(!$module_srl || !$member_srl) return new Object(); - - // 원글을 가져옴 (원글이 없거나 원글이 자신의 글이라면 포인트 적용 하지 않음) - $oDocument = $oDocumentModel->getDocument($document_srl); - if(!$oDocument->isExists()) return new Object(); - if($oDocument->get('member_srl')==$member_srl) return new Object(); - - // point 모듈 정보 가져옴 - $config = $oModuleModel->getModuleConfig('point'); - $module_config = $oModuleModel->getModulePartConfig('point', $module_srl); - - // 대상 회원의 포인트를 구함 - $cur_point = $oPointModel->getPoint($member_srl, true); - - $point = $module_config['insert_comment']; - if(!isset($point)) $point = $config->insert_comment; - - // 포인트가 마이너스 즉 댓글을 작성시 마다 차감되는 경우라면 댓글 삭제시 증가시켜주지 않도록 수정 - if($point < 0) return new Object(); - - // 포인트 증감 - $cur_point -= $point; - $this->setPoint($member_srl,$cur_point); - - return new Object(); - } - - /** - * @brief 파일 등록 trigger 추가 - * 비유효 파일의 등록에 의한 포인트 획득을 방지하고자 이 method는 일단 무효로 둠 - **/ - function triggerInsertFile(&$obj) { - return new Object(); - } - - /** - * @brief 파일 삭제 포인트 적용 trigger - * 유효파일을 삭제할 경우에만 포인트 삭제 - **/ - function triggerDeleteFile(&$obj) { - if($obj->isvalid != 'Y') return new Object(); - - $module_srl = $obj->module_srl; - $member_srl = $obj->member_srl; - if(!$module_srl || !$member_srl) return new Object(); - - // point 모듈 정보 가져옴 - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('point'); - $module_config = $oModuleModel->getModulePartConfig('point', $module_srl); - - // 대상 회원의 포인트를 구함 - $oPointModel = &getModel('point'); - $cur_point = $oPointModel->getPoint($member_srl, true); - - $point = $module_config['upload_file']; - if(!isset($point)) $point = $config->upload_file; - - // 포인트 증감 - $cur_point -= $point; - $this->setPoint($member_srl,$cur_point); - - return new Object(); - } - - /** - * @brief 파일 다운로드 전에 호출되는 trigger - **/ - function triggerBeforeDownloadFile(&$obj) { - $logged_info = Context::get('logged_info'); - $member_srl = $logged_info->member_srl; - $module_srl = $obj->module_srl; - if(!$module_srl) return new Object(); - - // 자신의 올린 파일이면 패스 - if(abs($obj->member_srl) == abs($member_srl)) return new Object(); - - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('point'); - $module_config = $oModuleModel->getModulePartConfig('point', $module_srl); - - // 포인트가 없으면 다운로드가 안되도록 하였으면 비로그인 회원일 경우 중지 - if(!Context::get('is_logged')) - { - if($config->disable_download == 'Y' && isset($module_config['download_file'])) return new Object(-1,'msg_not_permitted_download'); - else return new Object(); - } - - // 대상 회원의 포인트를 구함 - $oPointModel = &getModel('point'); - $cur_point = $oPointModel->getPoint($member_srl, true); - - // 포인트를 구해옴 - $point = $module_config['download_file']; - if(!isset($point)) $point = $config->download_file; - - // 포인트가 0보다 작고 포인트가 없으면 파일 다운로드가 안되도록 했다면 오류 - if($cur_point + $point < 0 && $config->disable_download == 'Y') return new Object(-1,'msg_not_permitted_download'); - - return new Object(); - } - - /** - * @brief 파일 다운로드 포인트 적용 trigger - **/ - function triggerDownloadFile(&$obj) { - // 로그인 상태일때만 실행 - $logged_info = Context::get('logged_info'); - if(!$logged_info->member_srl) return new Object(); - $module_srl = $obj->module_srl; - $member_srl = $logged_info->member_srl; - if(!$module_srl) return new Object(); - - // 자신의 올린 파일이면 패스 - if(abs($obj->member_srl) == abs($member_srl)) return new Object(); - - // point 모듈 정보 가져옴 - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('point'); - $module_config = $oModuleModel->getModulePartConfig('point', $module_srl); - - // 대상 회원의 포인트를 구함 - $oPointModel = &getModel('point'); - $cur_point = $oPointModel->getPoint($member_srl, true); - - // 포인트를 구해옴 - $point = $module_config['download_file']; - if(!isset($point)) $point = $config->download_file; - - // 포인트 증감 - $cur_point += $point; - $this->setPoint($member_srl,$cur_point); - - return new Object(); - } - - /** - * @brief 조회수 증가시 포인트 적용 - * 포인트가 없을때 조회를 하지 못하는 기능의 적용도 실행 - **/ - function triggerUpdateReadedCount(&$obj) { - $oModuleModel = &getModel('module'); - $oPointModel = &getModel('point'); - - // 접속자의 정보 구함 - $logged_info = Context::get('logged_info'); - $member_srl = $logged_info->member_srl; - - // 원글의 회원 번호 구함 - $target_member_srl = abs($obj->get('member_srl')); - - // 원글을 적은 이와 동일하면 조회수 올리지 않고 pass - if($target_member_srl == $member_srl) return new Object(); - - // 모듈별 point 정보 가져옴 - $config = $oModuleModel->getModuleConfig('point'); - $module_config = $oModuleModel->getModulePartConfig('point', $obj->get('module_srl')); - - // 조회 포인트를 구해옴 - $point = $module_config['read_document']; - if(!isset($point)) $point = $config->read_document; - - // 조회 포인트가 없으면 pass - if(!$point) return new Object(); - - // 회원일 경우 읽은 적이 있으면 그냥 pass 하고 그렇지 않으면 현재 포인트 구함 - if($member_srl) { - $args->member_srl = $member_srl; - $args->document_srl = $obj->document_srl; - $output = executeQuery('document.getDocumentReadedLogInfo', $args); - if($output->data->count) return new Object(); - $cur_point = $oPointModel->getPoint($member_srl, true); - } else { - $cur_point = 0; - } - - // 포인트 모듈 기본 설정 가져옴 - $config = $oModuleModel->getModuleConfig('point'); - - // 조회 포인트가 -(마이너스)일때 현재 포인트와 비교 - if($config->disable_read_document == 'Y' && $point < 0 && abs($point)>$cur_point) { - $obj->add('content', sprintf(Context::getLang('msg_disallow_by_point'), abs($point), $cur_point)); - return new Object(); - } - - // 로그인 사용자가 아니라면 pass - if(!$logged_info->member_srl) return new Object(); - - // 조회 포인트가 없으면 패스 - if(!$point) return new Object(); - - // 읽은 기록이 없으면 기록 남김 - $output = executeQuery('document.insertDocumentReadedLog', $args); - - // 포인트 증감 - $cur_point += $point; - $this->setPoint($member_srl,$cur_point); - - return new Object(); - } - - /** - * @brief 추천/비추천 시 포인트 적용 - **/ - - function triggerUpdateVotedCount(&$obj) { - $module_srl = $obj->module_srl; - $member_srl = $obj->member_srl; - if(!$module_srl || !$member_srl) return new Object(); - - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('point'); - $module_config = $oModuleModel->getModulePartConfig('point', $module_srl); - - $oPointModel = &getModel('point'); - $cur_point = $oPointModel->getPoint($member_srl, true); - - if( $obj->point > 0 ) { - $point = $module_config['voted']; - if(!isset($point)) $point = $config->voted; - } else { - $point = $module_config['blamed']; - if(!isset($point)) $point = $config->blamed; - } - - if(!$point) return new Object(); - - // 포인트 증감 - $cur_point += $point; - $this->setPoint($member_srl,$cur_point); - - return new Object(); - } - - /** - * @brief 포인트 설정 - **/ - function setPoint($member_srl, $point, $mode = null) { - $member_srl = abs($member_srl); - $mode_arr = array('add', 'minus', 'update', 'signup'); - if(!$mode || !in_array($mode,$mode_arr)) $mode = 'update'; - - // 설정 정보 가져오기 - $oMemberModel = &getModel('member'); - $oModuleModel = &getModel('module'); - $oPointModel = &getModel('point'); - $config = $oModuleModel->getModuleConfig('point'); - - // 기존 포인트 정보를 구함 - $prev_point = $oPointModel->getPoint($member_srl, true); - $prev_level = $oPointModel->getLevel($prev_point, $config->level_step); - - // 포인트 변경 - $args->member_srl = $member_srl; - $args->point = $prev_point; - - switch($mode) { - - case 'add' : - $args->point += $point; - break; - case 'minus' : - $args->point -= $point; - break; - case 'update' : - $args->point = $point; - break; - case 'signup' : - $args->point = $point; - break; - } - if($args->point < 0) $args->point = 0; - $point = $args->point; - - // 포인트가 있으면 update, 없으면 insert - $oPointModel = &getModel('point'); - if($oPointModel->isExistsPoint($member_srl)) executeQuery("point.updatePoint", $args); - else executeQuery("point.insertPoint", $args); - - // 새로운 레벨을 구함 - $level = $oPointModel->getLevel($point, $config->level_step); - - // 기존 레벨과 새로운 레벨이 다르면 포인트 그룹 설정 시도 - if($level != $prev_level) { - - // 현재 포인트 대비하여 레벨을 계산하고 레벨에 맞는 그룹 설정을 체크 - $point_group = $config->point_group; - - // 포인트 그룹 정보가 있을때 시행 - if($point_group && is_array($point_group) && count($point_group) ) { - - // 기본 그룹을 구함 - $default_group = $oMemberModel->getDefaultGroup(); - - // 제거될 그룹과 새로 부여 받을 그룹을 구함 - $del_group_list = array(); - $new_group_srls = array(); - - asort($point_group); - - //그룹 초기화 후 재설정 - if($config->group_reset != 'N') { - //새로운 레벨에 맞는 그룹이 있다면 - if(in_array($level, $point_group)) { - //현재 레벨의 그룹을 제외한 나머지는 모두 삭제 - foreach($point_group as $group_srl => $target_level) { - $del_group_list[] = $group_srl; - if($target_level == $level) $new_group_srls[] = $group_srl; - } - } - //그렇지 않고 레벨 감소인 경우 바로 이전 그룹을 추가 - else { - $i = $level; - while($i > 0) { - if(in_array($i, $point_group)) { - foreach($point_group as $group_srl => $target_level) { - if ($target_level == $i) { - $new_group_srls[] = $group_srl; - } - } - $i = 0; - } - - $i--; - } - } - - //현재 레벨보다 높은 레벨의 그룹은 삭제 - foreach($point_group as $group_srl => $target_level) { - if($target_level > $level) $del_group_list[] = $group_srl; - } - } - //새 그룹만 부여 - else { - // 포인트 그룹 설정을 돌면서 현재 레벨까지 체크 - foreach($point_group as $group_srl => $target_level) { - $del_group_list[] = $group_srl; - if($target_level <= $level) $new_group_srls[] = $group_srl; - } - } - - // 만약 새로운 그룹이 없다면 기본 그룹을 부여 받음 - if(!$new_group_srls[0]) $new_group_srls[0] = $default_group->group_srl; - - // 연동 그룹 제거 - if($del_group_list && count($del_group_list)) { - $del_group_args->member_srl = $member_srl; - $del_group_args->group_srl = implode(',', $del_group_list); - $del_group_output = executeQuery('point.deleteMemberGroup', $del_group_args); - } - - // 새로운 그룹을 부여 - foreach($new_group_srls as $group_srl) { - $new_group_args->member_srl = $member_srl; - $new_group_args->group_srl = $group_srl; - executeQuery('member.addMemberToGroup', $new_group_args); - } - } - } - - // 캐시 설정 - $cache_path = sprintf('./files/member_extra_info/point/%s/', getNumberingPath($member_srl)); - FileHandler::makedir($cache_path); - - $cache_filename = sprintf('%s%d.cache.txt', $cache_path, $member_srl); - FileHandler::writeFile($cache_filename, $point); - - return $output; - } - } -?> +getModuleConfig('point'); + + // 가입한 회원의 member_srl을 구함 + $member_srl = $obj->member_srl; + + // 대상 회원의 포인트를 구함 + $oPointModel = &getModel('point'); + $cur_point = $oPointModel->getPoint($member_srl, true); + + $point = $config->signup_point; + + // 포인트 증감 + $cur_point += $point; + $this->setPoint($member_srl,$cur_point, 'signup'); + + return new Object(); + } + + /** + * @brief 회원 로그인 포인트 적용 trigger + **/ + function triggerAfterLogin(&$obj) { + $member_srl = $obj->member_srl; + if(!$member_srl) return new Object(); + + // 바로 이전 로그인이 오늘이 아니어야 포인트를 줌 + if(substr($obj->last_login,0,8)==date("Ymd")) return new Object(); + + // point 모듈 정보 가져옴 + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('point'); + + // 대상 회원의 포인트를 구함 + $oPointModel = &getModel('point'); + $cur_point = $oPointModel->getPoint($member_srl, true); + + $point = $config->login_point; + + // 포인트 증감 + $cur_point += $point; + $this->setPoint($member_srl,$cur_point); + + return new Object(); + } + + /** + * @brief 게시글 등록 포인트 적용 trigger + **/ + function triggerInsertDocument(&$obj) { + $module_srl = $obj->module_srl; + $member_srl = $obj->member_srl; + if(!$module_srl || !$member_srl) return new Object(); + + // 임시저장일 경우 포인트를 지급하지 않도록 수정 + if($module_srl == $member_srl) return new Object(); + + // point 모듈 정보 가져옴 + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('point'); + $module_config = $oModuleModel->getModulePartConfig('point',$module_srl); + + // 대상 회원의 포인트를 구함 + $oPointModel = &getModel('point'); + $cur_point = $oPointModel->getPoint($member_srl, true); + + $point = $module_config['insert_document']; + if(!isset($point)) $point = $config->insert_document; + $cur_point += $point; + + // 첨부파일 등록에 대한 포인트 추가 + $point = $module_config['upload_file']; + if(!isset($point)) $point = $config->upload_file; + if($obj->uploaded_count) $cur_point += $point * $obj->uploaded_count; + + // 포인트 증감 + $this->setPoint($member_srl,$cur_point); + + return new Object(); + } + + /** + * @brief 임시저장된 글을 정상 등록시 포인트 적용하는 trigger + * 1.2.3 에서 임시저장시에 포인트 지급되지 않도록 변경됨 + **/ + function triggerUpdateDocument(&$obj) { + $oDocumentModel = &getModel('document'); + $oModuleModel = &getModel('module'); + + $document_srl = $obj->document_srl; + $oDocument = $oDocumentModel->getDocument($document_srl); + + $module_srl = $oDocument->get('module_srl'); + $member_srl = $oDocument->get('member_srl'); + if(!$module_srl || !$member_srl) return new Object(); + + // 임시저장된 것이 아니면 return + if($module_srl != $member_srl) return new Object(); + + // point 모듈 정보 가져옴 + $config = $oModuleModel->getModuleConfig('point'); + $module_config = $oModuleModel->getModulePartConfig('point',$obj->module_srl); + + // 대상 회원의 포인트를 구함 + $oPointModel = &getModel('point'); + $cur_point = $oPointModel->getPoint($member_srl, true); + + $point = $module_config['insert_document']; + if(!isset($point)) $point = $config->insert_document; + $cur_point += $point; + + // 첨부파일 등록에 대한 포인트 추가 + $point = $module_config['upload_file']; + if(!isset($point)) $point = $config->upload_file; + if($obj->uploaded_count) $cur_point += $point * $obj->uploaded_count; + + // 포인트 증감 + $this->setPoint($member_srl,$cur_point); + + return new Object(); + + } + + /** + * @brief 게시글 삭제 이전에 게시글의 댓글에 대한 포인트 감소 처리를 하는 trigger + **/ + function triggerBeforeDeleteDocument(&$obj) { + $document_srl = $obj->document_srl; + $member_srl = $obj->member_srl; + + $oDocumentModel = &getModel('document'); + $oDocument = $oDocumentModel->getDocument($document_srl); + if(!$oDocument->isExists()) return new Object(); + + // point 모듈 정보 가져옴 + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('point'); + $module_config = $oModuleModel->getModulePartConfig('point',$oDocument->get('module_srl')); + + // 지울 대상 글의 댓글에 대한 처리 + $comment_point = $module_config['insert_comment']; + if(!isset($comment_point)) $comment_point = $config->insert_comment; + + // 댓글 포인트가 있으면 증감(+) 이면 차감 시도 + if($comment_point>0) return new Object(); + + // 해당 글에 포함된 모든 댓글을 추출 + $cp_args->document_srl = $document_srl; + $output = executeQueryArray('point.getCommentUsers', $cp_args); + + // 대상이 없으면 return + if(!$output->data) return new Object(); + + // 대상 회원 번호를 정리 + $member_srls = array(); + $cnt = count($output->data); + for($i=0;$i<$cnt;$i++) { + if($output->data[$i]->member_srl<1) continue; + $member_srls[abs($output->data[$i]->member_srl)] = $output->data[$i]->count; + } + + // 원글 작성 회원의 번호는 제거 + if($member_srl) unset($member_srls[abs($member_srl)]); + if(!count($member_srls)) return new Object(); + + // 각 회원들을 모두 돌면서 포인트 감소 + $oPointModel = &getModel('point'); + + // 포인트를 구해옴 + $point = $module_config['download_file']; + foreach($member_srls as $member_srl => $cnt) { + $cur_point = $oPointModel->getPoint($member_srl, true); + $cur_point -= $cnt * $comment_point; + $this->setPoint($member_srl,$cur_point); + } + + return new Object(); + } + + /** + * @brief 게시글 삭제 포인트 적용 trigger + **/ + function triggerDeleteDocument(&$obj) { + $module_srl = $obj->module_srl; + $member_srl = $obj->member_srl; + + // 지울 대상 글에 대한 처리 + if(!$module_srl || !$member_srl) return new Object(); + + // 로그인 상태일때만 실행 + $logged_info = Context::get('logged_info'); + if(!$logged_info->member_srl) return new Object(); + + // 대상 회원의 포인트를 구함 + $oPointModel = &getModel('point'); + $cur_point = $oPointModel->getPoint($member_srl, true); + + // point 모듈 정보 가져옴 + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('point'); + $module_config = $oModuleModel->getModulePartConfig('point', $module_srl); + + $point = $module_config['insert_document']; + if(!isset($point)) $point = $config->insert_document; + + // 포인트가 마이너스 즉 글을 작성시 마다 차감되는 경우라면 글 삭제시 증가시켜주지 않도록 수정 + if($point < 0) return new Object(); + $cur_point -= $point; + + // 첨부파일 삭제에 대한 포인트 추가 + $point = $module_config['upload_file']; + if(!isset($point)) $point = $config->upload_file; + if($obj->uploaded_count) $cur_point -= $point * $obj->uploaded_count; + + // 포인트 증감 + $this->setPoint($member_srl,$cur_point); + + return new Object(); + } + + /** + * @brief 댓글 등록 포인트 적용 trigger + **/ + function triggerInsertComment(&$obj) { + $module_srl = $obj->module_srl; + $member_srl = $obj->member_srl; + if(!$module_srl || !$member_srl) return new Object(); + + // 원글이 본인의 글이라면 포인트를 올리지 않음 + $document_srl = $obj->document_srl; + $oDocumentModel = &getModel('document'); + $oDocument = $oDocumentModel->getDocument($document_srl); + if(!$oDocument->isExists() || abs($oDocument->get('member_srl'))==abs($member_srl)) return new Object(); + + // point 모듈 정보 가져옴 + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('point'); + $module_config = $oModuleModel->getModulePartConfig('point', $module_srl); + + // 대상 회원의 포인트를 구함 + $oPointModel = &getModel('point'); + $cur_point = $oPointModel->getPoint($member_srl, true); + + $point = $module_config['insert_comment']; + if(!isset($point)) $point = $config->insert_comment; + + // 포인트 증감 + $cur_point += $point; + $this->setPoint($member_srl,$cur_point); + + return new Object(); + } + + /** + * @brief 댓글 삭제 포인트 적용 trigger + **/ + function triggerDeleteComment(&$obj) { + $oModuleModel = &getModel('module'); + $oPointModel = &getModel('point'); + $oDocumentModel = &getModel('document'); + + $module_srl = $obj->module_srl; + $member_srl = abs($obj->member_srl); + $document_srl = $obj->document_srl; + if(!$module_srl || !$member_srl) return new Object(); + + // 원글을 가져옴 (원글이 없거나 원글이 자신의 글이라면 포인트 적용 하지 않음) + $oDocument = $oDocumentModel->getDocument($document_srl); + if(!$oDocument->isExists()) return new Object(); + if($oDocument->get('member_srl')==$member_srl) return new Object(); + + // point 모듈 정보 가져옴 + $config = $oModuleModel->getModuleConfig('point'); + $module_config = $oModuleModel->getModulePartConfig('point', $module_srl); + + // 대상 회원의 포인트를 구함 + $cur_point = $oPointModel->getPoint($member_srl, true); + + $point = $module_config['insert_comment']; + if(!isset($point)) $point = $config->insert_comment; + + // 포인트가 마이너스 즉 댓글을 작성시 마다 차감되는 경우라면 댓글 삭제시 증가시켜주지 않도록 수정 + if($point < 0) return new Object(); + + // 포인트 증감 + $cur_point -= $point; + $this->setPoint($member_srl,$cur_point); + + return new Object(); + } + + /** + * @brief 파일 등록 trigger 추가 + * 비유효 파일의 등록에 의한 포인트 획득을 방지하고자 이 method는 일단 무효로 둠 + **/ + function triggerInsertFile(&$obj) { + return new Object(); + } + + /** + * @brief 파일 삭제 포인트 적용 trigger + * 유효파일을 삭제할 경우에만 포인트 삭제 + **/ + function triggerDeleteFile(&$obj) { + if($obj->isvalid != 'Y') return new Object(); + + $module_srl = $obj->module_srl; + $member_srl = $obj->member_srl; + if(!$module_srl || !$member_srl) return new Object(); + + // point 모듈 정보 가져옴 + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('point'); + $module_config = $oModuleModel->getModulePartConfig('point', $module_srl); + + // 대상 회원의 포인트를 구함 + $oPointModel = &getModel('point'); + $cur_point = $oPointModel->getPoint($member_srl, true); + + $point = $module_config['upload_file']; + if(!isset($point)) $point = $config->upload_file; + + // 포인트 증감 + $cur_point -= $point; + $this->setPoint($member_srl,$cur_point); + + return new Object(); + } + + /** + * @brief 파일 다운로드 전에 호출되는 trigger + **/ + function triggerBeforeDownloadFile(&$obj) { + $logged_info = Context::get('logged_info'); + $member_srl = $logged_info->member_srl; + $module_srl = $obj->module_srl; + if(!$module_srl) return new Object(); + + // 자신의 올린 파일이면 패스 + if(abs($obj->member_srl) == abs($member_srl)) return new Object(); + + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('point'); + $module_config = $oModuleModel->getModulePartConfig('point', $module_srl); + + // 포인트가 없으면 다운로드가 안되도록 하였으면 비로그인 회원일 경우 중지 + if(!Context::get('is_logged')) + { + if($config->disable_download == 'Y' && isset($module_config['download_file'])) return new Object(-1,'msg_not_permitted_download'); + else return new Object(); + } + + // 대상 회원의 포인트를 구함 + $oPointModel = &getModel('point'); + $cur_point = $oPointModel->getPoint($member_srl, true); + + // 포인트를 구해옴 + $point = $module_config['download_file']; + if(!isset($point)) $point = $config->download_file; + + // 포인트가 0보다 작고 포인트가 없으면 파일 다운로드가 안되도록 했다면 오류 + if($cur_point + $point < 0 && $config->disable_download == 'Y') return new Object(-1,'msg_not_permitted_download'); + + return new Object(); + } + + /** + * @brief 파일 다운로드 포인트 적용 trigger + **/ + function triggerDownloadFile(&$obj) { + // 로그인 상태일때만 실행 + $logged_info = Context::get('logged_info'); + if(!$logged_info->member_srl) return new Object(); + $module_srl = $obj->module_srl; + $member_srl = $logged_info->member_srl; + if(!$module_srl) return new Object(); + + // 자신의 올린 파일이면 패스 + if(abs($obj->member_srl) == abs($member_srl)) return new Object(); + + // point 모듈 정보 가져옴 + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('point'); + $module_config = $oModuleModel->getModulePartConfig('point', $module_srl); + + // 대상 회원의 포인트를 구함 + $oPointModel = &getModel('point'); + $cur_point = $oPointModel->getPoint($member_srl, true); + + // 포인트를 구해옴 + $point = $module_config['download_file']; + if(!isset($point)) $point = $config->download_file; + + // 포인트 증감 + $cur_point += $point; + $this->setPoint($member_srl,$cur_point); + + return new Object(); + } + + /** + * @brief 조회수 증가시 포인트 적용 + * 포인트가 없을때 조회를 하지 못하는 기능의 적용도 실행 + **/ + function triggerUpdateReadedCount(&$obj) { + $oModuleModel = &getModel('module'); + $oPointModel = &getModel('point'); + + // 접속자의 정보 구함 + $logged_info = Context::get('logged_info'); + $member_srl = $logged_info->member_srl; + + // 원글의 회원 번호 구함 + $target_member_srl = abs($obj->get('member_srl')); + + // 원글을 적은 이와 동일하면 조회수 올리지 않고 pass + if($target_member_srl == $member_srl) return new Object(); + + // 모듈별 point 정보 가져옴 + $config = $oModuleModel->getModuleConfig('point'); + $module_config = $oModuleModel->getModulePartConfig('point', $obj->get('module_srl')); + + // 조회 포인트를 구해옴 + $point = $module_config['read_document']; + if(!isset($point)) $point = $config->read_document; + + // 조회 포인트가 없으면 pass + if(!$point) return new Object(); + + // 회원일 경우 읽은 적이 있으면 그냥 pass 하고 그렇지 않으면 현재 포인트 구함 + if($member_srl) { + $args->member_srl = $member_srl; + $args->document_srl = $obj->document_srl; + $output = executeQuery('document.getDocumentReadedLogInfo', $args); + if($output->data->count) return new Object(); + $cur_point = $oPointModel->getPoint($member_srl, true); + } else { + $cur_point = 0; + } + + // 포인트 모듈 기본 설정 가져옴 + $config = $oModuleModel->getModuleConfig('point'); + + // 조회 포인트가 -(마이너스)일때 현재 포인트와 비교 + if($config->disable_read_document == 'Y' && $point < 0 && abs($point)>$cur_point) { + $obj->add('content', sprintf(Context::getLang('msg_disallow_by_point'), abs($point), $cur_point)); + return new Object(); + } + + // 로그인 사용자가 아니라면 pass + if(!$logged_info->member_srl) return new Object(); + + // 조회 포인트가 없으면 패스 + if(!$point) return new Object(); + + // 읽은 기록이 없으면 기록 남김 + $output = executeQuery('document.insertDocumentReadedLog', $args); + + // 포인트 증감 + $cur_point += $point; + $this->setPoint($member_srl,$cur_point); + + return new Object(); + } + + /** + * @brief 추천/비추천 시 포인트 적용 + **/ + + function triggerUpdateVotedCount(&$obj) { + $module_srl = $obj->module_srl; + $member_srl = $obj->member_srl; + if(!$module_srl || !$member_srl) return new Object(); + + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('point'); + $module_config = $oModuleModel->getModulePartConfig('point', $module_srl); + + $oPointModel = &getModel('point'); + $cur_point = $oPointModel->getPoint($member_srl, true); + + if( $obj->point > 0 ) { + $point = $module_config['voted']; + if(!isset($point)) $point = $config->voted; + } else { + $point = $module_config['blamed']; + if(!isset($point)) $point = $config->blamed; + } + + if(!$point) return new Object(); + + // 포인트 증감 + $cur_point += $point; + $this->setPoint($member_srl,$cur_point); + + return new Object(); + } + + /** + * @brief 포인트 설정 + **/ + function setPoint($member_srl, $point, $mode = null) { + $member_srl = abs($member_srl); + $mode_arr = array('add', 'minus', 'update', 'signup'); + if(!$mode || !in_array($mode,$mode_arr)) $mode = 'update'; + + // 설정 정보 가져오기 + $oMemberModel = &getModel('member'); + $oModuleModel = &getModel('module'); + $oPointModel = &getModel('point'); + $config = $oModuleModel->getModuleConfig('point'); + + // 기존 포인트 정보를 구함 + $prev_point = $oPointModel->getPoint($member_srl, true); + $prev_level = $oPointModel->getLevel($prev_point, $config->level_step); + + // 포인트 변경 + $args->member_srl = $member_srl; + $args->point = $prev_point; + + switch($mode) { + + case 'add' : + $args->point += $point; + break; + case 'minus' : + $args->point -= $point; + break; + case 'update' : + $args->point = $point; + break; + case 'signup' : + $args->point = $point; + break; + } + if($args->point < 0) $args->point = 0; + $point = $args->point; + + // 포인트가 있으면 update, 없으면 insert + $oPointModel = &getModel('point'); + if($oPointModel->isExistsPoint($member_srl)) executeQuery("point.updatePoint", $args); + else executeQuery("point.insertPoint", $args); + + // 새로운 레벨을 구함 + $level = $oPointModel->getLevel($point, $config->level_step); + + // 기존 레벨과 새로운 레벨이 다르면 포인트 그룹 설정 시도 + if($level != $prev_level) { + + // 현재 포인트 대비하여 레벨을 계산하고 레벨에 맞는 그룹 설정을 체크 + $point_group = $config->point_group; + + // 포인트 그룹 정보가 있을때 시행 + if($point_group && is_array($point_group) && count($point_group) ) { + + // 기본 그룹을 구함 + $default_group = $oMemberModel->getDefaultGroup(); + + // 제거될 그룹과 새로 부여 받을 그룹을 구함 + $del_group_list = array(); + $new_group_srls = array(); + + asort($point_group); + + //그룹 초기화 후 재설정 + if($config->group_reset != 'N') { + //새로운 레벨에 맞는 그룹이 있다면 + if(in_array($level, $point_group)) { + //현재 레벨의 그룹을 제외한 나머지는 모두 삭제 + foreach($point_group as $group_srl => $target_level) { + $del_group_list[] = $group_srl; + if($target_level == $level) $new_group_srls[] = $group_srl; + } + } + //그렇지 않고 레벨 감소인 경우 바로 이전 그룹을 추가 + else { + $i = $level; + while($i > 0) { + if(in_array($i, $point_group)) { + foreach($point_group as $group_srl => $target_level) { + if ($target_level == $i) { + $new_group_srls[] = $group_srl; + } + } + $i = 0; + } + + $i--; + } + } + + //현재 레벨보다 높은 레벨의 그룹은 삭제 + foreach($point_group as $group_srl => $target_level) { + if($target_level > $level) $del_group_list[] = $group_srl; + } + } + //새 그룹만 부여 + else { + // 포인트 그룹 설정을 돌면서 현재 레벨까지 체크 + foreach($point_group as $group_srl => $target_level) { + $del_group_list[] = $group_srl; + if($target_level <= $level) $new_group_srls[] = $group_srl; + } + } + + // 만약 새로운 그룹이 없다면 기본 그룹을 부여 받음 + if(!$new_group_srls[0]) $new_group_srls[0] = $default_group->group_srl; + + // 연동 그룹 제거 + if($del_group_list && count($del_group_list)) { + $del_group_args->member_srl = $member_srl; + $del_group_args->group_srl = implode(',', $del_group_list); + $del_group_output = executeQuery('point.deleteMemberGroup', $del_group_args); + } + + // 새로운 그룹을 부여 + foreach($new_group_srls as $group_srl) { + $new_group_args->member_srl = $member_srl; + $new_group_args->group_srl = $group_srl; + executeQuery('member.addMemberToGroup', $new_group_args); + } + } + } + + // 캐시 설정 + $cache_path = sprintf('./files/member_extra_info/point/%s/', getNumberingPath($member_srl)); + FileHandler::makedir($cache_path); + + $cache_filename = sprintf('%s%d.cache.txt', $cache_path, $member_srl); + FileHandler::writeFile($cache_filename, $point); + + return $output; + } + } +?> diff --git a/modules/point/point.model.php b/modules/point/point.model.php index a7da64224..d1c50a78e 100644 --- a/modules/point/point.model.php +++ b/modules/point/point.model.php @@ -1,146 +1,146 @@ -member_srl = $member_srl; - $output = executeQuery('point.getPoint', $args); - if($output->data->member_srl == $member_srl) return true; - return false; - } - - /** - * @brief 포인트를 구해옴 - **/ - function getPoint($member_srl, $from_db = false) { - $member_srl = abs($member_srl); - $path = sprintf('./files/member_extra_info/point/%s',getNumberingPath($member_srl)); - if(!is_dir($path)) FileHandler::makeDir($path); - $cache_filename = sprintf('%s%d.cache.txt', $path, $member_srl); - - if(!$from_db && file_exists($cache_filename)) return trim(FileHandler::readFile($cache_filename)); - - // DB에서 가져옴 - $args->member_srl = $member_srl; - $output = executeQuery('point.getPoint', $args); - $point = (int)$output->data->point; - - FileHandler::writeFile($cache_filename, $point); - - return $point; - } - - /** - * @brief 레벨을 구함 - **/ - function getLevel($point, $level_step) { - $level_count = count($level_step); - for($level=0;$level<=$level_count;$level++) if($point < $level_step[$level]) break; - $level --; - return $level; - } - - function getMembersPointInfo() - { - $member_srls = Context::get('member_srls'); - $member_srls = explode(',',$member_srls); - if(count($member_srls)==0) return; - array_unique($member_srls); - - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('point'); - - $info = array(); - foreach($member_srls as $v) - { - $obj = new stdClass; - $obj->point = $this->getPoint($v); - $obj->level = $this->getLevel($obj->point, $config->level_step); - $obj->member_srl = $v; - $info[] = $obj; - } - - $this->add('point_info',$info); - } - - - /** - * @brief 포인트 순 회원목록 가져오기 - **/ - function getMemberList($args = null) { - - // 검색 옵션 정리 - $args->is_admin = Context::get('is_admin')=='Y'?'Y':''; - $args->is_denied = Context::get('is_denied')=='Y'?'Y':''; - $args->selected_group_srl = Context::get('selected_group_srl'); - - $search_target = trim(Context::get('search_target')); - $search_keyword = trim(Context::get('search_keyword')); - - if($search_target && $search_keyword) { - switch($search_target) { - case 'user_id' : - if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); - $args->s_user_id = $search_keyword; - break; - case 'user_name' : - if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); - $args->s_user_name = $search_keyword; - break; - case 'nick_name' : - if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); - $args->s_nick_name = $search_keyword; - break; - case 'email_address' : - if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); - $args->s_email_address = $search_keyword; - break; - case 'regdate' : - $args->s_regdate = $search_keyword; - break; - case 'last_login' : - $args->s_last_login = $search_keyword; - break; - case 'extra_vars' : - $args->s_extra_vars = $search_keyword; - break; - } - } - - // selected_group_srl이 있으면 query id를 변경 (table join때문에) - if($args->selected_group_srl) { - $query_id = 'point.getMemberListWithinGroup'; - } else { - $query_id = 'point.getMemberList'; - } - - $output = executeQuery($query_id, $args); - - if($output->total_count) { - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('point'); - - foreach($output->data as $key => $val) { - $output->data[$key]->level = $this->getLevel($val->point, $config->level_step); - } - } - - return $output; - } - } -?> +member_srl = $member_srl; + $output = executeQuery('point.getPoint', $args); + if($output->data->member_srl == $member_srl) return true; + return false; + } + + /** + * @brief 포인트를 구해옴 + **/ + function getPoint($member_srl, $from_db = false) { + $member_srl = abs($member_srl); + $path = sprintf('./files/member_extra_info/point/%s',getNumberingPath($member_srl)); + if(!is_dir($path)) FileHandler::makeDir($path); + $cache_filename = sprintf('%s%d.cache.txt', $path, $member_srl); + + if(!$from_db && file_exists($cache_filename)) return trim(FileHandler::readFile($cache_filename)); + + // DB에서 가져옴 + $args->member_srl = $member_srl; + $output = executeQuery('point.getPoint', $args); + $point = (int)$output->data->point; + + FileHandler::writeFile($cache_filename, $point); + + return $point; + } + + /** + * @brief 레벨을 구함 + **/ + function getLevel($point, $level_step) { + $level_count = count($level_step); + for($level=0;$level<=$level_count;$level++) if($point < $level_step[$level]) break; + $level --; + return $level; + } + + function getMembersPointInfo() + { + $member_srls = Context::get('member_srls'); + $member_srls = explode(',',$member_srls); + if(count($member_srls)==0) return; + array_unique($member_srls); + + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('point'); + + $info = array(); + foreach($member_srls as $v) + { + $obj = new stdClass; + $obj->point = $this->getPoint($v); + $obj->level = $this->getLevel($obj->point, $config->level_step); + $obj->member_srl = $v; + $info[] = $obj; + } + + $this->add('point_info',$info); + } + + + /** + * @brief 포인트 순 회원목록 가져오기 + **/ + function getMemberList($args = null) { + + // 검색 옵션 정리 + $args->is_admin = Context::get('is_admin')=='Y'?'Y':''; + $args->is_denied = Context::get('is_denied')=='Y'?'Y':''; + $args->selected_group_srl = Context::get('selected_group_srl'); + + $search_target = trim(Context::get('search_target')); + $search_keyword = trim(Context::get('search_keyword')); + + if($search_target && $search_keyword) { + switch($search_target) { + case 'user_id' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_user_id = $search_keyword; + break; + case 'user_name' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_user_name = $search_keyword; + break; + case 'nick_name' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_nick_name = $search_keyword; + break; + case 'email_address' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_email_address = $search_keyword; + break; + case 'regdate' : + $args->s_regdate = $search_keyword; + break; + case 'last_login' : + $args->s_last_login = $search_keyword; + break; + case 'extra_vars' : + $args->s_extra_vars = $search_keyword; + break; + } + } + + // selected_group_srl이 있으면 query id를 변경 (table join때문에) + if($args->selected_group_srl) { + $query_id = 'point.getMemberListWithinGroup'; + } else { + $query_id = 'point.getMemberList'; + } + + $output = executeQuery($query_id, $args); + + if($output->total_count) { + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('point'); + + foreach($output->data as $key => $val) { + $output->data[$key]->level = $this->getLevel($val->point, $config->level_step); + } + } + + return $output; + } + } +?> diff --git a/modules/point/point.view.php b/modules/point/point.view.php index d1e88e9ff..0ed06cc72 100644 --- a/modules/point/point.view.php +++ b/modules/point/point.view.php @@ -1,62 +1,62 @@ -module_srl; - if(!$current_module_srl) return new Object(); - } - - // 설정 정보 가져오기 - $oModuleModel = &getModel('module'); - - if($current_module_srl) { - $module_config = $oModuleModel->getModulePartConfig('point', $current_module_srl); - if(!$module_config) { - $config = $oModuleModel->getModuleConfig('point'); - $module_config['insert_document'] = $config->insert_document; - $module_config['insert_comment'] = $config->insert_comment; - $module_config['upload_file'] = $config->upload_file; - $module_config['download_file'] = $config->download_file; - $module_config['read_document'] = $config->read_document; - $module_config['voted'] = $config->voted; - $module_config['blamed'] = $config->blamed; - } - } - - $module_config['module_srl'] = $current_module_srl; - $module_config['point_name'] = $config->point_name; - Context::set('module_config', $module_config); - - // 템플릿 파일 지정 - $oTemplate = &TemplateHandler::getInstance(); - $tpl = $oTemplate->compile($this->module_path.'tpl', 'point_module_config'); - $obj .= $tpl; - - return new Object(); - } - } -?> +module_srl; + if(!$current_module_srl) return new Object(); + } + + // 설정 정보 가져오기 + $oModuleModel = &getModel('module'); + + if($current_module_srl) { + $module_config = $oModuleModel->getModulePartConfig('point', $current_module_srl); + if(!$module_config) { + $config = $oModuleModel->getModuleConfig('point'); + $module_config['insert_document'] = $config->insert_document; + $module_config['insert_comment'] = $config->insert_comment; + $module_config['upload_file'] = $config->upload_file; + $module_config['download_file'] = $config->download_file; + $module_config['read_document'] = $config->read_document; + $module_config['voted'] = $config->voted; + $module_config['blamed'] = $config->blamed; + } + } + + $module_config['module_srl'] = $current_module_srl; + $module_config['point_name'] = $config->point_name; + Context::set('module_config', $module_config); + + // 템플릿 파일 지정 + $oTemplate = &TemplateHandler::getInstance(); + $tpl = $oTemplate->compile($this->module_path.'tpl', 'point_module_config'); + $obj .= $tpl; + + return new Object(); + } + } +?> diff --git a/modules/point/queries/getMemberCount.xml b/modules/point/queries/getMemberCount.xml index e59d056e1..24779b32f 100644 --- a/modules/point/queries/getMemberCount.xml +++ b/modules/point/queries/getMemberCount.xml @@ -1,8 +1,8 @@ - - - - - - - + + +
    + + + + \ No newline at end of file diff --git a/modules/point/queries/getPointCount.xml b/modules/point/queries/getPointCount.xml index d336275cf..669a451c2 100644 --- a/modules/point/queries/getPointCount.xml +++ b/modules/point/queries/getPointCount.xml @@ -1,8 +1,8 @@ - - -
    - - - - + + +
    + + + + \ No newline at end of file diff --git a/modules/point/tpl/js/point_admin.js b/modules/point/tpl/js/point_admin.js index 1bfe63f89..3f52045fe 100644 --- a/modules/point/tpl/js/point_admin.js +++ b/modules/point/tpl/js/point_admin.js @@ -1,70 +1,70 @@ -/** - * @file modules/point/js/point_admin.js - * @author NHN (developers@xpressengine.com) - * @brief point 모듈의 관리자용 javascript - **/ - -function exp_calc (form, reset) { - var fo_obj = xGetElementById(form) - var level = fo_obj.max_level.value - var exp = fo_obj.expression - var exp_default = "Math.pow(i, 2) * 90" - - if(reset || !exp.value) exp.value = exp_default - - for(i = 1; i <= level; i++) { - point = eval("fo_obj.level_step_" + i) - point.value = eval(exp.value); - } -} - -/** - * @brief 포인트를 전부 체크하여 재계산하는 action 호출 - **/ -function doPointRecal() { - - var params = new Array(); - var response_tags = new Array('error','message','total', 'position'); - - exec_xml('point','procPointAdminReCal',params, completePointRecal, response_tags); -} - -function completePointRecal(ret_obj) { - var total = ret_obj['total']; - var message = ret_obj['message']; - var position = ret_obj['position']; - - if(position == total) { - xInnerHtml('pointReCal', message); - alert(message); - location.reload(); - } else { - xInnerHtml('pointReCal', message); - - var params = new Array(); - params['position'] = position; - params['total'] = total; - var response_tags = new Array('error','message','total', 'position'); - - exec_xml('point','procPointAdminApplyPoint',params, completePointRecal, response_tags); - } -} - -function updatePoint(member_srl, action) -{ - var pointEl = jQuery("#point_"+member_srl); - var e = jQuery("#update_member_srl").val(member_srl); - e = jQuery("#update_action").val(action); - e = jQuery("#update_point").val(pointEl.attr("value")); - var hF = jQuery("#updateForm").get(0); - procFilter(hF, update_point); -} - - -function doPointReset(module_srls) { - var params = new Array(); - var response_tags = new Array('error','message'); - params['module_srls'] = module_srls; - - exec_xml('point','procPointAdminReset',params,function(ret_obj) {alert(ret_obj['message']);}, response_tags); -} +/** + * @file modules/point/js/point_admin.js + * @author NHN (developers@xpressengine.com) + * @brief point 모듈의 관리자용 javascript + **/ + +function exp_calc (form, reset) { + var fo_obj = xGetElementById(form) + var level = fo_obj.max_level.value + var exp = fo_obj.expression + var exp_default = "Math.pow(i, 2) * 90" + + if(reset || !exp.value) exp.value = exp_default + + for(i = 1; i <= level; i++) { + point = eval("fo_obj.level_step_" + i) + point.value = eval(exp.value); + } +} + +/** + * @brief 포인트를 전부 체크하여 재계산하는 action 호출 + **/ +function doPointRecal() { + + var params = new Array(); + var response_tags = new Array('error','message','total', 'position'); + + exec_xml('point','procPointAdminReCal',params, completePointRecal, response_tags); +} + +function completePointRecal(ret_obj) { + var total = ret_obj['total']; + var message = ret_obj['message']; + var position = ret_obj['position']; + + if(position == total) { + xInnerHtml('pointReCal', message); + alert(message); + location.reload(); + } else { + xInnerHtml('pointReCal', message); + + var params = new Array(); + params['position'] = position; + params['total'] = total; + var response_tags = new Array('error','message','total', 'position'); + + exec_xml('point','procPointAdminApplyPoint',params, completePointRecal, response_tags); + } +} + +function updatePoint(member_srl, action) +{ + var pointEl = jQuery("#point_"+member_srl); + var e = jQuery("#update_member_srl").val(member_srl); + e = jQuery("#update_action").val(action); + e = jQuery("#update_point").val(pointEl.attr("value")); + var hF = jQuery("#updateForm").get(0); + procFilter(hF, update_point); +} + + +function doPointReset(module_srls) { + var params = new Array(); + var response_tags = new Array('error','message'); + params['module_srls'] = module_srls; + + exec_xml('point','procPointAdminReset',params,function(ret_obj) {alert(ret_obj['message']);}, response_tags); +} diff --git a/modules/point/tpl/member_list.html b/modules/point/tpl/member_list.html index 14bdbdfbd..f6aceda9b 100644 --- a/modules/point/tpl/member_list.html +++ b/modules/point/tpl/member_list.html @@ -1,91 +1,91 @@ - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - -
    Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
    {$lang->no}
    {$lang->user_id}
    {$lang->user_name}
    {$lang->nick_name}
    {$lang->point}
    {$lang->level}
    {$no}{htmlspecialchars($val->user_id)}{htmlspecialchars($val->user_name)}{htmlspecialchars($val->nick_name)} -
    - - - - - - -
    -
    {$val->level}
    - -
    - - - -
    - - - - - - -
    - - - -
    - - - - - - - - {$lang->cmd_cancel} -
    -
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
    {$lang->no}
    {$lang->user_id}
    {$lang->user_name}
    {$lang->nick_name}
    {$lang->point}
    {$lang->level}
    {$no}{htmlspecialchars($val->user_id)}{htmlspecialchars($val->user_name)}{htmlspecialchars($val->nick_name)} +
    + + + + + + +
    +
    {$val->level}
    + +
    + + + +
    + + + + + + +
    + + + +
    + + + + + + + + {$lang->cmd_cancel} +
    +
    diff --git a/modules/poll/conf/info.xml b/modules/poll/conf/info.xml index 8c5d0f3dc..02147e7aa 100644 --- a/modules/poll/conf/info.xml +++ b/modules/poll/conf/info.xml @@ -1,36 +1,36 @@ - - - 설문조사 - 投票系统 - アンケート - Poll - Bình chọn, Thăm dò - Encuesta - Опрос - 投票調查 - Oylama - 설문조사 관리 모듈 - 管理投票调查的模块。 - アンケート管理モジュール - This module is for managering polls. - Module này quản lý những bình chọn và thăm dò. - Este módulo es para manejar las encuestas. - Этот модуль служит для управления опросами. - 管理投票調查的模組。 - Oylamaları düzenlemek için kullanılan modüldür. - 0.1 - 2007-02-28 - content - - - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - - + + + 설문조사 + 投票系统 + アンケート + Poll + Bình chọn, Thăm dò + Encuesta + Опрос + 投票調查 + Oylama + 설문조사 관리 모듈 + 管理投票调查的模块。 + アンケート管理モジュール + This module is for managering polls. + Module này quản lý những bình chọn và thăm dò. + Este módulo es para manejar las encuestas. + Этот модуль служит для управления опросами. + 管理投票調查的模組。 + Oylamaları düzenlemek için kullanılan modüldür. + 0.1 + 2007-02-28 + content + + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + diff --git a/modules/poll/lang/en.lang.php b/modules/poll/lang/en.lang.php index 53ee47574..00a6262b7 100644 --- a/modules/poll/lang/en.lang.php +++ b/modules/poll/lang/en.lang.php @@ -1,38 +1,38 @@ -poll = "Poll"; - $lang->poll_stop_date = "Expiration Date"; - $lang->poll_join_count = "Participants"; - $lang->poll_checkcount = "Number of required items"; - - $lang->cmd_poll_list = 'View poll list'; - $lang->cmd_delete_checked_poll = 'Delete selected poll'; - $lang->cmd_apply_poll = 'Apply poll'; - $lang->cmd_view_result = 'Preview result'; - $lang->cmd_delete_checked_poll = 'Delete selected poll'; - - $lang->success_poll = 'Thank you for joining the poll.'; - - $lang->msg_already_poll = 'You already polled!'; - $lang->msg_cart_is_null = 'Please select an article to delete.'; - $lang->msg_checked_poll_is_deleted = '%d poll(s) are deleted.'; - $lang->msg_check_poll_item = 'Please select a poll item to poll.\n(Required poll item(s) may be different in each poll.)'; - $lang->msg_cart_is_null = 'Please select a poll to delete.'; - $lang->msg_checked_poll_is_deleted = '%d poll(s) are deleted.'; - $lang->msg_poll_not_exists = 'Selected poll does not exist.'; - - $lang->cmd_null_item = "No item value exist to post a poll. Please re-try."; - - $lang->confirm_poll_submit = "Confirm to submit the poll?"; - - $lang->search_target_list = array( - 'title' => 'Title', - 'regdate' => 'Posting date', - 'ipaddress' => 'IP Address', - ); -?> +poll = "Poll"; + $lang->poll_stop_date = "Expiration Date"; + $lang->poll_join_count = "Participants"; + $lang->poll_checkcount = "Number of required items"; + + $lang->cmd_poll_list = 'View poll list'; + $lang->cmd_delete_checked_poll = 'Delete selected poll'; + $lang->cmd_apply_poll = 'Apply poll'; + $lang->cmd_view_result = 'Preview result'; + $lang->cmd_delete_checked_poll = 'Delete selected poll'; + + $lang->success_poll = 'Thank you for joining the poll.'; + + $lang->msg_already_poll = 'You already polled!'; + $lang->msg_cart_is_null = 'Please select an article to delete.'; + $lang->msg_checked_poll_is_deleted = '%d poll(s) are deleted.'; + $lang->msg_check_poll_item = 'Please select a poll item to poll.\n(Required poll item(s) may be different in each poll.)'; + $lang->msg_cart_is_null = 'Please select a poll to delete.'; + $lang->msg_checked_poll_is_deleted = '%d poll(s) are deleted.'; + $lang->msg_poll_not_exists = 'Selected poll does not exist.'; + + $lang->cmd_null_item = "No item value exist to post a poll. Please re-try."; + + $lang->confirm_poll_submit = "Confirm to submit the poll?"; + + $lang->search_target_list = array( + 'title' => 'Title', + 'regdate' => 'Posting date', + 'ipaddress' => 'IP Address', + ); +?> diff --git a/modules/poll/lang/es.lang.php b/modules/poll/lang/es.lang.php index d7f0eec65..2433fb1d3 100644 --- a/modules/poll/lang/es.lang.php +++ b/modules/poll/lang/es.lang.php @@ -1,38 +1,38 @@ -poll = "Encuesta"; - $lang->poll_stop_date = "Fecha de expiración"; - $lang->poll_join_count = "Participantes"; - $lang->poll_checkcount = "Número de artículos requeridos."; - - $lang->cmd_poll_list = 'Ver la lista de la encuesta'; - $lang->cmd_delete_checked_poll = 'Eliminar la encuesta seleccionada'; - $lang->cmd_apply_poll = 'Aplicar la encuesta'; - $lang->cmd_view_result = 'Preview result'; - $lang->cmd_delete_checked_poll = 'Eliminar la encuesta seleccionada'; - - $lang->success_poll = 'Gracias por participar en la encuesta.'; - - $lang->msg_already_poll = 'Usted ya realizo la encuesta!'; - $lang->msg_cart_is_null = 'Por favor seleciona un artículo a eliminar.'; - $lang->msg_checked_poll_is_deleted = '%d encustas son eliminados.'; - $lang->msg_check_poll_item = 'Por favor selecciona un artículo de la encuesta.\n(Artículos requeridos pueden ser diferentes in cada encuesta.)'; - $lang->msg_cart_is_null = 'Por favor selecciona una encuesta a eliminar.'; - $lang->msg_checked_poll_is_deleted = '%d encuestas son eliminados.'; - $lang->msg_poll_not_exists = 'Encuesta seleccionada no existe.'; - - $lang->cmd_null_item = "No existe ningún valor para la encuesta. Por favor trate nuevamente."; - - $lang->confirm_poll_submit = "¿Confirma la participación de la encuesta?"; - - $lang->search_target_list = array( - 'title' => 'Título', - 'regdate' => 'Fecha de la participación', - 'ipaddress' => 'Dirección IP', - ); -?> +poll = "Encuesta"; + $lang->poll_stop_date = "Fecha de expiración"; + $lang->poll_join_count = "Participantes"; + $lang->poll_checkcount = "Número de artículos requeridos."; + + $lang->cmd_poll_list = 'Ver la lista de la encuesta'; + $lang->cmd_delete_checked_poll = 'Eliminar la encuesta seleccionada'; + $lang->cmd_apply_poll = 'Aplicar la encuesta'; + $lang->cmd_view_result = 'Preview result'; + $lang->cmd_delete_checked_poll = 'Eliminar la encuesta seleccionada'; + + $lang->success_poll = 'Gracias por participar en la encuesta.'; + + $lang->msg_already_poll = 'Usted ya realizo la encuesta!'; + $lang->msg_cart_is_null = 'Por favor seleciona un artículo a eliminar.'; + $lang->msg_checked_poll_is_deleted = '%d encustas son eliminados.'; + $lang->msg_check_poll_item = 'Por favor selecciona un artículo de la encuesta.\n(Artículos requeridos pueden ser diferentes in cada encuesta.)'; + $lang->msg_cart_is_null = 'Por favor selecciona una encuesta a eliminar.'; + $lang->msg_checked_poll_is_deleted = '%d encuestas son eliminados.'; + $lang->msg_poll_not_exists = 'Encuesta seleccionada no existe.'; + + $lang->cmd_null_item = "No existe ningún valor para la encuesta. Por favor trate nuevamente."; + + $lang->confirm_poll_submit = "¿Confirma la participación de la encuesta?"; + + $lang->search_target_list = array( + 'title' => 'Título', + 'regdate' => 'Fecha de la participación', + 'ipaddress' => 'Dirección IP', + ); +?> diff --git a/modules/poll/lang/fr.lang.php b/modules/poll/lang/fr.lang.php index cd76aaab0..7651d1387 100644 --- a/modules/poll/lang/fr.lang.php +++ b/modules/poll/lang/fr.lang.php @@ -1,38 +1,38 @@ - - * @brief paquet du langage en français pour le module d\'Enquête - **/ - - $lang->poll = "Enquête"; - $lang->poll_stop_date = "Jour d'Expiration"; - $lang->poll_join_count = "Participants"; - $lang->poll_checkcount = "Nombre obligé à choisir"; - - $lang->cmd_poll_list = 'Voir la liste des Enquêtes'; - $lang->cmd_delete_checked_poll = 'Supprimer l\'Enquête choisi'; - $lang->cmd_apply_poll = 'Participer(Soumettre)'; - $lang->cmd_view_result = 'Voir le Résultat'; - $lang->cmd_delete_checked_poll = 'Supprimer l\'Enquête choisi'; - - $lang->success_poll = 'Merci pour participer.'; - - $lang->msg_already_poll = 'Vous avez déjà participé!'; - $lang->msg_cart_is_null = 'Choisissez des Enquêtes à supprimer.'; - $lang->msg_checked_poll_is_deleted = '%d Enquête(s) est(sont) supprimée(s).'; - $lang->msg_check_poll_item = 'Choisissez un des item.\n(Nombre obligé à choisir peut être différent par chaque Enquête.)'; - $lang->msg_cart_is_null = 'Choisissez des Enquêtes à supprimer.'; - $lang->msg_checked_poll_is_deleted = '%d Enquête(s) est(sont) supprimée(s).'; - $lang->msg_poll_not_exists = 'L\'Enquête choisi n\'existe pas.'; - - $lang->cmd_null_item = "Aucune valeur à enrégistrer comme enquête n'existe pas. Essayez encore une fois, S.V.P."; - - $lang->confirm_poll_submit = "Vous voulez sûrement soumettre?"; - - $lang->search_target_list = array( - 'title' => 'Titre', - 'regdate' => 'Jour posté', - 'ipaddress' => 'Adresse IP', - ); -?> + + * @brief paquet du langage en français pour le module d\'Enquête + **/ + + $lang->poll = "Enquête"; + $lang->poll_stop_date = "Jour d'Expiration"; + $lang->poll_join_count = "Participants"; + $lang->poll_checkcount = "Nombre obligé à choisir"; + + $lang->cmd_poll_list = 'Voir la liste des Enquêtes'; + $lang->cmd_delete_checked_poll = 'Supprimer l\'Enquête choisi'; + $lang->cmd_apply_poll = 'Participer(Soumettre)'; + $lang->cmd_view_result = 'Voir le Résultat'; + $lang->cmd_delete_checked_poll = 'Supprimer l\'Enquête choisi'; + + $lang->success_poll = 'Merci pour participer.'; + + $lang->msg_already_poll = 'Vous avez déjà participé!'; + $lang->msg_cart_is_null = 'Choisissez des Enquêtes à supprimer.'; + $lang->msg_checked_poll_is_deleted = '%d Enquête(s) est(sont) supprimée(s).'; + $lang->msg_check_poll_item = 'Choisissez un des item.\n(Nombre obligé à choisir peut être différent par chaque Enquête.)'; + $lang->msg_cart_is_null = 'Choisissez des Enquêtes à supprimer.'; + $lang->msg_checked_poll_is_deleted = '%d Enquête(s) est(sont) supprimée(s).'; + $lang->msg_poll_not_exists = 'L\'Enquête choisi n\'existe pas.'; + + $lang->cmd_null_item = "Aucune valeur à enrégistrer comme enquête n'existe pas. Essayez encore une fois, S.V.P."; + + $lang->confirm_poll_submit = "Vous voulez sûrement soumettre?"; + + $lang->search_target_list = array( + 'title' => 'Titre', + 'regdate' => 'Jour posté', + 'ipaddress' => 'Adresse IP', + ); +?> diff --git a/modules/poll/lang/jp.lang.php b/modules/poll/lang/jp.lang.php index 6f0b12f2d..0ce341f3b 100644 --- a/modules/poll/lang/jp.lang.php +++ b/modules/poll/lang/jp.lang.php @@ -1,38 +1,38 @@ -poll = 'アンケート調査'; - $lang->poll_stop_date = 'アンケート調査の終了日'; - $lang->poll_join_count = '参加者'; - $lang->poll_checkcount = '必須選択項目数'; - - $lang->cmd_poll_list = 'アンケートのリスト表示'; - $lang->cmd_delete_checked_poll = '選択項目削除'; - $lang->cmd_apply_poll = 'アンケート調査へ参加する'; - $lang->cmd_view_result = '結果を見る'; - $lang->cmd_delete_checked_poll = '選択アンケート削除'; - - $lang->success_poll = 'アンケート調査へのご応募ありがとうございます。'; - - $lang->msg_already_poll = '既にアンケート調査に応募しました。'; - $lang->msg_cart_is_null = '削除する書き込みを選択して下さい。'; - $lang->msg_checked_poll_is_deleted = '%d個のアンケートが削除されました。'; - $lang->msg_check_poll_item = 'アンケート調査の項目を選択して下さい(アンケート調査ごと必須の選択項目が異なる場合があります)。'; - $lang->msg_cart_is_null = '削除するアンケートを選択して下さい。'; - $lang->msg_checked_poll_is_deleted = '%d個のアンケートが削除されました。'; - $lang->msg_poll_not_exists = '選択したアンケートは存在しません。'; - - $lang->cmd_null_item = "アンケート調査に登録する項目がありません。\nもう一度設定して下さい。"; - - $lang->confirm_poll_submit = 'アンケート調査にご応募しますか?'; - - $lang->search_target_list = array( - 'title' => 'タイトル', - 'regdate' => '登録日', - 'ipaddress' => 'IPアドレス', - ); -?> +poll = 'アンケート調査'; + $lang->poll_stop_date = 'アンケート調査の終了日'; + $lang->poll_join_count = '参加者'; + $lang->poll_checkcount = '必須選択項目数'; + + $lang->cmd_poll_list = 'アンケートのリスト表示'; + $lang->cmd_delete_checked_poll = '選択項目削除'; + $lang->cmd_apply_poll = 'アンケート調査へ参加する'; + $lang->cmd_view_result = '結果を見る'; + $lang->cmd_delete_checked_poll = '選択アンケート削除'; + + $lang->success_poll = 'アンケート調査へのご応募ありがとうございます。'; + + $lang->msg_already_poll = '既にアンケート調査に応募しました。'; + $lang->msg_cart_is_null = '削除する書き込みを選択して下さい。'; + $lang->msg_checked_poll_is_deleted = '%d個のアンケートが削除されました。'; + $lang->msg_check_poll_item = 'アンケート調査の項目を選択して下さい(アンケート調査ごと必須の選択項目が異なる場合があります)。'; + $lang->msg_cart_is_null = '削除するアンケートを選択して下さい。'; + $lang->msg_checked_poll_is_deleted = '%d個のアンケートが削除されました。'; + $lang->msg_poll_not_exists = '選択したアンケートは存在しません。'; + + $lang->cmd_null_item = "アンケート調査に登録する項目がありません。\nもう一度設定して下さい。"; + + $lang->confirm_poll_submit = 'アンケート調査にご応募しますか?'; + + $lang->search_target_list = array( + 'title' => 'タイトル', + 'regdate' => '登録日', + 'ipaddress' => 'IPアドレス', + ); +?> diff --git a/modules/poll/lang/ko.lang.php b/modules/poll/lang/ko.lang.php index 14a3ac259..44439f2e3 100644 --- a/modules/poll/lang/ko.lang.php +++ b/modules/poll/lang/ko.lang.php @@ -1,38 +1,38 @@ -poll = '설문조사'; - $lang->poll_stop_date = '설문조사 종료일'; - $lang->poll_join_count = '참가자'; - $lang->poll_checkcount = '필수 선택 항목 수'; - - $lang->cmd_poll_list = '설문조사 목록 보기'; - $lang->cmd_delete_checked_poll = '선택항목 삭제'; - $lang->cmd_apply_poll = '설문 참여'; - $lang->cmd_view_result = '결과 보기'; - $lang->cmd_delete_checked_poll = '선택 설문 삭제'; - - $lang->success_poll = '설문에 응하여 주셔서 감사합니다.'; - - $lang->msg_already_poll = '이미 설문조사를 하셨습니다.'; - $lang->msg_cart_is_null = '삭제할 글을 선택해주세요.'; - $lang->msg_checked_poll_is_deleted = '%d개의 설문조사가 삭제되었습니다.'; - $lang->msg_check_poll_item = '설문에 응할 항목을 선택하여 주세요. (설문조사 마다 필수 선택항목이 다를 수 있습니다.)'; - $lang->msg_cart_is_null = '삭제할 설문을 선택해주세요.'; - $lang->msg_checked_poll_is_deleted = '%d개의 설문이 삭제되었습니다.'; - $lang->msg_poll_not_exists = '선택하신 설문이 존재하지 않습니다.'; - - $lang->cmd_null_item = "설문조사로 등록할 값이 없습니다.\n다시 설정해주세요."; - - $lang->confirm_poll_submit = '설문조사에 응하시겠습니까?'; - - $lang->search_target_list = array( - 'title' => '제목', - 'regdate' => '등록일', - 'ipaddress' => 'IP 주소', - ); -?> +poll = '설문조사'; + $lang->poll_stop_date = '설문조사 종료일'; + $lang->poll_join_count = '참가자'; + $lang->poll_checkcount = '필수 선택 항목 수'; + + $lang->cmd_poll_list = '설문조사 목록 보기'; + $lang->cmd_delete_checked_poll = '선택항목 삭제'; + $lang->cmd_apply_poll = '설문 참여'; + $lang->cmd_view_result = '결과 보기'; + $lang->cmd_delete_checked_poll = '선택 설문 삭제'; + + $lang->success_poll = '설문에 응하여 주셔서 감사합니다.'; + + $lang->msg_already_poll = '이미 설문조사를 하셨습니다.'; + $lang->msg_cart_is_null = '삭제할 글을 선택해주세요.'; + $lang->msg_checked_poll_is_deleted = '%d개의 설문조사가 삭제되었습니다.'; + $lang->msg_check_poll_item = '설문에 응할 항목을 선택하여 주세요. (설문조사 마다 필수 선택항목이 다를 수 있습니다.)'; + $lang->msg_cart_is_null = '삭제할 설문을 선택해주세요.'; + $lang->msg_checked_poll_is_deleted = '%d개의 설문이 삭제되었습니다.'; + $lang->msg_poll_not_exists = '선택하신 설문이 존재하지 않습니다.'; + + $lang->cmd_null_item = "설문조사로 등록할 값이 없습니다.\n다시 설정해주세요."; + + $lang->confirm_poll_submit = '설문조사에 응하시겠습니까?'; + + $lang->search_target_list = array( + 'title' => '제목', + 'regdate' => '등록일', + 'ipaddress' => 'IP 주소', + ); +?> diff --git a/modules/poll/lang/ru.lang.php b/modules/poll/lang/ru.lang.php index 9088dce75..523ca958f 100644 --- a/modules/poll/lang/ru.lang.php +++ b/modules/poll/lang/ru.lang.php @@ -1,38 +1,38 @@ -poll = "Опрос"; - $lang->poll_stop_date = "Дата истечения"; - $lang->poll_join_count = "Участников"; - $lang->poll_checkcount = "Число полей выбора"; - - $lang->cmd_poll_list = 'Просмотреть список опросов'; - $lang->cmd_delete_checked_poll = 'Удалить выбранные опросы'; - $lang->cmd_apply_poll = 'Применеть опрос'; - $lang->cmd_view_result = 'Предпросмотр результата'; - $lang->cmd_delete_checked_poll = 'Удалить выбранные опросы'; // translator's remark for devs: double entry, already has $lang->cmd_delete_checked_poll - - $lang->success_poll = 'Благодарим за присоединение к опросу.'; - - $lang->msg_already_poll = 'Вы уже голосовали!'; - $lang->msg_cart_is_null = 'Пожалуйста, выберите статью для удаления.'; - $lang->msg_checked_poll_is_deleted = '%d опросов удалено.'; - $lang->msg_check_poll_item = 'Пожалуйста, выберите ответ, чтобы проголосовать.\n(Требуемые объекты могут различаться для каждого из опросов.)'; - $lang->msg_cart_is_null = 'Пожалуйста, выберите опрос для удаления.'; // translator's remark for devs: double entry, already has it... - $lang->msg_checked_poll_is_deleted = '%d опросов удалено.'; // translator's remark for devs: double entry, already has it... - $lang->msg_poll_not_exists = 'Выбранный опрос не существует.'; - - $lang->cmd_null_item = "Не выбран ответ для голосования. Пожалуйста, попробуйте еще."; - - $lang->confirm_poll_submit = "Подтверждаете ли Вы размещение опроса?"; - - $lang->search_target_list = array( - 'title' => 'Заголовок', - 'regdate' => 'Дата Размещения', // // translator's remark: this may be as "Дата Регистрации" - 'ipaddress' => 'IP-адрес', - ); -?> +poll = "Опрос"; + $lang->poll_stop_date = "Дата истечения"; + $lang->poll_join_count = "Участников"; + $lang->poll_checkcount = "Число полей выбора"; + + $lang->cmd_poll_list = 'Просмотреть список опросов'; + $lang->cmd_delete_checked_poll = 'Удалить выбранные опросы'; + $lang->cmd_apply_poll = 'Применеть опрос'; + $lang->cmd_view_result = 'Предпросмотр результата'; + $lang->cmd_delete_checked_poll = 'Удалить выбранные опросы'; // translator's remark for devs: double entry, already has $lang->cmd_delete_checked_poll + + $lang->success_poll = 'Благодарим за присоединение к опросу.'; + + $lang->msg_already_poll = 'Вы уже голосовали!'; + $lang->msg_cart_is_null = 'Пожалуйста, выберите статью для удаления.'; + $lang->msg_checked_poll_is_deleted = '%d опросов удалено.'; + $lang->msg_check_poll_item = 'Пожалуйста, выберите ответ, чтобы проголосовать.\n(Требуемые объекты могут различаться для каждого из опросов.)'; + $lang->msg_cart_is_null = 'Пожалуйста, выберите опрос для удаления.'; // translator's remark for devs: double entry, already has it... + $lang->msg_checked_poll_is_deleted = '%d опросов удалено.'; // translator's remark for devs: double entry, already has it... + $lang->msg_poll_not_exists = 'Выбранный опрос не существует.'; + + $lang->cmd_null_item = "Не выбран ответ для голосования. Пожалуйста, попробуйте еще."; + + $lang->confirm_poll_submit = "Подтверждаете ли Вы размещение опроса?"; + + $lang->search_target_list = array( + 'title' => 'Заголовок', + 'regdate' => 'Дата Размещения', // // translator's remark: this may be as "Дата Регистрации" + 'ipaddress' => 'IP-адрес', + ); +?> diff --git a/modules/poll/lang/tr.lang.php b/modules/poll/lang/tr.lang.php index 0978a5dd8..19fb4944b 100644 --- a/modules/poll/lang/tr.lang.php +++ b/modules/poll/lang/tr.lang.php @@ -1,38 +1,38 @@ -poll = "Oylama"; - $lang->poll_stop_date = "Kullanım Süresi Bitimi"; - $lang->poll_join_count = "Katılımcılar"; - $lang->poll_checkcount = "Gerekli ögelerin sayısı"; - - $lang->cmd_poll_list = 'Oylama listesini gör'; - $lang->cmd_delete_checked_poll = 'Seçili oylamayı sil'; - $lang->cmd_apply_poll = 'Oyla'; - $lang->cmd_view_result = 'Sonuç Önizlemesi'; - $lang->cmd_delete_checked_poll = 'Seçili oylamayı sil'; - - $lang->success_poll = 'Oylamaya katıldığınız için teşekkürler.'; - - $lang->msg_already_poll = 'Zaten oylamada bulundunuz!'; - $lang->msg_cart_is_null = 'Lütfen silmek için bir makale seçiniz.'; - $lang->msg_checked_poll_is_deleted = '%d oylama silindi.'; - $lang->msg_check_poll_item = 'Lütfen oylama yapmak için oylama parçası seçiniz.\n(Gerekli oylama parçaları her oylamada farklılık gösterebilir.)'; - $lang->msg_cart_is_null = 'Lütfen silmek için bir oylama seçiniz.'; - $lang->msg_checked_poll_is_deleted = '%d oylama silindi.'; - $lang->msg_poll_not_exists = 'Seçili oylama mevcut değil.'; - - $lang->cmd_null_item = "Oylama göndermek için hiçbir öge değeri yok. Lütfen tekrar deneyiniz."; - - $lang->confirm_poll_submit = "Oylamayı göndermeyi onaylıyor musunuz?"; - - $lang->search_target_list = array( - 'title' => 'Başlık', - 'regdate' => 'Mesaj Tarihi', - 'ipaddress' => 'IP Adresi', - ); -?> +poll = "Oylama"; + $lang->poll_stop_date = "Kullanım Süresi Bitimi"; + $lang->poll_join_count = "Katılımcılar"; + $lang->poll_checkcount = "Gerekli ögelerin sayısı"; + + $lang->cmd_poll_list = 'Oylama listesini gör'; + $lang->cmd_delete_checked_poll = 'Seçili oylamayı sil'; + $lang->cmd_apply_poll = 'Oyla'; + $lang->cmd_view_result = 'Sonuç Önizlemesi'; + $lang->cmd_delete_checked_poll = 'Seçili oylamayı sil'; + + $lang->success_poll = 'Oylamaya katıldığınız için teşekkürler.'; + + $lang->msg_already_poll = 'Zaten oylamada bulundunuz!'; + $lang->msg_cart_is_null = 'Lütfen silmek için bir makale seçiniz.'; + $lang->msg_checked_poll_is_deleted = '%d oylama silindi.'; + $lang->msg_check_poll_item = 'Lütfen oylama yapmak için oylama parçası seçiniz.\n(Gerekli oylama parçaları her oylamada farklılık gösterebilir.)'; + $lang->msg_cart_is_null = 'Lütfen silmek için bir oylama seçiniz.'; + $lang->msg_checked_poll_is_deleted = '%d oylama silindi.'; + $lang->msg_poll_not_exists = 'Seçili oylama mevcut değil.'; + + $lang->cmd_null_item = "Oylama göndermek için hiçbir öge değeri yok. Lütfen tekrar deneyiniz."; + + $lang->confirm_poll_submit = "Oylamayı göndermeyi onaylıyor musunuz?"; + + $lang->search_target_list = array( + 'title' => 'Başlık', + 'regdate' => 'Mesaj Tarihi', + 'ipaddress' => 'IP Adresi', + ); +?> diff --git a/modules/poll/lang/vi.lang.php b/modules/poll/lang/vi.lang.php index 8cafed053..5fd71d5d8 100644 --- a/modules/poll/lang/vi.lang.php +++ b/modules/poll/lang/vi.lang.php @@ -1,40 +1,40 @@ -poll = "Thăm dò"; - $lang->poll_stop_date = "Ngày hết hạn"; - $lang->poll_join_count = "Người tham gia"; - $lang->poll_checkcount = "Số mục yêu cầu"; - - $lang->cmd_poll_list = 'Xem danh sách thăm dò'; - $lang->cmd_delete_checked_poll = 'Xóa thăm dò đã chọn'; - $lang->cmd_apply_poll = 'Áp dụng thăm dò'; - $lang->cmd_view_result = 'Xem kết quả'; - $lang->cmd_delete_checked_poll = 'Xóa thăm dò đã chọn'; - - $lang->success_poll = 'Cảm ơn bạn đã tham gia thăm dò.'; - - $lang->msg_already_poll = 'Bạn đã bỏ phiếu rồi!'; - $lang->msg_cart_is_null = 'Hãy chọn bài viết để xóa.'; - $lang->msg_checked_poll_is_deleted = '%d thăm dò đã được xóa.'; - $lang->msg_check_poll_item = 'Xin hãy chọn những mục để tạo thăm dò.\n(Yêu cầu những mục để tạo thăm dò phải là những mục chưa được tạo.)'; - $lang->msg_cart_is_null = 'Xin hãy chọn thăm dò để xóa.'; - $lang->msg_checked_poll_is_deleted = '%d đã được xóa.'; - $lang->msg_poll_not_exists = 'Thăm dò đã chọn không tồn tại.'; - - $lang->cmd_null_item = "Không có giá trị để gửi một thăm dò. Xin hãy thử lại."; - - $lang->confirm_poll_submit = "Bạn có chắc chắn muốn gửi thăm dò?"; - - $lang->search_target_list = array( - 'title' => 'Tiêu đề', - 'regdate' => 'Ngày gửi', - 'ipaddress' => 'IP', - ); -?> +poll = "Thăm dò"; + $lang->poll_stop_date = "Ngày hết hạn"; + $lang->poll_join_count = "Người tham gia"; + $lang->poll_checkcount = "Số mục yêu cầu"; + + $lang->cmd_poll_list = 'Xem danh sách thăm dò'; + $lang->cmd_delete_checked_poll = 'Xóa thăm dò đã chọn'; + $lang->cmd_apply_poll = 'Áp dụng thăm dò'; + $lang->cmd_view_result = 'Xem kết quả'; + $lang->cmd_delete_checked_poll = 'Xóa thăm dò đã chọn'; + + $lang->success_poll = 'Cảm ơn bạn đã tham gia thăm dò.'; + + $lang->msg_already_poll = 'Bạn đã bỏ phiếu rồi!'; + $lang->msg_cart_is_null = 'Hãy chọn bài viết để xóa.'; + $lang->msg_checked_poll_is_deleted = '%d thăm dò đã được xóa.'; + $lang->msg_check_poll_item = 'Xin hãy chọn những mục để tạo thăm dò.\n(Yêu cầu những mục để tạo thăm dò phải là những mục chưa được tạo.)'; + $lang->msg_cart_is_null = 'Xin hãy chọn thăm dò để xóa.'; + $lang->msg_checked_poll_is_deleted = '%d đã được xóa.'; + $lang->msg_poll_not_exists = 'Thăm dò đã chọn không tồn tại.'; + + $lang->cmd_null_item = "Không có giá trị để gửi một thăm dò. Xin hãy thử lại."; + + $lang->confirm_poll_submit = "Bạn có chắc chắn muốn gửi thăm dò?"; + + $lang->search_target_list = array( + 'title' => 'Tiêu đề', + 'regdate' => 'Ngày gửi', + 'ipaddress' => 'IP', + ); +?> diff --git a/modules/poll/lang/zh-CN.lang.php b/modules/poll/lang/zh-CN.lang.php index a01f21ef2..b18de80bf 100644 --- a/modules/poll/lang/zh-CN.lang.php +++ b/modules/poll/lang/zh-CN.lang.php @@ -1,38 +1,38 @@ -poll = "投票系统"; - $lang->poll_stop_date = "投票调查结束日期"; - $lang->poll_join_count = "投票者"; - $lang->poll_checkcount = "必选项目数"; - - $lang->cmd_poll_list = '投票列表'; - $lang->cmd_delete_checked_poll = '删除所选项目'; - $lang->cmd_apply_poll = '参与投票'; - $lang->cmd_view_result = '查看结果'; - $lang->cmd_delete_checked_poll = '删除所选'; - - $lang->success_poll = '感谢您参与投票。'; - - $lang->msg_already_poll = '不能重复投票!'; - $lang->msg_cart_is_null = '请选择要删除的文章。'; - $lang->msg_checked_poll_is_deleted = '已删除%d个投票调查。'; - $lang->msg_check_poll_item = '请选择问卷回应的项目。 (每个问卷调查有不同的必选项目)'; - $lang->msg_cart_is_null = '请选择要删除的问卷。'; - $lang->msg_checked_poll_is_deleted = '已删除%d个问卷。'; - $lang->msg_poll_not_exists = '您选择的问卷不存在!'; - - $lang->cmd_null_item = "没有要登录为投票调查的值。\n请重新设置。"; - - $lang->confirm_poll_submit = "您要参与投票吗?"; - - $lang->search_target_list = array( - 'title' => '标题', - 'regdate' => '登录日期', - 'ipaddress' => 'IP 地址', - ); -?> +poll = "投票系统"; + $lang->poll_stop_date = "投票调查结束日期"; + $lang->poll_join_count = "投票者"; + $lang->poll_checkcount = "必选项目数"; + + $lang->cmd_poll_list = '投票列表'; + $lang->cmd_delete_checked_poll = '删除所选项目'; + $lang->cmd_apply_poll = '参与投票'; + $lang->cmd_view_result = '查看结果'; + $lang->cmd_delete_checked_poll = '删除所选'; + + $lang->success_poll = '感谢您参与投票。'; + + $lang->msg_already_poll = '不能重复投票!'; + $lang->msg_cart_is_null = '请选择要删除的文章。'; + $lang->msg_checked_poll_is_deleted = '已删除%d个投票调查。'; + $lang->msg_check_poll_item = '请选择问卷回应的项目。 (每个问卷调查有不同的必选项目)'; + $lang->msg_cart_is_null = '请选择要删除的问卷。'; + $lang->msg_checked_poll_is_deleted = '已删除%d个问卷。'; + $lang->msg_poll_not_exists = '您选择的问卷不存在!'; + + $lang->cmd_null_item = "没有要登录为投票调查的值。\n请重新设置。"; + + $lang->confirm_poll_submit = "您要参与投票吗?"; + + $lang->search_target_list = array( + 'title' => '标题', + 'regdate' => '登录日期', + 'ipaddress' => 'IP 地址', + ); +?> diff --git a/modules/poll/lang/zh-TW.lang.php b/modules/poll/lang/zh-TW.lang.php index 76f2f95ef..f7bdd00d8 100644 --- a/modules/poll/lang/zh-TW.lang.php +++ b/modules/poll/lang/zh-TW.lang.php @@ -1,38 +1,38 @@ -poll = "投票調查"; - $lang->poll_stop_date = "投票調查結束日期"; - $lang->poll_join_count = "投票人數"; - $lang->poll_checkcount = "必選項目數"; - - $lang->cmd_poll_list = '檢視列表'; - $lang->cmd_delete_checked_poll = '刪除所選項目'; - $lang->cmd_apply_poll = '參與投票'; - $lang->cmd_view_result = '看結果'; - $lang->cmd_delete_checked_poll = '刪除所選'; - - $lang->success_poll = '感謝您參與投票。'; - - $lang->msg_already_poll = '不能重複投票!'; - $lang->msg_cart_is_null = '請選擇要刪除的文章。'; - $lang->msg_checked_poll_is_deleted = '已刪除%d個投票調查。'; - $lang->msg_check_poll_item = '請選擇問卷回應的項目。 (每個問卷調查有不同的必選項目)'; - $lang->msg_cart_is_null = '請選擇要刪除的問卷。'; - $lang->msg_checked_poll_is_deleted = '已刪除%d個問卷。'; - $lang->msg_poll_not_exists = '您選擇的問卷不存在!'; - - $lang->cmd_null_item = "沒有要登錄為投票調查的值。\n請重新設置。"; - - $lang->confirm_poll_submit = "您要參與投票嗎?"; - - $lang->search_target_list = array( - 'title' => '標題', - 'regdate' => '登錄日期', - 'ipaddress' => 'IP位址', - ); -?> +poll = "投票調查"; + $lang->poll_stop_date = "投票調查結束日期"; + $lang->poll_join_count = "投票人數"; + $lang->poll_checkcount = "必選項目數"; + + $lang->cmd_poll_list = '檢視列表'; + $lang->cmd_delete_checked_poll = '刪除所選項目'; + $lang->cmd_apply_poll = '參與投票'; + $lang->cmd_view_result = '看結果'; + $lang->cmd_delete_checked_poll = '刪除所選'; + + $lang->success_poll = '感謝您參與投票。'; + + $lang->msg_already_poll = '不能重複投票!'; + $lang->msg_cart_is_null = '請選擇要刪除的文章。'; + $lang->msg_checked_poll_is_deleted = '已刪除%d個投票調查。'; + $lang->msg_check_poll_item = '請選擇問卷回應的項目。 (每個問卷調查有不同的必選項目)'; + $lang->msg_cart_is_null = '請選擇要刪除的問卷。'; + $lang->msg_checked_poll_is_deleted = '已刪除%d個問卷。'; + $lang->msg_poll_not_exists = '您選擇的問卷不存在!'; + + $lang->cmd_null_item = "沒有要登錄為投票調查的值。\n請重新設置。"; + + $lang->confirm_poll_submit = "您要參與投票嗎?"; + + $lang->search_target_list = array( + 'title' => '標題', + 'regdate' => '登錄日期', + 'ipaddress' => 'IP位址', + ); +?> diff --git a/modules/poll/poll.admin.controller.php b/modules/poll/poll.admin.controller.php index eb92f7ade..cc1b6e53b 100644 --- a/modules/poll/poll.admin.controller.php +++ b/modules/poll/poll.admin.controller.php @@ -1,111 +1,111 @@ -skin = Context::get('skin'); - $config->colorset = Context::get('colorset'); - - $oModuleController = &getController('module'); - $oModuleController->insertModuleConfig('poll', $config); - - $this->setMessage('success_updated'); - } - - /** - * @brief 관리자 페이지에서 선택된 설문조사들을 삭제 - **/ - function procPollAdminDeleteChecked() { - // 선택된 글이 없으면 오류 표시 - $cart = Context::get('cart'); - if(!$cart) return $this->stop('msg_cart_is_null'); - - $poll_srl_list= explode('|@|', $cart); - $poll_count = count($poll_srl_list); - if(!$poll_count) return $this->stop('msg_cart_is_null'); - - // 글삭제 - for($i=0;$i<$poll_count;$i++) { - $poll_index_srl = trim($poll_srl_list[$i]); - if(!$poll_index_srl) continue; - - $output = $this->deletePollTitle($poll_index_srl, true); - if(!$output->toBool()) return $output; - } - - $this->setMessage( sprintf(Context::getLang('msg_checked_poll_is_deleted'), $poll_count) ); - } - - /** - * @brief 설문조사 삭제 (한번에 여러개의 설문 등록시 그 중 하나의 설문만 삭제) - **/ - function deletePollTitle($poll_index_srl) { - $args->poll_index_srl = $poll_index_srl; - - $oDB = &DB::getInstance(); - $oDB->begin(); - - $output = $oDB->executeQuery('poll.deletePollTitle', $args); - if(!$output) { - $oDB->rollback(); - return $output; - } - - $output = $oDB->executeQuery('poll.deletePollItem', $args); - if(!$output) { - $oDB->rollback(); - return $output; - } - - $oDB->commit(); - - return new Object(); - } - - /** - * @brief 설문조사 삭제 (하나의 묶인 설문조사를 통째로 삭제) - **/ - function deletePoll($poll_srl) { - $args->poll_srl = $poll_srl; - - $oDB = &DB::getInstance(); - $oDB->begin(); - - $output = $oDB->executeQuery('poll.deletePoll', $args); - if(!$output) { - $oDB->rollback(); - return $output; - } - - $output = $oDB->executeQuery('poll.deletePollTitle', $args); - if(!$output) { - $oDB->rollback(); - return $output; - } - - $output = $oDB->executeQuery('poll.deletePollItem', $args); - if(!$output) { - $oDB->rollback(); - return $output; - } - - $oDB->commit(); - - return new Object(); - } - } -?> +skin = Context::get('skin'); + $config->colorset = Context::get('colorset'); + + $oModuleController = &getController('module'); + $oModuleController->insertModuleConfig('poll', $config); + + $this->setMessage('success_updated'); + } + + /** + * @brief 관리자 페이지에서 선택된 설문조사들을 삭제 + **/ + function procPollAdminDeleteChecked() { + // 선택된 글이 없으면 오류 표시 + $cart = Context::get('cart'); + if(!$cart) return $this->stop('msg_cart_is_null'); + + $poll_srl_list= explode('|@|', $cart); + $poll_count = count($poll_srl_list); + if(!$poll_count) return $this->stop('msg_cart_is_null'); + + // 글삭제 + for($i=0;$i<$poll_count;$i++) { + $poll_index_srl = trim($poll_srl_list[$i]); + if(!$poll_index_srl) continue; + + $output = $this->deletePollTitle($poll_index_srl, true); + if(!$output->toBool()) return $output; + } + + $this->setMessage( sprintf(Context::getLang('msg_checked_poll_is_deleted'), $poll_count) ); + } + + /** + * @brief 설문조사 삭제 (한번에 여러개의 설문 등록시 그 중 하나의 설문만 삭제) + **/ + function deletePollTitle($poll_index_srl) { + $args->poll_index_srl = $poll_index_srl; + + $oDB = &DB::getInstance(); + $oDB->begin(); + + $output = $oDB->executeQuery('poll.deletePollTitle', $args); + if(!$output) { + $oDB->rollback(); + return $output; + } + + $output = $oDB->executeQuery('poll.deletePollItem', $args); + if(!$output) { + $oDB->rollback(); + return $output; + } + + $oDB->commit(); + + return new Object(); + } + + /** + * @brief 설문조사 삭제 (하나의 묶인 설문조사를 통째로 삭제) + **/ + function deletePoll($poll_srl) { + $args->poll_srl = $poll_srl; + + $oDB = &DB::getInstance(); + $oDB->begin(); + + $output = $oDB->executeQuery('poll.deletePoll', $args); + if(!$output) { + $oDB->rollback(); + return $output; + } + + $output = $oDB->executeQuery('poll.deletePollTitle', $args); + if(!$output) { + $oDB->rollback(); + return $output; + } + + $output = $oDB->executeQuery('poll.deletePollItem', $args); + if(!$output) { + $oDB->rollback(); + return $output; + } + + $oDB->commit(); + + return new Object(); + } + } +?> diff --git a/modules/poll/poll.admin.model.php b/modules/poll/poll.admin.model.php index b83b131fa..bf36deed4 100644 --- a/modules/poll/poll.admin.model.php +++ b/modules/poll/poll.admin.model.php @@ -1,50 +1,50 @@ -toBool()) return $output; - - if($output->data && !is_array($output->data)) $output->data = array($output->data); - return $output; - } - - /** - * @brief 설문조사의 원본을 구함 - **/ - function getPollAdminTarget() { - $poll_srl = Context::get('poll_srl'); - $upload_target_srl = Context::get('upload_target_srl'); - - $oDocumentModel = &getModel('document'); - $oCommentModel = &getModel('comment'); - - $oDocument = $oDocumentModel->getDocument($upload_target_srl); - - if(!$oDocument->isExists()) $oComment = $oCommentModel->getComment($upload_target_srl); - - if($oComment && $oComment->isExists()) { - $this->add('document_srl', $oComment->get('document_srl')); - $this->add('comment_srl', $oComment->get('comment_srl')); - } elseif($oDocument->isExists()) { - $this->add('document_srl', $oDocument->get('document_srl')); - } else return new Object(-1, 'msg_not_founded'); - } - - } -?> +toBool()) return $output; + + if($output->data && !is_array($output->data)) $output->data = array($output->data); + return $output; + } + + /** + * @brief 설문조사의 원본을 구함 + **/ + function getPollAdminTarget() { + $poll_srl = Context::get('poll_srl'); + $upload_target_srl = Context::get('upload_target_srl'); + + $oDocumentModel = &getModel('document'); + $oCommentModel = &getModel('comment'); + + $oDocument = $oDocumentModel->getDocument($upload_target_srl); + + if(!$oDocument->isExists()) $oComment = $oCommentModel->getComment($upload_target_srl); + + if($oComment && $oComment->isExists()) { + $this->add('document_srl', $oComment->get('document_srl')); + $this->add('comment_srl', $oComment->get('comment_srl')); + } elseif($oDocument->isExists()) { + $this->add('document_srl', $oDocument->get('document_srl')); + } else return new Object(-1, 'msg_not_founded'); + } + + } +?> diff --git a/modules/poll/poll.admin.view.php b/modules/poll/poll.admin.view.php index 64177542d..ce692f62e 100644 --- a/modules/poll/poll.admin.view.php +++ b/modules/poll/poll.admin.view.php @@ -1,127 +1,127 @@ -s_title= $search_keyword; - break; - case 'regdate' : - $args->s_regdate = $search_keyword; - break; - case 'ipaddress' : - $args->s_ipaddress= $search_keyword; - break; - } - } - // 목록을 구하기 위한 옵션 - $args->page = Context::get('page'); ///< 페이지 - $args->list_count = 50; ///< 한페이지에 보여줄 글 수 - $args->page_count = 10; ///< 페이지 네비게이션에 나타날 페이지의 수 - - $args->sort_index = 'list_order'; ///< 소팅 값 - - // 목록 구함 - $oPollAdminModel = &getAdminModel('poll'); - $output = $oPollAdminModel->getPollList($args); - - // 템플릿 변수 설정 - Context::set('total_count', $output->total_count); - Context::set('total_page', $output->total_page); - Context::set('page', $output->page); - Context::set('poll_list', $output->data); - Context::set('page_navigation', $output->page_navigation); - Context::set('module_list', $module_list); - - // 템플릿 지정 - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('poll_list'); - } - - /** - * @brief 설문조사 스킨, 컬러셋 설정 - **/ - function dispPollAdminConfig() { - $oModuleModel = &getModel('module'); - - // 설정 정보 가져오기 - $config = $oModuleModel->getModuleConfig('poll'); - Context::set('config', $config); - - // 스킨 정보 가져오기 - $skin_list = $oModuleModel->getSkins($this->module_path); - Context::set('skin_list', $skin_list); - - if(!$skin_list[$config->skin]) $config->skin = "default"; - - // 설정된 스킨의 컬러셋 설정 - Context::set('colorset_list', $skin_list[$config->skin]->colorset); - - // 템플릿 지정 - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('config'); - } - - /** - * @brief 설문조사 결과 - **/ - function dispPollAdminResult() { - // 팝업 레이아웃 - $this->setLayoutFile("popup_layout"); - - // 결과 뽑기 - $args->poll_srl = Context::get('poll_srl'); - $args->poll_index_srl = Context::get('poll_index_srl'); - - $output = executeQuery('poll.getPoll', $args); - if(!$output->data) return $this->stop('msg_poll_not_exists'); - $poll->stop_date = $output->data->stop_date; - $poll->poll_count = $output->data->poll_count; - - $output = executeQuery('poll.getPollTitle', $args); - if(!$output->data) return $this->stop('msg_poll_not_exists'); - - $poll->poll[$args->poll_index_srl]->title = $output->data->title; - $poll->poll[$args->poll_index_srl]->checkcount = $output->data->checkcount; - $poll->poll[$args->poll_index_srl]->poll_count = $output->data->poll_count; - - $output = executeQuery('poll.getPollItem', $args); - foreach($output->data as $key => $val) { - $poll->poll[$val->poll_index_srl]->item[] = $val; - } - - $poll->poll_srl = $poll_srl; - - Context::set('poll',$poll); - - // 기본 설정의 스킨, 컬러셋 설정 - $oModuleModel = &getModel('module'); - $poll_config = $oModuleModel->getModuleConfig('poll'); - Context::set('poll_config', $poll_config); - - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('result'); - } - } -?> +s_title= $search_keyword; + break; + case 'regdate' : + $args->s_regdate = $search_keyword; + break; + case 'ipaddress' : + $args->s_ipaddress= $search_keyword; + break; + } + } + // 목록을 구하기 위한 옵션 + $args->page = Context::get('page'); ///< 페이지 + $args->list_count = 50; ///< 한페이지에 보여줄 글 수 + $args->page_count = 10; ///< 페이지 네비게이션에 나타날 페이지의 수 + + $args->sort_index = 'list_order'; ///< 소팅 값 + + // 목록 구함 + $oPollAdminModel = &getAdminModel('poll'); + $output = $oPollAdminModel->getPollList($args); + + // 템플릿 변수 설정 + Context::set('total_count', $output->total_count); + Context::set('total_page', $output->total_page); + Context::set('page', $output->page); + Context::set('poll_list', $output->data); + Context::set('page_navigation', $output->page_navigation); + Context::set('module_list', $module_list); + + // 템플릿 지정 + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('poll_list'); + } + + /** + * @brief 설문조사 스킨, 컬러셋 설정 + **/ + function dispPollAdminConfig() { + $oModuleModel = &getModel('module'); + + // 설정 정보 가져오기 + $config = $oModuleModel->getModuleConfig('poll'); + Context::set('config', $config); + + // 스킨 정보 가져오기 + $skin_list = $oModuleModel->getSkins($this->module_path); + Context::set('skin_list', $skin_list); + + if(!$skin_list[$config->skin]) $config->skin = "default"; + + // 설정된 스킨의 컬러셋 설정 + Context::set('colorset_list', $skin_list[$config->skin]->colorset); + + // 템플릿 지정 + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('config'); + } + + /** + * @brief 설문조사 결과 + **/ + function dispPollAdminResult() { + // 팝업 레이아웃 + $this->setLayoutFile("popup_layout"); + + // 결과 뽑기 + $args->poll_srl = Context::get('poll_srl'); + $args->poll_index_srl = Context::get('poll_index_srl'); + + $output = executeQuery('poll.getPoll', $args); + if(!$output->data) return $this->stop('msg_poll_not_exists'); + $poll->stop_date = $output->data->stop_date; + $poll->poll_count = $output->data->poll_count; + + $output = executeQuery('poll.getPollTitle', $args); + if(!$output->data) return $this->stop('msg_poll_not_exists'); + + $poll->poll[$args->poll_index_srl]->title = $output->data->title; + $poll->poll[$args->poll_index_srl]->checkcount = $output->data->checkcount; + $poll->poll[$args->poll_index_srl]->poll_count = $output->data->poll_count; + + $output = executeQuery('poll.getPollItem', $args); + foreach($output->data as $key => $val) { + $poll->poll[$val->poll_index_srl]->item[] = $val; + } + + $poll->poll_srl = $poll_srl; + + Context::set('poll',$poll); + + // 기본 설정의 스킨, 컬러셋 설정 + $oModuleModel = &getModel('module'); + $poll_config = $oModuleModel->getModuleConfig('poll'); + Context::set('poll_config', $poll_config); + + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('result'); + } + } +?> diff --git a/modules/poll/poll.class.php b/modules/poll/poll.class.php index eed9d5030..6edb63796 100644 --- a/modules/poll/poll.class.php +++ b/modules/poll/poll.class.php @@ -1,83 +1,83 @@ -skin = 'default'; - $config->colorset = 'normal'; - $oModuleController->insertModuleConfig('poll', $config); - - // 2007. 10. 17 글/댓글의 삭제시 설문조사도 삭제 - $oModuleController->insertTrigger('document.insertDocument', 'poll', 'controller', 'triggerInsertDocumentPoll', 'after'); - $oModuleController->insertTrigger('comment.insertComment', 'poll', 'controller', 'triggerInsertCommentPoll', 'after'); - $oModuleController->insertTrigger('document.updateDocument', 'poll', 'controller', 'triggerUpdateDocumentPoll', 'after'); - $oModuleController->insertTrigger('comment.updateComment', 'poll', 'controller', 'triggerUpdateCommentPoll', 'after'); - $oModuleController->insertTrigger('document.deleteDocument', 'poll', 'controller', 'triggerDeleteDocumentPoll', 'after'); - $oModuleController->insertTrigger('comment.deleteComment', 'poll', 'controller', 'triggerDeleteCommentPoll', 'after'); - - return new Object(); - } - - /** - * @brief 설치가 이상이 없는지 체크하는 method - **/ - function checkUpdate() { - $oModuleModel = &getModel('module'); - - // 2007. 10. 17 글/댓글의 삭제시 설문조사도 삭제 - if(!$oModuleModel->getTrigger('document.insertDocument', 'poll', 'controller', 'triggerInsertDocumentPoll', 'after')) return true; - if(!$oModuleModel->getTrigger('comment.insertComment', 'poll', 'controller', 'triggerInsertCommentPoll', 'after')) return true; - if(!$oModuleModel->getTrigger('document.updateDocument', 'poll', 'controller', 'triggerUpdateDocumentPoll', 'after')) return true; - if(!$oModuleModel->getTrigger('comment.updateComment', 'poll', 'controller', 'triggerUpdateCommentPoll', 'after')) return true; - if(!$oModuleModel->getTrigger('document.deleteDocument', 'poll', 'controller', 'triggerDeleteDocumentPoll', 'after')) return true; - if(!$oModuleModel->getTrigger('comment.deleteComment', 'poll', 'controller', 'triggerDeleteCommentPoll', 'after')) return true; - - return false; - } - - /** - * @brief 업데이트 실행 - **/ - function moduleUpdate() { - $oModuleModel = &getModel('module'); - $oModuleController = &getController('module'); - - // 2007. 10. 17 글/댓글의 삭제시 설문조사도 삭제 - if(!$oModuleModel->getTrigger('document.deleteDocument', 'poll', 'controller', 'triggerDeleteDocumentPoll', 'after')) - $oModuleController->insertTrigger('document.deleteDocument', 'poll', 'controller', 'triggerDeleteDocumentPoll', 'after'); - if(!$oModuleModel->getTrigger('comment.deleteComment', 'poll', 'controller', 'triggerDeleteCommentPoll', 'after')) - $oModuleController->insertTrigger('comment.deleteComment', 'poll', 'controller', 'triggerDeleteCommentPoll', 'after'); - - // 2008. 04. 22 글/댓글의 추가기 설문조사의 연결 - if(!$oModuleModel->getTrigger('document.insertDocument', 'poll', 'controller', 'triggerInsertDocumentPoll', 'after')) - $oModuleController->insertTrigger('document.insertDocument', 'poll', 'controller', 'triggerInsertDocumentPoll', 'after'); - if(!$oModuleModel->getTrigger('comment.insertComment', 'poll', 'controller', 'triggerInsertCommentPoll', 'after')) - $oModuleController->insertTrigger('comment.insertComment', 'poll', 'controller', 'triggerInsertCommentPoll', 'after'); - if(!$oModuleModel->getTrigger('document.updateDocument', 'poll', 'controller', 'triggerUpdateDocumentPoll', 'after')) - $oModuleController->insertTrigger('document.updateDocument', 'poll', 'controller', 'triggerUpdateDocumentPoll', 'after'); - if(!$oModuleModel->getTrigger('comment.updateComment', 'poll', 'controller', 'triggerUpdateCommentPoll', 'after')) - $oModuleController->insertTrigger('comment.updateComment', 'poll', 'controller', 'triggerUpdateCommentPoll', 'after'); - - return new Object(0, 'success_updated'); - } - - /** - * @brief 캐시 파일 재생성 - **/ - function recompileCache() { - } - } -?> +skin = 'default'; + $config->colorset = 'normal'; + $oModuleController->insertModuleConfig('poll', $config); + + // 2007. 10. 17 글/댓글의 삭제시 설문조사도 삭제 + $oModuleController->insertTrigger('document.insertDocument', 'poll', 'controller', 'triggerInsertDocumentPoll', 'after'); + $oModuleController->insertTrigger('comment.insertComment', 'poll', 'controller', 'triggerInsertCommentPoll', 'after'); + $oModuleController->insertTrigger('document.updateDocument', 'poll', 'controller', 'triggerUpdateDocumentPoll', 'after'); + $oModuleController->insertTrigger('comment.updateComment', 'poll', 'controller', 'triggerUpdateCommentPoll', 'after'); + $oModuleController->insertTrigger('document.deleteDocument', 'poll', 'controller', 'triggerDeleteDocumentPoll', 'after'); + $oModuleController->insertTrigger('comment.deleteComment', 'poll', 'controller', 'triggerDeleteCommentPoll', 'after'); + + return new Object(); + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + **/ + function checkUpdate() { + $oModuleModel = &getModel('module'); + + // 2007. 10. 17 글/댓글의 삭제시 설문조사도 삭제 + if(!$oModuleModel->getTrigger('document.insertDocument', 'poll', 'controller', 'triggerInsertDocumentPoll', 'after')) return true; + if(!$oModuleModel->getTrigger('comment.insertComment', 'poll', 'controller', 'triggerInsertCommentPoll', 'after')) return true; + if(!$oModuleModel->getTrigger('document.updateDocument', 'poll', 'controller', 'triggerUpdateDocumentPoll', 'after')) return true; + if(!$oModuleModel->getTrigger('comment.updateComment', 'poll', 'controller', 'triggerUpdateCommentPoll', 'after')) return true; + if(!$oModuleModel->getTrigger('document.deleteDocument', 'poll', 'controller', 'triggerDeleteDocumentPoll', 'after')) return true; + if(!$oModuleModel->getTrigger('comment.deleteComment', 'poll', 'controller', 'triggerDeleteCommentPoll', 'after')) return true; + + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + $oModuleModel = &getModel('module'); + $oModuleController = &getController('module'); + + // 2007. 10. 17 글/댓글의 삭제시 설문조사도 삭제 + if(!$oModuleModel->getTrigger('document.deleteDocument', 'poll', 'controller', 'triggerDeleteDocumentPoll', 'after')) + $oModuleController->insertTrigger('document.deleteDocument', 'poll', 'controller', 'triggerDeleteDocumentPoll', 'after'); + if(!$oModuleModel->getTrigger('comment.deleteComment', 'poll', 'controller', 'triggerDeleteCommentPoll', 'after')) + $oModuleController->insertTrigger('comment.deleteComment', 'poll', 'controller', 'triggerDeleteCommentPoll', 'after'); + + // 2008. 04. 22 글/댓글의 추가기 설문조사의 연결 + if(!$oModuleModel->getTrigger('document.insertDocument', 'poll', 'controller', 'triggerInsertDocumentPoll', 'after')) + $oModuleController->insertTrigger('document.insertDocument', 'poll', 'controller', 'triggerInsertDocumentPoll', 'after'); + if(!$oModuleModel->getTrigger('comment.insertComment', 'poll', 'controller', 'triggerInsertCommentPoll', 'after')) + $oModuleController->insertTrigger('comment.insertComment', 'poll', 'controller', 'triggerInsertCommentPoll', 'after'); + if(!$oModuleModel->getTrigger('document.updateDocument', 'poll', 'controller', 'triggerUpdateDocumentPoll', 'after')) + $oModuleController->insertTrigger('document.updateDocument', 'poll', 'controller', 'triggerUpdateDocumentPoll', 'after'); + if(!$oModuleModel->getTrigger('comment.updateComment', 'poll', 'controller', 'triggerUpdateCommentPoll', 'after')) + $oModuleController->insertTrigger('comment.updateComment', 'poll', 'controller', 'triggerUpdateCommentPoll', 'after'); + + return new Object(0, 'success_updated'); + } + + /** + * @brief 캐시 파일 재생성 + **/ + function recompileCache() { + } + } +?> diff --git a/modules/poll/poll.controller.php b/modules/poll/poll.controller.php index 674761028..90e4264f3 100644 --- a/modules/poll/poll.controller.php +++ b/modules/poll/poll.controller.php @@ -1,316 +1,316 @@ - $val) { - if(strpos($key,'tidx')) continue; - if(!preg_match("/^(title|checkcount|item)_/i", $key)) continue; - if(!trim($val)) continue; - - $tmp_arr = explode('_',$key); - - $poll_index = $tmp_arr[1]; - - if(Context::get('is_logged')) { - $logged_info = Context::get('logged_info'); - // 세션에서 최고 관리자가 아니면 태그 제거 - if($logged_info->is_admin != 'Y') $val = htmlspecialchars($val); - } - - if($tmp_arr[0]=='title') $tmp_args[$poll_index]->title = $val; - else if($tmp_arr[0]=='checkcount') $tmp_args[$poll_index]->checkcount = $val; - else if($tmp_arr[0]=='item') $tmp_args[$poll_index]->item[] = $val; - } - - foreach($tmp_args as $key => $val) { - if(!$val->checkcount) $val->checkcount = 1; - if($val->title && count($val->item)) $args->poll[] = $val; - } - - if(!count($args->poll)) return new Object(-1, 'cmd_null_item'); - - $args->stop_date = $stop_date; - - // 변수 설정 - $poll_srl = getNextSequence(); - - $logged_info = Context::get('logged_info'); - $member_srl = $logged_info->member_srl?$logged_info->member_srl:0; - - $oDB = &DB::getInstance(); - $oDB->begin(); - - // 설문의 등록 - unset($poll_args); - $poll_args->poll_srl = $poll_srl; - $poll_args->member_srl = $member_srl; - $poll_args->list_order = $poll_srl*-1; - $poll_args->stop_date = $args->stop_date; - $poll_args->poll_count = 0; - $output = executeQuery('poll.insertPoll', $poll_args); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - // 개별 설문 등록 - foreach($args->poll as $key => $val) { - unset($title_args); - $title_args->poll_srl = $poll_srl; - $title_args->poll_index_srl = getNextSequence(); - $title_args->title = $val->title; - $title_args->checkcount = $val->checkcount; - $title_args->poll_count = 0; - $title_args->list_order = $title_args->poll_index_srl * -1; - $title_args->member_srl = $member_srl; - $title_args->upload_target_srl = $upload_target_srl; - $output = executeQuery('poll.insertPollTitle', $title_args); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - // 개별 설문의 항목 추가 - foreach($val->item as $k => $v) { - unset($item_args); - $item_args->poll_srl = $poll_srl; - $item_args->poll_index_srl = $title_args->poll_index_srl; - $item_args->title = $v; - $item_args->poll_count = 0; - $item_args->upload_target_srl = $upload_target_srl; - $output = executeQuery('poll.insertPollItem', $item_args); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - } - } - - $oDB->commit(); - - $this->add('poll_srl', $poll_srl); - $this->setMessage('success_registed'); - } - - /** - * @brief 설문 조사에 응함 - **/ - function procPoll() { - $poll_srl = Context::get('poll_srl'); - $poll_srl_indexes = Context::get('poll_srl_indexes'); - $tmp_item_srls = explode(',',$poll_srl_indexes); - for($i=0;$iisPolled($poll_srl)) return new Object(-1, 'msg_already_poll'); - - $oDB = &DB::getInstance(); - $oDB->begin(); - - $args->poll_srl = $poll_srl; - - // 해당 글의 모든 설문조사의 응답수 올림 - $output = executeQuery('poll.updatePoll', $args); - $output = executeQuery('poll.updatePollTitle', $args); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - // 각 설문조사의 선택된 항목을 기록 - $args->poll_item_srl = implode(',',$item_srls); - $output = executeQuery('poll.updatePollItems', $args); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - // 응답자 정보를 로그로 남김 - $log_args->poll_srl = $poll_srl; - - $logged_info = Context::get('logged_info'); - $member_srl = $logged_info->member_srl?$logged_info->member_srl:0; - - $log_args->member_srl = $member_srl; - $log_args->ipaddress = $_SERVER['REMOTE_ADDR']; - $output = executeQuery('poll.insertPollLog', $log_args); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - $oDB->commit(); - - $skin = Context::get('skin'); - if(!$skin || !is_dir('./modules/poll/skins/'.$skin)) $skin = 'default'; - - // tpl 가져오기 - $tpl = $oPollModel->getPollHtml($poll_srl, '', $skin); - - $this->add('poll_srl', $poll_srl); - $this->add('tpl',$tpl); - $this->setMessage('success_poll'); - } - - /** - * @brief 결과 미리 보기 - **/ - function procPollViewResult() { - $poll_srl = Context::get('poll_srl'); - - $skin = Context::get('skin'); - if(!$skin || !is_dir('./modules/poll/skins/'.$skin)) $skin = 'default'; - - $oPollModel = &getModel('poll'); - $tpl = $oPollModel->getPollResultHtml($poll_srl, $skin); - - $this->add('poll_srl', $poll_srl); - $this->add('tpl',$tpl); - } - - /** - * @brief 게시글 등록시 poll 연결하는 trigger - **/ - function triggerInsertDocumentPoll(&$obj) { - $this->syncPoll($obj->document_srl, $obj->content); - return new Object(); - } - - /** - * @brief 댓글 등록시 poll 연결하는 trigger - **/ - function triggerInsertCommentPoll(&$obj) { - $this->syncPoll($obj->comment_srl, $obj->content); - return new Object(); - } - - /** - * @brief 게시글 수정시 poll 연결하는 trigger - **/ - function triggerUpdateDocumentPoll(&$obj) { - $this->syncPoll($obj->document_srl, $obj->content); - return new Object(); - } - - /** - * @brief 댓글 등록시 poll 연결하는 trigger - **/ - function triggerUpdateCommentPoll(&$obj) { - $this->syncPoll($obj->comment_srl, $obj->content); - return new Object(); - } - - /** - * @brief 게시글 삭제시 poll 삭제하는 trigger - **/ - function triggerDeleteDocumentPoll(&$obj) { - $document_srl = $obj->document_srl; - if(!$document_srl) return new Object(); - - // 설문조사를 구함 - $args->upload_target_srl = $document_srl; - $output = executeQuery('poll.getPollByTargetSrl', $args); - if(!$output->data) return new Object(); - - $poll_srl = $output->data->poll_srl; - if(!$poll_srl) return new Object(); - - $args->poll_srl = $poll_srl; - - $output = executeQuery('poll.deletePoll', $args); - if(!$output->toBool()) return $output; - - $output = executeQuery('poll.deletePollItem', $args); - if(!$output->toBool()) return $output; - - $output = executeQuery('poll.deletePollTitle', $args); - if(!$output->toBool()) return $output; - - $output = executeQuery('poll.deletePollLog', $args); - if(!$output->toBool()) return $output; - - return new Object(); - } - - /** - * @brief 댓글 삭제시 poll 삭제하는 trigger - **/ - function triggerDeleteCommentPoll(&$obj) { - $comment_srl = $obj->comment_srl; - if(!$comment_srl) return new Object(); - - // 설문조사를 구함 - $args->upload_target_srl = $comment_srl; - $output = executeQuery('poll.getPollByTargetSrl', $args); - if(!$output->data) return new Object(); - - $poll_srl = $output->data->poll_srl; - if(!$poll_srl) return new Object(); - - $args->poll_srl = $poll_srl; - - $output = executeQuery('poll.deletePoll', $args); - if(!$output->toBool()) return $output; - - $output = executeQuery('poll.deletePollItem', $args); - if(!$output->toBool()) return $output; - - $output = executeQuery('poll.deletePollTitle', $args); - if(!$output->toBool()) return $output; - - $output = executeQuery('poll.deletePollLog', $args); - if(!$output->toBool()) return $output; - - return new Object(); - } - - /** - * @brief 게시글 내용의 설문조사를 구해와서 문서 번호와 연결 - **/ - function syncPoll($upload_target_srl, $content) { - $match_cnt = preg_match_all('!]*)poll_srl=(["\']?)([0-9]*)(["\']?)([^\>]*?)\>!is',$content, $matches); - for($i=0;$i<$match_cnt;$i++) { - $poll_srl = $matches[3][$i]; - - $args = null; - $args->poll_srl = $poll_srl; - $output = executeQuery('poll.getPoll', $args); - $poll = $output->data; - - if($poll->upload_target_srl) continue; - - $args->upload_target_srl = $upload_target_srl; - $output = executeQuery('poll.updatePollTarget', $args); - $output = executeQuery('poll.updatePollTitleTarget', $args); - $output = executeQuery('poll.updatePollItemTarget', $args); - } - } - } -?> + $val) { + if(strpos($key,'tidx')) continue; + if(!preg_match("/^(title|checkcount|item)_/i", $key)) continue; + if(!trim($val)) continue; + + $tmp_arr = explode('_',$key); + + $poll_index = $tmp_arr[1]; + + if(Context::get('is_logged')) { + $logged_info = Context::get('logged_info'); + // 세션에서 최고 관리자가 아니면 태그 제거 + if($logged_info->is_admin != 'Y') $val = htmlspecialchars($val); + } + + if($tmp_arr[0]=='title') $tmp_args[$poll_index]->title = $val; + else if($tmp_arr[0]=='checkcount') $tmp_args[$poll_index]->checkcount = $val; + else if($tmp_arr[0]=='item') $tmp_args[$poll_index]->item[] = $val; + } + + foreach($tmp_args as $key => $val) { + if(!$val->checkcount) $val->checkcount = 1; + if($val->title && count($val->item)) $args->poll[] = $val; + } + + if(!count($args->poll)) return new Object(-1, 'cmd_null_item'); + + $args->stop_date = $stop_date; + + // 변수 설정 + $poll_srl = getNextSequence(); + + $logged_info = Context::get('logged_info'); + $member_srl = $logged_info->member_srl?$logged_info->member_srl:0; + + $oDB = &DB::getInstance(); + $oDB->begin(); + + // 설문의 등록 + unset($poll_args); + $poll_args->poll_srl = $poll_srl; + $poll_args->member_srl = $member_srl; + $poll_args->list_order = $poll_srl*-1; + $poll_args->stop_date = $args->stop_date; + $poll_args->poll_count = 0; + $output = executeQuery('poll.insertPoll', $poll_args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // 개별 설문 등록 + foreach($args->poll as $key => $val) { + unset($title_args); + $title_args->poll_srl = $poll_srl; + $title_args->poll_index_srl = getNextSequence(); + $title_args->title = $val->title; + $title_args->checkcount = $val->checkcount; + $title_args->poll_count = 0; + $title_args->list_order = $title_args->poll_index_srl * -1; + $title_args->member_srl = $member_srl; + $title_args->upload_target_srl = $upload_target_srl; + $output = executeQuery('poll.insertPollTitle', $title_args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // 개별 설문의 항목 추가 + foreach($val->item as $k => $v) { + unset($item_args); + $item_args->poll_srl = $poll_srl; + $item_args->poll_index_srl = $title_args->poll_index_srl; + $item_args->title = $v; + $item_args->poll_count = 0; + $item_args->upload_target_srl = $upload_target_srl; + $output = executeQuery('poll.insertPollItem', $item_args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + } + } + + $oDB->commit(); + + $this->add('poll_srl', $poll_srl); + $this->setMessage('success_registed'); + } + + /** + * @brief 설문 조사에 응함 + **/ + function procPoll() { + $poll_srl = Context::get('poll_srl'); + $poll_srl_indexes = Context::get('poll_srl_indexes'); + $tmp_item_srls = explode(',',$poll_srl_indexes); + for($i=0;$iisPolled($poll_srl)) return new Object(-1, 'msg_already_poll'); + + $oDB = &DB::getInstance(); + $oDB->begin(); + + $args->poll_srl = $poll_srl; + + // 해당 글의 모든 설문조사의 응답수 올림 + $output = executeQuery('poll.updatePoll', $args); + $output = executeQuery('poll.updatePollTitle', $args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // 각 설문조사의 선택된 항목을 기록 + $args->poll_item_srl = implode(',',$item_srls); + $output = executeQuery('poll.updatePollItems', $args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + // 응답자 정보를 로그로 남김 + $log_args->poll_srl = $poll_srl; + + $logged_info = Context::get('logged_info'); + $member_srl = $logged_info->member_srl?$logged_info->member_srl:0; + + $log_args->member_srl = $member_srl; + $log_args->ipaddress = $_SERVER['REMOTE_ADDR']; + $output = executeQuery('poll.insertPollLog', $log_args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + + $oDB->commit(); + + $skin = Context::get('skin'); + if(!$skin || !is_dir('./modules/poll/skins/'.$skin)) $skin = 'default'; + + // tpl 가져오기 + $tpl = $oPollModel->getPollHtml($poll_srl, '', $skin); + + $this->add('poll_srl', $poll_srl); + $this->add('tpl',$tpl); + $this->setMessage('success_poll'); + } + + /** + * @brief 결과 미리 보기 + **/ + function procPollViewResult() { + $poll_srl = Context::get('poll_srl'); + + $skin = Context::get('skin'); + if(!$skin || !is_dir('./modules/poll/skins/'.$skin)) $skin = 'default'; + + $oPollModel = &getModel('poll'); + $tpl = $oPollModel->getPollResultHtml($poll_srl, $skin); + + $this->add('poll_srl', $poll_srl); + $this->add('tpl',$tpl); + } + + /** + * @brief 게시글 등록시 poll 연결하는 trigger + **/ + function triggerInsertDocumentPoll(&$obj) { + $this->syncPoll($obj->document_srl, $obj->content); + return new Object(); + } + + /** + * @brief 댓글 등록시 poll 연결하는 trigger + **/ + function triggerInsertCommentPoll(&$obj) { + $this->syncPoll($obj->comment_srl, $obj->content); + return new Object(); + } + + /** + * @brief 게시글 수정시 poll 연결하는 trigger + **/ + function triggerUpdateDocumentPoll(&$obj) { + $this->syncPoll($obj->document_srl, $obj->content); + return new Object(); + } + + /** + * @brief 댓글 등록시 poll 연결하는 trigger + **/ + function triggerUpdateCommentPoll(&$obj) { + $this->syncPoll($obj->comment_srl, $obj->content); + return new Object(); + } + + /** + * @brief 게시글 삭제시 poll 삭제하는 trigger + **/ + function triggerDeleteDocumentPoll(&$obj) { + $document_srl = $obj->document_srl; + if(!$document_srl) return new Object(); + + // 설문조사를 구함 + $args->upload_target_srl = $document_srl; + $output = executeQuery('poll.getPollByTargetSrl', $args); + if(!$output->data) return new Object(); + + $poll_srl = $output->data->poll_srl; + if(!$poll_srl) return new Object(); + + $args->poll_srl = $poll_srl; + + $output = executeQuery('poll.deletePoll', $args); + if(!$output->toBool()) return $output; + + $output = executeQuery('poll.deletePollItem', $args); + if(!$output->toBool()) return $output; + + $output = executeQuery('poll.deletePollTitle', $args); + if(!$output->toBool()) return $output; + + $output = executeQuery('poll.deletePollLog', $args); + if(!$output->toBool()) return $output; + + return new Object(); + } + + /** + * @brief 댓글 삭제시 poll 삭제하는 trigger + **/ + function triggerDeleteCommentPoll(&$obj) { + $comment_srl = $obj->comment_srl; + if(!$comment_srl) return new Object(); + + // 설문조사를 구함 + $args->upload_target_srl = $comment_srl; + $output = executeQuery('poll.getPollByTargetSrl', $args); + if(!$output->data) return new Object(); + + $poll_srl = $output->data->poll_srl; + if(!$poll_srl) return new Object(); + + $args->poll_srl = $poll_srl; + + $output = executeQuery('poll.deletePoll', $args); + if(!$output->toBool()) return $output; + + $output = executeQuery('poll.deletePollItem', $args); + if(!$output->toBool()) return $output; + + $output = executeQuery('poll.deletePollTitle', $args); + if(!$output->toBool()) return $output; + + $output = executeQuery('poll.deletePollLog', $args); + if(!$output->toBool()) return $output; + + return new Object(); + } + + /** + * @brief 게시글 내용의 설문조사를 구해와서 문서 번호와 연결 + **/ + function syncPoll($upload_target_srl, $content) { + $match_cnt = preg_match_all('!]*)poll_srl=(["\']?)([0-9]*)(["\']?)([^\>]*?)\>!is',$content, $matches); + for($i=0;$i<$match_cnt;$i++) { + $poll_srl = $matches[3][$i]; + + $args = null; + $args->poll_srl = $poll_srl; + $output = executeQuery('poll.getPoll', $args); + $poll = $output->data; + + if($poll->upload_target_srl) continue; + + $args->upload_target_srl = $upload_target_srl; + $output = executeQuery('poll.updatePollTarget', $args); + $output = executeQuery('poll.updatePollTitleTarget', $args); + $output = executeQuery('poll.updatePollItemTarget', $args); + } + } + } +?> diff --git a/modules/poll/poll.model.php b/modules/poll/poll.model.php index 9aea81ada..4afa88ddc 100644 --- a/modules/poll/poll.model.php +++ b/modules/poll/poll.model.php @@ -1,142 +1,142 @@ -poll_srl = $poll_srl; - - if(Context::get('is_logged')) { - $logged_info = Context::get('logged_info'); - $args->member_srl = $logged_info->member_srl; - } else { - $args->ipaddress = $_SERVER['REMOTE_ADDR']; - } - $output = executeQuery('poll.getPollLog', $args); - if($output->data->count) return true; - return false; - } - - /** - * @brief 설문조사의 html데이터를 return - * 설문조사에 응하였는지에 대한 체크를 한 후 결과를 return - **/ - function getPollHtml($poll_srl, $style = '', $skin = 'default') { - - $args->poll_srl = $poll_srl; - - // 해당 설문조사에 대한 내용을 조사 - $output = executeQuery('poll.getPoll', $args); - if(!$output->data) return ''; - - $poll->style = $style; - $poll->poll_count = (int)$output->data->poll_count; - $poll->stop_date = $output->data->stop_date; - - $output = executeQuery('poll.getPollTitle', $args); - if(!$output->data) return; - if(!is_array($output->data)) $output->data = array($output->data); - foreach($output->data as $key => $val) { - $poll->poll[$val->poll_index_srl]->title = $val->title; - $poll->poll[$val->poll_index_srl]->checkcount = $val->checkcount; - $poll->poll[$val->poll_index_srl]->poll_count = $val->poll_count; - } - - $output = executeQuery('poll.getPollItem', $args); - foreach($output->data as $key => $val) { - $poll->poll[$val->poll_index_srl]->item[] = $val; - } - - $poll->poll_srl = $poll_srl; - - // 종료일이 지났으면 무조건 결과만 - if($poll->stop_date > date("Ymd")) { - if($this->isPolled($poll_srl)) $tpl_file = "result"; - else $tpl_file = "form"; - } else { - $tpl_file = "result"; - } - - Context::set('poll',$poll); - Context::set('skin',$skin); - - // 기본 설정의 스킨, 컬러셋 설정 - $tpl_path = sprintf("%sskins/%s/", $this->module_path, $skin); - - $oTemplate = &TemplateHandler::getInstance(); - return $oTemplate->compile($tpl_path, $tpl_file); - } - - /** - * @brief 결과 html을 return - **/ - function getPollResultHtml($poll_srl, $skin = 'default') { - $args->poll_srl = $poll_srl; - - // 해당 설문조사에 대한 내용을 조사 - $output = executeQuery('poll.getPoll', $args); - if(!$output->data) return ''; - - $poll->style = $style; - $poll->poll_count = (int)$output->data->poll_count; - $poll->stop_date = $output->data->stop_date; - - $output = executeQuery('poll.getPollTitle', $args); - if(!$output->data) return; - if(!is_array($output->data)) $output->data = array($output->data); - foreach($output->data as $key => $val) { - $poll->poll[$val->poll_index_srl]->title = $val->title; - $poll->poll[$val->poll_index_srl]->checkcount = $val->checkcount; - $poll->poll[$val->poll_index_srl]->poll_count = $val->poll_count; - } - - $output = executeQuery('poll.getPollItem', $args); - foreach($output->data as $key => $val) { - $poll->poll[$val->poll_index_srl]->item[] = $val; - } - - $poll->poll_srl = $poll_srl; - - $tpl_file = "result"; - - Context::set('poll',$poll); - - // 기본 설정의 스킨, 컬러셋 설정 - $tpl_path = sprintf("%sskins/%s/", $this->module_path, $skin); - - $oTemplate = &TemplateHandler::getInstance(); - return $oTemplate->compile($tpl_path, $tpl_file); - } - - /** - * @brief 선택된 설문조사 - 스킨의 컬러셋을 return - **/ - function getPollGetColorsetList() { - $skin = Context::get('skin'); - - $oModuleModel = &getModel('module'); - $skin_info = $oModuleModel->loadSkinInfo($this->module_path, $skin); - - for($i=0;$icolorset);$i++) { - $colorset = sprintf('%s|@|%s', $skin_info->colorset[$i]->name, $skin_info->colorset[$i]->title); - $colorset_list[] = $colorset; - } - - if(count($colorset_list)) $colorsets = implode("\n", $colorset_list); - $this->add('colorset_list', $colorsets); - } - } -?> +poll_srl = $poll_srl; + + if(Context::get('is_logged')) { + $logged_info = Context::get('logged_info'); + $args->member_srl = $logged_info->member_srl; + } else { + $args->ipaddress = $_SERVER['REMOTE_ADDR']; + } + $output = executeQuery('poll.getPollLog', $args); + if($output->data->count) return true; + return false; + } + + /** + * @brief 설문조사의 html데이터를 return + * 설문조사에 응하였는지에 대한 체크를 한 후 결과를 return + **/ + function getPollHtml($poll_srl, $style = '', $skin = 'default') { + + $args->poll_srl = $poll_srl; + + // 해당 설문조사에 대한 내용을 조사 + $output = executeQuery('poll.getPoll', $args); + if(!$output->data) return ''; + + $poll->style = $style; + $poll->poll_count = (int)$output->data->poll_count; + $poll->stop_date = $output->data->stop_date; + + $output = executeQuery('poll.getPollTitle', $args); + if(!$output->data) return; + if(!is_array($output->data)) $output->data = array($output->data); + foreach($output->data as $key => $val) { + $poll->poll[$val->poll_index_srl]->title = $val->title; + $poll->poll[$val->poll_index_srl]->checkcount = $val->checkcount; + $poll->poll[$val->poll_index_srl]->poll_count = $val->poll_count; + } + + $output = executeQuery('poll.getPollItem', $args); + foreach($output->data as $key => $val) { + $poll->poll[$val->poll_index_srl]->item[] = $val; + } + + $poll->poll_srl = $poll_srl; + + // 종료일이 지났으면 무조건 결과만 + if($poll->stop_date > date("Ymd")) { + if($this->isPolled($poll_srl)) $tpl_file = "result"; + else $tpl_file = "form"; + } else { + $tpl_file = "result"; + } + + Context::set('poll',$poll); + Context::set('skin',$skin); + + // 기본 설정의 스킨, 컬러셋 설정 + $tpl_path = sprintf("%sskins/%s/", $this->module_path, $skin); + + $oTemplate = &TemplateHandler::getInstance(); + return $oTemplate->compile($tpl_path, $tpl_file); + } + + /** + * @brief 결과 html을 return + **/ + function getPollResultHtml($poll_srl, $skin = 'default') { + $args->poll_srl = $poll_srl; + + // 해당 설문조사에 대한 내용을 조사 + $output = executeQuery('poll.getPoll', $args); + if(!$output->data) return ''; + + $poll->style = $style; + $poll->poll_count = (int)$output->data->poll_count; + $poll->stop_date = $output->data->stop_date; + + $output = executeQuery('poll.getPollTitle', $args); + if(!$output->data) return; + if(!is_array($output->data)) $output->data = array($output->data); + foreach($output->data as $key => $val) { + $poll->poll[$val->poll_index_srl]->title = $val->title; + $poll->poll[$val->poll_index_srl]->checkcount = $val->checkcount; + $poll->poll[$val->poll_index_srl]->poll_count = $val->poll_count; + } + + $output = executeQuery('poll.getPollItem', $args); + foreach($output->data as $key => $val) { + $poll->poll[$val->poll_index_srl]->item[] = $val; + } + + $poll->poll_srl = $poll_srl; + + $tpl_file = "result"; + + Context::set('poll',$poll); + + // 기본 설정의 스킨, 컬러셋 설정 + $tpl_path = sprintf("%sskins/%s/", $this->module_path, $skin); + + $oTemplate = &TemplateHandler::getInstance(); + return $oTemplate->compile($tpl_path, $tpl_file); + } + + /** + * @brief 선택된 설문조사 - 스킨의 컬러셋을 return + **/ + function getPollGetColorsetList() { + $skin = Context::get('skin'); + + $oModuleModel = &getModel('module'); + $skin_info = $oModuleModel->loadSkinInfo($this->module_path, $skin); + + for($i=0;$icolorset);$i++) { + $colorset = sprintf('%s|@|%s', $skin_info->colorset[$i]->name, $skin_info->colorset[$i]->title); + $colorset_list[] = $colorset; + } + + if(count($colorset_list)) $colorsets = implode("\n", $colorset_list); + $this->add('colorset_list', $colorsets); + } + } +?> diff --git a/modules/poll/skins/default/skin.xml b/modules/poll/skins/default/skin.xml index fc726fa53..42c5d576e 100644 --- a/modules/poll/skins/default/skin.xml +++ b/modules/poll/skins/default/skin.xml @@ -1,41 +1,41 @@ - - - 설문조사 기본 스킨 - 投票系统默认皮肤 - アンケート調査デフォルトスキン - Default Skin of Poll - Skin mặc định của thăm dò - 投票系統預設面板 - Oylamanın Varsayılan Dış Görünümü - 설문조사 기본 스킨 - 投票系统默认皮肤。 - アンケート調査デフォルトスキン - Default Skin of Poll - Skin mặc định của thăm dò. - 投票系統預設面板。 - Oylamanın Varsayılan Dış Görünümü - 0.1 - 2007-02-28 - - - NHN - NHN - NHN - NHN - NHN - NHN - NHN - - - - - 기본 - Mặc định - 默认 - デフォルト - Default - 預設 - Varsayılan - - - + + + 설문조사 기본 스킨 + 投票系统默认皮肤 + アンケート調査デフォルトスキン + Default Skin of Poll + Skin mặc định của thăm dò + 投票系統預設面板 + Oylamanın Varsayılan Dış Görünümü + 설문조사 기본 스킨 + 投票系统默认皮肤。 + アンケート調査デフォルトスキン + Default Skin of Poll + Skin mặc định của thăm dò. + 投票系統預設面板。 + Oylamanın Varsayılan Dış Görünümü + 0.1 + 2007-02-28 + + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + + + + 기본 + Mặc định + 默认 + デフォルト + Default + 預設 + Varsayılan + + + diff --git a/modules/poll/skins/simple/skin.xml b/modules/poll/skins/simple/skin.xml index 01c072ded..ec5ac9bb3 100644 --- a/modules/poll/skins/simple/skin.xml +++ b/modules/poll/skins/simple/skin.xml @@ -1,38 +1,38 @@ - - - 설문조사 간단한 스킨 - Skin thăm dò đơn giản - アンケート調査の簡単スキン - 投票系统简易皮肤 - 投票系統簡單面板 - Oylama Sistem Dış Görünümü - 설문조사 간단한 스킨 - Skin hiển thị thăm dò đơn giản. - アンケート調査の簡単スキン - 投票系统简易皮肤。 - 投票系統簡單面板。 - Oylama Sistemi Dış Görünümü - 0.1 - 2008-04-16 - - - NHN - NHN - NHN - NHN - NHN - NHN - - - - - 기본 - Mặc định - 默认 - デフォルト - Default - 預設 - Varsayılan - - - + + + 설문조사 간단한 스킨 + Skin thăm dò đơn giản + アンケート調査の簡単スキン + 投票系统简易皮肤 + 投票系統簡單面板 + Oylama Sistem Dış Görünümü + 설문조사 간단한 스킨 + Skin hiển thị thăm dò đơn giản. + アンケート調査の簡単スキン + 投票系统简易皮肤。 + 投票系統簡單面板。 + Oylama Sistemi Dış Görünümü + 0.1 + 2008-04-16 + + + NHN + NHN + NHN + NHN + NHN + NHN + + + + + 기본 + Mặc định + 默认 + デフォルト + Default + 預設 + Varsayılan + + + diff --git a/modules/poll/tpl/js/poll_admin.js b/modules/poll/tpl/js/poll_admin.js index 455d8e199..b878eac60 100644 --- a/modules/poll/tpl/js/poll_admin.js +++ b/modules/poll/tpl/js/poll_admin.js @@ -1,56 +1,56 @@ -/** - * @file modules/poll/js/poll_admin.js - * @author NHN (developers@xpressengine.com) - * @brief poll 모듈의 관리자용 javascript - **/ - -/* 위젯 코드 생성시 스킨을 고르면 컬러셋의 정보를 표시 */ -function doDisplaySkinColorset(sel, colorset) { - var skin = sel.options[sel.selectedIndex].value; - - var params = new Array(); - params["skin"] = skin; - params["colorset"] = colorset; - - var response_tags = new Array("error","message","colorset_list"); - - exec_xml("poll", "getPollGetColorsetList", params, completeGetSkinColorset, response_tags, params); -} - -/* 서버에서 받아온 컬러셋을 표시 */ -function completeGetSkinColorset(ret_obj, response_tags, params, fo_obj) { - var sel = xGetElementById("fo_poll").poll_colorset; - var length = sel.options.length; - var selected_colorset = params["colorset"]; - for(var i=0;i - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
    {$lang->no}
    {$lang->title}
    {$lang->poll_checkcount}
    {$lang->poll_join_count}
    {$lang->regdate}
     
    {$no}{htmlspecialchars($val->title)}{$val->checkcount}{$val->poll_count}{zdate($val->regdate,"Y-m-d H:i")}{$lang->cmd_view}
    - - - - -
    - - - - - -
    - - -
    - - - - {$lang->cmd_cancel} -
    -
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
    {$lang->no}
    {$lang->title}
    {$lang->poll_checkcount}
    {$lang->poll_join_count}
    {$lang->regdate}
     
    {$no}{htmlspecialchars($val->title)}{$val->checkcount}{$val->poll_count}{zdate($val->regdate,"Y-m-d H:i")}{$lang->cmd_view}
    + + + + +
    + + + + + +
    + + +
    + + + + {$lang->cmd_cancel} +
    +
    diff --git a/modules/rss/conf/info.xml b/modules/rss/conf/info.xml index bdbbc84e5..adbcf61b1 100644 --- a/modules/rss/conf/info.xml +++ b/modules/rss/conf/info.xml @@ -1,36 +1,36 @@ - - - RSS - 整站RSS - RSS - RSS - RSS - RSS - RSS - RSS - RSS - RSS 출력을 담당하는 모듈 - 负责输出RSS的模块。 - RSS出力を担うモジュールです。 - This modules is for printing RSS. - Module này dành cho in ấn RSS. - Este módulo es para imprimir RSS. - Этот модуль служит для печати RSS. - 負責輸出RSS的模組。 - Bu modül RSS çıktısı almak içindir. - 0.1 - 2007-02-28 - utility - - - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - - + + + RSS + 整站RSS + RSS + RSS + RSS + RSS + RSS + RSS + RSS + RSS 출력을 담당하는 모듈 + 负责输出RSS的模块。 + RSS出力を担うモジュールです。 + This modules is for printing RSS. + Module này dành cho in ấn RSS. + Este módulo es para imprimir RSS. + Этот модуль служит для печати RSS. + 負責輸出RSS的模組。 + Bu modül RSS çıktısı almak içindir. + 0.1 + 2007-02-28 + utility + + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + diff --git a/modules/rss/lang/en.lang.php b/modules/rss/lang/en.lang.php index 8fb55717f..544039c73 100644 --- a/modules/rss/lang/en.lang.php +++ b/modules/rss/lang/en.lang.php @@ -1,25 +1,25 @@ -rss_disable = "Disable RSS"; - $lang->rss_type = "RSS feed type"; - $lang->open_rss = 'Open RSS'; - $lang->open_rss_types = array( - 'Y' => 'Open all', - 'H' => 'Open summary', - 'N' => 'Not open', - ); - - // for description - $lang->about_rss_disable = "If checked, RSS will be disabled."; - $lang->about_rss_type = "You can assign RSS feed type."; - $lang->about_open_rss = 'You can select RSS on the current module to be open to the public.\nNo matter the view permission of article , RSS will be open to the public by its option.'; - - // for error message - $lang->msg_rss_is_disabled = "RSS function is disabled."; -?> +rss_disable = "Disable RSS"; + $lang->rss_type = "RSS feed type"; + $lang->open_rss = 'Open RSS'; + $lang->open_rss_types = array( + 'Y' => 'Open all', + 'H' => 'Open summary', + 'N' => 'Not open', + ); + + // for description + $lang->about_rss_disable = "If checked, RSS will be disabled."; + $lang->about_rss_type = "You can assign RSS feed type."; + $lang->about_open_rss = 'You can select RSS on the current module to be open to the public.\nNo matter the view permission of article , RSS will be open to the public by its option.'; + + // for error message + $lang->msg_rss_is_disabled = "RSS function is disabled."; +?> diff --git a/modules/rss/lang/es.lang.php b/modules/rss/lang/es.lang.php index e95ab9cf9..2454a7a9a 100644 --- a/modules/rss/lang/es.lang.php +++ b/modules/rss/lang/es.lang.php @@ -1,25 +1,25 @@ -rss_disable = "Desactivar RSS"; - $lang->rss_type = "Tipo de RSS a imprimir"; - $lang->open_rss = 'Abrir RSS'; - $lang->open_rss_types = array( - 'Y' => 'Abrir todo', - 'H' => 'Abrir el sumario', - 'N' => 'No abrir', - ); - - // para la descripcion - $lang->about_rss_disable = "Si selecciona esta opción, RSS será desactivado."; - $lang->about_rss_type = "Usted puede asignar el tipo de RSS a imprimir."; - $lang->about_open_rss = 'Usted puede seleccionar RSS abierto al público en el módulo actual.\nIndependiente de la atribución de ver, dependiendo de la opción de RSS puede ser abierto al público.'; - - // mensajes de error - $lang->msg_rss_is_disabled = "Función de RSS esta desactivada."; -?> +rss_disable = "Desactivar RSS"; + $lang->rss_type = "Tipo de RSS a imprimir"; + $lang->open_rss = 'Abrir RSS'; + $lang->open_rss_types = array( + 'Y' => 'Abrir todo', + 'H' => 'Abrir el sumario', + 'N' => 'No abrir', + ); + + // para la descripcion + $lang->about_rss_disable = "Si selecciona esta opción, RSS será desactivado."; + $lang->about_rss_type = "Usted puede asignar el tipo de RSS a imprimir."; + $lang->about_open_rss = 'Usted puede seleccionar RSS abierto al público en el módulo actual.\nIndependiente de la atribución de ver, dependiendo de la opción de RSS puede ser abierto al público.'; + + // mensajes de error + $lang->msg_rss_is_disabled = "Función de RSS esta desactivada."; +?> diff --git a/modules/rss/lang/fr.lang.php b/modules/rss/lang/fr.lang.php index 81acbdb19..add634860 100644 --- a/modules/rss/lang/fr.lang.php +++ b/modules/rss/lang/fr.lang.php @@ -1,25 +1,25 @@ - - * @brief Paquet du langage en français pour le module de RSS - **/ - - // general words - $lang->rss_disable = "Invalider RSS"; - $lang->rss_type = "Le Format pour imprimer RSS"; - $lang->open_rss = 'Exposer RSS'; - $lang->open_rss_types = array( - 'Y' => 'Exposer Tout', - 'H' => 'Exposer Résumé', - 'N' => 'Ne pas exposer', - ); - - // for description - $lang->about_rss_disable = "Si vous cochez, RSS sera invalidé."; - $lang->about_rss_type = "Vous pouvez désignez le format pour inprimer RSS."; - $lang->about_open_rss = 'Vous pouvez exposez au publique le RSS du module courant ou non.\nN\'importe comment est la permission de l\'article, RSS sera exposé au publique selon son option.'; - - // for error message - $lang->msg_rss_is_disabled = "La fonction RSS est invalidé."; -?> + + * @brief Paquet du langage en français pour le module de RSS + **/ + + // general words + $lang->rss_disable = "Invalider RSS"; + $lang->rss_type = "Le Format pour imprimer RSS"; + $lang->open_rss = 'Exposer RSS'; + $lang->open_rss_types = array( + 'Y' => 'Exposer Tout', + 'H' => 'Exposer Résumé', + 'N' => 'Ne pas exposer', + ); + + // for description + $lang->about_rss_disable = "Si vous cochez, RSS sera invalidé."; + $lang->about_rss_type = "Vous pouvez désignez le format pour inprimer RSS."; + $lang->about_open_rss = 'Vous pouvez exposez au publique le RSS du module courant ou non.\nN\'importe comment est la permission de l\'article, RSS sera exposé au publique selon son option.'; + + // for error message + $lang->msg_rss_is_disabled = "La fonction RSS est invalidé."; +?> diff --git a/modules/rss/lang/jp.lang.php b/modules/rss/lang/jp.lang.php index 75fab07e3..40f9ffb70 100644 --- a/modules/rss/lang/jp.lang.php +++ b/modules/rss/lang/jp.lang.php @@ -1,36 +1,36 @@ -feed = 'RSS発行'; - $lang->total_feed = '統合RSS'; - $lang->rss_disable = "RSS機能オフ"; - $lang->feed_copyright = '著作権'; - $lang->feed_document_count = 'RSSコンテンツ数'; - $lang->feed_image = 'RSSイメージ'; - $lang->rss_type = "出力するRSSタイプ"; - $lang->open_rss = 'RSS配信'; - $lang->open_rss_types = array( - 'Y' => '全文配信 ', - 'H' => '要約配信', - 'N' => '配信しない', - ); - $lang->open_feed_to_total = '統合RSSに含む'; - - // 説明文 - $lang->about_rss_disable = 'チェックするとRSSの出力を行いません。'; - $lang->about_rss_type = '出力するRSSタイプを指定することが出来ます。'; - $lang->about_open_rss = '現在のモジュールに対して「RSS配信」を選択することが出来ます。書き込みの内容が読める権限とは関係なくオプションによってRSSが配信されます。'; - $lang->about_feed_description = '発行するRSSに関する説明を入力します。未入力した場合は該当モジュールで設定された管理用説明が含まれます。'; - $lang->about_feed_copyright = '発行するRSSのコンテンツに対する著作権情報です。'; - $lang->about_part_feed_copyright = '未入力の場合、全体RSS著作権の設定と同様に適用されます。'; - $lang->about_feed_document_count = 'RSSに配信するコンテンツの数 (デフォルト : 15)'; - - // エラーメッセージ - $lang->msg_rss_is_disabled = 'RSS機能がロックされています。'; - $lang->msg_rss_invalid_image_format = 'サポートしないイメージファイルです。\nJPEG, GIF, PNGファイルのみサポートします。'; -?> +feed = 'RSS発行'; + $lang->total_feed = '統合RSS'; + $lang->rss_disable = "RSS機能オフ"; + $lang->feed_copyright = '著作権'; + $lang->feed_document_count = 'RSSコンテンツ数'; + $lang->feed_image = 'RSSイメージ'; + $lang->rss_type = "出力するRSSタイプ"; + $lang->open_rss = 'RSS配信'; + $lang->open_rss_types = array( + 'Y' => '全文配信 ', + 'H' => '要約配信', + 'N' => '配信しない', + ); + $lang->open_feed_to_total = '統合RSSに含む'; + + // 説明文 + $lang->about_rss_disable = 'チェックするとRSSの出力を行いません。'; + $lang->about_rss_type = '出力するRSSタイプを指定することが出来ます。'; + $lang->about_open_rss = '現在のモジュールに対して「RSS配信」を選択することが出来ます。書き込みの内容が読める権限とは関係なくオプションによってRSSが配信されます。'; + $lang->about_feed_description = '発行するRSSに関する説明を入力します。未入力した場合は該当モジュールで設定された管理用説明が含まれます。'; + $lang->about_feed_copyright = '発行するRSSのコンテンツに対する著作権情報です。'; + $lang->about_part_feed_copyright = '未入力の場合、全体RSS著作権の設定と同様に適用されます。'; + $lang->about_feed_document_count = 'RSSに配信するコンテンツの数 (デフォルト : 15)'; + + // エラーメッセージ + $lang->msg_rss_is_disabled = 'RSS機能がロックされています。'; + $lang->msg_rss_invalid_image_format = 'サポートしないイメージファイルです。\nJPEG, GIF, PNGファイルのみサポートします。'; +?> diff --git a/modules/rss/lang/ko.lang.php b/modules/rss/lang/ko.lang.php index 7b49f3bbb..64e33fef5 100644 --- a/modules/rss/lang/ko.lang.php +++ b/modules/rss/lang/ko.lang.php @@ -1,36 +1,36 @@ -feed = '피드(Feed) 발행'; - $lang->total_feed = '통합 피드'; - $lang->rss_disable = '피드(Feed) 끄기'; - $lang->feed_copyright = '저작권'; - $lang->feed_document_count = '한 페이지당 글 수'; - $lang->feed_image = '피드 이미지'; - $lang->rss_type = '출력할 피드(Feed) 형식'; - $lang->open_rss = '피드(Feed) 공개'; - $lang->open_rss_types = array( - 'Y' => '전문 공개 ', - 'H' => '요약 공개', - 'N' => '공개하지 않음', - ); - $lang->open_feed_to_total = '통합 피드에 포함'; - - // 설명문 - $lang->about_rss_disable = '체크하시면 피드(Feed) 출력을 하지 않습니다.'; - $lang->about_rss_type = '출력하실 피드(Feed) 형식을 지정하실 수 있습니다.'; - $lang->about_open_rss = '현재 모듈에 대한 피드(Feed) 공개를 선택하실 수 있습니다. 글 열람 권한과 상관없이 옵션에 따라 RSS가 공개됩니다.'; - $lang->about_feed_description = '발행될 피드에 대한 설명을 입력하실 수 있습니다. 설명을 입력하지 않으실 경우, 해당 모듈에 설정된 관리용 설명이 포함됩니다.'; - $lang->about_feed_copyright = '발행될 피드에 대한 저작권 정보를 입력하실 수 있습니다.'; - $lang->about_part_feed_copyright = '입력하지 않으면 전체 피드 저작권 설정과 동일하게 적용됩니다.'; - $lang->about_feed_document_count = '피드 한 페이지에 공개되는 글 수. (기본 값 : 15)'; - - // 에러 메시지들 - $lang->msg_rss_is_disabled = '피드(Feed) 기능이 잠겨 있습니다.'; - $lang->msg_rss_invalid_image_format = '이미지의 형식이 잘못되었습니다.\nJPEG, GIF, PNG 파일만 지원합니다.'; -?> +feed = '피드(Feed) 발행'; + $lang->total_feed = '통합 피드'; + $lang->rss_disable = '피드(Feed) 끄기'; + $lang->feed_copyright = '저작권'; + $lang->feed_document_count = '한 페이지당 글 수'; + $lang->feed_image = '피드 이미지'; + $lang->rss_type = '출력할 피드(Feed) 형식'; + $lang->open_rss = '피드(Feed) 공개'; + $lang->open_rss_types = array( + 'Y' => '전문 공개 ', + 'H' => '요약 공개', + 'N' => '공개하지 않음', + ); + $lang->open_feed_to_total = '통합 피드에 포함'; + + // 설명문 + $lang->about_rss_disable = '체크하시면 피드(Feed) 출력을 하지 않습니다.'; + $lang->about_rss_type = '출력하실 피드(Feed) 형식을 지정하실 수 있습니다.'; + $lang->about_open_rss = '현재 모듈에 대한 피드(Feed) 공개를 선택하실 수 있습니다. 글 열람 권한과 상관없이 옵션에 따라 RSS가 공개됩니다.'; + $lang->about_feed_description = '발행될 피드에 대한 설명을 입력하실 수 있습니다. 설명을 입력하지 않으실 경우, 해당 모듈에 설정된 관리용 설명이 포함됩니다.'; + $lang->about_feed_copyright = '발행될 피드에 대한 저작권 정보를 입력하실 수 있습니다.'; + $lang->about_part_feed_copyright = '입력하지 않으면 전체 피드 저작권 설정과 동일하게 적용됩니다.'; + $lang->about_feed_document_count = '피드 한 페이지에 공개되는 글 수. (기본 값 : 15)'; + + // 에러 메시지들 + $lang->msg_rss_is_disabled = '피드(Feed) 기능이 잠겨 있습니다.'; + $lang->msg_rss_invalid_image_format = '이미지의 형식이 잘못되었습니다.\nJPEG, GIF, PNG 파일만 지원합니다.'; +?> diff --git a/modules/rss/lang/ru.lang.php b/modules/rss/lang/ru.lang.php index 2b895c08a..edc58809f 100644 --- a/modules/rss/lang/ru.lang.php +++ b/modules/rss/lang/ru.lang.php @@ -1,36 +1,36 @@ -feed = 'Создать(Feed)'; - $lang->total_feed = 'Общий Feed'; - $lang->rss_disable = "Отключить RSS"; - $lang->feed_copyright = 'Копирайт'; - $lang->feed_document_count = 'Количество записей на страницу'; - $lang->feed_image = 'Картинка Feed'; - $lang->rss_type = "Тип RSS"; - $lang->open_rss = 'Показать RSS'; - $lang->open_rss_types = array( - 'Y' => 'Показать все', - 'H' => 'Показать выдержку', - 'N' => 'Не показывать', - ); - $lang->open_feed_to_total = 'Включено в общий Feed'; - - // для описаний - $lang->about_rss_disable = "Если выбрано, RSS будет отключен."; - $lang->about_rss_type = "Вы можете присвоить тип RSS."; - $lang->about_open_rss = 'Вы можете выбрать для того, чтобы RSS доступен публично.\nНезависимо от разрешений для статьи, RSS будет доступна публично согласно ее настройке.'; - $lang->about_feed_description = '발행될 피드에 대한 설명을 입력하실 수 있습니다. 설명을 입력하지 않으실 경우, 해당 모듈에 설정된 관리용 설명이 포함됩니다.'; - $lang->about_feed_copyright = '발행될 피드에 대한 저작권 정보를 입력하실 수 있습니다.'; - $lang->about_part_feed_copyright = '입력하지 않으면 전체 피드 저작권 설정과 동일하게 적용됩니다.'; - $lang->about_feed_document_count = '피드 한 페이지에 공개되는 글 수. (기본 값 : 15)'; - - // для ошибок - $lang->msg_rss_is_disabled = "Функция RSS выключена."; - $lang->msg_rss_invalid_image_format = 'Неправильный тип картинки\nПоддерживаются только JPEG, GIF, PNG файлы'; -?> +feed = 'Создать(Feed)'; + $lang->total_feed = 'Общий Feed'; + $lang->rss_disable = "Отключить RSS"; + $lang->feed_copyright = 'Копирайт'; + $lang->feed_document_count = 'Количество записей на страницу'; + $lang->feed_image = 'Картинка Feed'; + $lang->rss_type = "Тип RSS"; + $lang->open_rss = 'Показать RSS'; + $lang->open_rss_types = array( + 'Y' => 'Показать все', + 'H' => 'Показать выдержку', + 'N' => 'Не показывать', + ); + $lang->open_feed_to_total = 'Включено в общий Feed'; + + // для описаний + $lang->about_rss_disable = "Если выбрано, RSS будет отключен."; + $lang->about_rss_type = "Вы можете присвоить тип RSS."; + $lang->about_open_rss = 'Вы можете выбрать для того, чтобы RSS доступен публично.\nНезависимо от разрешений для статьи, RSS будет доступна публично согласно ее настройке.'; + $lang->about_feed_description = '발행될 피드에 대한 설명을 입력하실 수 있습니다. 설명을 입력하지 않으실 경우, 해당 모듈에 설정된 관리용 설명이 포함됩니다.'; + $lang->about_feed_copyright = '발행될 피드에 대한 저작권 정보를 입력하실 수 있습니다.'; + $lang->about_part_feed_copyright = '입력하지 않으면 전체 피드 저작권 설정과 동일하게 적용됩니다.'; + $lang->about_feed_document_count = '피드 한 페이지에 공개되는 글 수. (기본 값 : 15)'; + + // для ошибок + $lang->msg_rss_is_disabled = "Функция RSS выключена."; + $lang->msg_rss_invalid_image_format = 'Неправильный тип картинки\nПоддерживаются только JPEG, GIF, PNG файлы'; +?> diff --git a/modules/rss/lang/tr.lang.php b/modules/rss/lang/tr.lang.php index d144b7183..7af83eefd 100644 --- a/modules/rss/lang/tr.lang.php +++ b/modules/rss/lang/tr.lang.php @@ -1,25 +1,25 @@ -rss_disable = "RSS devredışı"; - $lang->rss_type = "RSS besleme türü"; - $lang->open_rss = 'RSS Aç'; - $lang->open_rss_types = array( - 'Y' => 'Tümünü Aç', - 'H' => 'Özeti Aç', - 'N' => 'Açma', - ); - - // for description - $lang->about_rss_disable = "İşaretlendiğinde, RSS devredışı bırakılacak."; - $lang->about_rss_type = "RSS besleme türünü atayabilirsiniz."; - $lang->about_open_rss = 'Geçerli modülü herkese açmak için, modüldeki RSS\'yi seçebilirsiniz.\nMakale gösterimi iznine bakılmaksızın , RSS bu seçenekle tüm herkese açık hale gelecektir.'; - - // for error message - $lang->msg_rss_is_disabled = "RSS özelliği devredışı."; -?> +rss_disable = "RSS devredışı"; + $lang->rss_type = "RSS besleme türü"; + $lang->open_rss = 'RSS Aç'; + $lang->open_rss_types = array( + 'Y' => 'Tümünü Aç', + 'H' => 'Özeti Aç', + 'N' => 'Açma', + ); + + // for description + $lang->about_rss_disable = "İşaretlendiğinde, RSS devredışı bırakılacak."; + $lang->about_rss_type = "RSS besleme türünü atayabilirsiniz."; + $lang->about_open_rss = 'Geçerli modülü herkese açmak için, modüldeki RSS\'yi seçebilirsiniz.\nMakale gösterimi iznine bakılmaksızın , RSS bu seçenekle tüm herkese açık hale gelecektir.'; + + // for error message + $lang->msg_rss_is_disabled = "RSS özelliği devredışı."; +?> diff --git a/modules/rss/lang/vi.lang.php b/modules/rss/lang/vi.lang.php index a465b0966..342aff917 100644 --- a/modules/rss/lang/vi.lang.php +++ b/modules/rss/lang/vi.lang.php @@ -1,27 +1,27 @@ -rss_disable = "Tắt RSS"; - $lang->rss_type = "Định dạng RSS"; - $lang->open_rss = 'Mở RSS'; - $lang->open_rss_types = array( - 'Y' => 'Mở tất cả', - 'H' => 'Mở tóm tắt', - 'N' => 'Tắt', - ); - - // for description - $lang->about_rss_disable = "Nếu chọn, RSS sẽ bị tắt."; - $lang->about_rss_type = "Bạn có thể đặt định dạng cho RSS."; - $lang->about_open_rss = 'Bạn có thể mở công khai RSS trên Module hiện tại.\nKhông ảnh hưởng tới quyền truy cập bài viết, RSS sẽ mở công khai với tùy chọn của nó.'; - - // for error message - $lang->msg_rss_is_disabled = "Chức năng RSS đã bị tắt."; -?> +rss_disable = "Tắt RSS"; + $lang->rss_type = "Định dạng RSS"; + $lang->open_rss = 'Mở RSS'; + $lang->open_rss_types = array( + 'Y' => 'Mở tất cả', + 'H' => 'Mở tóm tắt', + 'N' => 'Tắt', + ); + + // for description + $lang->about_rss_disable = "Nếu chọn, RSS sẽ bị tắt."; + $lang->about_rss_type = "Bạn có thể đặt định dạng cho RSS."; + $lang->about_open_rss = 'Bạn có thể mở công khai RSS trên Module hiện tại.\nKhông ảnh hưởng tới quyền truy cập bài viết, RSS sẽ mở công khai với tùy chọn của nó.'; + + // for error message + $lang->msg_rss_is_disabled = "Chức năng RSS đã bị tắt."; +?> diff --git a/modules/rss/lang/zh-CN.lang.php b/modules/rss/lang/zh-CN.lang.php index ef6e18d93..a4c4baee5 100644 --- a/modules/rss/lang/zh-CN.lang.php +++ b/modules/rss/lang/zh-CN.lang.php @@ -1,36 +1,36 @@ -feed = 'RSS发布'; - $lang->total_feed = '整站RSS'; - $lang->rss_disable = "关闭RSS"; - $lang->feed_copyright = '版权'; - $lang->feed_document_count = '每页主题数'; - $lang->feed_image = 'RSS图片'; - $lang->rss_type = "RSS Feed显示样式"; - $lang->open_rss = 'RSS公开'; - $lang->open_rss_types = array( - 'Y' => '公开全文', - 'H' => '公开摘要', - 'N' => '不公开', - ); - $lang->open_feed_to_total = '包含到整站RSS'; - - // 说明 - $lang->about_rss_disable = "选此项不显示RSS。"; - $lang->about_rss_type = "可以指定要显示的RSS形式。"; - $lang->about_open_rss = '可以指定RSS公开程度,RSS公开不受查看内容权限的限制。'; - $lang->about_feed_description = '可以输入简单说明,留空输出该模块的说明。'; - $lang->about_feed_copyright = 'RSS Feed版权信息。'; - $lang->about_part_feed_copyright = '留空版权信息参照整站RSS的版权信息。'; - $lang->about_feed_document_count = '每页要显示的主题数(默认: 15)。'; - - // 错误提示 - $lang->msg_rss_is_disabled = "RSS功能处于锁定状态。"; - $lang->msg_rss_invalid_image_format = '上传的文件格式错误!\n只允许上传JPEG, GIF, PNG图片文件。'; -?> +feed = 'RSS发布'; + $lang->total_feed = '整站RSS'; + $lang->rss_disable = "关闭RSS"; + $lang->feed_copyright = '版权'; + $lang->feed_document_count = '每页主题数'; + $lang->feed_image = 'RSS图片'; + $lang->rss_type = "RSS Feed显示样式"; + $lang->open_rss = 'RSS公开'; + $lang->open_rss_types = array( + 'Y' => '公开全文', + 'H' => '公开摘要', + 'N' => '不公开', + ); + $lang->open_feed_to_total = '包含到整站RSS'; + + // 说明 + $lang->about_rss_disable = "选此项不显示RSS。"; + $lang->about_rss_type = "可以指定要显示的RSS形式。"; + $lang->about_open_rss = '可以指定RSS公开程度,RSS公开不受查看内容权限的限制。'; + $lang->about_feed_description = '可以输入简单说明,留空输出该模块的说明。'; + $lang->about_feed_copyright = 'RSS Feed版权信息。'; + $lang->about_part_feed_copyright = '留空版权信息参照整站RSS的版权信息。'; + $lang->about_feed_document_count = '每页要显示的主题数(默认: 15)。'; + + // 错误提示 + $lang->msg_rss_is_disabled = "RSS功能处于锁定状态。"; + $lang->msg_rss_invalid_image_format = '上传的文件格式错误!\n只允许上传JPEG, GIF, PNG图片文件。'; +?> diff --git a/modules/rss/lang/zh-TW.lang.php b/modules/rss/lang/zh-TW.lang.php index 9d0ca1a6b..b1fd6c65d 100644 --- a/modules/rss/lang/zh-TW.lang.php +++ b/modules/rss/lang/zh-TW.lang.php @@ -1,36 +1,36 @@ -feed = 'RSS Feed'; - $lang->total_feed = 'RSS'; - $lang->rss_disable = "關閉 RSS Feed"; - $lang->feed_copyright = '版權'; - $lang->feed_document_count = '每頁主題數'; - $lang->feed_image = 'RSS 圖片'; - $lang->rss_type = "RSS Feed 類型"; - $lang->open_rss = '公開程度'; - $lang->open_rss_types = array( - 'Y' => '全部公開', - 'H' => '公開摘要', - 'N' => '不公開', - ); - $lang->open_feed_to_total = '是否使用'; - - // 說明 - $lang->about_rss_disable = "隱藏 RSS Feed。"; - $lang->about_rss_type = "指定要顯示的 RSS Feed 類型。"; - $lang->about_open_rss = '選擇該模組 RSS Feed 的公開程度。公開 RSS Feed 將不受檢視內容權限的限制,隨公開 RSS Feed 的選項公開 RSS Feed。'; - $lang->about_feed_description = '請輸入簡介。 也可輸入相關管理使用說明。'; - $lang->about_feed_copyright = '請輸入 Feed 著作權資料。'; - $lang->about_part_feed_copyright = '著作權將會適用所有的 Feed 內容。'; - $lang->about_feed_document_count = '每頁要顯示的主題數。(預設: 15)'; - - // 錯誤提示 - $lang->msg_rss_is_disabled = "RSS Feed 功能未開啟。"; - $lang->msg_rss_invalid_image_format = '錯誤的檔案格式,無法上傳。\n只允許上傳 JPEG, GIF, PNG 等檔案格式。'; -?> +feed = 'RSS Feed'; + $lang->total_feed = 'RSS'; + $lang->rss_disable = "關閉 RSS Feed"; + $lang->feed_copyright = '版權'; + $lang->feed_document_count = '每頁主題數'; + $lang->feed_image = 'RSS 圖片'; + $lang->rss_type = "RSS Feed 類型"; + $lang->open_rss = '公開程度'; + $lang->open_rss_types = array( + 'Y' => '全部公開', + 'H' => '公開摘要', + 'N' => '不公開', + ); + $lang->open_feed_to_total = '是否使用'; + + // 說明 + $lang->about_rss_disable = "隱藏 RSS Feed。"; + $lang->about_rss_type = "指定要顯示的 RSS Feed 類型。"; + $lang->about_open_rss = '選擇該模組 RSS Feed 的公開程度。公開 RSS Feed 將不受檢視內容權限的限制,隨公開 RSS Feed 的選項公開 RSS Feed。'; + $lang->about_feed_description = '請輸入簡介。 也可輸入相關管理使用說明。'; + $lang->about_feed_copyright = '請輸入 Feed 著作權資料。'; + $lang->about_part_feed_copyright = '著作權將會適用所有的 Feed 內容。'; + $lang->about_feed_document_count = '每頁要顯示的主題數。(預設: 15)'; + + // 錯誤提示 + $lang->msg_rss_is_disabled = "RSS Feed 功能未開啟。"; + $lang->msg_rss_invalid_image_format = '錯誤的檔案格式,無法上傳。\n只允許上傳 JPEG, GIF, PNG 等檔案格式。'; +?> diff --git a/modules/rss/rss.admin.controller.php b/modules/rss/rss.admin.controller.php index e17caaa74..8e3275049 100644 --- a/modules/rss/rss.admin.controller.php +++ b/modules/rss/rss.admin.controller.php @@ -1,164 +1,164 @@ -getModuleConfig('rss'); - - $config_vars = Context::getRequestVars(); - - $config_vars->feed_document_count = (int)$config_vars->feed_document_count; - - if(!$config_vars->use_total_feed) $alt_message = 'msg_invalid_request'; - if(!in_array($config_vars->use_total_feed, array('Y','N'))) $config_vars->open_rss = 'Y'; - - if($config_vars->image || $config_vars->del_image) { - $image_obj = $config_vars->image; - $config_vars->image = $total_config->image; - - // 삭제 요청에 대한 변수를 구함 - if($config_vars->del_image == 'Y' || $image_obj) { - FileHandler::removeFile($config_vars->image); - $config_vars->image = ''; - $total_config->image = ''; - } - - // 정상적으로 업로드된 파일이 아니면 무시 - if($image_obj['tmp_name'] && is_uploaded_file($image_obj['tmp_name'])) { - // 이미지 파일이 아니어도 무시 (swf는 패스~) - $image_obj['name'] = Context::convertEncodingStr($image_obj['name']); - - if(!preg_match("/\.(jpg|jpeg|gif|png)$/i", $image_obj['name'])) $alt_message = 'msg_rss_invalid_image_format'; - else { - // 경로를 정해서 업로드 - $path = './files/attach/images/rss/'; - // 디렉토리 생성 - if(!FileHandler::makeDir($path)) $alt_message = 'msg_error_occured'; - else{ - $filename = $path.$image_obj['name']; - // 파일 이동 - if(!move_uploaded_file($image_obj['tmp_name'], $filename)) $alt_message = 'msg_error_occured'; - else { - $config_vars->image = $filename; - } - } - } - } - } - if(!$config_vars->image && $config_vars->del_image != 'Y') $config_vars->image = $total_config->image; - - $output = $this->setFeedConfig($config_vars); - - if(!$alt_message) $alt_message = 'success_updated'; - - $alt_message = Context::getLang($alt_message); - Context::set('msg', $alt_message); - - $this->setLayoutPath('./common/tpl'); - $this->setLayoutFile('default_layout.html'); - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile("top_refresh.html"); - } - - - /** - * @brief RSS 모듈별 설정 - **/ - function procRssAdminInsertModuleConfig() { - // 대상을 구함 - $module_srl = Context::get('target_module_srl'); - - // 여러개의 모듈 일괄 설정일 경우 - if(preg_match('/^([0-9,]+)$/',$module_srl)) $module_srl = explode(',',$module_srl); - else $module_srl = array($module_srl); - if(!is_array($module_srl)) $module_srl[0] = $module_srl; - - $config_vars = Context::getRequestVars(); - - $open_rss = $config_vars->open_rss; - $open_total_feed = $config_vars->open_total_feed; - $feed_description = trim($config_vars->feed_description); - $feed_copyright = trim($config_vars->feed_copyright); - - if(!$module_srl || !$open_rss) return new Object(-1, 'msg_invalid_request'); - - if(!in_array($open_rss, array('Y','H','N'))) $open_rss = 'N'; - - // 설정 저장 - for($i=0;$isetRssModuleConfig($srl, $open_rss, $open_total_feed, $feed_description, $feed_copyright); - } - - $this->setError(-1); - $this->setMessage('success_updated'); - } - - - /** - * @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 설정용 함수 - **/ - function setFeedConfig($config) { - $oModuleController = &getController('module'); - $oModuleController->insertModuleConfig('rss',$config); - return new Object(); - } - - - /** - * @brief RSS 모듈별 설정 함수 - **/ - function setRssModuleConfig($module_srl, $open_rss, $open_total_feed = 'N', $feed_description = 'N', $feed_copyright = 'N') { - $oModuleController = &getController('module'); - $config->open_rss = $open_rss; - $config->open_total_feed = $open_total_feed; - if($feed_description != 'N') { $config->feed_description = $feed_description; } - if($feed_copyright != 'N') { $config->feed_copyright = $feed_copyright; } - $oModuleController->insertModulePartConfig('rss',$module_srl,$config); - return new Object(); - } - } -?> +getModuleConfig('rss'); + + $config_vars = Context::getRequestVars(); + + $config_vars->feed_document_count = (int)$config_vars->feed_document_count; + + if(!$config_vars->use_total_feed) $alt_message = 'msg_invalid_request'; + if(!in_array($config_vars->use_total_feed, array('Y','N'))) $config_vars->open_rss = 'Y'; + + if($config_vars->image || $config_vars->del_image) { + $image_obj = $config_vars->image; + $config_vars->image = $total_config->image; + + // 삭제 요청에 대한 변수를 구함 + if($config_vars->del_image == 'Y' || $image_obj) { + FileHandler::removeFile($config_vars->image); + $config_vars->image = ''; + $total_config->image = ''; + } + + // 정상적으로 업로드된 파일이 아니면 무시 + if($image_obj['tmp_name'] && is_uploaded_file($image_obj['tmp_name'])) { + // 이미지 파일이 아니어도 무시 (swf는 패스~) + $image_obj['name'] = Context::convertEncodingStr($image_obj['name']); + + if(!preg_match("/\.(jpg|jpeg|gif|png)$/i", $image_obj['name'])) $alt_message = 'msg_rss_invalid_image_format'; + else { + // 경로를 정해서 업로드 + $path = './files/attach/images/rss/'; + // 디렉토리 생성 + if(!FileHandler::makeDir($path)) $alt_message = 'msg_error_occured'; + else{ + $filename = $path.$image_obj['name']; + // 파일 이동 + if(!move_uploaded_file($image_obj['tmp_name'], $filename)) $alt_message = 'msg_error_occured'; + else { + $config_vars->image = $filename; + } + } + } + } + } + if(!$config_vars->image && $config_vars->del_image != 'Y') $config_vars->image = $total_config->image; + + $output = $this->setFeedConfig($config_vars); + + if(!$alt_message) $alt_message = 'success_updated'; + + $alt_message = Context::getLang($alt_message); + Context::set('msg', $alt_message); + + $this->setLayoutPath('./common/tpl'); + $this->setLayoutFile('default_layout.html'); + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile("top_refresh.html"); + } + + + /** + * @brief RSS 모듈별 설정 + **/ + function procRssAdminInsertModuleConfig() { + // 대상을 구함 + $module_srl = Context::get('target_module_srl'); + + // 여러개의 모듈 일괄 설정일 경우 + if(preg_match('/^([0-9,]+)$/',$module_srl)) $module_srl = explode(',',$module_srl); + else $module_srl = array($module_srl); + if(!is_array($module_srl)) $module_srl[0] = $module_srl; + + $config_vars = Context::getRequestVars(); + + $open_rss = $config_vars->open_rss; + $open_total_feed = $config_vars->open_total_feed; + $feed_description = trim($config_vars->feed_description); + $feed_copyright = trim($config_vars->feed_copyright); + + if(!$module_srl || !$open_rss) return new Object(-1, 'msg_invalid_request'); + + if(!in_array($open_rss, array('Y','H','N'))) $open_rss = 'N'; + + // 설정 저장 + for($i=0;$isetRssModuleConfig($srl, $open_rss, $open_total_feed, $feed_description, $feed_copyright); + } + + $this->setError(-1); + $this->setMessage('success_updated'); + } + + + /** + * @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 설정용 함수 + **/ + function setFeedConfig($config) { + $oModuleController = &getController('module'); + $oModuleController->insertModuleConfig('rss',$config); + return new Object(); + } + + + /** + * @brief RSS 모듈별 설정 함수 + **/ + function setRssModuleConfig($module_srl, $open_rss, $open_total_feed = 'N', $feed_description = 'N', $feed_copyright = 'N') { + $oModuleController = &getController('module'); + $config->open_rss = $open_rss; + $config->open_total_feed = $open_total_feed; + if($feed_description != 'N') { $config->feed_description = $feed_description; } + if($feed_copyright != 'N') { $config->feed_copyright = $feed_copyright; } + $oModuleController->insertModulePartConfig('rss',$module_srl,$config); + return new Object(); + } + } +?> diff --git a/modules/rss/rss.admin.view.php b/modules/rss/rss.admin.view.php index fe73928eb..5afe95513 100644 --- a/modules/rss/rss.admin.view.php +++ b/modules/rss/rss.admin.view.php @@ -1,48 +1,48 @@ -setTemplatePath($this->module_path.'tpl'); - } - - - /** - * @brief 관리자 페이지 초기화면 - **/ - function dispRssAdminIndex() { - $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; - } - } - } - - Context::set('feed_config', $feed_config); - Context::set('total_config', $total_config); - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('rss_admin_index'); - } - } +setTemplatePath($this->module_path.'tpl'); + } + + + /** + * @brief 관리자 페이지 초기화면 + **/ + function dispRssAdminIndex() { + $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; + } + } + } + + Context::set('feed_config', $feed_config); + Context::set('total_config', $total_config); + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('rss_admin_index'); + } + } ?> \ No newline at end of file diff --git a/modules/rss/rss.class.php b/modules/rss/rss.class.php index cbbe2e6fb..0d3c0dff6 100644 --- a/modules/rss/rss.class.php +++ b/modules/rss/rss.class.php @@ -1,80 +1,80 @@ -insertActionForward('rss', 'view', 'rss'); - $oModuleController->insertActionForward('rss', 'view', 'atom'); - - // 2007. 10. 18 서비스형 모듈의 추가 설정에 참여하기 위한 trigger 추가 - $oModuleController->insertTrigger('module.dispAdditionSetup', 'rss', 'view', 'triggerDispRssAdditionSetup', 'before'); - - // 2007. 10. 19 출력하기 전에 rss url을 세팅하는 트리거 호출 - $oModuleController->insertTrigger('moduleHandler.proc', 'rss', 'controller', 'triggerRssUrlInsert', 'after'); - - return new Object(); - } - - /** - * @brief 설치가 이상이 없는지 체크하는 method - **/ - function checkUpdate() { - $oModuleModel = &getModel('module'); - - // atom 을 위한 Action forward 추가 - if(!$oModuleModel->getActionForward('atom')) return true; - - // 2007. 10. 18 서비스형 모듈의 추가 설정에 참여하기 위한 trigger 추가 - if(!$oModuleModel->getTrigger('module.dispAdditionSetup', 'rss', 'view', 'triggerDispRssAdditionSetup', 'before')) return true; - - // 2007. 10. 19 출력하기 전에 rss url을 세팅하는 트리거 호출 - if(!$oModuleModel->getTrigger('moduleHandler.proc', 'rss', 'controller', 'triggerRssUrlInsert', 'after')) return true; - - if($oModuleModel->getTrigger('display', 'rss', 'controller', 'triggerRssUrlInsert', 'before')) return true; - - return false; - } - - /** - * @brief 업데이트 실행 - **/ - function moduleUpdate() { - $oModuleModel = &getModel('module'); - $oModuleController = &getController('module'); - - // atom act 추가 - if(!$oModuleModel->getActionForward('atom')) - $oModuleController->insertActionForward('rss', 'view', 'atom'); - - // 2007. 10. 18 서비스형 모듈의 추가 설정에 참여하기 위한 trigger 추가 - if(!$oModuleModel->getTrigger('module.dispAdditionSetup', 'rss', 'view', 'triggerDispRssAdditionSetup', 'before')) - $oModuleController->insertTrigger('module.dispAdditionSetup', 'rss', 'view', 'triggerDispRssAdditionSetup', 'before'); - - // 2007. 10. 19 출력하기 전에 rss url을 세팅하는 트리거 호출 - if(!$oModuleModel->getTrigger('moduleHandler.proc', 'rss', 'controller', 'triggerRssUrlInsert', 'after')) - $oModuleController->insertTrigger('moduleHandler.proc', 'rss', 'controller', 'triggerRssUrlInsert', 'after'); - if($oModuleModel->getTrigger('display', 'rss', 'controller', 'triggerRssUrlInsert', 'before')) - $oModuleController->deleteTrigger('display', 'rss', 'controller', 'triggerRssUrlInsert', 'before'); - - return new Object(0, 'success_updated'); - } - - /** - * @brief 캐시 파일 재생성 - **/ - function recompileCache() { - } - - } -?> +insertActionForward('rss', 'view', 'rss'); + $oModuleController->insertActionForward('rss', 'view', 'atom'); + + // 2007. 10. 18 서비스형 모듈의 추가 설정에 참여하기 위한 trigger 추가 + $oModuleController->insertTrigger('module.dispAdditionSetup', 'rss', 'view', 'triggerDispRssAdditionSetup', 'before'); + + // 2007. 10. 19 출력하기 전에 rss url을 세팅하는 트리거 호출 + $oModuleController->insertTrigger('moduleHandler.proc', 'rss', 'controller', 'triggerRssUrlInsert', 'after'); + + return new Object(); + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + **/ + function checkUpdate() { + $oModuleModel = &getModel('module'); + + // atom 을 위한 Action forward 추가 + if(!$oModuleModel->getActionForward('atom')) return true; + + // 2007. 10. 18 서비스형 모듈의 추가 설정에 참여하기 위한 trigger 추가 + if(!$oModuleModel->getTrigger('module.dispAdditionSetup', 'rss', 'view', 'triggerDispRssAdditionSetup', 'before')) return true; + + // 2007. 10. 19 출력하기 전에 rss url을 세팅하는 트리거 호출 + if(!$oModuleModel->getTrigger('moduleHandler.proc', 'rss', 'controller', 'triggerRssUrlInsert', 'after')) return true; + + if($oModuleModel->getTrigger('display', 'rss', 'controller', 'triggerRssUrlInsert', 'before')) return true; + + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + $oModuleModel = &getModel('module'); + $oModuleController = &getController('module'); + + // atom act 추가 + if(!$oModuleModel->getActionForward('atom')) + $oModuleController->insertActionForward('rss', 'view', 'atom'); + + // 2007. 10. 18 서비스형 모듈의 추가 설정에 참여하기 위한 trigger 추가 + if(!$oModuleModel->getTrigger('module.dispAdditionSetup', 'rss', 'view', 'triggerDispRssAdditionSetup', 'before')) + $oModuleController->insertTrigger('module.dispAdditionSetup', 'rss', 'view', 'triggerDispRssAdditionSetup', 'before'); + + // 2007. 10. 19 출력하기 전에 rss url을 세팅하는 트리거 호출 + if(!$oModuleModel->getTrigger('moduleHandler.proc', 'rss', 'controller', 'triggerRssUrlInsert', 'after')) + $oModuleController->insertTrigger('moduleHandler.proc', 'rss', 'controller', 'triggerRssUrlInsert', 'after'); + if($oModuleModel->getTrigger('display', 'rss', 'controller', 'triggerRssUrlInsert', 'before')) + $oModuleController->deleteTrigger('display', 'rss', 'controller', 'triggerRssUrlInsert', 'before'); + + return new Object(0, 'success_updated'); + } + + /** + * @brief 캐시 파일 재생성 + **/ + function recompileCache() { + } + + } +?> diff --git a/modules/rss/rss.controller.php b/modules/rss/rss.controller.php index 2ef6aff91..c7cfd7fc6 100644 --- a/modules/rss/rss.controller.php +++ b/modules/rss/rss.controller.php @@ -1,58 +1,58 @@ -getModuleConfig('rss'); - $current_module_srl = Context::get('module_srl'); - $site_module_info = Context::get('site_module_info'); - - if(!$current_module_srl) { - $current_module_info = Context::get('current_module_info'); - $current_module_srl = $current_module_info->module_srl; - } - - if(!$current_module_srl) return new Object(); - - // 선택된 모듈의 rss설정을 가져옴 - $oRssModel = &getModel('rss'); - $rss_config = $oRssModel->getRssModuleConfig($current_module_srl); - - if($rss_config->open_rss != 'N') { - 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') { - if(Context::isAllowRewrite() && !Context::get('vid')) { - $request_uri = Context::getRequestUri(); - Context::set('general_rss_url', $request_uri.'rss'); - Context::set('general_atom_url', $request_uri.'atom'); - } else { - Context::set('general_rss_url', getUrl('','module','rss','act','rss')); - Context::set('general_atom_url', getUrl('','module','rss','act','atom')); - } - } - - return new Object(); - } - } -?> +getModuleConfig('rss'); + $current_module_srl = Context::get('module_srl'); + $site_module_info = Context::get('site_module_info'); + + if(!$current_module_srl) { + $current_module_info = Context::get('current_module_info'); + $current_module_srl = $current_module_info->module_srl; + } + + if(!$current_module_srl) return new Object(); + + // 선택된 모듈의 rss설정을 가져옴 + $oRssModel = &getModel('rss'); + $rss_config = $oRssModel->getRssModuleConfig($current_module_srl); + + if($rss_config->open_rss != 'N') { + 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') { + if(Context::isAllowRewrite() && !Context::get('vid')) { + $request_uri = Context::getRequestUri(); + Context::set('general_rss_url', $request_uri.'rss'); + Context::set('general_atom_url', $request_uri.'atom'); + } else { + Context::set('general_rss_url', getUrl('','module','rss','act','rss')); + Context::set('general_atom_url', getUrl('','module','rss','act','atom')); + } + } + + return new Object(); + } + } +?> diff --git a/modules/rss/rss.model.php b/modules/rss/rss.model.php index ee669f9f6..4d96e63fe 100644 --- a/modules/rss/rss.model.php +++ b/modules/rss/rss.model.php @@ -1,44 +1,44 @@ -getModulePartConfig('rss', $module_srl); - if(!$module_rss_config) $module_rss_config->open_rss = 'N'; - $module_rss_config->module_srl = $module_srl; - return $module_rss_config; - } - } -?> +getModulePartConfig('rss', $module_srl); + if(!$module_rss_config) $module_rss_config->open_rss = 'N'; + $module_rss_config->module_srl = $module_srl; + return $module_rss_config; + } + } +?> diff --git a/modules/rss/rss.view.php b/modules/rss/rss.view.php index 32894558e..4aca99c3c 100644 --- a/modules/rss/rss.view.php +++ b/modules/rss/rss.view.php @@ -1,234 +1,234 @@ -rss($document_list)를 통해서 결과값을 직접 지정 가능 - **/ - function rss($document_list = null, $rss_title = null, $add_description = null) { - $oDocumentModel = &getModel('document'); - $oModuleModel = &getModel('module'); - $oModuleController = &getController('module'); - - // 다른 모듈에서 method로 호출되는 것이 아니라면 현재 요청된 모듈을 대상으로 글과 정보를 구함 - if(!$document_list) { - $site_module_info = Context::get('site_module_info'); - $site_srl = $site_module_info->site_srl; - $mid = Context::get('mid'); ///< 대상 모듈 id, 없으면 전체로 - $start_date = (int)Context::get('start_date'); - $end_date = (int)Context::get('end_date'); - - $module_srls = array(); - $rss_config = array(); - $total_config = ''; - $total_config = $oModuleModel->getModuleConfig('rss'); - - // 하나의 mid가 지정되어 있으면 그 mid에 대한 것만 추출 - if($mid) { - $module_srl = $this->module_info->module_srl; - $config = $oModuleModel->getModulePartConfig('rss', $module_srl); - if($config->open_rss && $config->open_rss != 'N') { - $module_srls[] = $module_srl; - $open_rss_config[$module_srl] = $config->open_rss; - } - - // mid 가 선택되어 있지 않으면 전체 - } else { - if($total_config->use_total_feed != 'N') { - $rss_config = $oModuleModel->getModulePartConfigs('rss', $site_srl); - if($rss_config) { - foreach($rss_config as $module_srl => $config) { - if($config && $config->open_rss != 'N' && $config->open_total_feed != 'T_N') { - $module_srls[] = $module_srl; - $open_rss_config[$module_srl] = $config->open_rss; - } - } - } - } - } - - if(!count($module_srls) && !$add_description) return $this->dispError(); - - if($module_srls) { - $args->module_srl = implode(',',$module_srls); - $module_list = $oModuleModel->getMidList($args); - - $args->search_target = 'is_secret'; - $args->search_keyword = 'N'; - $args->page = (int)Context::get('page'); - $args->list_count = 15; - if($total_config->feed_document_count) $args->list_count = $total_config->feed_document_count; - if(!$args->page || $args->page < 1) $args->page = 1; - if($start_date || $start_date != 0) $args->start_date = $start_date; - if($end_date || $end_date != 0) $args->end_date = $end_date; - if($start_date == 0) unset($start_date); - if($end_date == 0) unset($end_date); - - $args->sort_index = 'list_order'; - $args->order_type = 'asc'; - $output = $oDocumentModel->getDocumentList($args); - $document_list = $output->data; - - // 피드 제목 및 정보등을 추출 Context::getBrowserTitle - if($mid) { - $info->title = Context::getBrowserTitle(); - $oModuleController->replaceDefinedLangCode($info->title); - - $info->title = str_replace('\'', ''',$info->title); - if($config->feed_description) { - $info->description = str_replace('\'', ''', htmlspecialchars($config->feed_description)); - } - else { - $info->description = str_replace('\'', ''', htmlspecialchars($this->module_info->description)); - } - $info->link = getUrl('','mid',$mid); - $info->feed_copyright = str_replace('\'', ''', htmlspecialchars($feed_config->feed_copyright)); - if(!$info->feed_copyright) { - $info->feed_copyright = str_replace('\'', ''', htmlspecialchars($total_config->feed_copyright)); - } - } - } - } - - if(!$info->title) { - if($rss_title) $info->title = $rss_title; - else if($total_config->feed_title) $info->title = $total_config->feed_title; - else { - $site_module_info = Context::get('site_module_info'); - $info->title = $site_module_info->browser_title; - } - - $oModuleController->replaceDefinedLangCode($info->title); - $info->title = str_replace('\'', ''', htmlspecialchars($info->title)); - $info->description = str_replace('\'', ''', htmlspecialchars($total_config->feed_description)); - $info->link = Context::getRequestUri(); - $info->feed_copyright = str_replace('\'', ''', htmlspecialchars($total_config->feed_copyright)); - } - if($add_description) $info->description .= "\r\n".$add_description; - - if($total_config->image) $info->image = Context::getRequestUri().str_replace('\'', ''', htmlspecialchars($total_config->image)); - switch (Context::get('format')) { - case 'atom': - $info->date = date('Y-m-d\TH:i:sP'); - if($mid) { $info->id = getUrl('','mid',$mid,'act','atom','page',Context::get('page'),'start_date',Context::get('start_date'),'end_date',Context::get('end_date')); } - else { $info->id = getUrl('','module','rss','act','atom','page',Context::get('page'),'start_date',Context::get('start_date'),'end_date',Context::get('end_date')); } - break; - case 'rss1.0': - $info->date = date('Y-m-d\TH:i:sP'); - break; - default: - $info->date = date("D, d M Y H:i:s").' '.$GLOBALS['_time_zone']; - break; - } - - if($_SERVER['HTTPS']=='on') $proctcl = 'https://'; - else $proctcl = 'http://'; - - $temp_link = explode('/', $info->link); - if($temp_link[0]=='' && $info->link) { - $info->link = $proctcl.$_SERVER['HTTP_HOST'].$info->link; - } - - $temp_id = explode('/', $info->id); - if($temp_id[0]=='' && $info->id) { - $info->id = $proctcl.$_SERVER['HTTP_HOST'].$info->id; - } - - $info->language = Context::getLangType(); - - // RSS 출력물에서 사용될 변수 세팅 - Context::set('info', $info); - Context::set('feed_config', $config); - Context::set('open_rss_config', $open_rss_config); - Context::set('document_list', $document_list); - - // 결과 출력을 XMLRPC로 강제 지정 - Context::setResponseMethod("XMLRPC"); - - // 결과물을 얻어와서 에디터 컴포넌트등의 전처리 기능을 수행시킴 - $path = $this->module_path.'tpl/'; - //if($args->start_date || $args->end_date) $file = 'xe_rss'; - //else $file = 'rss20'; - switch (Context::get('format')) { - case 'xe': - $file = 'xe_rss'; - break; - case 'atom': - $file = 'atom10'; - break; - case 'rss1.0': - $file = 'rss10'; - break; - default: - $file = 'rss20'; - break; - } - - $oTemplate = new TemplateHandler(); - - $content = $oTemplate->compile($path, $file); - Context::set('content', $content); - - // 템플릿 파일 지정 - $this->setTemplatePath($path); - $this->setTemplateFile('display'); - } - - /** @brief ATOM 출력 **/ - function atom() { - Context::set('format', 'atom'); - $this->rss(); - } - - /** - * @brief 에러 출력 - **/ - function dispError() { - // 출력 메세지 작성 - $this->rss(null, null, Context::getLang('msg_rss_is_disabled') ); - } - - /** - * @brief 서비스형 모듈의 추가 설정을 위한 부분 - * rss의 사용 형태에 대한 설정만 받음 - **/ - function triggerDispRssAdditionSetup(&$obj) { - $current_module_srl = Context::get('module_srl'); - $current_module_srls = Context::get('module_srls'); - - if(!$current_module_srl && !$current_module_srls) { - // 선택된 모듈의 정보를 가져옴 - $current_module_info = Context::get('current_module_info'); - $current_module_srl = $current_module_info->module_srl; - if(!$current_module_srl) return new Object(); - } - - // 선택된 모듈의 rss설정을 가져옴 - $oRssModel = &getModel('rss'); - $rss_config = $oRssModel->getRssModuleConfig($current_module_srl); - Context::set('rss_config', $rss_config); - - // 템플릿 파일 지정 - $oTemplate = &TemplateHandler::getInstance(); - $tpl = $oTemplate->compile($this->module_path.'tpl', 'rss_module_config'); - $obj .= $tpl; - - return new Object(); - } - } -?> +rss($document_list)를 통해서 결과값을 직접 지정 가능 + **/ + function rss($document_list = null, $rss_title = null, $add_description = null) { + $oDocumentModel = &getModel('document'); + $oModuleModel = &getModel('module'); + $oModuleController = &getController('module'); + + // 다른 모듈에서 method로 호출되는 것이 아니라면 현재 요청된 모듈을 대상으로 글과 정보를 구함 + if(!$document_list) { + $site_module_info = Context::get('site_module_info'); + $site_srl = $site_module_info->site_srl; + $mid = Context::get('mid'); ///< 대상 모듈 id, 없으면 전체로 + $start_date = (int)Context::get('start_date'); + $end_date = (int)Context::get('end_date'); + + $module_srls = array(); + $rss_config = array(); + $total_config = ''; + $total_config = $oModuleModel->getModuleConfig('rss'); + + // 하나의 mid가 지정되어 있으면 그 mid에 대한 것만 추출 + if($mid) { + $module_srl = $this->module_info->module_srl; + $config = $oModuleModel->getModulePartConfig('rss', $module_srl); + if($config->open_rss && $config->open_rss != 'N') { + $module_srls[] = $module_srl; + $open_rss_config[$module_srl] = $config->open_rss; + } + + // mid 가 선택되어 있지 않으면 전체 + } else { + if($total_config->use_total_feed != 'N') { + $rss_config = $oModuleModel->getModulePartConfigs('rss', $site_srl); + if($rss_config) { + foreach($rss_config as $module_srl => $config) { + if($config && $config->open_rss != 'N' && $config->open_total_feed != 'T_N') { + $module_srls[] = $module_srl; + $open_rss_config[$module_srl] = $config->open_rss; + } + } + } + } + } + + if(!count($module_srls) && !$add_description) return $this->dispError(); + + if($module_srls) { + $args->module_srl = implode(',',$module_srls); + $module_list = $oModuleModel->getMidList($args); + + $args->search_target = 'is_secret'; + $args->search_keyword = 'N'; + $args->page = (int)Context::get('page'); + $args->list_count = 15; + if($total_config->feed_document_count) $args->list_count = $total_config->feed_document_count; + if(!$args->page || $args->page < 1) $args->page = 1; + if($start_date || $start_date != 0) $args->start_date = $start_date; + if($end_date || $end_date != 0) $args->end_date = $end_date; + if($start_date == 0) unset($start_date); + if($end_date == 0) unset($end_date); + + $args->sort_index = 'list_order'; + $args->order_type = 'asc'; + $output = $oDocumentModel->getDocumentList($args); + $document_list = $output->data; + + // 피드 제목 및 정보등을 추출 Context::getBrowserTitle + if($mid) { + $info->title = Context::getBrowserTitle(); + $oModuleController->replaceDefinedLangCode($info->title); + + $info->title = str_replace('\'', ''',$info->title); + if($config->feed_description) { + $info->description = str_replace('\'', ''', htmlspecialchars($config->feed_description)); + } + else { + $info->description = str_replace('\'', ''', htmlspecialchars($this->module_info->description)); + } + $info->link = getUrl('','mid',$mid); + $info->feed_copyright = str_replace('\'', ''', htmlspecialchars($feed_config->feed_copyright)); + if(!$info->feed_copyright) { + $info->feed_copyright = str_replace('\'', ''', htmlspecialchars($total_config->feed_copyright)); + } + } + } + } + + if(!$info->title) { + if($rss_title) $info->title = $rss_title; + else if($total_config->feed_title) $info->title = $total_config->feed_title; + else { + $site_module_info = Context::get('site_module_info'); + $info->title = $site_module_info->browser_title; + } + + $oModuleController->replaceDefinedLangCode($info->title); + $info->title = str_replace('\'', ''', htmlspecialchars($info->title)); + $info->description = str_replace('\'', ''', htmlspecialchars($total_config->feed_description)); + $info->link = Context::getRequestUri(); + $info->feed_copyright = str_replace('\'', ''', htmlspecialchars($total_config->feed_copyright)); + } + if($add_description) $info->description .= "\r\n".$add_description; + + if($total_config->image) $info->image = Context::getRequestUri().str_replace('\'', ''', htmlspecialchars($total_config->image)); + switch (Context::get('format')) { + case 'atom': + $info->date = date('Y-m-d\TH:i:sP'); + if($mid) { $info->id = getUrl('','mid',$mid,'act','atom','page',Context::get('page'),'start_date',Context::get('start_date'),'end_date',Context::get('end_date')); } + else { $info->id = getUrl('','module','rss','act','atom','page',Context::get('page'),'start_date',Context::get('start_date'),'end_date',Context::get('end_date')); } + break; + case 'rss1.0': + $info->date = date('Y-m-d\TH:i:sP'); + break; + default: + $info->date = date("D, d M Y H:i:s").' '.$GLOBALS['_time_zone']; + break; + } + + if($_SERVER['HTTPS']=='on') $proctcl = 'https://'; + else $proctcl = 'http://'; + + $temp_link = explode('/', $info->link); + if($temp_link[0]=='' && $info->link) { + $info->link = $proctcl.$_SERVER['HTTP_HOST'].$info->link; + } + + $temp_id = explode('/', $info->id); + if($temp_id[0]=='' && $info->id) { + $info->id = $proctcl.$_SERVER['HTTP_HOST'].$info->id; + } + + $info->language = Context::getLangType(); + + // RSS 출력물에서 사용될 변수 세팅 + Context::set('info', $info); + Context::set('feed_config', $config); + Context::set('open_rss_config', $open_rss_config); + Context::set('document_list', $document_list); + + // 결과 출력을 XMLRPC로 강제 지정 + Context::setResponseMethod("XMLRPC"); + + // 결과물을 얻어와서 에디터 컴포넌트등의 전처리 기능을 수행시킴 + $path = $this->module_path.'tpl/'; + //if($args->start_date || $args->end_date) $file = 'xe_rss'; + //else $file = 'rss20'; + switch (Context::get('format')) { + case 'xe': + $file = 'xe_rss'; + break; + case 'atom': + $file = 'atom10'; + break; + case 'rss1.0': + $file = 'rss10'; + break; + default: + $file = 'rss20'; + break; + } + + $oTemplate = new TemplateHandler(); + + $content = $oTemplate->compile($path, $file); + Context::set('content', $content); + + // 템플릿 파일 지정 + $this->setTemplatePath($path); + $this->setTemplateFile('display'); + } + + /** @brief ATOM 출력 **/ + function atom() { + Context::set('format', 'atom'); + $this->rss(); + } + + /** + * @brief 에러 출력 + **/ + function dispError() { + // 출력 메세지 작성 + $this->rss(null, null, Context::getLang('msg_rss_is_disabled') ); + } + + /** + * @brief 서비스형 모듈의 추가 설정을 위한 부분 + * rss의 사용 형태에 대한 설정만 받음 + **/ + function triggerDispRssAdditionSetup(&$obj) { + $current_module_srl = Context::get('module_srl'); + $current_module_srls = Context::get('module_srls'); + + if(!$current_module_srl && !$current_module_srls) { + // 선택된 모듈의 정보를 가져옴 + $current_module_info = Context::get('current_module_info'); + $current_module_srl = $current_module_info->module_srl; + if(!$current_module_srl) return new Object(); + } + + // 선택된 모듈의 rss설정을 가져옴 + $oRssModel = &getModel('rss'); + $rss_config = $oRssModel->getRssModuleConfig($current_module_srl); + Context::set('rss_config', $rss_config); + + // 템플릿 파일 지정 + $oTemplate = &TemplateHandler::getInstance(); + $tpl = $oTemplate->compile($this->module_path.'tpl', 'rss_module_config'); + $obj .= $tpl; + + return new Object(); + } + } +?> diff --git a/modules/rss/tpl/atom10.html b/modules/rss/tpl/atom10.html index 2ebf22df5..86eac9580 100644 --- a/modules/rss/tpl/atom10.html +++ b/modules/rss/tpl/atom10.html @@ -1,37 +1,37 @@ -{''} - - - {$info->title} - - {str_replace('\'', ''', htmlspecialchars($info->description))} - - {$info->date} - {$info->id} - - - XpressEngine - - {str_replace('\'', ''',htmlspecialchars($oDocument->getTitleText()))} - {$oDocument->getPermanentUrl()} - {$oDocument->getRegdate('Y-m-d\TH:i:sP')} - {zdate($oDocument->get('last_update'),'Y-m-d\TH:i:sP')} - - - - {str_replace('\'', ''',$oDocument->getNickName())} - - {$oDocument->getHomepageUrl()} - - - - {str_replace('\'', ''', htmlspecialchars($oDocument->getTransContent(false,false,true)))} - - {str_replace('\'', ''', htmlspecialchars($oDocument->getContentText(100)))} - - - - - - - - +{''} + + + {$info->title} + + {str_replace('\'', ''', htmlspecialchars($info->description))} + + {$info->date} + {$info->id} + + + XpressEngine + + {str_replace('\'', ''',htmlspecialchars($oDocument->getTitleText()))} + {$oDocument->getPermanentUrl()} + {$oDocument->getRegdate('Y-m-d\TH:i:sP')} + {zdate($oDocument->get('last_update'),'Y-m-d\TH:i:sP')} + + + + {str_replace('\'', ''',$oDocument->getNickName())} + + {$oDocument->getHomepageUrl()} + + + + {str_replace('\'', ''', htmlspecialchars($oDocument->getTransContent(false,false,true)))} + + {str_replace('\'', ''', htmlspecialchars($oDocument->getContentText(100)))} + + + + + + + + diff --git a/modules/rss/tpl/js/rss.js b/modules/rss/tpl/js/rss.js index 10f2b3e50..cc8fc9646 100644 --- a/modules/rss/tpl/js/rss.js +++ b/modules/rss/tpl/js/rss.js @@ -1,17 +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"; - } + +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 1fb4922e6..faca1ef9f 100644 --- a/modules/rss/tpl/rss_admin_index.html +++ b/modules/rss/tpl/rss_admin_index.html @@ -1,83 +1,83 @@ - -

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

    - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {$lang->total_feed}
    - -
    {$lang->title}
    - -
    {$lang->description}
    - -
    {$lang->feed_image}
    - -
    - image
    - - -
    - - -
    {$lang->feed_copyright}
    - -

    {$lang->about_feed_copyright}

    -
    {$lang->feed_document_count}
    - -

    {$lang->about_feed_document_count}

    -
    -
    - -

    {$lang->feed} {$lang->cmd_management}

    - - - - - - - - - - - - - - -
    {$lang->mid} - {$lang->open_rss} - {$lang->open_feed_to_total} -
    {$config['mid']}{$lang->open_rss_types[$config['open_feed']]}class="buttonSet buttonDisable">{$lang->notuse}class="buttonSet buttonActive">{$lang->use}
    - + +

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

    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {$lang->total_feed}
    + +
    {$lang->title}
    + +
    {$lang->description}
    + +
    {$lang->feed_image}
    + +
    + image
    + + +
    + + +
    {$lang->feed_copyright}
    + +

    {$lang->about_feed_copyright}

    +
    {$lang->feed_document_count}
    + +

    {$lang->about_feed_document_count}

    +
    +
    + +

    {$lang->feed} {$lang->cmd_management}

    + + + + + + + + + + + + + + +
    {$lang->mid} + {$lang->open_rss} + {$lang->open_feed_to_total} +
    {$config['mid']}{$lang->open_rss_types[$config['open_feed']]}class="buttonSet buttonDisable">{$lang->notuse}class="buttonSet buttonActive">{$lang->use}
    + \ No newline at end of file diff --git a/modules/session/conf/info.xml b/modules/session/conf/info.xml index f06d7acbe..1aba77f3c 100644 --- a/modules/session/conf/info.xml +++ b/modules/session/conf/info.xml @@ -1,50 +1,50 @@ - - - 세션 관리자 - セッション管理 - Session - Session - 会话管理 - SESSION管理 - Oturum - - 접속자의 세션을 관리하는 모듈입니다. - 기본적인 세션 설정과 사용뿐 아니라 세션 정보를 이용하여 접속자등의 세션 기반의 정보를 제공하는 기능도 있습니다. - - - アクセスユーザのセッションを管理します。 - 基本的セッション設定はもちろん、セッション情報を利用してアクセスユーザなどのセッション基盤の情報を提供する機能も持っています。 - - - This module manages session data. - You will get not only session setting or using but also session-level data such as visitors by using session data. - - - Bu modül oturum verisini yönetir. - Siz sadece oturum ayarı veya kullanımı değil ayrıca oturum bilgilerini kullanan kullanıcıların oturum-seviyesi verilerini de elde edeceksiniz. - - Module này quản lý dữ liệu Session. - Bạn không phải chỉ duy nhất thiết lập Session hay sử dụng, Cấp độ của Session phụ thuộc vào lượng người truy cập trên Website của bạn. - - - 管理在线会员会话(session)功能的模块。 - 提供最基本的会话设置及使用,并且还可以获得基于会话功能的在线会员信息。 - - - 管理線上會員SESSION功能的模組。 - 提供最基本的SESSION設置和使用,且還可以獲得此功能的線上會員資料。 - - 0.1 - 2008-06-18 - system - - - NHN - NHN - NHN - NHN - NHN - NHN - NHN - - + + + 세션 관리자 + セッション管理 + Session + Session + 会话管理 + SESSION管理 + Oturum + + 접속자의 세션을 관리하는 모듈입니다. + 기본적인 세션 설정과 사용뿐 아니라 세션 정보를 이용하여 접속자등의 세션 기반의 정보를 제공하는 기능도 있습니다. + + + アクセスユーザのセッションを管理します。 + 基本的セッション設定はもちろん、セッション情報を利用してアクセスユーザなどのセッション基盤の情報を提供する機能も持っています。 + + + This module manages session data. + You will get not only session setting or using but also session-level data such as visitors by using session data. + + + Bu modül oturum verisini yönetir. + Siz sadece oturum ayarı veya kullanımı değil ayrıca oturum bilgilerini kullanan kullanıcıların oturum-seviyesi verilerini de elde edeceksiniz. + + Module này quản lý dữ liệu Session. + Bạn không phải chỉ duy nhất thiết lập Session hay sử dụng, Cấp độ của Session phụ thuộc vào lượng người truy cập trên Website của bạn. + + + 管理在线会员会话(session)功能的模块。 + 提供最基本的会话设置及使用,并且还可以获得基于会话功能的在线会员信息。 + + + 管理線上會員SESSION功能的模組。 + 提供最基本的SESSION設置和使用,且還可以獲得此功能的線上會員資料。 + + 0.1 + 2008-06-18 + system + + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + diff --git a/modules/session/lang/en.lang.php b/modules/session/lang/en.lang.php index bbc9228a5..e4b801906 100644 --- a/modules/session/lang/en.lang.php +++ b/modules/session/lang/en.lang.php @@ -1,13 +1,13 @@ -session = 'Session'; - $lang->about_session = "This module manages sessions\nFrequent session arrangement will provide better environment for your site."; - - $lang->cmd_clear_session = 'Arrange Session'; - $lang->session_cleared = 'Session data have been arranged succesfully'; -?> +session = 'Session'; + $lang->about_session = "This module manages sessions\nFrequent session arrangement will provide better environment for your site."; + + $lang->cmd_clear_session = 'Arrange Session'; + $lang->session_cleared = 'Session data have been arranged succesfully'; +?> diff --git a/modules/session/lang/fr.lang.php b/modules/session/lang/fr.lang.php index d0d3ad35e..84a3043d4 100644 --- a/modules/session/lang/fr.lang.php +++ b/modules/session/lang/fr.lang.php @@ -1,13 +1,13 @@ - - * @brief Paquet du langage en français pour le module de la Session - **/ - - $lang->session = 'Session'; - $lang->about_session = "Ce module administre les sessions\nL'arrangement fréquent des sessions pourvoira de meilleur environnement pour votre site Web."; - - $lang->cmd_clear_session = 'Arranger la Session'; - $lang->session_cleared = 'Les données de Session sont arrangées avec succès'; -?> + + * @brief Paquet du langage en français pour le module de la Session + **/ + + $lang->session = 'Session'; + $lang->about_session = "Ce module administre les sessions\nL'arrangement fréquent des sessions pourvoira de meilleur environnement pour votre site Web."; + + $lang->cmd_clear_session = 'Arranger la Session'; + $lang->session_cleared = 'Les données de Session sont arrangées avec succès'; +?> diff --git a/modules/session/lang/jp.lang.php b/modules/session/lang/jp.lang.php index 4bf76e90d..a0e60f1bf 100644 --- a/modules/session/lang/jp.lang.php +++ b/modules/session/lang/jp.lang.php @@ -1,13 +1,13 @@ -session = 'セッション'; - $lang->about_session = "セッションを管理するモジュールです。\n定期的なセッションの整理はサイトパフォーマンスに効果的です。"; - - $lang->cmd_clear_session = 'セッション整理'; - $lang->session_cleared = 'ごみセッションが整理されました。'; -?> +session = 'セッション'; + $lang->about_session = "セッションを管理するモジュールです。\n定期的なセッションの整理はサイトパフォーマンスに効果的です。"; + + $lang->cmd_clear_session = 'セッション整理'; + $lang->session_cleared = 'ごみセッションが整理されました。'; +?> diff --git a/modules/session/lang/ko.lang.php b/modules/session/lang/ko.lang.php index 379efb2c8..e9353b3e9 100644 --- a/modules/session/lang/ko.lang.php +++ b/modules/session/lang/ko.lang.php @@ -1,13 +1,13 @@ -session = '세션'; - $lang->about_session = "세션 관리를 하는 모듈입니다.\n틈틈이 세션 정리를 하시면 사이트 운영에 보다 좋은 효과를 낼 수 있습니다."; - - $lang->cmd_clear_session = '세션 정리'; - $lang->session_cleared = '쓸모 없는 세션 정보가 정리되었습니다.'; -?> +session = '세션'; + $lang->about_session = "세션 관리를 하는 모듈입니다.\n틈틈이 세션 정리를 하시면 사이트 운영에 보다 좋은 효과를 낼 수 있습니다."; + + $lang->cmd_clear_session = '세션 정리'; + $lang->session_cleared = '쓸모 없는 세션 정보가 정리되었습니다.'; +?> diff --git a/modules/session/lang/tr.lang.php b/modules/session/lang/tr.lang.php index 411efd4b2..9cae1e715 100644 --- a/modules/session/lang/tr.lang.php +++ b/modules/session/lang/tr.lang.php @@ -1,13 +1,13 @@ -session = 'Oturum'; - $lang->about_session = "Bu modül oturumları yönetir\nAlışılmış oturum düzenlemesi, sitenize daha iyi bir ortam sağlayacaktır."; - - $lang->cmd_clear_session = 'Oturum Düzenle'; - $lang->session_cleared = 'Oturum verisi başarıyla düzenlendi'; -?> +session = 'Oturum'; + $lang->about_session = "Bu modül oturumları yönetir\nAlışılmış oturum düzenlemesi, sitenize daha iyi bir ortam sağlayacaktır."; + + $lang->cmd_clear_session = 'Oturum Düzenle'; + $lang->session_cleared = 'Oturum verisi başarıyla düzenlendi'; +?> diff --git a/modules/session/lang/vi.lang.php b/modules/session/lang/vi.lang.php index 26c068b95..b5e035fd2 100644 --- a/modules/session/lang/vi.lang.php +++ b/modules/session/lang/vi.lang.php @@ -1,15 +1,15 @@ -session = 'Session'; - $lang->about_session = "Module này quản lý những Session\nThường xuyên xắp xếp Session sẽ giúp Website của bạn hoạt động ổn định và nhanh hơn."; - - $lang->cmd_clear_session = 'Sắp xếp Session'; - $lang->session_cleared = 'Session Data đã được sắp xếp thành công!'; -?> +session = 'Session'; + $lang->about_session = "Module này quản lý những Session\nThường xuyên xắp xếp Session sẽ giúp Website của bạn hoạt động ổn định và nhanh hơn."; + + $lang->cmd_clear_session = 'Sắp xếp Session'; + $lang->session_cleared = 'Session Data đã được sắp xếp thành công!'; +?> diff --git a/modules/session/lang/zh-CN.lang.php b/modules/session/lang/zh-CN.lang.php index 6da3865e5..636cec3bc 100644 --- a/modules/session/lang/zh-CN.lang.php +++ b/modules/session/lang/zh-CN.lang.php @@ -1,13 +1,13 @@ -session = '会话'; - $lang->about_session = "管理会话的模块。\n有时间清理无用会话,可提高网站效率。"; - - $lang->cmd_clear_session = '清理会话'; - $lang->session_cleared = '无用会话已清理完毕。'; -?> +session = '会话'; + $lang->about_session = "管理会话的模块。\n有时间清理无用会话,可提高网站效率。"; + + $lang->cmd_clear_session = '清理会话'; + $lang->session_cleared = '无用会话已清理完毕。'; +?> diff --git a/modules/session/lang/zh-TW.lang.php b/modules/session/lang/zh-TW.lang.php index 94afec7a9..07be5a37c 100644 --- a/modules/session/lang/zh-TW.lang.php +++ b/modules/session/lang/zh-TW.lang.php @@ -1,13 +1,13 @@ -session = 'SESSION'; - $lang->about_session = "管理SESSION的模組。\n請定時清理SESSION,可提高網站效率。"; - - $lang->cmd_clear_session = '清理SESSION'; - $lang->session_cleared = 'SESSION已清理完畢。'; -?> +session = 'SESSION'; + $lang->about_session = "管理SESSION的模組。\n請定時清理SESSION,可提高網站效率。"; + + $lang->cmd_clear_session = '清理SESSION'; + $lang->session_cleared = 'SESSION已清理完畢。'; +?> diff --git a/modules/session/session.admin.controller.php b/modules/session/session.admin.controller.php index 5bebb9154..6e339a98b 100644 --- a/modules/session/session.admin.controller.php +++ b/modules/session/session.admin.controller.php @@ -1,26 +1,26 @@ -gc(0); - - $this->add('result',Context::getLang('session_cleared')); - } - } -?> +gc(0); + + $this->add('result',Context::getLang('session_cleared')); + } + } +?> diff --git a/modules/session/session.admin.view.php b/modules/session/session.admin.view.php index 46b44f4a7..be07935df 100644 --- a/modules/session/session.admin.view.php +++ b/modules/session/session.admin.view.php @@ -1,26 +1,26 @@ -setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('index'); - } - - } -?> +setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('index'); + } + + } +?> diff --git a/modules/session/session.class.php b/modules/session/session.class.php index 223891743..266c4cdbd 100644 --- a/modules/session/session.class.php +++ b/modules/session/session.class.php @@ -1,83 +1,83 @@ -session_started= true; - } - - /** - * @brief 설치시 추가 작업이 필요할시 구현 - **/ - function moduleInstall() { - $oDB = &DB::getInstance(); - $oDB->addIndex("session","idx_session_update_mid", array("member_srl","last_update","cur_mid")); - - return new Object(); - } - - /** - * @brief 설치가 이상이 없는지 체크하는 method - **/ - function checkUpdate() { - $oDB = &DB::getInstance(); - if(!$oDB->isTableExists('session')) return true; - if(!$oDB->isColumnExists("session","cur_mid")) return true; - if(!$oDB->isIndexExists("session","idx_session_update_mid")) return true; - return false; - } - - /** - * @brief 업데이트 실행 - **/ - function moduleUpdate() { - $oDB = &DB::getInstance(); - $oModuleModel = &getModel('module'); - - if(!$oDB->isTableExists('session')) $oDB->createTableByXmlFile($this->module_path.'schemas/session.xml'); - - if(!$oDB->isColumnExists("session","cur_mid")) $oDB->addColumn('session',"cur_mid","varchar",128); - - if(!$oDB->isIndexExists("session","idx_session_update_mid")) $oDB->addIndex("session","idx_session_update_mid", array("member_srl","last_update","cur_mid")); - } - - /** - * @brief session string decode - **/ - function unSerializeSession($val) { - $vars = preg_split('/([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff^|]*)\|/', $val,-1,PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); - for($i=0; $vars[$i]; $i++) $result[$vars[$i++]] = unserialize($vars[$i]); - return $result; - } - - /** - * @brief session string encode - **/ - function serializeSession($data) { - if(!count($data)) return; - - $str = ''; - foreach($data as $key => $val) $str .= $key.'|'.serialize($val); - return substr($str, 0, strlen($str)-1).'}'; - } - - /** - * @brief 캐시 파일 재생성 - **/ - function recompileCache() { - // 기존 파일 기반의 세션 삭제 - FileHandler::removeDir(_XE_PATH_."files/sessions"); - } - } -?> +session_started= true; + } + + /** + * @brief 설치시 추가 작업이 필요할시 구현 + **/ + function moduleInstall() { + $oDB = &DB::getInstance(); + $oDB->addIndex("session","idx_session_update_mid", array("member_srl","last_update","cur_mid")); + + return new Object(); + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + **/ + function checkUpdate() { + $oDB = &DB::getInstance(); + if(!$oDB->isTableExists('session')) return true; + if(!$oDB->isColumnExists("session","cur_mid")) return true; + if(!$oDB->isIndexExists("session","idx_session_update_mid")) return true; + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + $oDB = &DB::getInstance(); + $oModuleModel = &getModel('module'); + + if(!$oDB->isTableExists('session')) $oDB->createTableByXmlFile($this->module_path.'schemas/session.xml'); + + if(!$oDB->isColumnExists("session","cur_mid")) $oDB->addColumn('session',"cur_mid","varchar",128); + + if(!$oDB->isIndexExists("session","idx_session_update_mid")) $oDB->addIndex("session","idx_session_update_mid", array("member_srl","last_update","cur_mid")); + } + + /** + * @brief session string decode + **/ + function unSerializeSession($val) { + $vars = preg_split('/([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff^|]*)\|/', $val,-1,PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); + for($i=0; $vars[$i]; $i++) $result[$vars[$i++]] = unserialize($vars[$i]); + return $result; + } + + /** + * @brief session string encode + **/ + function serializeSession($data) { + if(!count($data)) return; + + $str = ''; + foreach($data as $key => $val) $str .= $key.'|'.serialize($val); + return substr($str, 0, strlen($str)-1).'}'; + } + + /** + * @brief 캐시 파일 재생성 + **/ + function recompileCache() { + // 기존 파일 기반의 세션 삭제 + FileHandler::removeDir(_XE_PATH_."files/sessions"); + } + } +?> diff --git a/modules/session/session.controller.php b/modules/session/session.controller.php index 37059d6b0..9b64e9cbc 100644 --- a/modules/session/session.controller.php +++ b/modules/session/session.controller.php @@ -1,70 +1,70 @@ -session_started) return; - - $args->session_key = $session_key; - $output = executeQuery('session.getSession', $args); - $session_info = $output->data; - if($session_info->session_key == $session_key && $session_info->ipaddress != $_SERVER['REMOTE_ADDR']) { - executeQuery('session.deleteSession', $args); - return true; - } - - $args->expired = date("YmdHis", time()+$this->lifetime); - $args->val = $val; - $args->cur_mid = Context::get('mid'); - if(!$args->cur_mid) { - $module_info = Context::get('current_module_info'); - $args->cur_mid = $module_info->mid; - } - - if(Context::get('is_logged')) { - $logged_info = Context::get('logged_info'); - $args->member_srl = $logged_info->member_srl; - } else { - $args->member_srl = 0; - } - - if($session_info->session_key) $output = executeQuery('session.updateSession', $args); - else $output = executeQuery('session.insertSession', $args); - - return true; - } - - function destroy($session_key) { - if(!$session_key || !$this->session_started) return; - - $args->session_key = $session_key; - executeQuery('session.deleteSession', $args); - return true; - } - - function gc($maxlifetime) { - if(!$this->session_started) return; - executeQuery('session.gcSession'); - return true; - } - } -?> +session_started) return; + + $args->session_key = $session_key; + $output = executeQuery('session.getSession', $args); + $session_info = $output->data; + if($session_info->session_key == $session_key && $session_info->ipaddress != $_SERVER['REMOTE_ADDR']) { + executeQuery('session.deleteSession', $args); + return true; + } + + $args->expired = date("YmdHis", time()+$this->lifetime); + $args->val = $val; + $args->cur_mid = Context::get('mid'); + if(!$args->cur_mid) { + $module_info = Context::get('current_module_info'); + $args->cur_mid = $module_info->mid; + } + + if(Context::get('is_logged')) { + $logged_info = Context::get('logged_info'); + $args->member_srl = $logged_info->member_srl; + } else { + $args->member_srl = 0; + } + + if($session_info->session_key) $output = executeQuery('session.updateSession', $args); + else $output = executeQuery('session.insertSession', $args); + + return true; + } + + function destroy($session_key) { + if(!$session_key || !$this->session_started) return; + + $args->session_key = $session_key; + executeQuery('session.deleteSession', $args); + return true; + } + + function gc($maxlifetime) { + if(!$this->session_started) return; + executeQuery('session.gcSession'); + return true; + } + } +?> diff --git a/modules/session/session.model.php b/modules/session/session.model.php index 00b220527..d8542130e 100644 --- a/modules/session/session.model.php +++ b/modules/session/session.model.php @@ -1,93 +1,93 @@ -lifetime; - } - - function read($session_key) { - if(!$session_key || !$this->session_started) return; - - $args->session_key = $session_key; - $output = executeQuery('session.getSession', $args); - - // 읽기 오류 발생시 테이블 생성 유무 확인 - if(!$output->toBool()) { - $oDB = &DB::getInstance(); - if(!$oDB->isTableExists('session')) $oDB->createTableByXmlFile($this->module_path.'schemas/session.xml'); - if(!$oDB->isColumnExists("session","cur_mid")) $oDB->addColumn('session',"cur_mid","varchar",128); - $output = executeQuery('session.getSession', $args); - } - - // 세션 정보에서 cur_mid값이 없을 경우 테이블 생성 체크 - if(!isset($output->data->cur_mid)) { - $oDB = &DB::getInstance(); - if(!$oDB->isColumnExists("session","cur_mid")) $oDB->addColumn('session',"cur_mid","varchar",128); - } - - return $output->data->val; - } - - /** - * @brief 현재 접속중인 사용자의 목록을 구함 - * 여러개의 인자값을 필요로 해서 object를 인자로 받음 - * limit_count : 대상 수 - * page : 페이지 번호 - * period_time : 인자의 값을 n으로 하여 최근 n분 이내에 세션을 갱신한 대상을 추출함 - * mid : 특정 mid에 속한 사용자 - **/ - function getLoggedMembers($args) { - if(!$args->site_srl) { - $site_module_info = Context::get('site_module_info'); - $args->site_srl = (int)$site_module_info->site_srl; - } - if(!$args->list_count) $args->list_count = 20; - if(!$args->page) $args->page = 1; - if(!$args->period_time) $args->period_time = 3; - $args->last_update = date("YmdHis", time() - $args->period_time*60); - - $output = executeQueryArray('session.getLoggedMembers', $args); - if(!$output->toBool()) return $output; - - $member_srls = array(); - if(count($output->data)) { - foreach($output->data as $key => $val) { - $member_srls[$key] = $val->member_srl; - $member_keys[$val->member_srl] = $key; - } - } - - if(Context::get('is_logged')) { - $logged_info = Context::get('logged_info'); - if(!in_array($logged_info->member_srl, $member_srls)) { - $member_srls[0] = $logged_info->member_srl; - $member_keys[$logged_info->member_srl] = 0; - } - } - - if(!count($member_srls)) return $output; - - $member_args->member_srl = implode(',',$member_srls); - $member_output = executeQueryArray('member.getMembers', $member_args); - if($member_output->data) { - foreach($member_output->data as $key => $val) { - $output->data[$member_keys[$val->member_srl]] = $val; - } - } - - return $output; - } - } -?> +lifetime; + } + + function read($session_key) { + if(!$session_key || !$this->session_started) return; + + $args->session_key = $session_key; + $output = executeQuery('session.getSession', $args); + + // 읽기 오류 발생시 테이블 생성 유무 확인 + if(!$output->toBool()) { + $oDB = &DB::getInstance(); + if(!$oDB->isTableExists('session')) $oDB->createTableByXmlFile($this->module_path.'schemas/session.xml'); + if(!$oDB->isColumnExists("session","cur_mid")) $oDB->addColumn('session',"cur_mid","varchar",128); + $output = executeQuery('session.getSession', $args); + } + + // 세션 정보에서 cur_mid값이 없을 경우 테이블 생성 체크 + if(!isset($output->data->cur_mid)) { + $oDB = &DB::getInstance(); + if(!$oDB->isColumnExists("session","cur_mid")) $oDB->addColumn('session',"cur_mid","varchar",128); + } + + return $output->data->val; + } + + /** + * @brief 현재 접속중인 사용자의 목록을 구함 + * 여러개의 인자값을 필요로 해서 object를 인자로 받음 + * limit_count : 대상 수 + * page : 페이지 번호 + * period_time : 인자의 값을 n으로 하여 최근 n분 이내에 세션을 갱신한 대상을 추출함 + * mid : 특정 mid에 속한 사용자 + **/ + function getLoggedMembers($args) { + if(!$args->site_srl) { + $site_module_info = Context::get('site_module_info'); + $args->site_srl = (int)$site_module_info->site_srl; + } + if(!$args->list_count) $args->list_count = 20; + if(!$args->page) $args->page = 1; + if(!$args->period_time) $args->period_time = 3; + $args->last_update = date("YmdHis", time() - $args->period_time*60); + + $output = executeQueryArray('session.getLoggedMembers', $args); + if(!$output->toBool()) return $output; + + $member_srls = array(); + if(count($output->data)) { + foreach($output->data as $key => $val) { + $member_srls[$key] = $val->member_srl; + $member_keys[$val->member_srl] = $key; + } + } + + if(Context::get('is_logged')) { + $logged_info = Context::get('logged_info'); + if(!in_array($logged_info->member_srl, $member_srls)) { + $member_srls[0] = $logged_info->member_srl; + $member_keys[$logged_info->member_srl] = 0; + } + } + + if(!count($member_srls)) return $output; + + $member_args->member_srl = implode(',',$member_srls); + $member_output = executeQueryArray('member.getMembers', $member_args); + if($member_output->data) { + foreach($member_output->data as $key => $val) { + $output->data[$member_keys[$val->member_srl]] = $val; + } + } + + return $output; + } + } +?> diff --git a/modules/spamfilter/conf/info.xml b/modules/spamfilter/conf/info.xml index 47f24c540..71e4b4908 100644 --- a/modules/spamfilter/conf/info.xml +++ b/modules/spamfilter/conf/info.xml @@ -1,36 +1,36 @@ - - - 스팸필터 - 垃圾过滤 - Spam Filter - Bộ lọc Spam - Filtro de Spam - スパムフィルター - Фильтр спама - Spam Filtreleyici - 垃圾過濾 - XE의 기본 스팸필터입니다. - XE的基本垃圾过滤模块。 - A default spam filter of XE. - Bộ lọc Spam mặc định của XE. - Filtro de Span predefinido de XE. - XEのスパムフィルターです。 - Стандартный фильтр спама XE. - XE的基本垃圾過濾模組。 - XE\'nin varsayılan spam filtreleyicisidir. - 0.1 - 2007-02-28 - accessory - - - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - - + + + 스팸필터 + 垃圾过滤 + Spam Filter + Bộ lọc Spam + Filtro de Spam + スパムフィルター + Фильтр спама + Spam Filtreleyici + 垃圾過濾 + XE의 기본 스팸필터입니다. + XE的基本垃圾过滤模块。 + A default spam filter of XE. + Bộ lọc Spam mặc định của XE. + Filtro de Span predefinido de XE. + XEのスパムフィルターです。 + Стандартный фильтр спама XE. + XE的基本垃圾過濾模組。 + XE\'nin varsayılan spam filtreleyicisidir. + 0.1 + 2007-02-28 + accessory + + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + diff --git a/modules/spamfilter/lang/en.lang.php b/modules/spamfilter/lang/en.lang.php index 9af2e4cab..6f53ca95c 100644 --- a/modules/spamfilter/lang/en.lang.php +++ b/modules/spamfilter/lang/en.lang.php @@ -1,34 +1,34 @@ -cmd_denied_ip = "IP Address Blacklist"; - $lang->cmd_denied_word = "Word Blacklist"; - - // general word - $lang->spamfilter = "Spam filter"; - $lang->denied_ip = "IP Address"; - $lang->interval = "Interval for spam filtering"; - $lang->limit_count = "No. of posting limitation"; - $lang->check_trackback = "Check Trackbacks"; - $lang->word = "Word"; - $lang->hit = 'Hit'; - $lang->latest_hit = 'Latest Hits'; - - // for description word - $lang->about_interval = "All articles attempted for posting within the assigned time will be blocked."; - $lang->about_limit_count = "If exceeded the posting limitation,\n that IP will be regarded as a spam, thus will have limitations on posting articles, comments, and trackbacks."; - $lang->about_denied_ip = "You can add IP address range like 127.0.0.* by using *."; - $lang->about_denied_word = "When you add a word to Word Blacklist,\n articles including it will be blocked."; - $lang->about_check_trackback = "A single IP per an article is allowed for trackbacks."; - - // to post a message - $lang->msg_alert_limited_by_config = 'Posting an article within %s second is not allowed.\n If you keep trying, your IP address will be blacklisted.'; - $lang->msg_alert_denied_word = 'The word "%s" is not allowed.'; - $lang->msg_alert_registered_denied_ip = 'Your IP address is blacklisted,\n so you may have limitations on normal using of this site.\n If you have any questions on that matter, please contact to the site administrator.'; - $lang->msg_alert_trackback_denied = 'Only one trackback per an article is allowed.'; +cmd_denied_ip = "IP Address Blacklist"; + $lang->cmd_denied_word = "Word Blacklist"; + + // general word + $lang->spamfilter = "Spam filter"; + $lang->denied_ip = "IP Address"; + $lang->interval = "Interval for spam filtering"; + $lang->limit_count = "No. of posting limitation"; + $lang->check_trackback = "Check Trackbacks"; + $lang->word = "Word"; + $lang->hit = 'Hit'; + $lang->latest_hit = 'Latest Hits'; + + // for description word + $lang->about_interval = "All articles attempted for posting within the assigned time will be blocked."; + $lang->about_limit_count = "If exceeded the posting limitation,\n that IP will be regarded as a spam, thus will have limitations on posting articles, comments, and trackbacks."; + $lang->about_denied_ip = "You can add IP address range like 127.0.0.* by using *."; + $lang->about_denied_word = "When you add a word to Word Blacklist,\n articles including it will be blocked."; + $lang->about_check_trackback = "A single IP per an article is allowed for trackbacks."; + + // to post a message + $lang->msg_alert_limited_by_config = 'Posting an article within %s second is not allowed.\n If you keep trying, your IP address will be blacklisted.'; + $lang->msg_alert_denied_word = 'The word "%s" is not allowed.'; + $lang->msg_alert_registered_denied_ip = 'Your IP address is blacklisted,\n so you may have limitations on normal using of this site.\n If you have any questions on that matter, please contact to the site administrator.'; + $lang->msg_alert_trackback_denied = 'Only one trackback per an article is allowed.'; ?> \ No newline at end of file diff --git a/modules/spamfilter/lang/es.lang.php b/modules/spamfilter/lang/es.lang.php index e32ac5c1d..a8762f805 100644 --- a/modules/spamfilter/lang/es.lang.php +++ b/modules/spamfilter/lang/es.lang.php @@ -1,34 +1,34 @@ -cmd_denied_ip = "Lista negra de las direcciones IP"; - $lang->cmd_denied_word = "Lista negra de palabras"; - - // palabras generales - $lang->spamfilter = "Filtro de Spam"; - $lang->denied_ip = "IP prohibido"; - $lang->interval = "Intervalo para el filtro de spam"; - $lang->limit_count = "Número limite"; - $lang->check_trackback = "Chequear trackback"; - $lang->word = "Palabra"; - $lang->hit = '히트'; - $lang->latest_hit = '최근 히트'; - - // para las palabras de descripcion - $lang->about_interval = "Se bloquea el posteo de todo tipo de documentos durante el tiempo asignado."; - $lang->about_limit_count = "Si Usted excede el número límite del posteo,\n Su documento serán reconocido como un spam, y su dirección IP sera agregada en la lista negra."; - $lang->about_denied_ip = "Usted puede asignar rangos de direcciones IP como 127.0.0.* usando *."; - $lang->about_denied_word = "Cuando Usted agrega una palabra a la lista negra de palabras,\n documentos con esa palabra no será registrado."; - $lang->about_check_trackback = "En un documento sólo se permite un trackback por IP."; - - // para registrar un documento - $lang->msg_alert_limited_by_config = 'Se prohibe poestear antes de %s segundos.\n Si Usted trata varias veces, su dirección IP puede ser agregada en la lista negra.'; - $lang->msg_alert_denied_word = 'La palabra "%s" no esta permitido para ser posteado.'; - $lang->msg_alert_registered_denied_ip = 'Su dirección IP fue agregaa en la lista negra,\n por lo cual Usted puede tener limitaciones en su uso normal de este sitio.\n Si Usted tiene alguna inquietud sobre el tema, por favor contactese con el administrador del sitio.'; - $lang->msg_alert_trackback_denied = 'Sólo un trackback por documento está permitido.'; +cmd_denied_ip = "Lista negra de las direcciones IP"; + $lang->cmd_denied_word = "Lista negra de palabras"; + + // palabras generales + $lang->spamfilter = "Filtro de Spam"; + $lang->denied_ip = "IP prohibido"; + $lang->interval = "Intervalo para el filtro de spam"; + $lang->limit_count = "Número limite"; + $lang->check_trackback = "Chequear trackback"; + $lang->word = "Palabra"; + $lang->hit = '히트'; + $lang->latest_hit = '최근 히트'; + + // para las palabras de descripcion + $lang->about_interval = "Se bloquea el posteo de todo tipo de documentos durante el tiempo asignado."; + $lang->about_limit_count = "Si Usted excede el número límite del posteo,\n Su documento serán reconocido como un spam, y su dirección IP sera agregada en la lista negra."; + $lang->about_denied_ip = "Usted puede asignar rangos de direcciones IP como 127.0.0.* usando *."; + $lang->about_denied_word = "Cuando Usted agrega una palabra a la lista negra de palabras,\n documentos con esa palabra no será registrado."; + $lang->about_check_trackback = "En un documento sólo se permite un trackback por IP."; + + // para registrar un documento + $lang->msg_alert_limited_by_config = 'Se prohibe poestear antes de %s segundos.\n Si Usted trata varias veces, su dirección IP puede ser agregada en la lista negra.'; + $lang->msg_alert_denied_word = 'La palabra "%s" no esta permitido para ser posteado.'; + $lang->msg_alert_registered_denied_ip = 'Su dirección IP fue agregaa en la lista negra,\n por lo cual Usted puede tener limitaciones en su uso normal de este sitio.\n Si Usted tiene alguna inquietud sobre el tema, por favor contactese con el administrador del sitio.'; + $lang->msg_alert_trackback_denied = 'Sólo un trackback por documento está permitido.'; ?> \ No newline at end of file diff --git a/modules/spamfilter/lang/fr.lang.php b/modules/spamfilter/lang/fr.lang.php index 17a06a69c..ace463b50 100644 --- a/modules/spamfilter/lang/fr.lang.php +++ b/modules/spamfilter/lang/fr.lang.php @@ -1,34 +1,34 @@ - - * @brief Paquet du langage en français pour le module du Filtre contre polluriel - **/ - - // de l'action - $lang->cmd_denied_ip = "Liste noire d'Address IP"; - $lang->cmd_denied_word = "Liste noire des Mots"; - - // mots générals - $lang->spamfilter = "Filtre contre Polluriel"; - $lang->denied_ip = "IP à bloquer"; - $lang->interval = "Intervalle à filtrer contre polluriel"; - $lang->limit_count = "Limite d'affichage"; - $lang->check_trackback = "Vérifier les Rétroliens"; - $lang->word = "Mot"; - $lang->hit = '히트'; - $lang->latest_hit = '최근 히트'; - - // descriptions - $lang->about_interval = "L'affichage sera bloqué pendant le temps designé."; - $lang->about_limit_count = "Si l'on excéde la limite d'affichage pendant le temps désigné,\nles articles en plus seront reconnus comme polluriel, et l'adresse IP sera bloqué."; - $lang->about_denied_ip = "Vous pouvez bloquer l'étendue de l'adresse IP comme 127.0.0.* en utilisant *."; - $lang->about_denied_word = "Quand vous enrégistrez un mot dans la liste noire, \nl'article qui comporte le mot ne sera pas affichagé."; - $lang->about_check_trackback = "Le rétrolien peut être permis à un seul IP par article."; - - // messages - $lang->msg_alert_limited_by_config = 'L\'Affichage d\'un article en %s secondes n\'est pas permis.\n Si vous essayez encore, votre adresse IP peut être enrégistré dans la liste noire.'; - $lang->msg_alert_denied_word = 'Le mot "%s" n\'est pas permis d\'afficher.'; - $lang->msg_alert_registered_denied_ip = 'Your IP address is blacklisted,\n so you may have limitations on normal using of this site.\n If you have any questions on that matter, please contact to the site administrator. Votre adresse IP est dans la liste noire, \nvous pouvez donc avoir limitation d\'activité dans ce site. Si vous avez quelque question sur ce fait, contactez l\'administrateur du site, S.V.P.'; - $lang->msg_alert_trackback_denied = 'Un seul rétrolien par article est permis.'; + + * @brief Paquet du langage en français pour le module du Filtre contre polluriel + **/ + + // de l'action + $lang->cmd_denied_ip = "Liste noire d'Address IP"; + $lang->cmd_denied_word = "Liste noire des Mots"; + + // mots générals + $lang->spamfilter = "Filtre contre Polluriel"; + $lang->denied_ip = "IP à bloquer"; + $lang->interval = "Intervalle à filtrer contre polluriel"; + $lang->limit_count = "Limite d'affichage"; + $lang->check_trackback = "Vérifier les Rétroliens"; + $lang->word = "Mot"; + $lang->hit = '히트'; + $lang->latest_hit = '최근 히트'; + + // descriptions + $lang->about_interval = "L'affichage sera bloqué pendant le temps designé."; + $lang->about_limit_count = "Si l'on excéde la limite d'affichage pendant le temps désigné,\nles articles en plus seront reconnus comme polluriel, et l'adresse IP sera bloqué."; + $lang->about_denied_ip = "Vous pouvez bloquer l'étendue de l'adresse IP comme 127.0.0.* en utilisant *."; + $lang->about_denied_word = "Quand vous enrégistrez un mot dans la liste noire, \nl'article qui comporte le mot ne sera pas affichagé."; + $lang->about_check_trackback = "Le rétrolien peut être permis à un seul IP par article."; + + // messages + $lang->msg_alert_limited_by_config = 'L\'Affichage d\'un article en %s secondes n\'est pas permis.\n Si vous essayez encore, votre adresse IP peut être enrégistré dans la liste noire.'; + $lang->msg_alert_denied_word = 'Le mot "%s" n\'est pas permis d\'afficher.'; + $lang->msg_alert_registered_denied_ip = 'Your IP address is blacklisted,\n so you may have limitations on normal using of this site.\n If you have any questions on that matter, please contact to the site administrator. Votre adresse IP est dans la liste noire, \nvous pouvez donc avoir limitation d\'activité dans ce site. Si vous avez quelque question sur ce fait, contactez l\'administrateur du site, S.V.P.'; + $lang->msg_alert_trackback_denied = 'Un seul rétrolien par article est permis.'; ?> \ No newline at end of file diff --git a/modules/spamfilter/lang/jp.lang.php b/modules/spamfilter/lang/jp.lang.php index 0f6e74b6d..be51e1100 100644 --- a/modules/spamfilter/lang/jp.lang.php +++ b/modules/spamfilter/lang/jp.lang.php @@ -1,34 +1,34 @@ -cmd_denied_ip = '禁止IPリスト'; - $lang->cmd_denied_word = '禁止ワードリスト'; - - // 一般用語 - $lang->spamfilter = 'スパムフィルター'; - $lang->denied_ip = '禁止IP'; - $lang->interval = 'スパム処理間隔'; - $lang->limit_count = '制限数'; - $lang->check_trackback = 'トラックバック検査'; - $lang->word = 'ワード'; - $lang->hit = 'ヒット'; - $lang->latest_hit = '最近ヒット'; - - // 説明文 - $lang->about_interval = '指定された時間内の書き込みが行えないようにします。'; - $lang->about_limit_count = '指定された時間内に制限数を超える書き込みが行われるとスパムとして認識し、該当するIPを禁止します。'; - $lang->about_denied_ip = '「127.0.0.* 」のように「*」で、「127.0.0」以下ののIP帯域をすべて禁止することが出来ます。'; - $lang->about_denied_word = '禁止ワードとして登録されると該当するワードが存在する書き込みを禁することが出来ます。'; - $lang->about_check_trackback = '一つのIPからのみトラックバックを受信するようにします。'; - - // メッセージ出力用 - $lang->msg_alert_limited_by_config = '%s秒以内の書き込みは禁止されます。続けて行うとスパムとして認識され、禁止IPに登録されます。'; - $lang->msg_alert_denied_word = '"%s"は使用が禁止されたワードです。'; - $lang->msg_alert_registered_denied_ip = '禁止IPに登録され、サイト内で正常な活動が制限されています。管理者にお問い合わせ下さい。'; - $lang->msg_alert_trackback_denied = '一つの書き込みには、1つのトラックバックしか受け取れません。'; +cmd_denied_ip = '禁止IPリスト'; + $lang->cmd_denied_word = '禁止ワードリスト'; + + // 一般用語 + $lang->spamfilter = 'スパムフィルター'; + $lang->denied_ip = '禁止IP'; + $lang->interval = 'スパム処理間隔'; + $lang->limit_count = '制限数'; + $lang->check_trackback = 'トラックバック検査'; + $lang->word = 'ワード'; + $lang->hit = 'ヒット'; + $lang->latest_hit = '最近ヒット'; + + // 説明文 + $lang->about_interval = '指定された時間内の書き込みが行えないようにします。'; + $lang->about_limit_count = '指定された時間内に制限数を超える書き込みが行われるとスパムとして認識し、該当するIPを禁止します。'; + $lang->about_denied_ip = '「127.0.0.* 」のように「*」で、「127.0.0」以下ののIP帯域をすべて禁止することが出来ます。'; + $lang->about_denied_word = '禁止ワードとして登録されると該当するワードが存在する書き込みを禁することが出来ます。'; + $lang->about_check_trackback = '一つのIPからのみトラックバックを受信するようにします。'; + + // メッセージ出力用 + $lang->msg_alert_limited_by_config = '%s秒以内の書き込みは禁止されます。続けて行うとスパムとして認識され、禁止IPに登録されます。'; + $lang->msg_alert_denied_word = '"%s"は使用が禁止されたワードです。'; + $lang->msg_alert_registered_denied_ip = '禁止IPに登録され、サイト内で正常な活動が制限されています。管理者にお問い合わせ下さい。'; + $lang->msg_alert_trackback_denied = '一つの書き込みには、1つのトラックバックしか受け取れません。'; ?> \ No newline at end of file diff --git a/modules/spamfilter/lang/ko.lang.php b/modules/spamfilter/lang/ko.lang.php index 5d5c02937..6f3212db9 100644 --- a/modules/spamfilter/lang/ko.lang.php +++ b/modules/spamfilter/lang/ko.lang.php @@ -1,34 +1,34 @@ -cmd_denied_ip = '금지IP 목록'; - $lang->cmd_denied_word = '금지 단어 목록'; - - // 일반 단어 - $lang->spamfilter = '스팸필터'; - $lang->denied_ip = '금지 IP'; - $lang->interval = '스팸 처리 간격'; - $lang->limit_count = '제한 수'; - $lang->check_trackback = '트랙백 검사'; - $lang->word = '단어'; - $lang->hit = '히트'; - $lang->latest_hit = '최근 히트'; - - // 설명문 - $lang->about_interval = '지정된 시간 내에 글을 등록하지 못하게 합니다.'; - $lang->about_limit_count = '지정된 시간 내에 제한수를 넘겨서 글 작성을 시도하면 스팸으로 인식, 해당 IP의 글 작성, 댓글 작성, 트랙백 발송 등을 금지합니다.'; - $lang->about_denied_ip = '127.0.0.* 와 같이 * 로 정해진 패턴의 IP 대역을 모두 금지 시킬 수 있습니다.'; - $lang->about_denied_word = '금지 단어로 등록되면 해당 단어가 있는 글은 등록을 금지 시킬 수 있습니다.'; - $lang->about_check_trackback = '한 글에 한 IP에만 트랙백을 허용할 수 있습니다.'; - - // 메세지 출력용 - $lang->msg_alert_limited_by_config = '%s 초 이내에 글 작성은 금지 됩니다. 계속 시도하시면 금지 IP에 등록되실 수 있습니다.'; - $lang->msg_alert_denied_word = '"%s"는 사용 금지된 단어입니다.'; - $lang->msg_alert_registered_denied_ip = '금지 IP에 등록되셔서 정상적인 활동에 제한을 받게 되셨습니다. 문의는 사이트 관리자에게 해주시기 바랍니다.'; - $lang->msg_alert_trackback_denied = '한 글에는 하나의 트랙백만 허용 됩니다.'; +cmd_denied_ip = '금지IP 목록'; + $lang->cmd_denied_word = '금지 단어 목록'; + + // 일반 단어 + $lang->spamfilter = '스팸필터'; + $lang->denied_ip = '금지 IP'; + $lang->interval = '스팸 처리 간격'; + $lang->limit_count = '제한 수'; + $lang->check_trackback = '트랙백 검사'; + $lang->word = '단어'; + $lang->hit = '히트'; + $lang->latest_hit = '최근 히트'; + + // 설명문 + $lang->about_interval = '지정된 시간 내에 글을 등록하지 못하게 합니다.'; + $lang->about_limit_count = '지정된 시간 내에 제한수를 넘겨서 글 작성을 시도하면 스팸으로 인식, 해당 IP의 글 작성, 댓글 작성, 트랙백 발송 등을 금지합니다.'; + $lang->about_denied_ip = '127.0.0.* 와 같이 * 로 정해진 패턴의 IP 대역을 모두 금지 시킬 수 있습니다.'; + $lang->about_denied_word = '금지 단어로 등록되면 해당 단어가 있는 글은 등록을 금지 시킬 수 있습니다.'; + $lang->about_check_trackback = '한 글에 한 IP에만 트랙백을 허용할 수 있습니다.'; + + // 메세지 출력용 + $lang->msg_alert_limited_by_config = '%s 초 이내에 글 작성은 금지 됩니다. 계속 시도하시면 금지 IP에 등록되실 수 있습니다.'; + $lang->msg_alert_denied_word = '"%s"는 사용 금지된 단어입니다.'; + $lang->msg_alert_registered_denied_ip = '금지 IP에 등록되셔서 정상적인 활동에 제한을 받게 되셨습니다. 문의는 사이트 관리자에게 해주시기 바랍니다.'; + $lang->msg_alert_trackback_denied = '한 글에는 하나의 트랙백만 허용 됩니다.'; ?> \ No newline at end of file diff --git a/modules/spamfilter/lang/ru.lang.php b/modules/spamfilter/lang/ru.lang.php index 58b91f150..0755f712d 100644 --- a/modules/spamfilter/lang/ru.lang.php +++ b/modules/spamfilter/lang/ru.lang.php @@ -1,34 +1,34 @@ -cmd_denied_ip = "Черный список IP-адресов"; - $lang->cmd_denied_word = "Черный список слов"; - - // главные слова - $lang->spamfilter = "Фильтр спама"; - $lang->denied_ip = "IP в черный список"; - $lang->interval = "Интервал фильтрования спама"; - $lang->limit_count = "Лимит публикаций"; - $lang->check_trackback = "Проверять трекбек"; - $lang->word = "Слово"; - $lang->hit = '히트'; - $lang->latest_hit = '최근 히트'; - - // описание - $lang->about_interval = "Все попытки разместить статьи в установленное время будут заблокированы."; - $lang->about_limit_count = "Если Вы вышли за лимит публикаций (статей/комментариев),\n Ваша статья будет разпознана как спам, и Ваш IP-адрес будет добавлен в черный список."; - $lang->about_denied_ip = "Вы можете добавить в черный список диапазон IP-адресов как 127.0.0.*, используя знак звездочки (*)."; - $lang->about_denied_word = "Когда Вы добавляете слово в черный список,\n статьи с этим словом не будут опубликованы"; - $lang->about_check_trackback = "Только трекбек для оного IP на статью может быть разрешен."; - - // для отправки сообщений - $lang->msg_alert_limited_by_config = 'Размещение статьи с интервалом в %s секунд не разрешено.\n Если Вы будете многократно пытаться это сделать, Ваш IP-адрес может быть добавлен в черный список.'; - $lang->msg_alert_denied_word = 'Слово "%s" запрещено для публикации.'; - $lang->msg_alert_registered_denied_ip = 'Ваш IP-адрес занесен в черный список,\n поэтому Вы можете иметь ограничения на полноценное использование этого сайта.\n Если у Вас есть вопросы насчет этого, пожалуйста, сообщите администратору сайта.'; - $lang->msg_alert_trackback_denied = 'Разрешен только один трекбек на статью.'; +cmd_denied_ip = "Черный список IP-адресов"; + $lang->cmd_denied_word = "Черный список слов"; + + // главные слова + $lang->spamfilter = "Фильтр спама"; + $lang->denied_ip = "IP в черный список"; + $lang->interval = "Интервал фильтрования спама"; + $lang->limit_count = "Лимит публикаций"; + $lang->check_trackback = "Проверять трекбек"; + $lang->word = "Слово"; + $lang->hit = '히트'; + $lang->latest_hit = '최근 히트'; + + // описание + $lang->about_interval = "Все попытки разместить статьи в установленное время будут заблокированы."; + $lang->about_limit_count = "Если Вы вышли за лимит публикаций (статей/комментариев),\n Ваша статья будет разпознана как спам, и Ваш IP-адрес будет добавлен в черный список."; + $lang->about_denied_ip = "Вы можете добавить в черный список диапазон IP-адресов как 127.0.0.*, используя знак звездочки (*)."; + $lang->about_denied_word = "Когда Вы добавляете слово в черный список,\n статьи с этим словом не будут опубликованы"; + $lang->about_check_trackback = "Только трекбек для оного IP на статью может быть разрешен."; + + // для отправки сообщений + $lang->msg_alert_limited_by_config = 'Размещение статьи с интервалом в %s секунд не разрешено.\n Если Вы будете многократно пытаться это сделать, Ваш IP-адрес может быть добавлен в черный список.'; + $lang->msg_alert_denied_word = 'Слово "%s" запрещено для публикации.'; + $lang->msg_alert_registered_denied_ip = 'Ваш IP-адрес занесен в черный список,\n поэтому Вы можете иметь ограничения на полноценное использование этого сайта.\n Если у Вас есть вопросы насчет этого, пожалуйста, сообщите администратору сайта.'; + $lang->msg_alert_trackback_denied = 'Разрешен только один трекбек на статью.'; ?> \ No newline at end of file diff --git a/modules/spamfilter/lang/tr.lang.php b/modules/spamfilter/lang/tr.lang.php index e4570ddb9..9df6d293d 100644 --- a/modules/spamfilter/lang/tr.lang.php +++ b/modules/spamfilter/lang/tr.lang.php @@ -1,34 +1,34 @@ -cmd_denied_ip = "IP Adresleri Kara Listesi"; - $lang->cmd_denied_word = "Yasak Sözcük Listesi"; - - // general word - $lang->spamfilter = "Spam filtreleyici"; - $lang->denied_ip = "IP Adresi"; - $lang->interval = "Spam filtreleyici için aralık"; - $lang->limit_count = "Gönderi Sınırı"; - $lang->check_trackback = "Geri izlemeleri kontrol et."; - $lang->word = "Kelime"; - $lang->hit = 'Hit'; - $lang->latest_hit = 'Son Hit\'ler'; - - // for description word - $lang->about_interval = "Belirlenen süre içerisinde gönderilmeye çalışılan tüm yazılar engellenecektir."; - $lang->about_limit_count = "Gönderi sınırını aşarsanız,\n o IP bir spam olarak kabul edilecek ve dolayısıyla yazı göndermede, yorum yapmada ve geri izlemede bulunmada sınırlamalarla karşılaşacaktır."; - $lang->about_denied_ip = "* işaretini kullanarak 127.0.0.* şeklinde IP adres aralığı ekleyebilirsiniz."; - $lang->about_denied_word = "Yasak sözcük listesine bir kelime eklediğinizde,\n o kelimeyi içeren tüm yazılar engellenecektir."; - $lang->about_check_trackback = "Geri izlemeler için yazı başına tek bir IP'ye izin verilir."; - - // to post a message - $lang->msg_alert_limited_by_config = '%s saniyede bir yazı göndermek mümkün değildir.\n Denemeyi sürdürürseniz, IP adresiniz kara listeye alınacaktır.'; - $lang->msg_alert_denied_word = ' "%s" kelimesinin kullanılmasına izin verilmemektedir.'; - $lang->msg_alert_registered_denied_ip = 'IP adresiniz kara listeye alındı,\n siteyi kullanırken sınırlamalarla karşılaşacaksınız.\n Bu konuda sorularınız varsa, lütfen site yöneticisi ile görüşün.'; - $lang->msg_alert_trackback_denied = 'Yazı başına sadece bir geri izlemeye izin verilmektedir.'; +cmd_denied_ip = "IP Adresleri Kara Listesi"; + $lang->cmd_denied_word = "Yasak Sözcük Listesi"; + + // general word + $lang->spamfilter = "Spam filtreleyici"; + $lang->denied_ip = "IP Adresi"; + $lang->interval = "Spam filtreleyici için aralık"; + $lang->limit_count = "Gönderi Sınırı"; + $lang->check_trackback = "Geri izlemeleri kontrol et."; + $lang->word = "Kelime"; + $lang->hit = 'Hit'; + $lang->latest_hit = 'Son Hit\'ler'; + + // for description word + $lang->about_interval = "Belirlenen süre içerisinde gönderilmeye çalışılan tüm yazılar engellenecektir."; + $lang->about_limit_count = "Gönderi sınırını aşarsanız,\n o IP bir spam olarak kabul edilecek ve dolayısıyla yazı göndermede, yorum yapmada ve geri izlemede bulunmada sınırlamalarla karşılaşacaktır."; + $lang->about_denied_ip = "* işaretini kullanarak 127.0.0.* şeklinde IP adres aralığı ekleyebilirsiniz."; + $lang->about_denied_word = "Yasak sözcük listesine bir kelime eklediğinizde,\n o kelimeyi içeren tüm yazılar engellenecektir."; + $lang->about_check_trackback = "Geri izlemeler için yazı başına tek bir IP'ye izin verilir."; + + // to post a message + $lang->msg_alert_limited_by_config = '%s saniyede bir yazı göndermek mümkün değildir.\n Denemeyi sürdürürseniz, IP adresiniz kara listeye alınacaktır.'; + $lang->msg_alert_denied_word = ' "%s" kelimesinin kullanılmasına izin verilmemektedir.'; + $lang->msg_alert_registered_denied_ip = 'IP adresiniz kara listeye alındı,\n siteyi kullanırken sınırlamalarla karşılaşacaksınız.\n Bu konuda sorularınız varsa, lütfen site yöneticisi ile görüşün.'; + $lang->msg_alert_trackback_denied = 'Yazı başına sadece bir geri izlemeye izin verilmektedir.'; ?> \ No newline at end of file diff --git a/modules/spamfilter/lang/vi.lang.php b/modules/spamfilter/lang/vi.lang.php index 9170010ae..3a0a5e62f 100644 --- a/modules/spamfilter/lang/vi.lang.php +++ b/modules/spamfilter/lang/vi.lang.php @@ -1,36 +1,36 @@ -cmd_denied_ip = "Danh sách IP cấm"; - $lang->cmd_denied_word = "Danh sách từ cấm"; - - // general word - $lang->spamfilter = "Bộ lọc Spam"; - $lang->denied_ip = "IP bị cấm"; - $lang->interval = "Thời gian giới hạn"; - $lang->limit_count = "Số bài viết giới hạn"; - $lang->check_trackback = "Kiểm tra liên kết Web"; - $lang->word = "Từ"; - $lang->hit = 'Truy cập'; - $lang->latest_hit = 'Truy cập mới nhất'; - - // for description word - $lang->about_interval = "Tất cả những bài viết trong thời gian giới hạn sẽ bị chặn."; - $lang->about_limit_count = "Nếu bạn gửi bài vượt quá số bài viết quy định,\n bài viết của bạn sẽ bị ghi vào danh sách và IP của bạn sẽ bị lưu vào danh sách IP bị cấm."; - $lang->about_denied_ip = "Bạn có thể thêm IP vào danh sách bị cấm dạng 127.0.0.* bằng cách sử dụng *."; - $lang->about_denied_word = "Khi bạn thêm từ vào danh sách Từ bị cấm,\n những bài viết có chứa những từ này sẽ không được gửi."; - $lang->about_check_trackback = "Chỉ cho phép gửi một bài viết với một IP trên một liên kết Web."; - - // to post a message - $lang->msg_alert_limited_by_config = 'Không được phép gửi bài thứ 2 trong khoảng thời gian %s giây.\n Nếu bạn cứ tiếp tục, IP của bạn sẽ bị thêm vào danh sách IP bị cấm.'; - $lang->msg_alert_denied_word = 'Không được phép gửi từ "%s".'; - $lang->msg_alert_registered_denied_ip = 'IP của bạn đã bị nằm trong danh sách cấm,\n vì vậy bạn bị giới hạn sử dụng trên Website này.\n Nếu bạn có bất cứ thắc mắc gì, xin vui lòng liên hệ với Webmaster để được giải đáp.'; - $lang->msg_alert_trackback_denied = 'Chỉ cho phép một liên kết Web trên một bài viết.'; +cmd_denied_ip = "Danh sách IP cấm"; + $lang->cmd_denied_word = "Danh sách từ cấm"; + + // general word + $lang->spamfilter = "Bộ lọc Spam"; + $lang->denied_ip = "IP bị cấm"; + $lang->interval = "Thời gian giới hạn"; + $lang->limit_count = "Số bài viết giới hạn"; + $lang->check_trackback = "Kiểm tra liên kết Web"; + $lang->word = "Từ"; + $lang->hit = 'Truy cập'; + $lang->latest_hit = 'Truy cập mới nhất'; + + // for description word + $lang->about_interval = "Tất cả những bài viết trong thời gian giới hạn sẽ bị chặn."; + $lang->about_limit_count = "Nếu bạn gửi bài vượt quá số bài viết quy định,\n bài viết của bạn sẽ bị ghi vào danh sách và IP của bạn sẽ bị lưu vào danh sách IP bị cấm."; + $lang->about_denied_ip = "Bạn có thể thêm IP vào danh sách bị cấm dạng 127.0.0.* bằng cách sử dụng *."; + $lang->about_denied_word = "Khi bạn thêm từ vào danh sách Từ bị cấm,\n những bài viết có chứa những từ này sẽ không được gửi."; + $lang->about_check_trackback = "Chỉ cho phép gửi một bài viết với một IP trên một liên kết Web."; + + // to post a message + $lang->msg_alert_limited_by_config = 'Không được phép gửi bài thứ 2 trong khoảng thời gian %s giây.\n Nếu bạn cứ tiếp tục, IP của bạn sẽ bị thêm vào danh sách IP bị cấm.'; + $lang->msg_alert_denied_word = 'Không được phép gửi từ "%s".'; + $lang->msg_alert_registered_denied_ip = 'IP của bạn đã bị nằm trong danh sách cấm,\n vì vậy bạn bị giới hạn sử dụng trên Website này.\n Nếu bạn có bất cứ thắc mắc gì, xin vui lòng liên hệ với Webmaster để được giải đáp.'; + $lang->msg_alert_trackback_denied = 'Chỉ cho phép một liên kết Web trên một bài viết.'; ?> \ No newline at end of file diff --git a/modules/spamfilter/lang/zh-CN.lang.php b/modules/spamfilter/lang/zh-CN.lang.php index a3d968867..cbe1a6fa3 100644 --- a/modules/spamfilter/lang/zh-CN.lang.php +++ b/modules/spamfilter/lang/zh-CN.lang.php @@ -1,34 +1,34 @@ -cmd_denied_ip = "禁止IP列表"; - $lang->cmd_denied_word = "敏感词列表"; - - // 一般用语 - $lang->spamfilter = "垃圾过滤"; - $lang->denied_ip = "禁止IP"; - $lang->interval = "处理垃圾间隔"; - $lang->limit_count = "限制数"; - $lang->check_trackback = "检查引用"; - $lang->word = "单词"; - $lang->hit = '点击'; - $lang->latest_hit = '最后点击'; - - // 说明文 - $lang->about_interval = "指定的时间内禁止发表新主题。"; - $lang->about_limit_count = "在指定时间内发表的新主题超过限制数时,系统将把它认为是垃圾主题,将自动禁止对方的IP。"; - $lang->about_denied_ip = "禁止IP可以使用通配符。(如:如 \"127.0.*.*\")"; - $lang->about_denied_word = "登录为敏感词,可以对要发表的主题进行检测并禁止含有敏感词的主题发表。"; - $lang->about_check_trackback = "对一个主题只允许一个IP引用。"; - - // 提示信息 - $lang->msg_alert_limited_by_config = '%s秒之内不能连续发表新主题。如您继续再试系统将自动禁止您的IP。'; - $lang->msg_alert_denied_word = '"%s"是敏感词!'; - $lang->msg_alert_registered_denied_ip = '您的IP已被禁止,详情请联系网站管理员。'; - $lang->msg_alert_trackback_denied = '一个主题只允许一个引用。'; +cmd_denied_ip = "禁止IP列表"; + $lang->cmd_denied_word = "敏感词列表"; + + // 一般用语 + $lang->spamfilter = "垃圾过滤"; + $lang->denied_ip = "禁止IP"; + $lang->interval = "处理垃圾间隔"; + $lang->limit_count = "限制数"; + $lang->check_trackback = "检查引用"; + $lang->word = "单词"; + $lang->hit = '点击'; + $lang->latest_hit = '最后点击'; + + // 说明文 + $lang->about_interval = "指定的时间内禁止发表新主题。"; + $lang->about_limit_count = "在指定时间内发表的新主题超过限制数时,系统将把它认为是垃圾主题,将自动禁止对方的IP。"; + $lang->about_denied_ip = "禁止IP可以使用通配符。(如:如 \"127.0.*.*\")"; + $lang->about_denied_word = "登录为敏感词,可以对要发表的主题进行检测并禁止含有敏感词的主题发表。"; + $lang->about_check_trackback = "对一个主题只允许一个IP引用。"; + + // 提示信息 + $lang->msg_alert_limited_by_config = '%s秒之内不能连续发表新主题。如您继续再试系统将自动禁止您的IP。'; + $lang->msg_alert_denied_word = '"%s"是敏感词!'; + $lang->msg_alert_registered_denied_ip = '您的IP已被禁止,详情请联系网站管理员。'; + $lang->msg_alert_trackback_denied = '一个主题只允许一个引用。'; ?> \ No newline at end of file diff --git a/modules/spamfilter/lang/zh-TW.lang.php b/modules/spamfilter/lang/zh-TW.lang.php index af2336c2a..e21803f3b 100644 --- a/modules/spamfilter/lang/zh-TW.lang.php +++ b/modules/spamfilter/lang/zh-TW.lang.php @@ -1,34 +1,34 @@ -cmd_denied_ip = "禁止IP列表"; - $lang->cmd_denied_word = "敏感詞清單"; - - // 一般用語 - $lang->spamfilter = "垃圾過濾"; - $lang->denied_ip = "禁止IP"; - $lang->interval = "處理垃圾間隔"; - $lang->limit_count = "限制數"; - $lang->check_trackback = "檢查引用"; - $lang->word = "單字"; - $lang->hit = '히트'; - $lang->latest_hit = '최근 히트'; - - // 說明 - $lang->about_interval = "指定的時間內禁止發表新主題。"; - $lang->about_limit_count = "在指定時間內發表的新主題超過限制數時,系統將會認為是垃圾主題,並自動禁止對方的IP。"; - $lang->about_denied_ip = "禁止IP可以使用通配符。(如:如 \"127.0.*.*\")"; - $lang->about_denied_word = "登錄為敏感詞,可以對要發表的主題進行檢測並禁止含有敏感詞的主題發表。"; - $lang->about_check_trackback = "對一個主題只允許一個IP引用。"; - - // 提示訊息 - $lang->msg_alert_limited_by_config = '%s秒之內不能連續發表新主題。如您繼續再試系統將自動禁止您的IP。'; - $lang->msg_alert_denied_word = '"%s"是敏感詞!'; - $lang->msg_alert_registered_denied_ip = '您的IP已被禁止,詳情請聯繫網站管理員。'; - $lang->msg_alert_trackback_denied = '一個主題只允許一個引用。'; +cmd_denied_ip = "禁止IP列表"; + $lang->cmd_denied_word = "敏感詞清單"; + + // 一般用語 + $lang->spamfilter = "垃圾過濾"; + $lang->denied_ip = "禁止IP"; + $lang->interval = "處理垃圾間隔"; + $lang->limit_count = "限制數"; + $lang->check_trackback = "檢查引用"; + $lang->word = "單字"; + $lang->hit = '히트'; + $lang->latest_hit = '최근 히트'; + + // 說明 + $lang->about_interval = "指定的時間內禁止發表新主題。"; + $lang->about_limit_count = "在指定時間內發表的新主題超過限制數時,系統將會認為是垃圾主題,並自動禁止對方的IP。"; + $lang->about_denied_ip = "禁止IP可以使用通配符。(如:如 \"127.0.*.*\")"; + $lang->about_denied_word = "登錄為敏感詞,可以對要發表的主題進行檢測並禁止含有敏感詞的主題發表。"; + $lang->about_check_trackback = "對一個主題只允許一個IP引用。"; + + // 提示訊息 + $lang->msg_alert_limited_by_config = '%s秒之內不能連續發表新主題。如您繼續再試系統將自動禁止您的IP。'; + $lang->msg_alert_denied_word = '"%s"是敏感詞!'; + $lang->msg_alert_registered_denied_ip = '您的IP已被禁止,詳情請聯繫網站管理員。'; + $lang->msg_alert_trackback_denied = '一個主題只允許一個引用。'; ?> \ No newline at end of file diff --git a/modules/spamfilter/spamfilter.admin.controller.php b/modules/spamfilter/spamfilter.admin.controller.php index b0fa708e2..663ae6f01 100644 --- a/modules/spamfilter/spamfilter.admin.controller.php +++ b/modules/spamfilter/spamfilter.admin.controller.php @@ -1,99 +1,99 @@ -check_trackback!='Y') $args->check_trackback = 'N'; - - // module Controller 객체 생성하여 입력 - $oModuleController = &getController('module'); - $output = $oModuleController->insertModuleConfig('spamfilter',$args); - return $output; - } - - /** - * @brief 금지 IP등록 - **/ - function procSpamfilterAdminInsertDeniedIP() { - $ipaddress = Context::get('ipaddress'); - $description = Context::get('description'); - - $oSpamfilterController = &getController('spamfilter'); - return $oSpamfilterController->insertIP($ipaddress, $description); - } - - /** - * @brief 금지 IP삭제 - **/ - function procSpamfilterAdminDeleteDeniedIP() { - $ipaddress = Context::get('ipaddress'); - return $this->deleteIP($ipaddress); - } - - /** - * @brief 금지 Word등록 - **/ - function procSpamfilterAdminInsertDeniedWord() { - $word = Context::get('word'); - return $this->insertWord($word); - } - - /** - * @brief 금지 Word삭제 - **/ - function procSpamfilterAdminDeleteDeniedWord() { - $word = base64_decode(Context::get('word')); - return $this->deleteWord($word); - } - - /** - * @brief IP 제거 - * 스패머로 등록된 IP를 제거 - **/ - function deleteIP($ipaddress) { - if(!$ipaddress) return; - - $args->ipaddress = $ipaddress; - return executeQuery('spamfilter.deleteDeniedIP', $args); - } - - /** - * @brief 스팸단어 등록 - * 등록된 단어가 포함된 글은 스팸글로 간주 - **/ - function insertWord($word) { - if(!$word) return; - - $args->word = $word; - return executeQuery('spamfilter.insertDeniedWord', $args); - } - - /** - * @brief 스팸단어 제거 - * 스팸 단어로 등록된 단어 제거 - **/ - function deleteWord($word) { - if(!$word) return; - - $args->word = $word; - return executeQuery('spamfilter.deleteDeniedWord', $args); - } - - } -?> +check_trackback!='Y') $args->check_trackback = 'N'; + + // module Controller 객체 생성하여 입력 + $oModuleController = &getController('module'); + $output = $oModuleController->insertModuleConfig('spamfilter',$args); + return $output; + } + + /** + * @brief 금지 IP등록 + **/ + function procSpamfilterAdminInsertDeniedIP() { + $ipaddress = Context::get('ipaddress'); + $description = Context::get('description'); + + $oSpamfilterController = &getController('spamfilter'); + return $oSpamfilterController->insertIP($ipaddress, $description); + } + + /** + * @brief 금지 IP삭제 + **/ + function procSpamfilterAdminDeleteDeniedIP() { + $ipaddress = Context::get('ipaddress'); + return $this->deleteIP($ipaddress); + } + + /** + * @brief 금지 Word등록 + **/ + function procSpamfilterAdminInsertDeniedWord() { + $word = Context::get('word'); + return $this->insertWord($word); + } + + /** + * @brief 금지 Word삭제 + **/ + function procSpamfilterAdminDeleteDeniedWord() { + $word = base64_decode(Context::get('word')); + return $this->deleteWord($word); + } + + /** + * @brief IP 제거 + * 스패머로 등록된 IP를 제거 + **/ + function deleteIP($ipaddress) { + if(!$ipaddress) return; + + $args->ipaddress = $ipaddress; + return executeQuery('spamfilter.deleteDeniedIP', $args); + } + + /** + * @brief 스팸단어 등록 + * 등록된 단어가 포함된 글은 스팸글로 간주 + **/ + function insertWord($word) { + if(!$word) return; + + $args->word = $word; + return executeQuery('spamfilter.insertDeniedWord', $args); + } + + /** + * @brief 스팸단어 제거 + * 스팸 단어로 등록된 단어 제거 + **/ + function deleteWord($word) { + if(!$word) return; + + $args->word = $word; + return executeQuery('spamfilter.deleteDeniedWord', $args); + } + + } +?> diff --git a/modules/spamfilter/spamfilter.admin.view.php b/modules/spamfilter/spamfilter.admin.view.php index aedd029a1..b20b48499 100644 --- a/modules/spamfilter/spamfilter.admin.view.php +++ b/modules/spamfilter/spamfilter.admin.view.php @@ -1,59 +1,59 @@ -setTemplatePath($this->module_path.'tpl'); - } - - /** - * @brief 스팸필터의 설정 화면 - **/ - function dispSpamfilterAdminConfig() { - // 설정 정보를 받아옴 (module model 객체를 이용) - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('spamfilter'); - Context::set('config',$config); - - // 템플릿 파일 지정 - $this->setTemplateFile('index'); - } - - /** - * @brief 금지 목록 출력 - **/ - function dispSpamfilterAdminDeniedIPList() { - // 등록된 금지 IP 목록을 가져옴 - $oSpamFilterModel = &getModel('spamfilter'); - $ip_list = $oSpamFilterModel->getDeniedIPList(); - - Context::set('ip_list', $ip_list); - - // 템플릿 파일 지정 - $this->setTemplateFile('denied_ip_list'); - } - - /** - * @brief 금지 목록 출력 - **/ - function dispSpamfilterAdminDeniedWordList() { - // 등록된 금지 Word 목록을 가져옴 - $oSpamFilterModel = &getModel('spamfilter'); - $word_list = $oSpamFilterModel->getDeniedWordList(); - - Context::set('word_list', $word_list); - - // 템플릿 파일 지정 - $this->setTemplateFile('denied_word_list'); - } - } -?> +setTemplatePath($this->module_path.'tpl'); + } + + /** + * @brief 스팸필터의 설정 화면 + **/ + function dispSpamfilterAdminConfig() { + // 설정 정보를 받아옴 (module model 객체를 이용) + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('spamfilter'); + Context::set('config',$config); + + // 템플릿 파일 지정 + $this->setTemplateFile('index'); + } + + /** + * @brief 금지 목록 출력 + **/ + function dispSpamfilterAdminDeniedIPList() { + // 등록된 금지 IP 목록을 가져옴 + $oSpamFilterModel = &getModel('spamfilter'); + $ip_list = $oSpamFilterModel->getDeniedIPList(); + + Context::set('ip_list', $ip_list); + + // 템플릿 파일 지정 + $this->setTemplateFile('denied_ip_list'); + } + + /** + * @brief 금지 목록 출력 + **/ + function dispSpamfilterAdminDeniedWordList() { + // 등록된 금지 Word 목록을 가져옴 + $oSpamFilterModel = &getModel('spamfilter'); + $word_list = $oSpamFilterModel->getDeniedWordList(); + + Context::set('word_list', $word_list); + + // 템플릿 파일 지정 + $this->setTemplateFile('denied_word_list'); + } + } +?> diff --git a/modules/spamfilter/spamfilter.class.php b/modules/spamfilter/spamfilter.class.php index 7a0191dd8..56d01c6be 100644 --- a/modules/spamfilter/spamfilter.class.php +++ b/modules/spamfilter/spamfilter.class.php @@ -1,108 +1,108 @@ -insertTrigger('document.insertDocument', 'spamfilter', 'controller', 'triggerInsertDocument', 'before'); - $oModuleController->insertTrigger('comment.insertComment', 'spamfilter', 'controller', 'triggerInsertComment', 'before'); - $oModuleController->insertTrigger('trackback.insertTrackback', 'spamfilter', 'controller', 'triggerInsertTrackback', 'before'); - - - //2008-12-17 글 수정시 스펨필터 추가 - $oModuleController->insertTrigger('comment.updateComment', 'spamfilter', 'controller', 'triggerInsertComment', 'before'); - $oModuleController->insertTrigger('document.updateDocument', 'spamfilter', 'controller', 'triggerInsertDocument', 'before'); - - - return new Object(); - } - - /** - * @brief 설치가 이상이 없는지 체크하는 method - **/ - function checkUpdate() { - $oDB = &DB::getInstance(); - $oModuleModel = &getModel('module'); - - // 2007. 12. 7 글/ 댓글/ 엮인글이 등록될때 스팸필터링을 시도하는 트리거 - if(!$oModuleModel->getTrigger('document.insertDocument', 'spamfilter', 'controller', 'triggerInsertDocument', 'before')) return true; - if(!$oModuleModel->getTrigger('comment.insertComment', 'spamfilter', 'controller', 'triggerInsertComment', 'before')) return true; - if(!$oModuleModel->getTrigger('trackback.insertTrackback', 'spamfilter', 'controller', 'triggerInsertTrackback', 'before')) return true; - - //2008-12-17 글 수정시 스펨필터 추가 - if(!$oModuleModel->getTrigger('comment.updateComment', 'spamfilter', 'controller', 'triggerInsertComment', 'before')) return true; - if(!$oModuleModel->getTrigger('document.updateDocument', 'spamfilter', 'controller', 'triggerInsertDocument', 'before')) return true; - - /** - * 히트 카운트 필드(hit) 추가 - **/ - if(!$oDB->isColumnExists('spamfilter_denied_word', 'hit')) return true; - if(!$oDB->isColumnExists('spamfilter_denied_word', 'latest_hit')) return true; - - if(!$oDB->isColumnExists('spamfilter_denied_ip', 'description')) return true; - - return false; - } - - /** - * @brief 업데이트 실행 - **/ - function moduleUpdate() { - $oDB = &DB::getInstance(); - $oModuleModel = &getModel('module'); - $oModuleController = &getController('module'); - - // 2007. 12. 7 글/ 댓글/ 엮인글이 등록될때 스팸필터링을 시도하는 트리거 - if(!$oModuleModel->getTrigger('document.insertDocument', 'spamfilter', 'controller', 'triggerInsertDocument', 'before')) - $oModuleController->insertTrigger('document.insertDocument', 'spamfilter', 'controller', 'triggerInsertDocument', 'before'); - if(!$oModuleModel->getTrigger('comment.insertComment', 'spamfilter', 'controller', 'triggerInsertComment', 'before')) - $oModuleController->insertTrigger('comment.insertComment', 'spamfilter', 'controller', 'triggerInsertComment', 'before'); - if(!$oModuleModel->getTrigger('trackback.insertTrackback', 'spamfilter', 'controller', 'triggerInsertTrackback', 'before')) - $oModuleController->insertTrigger('trackback.insertTrackback', 'spamfilter', 'controller', 'triggerInsertTrackback', 'before'); - - //2008-12-17 글 수정시 스펨필터 추가 - if(!$oModuleModel->getTrigger('comment.updateComment', 'spamfilter', 'controller', 'triggerInsertComment', 'before')){ - $oModuleController->insertTrigger('comment.updateComment', 'spamfilter', 'controller', 'triggerInsertComment', 'before'); - } - //2008-12-17 글 수정시 스펨필터 추가 - if(!$oModuleModel->getTrigger('document.updateDocument', 'spamfilter', 'controller', 'triggerInsertDocument', 'before')){ - $oModuleController->insertTrigger('document.updateDocument', 'spamfilter', 'controller', 'triggerInsertDocument', 'before'); - } - - /** - * 히트 카운트 필드(hit) 추가 - **/ - if(!$oDB->isColumnExists('spamfilter_denied_word', 'hit')) { - $oDB->addColumn('spamfilter_denied_word','hit','number',12,0,true); - $oDB->addIndex('spamfilter_denied_word','idx_hit', 'hit'); - } - if(!$oDB->isColumnExists('spamfilter_denied_word', 'latest_hit')) { - $oDB->addColumn('spamfilter_denied_word','latest_hit','date'); - $oDB->addIndex('spamfilter_denied_word','idx_latest_hit', 'latest_hit'); - } - - if(!$oDB->isColumnExists('spamfilter_denied_ip', 'description')) { - $oDB->addColumn('spamfilter_denied_ip','description','varchar', 250); - } - - return new Object(0,'success_updated'); - } - - /** - * @brief 캐시 파일 재생성 - **/ - function recompileCache() { - } - } +insertTrigger('document.insertDocument', 'spamfilter', 'controller', 'triggerInsertDocument', 'before'); + $oModuleController->insertTrigger('comment.insertComment', 'spamfilter', 'controller', 'triggerInsertComment', 'before'); + $oModuleController->insertTrigger('trackback.insertTrackback', 'spamfilter', 'controller', 'triggerInsertTrackback', 'before'); + + + //2008-12-17 글 수정시 스펨필터 추가 + $oModuleController->insertTrigger('comment.updateComment', 'spamfilter', 'controller', 'triggerInsertComment', 'before'); + $oModuleController->insertTrigger('document.updateDocument', 'spamfilter', 'controller', 'triggerInsertDocument', 'before'); + + + return new Object(); + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + **/ + function checkUpdate() { + $oDB = &DB::getInstance(); + $oModuleModel = &getModel('module'); + + // 2007. 12. 7 글/ 댓글/ 엮인글이 등록될때 스팸필터링을 시도하는 트리거 + if(!$oModuleModel->getTrigger('document.insertDocument', 'spamfilter', 'controller', 'triggerInsertDocument', 'before')) return true; + if(!$oModuleModel->getTrigger('comment.insertComment', 'spamfilter', 'controller', 'triggerInsertComment', 'before')) return true; + if(!$oModuleModel->getTrigger('trackback.insertTrackback', 'spamfilter', 'controller', 'triggerInsertTrackback', 'before')) return true; + + //2008-12-17 글 수정시 스펨필터 추가 + if(!$oModuleModel->getTrigger('comment.updateComment', 'spamfilter', 'controller', 'triggerInsertComment', 'before')) return true; + if(!$oModuleModel->getTrigger('document.updateDocument', 'spamfilter', 'controller', 'triggerInsertDocument', 'before')) return true; + + /** + * 히트 카운트 필드(hit) 추가 + **/ + if(!$oDB->isColumnExists('spamfilter_denied_word', 'hit')) return true; + if(!$oDB->isColumnExists('spamfilter_denied_word', 'latest_hit')) return true; + + if(!$oDB->isColumnExists('spamfilter_denied_ip', 'description')) return true; + + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + $oDB = &DB::getInstance(); + $oModuleModel = &getModel('module'); + $oModuleController = &getController('module'); + + // 2007. 12. 7 글/ 댓글/ 엮인글이 등록될때 스팸필터링을 시도하는 트리거 + if(!$oModuleModel->getTrigger('document.insertDocument', 'spamfilter', 'controller', 'triggerInsertDocument', 'before')) + $oModuleController->insertTrigger('document.insertDocument', 'spamfilter', 'controller', 'triggerInsertDocument', 'before'); + if(!$oModuleModel->getTrigger('comment.insertComment', 'spamfilter', 'controller', 'triggerInsertComment', 'before')) + $oModuleController->insertTrigger('comment.insertComment', 'spamfilter', 'controller', 'triggerInsertComment', 'before'); + if(!$oModuleModel->getTrigger('trackback.insertTrackback', 'spamfilter', 'controller', 'triggerInsertTrackback', 'before')) + $oModuleController->insertTrigger('trackback.insertTrackback', 'spamfilter', 'controller', 'triggerInsertTrackback', 'before'); + + //2008-12-17 글 수정시 스펨필터 추가 + if(!$oModuleModel->getTrigger('comment.updateComment', 'spamfilter', 'controller', 'triggerInsertComment', 'before')){ + $oModuleController->insertTrigger('comment.updateComment', 'spamfilter', 'controller', 'triggerInsertComment', 'before'); + } + //2008-12-17 글 수정시 스펨필터 추가 + if(!$oModuleModel->getTrigger('document.updateDocument', 'spamfilter', 'controller', 'triggerInsertDocument', 'before')){ + $oModuleController->insertTrigger('document.updateDocument', 'spamfilter', 'controller', 'triggerInsertDocument', 'before'); + } + + /** + * 히트 카운트 필드(hit) 추가 + **/ + if(!$oDB->isColumnExists('spamfilter_denied_word', 'hit')) { + $oDB->addColumn('spamfilter_denied_word','hit','number',12,0,true); + $oDB->addIndex('spamfilter_denied_word','idx_hit', 'hit'); + } + if(!$oDB->isColumnExists('spamfilter_denied_word', 'latest_hit')) { + $oDB->addColumn('spamfilter_denied_word','latest_hit','date'); + $oDB->addIndex('spamfilter_denied_word','idx_latest_hit', 'latest_hit'); + } + + if(!$oDB->isColumnExists('spamfilter_denied_ip', 'description')) { + $oDB->addColumn('spamfilter_denied_ip','description','varchar', 250); + } + + return new Object(0,'success_updated'); + } + + /** + * @brief 캐시 파일 재생성 + **/ + function recompileCache() { + } + } ?> \ No newline at end of file diff --git a/modules/spamfilter/spamfilter.controller.php b/modules/spamfilter/spamfilter.controller.php index 8f774da17..a799f3dfe 100644 --- a/modules/spamfilter/spamfilter.controller.php +++ b/modules/spamfilter/spamfilter.controller.php @@ -1,173 +1,173 @@ -is_admin == 'Y') return new Object(); - if($grant->manager) return new Object(); - } - - $oFilterModel = &getModel('spamfilter'); - - // ip가 금지되어 있는 경우를 체크 - $output = $oFilterModel->isDeniedIP(); - if(!$output->toBool()) return $output; - - // 금지 단어에 있을 경우 체크 - $text = $obj->title.$obj->content; - $output = $oFilterModel->isDeniedWord($text); - if(!$output->toBool()) return $output; - - // 지정된 시간 체크, 수정시 제외 - if($obj->document_srl == 0){ - $output = $oFilterModel->checkLimited(); - if(!$output->toBool()) return $output; - } - - // 로그 남김 - $this->insertLog(); - - return new Object(); - } - - /** - * @brief 댓글 작성 시간 및 금지 ip/ 단어 처리 루틴 - **/ - function triggerInsertComment(&$obj) { - if($_SESSION['avoid_log']) return new Object(); - - // 로그인 여부, 로그인 정보, 권한 유무 체크 - $is_logged = Context::get('is_logged'); - $logged_info = Context::get('logged_info'); - $grant = Context::get('grant'); - - // 로그인 되어 있을 경우 관리자 여부를 체크 - if($is_logged) { - if($logged_info->is_admin == 'Y') return new Object(); - if($grant->manager) return new Object(); - } - - $oFilterModel = &getModel('spamfilter'); - - // ip가 금지되어 있는 경우를 체크 - $output = $oFilterModel->isDeniedIP(); - if(!$output->toBool()) return $output; - - // 금지 단어에 있을 경우 체크 - $text = $obj->content; - $output = $oFilterModel->isDeniedWord($text); - if(!$output->toBool()) return $output; - - // 지정된 시간 체크 수정이 아닌경우만 - if(!$obj->__isupdate){ - $output = $oFilterModel->checkLimited(); - if(!$output->toBool()) return $output; - } - unset($obj->__isupdate); - - // 로그 남김 - $this->insertLog(); - - return new Object(); - } - - /** - * @brief 엮인글 작성시 시간 및 ip 검사 - **/ - function triggerInsertTrackback(&$obj) { - if($_SESSION['avoid_log']) return new Object(); - - $oFilterModel = &getModel('spamfilter'); - - // 해당 글에 엮인글을 한번 이상 추가하였는지를 확인 - $output = $oFilterModel->isInsertedTrackback($obj->document_srl); - if(!$output->toBool()) return $output; - - // ip가 금지되어 있는 경우를 체크 - $output = $oFilterModel->isDeniedIP(); - if(!$output->toBool()) return $output; - - // 금지 단어에 있을 경우 체크 - $text = $obj->blog_name.$obj->title.$obj->excerpt.$obj->url; - $output = $oFilterModel->isDeniedWord($text); - if(!$output->toBool()) return $output; - - // 필터링 시작 - $oTrackbackModel = &getModel('trackback'); - $oTrackbackController = &getController('trackback'); - - list($ipA,$ipB,$ipC,$ipD) = explode('.',$_SERVER['REMOTE_ADDR']); - $ipaddress = $ipA.'.'.$ipB.'.'.$ipC; - - // 제목과 블로그이름이 동일할 경우 최근 6시간내의 ip를 조사하여 삭제하고 금지ip로 등록 - if($obj->title == $obj->excerpt) { - $oTrackbackController->deleteTrackbackSender(60*60*6, $ipaddress, $obj->url, $obj->blog_name, $obj->title, $obj->excerpt); - $this->insertIP($ipaddress.'.*', 'AUTO-DENIED : trackback.insertTrackback'); - return new Object(-1,'msg_alert_trackback_denied'); - } - - // 30분 이내에 1개 이상의 한 C클래스의 ip에서 엮인글 등록 시도시 금지 아이피로 지정하고 해당 ip의 글을 모두 삭제 - /* 호스팅 환경을 감안하여 일단 이 부분은 동작하지 않도록 주석 처리 - $count = $oTrackbackModel->getRegistedTrackback(30*60, $ipaddress, $obj->url, $obj->blog_name, $obj->title, $obj->excerpt); - if($count > 1) { - $oTrackbackController->deleteTrackbackSender(3*60, $ipaddress, $obj->url, $obj->blog_name, $obj->title, $obj->excerpt); - $this->insertIP($ipaddress.'.*'); - return new Object(-1,'msg_alert_trackback_denied'); - } - */ - - return new Object(); - } - - /** - * @brief IP 등록 - * 등록된 IP는 스패머로 간주 - **/ - function insertIP($ipaddress, $description = null) { - $args->ipaddress = $ipaddress; - if($description) $args->description = $description; - - return executeQuery('spamfilter.insertDeniedIP', $args); - } - - /** - * @brief 로그 등록 - * 현 접속 IP를 로그에 등록, 로그의 간격이 특정 시간 이내일 경우 도배로 간주하여 - * 스패머로 등록할 수 있음 - **/ - function insertLog() { - $output = executeQuery('spamfilter.insertLog'); - return $output; - } - } -?> +is_admin == 'Y') return new Object(); + if($grant->manager) return new Object(); + } + + $oFilterModel = &getModel('spamfilter'); + + // ip가 금지되어 있는 경우를 체크 + $output = $oFilterModel->isDeniedIP(); + if(!$output->toBool()) return $output; + + // 금지 단어에 있을 경우 체크 + $text = $obj->title.$obj->content; + $output = $oFilterModel->isDeniedWord($text); + if(!$output->toBool()) return $output; + + // 지정된 시간 체크, 수정시 제외 + if($obj->document_srl == 0){ + $output = $oFilterModel->checkLimited(); + if(!$output->toBool()) return $output; + } + + // 로그 남김 + $this->insertLog(); + + return new Object(); + } + + /** + * @brief 댓글 작성 시간 및 금지 ip/ 단어 처리 루틴 + **/ + function triggerInsertComment(&$obj) { + if($_SESSION['avoid_log']) return new Object(); + + // 로그인 여부, 로그인 정보, 권한 유무 체크 + $is_logged = Context::get('is_logged'); + $logged_info = Context::get('logged_info'); + $grant = Context::get('grant'); + + // 로그인 되어 있을 경우 관리자 여부를 체크 + if($is_logged) { + if($logged_info->is_admin == 'Y') return new Object(); + if($grant->manager) return new Object(); + } + + $oFilterModel = &getModel('spamfilter'); + + // ip가 금지되어 있는 경우를 체크 + $output = $oFilterModel->isDeniedIP(); + if(!$output->toBool()) return $output; + + // 금지 단어에 있을 경우 체크 + $text = $obj->content; + $output = $oFilterModel->isDeniedWord($text); + if(!$output->toBool()) return $output; + + // 지정된 시간 체크 수정이 아닌경우만 + if(!$obj->__isupdate){ + $output = $oFilterModel->checkLimited(); + if(!$output->toBool()) return $output; + } + unset($obj->__isupdate); + + // 로그 남김 + $this->insertLog(); + + return new Object(); + } + + /** + * @brief 엮인글 작성시 시간 및 ip 검사 + **/ + function triggerInsertTrackback(&$obj) { + if($_SESSION['avoid_log']) return new Object(); + + $oFilterModel = &getModel('spamfilter'); + + // 해당 글에 엮인글을 한번 이상 추가하였는지를 확인 + $output = $oFilterModel->isInsertedTrackback($obj->document_srl); + if(!$output->toBool()) return $output; + + // ip가 금지되어 있는 경우를 체크 + $output = $oFilterModel->isDeniedIP(); + if(!$output->toBool()) return $output; + + // 금지 단어에 있을 경우 체크 + $text = $obj->blog_name.$obj->title.$obj->excerpt.$obj->url; + $output = $oFilterModel->isDeniedWord($text); + if(!$output->toBool()) return $output; + + // 필터링 시작 + $oTrackbackModel = &getModel('trackback'); + $oTrackbackController = &getController('trackback'); + + list($ipA,$ipB,$ipC,$ipD) = explode('.',$_SERVER['REMOTE_ADDR']); + $ipaddress = $ipA.'.'.$ipB.'.'.$ipC; + + // 제목과 블로그이름이 동일할 경우 최근 6시간내의 ip를 조사하여 삭제하고 금지ip로 등록 + if($obj->title == $obj->excerpt) { + $oTrackbackController->deleteTrackbackSender(60*60*6, $ipaddress, $obj->url, $obj->blog_name, $obj->title, $obj->excerpt); + $this->insertIP($ipaddress.'.*', 'AUTO-DENIED : trackback.insertTrackback'); + return new Object(-1,'msg_alert_trackback_denied'); + } + + // 30분 이내에 1개 이상의 한 C클래스의 ip에서 엮인글 등록 시도시 금지 아이피로 지정하고 해당 ip의 글을 모두 삭제 + /* 호스팅 환경을 감안하여 일단 이 부분은 동작하지 않도록 주석 처리 + $count = $oTrackbackModel->getRegistedTrackback(30*60, $ipaddress, $obj->url, $obj->blog_name, $obj->title, $obj->excerpt); + if($count > 1) { + $oTrackbackController->deleteTrackbackSender(3*60, $ipaddress, $obj->url, $obj->blog_name, $obj->title, $obj->excerpt); + $this->insertIP($ipaddress.'.*'); + return new Object(-1,'msg_alert_trackback_denied'); + } + */ + + return new Object(); + } + + /** + * @brief IP 등록 + * 등록된 IP는 스패머로 간주 + **/ + function insertIP($ipaddress, $description = null) { + $args->ipaddress = $ipaddress; + if($description) $args->description = $description; + + return executeQuery('spamfilter.insertDeniedIP', $args); + } + + /** + * @brief 로그 등록 + * 현 접속 IP를 로그에 등록, 로그의 간격이 특정 시간 이내일 경우 도배로 간주하여 + * 스패머로 등록할 수 있음 + **/ + function insertLog() { + $output = executeQuery('spamfilter.insertLog'); + return $output; + } + } +?> diff --git a/modules/spamfilter/spamfilter.model.php b/modules/spamfilter/spamfilter.model.php index 263302aff..6d535c6dd 100644 --- a/modules/spamfilter/spamfilter.model.php +++ b/modules/spamfilter/spamfilter.model.php @@ -1,150 +1,150 @@ -getModuleConfig('spamfilter'); - } - - /** - * @brief 등록된 금지 IP의 목록을 return - **/ - function getDeniedIPList() { - $args->sort_index = "regdate"; - $args->page = Context::get('page')?Context::get('page'):1; - $output = executeQuery('spamfilter.getDeniedIPList', $args); - if(!$output->data) return; - if(!is_array($output->data)) return array($output->data); - return $output->data; - } - - /** - * @brief 인자로 넘겨진 ipaddress가 금지 ip인지 체크하여 return - **/ - function isDeniedIP() { - $ipaddress = $_SERVER['REMOTE_ADDR']; - - $ip_list = $this->getDeniedIPList(); - if(!count($ip_list)) return new Object(); - - $count = count($ip_list); - $patterns = array(); - for($i=0;$i<$count;$i++) { - $ip = str_replace('*','',$ip_list[$i]->ipaddress); - $patterns[] = preg_quote($ip); - } - - $pattern = '/^('.implode($patterns,'|').')/'; - - if(preg_match($pattern, $ipaddress, $matches)) return new Object(-1,'msg_alert_registered_denied_ip'); - - return new Object(); - } - - /** - * @brief 등록된 금지 Word 의 목록을 return - **/ - function getDeniedWordList() { - $args->sort_index = "hit"; - $output = executeQuery('spamfilter.getDeniedWordList', $args); - if(!$output->data) return; - if(!is_array($output->data)) return array($output->data); - return $output->data; - } - - /** - * @brief 넘어온 text에 금지 단어가 있는지 확인 - **/ - function isDeniedWord($text) { - $word_list = $this->getDeniedWordList(); - if(!count($word_list)) return new Object(); - - $count = count($word_list); - for($i=0;$i<$count;$i++) { - $word = $word_list[$i]->word; - if(preg_match('/'.preg_quote($word,'/').'/is', $text)) { - $args->word = $word; - $output = executeQuery('spamfilter.updateDeniedWordHit', $args); - return new Object(-1,sprintf(Context::getLang('msg_alert_denied_word'), $word)); - } - } - - return new Object(); - } - - /** - * @brief 지정된 시간을 체크 - **/ - function checkLimited() { - $config = $this->getConfig(); - $limit_count = $config->limit_count?$config->limit_count:5; - $interval = $config->interval; - if(!$interval) return new Object(); - - $count = $this->getLogCount($interval); - - $ipaddress = $_SERVER['REMOTE_ADDR']; - - // 정해진 시간보다 클 경우 금지 ip로 등록 - if($count>=$limit_count) { - $oSpamFilterController = &getController('spamfilter'); - $oSpamFilterController->insertIP($ipaddress, 'AUTO-DENIED : Over limit'); - return new Object(-1, 'msg_alert_registered_denied_ip'); - } - - // 제한 글수까지는 아니지만 정해진 시간내에 글 작성을 계속 할때 - if($count) { - $message = sprintf(Context::getLang('msg_alert_limited_by_config'), $interval); - - $oSpamFilterController = &getController('spamfilter'); - $oSpamFilterController->insertLog(); - - return new Object(-1, $message); - } - - return new Object(); - } - - /** - * @brief 특정 글에 이미 엮인글이 등록되어 있는지 확인 - **/ - function isInsertedTrackback($document_srl) { - $oTrackbackModel = &getModel('trackback'); - $count = $oTrackbackModel->getTrackbackCountByIPAddress($document_srl, $_SERVER['REMOTE_ADDR']); - if($count>0) return new Object(-1, 'msg_alert_trackback_denied'); - - return new Object(); - } - - /** - * @brief 지정된 IPaddress의 특정 시간대 내의 로그 수를 return - **/ - function getLogCount($time = 60, $ipaddress='') { - if(!$ipaddress) $ipaddress = $_SERVER['REMOTE_ADDR']; - - $args->ipaddress = $ipaddress; - $args->regdate = date("YmdHis", time()-$time); - $output = executeQuery('spamfilter.getLogCount', $args); - $count = $output->data->count; - return $count; - } - - - } -?> +getModuleConfig('spamfilter'); + } + + /** + * @brief 등록된 금지 IP의 목록을 return + **/ + function getDeniedIPList() { + $args->sort_index = "regdate"; + $args->page = Context::get('page')?Context::get('page'):1; + $output = executeQuery('spamfilter.getDeniedIPList', $args); + if(!$output->data) return; + if(!is_array($output->data)) return array($output->data); + return $output->data; + } + + /** + * @brief 인자로 넘겨진 ipaddress가 금지 ip인지 체크하여 return + **/ + function isDeniedIP() { + $ipaddress = $_SERVER['REMOTE_ADDR']; + + $ip_list = $this->getDeniedIPList(); + if(!count($ip_list)) return new Object(); + + $count = count($ip_list); + $patterns = array(); + for($i=0;$i<$count;$i++) { + $ip = str_replace('*','',$ip_list[$i]->ipaddress); + $patterns[] = preg_quote($ip); + } + + $pattern = '/^('.implode($patterns,'|').')/'; + + if(preg_match($pattern, $ipaddress, $matches)) return new Object(-1,'msg_alert_registered_denied_ip'); + + return new Object(); + } + + /** + * @brief 등록된 금지 Word 의 목록을 return + **/ + function getDeniedWordList() { + $args->sort_index = "hit"; + $output = executeQuery('spamfilter.getDeniedWordList', $args); + if(!$output->data) return; + if(!is_array($output->data)) return array($output->data); + return $output->data; + } + + /** + * @brief 넘어온 text에 금지 단어가 있는지 확인 + **/ + function isDeniedWord($text) { + $word_list = $this->getDeniedWordList(); + if(!count($word_list)) return new Object(); + + $count = count($word_list); + for($i=0;$i<$count;$i++) { + $word = $word_list[$i]->word; + if(preg_match('/'.preg_quote($word,'/').'/is', $text)) { + $args->word = $word; + $output = executeQuery('spamfilter.updateDeniedWordHit', $args); + return new Object(-1,sprintf(Context::getLang('msg_alert_denied_word'), $word)); + } + } + + return new Object(); + } + + /** + * @brief 지정된 시간을 체크 + **/ + function checkLimited() { + $config = $this->getConfig(); + $limit_count = $config->limit_count?$config->limit_count:5; + $interval = $config->interval; + if(!$interval) return new Object(); + + $count = $this->getLogCount($interval); + + $ipaddress = $_SERVER['REMOTE_ADDR']; + + // 정해진 시간보다 클 경우 금지 ip로 등록 + if($count>=$limit_count) { + $oSpamFilterController = &getController('spamfilter'); + $oSpamFilterController->insertIP($ipaddress, 'AUTO-DENIED : Over limit'); + return new Object(-1, 'msg_alert_registered_denied_ip'); + } + + // 제한 글수까지는 아니지만 정해진 시간내에 글 작성을 계속 할때 + if($count) { + $message = sprintf(Context::getLang('msg_alert_limited_by_config'), $interval); + + $oSpamFilterController = &getController('spamfilter'); + $oSpamFilterController->insertLog(); + + return new Object(-1, $message); + } + + return new Object(); + } + + /** + * @brief 특정 글에 이미 엮인글이 등록되어 있는지 확인 + **/ + function isInsertedTrackback($document_srl) { + $oTrackbackModel = &getModel('trackback'); + $count = $oTrackbackModel->getTrackbackCountByIPAddress($document_srl, $_SERVER['REMOTE_ADDR']); + if($count>0) return new Object(-1, 'msg_alert_trackback_denied'); + + return new Object(); + } + + /** + * @brief 지정된 IPaddress의 특정 시간대 내의 로그 수를 return + **/ + function getLogCount($time = 60, $ipaddress='') { + if(!$ipaddress) $ipaddress = $_SERVER['REMOTE_ADDR']; + + $args->ipaddress = $ipaddress; + $args->regdate = date("YmdHis", time()-$time); + $output = executeQuery('spamfilter.getLogCount', $args); + $count = $output->data->count; + return $count; + } + + + } +?> diff --git a/modules/syndication/conf/info.xml b/modules/syndication/conf/info.xml index 0b5179c48..59994825c 100644 --- a/modules/syndication/conf/info.xml +++ b/modules/syndication/conf/info.xml @@ -1,18 +1,18 @@ - - - Syndication - 聯合供搞 - İçerik Paylaşımı - 검색서비스업체와 직접 통신을 통해 컨텐츠를 잘 검색되도록 하는 Syndication 규약을 따라 정보를 주고받는 모듈 - 검색서비스업체와 직접 통신을 통해 컨텐츠를 잘 검색되도록 하는 Syndication 규약을 따라 정보를 주고받는 모듈 - 검색서비스업체와 직접 통신을 통해 컨텐츠를 잘 검색되도록 하는 Syndication 규약을 따라 정보를 주고받는 모듈 - 1.0.1 - 2010-06-23 - interlock - - - NHN - NHN - NHN - - + + + Syndication + 聯合供搞 + İçerik Paylaşımı + 검색서비스업체와 직접 통신을 통해 컨텐츠를 잘 검색되도록 하는 Syndication 규약을 따라 정보를 주고받는 모듈 + 검색서비스업체와 직접 통신을 통해 컨텐츠를 잘 검색되도록 하는 Syndication 규약을 따라 정보를 주고받는 모듈 + 검색서비스업체와 직접 통신을 통해 컨텐츠를 잘 검색되도록 하는 Syndication 규약을 따라 정보를 주고받는 모듈 + 1.0.1 + 2010-06-23 + interlock + + + NHN + NHN + NHN + + diff --git a/modules/syndication/syndication.admin.controller.php b/modules/syndication/syndication.admin.controller.php index d370c10db..d4cb3f8fb 100644 --- a/modules/syndication/syndication.admin.controller.php +++ b/modules/syndication/syndication.admin.controller.php @@ -1,133 +1,133 @@ -target_services = explode('|@|',Context::get('target_services')); - $config->site_url = preg_replace('/\/+$/is','',Context::get('site_url')); - $config->year = Context::get('year'); - if(!$config->site_url) return new Object(-1,'msg_site_url_is_null'); - - $oModuleController->insertModuleConfig('syndication',$config); - $oSyndicationController->ping($oSyndicationModel->getID('site'), 'site'); - - $except_module = Context::get('except_module'); - $output = executeQuery('syndication.deleteExceptModules'); - if(!$output->toBool()) return $output; - - $modules = explode(',',$except_module); - for($i=0,$c=count($modules);$i<$c;$i++) { - $args->module_srl = $modules[$i]; - $output = executeQuery('syndication.insertExceptModule',$args); - if(!$output->toBool()) return $output; - } - - $this->setMessage('success_applied'); - } - - function procSyndicationAdminCheckSitePingResult(){ - $site_url = trim(Context::get('site_url')); - if(!$site_url) return new Object(-1,'msg_invalid_request'); - - $oSyndicationModel = &getModel('syndication'); - - $id = $oSyndicationModel->getID('site'); - if(substr($site_url,-1)!='/') $site_url .= '/'; - $site_ping = sprintf('http://%s?module=syndication&act=getSyndicationList&id=%s&type=site', $site_url, $id); - - $headers = array(); - $headers['Connection'] = 'TE, close'; - $headers['User-Agent'] = 'Mozilla/4.0 (compatible; NaverBot/1.0; http://help.naver.com/customer_webtxt_02.jsp)'; - - $xml = FileHandler::getRemoteResource($site_ping, null, 3, 'GET', '', $headers); - if(!$xml) return new Object(-1, 'msg_ping_test_error'); - - $oXmlParser = new XmlParser(); - $oXml = $oXmlParser->parse($xml); - - if(!$oXml || !is_object($oXml) || !$oXml->entry || !$oXml->entry->id || !$oXml->entry->title) { - $this->setMessage('msg_ping_test_error'); - $this->add('ping_result',$xml); - }else{ - $this->setMessage('msg_success_ping_test'); - } - } - - function procSyndicationAdminCheckApiStatus(){ - $target_service = Context::get('target_service'); - if(!$target_service) return new Object(-1,'msg_invalid_request'); - - $status_url = trim($this->statuses[$target_service]); - if(!$status_url) return new Object(-1,'msg_syndication_status_not_support'); - - $oModuleModel = &getModel('module'); - - $config = $oModuleModel->getModuleConfig('syndication'); - $site_url = preg_replace('/^(http|https):\/\//i','',$config->site_url); - - $method = 'getSyndicationStatus' . ucfirst(strtolower($target_service)); - if(!method_exists(&$this, $method)) return new Object(-1,'msg_syndication_status_not_support'); - - $output = call_user_func(array(&$this,$method),$site_url); - if(!$output->toBool()) return $output; - - $this->add('result_status',$output->get('result_status')); - } - - function getSyndicationStatusNaver($site_url){ - $status_url = trim($this->statuses['Naver']); - - $xml = FileHandler::getRemoteResource(sprintf($status_url,$site_url), null, 3, 'GET', 'application/xml'); - $oXmlParser = new XmlParser(); - $oXml = $oXmlParser->parse($xml); - $oStatus = $oXml->syndication_status; - - if($oStatus->error->body != 0) return new Object(-1,$oStatus->message->body); - - $result->site_name = $oStatus->site_name->body; - $result->first_update = $oStatus->first_update->body; - $result->last_update = $oStatus->last_update->body; - $result->visit_ok_count = $oStatus->visit_ok_count->body; - $result->visit_fail_count = $oStatus->visit_fail_count->body; - $result->status = $oStatus->status->body; - - if(!$oStatus->sync || !$oStatus->sync->article){ - $oArticleList = array(); - }else{ - $oArticleList = $oStatus->sync->article; - if(!is_array($oArticleList)) $oArticleList = array($oArticleList); - } - - if(count($oArticleList)>0){ - $article_count = array(); - foreach($oArticleList as $article){ - $article_count[$article->attrs->date] = $article->body; - } - - $result->article_count = $article_count; - $result->max_article_count = max($result->article_count); - - } - - Context::set('result', $result); - $oTemplateHandler = &TemplateHandler::getInstance(); - $html = $oTemplateHandler->compile($this->module_path.'tpl', 'naver_result'); - - $output = new Object(); - $output->add('result_status', $html); - return $output; - } - } -?> +target_services = explode('|@|',Context::get('target_services')); + $config->site_url = preg_replace('/\/+$/is','',Context::get('site_url')); + $config->year = Context::get('year'); + if(!$config->site_url) return new Object(-1,'msg_site_url_is_null'); + + $oModuleController->insertModuleConfig('syndication',$config); + $oSyndicationController->ping($oSyndicationModel->getID('site'), 'site'); + + $except_module = Context::get('except_module'); + $output = executeQuery('syndication.deleteExceptModules'); + if(!$output->toBool()) return $output; + + $modules = explode(',',$except_module); + for($i=0,$c=count($modules);$i<$c;$i++) { + $args->module_srl = $modules[$i]; + $output = executeQuery('syndication.insertExceptModule',$args); + if(!$output->toBool()) return $output; + } + + $this->setMessage('success_applied'); + } + + function procSyndicationAdminCheckSitePingResult(){ + $site_url = trim(Context::get('site_url')); + if(!$site_url) return new Object(-1,'msg_invalid_request'); + + $oSyndicationModel = &getModel('syndication'); + + $id = $oSyndicationModel->getID('site'); + if(substr($site_url,-1)!='/') $site_url .= '/'; + $site_ping = sprintf('http://%s?module=syndication&act=getSyndicationList&id=%s&type=site', $site_url, $id); + + $headers = array(); + $headers['Connection'] = 'TE, close'; + $headers['User-Agent'] = 'Mozilla/4.0 (compatible; NaverBot/1.0; http://help.naver.com/customer_webtxt_02.jsp)'; + + $xml = FileHandler::getRemoteResource($site_ping, null, 3, 'GET', '', $headers); + if(!$xml) return new Object(-1, 'msg_ping_test_error'); + + $oXmlParser = new XmlParser(); + $oXml = $oXmlParser->parse($xml); + + if(!$oXml || !is_object($oXml) || !$oXml->entry || !$oXml->entry->id || !$oXml->entry->title) { + $this->setMessage('msg_ping_test_error'); + $this->add('ping_result',$xml); + }else{ + $this->setMessage('msg_success_ping_test'); + } + } + + function procSyndicationAdminCheckApiStatus(){ + $target_service = Context::get('target_service'); + if(!$target_service) return new Object(-1,'msg_invalid_request'); + + $status_url = trim($this->statuses[$target_service]); + if(!$status_url) return new Object(-1,'msg_syndication_status_not_support'); + + $oModuleModel = &getModel('module'); + + $config = $oModuleModel->getModuleConfig('syndication'); + $site_url = preg_replace('/^(http|https):\/\//i','',$config->site_url); + + $method = 'getSyndicationStatus' . ucfirst(strtolower($target_service)); + if(!method_exists(&$this, $method)) return new Object(-1,'msg_syndication_status_not_support'); + + $output = call_user_func(array(&$this,$method),$site_url); + if(!$output->toBool()) return $output; + + $this->add('result_status',$output->get('result_status')); + } + + function getSyndicationStatusNaver($site_url){ + $status_url = trim($this->statuses['Naver']); + + $xml = FileHandler::getRemoteResource(sprintf($status_url,$site_url), null, 3, 'GET', 'application/xml'); + $oXmlParser = new XmlParser(); + $oXml = $oXmlParser->parse($xml); + $oStatus = $oXml->syndication_status; + + if($oStatus->error->body != 0) return new Object(-1,$oStatus->message->body); + + $result->site_name = $oStatus->site_name->body; + $result->first_update = $oStatus->first_update->body; + $result->last_update = $oStatus->last_update->body; + $result->visit_ok_count = $oStatus->visit_ok_count->body; + $result->visit_fail_count = $oStatus->visit_fail_count->body; + $result->status = $oStatus->status->body; + + if(!$oStatus->sync || !$oStatus->sync->article){ + $oArticleList = array(); + }else{ + $oArticleList = $oStatus->sync->article; + if(!is_array($oArticleList)) $oArticleList = array($oArticleList); + } + + if(count($oArticleList)>0){ + $article_count = array(); + foreach($oArticleList as $article){ + $article_count[$article->attrs->date] = $article->body; + } + + $result->article_count = $article_count; + $result->max_article_count = max($result->article_count); + + } + + Context::set('result', $result); + $oTemplateHandler = &TemplateHandler::getInstance(); + $html = $oTemplateHandler->compile($this->module_path.'tpl', 'naver_result'); + + $output = new Object(); + $output->add('result_status', $html); + return $output; + } + } +?> diff --git a/modules/syndication/syndication.admin.view.php b/modules/syndication/syndication.admin.view.php index be6a441fb..5c45b1400 100644 --- a/modules/syndication/syndication.admin.view.php +++ b/modules/syndication/syndication.admin.view.php @@ -1,50 +1,50 @@ -getModuleConfig('syndication'); - if(!$module_config->target_services) $module_config->target_services = array(); - - foreach($this->services as $key => $val) { - unset($obj); - $obj->service = $key; - $obj->ping = $val; - $obj->selected = in_array($key, $module_config->target_services)?true:false; - $services[] = $obj; - } - Context::set('services', $services); - - if(!$module_config->site_url) { - $module_config->site_url = Context::getDefaultUrl()?Context::getDefaultUrl():getFullUrl(); - } - Context::set('site_url', preg_replace('/^(http|https):\/\//i','',$module_config->site_url)); - - if(!$module_config->year) { - $module_config->year = date("Y"); - } - Context::set('year', $module_config->year); - - $output = executeQueryArray('syndication.getExceptModules'); - $except_module_list = array(); - for($i=0,$c=count($output->data);$i<$c;$i++) { - $except_module_list[] = $output->data[$i]; - } - Context::set('except_module', $except_module_list); - - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('config'); - } - - } -?> +getModuleConfig('syndication'); + if(!$module_config->target_services) $module_config->target_services = array(); + + foreach($this->services as $key => $val) { + unset($obj); + $obj->service = $key; + $obj->ping = $val; + $obj->selected = in_array($key, $module_config->target_services)?true:false; + $services[] = $obj; + } + Context::set('services', $services); + + if(!$module_config->site_url) { + $module_config->site_url = Context::getDefaultUrl()?Context::getDefaultUrl():getFullUrl(); + } + Context::set('site_url', preg_replace('/^(http|https):\/\//i','',$module_config->site_url)); + + if(!$module_config->year) { + $module_config->year = date("Y"); + } + Context::set('year', $module_config->year); + + $output = executeQueryArray('syndication.getExceptModules'); + $except_module_list = array(); + for($i=0,$c=count($output->data);$i<$c;$i++) { + $except_module_list[] = $output->data[$i]; + } + Context::set('except_module', $except_module_list); + + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('config'); + } + + } +?> diff --git a/modules/syndication/syndication.class.php b/modules/syndication/syndication.class.php index eb2bfa9f7..b23c33df6 100644 --- a/modules/syndication/syndication.class.php +++ b/modules/syndication/syndication.class.php @@ -1,74 +1,74 @@ - 'http://syndication.openapi.naver.com/ping/', - ); - - var $statuses = array( - 'Naver' => 'http://syndication.openapi.naver.com/status/?site=%s', - ); - - function moduleInstall() { - $oModuleController = &getController('module'); - $oModuleController->insertTrigger('document.insertDocument', 'syndication', 'controller', 'triggerInsertDocument', 'after'); - $oModuleController->insertTrigger('document.updateDocument', 'syndication', 'controller', 'triggerUpdateDocument', 'after'); - $oModuleController->insertTrigger('document.deleteDocument', 'syndication', 'controller', 'triggerDeleteDocument', 'after'); - $oModuleController->insertTrigger('module.deleteModule', 'syndication', 'controller', 'triggerDeleteModule', 'after'); - - $oModuleController->insertTrigger('document.moveDocumentToTrash', 'syndication', 'controller', 'triggerMoveDocumentToTrash', 'after'); - $oModuleController->insertTrigger('document.restoreTrash', 'syndication', 'controller', 'triggerRestoreTrash', 'after'); - - $oAddonAdminModel = &getAdminModel('addon'); - if($oAddonAdminModel->getAddonInfoXml('catpcha')){ - $oAddonAdminController = &addonAdminController::getInstance(); - $oAddonAdminController->doActivate('catpcha'); - $oAddonAdminController->makeCacheFile(); - } - } - - function checkUpdate() { - $oModuleModel = &getModel('module'); - if(!$oModuleModel->getTrigger('document.moveDocumentToTrash', 'syndication', 'controller', 'triggerMoveDocumentToTrash', 'after')) return true; - if(!$oModuleModel->getTrigger('document.restoreTrash', 'syndication', 'controller', 'triggerRestoreTrash', 'after')) return true; - - return false; - } - - function moduleUpdate() { - $oModuleModel = &getModel('module'); - $oModuleController = &getController('module'); - - if(!$oModuleModel->getTrigger('document.moveDocumentToTrash', 'syndication', 'controller', 'triggerMoveDocumentToTrash', 'after')){ - $oModuleController->insertTrigger('document.moveDocumentToTrash', 'syndication', 'controller', 'triggerMoveDocumentToTrash', 'after'); - } - if(!$oModuleModel->getTrigger('document.restoreTrash', 'syndication', 'controller', 'triggerRestoreTrash', 'after')){ - $oModuleController->insertTrigger('document.restoreTrash', 'syndication', 'controller', 'triggerRestoreTrash', 'after'); - } - - $oAddonAdminModel = &getAdminModel('addon'); - if($oAddonAdminModel->getAddonInfoXml('catpcha')){ - $oAddonAdminController = &addonAdminController::getInstance(); - $oAddonAdminController->doActivate('catpcha'); - $oAddonAdminController->makeCacheFile(); - } - - } - - function recompileCache() { - } - } -?> + 'http://syndication.openapi.naver.com/ping/', + ); + + var $statuses = array( + 'Naver' => 'http://syndication.openapi.naver.com/status/?site=%s', + ); + + function moduleInstall() { + $oModuleController = &getController('module'); + $oModuleController->insertTrigger('document.insertDocument', 'syndication', 'controller', 'triggerInsertDocument', 'after'); + $oModuleController->insertTrigger('document.updateDocument', 'syndication', 'controller', 'triggerUpdateDocument', 'after'); + $oModuleController->insertTrigger('document.deleteDocument', 'syndication', 'controller', 'triggerDeleteDocument', 'after'); + $oModuleController->insertTrigger('module.deleteModule', 'syndication', 'controller', 'triggerDeleteModule', 'after'); + + $oModuleController->insertTrigger('document.moveDocumentToTrash', 'syndication', 'controller', 'triggerMoveDocumentToTrash', 'after'); + $oModuleController->insertTrigger('document.restoreTrash', 'syndication', 'controller', 'triggerRestoreTrash', 'after'); + + $oAddonAdminModel = &getAdminModel('addon'); + if($oAddonAdminModel->getAddonInfoXml('catpcha')){ + $oAddonAdminController = &addonAdminController::getInstance(); + $oAddonAdminController->doActivate('catpcha'); + $oAddonAdminController->makeCacheFile(); + } + } + + function checkUpdate() { + $oModuleModel = &getModel('module'); + if(!$oModuleModel->getTrigger('document.moveDocumentToTrash', 'syndication', 'controller', 'triggerMoveDocumentToTrash', 'after')) return true; + if(!$oModuleModel->getTrigger('document.restoreTrash', 'syndication', 'controller', 'triggerRestoreTrash', 'after')) return true; + + return false; + } + + function moduleUpdate() { + $oModuleModel = &getModel('module'); + $oModuleController = &getController('module'); + + if(!$oModuleModel->getTrigger('document.moveDocumentToTrash', 'syndication', 'controller', 'triggerMoveDocumentToTrash', 'after')){ + $oModuleController->insertTrigger('document.moveDocumentToTrash', 'syndication', 'controller', 'triggerMoveDocumentToTrash', 'after'); + } + if(!$oModuleModel->getTrigger('document.restoreTrash', 'syndication', 'controller', 'triggerRestoreTrash', 'after')){ + $oModuleController->insertTrigger('document.restoreTrash', 'syndication', 'controller', 'triggerRestoreTrash', 'after'); + } + + $oAddonAdminModel = &getAdminModel('addon'); + if($oAddonAdminModel->getAddonInfoXml('catpcha')){ + $oAddonAdminController = &addonAdminController::getInstance(); + $oAddonAdminController->doActivate('catpcha'); + $oAddonAdminController->makeCacheFile(); + } + + } + + function recompileCache() { + } + } +?> diff --git a/modules/syndication/syndication.controller.php b/modules/syndication/syndication.controller.php index fcdf4b979..d00d59d7e 100644 --- a/modules/syndication/syndication.controller.php +++ b/modules/syndication/syndication.controller.php @@ -1,127 +1,127 @@ -module_srl < 1) return new Object(); - - $oSyndicationModel = &getModel('syndication'); - $oModuleModel = &getModel('module'); - - if($oSyndicationModel->isExceptedModules($obj->module_srl)) return new Object(); - - $config = $oModuleModel->getModuleConfig('syndication'); - - $id = $oSyndicationModel->getID('channel', $obj->module_srl); - $this->ping($id, 'article'); - - return new Object(); - } - - function triggerUpdateDocument(&$obj) { - if($obj->module_srl < 1) return new Object(); - - $oSyndicationModel = &getModel('syndication'); - $oModuleModel = &getModel('module'); - - if($oSyndicationModel->isExceptedModules($obj->module_srl)) return new Object(); - - $config = $oModuleModel->getModuleConfig('syndication'); - - $id = $oSyndicationModel->getID('channel', $obj->module_srl); - $this->ping($id, 'article'); - - return new Object(); - } - - function triggerDeleteDocument(&$obj) { - if($obj->module_srl < 1) return new Object(); - - $oSyndicationModel = &getModel('syndication'); - $oModuleModel = &getModel('module'); - - if($oSyndicationModel->isExceptedModules($obj->module_srl)) return new Object(); - - $this->insertLog($obj->module_srl, $obj->document_srl, $obj->title, $obj->content); - - $id = $oSyndicationModel->getID('channel', $obj->module_srl); - $this->ping($id, 'deleted'); - - return new Object(); - } - - function triggerDeleteModule(&$obj) { - $oSyndicationModel = &getModel('syndication'); - $oModuleModel = &getModel('module'); - - if($oSyndicationModel->isExceptedModules($obj->module_srl)) return new Object(); - - $this->insertLog($obj->module_srl, $obj->document_srl, $obj->title, $obj->content); - - $output = executeQuery('syndication.getExceptModule', $obj); - if($output->data->count) return new Object(); - - $id = $oSyndicationModel->getID('site', $obj->module_srl); - $this->ping($id, 'deleted'); - - return new Object(); - } - - function triggerMoveDocumentToTrash(&$obj) { - $document_srl = $obj->document_srl; - $module_srl = $obj->module_srl; - - $oSyndicationModel = &getModel('syndication'); - $oModuleModel = &getModel('module'); - - if($oSyndicationModel->isExceptedModules($module_srl)) return new Object(); - - $id = $oSyndicationModel->getID('channel', $module_srl); - $this->ping($id, 'deleted'); - - return new Object(); - } - - function triggerRestoreTrash(&$obj) { - $document_srl = $obj->document_srl; - $module_srl = $obj->module_srl; - - $oSyndicationModel = &getModel('syndication'); - $oModuleModel = &getModel('module'); - - if($oSyndicationModel->isExceptedModules($module_srl)) return new Object(); - - $id = $oSyndicationModel->getID('article', $module_srl.'-'.$document_srl); - $this->ping($id, 'article'); - - return new Object(); - } - - function insertLog($module_srl, $document_srl, $title = null, $summary = null) { - $args->module_srl = $module_srl; - $args->document_srl = $document_srl; - $args->title = $title; - $args->summary = $summary; - $output = executeQuery('syndication.insertLog', $args); - } - - function ping($id, $type) { - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('syndication'); - - if(!count($config->target_services)) return; - if(substr($config->site_url,-1)!='/') $config->site_url .= '/'; - foreach($config->target_services as $key => $val) { - $ping_url = trim($this->services[$val]); - if(!$ping_url) continue; - $ping_body = sprintf('http://%s?module=syndication&act=getSyndicationList&id=%s&type=%s', $config->site_url, $id, $type); - FileHandler::getRemoteResource($ping_url, null, 3, 'POST', 'application/x-www-form-urlencoded', array(), array(), array('link'=>$ping_body)); - } - } - } -?> +module_srl < 1) return new Object(); + + $oSyndicationModel = &getModel('syndication'); + $oModuleModel = &getModel('module'); + + if($oSyndicationModel->isExceptedModules($obj->module_srl)) return new Object(); + + $config = $oModuleModel->getModuleConfig('syndication'); + + $id = $oSyndicationModel->getID('channel', $obj->module_srl); + $this->ping($id, 'article'); + + return new Object(); + } + + function triggerUpdateDocument(&$obj) { + if($obj->module_srl < 1) return new Object(); + + $oSyndicationModel = &getModel('syndication'); + $oModuleModel = &getModel('module'); + + if($oSyndicationModel->isExceptedModules($obj->module_srl)) return new Object(); + + $config = $oModuleModel->getModuleConfig('syndication'); + + $id = $oSyndicationModel->getID('channel', $obj->module_srl); + $this->ping($id, 'article'); + + return new Object(); + } + + function triggerDeleteDocument(&$obj) { + if($obj->module_srl < 1) return new Object(); + + $oSyndicationModel = &getModel('syndication'); + $oModuleModel = &getModel('module'); + + if($oSyndicationModel->isExceptedModules($obj->module_srl)) return new Object(); + + $this->insertLog($obj->module_srl, $obj->document_srl, $obj->title, $obj->content); + + $id = $oSyndicationModel->getID('channel', $obj->module_srl); + $this->ping($id, 'deleted'); + + return new Object(); + } + + function triggerDeleteModule(&$obj) { + $oSyndicationModel = &getModel('syndication'); + $oModuleModel = &getModel('module'); + + if($oSyndicationModel->isExceptedModules($obj->module_srl)) return new Object(); + + $this->insertLog($obj->module_srl, $obj->document_srl, $obj->title, $obj->content); + + $output = executeQuery('syndication.getExceptModule', $obj); + if($output->data->count) return new Object(); + + $id = $oSyndicationModel->getID('site', $obj->module_srl); + $this->ping($id, 'deleted'); + + return new Object(); + } + + function triggerMoveDocumentToTrash(&$obj) { + $document_srl = $obj->document_srl; + $module_srl = $obj->module_srl; + + $oSyndicationModel = &getModel('syndication'); + $oModuleModel = &getModel('module'); + + if($oSyndicationModel->isExceptedModules($module_srl)) return new Object(); + + $id = $oSyndicationModel->getID('channel', $module_srl); + $this->ping($id, 'deleted'); + + return new Object(); + } + + function triggerRestoreTrash(&$obj) { + $document_srl = $obj->document_srl; + $module_srl = $obj->module_srl; + + $oSyndicationModel = &getModel('syndication'); + $oModuleModel = &getModel('module'); + + if($oSyndicationModel->isExceptedModules($module_srl)) return new Object(); + + $id = $oSyndicationModel->getID('article', $module_srl.'-'.$document_srl); + $this->ping($id, 'article'); + + return new Object(); + } + + function insertLog($module_srl, $document_srl, $title = null, $summary = null) { + $args->module_srl = $module_srl; + $args->document_srl = $document_srl; + $args->title = $title; + $args->summary = $summary; + $output = executeQuery('syndication.insertLog', $args); + } + + function ping($id, $type) { + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('syndication'); + + if(!count($config->target_services)) return; + if(substr($config->site_url,-1)!='/') $config->site_url .= '/'; + foreach($config->target_services as $key => $val) { + $ping_url = trim($this->services[$val]); + if(!$ping_url) continue; + $ping_body = sprintf('http://%s?module=syndication&act=getSyndicationList&id=%s&type=%s', $config->site_url, $id, $type); + FileHandler::getRemoteResource($ping_url, null, 3, 'POST', 'application/x-www-form-urlencoded', array(), array(), array('link'=>$ping_body)); + } + } + } +?> diff --git a/modules/syndication/syndication.model.php b/modules/syndication/syndication.model.php index 728295155..42c2a02c8 100644 --- a/modules/syndication/syndication.model.php +++ b/modules/syndication/syndication.model.php @@ -1,363 +1,363 @@ -getModuleConfig('syndication'); - $this->site_url = preg_replace('/\/+$/is','',$config->site_url); - $this->target_services = $config->target_services; - $this->year = $config->year; - - $output = executeQueryArray('syndication.getGrantedModules'); - if($output->data) { - foreach($output->data as $key => $val) { - $this->granted_modules[] = $val->module_srl; - } - } - } - - function isExceptedModules($module_srl) { - $args->module_srl = $module_srl; - $output = executeQuery('syndication.getExceptModule', $args); - if($output->data->count) return true; - $output = executeQuery('syndication.getGrantedModule', $args); - if($output->data->count) return true; - return false; - - } - - function getLang($key, $site_srl) - { - if(!$this->langs[$site_srl]) - { - $this->langs[$site_srl] = array(); - $args->site_srl = $site_srl; - $args->lang_code = Context::getLangType(); - $output = executeQueryArray("syndication.getLang", $args); - if(!$output->toBool() || !$output->data) return $key; - foreach($output->data as $value) - { - $this->langs[$site_srl][$value->name] = $value->value; - } - } - if($this->langs[$site_srl][$key]) - { - return $this->langs[$site_srl][$key]; - } - else return $key; - } - - function handleLang($title, $site_srl) - { - $matches = null; - if(!preg_match("/\\\$user_lang->(.+)/",$title, $matches)) return $title; - else - { - return $this->getLang($matches[1], $site_srl); - } - } - - function getSyndicationList() { - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('syndication'); - if(!$config->year || !$config->site_url) return new Object(-1,'msg_check_syndication_config'); - - $id = Context::get('id'); - $type = Context::get('type'); - $page = Context::get('page'); - if(!$id || !$type) return new Object(-1,'msg_invalid_request'); - - if(!preg_match('/^tag:([^,]+),([0-9]+):(site|channel|article)(.*)$/i',$id,$matches)) return new Object(-1,'msg_invalid_request'); - - $url = $matches[1]; - $year = $matches[2]; - $target = $matches[3]; - $id = $matches[4]; - if($id && $id{0}==':') $id = substr($id, 1); - - if($id && strpos($id,'-')!==false) list($module_srl, $document_srl) = explode('-',$id); - elseif($id) $module_srl = $id; - if(!$url || !$year || !$target) return new Object(-1,'msg_invalid_request'); - - $startTime = Context::get('start-time'); - $endTime = Context::get('end-time'); - - $time_zone = substr($GLOBALS['_time_zone'],0,3).':'.substr($GLOBALS['_time_zone'],3); - Context::set('time_zone', $time_zone); - - $site_module_info = Context::get('site_module_info'); - - if($target == 'channel' && !$module_srl) $target = 'site'; - if($target == 'channel' && $module_srl) { - $args->module_srls = $module_srl; - $output = executeQuery('syndication.getModules', $args); - $module_info = $output->data; - if($module_info) { - $args->module_srl = $module_srl; - $output = executeQuery('syndication.getExceptModules', $args); - if($output->data->count) $error = 'target is not founded'; - } else $error = 'target is not founded'; - - unset($args); - } - - if(!$error) { - Context::set('target', $target); - Context::set('type', $type); - switch($target) { - case 'site' : - $site_info->id = $this->getID('site'); - $site_info->title = $this->handleLang($site_module_info->browser_title, $site_module_info->site_srl); - - $output = executeQuery('syndication.getSiteUpdatedTime'); - if($output->data) $site_info->updated = date("Y-m-d\\TH:i:s", ztime($output->data->last_update)).$time_zone; - $site_info->self_href = $this->getSelfHref($site_info->id,$type); - $site_info->alternative_href =$this->getAlternativeHref(); - Context::set('site_info', $site_info); - - $this->setTemplateFile('site'); - switch($type) { - case 'channel' : - Context::set('channels', $this->getChannels()); - break; - case 'article' : - Context::set('articles', $this->getArticles(null, $page, $startTime, $endTime, 'article',$site_info->id)); - break; - case 'deleted' : - Context::set('deleted', $this->getDeleted(null, $page, $startTime, $endTime, 'deleted',$site_info->id)); - break; - default : - $this->setTemplateFile('site.info'); - break; - } - break; - case 'channel' : - $channel_info->id = $this->getID('channel', $module_info->module_srl); - $channel_info->title = $this->handleLang($module_info->browser_title, $module_info->site_srl); - $channel_info->updated = date("Y-m-d\\TH:i:s").$time_zone; - $channel_info->self_href = $this->getSelfHref($channel_info->id, $type); - $channel_info->alternative_href = $this->getAlternativeHref($module_info); - $channel_info->summary = $module_info->description; - if($module_info->module == "textyle") - { - $channel_info->type = "blog"; - $channel_info->rss_href = getFullSiteUrl($module_info->domain, '', 'mid', $module_info->mid, 'act', 'rss'); - } - else - { - $channel_info->type = "web"; - } - $output = executeQuery('syndication.getSiteUpdatedTime'); - if($output->data) $channel_info->updated = date("Y-m-d\\TH:i:s", ztime($output->data->last_update)).$time_zone; - Context::set('channel_info', $channel_info); - - $this->setTemplateFile('channel'); - switch($type) { - case 'article' : - Context::set('articles', $this->getArticles($module_srl, $page, $startTime, $endTime, 'article', $channel_info->id)); - break; - case 'deleted' : - Context::set('deleted', $this->getDeleted($module_srl, $page, $startTime, $endTime, 'deleted', $channel_info->id)); - break; - default : - $this->setTemplateFile('channel.info'); - break; - } - break; - - case 'article': - Context::set('article', $this->getArticle($document_srl)); - $this->setTemplateFile('include.articles'); - break; - } - } else { - Context::set('message', $error); - $this->setTemplateFile('error'); - } - - $this->setTemplatePath($this->module_path.'tpl'); - Context::setResponseMethod('XMLRPC'); - } - - function getChannels() { - if($module_srls) $args->module_srls = $module_srls; - if(count($this->granted_modules)) $args->except_module_srls = implode(',',$this->granted_modules); - $output = executeQueryArray('syndication.getModules', $args); - if($output->data) { - foreach($output->data as $module_info) { - unset($obj); - $obj->id = $this->getID('channel', $module_info->module_srl); - $obj->title = $this->handleLang($module_info->browser_title, $module_info->site_srl); - $obj->updated = date("Y-m-d\\TH:i:s").$time_zone; - $obj->self_href = $this->getSelfHref($obj->id, 'channel'); - $obj->alternative_href = $this->getAlternativeHref($module_info); - $obj->summary = $module_info->description; - if($module_info->module == "textyle") - { - $obj->type = "blog"; - $obj->rss_href = getFullSiteUrl($module_info->domain, '', 'mid', $module_info->mid, 'act', 'rss'); - } - else - { - $obj->type = "web"; - } - - $list[] = $obj; - } - } - return $list; - } - - function getArticle($document_srl) { - if($this->site_url==null) $this->init(); - - $oDocumentModel = &getModel('document'); - $oDocument = $oDocumentModel->getDocument($document_srl,false,false); - if(!$oDocument->isExists()) return; - - $val = $oDocument->getObjectVars(); - - $val->id = $this->getID('article', $val->module_srl.'-'.$val->document_srl); - $val->updated = date("Y-m-d\\TH:i:s", ztime($val->last_update)).$GLOBALS['_time_zone']; - $val->alternative_href = getFullSiteUrl($this->site_url, '', 'document_srl', $val->document_srl); - $val->channel_alternative_href = $this->getChannelAlternativeHref($val->module_srl); - $val->channel_id = $this->getID('channel', $val->module_srl.'-'.$val->document_srl); - if(!$val->nick_name) $val->nick_name = $val->user_name; - - return $val; - } - - function getArticles($module_srl = null, $page=1, $startTime = null, $endTime = null, $type = null, $id = null) { - if($this->site_url==null) $this->init(); - - if($module_srl) $args->module_srl = $module_srl; - if($startTime) $args->start_date = $this->getDate($startTime); - if($endTime) $args->end_date = $this->getDate($endTime); - if(count($this->granted_modules)) $args->except_module_srls = implode(',',$this->granted_modules); - $args->page = $page; - $output = executeQueryArray('syndication.getDocumentList', $args); - $cur_page = $output->page_navigation->cur_page; - $total_page = $output->page_navigation->last_page; - - $result->next_url = null; - $result->list = array(); - - if($cur_page<$total_page) { - $next_url = $this->getSelfHref($id, $type); - if($startTime) $next_url .= '&startTime='.$startTime; - if($endTime) $next_url .= '&endTime='.$endTime; - $result->next_url = $next_url.'&page='.($cur_page+1); - } - - if($output->data) { - foreach($output->data as $key => $val) { - $val->id = $this->getID('article', $val->module_srl.'-'.$val->document_srl); - $val->updated = date("Y-m-d\\TH:i:s", ztime($val->last_update)).$GLOBALS['_time_zone']; - $val->alternative_href = getFullSiteUrl($this->site_url, '', 'document_srl', $val->document_srl); - $val->channel_alternative_href = $this->getChannelAlternativeHref($val->module_srl); - $val->channel_id = $this->getID('channel', $val->module_srl.'-'.$val->document_srl); - if(!$val->nick_name) $val->nick_name = $val->user_name; - $output->data[$key] = $val; - } - $result->list = $output->data; - } - return $result; - } - - function getDeleted($module_srl = null, $page = 1, $startTime = null, $endTime = null, $type = null, $id = null) { - if($this->site_url==null) $this->init(); - - if($module_srl) $args->module_srl= $module_srl; - if($startTime) $args->start_date = $this->getDate($startTime); - if($endTime) $args->end_date = $this->getDate($endTime); - $args->page = $page; - - $output = executeQueryArray('syndication.getDeletedList', $args); - - $cur_page = $output->page_navigation->cur_page; - $total_page = $output->page_navigation->last_page; - - $result->next_url = null; - $result->list = array(); - - if($cur_page<$total_page) { - $next_url = $this->getSelfHref($id, $type); - if($startTime) $next_url .= '&startTime='.$startTime; - if($endTime) $next_url .= '&endTime='.$endTime; - $result->next_url = $next_url . '&page='.($cur_page+1); - } - - if($output->data) { - foreach($output->data as $key => $val) { - $val->id = $this->getID('article', $val->module_srl.'-'.$val->document_srl); - $val->deleted = date("Y-m-d\\TH:i:s", ztime($val->regdate)).$GLOBALS['_time_zone']; - $val->alternative_href = getFullSiteUrl($this->site_url, '', 'document_srl', $val->document_srl); - $val->channel_id = $this->getID('channel', $val->module_srl.'-'.$val->document_srl); - $output->data[$key] = $val; - } - $result->list = $output->data; - } - return $result; - } - - function getID($type, $target_id = null) { - if($this->site_url==null) $this->init(); - - return sprintf('tag:%s,%d:%s', $this->site_url, $this->year, $type) . ($target_id?':'.$target_id:''); - } - - function getChannelAlternativeHref($module_srl) { - static $module_info = array(); - if(!isset($module_info[$module_srl])) { - $args->module_srl = $module_srl; - $output = executeQuery('syndication.getModuleSiteInfo', $args); - if($output->data) $module_info[$module_srl] = $output->data; - else $module_info[$module_srl] = null; - } - - if(is_null($module_info[$module_srl])) return $this->site_url; - - $domain = $module_info[$module_srl]->domain; - $url = getFullSiteUrl($domain, '', 'mid', $module_info[$module_srl]->mid); - if(substr($url,0,1)=='/') $domain = 'http://'.$this->site_url.$url; - return $url; - } - - function getSelfHref($id, $type = null) { - if($this->site_url==null) $this->init(); - - return sprintf('http://%s/?module=syndication&act=getSyndicationList&id=%s&type=%s', $this->site_url, $id, $type); - } - - function getAlternativeHref($module_info = null) { - if($this->site_url==null) $this->init(); - - if(!$module_info) return sprintf('http://%s', $this->site_url); - if(!$module_info->site_srl) return getFullUrl('', 'mid', $module_info->mid); - - $domain = $module_info->domain; - $url = getFullSiteUrl($domain, '', 'mid', $module_info->mid); - - if(substr($url,0,1)=='/') $domain = 'http://'.$this->site_url.$url; - return $url; - } - - function getDate($date) { - $time = strtotime($date); - if($time == -1) $time = ztime(str_replace(array('-','T',':'),'',$date)); - return date('YmdHis', $time); - } - } -?> +getModuleConfig('syndication'); + $this->site_url = preg_replace('/\/+$/is','',$config->site_url); + $this->target_services = $config->target_services; + $this->year = $config->year; + + $output = executeQueryArray('syndication.getGrantedModules'); + if($output->data) { + foreach($output->data as $key => $val) { + $this->granted_modules[] = $val->module_srl; + } + } + } + + function isExceptedModules($module_srl) { + $args->module_srl = $module_srl; + $output = executeQuery('syndication.getExceptModule', $args); + if($output->data->count) return true; + $output = executeQuery('syndication.getGrantedModule', $args); + if($output->data->count) return true; + return false; + + } + + function getLang($key, $site_srl) + { + if(!$this->langs[$site_srl]) + { + $this->langs[$site_srl] = array(); + $args->site_srl = $site_srl; + $args->lang_code = Context::getLangType(); + $output = executeQueryArray("syndication.getLang", $args); + if(!$output->toBool() || !$output->data) return $key; + foreach($output->data as $value) + { + $this->langs[$site_srl][$value->name] = $value->value; + } + } + if($this->langs[$site_srl][$key]) + { + return $this->langs[$site_srl][$key]; + } + else return $key; + } + + function handleLang($title, $site_srl) + { + $matches = null; + if(!preg_match("/\\\$user_lang->(.+)/",$title, $matches)) return $title; + else + { + return $this->getLang($matches[1], $site_srl); + } + } + + function getSyndicationList() { + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('syndication'); + if(!$config->year || !$config->site_url) return new Object(-1,'msg_check_syndication_config'); + + $id = Context::get('id'); + $type = Context::get('type'); + $page = Context::get('page'); + if(!$id || !$type) return new Object(-1,'msg_invalid_request'); + + if(!preg_match('/^tag:([^,]+),([0-9]+):(site|channel|article)(.*)$/i',$id,$matches)) return new Object(-1,'msg_invalid_request'); + + $url = $matches[1]; + $year = $matches[2]; + $target = $matches[3]; + $id = $matches[4]; + if($id && $id{0}==':') $id = substr($id, 1); + + if($id && strpos($id,'-')!==false) list($module_srl, $document_srl) = explode('-',$id); + elseif($id) $module_srl = $id; + if(!$url || !$year || !$target) return new Object(-1,'msg_invalid_request'); + + $startTime = Context::get('start-time'); + $endTime = Context::get('end-time'); + + $time_zone = substr($GLOBALS['_time_zone'],0,3).':'.substr($GLOBALS['_time_zone'],3); + Context::set('time_zone', $time_zone); + + $site_module_info = Context::get('site_module_info'); + + if($target == 'channel' && !$module_srl) $target = 'site'; + if($target == 'channel' && $module_srl) { + $args->module_srls = $module_srl; + $output = executeQuery('syndication.getModules', $args); + $module_info = $output->data; + if($module_info) { + $args->module_srl = $module_srl; + $output = executeQuery('syndication.getExceptModules', $args); + if($output->data->count) $error = 'target is not founded'; + } else $error = 'target is not founded'; + + unset($args); + } + + if(!$error) { + Context::set('target', $target); + Context::set('type', $type); + switch($target) { + case 'site' : + $site_info->id = $this->getID('site'); + $site_info->title = $this->handleLang($site_module_info->browser_title, $site_module_info->site_srl); + + $output = executeQuery('syndication.getSiteUpdatedTime'); + if($output->data) $site_info->updated = date("Y-m-d\\TH:i:s", ztime($output->data->last_update)).$time_zone; + $site_info->self_href = $this->getSelfHref($site_info->id,$type); + $site_info->alternative_href =$this->getAlternativeHref(); + Context::set('site_info', $site_info); + + $this->setTemplateFile('site'); + switch($type) { + case 'channel' : + Context::set('channels', $this->getChannels()); + break; + case 'article' : + Context::set('articles', $this->getArticles(null, $page, $startTime, $endTime, 'article',$site_info->id)); + break; + case 'deleted' : + Context::set('deleted', $this->getDeleted(null, $page, $startTime, $endTime, 'deleted',$site_info->id)); + break; + default : + $this->setTemplateFile('site.info'); + break; + } + break; + case 'channel' : + $channel_info->id = $this->getID('channel', $module_info->module_srl); + $channel_info->title = $this->handleLang($module_info->browser_title, $module_info->site_srl); + $channel_info->updated = date("Y-m-d\\TH:i:s").$time_zone; + $channel_info->self_href = $this->getSelfHref($channel_info->id, $type); + $channel_info->alternative_href = $this->getAlternativeHref($module_info); + $channel_info->summary = $module_info->description; + if($module_info->module == "textyle") + { + $channel_info->type = "blog"; + $channel_info->rss_href = getFullSiteUrl($module_info->domain, '', 'mid', $module_info->mid, 'act', 'rss'); + } + else + { + $channel_info->type = "web"; + } + $output = executeQuery('syndication.getSiteUpdatedTime'); + if($output->data) $channel_info->updated = date("Y-m-d\\TH:i:s", ztime($output->data->last_update)).$time_zone; + Context::set('channel_info', $channel_info); + + $this->setTemplateFile('channel'); + switch($type) { + case 'article' : + Context::set('articles', $this->getArticles($module_srl, $page, $startTime, $endTime, 'article', $channel_info->id)); + break; + case 'deleted' : + Context::set('deleted', $this->getDeleted($module_srl, $page, $startTime, $endTime, 'deleted', $channel_info->id)); + break; + default : + $this->setTemplateFile('channel.info'); + break; + } + break; + + case 'article': + Context::set('article', $this->getArticle($document_srl)); + $this->setTemplateFile('include.articles'); + break; + } + } else { + Context::set('message', $error); + $this->setTemplateFile('error'); + } + + $this->setTemplatePath($this->module_path.'tpl'); + Context::setResponseMethod('XMLRPC'); + } + + function getChannels() { + if($module_srls) $args->module_srls = $module_srls; + if(count($this->granted_modules)) $args->except_module_srls = implode(',',$this->granted_modules); + $output = executeQueryArray('syndication.getModules', $args); + if($output->data) { + foreach($output->data as $module_info) { + unset($obj); + $obj->id = $this->getID('channel', $module_info->module_srl); + $obj->title = $this->handleLang($module_info->browser_title, $module_info->site_srl); + $obj->updated = date("Y-m-d\\TH:i:s").$time_zone; + $obj->self_href = $this->getSelfHref($obj->id, 'channel'); + $obj->alternative_href = $this->getAlternativeHref($module_info); + $obj->summary = $module_info->description; + if($module_info->module == "textyle") + { + $obj->type = "blog"; + $obj->rss_href = getFullSiteUrl($module_info->domain, '', 'mid', $module_info->mid, 'act', 'rss'); + } + else + { + $obj->type = "web"; + } + + $list[] = $obj; + } + } + return $list; + } + + function getArticle($document_srl) { + if($this->site_url==null) $this->init(); + + $oDocumentModel = &getModel('document'); + $oDocument = $oDocumentModel->getDocument($document_srl,false,false); + if(!$oDocument->isExists()) return; + + $val = $oDocument->getObjectVars(); + + $val->id = $this->getID('article', $val->module_srl.'-'.$val->document_srl); + $val->updated = date("Y-m-d\\TH:i:s", ztime($val->last_update)).$GLOBALS['_time_zone']; + $val->alternative_href = getFullSiteUrl($this->site_url, '', 'document_srl', $val->document_srl); + $val->channel_alternative_href = $this->getChannelAlternativeHref($val->module_srl); + $val->channel_id = $this->getID('channel', $val->module_srl.'-'.$val->document_srl); + if(!$val->nick_name) $val->nick_name = $val->user_name; + + return $val; + } + + function getArticles($module_srl = null, $page=1, $startTime = null, $endTime = null, $type = null, $id = null) { + if($this->site_url==null) $this->init(); + + if($module_srl) $args->module_srl = $module_srl; + if($startTime) $args->start_date = $this->getDate($startTime); + if($endTime) $args->end_date = $this->getDate($endTime); + if(count($this->granted_modules)) $args->except_module_srls = implode(',',$this->granted_modules); + $args->page = $page; + $output = executeQueryArray('syndication.getDocumentList', $args); + $cur_page = $output->page_navigation->cur_page; + $total_page = $output->page_navigation->last_page; + + $result->next_url = null; + $result->list = array(); + + if($cur_page<$total_page) { + $next_url = $this->getSelfHref($id, $type); + if($startTime) $next_url .= '&startTime='.$startTime; + if($endTime) $next_url .= '&endTime='.$endTime; + $result->next_url = $next_url.'&page='.($cur_page+1); + } + + if($output->data) { + foreach($output->data as $key => $val) { + $val->id = $this->getID('article', $val->module_srl.'-'.$val->document_srl); + $val->updated = date("Y-m-d\\TH:i:s", ztime($val->last_update)).$GLOBALS['_time_zone']; + $val->alternative_href = getFullSiteUrl($this->site_url, '', 'document_srl', $val->document_srl); + $val->channel_alternative_href = $this->getChannelAlternativeHref($val->module_srl); + $val->channel_id = $this->getID('channel', $val->module_srl.'-'.$val->document_srl); + if(!$val->nick_name) $val->nick_name = $val->user_name; + $output->data[$key] = $val; + } + $result->list = $output->data; + } + return $result; + } + + function getDeleted($module_srl = null, $page = 1, $startTime = null, $endTime = null, $type = null, $id = null) { + if($this->site_url==null) $this->init(); + + if($module_srl) $args->module_srl= $module_srl; + if($startTime) $args->start_date = $this->getDate($startTime); + if($endTime) $args->end_date = $this->getDate($endTime); + $args->page = $page; + + $output = executeQueryArray('syndication.getDeletedList', $args); + + $cur_page = $output->page_navigation->cur_page; + $total_page = $output->page_navigation->last_page; + + $result->next_url = null; + $result->list = array(); + + if($cur_page<$total_page) { + $next_url = $this->getSelfHref($id, $type); + if($startTime) $next_url .= '&startTime='.$startTime; + if($endTime) $next_url .= '&endTime='.$endTime; + $result->next_url = $next_url . '&page='.($cur_page+1); + } + + if($output->data) { + foreach($output->data as $key => $val) { + $val->id = $this->getID('article', $val->module_srl.'-'.$val->document_srl); + $val->deleted = date("Y-m-d\\TH:i:s", ztime($val->regdate)).$GLOBALS['_time_zone']; + $val->alternative_href = getFullSiteUrl($this->site_url, '', 'document_srl', $val->document_srl); + $val->channel_id = $this->getID('channel', $val->module_srl.'-'.$val->document_srl); + $output->data[$key] = $val; + } + $result->list = $output->data; + } + return $result; + } + + function getID($type, $target_id = null) { + if($this->site_url==null) $this->init(); + + return sprintf('tag:%s,%d:%s', $this->site_url, $this->year, $type) . ($target_id?':'.$target_id:''); + } + + function getChannelAlternativeHref($module_srl) { + static $module_info = array(); + if(!isset($module_info[$module_srl])) { + $args->module_srl = $module_srl; + $output = executeQuery('syndication.getModuleSiteInfo', $args); + if($output->data) $module_info[$module_srl] = $output->data; + else $module_info[$module_srl] = null; + } + + if(is_null($module_info[$module_srl])) return $this->site_url; + + $domain = $module_info[$module_srl]->domain; + $url = getFullSiteUrl($domain, '', 'mid', $module_info[$module_srl]->mid); + if(substr($url,0,1)=='/') $domain = 'http://'.$this->site_url.$url; + return $url; + } + + function getSelfHref($id, $type = null) { + if($this->site_url==null) $this->init(); + + return sprintf('http://%s/?module=syndication&act=getSyndicationList&id=%s&type=%s', $this->site_url, $id, $type); + } + + function getAlternativeHref($module_info = null) { + if($this->site_url==null) $this->init(); + + if(!$module_info) return sprintf('http://%s', $this->site_url); + if(!$module_info->site_srl) return getFullUrl('', 'mid', $module_info->mid); + + $domain = $module_info->domain; + $url = getFullSiteUrl($domain, '', 'mid', $module_info->mid); + + if(substr($url,0,1)=='/') $domain = 'http://'.$this->site_url.$url; + return $url; + } + + function getDate($date) { + $time = strtotime($date); + if($time == -1) $time = ztime(str_replace(array('-','T',':'),'',$date)); + return date('YmdHis', $time); + } + } +?> diff --git a/modules/tag/conf/info.xml b/modules/tag/conf/info.xml index 08ce31c8c..5443a8cc8 100644 --- a/modules/tag/conf/info.xml +++ b/modules/tag/conf/info.xml @@ -1,36 +1,36 @@ - - - 꼬리표 - 标签 - タグ - Tag - Tag - Etiqueta - Теги - 標籤 - Etiket - 꼬리표 관리 모듈 - 标签管理模块。 - タグ管理用のモジュールです。 - Module for managing tags. - Module quản lý Tag. - Módulo para manejar etiquetas. - Модуль для управления тегами. - 標籤管理模組。 - Etiketleri yönetme modülü. - 0.1 - 2007-02-28 - content - - - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - - + + + 꼬리표 + 标签 + タグ + Tag + Tag + Etiqueta + Теги + 標籤 + Etiket + 꼬리표 관리 모듈 + 标签管理模块。 + タグ管理用のモジュールです。 + Module for managing tags. + Module quản lý Tag. + Módulo para manejar etiquetas. + Модуль для управления тегами. + 標籤管理模組。 + Etiketleri yönetme modülü. + 0.1 + 2007-02-28 + content + + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + diff --git a/modules/tag/tag.admin.controller.php b/modules/tag/tag.admin.controller.php index 849a9015a..91039367b 100644 --- a/modules/tag/tag.admin.controller.php +++ b/modules/tag/tag.admin.controller.php @@ -1,17 +1,17 @@ -module_srl = $module_srl; - return executeQuery('tag.deleteModuleTags', $args); - } - } -?> +module_srl = $module_srl; + return executeQuery('tag.deleteModuleTags', $args); + } + } +?> diff --git a/modules/tag/tag.class.php b/modules/tag/tag.class.php index f26ae7c85..1e4bca738 100644 --- a/modules/tag/tag.class.php +++ b/modules/tag/tag.class.php @@ -1,96 +1,96 @@ -addIndex("tags","idx_tag", array("document_srl","tag")); - - // 2007. 10. 17 document.insertDocument, updateDocument, deleteDocument에 대한 trigger 등록 - $oModuleController->insertTrigger('document.insertDocument', 'tag', 'controller', 'triggerArrangeTag', 'before'); - $oModuleController->insertTrigger('document.insertDocument', 'tag', 'controller', 'triggerInsertTag', 'after'); - $oModuleController->insertTrigger('document.updateDocument', 'tag', 'controller', 'triggerArrangeTag', 'before'); - $oModuleController->insertTrigger('document.updateDocument', 'tag', 'controller', 'triggerInsertTag', 'after'); - $oModuleController->insertTrigger('document.deleteDocument', 'tag', 'controller', 'triggerDeleteTag', 'after'); - - // 2007. 10. 17 모듈이 삭제될때 등록된 태그도 모두 삭제하는 트리거 추가 - $oModuleController->insertTrigger('module.deleteModule', 'tag', 'controller', 'triggerDeleteModuleTags', 'after'); - - return new Object(); - } - - /** - * @brief 설치가 이상이 없는지 체크하는 method - **/ - function checkUpdate() { - $oModuleModel = &getModel('module'); - $oDB = &DB::getInstance(); - - // 2007. 10. 17 trigger 등록이 안되어 있으면 등록 - if(!$oModuleModel->getTrigger('document.insertDocument', 'tag', 'controller', 'triggerArrangeTag', 'before')) return true; - if(!$oModuleModel->getTrigger('document.insertDocument', 'tag', 'controller', 'triggerInsertTag', 'after')) return true; - if(!$oModuleModel->getTrigger('document.updateDocument', 'tag', 'controller', 'triggerArrangeTag', 'before')) return true; - if(!$oModuleModel->getTrigger('document.updateDocument', 'tag', 'controller', 'triggerInsertTag', 'after')) return true; - if(!$oModuleModel->getTrigger('document.deleteDocument', 'tag', 'controller', 'triggerDeleteTag', 'after')) return true; - - // 2007. 10. 17 모듈이 삭제될때 등록된 태그도 모두 삭제하는 트리거 추가 - if(!$oModuleModel->getTrigger('module.deleteModule', 'tag', 'controller', 'triggerDeleteModuleTags', 'after')) return true; - - // tag 테이블의 tag 컬럼에 index - if(!$oDB->isIndexExists("tags","idx_tag")) return true; - - return false; - } - - /** - * @brief 업데이트 실행 - **/ - function moduleUpdate() { - $oModuleModel = &getModel('module'); - $oModuleController = &getController('module'); - $oDB = &DB::getInstance(); - - // 2007. 10. 17 document.insertDocument, updateDocument, deleteDocument에 대한 trigger 등록 - if(!$oModuleModel->getTrigger('document.insertDocument', 'tag', 'controller', 'triggerArrangeTag', 'before')) - $oModuleController->insertTrigger('document.insertDocument', 'tag', 'controller', 'triggerArrangeTag', 'before'); - - if(!$oModuleModel->getTrigger('document.insertDocument', 'tag', 'controller', 'triggerInsertTag', 'after')) - $oModuleController->insertTrigger('document.insertDocument', 'tag', 'controller', 'triggerInsertTag', 'after'); - - if(!$oModuleModel->getTrigger('document.updateDocument', 'tag', 'controller', 'triggerArrangeTag', 'before')) - $oModuleController->insertTrigger('document.updateDocument', 'tag', 'controller', 'triggerArrangeTag', 'before'); - - if(!$oModuleModel->getTrigger('document.updateDocument', 'tag', 'controller', 'triggerInsertTag', 'after')) - $oModuleController->insertTrigger('document.updateDocument', 'tag', 'controller', 'triggerInsertTag', 'after'); - - if(!$oModuleModel->getTrigger('document.triggerDeleteTag', 'tag', 'controller', 'triggerDeleteTag', 'after')) - $oModuleController->insertTrigger('document.deleteDocument', 'tag', 'controller', 'triggerDeleteTag', 'after'); - - // 2007. 10. 17 모듈이 삭제될때 등록된 태그도 모두 삭제하는 트리거 추가 - if(!$oModuleModel->getTrigger('module.deleteModule', 'tag', 'controller', 'triggerDeleteModuleTags', 'after')) - $oModuleController->insertTrigger('module.deleteModule', 'tag', 'controller', 'triggerDeleteModuleTags', 'after'); - - // tag 테이블의 tag 컬럼에 index - if(!$oDB->isIndexExists("tags","idx_tag")) - $oDB->addIndex("tags","idx_tag", array("document_srl","tag")); - - return new Object(0, 'success_updated'); - } - - /** - * @brief 캐시 파일 재생성 - **/ - function recompileCache() { - } - } -?> +addIndex("tags","idx_tag", array("document_srl","tag")); + + // 2007. 10. 17 document.insertDocument, updateDocument, deleteDocument에 대한 trigger 등록 + $oModuleController->insertTrigger('document.insertDocument', 'tag', 'controller', 'triggerArrangeTag', 'before'); + $oModuleController->insertTrigger('document.insertDocument', 'tag', 'controller', 'triggerInsertTag', 'after'); + $oModuleController->insertTrigger('document.updateDocument', 'tag', 'controller', 'triggerArrangeTag', 'before'); + $oModuleController->insertTrigger('document.updateDocument', 'tag', 'controller', 'triggerInsertTag', 'after'); + $oModuleController->insertTrigger('document.deleteDocument', 'tag', 'controller', 'triggerDeleteTag', 'after'); + + // 2007. 10. 17 모듈이 삭제될때 등록된 태그도 모두 삭제하는 트리거 추가 + $oModuleController->insertTrigger('module.deleteModule', 'tag', 'controller', 'triggerDeleteModuleTags', 'after'); + + return new Object(); + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + **/ + function checkUpdate() { + $oModuleModel = &getModel('module'); + $oDB = &DB::getInstance(); + + // 2007. 10. 17 trigger 등록이 안되어 있으면 등록 + if(!$oModuleModel->getTrigger('document.insertDocument', 'tag', 'controller', 'triggerArrangeTag', 'before')) return true; + if(!$oModuleModel->getTrigger('document.insertDocument', 'tag', 'controller', 'triggerInsertTag', 'after')) return true; + if(!$oModuleModel->getTrigger('document.updateDocument', 'tag', 'controller', 'triggerArrangeTag', 'before')) return true; + if(!$oModuleModel->getTrigger('document.updateDocument', 'tag', 'controller', 'triggerInsertTag', 'after')) return true; + if(!$oModuleModel->getTrigger('document.deleteDocument', 'tag', 'controller', 'triggerDeleteTag', 'after')) return true; + + // 2007. 10. 17 모듈이 삭제될때 등록된 태그도 모두 삭제하는 트리거 추가 + if(!$oModuleModel->getTrigger('module.deleteModule', 'tag', 'controller', 'triggerDeleteModuleTags', 'after')) return true; + + // tag 테이블의 tag 컬럼에 index + if(!$oDB->isIndexExists("tags","idx_tag")) return true; + + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + $oModuleModel = &getModel('module'); + $oModuleController = &getController('module'); + $oDB = &DB::getInstance(); + + // 2007. 10. 17 document.insertDocument, updateDocument, deleteDocument에 대한 trigger 등록 + if(!$oModuleModel->getTrigger('document.insertDocument', 'tag', 'controller', 'triggerArrangeTag', 'before')) + $oModuleController->insertTrigger('document.insertDocument', 'tag', 'controller', 'triggerArrangeTag', 'before'); + + if(!$oModuleModel->getTrigger('document.insertDocument', 'tag', 'controller', 'triggerInsertTag', 'after')) + $oModuleController->insertTrigger('document.insertDocument', 'tag', 'controller', 'triggerInsertTag', 'after'); + + if(!$oModuleModel->getTrigger('document.updateDocument', 'tag', 'controller', 'triggerArrangeTag', 'before')) + $oModuleController->insertTrigger('document.updateDocument', 'tag', 'controller', 'triggerArrangeTag', 'before'); + + if(!$oModuleModel->getTrigger('document.updateDocument', 'tag', 'controller', 'triggerInsertTag', 'after')) + $oModuleController->insertTrigger('document.updateDocument', 'tag', 'controller', 'triggerInsertTag', 'after'); + + if(!$oModuleModel->getTrigger('document.triggerDeleteTag', 'tag', 'controller', 'triggerDeleteTag', 'after')) + $oModuleController->insertTrigger('document.deleteDocument', 'tag', 'controller', 'triggerDeleteTag', 'after'); + + // 2007. 10. 17 모듈이 삭제될때 등록된 태그도 모두 삭제하는 트리거 추가 + if(!$oModuleModel->getTrigger('module.deleteModule', 'tag', 'controller', 'triggerDeleteModuleTags', 'after')) + $oModuleController->insertTrigger('module.deleteModule', 'tag', 'controller', 'triggerDeleteModuleTags', 'after'); + + // tag 테이블의 tag 컬럼에 index + if(!$oDB->isIndexExists("tags","idx_tag")) + $oDB->addIndex("tags","idx_tag", array("document_srl","tag")); + + return new Object(0, 'success_updated'); + } + + /** + * @brief 캐시 파일 재생성 + **/ + function recompileCache() { + } + } +?> diff --git a/modules/tag/tag.controller.php b/modules/tag/tag.controller.php index 4e65b8243..9f86dac9b 100644 --- a/modules/tag/tag.controller.php +++ b/modules/tag/tag.controller.php @@ -1,92 +1,92 @@ -tags) return new Object(); - - // tags변수 정리 - $tag_list = explode(',', $obj->tags); - $tag_count = count($tag_list); - $tag_list = array_unique($tag_list); - if(!count($tag_list)) return new Object(); - - foreach($tag_list as $tag) { - if(!trim($tag)) continue; - $arranged_tag_list[] = trim($tag); - } - if(!count($arranged_tag_list)) $obj->tags = null; - else $obj->tags = implode(',',$arranged_tag_list); - return new Object(); - } - - /** - * @brief 태그 입력 trigger - * 태그 입력은 해당 글의 모든 태그를 삭제 후 재 입력하는 방식을 이용 - **/ - function triggerInsertTag(&$obj) { - $module_srl = $obj->module_srl; - $document_srl = $obj->document_srl; - $tags = $obj->tags; - if(!$document_srl) return new Object(); - - // 해당 글의 tags를 모두 삭제 - $output = $this->triggerDeleteTag($obj); - if(!$output->toBool()) return $output; - - // 다시 태그를 입력 - $args->module_srl = $module_srl; - $args->document_srl = $document_srl; - - $tag_list = explode(',',$tags); - $tag_count = count($tag_list); - for($i=0;$i<$tag_count;$i++) { - unset($args->tag); - $args->tag = trim($tag_list[$i]); - if(!$args->tag) continue; - $output = executeQuery('tag.insertTag', $args); - if(!$output->toBool()) return $output; - } - - return new Object(); - } - - /** - * @brief 특정 문서의 태그 삭제 trigger - * document_srl에 속한 tag 모두 삭제 - **/ - function triggerDeleteTag(&$obj) { - $document_srl = $obj->document_srl; - if(!$document_srl) return new Object(); - - $args->document_srl = $document_srl; - return executeQuery('tag.deleteTag', $args); - } - - /** - * @brief module 삭제시 해당 태그 모두 삭제하는 trigger - **/ - function triggerDeleteModuleTags(&$obj) { - $module_srl = $obj->module_srl; - if(!$module_srl) return new Object(); - - $oTagController = &getAdminController('tag'); - return $oTagController->deleteModuleTags($module_srl); - } - - } -?> +tags) return new Object(); + + // tags변수 정리 + $tag_list = explode(',', $obj->tags); + $tag_count = count($tag_list); + $tag_list = array_unique($tag_list); + if(!count($tag_list)) return new Object(); + + foreach($tag_list as $tag) { + if(!trim($tag)) continue; + $arranged_tag_list[] = trim($tag); + } + if(!count($arranged_tag_list)) $obj->tags = null; + else $obj->tags = implode(',',$arranged_tag_list); + return new Object(); + } + + /** + * @brief 태그 입력 trigger + * 태그 입력은 해당 글의 모든 태그를 삭제 후 재 입력하는 방식을 이용 + **/ + function triggerInsertTag(&$obj) { + $module_srl = $obj->module_srl; + $document_srl = $obj->document_srl; + $tags = $obj->tags; + if(!$document_srl) return new Object(); + + // 해당 글의 tags를 모두 삭제 + $output = $this->triggerDeleteTag($obj); + if(!$output->toBool()) return $output; + + // 다시 태그를 입력 + $args->module_srl = $module_srl; + $args->document_srl = $document_srl; + + $tag_list = explode(',',$tags); + $tag_count = count($tag_list); + for($i=0;$i<$tag_count;$i++) { + unset($args->tag); + $args->tag = trim($tag_list[$i]); + if(!$args->tag) continue; + $output = executeQuery('tag.insertTag', $args); + if(!$output->toBool()) return $output; + } + + return new Object(); + } + + /** + * @brief 특정 문서의 태그 삭제 trigger + * document_srl에 속한 tag 모두 삭제 + **/ + function triggerDeleteTag(&$obj) { + $document_srl = $obj->document_srl; + if(!$document_srl) return new Object(); + + $args->document_srl = $document_srl; + return executeQuery('tag.deleteTag', $args); + } + + /** + * @brief module 삭제시 해당 태그 모두 삭제하는 trigger + **/ + function triggerDeleteModuleTags(&$obj) { + $module_srl = $obj->module_srl; + if(!$module_srl) return new Object(); + + $oTagController = &getAdminController('tag'); + return $oTagController->deleteModuleTags($module_srl); + } + + } +?> diff --git a/modules/tag/tag.model.php b/modules/tag/tag.model.php index 996eb164e..14a202b59 100644 --- a/modules/tag/tag.model.php +++ b/modules/tag/tag.model.php @@ -1,87 +1,87 @@ -mid) { - $oModuleModel = &getModel('module'); - $obj->module_srl = $oModuleModel->getModuleSrlByMid($obj->mid); - unset($obj->mid); - } - - // 넘어온 module_srl은 array일 수도 있기에 array인지를 체크 - if(is_array($obj->module_srl)) $args->module_srl = implode(',', $obj->module_srl); - else $args->module_srl = $obj->module_srl; - $args->list_count = $obj->list_count; - $args->count = $obj->sort_index; - - $output = executeQueryArray('tag.getTagList', $args); - if(!$output->toBool()) return $output; - - return $output; - } - - - /** - * @brief tag로 document_srl를 가져오기 - **/ - function getDocumentSrlByTag($obj){ - if(is_array($obj->module_srl)) $args->module_srl = implode(',', $obj->module_srl); - else $args->module_srl = $obj->module_srl; - - $args->tag = $obj->tag; - $output = executeQueryArray('tag.getDocumentSrlByTag', $args); - if(!$output->toBool()) return $output; - - return $output; - } - - /** - * @brief document 에서 사용된 tag 가져오기 - **/ - function getDocumentsTagList($obj){ - if(is_array($obj->document_srl)) $args->document_srl = implode(',', $obj->document_srl); - else $args->document_srl = $obj->document_srl; - - $output = executeQueryArray('tag.getDocumentsTagList', $args); - if(!$output->toBool()) return $output; - - return $output; - } - - /** - * @brief 특정tag과 함께 사용된 tag목록 - **/ - function getTagWithUsedList($obj){ - if(is_array($obj->module_srl)) $args->module_srl = implode(',', $obj->module_srl); - else $args->module_srl = $obj->module_srl; - - $args->tag = $obj->tag; - $output = $this->getDocumentSrlByTag($args); - $document_srl = array(); - - if($output->data){ - foreach($output->data as $k => $v) $document_srl[] = $v->document_srl; - } - unset($args); - $args->document_srl = $document_srl; - $output = $this->getDocumentsTagList($args); - return $output; - } - } -?> +mid) { + $oModuleModel = &getModel('module'); + $obj->module_srl = $oModuleModel->getModuleSrlByMid($obj->mid); + unset($obj->mid); + } + + // 넘어온 module_srl은 array일 수도 있기에 array인지를 체크 + if(is_array($obj->module_srl)) $args->module_srl = implode(',', $obj->module_srl); + else $args->module_srl = $obj->module_srl; + $args->list_count = $obj->list_count; + $args->count = $obj->sort_index; + + $output = executeQueryArray('tag.getTagList', $args); + if(!$output->toBool()) return $output; + + return $output; + } + + + /** + * @brief tag로 document_srl를 가져오기 + **/ + function getDocumentSrlByTag($obj){ + if(is_array($obj->module_srl)) $args->module_srl = implode(',', $obj->module_srl); + else $args->module_srl = $obj->module_srl; + + $args->tag = $obj->tag; + $output = executeQueryArray('tag.getDocumentSrlByTag', $args); + if(!$output->toBool()) return $output; + + return $output; + } + + /** + * @brief document 에서 사용된 tag 가져오기 + **/ + function getDocumentsTagList($obj){ + if(is_array($obj->document_srl)) $args->document_srl = implode(',', $obj->document_srl); + else $args->document_srl = $obj->document_srl; + + $output = executeQueryArray('tag.getDocumentsTagList', $args); + if(!$output->toBool()) return $output; + + return $output; + } + + /** + * @brief 특정tag과 함께 사용된 tag목록 + **/ + function getTagWithUsedList($obj){ + if(is_array($obj->module_srl)) $args->module_srl = implode(',', $obj->module_srl); + else $args->module_srl = $obj->module_srl; + + $args->tag = $obj->tag; + $output = $this->getDocumentSrlByTag($args); + $document_srl = array(); + + if($output->data){ + foreach($output->data as $k => $v) $document_srl[] = $v->document_srl; + } + unset($args); + $args->document_srl = $document_srl; + $output = $this->getDocumentsTagList($args); + return $output; + } + } +?> diff --git a/modules/trackback/conf/info.xml b/modules/trackback/conf/info.xml index ed8730efe..bce9023b3 100644 --- a/modules/trackback/conf/info.xml +++ b/modules/trackback/conf/info.xml @@ -1,37 +1,37 @@ - - - 엮인글 - 引用管理 - トラックバック - Trackback - Liên kết Web - Trackback - Трекбек - 引用 - Geri izleme - 엮인글 관리 모듈 - 管理引用模块。 - トラックバック管理モジュール - Module dành cho quản lý liên kết Web. - Module for managing trackbacks. - Módulo para el manejo de trackbacks. - Модуль для управления трекбеками. - 管理引用的模組。 - Module for managing trackbacks. - Geri izlemeleri yönetme modülü. - 0.1 - 2007-02-28 - content - - - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - - + + + 엮인글 + 引用管理 + トラックバック + Trackback + Liên kết Web + Trackback + Трекбек + 引用 + Geri izleme + 엮인글 관리 모듈 + 管理引用模块。 + トラックバック管理モジュール + Module dành cho quản lý liên kết Web. + Module for managing trackbacks. + Módulo para el manejo de trackbacks. + Модуль для управления трекбеками. + 管理引用的模組。 + Module for managing trackbacks. + Geri izlemeleri yönetme modülü. + 0.1 + 2007-02-28 + content + + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + diff --git a/modules/trackback/lang/en.lang.php b/modules/trackback/lang/en.lang.php index 22531aad0..00970b903 100644 --- a/modules/trackback/lang/en.lang.php +++ b/modules/trackback/lang/en.lang.php @@ -1,29 +1,29 @@ -cmd_toggle_checked_trackback = 'Reverse selected trackback(s)'; - $lang->cmd_delete_checked_trackback = 'Delete selected trackback(s)'; - - $lang->msg_cart_is_null = 'Please select a trackback to be deleted.'; - $lang->msg_checked_trackback_is_deleted = '%d trackback(s) deleted.'; - - $lang->send_trackback_url = 'Destination URL'; - $lang->msg_trackback_url_is_invalid = 'Destination URL is invalid'; - $lang->msg_trackback_send_success = 'Sent successfully'; - $lang->msg_trackback_send_failed = 'Failed to send'; - - $lang->search_target_list = array( - 'url' => 'Target URL', - 'blog_name' => 'Target Site Name', - 'title' => 'Title', - 'excerpt' => 'Excerpt', - 'regdate' => 'Posted Date', - 'ipaddress' => 'IP Address', - ); - - $lang->enable_trackback = "Use Trackback"; - $lang->about_enable_trackback = "When the check is disabled, all trackback collection in the site will be stopped"; -?> +cmd_toggle_checked_trackback = 'Reverse selected trackback(s)'; + $lang->cmd_delete_checked_trackback = 'Delete selected trackback(s)'; + + $lang->msg_cart_is_null = 'Please select a trackback to be deleted.'; + $lang->msg_checked_trackback_is_deleted = '%d trackback(s) deleted.'; + + $lang->send_trackback_url = 'Destination URL'; + $lang->msg_trackback_url_is_invalid = 'Destination URL is invalid'; + $lang->msg_trackback_send_success = 'Sent successfully'; + $lang->msg_trackback_send_failed = 'Failed to send'; + + $lang->search_target_list = array( + 'url' => 'Target URL', + 'blog_name' => 'Target Site Name', + 'title' => 'Title', + 'excerpt' => 'Excerpt', + 'regdate' => 'Posted Date', + 'ipaddress' => 'IP Address', + ); + + $lang->enable_trackback = "Use Trackback"; + $lang->about_enable_trackback = "When the check is disabled, all trackback collection in the site will be stopped"; +?> diff --git a/modules/trackback/lang/es.lang.php b/modules/trackback/lang/es.lang.php index f4718305d..cf2b9b607 100644 --- a/modules/trackback/lang/es.lang.php +++ b/modules/trackback/lang/es.lang.php @@ -1,30 +1,30 @@ -cmd_toggle_checked_trackback = 'Reverse selected trackback(s)'; - $lang->cmd_delete_checked_trackback = 'Trackback(s) es eliminado'; - - $lang->msg_cart_is_null = 'Seleccione un trackback para ser eliminado.'; - $lang->msg_checked_trackback_is_deleted = '%d trackback(s) eliminado.'; - - $lang->send_trackback_url = 'Destination URL'; - $lang->msg_trackback_url_is_invalid = 'Destination URL is invalid'; - $lang->msg_trackback_send_success = 'Sent successfully'; - $lang->msg_trackback_send_failed = '엮인글 발송을 실패하였습니다.'; - - $lang->search_target_list = array( - 'url' => 'URL objetivo', - 'blog_name' => 'Ojetivo del nombre de sitio', - 'title' => 'Título', - 'excerpt' => 'Contenido', - 'regdate' => 'Fecha del posteo', - 'ipaddress' => 'Dirección IP', - ); - - $lang->enable_trackback = "Usar trackback"; - $lang->about_enable_trackback = "Si no selecciona esta opción, desactiva la inscripción de trackback en todos los documentos del sitio"; -?> +cmd_toggle_checked_trackback = 'Reverse selected trackback(s)'; + $lang->cmd_delete_checked_trackback = 'Trackback(s) es eliminado'; + + $lang->msg_cart_is_null = 'Seleccione un trackback para ser eliminado.'; + $lang->msg_checked_trackback_is_deleted = '%d trackback(s) eliminado.'; + + $lang->send_trackback_url = 'Destination URL'; + $lang->msg_trackback_url_is_invalid = 'Destination URL is invalid'; + $lang->msg_trackback_send_success = 'Sent successfully'; + $lang->msg_trackback_send_failed = '엮인글 발송을 실패하였습니다.'; + + $lang->search_target_list = array( + 'url' => 'URL objetivo', + 'blog_name' => 'Ojetivo del nombre de sitio', + 'title' => 'Título', + 'excerpt' => 'Contenido', + 'regdate' => 'Fecha del posteo', + 'ipaddress' => 'Dirección IP', + ); + + $lang->enable_trackback = "Usar trackback"; + $lang->about_enable_trackback = "Si no selecciona esta opción, desactiva la inscripción de trackback en todos los documentos del sitio"; +?> diff --git a/modules/trackback/lang/fr.lang.php b/modules/trackback/lang/fr.lang.php index eff2e0417..d454c0097 100644 --- a/modules/trackback/lang/fr.lang.php +++ b/modules/trackback/lang/fr.lang.php @@ -1,29 +1,29 @@ - - * @brief Paquet du langage en français pour le module de Rétrolien - **/ - $lang->cmd_toggle_checked_trackback = 'Renverser les rétroliens choisis'; - $lang->cmd_delete_checked_trackback = 'Supprimer les rétroliens choisis'; - - $lang->msg_cart_is_null = 'Choisissez un rétrolien à supprimer, S.V.P.'; - $lang->msg_checked_trackback_is_deleted = '%d rétrolien(s) est(sont) supprimé(s).'; - - $lang->send_trackback_url = 'URL de Destination'; - $lang->msg_trackback_url_is_invalid = 'URL de Destination est invalide'; - $lang->msg_trackback_send_success = 'Envoyé avec succès'; - $lang->msg_trackback_send_failed = '엮인글 발송을 실패하였습니다.'; - - $lang->search_target_list = array( - 'url' => 'URL objectif', - 'blog_name' => 'Nom du Site objectif', - 'title' => 'Titre', - 'excerpt' => 'Contenu', - 'regdate' => 'Jour', - 'ipaddress' => 'Adresse IP', - ); - - $lang->enable_trackback = "Utiliser le Rétrolien"; - $lang->about_enable_trackback = "Si vous annulez la coché, on arrêtera de ramasser les rétroliens de tous les articles du site"; -?> + + * @brief Paquet du langage en français pour le module de Rétrolien + **/ + $lang->cmd_toggle_checked_trackback = 'Renverser les rétroliens choisis'; + $lang->cmd_delete_checked_trackback = 'Supprimer les rétroliens choisis'; + + $lang->msg_cart_is_null = 'Choisissez un rétrolien à supprimer, S.V.P.'; + $lang->msg_checked_trackback_is_deleted = '%d rétrolien(s) est(sont) supprimé(s).'; + + $lang->send_trackback_url = 'URL de Destination'; + $lang->msg_trackback_url_is_invalid = 'URL de Destination est invalide'; + $lang->msg_trackback_send_success = 'Envoyé avec succès'; + $lang->msg_trackback_send_failed = '엮인글 발송을 실패하였습니다.'; + + $lang->search_target_list = array( + 'url' => 'URL objectif', + 'blog_name' => 'Nom du Site objectif', + 'title' => 'Titre', + 'excerpt' => 'Contenu', + 'regdate' => 'Jour', + 'ipaddress' => 'Adresse IP', + ); + + $lang->enable_trackback = "Utiliser le Rétrolien"; + $lang->about_enable_trackback = "Si vous annulez la coché, on arrêtera de ramasser les rétroliens de tous les articles du site"; +?> diff --git a/modules/trackback/lang/jp.lang.php b/modules/trackback/lang/jp.lang.php index df98d91fd..52564a3f5 100644 --- a/modules/trackback/lang/jp.lang.php +++ b/modules/trackback/lang/jp.lang.php @@ -1,29 +1,29 @@ -cmd_toggle_checked_trackback = '選択トラックバック反転'; - $lang->cmd_delete_checked_trackback = '選択トラックバック削除'; - - $lang->msg_cart_is_null = '削除する書き込みを選択して下さい。'; - $lang->msg_checked_trackback_is_deleted = '%d個のトラックバックが削除されました。'; - - $lang->send_trackback_url = '送信するURL'; - $lang->msg_trackback_url_is_invalid = 'トラックバックのurlが正しくありません。'; - $lang->msg_trackback_send_success = 'トラックバックの送信が成功しました。'; - $lang->msg_trackback_send_failed = '엮인글 발송을 실패하였습니다.'; - - $lang->search_target_list = array( - 'url' => 'URL', - 'blog_name' => 'サイト(ブログ)名', - 'title' => 'タイトル', - 'excerpt' => '要約内容', - 'regdate' => '登録日', - 'ipaddress' => 'IPアドレス', - ); - - $lang->enable_trackback = 'トラックバックを可能にする'; - $lang->about_enable_trackback = 'チェックを外すと、すべてのコンテンツに対し、トラックバックの受信を中止します。'; -?> +cmd_toggle_checked_trackback = '選択トラックバック反転'; + $lang->cmd_delete_checked_trackback = '選択トラックバック削除'; + + $lang->msg_cart_is_null = '削除する書き込みを選択して下さい。'; + $lang->msg_checked_trackback_is_deleted = '%d個のトラックバックが削除されました。'; + + $lang->send_trackback_url = '送信するURL'; + $lang->msg_trackback_url_is_invalid = 'トラックバックのurlが正しくありません。'; + $lang->msg_trackback_send_success = 'トラックバックの送信が成功しました。'; + $lang->msg_trackback_send_failed = '엮인글 발송을 실패하였습니다.'; + + $lang->search_target_list = array( + 'url' => 'URL', + 'blog_name' => 'サイト(ブログ)名', + 'title' => 'タイトル', + 'excerpt' => '要約内容', + 'regdate' => '登録日', + 'ipaddress' => 'IPアドレス', + ); + + $lang->enable_trackback = 'トラックバックを可能にする'; + $lang->about_enable_trackback = 'チェックを外すと、すべてのコンテンツに対し、トラックバックの受信を中止します。'; +?> diff --git a/modules/trackback/lang/ko.lang.php b/modules/trackback/lang/ko.lang.php index 933426840..5c13b04e0 100644 --- a/modules/trackback/lang/ko.lang.php +++ b/modules/trackback/lang/ko.lang.php @@ -1,29 +1,29 @@ -cmd_toggle_checked_trackback = '선택항목 반전'; - $lang->cmd_delete_checked_trackback = '선택항목 삭제'; - - $lang->msg_cart_is_null = '삭제할 글을 선택해주세요.'; - $lang->msg_checked_trackback_is_deleted = '%d개의 엮인글이 삭제되었습니다.'; - - $lang->send_trackback_url = '발송할 주소'; - $lang->msg_trackback_url_is_invalid = '발송할 대상 url이 올바르지 않습니다.'; - $lang->msg_trackback_send_success = '엮인글 발송을 성공하였습니다.'; - $lang->msg_trackback_send_failed = '엮인글 발송을 실패하였습니다.'; - - $lang->search_target_list = array( - 'url' => '대상 URL', - 'blog_name' => '대상 사이트 이름', - 'title' => '제목', - 'excerpt' => '내용', - 'regdate' => '등록일', - 'ipaddress' => 'IP 주소', - ); - - $lang->enable_trackback = '엮인글 사용'; - $lang->about_enable_trackback = '체크를 해제하시면 사이트 내에 모든 글의 엮인글 접수를 중지합니다.'; -?> +cmd_toggle_checked_trackback = '선택항목 반전'; + $lang->cmd_delete_checked_trackback = '선택항목 삭제'; + + $lang->msg_cart_is_null = '삭제할 글을 선택해주세요.'; + $lang->msg_checked_trackback_is_deleted = '%d개의 엮인글이 삭제되었습니다.'; + + $lang->send_trackback_url = '발송할 주소'; + $lang->msg_trackback_url_is_invalid = '발송할 대상 url이 올바르지 않습니다.'; + $lang->msg_trackback_send_success = '엮인글 발송을 성공하였습니다.'; + $lang->msg_trackback_send_failed = '엮인글 발송을 실패하였습니다.'; + + $lang->search_target_list = array( + 'url' => '대상 URL', + 'blog_name' => '대상 사이트 이름', + 'title' => '제목', + 'excerpt' => '내용', + 'regdate' => '등록일', + 'ipaddress' => 'IP 주소', + ); + + $lang->enable_trackback = '엮인글 사용'; + $lang->about_enable_trackback = '체크를 해제하시면 사이트 내에 모든 글의 엮인글 접수를 중지합니다.'; +?> diff --git a/modules/trackback/lang/ru.lang.php b/modules/trackback/lang/ru.lang.php index 6f6270563..e4420dbb1 100644 --- a/modules/trackback/lang/ru.lang.php +++ b/modules/trackback/lang/ru.lang.php @@ -1,30 +1,30 @@ -cmd_toggle_checked_trackback = 'Reverse selected trackback(s)'; - $lang->cmd_delete_checked_trackback = 'Удалить выбранные трекбеки'; - - $lang->msg_cart_is_null = 'Пожалуйста, выберите трекбек для удаления.'; - $lang->msg_checked_trackback_is_deleted = '%d трекбеков удалено.'; - - $lang->send_trackback_url = 'Destination URL'; - $lang->msg_trackback_url_is_invalid = 'Destination URL is invalid'; - $lang->msg_trackback_send_success = 'Sent successfully'; - $lang->msg_trackback_send_failed = '엮인글 발송을 실패하였습니다.'; - - $lang->search_target_list = array( - 'url' => 'URL назначения', - 'blog_name' => 'Имя сайта', - 'title' => 'Заголовок', - 'excerpt' => 'Выдержка', - 'regdate' => 'Дата отправки', - 'ipaddress' => 'IP-адрес', - ); - - $lang->enable_trackback = "Включить трекбек"; - $lang->about_enable_trackback = "Эта опция включает/выключает фукцию трекбека."; -?> +cmd_toggle_checked_trackback = 'Reverse selected trackback(s)'; + $lang->cmd_delete_checked_trackback = 'Удалить выбранные трекбеки'; + + $lang->msg_cart_is_null = 'Пожалуйста, выберите трекбек для удаления.'; + $lang->msg_checked_trackback_is_deleted = '%d трекбеков удалено.'; + + $lang->send_trackback_url = 'Destination URL'; + $lang->msg_trackback_url_is_invalid = 'Destination URL is invalid'; + $lang->msg_trackback_send_success = 'Sent successfully'; + $lang->msg_trackback_send_failed = '엮인글 발송을 실패하였습니다.'; + + $lang->search_target_list = array( + 'url' => 'URL назначения', + 'blog_name' => 'Имя сайта', + 'title' => 'Заголовок', + 'excerpt' => 'Выдержка', + 'regdate' => 'Дата отправки', + 'ipaddress' => 'IP-адрес', + ); + + $lang->enable_trackback = "Включить трекбек"; + $lang->about_enable_trackback = "Эта опция включает/выключает фукцию трекбека."; +?> diff --git a/modules/trackback/lang/tr.lang.php b/modules/trackback/lang/tr.lang.php index 4b0432ffa..2c8978845 100644 --- a/modules/trackback/lang/tr.lang.php +++ b/modules/trackback/lang/tr.lang.php @@ -1,29 +1,29 @@ -cmd_toggle_checked_trackback = 'Seçili geri izlemeleri iptal et'; - $lang->cmd_delete_checked_trackback = 'Seçili geri izlemeleri sil'; - - $lang->msg_cart_is_null = 'Lütfen silinecek geri izlemeyi seçin.'; - $lang->msg_checked_trackback_is_deleted = '%d geri izlemeleri silindi.'; - - $lang->send_trackback_url = 'Hedef URL'; - $lang->msg_trackback_url_is_invalid = 'Hedef URL geçersiz.'; - $lang->msg_trackback_send_success = 'Başarıyla gönderildi'; - $lang->msg_trackback_send_failed = '엮인글 발송을 실패하였습니다.'; - - $lang->search_target_list = array( - 'url' => 'Hedef URL', - 'blog_name' => 'Hedef Site Adı', - 'title' => 'Başlık', - 'excerpt' => 'Alıntı', - 'regdate' => 'Gönderilme Tarihi', - 'ipaddress' => 'IP Adresi', - ); - - $lang->enable_trackback = "Geri izleme kullan."; - $lang->about_enable_trackback = "Geri izleme devredışı bırakıldığında, sitedeki tüm geri izleme (trackback) koleksiyonları durdurulacaktır."; -?> +cmd_toggle_checked_trackback = 'Seçili geri izlemeleri iptal et'; + $lang->cmd_delete_checked_trackback = 'Seçili geri izlemeleri sil'; + + $lang->msg_cart_is_null = 'Lütfen silinecek geri izlemeyi seçin.'; + $lang->msg_checked_trackback_is_deleted = '%d geri izlemeleri silindi.'; + + $lang->send_trackback_url = 'Hedef URL'; + $lang->msg_trackback_url_is_invalid = 'Hedef URL geçersiz.'; + $lang->msg_trackback_send_success = 'Başarıyla gönderildi'; + $lang->msg_trackback_send_failed = '엮인글 발송을 실패하였습니다.'; + + $lang->search_target_list = array( + 'url' => 'Hedef URL', + 'blog_name' => 'Hedef Site Adı', + 'title' => 'Başlık', + 'excerpt' => 'Alıntı', + 'regdate' => 'Gönderilme Tarihi', + 'ipaddress' => 'IP Adresi', + ); + + $lang->enable_trackback = "Geri izleme kullan."; + $lang->about_enable_trackback = "Geri izleme devredışı bırakıldığında, sitedeki tüm geri izleme (trackback) koleksiyonları durdurulacaktır."; +?> diff --git a/modules/trackback/lang/vi.lang.php b/modules/trackback/lang/vi.lang.php index ce02ac7f6..b08583c86 100644 --- a/modules/trackback/lang/vi.lang.php +++ b/modules/trackback/lang/vi.lang.php @@ -1,32 +1,32 @@ -cmd_toggle_checked_trackback = 'Nhận liên kết Web đã chọn'; - $lang->cmd_delete_checked_trackback = 'Xóa liên kết Web đã chọn'; - - $lang->msg_cart_is_null = 'Xin hãy chọn liên kết Web muốn xóa.'; - $lang->msg_checked_trackback_is_deleted = '%d đã được xóa.'; - - $lang->send_trackback_url = 'Địa chỉ muốn gửi'; - $lang->msg_trackback_url_is_invalid = 'Địa chỉ muốn gửi không hợp lệ'; - $lang->msg_trackback_send_success = 'Đã gửi thành công.'; - $lang->msg_trackback_send_failed = '엮인글 발송을 실패하였습니다.'; - - $lang->search_target_list = array( - 'url' => 'URL muốn gửi', - 'blog_name' => 'Tên Website muốn gửi', - 'title' => 'Tiêu đề', - 'excerpt' => 'Trích đoạn', - 'regdate' => 'Ngày gửi', - 'ipaddress' => 'IP', - ); - - $lang->enable_trackback = "Sử dụng liên kết Web"; - $lang->about_enable_trackback = "Khi chọn là tắt chức năng này, mọi liên kết Web trên Website sẽ ngừng hoạt động."; -?> +cmd_toggle_checked_trackback = 'Nhận liên kết Web đã chọn'; + $lang->cmd_delete_checked_trackback = 'Xóa liên kết Web đã chọn'; + + $lang->msg_cart_is_null = 'Xin hãy chọn liên kết Web muốn xóa.'; + $lang->msg_checked_trackback_is_deleted = '%d đã được xóa.'; + + $lang->send_trackback_url = 'Địa chỉ muốn gửi'; + $lang->msg_trackback_url_is_invalid = 'Địa chỉ muốn gửi không hợp lệ'; + $lang->msg_trackback_send_success = 'Đã gửi thành công.'; + $lang->msg_trackback_send_failed = '엮인글 발송을 실패하였습니다.'; + + $lang->search_target_list = array( + 'url' => 'URL muốn gửi', + 'blog_name' => 'Tên Website muốn gửi', + 'title' => 'Tiêu đề', + 'excerpt' => 'Trích đoạn', + 'regdate' => 'Ngày gửi', + 'ipaddress' => 'IP', + ); + + $lang->enable_trackback = "Sử dụng liên kết Web"; + $lang->about_enable_trackback = "Khi chọn là tắt chức năng này, mọi liên kết Web trên Website sẽ ngừng hoạt động."; +?> diff --git a/modules/trackback/lang/zh-CN.lang.php b/modules/trackback/lang/zh-CN.lang.php index 302d89a82..de4ed3399 100644 --- a/modules/trackback/lang/zh-CN.lang.php +++ b/modules/trackback/lang/zh-CN.lang.php @@ -1,29 +1,29 @@ -cmd_toggle_checked_trackback = '反选'; - $lang->cmd_delete_checked_trackback = '删除所选'; - - $lang->msg_cart_is_null = '请选择要删除的文章'; - $lang->msg_checked_trackback_is_deleted = '已删除%d个引用'; - - $lang->send_trackback_url = '发送地址'; - $lang->msg_trackback_url_is_invalid = '错误的发送地址!'; - $lang->msg_trackback_send_success = '成功发送引用。'; - $lang->msg_trackback_send_failed = '엮인글 발송을 실패하였습니다.'; - - $lang->search_target_list = array( - 'url' => '对象URL', - 'blog_name' => '对象网站名称', - 'title' => '标题', - 'excerpt' => '内容', - 'regdate' => '登录日期', - 'ipaddress' => 'IP地址', - ); - - $lang->enable_trackback = "使用引用"; - $lang->about_enable_trackback = "取消此项勾选将对网站内的所有主题禁止接收引用。"; -?> +cmd_toggle_checked_trackback = '反选'; + $lang->cmd_delete_checked_trackback = '删除所选'; + + $lang->msg_cart_is_null = '请选择要删除的文章'; + $lang->msg_checked_trackback_is_deleted = '已删除%d个引用'; + + $lang->send_trackback_url = '发送地址'; + $lang->msg_trackback_url_is_invalid = '错误的发送地址!'; + $lang->msg_trackback_send_success = '成功发送引用。'; + $lang->msg_trackback_send_failed = '엮인글 발송을 실패하였습니다.'; + + $lang->search_target_list = array( + 'url' => '对象URL', + 'blog_name' => '对象网站名称', + 'title' => '标题', + 'excerpt' => '内容', + 'regdate' => '登录日期', + 'ipaddress' => 'IP地址', + ); + + $lang->enable_trackback = "使用引用"; + $lang->about_enable_trackback = "取消此项勾选将对网站内的所有主题禁止接收引用。"; +?> diff --git a/modules/trackback/lang/zh-TW.lang.php b/modules/trackback/lang/zh-TW.lang.php index 017466bba..a54a7a78e 100644 --- a/modules/trackback/lang/zh-TW.lang.php +++ b/modules/trackback/lang/zh-TW.lang.php @@ -1,29 +1,29 @@ -cmd_toggle_checked_trackback = '反選'; - $lang->cmd_delete_checked_trackback = '刪除所選'; - - $lang->msg_cart_is_null = '請選擇要刪除的文章'; - $lang->msg_checked_trackback_is_deleted = '已刪除%d個引用'; - - $lang->send_trackback_url = '發送網址'; - $lang->msg_trackback_url_is_invalid = '發送錯誤!'; - $lang->msg_trackback_send_success = '成功發送。'; - $lang->msg_trackback_send_failed = '엮인글 발송을 실패하였습니다.'; - - $lang->search_target_list = array( - 'url' => '目標網址', - 'blog_name' => '目標網站名稱', - 'title' => '標題', - 'excerpt' => '內容', - 'regdate' => '登錄日期', - 'ipaddress' => 'IP位址', - ); - - $lang->enable_trackback = "使用引用"; - $lang->about_enable_trackback = "不選取的話,將會使網站內所有的主題都禁止接收引用。"; -?> +cmd_toggle_checked_trackback = '反選'; + $lang->cmd_delete_checked_trackback = '刪除所選'; + + $lang->msg_cart_is_null = '請選擇要刪除的文章'; + $lang->msg_checked_trackback_is_deleted = '已刪除%d個引用'; + + $lang->send_trackback_url = '發送網址'; + $lang->msg_trackback_url_is_invalid = '發送錯誤!'; + $lang->msg_trackback_send_success = '成功發送。'; + $lang->msg_trackback_send_failed = '엮인글 발송을 실패하였습니다.'; + + $lang->search_target_list = array( + 'url' => '目標網址', + 'blog_name' => '目標網站名稱', + 'title' => '標題', + 'excerpt' => '內容', + 'regdate' => '登錄日期', + 'ipaddress' => 'IP位址', + ); + + $lang->enable_trackback = "使用引用"; + $lang->about_enable_trackback = "不選取的話,將會使網站內所有的主題都禁止接收引用。"; +?> diff --git a/modules/trackback/tpl/trackback_list.html b/modules/trackback/tpl/trackback_list.html index 5e5bb4f7c..df372e007 100644 --- a/modules/trackback/tpl/trackback_list.html +++ b/modules/trackback/tpl/trackback_list.html @@ -1,100 +1,100 @@ - - - - -

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

    - -
    - - - - - - - - - - -
    {$lang->enable_trackback}
    - enable_trackback=='Y')-->checked="checked"/> {$lang->cmd_use} -

    {$lang->about_enable_trackback}

    -
    -
    - - -
    -
    - - - - -
    - - - - {$lang->cmd_cancel} -
    -
    -
    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
    {$lang->no}
    {$lang->blog_name}
    {$lang->title}
    {$lang->date}
    {$lang->ipaddress}
    {$no}{htmlspecialchars($val->title)}{zdate($val->regdate,"Y-m-d")}{$val->ipaddress}
    - {$val->excerpt} -
    -
    - - - - + + + + +

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

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

    {$lang->about_enable_trackback}

    +
    +
    + + +
    +
    + + + + +
    + + + + {$lang->cmd_cancel} +
    +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
    {$lang->no}
    {$lang->blog_name}
    {$lang->title}
    {$lang->date}
    {$lang->ipaddress}
    {$no}{htmlspecialchars($val->title)}{zdate($val->regdate,"Y-m-d")}{$val->ipaddress}
    + {$val->excerpt} +
    +
    + + + + diff --git a/modules/trackback/trackback.admin.controller.php b/modules/trackback/trackback.admin.controller.php index ef92c9e72..5d54c8416 100644 --- a/modules/trackback/trackback.admin.controller.php +++ b/modules/trackback/trackback.admin.controller.php @@ -1,98 +1,98 @@ -stop('msg_cart_is_null'); - $trackback_srl_list= explode('|@|', $cart); - $trackback_count = count($trackback_srl_list); - if(!$trackback_count) return $this->stop('msg_cart_is_null'); - - $oTrackbackController = &getController('trackback'); - - // 글삭제 - for($i=0;$i<$trackback_count;$i++) { - $trackback_srl = trim($trackback_srl_list[$i]); - if(!$trackback_srl) continue; - - $oTrackbackController->deleteTrackback($trackback_srl, true); - } - - $this->setMessage( sprintf(Context::getLang('msg_checked_trackback_is_deleted'), $trackback_count) ); - } - - /** - * @brief 설정 저장 - **/ - function procTrackbackAdminInsertConfig() { - $config->enable_trackback = Context::get('enable_trackback'); - if($config->enable_trackback != 'Y') $config->enable_trackback = 'N'; - - $oModuleController = &getController('module'); - $output = $oModuleController->insertModuleConfig('trackback',$config); - return $output; - } - - /** - * @brief Trackback 모듈별 설정 - **/ - function procTrackbackAdminInsertModuleConfig() { - // 필요한 변수를 받아옴 - $module_srl = Context::get('target_module_srl'); - if(preg_match('/^([0-9,]+)$/',$module_srl)) $module_srl = explode(',',$module_srl); - else $module_srl = array($module_srl); - - $enable_trackback = Context::get('enable_trackback'); - if(!in_array($enable_trackback, array('Y','N'))) $enable_trackback = 'N'; - - if(!$module_srl || !$enable_trackback) return new Object(-1, 'msg_invalid_request'); - - for($i=0;$isetTrackbackModuleConfig($srl, $enable_trackback); - } - - $this->setError(-1); - $this->setMessage('success_updated'); - } - - /** - * @brief Trackback 모듈별 설정 함수 - **/ - function setTrackbackModuleConfig($module_srl, $enable_trackback) { - $config->enable_trackback = $enable_trackback; - - $oModuleController = &getController('module'); - $oModuleController->insertModulePartConfig('trackback', $module_srl, $config); - return new Object(); - } - - /** - * @brief 모듈에 속한 모든 트랙백 삭제 - **/ - function deleteModuleTrackbacks($module_srl) { - // 삭제 - $args->module_srl = $module_srl; - $output = executeQuery('trackback.deleteModuleTrackbacks', $args); - - return $output; - } - } -?> +stop('msg_cart_is_null'); + $trackback_srl_list= explode('|@|', $cart); + $trackback_count = count($trackback_srl_list); + if(!$trackback_count) return $this->stop('msg_cart_is_null'); + + $oTrackbackController = &getController('trackback'); + + // 글삭제 + for($i=0;$i<$trackback_count;$i++) { + $trackback_srl = trim($trackback_srl_list[$i]); + if(!$trackback_srl) continue; + + $oTrackbackController->deleteTrackback($trackback_srl, true); + } + + $this->setMessage( sprintf(Context::getLang('msg_checked_trackback_is_deleted'), $trackback_count) ); + } + + /** + * @brief 설정 저장 + **/ + function procTrackbackAdminInsertConfig() { + $config->enable_trackback = Context::get('enable_trackback'); + if($config->enable_trackback != 'Y') $config->enable_trackback = 'N'; + + $oModuleController = &getController('module'); + $output = $oModuleController->insertModuleConfig('trackback',$config); + return $output; + } + + /** + * @brief Trackback 모듈별 설정 + **/ + function procTrackbackAdminInsertModuleConfig() { + // 필요한 변수를 받아옴 + $module_srl = Context::get('target_module_srl'); + if(preg_match('/^([0-9,]+)$/',$module_srl)) $module_srl = explode(',',$module_srl); + else $module_srl = array($module_srl); + + $enable_trackback = Context::get('enable_trackback'); + if(!in_array($enable_trackback, array('Y','N'))) $enable_trackback = 'N'; + + if(!$module_srl || !$enable_trackback) return new Object(-1, 'msg_invalid_request'); + + for($i=0;$isetTrackbackModuleConfig($srl, $enable_trackback); + } + + $this->setError(-1); + $this->setMessage('success_updated'); + } + + /** + * @brief Trackback 모듈별 설정 함수 + **/ + function setTrackbackModuleConfig($module_srl, $enable_trackback) { + $config->enable_trackback = $enable_trackback; + + $oModuleController = &getController('module'); + $oModuleController->insertModulePartConfig('trackback', $module_srl, $config); + return new Object(); + } + + /** + * @brief 모듈에 속한 모든 트랙백 삭제 + **/ + function deleteModuleTrackbacks($module_srl) { + // 삭제 + $args->module_srl = $module_srl; + $output = executeQuery('trackback.deleteModuleTrackbacks', $args); + + return $output; + } + } +?> diff --git a/modules/trackback/trackback.admin.model.php b/modules/trackback/trackback.admin.model.php index 820d78b84..2364402f1 100644 --- a/modules/trackback/trackback.admin.model.php +++ b/modules/trackback/trackback.admin.model.php @@ -1,68 +1,68 @@ -search_target?$obj->search_target:trim(Context::get('search_target')); - $search_keyword = $obj->search_keyword?$obj->search_keyword:trim(Context::get('search_keyword')); - - if($search_target && $search_keyword) { - switch($search_target) { - case 'url' : - if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); - $args->s_url = $search_keyword; - break; - case 'title' : - if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); - $args->s_title= $search_keyword; - break; - case 'blog_name' : - if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); - $args->s_blog_name= $search_keyword; - break; - case 'excerpt' : - if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); - $args->s_excerpt = $search_keyword; - break; - case 'regdate' : - $args->s_regdate = $search_keyword; - break; - case 'ipaddress' : - $args->s_ipaddress= $search_keyword; - break; - } - } - - // 변수 설정 - $args->sort_index = $obj->sort_index; - $args->page = $obj->page?$obj->page:1; - $args->list_count = $obj->list_count?$obj->list_count:20; - $args->page_count = $obj->page_count?$obj->page_count:10; - $args->s_module_srl = $obj->module_srl; - $args->exclude_module_srl = $obj->exclude_module_srl; - - // trackback.getTotalTrackbackList 쿼리 실행 - $output = executeQuery('trackback.getTotalTrackbackList', $args); - - // 결과가 없거나 오류 발생시 그냥 return - if(!$output->toBool()||!count($output->data)) return $output; - - return $output; - } - } -?> +search_target?$obj->search_target:trim(Context::get('search_target')); + $search_keyword = $obj->search_keyword?$obj->search_keyword:trim(Context::get('search_keyword')); + + if($search_target && $search_keyword) { + switch($search_target) { + case 'url' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_url = $search_keyword; + break; + case 'title' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_title= $search_keyword; + break; + case 'blog_name' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_blog_name= $search_keyword; + break; + case 'excerpt' : + if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); + $args->s_excerpt = $search_keyword; + break; + case 'regdate' : + $args->s_regdate = $search_keyword; + break; + case 'ipaddress' : + $args->s_ipaddress= $search_keyword; + break; + } + } + + // 변수 설정 + $args->sort_index = $obj->sort_index; + $args->page = $obj->page?$obj->page:1; + $args->list_count = $obj->list_count?$obj->list_count:20; + $args->page_count = $obj->page_count?$obj->page_count:10; + $args->s_module_srl = $obj->module_srl; + $args->exclude_module_srl = $obj->exclude_module_srl; + + // trackback.getTotalTrackbackList 쿼리 실행 + $output = executeQuery('trackback.getTotalTrackbackList', $args); + + // 결과가 없거나 오류 발생시 그냥 return + if(!$output->toBool()||!count($output->data)) return $output; + + return $output; + } + } +?> diff --git a/modules/trackback/trackback.admin.view.php b/modules/trackback/trackback.admin.view.php index 3f45497f0..91d61199b 100644 --- a/modules/trackback/trackback.admin.view.php +++ b/modules/trackback/trackback.admin.view.php @@ -1,50 +1,50 @@ -getModuleConfig('trackback'); - Context::set('config',$config); - - // 목록을 구하기 위한 옵션 - $args->page = Context::get('page'); ///< 페이지 - $args->list_count = 30; ///< 한페이지에 보여줄 글 수 - $args->page_count = 10; ///< 페이지 네비게이션에 나타날 페이지의 수 - - $args->sort_index = 'list_order'; ///< 소팅 값 - $args->module_srl = Context::get('module_srl'); - - // 목록 구함 - $oTrackbackAdminModel = &getAdminModel('trackback'); - $output = $oTrackbackAdminModel->getTotalTrackbackList($args); - - // 템플릿에 쓰기 위해서 변수 설정 - Context::set('total_count', $output->total_count); - Context::set('total_page', $output->total_page); - Context::set('page', $output->page); - Context::set('trackback_list', $output->data); - Context::set('page_navigation', $output->page_navigation); - - // 템플릿 지정 - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('trackback_list'); - } - - } -?> +getModuleConfig('trackback'); + Context::set('config',$config); + + // 목록을 구하기 위한 옵션 + $args->page = Context::get('page'); ///< 페이지 + $args->list_count = 30; ///< 한페이지에 보여줄 글 수 + $args->page_count = 10; ///< 페이지 네비게이션에 나타날 페이지의 수 + + $args->sort_index = 'list_order'; ///< 소팅 값 + $args->module_srl = Context::get('module_srl'); + + // 목록 구함 + $oTrackbackAdminModel = &getAdminModel('trackback'); + $output = $oTrackbackAdminModel->getTotalTrackbackList($args); + + // 템플릿에 쓰기 위해서 변수 설정 + Context::set('total_count', $output->total_count); + Context::set('total_page', $output->total_page); + Context::set('page', $output->page); + Context::set('trackback_list', $output->data); + Context::set('page_navigation', $output->page_navigation); + + // 템플릿 지정 + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('trackback_list'); + } + + } +?> diff --git a/modules/trackback/trackback.class.php b/modules/trackback/trackback.class.php index 2e4c72e05..43930f54b 100644 --- a/modules/trackback/trackback.class.php +++ b/modules/trackback/trackback.class.php @@ -1,87 +1,87 @@ -insertActionForward('trackback', 'controller', 'trackback'); - - // 2007. 10. 17 게시글이 삭제될때 엮인글도 삭제되도록 trigger 등록 - $oModuleController->insertTrigger('document.deleteDocument', 'trackback', 'controller', 'triggerDeleteDocumentTrackbacks', 'after'); - - // 2007. 10. 17 모듈이 삭제될때 등록된 엮인글도 모두 삭제하는 트리거 추가 - $oModuleController->insertTrigger('module.deleteModule', 'trackback', 'controller', 'triggerDeleteModuleTrackbacks', 'after'); - - // 2007. 10. 18 게시글 팝업메뉴에서 엮인글 발송 기능 추가 - $oModuleController->insertTrigger('document.getDocumentMenu', 'trackback', 'controller', 'triggerSendTrackback', 'after'); - - // 2007. 10. 19 모듈별 엮인글 받는 기능 추가 - $oModuleController->insertTrigger('module.dispAdditionSetup', 'trackback', 'view', 'triggerDispTrackbackAdditionSetup', 'before'); - - return new Object(); - } - - /** - * @brief 설치가 이상이 없는지 체크하는 method - **/ - function checkUpdate() { - $oModuleModel = &getModel('module'); - - // 2007. 10. 17 게시글이 삭제될때 댓글도 삭제되도록 trigger 등록 - if(!$oModuleModel->getTrigger('document.deleteDocument', 'trackback', 'controller', 'triggerDeleteDocumentTrackbacks', 'after')) return true; - - // 2007. 10. 17 모듈이 삭제될때 등록된 엮인글도 모두 삭제하는 트리거 추가 - if(!$oModuleModel->getTrigger('module.deleteModule', 'trackback', 'controller', 'triggerDeleteModuleTrackbacks', 'after')) return true; - - // 2007. 10. 18 게시글 팝업메뉴에서 엮인글 발송 기능 추가 - if(!$oModuleModel->getTrigger('document.getDocumentMenu', 'trackback', 'controller', 'triggerSendTrackback', 'after')) return true; - - // 2007. 10. 19 모듈별 엮인글 받는 기능 추가 - if(!$oModuleModel->getTrigger('module.dispAdditionSetup', 'trackback', 'view', 'triggerDispTrackbackAdditionSetup', 'before')) return true; - - return false; - } - - /** - * @brief 업데이트 실행 - **/ - function moduleUpdate() { - $oModuleModel = &getModel('module'); - $oModuleController = &getController('module'); - - // 2007. 10. 17 게시글이 삭제될때 댓글도 삭제되도록 trigger 등록 - if(!$oModuleModel->getTrigger('document.deleteDocument', 'trackback', 'controller', 'triggerDeleteDocumentTrackbacks', 'after')) - $oModuleController->insertTrigger('document.deleteDocument', 'trackback', 'controller', 'triggerDeleteDocumentTrackbacks', 'after'); - - // 2007. 10. 17 모듈이 삭제될때 등록된 엮인글도 모두 삭제하는 트리거 추가 - if(!$oModuleModel->getTrigger('module.deleteModule', 'trackback', 'controller', 'triggerDeleteModuleTrackbacks', 'after')) - $oModuleController->insertTrigger('module.deleteModule', 'trackback', 'controller', 'triggerDeleteModuleTrackbacks', 'after'); - - // 2007. 10. 18 게시글 팝업메뉴에서 엮인글 발송 기능 추가 - if(!$oModuleModel->getTrigger('document.getDocumentMenu', 'trackback', 'controller', 'triggerSendTrackback', 'after')) - $oModuleController->insertTrigger('document.getDocumentMenu', 'trackback', 'controller', 'triggerSendTrackback', 'after'); - - // 2007. 10. 19 모듈별 엮인글 받는 기능 추가 - if(!$oModuleModel->getTrigger('module.dispAdditionSetup', 'trackback', 'view', 'triggerDispTrackbackAdditionSetup', 'before')) - $oModuleController->insertTrigger('module.dispAdditionSetup', 'trackback', 'view', 'triggerDispTrackbackAdditionSetup', 'before'); - - return new Object(0, 'success_updated'); - } - - /** - * @brief 캐시 파일 재생성 - **/ - function recompileCache() { - } - - } -?> +insertActionForward('trackback', 'controller', 'trackback'); + + // 2007. 10. 17 게시글이 삭제될때 엮인글도 삭제되도록 trigger 등록 + $oModuleController->insertTrigger('document.deleteDocument', 'trackback', 'controller', 'triggerDeleteDocumentTrackbacks', 'after'); + + // 2007. 10. 17 모듈이 삭제될때 등록된 엮인글도 모두 삭제하는 트리거 추가 + $oModuleController->insertTrigger('module.deleteModule', 'trackback', 'controller', 'triggerDeleteModuleTrackbacks', 'after'); + + // 2007. 10. 18 게시글 팝업메뉴에서 엮인글 발송 기능 추가 + $oModuleController->insertTrigger('document.getDocumentMenu', 'trackback', 'controller', 'triggerSendTrackback', 'after'); + + // 2007. 10. 19 모듈별 엮인글 받는 기능 추가 + $oModuleController->insertTrigger('module.dispAdditionSetup', 'trackback', 'view', 'triggerDispTrackbackAdditionSetup', 'before'); + + return new Object(); + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + **/ + function checkUpdate() { + $oModuleModel = &getModel('module'); + + // 2007. 10. 17 게시글이 삭제될때 댓글도 삭제되도록 trigger 등록 + if(!$oModuleModel->getTrigger('document.deleteDocument', 'trackback', 'controller', 'triggerDeleteDocumentTrackbacks', 'after')) return true; + + // 2007. 10. 17 모듈이 삭제될때 등록된 엮인글도 모두 삭제하는 트리거 추가 + if(!$oModuleModel->getTrigger('module.deleteModule', 'trackback', 'controller', 'triggerDeleteModuleTrackbacks', 'after')) return true; + + // 2007. 10. 18 게시글 팝업메뉴에서 엮인글 발송 기능 추가 + if(!$oModuleModel->getTrigger('document.getDocumentMenu', 'trackback', 'controller', 'triggerSendTrackback', 'after')) return true; + + // 2007. 10. 19 모듈별 엮인글 받는 기능 추가 + if(!$oModuleModel->getTrigger('module.dispAdditionSetup', 'trackback', 'view', 'triggerDispTrackbackAdditionSetup', 'before')) return true; + + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + $oModuleModel = &getModel('module'); + $oModuleController = &getController('module'); + + // 2007. 10. 17 게시글이 삭제될때 댓글도 삭제되도록 trigger 등록 + if(!$oModuleModel->getTrigger('document.deleteDocument', 'trackback', 'controller', 'triggerDeleteDocumentTrackbacks', 'after')) + $oModuleController->insertTrigger('document.deleteDocument', 'trackback', 'controller', 'triggerDeleteDocumentTrackbacks', 'after'); + + // 2007. 10. 17 모듈이 삭제될때 등록된 엮인글도 모두 삭제하는 트리거 추가 + if(!$oModuleModel->getTrigger('module.deleteModule', 'trackback', 'controller', 'triggerDeleteModuleTrackbacks', 'after')) + $oModuleController->insertTrigger('module.deleteModule', 'trackback', 'controller', 'triggerDeleteModuleTrackbacks', 'after'); + + // 2007. 10. 18 게시글 팝업메뉴에서 엮인글 발송 기능 추가 + if(!$oModuleModel->getTrigger('document.getDocumentMenu', 'trackback', 'controller', 'triggerSendTrackback', 'after')) + $oModuleController->insertTrigger('document.getDocumentMenu', 'trackback', 'controller', 'triggerSendTrackback', 'after'); + + // 2007. 10. 19 모듈별 엮인글 받는 기능 추가 + if(!$oModuleModel->getTrigger('module.dispAdditionSetup', 'trackback', 'view', 'triggerDispTrackbackAdditionSetup', 'before')) + $oModuleController->insertTrigger('module.dispAdditionSetup', 'trackback', 'view', 'triggerDispTrackbackAdditionSetup', 'before'); + + return new Object(0, 'success_updated'); + } + + /** + * @brief 캐시 파일 재생성 + **/ + function recompileCache() { + } + + } +?> diff --git a/modules/trackback/trackback.controller.php b/modules/trackback/trackback.controller.php index 814dbd24a..7f56971ca 100644 --- a/modules/trackback/trackback.controller.php +++ b/modules/trackback/trackback.controller.php @@ -1,334 +1,334 @@ -member_srl) return new Object(-1, 'msg_not_permitted'); - - // 게시물의 정보를 구해와서 있는지 여부와 권한을 체크 - $oDocumentModel = &getModel('document'); - $oDocument = $oDocumentModel->getDocument($document_srl); - if(!$oDocument->isExists()) return new Object(-1, 'msg_invalid_request'); - if($oDocument->getMemberSrl() != $logged_info->member_srl) return new Object(-1, 'msg_not_permitted'); - - // 현재 글이 있는 모듈의 타이틀 지정 - $oModuleModel = &getModel('module'); - $module_info = $oModuleModel->getModuleInfoByModuleSrl($oDocument->get('module_srl')); - Context::setBrowserTitle($module_info->browser_title); - - // 엮인글 발송 - return $this->sendTrackback($oDocument, $trackback_url, $charset); - } - - /** - * @brief 문서 팝업메뉴에서 엮인글을 발송하는 메뉴 추가 - **/ - function triggerSendTrackback(&$menu_list) { - $logged_info = Context::get('logged_info'); - if(!$logged_info->member_srl) return new Object(); - - // 요청된 게시물 번호와 현재 로그인 정보 구함 - $document_srl = Context::get('target_srl'); - $oDocumentModel = &getModel('document'); - $oDocument = $oDocumentModel->getDocument($document_srl); - if(!$oDocument->isExists()) return new Object(); - if($oDocument->getMemberSrl() != $logged_info->member_srl) return new Object(); - - // 엮인글 발송 링크 추가 - $oDocumentController = &getController('document'); - $url = getUrl('','module','trackback','act','dispTrackbackSend','document_srl', $document_srl); - $oDocumentController->addDocumentPopupMenu($url,'cmd_send_trackback','./modules/document/tpl/icons/send_trackback.gif','popup'); - - return new Object(); - } - - /** - * @brief document삭제시 해당 document의 엮인글을 삭제하는 trigger - **/ - function triggerDeleteDocumentTrackbacks(&$obj) { - $document_srl = $obj->document_srl; - if(!$document_srl) return new Object(); - - return $this->deleteTrackbacks($document_srl, true); - } - - /** - * @brief module 삭제시 해당 엮인글 모두 삭제하는 trigger - **/ - function triggerDeleteModuleTrackbacks(&$obj) { - $module_srl = $obj->module_srl; - if(!$module_srl) return new Object(); - - $oTrackbackController = &getAdminController('trackback'); - return $oTrackbackController->deleteModuleTrackbacks($module_srl); - } - - /** - * @brief 엮인글 입력 - **/ - function trackback() { - // 출력을 XMLRPC로 설정 - Context::setRequestMethod("XMLRPC"); - - // 엮인글 받을때 필요한 변수를 구함 - $obj = Context::gets('document_srl','blog_name','url','title','excerpt'); - if(!$obj->document_srl || !$obj->url || !$obj->title || !$obj->excerpt) return $this->stop('fail'); - - // 올바른 trackback url인지 검사 - $given_key = Context::get('key'); - $oTrackbackModel = &getModel('trackback'); - $key = $oTrackbackModel->getTrackbackKey($obj->document_srl); - if($key != $given_key) return $this->stop('fail'); - - // 엮인글 모듈의 기본 설정을 받음 - $module_srl = Context::get('module_srl'); - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModulePartConfig('trackback', $module_srl); - $enable_trackback = $config->enable_trackback; - if(!$enable_trackback) { - $config = $oModuleModel->getModuleConfig('trackback'); - $enable_trackback = $config->enable_trackback; - } - - // 관리자가 금지하였을 경우에는 엮인글을 받지 않음 - if($enable_trackback == 'N') return $this->stop('fail'); - - return $this->insertTrackback($obj); - } - - function insertTrackback($obj, $manual_inserted = false) { - // 엮인글 정리 - $obj = Context::convertEncoding($obj); - if(!$obj->blog_name) $obj->blog_name = $obj->title; - $obj->excerpt = strip_tags($obj->excerpt); - - // trigger 호출 (before) - $output = ModuleHandler::triggerCall('trackback.insertTrackback', 'before', $obj); - if(!$output->toBool()) return $output; - - // GET으로 넘어온 document_srl을 참조, 없으면 오류~ - $document_srl = $obj->document_srl; - - if(!$manual_inserted) { - // document model 객체 생성후 원본글을 가져옴 - $oDocumentModel = &getModel('document'); - $oDocument = $oDocumentModel->getDocument($document_srl); - - // 원본글이 없거나 트랙백 허용을 하지 않으면 오류 표시 - if(!$oDocument->isExists()) return $this->stop('fail'); - if(!$oDocument->allowTrackback()) return new Object(-1,'fail'); - - $obj->module_srl = $oDocument->get('module_srl'); - } - - // 엮인글을 입력 - $obj->trackback_srl = getNextSequence(); - $obj->list_order = $obj->trackback_srl*-1; - $output = executeQuery('trackback.insertTrackback', $obj); - if(!$output->toBool()) return $output; - - // 입력에 이상이 없으면 해당 글의 엮인글 수를 올림 - if(!$manual_inserted) { - // trackback model 객체 생성 - $oTrackbackModel = &getModel('trackback'); - - // 해당 글의 전체 엮인글 수를 구해옴 - $trackback_count = $oTrackbackModel->getTrackbackCount($document_srl); - - // document controller 객체 생성 - $oDocumentController = &getController('document'); - - // 해당글의 엮인글 수를 업데이트 - $output = $oDocumentController->updateTrackbackCount($document_srl, $trackback_count); - - // 결과 return - if(!$output->toBool()) return $output; - } - - // 원본글에 알림(notify_message)가 설정되어 있으면 메세지 보냄 - if(!$manual_inserted) $oDocument->notify(Context::getLang('trackback'), $obj->excerpt); - - // trigger 호출 (after) - $output = ModuleHandler::triggerCall('trackback.insertTrackback', 'after', $obj); - if(!$output->toBool()) return $output; - - return new Object(); - } - - /** - * @brief 단일 엮인글 삭제 - **/ - function deleteTrackback($trackback_srl, $is_admin = false) { - // trackback model 객체 생성 - $oTrackbackModel = &getModel('trackback'); - - // 삭제하려는 엮인글이 있는지 확인 - $trackback = $oTrackbackModel->getTrackback($trackback_srl); - if($trackback->data->trackback_srl != $trackback_srl) return new Object(-1, 'msg_invalid_request'); - $document_srl = $trackback->data->document_srl; - - // trigger 호출 (before) - $output = ModuleHandler::triggerCall('trackback.deleteTrackback', 'before', $trackback); - if(!$output->toBool()) return $output; - - // document model 객체 생성 - $oDocumentModel = &getModel('document'); - - // 권한이 있는지 확인 - if(!$is_admin && !$oDocumentModel->isGranted($document_srl)) return new Object(-1, 'msg_not_permitted'); - - $args->trackback_srl = $trackback_srl; - $output = executeQuery('trackback.deleteTrackback', $args); - if(!$output->toBool()) return new Object(-1, 'msg_error_occured'); - - // 엮인글 수를 구해서 업데이트 - $trackback_count = $oTrackbackModel->getTrackbackCount($document_srl); - - // document controller 객체 생성 - $oDocumentController = &getController('document','controller'); - - // 해당글의 엮인글 수를 업데이트 - $output = $oDocumentController->updateTrackbackCount($document_srl, $trackback_count); - $output->add('document_srl', $document_srl); - - // trigger 호출 (before) - $output = ModuleHandler::triggerCall('trackback.deleteTrackback', 'after', $trackback); - if(!$output->toBool()) return $output; - - return $output; - } - - /** - * @brief 글에 속한 모든 트랙백 삭제 - **/ - function deleteTrackbacks($document_srl) { - // 삭제 - $args->document_srl = $document_srl; - $output = executeQuery('trackback.deleteTrackbacks', $args); - - return $output; - } - - /** - * @brief 엮인글을 발송 - * - * 발송 후 결과처리는 하지 않는 구조임 - **/ - function sendTrackback($oDocument, $trackback_url, $charset) { - $oModuleController = &getController('module'); - - // 발송할 정보를 정리 - $http = parse_url($trackback_url); - $obj->blog_name = str_replace(array('<','>','&','"'), array('<','>','&','"'), Context::getBrowserTitle()); - $oModuleController->replaceDefinedLangCode($obj->blog_name); - $obj->title = $oDocument->getTitleText(); - $obj->excerpt = $oDocument->getSummary(200); - $obj->url = getFullUrl('','document_srl',$oDocument->document_srl); - - // blog_name, title, excerpt, url의 문자열을 요청된 charset으로 변경 - if($charset && function_exists('iconv')) { - foreach($obj as $key=>$val) { - $obj->{$key} = iconv('UTF-8',$charset,$val); - } - } - - // socket으로 발송할 내용 작성 - if($http['query']) $http['query'].="&"; - if(!$http['port']) $http['port'] = 80; - - $content = - sprintf( - "title=%s&". - "url=%s&". - "blog_name=%s&". - "excerpt=%s", - urlencode($obj->title), - urlencode($obj->url), - urlencode($obj->blog_name), - urlencode($obj->excerpt) - ); - if($http['query']) $content .= '&'.$http['query']; - $content_length = strlen($content); - - // header 정리 - $header = - sprintf( - "POST %s HTTP/1.1\r\n". - "Host: %s\r\n". - "Content-Type: %s\r\n". - "Content-Length: %s\r\n\r\n". - "%s\r\n", - $http['path'], - $http['host'], - "application/x-www-form-urlencoded", - $content_length, - $content - ); - if(!$http['host']||!$http['port']) return new Object(-1,'msg_trackback_url_is_invalid'); - - // 발송하려는 대상 서버의 socket을 연다 - $fp = @fsockopen($http['host'], $http['port'], $errno, $errstr, 5); - if(!$fp) return new Object(-1,'msg_trackback_url_is_invalid'); - - // 작성한 헤더 정보를 발송 - fputs($fp, $header); - - // 결과를 기다림 (특정 서버의 경우 EOF가 떨어지지 않을 수가 있음 - while(!feof($fp)) { - $line = trim(fgets($fp, 4096)); - if(preg_match("/^/i",$line)){ - $error = preg_replace('/[^0-9]/','',$line); - break; - } - } - - // socket 닫음 - fclose($fp); - - if($error == "0") return new Object(0, 'msg_trackback_send_success'); - - return new Object(-1, 'msg_trackback_send_failed'); - } - - /** - * @brief 특정 ipaddress의 특정 시간대 내의 엮인글을 모두 삭제 - **/ - function deleteTrackbackSender($time, $ipaddress, $url, $blog_name, $title, $excerpt) { - $obj->regdate = date("YmdHis",time()-$time); - $obj->ipaddress = $ipaddress; - $obj->url = $url; - $obj->blog_name = $blog_name; - $obj->title = $title; - $obj->excerpt = $excerpt; - $output = executeQueryArray('trackback.getRegistedTrackbacks', $obj); - if(!$output->data || !count($output->data)) return; - - foreach($output->data as $trackback) { - $trackback_srl = $trackback->trackback_srl; - $this->deleteTrackback($trackback_srl, true); - } - } - } -?> +member_srl) return new Object(-1, 'msg_not_permitted'); + + // 게시물의 정보를 구해와서 있는지 여부와 권한을 체크 + $oDocumentModel = &getModel('document'); + $oDocument = $oDocumentModel->getDocument($document_srl); + if(!$oDocument->isExists()) return new Object(-1, 'msg_invalid_request'); + if($oDocument->getMemberSrl() != $logged_info->member_srl) return new Object(-1, 'msg_not_permitted'); + + // 현재 글이 있는 모듈의 타이틀 지정 + $oModuleModel = &getModel('module'); + $module_info = $oModuleModel->getModuleInfoByModuleSrl($oDocument->get('module_srl')); + Context::setBrowserTitle($module_info->browser_title); + + // 엮인글 발송 + return $this->sendTrackback($oDocument, $trackback_url, $charset); + } + + /** + * @brief 문서 팝업메뉴에서 엮인글을 발송하는 메뉴 추가 + **/ + function triggerSendTrackback(&$menu_list) { + $logged_info = Context::get('logged_info'); + if(!$logged_info->member_srl) return new Object(); + + // 요청된 게시물 번호와 현재 로그인 정보 구함 + $document_srl = Context::get('target_srl'); + $oDocumentModel = &getModel('document'); + $oDocument = $oDocumentModel->getDocument($document_srl); + if(!$oDocument->isExists()) return new Object(); + if($oDocument->getMemberSrl() != $logged_info->member_srl) return new Object(); + + // 엮인글 발송 링크 추가 + $oDocumentController = &getController('document'); + $url = getUrl('','module','trackback','act','dispTrackbackSend','document_srl', $document_srl); + $oDocumentController->addDocumentPopupMenu($url,'cmd_send_trackback','./modules/document/tpl/icons/send_trackback.gif','popup'); + + return new Object(); + } + + /** + * @brief document삭제시 해당 document의 엮인글을 삭제하는 trigger + **/ + function triggerDeleteDocumentTrackbacks(&$obj) { + $document_srl = $obj->document_srl; + if(!$document_srl) return new Object(); + + return $this->deleteTrackbacks($document_srl, true); + } + + /** + * @brief module 삭제시 해당 엮인글 모두 삭제하는 trigger + **/ + function triggerDeleteModuleTrackbacks(&$obj) { + $module_srl = $obj->module_srl; + if(!$module_srl) return new Object(); + + $oTrackbackController = &getAdminController('trackback'); + return $oTrackbackController->deleteModuleTrackbacks($module_srl); + } + + /** + * @brief 엮인글 입력 + **/ + function trackback() { + // 출력을 XMLRPC로 설정 + Context::setRequestMethod("XMLRPC"); + + // 엮인글 받을때 필요한 변수를 구함 + $obj = Context::gets('document_srl','blog_name','url','title','excerpt'); + if(!$obj->document_srl || !$obj->url || !$obj->title || !$obj->excerpt) return $this->stop('fail'); + + // 올바른 trackback url인지 검사 + $given_key = Context::get('key'); + $oTrackbackModel = &getModel('trackback'); + $key = $oTrackbackModel->getTrackbackKey($obj->document_srl); + if($key != $given_key) return $this->stop('fail'); + + // 엮인글 모듈의 기본 설정을 받음 + $module_srl = Context::get('module_srl'); + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModulePartConfig('trackback', $module_srl); + $enable_trackback = $config->enable_trackback; + if(!$enable_trackback) { + $config = $oModuleModel->getModuleConfig('trackback'); + $enable_trackback = $config->enable_trackback; + } + + // 관리자가 금지하였을 경우에는 엮인글을 받지 않음 + if($enable_trackback == 'N') return $this->stop('fail'); + + return $this->insertTrackback($obj); + } + + function insertTrackback($obj, $manual_inserted = false) { + // 엮인글 정리 + $obj = Context::convertEncoding($obj); + if(!$obj->blog_name) $obj->blog_name = $obj->title; + $obj->excerpt = strip_tags($obj->excerpt); + + // trigger 호출 (before) + $output = ModuleHandler::triggerCall('trackback.insertTrackback', 'before', $obj); + if(!$output->toBool()) return $output; + + // GET으로 넘어온 document_srl을 참조, 없으면 오류~ + $document_srl = $obj->document_srl; + + if(!$manual_inserted) { + // document model 객체 생성후 원본글을 가져옴 + $oDocumentModel = &getModel('document'); + $oDocument = $oDocumentModel->getDocument($document_srl); + + // 원본글이 없거나 트랙백 허용을 하지 않으면 오류 표시 + if(!$oDocument->isExists()) return $this->stop('fail'); + if(!$oDocument->allowTrackback()) return new Object(-1,'fail'); + + $obj->module_srl = $oDocument->get('module_srl'); + } + + // 엮인글을 입력 + $obj->trackback_srl = getNextSequence(); + $obj->list_order = $obj->trackback_srl*-1; + $output = executeQuery('trackback.insertTrackback', $obj); + if(!$output->toBool()) return $output; + + // 입력에 이상이 없으면 해당 글의 엮인글 수를 올림 + if(!$manual_inserted) { + // trackback model 객체 생성 + $oTrackbackModel = &getModel('trackback'); + + // 해당 글의 전체 엮인글 수를 구해옴 + $trackback_count = $oTrackbackModel->getTrackbackCount($document_srl); + + // document controller 객체 생성 + $oDocumentController = &getController('document'); + + // 해당글의 엮인글 수를 업데이트 + $output = $oDocumentController->updateTrackbackCount($document_srl, $trackback_count); + + // 결과 return + if(!$output->toBool()) return $output; + } + + // 원본글에 알림(notify_message)가 설정되어 있으면 메세지 보냄 + if(!$manual_inserted) $oDocument->notify(Context::getLang('trackback'), $obj->excerpt); + + // trigger 호출 (after) + $output = ModuleHandler::triggerCall('trackback.insertTrackback', 'after', $obj); + if(!$output->toBool()) return $output; + + return new Object(); + } + + /** + * @brief 단일 엮인글 삭제 + **/ + function deleteTrackback($trackback_srl, $is_admin = false) { + // trackback model 객체 생성 + $oTrackbackModel = &getModel('trackback'); + + // 삭제하려는 엮인글이 있는지 확인 + $trackback = $oTrackbackModel->getTrackback($trackback_srl); + if($trackback->data->trackback_srl != $trackback_srl) return new Object(-1, 'msg_invalid_request'); + $document_srl = $trackback->data->document_srl; + + // trigger 호출 (before) + $output = ModuleHandler::triggerCall('trackback.deleteTrackback', 'before', $trackback); + if(!$output->toBool()) return $output; + + // document model 객체 생성 + $oDocumentModel = &getModel('document'); + + // 권한이 있는지 확인 + if(!$is_admin && !$oDocumentModel->isGranted($document_srl)) return new Object(-1, 'msg_not_permitted'); + + $args->trackback_srl = $trackback_srl; + $output = executeQuery('trackback.deleteTrackback', $args); + if(!$output->toBool()) return new Object(-1, 'msg_error_occured'); + + // 엮인글 수를 구해서 업데이트 + $trackback_count = $oTrackbackModel->getTrackbackCount($document_srl); + + // document controller 객체 생성 + $oDocumentController = &getController('document','controller'); + + // 해당글의 엮인글 수를 업데이트 + $output = $oDocumentController->updateTrackbackCount($document_srl, $trackback_count); + $output->add('document_srl', $document_srl); + + // trigger 호출 (before) + $output = ModuleHandler::triggerCall('trackback.deleteTrackback', 'after', $trackback); + if(!$output->toBool()) return $output; + + return $output; + } + + /** + * @brief 글에 속한 모든 트랙백 삭제 + **/ + function deleteTrackbacks($document_srl) { + // 삭제 + $args->document_srl = $document_srl; + $output = executeQuery('trackback.deleteTrackbacks', $args); + + return $output; + } + + /** + * @brief 엮인글을 발송 + * + * 발송 후 결과처리는 하지 않는 구조임 + **/ + function sendTrackback($oDocument, $trackback_url, $charset) { + $oModuleController = &getController('module'); + + // 발송할 정보를 정리 + $http = parse_url($trackback_url); + $obj->blog_name = str_replace(array('<','>','&','"'), array('<','>','&','"'), Context::getBrowserTitle()); + $oModuleController->replaceDefinedLangCode($obj->blog_name); + $obj->title = $oDocument->getTitleText(); + $obj->excerpt = $oDocument->getSummary(200); + $obj->url = getFullUrl('','document_srl',$oDocument->document_srl); + + // blog_name, title, excerpt, url의 문자열을 요청된 charset으로 변경 + if($charset && function_exists('iconv')) { + foreach($obj as $key=>$val) { + $obj->{$key} = iconv('UTF-8',$charset,$val); + } + } + + // socket으로 발송할 내용 작성 + if($http['query']) $http['query'].="&"; + if(!$http['port']) $http['port'] = 80; + + $content = + sprintf( + "title=%s&". + "url=%s&". + "blog_name=%s&". + "excerpt=%s", + urlencode($obj->title), + urlencode($obj->url), + urlencode($obj->blog_name), + urlencode($obj->excerpt) + ); + if($http['query']) $content .= '&'.$http['query']; + $content_length = strlen($content); + + // header 정리 + $header = + sprintf( + "POST %s HTTP/1.1\r\n". + "Host: %s\r\n". + "Content-Type: %s\r\n". + "Content-Length: %s\r\n\r\n". + "%s\r\n", + $http['path'], + $http['host'], + "application/x-www-form-urlencoded", + $content_length, + $content + ); + if(!$http['host']||!$http['port']) return new Object(-1,'msg_trackback_url_is_invalid'); + + // 발송하려는 대상 서버의 socket을 연다 + $fp = @fsockopen($http['host'], $http['port'], $errno, $errstr, 5); + if(!$fp) return new Object(-1,'msg_trackback_url_is_invalid'); + + // 작성한 헤더 정보를 발송 + fputs($fp, $header); + + // 결과를 기다림 (특정 서버의 경우 EOF가 떨어지지 않을 수가 있음 + while(!feof($fp)) { + $line = trim(fgets($fp, 4096)); + if(preg_match("/^/i",$line)){ + $error = preg_replace('/[^0-9]/','',$line); + break; + } + } + + // socket 닫음 + fclose($fp); + + if($error == "0") return new Object(0, 'msg_trackback_send_success'); + + return new Object(-1, 'msg_trackback_send_failed'); + } + + /** + * @brief 특정 ipaddress의 특정 시간대 내의 엮인글을 모두 삭제 + **/ + function deleteTrackbackSender($time, $ipaddress, $url, $blog_name, $title, $excerpt) { + $obj->regdate = date("YmdHis",time()-$time); + $obj->ipaddress = $ipaddress; + $obj->url = $url; + $obj->blog_name = $blog_name; + $obj->title = $title; + $obj->excerpt = $excerpt; + $output = executeQueryArray('trackback.getRegistedTrackbacks', $obj); + if(!$output->data || !count($output->data)) return; + + foreach($output->data as $trackback) { + $trackback_srl = $trackback->trackback_srl; + $this->deleteTrackback($trackback_srl, true); + } + } + } +?> diff --git a/modules/trackback/trackback.model.php b/modules/trackback/trackback.model.php index 3fade8b7a..9a10a9299 100644 --- a/modules/trackback/trackback.model.php +++ b/modules/trackback/trackback.model.php @@ -1,151 +1,151 @@ -trackback_srl = $trackback_srl; - return executeQuery('trackback.getTrackback', $args); - } - - /** - * @brief document_srl 에 해당하는 엮인글의 전체 갯수를 가져옴 - **/ - function getTrackbackCount($document_srl) { - $args->document_srl = $document_srl; - $output = executeQuery('trackback.getTrackbackCount', $args); - $total_count = $output->data->count; - - return (int)$total_count; - } - - - /** - * @brief module_srl 에 해당하는 엮인글의 전체 갯수를 가져옴 - **/ - function getTrackbackAllCount($module_srl) { - $args->module_srl = $module_srl; - $output = executeQuery('trackback.getTrackbackCount', $args); - $total_count = $output->data->count; - - return (int)$total_count; - } - - - /** - * @brief 특정 document에 특정 ip로 기록된 트랙백의 갯수 - * spamfilter 에서 사용할 method임 - **/ - function getTrackbackCountByIPAddress($document_srl, $ipaddress) { - $args->document_srl = $document_srl; - $args->ipaddress = $ipaddress; - $output = executeQuery('trackback.getTrackbackCountByIPAddress', $args); - $total_count = $output->data->count; - - return (int)$total_count; - } - - /** - * @brief 특정 문서에 속한 엮인글의 목록을 가져옴 - **/ - function getTrackbackList($document_srl) { - $args->document_srl = $document_srl; - $args->list_order = 'list_order'; - $output = executeQuery('trackback.getTrackbackList', $args); - - if(!$output->toBool()) return $output; - - $trackback_list = $output->data; - - if(!is_array($trackback_list)) $trackback_list = array($trackback_list); - - return $trackback_list; - } - - /** - * @brief mid 에 해당하는 엮인글을 가져옴 - **/ - function getNewestTrackbackList($obj) { - if($obj->mid) { - $oModuleModel = &getModel('module'); - $obj->module_srl = $oModuleModel->getModuleSrlByMid($obj->mid); - unset($obj->mid); - } - - // 넘어온 module_srl은 array일 수도 있기에 array인지를 체크 - if(is_array($obj->module_srl)) $args->module_srl = implode(',', $obj->module_srl); - else $args->module_srl = $obj->module_srl; - $args->list_count = $obj->list_count; - if($obj->site_srl) $args->site_srl = (int)$obj->site_srl; - $args->sort_index = 'trackbacks.list_order'; - $args->order = 'asc'; - - $output = executeQueryArray('trackback.getNewestTrackbackList', $args); - - return $output; - } - - /** - * @brief 특정 모듈의 trackback 설정을 return - **/ - function getTrackbackModuleConfig($module_srl) { - // trackback 모듈의 config를 가져옴 - $oModuleModel = &getModel('module'); - $module_trackback_config = $oModuleModel->getModulePartConfig('trackback', $module_srl); - if(!$module_trackback_config) { - $trackback_config = $oModuleModel->getModuleConfig('trackback'); - $module_trackback_config->enable_trackback = $trackback_config->enable_trackback!='N'?'Y':'N'; - } - $module_trackback_config->module_srl = $module_srl; - return $module_trackback_config; - } - - /** - * @brief 정해진 시간내에 전체 엮인글 등록수를 구함 - **/ - function getRegistedTrackback($time, $ipaddress, $url, $blog_name, $title, $excerpt) { - $obj->regdate = date("YmdHis",time()-$time); - $obj->ipaddress = $ipaddress; - $obj->url = $url; - $obj->blog_name = $blog_name; - $obj->title = $title; - $obj->excerpt = $excerpt; - $output = executeQuery('trackback.getRegistedTrackback', $obj); - return $output->data->count; - } - - /** - * @brief trackback url을 생성하여 return - * trackback url에 key값을 추가함. - **/ - function getTrackbackUrl($document_srl) { - $url = getFullUrl('','document_srl',$document_srl,'act','trackback','key',$this->getTrackbackKey($document_srl)); - return $url; - } - - /** - * @brief 키값을 생성하여 return - * key값은 db 비번 정보 + 10분 단위의 시간값을 합쳐서 hash결과를 이용함 - * 단 url이 너무 길어져서 1, 10, 20 자리수의 글자 하나씩만을 조합해서 return - **/ - function getTrackbackKey($document_srl) { - $time = (int) (time()/(60*10)); - $db_info = Context::getDBInfo(); - $key = md5($document_srl.$db_info->db_password.$time); - return sprintf("%s%s%s",substr($key,1,1),substr($key,10,1),substr($key,20,1)); - } - } -?> +trackback_srl = $trackback_srl; + return executeQuery('trackback.getTrackback', $args); + } + + /** + * @brief document_srl 에 해당하는 엮인글의 전체 갯수를 가져옴 + **/ + function getTrackbackCount($document_srl) { + $args->document_srl = $document_srl; + $output = executeQuery('trackback.getTrackbackCount', $args); + $total_count = $output->data->count; + + return (int)$total_count; + } + + + /** + * @brief module_srl 에 해당하는 엮인글의 전체 갯수를 가져옴 + **/ + function getTrackbackAllCount($module_srl) { + $args->module_srl = $module_srl; + $output = executeQuery('trackback.getTrackbackCount', $args); + $total_count = $output->data->count; + + return (int)$total_count; + } + + + /** + * @brief 특정 document에 특정 ip로 기록된 트랙백의 갯수 + * spamfilter 에서 사용할 method임 + **/ + function getTrackbackCountByIPAddress($document_srl, $ipaddress) { + $args->document_srl = $document_srl; + $args->ipaddress = $ipaddress; + $output = executeQuery('trackback.getTrackbackCountByIPAddress', $args); + $total_count = $output->data->count; + + return (int)$total_count; + } + + /** + * @brief 특정 문서에 속한 엮인글의 목록을 가져옴 + **/ + function getTrackbackList($document_srl) { + $args->document_srl = $document_srl; + $args->list_order = 'list_order'; + $output = executeQuery('trackback.getTrackbackList', $args); + + if(!$output->toBool()) return $output; + + $trackback_list = $output->data; + + if(!is_array($trackback_list)) $trackback_list = array($trackback_list); + + return $trackback_list; + } + + /** + * @brief mid 에 해당하는 엮인글을 가져옴 + **/ + function getNewestTrackbackList($obj) { + if($obj->mid) { + $oModuleModel = &getModel('module'); + $obj->module_srl = $oModuleModel->getModuleSrlByMid($obj->mid); + unset($obj->mid); + } + + // 넘어온 module_srl은 array일 수도 있기에 array인지를 체크 + if(is_array($obj->module_srl)) $args->module_srl = implode(',', $obj->module_srl); + else $args->module_srl = $obj->module_srl; + $args->list_count = $obj->list_count; + if($obj->site_srl) $args->site_srl = (int)$obj->site_srl; + $args->sort_index = 'trackbacks.list_order'; + $args->order = 'asc'; + + $output = executeQueryArray('trackback.getNewestTrackbackList', $args); + + return $output; + } + + /** + * @brief 특정 모듈의 trackback 설정을 return + **/ + function getTrackbackModuleConfig($module_srl) { + // trackback 모듈의 config를 가져옴 + $oModuleModel = &getModel('module'); + $module_trackback_config = $oModuleModel->getModulePartConfig('trackback', $module_srl); + if(!$module_trackback_config) { + $trackback_config = $oModuleModel->getModuleConfig('trackback'); + $module_trackback_config->enable_trackback = $trackback_config->enable_trackback!='N'?'Y':'N'; + } + $module_trackback_config->module_srl = $module_srl; + return $module_trackback_config; + } + + /** + * @brief 정해진 시간내에 전체 엮인글 등록수를 구함 + **/ + function getRegistedTrackback($time, $ipaddress, $url, $blog_name, $title, $excerpt) { + $obj->regdate = date("YmdHis",time()-$time); + $obj->ipaddress = $ipaddress; + $obj->url = $url; + $obj->blog_name = $blog_name; + $obj->title = $title; + $obj->excerpt = $excerpt; + $output = executeQuery('trackback.getRegistedTrackback', $obj); + return $output->data->count; + } + + /** + * @brief trackback url을 생성하여 return + * trackback url에 key값을 추가함. + **/ + function getTrackbackUrl($document_srl) { + $url = getFullUrl('','document_srl',$document_srl,'act','trackback','key',$this->getTrackbackKey($document_srl)); + return $url; + } + + /** + * @brief 키값을 생성하여 return + * key값은 db 비번 정보 + 10분 단위의 시간값을 합쳐서 hash결과를 이용함 + * 단 url이 너무 길어져서 1, 10, 20 자리수의 글자 하나씩만을 조합해서 return + **/ + function getTrackbackKey($document_srl) { + $time = (int) (time()/(60*10)); + $db_info = Context::getDBInfo(); + $key = md5($document_srl.$db_info->db_password.$time); + return sprintf("%s%s%s",substr($key,1,1),substr($key,10,1),substr($key,20,1)); + } + } +?> diff --git a/modules/trackback/trackback.view.php b/modules/trackback/trackback.view.php index 7c9ff133b..6e01b7388 100644 --- a/modules/trackback/trackback.view.php +++ b/modules/trackback/trackback.view.php @@ -1,70 +1,70 @@ -stop('msg_invalid_request'); - - $logged_info = Context::get('logged_info'); - if(!$logged_info->member_srl) return $this->stop('msg_not_permitted'); - - // 원본 글의 정보를 구함 - $oDocumentModel = &getModel('document'); - $oDocument = $oDocumentModel->getDocument($document_srl); - if(!$oDocument->isExists()) return $this->stop('msg_invalid_document'); - if($oDocument->isSecret()) return $this->stop('msg_invalid_request'); - - if($oDocument->getMemberSrl() != $logged_info->member_srl) return $this->stop('msg_not_permitted'); - - Context::set('oDocument', $oDocument); - - // 템플릿 지정 - $this->setLayoutFile('popup_layout'); - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('send_trackback_form'); - } - - /** - * @brief 서비스형 모듈의 추가 설정을 위한 부분 - * trackback의 사용 형태에 대한 설정만 받음 - **/ - function triggerDispTrackbackAdditionSetup(&$obj) { - $current_module_srl = Context::get('module_srl'); - $current_module_srls = Context::get('module_srls'); - - if(!$current_module_srl && !$current_module_srls) { - // 선택된 모듈의 정보를 가져옴 - $current_module_info = Context::get('current_module_info'); - $current_module_srl = $current_module_info->module_srl; - if(!$current_module_srl) return new Object(); - } - - // 선택된 모듈의 trackback설정을 가져옴 - $oTrackbackModel = &getModel('trackback'); - $trackback_config = $oTrackbackModel->getTrackbackModuleConfig($current_module_srl); - Context::set('trackback_config', $trackback_config); - - // 템플릿 파일 지정 - $oTemplate = &TemplateHandler::getInstance(); - $tpl = $oTemplate->compile($this->module_path.'tpl', 'trackback_module_config'); - $obj .= $tpl; - - return new Object(); - } - } -?> +stop('msg_invalid_request'); + + $logged_info = Context::get('logged_info'); + if(!$logged_info->member_srl) return $this->stop('msg_not_permitted'); + + // 원본 글의 정보를 구함 + $oDocumentModel = &getModel('document'); + $oDocument = $oDocumentModel->getDocument($document_srl); + if(!$oDocument->isExists()) return $this->stop('msg_invalid_document'); + if($oDocument->isSecret()) return $this->stop('msg_invalid_request'); + + if($oDocument->getMemberSrl() != $logged_info->member_srl) return $this->stop('msg_not_permitted'); + + Context::set('oDocument', $oDocument); + + // 템플릿 지정 + $this->setLayoutFile('popup_layout'); + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('send_trackback_form'); + } + + /** + * @brief 서비스형 모듈의 추가 설정을 위한 부분 + * trackback의 사용 형태에 대한 설정만 받음 + **/ + function triggerDispTrackbackAdditionSetup(&$obj) { + $current_module_srl = Context::get('module_srl'); + $current_module_srls = Context::get('module_srls'); + + if(!$current_module_srl && !$current_module_srls) { + // 선택된 모듈의 정보를 가져옴 + $current_module_info = Context::get('current_module_info'); + $current_module_srl = $current_module_info->module_srl; + if(!$current_module_srl) return new Object(); + } + + // 선택된 모듈의 trackback설정을 가져옴 + $oTrackbackModel = &getModel('trackback'); + $trackback_config = $oTrackbackModel->getTrackbackModuleConfig($current_module_srl); + Context::set('trackback_config', $trackback_config); + + // 템플릿 파일 지정 + $oTemplate = &TemplateHandler::getInstance(); + $tpl = $oTemplate->compile($this->module_path.'tpl', 'trackback_module_config'); + $obj .= $tpl; + + return new Object(); + } + } +?> diff --git a/modules/widget/conf/info.xml b/modules/widget/conf/info.xml index 2fd5925dd..1439e2d14 100644 --- a/modules/widget/conf/info.xml +++ b/modules/widget/conf/info.xml @@ -1,36 +1,36 @@ - - - 위젯 - 控件管理 - ウィジェット - Widget - Widget - Widget - Виджеты - Widget - Görsel Bileşen (widget) - 위젯 관리 모듈 - 控件管理模块。 - ウィジェット管理モジュール - Module for managing widgets. - Module dành cho quản lý Widget. - Módulo para el manejo de widgets. - Модуль для управления виджетами. - Widget管理模組。 - Widgetları yönetmek için kullanılan modüldür. - 0.1 - 2007-02-28 - construction - - - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - NHN - - + + + 위젯 + 控件管理 + ウィジェット + Widget + Widget + Widget + Виджеты + Widget + Görsel Bileşen (widget) + 위젯 관리 모듈 + 控件管理模块。 + ウィジェット管理モジュール + Module for managing widgets. + Module dành cho quản lý Widget. + Módulo para el manejo de widgets. + Модуль для управления виджетами. + Widget管理模組。 + Widgetları yönetmek için kullanılan modüldür. + 0.1 + 2007-02-28 + construction + + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + diff --git a/modules/widget/lang/en.lang.php b/modules/widget/lang/en.lang.php index c3d5ad973..987d18397 100644 --- a/modules/widget/lang/en.lang.php +++ b/modules/widget/lang/en.lang.php @@ -1,68 +1,68 @@ -cmd_generate_code = 'Generate Code'; - - $lang->widget_name = 'Widget Name'; - $lang->widget_maker = 'Developer'; - $lang->widget_license = 'License'; - $lang->widget_history = 'Update History'; - $lang->widget_info = 'Widget Info'; - $lang->widget_code = 'Code'; - $lang->widget_cache = 'Cache'; - - $lang->widget_fix_width = 'Fix Width'; - $lang->widget_width = 'Width'; - $lang->widget_position = 'Position'; - $lang->widget_position_none = 'Next Line'; - $lang->widget_position_left = 'Left'; - $lang->widget_position_right = 'Right'; - $lang->widget_margin = 'Margin'; - $lang->widget_margin_top = 'Top Margin'; - $lang->widget_margin_right = 'Right Margin'; - $lang->widget_margin_bottom = 'Bottom Margin'; - $lang->widget_margin_left= 'Left Margin'; - $lang->about_widget_fix_width = 'Please check to fix the width.'; - $lang->about_widget_width = 'Please set the width of widget.'; - $lang->about_widget_position = 'Please select the position if you want to display many widgets in one line.'; - $lang->about_widget_margin = "You may set the margin of widgets' top, bottom, right and left."; - $lang->about_widget_cache = 'Cached data can be used during the time you have set.'; - - $lang->generated_code = 'Generated Code'; - $lang->widgetstyle= 'Widget Style'; - - $lang->msg_widget_is_not_exists = "'%s' does not exist."; - $lang->msg_widget_object_is_null = "Object of '%s' could not be created."; - $lang->msg_widget_proc_is_null = "proc() of '%s' could not be executed."; - $lang->msg_widget_skin_is_null = "You should select widget's skin"; - - $lang->about_widget_code = 'Please input required value first, and click [Generate Code] button to generate code to add to the template file.'; - $lang->about_widget_code_in_page = 'After entering the required values, click the [Add] button to insert the widget code into the page.'; - $lang->about_widget = "A widget is a small free-standing application used in a layout or page module.\n It can be linked with internal module or external open api. Through its configuration setting, wide application is possible. \n You can directly add a widget by using the [Generate Code] function without using the XE page module or layout module."; - - $lang->cmd_content_insert = "Insert Content by Yourself"; - $lang->cmd_box_widget_insert = "Insert Box Widget"; - $lang->cmd_remove_all_widgets = "Remove All Widgets"; - - $lang->cmd_widget_size = "Widget Size"; - $lang->cmd_widget_align = "Align Widget"; - $lang->cmd_widget_align_left = "Left"; - $lang->cmd_widget_align_right = "Right"; - $lang->cmd_widget_margin = "Margin"; - $lang->cmd_widget_padding = "Padding"; - $lang->cmd_widget_border = "Border"; - $lang->cmd_widget_border_solid = "Solid"; - $lang->cmd_widget_border_dotted = "Dotted"; - $lang->cmd_widget_background_color = "Background Color"; - $lang->cmd_widget_background_image_url = "Background Image"; - $lang->cmd_widget_background_image_repeat = "Repeat"; - $lang->cmd_widget_background_image_no_repeat = "No Repeat"; - $lang->cmd_widget_background_image_x_repeat = "X Repeat"; - $lang->cmd_widget_background_image_y_repeat = "Y Repeat"; - $lang->cmd_widget_background_image_x = "X Position"; - $lang->cmd_widget_background_image_y = "Y Position"; -?> +cmd_generate_code = 'Generate Code'; + + $lang->widget_name = 'Widget Name'; + $lang->widget_maker = 'Developer'; + $lang->widget_license = 'License'; + $lang->widget_history = 'Update History'; + $lang->widget_info = 'Widget Info'; + $lang->widget_code = 'Code'; + $lang->widget_cache = 'Cache'; + + $lang->widget_fix_width = 'Fix Width'; + $lang->widget_width = 'Width'; + $lang->widget_position = 'Position'; + $lang->widget_position_none = 'Next Line'; + $lang->widget_position_left = 'Left'; + $lang->widget_position_right = 'Right'; + $lang->widget_margin = 'Margin'; + $lang->widget_margin_top = 'Top Margin'; + $lang->widget_margin_right = 'Right Margin'; + $lang->widget_margin_bottom = 'Bottom Margin'; + $lang->widget_margin_left= 'Left Margin'; + $lang->about_widget_fix_width = 'Please check to fix the width.'; + $lang->about_widget_width = 'Please set the width of widget.'; + $lang->about_widget_position = 'Please select the position if you want to display many widgets in one line.'; + $lang->about_widget_margin = "You may set the margin of widgets' top, bottom, right and left."; + $lang->about_widget_cache = 'Cached data can be used during the time you have set.'; + + $lang->generated_code = 'Generated Code'; + $lang->widgetstyle= 'Widget Style'; + + $lang->msg_widget_is_not_exists = "'%s' does not exist."; + $lang->msg_widget_object_is_null = "Object of '%s' could not be created."; + $lang->msg_widget_proc_is_null = "proc() of '%s' could not be executed."; + $lang->msg_widget_skin_is_null = "You should select widget's skin"; + + $lang->about_widget_code = 'Please input required value first, and click [Generate Code] button to generate code to add to the template file.'; + $lang->about_widget_code_in_page = 'After entering the required values, click the [Add] button to insert the widget code into the page.'; + $lang->about_widget = "A widget is a small free-standing application used in a layout or page module.\n It can be linked with internal module or external open api. Through its configuration setting, wide application is possible. \n You can directly add a widget by using the [Generate Code] function without using the XE page module or layout module."; + + $lang->cmd_content_insert = "Insert Content by Yourself"; + $lang->cmd_box_widget_insert = "Insert Box Widget"; + $lang->cmd_remove_all_widgets = "Remove All Widgets"; + + $lang->cmd_widget_size = "Widget Size"; + $lang->cmd_widget_align = "Align Widget"; + $lang->cmd_widget_align_left = "Left"; + $lang->cmd_widget_align_right = "Right"; + $lang->cmd_widget_margin = "Margin"; + $lang->cmd_widget_padding = "Padding"; + $lang->cmd_widget_border = "Border"; + $lang->cmd_widget_border_solid = "Solid"; + $lang->cmd_widget_border_dotted = "Dotted"; + $lang->cmd_widget_background_color = "Background Color"; + $lang->cmd_widget_background_image_url = "Background Image"; + $lang->cmd_widget_background_image_repeat = "Repeat"; + $lang->cmd_widget_background_image_no_repeat = "No Repeat"; + $lang->cmd_widget_background_image_x_repeat = "X Repeat"; + $lang->cmd_widget_background_image_y_repeat = "Y Repeat"; + $lang->cmd_widget_background_image_x = "X Position"; + $lang->cmd_widget_background_image_y = "Y Position"; +?> diff --git a/modules/widget/lang/es.lang.php b/modules/widget/lang/es.lang.php index 7ce1faf1d..8286ed60c 100644 --- a/modules/widget/lang/es.lang.php +++ b/modules/widget/lang/es.lang.php @@ -1,68 +1,68 @@ -cmd_generate_code = 'Generar Código'; - - $lang->widget_name = 'Nombre de Widget'; - $lang->widget_maker = 'Desarrollador de Widget'; - $lang->widget_license = 'License'; - $lang->widget_history = 'Actualizar la historia'; - $lang->widget_info = 'información de Widget'; - $lang->widget_code = 'Código'; - $lang->widget_cache = 'Cache'; - - $lang->widget_fix_width = 'Ancho permanente'; - $lang->widget_width = 'Ancho'; - $lang->widget_position = 'Posición'; - $lang->widget_position_none = 'Próxima línea'; - $lang->widget_position_left = 'Izquierdo'; - $lang->widget_position_right = 'Derecho'; - $lang->widget_margin = 'Márgen'; - $lang->widget_margin_top = 'Márgen superior'; - $lang->widget_margin_right = 'Márgen derecho'; - $lang->widget_margin_bottom = 'Márgen inferior'; - $lang->widget_margin_left= 'Márgen izquierdo'; - $lang->about_widget_fix_width = 'Si selecciona esta opción el ancho será permanente.'; - $lang->about_widget_width = 'Ingrese el ancho de Widget.'; - $lang->about_widget_position = 'Selecciona la posición si desea mostra más widgets en una línea.'; - $lang->about_widget_margin = "Uste puede ingresar el márgen de los widgets : superior, inferior, derecho e izquierdo."; - $lang->about_widget_cache = 'Se puede usar datos de caché creado durante el tiempo asignado.'; - - $lang->generated_code = 'Generar códigos'; - $lang->widgetstyle= '위젯스타일'; - - $lang->msg_widget_is_not_exists = 'No existe widget %s .'; - $lang->msg_widget_object_is_null = 'No puede ser creado el objeto de widget %s.'; - $lang->msg_widget_proc_is_null = 'No puede ser ejecutado el proc() de widget %s.'; - $lang->msg_widget_skin_is_null = '위젯의 스킨을 선택해 주셔야 정상적으로 동작할 수 있습니다'; - - $lang->about_widget_code = 'Ingrese primero los valores requeridos, luego presiona el botón "Generar códigos" para mostrar el código en el espacio inferior para ser añadido en el archivo de los temas.'; - $lang->about_widget_code_in_page = 'Luego de ingresar los valores requeridos, presiona el botón "Añadir" para insertar el código de widget dentro de la página.'; - $lang->about_widget = "Un Widget es una pequena aplicación para ser usados en los diseños o en el módulo de páginas.\n Puede ser enlazados con un módulo interno o con open api externo y con la configuración de ella puede utilizar en variadas aplicaciones.\nSin la necesidad de utilizar los módulos de página o del diseño de XE, Usted puede directamente añadir un widget usando la función de [Generar Códigos]."; - - $lang->cmd_content_insert = "Introduzca contenido por ti mismo"; - $lang->cmd_box_widget_insert = "Insertar cuadro de widget"; - $lang->cmd_remove_all_widgets = "Eliminar todos los reproductores"; - - $lang->cmd_widget_size = "Tamaño artilugio"; - $lang->cmd_widget_align = "Alinear Widget"; - $lang->cmd_widget_align_left = "Izquierda"; - $lang->cmd_widget_align_right = "Derecho"; - $lang->cmd_widget_margin = "Margen"; - $lang->cmd_widget_padding = "Relleno"; - $lang->cmd_widget_border = "Frontera"; - $lang->cmd_widget_border_solid = "Sólidos"; - $lang->cmd_widget_border_dotted = "Salpicando"; - $lang->cmd_widget_background_color = "Color de fondo"; - $lang->cmd_widget_background_image_url = "Imagen de fondo"; - $lang->cmd_widget_background_image_repeat = "Repita"; - $lang->cmd_widget_background_image_no_repeat = "No Repetir"; - $lang->cmd_widget_background_image_x_repeat = "Repita X"; - $lang->cmd_widget_background_image_y_repeat = "Repita Y"; - $lang->cmd_widget_background_image_x = "Posición X"; - $lang->cmd_widget_background_image_y = "Posición Y"; -?> +cmd_generate_code = 'Generar Código'; + + $lang->widget_name = 'Nombre de Widget'; + $lang->widget_maker = 'Desarrollador de Widget'; + $lang->widget_license = 'License'; + $lang->widget_history = 'Actualizar la historia'; + $lang->widget_info = 'información de Widget'; + $lang->widget_code = 'Código'; + $lang->widget_cache = 'Cache'; + + $lang->widget_fix_width = 'Ancho permanente'; + $lang->widget_width = 'Ancho'; + $lang->widget_position = 'Posición'; + $lang->widget_position_none = 'Próxima línea'; + $lang->widget_position_left = 'Izquierdo'; + $lang->widget_position_right = 'Derecho'; + $lang->widget_margin = 'Márgen'; + $lang->widget_margin_top = 'Márgen superior'; + $lang->widget_margin_right = 'Márgen derecho'; + $lang->widget_margin_bottom = 'Márgen inferior'; + $lang->widget_margin_left= 'Márgen izquierdo'; + $lang->about_widget_fix_width = 'Si selecciona esta opción el ancho será permanente.'; + $lang->about_widget_width = 'Ingrese el ancho de Widget.'; + $lang->about_widget_position = 'Selecciona la posición si desea mostra más widgets en una línea.'; + $lang->about_widget_margin = "Uste puede ingresar el márgen de los widgets : superior, inferior, derecho e izquierdo."; + $lang->about_widget_cache = 'Se puede usar datos de caché creado durante el tiempo asignado.'; + + $lang->generated_code = 'Generar códigos'; + $lang->widgetstyle= '위젯스타일'; + + $lang->msg_widget_is_not_exists = 'No existe widget %s .'; + $lang->msg_widget_object_is_null = 'No puede ser creado el objeto de widget %s.'; + $lang->msg_widget_proc_is_null = 'No puede ser ejecutado el proc() de widget %s.'; + $lang->msg_widget_skin_is_null = '위젯의 스킨을 선택해 주셔야 정상적으로 동작할 수 있습니다'; + + $lang->about_widget_code = 'Ingrese primero los valores requeridos, luego presiona el botón "Generar códigos" para mostrar el código en el espacio inferior para ser añadido en el archivo de los temas.'; + $lang->about_widget_code_in_page = 'Luego de ingresar los valores requeridos, presiona el botón "Añadir" para insertar el código de widget dentro de la página.'; + $lang->about_widget = "Un Widget es una pequena aplicación para ser usados en los diseños o en el módulo de páginas.\n Puede ser enlazados con un módulo interno o con open api externo y con la configuración de ella puede utilizar en variadas aplicaciones.\nSin la necesidad de utilizar los módulos de página o del diseño de XE, Usted puede directamente añadir un widget usando la función de [Generar Códigos]."; + + $lang->cmd_content_insert = "Introduzca contenido por ti mismo"; + $lang->cmd_box_widget_insert = "Insertar cuadro de widget"; + $lang->cmd_remove_all_widgets = "Eliminar todos los reproductores"; + + $lang->cmd_widget_size = "Tamaño artilugio"; + $lang->cmd_widget_align = "Alinear Widget"; + $lang->cmd_widget_align_left = "Izquierda"; + $lang->cmd_widget_align_right = "Derecho"; + $lang->cmd_widget_margin = "Margen"; + $lang->cmd_widget_padding = "Relleno"; + $lang->cmd_widget_border = "Frontera"; + $lang->cmd_widget_border_solid = "Sólidos"; + $lang->cmd_widget_border_dotted = "Salpicando"; + $lang->cmd_widget_background_color = "Color de fondo"; + $lang->cmd_widget_background_image_url = "Imagen de fondo"; + $lang->cmd_widget_background_image_repeat = "Repita"; + $lang->cmd_widget_background_image_no_repeat = "No Repetir"; + $lang->cmd_widget_background_image_x_repeat = "Repita X"; + $lang->cmd_widget_background_image_y_repeat = "Repita Y"; + $lang->cmd_widget_background_image_x = "Posición X"; + $lang->cmd_widget_background_image_y = "Posición Y"; +?> diff --git a/modules/widget/lang/fr.lang.php b/modules/widget/lang/fr.lang.php index 044029971..576383a3a 100644 --- a/modules/widget/lang/fr.lang.php +++ b/modules/widget/lang/fr.lang.php @@ -1,68 +1,68 @@ - - * @brief Paquet du langage en français pour le module de gadget - **/ - - $lang->cmd_generate_code = 'Générer le Code'; - - $lang->widget_name = 'Nom de Gadget'; - $lang->widget_maker = 'Développeur'; - $lang->widget_license = 'Licence'; - $lang->widget_history = 'Histoire de Mise à jours'; - $lang->widget_info = 'Information de Gadget'; - $lang->widget_code = 'Code'; - $lang->widget_cache = 'Antémémoire'; - - $lang->widget_fix_width = 'Fixer Largeur'; - $lang->widget_width = 'Largeur'; - $lang->widget_position = 'Position'; - $lang->widget_position_none = 'Ligne suivante'; - $lang->widget_position_left = 'Gauche'; - $lang->widget_position_right = 'Droite'; - $lang->widget_margin = 'Marge'; - $lang->widget_margin_top = 'Marge en tête'; - $lang->widget_margin_right = 'Marge à droite'; - $lang->widget_margin_bottom = 'Marge en pied'; - $lang->widget_margin_left= 'Marge à gauche'; - $lang->about_widget_fix_width = 'Cochez pour fixer la largeur, S.V.P.'; - $lang->about_widget_width = 'Configurez la largeur du gadget, S.V.P.'; - $lang->about_widget_position = 'Choisissez la position si vous voulez représenter plusieurs gadgets dans une ligne, S.V.P.'; - $lang->about_widget_margin = "Vous pouvez désigner la marge de gadget 'de tête, en pied, à droite et à gauche."; - $lang->about_widget_cache = 'Les données d\'antémémoire peuvent être utilisées pendant le temps que vous désignez.'; - - $lang->generated_code = 'Code généré'; - $lang->widgetstyle= '위젯스타일'; - - $lang->msg_widget_is_not_exists = "Le Gadget de(d') '%s' n'existe pas."; - $lang->msg_widget_object_is_null = "L'Objet de '%s' n'a pas pu être créé."; - $lang->msg_widget_proc_is_null = "proc() de '%s' n'a pas pu être exécuté."; - $lang->msg_widget_skin_is_null = '위젯의 스킨을 선택해 주셔야 정상적으로 동작할 수 있습니다'; - - $lang->about_widget_code = 'Entrez les valeurs qui sont requises par le gadget choisi, et puis cliquz le bouton [Générer le Code] pour générer le code. Le code à appliquer au fichier de modèl se présentera en bas.'; - $lang->about_widget_code_in_page = 'Après entrer les valeurs requies, cliquez le bouton [Ajouter] pour insérer le gadjet dans la page.'; - $lang->about_widget = "Un gadjet est un petit application indépendant qui est utilisé dans une Mise en Page ou dans une module de Page. Un gajet peut être lié avec un module intérieur ou avec un API extérieur ouvert. L'application divers est possible par la configuration. \nVous pouvez directement ajouter un gadget en utilisant la fonction [Générer le Code] sans utiliser un module de Page de XE ni un module de Mise en Page."; - - $lang->cmd_content_insert = "Insérer le Contenu par vous-même"; - $lang->cmd_box_widget_insert = "Insérer le Gadget de Boîte"; - $lang->cmd_remove_all_widgets = "Enlever Tous les Gadgets"; - - $lang->cmd_widget_size = "Taille du Gadget"; - $lang->cmd_widget_align = "Alignement des Gadget"; - $lang->cmd_widget_align_left = "Gauche"; - $lang->cmd_widget_align_right = "Droite"; - $lang->cmd_widget_margin = "Marge"; - $lang->cmd_widget_padding = "Remplissage"; - $lang->cmd_widget_border = "Bordure"; - $lang->cmd_widget_border_solid = "Solide"; - $lang->cmd_widget_border_dotted = "Pointillé"; - $lang->cmd_widget_background_color = "Couleur d'arrière-plan"; - $lang->cmd_widget_background_image_url = "Image d'arrière-plan"; - $lang->cmd_widget_background_image_repeat = "Répéter"; - $lang->cmd_widget_background_image_no_repeat = "Ne pas répéter"; - $lang->cmd_widget_background_image_x_repeat = "X Répéter"; - $lang->cmd_widget_background_image_y_repeat = "Y Répéter"; - $lang->cmd_widget_background_image_x = "X Position"; - $lang->cmd_widget_background_image_y = "Y Position"; -?> + + * @brief Paquet du langage en français pour le module de gadget + **/ + + $lang->cmd_generate_code = 'Générer le Code'; + + $lang->widget_name = 'Nom de Gadget'; + $lang->widget_maker = 'Développeur'; + $lang->widget_license = 'Licence'; + $lang->widget_history = 'Histoire de Mise à jours'; + $lang->widget_info = 'Information de Gadget'; + $lang->widget_code = 'Code'; + $lang->widget_cache = 'Antémémoire'; + + $lang->widget_fix_width = 'Fixer Largeur'; + $lang->widget_width = 'Largeur'; + $lang->widget_position = 'Position'; + $lang->widget_position_none = 'Ligne suivante'; + $lang->widget_position_left = 'Gauche'; + $lang->widget_position_right = 'Droite'; + $lang->widget_margin = 'Marge'; + $lang->widget_margin_top = 'Marge en tête'; + $lang->widget_margin_right = 'Marge à droite'; + $lang->widget_margin_bottom = 'Marge en pied'; + $lang->widget_margin_left= 'Marge à gauche'; + $lang->about_widget_fix_width = 'Cochez pour fixer la largeur, S.V.P.'; + $lang->about_widget_width = 'Configurez la largeur du gadget, S.V.P.'; + $lang->about_widget_position = 'Choisissez la position si vous voulez représenter plusieurs gadgets dans une ligne, S.V.P.'; + $lang->about_widget_margin = "Vous pouvez désigner la marge de gadget 'de tête, en pied, à droite et à gauche."; + $lang->about_widget_cache = 'Les données d\'antémémoire peuvent être utilisées pendant le temps que vous désignez.'; + + $lang->generated_code = 'Code généré'; + $lang->widgetstyle= '위젯스타일'; + + $lang->msg_widget_is_not_exists = "Le Gadget de(d') '%s' n'existe pas."; + $lang->msg_widget_object_is_null = "L'Objet de '%s' n'a pas pu être créé."; + $lang->msg_widget_proc_is_null = "proc() de '%s' n'a pas pu être exécuté."; + $lang->msg_widget_skin_is_null = '위젯의 스킨을 선택해 주셔야 정상적으로 동작할 수 있습니다'; + + $lang->about_widget_code = 'Entrez les valeurs qui sont requises par le gadget choisi, et puis cliquz le bouton [Générer le Code] pour générer le code. Le code à appliquer au fichier de modèl se présentera en bas.'; + $lang->about_widget_code_in_page = 'Après entrer les valeurs requies, cliquez le bouton [Ajouter] pour insérer le gadjet dans la page.'; + $lang->about_widget = "Un gadjet est un petit application indépendant qui est utilisé dans une Mise en Page ou dans une module de Page. Un gajet peut être lié avec un module intérieur ou avec un API extérieur ouvert. L'application divers est possible par la configuration. \nVous pouvez directement ajouter un gadget en utilisant la fonction [Générer le Code] sans utiliser un module de Page de XE ni un module de Mise en Page."; + + $lang->cmd_content_insert = "Insérer le Contenu par vous-même"; + $lang->cmd_box_widget_insert = "Insérer le Gadget de Boîte"; + $lang->cmd_remove_all_widgets = "Enlever Tous les Gadgets"; + + $lang->cmd_widget_size = "Taille du Gadget"; + $lang->cmd_widget_align = "Alignement des Gadget"; + $lang->cmd_widget_align_left = "Gauche"; + $lang->cmd_widget_align_right = "Droite"; + $lang->cmd_widget_margin = "Marge"; + $lang->cmd_widget_padding = "Remplissage"; + $lang->cmd_widget_border = "Bordure"; + $lang->cmd_widget_border_solid = "Solide"; + $lang->cmd_widget_border_dotted = "Pointillé"; + $lang->cmd_widget_background_color = "Couleur d'arrière-plan"; + $lang->cmd_widget_background_image_url = "Image d'arrière-plan"; + $lang->cmd_widget_background_image_repeat = "Répéter"; + $lang->cmd_widget_background_image_no_repeat = "Ne pas répéter"; + $lang->cmd_widget_background_image_x_repeat = "X Répéter"; + $lang->cmd_widget_background_image_y_repeat = "Y Répéter"; + $lang->cmd_widget_background_image_x = "X Position"; + $lang->cmd_widget_background_image_y = "Y Position"; +?> diff --git a/modules/widget/lang/jp.lang.php b/modules/widget/lang/jp.lang.php index 8a6de2460..0b02af314 100644 --- a/modules/widget/lang/jp.lang.php +++ b/modules/widget/lang/jp.lang.php @@ -1,68 +1,68 @@ -cmd_generate_code = 'コード生成'; - - $lang->widget_name = 'ウィジェット名'; - $lang->widget_maker = 'ウィジェット作者'; - $lang->widget_license = 'ライセンス'; - $lang->widget_history = '変更内容'; - $lang->widget_info = 'ウィジェット情報'; - $lang->widget_code = 'コード'; - $lang->widget_cache = 'キャッシュ'; - - $lang->widget_fix_width = '横幅固定'; - $lang->widget_width = '縦幅サイズ'; - $lang->widget_position = 'ポジッション'; - $lang->widget_position_none = '改行'; - $lang->widget_position_left = '左へ'; - $lang->widget_position_right = '右へ'; - $lang->widget_margin = '余白'; - $lang->widget_margin_top = '上'; - $lang->widget_margin_right = '右'; - $lang->widget_margin_bottom = '下 '; - $lang->widget_margin_left= '左'; - $lang->about_widget_fix_width = 'チェックすると横幅が固定されます。'; - $lang->about_widget_width = '縦幅サイズを選択して下さい。'; - $lang->about_widget_position = '一つのラインに多数のウィジェットを羅列したい場合は、ポジッションを選択して下さい。'; - $lang->about_widget_margin = '一つのラインに多数のウィジェットを羅列したい場合は、ポジッションを選択して下さい。'; - $lang->about_widget_cache = '指定された時間内にキャッシュされたデータが利用出来ます。'; - - $lang->generated_code = '生成コード'; - $lang->widgetstyle= 'ウィジェットスタイル'; - - $lang->msg_widget_is_not_exists = '%s ウィジェットが見つかりません。'; - $lang->msg_widget_object_is_null = '%s ウィジェットのオブジェクトが生成出来ません。'; - $lang->msg_widget_proc_is_null = '%s ウィセットの proc() が実行出来ません。'; - $lang->msg_widget_skin_is_null = 'ウィセットスキンを選択してから正常に動作します。'; - - $lang->about_widget_code = '選択されたウィゼットで求められる下の項目の値を入力し、「コード生成」ボタンをクリックすると、
    一番下にテンプレートファイルに適用出来るコードが出力されます。'; - $lang->about_widget_code_in_page = '下に必要な値を入力した後、追加ボタンをクリックするとページ内にウィジェットが挿入されます。'; - $lang->about_widget = "ウィジェットまたはページモジュールに用いられる単体の構成要素です。内部モジュールまたは外部のOPEN API と連動が出来、設定によって様々な応用が可能です。XEのページモジュールまたはレイアウトモジュールを使用しなくても、「コード生成」機能で直接ウィジェットも追加出来ます。"; - - $lang->cmd_content_insert = '内容直接追加'; - $lang->cmd_box_widget_insert = 'ボックスウィジェット追加'; - $lang->cmd_remove_all_widgets = 'すべての内容削除'; - - $lang->cmd_widget_size = 'ウィジェットの大きさ'; - $lang->cmd_widget_align = 'ウィジェット整列'; - $lang->cmd_widget_align_left = '左へ'; - $lang->cmd_widget_align_right = '右へ'; - $lang->cmd_widget_margin = '外部余白'; - $lang->cmd_widget_padding = '内部余白'; - $lang->cmd_widget_border = 'ウィジェットボーダー'; - $lang->cmd_widget_border_solid = '実線'; - $lang->cmd_widget_border_dotted = '点線'; - $lang->cmd_widget_background_color = '背景色'; - $lang->cmd_widget_background_image_url = '背景イメージ'; - $lang->cmd_widget_background_image_repeat = '繰り返す'; - $lang->cmd_widget_background_image_no_repeat = '固定'; - $lang->cmd_widget_background_image_x_repeat = '横の繰り返し'; - $lang->cmd_widget_background_image_y_repeat = '縦の繰り返し'; - $lang->cmd_widget_background_image_x = '横の位置'; - $lang->cmd_widget_background_image_y = '縦の位置'; -?> +cmd_generate_code = 'コード生成'; + + $lang->widget_name = 'ウィジェット名'; + $lang->widget_maker = 'ウィジェット作者'; + $lang->widget_license = 'ライセンス'; + $lang->widget_history = '変更内容'; + $lang->widget_info = 'ウィジェット情報'; + $lang->widget_code = 'コード'; + $lang->widget_cache = 'キャッシュ'; + + $lang->widget_fix_width = '横幅固定'; + $lang->widget_width = '縦幅サイズ'; + $lang->widget_position = 'ポジッション'; + $lang->widget_position_none = '改行'; + $lang->widget_position_left = '左へ'; + $lang->widget_position_right = '右へ'; + $lang->widget_margin = '余白'; + $lang->widget_margin_top = '上'; + $lang->widget_margin_right = '右'; + $lang->widget_margin_bottom = '下 '; + $lang->widget_margin_left= '左'; + $lang->about_widget_fix_width = 'チェックすると横幅が固定されます。'; + $lang->about_widget_width = '縦幅サイズを選択して下さい。'; + $lang->about_widget_position = '一つのラインに多数のウィジェットを羅列したい場合は、ポジッションを選択して下さい。'; + $lang->about_widget_margin = '一つのラインに多数のウィジェットを羅列したい場合は、ポジッションを選択して下さい。'; + $lang->about_widget_cache = '指定された時間内にキャッシュされたデータが利用出来ます。'; + + $lang->generated_code = '生成コード'; + $lang->widgetstyle= 'ウィジェットスタイル'; + + $lang->msg_widget_is_not_exists = '%s ウィジェットが見つかりません。'; + $lang->msg_widget_object_is_null = '%s ウィジェットのオブジェクトが生成出来ません。'; + $lang->msg_widget_proc_is_null = '%s ウィセットの proc() が実行出来ません。'; + $lang->msg_widget_skin_is_null = 'ウィセットスキンを選択してから正常に動作します。'; + + $lang->about_widget_code = '選択されたウィゼットで求められる下の項目の値を入力し、「コード生成」ボタンをクリックすると、
    一番下にテンプレートファイルに適用出来るコードが出力されます。'; + $lang->about_widget_code_in_page = '下に必要な値を入力した後、追加ボタンをクリックするとページ内にウィジェットが挿入されます。'; + $lang->about_widget = "ウィジェットまたはページモジュールに用いられる単体の構成要素です。内部モジュールまたは外部のOPEN API と連動が出来、設定によって様々な応用が可能です。XEのページモジュールまたはレイアウトモジュールを使用しなくても、「コード生成」機能で直接ウィジェットも追加出来ます。"; + + $lang->cmd_content_insert = '内容直接追加'; + $lang->cmd_box_widget_insert = 'ボックスウィジェット追加'; + $lang->cmd_remove_all_widgets = 'すべての内容削除'; + + $lang->cmd_widget_size = 'ウィジェットの大きさ'; + $lang->cmd_widget_align = 'ウィジェット整列'; + $lang->cmd_widget_align_left = '左へ'; + $lang->cmd_widget_align_right = '右へ'; + $lang->cmd_widget_margin = '外部余白'; + $lang->cmd_widget_padding = '内部余白'; + $lang->cmd_widget_border = 'ウィジェットボーダー'; + $lang->cmd_widget_border_solid = '実線'; + $lang->cmd_widget_border_dotted = '点線'; + $lang->cmd_widget_background_color = '背景色'; + $lang->cmd_widget_background_image_url = '背景イメージ'; + $lang->cmd_widget_background_image_repeat = '繰り返す'; + $lang->cmd_widget_background_image_no_repeat = '固定'; + $lang->cmd_widget_background_image_x_repeat = '横の繰り返し'; + $lang->cmd_widget_background_image_y_repeat = '縦の繰り返し'; + $lang->cmd_widget_background_image_x = '横の位置'; + $lang->cmd_widget_background_image_y = '縦の位置'; +?> diff --git a/modules/widget/lang/ko.lang.php b/modules/widget/lang/ko.lang.php index c74e3c9b3..82aaee878 100644 --- a/modules/widget/lang/ko.lang.php +++ b/modules/widget/lang/ko.lang.php @@ -1,68 +1,68 @@ -cmd_generate_code = '코드생성'; - - $lang->widget_name = '위젯 이름'; - $lang->widget_maker = '위젯 제작자'; - $lang->widget_license = '라이선스'; - $lang->widget_history = '변경 이력'; - $lang->widget_info = '위젯 정보'; - $lang->widget_code = '코드'; - $lang->widget_cache = '캐시'; - - $lang->widget_fix_width = '크기 고정'; - $lang->widget_width = '가로 길이'; - $lang->widget_position = '위치'; - $lang->widget_position_none = '줄 바꿈'; - $lang->widget_position_left = '왼쪽'; - $lang->widget_position_right = '오른쪽'; - $lang->widget_margin = '외부 여백'; - $lang->widget_margin_top = '위'; - $lang->widget_margin_right = '오른쪽'; - $lang->widget_margin_bottom = '아래 '; - $lang->widget_margin_left= '왼쪽'; - $lang->about_widget_fix_width = '선택하시면 가로 길이가 고정됩니다.'; - $lang->about_widget_width = '가로 길이를 입력해주세요.'; - $lang->about_widget_position = '한 줄에 여러 개의 위젯을 나열하고 싶을 때는 위치를 선택해주세요.'; - $lang->about_widget_margin = '지정된 위젯의 상하좌우 여백을 지정할 수 있습니다.'; - $lang->about_widget_cache = '지정된 시간동안 캐시된 데이터를 이용할 수 있습니다.'; - - $lang->generated_code = '생성된 코드'; - $lang->widgetstyle= '위젯스타일'; - - $lang->msg_widget_is_not_exists = '%s 위젯을 찾을 수 없습니다.'; - $lang->msg_widget_object_is_null = '%s 위젯의 객체 생성을 할 수 없습니다.'; - $lang->msg_widget_proc_is_null = '%s 위젯의 proc() 를 실행할 수 없습니다.'; - $lang->msg_widget_skin_is_null = '위젯의 스킨을 선택해 주셔야 정상적으로 동작할 수 있습니다.'; - - $lang->about_widget_code = '선택하신 위젯에서 요구하는 아래 항목들의 값을 넣고 [코드생성]버튼을 누르시면 제일 아래 칸에 템플릿 파일에 적용할 수 있는 코드가 출력 됩니다.'; - $lang->about_widget_code_in_page = '아래 필요한 값들을 입력하신 후 추가 버튼을 누르시면 페이지 내에 위젯이 삽입됩니다.'; - $lang->about_widget = "위젯은 레이아웃이나 페이지 모듈에서 사용되는 작은 구성요소입니다.\n위젯은 내부 모듈 또는 외부 open api와 연동될 수도 있고, 설정을 통해 다양하게 응용될 수 있습니다.\nXE의 페이지 모듈이나 레이아웃 모듈을 사용하지 않더라도 [코드생성] 기능을 통해 직접 위젯 추가도 할 수 있습니다."; - - $lang->cmd_content_insert = '내용 직접 추가'; - $lang->cmd_box_widget_insert = '상자 위젯 추가'; - $lang->cmd_remove_all_widgets = '내용 모두 지우기'; - - $lang->cmd_widget_size = '위젯 크기'; - $lang->cmd_widget_align = '위젯 정렬'; - $lang->cmd_widget_align_left = '왼쪽'; - $lang->cmd_widget_align_right = '오른쪽'; - $lang->cmd_widget_margin = '외부 여백'; - $lang->cmd_widget_padding = '내부 여백'; - $lang->cmd_widget_border = '위젯 테두리'; - $lang->cmd_widget_border_solid = '실선'; - $lang->cmd_widget_border_dotted = '점선'; - $lang->cmd_widget_background_color = '배경색'; - $lang->cmd_widget_background_image_url = '배경 이미지'; - $lang->cmd_widget_background_image_repeat = '반복'; - $lang->cmd_widget_background_image_no_repeat = '고정'; - $lang->cmd_widget_background_image_x_repeat = '가로 반복'; - $lang->cmd_widget_background_image_y_repeat = '세로 반복'; - $lang->cmd_widget_background_image_x = '가로 위치'; - $lang->cmd_widget_background_image_y = '세로 위치'; -?> +cmd_generate_code = '코드생성'; + + $lang->widget_name = '위젯 이름'; + $lang->widget_maker = '위젯 제작자'; + $lang->widget_license = '라이선스'; + $lang->widget_history = '변경 이력'; + $lang->widget_info = '위젯 정보'; + $lang->widget_code = '코드'; + $lang->widget_cache = '캐시'; + + $lang->widget_fix_width = '크기 고정'; + $lang->widget_width = '가로 길이'; + $lang->widget_position = '위치'; + $lang->widget_position_none = '줄 바꿈'; + $lang->widget_position_left = '왼쪽'; + $lang->widget_position_right = '오른쪽'; + $lang->widget_margin = '외부 여백'; + $lang->widget_margin_top = '위'; + $lang->widget_margin_right = '오른쪽'; + $lang->widget_margin_bottom = '아래 '; + $lang->widget_margin_left= '왼쪽'; + $lang->about_widget_fix_width = '선택하시면 가로 길이가 고정됩니다.'; + $lang->about_widget_width = '가로 길이를 입력해주세요.'; + $lang->about_widget_position = '한 줄에 여러 개의 위젯을 나열하고 싶을 때는 위치를 선택해주세요.'; + $lang->about_widget_margin = '지정된 위젯의 상하좌우 여백을 지정할 수 있습니다.'; + $lang->about_widget_cache = '지정된 시간동안 캐시된 데이터를 이용할 수 있습니다.'; + + $lang->generated_code = '생성된 코드'; + $lang->widgetstyle= '위젯스타일'; + + $lang->msg_widget_is_not_exists = '%s 위젯을 찾을 수 없습니다.'; + $lang->msg_widget_object_is_null = '%s 위젯의 객체 생성을 할 수 없습니다.'; + $lang->msg_widget_proc_is_null = '%s 위젯의 proc() 를 실행할 수 없습니다.'; + $lang->msg_widget_skin_is_null = '위젯의 스킨을 선택해 주셔야 정상적으로 동작할 수 있습니다.'; + + $lang->about_widget_code = '선택하신 위젯에서 요구하는 아래 항목들의 값을 넣고 [코드생성]버튼을 누르시면 제일 아래 칸에 템플릿 파일에 적용할 수 있는 코드가 출력 됩니다.'; + $lang->about_widget_code_in_page = '아래 필요한 값들을 입력하신 후 추가 버튼을 누르시면 페이지 내에 위젯이 삽입됩니다.'; + $lang->about_widget = "위젯은 레이아웃이나 페이지 모듈에서 사용되는 작은 구성요소입니다.\n위젯은 내부 모듈 또는 외부 open api와 연동될 수도 있고, 설정을 통해 다양하게 응용될 수 있습니다.\nXE의 페이지 모듈이나 레이아웃 모듈을 사용하지 않더라도 [코드생성] 기능을 통해 직접 위젯 추가도 할 수 있습니다."; + + $lang->cmd_content_insert = '내용 직접 추가'; + $lang->cmd_box_widget_insert = '상자 위젯 추가'; + $lang->cmd_remove_all_widgets = '내용 모두 지우기'; + + $lang->cmd_widget_size = '위젯 크기'; + $lang->cmd_widget_align = '위젯 정렬'; + $lang->cmd_widget_align_left = '왼쪽'; + $lang->cmd_widget_align_right = '오른쪽'; + $lang->cmd_widget_margin = '외부 여백'; + $lang->cmd_widget_padding = '내부 여백'; + $lang->cmd_widget_border = '위젯 테두리'; + $lang->cmd_widget_border_solid = '실선'; + $lang->cmd_widget_border_dotted = '점선'; + $lang->cmd_widget_background_color = '배경색'; + $lang->cmd_widget_background_image_url = '배경 이미지'; + $lang->cmd_widget_background_image_repeat = '반복'; + $lang->cmd_widget_background_image_no_repeat = '고정'; + $lang->cmd_widget_background_image_x_repeat = '가로 반복'; + $lang->cmd_widget_background_image_y_repeat = '세로 반복'; + $lang->cmd_widget_background_image_x = '가로 위치'; + $lang->cmd_widget_background_image_y = '세로 위치'; +?> diff --git a/modules/widget/lang/ru.lang.php b/modules/widget/lang/ru.lang.php index 00084bfad..f10c0768b 100644 --- a/modules/widget/lang/ru.lang.php +++ b/modules/widget/lang/ru.lang.php @@ -1,46 +1,46 @@ -cmd_generate_code = 'Генерировать код'; - - $lang->widget_name = 'Имя виджета'; - $lang->widget_maker = 'Разработчик виджета'; - $lang->widget_license = 'License'; - $lang->widget_history = 'История обновлений'; - $lang->widget_info = 'Информация виджета'; - $lang->widget_code = 'Код'; - $lang->widget_cache = 'Кеш'; - - $lang->widget_fix_width = 'Фиксированная ширина'; - $lang->widget_width = 'Ширина'; - $lang->widget_position = 'Позиция'; - $lang->widget_position_none = 'Следующая строка'; - $lang->widget_position_left = 'Лево'; - $lang->widget_position_right = 'Право'; - $lang->widget_margin = 'Поля'; - $lang->widget_margin_top = 'Верхнее поле'; - $lang->widget_margin_right = 'Правое поле'; - $lang->widget_margin_bottom = 'Шижнее поле'; - $lang->widget_margin_left= 'Левое поле'; - $lang->about_widget_fix_width = 'Пожалуйста, установите для фиксирования ширины.'; - $lang->about_widget_width = 'Пожалуйста, установите ширину виджета.'; - $lang->about_widget_position = 'Пожалуйста, выберите позицию виджета, если Вы хотите отобразить несколько виджетов в одной строке.'; - $lang->about_widget_margin = "Вы можете установить поля виждета, т.е. его отступы со всех четырех сторон."; - $lang->about_widget_cache = 'Кешированные данные будут использоваться на указанный срок.'; - - $lang->generated_code = 'Сгенерированный код'; - $lang->widgetstyle= '위젯스타일'; - - $lang->msg_widget_is_not_exists = '%s виджет не существует.'; - $lang->msg_widget_object_is_null = '%s объектов виджета не могут быть созданы.'; - $lang->msg_widget_proc_is_null = 'proc() %s виджета не может быть исполнена.'; - $lang->msg_widget_skin_is_null = '위젯의 스킨을 선택해 주셔야 정상적으로 동작할 수 있습니다'; - - $lang->about_widget_code = 'Пожалуйста, сначала введите требуемые значения, и затем щелкните кнопку [Генерировать Код] для генерации кода и добавления его в файл шаблона.'; - $lang->about_widget_code_in_page = 'После ввода требуемых значений, нажмите пнопку [Добавить], чтобы вставить код виджета в страницу.'; - $lang->about_addon = "Виджет -- это маленькая самостоятельная программа, используемая в лейауте или модуле страниц.\n Он может быть связан с внутренним модулем или внешними открытыми API. Посредством его детального конфигурирования можно добиться широкого его применения. \n Вы можете напрямую добавить виджет, используя функцию генерирования кода без использования модулей страниц или лейаутов XE."; -?> +cmd_generate_code = 'Генерировать код'; + + $lang->widget_name = 'Имя виджета'; + $lang->widget_maker = 'Разработчик виджета'; + $lang->widget_license = 'License'; + $lang->widget_history = 'История обновлений'; + $lang->widget_info = 'Информация виджета'; + $lang->widget_code = 'Код'; + $lang->widget_cache = 'Кеш'; + + $lang->widget_fix_width = 'Фиксированная ширина'; + $lang->widget_width = 'Ширина'; + $lang->widget_position = 'Позиция'; + $lang->widget_position_none = 'Следующая строка'; + $lang->widget_position_left = 'Лево'; + $lang->widget_position_right = 'Право'; + $lang->widget_margin = 'Поля'; + $lang->widget_margin_top = 'Верхнее поле'; + $lang->widget_margin_right = 'Правое поле'; + $lang->widget_margin_bottom = 'Шижнее поле'; + $lang->widget_margin_left= 'Левое поле'; + $lang->about_widget_fix_width = 'Пожалуйста, установите для фиксирования ширины.'; + $lang->about_widget_width = 'Пожалуйста, установите ширину виджета.'; + $lang->about_widget_position = 'Пожалуйста, выберите позицию виджета, если Вы хотите отобразить несколько виджетов в одной строке.'; + $lang->about_widget_margin = "Вы можете установить поля виждета, т.е. его отступы со всех четырех сторон."; + $lang->about_widget_cache = 'Кешированные данные будут использоваться на указанный срок.'; + + $lang->generated_code = 'Сгенерированный код'; + $lang->widgetstyle= '위젯스타일'; + + $lang->msg_widget_is_not_exists = '%s виджет не существует.'; + $lang->msg_widget_object_is_null = '%s объектов виджета не могут быть созданы.'; + $lang->msg_widget_proc_is_null = 'proc() %s виджета не может быть исполнена.'; + $lang->msg_widget_skin_is_null = '위젯의 스킨을 선택해 주셔야 정상적으로 동작할 수 있습니다'; + + $lang->about_widget_code = 'Пожалуйста, сначала введите требуемые значения, и затем щелкните кнопку [Генерировать Код] для генерации кода и добавления его в файл шаблона.'; + $lang->about_widget_code_in_page = 'После ввода требуемых значений, нажмите пнопку [Добавить], чтобы вставить код виджета в страницу.'; + $lang->about_addon = "Виджет -- это маленькая самостоятельная программа, используемая в лейауте или модуле страниц.\n Он может быть связан с внутренним модулем или внешними открытыми API. Посредством его детального конфигурирования можно добиться широкого его применения. \n Вы можете напрямую добавить виджет, используя функцию генерирования кода без использования модулей страниц или лейаутов XE."; +?> diff --git a/modules/widget/lang/tr.lang.php b/modules/widget/lang/tr.lang.php index ba35b6419..04662f4f3 100644 --- a/modules/widget/lang/tr.lang.php +++ b/modules/widget/lang/tr.lang.php @@ -1,68 +1,68 @@ -cmd_generate_code = 'Kod Üret'; - - $lang->widget_name = 'Widget Adı'; - $lang->widget_maker = 'Geliştirici'; - $lang->widget_license = 'Lisans'; - $lang->widget_history = 'Güncelleme Tarihi'; - $lang->widget_info = 'Widget Bilgileri'; - $lang->widget_code = 'Kod'; - $lang->widget_cache = 'Önbellek'; - - $lang->widget_fix_width = 'Düzeltme Genişliği'; - $lang->widget_width = 'Genişlik'; - $lang->widget_position = 'Konum'; - $lang->widget_position_none = 'Sonraki Hat'; - $lang->widget_position_left = 'Sol'; - $lang->widget_position_right = 'Sağ'; - $lang->widget_margin = 'Kenar boşluğu'; - $lang->widget_margin_top = 'Üst-Kenar Boşluğu'; - $lang->widget_margin_right = 'Sağ-Kenar Boşluğu'; - $lang->widget_margin_bottom = 'Alt-Kenar Boşluğu'; - $lang->widget_margin_left= 'Sol-Kenar Boşluğu'; - $lang->about_widget_fix_width = 'Lütfen genişliği düzeltmeyi kontrol ediniz.'; - $lang->about_widget_width = 'Lütfen widgetın genişliğini ayarlayınız.'; - $lang->about_widget_position = 'Tek bir satırda birkaç widget görüntülemek istiyorsanız, lütfen konumlarını seçiniz.'; - $lang->about_widget_margin = "Widgetların üst, alt, sağ ve sol kenar boşluklarını belirleyebilirsiniz."; - $lang->about_widget_cache = 'Önbelleğe alınmış veriler, ayarlamış olduğunuz süre içinde kullanılabilir.'; - - $lang->generated_code = 'Üretilmiş Kod'; - $lang->widgetstyle= 'Widget Tarzı'; - - $lang->msg_widget_is_not_exists = "'%s' bulunmuyot."; - $lang->msg_widget_object_is_null = " '%s' nesnesi oluşturulamadı."; - $lang->msg_widget_proc_is_null = " '%s' işlemi tamamlanamadı."; - $lang->msg_widget_skin_is_null = "Widgetın dış görünümünü belirlemelisiniz."; - - $lang->about_widget_code = 'Kod üretip şablon dosyaya eklemek için lütfen ilk olarak gerekli değeri girin ve ardından [Kod Üret]e tıklayın.'; - $lang->about_widget_code_in_page = 'Gerekli değerleri girdikten sonra widget kodunu sayfaya eklemek için [Ekle]ye tıklayın.'; - $lang->about_widget = "Widget, yerleşim düzeninde veya sayfa modülünde kullanılan küçük bir serbest uygulamadır.\n Dahili modüle bağlanabileceği gibi, harici açık apilerle de bağlantı kurabilir. Yapılandırma ayarları yoluyla, geniş bir uygulama alanı vardır. \n [Kod Üret] fonksiyonunu kullanarak, XE sayfa modülüne veya yerleşim düzeni modülüne ihtiyaç duymadan widget ekleyebilirsiniz."; - - $lang->cmd_content_insert = "İçeriği kendiniz ekleyin."; - $lang->cmd_box_widget_insert = "Kutu widgetını ekleyin."; - $lang->cmd_remove_all_widgets = "Tüm widgetları kaldır."; - - $lang->cmd_widget_size = "Widget Boyutu"; - $lang->cmd_widget_align = "Hizalama Widgetı"; - $lang->cmd_widget_align_left = "Sol"; - $lang->cmd_widget_align_right = "Sağ"; - $lang->cmd_widget_margin = "Kenar Boşluğu"; - $lang->cmd_widget_padding = "Dolgu"; - $lang->cmd_widget_border = "Sınır"; - $lang->cmd_widget_border_solid = "Kesiksiz"; - $lang->cmd_widget_border_dotted = "Noktalı"; - $lang->cmd_widget_background_color = "Arkaplan Rengi"; - $lang->cmd_widget_background_image_url = "Arkaplan Resmi"; - $lang->cmd_widget_background_image_repeat = "Tekrar et"; - $lang->cmd_widget_background_image_no_repeat = "Tekrar yok."; - $lang->cmd_widget_background_image_x_repeat = "X Tekrar"; - $lang->cmd_widget_background_image_y_repeat = "Y Tekrar"; - $lang->cmd_widget_background_image_x = "X Konum"; - $lang->cmd_widget_background_image_y = "Y Konum"; -?> +cmd_generate_code = 'Kod Üret'; + + $lang->widget_name = 'Widget Adı'; + $lang->widget_maker = 'Geliştirici'; + $lang->widget_license = 'Lisans'; + $lang->widget_history = 'Güncelleme Tarihi'; + $lang->widget_info = 'Widget Bilgileri'; + $lang->widget_code = 'Kod'; + $lang->widget_cache = 'Önbellek'; + + $lang->widget_fix_width = 'Düzeltme Genişliği'; + $lang->widget_width = 'Genişlik'; + $lang->widget_position = 'Konum'; + $lang->widget_position_none = 'Sonraki Hat'; + $lang->widget_position_left = 'Sol'; + $lang->widget_position_right = 'Sağ'; + $lang->widget_margin = 'Kenar boşluğu'; + $lang->widget_margin_top = 'Üst-Kenar Boşluğu'; + $lang->widget_margin_right = 'Sağ-Kenar Boşluğu'; + $lang->widget_margin_bottom = 'Alt-Kenar Boşluğu'; + $lang->widget_margin_left= 'Sol-Kenar Boşluğu'; + $lang->about_widget_fix_width = 'Lütfen genişliği düzeltmeyi kontrol ediniz.'; + $lang->about_widget_width = 'Lütfen widgetın genişliğini ayarlayınız.'; + $lang->about_widget_position = 'Tek bir satırda birkaç widget görüntülemek istiyorsanız, lütfen konumlarını seçiniz.'; + $lang->about_widget_margin = "Widgetların üst, alt, sağ ve sol kenar boşluklarını belirleyebilirsiniz."; + $lang->about_widget_cache = 'Önbelleğe alınmış veriler, ayarlamış olduğunuz süre içinde kullanılabilir.'; + + $lang->generated_code = 'Üretilmiş Kod'; + $lang->widgetstyle= 'Widget Tarzı'; + + $lang->msg_widget_is_not_exists = "'%s' bulunmuyot."; + $lang->msg_widget_object_is_null = " '%s' nesnesi oluşturulamadı."; + $lang->msg_widget_proc_is_null = " '%s' işlemi tamamlanamadı."; + $lang->msg_widget_skin_is_null = "Widgetın dış görünümünü belirlemelisiniz."; + + $lang->about_widget_code = 'Kod üretip şablon dosyaya eklemek için lütfen ilk olarak gerekli değeri girin ve ardından [Kod Üret]e tıklayın.'; + $lang->about_widget_code_in_page = 'Gerekli değerleri girdikten sonra widget kodunu sayfaya eklemek için [Ekle]ye tıklayın.'; + $lang->about_widget = "Widget, yerleşim düzeninde veya sayfa modülünde kullanılan küçük bir serbest uygulamadır.\n Dahili modüle bağlanabileceği gibi, harici açık apilerle de bağlantı kurabilir. Yapılandırma ayarları yoluyla, geniş bir uygulama alanı vardır. \n [Kod Üret] fonksiyonunu kullanarak, XE sayfa modülüne veya yerleşim düzeni modülüne ihtiyaç duymadan widget ekleyebilirsiniz."; + + $lang->cmd_content_insert = "İçeriği kendiniz ekleyin."; + $lang->cmd_box_widget_insert = "Kutu widgetını ekleyin."; + $lang->cmd_remove_all_widgets = "Tüm widgetları kaldır."; + + $lang->cmd_widget_size = "Widget Boyutu"; + $lang->cmd_widget_align = "Hizalama Widgetı"; + $lang->cmd_widget_align_left = "Sol"; + $lang->cmd_widget_align_right = "Sağ"; + $lang->cmd_widget_margin = "Kenar Boşluğu"; + $lang->cmd_widget_padding = "Dolgu"; + $lang->cmd_widget_border = "Sınır"; + $lang->cmd_widget_border_solid = "Kesiksiz"; + $lang->cmd_widget_border_dotted = "Noktalı"; + $lang->cmd_widget_background_color = "Arkaplan Rengi"; + $lang->cmd_widget_background_image_url = "Arkaplan Resmi"; + $lang->cmd_widget_background_image_repeat = "Tekrar et"; + $lang->cmd_widget_background_image_no_repeat = "Tekrar yok."; + $lang->cmd_widget_background_image_x_repeat = "X Tekrar"; + $lang->cmd_widget_background_image_y_repeat = "Y Tekrar"; + $lang->cmd_widget_background_image_x = "X Konum"; + $lang->cmd_widget_background_image_y = "Y Konum"; +?> diff --git a/modules/widget/lang/vi.lang.php b/modules/widget/lang/vi.lang.php index 526b45209..3e8cb964a 100644 --- a/modules/widget/lang/vi.lang.php +++ b/modules/widget/lang/vi.lang.php @@ -1,70 +1,70 @@ -cmd_generate_code = 'Tạo Code'; - - $lang->widget_name = 'Tên Widget'; - $lang->widget_maker = 'Người tạo'; - $lang->widget_license = 'Giấy phép'; - $lang->widget_history = 'Lịch sử cập nhật'; - $lang->widget_info = 'Thông tin Widget'; - $lang->widget_code = 'Code'; - $lang->widget_cache = 'Bộ nhớ đệm'; - - $lang->widget_fix_width = 'Cố định chiều rộng'; - $lang->widget_width = 'Chiều rộng'; - $lang->widget_position = 'Vị trí'; - $lang->widget_position_none = 'Dòng tiếp theo'; - $lang->widget_position_left = 'Trái'; - $lang->widget_position_right = 'Phải'; - $lang->widget_margin = 'Lề'; - $lang->widget_margin_top = 'Lề trên'; - $lang->widget_margin_right = 'Lề phải'; - $lang->widget_margin_bottom = 'Lề dưới'; - $lang->widget_margin_left= 'Lề trái'; - $lang->about_widget_fix_width = 'Hãy kiểm tra để cố định chiều rộng.'; - $lang->about_widget_width = 'Hãy đặt chiều rộng cho Widget.'; - $lang->about_widget_position = 'Hãy chọn vị trí nếu bạn muốn nhiều Widget cùng hiển thị.'; - $lang->about_widget_margin = "Bạn có thể đặt lề của Widget: Trái, Phải, Trên, Dưới."; - $lang->about_widget_cache = 'Bộ nhớ đệm của Data có thể được sử dụng nếu bạn đặt thời gian cho nó.'; - - $lang->generated_code = 'Đã tạo Code'; - $lang->widgetstyle= 'Kiểu dáng Widget'; - - $lang->msg_widget_is_not_exists = "'%s' không tồn tại."; - $lang->msg_widget_object_is_null = "Đối tượng của '%s' đã không được tạo."; - $lang->msg_widget_proc_is_null = "proc() của '%s' đã không được thực hiện."; - $lang->msg_widget_skin_is_null = "Bạn cần phải chọn Skin cho Widget."; - - $lang->about_widget_code = 'Hãy nhập các thông tin cần thiết, sau đó bấm nút [Tạo Code] để lấy Code thêm vào giao diện.'; - $lang->about_widget_code_in_page = 'Sau khi nhập những thông tin cần thiết, bấm nút [Tạo Code] để chèn Code của Widget vào giao diện.'; - $lang->about_widget = "Widget là một ứng dụng nhỏ có thể đặt ở bất kì vị trí nào do người dùng lựa chọn.
    Nó có thể kết nối với những Module trong Website hay Open API bên ngoài và hiển thị nội dung của Module đó.
    Thông qua sự thiết lập cấu hình, nó có thể là một ứng dụng rộng dãi.
    Bạn có thể thêm một Widget bằng cách bấm nút [Tạo Code] để lấy Code thêm vào một Module hay trang nào đó."; - - $lang->cmd_content_insert = "Chèn nội dung của bạn"; - $lang->cmd_box_widget_insert = "Chèn khung Widget"; - $lang->cmd_remove_all_widgets = "Xóa tất cả Widget"; - - $lang->cmd_widget_size = "Kích thước"; - $lang->cmd_widget_align = "Căn chỉnh"; - $lang->cmd_widget_align_left = "Trái"; - $lang->cmd_widget_align_right = "Phải"; - $lang->cmd_widget_margin = "Lề"; - $lang->cmd_widget_padding = "Đệm"; - $lang->cmd_widget_border = "Viền"; - $lang->cmd_widget_border_solid = "Viền liền"; - $lang->cmd_widget_border_dotted = "Viền chấm"; - $lang->cmd_widget_background_color = "Màu nền"; - $lang->cmd_widget_background_image_url = "Hình nền"; - $lang->cmd_widget_background_image_repeat = "Lặp lại"; - $lang->cmd_widget_background_image_no_repeat = "Không lặp"; - $lang->cmd_widget_background_image_x_repeat = "Lặp chiều X"; - $lang->cmd_widget_background_image_y_repeat = "Lặp chiều Y"; - $lang->cmd_widget_background_image_x = "Vị trí X"; - $lang->cmd_widget_background_image_y = "Vị trí Y"; -?> +cmd_generate_code = 'Tạo Code'; + + $lang->widget_name = 'Tên Widget'; + $lang->widget_maker = 'Người tạo'; + $lang->widget_license = 'Giấy phép'; + $lang->widget_history = 'Lịch sử cập nhật'; + $lang->widget_info = 'Thông tin Widget'; + $lang->widget_code = 'Code'; + $lang->widget_cache = 'Bộ nhớ đệm'; + + $lang->widget_fix_width = 'Cố định chiều rộng'; + $lang->widget_width = 'Chiều rộng'; + $lang->widget_position = 'Vị trí'; + $lang->widget_position_none = 'Dòng tiếp theo'; + $lang->widget_position_left = 'Trái'; + $lang->widget_position_right = 'Phải'; + $lang->widget_margin = 'Lề'; + $lang->widget_margin_top = 'Lề trên'; + $lang->widget_margin_right = 'Lề phải'; + $lang->widget_margin_bottom = 'Lề dưới'; + $lang->widget_margin_left= 'Lề trái'; + $lang->about_widget_fix_width = 'Hãy kiểm tra để cố định chiều rộng.'; + $lang->about_widget_width = 'Hãy đặt chiều rộng cho Widget.'; + $lang->about_widget_position = 'Hãy chọn vị trí nếu bạn muốn nhiều Widget cùng hiển thị.'; + $lang->about_widget_margin = "Bạn có thể đặt lề của Widget: Trái, Phải, Trên, Dưới."; + $lang->about_widget_cache = 'Bộ nhớ đệm của Data có thể được sử dụng nếu bạn đặt thời gian cho nó.'; + + $lang->generated_code = 'Đã tạo Code'; + $lang->widgetstyle= 'Kiểu dáng Widget'; + + $lang->msg_widget_is_not_exists = "'%s' không tồn tại."; + $lang->msg_widget_object_is_null = "Đối tượng của '%s' đã không được tạo."; + $lang->msg_widget_proc_is_null = "proc() của '%s' đã không được thực hiện."; + $lang->msg_widget_skin_is_null = "Bạn cần phải chọn Skin cho Widget."; + + $lang->about_widget_code = 'Hãy nhập các thông tin cần thiết, sau đó bấm nút [Tạo Code] để lấy Code thêm vào giao diện.'; + $lang->about_widget_code_in_page = 'Sau khi nhập những thông tin cần thiết, bấm nút [Tạo Code] để chèn Code của Widget vào giao diện.'; + $lang->about_widget = "Widget là một ứng dụng nhỏ có thể đặt ở bất kì vị trí nào do người dùng lựa chọn.
    Nó có thể kết nối với những Module trong Website hay Open API bên ngoài và hiển thị nội dung của Module đó.
    Thông qua sự thiết lập cấu hình, nó có thể là một ứng dụng rộng dãi.
    Bạn có thể thêm một Widget bằng cách bấm nút [Tạo Code] để lấy Code thêm vào một Module hay trang nào đó."; + + $lang->cmd_content_insert = "Chèn nội dung của bạn"; + $lang->cmd_box_widget_insert = "Chèn khung Widget"; + $lang->cmd_remove_all_widgets = "Xóa tất cả Widget"; + + $lang->cmd_widget_size = "Kích thước"; + $lang->cmd_widget_align = "Căn chỉnh"; + $lang->cmd_widget_align_left = "Trái"; + $lang->cmd_widget_align_right = "Phải"; + $lang->cmd_widget_margin = "Lề"; + $lang->cmd_widget_padding = "Đệm"; + $lang->cmd_widget_border = "Viền"; + $lang->cmd_widget_border_solid = "Viền liền"; + $lang->cmd_widget_border_dotted = "Viền chấm"; + $lang->cmd_widget_background_color = "Màu nền"; + $lang->cmd_widget_background_image_url = "Hình nền"; + $lang->cmd_widget_background_image_repeat = "Lặp lại"; + $lang->cmd_widget_background_image_no_repeat = "Không lặp"; + $lang->cmd_widget_background_image_x_repeat = "Lặp chiều X"; + $lang->cmd_widget_background_image_y_repeat = "Lặp chiều Y"; + $lang->cmd_widget_background_image_x = "Vị trí X"; + $lang->cmd_widget_background_image_y = "Vị trí Y"; +?> diff --git a/modules/widget/lang/zh-CN.lang.php b/modules/widget/lang/zh-CN.lang.php index 839532425..30a5cd186 100644 --- a/modules/widget/lang/zh-CN.lang.php +++ b/modules/widget/lang/zh-CN.lang.php @@ -1,68 +1,68 @@ -cmd_generate_code = '生成代码'; - - $lang->widget_name = '控件名称'; - $lang->widget_maker = '控件作者'; - $lang->widget_license = '版权'; - $lang->widget_history = '更新事项'; - $lang->widget_info = '控件信息'; - $lang->widget_code = '代码'; - $lang->widget_cache = '缓冲'; - - $lang->widget_fix_width = '固定大小'; - $lang->widget_width = '宽度'; - $lang->widget_position = '位置'; - $lang->widget_position_none = '换行'; - $lang->widget_position_left = '左对齐'; - $lang->widget_position_right = '右对齐'; - $lang->widget_margin = '边距'; - $lang->widget_margin_top = '上'; - $lang->widget_margin_right = '右'; - $lang->widget_margin_bottom = '下'; - $lang->widget_margin_left= '左'; - $lang->about_widget_fix_width = '选择此项将固定控件显示宽度。'; - $lang->about_widget_width = '请输入宽度大小。'; - $lang->about_widget_position = '想要横向显示多个控件时,请选择位置。'; - $lang->about_widget_margin = '想要横向显示多个控件时,请设置边距。'; - $lang->about_widget_cache = '指定的时间内可以利用已缓冲的数据。'; - - $lang->generated_code = '已生成的代码'; - $lang->widgetstyle= '控件样式'; - - $lang->msg_widget_is_not_exists = '找不到%s控件!'; - $lang->msg_widget_object_is_null = '无法生成%s控件对象!'; - $lang->msg_widget_proc_is_null = '不能执行%s控件的 proc()!'; - $lang->msg_widget_skin_is_null = '请选择控件皮肤!'; - - $lang->about_widget_code = '输入所选控件所需要的下列各项后,按『代码生成』按钮,即可在页面下方获得可以用在布局模版代码片断。'; - $lang->about_widget_code_in_page = '输入下列各项必要值后,按『生成代码』按钮,即可把控件插入到页面当中。'; - $lang->about_widget = "控件是在布局或页面模块中使用的一种小部件。\n不仅可以关联内部模块或外部open api,而且通过设置可以用在多种用途。\n即使不使用XE的页面模块或布局模块,也可以通过『代码生成』功能直接可以添加相应控件。"; - - $lang->cmd_content_insert = "添加内容"; - $lang->cmd_box_widget_insert = "添加控件盒"; - $lang->cmd_remove_all_widgets = "清空内容"; - - $lang->cmd_widget_size = "大小"; - $lang->cmd_widget_align = "对齐"; - $lang->cmd_widget_align_left = "左对齐"; - $lang->cmd_widget_align_right = "右对齐"; - $lang->cmd_widget_margin = "外边距"; - $lang->cmd_widget_padding = "内填充"; - $lang->cmd_widget_border = "边框"; - $lang->cmd_widget_border_solid = "实线"; - $lang->cmd_widget_border_dotted = "点线"; - $lang->cmd_widget_background_color = "背景色"; - $lang->cmd_widget_background_image_url = "背景图片"; - $lang->cmd_widget_background_image_repeat = "平铺"; - $lang->cmd_widget_background_image_no_repeat = "固定"; - $lang->cmd_widget_background_image_x_repeat = "横向平铺"; - $lang->cmd_widget_background_image_y_repeat = "纵向平铺"; - $lang->cmd_widget_background_image_x = "水平位置"; - $lang->cmd_widget_background_image_y = "垂直位置"; -?> +cmd_generate_code = '生成代码'; + + $lang->widget_name = '控件名称'; + $lang->widget_maker = '控件作者'; + $lang->widget_license = '版权'; + $lang->widget_history = '更新事项'; + $lang->widget_info = '控件信息'; + $lang->widget_code = '代码'; + $lang->widget_cache = '缓冲'; + + $lang->widget_fix_width = '固定大小'; + $lang->widget_width = '宽度'; + $lang->widget_position = '位置'; + $lang->widget_position_none = '换行'; + $lang->widget_position_left = '左对齐'; + $lang->widget_position_right = '右对齐'; + $lang->widget_margin = '边距'; + $lang->widget_margin_top = '上'; + $lang->widget_margin_right = '右'; + $lang->widget_margin_bottom = '下'; + $lang->widget_margin_left= '左'; + $lang->about_widget_fix_width = '选择此项将固定控件显示宽度。'; + $lang->about_widget_width = '请输入宽度大小。'; + $lang->about_widget_position = '想要横向显示多个控件时,请选择位置。'; + $lang->about_widget_margin = '想要横向显示多个控件时,请设置边距。'; + $lang->about_widget_cache = '指定的时间内可以利用已缓冲的数据。'; + + $lang->generated_code = '已生成的代码'; + $lang->widgetstyle= '控件样式'; + + $lang->msg_widget_is_not_exists = '找不到%s控件!'; + $lang->msg_widget_object_is_null = '无法生成%s控件对象!'; + $lang->msg_widget_proc_is_null = '不能执行%s控件的 proc()!'; + $lang->msg_widget_skin_is_null = '请选择控件皮肤!'; + + $lang->about_widget_code = '输入所选控件所需要的下列各项后,按『代码生成』按钮,即可在页面下方获得可以用在布局模版代码片断。'; + $lang->about_widget_code_in_page = '输入下列各项必要值后,按『生成代码』按钮,即可把控件插入到页面当中。'; + $lang->about_widget = "控件是在布局或页面模块中使用的一种小部件。\n不仅可以关联内部模块或外部open api,而且通过设置可以用在多种用途。\n即使不使用XE的页面模块或布局模块,也可以通过『代码生成』功能直接可以添加相应控件。"; + + $lang->cmd_content_insert = "添加内容"; + $lang->cmd_box_widget_insert = "添加控件盒"; + $lang->cmd_remove_all_widgets = "清空内容"; + + $lang->cmd_widget_size = "大小"; + $lang->cmd_widget_align = "对齐"; + $lang->cmd_widget_align_left = "左对齐"; + $lang->cmd_widget_align_right = "右对齐"; + $lang->cmd_widget_margin = "外边距"; + $lang->cmd_widget_padding = "内填充"; + $lang->cmd_widget_border = "边框"; + $lang->cmd_widget_border_solid = "实线"; + $lang->cmd_widget_border_dotted = "点线"; + $lang->cmd_widget_background_color = "背景色"; + $lang->cmd_widget_background_image_url = "背景图片"; + $lang->cmd_widget_background_image_repeat = "平铺"; + $lang->cmd_widget_background_image_no_repeat = "固定"; + $lang->cmd_widget_background_image_x_repeat = "横向平铺"; + $lang->cmd_widget_background_image_y_repeat = "纵向平铺"; + $lang->cmd_widget_background_image_x = "水平位置"; + $lang->cmd_widget_background_image_y = "垂直位置"; +?> diff --git a/modules/widget/lang/zh-TW.lang.php b/modules/widget/lang/zh-TW.lang.php index 0ed694451..efc775e85 100644 --- a/modules/widget/lang/zh-TW.lang.php +++ b/modules/widget/lang/zh-TW.lang.php @@ -1,68 +1,68 @@ -cmd_generate_code = '建立原始碼'; - - $lang->widget_name = 'Widget名稱'; - $lang->widget_maker = 'Widget作者'; - $lang->widget_license = '版權'; - $lang->widget_history = '更新紀錄'; - $lang->widget_info = 'Widget資料'; - $lang->widget_code = '原始碼'; - $lang->widget_cache = '暫存'; - - $lang->widget_fix_width = '固定大小'; - $lang->widget_width = '寬度'; - $lang->widget_position = '位置'; - $lang->widget_position_none = '換行'; - $lang->widget_position_left = '靠左對齊'; - $lang->widget_position_right = '靠右對齊'; - $lang->widget_margin = '邊距'; - $lang->widget_margin_top = '上'; - $lang->widget_margin_right = '右'; - $lang->widget_margin_bottom = '下'; - $lang->widget_margin_left= '左'; - $lang->about_widget_fix_width = '選擇此項將固定Widget顯示寬度。'; - $lang->about_widget_width = '請輸入寬度大小。'; - $lang->about_widget_position = '想要橫向顯示多個Widget時,請選擇位置。'; - $lang->about_widget_margin = '想要橫向顯示多個Widget時,請設置邊距。'; - $lang->about_widget_cache = '指定的時間內可以利用已暫存的資料。'; - - $lang->generated_code = '已建立的原始碼'; - $lang->widgetstyle= 'Widget樣式'; - - $lang->msg_widget_is_not_exists = '找不到 %s Widget!'; - $lang->msg_widget_object_is_null = '無法建立 %s Widget目標!'; - $lang->msg_widget_proc_is_null = '無法執行 %s Widget的 proc()!'; - $lang->msg_widget_skin_is_null = '請選擇一個可正常使用的Widget面板'; - - $lang->about_widget_code = '輸入所選Widget所需要的各項資料後,按『建立原始碼』按鈕,即可在頁面下方獲得運用在版面設計中的部分原始碼。'; - $lang->about_widget_code_in_page = '輸入下列各項必要資料後,按『建立原始碼』按鈕,即可把Widget插入到頁面當中。'; - $lang->about_widget = "Widget是在版面或頁面模組中使用的一種元件。\n不僅可以連結內部模組或外部Open API,而且通過設置可以有許多種用途。\n即使不使用XE的頁面或版面設計模組,也可以通過『建立原始碼』功能直接新增相對應Widget。"; - - $lang->cmd_content_insert = "新增內容"; - $lang->cmd_box_widget_insert = "新增Widget Box"; - $lang->cmd_remove_all_widgets = "全部清空"; - - $lang->cmd_widget_size = "大小"; - $lang->cmd_widget_align = "對齊"; - $lang->cmd_widget_align_left = "靠左"; - $lang->cmd_widget_align_right = "靠右"; - $lang->cmd_widget_margin = "邊距"; - $lang->cmd_widget_padding = "內距"; - $lang->cmd_widget_border = "邊框"; - $lang->cmd_widget_border_solid = "實線"; - $lang->cmd_widget_border_dotted = "虛線"; - $lang->cmd_widget_background_color = "背景顏色"; - $lang->cmd_widget_background_image_url = "背景圖片"; - $lang->cmd_widget_background_image_repeat = "重複"; - $lang->cmd_widget_background_image_no_repeat = "不重複"; - $lang->cmd_widget_background_image_x_repeat = "水平重複"; - $lang->cmd_widget_background_image_y_repeat = "垂直重複"; - $lang->cmd_widget_background_image_x = "水平位置"; - $lang->cmd_widget_background_image_y = "垂直位置"; -?> +cmd_generate_code = '建立原始碼'; + + $lang->widget_name = 'Widget名稱'; + $lang->widget_maker = 'Widget作者'; + $lang->widget_license = '版權'; + $lang->widget_history = '更新紀錄'; + $lang->widget_info = 'Widget資料'; + $lang->widget_code = '原始碼'; + $lang->widget_cache = '暫存'; + + $lang->widget_fix_width = '固定大小'; + $lang->widget_width = '寬度'; + $lang->widget_position = '位置'; + $lang->widget_position_none = '換行'; + $lang->widget_position_left = '靠左對齊'; + $lang->widget_position_right = '靠右對齊'; + $lang->widget_margin = '邊距'; + $lang->widget_margin_top = '上'; + $lang->widget_margin_right = '右'; + $lang->widget_margin_bottom = '下'; + $lang->widget_margin_left= '左'; + $lang->about_widget_fix_width = '選擇此項將固定Widget顯示寬度。'; + $lang->about_widget_width = '請輸入寬度大小。'; + $lang->about_widget_position = '想要橫向顯示多個Widget時,請選擇位置。'; + $lang->about_widget_margin = '想要橫向顯示多個Widget時,請設置邊距。'; + $lang->about_widget_cache = '指定的時間內可以利用已暫存的資料。'; + + $lang->generated_code = '已建立的原始碼'; + $lang->widgetstyle= 'Widget樣式'; + + $lang->msg_widget_is_not_exists = '找不到 %s Widget!'; + $lang->msg_widget_object_is_null = '無法建立 %s Widget目標!'; + $lang->msg_widget_proc_is_null = '無法執行 %s Widget的 proc()!'; + $lang->msg_widget_skin_is_null = '請選擇一個可正常使用的Widget面板'; + + $lang->about_widget_code = '輸入所選Widget所需要的各項資料後,按『建立原始碼』按鈕,即可在頁面下方獲得運用在版面設計中的部分原始碼。'; + $lang->about_widget_code_in_page = '輸入下列各項必要資料後,按『建立原始碼』按鈕,即可把Widget插入到頁面當中。'; + $lang->about_widget = "Widget是在版面或頁面模組中使用的一種元件。\n不僅可以連結內部模組或外部Open API,而且通過設置可以有許多種用途。\n即使不使用XE的頁面或版面設計模組,也可以通過『建立原始碼』功能直接新增相對應Widget。"; + + $lang->cmd_content_insert = "新增內容"; + $lang->cmd_box_widget_insert = "新增Widget Box"; + $lang->cmd_remove_all_widgets = "全部清空"; + + $lang->cmd_widget_size = "大小"; + $lang->cmd_widget_align = "對齊"; + $lang->cmd_widget_align_left = "靠左"; + $lang->cmd_widget_align_right = "靠右"; + $lang->cmd_widget_margin = "邊距"; + $lang->cmd_widget_padding = "內距"; + $lang->cmd_widget_border = "邊框"; + $lang->cmd_widget_border_solid = "實線"; + $lang->cmd_widget_border_dotted = "虛線"; + $lang->cmd_widget_background_color = "背景顏色"; + $lang->cmd_widget_background_image_url = "背景圖片"; + $lang->cmd_widget_background_image_repeat = "重複"; + $lang->cmd_widget_background_image_no_repeat = "不重複"; + $lang->cmd_widget_background_image_x_repeat = "水平重複"; + $lang->cmd_widget_background_image_y_repeat = "垂直重複"; + $lang->cmd_widget_background_image_x = "水平位置"; + $lang->cmd_widget_background_image_y = "垂直位置"; +?> diff --git a/modules/widget/tpl/css/widget.css b/modules/widget/tpl/css/widget.css index 8a46287c3..bdb66f1fc 100644 --- a/modules/widget/tpl/css/widget.css +++ b/modules/widget/tpl/css/widget.css @@ -1,62 +1,62 @@ -@charset "utf-8"; - -.widget_title { border:1px solid #DDDDDD; margin:10px 5px 5px 0; padding:3px; } -.widget_mid_list { margin:0 0 5px 10px; } -.widget_description { color:#AAAAAA; border-top:1px dotted #EEEEEE; margin:5px 0 0 0; padding:5px 0 0 0; } -#colorset_area { margin-top:.5em; } - -#colorset_area .header { float:left; margin-right:.5em; padding-top:.2em;} -#colorset_area .footer { float:left; } - -#zonePageContent { overflow:hidden; width:100%; padding:none !important; margin:none !important;} - -.pageAddContent { width:700px; } - -.widgetOutput { float:left; cursor:move; z-index:998; overflow:hidden; position:relative; width:100%; } - -.widgetOutput .widgetBorder { border:1px solid #C7DBE9; z-index:999; } -.widgetOutput .widgetBoxBorder { border:1px solid #D2E9C7; z-index:999; } - -.widgetOutput .widgetResize { background:transparent url("../images/btn_resize.gif") no-repeat left bottom; width:12px; height:12px; position:absolute; bottom:1px; right:1px; cursor:pointer; z-index:1000;} -.widgetOutput .widgetResizeLeft { background:transparent url("../images/btn_resize_left.gif") no-repeat left bottom; width:12px; height:12px; position:absolute; bottom:0; left:1px; cursor:pointer; z-index:1000;} -.widgetOutput .widgetBoxResize { background:transparent url("../images/btn_resize.gif") no-repeat left bottom; width:12px; height:12px; position:absolute; bottom:1px; right:1px; cursor:pointer; z-index:1000;} -.widgetOutput .widgetBoxResizeLeft { background:transparent url("../images/btn_resize_left.gif") no-repeat left bottom; width:12px; height:12px; position:absolute; bottom:0; left:1px; cursor:pointer; z-index:1000;} - -.widgetButtons { z-index:9999; overflow:hidden; *zoom:1; float:left; padding:3px; position:absolute; visibility:hidden;} -#widgetButton { background-color:#C7DBE9;left:0; top:0;} -#widgetBoxButton { background-color:#D2E9C7; right:0; top:0;} -.widgetButtons div { float:left; } -.widgetButtons .widgetStyle { background:transparent url("../images/widgetstyle_setup.gif") no-repeat 1px 1px; width:14px; height:14px; cursor:pointer; z-index:1000;} -.widgetButtons .widgetSetup { background:transparent url("../images/widget_setup.gif") no-repeat 1px 1px; width:14px; height:14px; cursor:pointer; z-index:1000;} -.widgetButtons .widgetCopy { background:transparent url("../images/widget_copy.gif") no-repeat 1px 1px; width:14px; height:14px; cursor:pointer; z-index:1000;} -.widgetButtons .widgetSize { background:transparent url("../images/widget_size.gif") no-repeat 1px 1px; width:14px; height:14px; cursor:pointer; z-index:1000;} -.widgetButtons .widgetRemove { background:transparent url("../images/widget_remove.gif") no-repeat 1px 1px; width:14px; height:14px; cursor:pointer; z-index:1000;} -.widgetButtons .widgetBoxCopy { background:transparent url("../images/widget_copy.gif") no-repeat 1px 1px; width:14px; height:14px; cursor:pointer; z-index:1000;} -.widgetButtons .widgetBoxSize { background:transparent url("../images/widget_size.gif") no-repeat 1px 1px; width:14px; height:14px; cursor:pointer; z-index:1000;} -.widgetButtons .widgetBoxRemove { background:transparent url("../images/widget_remove.gif") no-repeat 1px 1px; width:14px; height:14px; cursor:pointer; z-index:1000;} - -#pageSizeLayer { width:500px; overflow:hidden; border:1px solid #888888; background:#FFFFFF; z-index:2000; position:absolute; } -#pageSizeLayer table { border:0; width:100%; table-layout:fixed; } -#pageSizeLayer table th { padding:4px 0 4px 0; background-color:#DEDEDE; text-align:center; color:#888888;} -#pageSizeLayer table th.line { border-top:1px dotted #EEEEEE; } -#pageSizeLayer table td { padding:4px 10px 4px 10px; background-color:#EFEFEF;} -#pageSizeLayer table td div { margin-bottom:5px; } -#pageSizeLayer table td.line { border-top:1px dotted #999999; } -#pageSizeLayer table td.buttonBox { background-color:#FFFFFF; white-space:nowrap; overflow:hidden; vertical-align:top; text-align:center; border-top:1px solid #888888; color:#DDDDDD;} -#pageSizeLayer .input { background:#FFFFFF; border:1px solid #AAAAAA; padding:1px; font:8pt verdana; width:60px; } -#pageSizeLayer .full_input { background:#FFFFFF; border:1px solid #AAAAAA; padding:1px; font:8pt verdana; width:90%; } -#pageSizeLayer .small_input { background:#FFFFFF; border:1px solid #AAAAAA; padding:1px; font:8pt verdana; width:20px; } -#pageSizeLayer .color_input { background:#FFFFFF; border:1px solid #AAAAAA; padding:1px; font:8pt verdana; width:44px; } -#pageSizeLayer .submit { width:90%; border:1px solid #DEDEDE; background-color:#FFFFFF;} - -.help { padding:5px 0; background-color:#EFEFEF; border-top:1px solid #CCCCCC; } - -ul.midCommand { float:left; margin:0 0 0 10px;; padding:0; *zoom:1; } -ul.midCommand li { display:block; margin-bottom:5px; list-style:none;} - -a.widgetStyle { float:left; margin:0 10px 10px 0; border:1px solid #fff; overflow:hidden; *zoom:1; width:96px; height:96px; position:relative; text-decoration:none;} -a.widgetStyle:hover { border:1px dashed #ccc; } -a.widgetStyle:hover span { display:none; } -a.widgetStyle.selected { border:1px dashed #999; } -a.widgetStyle img {width:96px; height:96px; margin:1px; } -a.widgetStyle span { position:absolute; left:0; bottom:0; display:block; width:96px; background-color:#888; color:#fff; padding:4px 3px 3px 3px; opacity:.8; filter:alpha(opacity=80); text-align:center; font-family:tahoma;} +@charset "utf-8"; + +.widget_title { border:1px solid #DDDDDD; margin:10px 5px 5px 0; padding:3px; } +.widget_mid_list { margin:0 0 5px 10px; } +.widget_description { color:#AAAAAA; border-top:1px dotted #EEEEEE; margin:5px 0 0 0; padding:5px 0 0 0; } +#colorset_area { margin-top:.5em; } + +#colorset_area .header { float:left; margin-right:.5em; padding-top:.2em;} +#colorset_area .footer { float:left; } + +#zonePageContent { overflow:hidden; width:100%; padding:none !important; margin:none !important;} + +.pageAddContent { width:700px; } + +.widgetOutput { float:left; cursor:move; z-index:998; overflow:hidden; position:relative; width:100%; } + +.widgetOutput .widgetBorder { border:1px solid #C7DBE9; z-index:999; } +.widgetOutput .widgetBoxBorder { border:1px solid #D2E9C7; z-index:999; } + +.widgetOutput .widgetResize { background:transparent url("../images/btn_resize.gif") no-repeat left bottom; width:12px; height:12px; position:absolute; bottom:1px; right:1px; cursor:pointer; z-index:1000;} +.widgetOutput .widgetResizeLeft { background:transparent url("../images/btn_resize_left.gif") no-repeat left bottom; width:12px; height:12px; position:absolute; bottom:0; left:1px; cursor:pointer; z-index:1000;} +.widgetOutput .widgetBoxResize { background:transparent url("../images/btn_resize.gif") no-repeat left bottom; width:12px; height:12px; position:absolute; bottom:1px; right:1px; cursor:pointer; z-index:1000;} +.widgetOutput .widgetBoxResizeLeft { background:transparent url("../images/btn_resize_left.gif") no-repeat left bottom; width:12px; height:12px; position:absolute; bottom:0; left:1px; cursor:pointer; z-index:1000;} + +.widgetButtons { z-index:9999; overflow:hidden; *zoom:1; float:left; padding:3px; position:absolute; visibility:hidden;} +#widgetButton { background-color:#C7DBE9;left:0; top:0;} +#widgetBoxButton { background-color:#D2E9C7; right:0; top:0;} +.widgetButtons div { float:left; } +.widgetButtons .widgetStyle { background:transparent url("../images/widgetstyle_setup.gif") no-repeat 1px 1px; width:14px; height:14px; cursor:pointer; z-index:1000;} +.widgetButtons .widgetSetup { background:transparent url("../images/widget_setup.gif") no-repeat 1px 1px; width:14px; height:14px; cursor:pointer; z-index:1000;} +.widgetButtons .widgetCopy { background:transparent url("../images/widget_copy.gif") no-repeat 1px 1px; width:14px; height:14px; cursor:pointer; z-index:1000;} +.widgetButtons .widgetSize { background:transparent url("../images/widget_size.gif") no-repeat 1px 1px; width:14px; height:14px; cursor:pointer; z-index:1000;} +.widgetButtons .widgetRemove { background:transparent url("../images/widget_remove.gif") no-repeat 1px 1px; width:14px; height:14px; cursor:pointer; z-index:1000;} +.widgetButtons .widgetBoxCopy { background:transparent url("../images/widget_copy.gif") no-repeat 1px 1px; width:14px; height:14px; cursor:pointer; z-index:1000;} +.widgetButtons .widgetBoxSize { background:transparent url("../images/widget_size.gif") no-repeat 1px 1px; width:14px; height:14px; cursor:pointer; z-index:1000;} +.widgetButtons .widgetBoxRemove { background:transparent url("../images/widget_remove.gif") no-repeat 1px 1px; width:14px; height:14px; cursor:pointer; z-index:1000;} + +#pageSizeLayer { width:500px; overflow:hidden; border:1px solid #888888; background:#FFFFFF; z-index:2000; position:absolute; } +#pageSizeLayer table { border:0; width:100%; table-layout:fixed; } +#pageSizeLayer table th { padding:4px 0 4px 0; background-color:#DEDEDE; text-align:center; color:#888888;} +#pageSizeLayer table th.line { border-top:1px dotted #EEEEEE; } +#pageSizeLayer table td { padding:4px 10px 4px 10px; background-color:#EFEFEF;} +#pageSizeLayer table td div { margin-bottom:5px; } +#pageSizeLayer table td.line { border-top:1px dotted #999999; } +#pageSizeLayer table td.buttonBox { background-color:#FFFFFF; white-space:nowrap; overflow:hidden; vertical-align:top; text-align:center; border-top:1px solid #888888; color:#DDDDDD;} +#pageSizeLayer .input { background:#FFFFFF; border:1px solid #AAAAAA; padding:1px; font:8pt verdana; width:60px; } +#pageSizeLayer .full_input { background:#FFFFFF; border:1px solid #AAAAAA; padding:1px; font:8pt verdana; width:90%; } +#pageSizeLayer .small_input { background:#FFFFFF; border:1px solid #AAAAAA; padding:1px; font:8pt verdana; width:20px; } +#pageSizeLayer .color_input { background:#FFFFFF; border:1px solid #AAAAAA; padding:1px; font:8pt verdana; width:44px; } +#pageSizeLayer .submit { width:90%; border:1px solid #DEDEDE; background-color:#FFFFFF;} + +.help { padding:5px 0; background-color:#EFEFEF; border-top:1px solid #CCCCCC; } + +ul.midCommand { float:left; margin:0 0 0 10px;; padding:0; *zoom:1; } +ul.midCommand li { display:block; margin-bottom:5px; list-style:none;} + +a.widgetStyle { float:left; margin:0 10px 10px 0; border:1px solid #fff; overflow:hidden; *zoom:1; width:96px; height:96px; position:relative; text-decoration:none;} +a.widgetStyle:hover { border:1px dashed #ccc; } +a.widgetStyle:hover span { display:none; } +a.widgetStyle.selected { border:1px dashed #999; } +a.widgetStyle img {width:96px; height:96px; margin:1px; } +a.widgetStyle span { position:absolute; left:0; bottom:0; display:block; width:96px; background-color:#888; color:#fff; padding:4px 3px 3px 3px; opacity:.8; filter:alpha(opacity=80); text-align:center; font-family:tahoma;} diff --git a/modules/widget/tpl/filter/style_generate_code_in_page.xml b/modules/widget/tpl/filter/style_generate_code_in_page.xml index bbb543a24..5704533dc 100644 --- a/modules/widget/tpl/filter/style_generate_code_in_page.xml +++ b/modules/widget/tpl/filter/style_generate_code_in_page.xml @@ -1,9 +1,9 @@ - - - - - - - - - + + + + + + + + + diff --git a/modules/widget/tpl/js/widget.js b/modules/widget/tpl/js/widget.js index ce8668a6a..c4a2404c7 100644 --- a/modules/widget/tpl/js/widget.js +++ b/modules/widget/tpl/js/widget.js @@ -1,1353 +1,1353 @@ -/** - * @file modules/widget/js/widget.js - * @author NHN (developers@xpressengine.com) - * @brief 위젯 관리용 자바스크립트 - **/ - -/* DOM 속성을 구하기 위한 몇가지 함수들.. */ -// style의 값을 구하는게 IE랑 그외가 다름. -function getStyle(obj) { - var style = obj.getAttribute("style"); - if(!style) - { - style = obj.style; - } - if(typeof(style)=="object") style = style["cssText"]; - return style; -} - -// float: 값을 구하는게 IE랑 그외가 다름 -function getFloat(obj) { - var cssFloat = xIE4Up?obj.style.styleFloat:obj.style.cssFloat; - if(!cssFloat) cssFloat = 'left'; - return cssFloat; -} -function setFloat(obj, fl) { - if(xIE4Up) obj.style.styleFloat = fl; - else obj.style.cssFloat = fl; -} - -// padding값을 구하는 함수 (없을 경우 0으로 세팅), zbxe의 위젯에서만 사용 -function getPadding(obj, direct) { - var padding = obj.getAttribute("widget_padding_"+direct); - if(!padding || padding == null) padding = 0; - return padding; -} - - -/* 위젯 핸들링 시작 */ -var zonePageObj = null; -var zoneModuleSrl = 0; -function doStartPageModify(zoneID, module_srl) { - zonePageObj = xGetElementById(zoneID); - zoneModuleSrl = module_srl; - - // 위젯 크기/여백 조절 레이어를 가장 밖으로 뺌 - jQuery('#tmpPageSizeLayer') - .attr('id', 'pageSizeLayer') - .css({position:'absolute',left:0,top:0}) - .hide() - .appendTo('body') - .find('>form') - .submit(function(){ doApplyWidgetSize(this); return false; }); - - // 모든 위젯들의 크기를 정해진 크기로 맞춤 - doFitBorderSize(); - - // 드래그와 리사이즈와 관련된 이벤트 리스너 생성 - xAddEventListener(document,"click",doCheckWidget); - xAddEventListener(document,"mousedown",doCheckWidgetDrag); - xAddEventListener(document,'mouseover',widgetSetup); -} - - -// 내용 모두 삭제 -function removeAllWidget() { - if(!confirm(confirm_delete_msg)) return; - restoreWidgetButtons(); - xInnerHtml(zonePageObj,''); -} - -/** - * 특정 영역에 편집된 위젯들을 약속된 태그로 변환하여 return - **/ -function getWidgetContent(obj) { - var html = ""; - if(typeof(obj)=='undefined' || !obj) obj = zonePageObj; - - var widget = null; - jQuery('div.widgetOutput',obj).each(function(){ - if(jQuery(this).parent().get(0) != obj) return; - widget = jQuery(this).attr('widget'); - switch(widget) { - case 'widgetBox' : - html += getWidgetBoxCode(this, widget); - break; - case 'widgetContent' : - html += getContentWidgetCode(this, widget); - break; - default : - html += getWidgetCode(this, widget); - break; - } - }); - - return html; -} - -// 컨텐츠 위젯 코드 구함 -function getContentWidgetCode(childObj, widget) { - var cobj = childObj.firstChild; - - var widgetContent = jQuery('div.widgetContent',childObj); - var body = ''; - var document_srl = 0; - var attrs =''; - - if(widgetContent.size() > 0){ - document_srl = jQuery(childObj).attr('document_srl'); - if(document_srl>0){ - body = ''; - }else{ - body = widgetContent.html(); - } - - - for(var i=0;i'; - }else{ - return ''; - } -} - -// 위젯 박스 코드 구함 -function getWidgetBoxCode(childObj, widget) { - - var attrs = ""; - for(var i=0;i0){ - o = jQuery('.widget_inner',childObj); - o = o.get(0); - }else{ - o = jQuery('.nullWidget',childObj).get(0); - } - - var body = getWidgetContent(o); - return '
    '+body+'
    '; - -/* - var cobj = childObj.firstChild; - while(cobj) { - if(cobj.className == "widgetBorder" || cobj.className == "widgetBoxBorder") { - var c2obj = cobj.firstChild; - while(c2obj) { - if(c2obj.className == "nullWidget") { - var body = getWidgetContent(c2obj); - return '
    '+body+'
    '; - } - c2obj = c2obj.nextSibling; - } - } - cobj = cobj.nextSibling; - } -*/ -} - - - - -// 일반 위젯 컨텐츠 코드 구함 -function getWidgetCode(childObj, widget) { - var attrs = ""; - var code = ""; - for(var i=0;i'; -} - -/** - * 직접 내용을 입력하는 위젯을 추가 - **/ -// 팝업 띄움 -function doAddContent(mid) { - var url = request_uri.setQuery('module','widget').setQuery('act','dispWidgetAdminAddContent').setQuery('module_srl',zoneModuleSrl).setQuery('mid',mid); - popopen(url, "addContent"); -} - -// 직접 내용을 입력하기 위한 에디터 활성화 작업 및 form 데이터 입력 -function doSyncPageContent() { - if(opener && opener.selectedWidget) { - - var fo_obj = xGetElementById("content_fo"); - var sel_obj = opener.selectedWidget; - fo_obj.style.value = getStyle(opener.selectedWidget); - fo_obj.widget_padding_left.value = getPadding(sel_obj, 'left'); - fo_obj.widget_padding_right.value = getPadding(sel_obj,'right'); - fo_obj.widget_padding_bottom.value = getPadding(sel_obj,'bottom'); - fo_obj.widget_padding_top.value = getPadding(sel_obj,'top'); - - var obj = sel_obj.firstChild; - while(obj && obj.className != "widgetContent") obj = obj.nextSibling; - if(obj && obj.className == "widgetContent") { - if(!fo_obj.document_srl || fo_obj.document_srl.value == 0) { - try { - var content = Base64.decode(xInnerHtml(obj)); - content = editorReplacePath(content); - xGetElementById("content_fo").content.value = content; - xe.Editors["1"].exec("SET_IR", [content]); - } - catch(e) - { - } - } - } - } - - if(typeof(editorStart)!='undefined') editorStart(1, "module_srl", "content", false, 400 ); - //editor_upload_start(1); - - setFixedPopupSize(); -} - -// 부모창에 위젯을 추가 -function addContentWidget(fo_obj) { - var editor_sequence = fo_obj.getAttribute('editor_sequence'); - var mid = fo_obj.mid.value; - var module_srl = fo_obj.module_srl.value; - var document_srl = fo_obj.document_srl.value; - var content = editorGetContent(editor_sequence); - var response_tags = new Array('error','message','document_srl'); - var params = new Array(); - params['editor_sequence'] = editor_sequence; - params['content'] = content; - params['module_srl'] = module_srl; - params['document_srl'] = document_srl; - exec_xml('widget',"procWidgetInsertDocument",params,completeAddContent,response_tags,params,fo_obj); - return false; - -} - -function completeAddContent(ret_obj, response_tags, params, fo_obj) { - var document_srl = ret_obj['document_srl']; - - var contentWidget = opener.jQuery('div.widgetOutput[widget=widgetContent][document_srl='+document_srl+']'); - var attr = null; - if(contentWidget.size()>0) { - attr = contentWidget.get(0).attributes; - } - - var editor_sequence = params['editor_sequence']; - var content = editorGetContent(editor_sequence); - - var tpl = ''+ - '
    '+ - '
    '+ - '
    '+ - '
    '+ - '
    '+content+'
    '+ - '
    '+ - ''+ - '
    '; - - var oTpl = jQuery(tpl); - if(attr) { - jQuery.each(attr,function(i){ - if(!oTpl.attr(attr[i].name)){ - oTpl.attr(attr[i].name,attr[i].value); - } - }); - } - - oTpl = jQuery('
    ').append(oTpl); - tpl = oTpl.html(); - opener.doAddWidgetCode(tpl); - window.close(); -} - -/* 박스 위젯 추가 */ -function doAddWidgetBox() { - var tpl = ''+ - '
    '+ - '
    '+ - '
    '+ - '
    '+ - '
    '+ - '
    '+ - '
    '+ - '
    '; - xInnerHtml(zonePageObj, xInnerHtml(zonePageObj)+tpl); - doFitBorderSize(); -} - - -/* 일반 위젯을 추가하기 위해 위젯 팝업창을 띄움 */ -function doAddWidget(fo) { - var sel = fo.widget_list; - var idx = sel.selectedIndex; - var val = sel.options[idx].value; - var module_srl = fo.module_srl.value; - - var url = request_uri.setQuery('module','widget').setQuery('act','dispWidgetGenerateCodeInPage').setQuery('selected_widget', val).setQuery('module_srl', module_srl); - popopen(url,'GenerateWidgetCode'); -} - - - -// widgetBorder에 height를 widgetOutput와 맞춰줌 -function doFitBorderSize() { - var obj_list = xGetElementsByClassName('widgetBorder', zonePageObj); - for(var i=0;i-1) { - var pos = tmp.indexOf(""); - var cssfile = tmp.substr(9,eos-9); - if(cssfile.indexOf('.js')>-1) { - tmp = tmp.substr(eos); - continue; - } - if(!cssfile) break; - tmp = tmp.substr(eos); - - var cssfile = request_uri+'/'+cssfile; - if(typeof(document.createStyleSheet)=='undefined') { - var css =''; - var dummy = xCreateElement("DIV"); - xInnerHtml(dummy , css); - document.body.appendChild(dummy); - } else { - document.createStyleSheet(cssfile,0); - } - } - - // widget 코드에서 javascript 부분을 빼서 eval후 결과값을 대체함 - checkDocumentWrite = true; ///< document.write(ln)등의 함수값을 바로 사용하기 위한 check flag - - // widget_code의 javascript 부분 수정 - var tmp = widget_code.toLowerCase(); - while(tmp.indexOf("-1) { - - var pos = tmp.indexOf("")+9; - - var script = widget_code.substr(pos,length); - script = script.replace(/^]*)>/i,'').replace(/<\/script>$/i,''); - - writedText = null; - eval(script); - widget_code = widget_code.substr(0,pos)+writedText+widget_code.substr(pos+length); - tmp = widget_code.toLowerCase(); - } - - - - // html 추가 - var dummy = xCreateElement('div'); - xInnerHtml(dummy, widget_code); - var obj = dummy.childNodes[0]; - - if(selectedWidget && selectedWidget.getAttribute("widget")) { - var o = jQuery('div.widget_inner',selectedWidget); - var n = jQuery('div.widget_inner',obj); - - if(n.size()==0) n = jQuery('div.nullWidget',obj); - if(o.size()==0) o = jQuery('div.nullWidget',selectedWidget); - - n.html(o.html()); - - - selectedWidget.parentNode.insertBefore(obj, selectedWidget); - selectedWidget.parentNode.removeChild(selectedWidget); - } else { - xGetElementById('zonePageContent').appendChild(obj); - } - checkDocumentWrite = false; - selectedWidget = null; - - /* - //zoneObj.style.visibility = 'hidden'; - zoneObj.style.opacity = 0.2; - zoneObj.style.filter = "alpha(opacity=20)"; - - // 위젯 추가후 페이지 리로딩 - var tpl = getWidgetContent(); - - var fo_obj = xGetElementById('pageFo'); - fo_obj.content.value = tpl; - fo_obj.mid.value = current_mid; - fo_obj.submit(); - */ -} - -// 클릭 이벤트시 위젯의 수정/제거/이벤트 무효화 처리 -function doCheckWidget(e) { - var evt = new xEvent(e); if(!evt.target) return; - var obj = evt.target; - - selectedWidget = null; - - var pObj = obj.parentNode; - while(pObj) { - if(pObj.id == "pageSizeLayer") return; - pObj = pObj.parentNode; - } - - doHideWidgetSizeSetup(); - // 위젯 설정 - if(obj.className == 'widgetSetup') { - var p_obj = obj.parentNode.parentNode; - var widget = p_obj.getAttribute("widget"); - if(!widget) return; - selectedWidget = p_obj; - if(widget == 'widgetContent') popopen(request_uri+"?module=widget&act=dispWidgetAdminAddContent&module_srl="+zoneModuleSrl+"&document_srl="+p_obj.getAttribute("document_srl")+'&mid='+current_mid, "addContent"); - else popopen(request_uri+"?module=widget&act=dispWidgetGenerateCodeInPage&selected_widget="+widget+"&widgetstyle="+widgetstyle,'GenerateCodeInPage'); - return; - - // 위젯 스타일 - } else if(obj.className == 'widgetStyle') { - var p_obj = obj.parentNode.parentNode; - var widget = p_obj.getAttribute("widget"); - var widgetstyle = p_obj.getAttribute("widgetstyle"); - if(!widget) return; - selectedWidget = p_obj; - popopen(request_uri+"?module=widget&act=dispWidgetStyleGenerateCodeInPage&selected_widget="+widget+"&widgetstyle="+widgetstyle,'GenerateCodeInPage'); - return; - - // 위젯 복사 - } else if(obj.className == 'widgetCopy' && obj.parentNode.parentNode.className == 'widgetOutput') { - p_obj = obj.parentNode.parentNode; - restoreWidgetButtons(); - - if(p_obj.getAttribute('widget')=='widgetContent' && p_obj.getAttribute('document_srl') ) { - var response_tags = new Array('error','message','document_srl'); - var params = new Array(); - params['document_srl'] =p_obj.getAttribute('document_srl'); - exec_xml('widget','procWidgetCopyDocument', params, completeCopyWidgetContent, response_tags, params, p_obj); - return; - } else { - var dummy = xCreateElement("DIV"); - xInnerHtml(dummy,xInnerHtml(p_obj)); - - dummy.widget_sequence = ''; - dummy.className = "widgetOutput"; - for(var i=0;i 0) return; - - doHideWidgetSizeSetup(); - - if(obj.className == 'widgetSetup' || obj.className == 'widgetStyle' || obj.className == 'widgetCopy' || obj.className == 'widgetBoxCopy' || obj.className == 'widgetSize' || obj.className == 'widgetBoxSize' || obj.className == 'widgetRemove' || obj.className == 'widgetBoxRemove') return; - - p_obj = obj; - while(p_obj) { - if(p_obj.className == 'widgetOutput' || p_obj.className == 'widgetResize' || p_obj.className == 'widgetResizeLeft' || p_obj.className == 'widgetBoxResize' || p_obj.className == 'widgetBoxResizeLeft') { - widgetDragEnable(p_obj, widgetDragStart, widgetDrag, widgetDragEnd); - widgetMouseDown(e); - return; - } - p_obj = p_obj.parentNode; - } -} - -function _getInt(val) { - if(!val || val == "null") return 0; - if(parseInt(val,10)==NaN) return 0; - return parseInt(val,10); -} - -// 위젯 크기 조절 레이어를 보여줌 -var selectedSizeWidget = null; -function doShowWidgetSizeSetup(px, py, obj) { - var layer = jQuery('#pageSizeLayer'); - var form = layer.find('>form:first'); - var obj = jQuery(obj); - - if (!form.length) return; - - selectedSizeWidget = obj[0]; - - var opts = { - widget_align : obj.css('float'), - - width : obj[0].style.width, - height : obj[0].style.height, - - padding_left : _getInt(obj.attr('widget_padding_left')), - padding_right : _getInt(obj.attr('widget_padding_right')), - padding_top : _getInt(obj.attr('widget_padding_top')), - padding_bottom : _getInt(obj.attr('widget_padding_bottom')), - - margin_left : _getInt(obj[0].style.marginLeft), - margin_right : _getInt(obj[0].style.marginRight), - margin_top : _getInt(obj[0].style.marginTop), - margin_bottom : _getInt(obj[0].style.marginBottom), - - border_top_color : transRGB2Hex(obj[0].style.borderTopColor), - border_top_thick : obj[0].style.borderTopWidth.replace(/px$/i, ''), - border_top_type : obj[0].style.borderTopStyle, - - border_bottom_color : transRGB2Hex(obj[0].style.borderBottomColor), - border_bottom_thick : obj[0].style.borderBottomWidth.replace(/px$/i, ''), - border_bottom_type : obj[0].style.borderBottomStyle, - - border_right_color : transRGB2Hex(obj[0].style.borderRightColor), - border_right_thick : obj[0].style.borderRightWidth.replace(/px$/i, ''), - border_right_type : obj[0].style.borderRightStyle, - - border_left_color : transRGB2Hex(obj[0].style.borderLeftColor), - border_left_thick : obj[0].style.borderLeftWidth.replace(/px$/i, ''), - border_left_type : obj[0].style.borderLeftStyle, - - background_color : transRGB2Hex(obj[0].style.backgroundColor), - background_image_url : obj[0].style.backgroundImage.replace(/^url\(/i,'').replace(/\)$/i,''), - - background_x : 0, - background_y : 0, - - background_repeat : obj[0].style.backgroundRepeat - }; - - // background position - var pos = obj[0].style.backgroundPosition; - if(pos) { - pos = pos.split(' '); - if(pos.length == 2) { - opts.background_x = pos[0]; - opts.background_y = pos[1]; - } - } - - layer.css('top', py+'px').show(); - var _zonePageObj = jQuery(zonePageObj) - var zoneOffsetLeft = _zonePageObj.offset().left; - var zoneWidth = _zonePageObj.width(); - if (px + layer.width() > zoneOffsetLeft + zoneWidth) px = zoneOffsetLeft + zoneWidth - layer.width() - 5; - layer.css('left', px+'px'); - - jQuery.each(opts, function(key, val){ - var el = form[0].elements[key]; - if (el) el.value = val; - if (el.tagName.toLowerCase() == "select") - { - if(el.selectedIndex == -1) { - el.selectedIndex = 0; - } - } - }); - - try { form[0].elements[0].focus() } catch(e) {}; -} - -function doHideWidgetSizeSetup() { - jQuery('#pageSizeLayer').hide(); - //var layer = xGetElementById("pageSizeLayer"); - //layer.style.visibility = "hidden"; - //layer.style.display = "none"; -} - -function _getSize(value) { - if(!value) return 0; - var type = "px"; - if(value.lastIndexOf("%")>=0) type = "%"; - var num = parseInt(value,10); - if(num<1) return 0; - if(type == "%" && num > 100) num = 100; - return ""+num+type; -} - -function _getBorderStyle(fld_color, fld_thick, fld_type) { - var color = fld_color.value; - color = color.replace(/^#/,''); - if(!color) color = '#FFFFFF'; - else color = '#'+color; - var width = fld_thick.value; - if(!width) width = '0px'; - else width = parseInt(width,10)+'px'; - var style = fld_type.options[fld_type.selectedIndex].value; - if(!style) style = 'solid'; - - var str = color+' '+width+' '+style; - return str; -} - -function _getBGColorStyle(fld_color) { - var color = fld_color.replace(/^#/,''); - if(!color) color = '#FFFFFF'; - else color = '#'+color; - return color; -} - -function doApplyWidgetSize(fo_obj) { - if(selectedSizeWidget) { - if(fo_obj.widget_align.selectedIndex == 1) setFloat(selectedSizeWidget, 'right'); - else setFloat(selectedSizeWidget, 'left'); - - var width = _getSize(fo_obj.width.value); - if(width) selectedSizeWidget.style.width = width; - - var height = _getSize(fo_obj.height.value); - if(height && height != "100%") selectedSizeWidget.style.height = height; - else { - selectedSizeWidget.style.height = ''; - var widgetBorder = xGetElementsByClassName('widgetBorder',selectedSizeWidget); - for(var i=0;i 0) return; - if(jQuery(obj).is('.buttonBox') || jQuery(obj).parents('.buttonBox').size() > 0) return; - - - var o = jQuery(obj).parents('.widgetOutput'); - if(o.size() == 0){ - restoreWidgetButtons(); - return; - } - /* - if(!obj || typeof(obj.className)=='undefined' || obj.className != 'widgetOutput') { - restoreWidgetButtons(); - return; - } -*/ - - obj = o.get(0); - var widget = o.attr('widget'); - if(!widget) return; - - if(widget == 'widgetBox') { - restoreWidgetButtons(); - showWidgetButton('widgetBoxButton', obj); - } else { - restoreWidgetButtons(); - showWidgetButton('widgetButton', obj); - - var p_obj = obj.parentNode; - if(p_obj) { - while(p_obj) { - if(p_obj.nodeName == 'DIV' && p_obj.getAttribute('widget')=='widgetBox') { - showWidgetButton('widgetBoxButton', p_obj); - break; - } - p_obj = p_obj.parentNode; - } - } - } -} - -/* 위젯 드래그 */ -// 드래그 중이라는 상황을 간직할 변수 -var widgetDragManager = {obj:null, isDrag:false} -var widgetTmpObject = new Array(); -var widgetDisappear = 0; - -function widgetCreateTmpObject(obj) { - var id = obj.getAttribute('id'); - - tmpObj = xCreateElement('DIV'); - tmpObj.id = id + '_tmp'; - tmpObj.className = obj.className; - tmpObj.style.overflow = 'hidden'; - tmpObj.style.margin= '0px'; - tmpObj.style.padding = '0px'; - tmpObj.style.width = obj.style.width; - - tmpObj.style.display = 'none'; - tmpObj.style.position = 'absolute'; - tmpObj.style.opacity = 1; - tmpObj.style.filter = 'alpha(opacity=100)'; - - xLeft(tmpObj, xPageX(obj)); - xTop(tmpObj, xPageY(obj)); - - document.body.appendChild(tmpObj); - widgetTmpObject[obj.id] = tmpObj; - return tmpObj; -} - -// 기생성된 임시 object를 찾아서 return, 없으면 만들어서 return -var idStep = 0; -function widgetGetTmpObject(obj) { - if(!obj.id) obj.id = 'widget_'+idStep++; - var tmpObj = widgetTmpObject[obj.id]; - if(!tmpObj) tmpObj = widgetCreateTmpObject(obj); - return tmpObj; -} - -// 메뉴에 마우스 클릭이 일어난 시점에 드래그를 위한 제일 첫 동작 (해당 object에 각종 함수나 상태변수 설정) -function widgetDragEnable(obj, funcDragStart, funcDrag, funcDragEnd) { - - // 상위 object에 드래그 가능하다는 상태와 각 드래그 관련 함수를 설정 - obj.draggable = true; - obj.dragStart = funcDragStart; - obj.drag = funcDrag; - obj.dragEnd = funcDragEnd; - - // 드래그 가능하지 않다면 드래그 가능하도록 상태 지정하고 mousemove이벤트 등록 - if (!widgetDragManager.isDrag) { - widgetDragManager.isDrag = true; - xAddEventListener(document, 'mousemove', widgetDragMouseMove, false); - } -} - -// 드래그를 시작할때 호출되는 함수 (이동되는 형태를 보여주기 위한 작업을 함) -function widgetDragStart(tobj, px, py) { - if(tobj.className == 'widgetResize' || tobj.className == 'widgetResizeLeft' || tobj.className == 'widgetBoxResize' || tobj.className == 'widgetBoxResizeLeft') return; - var obj = widgetGetTmpObject(tobj); - - xInnerHtml(obj, xInnerHtml(tobj)); - - xLeft(obj, xPageX(tobj)); - xTop(obj, xPageY(tobj)); - xWidth(obj, xWidth(tobj)); - xHeight(obj, xHeight(tobj)); - - xDisplay(obj, 'block'); -} - -// 드래그 시작후 마우스를 이동할때 발생되는 이벤트에 의해 실행되는 함수 -function widgetDrag(tobj, dx, dy) { - var minWidth = 40; - var minHeight = 10; - - var sx = xPageX(tobj.parentNode); - var sy = xPageY(tobj.parentNode); - - var nx = tobj.xDPX; - var ny = tobj.xDPY; - - var zoneWidth = xWidth(zonePageObj); - var zoneLeft = xPageX(zonePageObj); - var zoneRight = zoneLeft + zoneWidth; - - var pWidth = xWidth(tobj.parentNode); - - var cssFloat = getFloat(tobj.parentNode); - if(!cssFloat) cssFloat = 'left'; - - // 위젯 리사이즈 (우측) - if(tobj.className == 'widgetResize' || tobj.className == 'widgetBoxResize') { - if(nx < sx+minWidth) nx = sx+minWidth; - if(nx > zoneRight) nx = zoneRight; - - if(cssFloat == 'right') nx = sx + pWidth; - - var new_width = nx - sx; - if(new_width < minWidth) new_width = minWidth; - - var new_height = ny - sy; - if(new_height < minHeight) new_height = minHeight; - - if( zoneRight < sx+new_width) new_width = zoneRight - sx; - - // 위젯의 크기 조절 - xWidth(tobj.nextSibling.nextSibling, new_width); - xHeight(tobj.nextSibling.nextSibling, new_height); - - xWidth(tobj.parentNode, new_width); - xHeight(tobj.parentNode, new_height); - - // 위젯 리사이즈 (좌측) - } else if(tobj.className == 'widgetResizeLeft' || tobj.className == 'widgetBoxResizeLeft') { - - if(nx < zoneLeft) nx = zoneLeft; - - if(cssFloat == 'left') nx = sx; - - var new_width = pWidth + (sx - nx); - if(new_width < minWidth) new_width = minWidth; - - var new_height = ny - sy; - if(new_height < minHeight) new_height = minHeight; - - // 위젯의 크기 조절 - xWidth(tobj.nextSibling, new_width); - xHeight(tobj.nextSibling, new_height); - - xWidth(tobj.parentNode, new_width); - xHeight(tobj.parentNode, new_height); - - // 위젯 드래그 - } else { - var obj = widgetGetTmpObject(tobj); - - xLeft(obj, parseInt(xPageX(obj),10) + parseInt(dx,10)); - xTop(obj, parseInt(xPageY(obj),10) + parseInt(dy,10)); - - // 박스 안에 있을 경우에는 박스내의 위젯하고 자리를 바꾸고 그 외의 경우에는 박스를 빠져 나간다 - if(tobj.parentNode != zonePageObj) { - // 박스내에 있는 위젯들을 구함 - var widgetList = xGetElementsByClassName("widgetOutput",tobj.parentNode); - - for(var i=0;i= l && tobj.xDPX <= ll && tobj.xDPY >= t && tobj.xDPY <= tt && tobj.parentNode == target_obj.parentNode) { - var next1 = target_obj.nextSibling; - if(!next1) { - next1 = xCreateElement("DIV"); - target_obj.parentNode.appendChild(next1); - } - var next2 = tobj.nextSibling; - if(!next2) { - next2 = xCreateElement("DIV"); - tobj.parentNode.appendChild(next2); - } - - if(next1) next1.parentNode.insertBefore(tobj, next1); - if(next2) next2.parentNode.insertBefore(target_obj, next2); - doFitBorderSize(); - widgetList = null; - return; - } - } - widgetList = null; - - // 만약 다른 위젯과 자리를 바꾸지 못하였는데 자기 부모창밖에 있는게 확인이 되면 박스 밖으로 내보낸다. - var p_tobj = jQuery(tobj).parents('div.nullWidget').get(0); - var l = xPageX(p_tobj); - var t = xPageY(p_tobj); - var ll = parseInt(l,10) + parseInt(xWidth(p_tobj),10); - var tt = parseInt(t,10) + parseInt(xHeight(p_tobj),10); - if( (tobj.xDPX < l || tobj.xDPX > ll) || (tobj.xDPY < t || tobj.xDPY > tt) ) { - -// zonePageObj.insertBefore(tobj, tobj.parentNode.parentNode.parentNode); - zonePageObj.insertBefore(tobj, jQuery(tobj).parents('div.widgetOutput[widget=widgetBox]').get(0)); - - doFitBorderSize(); - return; - } - - // 박스 밖에 있을 경우에는 다른 위젯과 자리를 바꾸거나 박스내에 들어가도록 한다 - } else { - // 이동하려는 위젯이 박스 위젯이 아니라면 박스 위젯들을 구해서 입력 유무를 검사한다 - if(tobj.getAttribute("widget")!="widgetBox") { - - var boxList = xGetElementsByClassName("nullWidget", zonePageObj); - for(var i=0;i= l && tobj.xDPX <= ll && tobj.xDPY >= t && tobj.xDPY <= tt) { - - //박스 위젯이다 - if(target_obj.className == "nullWidget") { - - var wb_ws = jQuery('div.widget_inner',jQuery(target_obj)); - - //박스 위젯에 위젯스타일이 적용 안된경우 - if(wb_ws.size() == 0){ - target_obj.appendChild(tobj); - - //박스 위젯에 위젯스타일이 적용된경우 또는 박스안에 위젯이 위젯스타일이 적용된겅우 - }else{ - wb_ws.get(0).appendChild(tobj); - } - - // 이동을 멈춤 - widgetManualEnd(); - - doFitBorderSize(); - boxList = null; - return; - } - } - } - boxList = null; - } - - // 다른 위젯들을 구해서 자리를 바꿈 - var widgetList = xGetElementsByClassName("widgetOutput",zonePageObj); - for(var i=0;i= l && tobj.xDPX <= ll && tobj.xDPY >= t && tobj.xDPY <= tt && tobj.parentNode == target_obj.parentNode) { - var next1 = target_obj.nextSibling; - if(!next1) next1 = target_obj.parentNode.lastChild; - if(!next1) { - next1 = xCreateElement("DIV"); - target_obj.parentNode.appendChild(next1); - } - var next2 = tobj.nextSibling; - if(!next2) { - next2 = xCreateElement("DIV"); - tobj.parentNode.appendChild(next2); - } - - if(next1) next1.parentNode.insertBefore(tobj, next1); - if(next2) next2.parentNode.insertBefore(target_obj, next2); - doFitBorderSize(); - widgetList = null; - return; - } - } - widgetList = null; - } - } -} - -// 드래그 종료 (이동되는 object가 이동할 곳에 서서히 이동되는 것처럼 보이는 효과) -function widgetDragEnd(tobj, px, py) { - var obj = widgetGetTmpObject(tobj); - widgetDisapear = widgetDisapearObject(obj, tobj); - widgetDragDisable(tobj.getAttribute('id')); -} - -// 스르르 사라지게 함 (일단 사라지게 하는 기능을 제거.. 속도 문제) -function widgetDisapearObject(obj, tobj) { - xInnerHtml(tobj,xInnerHtml(obj)); - xInnerHtml(obj,''); - xDisplay(obj, 'none'); - obj.parentNode.removeChild(obj); - widgetTmpObject[tobj.id] = null; - return; - - /* - var it = 5; - var ib = 1; - - var x = parseInt(xPageX(obj),10); - var y = parseInt(xPageY(obj),10); - var ldt = (x - parseInt(xPageX(tobj),10)) / ib; - var tdt = (y - parseInt(xPageY(tobj),10)) / ib; - - return setInterval(function() { - if(ib < 1) { - clearInterval(widgetDisapear); - xInnerHtml(tobj,xInnerHtml(obj)); - xInnerHtml(obj,''); - xDisplay(obj, 'none'); - obj.parentNode.removeChild(obj); - widgetTmpObject[tobj.id] = null; - return; - } - ib -= 5; - x-=ldt; - y-=tdt; - xLeft(obj, x); - xTop(obj, y); - }, it/ib); - */ -} - -// 마우스다운 이벤트 발생시 호출됨 -function widgetMouseDown(e) { - var evt = new xEvent(e); - var obj = evt.target; - - while(obj && !obj.draggable) { - obj = xParent(obj, true); - } - if(obj) { - xPreventDefault(e); - obj.xDPX = evt.pageX; - obj.xDPY = evt.pageY; - widgetDragManager.obj = obj; - xAddEventListener(document, 'mouseup', widgetMouseUp, false); - if (obj.dragStart) obj.dragStart(obj, evt.pageX, evt.pageY); - } -} - -// 마우스 버튼을 놓았을때 동작될 함수 (각종 이벤트 해제 및 변수 설정 초기화) -function widgetMouseUp(e) { - if (widgetDragManager.obj) { - xPreventDefault(e); - xRemoveEventListener(document, 'mouseup', widgetMouseUp, false); - - if (widgetDragManager.obj.dragEnd) { - var evt = new xEvent(e); - widgetDragManager.obj.dragEnd(widgetDragManager.obj, evt.pageX, evt.pageY); - } - - widgetDragManager.obj = null; - widgetDragManager.isDrag = false; - } -} - -// 드래그할때의 object이동등을 담당 -function widgetDragMouseMove(e) { - var evt = new xEvent(e); - if(widgetDragManager.obj) { - xPreventDefault(e); - - var obj = widgetDragManager.obj; - var dx = evt.pageX - obj.xDPX; - var dy = evt.pageY - obj.xDPY; - - obj.xDPX = evt.pageX; - obj.xDPY = evt.pageY; - - if (obj.drag) { - obj.drag(obj, dx, dy); - } else { - xMoveTo(obj, xLeft(obj) + dx, xTop(obj) + dy); - } - } -} - -// 해당 object 에 더 이상 drag가 되지 않도록 설정 -function widgetDragDisable(id) { - if (!widgetDragManager) return; - var obj = xGetElementById(id); - obj.draggable = false; - obj.dragStart = null; - obj.drag = null; - obj.dragEnd = null; - //obj.style.backgroundColor = obj.getAttribute('source_color'); - - xRemoveEventListener(obj, 'mousedown', widgetMouseDown, false); - - return; -} - -// 강제로 드래그를 종료시킴 -function widgetManualEnd() { - var tobj = widgetDragManager.obj; - if(!tobj) return; - - xRemoveEventListener(document, 'mouseup', widgetMouseUp, false); - xAddEventListener(document, 'mousemove', widgetDragMouseMove, false); - - var obj = widgetGetTmpObject(tobj); - widgetDisapear = widgetDisapearObject(obj, tobj); - widgetDragDisable(tobj.getAttribute('id')); - - widgetDragManager.obj = null; - widgetDragManager.isDrag = false; -} +/** + * @file modules/widget/js/widget.js + * @author NHN (developers@xpressengine.com) + * @brief 위젯 관리용 자바스크립트 + **/ + +/* DOM 속성을 구하기 위한 몇가지 함수들.. */ +// style의 값을 구하는게 IE랑 그외가 다름. +function getStyle(obj) { + var style = obj.getAttribute("style"); + if(!style) + { + style = obj.style; + } + if(typeof(style)=="object") style = style["cssText"]; + return style; +} + +// float: 값을 구하는게 IE랑 그외가 다름 +function getFloat(obj) { + var cssFloat = xIE4Up?obj.style.styleFloat:obj.style.cssFloat; + if(!cssFloat) cssFloat = 'left'; + return cssFloat; +} +function setFloat(obj, fl) { + if(xIE4Up) obj.style.styleFloat = fl; + else obj.style.cssFloat = fl; +} + +// padding값을 구하는 함수 (없을 경우 0으로 세팅), zbxe의 위젯에서만 사용 +function getPadding(obj, direct) { + var padding = obj.getAttribute("widget_padding_"+direct); + if(!padding || padding == null) padding = 0; + return padding; +} + + +/* 위젯 핸들링 시작 */ +var zonePageObj = null; +var zoneModuleSrl = 0; +function doStartPageModify(zoneID, module_srl) { + zonePageObj = xGetElementById(zoneID); + zoneModuleSrl = module_srl; + + // 위젯 크기/여백 조절 레이어를 가장 밖으로 뺌 + jQuery('#tmpPageSizeLayer') + .attr('id', 'pageSizeLayer') + .css({position:'absolute',left:0,top:0}) + .hide() + .appendTo('body') + .find('>form') + .submit(function(){ doApplyWidgetSize(this); return false; }); + + // 모든 위젯들의 크기를 정해진 크기로 맞춤 + doFitBorderSize(); + + // 드래그와 리사이즈와 관련된 이벤트 리스너 생성 + xAddEventListener(document,"click",doCheckWidget); + xAddEventListener(document,"mousedown",doCheckWidgetDrag); + xAddEventListener(document,'mouseover',widgetSetup); +} + + +// 내용 모두 삭제 +function removeAllWidget() { + if(!confirm(confirm_delete_msg)) return; + restoreWidgetButtons(); + xInnerHtml(zonePageObj,''); +} + +/** + * 특정 영역에 편집된 위젯들을 약속된 태그로 변환하여 return + **/ +function getWidgetContent(obj) { + var html = ""; + if(typeof(obj)=='undefined' || !obj) obj = zonePageObj; + + var widget = null; + jQuery('div.widgetOutput',obj).each(function(){ + if(jQuery(this).parent().get(0) != obj) return; + widget = jQuery(this).attr('widget'); + switch(widget) { + case 'widgetBox' : + html += getWidgetBoxCode(this, widget); + break; + case 'widgetContent' : + html += getContentWidgetCode(this, widget); + break; + default : + html += getWidgetCode(this, widget); + break; + } + }); + + return html; +} + +// 컨텐츠 위젯 코드 구함 +function getContentWidgetCode(childObj, widget) { + var cobj = childObj.firstChild; + + var widgetContent = jQuery('div.widgetContent',childObj); + var body = ''; + var document_srl = 0; + var attrs =''; + + if(widgetContent.size() > 0){ + document_srl = jQuery(childObj).attr('document_srl'); + if(document_srl>0){ + body = ''; + }else{ + body = widgetContent.html(); + } + + + for(var i=0;i'; + }else{ + return ''; + } +} + +// 위젯 박스 코드 구함 +function getWidgetBoxCode(childObj, widget) { + + var attrs = ""; + for(var i=0;i0){ + o = jQuery('.widget_inner',childObj); + o = o.get(0); + }else{ + o = jQuery('.nullWidget',childObj).get(0); + } + + var body = getWidgetContent(o); + return '
    '+body+'
    '; + +/* + var cobj = childObj.firstChild; + while(cobj) { + if(cobj.className == "widgetBorder" || cobj.className == "widgetBoxBorder") { + var c2obj = cobj.firstChild; + while(c2obj) { + if(c2obj.className == "nullWidget") { + var body = getWidgetContent(c2obj); + return '
    '+body+'
    '; + } + c2obj = c2obj.nextSibling; + } + } + cobj = cobj.nextSibling; + } +*/ +} + + + + +// 일반 위젯 컨텐츠 코드 구함 +function getWidgetCode(childObj, widget) { + var attrs = ""; + var code = ""; + for(var i=0;i'; +} + +/** + * 직접 내용을 입력하는 위젯을 추가 + **/ +// 팝업 띄움 +function doAddContent(mid) { + var url = request_uri.setQuery('module','widget').setQuery('act','dispWidgetAdminAddContent').setQuery('module_srl',zoneModuleSrl).setQuery('mid',mid); + popopen(url, "addContent"); +} + +// 직접 내용을 입력하기 위한 에디터 활성화 작업 및 form 데이터 입력 +function doSyncPageContent() { + if(opener && opener.selectedWidget) { + + var fo_obj = xGetElementById("content_fo"); + var sel_obj = opener.selectedWidget; + fo_obj.style.value = getStyle(opener.selectedWidget); + fo_obj.widget_padding_left.value = getPadding(sel_obj, 'left'); + fo_obj.widget_padding_right.value = getPadding(sel_obj,'right'); + fo_obj.widget_padding_bottom.value = getPadding(sel_obj,'bottom'); + fo_obj.widget_padding_top.value = getPadding(sel_obj,'top'); + + var obj = sel_obj.firstChild; + while(obj && obj.className != "widgetContent") obj = obj.nextSibling; + if(obj && obj.className == "widgetContent") { + if(!fo_obj.document_srl || fo_obj.document_srl.value == 0) { + try { + var content = Base64.decode(xInnerHtml(obj)); + content = editorReplacePath(content); + xGetElementById("content_fo").content.value = content; + xe.Editors["1"].exec("SET_IR", [content]); + } + catch(e) + { + } + } + } + } + + if(typeof(editorStart)!='undefined') editorStart(1, "module_srl", "content", false, 400 ); + //editor_upload_start(1); + + setFixedPopupSize(); +} + +// 부모창에 위젯을 추가 +function addContentWidget(fo_obj) { + var editor_sequence = fo_obj.getAttribute('editor_sequence'); + var mid = fo_obj.mid.value; + var module_srl = fo_obj.module_srl.value; + var document_srl = fo_obj.document_srl.value; + var content = editorGetContent(editor_sequence); + var response_tags = new Array('error','message','document_srl'); + var params = new Array(); + params['editor_sequence'] = editor_sequence; + params['content'] = content; + params['module_srl'] = module_srl; + params['document_srl'] = document_srl; + exec_xml('widget',"procWidgetInsertDocument",params,completeAddContent,response_tags,params,fo_obj); + return false; + +} + +function completeAddContent(ret_obj, response_tags, params, fo_obj) { + var document_srl = ret_obj['document_srl']; + + var contentWidget = opener.jQuery('div.widgetOutput[widget=widgetContent][document_srl='+document_srl+']'); + var attr = null; + if(contentWidget.size()>0) { + attr = contentWidget.get(0).attributes; + } + + var editor_sequence = params['editor_sequence']; + var content = editorGetContent(editor_sequence); + + var tpl = ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '+ + '
    '+content+'
    '+ + '
    '+ + ''+ + '
    '; + + var oTpl = jQuery(tpl); + if(attr) { + jQuery.each(attr,function(i){ + if(!oTpl.attr(attr[i].name)){ + oTpl.attr(attr[i].name,attr[i].value); + } + }); + } + + oTpl = jQuery('
    ').append(oTpl); + tpl = oTpl.html(); + opener.doAddWidgetCode(tpl); + window.close(); +} + +/* 박스 위젯 추가 */ +function doAddWidgetBox() { + var tpl = ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + xInnerHtml(zonePageObj, xInnerHtml(zonePageObj)+tpl); + doFitBorderSize(); +} + + +/* 일반 위젯을 추가하기 위해 위젯 팝업창을 띄움 */ +function doAddWidget(fo) { + var sel = fo.widget_list; + var idx = sel.selectedIndex; + var val = sel.options[idx].value; + var module_srl = fo.module_srl.value; + + var url = request_uri.setQuery('module','widget').setQuery('act','dispWidgetGenerateCodeInPage').setQuery('selected_widget', val).setQuery('module_srl', module_srl); + popopen(url,'GenerateWidgetCode'); +} + + + +// widgetBorder에 height를 widgetOutput와 맞춰줌 +function doFitBorderSize() { + var obj_list = xGetElementsByClassName('widgetBorder', zonePageObj); + for(var i=0;i-1) { + var pos = tmp.indexOf(""); + var cssfile = tmp.substr(9,eos-9); + if(cssfile.indexOf('.js')>-1) { + tmp = tmp.substr(eos); + continue; + } + if(!cssfile) break; + tmp = tmp.substr(eos); + + var cssfile = request_uri+'/'+cssfile; + if(typeof(document.createStyleSheet)=='undefined') { + var css =''; + var dummy = xCreateElement("DIV"); + xInnerHtml(dummy , css); + document.body.appendChild(dummy); + } else { + document.createStyleSheet(cssfile,0); + } + } + + // widget 코드에서 javascript 부분을 빼서 eval후 결과값을 대체함 + checkDocumentWrite = true; ///< document.write(ln)등의 함수값을 바로 사용하기 위한 check flag + + // widget_code의 javascript 부분 수정 + var tmp = widget_code.toLowerCase(); + while(tmp.indexOf("-1) { + + var pos = tmp.indexOf("")+9; + + var script = widget_code.substr(pos,length); + script = script.replace(/^]*)>/i,'').replace(/<\/script>$/i,''); + + writedText = null; + eval(script); + widget_code = widget_code.substr(0,pos)+writedText+widget_code.substr(pos+length); + tmp = widget_code.toLowerCase(); + } + + + + // html 추가 + var dummy = xCreateElement('div'); + xInnerHtml(dummy, widget_code); + var obj = dummy.childNodes[0]; + + if(selectedWidget && selectedWidget.getAttribute("widget")) { + var o = jQuery('div.widget_inner',selectedWidget); + var n = jQuery('div.widget_inner',obj); + + if(n.size()==0) n = jQuery('div.nullWidget',obj); + if(o.size()==0) o = jQuery('div.nullWidget',selectedWidget); + + n.html(o.html()); + + + selectedWidget.parentNode.insertBefore(obj, selectedWidget); + selectedWidget.parentNode.removeChild(selectedWidget); + } else { + xGetElementById('zonePageContent').appendChild(obj); + } + checkDocumentWrite = false; + selectedWidget = null; + + /* + //zoneObj.style.visibility = 'hidden'; + zoneObj.style.opacity = 0.2; + zoneObj.style.filter = "alpha(opacity=20)"; + + // 위젯 추가후 페이지 리로딩 + var tpl = getWidgetContent(); + + var fo_obj = xGetElementById('pageFo'); + fo_obj.content.value = tpl; + fo_obj.mid.value = current_mid; + fo_obj.submit(); + */ +} + +// 클릭 이벤트시 위젯의 수정/제거/이벤트 무효화 처리 +function doCheckWidget(e) { + var evt = new xEvent(e); if(!evt.target) return; + var obj = evt.target; + + selectedWidget = null; + + var pObj = obj.parentNode; + while(pObj) { + if(pObj.id == "pageSizeLayer") return; + pObj = pObj.parentNode; + } + + doHideWidgetSizeSetup(); + // 위젯 설정 + if(obj.className == 'widgetSetup') { + var p_obj = obj.parentNode.parentNode; + var widget = p_obj.getAttribute("widget"); + if(!widget) return; + selectedWidget = p_obj; + if(widget == 'widgetContent') popopen(request_uri+"?module=widget&act=dispWidgetAdminAddContent&module_srl="+zoneModuleSrl+"&document_srl="+p_obj.getAttribute("document_srl")+'&mid='+current_mid, "addContent"); + else popopen(request_uri+"?module=widget&act=dispWidgetGenerateCodeInPage&selected_widget="+widget+"&widgetstyle="+widgetstyle,'GenerateCodeInPage'); + return; + + // 위젯 스타일 + } else if(obj.className == 'widgetStyle') { + var p_obj = obj.parentNode.parentNode; + var widget = p_obj.getAttribute("widget"); + var widgetstyle = p_obj.getAttribute("widgetstyle"); + if(!widget) return; + selectedWidget = p_obj; + popopen(request_uri+"?module=widget&act=dispWidgetStyleGenerateCodeInPage&selected_widget="+widget+"&widgetstyle="+widgetstyle,'GenerateCodeInPage'); + return; + + // 위젯 복사 + } else if(obj.className == 'widgetCopy' && obj.parentNode.parentNode.className == 'widgetOutput') { + p_obj = obj.parentNode.parentNode; + restoreWidgetButtons(); + + if(p_obj.getAttribute('widget')=='widgetContent' && p_obj.getAttribute('document_srl') ) { + var response_tags = new Array('error','message','document_srl'); + var params = new Array(); + params['document_srl'] =p_obj.getAttribute('document_srl'); + exec_xml('widget','procWidgetCopyDocument', params, completeCopyWidgetContent, response_tags, params, p_obj); + return; + } else { + var dummy = xCreateElement("DIV"); + xInnerHtml(dummy,xInnerHtml(p_obj)); + + dummy.widget_sequence = ''; + dummy.className = "widgetOutput"; + for(var i=0;i 0) return; + + doHideWidgetSizeSetup(); + + if(obj.className == 'widgetSetup' || obj.className == 'widgetStyle' || obj.className == 'widgetCopy' || obj.className == 'widgetBoxCopy' || obj.className == 'widgetSize' || obj.className == 'widgetBoxSize' || obj.className == 'widgetRemove' || obj.className == 'widgetBoxRemove') return; + + p_obj = obj; + while(p_obj) { + if(p_obj.className == 'widgetOutput' || p_obj.className == 'widgetResize' || p_obj.className == 'widgetResizeLeft' || p_obj.className == 'widgetBoxResize' || p_obj.className == 'widgetBoxResizeLeft') { + widgetDragEnable(p_obj, widgetDragStart, widgetDrag, widgetDragEnd); + widgetMouseDown(e); + return; + } + p_obj = p_obj.parentNode; + } +} + +function _getInt(val) { + if(!val || val == "null") return 0; + if(parseInt(val,10)==NaN) return 0; + return parseInt(val,10); +} + +// 위젯 크기 조절 레이어를 보여줌 +var selectedSizeWidget = null; +function doShowWidgetSizeSetup(px, py, obj) { + var layer = jQuery('#pageSizeLayer'); + var form = layer.find('>form:first'); + var obj = jQuery(obj); + + if (!form.length) return; + + selectedSizeWidget = obj[0]; + + var opts = { + widget_align : obj.css('float'), + + width : obj[0].style.width, + height : obj[0].style.height, + + padding_left : _getInt(obj.attr('widget_padding_left')), + padding_right : _getInt(obj.attr('widget_padding_right')), + padding_top : _getInt(obj.attr('widget_padding_top')), + padding_bottom : _getInt(obj.attr('widget_padding_bottom')), + + margin_left : _getInt(obj[0].style.marginLeft), + margin_right : _getInt(obj[0].style.marginRight), + margin_top : _getInt(obj[0].style.marginTop), + margin_bottom : _getInt(obj[0].style.marginBottom), + + border_top_color : transRGB2Hex(obj[0].style.borderTopColor), + border_top_thick : obj[0].style.borderTopWidth.replace(/px$/i, ''), + border_top_type : obj[0].style.borderTopStyle, + + border_bottom_color : transRGB2Hex(obj[0].style.borderBottomColor), + border_bottom_thick : obj[0].style.borderBottomWidth.replace(/px$/i, ''), + border_bottom_type : obj[0].style.borderBottomStyle, + + border_right_color : transRGB2Hex(obj[0].style.borderRightColor), + border_right_thick : obj[0].style.borderRightWidth.replace(/px$/i, ''), + border_right_type : obj[0].style.borderRightStyle, + + border_left_color : transRGB2Hex(obj[0].style.borderLeftColor), + border_left_thick : obj[0].style.borderLeftWidth.replace(/px$/i, ''), + border_left_type : obj[0].style.borderLeftStyle, + + background_color : transRGB2Hex(obj[0].style.backgroundColor), + background_image_url : obj[0].style.backgroundImage.replace(/^url\(/i,'').replace(/\)$/i,''), + + background_x : 0, + background_y : 0, + + background_repeat : obj[0].style.backgroundRepeat + }; + + // background position + var pos = obj[0].style.backgroundPosition; + if(pos) { + pos = pos.split(' '); + if(pos.length == 2) { + opts.background_x = pos[0]; + opts.background_y = pos[1]; + } + } + + layer.css('top', py+'px').show(); + var _zonePageObj = jQuery(zonePageObj) + var zoneOffsetLeft = _zonePageObj.offset().left; + var zoneWidth = _zonePageObj.width(); + if (px + layer.width() > zoneOffsetLeft + zoneWidth) px = zoneOffsetLeft + zoneWidth - layer.width() - 5; + layer.css('left', px+'px'); + + jQuery.each(opts, function(key, val){ + var el = form[0].elements[key]; + if (el) el.value = val; + if (el.tagName.toLowerCase() == "select") + { + if(el.selectedIndex == -1) { + el.selectedIndex = 0; + } + } + }); + + try { form[0].elements[0].focus() } catch(e) {}; +} + +function doHideWidgetSizeSetup() { + jQuery('#pageSizeLayer').hide(); + //var layer = xGetElementById("pageSizeLayer"); + //layer.style.visibility = "hidden"; + //layer.style.display = "none"; +} + +function _getSize(value) { + if(!value) return 0; + var type = "px"; + if(value.lastIndexOf("%")>=0) type = "%"; + var num = parseInt(value,10); + if(num<1) return 0; + if(type == "%" && num > 100) num = 100; + return ""+num+type; +} + +function _getBorderStyle(fld_color, fld_thick, fld_type) { + var color = fld_color.value; + color = color.replace(/^#/,''); + if(!color) color = '#FFFFFF'; + else color = '#'+color; + var width = fld_thick.value; + if(!width) width = '0px'; + else width = parseInt(width,10)+'px'; + var style = fld_type.options[fld_type.selectedIndex].value; + if(!style) style = 'solid'; + + var str = color+' '+width+' '+style; + return str; +} + +function _getBGColorStyle(fld_color) { + var color = fld_color.replace(/^#/,''); + if(!color) color = '#FFFFFF'; + else color = '#'+color; + return color; +} + +function doApplyWidgetSize(fo_obj) { + if(selectedSizeWidget) { + if(fo_obj.widget_align.selectedIndex == 1) setFloat(selectedSizeWidget, 'right'); + else setFloat(selectedSizeWidget, 'left'); + + var width = _getSize(fo_obj.width.value); + if(width) selectedSizeWidget.style.width = width; + + var height = _getSize(fo_obj.height.value); + if(height && height != "100%") selectedSizeWidget.style.height = height; + else { + selectedSizeWidget.style.height = ''; + var widgetBorder = xGetElementsByClassName('widgetBorder',selectedSizeWidget); + for(var i=0;i 0) return; + if(jQuery(obj).is('.buttonBox') || jQuery(obj).parents('.buttonBox').size() > 0) return; + + + var o = jQuery(obj).parents('.widgetOutput'); + if(o.size() == 0){ + restoreWidgetButtons(); + return; + } + /* + if(!obj || typeof(obj.className)=='undefined' || obj.className != 'widgetOutput') { + restoreWidgetButtons(); + return; + } +*/ + + obj = o.get(0); + var widget = o.attr('widget'); + if(!widget) return; + + if(widget == 'widgetBox') { + restoreWidgetButtons(); + showWidgetButton('widgetBoxButton', obj); + } else { + restoreWidgetButtons(); + showWidgetButton('widgetButton', obj); + + var p_obj = obj.parentNode; + if(p_obj) { + while(p_obj) { + if(p_obj.nodeName == 'DIV' && p_obj.getAttribute('widget')=='widgetBox') { + showWidgetButton('widgetBoxButton', p_obj); + break; + } + p_obj = p_obj.parentNode; + } + } + } +} + +/* 위젯 드래그 */ +// 드래그 중이라는 상황을 간직할 변수 +var widgetDragManager = {obj:null, isDrag:false} +var widgetTmpObject = new Array(); +var widgetDisappear = 0; + +function widgetCreateTmpObject(obj) { + var id = obj.getAttribute('id'); + + tmpObj = xCreateElement('DIV'); + tmpObj.id = id + '_tmp'; + tmpObj.className = obj.className; + tmpObj.style.overflow = 'hidden'; + tmpObj.style.margin= '0px'; + tmpObj.style.padding = '0px'; + tmpObj.style.width = obj.style.width; + + tmpObj.style.display = 'none'; + tmpObj.style.position = 'absolute'; + tmpObj.style.opacity = 1; + tmpObj.style.filter = 'alpha(opacity=100)'; + + xLeft(tmpObj, xPageX(obj)); + xTop(tmpObj, xPageY(obj)); + + document.body.appendChild(tmpObj); + widgetTmpObject[obj.id] = tmpObj; + return tmpObj; +} + +// 기생성된 임시 object를 찾아서 return, 없으면 만들어서 return +var idStep = 0; +function widgetGetTmpObject(obj) { + if(!obj.id) obj.id = 'widget_'+idStep++; + var tmpObj = widgetTmpObject[obj.id]; + if(!tmpObj) tmpObj = widgetCreateTmpObject(obj); + return tmpObj; +} + +// 메뉴에 마우스 클릭이 일어난 시점에 드래그를 위한 제일 첫 동작 (해당 object에 각종 함수나 상태변수 설정) +function widgetDragEnable(obj, funcDragStart, funcDrag, funcDragEnd) { + + // 상위 object에 드래그 가능하다는 상태와 각 드래그 관련 함수를 설정 + obj.draggable = true; + obj.dragStart = funcDragStart; + obj.drag = funcDrag; + obj.dragEnd = funcDragEnd; + + // 드래그 가능하지 않다면 드래그 가능하도록 상태 지정하고 mousemove이벤트 등록 + if (!widgetDragManager.isDrag) { + widgetDragManager.isDrag = true; + xAddEventListener(document, 'mousemove', widgetDragMouseMove, false); + } +} + +// 드래그를 시작할때 호출되는 함수 (이동되는 형태를 보여주기 위한 작업을 함) +function widgetDragStart(tobj, px, py) { + if(tobj.className == 'widgetResize' || tobj.className == 'widgetResizeLeft' || tobj.className == 'widgetBoxResize' || tobj.className == 'widgetBoxResizeLeft') return; + var obj = widgetGetTmpObject(tobj); + + xInnerHtml(obj, xInnerHtml(tobj)); + + xLeft(obj, xPageX(tobj)); + xTop(obj, xPageY(tobj)); + xWidth(obj, xWidth(tobj)); + xHeight(obj, xHeight(tobj)); + + xDisplay(obj, 'block'); +} + +// 드래그 시작후 마우스를 이동할때 발생되는 이벤트에 의해 실행되는 함수 +function widgetDrag(tobj, dx, dy) { + var minWidth = 40; + var minHeight = 10; + + var sx = xPageX(tobj.parentNode); + var sy = xPageY(tobj.parentNode); + + var nx = tobj.xDPX; + var ny = tobj.xDPY; + + var zoneWidth = xWidth(zonePageObj); + var zoneLeft = xPageX(zonePageObj); + var zoneRight = zoneLeft + zoneWidth; + + var pWidth = xWidth(tobj.parentNode); + + var cssFloat = getFloat(tobj.parentNode); + if(!cssFloat) cssFloat = 'left'; + + // 위젯 리사이즈 (우측) + if(tobj.className == 'widgetResize' || tobj.className == 'widgetBoxResize') { + if(nx < sx+minWidth) nx = sx+minWidth; + if(nx > zoneRight) nx = zoneRight; + + if(cssFloat == 'right') nx = sx + pWidth; + + var new_width = nx - sx; + if(new_width < minWidth) new_width = minWidth; + + var new_height = ny - sy; + if(new_height < minHeight) new_height = minHeight; + + if( zoneRight < sx+new_width) new_width = zoneRight - sx; + + // 위젯의 크기 조절 + xWidth(tobj.nextSibling.nextSibling, new_width); + xHeight(tobj.nextSibling.nextSibling, new_height); + + xWidth(tobj.parentNode, new_width); + xHeight(tobj.parentNode, new_height); + + // 위젯 리사이즈 (좌측) + } else if(tobj.className == 'widgetResizeLeft' || tobj.className == 'widgetBoxResizeLeft') { + + if(nx < zoneLeft) nx = zoneLeft; + + if(cssFloat == 'left') nx = sx; + + var new_width = pWidth + (sx - nx); + if(new_width < minWidth) new_width = minWidth; + + var new_height = ny - sy; + if(new_height < minHeight) new_height = minHeight; + + // 위젯의 크기 조절 + xWidth(tobj.nextSibling, new_width); + xHeight(tobj.nextSibling, new_height); + + xWidth(tobj.parentNode, new_width); + xHeight(tobj.parentNode, new_height); + + // 위젯 드래그 + } else { + var obj = widgetGetTmpObject(tobj); + + xLeft(obj, parseInt(xPageX(obj),10) + parseInt(dx,10)); + xTop(obj, parseInt(xPageY(obj),10) + parseInt(dy,10)); + + // 박스 안에 있을 경우에는 박스내의 위젯하고 자리를 바꾸고 그 외의 경우에는 박스를 빠져 나간다 + if(tobj.parentNode != zonePageObj) { + // 박스내에 있는 위젯들을 구함 + var widgetList = xGetElementsByClassName("widgetOutput",tobj.parentNode); + + for(var i=0;i= l && tobj.xDPX <= ll && tobj.xDPY >= t && tobj.xDPY <= tt && tobj.parentNode == target_obj.parentNode) { + var next1 = target_obj.nextSibling; + if(!next1) { + next1 = xCreateElement("DIV"); + target_obj.parentNode.appendChild(next1); + } + var next2 = tobj.nextSibling; + if(!next2) { + next2 = xCreateElement("DIV"); + tobj.parentNode.appendChild(next2); + } + + if(next1) next1.parentNode.insertBefore(tobj, next1); + if(next2) next2.parentNode.insertBefore(target_obj, next2); + doFitBorderSize(); + widgetList = null; + return; + } + } + widgetList = null; + + // 만약 다른 위젯과 자리를 바꾸지 못하였는데 자기 부모창밖에 있는게 확인이 되면 박스 밖으로 내보낸다. + var p_tobj = jQuery(tobj).parents('div.nullWidget').get(0); + var l = xPageX(p_tobj); + var t = xPageY(p_tobj); + var ll = parseInt(l,10) + parseInt(xWidth(p_tobj),10); + var tt = parseInt(t,10) + parseInt(xHeight(p_tobj),10); + if( (tobj.xDPX < l || tobj.xDPX > ll) || (tobj.xDPY < t || tobj.xDPY > tt) ) { + +// zonePageObj.insertBefore(tobj, tobj.parentNode.parentNode.parentNode); + zonePageObj.insertBefore(tobj, jQuery(tobj).parents('div.widgetOutput[widget=widgetBox]').get(0)); + + doFitBorderSize(); + return; + } + + // 박스 밖에 있을 경우에는 다른 위젯과 자리를 바꾸거나 박스내에 들어가도록 한다 + } else { + // 이동하려는 위젯이 박스 위젯이 아니라면 박스 위젯들을 구해서 입력 유무를 검사한다 + if(tobj.getAttribute("widget")!="widgetBox") { + + var boxList = xGetElementsByClassName("nullWidget", zonePageObj); + for(var i=0;i= l && tobj.xDPX <= ll && tobj.xDPY >= t && tobj.xDPY <= tt) { + + //박스 위젯이다 + if(target_obj.className == "nullWidget") { + + var wb_ws = jQuery('div.widget_inner',jQuery(target_obj)); + + //박스 위젯에 위젯스타일이 적용 안된경우 + if(wb_ws.size() == 0){ + target_obj.appendChild(tobj); + + //박스 위젯에 위젯스타일이 적용된경우 또는 박스안에 위젯이 위젯스타일이 적용된겅우 + }else{ + wb_ws.get(0).appendChild(tobj); + } + + // 이동을 멈춤 + widgetManualEnd(); + + doFitBorderSize(); + boxList = null; + return; + } + } + } + boxList = null; + } + + // 다른 위젯들을 구해서 자리를 바꿈 + var widgetList = xGetElementsByClassName("widgetOutput",zonePageObj); + for(var i=0;i= l && tobj.xDPX <= ll && tobj.xDPY >= t && tobj.xDPY <= tt && tobj.parentNode == target_obj.parentNode) { + var next1 = target_obj.nextSibling; + if(!next1) next1 = target_obj.parentNode.lastChild; + if(!next1) { + next1 = xCreateElement("DIV"); + target_obj.parentNode.appendChild(next1); + } + var next2 = tobj.nextSibling; + if(!next2) { + next2 = xCreateElement("DIV"); + tobj.parentNode.appendChild(next2); + } + + if(next1) next1.parentNode.insertBefore(tobj, next1); + if(next2) next2.parentNode.insertBefore(target_obj, next2); + doFitBorderSize(); + widgetList = null; + return; + } + } + widgetList = null; + } + } +} + +// 드래그 종료 (이동되는 object가 이동할 곳에 서서히 이동되는 것처럼 보이는 효과) +function widgetDragEnd(tobj, px, py) { + var obj = widgetGetTmpObject(tobj); + widgetDisapear = widgetDisapearObject(obj, tobj); + widgetDragDisable(tobj.getAttribute('id')); +} + +// 스르르 사라지게 함 (일단 사라지게 하는 기능을 제거.. 속도 문제) +function widgetDisapearObject(obj, tobj) { + xInnerHtml(tobj,xInnerHtml(obj)); + xInnerHtml(obj,''); + xDisplay(obj, 'none'); + obj.parentNode.removeChild(obj); + widgetTmpObject[tobj.id] = null; + return; + + /* + var it = 5; + var ib = 1; + + var x = parseInt(xPageX(obj),10); + var y = parseInt(xPageY(obj),10); + var ldt = (x - parseInt(xPageX(tobj),10)) / ib; + var tdt = (y - parseInt(xPageY(tobj),10)) / ib; + + return setInterval(function() { + if(ib < 1) { + clearInterval(widgetDisapear); + xInnerHtml(tobj,xInnerHtml(obj)); + xInnerHtml(obj,''); + xDisplay(obj, 'none'); + obj.parentNode.removeChild(obj); + widgetTmpObject[tobj.id] = null; + return; + } + ib -= 5; + x-=ldt; + y-=tdt; + xLeft(obj, x); + xTop(obj, y); + }, it/ib); + */ +} + +// 마우스다운 이벤트 발생시 호출됨 +function widgetMouseDown(e) { + var evt = new xEvent(e); + var obj = evt.target; + + while(obj && !obj.draggable) { + obj = xParent(obj, true); + } + if(obj) { + xPreventDefault(e); + obj.xDPX = evt.pageX; + obj.xDPY = evt.pageY; + widgetDragManager.obj = obj; + xAddEventListener(document, 'mouseup', widgetMouseUp, false); + if (obj.dragStart) obj.dragStart(obj, evt.pageX, evt.pageY); + } +} + +// 마우스 버튼을 놓았을때 동작될 함수 (각종 이벤트 해제 및 변수 설정 초기화) +function widgetMouseUp(e) { + if (widgetDragManager.obj) { + xPreventDefault(e); + xRemoveEventListener(document, 'mouseup', widgetMouseUp, false); + + if (widgetDragManager.obj.dragEnd) { + var evt = new xEvent(e); + widgetDragManager.obj.dragEnd(widgetDragManager.obj, evt.pageX, evt.pageY); + } + + widgetDragManager.obj = null; + widgetDragManager.isDrag = false; + } +} + +// 드래그할때의 object이동등을 담당 +function widgetDragMouseMove(e) { + var evt = new xEvent(e); + if(widgetDragManager.obj) { + xPreventDefault(e); + + var obj = widgetDragManager.obj; + var dx = evt.pageX - obj.xDPX; + var dy = evt.pageY - obj.xDPY; + + obj.xDPX = evt.pageX; + obj.xDPY = evt.pageY; + + if (obj.drag) { + obj.drag(obj, dx, dy); + } else { + xMoveTo(obj, xLeft(obj) + dx, xTop(obj) + dy); + } + } +} + +// 해당 object 에 더 이상 drag가 되지 않도록 설정 +function widgetDragDisable(id) { + if (!widgetDragManager) return; + var obj = xGetElementById(id); + obj.draggable = false; + obj.dragStart = null; + obj.drag = null; + obj.dragEnd = null; + //obj.style.backgroundColor = obj.getAttribute('source_color'); + + xRemoveEventListener(obj, 'mousedown', widgetMouseDown, false); + + return; +} + +// 강제로 드래그를 종료시킴 +function widgetManualEnd() { + var tobj = widgetDragManager.obj; + if(!tobj) return; + + xRemoveEventListener(document, 'mouseup', widgetMouseUp, false); + xAddEventListener(document, 'mousemove', widgetDragMouseMove, false); + + var obj = widgetGetTmpObject(tobj); + widgetDisapear = widgetDisapearObject(obj, tobj); + widgetDragDisable(tobj.getAttribute('id')); + + widgetDragManager.obj = null; + widgetDragManager.isDrag = false; +} diff --git a/modules/widget/tpl/js/widget_admin.js b/modules/widget/tpl/js/widget_admin.js index 8c5e312ff..1b2720513 100644 --- a/modules/widget/tpl/js/widget_admin.js +++ b/modules/widget/tpl/js/widget_admin.js @@ -1,470 +1,470 @@ -/** - * @file modules/widget/js/widget_admin.js - * @author NHN (developers@xpressengine.com) - * @brief widget 모듈의 관리자용 javascript - **/ - -/* 생성된 코드를 textarea에 출력 */ -function completeGenerateCode(ret_obj) { - var widget_code = ret_obj["widget_code"]; - widget_code = widget_code.replace(/&/g, "&"); - widget_code = widget_code.replace(/\'/g, "'"); - var zone = xGetElementById("widget_code"); - zone.value = widget_code; -} - -/* 생성된 코드를 페이지 zone에 출력 */ -function completeGenerateCodeInPage(ret_obj,response_tags,params,fo_obj) { - var widget_code = ret_obj["widget_code"]; - if(!opener || !widget_code) { - window.close(); - return; - } - - opener.doAddWidgetCode(widget_code); - window.close(); -} - -/* 위젯 코드 생성시 스킨을 고르면 컬러셋의 정보를 표시 */ -function doDisplaySkinColorset(sel, colorset) { - var skin = sel.options[sel.selectedIndex].value; - if(!skin) { - xGetElementById("colorset_area").style.display = "none"; - setFixedPopupSize(); - return; - } - - var params = new Array(); - params["selected_widget"] = xGetElementById("fo_widget").selected_widget.value; - params["skin"] = skin; - params["colorset"] = colorset; - - var response_tags = new Array("error","message","colorset_list"); - - exec_xml("widget", "procWidgetGetColorsetList", params, completeGetSkinColorset, response_tags, params); -} - -/* 서버에서 받아온 컬러셋을 표시 */ -function completeGetSkinColorset(ret_obj, response_tags, params, fo_obj) { - var sel = jQuery("#fo_widget")[0].widget_colorset; - var length = sel.options.length; - var selected_colorset = params["colorset"]; - for(var i=0;i
    {$lang->category_description}
    + + {$lang->cmd_find_langcode} +

    {$lang->about_category_description}

    +
    {$lang->expand}
    diff --git a/modules/document/tpl/filter/insert_category.xml b/modules/document/tpl/filter/insert_category.xml index 70f928a91..9b6ad4efb 100644 --- a/modules/document/tpl/filter/insert_category.xml +++ b/modules/document/tpl/filter/insert_category.xml @@ -9,6 +9,7 @@ + From 1f8dc8d65630f718da9afab37bfb951d2da2c84b Mon Sep 17 00:00:00 2001 From: mosmartin Date: Wed, 13 Apr 2011 14:22:39 +0000 Subject: [PATCH 0030/1372] #19690852 Created new class for the improved version of DBCubrid.class.php git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8306 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/db/DBCubrid3.class.php | 1254 ++++++++++++++++++++++++++++++++ 1 file changed, 1254 insertions(+) create mode 100644 classes/db/DBCubrid3.class.php diff --git a/classes/db/DBCubrid3.class.php b/classes/db/DBCubrid3.class.php new file mode 100644 index 000000000..eaa3b8d0f --- /dev/null +++ b/classes/db/DBCubrid3.class.php @@ -0,0 +1,1254 @@ + 'numeric(20)', + 'number' => 'integer', + 'varchar' => 'character varying', + 'char' => 'character', + 'tinytext' => 'character varying(256)', + 'text' => 'character varying(1073741823)', + 'bigtext' => 'character varying(1073741823)', + 'date' => 'character varying(14)', + 'float' => 'float', + ); + + /** + * @brief constructor + **/ + function DBCubrid3() + { + $this->_setDBInfo(); + $this->_connect(); + } + + /** + * @brief create an instance of this class + */ + function create() + { + return new DBCubrid3; + } + + /** + * @brief Return if installable + **/ + function isSupported() + { + if (!function_exists('cubrid_connect')) return false; + return true; + } + + /** + * @brief DB settings and connect/close + **/ + function _setDBInfo() + { + $db_info = Context::getDBInfo(); + $this->hostname = $db_info->db_hostname; + $this->userid = $db_info->db_userid; + $this->password = $db_info->db_password; + $this->database = $db_info->db_database; + $this->port = $db_info->db_port; + $this->prefix = $db_info->db_table_prefix; + + if (!substr($this->prefix, -1) != '_') $this->prefix .= '_'; + } + + /** + * @brief DB Connection + **/ + function _connect() + { + // ignore if db information not exists + if (!$this->hostname || !$this->userid || !$this->password || !$this->database || !$this->port) return; + + // attempts to connect + $this->fd = @cubrid_connect ($this->hostname, $this->port, $this->database, $this->userid, $this->password); + + // check connections + if (!$this->fd) { + $this->setError (-1, 'database connect fail'); + return $this->is_connected = false; + } + + $this->is_connected = true; + $this->password = md5 ($this->password); + } + + /** + * @brief DB disconnect + **/ + function close() + { + if (!$this->isConnected ()) return; + + @cubrid_commit ($this->fd); + @cubrid_disconnect ($this->fd); + $this->transaction_started = false; + } + + /** + * @brief handles quatation of the string variables from the query + **/ + function addQuotes($string) + { + if (!$this->fd) return $string; + + if (version_compare (PHP_VERSION, "5.9.0", "<") && + get_magic_quotes_gpc ()) { + $string = stripslashes (str_replace ("\\","\\\\", $string)); + } + + if (!is_numeric ($string)) { + /* + if ($this->isConnected()) { + $string = cubrid_real_escape_string($string); + } + else { + $string = str_replace("'","\'",$string); + } + */ + + $string = str_replace("'","''",$string); + } + + return $string; + } + + /** + * @brief Begin transaction + **/ + function begin() + { + if (!$this->isConnected () || $this->transaction_started) return; + $this->transaction_started = true; + } + + /** + * @brief Rollback + **/ + function rollback() + { + if (!$this->isConnected () || !$this->transaction_started) return; + @cubrid_rollback ($this->fd); + $this->transaction_started = false; + } + + /** + * @brief Commit + **/ + function commit() + { + if (!$force && (!$this->isConnected () || + !$this->transaction_started)) return; + + @cubrid_commit($this->fd); + $this->transaction_started = false; + } + + /** + * @brief : executing the query and fetching the result + * + * query: run a query and return the result\n + * fetch: NULL if no value returned \n + * array object if rows returned \n + * object if a row returned \n + * return\n + **/ + function _query($query) + { + if (!$query || !$this->isConnected ()) return; + + // Notify to start a query execution + $this->actStart ($query); + + // Execute the query + $result = @cubrid_execute ($this->fd, $query); + // error check + if (cubrid_error_code ()) { + $code = cubrid_error_code (); + $msg = cubrid_error_msg (); + + $this->setError ($code, $msg); + } + + // Notify to complete a query execution + $this->actFinish (); + + // Return the result + return $result; + } + + /** + * @brief Fetch the result + **/ + function _fetch($result) + { + if (!$this->isConnected() || $this->isError() || !$result) return; + + $col_types = cubrid_column_types ($result); + $col_names = cubrid_column_names ($result); + $max = count ($col_types); + + for ($count = 0; $count < $max; $count++) { + if (preg_match ("/^char/", $col_types[$count]) > 0) { + $char_type_fields[] = $col_names[$count]; + } + } + + while ($tmp = cubrid_fetch ($result, CUBRID_OBJECT)) { + if (is_array ($char_type_fields)) { + foreach ($char_type_fields as $val) { + $tmp->{$val} = rtrim ($tmp->{$val}); + } + } + + $output[] = $tmp; + } + + unset ($char_type_fields); + + if ($result) cubrid_close_request($result); + + if (count ($output) == 1) return $output[0]; + return $output; + } + + /** + * @brief return the sequence value incremented by 1(auto_increment column only used in the CUBRID sequence table) + **/ + function getNextSequence() + { + $this->_makeSequence(); + + $query = sprintf ("select \"%ssequence\".\"nextval\" as \"seq\" from db_root", $this->prefix); + $result = $this->_query($query); + $output = $this->_fetch($result); + + return $output->seq; + } + + /** + * @brief return if the table already exists + **/ + function _makeSequence() + { + if($_GLOBALS['XE_EXISTS_SEQUENCE']) return; + + // check cubrid serial + $query = sprintf('select count(*) as "count" from "db_serial" where name=\'%ssequence\'', $this->prefix); + $result = $this->_query($query); + $output = $this->_fetch($result); + + // if do not create serial + if ($output->count == 0) { + $query = sprintf('select max("a"."srl") as "srl" from '. + '( select max("document_srl") as "srl" from '. + '"%sdocuments" UNION '. + 'select max("comment_srl") as "srl" from '. + '"%scomments" UNION '. + 'select max("member_srl") as "srl" from '. + '"%smember"'. + ') as "a"', $this->prefix, $this->prefix, $this->prefix); + + $result = $this->_query($query); + $output = $this->_fetch($result); + $srl = $output->srl; + if ($srl < 1) { + $start = 1; + } + else { + $start = $srl + 1000000; + } + + // create sequence + $query = sprintf('create serial "%ssequence" start with %s increment by 1 minvalue 1 maxvalue 10000000000000000000000000000000000000 nocycle;', $this->prefix, $start); + $this->_query($query); + } + + $_GLOBALS['XE_EXISTS_SEQUENCE'] = true; + } + + + /** + * brief return a table if exists + **/ + function isTableExists ($target_name) + { + if($target_name == 'sequence') { + $query = sprintf ("select \"name\" from \"db_serial\" where \"name\" = '%s%s'", $this->prefix, $target_name); + } + else { + $query = sprintf ("select \"class_name\" from \"db_class\" where \"class_name\" = '%s%s'", $this->prefix, $target_name); + } + + $result = $this->_query ($query); + if (cubrid_num_rows($result) > 0) { + $output = true; + } + else { + $output = false; + } + + if ($result) cubrid_close_request ($result); + + return $output; + } + + /** + * @brief add a column to the table + **/ + function addColumn($table_name, $column_name, $type = 'number', $size = '', $default = '', $notnull = false) + { + $type = strtoupper($this->column_type[$type]); + if ($type == 'INTEGER') $size = ''; + + $query = sprintf ("alter class \"%s%s\" add \"%s\" ", $this->prefix, $table_name, $column_name); + + if ($type == 'char' || $type == 'varchar') { + if ($size) $size = $size * 3; + } + + if ($size) { + $query .= sprintf ("%s(%s) ", $type, $size); + } + else { + $query .= sprintf ("%s ", $type); + } + + if ($default) { + if ($type == 'INTEGER' || $type == 'BIGINT' || $type=='INT') { + $query .= sprintf ("default %d ", $default); + } + else { + $query .= sprintf ("default '%s' ", $default); + } + } + + if ($notnull) $query .= "not null "; + + $this->_query ($query); + } + + /** + * @brief drop a column from the table + **/ + function dropColumn ($table_name, $column_name) + { + $query = sprintf ("alter class \"%s%s\" drop \"%s\" ", $this->prefix, $table_name, $column_name); + + $this->_query ($query); + } + + /** + * @brief return column information of the table + **/ + function isColumnExists ($table_name, $column_name) + { + $query = sprintf ("select \"attr_name\" from \"db_attribute\" where ". "\"attr_name\" ='%s' and \"class_name\" = '%s%s'", $column_name, $this->prefix, $table_name); + $result = $this->_query ($query); + + if (cubrid_num_rows ($result) > 0) $output = true; + else $output = false; + + if ($result) cubrid_close_request ($result); + + return $output; + } + + /** + * @brief add an index to the table + * $target_columns = array(col1, col2) + * $is_unique? unique : none + **/ + function addIndex ($table_name, $index_name, $target_columns, $is_unique = false) + { + if (!is_array ($target_columns)) { + $target_columns = array ($target_columns); + } + + $query = sprintf ("create %s index \"%s\" on \"%s%s\" (%s);", $is_unique?'unique':'', $this->prefix .$index_name, $this->prefix, $table_name, '"'.implode('","',$target_columns).'"'); + + $this->_query ($query); + } + + /** + * @brief drop an index from the table + **/ + function dropIndex ($table_name, $index_name, $is_unique = false) + { + $query = sprintf ("drop %s index \"%s\" on \"%s%s\"", $is_unique?'unique':'', $this->prefix .$index_name, $this->prefix, $table_name); + + $this->_query($query); + } + + /** + * @brief return index information of the table + **/ + function isIndexExists ($table_name, $index_name) + { + $query = sprintf ("select \"index_name\" from \"db_index\" where ". "\"class_name\" = '%s%s' and \"index_name\" = '%s' ", $this->prefix, $table_name, $this->prefix .$index_name); + $result = $this->_query ($query); + + if ($this->isError ()) return false; + + $output = $this->_fetch ($result); + + if (!$output) return false; + return true; + } + + /** + * @brief creates a table by using xml file + **/ + function createTableByXml ($xml_doc) + { + return $this->_createTable ($xml_doc); + } + + /** + * @brief creates a table by using xml file + **/ + function createTableByXmlFile ($file_name) + { + if (!file_exists ($file_name)) return; + // read xml file + $buff = FileHandler::readFile ($file_name); + + return $this->_createTable ($buff); + } + + /** + * @brief create table by using the schema xml + * + * type : number, varchar, tinytext, text, bigtext, char, date, \n + * opt : notnull, default, size\n + * index : primary key, index, unique\n + **/ + function _createTable ($xml_doc) + { + // xml parsing + $oXml = new XmlParser(); + $xml_obj = $oXml->parse($xml_doc); + // Create a table schema + $table_name = $xml_obj->table->attrs->name; + + // if the table already exists exit function + if ($this->isTableExists($table_name)) return; + + // If the table name is sequence, it creates a serial + if ($table_name == 'sequence') { + $query = sprintf ('create serial "%s" start with 1 increment by 1'. + ' minvalue 1 '. + 'maxvalue 10000000000000000000000000000000000000'. ' nocycle;', $this->prefix.$table_name); + + return $this->_query($query); + } + + + $table_name = $this->prefix.$table_name; + + $query = sprintf ('create class "%s";', $table_name); + $this->_query ($query); + + if (!is_array ($xml_obj->table->column)) { + $columns[] = $xml_obj->table->column; + } + else { + $columns = $xml_obj->table->column; + } + + $query = sprintf ("alter class \"%s\" add attribute ", $table_name); + + foreach ($columns as $column) { + $name = $column->attrs->name; + $type = $column->attrs->type; + $size = $column->attrs->size; + $notnull = $column->attrs->notnull; + $primary_key = $column->attrs->primary_key; + $index = $column->attrs->index; + $unique = $column->attrs->unique; + $default = $column->attrs->default; + + switch ($this->column_type[$type]) { + case 'integer' : + $size = null; + break; + case 'text' : + $size = null; + break; + } + + if (isset ($default) && ($type == 'varchar' || $type == 'char' || + $type == 'text' || $type == 'tinytext' || $type == 'bigtext')) { + $default = sprintf ("'%s'", $default); + } + + if ($type == 'varchar' || $type == 'char') { + if($size) $size = $size * 3; + } + + + $column_schema[] = sprintf ('"%s" %s%s %s %s', + $name, + $this->column_type[$type], + $size?'('.$size.')':'', + isset($default)?"default ".$default:'', + $notnull?'not null':''); + + if ($primary_key) { + $primary_list[] = $name; + } + else if ($unique) { + $unique_list[$unique][] = $name; + } + else if ($index) { + $index_list[$index][] = $name; + } + } + + $query .= implode (',', $column_schema).';'; + $this->_query ($query); + + if (count ($primary_list)) { + $query = sprintf ("alter class \"%s\" add attribute constraint ". "\"pkey_%s\" PRIMARY KEY(%s);", $table_name, $table_name, '"'.implode('","',$primary_list).'"'); + $this->_query ($query); + } + + if (count ($unique_list)) { + foreach ($unique_list as $key => $val) { + $query = sprintf ("create unique index \"%s\" on \"%s\" ". "(%s);", $this->prefix .$key, $table_name, '"'.implode('","', $val).'"'); + $this->_query ($query); + } + } + + if (count ($index_list)) { + foreach ($index_list as $key => $val) { + $query = sprintf ("create index \"%s\" on \"%s\" (%s);", $this->prefix .$key, $table_name, '"'.implode('","',$val).'"'); + $this->_query ($query); + } + } + } + + /** + * @brief return the condition + **/ + function getCondition ($output) + { + if (!$output->conditions) return; + $condition = $this->_getCondition ($output->conditions, $output->column_type, $output); + if ($condition) $condition = ' where '.$condition; + + return $condition; + } + + function _getCondition ($conditions, $column_type, &$output) + { + $condition = ''; + + foreach ($conditions as $val) { + $sub_condition = ''; + + foreach ($val['condition'] as $v) { + if (!isset ($v['value'])) continue; + if ($v['value'] === '') continue; + if(!in_array(gettype($v['value']), array('string', 'integer', 'double', 'array'))) continue; + + $name = $v['column']; + $operation = $v['operation']; + $value = $v['value']; + $type = $this->getColumnType ($column_type, $name); + $pipe = $v['pipe']; + $value = $this->getConditionValue ($name, $value, $operation, $type, $column_type); + + if (!$value) { + $value = $v['value']; + if (strpos ($value, '(')) { + $valuetmp = $value; + } + elseif (strpos ($value, ".") === false) { + $valuetmp = $value; + } + else { + $valuetmp = '"'.str_replace('.', '"."', $value).'"'; + } + } + else { + $tmp = explode('.',$value); + + if (count($tmp)==2) { + $table = $tmp[0]; + $column = $tmp[1]; + + if ($column_type[$column] && (in_array ($table, $output->tables) || + array_key_exists($table, $output->tables))) { + $valuetmp = sprintf('"%s"."%s"', $table, $column); + } + else { + $valuetmp = $value; + } + } + else { + $valuetmp = $value; + } + } + + if (strpos ($name, '(') > 0) { + $nametmp = $name; + } + elseif (strpos ($name, ".") === false) { + $nametmp = '"'.$name.'"'; + } + else { + $nametmp = '"'.str_replace('.', '"."', $name).'"'; + } + $str = $this->getConditionPart ($nametmp, $valuetmp, $operation); + if ($sub_condition) $sub_condition .= ' '.$pipe.' '; + $sub_condition .= $str; + } + + if ($sub_condition) { + if ($condition && $val['pipe']) { + $condition .= ' '.$val['pipe'].' '; + } + $condition .= '('.$sub_condition.')'; + } + } + + return $condition; + } + + /** + * @brief handles insertAct + **/ + function _executeInsertAct ($output) + { + // tables + foreach ($output->tables as $val) { + $table_list[] = '"'.$this->prefix.$val.'"'; + } + + // columns + foreach ($output->columns as $key => $val) { + $name = $val['name']; + $value = $val['value']; + //if ($this->getColumnType ($output->column_type, $name) != 'number') + if ($output->column_type[$name] != 'number') { + if (!is_null($value)) { + $value = "'" . $this->addQuotes($value) ."'"; + } + else { + if ($val['notnull']=='notnull') { + $value = "''"; + } + else { + //$value = 'null'; + $value = "''"; + } + } + } + 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 .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; + $result = $this->_query ($query); + if ($result && !$this->transaction_started) { + @cubrid_commit ($this->fd); + } + + return $result; + } + + /** + * @brief handles updateAct + **/ + function _executeUpdateAct ($output) + { + // tables + foreach ($output->tables as $key => $val) { + $table_list[] = '"'.$this->prefix.$val.'" as "'.$key.'"'; + } + + $check_click_count = true; + + // columns + foreach ($output->columns as $key => $val) { + if (!isset ($val['value'])) continue; + $name = $val['name']; + $value = $val['value']; + + if (substr ($value, -2) != '+1' || $output->column_type[$name] != 'number') { + $check_click_count = false; + } + + for ($i = 0; $i < $key; $i++) { + // not allows to define the same property repeatedly in a single query in CUBRID + if ($output->columns[$i]['name'] == $name) break; + } + if ($i < $key) continue; // ignore the rest of properties if duplicated property found + + if (strpos ($name, '.') !== false && strpos ($value, '.') !== false) { + $column_list[] = $name.' = '.$value; + } + else { + if ($output->column_type[$name] != 'number') { + $check_column = false; + $value = "'".$this->addQuotes ($value)."'"; + } + elseif (!$value || is_numeric ($value)) { + $value = (int) $value; + } + + $column_list[] = sprintf ("\"%s\" = %s", $name, $value); + } + } + + // conditional clause + $condition = $this->getCondition ($output); + + $check_click_count_condition = false; + if ($check_click_count) { + foreach ($output->conditions as $val) { + if ($val['pipe'] == 'or') { + $check_click_count_condition = false; + break; + } + + foreach ($val['condition'] as $v) { + if ($v['operation'] == 'equal') { + $check_click_count_condition = true; + } + else { + if ($v['operation'] == 'in' && !strpos ($v['value'], ',')) { + $check_click_count_condition = true; + } + else { + $check_click_count_condition = false; + } + } + + if ($v['pipe'] == 'or') { + $check_click_count_condition = false; + break; + } + } + } + } + + if ($check_click_count&& $check_click_count_condition && count ($output->tables) == 1 && count ($output->conditions) > 0 && count ($output->groups) == 0 && count ($output->order) == 0) { + foreach ($output->columns as $v) { + $incr_columns[] = 'incr("'.$v['name'].'")'; + } + + $query = sprintf ('select %s from %s %s', join (',', $incr_columns), implode(',', $table_list), $condition); + } + else { + $query = sprintf ("update %s set %s %s", implode (',', $table_list), implode (',', $column_list), $condition); + } + + $result = $this->_query ($query); + if ($result && !$this->transaction_started) @cubrid_commit ($this->fd); + + return $result; + } + + /** + * @brief handles deleteAct + **/ + function _executeDeleteAct ($output) + { + // tables + foreach ($output->tables as $val) { + $table_list[] = '"'.$this->prefix.$val.'"'; + } + + // Conditional clauses + $condition = $this->getCondition ($output); + + $query = sprintf ("delete from %s %s", implode (',',$table_list), $condition); + $result = $this->_query ($query); + if ($result && !$this->transaction_started) @cubrid_commit ($this->fd); + + return $result; + } + + /** + * @brief Handle selectAct + * + * to get a specific page list easily in select statement,\n + * a method, navigation, is used + **/ + function _executeSelectAct ($output) + { + // tables + $table_list = array (); + foreach ($output->tables as $key => $val) { + $table_list[] = '"'.$this->prefix.$val.'" as "'.$key.'"'; + } + $left_join = array (); + // why??? + $left_tables = (array) $output->left_tables; + + foreach ($left_tables as $key => $val) { + $condition = $this->_getCondition ($output->left_conditions[$key], $output->column_type, $output); + if ($condition) { + $left_join[] = $val.' "'.$this->prefix.$output->_tables[$key]. '" "'.$key.'" on ('.$condition.')'; + } + } + + $click_count = array(); + if(!$output->columns){ + $output->columns = array(array('name'=>'*')); + } + + $column_list = array (); + foreach ($output->columns as $key => $val) { + $name = $val['name']; + + $click_count = '%s'; + if ($val['click_count'] && count ($output->conditions) > 0) { + $click_count = 'incr(%s)'; + } + + $alias = $val['alias'] ? sprintf ('"%s"', $val['alias']) : null; + $_alias = $val['alias']; + + if ($name == '*') { + $column_list[] = $name; + } + elseif (strpos ($name, '.') === false && strpos ($name, '(') === false) { + $name = sprintf ($click_count,$name); + if ($alias) { + $column_list[$alias] = sprintf('"%s" as %s', $name, $alias); + } + else { + $column_list[] = sprintf ('"%s"', $name); + } + } + else { + if (strpos ($name, '.') != false) { + list ($prefix, $name) = explode('.', $name); + if (($now_matchs = preg_match_all ("/\(/", $prefix, $xtmp)) > 0) { + if ($now_matchs == 1) { + $tmpval = explode ("(", $prefix); + $tmpval[1] = sprintf ('"%s"', $tmpval[1]); + $prefix = implode ("(", $tmpval); + $tmpval = explode (")", $name); + $tmpval[0] = sprintf ('"%s"', $tmpval[0]); + $name = implode (")", $tmpval); + } + } + else { + $prefix = sprintf ('"%s"', $prefix); + $name = ($name == '*') ? $name : sprintf('"%s"',$name); + } + $xtmp = null; + $now_matchs = null; + if($alias) $column_list[$_alias] = sprintf ($click_count, sprintf ('%s.%s', $prefix, $name)) . ($alias ? sprintf (' as %s',$alias) : ''); + else $column_list[] = sprintf ($click_count, sprintf ('%s.%s', $prefix, $name)); + } + elseif (($now_matchs = preg_match_all ("/\(/", $name, $xtmp)) > 0) { + if ($now_matchs == 1 && preg_match ("/[a-zA-Z0-9]*\(\*\)/", $name) < 1) { + $open_pos = strpos ($name, "("); + $close_pos = strpos ($name, ")"); + + if (preg_match ("/,/", $name)) { + $tmp_func_name = sprintf ('%s', substr ($name, 0, $open_pos)); + $tmp_params = sprintf ('%s', substr ($name, $open_pos + 1, $close_pos - $open_pos - 1)); + $tmpval = null; + $tmpval = explode (',', $tmp_params); + + foreach ($tmpval as $tmp_param) { + $tmp_param_list[] = (!is_numeric ($tmp_param)) ? sprintf ('"%s"', $tmp_param) : $tmp_param; + } + + $tmpval = implode (',', $tmp_param_list); + $name = sprintf ('%s(%s)', $tmp_func_name, $tmpval); + } + else { + $name = sprintf ('%s("%s")', substr ($name, 0, $open_pos), substr ($name, $open_pos + 1, $close_pos - $open_pos - 1)); + } + } + + if($alias) $column_list[$_alias] = sprintf ($click_count, $name). ($alias ? sprintf (' as %s', $alias) : ''); + else $column_list[] = sprintf ($click_count, $name); + } + else { + if($alias) $column_list[$_alias] = sprintf($click_count, $name). ($alias ? sprintf(' as %s',$alias) : ''); + else $column_list[] = sprintf($click_count, $name); + } + } + $columns = implode (',', $column_list); + } + + $condition = $this->getCondition ($output); + + $output->column_list = $column_list; + if ($output->list_count && $output->page) { + return ($this->_getNavigationData($table_list, $columns, $left_join, $condition, $output)); + } + + if ($output->order) { + $conditions = $this->getConditionList($output); + //if(in_array('list_order', $conditions) || in_array('update_order', $conditions)) { + foreach($output->order as $key => $val) { + $col = $val[0]; + if(!in_array($col, array('list_order','update_order'))) continue; + if ($condition) $condition .= sprintf(' and %s < 2100000000 ', $col); + else $condition = sprintf(' where %s < 2100000000 ', $col); + } + //} + } + + + if (count ($output->groups)) { + foreach ($output->groups as $key => $value) { + if (strpos ($value, '.')) { + $tmp = explode ('.', $value); + $tmp[0] = sprintf ('"%s"', $tmp[0]); + $tmp[1] = sprintf ('"%s"', $tmp[1]); + $value = implode ('.', $tmp); + } + elseif (strpos ($value, '(')) { + $value = $value; + } + else { + $value = sprintf ('"%s"', $value); + } + $output->groups[$key] = $value; + + + if(count($output->arg_columns)) + { + if($column_list[$value]) $output->arg_columns[] = $column_list[$value]; + } + } + $groupby_query = sprintf ('group by %s', implode(',', $output->groups)); + } + + + // apply when using list_count + if ($output->list_count['value']) { + $start_count = 0; + $list_count = $output->list_count['value']; + + if ($output->order) { + foreach ($output->order as $val) { + if (strpos ($val[0], '.')) { + $tmpval = explode ('.', $val[0]); + $tmpval[0] = sprintf ('"%s"', $tmpval[0]); + $tmpval[1] = sprintf ('"%s"', $tmpval[1]); + $val[0] = implode ('.', $tmpval); + } + elseif (strpos ($val[0], '(')) $val[0] = $val[0]; + elseif ($val[0] == 'count') $val[0] = 'count (*)'; + else $val[0] = sprintf ('"%s"', $val[0]); + $index_list[] = sprintf('%s %s', $val[0], $val[1]); + } + if (count($index_list)) + $orderby_query = ' order by '.implode(',', $index_list); + $orderby_query = sprintf ('%s for orderby_num() between %d and %d', $orderby_query, $start_count + 1, $list_count + $start_count); + } + else { + if (count ($output->groups)) { + $orderby_query = sprintf ('%s having groupby_num() between %d'. ' and %d', $orderby_query, $start_count + 1, $list_count + $start_count); + } + else { + if ($condition) { + $orderby_query = sprintf ('%s and inst_num() between %d'. ' and %d', $orderby_query, $start_count + 1, $list_count + $start_count); + } + else { + $orderby_query = sprintf ('%s where inst_num() between %d'. ' and %d', $orderby_query, $start_count + 1, $list_count + $start_count); + } + } + } + } + else { + if ($output->order) { + foreach ($output->order as $val) { + if (strpos ($val[0], '.')) { + $tmpval = explode ('.', $val[0]); + $tmpval[0] = sprintf ('"%s"', $tmpval[0]); + $tmpval[1] = sprintf ('"%s"', $tmpval[1]); + $val[0] = implode ('.', $tmpval); + } + elseif (strpos ($val[0], '(')) $val[0] = $val[0]; + elseif ($val[0] == 'count') $val[0] = 'count (*)'; + else $val[0] = sprintf ('"%s"', $val[0]); + $index_list[] = sprintf('%s %s', $val[0], $val[1]); + + if(count($output->arg_columns) && $column_list[$val]) $output->arg_columns[] = $column_list[$key]; + } + + if (count ($index_list)) { + $orderby_query = ' order by '.implode(',', $index_list); + } + } + } + + + if(count($output->arg_columns)) + { + $columns = array(); + foreach($output->arg_columns as $col){ + if(strpos($col,'"')===false && strpos($col,' ')===false) $columns[] = '"'.$col.'"'; + else $columns[] = $col; + } + + $columns = join(',',$columns); + } + + $query = sprintf ("select %s from %s %s %s %s", $columns, implode (',',$table_list), implode (' ',$left_join), $condition, $groupby_query.$orderby_query); + $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; + $result = $this->_query ($query); + if ($this->isError ()) return; + $data = $this->_fetch ($result); + + $buff = new Object (); + $buff->data = $data; + + return $buff; + } + + /** + * @brief displays the current stack trace. Fetch the result + **/ + function backtrace () + { + $output = "
    \n"; + $output .= "Backtrace:
    \n"; + $backtrace = debug_backtrace (); + + foreach ($backtrace as $bt) { + $args = ''; + foreach ($bt['args'] as $a) { + if (!empty ($args)) { + $args .= ', '; + } + switch (gettype ($a)) { + case 'integer': + case 'double': + $args .= $a; + break; + case 'string': + $a = htmlspecialchars (substr ($a, 0, 64)). + ((strlen ($a) > 64) ? '...' : ''); + $args .= "\"$a\""; + break; + case 'array': + $args .= 'Array ('. count ($a).')'; + break; + case 'object': + $args .= 'Object ('.get_class ($a).')'; + break; + case 'resource': + $args .= 'Resource ('.strstr ($a, '#').')'; + break; + case 'boolean': + $args .= $a ? 'True' : 'False'; + break; + case 'NULL': + $args .= 'Null'; + break; + default: + $args .= 'Unknown'; + } + } + $output .= "
    \n"; + $output .= "file: ".$bt['line']." - ". $bt['file']."
    \n"; + $output .= "call: ".$bt['class']. $bt['type'].$bt['function'].$args."
    \n"; + } + $output .= "
    \n"; + return $output; + } + + /** + * @brief paginates when navigation info exists in the query xml + * + * it is convenient although its structure is not good .. -_-; + **/ + function _getNavigationData ($table_list, $columns, $left_join, $condition, $output) { + require_once (_XE_PATH_.'classes/page/PageHandler.class.php'); + + $column_list = $output->column_list; + + $count_condition = count($output->groups) ? sprintf('%s group by %s', $condition, implode(', ', $output->groups)) : $condition; + $count_query = sprintf('select count(*) as "count" from %s %s %s', implode(', ', $table_list), implode(' ', $left_join), $count_condition); + if (count($output->groups)) { + $count_query = sprintf('select count(*) as "count" from (%s) xet', $count_query); + } + + $count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; + $result = $this->_query($count_query); + $count_output = $this->_fetch($result); + $total_count = (int)$count_output->count; + + $list_count = $output->list_count['value']; + if (!$list_count) $list_count = 20; + $page_count = $output->page_count['value']; + if (!$page_count) $page_count = 10; + $page = $output->page['value']; + if (!$page) $page = 1; + + // total pages + if ($total_count) { + $total_page = (int) (($total_count - 1) / $list_count) + 1; + } + else { + $total_page = 1; + } + + // check the page variables + if ($page > $total_page) $page = $total_page; + $start_count = ($page - 1) * $list_count; + + if ($output->order) { + $conditions = $this->getConditionList($output); + //if(in_array('list_order', $conditions) || in_array('update_order', $conditions)) { + foreach ($output->order as $key => $val) { + $col = $val[0]; + if(!in_array($col, array('list_order','update_order'))) continue; + if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col); + else $condition = sprintf(' where %s < 2100000000 ', $col); + } + //} + } + + + if (count ($output->groups)) { + foreach ($output->groups as $key => $value) { + if (strpos ($value, '.')) { + $tmp = explode ('.', $value); + $tmp[0] = sprintf ('"%s"', $tmp[0]); + $tmp[1] = sprintf ('"%s"', $tmp[1]); + $value = implode ('.', $tmp); + } + elseif (strpos ($value, '(')) $value = $value; + else $value = sprintf ('"%s"', $value); + $output->groups[$key] = $value; + } + + $groupby_query = sprintf (' group by %s', implode (',', $output->groups)); + } + + if ($output->order) { + foreach ($output->order as $val) { + if (strpos ($val[0], '.')) { + $tmpval = explode ('.', $val[0]); + $tmpval[0] = sprintf ('"%s"', $tmpval[0]); + $tmpval[1] = sprintf ('"%s"', $tmpval[1]); + $val[0] = implode ('.', $tmpval); + } + elseif (strpos ($val[0], '(')) $val[0] = $val[0]; + elseif ($val[0] == 'count') $val[0] = 'count (*)'; + else $val[0] = sprintf ('"%s"', $val[0]); + $index_list[] = sprintf ('%s %s', $val[0], $val[1]); + } + + if (count ($index_list)) { + $orderby_query = ' order by '.implode(',', $index_list); + } + + $orderby_query = sprintf ('%s for orderby_num() between %d and %d', $orderby_query, $start_count + 1, $list_count + $start_count); + } + else { + if (count($output->groups)) { + $orderby_query = sprintf ('%s having groupby_num() between %d and %d', $orderby_query, $start_count + 1, $list_count + $start_count); + } + else { + if ($condition) { + $orderby_query = sprintf ('%s and inst_num() between %d and %d', $orderby_query, $start_count + 1, $list_count + $start_count); + } + else { + $orderby_query = sprintf('%s where inst_num() between %d and %d', $orderby_query, $start_count + 1, $list_count + $start_count); + } + } + } + + if(count($output->arg_columns)) + { + $columns = array(); + foreach($output->arg_columns as $col){ + if(strpos($col,'"')===false) $columns[] = '"'.$col.'"'; + else $columns[] = $col; + } + + $columns = join(',',$columns); + } + + $query = sprintf ("select %s from %s %s %s %s", $columns, implode (',',$table_list), implode (' ',$left_join), $condition, $groupby_query.$orderby_query); + $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; + $result = $this->_query ($query); + + if ($this->isError ()) { + $buff = new Object (); + $buff->total_count = 0; + $buff->total_page = 0; + $buff->page = 1; + $buff->data = array (); + + $buff->page_navigation = new PageHandler ($total_count, $total_page, $page, $page_count); + + return $buff; + } + + $virtual_no = $total_count - ($page - 1) * $list_count; + while ($tmp = cubrid_fetch ($result, CUBRID_OBJECT)) { + if ($tmp) { + foreach ($tmp as $k => $v) { + $tmp->{$k} = rtrim($v); + } + } + $data[$virtual_no--] = $tmp; + } + + $buff = new Object (); + $buff->total_count = $total_count; + $buff->total_page = $total_page; + $buff->page = $page; + $buff->data = $data; + + $buff->page_navigation = new PageHandler ($total_count, $total_page, $page, $page_count); + + return $buff; + } + } + +return new DBCubrid3; +?> From f6f393ae31b45c57473c549d1d73ad069ebbbe30 Mon Sep 17 00:00:00 2001 From: mosmartin Date: Wed, 13 Apr 2011 14:51:41 +0000 Subject: [PATCH 0031/1372] #19690852 Bug fix: CHAR and VARCHAR column size would never get updated (the comparison was between lowercase 'char' and 'varchar' and uppercase $type). git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8307 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/db/DBCubrid3.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/db/DBCubrid3.class.php b/classes/db/DBCubrid3.class.php index eaa3b8d0f..ff90afa82 100644 --- a/classes/db/DBCubrid3.class.php +++ b/classes/db/DBCubrid3.class.php @@ -334,7 +334,7 @@ $query = sprintf ("alter class \"%s%s\" add \"%s\" ", $this->prefix, $table_name, $column_name); - if ($type == 'char' || $type == 'varchar') { + if ($type == 'CHAR' || $type == 'VARCHAR') { if ($size) $size = $size * 3; } From 8d2f988ee64380ce631ed8f6a177f28b9cfe47cf Mon Sep 17 00:00:00 2001 From: mosmartin Date: Wed, 13 Apr 2011 15:10:52 +0000 Subject: [PATCH 0032/1372] #19690852 Refactoring: replaced gettype() with the appropriate is_* functions in PHP. It is not recommended to use gettype to test for a certain type - see PHP documentation. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8308 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/db/DBCubrid3.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/db/DBCubrid3.class.php b/classes/db/DBCubrid3.class.php index ff90afa82..0b5134f1e 100644 --- a/classes/db/DBCubrid3.class.php +++ b/classes/db/DBCubrid3.class.php @@ -581,7 +581,7 @@ foreach ($val['condition'] as $v) { if (!isset ($v['value'])) continue; if ($v['value'] === '') continue; - if(!in_array(gettype($v['value']), array('string', 'integer', 'double', 'array'))) continue; + if(!is_string($value) && !is_integer($value) && !is_float($value) && !is_array($value)) continue; $name = $v['column']; $operation = $v['operation']; From 23ddda10c61211d043a6a95ca969b5678e344207 Mon Sep 17 00:00:00 2001 From: mosmartin Date: Wed, 13 Apr 2011 15:32:52 +0000 Subject: [PATCH 0033/1372] #19690852 Refactoring: extracted the code for creating the "group by" and "order by" queries in separate functions. Replaced "inst_num", "orderby_num" and "groupby_num" with LIMIT. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8309 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/db/DBCubrid3.class.php | 294 +++++++++++++++------------------ 1 file changed, 133 insertions(+), 161 deletions(-) diff --git a/classes/db/DBCubrid3.class.php b/classes/db/DBCubrid3.class.php index 0b5134f1e..2c9c6c84a 100644 --- a/classes/db/DBCubrid3.class.php +++ b/classes/db/DBCubrid3.class.php @@ -923,105 +923,17 @@ if ($output->list_count && $output->page) { return ($this->_getNavigationData($table_list, $columns, $left_join, $condition, $output)); } + + $condition = $this->limitResultIfOrderByIsUsed($output->order, $condition); - if ($output->order) { - $conditions = $this->getConditionList($output); - //if(in_array('list_order', $conditions) || in_array('update_order', $conditions)) { - foreach($output->order as $key => $val) { - $col = $val[0]; - if(!in_array($col, array('list_order','update_order'))) continue; - if ($condition) $condition .= sprintf(' and %s < 2100000000 ', $col); - else $condition = sprintf(' where %s < 2100000000 ', $col); - } - //} - } - - - if (count ($output->groups)) { - foreach ($output->groups as $key => $value) { - if (strpos ($value, '.')) { - $tmp = explode ('.', $value); - $tmp[0] = sprintf ('"%s"', $tmp[0]); - $tmp[1] = sprintf ('"%s"', $tmp[1]); - $value = implode ('.', $tmp); - } - elseif (strpos ($value, '(')) { - $value = $value; - } - else { - $value = sprintf ('"%s"', $value); - } - $output->groups[$key] = $value; - - - if(count($output->arg_columns)) - { - if($column_list[$value]) $output->arg_columns[] = $column_list[$value]; - } - } - $groupby_query = sprintf ('group by %s', implode(',', $output->groups)); - } - - - // apply when using list_count - if ($output->list_count['value']) { - $start_count = 0; - $list_count = $output->list_count['value']; - - if ($output->order) { - foreach ($output->order as $val) { - if (strpos ($val[0], '.')) { - $tmpval = explode ('.', $val[0]); - $tmpval[0] = sprintf ('"%s"', $tmpval[0]); - $tmpval[1] = sprintf ('"%s"', $tmpval[1]); - $val[0] = implode ('.', $tmpval); - } - elseif (strpos ($val[0], '(')) $val[0] = $val[0]; - elseif ($val[0] == 'count') $val[0] = 'count (*)'; - else $val[0] = sprintf ('"%s"', $val[0]); - $index_list[] = sprintf('%s %s', $val[0], $val[1]); - } - if (count($index_list)) - $orderby_query = ' order by '.implode(',', $index_list); - $orderby_query = sprintf ('%s for orderby_num() between %d and %d', $orderby_query, $start_count + 1, $list_count + $start_count); - } - else { - if (count ($output->groups)) { - $orderby_query = sprintf ('%s having groupby_num() between %d'. ' and %d', $orderby_query, $start_count + 1, $list_count + $start_count); - } - else { - if ($condition) { - $orderby_query = sprintf ('%s and inst_num() between %d'. ' and %d', $orderby_query, $start_count + 1, $list_count + $start_count); - } - else { - $orderby_query = sprintf ('%s where inst_num() between %d'. ' and %d', $orderby_query, $start_count + 1, $list_count + $start_count); - } - } - } - } - else { - if ($output->order) { - foreach ($output->order as $val) { - if (strpos ($val[0], '.')) { - $tmpval = explode ('.', $val[0]); - $tmpval[0] = sprintf ('"%s"', $tmpval[0]); - $tmpval[1] = sprintf ('"%s"', $tmpval[1]); - $val[0] = implode ('.', $tmpval); - } - elseif (strpos ($val[0], '(')) $val[0] = $val[0]; - elseif ($val[0] == 'count') $val[0] = 'count (*)'; - else $val[0] = sprintf ('"%s"', $val[0]); - $index_list[] = sprintf('%s %s', $val[0], $val[1]); - - if(count($output->arg_columns) && $column_list[$val]) $output->arg_columns[] = $column_list[$key]; - } - - if (count ($index_list)) { - $orderby_query = ' order by '.implode(',', $index_list); - } - } - } - + // group by + $groupby_query = $this->getGroupByClause($output->groups); + + // order by + $orderby_query = $this->getOrderByClause($output->order); + + // limit + $limit_query = $this->getLimitClause(0, $output->list_count['value']); if(count($output->arg_columns)) { @@ -1034,7 +946,7 @@ $columns = join(',',$columns); } - $query = sprintf ("select %s from %s %s %s %s", $columns, implode (',',$table_list), implode (' ',$left_join), $condition, $groupby_query.$orderby_query); + $query = sprintf ("select %s from %s %s %s %s", $columns, implode (',',$table_list), implode (' ',$left_join), $condition, $groupby_query.$orderby_query.$limit_query); $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; $result = $this->_query ($query); if ($this->isError ()) return; @@ -1046,6 +958,118 @@ return $buff; } + /** + * @brief Retrieve text for limit clause + * + * Example: SELECT * FROM xe_modules LIMIT 20 + * + **/ + function getLimitClause($offset, $row_count){ + if(!$row_count) return ''; + if($offset === 0) + return sprintf(' limit %d', $row_count); + return sprintf(' limit %d, %d', $offset, $row_count); + } + + /** + * @brief Retrieve text for order by clause + * + * Example: SELECT * FROM xe_modules ORDER BY list_order, regdate + * + **/ + function getOrderByClause($order_list){ + if(!$order_list) return ''; + + foreach ($order_list as $val) { + // Parse column names + if (strpos ($val[0], '.')) { + $tmpval = explode ('.', $val[0]); + $tmpval[0] = sprintf ('"%s"', $tmpval[0]); + $tmpval[1] = sprintf ('"%s"', $tmpval[1]); + $val[0] = implode ('.', $tmpval); + } + elseif (strpos ($val[0], '(')) $val[0] = $val[0]; + elseif ($val[0] == 'count') $val[0] = 'count(*)'; + else $val[0] = sprintf ('"%s"', $val[0]); + + // Save name + $index_list[] = sprintf('%s %s', $val[0], $val[1]); + + // 1. This if never gets executed: column names are alias in $column_list but with real name in order clause + // 2. There is no need for the columns in the order by clause to also show up in the select statement + /* + if(count($output->arg_columns) && $column_list[$val[0]]) + $output->arg_columns[] = $column_list[$val[0]]; + */ + } + + if (count($index_list)) { + return ' order by '.implode(',', $index_list); + } + + return ''; + } + + /** + * @brief Retrieve text for group by clause + * + * Example: SELECT substr(regdate, 1, 8), count(*) FROM xe_modules GROUP BY substr(regdate, 1, 8) + * + **/ + function getGroupByClause($group_list){ + if(!$group_list) return ''; + if(!count($group_list)) return ''; + + foreach ($group_list as $key => $value) { + // If value is qualified table name + if (strpos ($value, '.')) { + $tmp = explode ('.', $value); + $tmp[0] = sprintf ('"%s"', $tmp[0]); + $tmp[1] = sprintf ('"%s"', $tmp[1]); + $value = implode ('.', $tmp); + } + // If value is an expression + elseif (strpos ($value, '(')) { + $value = $value; + } + else { + $value = sprintf ('"%s"', $value); + } + // Update + $group_list[$key] = $value; + + /* + * The same as with order by - columns in "group by" do not need to be in the select clause + if(count($output->arg_columns)) + { + if($column_list[$value]) $output->arg_columns[] = $column_list[$value]; + } + */ + } + return sprintf ('group by %s', implode(',', $group_list)); + } + + /** + * @brief Adds a where clause that retrieves only a subset of the table data if order by is used + * @remarks Only works with tables that have columns named "list_order" or "update_order" + * + * EXAMPLE: SELECT * FROM xe_documents WHERE module_srl = 10 AND list_order < 2100000000 ORDER BY list_order + * + **/ + function limitResultIfOrderByIsUsed($order_list, $condition){ + if(!$order_list) return $condition; + + foreach ($order_list as $key => $val) { + $col = $val[0]; + if(!in_array($col, array('list_order','update_order'))) continue; + + if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col); + else $condition = sprintf(' where %s < 2100000000 ', $col); + } + + return $condition; + } + /** * @brief displays the current stack trace. Fetch the result **/ @@ -1138,68 +1162,16 @@ if ($page > $total_page) $page = $total_page; $start_count = ($page - 1) * $list_count; - if ($output->order) { - $conditions = $this->getConditionList($output); - //if(in_array('list_order', $conditions) || in_array('update_order', $conditions)) { - foreach ($output->order as $key => $val) { - $col = $val[0]; - if(!in_array($col, array('list_order','update_order'))) continue; - if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col); - else $condition = sprintf(' where %s < 2100000000 ', $col); - } - //} - } + $condition = $this->limitResultIfOrderByIsUsed($output->order, $condition); + + // group by + $groupby_query = $this->getGroupByClause($output->groups); - - if (count ($output->groups)) { - foreach ($output->groups as $key => $value) { - if (strpos ($value, '.')) { - $tmp = explode ('.', $value); - $tmp[0] = sprintf ('"%s"', $tmp[0]); - $tmp[1] = sprintf ('"%s"', $tmp[1]); - $value = implode ('.', $tmp); - } - elseif (strpos ($value, '(')) $value = $value; - else $value = sprintf ('"%s"', $value); - $output->groups[$key] = $value; - } - - $groupby_query = sprintf (' group by %s', implode (',', $output->groups)); - } - - if ($output->order) { - foreach ($output->order as $val) { - if (strpos ($val[0], '.')) { - $tmpval = explode ('.', $val[0]); - $tmpval[0] = sprintf ('"%s"', $tmpval[0]); - $tmpval[1] = sprintf ('"%s"', $tmpval[1]); - $val[0] = implode ('.', $tmpval); - } - elseif (strpos ($val[0], '(')) $val[0] = $val[0]; - elseif ($val[0] == 'count') $val[0] = 'count (*)'; - else $val[0] = sprintf ('"%s"', $val[0]); - $index_list[] = sprintf ('%s %s', $val[0], $val[1]); - } - - if (count ($index_list)) { - $orderby_query = ' order by '.implode(',', $index_list); - } - - $orderby_query = sprintf ('%s for orderby_num() between %d and %d', $orderby_query, $start_count + 1, $list_count + $start_count); - } - else { - if (count($output->groups)) { - $orderby_query = sprintf ('%s having groupby_num() between %d and %d', $orderby_query, $start_count + 1, $list_count + $start_count); - } - else { - if ($condition) { - $orderby_query = sprintf ('%s and inst_num() between %d and %d', $orderby_query, $start_count + 1, $list_count + $start_count); - } - else { - $orderby_query = sprintf('%s where inst_num() between %d and %d', $orderby_query, $start_count + 1, $list_count + $start_count); - } - } - } + // order by + $orderby_query = $this->getOrderByClause($output->order); + + // limit + $limit_query = $this->getLimitClause($start_count, $list_count); if(count($output->arg_columns)) { @@ -1212,7 +1184,7 @@ $columns = join(',',$columns); } - $query = sprintf ("select %s from %s %s %s %s", $columns, implode (',',$table_list), implode (' ',$left_join), $condition, $groupby_query.$orderby_query); + $query = sprintf ("select %s from %s %s %s %s", $columns, implode (',',$table_list), implode (' ',$left_join), $condition, $groupby_query.$orderby_query.$limit_query); $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; $result = $this->_query ($query); From 9076974a59c4b2957882b3b7be00704de35bfe68 Mon Sep 17 00:00:00 2001 From: mosmartin Date: Wed, 13 Apr 2011 15:41:26 +0000 Subject: [PATCH 0034/1372] #19690852 Refactoring: updated addQuotes to check if magic quotes are on only once and not on every function call. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8310 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/db/DBCubrid3.class.php | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/classes/db/DBCubrid3.class.php b/classes/db/DBCubrid3.class.php index 2c9c6c84a..a312c7de9 100644 --- a/classes/db/DBCubrid3.class.php +++ b/classes/db/DBCubrid3.class.php @@ -22,7 +22,8 @@ var $prefix = 'xe'; // / prefix = $db_info->db_table_prefix; if (!substr($this->prefix, -1) != '_') $this->prefix .= '_'; + $this->magic_quotes_enabled = (version_compare(PHP_VERSION, "5.9.0", "<") && get_magic_quotes_gpc()); } /** @@ -123,21 +125,11 @@ { if (!$this->fd) return $string; - if (version_compare (PHP_VERSION, "5.9.0", "<") && - get_magic_quotes_gpc ()) { + if ($this->magic_quotes_enabled) { $string = stripslashes (str_replace ("\\","\\\\", $string)); } - if (!is_numeric ($string)) { - /* - if ($this->isConnected()) { - $string = cubrid_real_escape_string($string); - } - else { - $string = str_replace("'","\'",$string); - } - */ - + if (!is_numeric($string)) { $string = str_replace("'","''",$string); } From f71f5b564e5ac360e396607845f7684e5e6bfe3d Mon Sep 17 00:00:00 2001 From: ovclas Date: Thu, 14 Apr 2011 08:42:57 +0000 Subject: [PATCH 0035/1372] #19692159 improve install UI git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8311 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/context/Context.class.php | 16 +- common/lang/ko.lang.php | 6 +- modules/install/conf/module.xml | 6 +- modules/install/install.controller.php | 99 +++- modules/install/install.view.php | 30 +- modules/install/lang/en.lang.php | 448 +++-------------- modules/install/lang/es.lang.php | 448 +++-------------- modules/install/lang/fr.lang.php | 453 +++--------------- modules/install/lang/jp.lang.php | 447 +++-------------- modules/install/lang/ko.lang.php | 529 ++++++--------------- modules/install/lang/ru.lang.php | 452 +++--------------- modules/install/lang/tr.lang.php | 431 +++-------------- modules/install/lang/vi.lang.php | 452 +++--------------- modules/install/lang/zh-TW.lang.php | 449 +++-------------- modules/install/tpl/admin_form.html | 31 ++ modules/install/tpl/check_env.html | 54 +-- modules/install/tpl/config_form.html | 43 ++ modules/install/tpl/css/install.css | 150 ++++-- modules/install/tpl/filter/admin.xml | 22 + modules/install/tpl/filter/config.xml | 13 + modules/install/tpl/filter/cubrid.xml | 18 +- modules/install/tpl/filter/firebird.xml | 18 +- modules/install/tpl/filter/mssql.xml | 16 +- modules/install/tpl/filter/mysql.xml | 18 +- modules/install/tpl/filter/postgresql.xml | 18 +- modules/install/tpl/filter/sqlite2.xml | 18 +- modules/install/tpl/footer.html | 4 +- modules/install/tpl/form.cubrid.html | 72 ++- modules/install/tpl/form.firebird.html | 74 ++- modules/install/tpl/form.mssql.html | 74 ++- modules/install/tpl/form.mysql.html | 74 ++- modules/install/tpl/form.mysql_innodb.html | 74 ++- modules/install/tpl/form.mysqli.html | 74 ++- modules/install/tpl/form.postgresql.html | 74 ++- modules/install/tpl/form.sqlite2.html | 57 +-- modules/install/tpl/form.sqlite3_pdo.html | 57 +-- modules/install/tpl/ftp.html | 90 ++-- modules/install/tpl/header.html | 8 +- modules/install/tpl/img/bgHtml.gif | Bin 0 -> 2997 bytes modules/install/tpl/img/btnPack.gif | Bin 0 -> 2951 bytes modules/install/tpl/img/icoStatus.gif | Bin 0 -> 879 bytes modules/install/tpl/img/xe.gif | Bin 0 -> 2252 bytes modules/install/tpl/introduce.html | 37 +- modules/install/tpl/js/install.js | 88 ++++ modules/install/tpl/js/install_admin.js | 30 +- modules/install/tpl/js/jquery-1.5.2.min.js | 16 + modules/install/tpl/progress_menu.html | 11 + modules/install/tpl/select_db.html | 53 ++- 48 files changed, 1555 insertions(+), 4097 deletions(-) create mode 100644 modules/install/tpl/admin_form.html create mode 100644 modules/install/tpl/config_form.html create mode 100644 modules/install/tpl/filter/admin.xml create mode 100644 modules/install/tpl/filter/config.xml create mode 100644 modules/install/tpl/img/bgHtml.gif create mode 100644 modules/install/tpl/img/btnPack.gif create mode 100644 modules/install/tpl/img/icoStatus.gif create mode 100644 modules/install/tpl/img/xe.gif create mode 100644 modules/install/tpl/js/install.js create mode 100644 modules/install/tpl/js/jquery-1.5.2.min.js create mode 100644 modules/install/tpl/progress_menu.html diff --git a/classes/context/Context.class.php b/classes/context/Context.class.php index 4ddd6766c..10ece000d 100644 --- a/classes/context/Context.class.php +++ b/classes/context/Context.class.php @@ -993,6 +993,14 @@ class Context { return $file; } + function getAbsFileUrl($file) { + $file = Context::normalizeFilePath($file); + if(strpos($file,'./')===0) $file = dirname($_SERVER['SCRIPT_NAME']).'/'.substr($file,2); + elseif(strpos($file,'../')===0) $file = Context::normalizeFilePath(dirname($_SERVER['SCRIPT_NAME'])."/{$file}"); + + return $file; + } + /** * @brief Add the js file **/ @@ -1016,11 +1024,11 @@ class Context { function unloadJsFile($file, $optimized = false, $targetie = '') { is_a($this,'Context')?$self=&$this:$self=&Context::getInstance(); - $realfile = realpath($file); + $realfile = $self->getAbsFileUrl($file); foreach($self->js_files_map as $key=>$val) { list($_file, $_targetie) = explode("\t", $key); - if(realpath($_file)==$realfile && $_targetie == $targetie) { + if($self->getAbsFileUrl($_file)==$realfile && $_targetie == $targetie) { unset($self->js_files_map[$key]); return; } @@ -1099,11 +1107,11 @@ class Context { function unloadCSSFile($file, $optimized = false, $media = 'all', $targetie = '') { is_a($this,'Context')?$self=&$this:$self=&Context::getInstance(); - $realfile = realpath($file); + $realfile = $self->getAbsFileUrl($file); foreach($self->css_files_map as $key => $val) { list($_file, $_targetie, $_media) = explode("\t", $key); - if(realpath($_file)==$realfile && $_media==$media && $_targetie==$targetie) { + if($self->getAbsFileUrl($_file)==$realfile && $_media==$media && $_targetie==$targetie) { unset($self->css_files_map[$key]); return; } diff --git a/common/lang/ko.lang.php b/common/lang/ko.lang.php index 22ad6a703..3bf972a93 100644 --- a/common/lang/ko.lang.php +++ b/common/lang/ko.lang.php @@ -66,6 +66,8 @@ $lang->cmd_layout_edit = '레이아웃 편집'; $lang->cmd_search_by_ipaddress = 'IP주소로 검색'; $lang->cmd_add_ip_to_spamfilter = '스팸필터에 IP추가'; + $lang->cmd_pass_step = '이 단계를 생략'; + $lang->cmd_complete = '완료'; $lang->enable = '가능'; $lang->disable = '불가능'; // Basic words @@ -271,7 +273,9 @@ 이 FTP정보는 files/config/ftp.config.php 파일 내에 정보가 저장됩니다.
    설치 후 관리자 페이지에서 FTP 정보를 변경하거나 제거할 수 있습니다.
    "; - $lang->msg_safe_mode_ftp_needed = 'PHP의 safe_mode가 On일 경우, FTP 정보를 입력하셔야 XE 설치 및 사용이 가능합니다.'; + $lang->msg_safe_mode_ftp_needed = 'PHP의 safe_mode=On일 경우 XE의 정상적인 동작을 돕습니다.'; + $lang->msg_safe_mode_ftp_needed2 = '모듈의 쉬운 설치 또는 업데이트가 가능해 집니다.'; + $lang->msg_safe_mode_ftp_config = '이 정보는 files/config/ftp.config.php 파일에 저장 됩니다. 설치 후 환경설정 페이지에서도 등록, 변경, 제거 할 수 있습니다.'; $lang->msg_ftp_not_connected = 'localhost로의 FTP 접속 오류가 발생하였습니다. FTP 포트 번호를 확인해주시거나 FTP 서비스가 가능한지 확인해주세요.'; $lang->msg_ftp_invalid_auth_info = '입력하신 FTP 정보로 로그인을 하지 못했습니다. FTP정보를 확인해주세요.'; $lang->msg_ftp_mkdir_fail = 'FTP를 이용한 디렉토리 생성 명령에 실패하였습니다. FTP 서버의 설정을 확인해주세요.'; diff --git a/modules/install/conf/module.xml b/modules/install/conf/module.xml index 39073b438..301a407b0 100644 --- a/modules/install/conf/module.xml +++ b/modules/install/conf/module.xml @@ -6,8 +6,12 @@ - + + + + + diff --git a/modules/install/install.controller.php b/modules/install/install.controller.php index 3408b7aff..29a8d90ee 100644 --- a/modules/install/install.controller.php +++ b/modules/install/install.controller.php @@ -6,6 +6,8 @@ **/ class installController extends install { + var $db_tmp_config_file = ''; + var $etc_tmp_config_file = ''; /** * @brief Initialization @@ -15,8 +17,47 @@ if(Context::isInstalled()) { return new Object(-1, 'msg_already_installed'); } + + $this->db_tmp_config_file = _XE_PATH_.'files/config/tmpDB.config.php'; + $this->etc_tmp_config_file = _XE_PATH_.'files/config/tmpEtc.config.php'; } + /** + * @brief division install step... DB Config temp file create + **/ + function procDBSetting() { + // Get DB-related variables + $db_info = Context::gets('db_type','db_port','db_hostname','db_userid','db_password','db_database','db_table_prefix'); + if(!$db_info->default_url) $db_info->default_url = Context::getRequestUri(); + $db_info->lang_type = Context::getLangType(); + + // Set DB type and information + Context::setDBInfo($db_info); + // Create DB Instance + $oDB = &DB::getInstance(); + // Check if available to connect to the DB + $output = $oDB->getError(); + if(!$oDB->isConnected()) return $oDB->getError(); + // When installing firebire DB, transaction will not be used + if($db_info->db_type != "firebird") $oDB->begin(); + + if($db_info->db_type != "firebird") $oDB->commit(); + // Create a db temp config file + if(!$this->makeDBConfigFile()) return new Object(-1, 'msg_install_failed'); + } + + /** + * @brief division install step... rewrite, time_zone Config temp file create + **/ + function procConfigSetting() { + // Get variables + $config_info = Context::gets('use_rewrite','time_zone'); + if($config_info->use_rewrite!='Y') $config_info->use_rewrite = 'N'; + + // Create a db temp config file + if(!$this->makeEtcConfigFile($config_info)) return new Object(-1, 'msg_install_failed'); + } + /** * @brief Install with received information **/ @@ -27,17 +68,16 @@ $logged_info->is_admin = 'Y'; $_SESSION['logged_info'] = $logged_info; Context::set('logged_info', $logged_info); - // Get DB-related variables - $db_info = Context::gets('db_type','db_port','db_hostname','db_userid','db_password','db_database','db_table_prefix','time_zone','use_rewrite'); - if($db_info->use_rewrite!='Y') $db_info->use_rewrite = 'N'; - if(!$db_info->default_url) $db_info->default_url = Context::getRequestUri(); - $db_info->lang_type = Context::getLangType(); + + include $this->db_tmp_config_file; + include $this->etc_tmp_config_file; + // Set DB type and information Context::setDBInfo($db_info); // Create DB Instance $oDB = &DB::getInstance(); + // Check if available to connect to the DB - $output = $oDB->getError(); if(!$oDB->isConnected()) return $oDB->getError(); // When installing firebire DB, transaction will not be used if($db_info->db_type != "firebird") $oDB->begin(); @@ -283,6 +323,47 @@ return new Object(); } + /** + * @brief Create DB temp config file + * Create the config file when all settings are completed + **/ + function makeDBConfigFile() { + $db_tmp_config_file = $this->db_tmp_config_file; + + $db_info = Context::getDbInfo(); + if(!$db_info) return; + + $buff = ' $val) { + $buff .= sprintf("\$db_info->%s = '%s';\n", $key, str_replace("'","\\'",$val)); + } + $buff .= "?>"; + + FileHandler::writeFile($db_tmp_config_file, $buff); + + if(@file_exists($db_tmp_config_file)) return true; + return false; + } + + /** + * @brief Create etc config file + * Create the config file when all settings are completed + **/ + function makeEtcConfigFile($config_info) { + $etc_tmp_config_file = $this->etc_tmp_config_file; + + $buff = ' $val) { + $buff .= sprintf("\$db_info->%s = '%s';\n", $key, str_replace("'","\\'",$val)); + } + $buff .= "?>"; + + FileHandler::writeFile($etc_tmp_config_file, $buff); + + if(@file_exists($etc_tmp_config_file)) return true; + return false; + } + /** * @brief Create config file * Create the config file when all settings are completed @@ -302,7 +383,11 @@ FileHandler::writeFile($config_file, $buff); - if(@file_exists($config_file)) return true; + if(@file_exists($config_file)) { + FileHandler::removeFile($this->db_tmp_config_file); + FileHandler::removeFile($this->etc_tmp_config_file); + return true; + } return false; } diff --git a/modules/install/install.view.php b/modules/install/install.view.php index ae4dfab34..8056b6927 100644 --- a/modules/install/install.view.php +++ b/modules/install/install.view.php @@ -60,8 +60,10 @@ if(!$this->install_enable) return $this->dispInstallCheckEnv(); // Enter ftp information if(ini_get('safe_mode') && !Context::isFTPRegisted()) { + Context::set('progressMenu', '3'); $this->setTemplateFile('ftp'); } else { + Context::set('progressMenu', '4'); $this->setTemplateFile('select_db'); } } @@ -69,17 +71,41 @@ /** * @brief Display a screen to enter DB and administrator's information **/ - function dispInstallForm() { + function dispInstallDBForm() { // Display check_env if not installable if(!$this->install_enable) return $this->dispInstallCheckEnv(); // Return to the start-up screen if db_type is not specified if(!Context::get('db_type')) return $this->dispInstallSelectDB(); - Context::set('time_zone', $GLOBALS['time_zone']); // Output the file, disp_db_info_form.html $tpl_filename = sprintf('form.%s', Context::get('db_type')); $this->setTemplateFile($tpl_filename); } + /** + * @brief Display a screen to enter DB and administrator's information + **/ + function dispInstallConfigForm() { + // Display check_env if not installable + if(!$this->install_enable) return $this->dispInstallCheckEnv(); + + include _XE_PATH_.'files/config/tmpDB.config.php'; + + Context::set('time_zone', $GLOBALS['time_zone']); + Context::set('db_type', $db_info->db_type); + $this->setTemplateFile('config_form'); + } + + /** + * @brief Display a screen to enter DB and administrator's information + **/ + function dispInstallManagerForm() { + // Display check_env if not installable + if(!$this->install_enable) { + return $this->dispInstallCheckEnv(); + } + + $this->setTemplateFile('admin_form'); + } } ?> diff --git a/modules/install/lang/en.lang.php b/modules/install/lang/en.lang.php index d20808746..3cfd7cac8 100644 --- a/modules/install/lang/en.lang.php +++ b/modules/install/lang/en.lang.php @@ -10,459 +10,149 @@ GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. + Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] +[This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. + The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. + This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. + When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. + To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. + For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. + We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. + To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. + Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. + Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. + When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. + We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. + For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. + In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. + Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. + The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". + 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. + A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) + The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. + "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. + Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the + 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. + You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: + 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. + b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. + c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. + d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) + (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote +These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. +Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. +In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. + 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. + Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. + 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. + If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. + 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. + However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. + When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. + If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. + Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. + 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: + You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) + a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. + b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. + c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. + d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. + e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. + For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. + It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: + 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. + a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. + b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. + 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. + 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. + 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. + 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. +If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. +It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. +This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. + 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. + 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. +Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. + 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS diff --git a/modules/install/lang/es.lang.php b/modules/install/lang/es.lang.php index 6f8e508fd..f5f5ea8eb 100644 --- a/modules/install/lang/es.lang.php +++ b/modules/install/lang/es.lang.php @@ -10,459 +10,147 @@ GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. + Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] +[This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. + The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. + This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. + When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. + To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. + For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. + We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. + To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. + Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. + Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. + When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. + We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. + For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. + In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. + Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. + The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". + 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. + A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) + The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. + "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. + Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. + 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. + You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: + 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. + b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. + c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. + d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) + (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. +These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. +Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. +In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. + 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. + Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. + This option is useful when you wish to copy part of the code of the Library into a program that is not a library. - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. + 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. + If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. + 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. + However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. + When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) + If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. + Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. + 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: + You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) + a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. + b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. + c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. + d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. + e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. + For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. + It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: + 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. + a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. + b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. + 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. + 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. + 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. + 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. +If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. +It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. +This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. + 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. + 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. +Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. + 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS EndOfLicense; diff --git a/modules/install/lang/fr.lang.php b/modules/install/lang/fr.lang.php index efd3a9d47..560809fc4 100644 --- a/modules/install/lang/fr.lang.php +++ b/modules/install/lang/fr.lang.php @@ -10,464 +10,149 @@ GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. + Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] +[This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. + The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. + This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. + When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. + To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. + For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. + We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. + To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. + Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. + Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. + When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. + We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. + For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. + In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. + Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. + The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". + 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. + A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) + The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. + "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. + Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. + 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. + You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: + 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. + b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. + c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. + d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) + (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. +These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. +Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. +In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. + 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. + Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. + This option is useful when you wish to copy part of the code of the Library into a program that is not a library. - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. + 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. + If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. + 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. + However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. + When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) + If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. + Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. + 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: + You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) + a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. + b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. + c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. + d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. + e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. + For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. + It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: + 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. + a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. + b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. + 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. + 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. + 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. + 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. +If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. +It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. +This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. + 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. + 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. +Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. + 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + END OF TERMS AND CONDITIONS EndOfLicense; diff --git a/modules/install/lang/jp.lang.php b/modules/install/lang/jp.lang.php index 666cb3539..cb10322c4 100644 --- a/modules/install/lang/jp.lang.php +++ b/modules/install/lang/jp.lang.php @@ -10,459 +10,148 @@ GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. + Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] +[This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. + The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. + This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. + When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. + To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. + For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. + We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. + To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. + Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. + Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. + When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. + We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. + For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. + In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. + Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. + The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". + 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. + A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) + The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. + "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. + Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. + 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a + You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: + 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. + b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. + c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. + d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) + (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. +These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. +Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. +In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. + 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. + Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. + This option is useful when you wish to copy part of the code of the Library into a program that is not a library. - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. + 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. + If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. + 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. + However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. + When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) + If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. + Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. + 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: + You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) + a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. + b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. + c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. + d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. + e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. + For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. + It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: + 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. + a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. + b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. + 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. + 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. + 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. + 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. +If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. +It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. +This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. + 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. + 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. +Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. + 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS diff --git a/modules/install/lang/ko.lang.php b/modules/install/lang/ko.lang.php index e638893b4..77f2cfb23 100644 --- a/modules/install/lang/ko.lang.php +++ b/modules/install/lang/ko.lang.php @@ -8,399 +8,162 @@ $lang->license = <<GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] + Preamble - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. + + The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. + + To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. + Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. + + When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. + + We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. + + For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. + + Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a + GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. + + Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. + + You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: + 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: + a) The modified work must itself be a software library. - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. + + b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. + + (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. + Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. + 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: + + a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. + + e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. + + It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. + 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. + + b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. + 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. + +This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. + 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. + NO WARRANTY - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + END OF TERMS AND CONDITIONS + EndOfLicense; + $lang->install_progress_menu = array( + 'agree'=>'라이선스 동의', + 'condition'=>'설치 조건 확인', + 'ftp'=>'FTP 정보 입력', + 'dbSelect'=>'DB 선택', + 'dbInfo'=>'DB 정보 입력', + 'configInfo'=>'환경 설정', + 'adminInfo'=>'관리자 정보 입력' + ); $lang->install_condition_title = '필수 설치조건을 확인하세요.'; $lang->install_checklist_title = array( 'php_version' => 'PHP Version', @@ -426,6 +189,7 @@ EndOfLicense; $lang->install_without_iconv = '문자열을 처리하기 위한 iconv 라이브러리가 설치되어 있지 않습니다.'; $lang->install_session_auto_start = 'php설정의 session.auto_start==1 이라 세션 처리에 문제가 발생할 수 있습니다.'; $lang->install_permission_denied = '설치대상 디렉토리의 퍼미션이 707이 아닙니다.'; + $lang->install_notandum = '모든 항목을 반드시 작성해야 합니다. 모든 항목을 관리자 환경에서 수정할 수 있습니다.'; $lang->cmd_agree_license = '라이선스에 동의합니다.'; $lang->cmd_install_fix_checklist = '필수 설치조건을 설정하였습니다.'; $lang->cmd_install_next = '설치를 진행합니다.'; @@ -452,15 +216,16 @@ EndOfLicense; $lang->db_database = 'DB 데이터베이스'; $lang->db_database_file = 'DB 데이터베이스 파일'; $lang->db_table_prefix = '테이블 머리말'; + $lang->db_info_desc = '

    DB 호스트 네임, DB Port, DB 아이디, DB 비밀번호, DB 이름 정보는 서버 호스팅 관리자로부터 정보를 확인 하세요.

    DB 테이블 머리말 정보는 사용자 정의 할 수 있습니다. 영문 소문자를 권장 합니다. 숫자를 포함할 수 있습니다. 특수 문자를 사용할 수 없습니다.

    '; $lang->admin_title = '관리자 정보'; $lang->env_title = '환경 설정'; $lang->use_optimizer = 'Optimizer 사용'; $lang->about_optimizer = 'Optimizer를 사용하면 다수의 CSS/JS파일을 통합/압축 전송하여 매우 빠르게 사이트 접속이 가능하게 합니다.
    다만 CSS나 JS에 따라서 문제가 생길 수 있습니다. 이때는 Optimizer 비활성화 하시면 정상적인 동작은 가능합니다.'; - $lang->use_rewrite = 'rewrite mod 사용'; + $lang->use_rewrite = '짧은 주소 사용'; $lang->use_sso = 'SSO 사용'; - $lang->about_rewrite = '웹서버에서 rewrite mod를 지원하면 http://주소/?document_srl=123 같이 복잡한 주소를 http://주소/123과 같이 간단하게 줄일 수 있습니다.'; + $lang->about_rewrite = '

    이 기능을 사용하면 http://yourdomain/?document_srl=123 과 같이 복잡한 주소를 http://yourdomain/123 과 같이 간단하게 줄일 수 있습니다. 이 기능을 사용하려면 웹 서버에서 rewrite_mod를 지원해야 합니다. 웹 서버에서 rewrite_mod를 지원하는지 여부는 서버 관리자에게 문의하세요.

    '; $lang->time_zone = '표준 시간대'; - $lang->about_time_zone = '서버의 설정시간과 사용하려는 장소의 시간이 차이가 날 경우 표준 시간대를 지정하시면 표시되는 시간을 지정된 곳의 시간으로 사용하실 수 있습니다.'; + $lang->about_time_zone = '서버의 설정시간과 사용하려는 장소의 시간이 차이가 날 경우 표준 시간대를 지정하면 표시되는 시간을 지정된 곳의 시간으로 사용하실 수 있습니다.'; $lang->qmail_compatibility = 'Qmail 호환'; $lang->about_qmail_compatibility = 'Qmail등 CRLF를 줄 구분자로 인식하지 못하는 MTA에서 메일이 발송되도록 합니다.'; $lang->about_database_file = 'Sqlite는 파일에 데이터를 저장합니다. 데이터베이스 파일의 위치를 웹에서 접근할 수 없는 곳으로 하셔야 합니다.
    데이터 파일은 707퍼미션 설정된 곳으로 지정해주세요.'; diff --git a/modules/install/lang/ru.lang.php b/modules/install/lang/ru.lang.php index 86744d96a..d14b33b47 100644 --- a/modules/install/lang/ru.lang.php +++ b/modules/install/lang/ru.lang.php @@ -10,463 +10,149 @@ GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. + Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] +[This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. + The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. + This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. + When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. + To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. + For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. + We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. + To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. + Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. + Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. + When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. + We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. + For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. + In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. + Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. + The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". + 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. + A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) + The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. + "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. + Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. + 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. + You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: + 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. + b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. + c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. + d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) + (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. +These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. +Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. +In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. + 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. + Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. + This option is useful when you wish to copy part of the code of the Library into a program that is not a library. - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. + 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. + If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. + 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. + However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. + When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) + If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. + Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. + 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: + You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) + a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. + b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. + c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. + d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. + e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. + For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. + It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: + 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. + a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. + b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. + 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. + 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. + 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. + 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. +If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. +It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. +This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. + 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. + 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. +Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. + 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + END OF TERMS AND CONDITIONS EndOfLicense; diff --git a/modules/install/lang/tr.lang.php b/modules/install/lang/tr.lang.php index 4c4650dc0..463e89efe 100644 --- a/modules/install/lang/tr.lang.php +++ b/modules/install/lang/tr.lang.php @@ -10,446 +10,143 @@ GNU KISITLI GENEL KAMU LİSANSI Sürüm 2.1, Şubat 1999 - Telif Hakkı © 1991, 1999 Free Software Foundation. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Bu lisans dökümanının birebir kopyalarını yapma ve dağıtma - izni herkese verilmiştir, fakat metinde değişiklik yapma izni yoktur. + Telif Hakkı © 1991, 1999 Free Software Foundation. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Bu lisans dökümanının birebir kopyalarını yapma ve dağıtma izni herkese verilmiştir, fakat metinde değişiklik yapma izni yoktur. -[Bu döküman Kısıtlı GPL'in ilk yayınlanmış sürümüdür. Aynı zamanda - GNU Kitaplık Kamu Lisansı, 2. sürüm'ün devamı sayılmaktadır, bu - sebeple sürüm numarası 2.1 olarak verilmiştir.] +[Bu döküman Kısıtlı GPL'in ilk yayınlanmış sürümüdür. Aynı zamanda GNU Kitaplık Kamu Lisansı, 2. sürüm'ün devamı sayılmaktadır, bu sebeple sürüm numarası 2.1 olarak verilmiştir.] GİRİŞ - Yazılım lisanslarının çoğu sizin yazılımı paylaşma ve değiştirme -hakkınızın elinizden alınması için hazırlanmıştır. Buna karşılık, -GNU Genel Kamu Lisansları sizin serbest yazılımları değiştirme ve -paylaşma hakkınızın mahfuz tutulması ve yazılımın bütün kullanıcıları -için serbest olması amacı ile yazılmıştır. + Yazılım lisanslarının çoğu sizin yazılımı paylaşma ve değiştirme hakkınızın elinizden alınması için hazırlanmıştır. Buna karşılık, GNU Genel Kamu Lisansları sizin serbest yazılımları değiştirme ve paylaşma hakkınızın mahfuz tutulması ve yazılımın bütün kullanıcıları için serbest olması amacı ile yazılmıştır. - Bu Kısıtlı Genel Kamu Lisansı, bazı özel amaçlı yazılım paketleri --genelde kitaplıklar- için hazırlanmış olup, Free Software Foundation'un -bazı yazılımları ve bu lisansı kullanmayı tercih eden diğer yazılımcıların -yazılımları için kullanılmaktadır. Siz de bu lisansı kullanabilirsiniz, -fakat kullanmadan önce sizin özel durumunuz için bu lisansı mı, yoksa -GNU Genel Kamu Lisansı (GPL) kullanmanın mı daha uygun bir strateji -olacağını, aşağıdaki açıklamaları okuyarak düşünmeniz ve öyle karar -vermenizi öneriyoruz. + Bu Kısıtlı Genel Kamu Lisansı, bazı özel amaçlı yazılım paketleri -genelde kitaplıklar- için hazırlanmış olup, Free Software Foundation'un bazı yazılımları ve bu lisansı kullanmayı tercih eden diğer yazılımcıların yazılımları için kullanılmaktadır. Siz de bu lisansı kullanabilirsiniz, fakat kullanmadan önce sizin özel durumunuz için bu lisansı mı, yoksa GNU Genel Kamu Lisansı (GPL) kullanmanın mı daha uygun bir strateji olacağını, aşağıdaki açıklamaları okuyarak düşünmeniz ve öyle karar vermenizi öneriyoruz. - Serbest yazılımdan bahsettiğimiz zaman fiyattan değil, özgürlükten -bahsediyoruz. Bizim Genel Kamu Lisanslarımız, sizin serbest yazılımların -kopyalarını dağıtma özgürlüğünüzü (ve isterseniz bu hizmet için para almanızı) -, yazılım kaynak kodlarının size dağıtım esnasında veya eğer isterseniz -verilmesini, yazılımı değiştirebilmenizi, yazılımın parçalarını yeni -yazılımlar içerisinde kullanabilmenizi ve bunları yapabileceğinizi -bilmenizi sağlamaktadır. + Serbest yazılımdan bahsettiğimiz zaman fiyattan değil, özgürlükten bahsediyoruz. Bizim Genel Kamu Lisanslarımız, sizin serbest yazılımların kopyalarını dağıtma özgürlüğünüzü (ve isterseniz bu hizmet için para almanızı) , yazılım kaynak kodlarının size dağıtım esnasında veya eğer isterseniz verilmesini, yazılımı değiştirebilmenizi, yazılımın parçalarını yeni yazılımlar içerisinde kullanabilmenizi ve bunları yapabileceğinizi bilmenizi sağlamaktadır. - Haklarınızı koruyabilmemiz için dağıtıcıların sizin haklarınızı kısıtlama -veya sizin bu haklarınızdan feragat etmenizi isteme yollarını yasaklayıcı -bazı kısıtlamalar getirmemiz gerekmektedir. Bu kısıtlamalar eğer kitaplığın -kopyalarını dağıtıyor veya değiştiriyorsanız size bazı yükümlülükler -getirmektedir. + Haklarınızı koruyabilmemiz için dağıtıcıların sizin haklarınızı kısıtlama veya sizin bu haklarınızdan feragat etmenizi isteme yollarını yasaklayıcı bazı kısıtlamalar getirmemiz gerekmektedir. Bu kısıtlamalar eğer kitaplığın kopyalarını dağıtıyor veya değiştiriyorsanız size bazı yükümlülükler getirmektedir. - Örneğin kitaplığın kopyalarını, bedava veya ücret karşılığı dağıtıyorsanız -alıcılara sizin sahip olduğunuz bütün hakları sağlamalısınız. Onların da -kaynak kodlarına sahip olmalarını veya ulaşabilmelerini sağlamalısınız. -Eğer kitaplık ile başka kodlar bağlanıyorsa, alıcılara bütün nesne dosyalarını -vermelisiniz ki, alıcılar kitaplığın kaynak kodlarında değişiklik yapıp -kitaplığı yeniden derledikten sonra nesne dosyalarını tekrar kitaplık ile -bağlayabilsinler. Ve, onlara da haklarını bilebilmeleri için bu şartları -göstermelisiniz. + Örneğin kitaplığın kopyalarını, bedava veya ücret karşılığı dağıtıyorsanız alıcılara sizin sahip olduğunuz bütün hakları sağlamalısınız. Onların da kaynak kodlarına sahip olmalarını veya ulaşabilmelerini sağlamalısınız. Eğer kitaplık ile başka kodlar bağlanıyorsa, alıcılara bütün nesne dosyalarını vermelisiniz ki, alıcılar kitaplığın kaynak kodlarında değişiklik yapıp kitaplığı yeniden derledikten sonra nesne dosyalarını tekrar kitaplık ile bağlayabilsinler. Ve, onlara da haklarını bilebilmeleri için bu şartları göstermelisiniz. Haklarınızı iki koruma iki aşamada gerçekleşmektedir: 1. Kitaplığa telif hakkı alınmaktadır. 2. Yazılım lisansı olarak size, hukuki olarak, kitaplığı kopyalama, dağıtma ve/veya değiştirme hakkı tanıyan bu lisans sunulmaktadır. - Her dağıtıcıyı korumak için bu serbest kitaplığın herhangi bir garantisi -olmadığını vurgulamak istiyoruz. Eğer kitaplık başkası tarafından değiştirilmiş -ve değiştirilmiş hali ile tarafınıza ulaştırılmış ise alıcıların, ellerinde -olan kitaplığın orjinal olmadığını, dolayısıyla başkaları tarafından eklenen -problemlerin ilk yazarların şöhretlerine olumsuz etkide bulunmaması gerektiğini - bilmelerini istiyoruz. + Her dağıtıcıyı korumak için bu serbest kitaplığın herhangi bir garantisi olmadığını vurgulamak istiyoruz. Eğer kitaplık başkası tarafından değiştirilmiş ve değiştirilmiş hali ile tarafınıza ulaştırılmış ise alıcıların, ellerinde olan kitaplığın orjinal olmadığını, dolayısıyla başkaları tarafından eklenen problemlerin ilk yazarların şöhretlerine olumsuz etkide bulunmaması gerektiğini bilmelerini istiyoruz. - Son olarak, bütün serbest yazılımlar yazılım patentleri tarafından sürekli tehdit -altında bulunmaktadır. Herhangi bir şirketin serbest bir yazılımın kullanıcılarını, -bir patent sahibinden kısıtlayıcı bir lisans alarak kısıtlama/engellemesinin mümkün -olmamasından emin olmak istiyoruz. Dolayısıyla kitaplığın herhangi bir sürümü için -alınabilecek bir patent lisansının bu lisans içerisinde tanımlanan tam serbesti ile -uyumlu olması gerektiğini açık olarak ortaya koyuyoruz. + Son olarak, bütün serbest yazılımlar yazılım patentleri tarafından sürekli tehdit altında bulunmaktadır. Herhangi bir şirketin serbest bir yazılımın kullanıcılarını, bir patent sahibinden kısıtlayıcı bir lisans alarak kısıtlama/engellemesinin mümkün olmamasından emin olmak istiyoruz. Dolayısıyla kitaplığın herhangi bir sürümü için alınabilecek bir patent lisansının bu lisans içerisinde tanımlanan tam serbesti ile uyumlu olması gerektiğini açık olarak ortaya koyuyoruz. - Kitaplıklar da dahil olmak üzere çoğu GNU yazılımı normal GNU Genel Kamu Lisansı (GPL) -altında yayınlanmaktadır. GNU Kısıtlı Genel Kamu Lisansı (LGPL) olarak adlandırılan -bu lisans ise, yalnızca bazı özel kitaplıklar için uygulanmakta ve GNU Genel Kamu -Lisansı'ndan (GPL) bir hayli değişik koşullar içermektedir. Bizler bu lisansı (LGPL), -bazı kitaplıkların serbest olmayan yazılımlara bağlanabilmesine imkan tanımak amacı -ile kullanıyoruz. + Kitaplıklar da dahil olmak üzere çoğu GNU yazılımı normal GNU Genel Kamu Lisansı (GPL) altında yayınlanmaktadır. GNU Kısıtlı Genel Kamu Lisansı (LGPL) olarak adlandırılan bu lisans ise, yalnızca bazı özel kitaplıklar için uygulanmakta ve GNU Genel Kamu Lisansı'ndan (GPL) bir hayli değişik koşullar içermektedir. Bizler bu lisansı (LGPL), bazı kitaplıkların serbest olmayan yazılımlara bağlanabilmesine imkan tanımak amacı ile kullanıyoruz. - Bir yazılım bir kitaplık ile, gerek statik, gerek paylaşımlı kitaplık yolu ile -bağlandığı zaman, ikisinin birleşimi, hukuki açıdan birleşik ve orjinal kitaplıktan -iştikak eden bir eser oluşturur. Dolayısıyla normal Genel Kamu Lisansı, böyle bir -bağlanma işlemine ancak eğer oluşan bütün GPL'de tanımlanan serbesti kriterlerine -uyuyor ise izin verir. Kısıtlı Genel Kamu Lisansı (LGPL) ise, kitaplık ile başka -yazılımların bağlanması halinde daha gevşek kriterler uygular. + Bir yazılım bir kitaplık ile, gerek statik, gerek paylaşımlı kitaplık yolu ile bağlandığı zaman, ikisinin birleşimi, hukuki açıdan birleşik ve orjinal kitaplıktan iştikak eden bir eser oluşturur. Dolayısıyla normal Genel Kamu Lisansı, böyle bir bağlanma işlemine ancak eğer oluşan bütün GPL'de tanımlanan serbesti kriterlerine uyuyor ise izin verir. Kısıtlı Genel Kamu Lisansı (LGPL) ise, kitaplık ile başka yazılımların bağlanması halinde daha gevşek kriterler uygular. - Bu lisansa "Kısıtlı" Genel Kamu Lisansı dememizin sebebi, kullanıcının haklarını -korumak açısından Genel Kamu Lisansı'na göre daha kısıtlı olmasıdır. Bu lisans, -serbest yazılım geliştiricilerine, serbest olmayan kapalı yazılım geliştiricileri -ile rekabet etmeleri için daha kısıtlı imkanlar sunmaktadır. Bu dezavantajlar sebebi -ile, pek çok kitaplık için bu lisansı değil, Genel Kamu Lisansı'nı (GPL) -kullanmaktayız. Fakat Kısıtlı lisans bazı özel durumlarda bazı avantajlar -sağlamaktadır. + Bu lisansa "Kısıtlı" Genel Kamu Lisansı dememizin sebebi, kullanıcının haklarını korumak açısından Genel Kamu Lisansı'na göre daha kısıtlı olmasıdır. Bu lisans, serbest yazılım geliştiricilerine, serbest olmayan kapalı yazılım geliştiricileri ile rekabet etmeleri için daha kısıtlı imkanlar sunmaktadır. Bu dezavantajlar sebebi ile, pek çok kitaplık için bu lisansı değil, Genel Kamu Lisansı'nı (GPL) kullanmaktayız. Fakat Kısıtlı lisans bazı özel durumlarda bazı avantajlar sağlamaktadır. - Örneğin bazı özel ve seyrek rastlanan durumlarda, bir kitaplığın en -yaygın kullanımınısağlamak ve özendirmek ve bu şekilde de-fakto -standart haline gelmesini sağlamak istenebilir.Bunu sağlamak için, -serbest olmayan yazılımların da kitaplığı kullanabilmesine imkan -tanımak gerekir. Daha sık rastlanan bir durum ise, serbest bir -kitaplığın serbest olmayan ve yaygın kullanımda olan kitaplıklarla -aynı işlevi yapmasıdır. Böyle durumlarda serbest kitaplığı yalnız -serbest yazılımlarla kullanılır hale getirmenin bir anlamı yoktur, -dolayısıyla Kısıtlı Genel Kamu Lisansı kullanılır. + Örneğin bazı özel ve seyrek rastlanan durumlarda, bir kitaplığın en yaygın kullanımınısağlamak ve özendirmek ve bu şekilde de-fakto standart haline gelmesini sağlamak istenebilir.Bunu sağlamak için, serbest olmayan yazılımların da kitaplığı kullanabilmesine imkan tanımak gerekir. Daha sık rastlanan bir durum ise, serbest bir kitaplığın serbest olmayan ve yaygın kullanımda olan kitaplıklarla aynı işlevi yapmasıdır. Böyle durumlarda serbest kitaplığı yalnız serbest yazılımlarla kullanılır hale getirmenin bir anlamı yoktur, dolayısıyla Kısıtlı Genel Kamu Lisansı kullanılır. - Başka durumlarda, belirli bir kitaplığı serbest olmayan yazılımlarda -kullanma izninin verilmesi, daha çok sayıda kişinin çok sayıda serbest -yazılımı kullanmasına imkan verebilir. Örneğin GNU C kitaplığının -serbest olmayan yazılımlarla birlikte kullanılabilmesi, pek çok kişinin -bütün GNU işletim sistemini ve onun bir türevi olan GNU/Linux işletim -sistemini kullanmasına imkan tanımaktadır. + Başka durumlarda, belirli bir kitaplığı serbest olmayan yazılımlarda kullanma izninin verilmesi, daha çok sayıda kişinin çok sayıda serbest yazılımı kullanmasına imkan verebilir. Örneğin GNU C kitaplığının serbest olmayan yazılımlarla birlikte kullanılabilmesi, pek çok kişinin bütün GNU işletim sistemini ve onun bir türevi olan GNU/Linux işletim sistemini kullanmasına imkan tanımaktadır. - Kısıtlı Genel Kamu Lisansı, kullanıcının özgürlüğünü korumakta daha -kısıtlı ise de, Kitaplık ile bağlanan bir yazılımı kullanan kullanıcıya, -o yazılımı Kitaplığın değiştirilmiş bir hali ile kullanabilme hakkı ve -imkanı vermektedir. + Kısıtlı Genel Kamu Lisansı, kullanıcının özgürlüğünü korumakta daha kısıtlı ise de, Kitaplık ile bağlanan bir yazılımı kullanan kullanıcıya, o yazılımı Kitaplığın değiştirilmiş bir hali ile kullanabilme hakkı ve imkanı vermektedir. - Kopyalama, dağıtım ve değiştirme ile ilgili kesin şart ve kayıtlar -aşağıda yer almaktadır. "kitaplığı baz alan eser" ile "kitaplığı -kullanan eser" arasındaki farka özellikle dikkat edin. Birincisi -kitaplığın kaynak kodlarından türeyen kod kullanmaktadır, ikincisi -ise çalışmak için kitaplık ile bağlanmalıdır. + Kopyalama, dağıtım ve değiştirme ile ilgili kesin şart ve kayıtlar aşağıda yer almaktadır. "kitaplığı baz alan eser" ile "kitaplığı kullanan eser" arasındaki farka özellikle dikkat edin. Birincisi kitaplığın kaynak kodlarından türeyen kod kullanmaktadır, ikincisi ise çalışmak için kitaplık ile bağlanmalıdır. - GNU KISITLI GENEL KAMU LİSANSI - KOPYALAMA, DAĞITIM VE DEĞİŞTİRME İLE İLGİLİ ŞART VE KAYITLAR + GNU KISITLI GENEL KAMU LİSANSI KOPYALAMA, DAĞITIM VE DEĞİŞTİRME İLE İLGİLİ ŞART VE KAYITLAR - 0. Bu Lisans, telif hakkı sahibi veya başka yetkili taraf tarafından -içerisine bu Kısıtlı Genel Kamu Lisansı altında dağıtıldığına dair -ibare konmuş olan herhangi bir kitaplık veya başka yazılımı -kapsamaktadır. Her ruhsat sahibine "siz" olarak hitap edilmektedir. + 0. Bu Lisans, telif hakkı sahibi veya başka yetkili taraf tarafından içerisine bu Kısıtlı Genel Kamu Lisansı altında dağıtıldığına dair ibare konmuş olan herhangi bir kitaplık veya başka yazılımı kapsamaktadır. Her ruhsat sahibine "siz" olarak hitap edilmektedir. -"Kitaplık", kolayca (kitaplığın içerdiği bazı işlev ve veriyi kullanan) - uygulama yazılımları ile bağlanabilecek şekilde hazırlanmış yazılım - işlevleri ve/veya veri topluluğu anlamına gelmektedir. +"Kitaplık", kolayca (kitaplığın içerdiği bazı işlev ve veriyi kullanan) uygulama yazılımları ile bağlanabilecek şekilde hazırlanmış yazılım işlevleri ve/veya veri topluluğu anlamına gelmektedir. -Aşağıda "Kitaplık", bu koşullar altında dağıtılmış herhangi bir -yazılım kitaplığı veya eser manasında kullanılmaktadır. "Kitaplığı -baz alan eser", Kitaplık veya telif hakkı kanunu altında Kitaplık'tan -iştikak etmiş, Kitaplığın tamamını veya bir parçasını, değiştirmeden -veya değişiklikler ile veya başka bir dile tercüme edilmiş hali içeren -herhangi bir ürün manasında kullanılmaktadır. (Bundan sonra tercüme -"değiştirme" kapsamında sınırsız olarak içerilecektir.) +Aşağıda "Kitaplık", bu koşullar altında dağıtılmış herhangi bir yazılım kitaplığı veya eser manasında kullanılmaktadır. "Kitaplığı baz alan eser", Kitaplık veya telif hakkı kanunu altında Kitaplık'tan iştikak etmiş, Kitaplığın tamamını veya bir parçasını, değiştirmeden veya değişiklikler ile veya başka bir dile tercüme edilmiş hali içeren herhangi bir ürün manasında kullanılmaktadır. (Bundan sonra tercüme "değiştirme" kapsamında sınırsız olarak içerilecektir.) -Bir eserin "kaynak kodu", o esere değişiklik yapmak için en uygun -imkan ve yöntem manasında kullanılmaktadır. Bir kitaplık için bütün -kaynak kodu, kitaplığın içerdiği bütün modüllere ait bütün kaynak -kodları, ilgili arayüz tanım dosyaları ve kitaplığın derleme ve -kurulma işlemlerini kontrol etmekte kullanılan bütün betikler -manasında kullanılmaktadır. +Bir eserin "kaynak kodu", o esere değişiklik yapmak için en uygun imkan ve yöntem manasında kullanılmaktadır. Bir kitaplık için bütün kaynak kodu, kitaplığın içerdiği bütün modüllere ait bütün kaynak kodları, ilgili arayüz tanım dosyaları ve kitaplığın derleme ve kurulma işlemlerini kontrol etmekte kullanılan bütün betikler manasında kullanılmaktadır. -Kopyalama, dağıtım ve değiştirme haricinde kalan faaliyetler bu -Lisans'ın kapsamı dışındadırlar. Kitaplığı kullanan bir yazılımı -çalıştırma eylemi sınırlandırılmamıştır ve böyle bir yazılımın çıktısı -yalnızca çıktının içeriği (Kitaplığı yazmak için kullanılan bir araçta -Kitaplığın kullanılmasından bağımsız olarak) Kitaplığı baz alan ürün -kapsamına girer ise bu Lisans kapsamındadır. Bu koşulun sağlanıp -sağlanmadığı Kitaplığın ve Kitaplığı kullanan yazılımın ne yaptığı -ile ilgilidir. +Kopyalama, dağıtım ve değiştirme haricinde kalan faaliyetler bu Lisans'ın kapsamı dışındadırlar. Kitaplığı kullanan bir yazılımı çalıştırma eylemi sınırlandırılmamıştır ve böyle bir yazılımın çıktısı yalnızca çıktının içeriği (Kitaplığı yazmak için kullanılan bir araçta Kitaplığın kullanılmasından bağımsız olarak) Kitaplığı baz alan ürün kapsamına girer ise bu Lisans kapsamındadır. Bu koşulun sağlanıp sağlanmadığı Kitaplığın ve Kitaplığı kullanan yazılımın ne yaptığı ile ilgilidir. -1. Kitaplığın bütün kaynak kodlarını birebir, aldığınız şekilde, -herhangi bir ortamda ve vasıta ile, uygun ve görünür bir şekilde -telif hakkı bildirimi ve garantisiz olduğuna dair bildirim koymak, -bu Lisans'dan bahseden herhangi bir bildirimi aynen muhafaza etmek ve -bütün diğer alıcılara Kitaplık ile birlikte bu Lisans'ın bir kopyasını -vermek şartı ile kopyalayabilir ve dağıtabilirsiniz. +1. Kitaplığın bütün kaynak kodlarını birebir, aldığınız şekilde, herhangi bir ortamda ve vasıta ile, uygun ve görünür bir şekilde telif hakkı bildirimi ve garantisiz olduğuna dair bildirim koymak, bu Lisans'dan bahseden herhangi bir bildirimi aynen muhafaza etmek ve bütün diğer alıcılara Kitaplık ile birlikte bu Lisans'ın bir kopyasını vermek şartı ile kopyalayabilir ve dağıtabilirsiniz. Kopyalamak fiili işlemi için bir ücret talep edebilir ve sizin seçiminize bağlı olarak ücret karşılığı garanti verebilirsiniz. -Kopyalamak fiili işlemi için bir ücret talep edebilir ve sizin seçiminize -bağlı olarak ücret karşılığı garanti verebilirsiniz. - -2. Kitaplığın kopyasını veya kopyalarını veya herhangi bir parçasını -değiştirerek Kitaplığı baz alan ürün elde edebilir, bu değişiklikleri -veya ürünün kendisini yukarıda 1. bölümdeki şartlar dahilinde ve aşağıda -sıralanan şartların yerine getirilmesi koşulu ile kopyalayabilir ve -dağıtabilirsiniz. +2. Kitaplığın kopyasını veya kopyalarını veya herhangi bir parçasını değiştirerek Kitaplığı baz alan ürün elde edebilir, bu değişiklikleri veya ürünün kendisini yukarıda 1. bölümdeki şartlar dahilinde ve aşağıda sıralanan şartların yerine getirilmesi koşulu ile kopyalayabilir ve dağıtabilirsiniz. a) Değiştirilen eser de bir yazılım kitaplığı olmalıdır. -b) Değiştirilen dosyaların görünür bir şekilde dosyaların sizin -tarafınızdan değiştirildiğine dair, tarihli bir bildirim içermesini -sağlamalısınız. +b) Değiştirilen dosyaların görünür bir şekilde dosyaların sizin tarafınızdan değiştirildiğine dair, tarihli bir bildirim içermesini sağlamalısınız. -c) Eserin bütününün bütün üçüncü şahıslara bu Lisans şartları altında -ücretsiz olarak ruhsatlanmasını sağlamalısınız. +c) Eserin bütününün bütün üçüncü şahıslara bu Lisans şartları altında ücretsiz olarak ruhsatlanmasını sağlamalısınız. -d) Eğer değiştirilmiş Kitaplıktaki bir özellik, bu özellik çağrıldığı -zaman verilecek bir argüman haricinde uygulama yazılımı tarafından -ağlanacak bir işlev ya da veri tablosuna başvuruda bulunuyor ise, -o zaman uygulama yazılımı böyle bir işlev ya da tablo sağlamasa dahi -özelliğin çalışır durumda kalacağı ve amacının anlamlı kalan parçası -her ne ise onu yerine getirmeye devam edeceğine dair iyi niyetli bir -uğraş vermelisiniz. +d) Eğer değiştirilmiş Kitaplıktaki bir özellik, bu özellik çağrıldığı zaman verilecek bir argüman haricinde uygulama yazılımı tarafından ağlanacak bir işlev ya da veri tablosuna başvuruda bulunuyor ise, o zaman uygulama yazılımı böyle bir işlev ya da tablo sağlamasa dahi özelliğin çalışır durumda kalacağı ve amacının anlamlı kalan parçası her ne ise onu yerine getirmeye devam edeceğine dair iyi niyetli bir uğraş vermelisiniz. -(Örneğin bir kitaplıkta karekök hesaplayan bir özellik uygulamadan -tamamen bağımsız olarak tanımlanabilen bir işleve sahiptir. Dolayısıyla -2d bölümü bu özellik tarafından kullanılan ve uygulama yazılımı -tarafından sağlanan herhangi bir işlev ya da tablonun seçime bağlı -olmasını şart koşar: Eğer uygulama bu işlev ya da veriyi sağlamaz ise, -karekök özelliği karekök hesaplayabilir olmalıdır.) +(Örneğin bir kitaplıkta karekök hesaplayan bir özellik uygulamadan tamamen bağımsız olarak tanımlanabilen bir işleve sahiptir. Dolayısıyla 2d bölümü bu özellik tarafından kullanılan ve uygulama yazılımı tarafından sağlanan herhangi bir işlev ya da tablonun seçime bağlı olmasını şart koşar: Eğer uygulama bu işlev ya da veriyi sağlamaz ise, karekök özelliği karekök hesaplayabilir olmalıdır.) Bu şartlar değiştirilmiş eserin tamamını kapsamaktadır. Eğer eserin tespit edilebilir kısımları Kitaplık'tan iştikak etmemiş ise ve makul surette kendi başlarına bağımsız ve ayrı eserler olarak kabul edilebilir ise, o zaman bu Lisans ve şartları, bu parçaları ayrı eser olarak dağıttığınız zaman bağlayıcı değildir. Fakat, aynı parçaları Kitaplığı baz alan bir ürün bütününün bir parçası olarak dağıttığınız zaman bütünün dağıtımı, diğer ruhsat sahiplerine verilen izinlerin bütüne ait olduğu ve parçalarına, yazarının kim olduğuna bakılmaksızın bütün parçalarına tek tek e müşterek olarak uygulandığı bu Lisans şartlarına uygun olmalıdır. -Bu şartlar değiştirilmiş eserin tamamını kapsamaktadır. Eğer eserin -tespit edilebilir kısımları Kitaplık'tan iştikak etmemiş ise ve makul -surette kendi başlarına bağımsız ve ayrı eserler olarak kabul edilebilir -ise, o zaman bu Lisans ve şartları, bu parçaları ayrı eser olarak -dağıttığınız zaman bağlayıcı değildir. Fakat, aynı parçaları Kitaplığı -baz alan bir ürün bütününün bir parçası olarak dağıttığınız zaman bütünün -dağıtımı, diğer ruhsat sahiplerine verilen izinlerin bütüne ait olduğu ve -parçalarına, yazarının kim olduğuna bakılmaksızın bütün parçalarına tek tek -e müşterek olarak uygulandığı bu Lisans şartlarına uygun olmalıdır. +Bu bölümün hedefi tamamen sizin tarafınızdan yazılan bir eser üzerinde hak iddia etmek veya sizin böyle bir eser üzerindeki haklarınıza muhalefet etmek değil, Kitaplığı baz alan, Kitaplık'tan iştikak etmiş veya müşterek olarak ortaya çıkarılmış eserlerin dağıtımını kontrol etme haklarını d üzenlemektir. -Bu bölümün hedefi tamamen sizin tarafınızdan yazılan bir eser üzerinde -hak iddia etmek veya sizin böyle bir eser üzerindeki haklarınıza muhalefet -etmek değil, Kitaplığı baz alan, Kitaplık'tan iştikak etmiş veya müşterek -olarak ortaya çıkarılmış eserlerin dağıtımını kontrol etme haklarını d -üzenlemektir. +Buna ek olarak, Kitaplığı baz almayan herhangi bir ürünün Kitaplık ile (veya Kitaplığı baz alan bir ürün ile) bir bilgi saklama ortamında veya bir dağıtım ortamında beraber tutulması diğer eseri bu Lisans kapsamına sokmaz. -Buna ek olarak, Kitaplığı baz almayan herhangi bir ürünün Kitaplık -ile (veya Kitaplığı baz alan bir ürün ile) bir bilgi saklama ortamında -veya bir dağıtım ortamında beraber tutulması diğer eseri bu Lisans -kapsamına sokmaz. +3. Kitaplığın herhangi bir kopyasına bu Lisans şartları yerine GNU Genel Kamu Lisansı şartlarını uygulamayı tercih edebilirsiniz. Bunu yapmak için bu Lisans'a yapılan her referansı GNU Genel Kamu Lisansı, 2. sürüm olarak değiştirmelisiniz. (Eğer GNU Genel Kamu Lisansı'nın 2. sürümden daha üst numaralı bir sürümü çıkmışsa, o sürüm numarasını belirtebilirsiniz. Bu bildirimlerde başka bir değişiklik yapmayınız. -3. Kitaplığın herhangi bir kopyasına bu Lisans şartları yerine GNU -Genel Kamu Lisansı şartlarını uygulamayı tercih edebilirsiniz. Bunu -yapmak için bu Lisans'a yapılan her referansı GNU Genel Kamu Lisansı, -2. sürüm olarak değiştirmelisiniz. (Eğer GNU Genel Kamu Lisansı'nın 2. -sürümden daha üst numaralı bir sürümü çıkmışsa, o sürüm numarasını -belirtebilirsiniz. Bu bildirimlerde başka bir değişiklik yapmayınız. +Bu değişiklik Kitaplığın herhangi bir kopyasına uygulandıktan sonra o kopya için geri dönülemez, dolayısıyla o kopyadan yapılan bütün kopyalar ve o kopyadan iştikak eden bütün eserler GNU Genel Kamu Lisansı altında lisanslanır. -Bu değişiklik Kitaplığın herhangi bir kopyasına uygulandıktan sonra -o kopya için geri dönülemez, dolayısıyla o kopyadan yapılan bütün -kopyalar ve o kopyadan iştikak eden bütün eserler GNU Genel Kamu -Lisansı altında lisanslanır. +Bu seçenek, Kitaplığın bazı kodlarını kitaplık olmayan bir yazılıma kopyalamak istediğiniz zaman faydalıdır. -Bu seçenek, Kitaplığın bazı kodlarını kitaplık olmayan bir yazılıma -kopyalamak istediğiniz zaman faydalıdır. +4. Kitaplığı ( veya 2. bölümde tanımlandığı hali ile onu baz alan bir ürünü) ara derlenmiş veya uygulama hali ile 1. ve 2. Bölüm'deki şartlar dahilinde ve yaygın olarak yazılım dağıtımında kullanılan bir ortam üzerinde, bilgisayar tarafından okunabilir ve 1. ve 2. Bölüm'deki şartlar dahilinde dağıtılabilir kaynak kodlarının tamamı ile birlikte kopyalayabilir ve dağıtabilirsiniz. -4. Kitaplığı ( veya 2. bölümde tanımlandığı hali ile onu baz -alan bir ürünü) ara derlenmiş veya uygulama hali ile 1. ve 2. Bölüm'deki - şartlar dahilinde ve yaygın olarak yazılım dağıtımında kullanılan bir - ortam üzerinde, bilgisayar tarafından okunabilir ve 1. ve 2. Bölüm'deki - şartlar dahilinde dağıtılabilir kaynak kodlarının tamamı ile birlikte - kopyalayabilir ve dağıtabilirsiniz. +Eğer ara derlenmiş nesne kodlarının dağıtımı belli bir yere erişim ve oradan kopyalama imkanı olarak yapılıyorsa, aynı yerden, aynı koşullar altında kaynak koduna erişim imkanı sağlamak, üçüncü şahısların ara derlenmiş nesne kodları ile birlikte kaynak kodunu kopyalama zorunlulukları olmasa bile kaynak kodunu dağıtmak olarak kabul edilmektedir. -Eğer ara derlenmiş nesne kodlarının dağıtımı belli bir yere erişim ve -oradan kopyalama imkanı olarak yapılıyorsa, aynı yerden, aynı koşullar -altında kaynak koduna erişim imkanı sağlamak, üçüncü şahısların ara -derlenmiş nesne kodları ile birlikte kaynak kodunu kopyalama zorunlulukları -olmasa bile kaynak kodunu dağıtmak olarak kabul edilmektedir. +5. Kitaplığın herhangi bir parçasından iştikak etmiş herhangi bir parça bulundurmayan fakat Kitaplık ile ona bağlanarak ve derlenerek çalışmak için tasarlanmış bir yazılım, "Kitaplığı kullanan eser" olarak tanımlanmaktadır. Tek başına böyle bir eser Kitaplık'tan iştikak eden bir eser değildir ve bu Lisans'ın kapsamı dahiline girmez. -5. Kitaplığın herhangi bir parçasından iştikak etmiş herhangi bir parça -bulundurmayan fakat Kitaplık ile ona bağlanarak ve derlenerek çalışmak için -tasarlanmış bir yazılım, "Kitaplığı kullanan eser" olarak tanımlanmaktadır. -Tek başına böyle bir eser Kitaplık'tan iştikak eden bir eser değildir ve bu -Lisans'ın kapsamı dahiline girmez. +Fakat, "Kitaplığı kullanan bir eser" ile Kitaplığı bağlama işlemi, Kitaplıktan iştikak eden bir uygulamayı vücuda getirir (çünkü Kitaplığın parçalarını içermektedir). Dolayısıyla derleme/bağlama işlemi sonucunda elde edilen uygulama bu Lisans kapsamındadır. 6. Bölüm bu kapsama giren uygulama yazılımlarının dağıtım koşullarını içermektedir. -Fakat, "Kitaplığı kullanan bir eser" ile Kitaplığı bağlama işlemi, Kitaplıktan -iştikak eden bir uygulamayı vücuda getirir (çünkü Kitaplığın parçalarını -içermektedir). Dolayısıyla derleme/bağlama işlemi sonucunda elde edilen -uygulama bu Lisans kapsamındadır. 6. Bölüm bu kapsama giren uygulama -yazılımlarının dağıtım koşullarını içermektedir. +"Kitaplığı kullanan bir eser", Kitaplığın parçası olan bir başlık (header) dosyasından materyal kullandığı zaman, eserin kaynak kodları Kitaplıktan iştikak eden bir eser olmamasına rağmen eserin nesne kodları Kitaplıktan iştikak eden bir eser olabilir. Bunun doğru olup olmadığı özellikle eserin kendisinin bir kitaplık olup olmadığına veya eserin Kitaplık olmaksızın bağlanıp bağlanamadığına göre değişebilir. Bu koşulun ne zaman geçerli olacağı kanun kapsamında açık ve seçik olarak tanımlanmamıştır. -"Kitaplığı kullanan bir eser", Kitaplığın parçası olan bir başlık (header) -dosyasından materyal kullandığı zaman, eserin kaynak kodları Kitaplıktan -iştikak eden bir eser olmamasına rağmen eserin nesne kodları Kitaplıktan -iştikak eden bir eser olabilir. Bunun doğru olup olmadığı özellikle eserin -kendisinin bir kitaplık olup olmadığına veya eserin Kitaplık olmaksızın -bağlanıp bağlanamadığına göre değişebilir. Bu koşulun ne zaman geçerli -olacağı kanun kapsamında açık ve seçik olarak tanımlanmamıştır. +Eğer böyle bir nesne dosyası yalnızca nümerik parametreler, veri yapısı şablonları ve erişim yolları ve küçük makro ve içerilmiş (inline) işlevler (10 satır veya daha az uzunlukta) içeriyorsa, o zaman hukuki olarak iştikak eden bir eser olup olmadığına bakılmaksızın nesne dosyasının kullanımı sınırlandırılmamıştır. (Bu nesne dosyasını ve Kitaplığın parçalarını içeren uygulama dosyaları 6. Bölümün kapsamına girmeye devam etmektedir). -Eğer böyle bir nesne dosyası yalnızca nümerik parametreler, veri yapısı -şablonları ve erişim yolları ve küçük makro ve içerilmiş (inline) işlevler -(10 satır veya daha az uzunlukta) içeriyorsa, o zaman hukuki olarak iştikak -eden bir eser olup olmadığına bakılmaksızın nesne dosyasının kullanımı -sınırlandırılmamıştır. (Bu nesne dosyasını ve Kitaplığın parçalarını içeren -uygulama dosyaları 6. Bölümün kapsamına girmeye devam etmektedir). +Eğer nesne dosyası, Kitaplıktan iştikak etmiş bir eser ise, eserin nesne kodlarını 6. Bölümdeki koşullar uyarınca dağıtabilirsiniz. Eseri içeren uygulama dosyaları da, Kitaplık ile direkt olarak bağlanıp bağlanmadıklarına bakılmaksızın 6. Bölüm kapsamına girer. 6. Yukarıdaki Bölümlere bir istisna olarak, "Kitaplığı kullanan bir eser" ile Kitaplığı bağlayarak Kitaplığı içeren bir eser oluşturabilir ve uygulayacağınız koşullar eseri müşterinin kendi kullanımı için değiştirmesine ve bu değişiklikleri test edebilmesine imkan tanımak için eserin geri çözümlenebilmesine imkan tanıdığı sürece, bu eseri istediğiniz koşullar altında dağıtabilirsiniz. -Eğer nesne dosyası, Kitaplıktan iştikak etmiş bir eser ise, eserin nesne -kodlarını 6. Bölümdeki koşullar uyarınca dağıtabilirsiniz. Eseri içeren -uygulama dosyaları da, Kitaplık ile direkt olarak bağlanıp bağlanmadıklarına -bakılmaksızın 6. Bölüm kapsamına girer. +Eserin her kopyası ile birlikte eserde Kitaplığın kullanıldığına ve kullanımıyla ilgili şart ve koşulların bu Lisans ile düzenlendiğine dair görünür ve belirgin bir bildirim vermelisiniz. Bu Lisans'ın bir kopyasını eserle birlikte vermelisiniz. Eğer eser çalışma esnasında telif hakkı bildirimleri gösteriyor ise, Kitaplık için telif hakkı bildirimini ve kullanıcıyı Lisans'ın kopyasına yönlendiren bir bildirimi de bu esnada göstermelisiniz. Ayrıca aşağıdaki koşullardan birini yerine getirmelisiniz: -6. Yukarıdaki Bölümlere bir istisna olarak, "Kitaplığı kullanan bir eser" -ile Kitaplığı bağlayarak Kitaplığı içeren bir eser oluşturabilir ve -uygulayacağınız koşullar eseri müşterinin kendi kullanımı için değiştirmesine -ve bu değişiklikleri test edebilmesine imkan tanımak için eserin geri -çözümlenebilmesine imkan tanıdığı sürece, bu eseri istediğiniz koşullar -altında dağıtabilirsiniz. +a) Eseri, Kitaplıkta eser için yapılan değişikliklerin tümünü (bu değişiklikler 1. ve 2. Bölüm kapsamında dağıtılmalıdır) içeren ve Kitaplığa ait ve bilgisayar tarafından okunabilir kaynak kodlarının tamamı ile; ve eğer eser Kitaplık ile bağlanmış bir uygulama ise, nesne kodları ve/veya kaynak kodları ile, kullanıcıların Kitaplık'ta değişiklikler yaptıktan sonra yeniden bağlama işlemi ile değiştirilmiş Kitaplığı kapsayan değiştirilmiş eser oluşturabilecekleri şekilde dağıtmalısınız. (Kitaplıktaki tanım dosyalarını değiştiren bir kullanıcının uygulamayı değiştirilmiş olan tanımları kullanabilecek şekilde yeniden derleyemeyebileceği anlaşılmakta ve kabul edilmektedir.) -Eserin her kopyası ile birlikte eserde Kitaplığın kullanıldığına ve kullanımıyla -ilgili şart ve koşulların bu Lisans ile düzenlendiğine dair görünür ve belirgin -bir bildirim vermelisiniz. Bu Lisans'ın bir kopyasını eserle birlikte vermelisiniz. -Eğer eser çalışma esnasında telif hakkı bildirimleri gösteriyor ise, Kitaplık için -telif hakkı bildirimini ve kullanıcıyı Lisans'ın kopyasına yönlendiren bir bildirimi -de bu esnada göstermelisiniz. Ayrıca aşağıdaki koşullardan birini yerine -getirmelisiniz: +b) Kitaplık ile bağlanmak için uygun bir paylaşımlı kitaplık mekanizması kullanılmalıdır. Uygun bir mekanizma, (1) Kitaplık işlevlerini uygulamanın içerisine kopyalamak yerine Kitaplığın kullanıcının bilgisayarında zaten mevcut olan bir kopyasını çalışma zamanında kullanan, ve (2) eserin oluşturulmasında kullanılan Kitaplık sürümü ile arayüz bakımından uyumlu olmak kaydıyla kullanıcı tarafından kurulan değiştirilmiş bir Kitaplıkla sorunsuz çalışabilen bir mekanizma olarak tanımlanmıştır. -a) Eseri, Kitaplıkta eser için yapılan değişikliklerin tümünü (bu değişiklikler -1. ve 2. Bölüm kapsamında dağıtılmalıdır) içeren ve Kitaplığa ait ve bilgisayar -tarafından okunabilir kaynak kodlarının tamamı ile; ve eğer eser Kitaplık ile -bağlanmış bir uygulama ise, nesne kodları ve/veya kaynak kodları ile, kullanıcıların -Kitaplık'ta değişiklikler yaptıktan sonra yeniden bağlama işlemi ile değiştirilmiş -Kitaplığı kapsayan değiştirilmiş eser oluşturabilecekleri şekilde dağıtmalısınız. -(Kitaplıktaki tanım dosyalarını değiştiren bir kullanıcının uygulamayı değiştirilmiş -olan tanımları kullanabilecek şekilde yeniden derleyemeyebileceği anlaşılmakta -ve kabul edilmektedir.) +c) Aynı kullanıcıya, fiziksel olarak dağıtımı gerçekleştirme masrafınızdan daha fazla ücret almayarak, yukarıda 6a Bölümünde belirlenen materyalleri vereceğinize dair en az üç yıl geçerli olacak yazılı bir taahhütname vermelisiniz. -b) Kitaplık ile bağlanmak için uygun bir paylaşımlı kitaplık mekanizması kullanılmalıdır. -Uygun bir mekanizma, (1) Kitaplık işlevlerini uygulamanın içerisine kopyalamak yerine -Kitaplığın kullanıcının bilgisayarında zaten mevcut olan bir kopyasını çalışma zamanında -kullanan, ve (2) eserin oluşturulmasında kullanılan Kitaplık sürümü ile arayüz bakımından -uyumlu olmak kaydıyla kullanıcı tarafından kurulan değiştirilmiş bir Kitaplıkla sorunsuz -çalışabilen bir mekanizma olarak tanımlanmıştır. +d)Eğer eserin dağıtımı belli bir yere erişim ve oradan kopyalama imkanı olarak yapılıyorsa, aynı yerden, aynı koşullar altında yukarıda belirtilen materyallere erişim imkanı sağlamalısınız. -c) Aynı kullanıcıya, fiziksel olarak dağıtımı gerçekleştirme masrafınızdan daha fazla -ücret almayarak, yukarıda 6a Bölümünde belirlenen materyalleri vereceğinize dair en az -üç yıl geçerli olacak yazılı bir taahhütname vermelisiniz. +e) Kullanıcının bu materyallerin bir kopyasını daha önce almış olduğunu veya bu kullanıcıya daha önce bir kopya vermiş olduğunuzu tevsik etmelisiniz. -d)Eğer eserin dağıtımı belli bir yere erişim ve oradan kopyalama imkanı olarak yapılıyorsa, -aynı yerden, aynı koşullar altında yukarıda belirtilen materyallere erişim imkanı -sağlamalısınız. +Uygulamalar için, "Kitaplığı kullanan eser"in kabul edilen biçemi uygulamayı tekrar oluşturmak için gereken bütün veri ve yardımcı yazılımları kapsamalıdır. Özel bir istisna olarak, eğer söz konusu bileşen uygulama ile birlikte dağıtılmıyor ise, genelde uygulamanın çalıştırıldığı işletim sisteminin ana parçaları (derleyici, çekirdek v.b.) ile birlikte dağıtılan (gerek kaynak kodu, gerek ikilik dosya biçeminde) herhangi bir bileşen bu kapsamın dışında tutulmuştur. -e) Kullanıcının bu materyallerin bir kopyasını daha önce almış olduğunu veya bu kullanıcıya -daha önce bir kopya vermiş olduğunuzu tevsik etmelisiniz. +Bu koşul, işletim sistemi ile birlikte dağıtılmayan bazı serbest olmayan kitaplıkların dağıtım koşulları ile çelişebilir. Böyle bir çelişki, dağıttığınız bir uygulamada hem bu serbest olmayan kitaplıkları hem de Kitaplığı beraber kullanamayacağınız manasına gelir. +7. Kitaplığı baz alan eser olan kitaplık özellikleri ile bu Lisans kapsamında olmayan başka kitaplık özelliklerini yan yana tek bir kitaplık içerisine koyabilir ve böyle elde edilen bileşik kitaplığı aşağıdaki iki koşulu yerine getirmek ve Kitaplığı baz alan eserin ve diğer kitaplığa ait özelliklerin tek başına dağıtılmasına izin verilmesi koşulu ile dağıtabilirsiniz. -Uygulamalar için, "Kitaplığı kullanan eser"in kabul edilen biçemi uygulamayı tekrar -oluşturmak için gereken bütün veri ve yardımcı yazılımları kapsamalıdır. Özel bir -istisna olarak, eğer söz konusu bileşen uygulama ile birlikte dağıtılmıyor ise, -genelde uygulamanın çalıştırıldığı işletim sisteminin ana parçaları (derleyici, -çekirdek v.b.) ile birlikte dağıtılan (gerek kaynak kodu, gerek ikilik dosya biçeminde) -herhangi bir bileşen bu kapsamın dışında tutulmuştur. +a) Bileşik kitaplığın yanısıra kitaplıkta içerilen Kitaplığı baz alan eserin diğer kitaplıkla birleştirilmemiş bir kopyasını dağıtmalısınız. Bu dağıtım işlemi yukarıdaki Bölümlere uygun olmalıdır. -Bu koşul, işletim sistemi ile birlikte dağıtılmayan bazı serbest olmayan -kitaplıkların dağıtım koşulları ile çelişebilir. Böyle bir çelişki, dağıttığınız -bir uygulamada hem bu serbest olmayan kitaplıkları hem de Kitaplığı beraber -kullanamayacağınız manasına gelir. +b) Bileşik kitaplık ile birlikte, bileşik kitaplığın bir parçasının Kitaplığı baz alan eser olduğuna dair görünür ve belirgin bir bildirim vermeli ve yanında dağıtılan eserin birleştirilmemiş halinin nasıl bulunacağını açıklamalısınız. -7. Kitaplığı baz alan eser olan kitaplık özellikleri ile bu Lisans kapsamında -olmayan başka kitaplık özelliklerini yan yana tek bir kitaplık içerisine koyabilir -ve böyle elde edilen bileşik kitaplığı aşağıdaki iki koşulu yerine getirmek ve -Kitaplığı baz alan eserin ve diğer kitaplığa ait özelliklerin tek başına dağıtılmasına -izin verilmesi koşulu ile dağıtabilirsiniz. +8. Kitaplığı bu Lisans'ta sarih olarak belirtilen şartlar haricinde kopyalayamaz, değiştiremez, ruhsat hakkını veremez ve dağıtamazsınız. Buna aykırı herhangi bir kopyalama, değiştirme, ruhsat hakkı verme, veya dağıtımda bulunma hükümsüzdür ve böyle bir teşebbüs halinde bu Lisans altındaki bütün haklarınız iptal edilir. Sizden, bu Lisans kapsamında kopya veya hak almış olan üçüncü şahıslar, Lisans şartlarına uygunluklarını devam ettirdikleri sürece, ruhsat haklarını muhafaza edeceklerdir. -a) Bileşik kitaplığın yanısıra kitaplıkta içerilen Kitaplığı baz alan eserin diğer -kitaplıkla birleştirilmemiş bir kopyasını dağıtmalısınız. Bu dağıtım işlemi yukarıdaki -Bölümlere uygun olmalıdır. +9. Bu Lisans sizin tarafınızdan imzalanmadığı için bu Lisans'ı kabul etmek zorunda değilsiniz. Fakat, size Kitaplığı veya onu baz alan ürünleri değiştirmek veya dağıtmak için izin veren başka bir belge yoktur. Eğer bu Lisans'ı kabul etmiyorsanız bu eylemler kanun tarafından sizin için yasaklanmıştır. Dolayısıyla, Kitaplığı (veya onu baz alan bir ürünü) değiştirmeniz veya dağıtmanız bu Lisans'ı ve Lisans'ın Kitaplığı veya ondan iştikak etmiş bütün eserleri kopyalamak, değiştirmek ve dağıtmak için getirdiği şart ve kayıtları kabul ettiğiniz manasına gelmektedir. -b) Bileşik kitaplık ile birlikte, bileşik kitaplığın bir parçasının Kitaplığı baz -alan eser olduğuna dair görünür ve belirgin bir bildirim vermeli ve yanında dağıtılan -eserin birleştirilmemiş halinin nasıl bulunacağını açıklamalısınız. +10. Kitaplığı (veya onu baz alan herhangi bir ürünü) yeniden dağıttığınız her defada alıcı, ilk ruhsat sahibinden otomatik olarak Kitaplığı bu şartlar ve kayıtlar dahilinde kopyalamak, değiştirmek ve dağıtmak için ruhsat almaktadır. Alıcının burada verilen hakları kullanmasına ek bir takım kısıtlamalar getiremezsiniz. Üçüncü şahısları bu Lisans mucibince hareket etmeğe mecbur etmek sizin sorumluluk ve yükümlülüğünüz altında değildir. -8. Kitaplığı bu Lisans'ta sarih olarak belirtilen şartlar haricinde kopyalayamaz, -değiştiremez, ruhsat hakkını veremez ve dağıtamazsınız. Buna aykırı herhangi bir kopyalama, -değiştirme, ruhsat hakkı verme, veya dağıtımda bulunma hükümsüzdür ve böyle bir teşebbüs -halinde bu Lisans altındaki bütün haklarınız iptal edilir. Sizden, bu Lisans kapsamında -kopya veya hak almış olan üçüncü şahıslar, Lisans şartlarına uygunluklarını devam -ettirdikleri sürece, ruhsat haklarını muhafaza edeceklerdir. +11. Eğer bir mahkeme kararı veya patent ihlal iddiası veya herhangi başka bir (patent meseleleri ile sınırlı olmayan) sebep sonucunda size, bu Lisans'ın şart ve kayıtlarına aykırı olan bir takım (mahkeme kararı, özel anlaşma veya başka bir şekilde) kısıtlamalar getirilirse, bu sizi bu Lisans şart ve kayıtlarına uyma mecburiyetinden serbest bırakmaz. Eğer aynı anda hem bu Lisans'ın şartlarını yerine getiren hem de diğer kısıtlamalara uygun olan bir şekilde Kitaplığı dağıtamıyorsanız, o zaman Kitaplığı dağıtamazsınız. Örneğin, eğer bir patent lisansı direkt veya endirekt olarak sizden kopya alacak olan üçüncü şahısların bedel ödemeksizin Kitaplığı dağıtmalarına hak tanımıyorsa o zaman sizin hem bu koşulu hem Lisans koşullarını yerine getirmenizin tek yolu Kitaplığı dağıtmamak olacaktır. -9. Bu Lisans sizin tarafınızdan imzalanmadığı için bu Lisans'ı kabul etmek -zorunda değilsiniz. Fakat, size Kitaplığı veya onu baz alan ürünleri -değiştirmek veya dağıtmak için izin veren başka bir belge yoktur. -Eğer bu Lisans'ı kabul etmiyorsanız bu eylemler kanun tarafından sizin -için yasaklanmıştır. Dolayısıyla, Kitaplığı (veya onu baz alan bir ürünü) -değiştirmeniz veya dağıtmanız bu Lisans'ı ve Lisans'ın Kitaplığı veya ondan -iştikak etmiş bütün eserleri kopyalamak, değiştirmek ve dağıtmak için getirdiği -şart ve kayıtları kabul ettiğiniz manasına gelmektedir. +Eğer bu bölümün herhangi bir parçası herhangi bir şart altında uygulanamaz veya hatalı bulunur ise o şartlar dahilinde bölümün geri kalan kısmı, bütün diğer şartlar altında da bölümün tamamı geçerlidir. -10. Kitaplığı (veya onu baz alan herhangi bir ürünü) yeniden dağıttığınız -her defada alıcı, ilk ruhsat sahibinden otomatik olarak Kitaplığı bu şartlar -ve kayıtlar dahilinde kopyalamak, değiştirmek ve dağıtmak için ruhsat -almaktadır. Alıcının burada verilen hakları kullanmasına ek bir takım -kısıtlamalar getiremezsiniz. Üçüncü şahısları bu Lisans mucibince hareket -etmeğe mecbur etmek sizin sorumluluk ve yükümlülüğünüz altında değildir. +Bu bölümün amacı sizin patent haklarını, herhangi bir mülkiyet hakkını ihlal etmenize yol açmak veya bu hakların geçerliliğine muhalefet etmenizi sağlamak değildir; bu bölümün bütün amacı kamu lisans uygulamaları ile oluşturulan serbest yazılım dağıtım sisteminin bütünlüğünü ve işlerliğini korumaktır. Bu sistemin tutarlı uygulanmasına dayanarak pek çok kişi bu sistemle dağıtılan geniş yelpazedeki yazılımlara katkıda bulunmuştur; yazılımını bu veya başka bir sistemle dağıtmak kararı yazara aittir, herhangi bir kullanıcı bu kararı veremez. -11. Eğer bir mahkeme kararı veya patent ihlal iddiası veya herhangi başka -bir (patent meseleleri ile sınırlı olmayan) sebep sonucunda size, bu Lisans'ın -şart ve kayıtlarına aykırı olan bir takım (mahkeme kararı, özel anlaşma veya -başka bir şekilde) kısıtlamalar getirilirse, bu sizi bu Lisans şart ve kayıtlarına -uyma mecburiyetinden serbest bırakmaz. Eğer aynı anda hem bu Lisans'ın şartlarını -yerine getiren hem de diğer kısıtlamalara uygun olan bir şekilde Kitaplığı -dağıtamıyorsanız, o zaman Kitaplığı dağıtamazsınız. Örneğin, eğer bir patent -lisansı direkt veya endirekt olarak sizden kopya alacak olan üçüncü şahısların -bedel ödemeksizin Kitaplığı dağıtmalarına hak tanımıyorsa o zaman sizin hem bu -koşulu hem Lisans koşullarını yerine getirmenizin tek yolu Kitaplığı dağıtmamak -olacaktır. +Bu bölüm Lisans'ın geri kalanının doğurduğu sonuçların ne olduğunu açıklığa kavuşturmak amacını gütmektedir. -Eğer bu bölümün herhangi bir parçası herhangi bir şart altında uygulanamaz -veya hatalı bulunur ise o şartlar dahilinde bölümün geri kalan kısmı, bütün -diğer şartlar altında da bölümün tamamı geçerlidir. +12. Eğer Kitaplığın kullanımı ve/veya dağıtımı bazı ülkelerde telif hakkı taşıyan arayüzler veya patentler yüzünden kısıtlanırsa, Kitaplığı bu Lisans kapsamına ilk koyan telif hakkı sahibi, Kitaplığın yalnızca bu ülkeler haricinde dağıtılabileceğine dair açık bir coğrafi dağıtım kısıtlaması koyabilir. Böyle bir durumda bu Lisans bu kısıtlamayı sanki Lisans'ın içerisine yazılmış gibi kapsar. -Bu bölümün amacı sizin patent haklarını, herhangi bir mülkiyet hakkını ihlal -etmenize yol açmak veya bu hakların geçerliliğine muhalefet etmenizi sağlamak -değildir; bu bölümün bütün amacı kamu lisans uygulamaları ile oluşturulan -serbest yazılım dağıtım sisteminin bütünlüğünü ve işlerliğini korumaktır. -Bu sistemin tutarlı uygulanmasına dayanarak pek çok kişi bu sistemle dağıtılan -geniş yelpazedeki yazılımlara katkıda bulunmuştur; yazılımını bu veya başka bir -sistemle dağıtmak kararı yazara aittir, herhangi bir kullanıcı bu kararı veremez. +13. Free Software Foundation zaman zaman Kısıtlı Genel Kamu Lisansı'nın yeni ve/veya değiştirilmiş biçimlerini yayınlayabilir. Böyle yeni sürümler mana olarak şimdiki haline benzer olacaktır, fakat doğacak yeni problemler veya kaygılara cevap verecek şekilde detayda farklılık arzedebilir. -Bu bölüm Lisans'ın geri kalanının doğurduğu sonuçların ne olduğunu açıklığa -kavuşturmak amacını gütmektedir. +Her yeni biçime ayırdedici bir sürüm numarası verilmektedir. Eğer Kitaplık bir sürüm numarası belirtiyor ve "bu ve bundan sonraki sürümler" altında dağıtılıyorsa, belirtilen sürüm veya Free Software Foundation tarafından yayınlanan herhangi sonraki bir sürümün şart ve kayıtlarına uymakta serbestsiniz. Eğer Kitaplık Lisans için bir sürüm numarası belirtmiyor ise, Free Software Foundation tarafından yayınlanmış olan herhangi bir sürümün şart ve kayıtlarına uymakta serbestsiniz. -12. Eğer Kitaplığın kullanımı ve/veya dağıtımı bazı ülkelerde telif hakkı -taşıyan arayüzler veya patentler yüzünden kısıtlanırsa, Kitaplığı bu Lisans -kapsamına ilk koyan telif hakkı sahibi, Kitaplığın yalnızca bu ülkeler haricinde -dağıtılabileceğine dair açık bir coğrafi dağıtım kısıtlaması koyabilir. Böyle bir -durumda bu Lisans bu kısıtlamayı sanki Lisans'ın içerisine yazılmış gibi kapsar. - -13. Free Software Foundation zaman zaman Kısıtlı Genel Kamu Lisansı'nın yeni -ve/veya değiştirilmiş biçimlerini yayınlayabilir. Böyle yeni sürümler mana -olarak şimdiki haline benzer olacaktır, fakat doğacak yeni problemler veya -kaygılara cevap verecek şekilde detayda farklılık arzedebilir. - -Her yeni biçime ayırdedici bir sürüm numarası verilmektedir. Eğer Kitaplık -bir sürüm numarası belirtiyor ve "bu ve bundan sonraki sürümler" altında -dağıtılıyorsa, belirtilen sürüm veya Free Software Foundation tarafından -yayınlanan herhangi sonraki bir sürümün şart ve kayıtlarına uymakta serbestsiniz. -Eğer Kitaplık Lisans için bir sürüm numarası belirtmiyor ise, Free Software -Foundation tarafından yayınlanmış olan herhangi bir sürümün şart ve kayıtlarına -uymakta serbestsiniz. - -14. Eğer bu Kitaplığın parçalarını dağıtım koşulları farklı olan başka -serbest yazılımların içerisinde kullanmak isterseniz, yazara sorarak izin isteyin. -Telif hakkı Free Software Foundation'a ait olan yazılımlar için Free Software -Foundation'a yazın, bazen istisnalar kabul edilmektedir. Kararımız, serbest -yazılımlarımızdan iştikak etmiş yazılımların serbest statülerini korumak ve -genel olarak yazılımların yeniden kullanılabilirliğini ve paylaşımını sağlamak -amaçları doğrultusunda şekillenecektir. +14. Eğer bu Kitaplığın parçalarını dağıtım koşulları farklı olan başka serbest yazılımların içerisinde kullanmak isterseniz, yazara sorarak izin isteyin. Telif hakkı Free Software Foundation'a ait olan yazılımlar için Free Software Foundation'a yazın, bazen istisnalar kabul edilmektedir. Kararımız, serbest yazılımlarımızdan iştikak etmiş yazılımların serbest statülerini korumak ve genel olarak yazılımların yeniden kullanılabilirliğini ve paylaşımını sağlamak amaçları doğrultusunda şekillenecektir. GARANTİ YOKTUR -15. BU KİTAPLIK ÜCRETSİZ OLARAK RUHSATLANDIĞI İÇİN, KİTAPLIK İÇİN İLGİLİ -KANUNLARIN İZİN VERDİĞİ ÖLÇÜDE HERHANGİ BİR GARANTİ VERİLMEMEKTEDİR. AKSİ YAZILI -OLARAK BELİRTİLMEDİĞİ MÜDDETÇE TELİF HAKKI SAHİPLERİ VE/VEYA BAŞKA ŞAHISLAR -KİTAPLIĞI "OLDUĞU GİBİ", AŞİKAR VEYA ZIMNEN, SATILABİLİRLİĞİ VEYA HERHANGİ -BİR AMACA UYGUNLUĞU DA DAHİL OLMAK ÜZERE HİÇBİR GARANTİ VERMEKSİZİN DAĞITMAKTADIRLAR. -KİTAPLIĞIN KALİTESİ VEYA PERFORMANSI İLE İLGİLİ TÜM SORUNLAR SİZE AİTTİR. KİTAPLIKTA - HERHANGİ BİR BOZUKLUKTAN DOLAYI DOĞABİLECEK OLAN BÜTÜN SERVİS, TAMİR VEYA DÜZELTME - MASRAFLARI SİZE AİTTİR. +15. BU KİTAPLIK ÜCRETSİZ OLARAK RUHSATLANDIĞI İÇİN, KİTAPLIK İÇİN İLGİLİ KANUNLARIN İZİN VERDİĞİ ÖLÇÜDE HERHANGİ BİR GARANTİ VERİLMEMEKTEDİR. AKSİ YAZILI OLARAK BELİRTİLMEDİĞİ MÜDDETÇE TELİF HAKKI SAHİPLERİ VE/VEYA BAŞKA ŞAHISLAR KİTAPLIĞI "OLDUĞU GİBİ", AŞİKAR VEYA ZIMNEN, SATILABİLİRLİĞİ VEYA HERHANGİ BİR AMACA UYGUNLUĞU DA DAHİL OLMAK ÜZERE HİÇBİR GARANTİ VERMEKSİZİN DAĞITMAKTADIRLAR. KİTAPLIĞIN KALİTESİ VEYA PERFORMANSI İLE İLGİLİ TÜM SORUNLAR SİZE AİTTİR. KİTAPLIKTA HERHANGİ BİR BOZUKLUKTAN DOLAYI DOĞABİLECEK OLAN BÜTÜN SERVİS, TAMİR VEYA DÜZELTME MASRAFLARI SİZE AİTTİR. -16. İLGİLİ KANUNUN İCBAR ETTİĞİ DURUMLAR VEYA YAZILI ANLAŞMA HARİCİNDE HERHANGİ -BİR ŞEKİLDE TELİF HAKKI SAHİBİ VEYA YUKARIDA İZİN VERİLDİĞİ ŞEKİLDE KİTAPLIĞI -DEĞİŞTİREN VEYA YENİDEN DAĞITAN HERHANGİ BİR KİŞİ, KİTAPLIĞIN KULLANIMI VEYA -KULLANILAMAMASI (VEYA VERİ KAYBI OLUŞMASI, VERİNİN YANLIŞ HALE GELMESİ, SİZİN -VEYA ÜÇÜNCÜ ŞAHISLARIN ZARARA UĞRAMASI VEYA KİTAPLIĞIN BAŞKA YAZILIMLARLA -BERABER ÇALIŞAMAMASI) YÜZÜNDEN OLUŞAN GENEL, ÖZEL, DOĞRUDAN YA DA DOLAYLI -HERHANGİ BİR ZARARDAN, BÖYLE BİR TAZMİNAT TALEBİ TELİF HAKKI SAHİBİ VEYA İLGİLİ -KİŞİYE BİLDİRİLMİŞ OLSA DAHİ, SORUMLU DEĞİLDİR. +16. İLGİLİ KANUNUN İCBAR ETTİĞİ DURUMLAR VEYA YAZILI ANLAŞMA HARİCİNDE HERHANGİ BİR ŞEKİLDE TELİF HAKKI SAHİBİ VEYA YUKARIDA İZİN VERİLDİĞİ ŞEKİLDE KİTAPLIĞI DEĞİŞTİREN VEYA YENİDEN DAĞITAN HERHANGİ BİR KİŞİ, KİTAPLIĞIN KULLANIMI VEYA KULLANILAMAMASI (VEYA VERİ KAYBI OLUŞMASI, VERİNİN YANLIŞ HALE GELMESİ, SİZİN VEYA ÜÇÜNCÜ ŞAHISLARIN ZARARA UĞRAMASI VEYA KİTAPLIĞIN BAŞKA YAZILIMLARLA BERABER ÇALIŞAMAMASI) YÜZÜNDEN OLUŞAN GENEL, ÖZEL, DOĞRUDAN YA DA DOLAYLI HERHANGİ BİR ZARARDAN, BÖYLE BİR TAZMİNAT TALEBİ TELİF HAKKI SAHİBİ VEYA İLGİLİ KİŞİYE BİLDİRİLMİŞ OLSA DAHİ, SORUMLU DEĞİLDİR. ŞART VE KAYITLARIN SONU diff --git a/modules/install/lang/vi.lang.php b/modules/install/lang/vi.lang.php index ee0ecce2b..182a7b5ed 100644 --- a/modules/install/lang/vi.lang.php +++ b/modules/install/lang/vi.lang.php @@ -13,463 +13,149 @@ GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. + Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] +[This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. + The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. + This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. + When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. + To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. + For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. + We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. + To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. + Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. + Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. + When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. + We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. + For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. + In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. + Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. + The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". + 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. + A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) + The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. + "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. + Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. + 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. + You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: + 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. + b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. + c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. + d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) + (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. +These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. +Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. +In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. + 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. + Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. + This option is useful when you wish to copy part of the code of the Library into a program that is not a library. - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. + 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. + If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. + 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. + However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. + When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) + If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. + Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. + 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: + You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) + a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. + b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. + c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. + d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. + e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. + For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. + It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: + 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. + a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. + b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. + 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. + 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. + 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. + 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. +If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. +It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. +This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. + 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. + 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. +Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. + 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + END OF TERMS AND CONDITIONS EndOfLicense; diff --git a/modules/install/lang/zh-TW.lang.php b/modules/install/lang/zh-TW.lang.php index f3135ff47..304ca8a71 100644 --- a/modules/install/lang/zh-TW.lang.php +++ b/modules/install/lang/zh-TW.lang.php @@ -10,463 +10,150 @@ GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. + Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] +[This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. + The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. + This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. + When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. + To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. + For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. + We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. + To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. + Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. + Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. + When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. + We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. + For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. + In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. + Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. + The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". + 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. + A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) + The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. + "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. + Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. + 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. + You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: + 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. + b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. + c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. + d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) + (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. +These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. +Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. +In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. + 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. + Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. + This option is useful when you wish to copy part of the code of the Library into a program that is not a library. - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. + 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. + If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. + 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. + However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. + When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) + If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. + Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. + 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: + You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) + a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. + b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. + c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. + d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. + e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. + For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. + It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: + 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. + a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. + b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. + 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. + 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. + 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. + 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. +If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. +It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. +This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. + 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. + 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. +Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. + 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS - EndOfLicense; $lang->install_condition_title = '確認安裝時必備的條件'; diff --git a/modules/install/tpl/admin_form.html b/modules/install/tpl/admin_form.html new file mode 100644 index 000000000..a3bd6001a --- /dev/null +++ b/modules/install/tpl/admin_form.html @@ -0,0 +1,31 @@ + + + +
    + + +
    + +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    +
    +

    {$lang->install_notandum}

    +
    +
    + +
    + +
    +
    + +
    +
    + diff --git a/modules/install/tpl/check_env.html b/modules/install/tpl/check_env.html index 4018e7b5e..aff29a8c4 100644 --- a/modules/install/tpl/check_env.html +++ b/modules/install/tpl/check_env.html @@ -1,31 +1,29 @@ - -

    {$lang->install_condition_title}

    - - -- - - - - - - -
    {$lang->install_checklist_title[$key]} - - {$lang->enable} - - {$lang->disable} -
    {$lang->install_checklist_desc[$key]} - -
    - - +
    + + +
    +
    + + + + + + + + + +
    {$lang->install_checklist_title[$key]}{$lang->enable}{$lang->disable}
    {$lang->install_checklist_desc[$key]}
    + +
    + +
    diff --git a/modules/install/tpl/config_form.html b/modules/install/tpl/config_form.html new file mode 100644 index 000000000..de5160141 --- /dev/null +++ b/modules/install/tpl/config_form.html @@ -0,0 +1,43 @@ + + + +
    + + +
    +
    +
      +
    • + checked="checked" type="checkbox" class="iCheck" id="rewrite" /> + {$lang->about_rewrite} +
    • +
    • +
      + +
      +
        + +
      • checked="checked" />
      • + +
      +
      +

      {$lang->about_time_zone}

      +
    • +
    +
    + +
    + +
    +
    +
    +
    + + + +
    +
    +
    + diff --git a/modules/install/tpl/css/install.css b/modules/install/tpl/css/install.css index 739ba1e0d..2302d3f48 100644 --- a/modules/install/tpl/css/install.css +++ b/modules/install/tpl/css/install.css @@ -1,48 +1,110 @@ @charset "utf-8"; /* NHN (developers@xpressengine.com) */ - -/* default.css - Type Selector Definition */ -body { background:#4d4d4d url(../images/installBg.gif) repeat-x;} - +/* Element Reset */ +html, body{margin:0} +body, input, textarea, select, table, button {font-family:Tahoma, Geneva, sans-serif;font-size:12px} +img, fieldset {border:0} +form, fieldset {margin:0;padding:0} +em, address {font-style:normal} +button{margin:0;padding:0;overflow:visible;cursor:pointer} +a {text-decoration:none} +a:hover, a:active, a:focus {text-decoration:underline} +/* Common Class */ +.iText{border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:transparent} +.iCheck, .iRadio{width:13px;height:13px;margin:0;padding:0;vertical-align:middle} +.hide{position:absolute;left:0;top:0;width:1px;height:1px;font-size:0;line-height:0;visibility:hidden} +/* Layout */ +html{height:100%;background:url(../img/bgHtml.gif) repeat-x 0 0} +#xei{width:800px;margin:0 auto;padding:120px 0 0 0} +#xei #header{position:relative;background:#444;margin:0 0 1px 0;padding:10px 20px;color:#fff} +#xei #header h1{margin:0} +#xei #header em{position:absolute;top:10px;right:20px;font-weight:bold;font-size:14px;color:#eee} +#xei #header em strong{font-size:20px;color:#F60} +#xei #body{width:580px;padding:0 0 0 220px;position:relative;overflow:hidden;*zoom:1} +#xei #body:after{content:"";display:block;clear:both} +#xei #body .dummy{position:absolute;left:0;top:287px;display:block;width:219px;height:1000px;background:#484848;*zoom:1} +#xei #progress{position:absolute;left:0;top:0;width:219px} +#xei #progress ul{list-style:none;margin:0;padding:0} +#xei #progress li{position:relative;margin:0 0 1px 0;vertical-align:top;line-height:40px;color:#999;text-indent:30px;background-color:#555;background-image:url(../img/icoStatus.gif);background-repeat:no-repeat;background-position:10px 0;*zoom:1} +#xei #progress li.done{background-position:10px -40px} +#xei #progress li.active{background-color:#666;background-position:10px -80px;font-weight:bold;color:#fff;margin-right:-1px} +#xei #content{position:relative;width:580px;min-height:328px;_height:328px;padding:20px 0 60px 0;background:#666} +/* Button */ +.btn, +.btn *{position:relative;margin:0;padding:0;display:inline-block;height:30px;line-height:30px;text-decoration:none !important;border:0;font-size:12px;font-family:Tahoma, Sans-serif;white-space:nowrap;background:url(../img/btnPack.gif) no-repeat;vertical-align:top;overflow:visible;color:#eee} +.btn {margin-right:4px;background-position:left -30px} +.btn *{left:4px;cursor:pointer;_cursor:hand;padding:0 10px 0 6px;background-position:right -30px} +.btn *:hover, +.btn *:active, +.btn *:focus{color:#ff0} +.btn.strong *{font-weight:bold !important} +.btn.icon *{padding-left:20px} +.btn.icon span{width:20px;margin-right:-18px;padding:0 !important} +.btn .check{background-position:4px -146px} +.btn .back{background-position:-14px -146px} +.btn .monitor{background-position:-37px -147px} +/* Button Area */ +.btnArea{position:absolute;bottom:0;right:0;width:540px;margin:0;padding:15px 20px;text-align:center;*zoom:1;color:#fff;border-top:1px solid #444;background:#555} +.btnArea:after{content:"";display:block;clear:both} +.btnArea .fLeft{float:left} +.btnArea .fRight{float:right} +.btnArea label{font-weight:bold} +.btnArea select{background:#666;color:#fff} +/* table */ +.table{margin:0 20px 20px 20px} +.table table{width:100%;border:0;border-top:1px solid #484848} +.table caption{padding:8px 0;font-weight:bold;text-align:left;color:#fff} +.table th, +.table td{border:0;padding:8px 15px;vertical-align:top;text-align:left} +.table th{color:#eee} +.table td{color:#eee} +.table td strong {color:#f60} +.table thead th{border-bottom:1px solid #484848;background:#f8f8f8} +.table tbody th{border-bottom:1px solid #484848;background:#555;white-space:nowrap} +.table tfoot th{border-bottom:1px solid #484848} +.table tbody td{border-bottom:1px solid #484848} +.table tfoot td{border-bottom:1px solid #484848;font-weight:bold;color:#333} +/* Select */ +.select{position:relative;line-height:normal;display:inline-block;*display:inline;vertical-align:middle;background:#555;text-align:left;*zoom:1} +.select *{margin:0;padding:0;cursor:pointer;font-size:12px;font-family:Tahoma, Sans-serif} +.select .myValue{position:relative;z-index:2;left:0;top:0;border:1px solid #999;color:#eee;line-height:19px;_line-height:normal;text-align:left;overflow:visible;background:transparent} +.select .myValue.selected{font-weight:bold} +.select.open .myValue, +.select .myValue.outLine{border:1px solid #ccc} +.select button.myValue{height:21px;width:100%;text-indent:5px;*text-indent:0;*padding-left:5px} +.select div.myValue{height:19px;text-indent:8px} +.select .ctrl{position:absolute;top:0;right:0;width:18px;height:19px;border:1px solid #999;border-left:1px solid #999;background:#444} +.select .arrow{position:absolute;width:0;height:0;top:9px;right:6px;line-height:0;font-size:0;border-top:3px solid #999;border-left:3px solid #444;border-right:3px solid #444} +.select ul{position:absolute;top:20px;left:0;width:100%;list-style:none;border:0;border-top:1px solid #bababa;border-bottom:1px solid #bababa;background:#fff;overflow:hidden} +.select ul.aList{display:none} +.select.open ul.aList{display:block} +.select ul.iList{left:-2000%} +.select.open ul.iList{left:0} +.select li{position:relative;overflow:hidden;white-space:nowrap;height:18px;margin:0 !important;border-left:1px solid #bababa;border-right:1px solid #bababa} +.select li input.option{position:absolute;width:100%;height:20px;line-height:20px} +.select li label{position:absolute;left:0;top:0;width:100%;text-indent:8px;*text-indent:6px;height:18px;line-height:18px;color:#eee;background:#555;font-weight:normal !important} +.select li a{display:block;text-indent:8px;*text-indent:6px;height:18px;line-height:18px;color:#eee;background:#555;text-decoration:none !important} +.select li.hover *{background:#444;color:#fff} +.selectGo{border:1px solid #bababa;height:21px;width:28px;padding:0;*margin:-1px 0 -1px 4px;overflow:visible;background:#eee;vertical-align:middle;cursor:pointer;font:bold 11px Tahoma;line-height:19px;_line-height:normal;color:#767676} /* Content */ -#box { position:relative; left:50%; margin:120px 0 0 -380px; width:750px;} -#box h1 { margin:0; } +.h2{font-size:18px;margin:0 20px 15px 20px;color:#ff9} +.item{position:relative} +.iLabel{display:block;position:static;top:4px;left:5px;color:#eee} +.iText{position:relative;padding:3px 4px;border:1px solid #444;border-right-color:#555;border-bottom-color:#555;background:transparent;color:#fff} +.agreement{padding:0;margin:0 20px 20px 20px;overflow:auto;height:300px;font-family:Tahoma, Geneva, sans-serif;color:#fff} +.form{padding:0;margin:0 20px 20px 20px;list-style:none} +.form li{margin:0 0 10px 0} +.form.formFtp label, +.form.formDbInfo label, +.form.formAdmin label{display:block;margin:0 0 2px 0;color:#eee;font-weight:bold} +.form.formDbSelect label, +.form.formXe label{margin:0 0 2px 0;color:#eee;font-weight:bold} +.form .iText{background:#555;padding:5px 10px;width:518px} +.form select{background:#555;color:#fff} +.form p{color:#ccc;margin:3px 0 15px 17px} +.form strong{color:#f60} +.form em{font-style:normal;color:#ffc} +.desc{padding:10px 20px;margin:0 20px 20px 20px;background:#555;color:#eee} +.desc ul{margin:0 0 0 20px;padding:0} +.desc strong{color:#F60} -#content { position:relative; padding:25px 20px 20px 20px; overflow:hidden; background:#ffffff;} -#content h2 { font-size:1em; padding-left:.5em; margin:0 0 1em 0;} -#content blockquote { padding:10px; margin:0; border:1px solid #c9c9c9; margin-bottom:10px; color:#696969; line-height:20px;} -#agreement { border:1px solid #c9c9c9; height:15em; padding:1.2em; overflow:auto; color:#696969; line-height:1.25em; margin-bottom:20px;} - -.iePngFix { display:block; } - -div.buttonCenter { text-align:center; } - -.tableType6 { border:2px solid #c1c0bd; border-left:none; border-right:none; width:100%; margin-bottom:20px;} -#content .tableType6 th { border-top:1px solid #fbfbfb; border-bottom:1px solid #e4e4e4; background:#f5f5f5; padding:10px 10px 10px 2em; font-weight:normal; text-align:left; color:#606060;} -#content .tableType6 td { border-bottom:1px solid #ededed; padding:10px 10px 7px 10px; color:#7b7972; line-height:1.25em;} -#content .tableType6 input, -#content .tableType6 textarea, -#content .tableType6 select { vertical-align:middle;} -#content .tableType6 td .w100 { width:100%; display:block;} -#content .tableType6 td .checkbox { margin:-3px;} -#content .tableType6 td p { line-height:1.4em;} -#content .tableType6 .borderBottomNone { border-bottom:none;} -#content .tableType6 .none { color:#c95b53;} - -#content .tableType7 { border:2px solid #c1c0bd; border-left:none; border-right:none; width:100%; margin-bottom:20px;} -#content .tableType7 th { border-bottom:1px solid #e4e4e4; background:#e8e8e8; padding:10px 10px 10px 2em; font-weight:normal; text-align:left; color:#606060;} -#content .tableType7 th.second { background:#f5f5f5;} -#content .tableType7 td { border-bottom:1px solid #ededed; padding:10px 10px 7px 10px; color:#7b7972; line-height:1.25em; font-size:.9em;} -#content .tableType7 .hr { border-bottom:1px solid #b8b8b8;} -#content .tableType7 input, -#content .tableType7 textarea, -#content .tableType7 select { vertical-align:middle;} -#content .tableType7 select { width:100%; } -#content .tableType7 select option { letter-spacing:-1px; } -#content .tableType7 td .w100 { width:100%; display:block;} -#content .tableType7 td .checkbox { margin:-3px;} -#content .tableType7 td p { line-height:1.4em; margin:5px 0 0 0; padding:0;} -#content .tableType7 .borderBottomNone { border-bottom:none;} -#content .tableType7 .none { color:#c95b53;} - -a.manual { background:url("../images/iconManual.gif") no-repeat left top; vertical-align:middle; display:inline-block; width:12px; height:13px; overflow:hidden; line-height:0; font-size:1px; text-decoration:none;} diff --git a/modules/install/tpl/filter/admin.xml b/modules/install/tpl/filter/admin.xml new file mode 100644 index 000000000..077d98cba --- /dev/null +++ b/modules/install/tpl/filter/admin.xml @@ -0,0 +1,22 @@ + +
    + + + + + + + + + + + + + + + + + + + +
    diff --git a/modules/install/tpl/filter/config.xml b/modules/install/tpl/filter/config.xml new file mode 100644 index 000000000..54ec1139d --- /dev/null +++ b/modules/install/tpl/filter/config.xml @@ -0,0 +1,13 @@ + +
    + + + + + + + + + + +
    diff --git a/modules/install/tpl/filter/cubrid.xml b/modules/install/tpl/filter/cubrid.xml index 60d044457..d4d50003c 100644 --- a/modules/install/tpl/filter/cubrid.xml +++ b/modules/install/tpl/filter/cubrid.xml @@ -1,4 +1,4 @@ - +
    @@ -7,12 +7,6 @@ - - - - - - @@ -22,17 +16,9 @@ - - - - - - - - + -
    diff --git a/modules/install/tpl/filter/firebird.xml b/modules/install/tpl/filter/firebird.xml index 60d044457..d4d50003c 100644 --- a/modules/install/tpl/filter/firebird.xml +++ b/modules/install/tpl/filter/firebird.xml @@ -1,4 +1,4 @@ - +
    @@ -7,12 +7,6 @@ - - - - - - @@ -22,17 +16,9 @@ - - - - - - - - + -
    diff --git a/modules/install/tpl/filter/mssql.xml b/modules/install/tpl/filter/mssql.xml index b79b23c0b..5a97ffc06 100644 --- a/modules/install/tpl/filter/mssql.xml +++ b/modules/install/tpl/filter/mssql.xml @@ -1,16 +1,10 @@ - +
    - - - - - - @@ -20,17 +14,9 @@ - - - - - - - -
    diff --git a/modules/install/tpl/filter/mysql.xml b/modules/install/tpl/filter/mysql.xml index 60d044457..d4d50003c 100644 --- a/modules/install/tpl/filter/mysql.xml +++ b/modules/install/tpl/filter/mysql.xml @@ -1,4 +1,4 @@ - +
    @@ -7,12 +7,6 @@ - - - - - - @@ -22,17 +16,9 @@ - - - - - - - - + -
    diff --git a/modules/install/tpl/filter/postgresql.xml b/modules/install/tpl/filter/postgresql.xml index 402d8d30a..69e98a9fb 100644 --- a/modules/install/tpl/filter/postgresql.xml +++ b/modules/install/tpl/filter/postgresql.xml @@ -1,4 +1,4 @@ - +
    @@ -6,12 +6,6 @@ - - - - - - @@ -21,17 +15,9 @@ - - - - - - - - + -
    diff --git a/modules/install/tpl/filter/sqlite2.xml b/modules/install/tpl/filter/sqlite2.xml index 98ed92367..fb61e6538 100644 --- a/modules/install/tpl/filter/sqlite2.xml +++ b/modules/install/tpl/filter/sqlite2.xml @@ -1,30 +1,16 @@ - +
    - - - - - - - - - - - - - - + -
    diff --git a/modules/install/tpl/footer.html b/modules/install/tpl/footer.html index fa75930e5..07f966df1 100644 --- a/modules/install/tpl/footer.html +++ b/modules/install/tpl/footer.html @@ -1,3 +1,3 @@ -
    - + + diff --git a/modules/install/tpl/form.cubrid.html b/modules/install/tpl/form.cubrid.html index 2743b70e1..cb6635ab2 100644 --- a/modules/install/tpl/form.cubrid.html +++ b/modules/install/tpl/form.cubrid.html @@ -1,49 +1,31 @@ - -
    - - -

    {$lang->form_title}

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

    {$db_type}

    +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    +
    {$lang->db_info_desc}
    +
    + +
    + +
    +
    +
    +
    +
    diff --git a/modules/install/tpl/form.firebird.html b/modules/install/tpl/form.firebird.html index 66889cf70..cc24116c2 100644 --- a/modules/install/tpl/form.firebird.html +++ b/modules/install/tpl/form.firebird.html @@ -1,51 +1,31 @@ - -
    - - -

    {$lang->form_title}

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

    {$db_type}

    +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    +
    {$lang->db_info_desc}
    +
    + +
    + +
    +
    +
    +
    +
    diff --git a/modules/install/tpl/form.mssql.html b/modules/install/tpl/form.mssql.html index 089cae04f..51f3a770b 100644 --- a/modules/install/tpl/form.mssql.html +++ b/modules/install/tpl/form.mssql.html @@ -1,51 +1,31 @@ - -
    - - -

    {$lang->form_title}

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

    {$db_type}

    +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    +
    {$lang->db_info_desc}
    +
    + +
    + +
    +
    +
    +
    +
    diff --git a/modules/install/tpl/form.mysql.html b/modules/install/tpl/form.mysql.html index 3a3c8187b..9fe5d85fa 100644 --- a/modules/install/tpl/form.mysql.html +++ b/modules/install/tpl/form.mysql.html @@ -1,51 +1,31 @@ - -
    - - -

    {$lang->form_title}

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

    {$db_type}

    +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    +
    {$lang->db_info_desc}
    +
    + +
    + +
    +
    +
    +
    +
    diff --git a/modules/install/tpl/form.mysql_innodb.html b/modules/install/tpl/form.mysql_innodb.html index 3a3c8187b..9fe5d85fa 100644 --- a/modules/install/tpl/form.mysql_innodb.html +++ b/modules/install/tpl/form.mysql_innodb.html @@ -1,51 +1,31 @@ - -
    - - -

    {$lang->form_title}

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

    {$db_type}

    +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    +
    {$lang->db_info_desc}
    +
    + +
    + +
    +
    +
    +
    +
    diff --git a/modules/install/tpl/form.mysqli.html b/modules/install/tpl/form.mysqli.html index 3a3c8187b..9fe5d85fa 100644 --- a/modules/install/tpl/form.mysqli.html +++ b/modules/install/tpl/form.mysqli.html @@ -1,51 +1,31 @@ - -
    - - -

    {$lang->form_title}

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

    {$db_type}

    +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    +
    {$lang->db_info_desc}
    +
    + +
    + +
    +
    +
    +
    +
    diff --git a/modules/install/tpl/form.postgresql.html b/modules/install/tpl/form.postgresql.html index c60a9606e..41726c27b 100644 --- a/modules/install/tpl/form.postgresql.html +++ b/modules/install/tpl/form.postgresql.html @@ -1,51 +1,31 @@ - -
    - - -

    {$lang->form_title}

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

    {$db_type}

    +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    +
    {$lang->db_info_desc}
    +
    + +
    + +
    +
    +
    +
    +
    diff --git a/modules/install/tpl/form.sqlite2.html b/modules/install/tpl/form.sqlite2.html index 7492dfc09..e958754ef 100644 --- a/modules/install/tpl/form.sqlite2.html +++ b/modules/install/tpl/form.sqlite2.html @@ -1,38 +1,27 @@ - -
    - - -

    {$lang->form_title}

    - - - - - - - - - - - - - - - - - - -
    {$db_type} - -

    {$lang->about_database_file}

    -
    - -
    - -
    - -
    - +
    + + +
    +
    + +

    {$db_type}

    +
      +
    • {$lang->about_database_file}

    • +
    • +
    +
    {$lang->db_info_desc}
    +
    + +
    + +
    +
    +
    +
    +
    diff --git a/modules/install/tpl/form.sqlite3_pdo.html b/modules/install/tpl/form.sqlite3_pdo.html index 08f43593a..e958754ef 100644 --- a/modules/install/tpl/form.sqlite3_pdo.html +++ b/modules/install/tpl/form.sqlite3_pdo.html @@ -1,38 +1,27 @@ - -
    - - -

    {$lang->form_title}

    - - - - - - - - - - - - - - - - - - -
    {$db_type} - -

    {$lang->about_database_file}

    -
    - -
    - -
    - -
    - +
    + + +
    +
    + +

    {$db_type}

    +
      +
    • {$lang->about_database_file}

    • +
    • +
    +
    {$lang->db_info_desc}
    +
    + +
    + +
    +
    +
    +
    +
    diff --git a/modules/install/tpl/ftp.html b/modules/install/tpl/ftp.html index b25cb2519..beecc3728 100644 --- a/modules/install/tpl/ftp.html +++ b/modules/install/tpl/ftp.html @@ -1,56 +1,42 @@ +
    + + -
    - -

    {$lang->ftp_form_title}

    - -
    {$lang->msg_safe_mode_ftp_needed}
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {$lang->msg_ftp_installed_ftp_realpath}

    {$lang->msg_ftp_installed_realpath}:
    {_XE_PATH_}
    - -
    -
    - -
    -
    - -
    - - - -
    - -
    - +
    +
    +
      +
    • +
    • +
    • +
    • +
    • +

      {$lang->msg_ftp_installed_realpath}:
      {_XE_PATH_}

      + +
        +
      +
    • +
    +
    +

    FTP 정보를 등록하는 이유.

    +
      +
    • {$lang->msg_safe_mode_ftp_needed}
    • +
    • {$lang->msg_safe_mode_ftp_needed2}
    • +
    +

    {$lang->msg_safe_mode_ftp_config}

    +
    +
    + +
    + + + +
    +
    +
    +
    +
    diff --git a/modules/install/tpl/header.html b/modules/install/tpl/header.html index 6dfb5a0a9..ac09b51aa 100644 --- a/modules/install/tpl/header.html +++ b/modules/install/tpl/header.html @@ -1,4 +1,6 @@ -
    -

    XE Install

    -
    +
    + diff --git a/modules/install/tpl/img/bgHtml.gif b/modules/install/tpl/img/bgHtml.gif new file mode 100644 index 0000000000000000000000000000000000000000..ab428a0481fcb1ac22a30e1314f31a5b3e8a13f1 GIT binary patch literal 2997 zcmV;m3rh4yNk%w1VFUoU3+4a-8X6iRA|eb73@R!r2nYxS1Oy-;ASWj$0RaIV92_Mj zB{w%WE-o$}9v)FqQ4kOiNJvOOKR+EE9dvYb6B82>5)yrVePd%|Yiny-T3RF|Bo-DH zEiEk=7#K7(G=_$TC@3f|FE27OGAt}CFfcGaK0Y`&I7352N=iySJv}-)Ix#UZH8nL{ zTwFmxK~+^%OiWBmOG`jNKt@JJHa0dyL_{+)GdnvwJUl!(IXPKbSw}}lh=_=bi;GxT zSb~Crg@uJ;Vq$-Pe|ma)R8&-KY;1RTcWrHLS65eQX=zPOO>uE?WMpJrU0q&YUTA1& zVPRoVP*77-Q&Lh=Pft%}Wo1Q0MS+2VLPA1nYHEXngLZayUteE)dwY3#d1hv2ii(PS ze0+0rbAEn)a&mHngoI8`PHt{)TU%R6NlAx?hlz=aR#sMUaByH?V2_WFXJ=<`Z*O>b zcy)DkfPjFGj*gR)laP>*l9G~^mX?*3m6Vi}n3$N2jg6O=myC>zA^8LV00000EC2ui z00aQI3jhcIfB*mp2!e!!hJ}KIiieGgiHV4eiudJ)9s;;fJuC=wZxv``Y5~jeg!v(;_#lpeH$I7Mz1Pu+)($dt^(9zh{+t}C8 z2H^(aH<@>iU-whi^C?0`WG2+II6EBARcmoFxh%aBx zjQR0q%bF20V9=p-htZ`+qdraA^lH_uSEr7xdUk0+AwuBJts6k@O22*c7DR$XrQ*bk z8wY@VQS;&}RtSn-i8_Gj)~%BgA!0lC?g_Zx5+D9MDH}G9Nk9(_J^S_PkD-_5p}q(D z_p8;%zrR8Ma4fI@V1NP|5TG~)78oE6G=#$-f)5(NV1yCgv%mrtUWj1;7Y@`RhZ<(+ z;f5NLxZyn}n1Eu6Dh80^Krgz;;ypR!0FnkZc2r}IINGSeN-C%TWROBC5adip8mYqn z4L1nIBvVfwz+{wB3WWm>R$hta0ar5BC6_p)kb+iXl2s-MVxD=XStXRfW}9vf(575- z%2`4L5txOiTzd|HXPXvP7hmr;u8rIl(% z>1bGliUp{nsun7#C!CO5s=S53s;jB03Ttk~)lfsNw%$sDt;+4HtF2a85nZs@tw5}? z!3w*=3^RNu0<+vP3+=Pbe#b0&J7l{9w%fXwEw>OrP+z$Ac|fkY;fjlHeF28sZo2Oh z$U?XbreSXy_2N6Bz4@Ym!iD~p81MrA4m@y*F~opy!U~&^FpCbyP$LW!!!WV`#XC}b zvBo(lp#+gCcpRk1B8U9(k~f%P29qkQ%<{@ps(d9CG*dCN&05lYa}-gC$#a@1{2VmT zJ*VJ+18|mbbel&ntu)eb9*t+y4oqG3pHfF~^b}Jl%Jrf$d>uB|UCSVa6q>qlHl=5; ztv1>&gh~Vva?edS7ITY=Hxa46;P(rC10Jj2ffIfL8*JoS1LC$K&iLYq*AOfcNK8(7 z%-?hcpkd6pNp=84%wcr?GCE5emd$qWRO9+5Xc^`?6%iFI|TO1-aGEU z+v_hHXbew$@hA{qaPnv*+`{uMI3GR3&r4r@3{5mqF$~#LoPGD)YY&6}$4)pwe);Ar zQ9jA)JE1Zc@N@CL{4K*zvm5xkaligGUZ1MuZi%5QQluLKUj;w-?ON zZ!^514QcoS#C_olKKvmN+3-WeQ4S7pI3g00hy)~Fu8DB?+!Lnw1SwV#bW^lq5|VJb zExt|%UIgP7xu}CIWC3>>Fr)0usKzv&F$2WI00!bH$2p=wj>LPO9Q9a7K0>bra?D;4 z23Z6_7V>+8G~^MEP`*W?&k2r%B?N7mOEQq5g1!V{FfZUsF^B<$#)KgglDSM{ z9+L?Zm_QDz5X~7zvzpYDW)*%IO>SP(n?n3TG?6%ma?XLA=Uierr?`c7Zh@Weq+&ba zX#^u|v7Td00zUOwPkSao4su{)7658SfD$wdUhqO4F_2I>CbXdpRVW4qIfNllw4xR* zLPZIw(IG6d3n1;nM@2eGkd8DAVX!1hIeCVawloYDuz)CITFN-k)TS|&DNbG4hM2B0 zrxsY{7{+kRB@ES;Lp`cdiMj+|3PA`?eJWJR@Kj$$)tGeu$SNJMx>aXpHJVol>lMH{ z)@z29tUvfcIn!#+Ik45OX;teSw4eodZh@}tq$^&xP=+$}(+GX7XI}#gSic$ppg;fu zViT)aIV9Ggjs-$OKS0?JOxCgwrEEnj`+?1N7NeRS0%g^p29T0Aq+K{|YSq949-y?f zD1EJK!_ZpThG7kB04i={ird{%sE57N6{^PcwyZ+L@VwGdyr#<#xom9G~1 z8ejh2*S~#D>>chP-~kgD2m@v;g6}|C12gyo1Lo}ifJuvo3gdyo7bdM5DvV(}*rBx^ zt}PEjJYo-jmoE!LZyst?(&thEM+cl*~?^RGL^0T zFnnc1A?Ex$R=Zgw)9$1LYN^EuCAZnK*8jORfIy3S!f^Pdf^XhGYV(2IWb zq5BMJM<<%jl%6!88;$5W@7dCxF0`aMooP~U8q=r#bf^6cYF4kh(y!JuqftF;RhOF9 zqsH~6ZJlaS@7mX)j`XjE9qd-a`qsRzHLzX(jqGI~yVt~KHnfc`>s%+>+Rm=_u&Hfo zWk>tj-sZNhiyiB3WBc3MCU>*ZZSHNCd)(3v_q(s{?sbcs-s+zAytCcze9PP3`(`)1 z!F}#~^Lyawj(5QWZg7F)TjBNAH^3(@@rwW3;tQwv#W$XDj7OZ~AMZHG{Vnp6hy3Iu zM>)h(&hnMJoZu>ldCO(~@`Tg;<~GlHziYm8ocCPk2>-dzgHH5^`@HA}H#*RjK6Iud z-Qh`(I@G7$@TxQX>KZrs%$F{8t7kptT&FtLJ-+p(cYW+5=lRpUPIk3B{q1M}dfC^G zcCEWT?rlFh+{G^UyYoHoVP|{V^^W)d!3VzXU^n~U4X=2?+nw->fBfP54td8Xp6-;N zJm4FT__^=h@}4ie1 z1sH$^D1i87JBWilsDlXjgF;AmfdBwIwY!uF literal 0 HcmV?d00001 diff --git a/modules/install/tpl/img/btnPack.gif b/modules/install/tpl/img/btnPack.gif new file mode 100644 index 0000000000000000000000000000000000000000..ff30e37b0eca0e2ebc789b257e693be6ee33311d GIT binary patch literal 2951 zcmV;23wZQLNk%w1VORpR0Oo%HX0q;8RaHf2NF!X6Fnl;Wg1IMZqZzj-+S=MgL_{uf zsy2JH&CSgg#wU8l_93_VRNQ4t(_B-e*%Wgd<>lpEHPeDOJ zN=iybMn+eg(N0cI$H&J?ioR1*Q=gxoKtMpOtgJ+j%RGg_-rn9jJ3By<&*9gti*{Z59n6JHfXkHu%F)>5F>JAScOsoxTy9d5hsD9kxQf3ZP@yEeQ=L5RCeiMKMN z<1Mv5HO533n41ejE#jIgeh3pPT*wgLz=sec zN|acz-kysXGiuz(v7^V2AVZ2ANwTELlPFWFT*-3f#FsE*%9M6dPl+gcTI$@%v!~CW zK!XYuIkTwIqe%bMjFMoe)2C3QN}W12snx4k{b5Ydl&aUSV8e=qnzgLivotSq-Q%aN z+qZE4(BTJr4xiVhFm@^kv zoM46J&!9t#9!;9G=F_N?x?S<4wCmTfW6Ktuy0-0?Zl7S8&AYen-@x169!?yfTP!Ss zD__pM`QYNvqpx$zA~~Py*t2Wj&b_<$@8H9WA5Xr#`Sa-0t6$H4z4Z6+rCs+^-B0`b z`19-E&%eL_|Ki0b;DD>l#{vrW0jS`D3^wTCgAEcW;e?{hhXR5SW~kwY9CpYcg&=}x zAqsr-Vd9A>rl{hIEVk(4i!jD0;YfhO{SLKlAUXylPdCaL8A zl1w(~WQ;#X37?66biqOZ9%iZKmRxqphm>GKcU=HiqR_;dXr`&=nryb|=9_TFDd(JY z)@kRRc;>0+o_y{Z=AXBni9!H>`m}aW!rkeul zDQbs)D(a}DmTKy$sHUpws;su^>Z`EED(kGY)@tjmxaO+suDtdNN*@87;KZ=R7HjOW z$R?}ovdlK??6c5DEA6z@R%`9G*jDT7wyT^FKp%ykzyTi(m22*~=%UN*x~K5L!3lW; zfJ?gc)@$#*;;^glDBJ|#gdg|@Ebzbt>$2~`pXB1l6jK!J@WT)Fx|(Lb}R*b-12?ex=7$CmWEZb8v>)L3V&HDptBTlLjjhb{Klc6GgN)g_Rv_S$5d z?W1?f2h)=gsThQOFJW;fN;=q2RmD7ey2$J}LR+lvi%~ z<&`t8YmiJuj``=Hhc5c)l53u8kX(6A`s%E=?t1H{&Gwu{PfpvX#27rn!pm@+VB7W01Tj}@E5B*0BZ>xNPrcXFuVpj@PVTv zAgq{Rg#>Wm4;+9(0-nIZ4tnr|APk`hM@YgFn(%}uOrZ)_$if!7@P#mpp$jGWssupc zf}F?$6L!eM9{TWyKn$V~he*UC8u5roOrjE($iyZ(@rh7$A`M-|ggi{~idf8|7PrX7 zE_(5cU<{)e$4JI9f(Tf`%9a|}$i_Ch@r`hdqa2rI#xQvcTzL=|xgy5LKKc$#^*-Uk;6J$V}$Zh$$h( zd|(O6jHWc1!%PCXg=y2wrZ#6&%>jLFo8Sy5ZMqqsZ;JDr=;RtX;bYEpy7QfVStmQ& zLJxS_^PXjsr*z1{xj08BU=PjVM4FDkeVo;c>r% zphh>!(IZi`IGm$hM@LH1lG5m-#POX;SIW|sqI5VaZK+IWs?nF;CZ;sasZMieQ`_Kl zr$7yA1bdpAp9=M;NSz!}i`oZ1luv+AjjB|kx>QgZ@TpV(&8k+nYQCzT=6%`Ys#wQL zR^@qBGw&;_TGz_f>75lb`h#Cv=So+$z7?*9+F$?b%GbV5^{$99U;q%PKn5oDu!v0( zU=Kq<3t~`%GK{QbCrjDNTK2M-&1?x5YZx2iuuxG9t!PI}+R~c#w5UyO5jk6!Dzf&q zu#K&3XG`1K+V-}%&Fx|Zp^4u5_P4+du5gD-+~Ph$w?(0aE#{TU<~o;N$ejr{K5&rd zTKBpVi*8IRg5BLP3S@!`p}3@w4xWy=tevG(U6X` zq$f@3N?ZEUn9j7OH+{v&0AUPvVS)-qP3lsYnh9^=^jqsP10!GnFF??O7VM&eFi_yu zxX$&h!=QpxtJT^8a8Q>ZY#{|5*ut{Epa3bj``z$1!56gc7H(H{E*{_k1R~IaSI^}F1rWm; z98dte^neQn7(o@PV1k7=yb2>Q0T+6(ZF}3)4;a9Kzx{B87HB{NEjR*QF0g@!c;Ev9)I|XuumcHX00RZA zJOc(m0~M%XfvJaJ>N~JO26A5So!is}6^H-?TyO*(+~5X92hR`;um&%9K>`KST zb!iu%0B}gc4{RU-641a3+3~tfG2nva2;4veF4({U>X3sXglFw{kb@lJ{+$!lKmi3% zLK%J_gEL4V4MGqC3~F$KzzZIwd=P*O=+FQ*G(ZhGn8A34Fn|XX)0Dr5UVEp7~D2fC?2KCzr4+B6WQIG`$m<3VLBKfC( xp@RZcpnVL00tlFZ5;%brSb-LJff$&98n}TR*nuASfgl)yA~=F1C~1KJ06V!_&_VzJ literal 0 HcmV?d00001 diff --git a/modules/install/tpl/img/icoStatus.gif b/modules/install/tpl/img/icoStatus.gif new file mode 100644 index 0000000000000000000000000000000000000000..00cd03aa13286619c9e44c48dce8799a0723f84b GIT binary patch literal 879 zcmV-#1CabjNk%w1VGsa#0OkMy5|kWLQd0Nkd53&A62v0AySv`jHbu-<^6H%0)jH9} zXfU@ydUa8$sjKYWV;G4g*3&`S)j}(>JLTCfg?&VPb3JToUlF1rva-DC+bQDMF@JeW zrIcydZITQs1NCU$Q`YHDl}(IPj$NST?QP1Roa z=Y9C-ec#q-@#TW^=ZLej!oa}5+|^p&-`^~`Jlxedz^)zL&@S1|G2_}g;Ljq>z*WGt zJ-w|U*v~=N(>@bm7TwJzS>bBo+DF5)BJ${!6RRW`rzvJ;W>r;HA^8LV00000EC2ui z01yCp000O7fPaF6goTEOh>41ejE#!gDzKN=*xB0K+}+;a z;Njxq}heeBgmK;JNgMdem0FWGl5d{E&E(8EX!Dk3YmLqnKWMOHprp=o;b0+e`v!~CW zK!XY$O0=laqezn~UCOknQ=S$Wh@e101Op2|fiQ?M!pV~-PDaFF0Hi074KOR1T9Cqm8heZVf F06R^KhD87X literal 0 HcmV?d00001 diff --git a/modules/install/tpl/img/xe.gif b/modules/install/tpl/img/xe.gif new file mode 100644 index 0000000000000000000000000000000000000000..860a06c7792392c1dcc6875eb7db2667e04d4546 GIT binary patch literal 2252 zcmV;-2s8IbNk%w1VWR*V0OkMyva+)C`uw4xq2cZINlHo>ht#;p)$Hu-bg-2wre>8BXTd?KP(b3x4+G()i(cbCQ)YRVI-Z`4v@$vD@-Rp6dxdKLrb#-<1 z_4RvudsK$Cw$|(D@%I&ItmfwC;o;$&(ee8H{FSoH@%Q=(SDGP`+!0ijNtMm3#n?rp z-xqhk(&O@)yV4hKw9MJ%aBy*@vb?Ix;kd)fMn*>E@AhJx#(9B^%-iSj$=2f_jo6Q!sSIqkY;ksFYj6imkd3z0r>CbAUZE>xo(^KDSXo-a z(cY4+#=6emh>42#`~Bwe`DA5gUS40$-|hfEfpK?zmzbDVR#qEPi_zilPEJmQj+2DF zdEqhljb);K0w^DVE-!zSpR%vBTHs!`SJ5sm%ZX|3pMYA^8LV00000EC2ui z0HXjJ000O7fPaE;aYsW(OM;4ua1T936CR6`l$Dm3n3F*rCyaFcCP zAUZlA6?z1pw6(UkxVT^jQym?orW2`xp*{r`76oz?6G*ww(9zPG1Po(F6-mFPI7g{q zK_?bMGD1Hi8)aKJp;Z;H~~jlOyXBvIdWWq;b#K`H185BTqvl>i7Ewt z{0QQ!Ly`bxrkwb3CC3UiYWi%jVWSKgN^=wpn?yi?0*1EWxSTn2*0Yq(a52DhOvslm zH|$vq;0J~bEgzq#7+DfW14?8l%!n`vPKXu&VA6^(qXmVpU@1I!MnD9L47o0xI3}Zu zmMCKX2FShWr-_>&4+R>KBhzp|7KI7 ziit70l%MA#13-vT0du9s8~$cE;0J>$77YZjVbL1N84eHF*h~<9{7OOW#e0ZgbB>D# z0vfOwJ_)ykOkl9!fB+A0@X{jjvEc$jm%woz8~G(Li2@$r=YVy8)M4B>IUuFQ4G=U3 zK^c7YMV*A00N}?A1PI`V2!%yJ2L;d7C<0o4xL`t!ez+tUk2J6#hyp+I_?HXZ@hF1- zZ-V%Di3=rcz$0QP5-`D(gVhFH2#P5%fn`&2p-3G`)(AjhWFSz51q;0Jf)^j+kVFzO zs5V^^6=0zW95na=fC3_*XqX=%kdeR{ER^7f27-j(#{>?zKm>4p&_P55XK;boODcxo z!Wjuv=#phz5OD?(4xH3qZkIT!K^+NTdL^TOJb)MnpmK1f2!9a39aVL#INli%kYU3H zXq`b)1H|g+hnR|_DMtro_<=(nUfdvE40Xnk#1MLJl7M9#wDyOJPbm_?SBfcmh9Y3t zfWjP$2u9fqelWNQ3xsNd+W{B^EHDPcIV$KM3B33R5+e9f$0BDaOaQ)AIq>NJBn|&{ zn0JaKe83`T41q%#$3BK`Kros4yBE%6(xaowH{2_1f%MED;K_|bw1)Kkyhe{cZMLX8^;gRr7C9w7Mtsy|oKIn=yH z;0FrtB}_WjT668kUpvlFJ@tOr@JAa400G1sDF`45DlmY2_+bDGSV0taAcNn5pa?Ki zL>sshn_y8uP|B;99|ZS2!yO<5APk`dkheeZ0Dwm6`ono1;HVbxM-fi4#QEU!xzN!I zeZ7Jo>I9*>hKV4AAe4Xxs^Pyhq+kds7()}@kcI+QD+vi)U;_&<0zFs)3Cs(DO|En_ zL1a)74cnO?1jR2pbi!6!n*ICx_O02YI41i}h4i~zQjx_~^DKmrRq08>9T00RIJfCmbb02kmb0c-%Q z<1*lkIj|tH0C+$jk$?sc2mke5b(%4d_Qej_P75JI+vqJ}3bJMS$-l&TxSv7(fbE asM#&JfC9=axE%s$!Aw=mxXnT%5CA*UxAJEI literal 0 HcmV?d00001 diff --git a/modules/install/tpl/introduce.html b/modules/install/tpl/introduce.html index f89cd634b..30bbd8313 100644 --- a/modules/install/tpl/introduce.html +++ b/modules/install/tpl/introduce.html @@ -1,19 +1,24 @@ - -

    {$lang->introduce_title}

    - -
    {nl2br($lang->license)}
    - -
    - Select language : -
    - - +
    + + +
    +
    {str_replace("\n", '

    ', $lang->license)}

    +
    +
    +
    + + + +
    +
    + +
    +
    +
    diff --git a/modules/install/tpl/js/install.js b/modules/install/tpl/js/install.js new file mode 100644 index 000000000..7f329106e --- /dev/null +++ b/modules/install/tpl/js/install.js @@ -0,0 +1,88 @@ +jQuery(function($){ + // Input Clear + var iText = $('.item>.iLabel').next('.iText'); + $('.item>.iLabel').css('position','absolute'); + iText + .focus(function(){ + $(this).prev('.iLabel').css('visibility','hidden'); + }) + .blur(function(){ + if($(this).val() == ''){ + $(this).prev('.iLabel').css('visibility','visible'); + } else { + $(this).prev('.iLabel').css('visibility','hidden'); + } + }) + .change(function(){ + if($(this).val() == ''){ + $(this).prev('.iLabel').css('visibility','visible'); + } else { + $(this).prev('.iLabel').css('visibility','hidden'); + } + }) + .blur(); + // Common + var select_root = $('div.select'); + var select_value = $('.myValue'); + var select_a = $('div.select>ul>li>a'); + var select_input = $('div.select>ul>li>input[type=radio]'); + var select_label = $('div.select>ul>li>label'); + + // Radio Default Value + $('div.myValue').each(function(){ + var default_value = $(this).next('.iList').find('input[checked]').next('label').text(); + $(this).append(default_value); + }); + + // Line + select_value.bind('focusin',function(){$(this).addClass('outLine');}); + select_value.bind('focusout',function(){$(this).removeClass('outLine');}); + select_input.bind('focusin',function(){$(this).parents('div.select').children('div.myValue').addClass('outLine');}); + select_input.bind('focusout',function(){$(this).parents('div.select').children('div.myValue').removeClass('outLine');}); + + // Show + function show_option(){ + $(this).parents('div.select:first').toggleClass('open'); + } + + // Hover + function i_hover(){ + $(this).parents('ul:first').children('li').removeClass('hover'); + $(this).parents('li:first').toggleClass('hover'); + } + + // Hide + function hide_option(){ + var t = $(this); + setTimeout(function(){ + t.parents('div.select:first').removeClass('open'); + }, 1); + } + + // Set Input + function set_label(){ + var v = $(this).next('label').text(); + $(this).parents('ul:first').prev('.myValue').text('').append(v); + $(this).parents('ul:first').prev('.myValue').addClass('selected'); + } + + // Set Anchor + function set_anchor(){ + var v = $(this).text(); + $(this).parents('ul:first').prev('.myValue').text('').append(v); + $(this).parents('ul:first').prev('.myValue').addClass('selected'); + } + + // Anchor Focus Out + $('*:not("div.select a")').focus(function(){ + $('.aList').parent('.select').removeClass('open'); + }); + + select_value.click(show_option); + select_root.removeClass('open'); + select_root.mouseleave(function(){$(this).removeClass('open');}); + select_a.click(set_anchor).click(hide_option).focus(i_hover).hover(i_hover); + select_input.change(set_label).focus(set_label); + select_label.hover(i_hover).click(hide_option); + +}); \ No newline at end of file diff --git a/modules/install/tpl/js/install_admin.js b/modules/install/tpl/js/install_admin.js index cca05d1e0..fc0e99f54 100644 --- a/modules/install/tpl/js/install_admin.js +++ b/modules/install/tpl/js/install_admin.js @@ -1,3 +1,27 @@ +/** + * @brief DB정보 Setting후 실행될 함수 + */ +function completeDBSetting(ret_obj) { + if(ret_obj['error'] != 0) { + alert(ret_obj['message']); + return; + } else { + location.href = "./index.php?act=dispInstallConfigForm"; + } +} + +/** + * @brief Rewrite module, Time-zone Setting 후 실행될 함수 + */ +function completeConfigSetting(ret_obj) { + if(ret_obj['error'] != 0) { + alert(ret_obj['message']); + return; + } else { + location.href = "./index.php?act=dispInstallManagerForm"; + } +} + /** * @brief 설치 완료후 실행될 함수 */ @@ -85,7 +109,7 @@ function completeGetFtpInfo(ret_obj) arr.pop(); arr.push(""); target = arr.join("/"); - list = list + "
  • ../
  • "; + list = list + "
  • ../
  • "; } for(var i=0;i"+v+""; + list = list + "
  • "+v+"
  • "; } } - list = "
      "+list+"
      "+list+"
    a";var e=b.getElementsByTagName("*"),f=b.getElementsByTagName("a")[0],g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=b.getElementsByTagName("input")[0];if(e&&e.length&&f){d.support={leadingWhitespace:b.firstChild.nodeType===3,tbody:!b.getElementsByTagName("tbody").length,htmlSerialize:!!b.getElementsByTagName("link").length,style:/red/.test(f.getAttribute("style")),hrefNormalized:f.getAttribute("href")==="/a",opacity:/^0.55$/.test(f.style.opacity),cssFloat:!!f.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,deleteExpando:!0,optDisabled:!1,checkClone:!1,noCloneEvent:!0,noCloneChecked:!0,boxModel:null,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableHiddenOffsets:!0,reliableMarginRight:!0},i.checked=!0,d.support.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,d.support.optDisabled=!h.disabled;var j=null;d.support.scriptEval=function(){if(j===null){var b=c.documentElement,e=c.createElement("script"),f="script"+d.now();try{e.appendChild(c.createTextNode("window."+f+"=1;"))}catch(g){}b.insertBefore(e,b.firstChild),a[f]?(j=!0,delete a[f]):j=!1,b.removeChild(e)}return j};try{delete b.test}catch(k){d.support.deleteExpando=!1}!b.addEventListener&&b.attachEvent&&b.fireEvent&&(b.attachEvent("onclick",function l(){d.support.noCloneEvent=!1,b.detachEvent("onclick",l)}),b.cloneNode(!0).fireEvent("onclick")),b=c.createElement("div"),b.innerHTML="";var m=c.createDocumentFragment();m.appendChild(b.firstChild),d.support.checkClone=m.cloneNode(!0).cloneNode(!0).lastChild.checked,d(function(){var a=c.createElement("div"),b=c.getElementsByTagName("body")[0];if(b){a.style.width=a.style.paddingLeft="1px",b.appendChild(a),d.boxModel=d.support.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,d.support.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="

    ",d.support.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
    t
    ";var e=a.getElementsByTagName("td");d.support.reliableHiddenOffsets=e[0].offsetHeight===0,e[0].style.display="",e[1].style.display="none",d.support.reliableHiddenOffsets=d.support.reliableHiddenOffsets&&e[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(a.style.width="1px",a.style.marginRight="0",d.support.reliableMarginRight=(parseInt(c.defaultView.getComputedStyle(a,null).marginRight,10)||0)===0),b.removeChild(a).style.display="none",a=e=null}});var n=function(a){var b=c.createElement("div");a="on"+a;if(!b.attachEvent)return!0;var d=a in b;d||(b.setAttribute(a,"return;"),d=typeof b[a]==="function");return d};d.support.submitBubbles=n("submit"),d.support.changeBubbles=n("change"),b=e=f=null}}();var g=/^(?:\{.*\}|\[.*\])$/;d.extend({cache:{},uuid:0,expando:"jQuery"+(d.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?d.cache[a[d.expando]]:a[d.expando];return!!a&&!i(a)},data:function(a,c,e,f){if(d.acceptData(a)){var g=d.expando,h=typeof c==="string",i,j=a.nodeType,k=j?d.cache:a,l=j?a[d.expando]:a[d.expando]&&d.expando;if((!l||f&&l&&!k[l][g])&&h&&e===b)return;l||(j?a[d.expando]=l=++d.uuid:l=d.expando),k[l]||(k[l]={},j||(k[l].toJSON=d.noop));if(typeof c==="object"||typeof c==="function")f?k[l][g]=d.extend(k[l][g],c):k[l]=d.extend(k[l],c);i=k[l],f&&(i[g]||(i[g]={}),i=i[g]),e!==b&&(i[c]=e);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[c]:i}},removeData:function(b,c,e){if(d.acceptData(b)){var f=d.expando,g=b.nodeType,h=g?d.cache:b,j=g?b[d.expando]:d.expando;if(!h[j])return;if(c){var k=e?h[j][f]:h[j];if(k){delete k[c];if(!i(k))return}}if(e){delete h[j][f];if(!i(h[j]))return}var l=h[j][f];d.support.deleteExpando||h!=a?delete h[j]:h[j]=null,l?(h[j]={},g||(h[j].toJSON=d.noop),h[j][f]=l):g&&(d.support.deleteExpando?delete b[d.expando]:b.removeAttribute?b.removeAttribute(d.expando):b[d.expando]=null)}},_data:function(a,b,c){return d.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=d.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),d.fn.extend({data:function(a,c){var e=null;if(typeof a==="undefined"){if(this.length){e=d.data(this[0]);if(this[0].nodeType===1){var f=this[0].attributes,g;for(var i=0,j=f.length;i-1)return!0;return!1},val:function(a){if(!arguments.length){var c=this[0];if(c){if(d.nodeName(c,"option")){var e=c.attributes.value;return!e||e.specified?c.value:c.text}if(d.nodeName(c,"select")){var f=c.selectedIndex,g=[],h=c.options,i=c.type==="select-one";if(f<0)return null;for(var j=i?f:0,k=i?f+1:h.length;j=0;else if(d.nodeName(this,"select")){var f=d.makeArray(e);d("option",this).each(function(){this.selected=d.inArray(d(this).val(),f)>=0}),f.length||(this.selectedIndex=-1)}else this.value=e}})}}),d.extend({attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,e,f){if(!a||a.nodeType===3||a.nodeType===8||a.nodeType===2)return b;if(f&&c in d.attrFn)return d(a)[c](e);var g=a.nodeType!==1||!d.isXMLDoc(a),h=e!==b;c=g&&d.props[c]||c;if(a.nodeType===1){var i=m.test(c);if(c==="selected"&&!d.support.optSelected){var j=a.parentNode;j&&(j.selectedIndex,j.parentNode&&j.parentNode.selectedIndex)}if((c in a||a[c]!==b)&&g&&!i){h&&(c==="type"&&n.test(a.nodeName)&&a.parentNode&&d.error("type property can't be changed"),e===null?a.nodeType===1&&a.removeAttribute(c):a[c]=e);if(d.nodeName(a,"form")&&a.getAttributeNode(c))return a.getAttributeNode(c).nodeValue;if(c==="tabIndex"){var k=a.getAttributeNode("tabIndex");return k&&k.specified?k.value:o.test(a.nodeName)||p.test(a.nodeName)&&a.href?0:b}return a[c]}if(!d.support.style&&g&&c==="style"){h&&(a.style.cssText=""+e);return a.style.cssText}h&&a.setAttribute(c,""+e);if(!a.attributes[c]&&(a.hasAttribute&&!a.hasAttribute(c)))return b;var l=!d.support.hrefNormalized&&g&&i?a.getAttribute(c,2):a.getAttribute(c);return l===null?b:l}h&&(a[c]=e);return a[c]}});var r=/\.(.*)$/,s=/^(?:textarea|input|select)$/i,t=/\./g,u=/ /g,v=/[^\w\s.|`]/g,w=function(a){return a.replace(v,"\\$&")};d.event={add:function(c,e,f,g){if(c.nodeType!==3&&c.nodeType!==8){try{d.isWindow(c)&&(c!==a&&!c.frameElement)&&(c=a)}catch(h){}if(f===!1)f=x;else if(!f)return;var i,j;f.handler&&(i=f,f=i.handler),f.guid||(f.guid=d.guid++);var k=d._data(c);if(!k)return;var l=k.events,m=k.handle;l||(k.events=l={}),m||(k.handle=m=function(a){return typeof d!=="undefined"&&d.event.triggered!==a.type?d.event.handle.apply(m.elem,arguments):b}),m.elem=c,e=e.split(" ");var n,o=0,p;while(n=e[o++]){j=i?d.extend({},i):{handler:f,data:g},n.indexOf(".")>-1?(p=n.split("."),n=p.shift(),j.namespace=p.slice(0).sort().join(".")):(p=[],j.namespace=""),j.type=n,j.guid||(j.guid=f.guid);var q=l[n],r=d.event.special[n]||{};if(!q){q=l[n]=[];if(!r.setup||r.setup.call(c,g,p,m)===!1)c.addEventListener?c.addEventListener(n,m,!1):c.attachEvent&&c.attachEvent("on"+n,m)}r.add&&(r.add.call(c,j),j.handler.guid||(j.handler.guid=f.guid)),q.push(j),d.event.global[n]=!0}c=null}},global:{},remove:function(a,c,e,f){if(a.nodeType!==3&&a.nodeType!==8){e===!1&&(e=x);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=d.hasData(a)&&d._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(e=c.handler,c=c.type);if(!c||typeof c==="string"&&c.charAt(0)==="."){c=c||"";for(h in t)d.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+d.map(m.slice(0).sort(),w).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!e){for(j=0;j=0&&(a.type=f=f.slice(0,-1),a.exclusive=!0),e||(a.stopPropagation(),d.event.global[f]&&d.each(d.cache,function(){var b=d.expando,e=this[b];e&&e.events&&e.events[f]&&d.event.trigger(a,c,e.handle.elem)}));if(!e||e.nodeType===3||e.nodeType===8)return b;a.result=b,a.target=e,c=d.makeArray(c),c.unshift(a)}a.currentTarget=e;var h=d._data(e,"handle");h&&h.apply(e,c);var i=e.parentNode||e.ownerDocument;try{e&&e.nodeName&&d.noData[e.nodeName.toLowerCase()]||e["on"+f]&&e["on"+f].apply(e,c)===!1&&(a.result=!1,a.preventDefault())}catch(j){}if(!a.isPropagationStopped()&&i)d.event.trigger(a,c,i,!0);else if(!a.isDefaultPrevented()){var k,l=a.target,m=f.replace(r,""),n=d.nodeName(l,"a")&&m==="click",o=d.event.special[m]||{};if((!o._default||o._default.call(e,a)===!1)&&!n&&!(l&&l.nodeName&&d.noData[l.nodeName.toLowerCase()])){try{l[m]&&(k=l["on"+m],k&&(l["on"+m]=null),d.event.triggered=a.type,l[m]())}catch(p){}k&&(l["on"+m]=k),d.event.triggered=b}}},handle:function(c){var e,f,g,h,i,j=[],k=d.makeArray(arguments);c=k[0]=d.event.fix(c||a.event),c.currentTarget=this,e=c.type.indexOf(".")<0&&!c.exclusive,e||(g=c.type.split("."),c.type=g.shift(),j=g.slice(0).sort(),h=new RegExp("(^|\\.)"+j.join("\\.(?:.*\\.)?")+"(\\.|$)")),c.namespace=c.namespace||j.join("."),i=d._data(this,"events"),f=(i||{})[c.type];if(i&&f){f=f.slice(0);for(var l=0,m=f.length;l-1?d.map(a.options,function(a){return a.selected}).join("-"):"":a.nodeName.toLowerCase()==="select"&&(c=a.selectedIndex);return c},D=function D(a){var c=a.target,e,f;if(s.test(c.nodeName)&&!c.readOnly){e=d._data(c,"_change_data"),f=C(c),(a.type!=="focusout"||c.type!=="radio")&&d._data(c,"_change_data",f);if(e===b||f===e)return;if(e!=null||f)a.type="change",a.liveFired=b,d.event.trigger(a,arguments[1],c)}};d.event.special.change={filters:{focusout:D,beforedeactivate:D,click:function(a){var b=a.target,c=b.type;(c==="radio"||c==="checkbox"||b.nodeName.toLowerCase()==="select")&&D.call(this,a)},keydown:function(a){var b=a.target,c=b.type;(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&D.call(this,a)},beforeactivate:function(a){var b=a.target;d._data(b,"_change_data",C(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in B)d.event.add(this,c+".specialChange",B[c]);return s.test(this.nodeName)},teardown:function(a){d.event.remove(this,".specialChange");return s.test(this.nodeName)}},B=d.event.special.change.filters,B.focus=B.beforeactivate}c.addEventListener&&d.each({focus:"focusin",blur:"focusout"},function(a,b){function f(a){var c=d.event.fix(a);c.type=b,c.originalEvent={},d.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var e=0;d.event.special[b]={setup:function(){e++===0&&c.addEventListener(a,f,!0)},teardown:function(){--e===0&&c.removeEventListener(a,f,!0)}}}),d.each(["bind","one"],function(a,c){d.fn[c]=function(a,e,f){if(typeof a==="object"){for(var g in a)this[c](g,e,a[g],f);return this}if(d.isFunction(e)||e===!1)f=e,e=b;var h=c==="one"?d.proxy(f,function(a){d(this).unbind(a,h);return f.apply(this,arguments)}):f;if(a==="unload"&&c!=="one")this.one(a,e,f);else for(var i=0,j=this.length;i0?this.bind(b,a,c):this.trigger(b)},d.attrFn&&(d.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,e,g){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!=="string")return e;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(f.call(n)==="[object Array]")if(u)if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&e.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&e.push(j[t]);else e.push.apply(e,n);else p(n,e);o&&(k(o,h,e,g),k.uniqueSort(e));return e};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e":function(a,b){var c,d=typeof b==="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return"text"===c&&(b===c||b===null)},radio:function(a){return"radio"===a.type},checkbox:function(a){return"checkbox"===a.type},file:function(a){return"file"===a.type},password:function(a){return"password"===a.type},submit:function(a){return"submit"===a.type},image:function(a){return"image"===a.type},reset:function(a){return"reset"===a.type},button:function(a){return"button"===a.type||a.nodeName.toLowerCase()==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(f.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length==="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!=="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!=="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!=="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!=="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

    ";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
    ";if(a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!=="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g0)for(var g=c;g0},closest:function(a,b){var c=[],e,f,g=this[0];if(d.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(e=0,f=a.length;e-1:d(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=N.test(a)?d(a,b||this.context):null;for(e=0,f=this.length;e-1:d.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b)break}}c=c.length>1?d.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a==="string")return d.inArray(this[0],a?d(a):this.parent().children());return d.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a==="string"?d(a,b):d.makeArray(a),e=d.merge(this.get(),c);return this.pushStack(P(c[0])||P(e[0])?e:d.unique(e))},andSelf:function(){return this.add(this.prevObject)}}),d.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return d.dir(a,"parentNode")},parentsUntil:function(a,b,c){return d.dir(a,"parentNode",c)},next:function(a){return d.nth(a,2,"nextSibling")},prev:function(a){return d.nth(a,2,"previousSibling")},nextAll:function(a){return d.dir(a,"nextSibling")},prevAll:function(a){return d.dir(a,"previousSibling")},nextUntil:function(a,b,c){return d.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return d.dir(a,"previousSibling",c)},siblings:function(a){return d.sibling(a.parentNode.firstChild,a)},children:function(a){return d.sibling(a.firstChild)},contents:function(a){return d.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:d.makeArray(a.childNodes)}},function(a,b){d.fn[a]=function(c,e){var f=d.map(this,b,c),g=M.call(arguments);I.test(a)||(e=c),e&&typeof e==="string"&&(f=d.filter(e,f)),f=this.length>1&&!O[a]?d.unique(f):f,(this.length>1||K.test(e))&&J.test(a)&&(f=f.reverse());return this.pushStack(f,a,g.join(","))}}),d.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?d.find.matchesSelector(b[0],a)?[b[0]]:[]:d.find.matches(a,b)},dir:function(a,c,e){var f=[],g=a[c];while(g&&g.nodeType!==9&&(e===b||g.nodeType!==1||!d(g).is(e)))g.nodeType===1&&f.push(g),g=g[c];return f},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var R=/ jQuery\d+="(?:\d+|null)"/g,S=/^\s+/,T=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,U=/<([\w:]+)/,V=/",""],legend:[1,"
    ","
    "],thead:[1,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]};Z.optgroup=Z.option,Z.tbody=Z.tfoot=Z.colgroup=Z.caption=Z.thead,Z.th=Z.td,d.support.htmlSerialize||(Z._default=[1,"div
    ","
    "]),d.fn.extend({text:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.text(a.call(this,b,c.text()))});if(typeof a!=="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return d.text(this)},wrapAll:function(a){if(d.isFunction(a))return this.each(function(b){d(this).wrapAll(a.call(this,b))});if(this[0]){var b=d(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(d.isFunction(a))return this.each(function(b){d(this).wrapInner(a.call(this,b))});return this.each(function(){var b=d(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){d(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){d.nodeName(this,"body")||d(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=d(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,d(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,e;(e=this[c])!=null;c++)if(!a||d.filter(a,[e]).length)!b&&e.nodeType===1&&(d.cleanData(e.getElementsByTagName("*")),d.cleanData([e])),e.parentNode&&e.parentNode.removeChild(e);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&d.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return d.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(R,""):null;if(typeof a!=="string"||X.test(a)||!d.support.leadingWhitespace&&S.test(a)||Z[(U.exec(a)||["",""])[1].toLowerCase()])d.isFunction(a)?this.each(function(b){var c=d(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);else{a=a.replace(T,"<$1>");try{for(var c=0,e=this.length;c1&&l0?this.clone(!0):this).get();d(f[h])[b](j),e=e.concat(j)}return this.pushStack(e,a,f.selector)}}),d.extend({clone:function(a,b,c){var e=a.cloneNode(!0),f,g,h;if((!d.support.noCloneEvent||!d.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!d.isXMLDoc(a)){ba(a,e),f=bb(a),g=bb(e);for(h=0;f[h];++h)ba(f[h],g[h])}if(b){_(a,e);if(c){f=bb(a),g=bb(e);for(h=0;f[h];++h)_(f[h],g[h])}}return e},clean:function(a,b,e,f){b=b||c,typeof b.createElement==="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var g=[];for(var h=0,i;(i=a[h])!=null;h++){typeof i==="number"&&(i+="");if(!i)continue;if(typeof i!=="string"||W.test(i)){if(typeof i==="string"){i=i.replace(T,"<$1>");var j=(U.exec(i)||["",""])[1].toLowerCase(),k=Z[j]||Z._default,l=k[0],m=b.createElement("div");m.innerHTML=k[1]+i+k[2];while(l--)m=m.lastChild;if(!d.support.tbody){var n=V.test(i),o=j==="table"&&!n?m.firstChild&&m.firstChild.childNodes:k[1]===""&&!n?m.childNodes:[];for(var p=o.length-1;p>=0;--p)d.nodeName(o[p],"tbody")&&!o[p].childNodes.length&&o[p].parentNode.removeChild(o[p])}!d.support.leadingWhitespace&&S.test(i)&&m.insertBefore(b.createTextNode(S.exec(i)[0]),m.firstChild),i=m.childNodes}}else i=b.createTextNode(i);i.nodeType?g.push(i):g=d.merge(g,i)}if(e)for(h=0;g[h];h++)!f||!d.nodeName(g[h],"script")||g[h].type&&g[h].type.toLowerCase()!=="text/javascript"?(g[h].nodeType===1&&g.splice.apply(g,[h+1,0].concat(d.makeArray(g[h].getElementsByTagName("script")))),e.appendChild(g[h])):f.push(g[h].parentNode?g[h].parentNode.removeChild(g[h]):g[h]);return g},cleanData:function(a){var b,c,e=d.cache,f=d.expando,g=d.event.special,h=d.support.deleteExpando;for(var i=0,j;(j=a[i])!=null;i++){if(j.nodeName&&d.noData[j.nodeName.toLowerCase()])continue;c=j[d.expando];if(c){b=e[c]&&e[c][f];if(b&&b.events){for(var k in b.events)g[k]?d.event.remove(j,k):d.removeEvent(j,k,b.handle);b.handle&&(b.handle.elem=null)}h?delete j[d.expando]:j.removeAttribute&&j.removeAttribute(d.expando),delete e[c]}}}});var bd=/alpha\([^)]*\)/i,be=/opacity=([^)]*)/,bf=/-([a-z])/ig,bg=/([A-Z]|^ms)/g,bh=/^-?\d+(?:px)?$/i,bi=/^-?\d/,bj={position:"absolute",visibility:"hidden",display:"block"},bk=["Left","Right"],bl=["Top","Bottom"],bm,bn,bo,bp=function(a,b){return b.toUpperCase()};d.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return d.access(this,a,c,!0,function(a,c,e){return e!==b?d.style(a,c,e):d.css(a,c)})},d.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bm(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{zIndex:!0,fontWeight:!0,opacity:!0,zoom:!0,lineHeight:!0},cssProps:{"float":d.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,e,f){if(a&&a.nodeType!==3&&a.nodeType!==8&&a.style){var g,h=d.camelCase(c),i=a.style,j=d.cssHooks[h];c=d.cssProps[h]||h;if(e===b){if(j&&"get"in j&&(g=j.get(a,!1,f))!==b)return g;return i[c]}if(typeof e==="number"&&isNaN(e)||e==null)return;typeof e==="number"&&!d.cssNumber[h]&&(e+="px");if(!j||!("set"in j)||(e=j.set(a,e))!==b)try{i[c]=e}catch(k){}}},css:function(a,c,e){var f,g=d.camelCase(c),h=d.cssHooks[g];c=d.cssProps[g]||g;if(h&&"get"in h&&(f=h.get(a,!0,e))!==b)return f;if(bm)return bm(a,c,g)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]},camelCase:function(a){return a.replace(bf,bp)}}),d.curCSS=d.css,d.each(["height","width"],function(a,b){d.cssHooks[b]={get:function(a,c,e){var f;if(c){a.offsetWidth!==0?f=bq(a,b,e):d.swap(a,bj,function(){f=bq(a,b,e)});if(f<=0){f=bm(a,b,b),f==="0px"&&bo&&(f=bo(a,b,b));if(f!=null)return f===""||f==="auto"?"0px":f}if(f<0||f==null){f=a.style[b];return f===""||f==="auto"?"0px":f}return typeof f==="string"?f:f+"px"}},set:function(a,b){if(!bh.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),d.support.opacity||(d.cssHooks.opacity={get:function(a,b){return be.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style;c.zoom=1;var e=d.isNaN(b)?"":"alpha(opacity="+b*100+")",f=c.filter||"";c.filter=bd.test(f)?f.replace(bd,e):c.filter+" "+e}}),d(function(){d.support.reliableMarginRight||(d.cssHooks.marginRight={get:function(a,b){var c;d.swap(a,{display:"inline-block"},function(){b?c=bm(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bn=function(a,c,e){var f,g,h;e=e.replace(bg,"-$1").toLowerCase();if(!(g=a.ownerDocument.defaultView))return b;if(h=g.getComputedStyle(a,null))f=h.getPropertyValue(e),f===""&&!d.contains(a.ownerDocument.documentElement,a)&&(f=d.style(a,e));return f}),c.documentElement.currentStyle&&(bo=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bh.test(d)&&bi.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bm=bn||bo,d.expr&&d.expr.filters&&(d.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!d.support.reliableHiddenOffsets&&(a.style.display||d.css(a,"display"))==="none"},d.expr.filters.visible=function(a){return!d.expr.filters.hidden(a)});var br=/%20/g,bs=/\[\]$/,bt=/\r?\n/g,bu=/#.*$/,bv=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bw=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bx=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,by=/^(?:GET|HEAD)$/,bz=/^\/\//,bA=/\?/,bB=/)<[^<]*)*<\/script>/gi,bC=/^(?:select|textarea)/i,bD=/\s+/,bE=/([?&])_=[^&]*/,bF=/(^|\-)([a-z])/g,bG=function(a,b,c){return b+c.toUpperCase()},bH=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bI=d.fn.load,bJ={},bK={},bL,bM;try{bL=c.location.href}catch(bN){bL=c.createElement("a"),bL.href="",bL=bL.href}bM=bH.exec(bL.toLowerCase())||[],d.fn.extend({load:function(a,c,e){if(typeof a!=="string"&&bI)return bI.apply(this,arguments);if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var g=a.slice(f,a.length);a=a.slice(0,f)}var h="GET";c&&(d.isFunction(c)?(e=c,c=b):typeof c==="object"&&(c=d.param(c,d.ajaxSettings.traditional),h="POST"));var i=this;d.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?d("
    ").append(c.replace(bB,"")).find(g):c)),e&&i.each(e,[c,b,a])}});return this},serialize:function(){return d.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?d.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bC.test(this.nodeName)||bw.test(this.type))}).map(function(a,b){var c=d(this).val();return c==null?null:d.isArray(c)?d.map(c,function(a,c){return{name:b.name,value:a.replace(bt,"\r\n")}}):{name:b.name,value:c.replace(bt,"\r\n")}}).get()}}),d.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){d.fn[b]=function(a){return this.bind(b,a)}}),d.each(["get","post"],function(a,c){d[c]=function(a,e,f,g){d.isFunction(e)&&(g=g||f,f=e,e=b);return d.ajax({type:c,url:a,data:e,success:f,dataType:g})}}),d.extend({getScript:function(a,c){return d.get(a,b,c,"script")},getJSON:function(a,b,c){return d.get(a,b,c,"json")},ajaxSetup:function(a,b){b?d.extend(!0,a,d.ajaxSettings,b):(b=a,a=d.extend(!0,d.ajaxSettings,b));for(var c in {context:1,url:1})c in b?a[c]=b[c]:c in d.ajaxSettings&&(a[c]=d.ajaxSettings[c]);return a},ajaxSettings:{url:bL,isLocal:bx.test(bM[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":d.parseJSON,"text xml":d.parseXML}},ajaxPrefilter:bO(bJ),ajaxTransport:bO(bK),ajax:function(a,c){function v(a,c,l,n){if(r!==2){r=2,p&&clearTimeout(p),o=b,m=n||"",u.readyState=a?4:0;var q,t,v,w=l?bR(e,u,l):b,x,y;if(a>=200&&a<300||a===304){if(e.ifModified){if(x=u.getResponseHeader("Last-Modified"))d.lastModified[k]=x;if(y=u.getResponseHeader("Etag"))d.etag[k]=y}if(a===304)c="notmodified",q=!0;else try{t=bS(e,w),c="success",q=!0}catch(z){c="parsererror",v=z}}else{v=c;if(!c||a)c="error",a<0&&(a=0)}u.status=a,u.statusText=c,q?h.resolveWith(f,[t,c,u]):h.rejectWith(f,[u,c,v]),u.statusCode(j),j=b,s&&g.trigger("ajax"+(q?"Success":"Error"),[u,e,q?t:v]),i.resolveWith(f,[u,c]),s&&(g.trigger("ajaxComplete",[u,e]),--d.active||d.event.trigger("ajaxStop"))}}typeof a==="object"&&(c=a,a=b),c=c||{};var e=d.ajaxSetup({},c),f=e.context||e,g=f!==e&&(f.nodeType||f instanceof d)?d(f):d.event,h=d.Deferred(),i=d._Deferred(),j=e.statusCode||{},k,l={},m,n,o,p,q,r=0,s,t,u={readyState:0,setRequestHeader:function(a,b){r||(l[a.toLowerCase().replace(bF,bG)]=b);return this},getAllResponseHeaders:function(){return r===2?m:null},getResponseHeader:function(a){var c;if(r===2){if(!n){n={};while(c=bv.exec(m))n[c[1].toLowerCase()]=c[2]}c=n[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){r||(e.mimeType=a);return this},abort:function(a){a=a||"abort",o&&o.abort(a),v(0,a);return this}};h.promise(u),u.success=u.done,u.error=u.fail,u.complete=i.done,u.statusCode=function(a){if(a){var b;if(r<2)for(b in a)j[b]=[j[b],a[b]];else b=a[u.status],u.then(b,b)}return this},e.url=((a||e.url)+"").replace(bu,"").replace(bz,bM[1]+"//"),e.dataTypes=d.trim(e.dataType||"*").toLowerCase().split(bD),e.crossDomain==null&&(q=bH.exec(e.url.toLowerCase()),e.crossDomain=q&&(q[1]!=bM[1]||q[2]!=bM[2]||(q[3]||(q[1]==="http:"?80:443))!=(bM[3]||(bM[1]==="http:"?80:443)))),e.data&&e.processData&&typeof e.data!=="string"&&(e.data=d.param(e.data,e.traditional)),bP(bJ,e,c,u);if(r===2)return!1;s=e.global,e.type=e.type.toUpperCase(),e.hasContent=!by.test(e.type),s&&d.active++===0&&d.event.trigger("ajaxStart");if(!e.hasContent){e.data&&(e.url+=(bA.test(e.url)?"&":"?")+e.data),k=e.url;if(e.cache===!1){var w=d.now(),x=e.url.replace(bE,"$1_="+w);e.url=x+(x===e.url?(bA.test(e.url)?"&":"?")+"_="+w:"")}}if(e.data&&e.hasContent&&e.contentType!==!1||c.contentType)l["Content-Type"]=e.contentType;e.ifModified&&(k=k||e.url,d.lastModified[k]&&(l["If-Modified-Since"]=d.lastModified[k]),d.etag[k]&&(l["If-None-Match"]=d.etag[k])),l.Accept=e.dataTypes[0]&&e.accepts[e.dataTypes[0]]?e.accepts[e.dataTypes[0]]+(e.dataTypes[0]!=="*"?", */*; q=0.01":""):e.accepts["*"];for(t in e.headers)u.setRequestHeader(t,e.headers[t]);if(e.beforeSend&&(e.beforeSend.call(f,u,e)===!1||r===2)){u.abort();return!1}for(t in {success:1,error:1,complete:1})u[t](e[t]);o=bP(bK,e,c,u);if(o){u.readyState=1,s&&g.trigger("ajaxSend",[u,e]),e.async&&e.timeout>0&&(p=setTimeout(function(){u.abort("timeout")},e.timeout));try{r=1,o.send(l,v)}catch(y){status<2?v(-1,y):d.error(y)}}else v(-1,"No Transport");return u},param:function(a,c){var e=[],f=function(a,b){b=d.isFunction(b)?b():b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=d.ajaxSettings.traditional);if(d.isArray(a)||a.jquery&&!d.isPlainObject(a))d.each(a,function(){f(this.name,this.value)});else for(var g in a)bQ(g,a[g],c,f);return e.join("&").replace(br,"+")}}),d.extend({active:0,lastModified:{},etag:{}});var bT=d.now(),bU=/(\=)\?(&|$)|\?\?/i;d.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return d.expando+"_"+bT++}}),d.ajaxPrefilter("json jsonp",function(b,c,e){var f=typeof b.data==="string";if(b.dataTypes[0]==="jsonp"||c.jsonpCallback||c.jsonp!=null||b.jsonp!==!1&&(bU.test(b.url)||f&&bU.test(b.data))){var g,h=b.jsonpCallback=d.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2",m=function(){a[h]=i,g&&d.isFunction(i)&&a[h](g[0])};b.jsonp!==!1&&(j=j.replace(bU,l),b.url===j&&(f&&(k=k.replace(bU,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},e.then(m,m),b.converters["script json"]=function(){g||d.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),d.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){d.globalEval(a);return a}}}),d.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),d.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var bV=d.now(),bW,bX;d.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&bZ()||b$()}:bZ,bX=d.ajaxSettings.xhr(),d.support.ajax=!!bX,d.support.cors=bX&&"withCredentials"in bX,bX=b,d.support.ajax&&d.ajaxTransport(function(a){if(!a.crossDomain||d.support.cors){var c;return{send:function(e,f){var g=a.xhr(),h,i;a.username?g.open(a.type,a.url,a.async,a.username,a.password):g.open(a.type,a.url,a.async);if(a.xhrFields)for(i in a.xhrFields)g[i]=a.xhrFields[i];a.mimeType&&g.overrideMimeType&&g.overrideMimeType(a.mimeType),!a.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(i in e)g.setRequestHeader(i,e[i])}catch(j){}g.send(a.hasContent&&a.data||null),c=function(e,i){var j,k,l,m,n;try{if(c&&(i||g.readyState===4)){c=b,h&&(g.onreadystatechange=d.noop,delete bW[h]);if(i)g.readyState!==4&&g.abort();else{j=g.status,l=g.getAllResponseHeaders(),m={},n=g.responseXML,n&&n.documentElement&&(m.xml=n),m.text=g.responseText;try{k=g.statusText}catch(o){k=""}j||!a.isLocal||a.crossDomain?j===1223&&(j=204):j=m.text?200:404}}}catch(p){i||f(-1,p)}m&&f(j,k,m,l)},a.async&&g.readyState!==4?(bW||(bW={},bY()),h=bV++,g.onreadystatechange=bW[h]=c):c()},abort:function(){c&&c(0,1)}}}});var b_={},ca=/^(?:toggle|show|hide)$/,cb=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cc,cd=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];d.fn.extend({show:function(a,b,c){var e,f;if(a||a===0)return this.animate(ce("show",3),a,b,c);for(var g=0,h=this.length;g=0;a--)c[a].elem===this&&(b&&c[a](!0),c.splice(a,1))}),b||this.dequeue();return this}}),d.each({slideDown:ce("show",1),slideUp:ce("hide",1),slideToggle:ce("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){d.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),d.extend({speed:function(a,b,c){var e=a&&typeof a==="object"?d.extend({},a):{complete:c||!c&&b||d.isFunction(a)&&a,duration:a,easing:c&&b||b&&!d.isFunction(b)&&b};e.duration=d.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in d.fx.speeds?d.fx.speeds[e.duration]:d.fx.speeds._default,e.old=e.complete,e.complete=function(){e.queue!==!1&&d(this).dequeue(),d.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig||(b.orig={})}}),d.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(d.fx.step[this.prop]||d.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=d.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,b,c){function g(a){return e.step(a)}var e=this,f=d.fx;this.startTime=d.now(),this.start=a,this.end=b,this.unit=c||this.unit||(d.cssNumber[this.prop]?"":"px"),this.now=this.start,this.pos=this.state=0,g.elem=this.elem,g()&&d.timers.push(g)&&!cc&&(cc=setInterval(f.tick,f.interval))},show:function(){this.options.orig[this.prop]=d.style(this.elem,this.prop),this.options.show=!0,this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),d(this.elem).show()},hide:function(){this.options.orig[this.prop]=d.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b=d.now(),c=!0;if(a||b>=this.options.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),this.options.curAnim[this.prop]=!0;for(var e in this.options.curAnim)this.options.curAnim[e]!==!0&&(c=!1);if(c){if(this.options.overflow!=null&&!d.support.shrinkWrapBlocks){var f=this.elem,g=this.options;d.each(["","X","Y"],function(a,b){f.style["overflow"+b]=g.overflow[a]})}this.options.hide&&d(this.elem).hide();if(this.options.hide||this.options.show)for(var h in this.options.curAnim)d.style(this.elem,h,this.options.orig[h]);this.options.complete.call(this.elem)}return!1}var i=b-this.startTime;this.state=i/this.options.duration;var j=this.options.specialEasing&&this.options.specialEasing[this.prop],k=this.options.easing||(d.easing.swing?"swing":"linear");this.pos=d.easing[j||k](this.state,i,0,1,this.options.duration),this.now=this.start+(this.end-this.start)*this.pos,this.update();return!0}},d.extend(d.fx,{tick:function(){var a=d.timers;for(var b=0;b
    ";d.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),e=b.firstChild,f=e.firstChild,h=e.nextSibling.firstChild.firstChild,this.doesNotAddBorder=f.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,f.style.position="fixed",f.style.top="20px",this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15,f.style.position=f.style.top="",e.style.overflow="hidden",e.style.position="relative",this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),d.offset.initialize=d.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;d.offset.initialize(),d.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(d.css(a,"marginTop"))||0,c+=parseFloat(d.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var e=d.css(a,"position");e==="static"&&(a.style.position="relative");var f=d(a),g=f.offset(),h=d.css(a,"top"),i=d.css(a,"left"),j=(e==="absolute"||e==="fixed")&&d.inArray("auto",[h,i])>-1,k={},l={},m,n;j&&(l=f.position()),m=j?l.top:parseInt(h,10)||0,n=j?l.left:parseInt(i,10)||0,d.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):f.css(k)}},d.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),e=ch.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(d.css(a,"marginTop"))||0,c.left-=parseFloat(d.css(a,"marginLeft"))||0,e.top+=parseFloat(d.css(b[0],"borderTopWidth"))||0,e.left+=parseFloat(d.css(b[0],"borderLeftWidth"))||0;return{top:c.top-e.top,left:c.left-e.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&(!ch.test(a.nodeName)&&d.css(a,"position")==="static"))a=a.offsetParent;return a})}}),d.each(["Left","Top"],function(a,c){var e="scroll"+c;d.fn[e]=function(c){var f=this[0],g;if(!f)return null;if(c!==b)return this.each(function(){g=ci(this),g?g.scrollTo(a?d(g).scrollLeft():c,a?c:d(g).scrollTop()):this[e]=c});g=ci(f);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:d.support.boxModel&&g.document.documentElement[e]||g.document.body[e]:f[e]}}),d.each(["Height","Width"],function(a,c){var e=c.toLowerCase();d.fn["inner"+c]=function(){return this[0]?parseFloat(d.css(this[0],e,"padding")):null},d.fn["outer"+c]=function(a){return this[0]?parseFloat(d.css(this[0],e,a?"margin":"border")):null},d.fn[e]=function(a){var f=this[0];if(!f)return a==null?null:this;if(d.isFunction(a))return this.each(function(b){var c=d(this);c[e](a.call(this,b,c[e]()))});if(d.isWindow(f)){var g=f.document.documentElement["client"+c];return f.document.compatMode==="CSS1Compat"&&g||f.document.body["client"+c]||g}if(f.nodeType===9)return Math.max(f.documentElement["client"+c],f.body["scroll"+c],f.documentElement["scroll"+c],f.body["offset"+c],f.documentElement["offset"+c]);if(a===b){var h=d.css(f,e),i=parseFloat(h);return d.isNaN(i)?h:i}return this.css(e,typeof a==="string"?a:a+"px")}}),a.jQuery=a.$=d})(window); \ No newline at end of file diff --git a/modules/install/tpl/progress_menu.html b/modules/install/tpl/progress_menu.html new file mode 100644 index 000000000..1a5bd5d9b --- /dev/null +++ b/modules/install/tpl/progress_menu.html @@ -0,0 +1,11 @@ +
    +
      +
    • class="active">{$lang->install_progress_menu['agree']}
    • +
    • class="active">{$lang->install_progress_menu['condition']}
    • +
    • class="active">{$lang->install_progress_menu['ftp']}
    • +
    • class="active">{$lang->install_progress_menu['dbSelect']}
    • +
    • class="active">{$lang->install_progress_menu['dbInfo']}
    • +
    • class="active">{$lang->install_progress_menu['configInfo']}
    • +
    • class="active">{$lang->install_progress_menu['adminInfo']}
    • +
    +
    diff --git a/modules/install/tpl/select_db.html b/modules/install/tpl/select_db.html index 0ac474c94..d5a6e28c0 100644 --- a/modules/install/tpl/select_db.html +++ b/modules/install/tpl/select_db.html @@ -1,28 +1,29 @@ + - -

    {$lang->select_db_type}

    - -
    - - - - - - - - - - - -
    - enable)-->disabled="disabled" id="db_type_{$val->db_type}" checked="checked"/> - - {$lang->db_desc[$val->db_type]}
    - -
    - -
    - -
    - +
    + + +
    +
    + + +
      + +
    • + enable)-->disabled="disabled" id="db_type_{$val->db_type}" checked="checked" class="iRadio" id="cubrid" /> +

      {$lang->db_desc[$val->db_type]}

      +
    • + +
    +
    + +
    + +
    +
    +
    +
    +
    From 07cf8dc13153bc8c17abd93b1cbb6d26663b025a Mon Sep 17 00:00:00 2001 From: taggon Date: Thu, 14 Apr 2011 10:44:18 +0000 Subject: [PATCH 0036/1372] additional commit of r8276 git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8312 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/display/HTMLDisplayHandler.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/display/HTMLDisplayHandler.php b/classes/display/HTMLDisplayHandler.php index 8a8c5a93f..55cae8605 100644 --- a/classes/display/HTMLDisplayHandler.php +++ b/classes/display/HTMLDisplayHandler.php @@ -70,7 +70,7 @@ class HTMLDisplayHandler { $output = preg_replace_callback('!!is', array($this,'_moveStyleToHeader'), $output); // change a meta fine(widget often put the tag like to the content because of caching) - $output = preg_replace_callback('//is', array($this,'_transMeta'), $output); + $output = preg_replace_callback('//is', array($this,'_transMeta'), $output); // handles a relative path generated by using the rewrite module if(Context::isAllowRewrite()) { From a2851cc242fb50ff29a94616fcf4d79e85b4cff6 Mon Sep 17 00:00:00 2001 From: mosmartin Date: Thu, 14 Apr 2011 11:40:36 +0000 Subject: [PATCH 0037/1372] #19690852 Bug fix git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8313 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/db/DBCubrid3.class.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/classes/db/DBCubrid3.class.php b/classes/db/DBCubrid3.class.php index a312c7de9..899eda76e 100644 --- a/classes/db/DBCubrid3.class.php +++ b/classes/db/DBCubrid3.class.php @@ -571,13 +571,13 @@ $sub_condition = ''; foreach ($val['condition'] as $v) { - if (!isset ($v['value'])) continue; - if ($v['value'] === '') continue; + $value = $v['value']; + if (!isset ($value)) continue; + if ($value === '') continue; if(!is_string($value) && !is_integer($value) && !is_float($value) && !is_array($value)) continue; - + $name = $v['column']; $operation = $v['operation']; - $value = $v['value']; $type = $this->getColumnType ($column_type, $name); $pipe = $v['pipe']; $value = $this->getConditionValue ($name, $value, $operation, $type, $column_type); From 0bdf86ef26b858932cfdeacd008c790d889007f1 Mon Sep 17 00:00:00 2001 From: taggon Date: Thu, 14 Apr 2011 12:29:12 +0000 Subject: [PATCH 0038/1372] #19692161 Use minified JS or CSS files if __DEBUG__ is not true. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8314 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/display/HTMLDisplayHandler.php | 33 +- common/js/jquery.min.js | 167 + common/js/minify.ini | 17 + common/js/x.min.js | 56 + common/js/xe.js | 1579 ++++++++ common/js/xe.min.js | 56 + modules/admin/tpl/css/minify.ini | 11 + modules/admin/tpl/css/xe_admin.css | 368 ++ modules/admin/tpl/css/xe_admin.min.css | 1 + tools/index.html | 1 + tools/minify.php | 171 + tools/minify/cssmin/cssmin.php | 4906 ++++++++++++++++++++++++ tools/minify/jsminplus/changelog.txt | 62 + tools/minify/jsminplus/jsminplus.php | 1980 ++++++++++ 14 files changed, 9397 insertions(+), 11 deletions(-) create mode 100644 common/js/jquery.min.js create mode 100644 common/js/minify.ini create mode 100644 common/js/x.min.js create mode 100644 common/js/xe.js create mode 100644 common/js/xe.min.js create mode 100644 modules/admin/tpl/css/minify.ini create mode 100644 modules/admin/tpl/css/xe_admin.css create mode 100644 modules/admin/tpl/css/xe_admin.min.css create mode 100644 tools/index.html create mode 100644 tools/minify.php create mode 100644 tools/minify/cssmin/cssmin.php create mode 100644 tools/minify/jsminplus/changelog.txt create mode 100644 tools/minify/jsminplus/jsminplus.php diff --git a/classes/display/HTMLDisplayHandler.php b/classes/display/HTMLDisplayHandler.php index 55cae8605..6df5a2c02 100644 --- a/classes/display/HTMLDisplayHandler.php +++ b/classes/display/HTMLDisplayHandler.php @@ -137,20 +137,31 @@ class HTMLDisplayHandler { { $oContext =& Context::getInstance(); // add common JS/CSS files - $oContext->addJsFile('./common/js/jquery.js', false, '', -100000); - $oContext->addJsFile('./common/js/x.js', false, '', -100000); - $oContext->addJsFile('./common/js/common.js', false, '', -100000); - $oContext->addJsFile('./common/js/js_app.js', false, '', -100000); - $oContext->addJsFile('./common/js/xml_handler.js', false, '', -100000); - $oContext->addJsFile('./common/js/xml_js_filter.js', false, '', -100000); - $oContext->addCSSFile('./common/css/default.css', false, 'all', '', -100000); - $oContext->addCSSFile('./common/css/button.css', false, 'all', '', -100000); + if(__DEBUG__) { + $oContext->addJsFile('./common/js/jquery.js', false, '', -100000); + $oContext->addJsFile('./common/js/x.js', false, '', -100000); + $oContext->addJsFile('./common/js/common.js', false, '', -100000); + $oContext->addJsFile('./common/js/js_app.js', false, '', -100000); + $oContext->addJsFile('./common/js/xml_handler.js', false, '', -100000); + $oContext->addJsFile('./common/js/xml_js_filter.js', false, '', -100000); + $oContext->addCSSFile('./common/css/default.css', false, 'all', '', -100000); + $oContext->addCSSFile('./common/css/button.css', false, 'all', '', -100000); + } else { + $oContext->addJsFile('./common/js/jquery.min.js', false, '', -100000); + $oContext->addJsFile('./common/js/x.min.js', false, '', -100000); + $oContext->addJsFile('./common/js/xe.min.js', false, '', -100000); + $oContext->addCSSFile('./common/css/xe.min.css', false, 'all', '', -100000); + } // for admin page, add admin css if(Context::get('module')=='admin' || strpos(Context::get('act'),'Admin')>0){ - $oContext->addCSSFile('./modules/admin/tpl/css/font.css', false, 'all', '',10000); - $oContext->addCSSFile('./modules/admin/tpl/css/pagination.css', false, 'all', '', 100001); - $oContext->addCSSFile('./modules/admin/tpl/css/admin.css', false, 'all', '', 100002); + if(__DEBUG__) { + $oContext->addCSSFile('./modules/admin/tpl/css/font.css', false, 'all', '',10000); + $oContext->addCSSFile('./modules/admin/tpl/css/pagination.css', false, 'all', '', 100001); + $oContext->addCSSFile('./modules/admin/tpl/css/admin.css', false, 'all', '', 100002); + } else { + $oContext->addCSSFile('./modules/admin/tpl/css/xe_admin.min.css', false, 'all', '',10000); + } } } } diff --git a/common/js/jquery.min.js b/common/js/jquery.min.js new file mode 100644 index 000000000..8f3ca2e2d --- /dev/null +++ b/common/js/jquery.min.js @@ -0,0 +1,167 @@ +/*! + * jQuery JavaScript Library v1.4.4 + * http://jquery.com/ + * + * Copyright 2010, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2010, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Thu Nov 11 19:04:53 2010 -0500 + */ +(function(E,B){function ka(a,b,d){if(d===B&&a.nodeType===1){d=a.getAttribute("data-"+b);if(typeof d==="string"){try{d=d==="true"?true:d==="false"?false:d==="null"?null:!c.isNaN(d)?parseFloat(d):Ja.test(d)?c.parseJSON(d):d}catch(e){}c.data(a,b,d)}else d=B}return d}function U(){return false}function ca(){return true}function la(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function Ka(a){var b,d,e,f,h,l,k,o,x,r,A,C=[];f=[];h=c.data(this,this.nodeType?"events":"__events__");if(typeof h==="function")h= +h.events;if(!(a.liveFired===this||!h||!h.live||a.button&&a.type==="click")){if(a.namespace)A=RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)");a.liveFired=this;var J=h.live.slice(0);for(k=0;kd)break;a.currentTarget=f.elem;a.data=f.handleObj.data;a.handleObj=f.handleObj;A=f.handleObj.origHandler.apply(f.elem,arguments);if(A===false||a.isPropagationStopped()){d=f.level;if(A===false)b=false;if(a.isImmediatePropagationStopped())break}}return b}}function Y(a,b){return(a&&a!=="*"?a+".":"")+b.replace(La, +"`").replace(Ma,"&")}function ma(a,b,d){if(c.isFunction(b))return c.grep(a,function(f,h){return!!b.call(f,h,f)===d});else if(b.nodeType)return c.grep(a,function(f){return f===b===d});else if(typeof b==="string"){var e=c.grep(a,function(f){return f.nodeType===1});if(Na.test(b))return c.filter(b,e,!d);else b=c.filter(b,e)}return c.grep(a,function(f){return c.inArray(f,b)>=0===d})}function na(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var e=c.data(a[d++]),f=c.data(this, +e);if(e=e&&e.events){delete f.handle;f.events={};for(var h in e)for(var l in e[h])c.event.add(this,h,e[h][l],e[h][l].data)}}})}function Oa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function oa(a,b,d){var e=b==="width"?a.offsetWidth:a.offsetHeight;if(d==="border")return e;c.each(b==="width"?Pa:Qa,function(){d||(e-=parseFloat(c.css(a,"padding"+this))||0);if(d==="margin")e+=parseFloat(c.css(a, +"margin"+this))||0;else e-=parseFloat(c.css(a,"border"+this+"Width"))||0});return e}function da(a,b,d,e){if(c.isArray(b)&&b.length)c.each(b,function(f,h){d||Ra.test(a)?e(a,h):da(a+"["+(typeof h==="object"||c.isArray(h)?f:"")+"]",h,d,e)});else if(!d&&b!=null&&typeof b==="object")c.isEmptyObject(b)?e(a,""):c.each(b,function(f,h){da(a+"["+f+"]",h,d,e)});else e(a,b)}function S(a,b){var d={};c.each(pa.concat.apply([],pa.slice(0,b)),function(){d[this]=a});return d}function qa(a){if(!ea[a]){var b=c("<"+ +a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d==="")d="block";ea[a]=d}return ea[a]}function fa(a){return c.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var t=E.document,c=function(){function a(){if(!b.isReady){try{t.documentElement.doScroll("left")}catch(j){setTimeout(a,1);return}b.ready()}}var b=function(j,s){return new b.fn.init(j,s)},d=E.jQuery,e=E.$,f,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,l=/\S/,k=/^\s+/,o=/\s+$/,x=/\W/,r=/\d/,A=/^<(\w+)\s*\/?>(?:<\/\1>)?$/, +C=/^[\],:{}\s]*$/,J=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,w=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,I=/(?:^|:|,)(?:\s*\[)+/g,L=/(webkit)[ \/]([\w.]+)/,g=/(opera)(?:.*version)?[ \/]([\w.]+)/,i=/(msie) ([\w.]+)/,n=/(mozilla)(?:.*? rv:([\w.]+))?/,m=navigator.userAgent,p=false,q=[],u,y=Object.prototype.toString,F=Object.prototype.hasOwnProperty,M=Array.prototype.push,N=Array.prototype.slice,O=String.prototype.trim,D=Array.prototype.indexOf,R={};b.fn=b.prototype={init:function(j, +s){var v,z,H;if(!j)return this;if(j.nodeType){this.context=this[0]=j;this.length=1;return this}if(j==="body"&&!s&&t.body){this.context=t;this[0]=t.body;this.selector="body";this.length=1;return this}if(typeof j==="string")if((v=h.exec(j))&&(v[1]||!s))if(v[1]){H=s?s.ownerDocument||s:t;if(z=A.exec(j))if(b.isPlainObject(s)){j=[t.createElement(z[1])];b.fn.attr.call(j,s,true)}else j=[H.createElement(z[1])];else{z=b.buildFragment([v[1]],[H]);j=(z.cacheable?z.fragment.cloneNode(true):z.fragment).childNodes}return b.merge(this, +j)}else{if((z=t.getElementById(v[2]))&&z.parentNode){if(z.id!==v[2])return f.find(j);this.length=1;this[0]=z}this.context=t;this.selector=j;return this}else if(!s&&!x.test(j)){this.selector=j;this.context=t;j=t.getElementsByTagName(j);return b.merge(this,j)}else return!s||s.jquery?(s||f).find(j):b(s).find(j);else if(b.isFunction(j))return f.ready(j);if(j.selector!==B){this.selector=j.selector;this.context=j.context}return b.makeArray(j,this)},selector:"",jquery:"1.4.4",length:0,size:function(){return this.length}, +toArray:function(){return N.call(this,0)},get:function(j){return j==null?this.toArray():j<0?this.slice(j)[0]:this[j]},pushStack:function(j,s,v){var z=b();b.isArray(j)?M.apply(z,j):b.merge(z,j);z.prevObject=this;z.context=this.context;if(s==="find")z.selector=this.selector+(this.selector?" ":"")+v;else if(s)z.selector=this.selector+"."+s+"("+v+")";return z},each:function(j,s){return b.each(this,j,s)},ready:function(j){b.bindReady();if(b.isReady)j.call(t,b);else q&&q.push(j);return this},eq:function(j){return j=== +-1?this.slice(j):this.slice(j,+j+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(N.apply(this,arguments),"slice",N.call(arguments).join(","))},map:function(j){return this.pushStack(b.map(this,function(s,v){return j.call(s,v,s)}))},end:function(){return this.prevObject||b(null)},push:M,sort:[].sort,splice:[].splice};b.fn.init.prototype=b.fn;b.extend=b.fn.extend=function(){var j,s,v,z,H,G=arguments[0]||{},K=1,Q=arguments.length,ga=false; +if(typeof G==="boolean"){ga=G;G=arguments[1]||{};K=2}if(typeof G!=="object"&&!b.isFunction(G))G={};if(Q===K){G=this;--K}for(;K0))if(q){var s=0,v=q;for(q=null;j=v[s++];)j.call(t,b);b.fn.trigger&&b(t).trigger("ready").unbind("ready")}}},bindReady:function(){if(!p){p=true;if(t.readyState==="complete")return setTimeout(b.ready,1);if(t.addEventListener){t.addEventListener("DOMContentLoaded",u,false);E.addEventListener("load",b.ready,false)}else if(t.attachEvent){t.attachEvent("onreadystatechange",u);E.attachEvent("onload", +b.ready);var j=false;try{j=E.frameElement==null}catch(s){}t.documentElement.doScroll&&j&&a()}}},isFunction:function(j){return b.type(j)==="function"},isArray:Array.isArray||function(j){return b.type(j)==="array"},isWindow:function(j){return j&&typeof j==="object"&&"setInterval"in j},isNaN:function(j){return j==null||!r.test(j)||isNaN(j)},type:function(j){return j==null?String(j):R[y.call(j)]||"object"},isPlainObject:function(j){if(!j||b.type(j)!=="object"||j.nodeType||b.isWindow(j))return false;if(j.constructor&& +!F.call(j,"constructor")&&!F.call(j.constructor.prototype,"isPrototypeOf"))return false;for(var s in j);return s===B||F.call(j,s)},isEmptyObject:function(j){for(var s in j)return false;return true},error:function(j){throw j;},parseJSON:function(j){if(typeof j!=="string"||!j)return null;j=b.trim(j);if(C.test(j.replace(J,"@").replace(w,"]").replace(I,"")))return E.JSON&&E.JSON.parse?E.JSON.parse(j):(new Function("return "+j))();else b.error("Invalid JSON: "+j)},noop:function(){},globalEval:function(j){if(j&& +l.test(j)){var s=t.getElementsByTagName("head")[0]||t.documentElement,v=t.createElement("script");v.type="text/javascript";if(b.support.scriptEval)v.appendChild(t.createTextNode(j));else v.text=j;s.insertBefore(v,s.firstChild);s.removeChild(v)}},nodeName:function(j,s){return j.nodeName&&j.nodeName.toUpperCase()===s.toUpperCase()},each:function(j,s,v){var z,H=0,G=j.length,K=G===B||b.isFunction(j);if(v)if(K)for(z in j){if(s.apply(j[z],v)===false)break}else for(;H
    a";var f=d.getElementsByTagName("*"),h=d.getElementsByTagName("a")[0],l=t.createElement("select"), +k=l.appendChild(t.createElement("option"));if(!(!f||!f.length||!h)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(h.getAttribute("style")),hrefNormalized:h.getAttribute("href")==="/a",opacity:/^0.55$/.test(h.style.opacity),cssFloat:!!h.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:k.selected,deleteExpando:true,optDisabled:false,checkClone:false, +scriptEval:false,noCloneEvent:true,boxModel:null,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableHiddenOffsets:true};l.disabled=true;c.support.optDisabled=!k.disabled;b.type="text/javascript";try{b.appendChild(t.createTextNode("window."+e+"=1;"))}catch(o){}a.insertBefore(b,a.firstChild);if(E[e]){c.support.scriptEval=true;delete E[e]}try{delete b.test}catch(x){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function r(){c.support.noCloneEvent= +false;d.detachEvent("onclick",r)});d.cloneNode(true).fireEvent("onclick")}d=t.createElement("div");d.innerHTML="";a=t.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var r=t.createElement("div");r.style.width=r.style.paddingLeft="1px";t.body.appendChild(r);c.boxModel=c.support.boxModel=r.offsetWidth===2;if("zoom"in r.style){r.style.display="inline";r.style.zoom= +1;c.support.inlineBlockNeedsLayout=r.offsetWidth===2;r.style.display="";r.innerHTML="
    ";c.support.shrinkWrapBlocks=r.offsetWidth!==2}r.innerHTML="
    t
    ";var A=r.getElementsByTagName("td");c.support.reliableHiddenOffsets=A[0].offsetHeight===0;A[0].style.display="";A[1].style.display="none";c.support.reliableHiddenOffsets=c.support.reliableHiddenOffsets&&A[0].offsetHeight===0;r.innerHTML="";t.body.removeChild(r).style.display= +"none"});a=function(r){var A=t.createElement("div");r="on"+r;var C=r in A;if(!C){A.setAttribute(r,"return;");C=typeof A[r]==="function"}return C};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=f=h=null}})();var ra={},Ja=/^(?:\{.*\}|\[.*\])$/;c.extend({cache:{},uuid:0,expando:"jQuery"+c.now(),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},data:function(a,b,d){if(c.acceptData(a)){a=a==E?ra:a;var e=a.nodeType,f=e?a[c.expando]:null,h= +c.cache;if(!(e&&!f&&typeof b==="string"&&d===B)){if(e)f||(a[c.expando]=f=++c.uuid);else h=a;if(typeof b==="object")if(e)h[f]=c.extend(h[f],b);else c.extend(h,b);else if(e&&!h[f])h[f]={};a=e?h[f]:h;if(d!==B)a[b]=d;return typeof b==="string"?a[b]:a}}},removeData:function(a,b){if(c.acceptData(a)){a=a==E?ra:a;var d=a.nodeType,e=d?a[c.expando]:a,f=c.cache,h=d?f[e]:e;if(b){if(h){delete h[b];d&&c.isEmptyObject(h)&&c.removeData(a)}}else if(d&&c.support.deleteExpando)delete a[c.expando];else if(a.removeAttribute)a.removeAttribute(c.expando); +else if(d)delete f[e];else for(var l in a)delete a[l]}},acceptData:function(a){if(a.nodeName){var b=c.noData[a.nodeName.toLowerCase()];if(b)return!(b===true||a.getAttribute("classid")!==b)}return true}});c.fn.extend({data:function(a,b){var d=null;if(typeof a==="undefined"){if(this.length){var e=this[0].attributes,f;d=c.data(this[0]);for(var h=0,l=e.length;h-1)return true;return false},val:function(a){if(!arguments.length){var b=this[0];if(b){if(c.nodeName(b,"option")){var d=b.attributes.value;return!d||d.specified?b.value:b.text}if(c.nodeName(b,"select")){var e=b.selectedIndex;d=[];var f=b.options;b=b.type==="select-one"; +if(e<0)return null;var h=b?e:0;for(e=b?e+1:f.length;h=0;else if(c.nodeName(this,"select")){var A=c.makeArray(r);c("option",this).each(function(){this.selected=c.inArray(c(this).val(),A)>=0});if(!A.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true}, +attr:function(a,b,d,e){if(!a||a.nodeType===3||a.nodeType===8)return B;if(e&&b in c.attrFn)return c(a)[b](d);e=a.nodeType!==1||!c.isXMLDoc(a);var f=d!==B;b=e&&c.props[b]||b;var h=Ta.test(b);if((b in a||a[b]!==B)&&e&&!h){if(f){b==="type"&&Ua.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");if(d===null)a.nodeType===1&&a.removeAttribute(b);else a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&& +b.specified?b.value:Va.test(a.nodeName)||Wa.test(a.nodeName)&&a.href?0:B;return a[b]}if(!c.support.style&&e&&b==="style"){if(f)a.style.cssText=""+d;return a.style.cssText}f&&a.setAttribute(b,""+d);if(!a.attributes[b]&&a.hasAttribute&&!a.hasAttribute(b))return B;a=!c.support.hrefNormalized&&e&&h?a.getAttribute(b,2):a.getAttribute(b);return a===null?B:a}});var X=/\.(.*)$/,ia=/^(?:textarea|input|select)$/i,La=/\./g,Ma=/ /g,Xa=/[^\w\s.|`]/g,Ya=function(a){return a.replace(Xa,"\\$&")},ua={focusin:0,focusout:0}; +c.event={add:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(c.isWindow(a)&&a!==E&&!a.frameElement)a=E;if(d===false)d=U;else if(!d)return;var f,h;if(d.handler){f=d;d=f.handler}if(!d.guid)d.guid=c.guid++;if(h=c.data(a)){var l=a.nodeType?"events":"__events__",k=h[l],o=h.handle;if(typeof k==="function"){o=k.handle;k=k.events}else if(!k){a.nodeType||(h[l]=h=function(){});h.events=k={}}if(!o)h.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem, +arguments):B};o.elem=a;b=b.split(" ");for(var x=0,r;l=b[x++];){h=f?c.extend({},f):{handler:d,data:e};if(l.indexOf(".")>-1){r=l.split(".");l=r.shift();h.namespace=r.slice(0).sort().join(".")}else{r=[];h.namespace=""}h.type=l;if(!h.guid)h.guid=d.guid;var A=k[l],C=c.event.special[l]||{};if(!A){A=k[l]=[];if(!C.setup||C.setup.call(a,e,r,o)===false)if(a.addEventListener)a.addEventListener(l,o,false);else a.attachEvent&&a.attachEvent("on"+l,o)}if(C.add){C.add.call(a,h);if(!h.handler.guid)h.handler.guid= +d.guid}A.push(h);c.event.global[l]=true}a=null}}},global:{},remove:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(d===false)d=U;var f,h,l=0,k,o,x,r,A,C,J=a.nodeType?"events":"__events__",w=c.data(a),I=w&&w[J];if(w&&I){if(typeof I==="function"){w=I;I=I.events}if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(f in I)c.event.remove(a,f+b)}else{for(b=b.split(" ");f=b[l++];){r=f;k=f.indexOf(".")<0;o=[];if(!k){o=f.split(".");f=o.shift();x=RegExp("(^|\\.)"+ +c.map(o.slice(0).sort(),Ya).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(A=I[f])if(d){r=c.event.special[f]||{};for(h=e||0;h=0){a.type=f=f.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[f]&&c.each(c.cache,function(){this.events&&this.events[f]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType=== +8)return B;a.result=B;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(e=d.nodeType?c.data(d,"handle"):(c.data(d,"__events__")||{}).handle)&&e.apply(d,b);e=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+f]&&d["on"+f].apply(d,b)===false){a.result=false;a.preventDefault()}}catch(h){}if(!a.isPropagationStopped()&&e)c.event.trigger(a,b,e,true);else if(!a.isDefaultPrevented()){var l;e=a.target;var k=f.replace(X,""),o=c.nodeName(e,"a")&&k=== +"click",x=c.event.special[k]||{};if((!x._default||x._default.call(d,a)===false)&&!o&&!(e&&e.nodeName&&c.noData[e.nodeName.toLowerCase()])){try{if(e[k]){if(l=e["on"+k])e["on"+k]=null;c.event.triggered=true;e[k]()}}catch(r){}if(l)e["on"+k]=l;c.event.triggered=false}}},handle:function(a){var b,d,e,f;d=[];var h=c.makeArray(arguments);a=h[0]=c.event.fix(a||E.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;if(!b){e=a.type.split(".");a.type=e.shift();d=e.slice(0).sort();e=RegExp("(^|\\.)"+ +d.join("\\.(?:.*\\.)?")+"(\\.|$)")}a.namespace=a.namespace||d.join(".");f=c.data(this,this.nodeType?"events":"__events__");if(typeof f==="function")f=f.events;d=(f||{})[a.type];if(f&&d){d=d.slice(0);f=0;for(var l=d.length;f-1?c.map(a.options,function(e){return e.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},Z=function(a,b){var d=a.target,e,f;if(!(!ia.test(d.nodeName)||d.readOnly)){e=c.data(d,"_change_data");f=xa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",f);if(!(e===B||f===e))if(e!=null||f){a.type="change";a.liveFired= +B;return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:Z,beforedeactivate:Z,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return Z.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return Z.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,"_change_data",xa(a))}},setup:function(){if(this.type=== +"file")return false;for(var a in V)c.event.add(this,a+".specialChange",V[a]);return ia.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return ia.test(this.nodeName)}};V=c.event.special.change.filters;V.focus=V.beforeactivate}t.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.trigger(e,null,e.target)}c.event.special[b]={setup:function(){ua[b]++===0&&t.addEventListener(a,d,true)},teardown:function(){--ua[b]=== +0&&t.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,e,f){if(typeof d==="object"){for(var h in d)this[b](h,e,d[h],f);return this}if(c.isFunction(e)||e===false){f=e;e=B}var l=b==="one"?c.proxy(f,function(o){c(this).unbind(o,l);return f.apply(this,arguments)}):f;if(d==="unload"&&b!=="one")this.one(d,e,f);else{h=0;for(var k=this.length;h0?this.bind(b,d,e):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});E.attachEvent&&!E.addEventListener&&c(E).bind("unload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}}); +(function(){function a(g,i,n,m,p,q){p=0;for(var u=m.length;p0){F=y;break}}y=y[g]}m[p]=F}}}var d=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,h=false,l=true;[0,0].sort(function(){l=false;return 0});var k=function(g,i,n,m){n=n||[];var p=i=i||t;if(i.nodeType!==1&&i.nodeType!==9)return[];if(!g||typeof g!=="string")return n;var q,u,y,F,M,N=true,O=k.isXML(i),D=[],R=g;do{d.exec("");if(q=d.exec(R)){R=q[3];D.push(q[1]);if(q[2]){F=q[3]; +break}}}while(q);if(D.length>1&&x.exec(g))if(D.length===2&&o.relative[D[0]])u=L(D[0]+D[1],i);else for(u=o.relative[D[0]]?[i]:k(D.shift(),i);D.length;){g=D.shift();if(o.relative[g])g+=D.shift();u=L(g,u)}else{if(!m&&D.length>1&&i.nodeType===9&&!O&&o.match.ID.test(D[0])&&!o.match.ID.test(D[D.length-1])){q=k.find(D.shift(),i,O);i=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]}if(i){q=m?{expr:D.pop(),set:C(m)}:k.find(D.pop(),D.length===1&&(D[0]==="~"||D[0]==="+")&&i.parentNode?i.parentNode:i,O);u=q.expr?k.filter(q.expr, +q.set):q.set;if(D.length>0)y=C(u);else N=false;for(;D.length;){q=M=D.pop();if(o.relative[M])q=D.pop();else M="";if(q==null)q=i;o.relative[M](y,q,O)}}else y=[]}y||(y=u);y||k.error(M||g);if(f.call(y)==="[object Array]")if(N)if(i&&i.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&k.contains(i,y[g])))n.push(u[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&n.push(u[g]);else n.push.apply(n,y);else C(y,n);if(F){k(F,p,n,m);k.uniqueSort(n)}return n};k.uniqueSort=function(g){if(w){h= +l;g.sort(w);if(h)for(var i=1;i0};k.find=function(g,i,n){var m;if(!g)return[];for(var p=0,q=o.order.length;p":function(g,i){var n,m=typeof i==="string",p=0,q=g.length;if(m&&!/\W/.test(i))for(i=i.toLowerCase();p=0))n||m.push(u);else if(n)i[q]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var i=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=i[1]+(i[2]||1)-0;g[3]=i[3]-0}g[0]=e++;return g},ATTR:function(g,i,n, +m,p,q){i=g[1].replace(/\\/g,"");if(!q&&o.attrMap[i])g[1]=o.attrMap[i];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,i,n,m,p){if(g[1]==="not")if((d.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,i);else{g=k.filter(g[3],i,n,true^p);n||m.push.apply(m,g);return false}else if(o.match.POS.test(g[0])||o.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled=== +true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,i,n){return!!k(n[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"=== +g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,i){return i===0},last:function(g,i,n,m){return i===m.length-1},even:function(g,i){return i%2===0},odd:function(g,i){return i%2===1},lt:function(g,i,n){return in[3]-0},nth:function(g,i,n){return n[3]- +0===i},eq:function(g,i,n){return n[3]-0===i}},filter:{PSEUDO:function(g,i,n,m){var p=i[1],q=o.filters[p];if(q)return q(g,n,i,m);else if(p==="contains")return(g.textContent||g.innerText||k.getText([g])||"").indexOf(i[3])>=0;else if(p==="not"){i=i[3];n=0;for(m=i.length;n=0}},ID:function(g,i){return g.nodeType===1&&g.getAttribute("id")===i},TAG:function(g,i){return i==="*"&&g.nodeType===1||g.nodeName.toLowerCase()=== +i},CLASS:function(g,i){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(i)>-1},ATTR:function(g,i){var n=i[1];n=o.attrHandle[n]?o.attrHandle[n](g):g[n]!=null?g[n]:g.getAttribute(n);var m=n+"",p=i[2],q=i[4];return n==null?p==="!=":p==="="?m===q:p==="*="?m.indexOf(q)>=0:p==="~="?(" "+m+" ").indexOf(q)>=0:!q?m&&n!==false:p==="!="?m!==q:p==="^="?m.indexOf(q)===0:p==="$="?m.substr(m.length-q.length)===q:p==="|="?m===q||m.substr(0,q.length+1)===q+"-":false},POS:function(g,i,n,m){var p=o.setFilters[i[2]]; +if(p)return p(g,n,i,m)}}},x=o.match.POS,r=function(g,i){return"\\"+(i-0+1)},A;for(A in o.match){o.match[A]=RegExp(o.match[A].source+/(?![^\[]*\])(?![^\(]*\))/.source);o.leftMatch[A]=RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[A].source.replace(/\\(\d+)/g,r))}var C=function(g,i){g=Array.prototype.slice.call(g,0);if(i){i.push.apply(i,g);return i}return g};try{Array.prototype.slice.call(t.documentElement.childNodes,0)}catch(J){C=function(g,i){var n=0,m=i||[];if(f.call(g)==="[object Array]")Array.prototype.push.apply(m, +g);else if(typeof g.length==="number")for(var p=g.length;n";n.insertBefore(g,n.firstChild);if(t.getElementById(i)){o.find.ID=function(m,p,q){if(typeof p.getElementById!=="undefined"&&!q)return(p=p.getElementById(m[1]))?p.id===m[1]||typeof p.getAttributeNode!=="undefined"&&p.getAttributeNode("id").nodeValue===m[1]?[p]:B:[]};o.filter.ID=function(m,p){var q=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&q&&q.nodeValue===p}}n.removeChild(g); +n=g=null})();(function(){var g=t.createElement("div");g.appendChild(t.createComment(""));if(g.getElementsByTagName("*").length>0)o.find.TAG=function(i,n){var m=n.getElementsByTagName(i[1]);if(i[1]==="*"){for(var p=[],q=0;m[q];q++)m[q].nodeType===1&&p.push(m[q]);m=p}return m};g.innerHTML="";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")o.attrHandle.href=function(i){return i.getAttribute("href",2)};g=null})();t.querySelectorAll&& +function(){var g=k,i=t.createElement("div");i.innerHTML="

    ";if(!(i.querySelectorAll&&i.querySelectorAll(".TEST").length===0)){k=function(m,p,q,u){p=p||t;m=m.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!u&&!k.isXML(p))if(p.nodeType===9)try{return C(p.querySelectorAll(m),q)}catch(y){}else if(p.nodeType===1&&p.nodeName.toLowerCase()!=="object"){var F=p.getAttribute("id"),M=F||"__sizzle__";F||p.setAttribute("id",M);try{return C(p.querySelectorAll("#"+M+" "+m),q)}catch(N){}finally{F|| +p.removeAttribute("id")}}return g(m,p,q,u)};for(var n in g)k[n]=g[n];i=null}}();(function(){var g=t.documentElement,i=g.matchesSelector||g.mozMatchesSelector||g.webkitMatchesSelector||g.msMatchesSelector,n=false;try{i.call(t.documentElement,"[test!='']:sizzle")}catch(m){n=true}if(i)k.matchesSelector=function(p,q){q=q.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(p))try{if(n||!o.match.PSEUDO.test(q)&&!/!=/.test(q))return i.call(p,q)}catch(u){}return k(q,null,null,[p]).length>0}})();(function(){var g= +t.createElement("div");g.innerHTML="
    ";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){o.order.splice(1,0,"CLASS");o.find.CLASS=function(i,n,m){if(typeof n.getElementsByClassName!=="undefined"&&!m)return n.getElementsByClassName(i[1])};g=null}}})();k.contains=t.documentElement.contains?function(g,i){return g!==i&&(g.contains?g.contains(i):true)}:t.documentElement.compareDocumentPosition? +function(g,i){return!!(g.compareDocumentPosition(i)&16)}:function(){return false};k.isXML=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false};var L=function(g,i){for(var n,m=[],p="",q=i.nodeType?[i]:i;n=o.match.PSEUDO.exec(g);){p+=n[0];g=g.replace(o.match.PSEUDO,"")}g=o.relative[g]?g+"*":g;n=0;for(var u=q.length;n0)for(var h=d;h0},closest:function(a,b){var d=[],e,f,h=this[0];if(c.isArray(a)){var l,k={},o=1;if(h&&a.length){e=0;for(f=a.length;e-1:c(h).is(e))d.push({selector:l,elem:h,level:o})}h= +h.parentNode;o++}}return d}l=cb.test(a)?c(a,b||this.context):null;e=0;for(f=this.length;e-1:c.find.matchesSelector(h,a)){d.push(h);break}else{h=h.parentNode;if(!h||!h.ownerDocument||h===b)break}d=d.length>1?c.unique(d):d;return this.pushStack(d,"closest",a)},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var d=typeof a==="string"?c(a,b||this.context): +c.makeArray(a),e=c.merge(this.get(),d);return this.pushStack(!d[0]||!d[0].parentNode||d[0].parentNode.nodeType===11||!e[0]||!e[0].parentNode||e[0].parentNode.nodeType===11?e:c.unique(e))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a, +2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a, +b){c.fn[a]=function(d,e){var f=c.map(this,b,d);Za.test(a)||(e=d);if(e&&typeof e==="string")f=c.filter(e,f);f=this.length>1?c.unique(f):f;if((this.length>1||ab.test(e))&&$a.test(a))f=f.reverse();return this.pushStack(f,a,bb.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return b.length===1?c.find.matchesSelector(b[0],a)?[b[0]]:[]:c.find.matches(a,b)},dir:function(a,b,d){var e=[];for(a=a[b];a&&a.nodeType!==9&&(d===B||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&& +e.push(a);a=a[b]}return e},nth:function(a,b,d){b=b||1;for(var e=0;a;a=a[d])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var za=/ jQuery\d+="(?:\d+|null)"/g,$=/^\s+/,Aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Ba=/<([\w:]+)/,db=/\s]+\/)>/g,P={option:[1, +""],legend:[1,"
    ","
    "],thead:[1,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]};P.optgroup=P.option;P.tbody=P.tfoot=P.colgroup=P.caption=P.thead;P.th=P.td;if(!c.support.htmlSerialize)P._default=[1,"div
    ","
    "];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d= +c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==B)return this.empty().append((this[0]&&this[0].ownerDocument||t).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this}, +wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})}, +prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b, +this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,e;(e=this[d])!=null;d++)if(!a||c.filter(a,[e]).length){if(!b&&e.nodeType===1){c.cleanData(e.getElementsByTagName("*"));c.cleanData([e])}e.parentNode&&e.parentNode.removeChild(e)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild); +return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,e=this.ownerDocument;if(!d){d=e.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(za,"").replace(fb,'="$1">').replace($,"")],e)[0]}else return this.cloneNode(true)});if(a===true){na(this,b);na(this.find("*"),b.find("*"))}return b},html:function(a){if(a===B)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(za,""):null; +else if(typeof a==="string"&&!Ca.test(a)&&(c.support.leadingWhitespace||!$.test(a))&&!P[(Ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Aa,"<$1>");try{for(var b=0,d=this.length;b0||e.cacheable||this.length>1?h.cloneNode(true):h)}k.length&&c.each(k,Oa)}return this}});c.buildFragment=function(a,b,d){var e,f,h;b=b&&b[0]?b[0].ownerDocument||b[0]:t;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===t&&!Ca.test(a[0])&&(c.support.checkClone||!Da.test(a[0]))){f=true;if(h=c.fragments[a[0]])if(h!==1)e=h}if(!e){e=b.createDocumentFragment();c.clean(a,b,e,d)}if(f)c.fragments[a[0]]=h?e:1;return{fragment:e,cacheable:f}};c.fragments={};c.each({appendTo:"append", +prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var e=[];d=c(d);var f=this.length===1&&this[0].parentNode;if(f&&f.nodeType===11&&f.childNodes.length===1&&d.length===1){d[b](this[0]);return this}else{f=0;for(var h=d.length;f0?this.clone(true):this).get();c(d[f])[b](l);e=e.concat(l)}return this.pushStack(e,a,d.selector)}}});c.extend({clean:function(a,b,d,e){b=b||t;if(typeof b.createElement==="undefined")b=b.ownerDocument|| +b[0]&&b[0].ownerDocument||t;for(var f=[],h=0,l;(l=a[h])!=null;h++){if(typeof l==="number")l+="";if(l){if(typeof l==="string"&&!eb.test(l))l=b.createTextNode(l);else if(typeof l==="string"){l=l.replace(Aa,"<$1>");var k=(Ba.exec(l)||["",""])[1].toLowerCase(),o=P[k]||P._default,x=o[0],r=b.createElement("div");for(r.innerHTML=o[1]+l+o[2];x--;)r=r.lastChild;if(!c.support.tbody){x=db.test(l);k=k==="table"&&!x?r.firstChild&&r.firstChild.childNodes:o[1]===""&&!x?r.childNodes:[];for(o=k.length- +1;o>=0;--o)c.nodeName(k[o],"tbody")&&!k[o].childNodes.length&&k[o].parentNode.removeChild(k[o])}!c.support.leadingWhitespace&&$.test(l)&&r.insertBefore(b.createTextNode($.exec(l)[0]),r.firstChild);l=r.childNodes}if(l.nodeType)f.push(l);else f=c.merge(f,l)}}if(d)for(h=0;f[h];h++)if(e&&c.nodeName(f[h],"script")&&(!f[h].type||f[h].type.toLowerCase()==="text/javascript"))e.push(f[h].parentNode?f[h].parentNode.removeChild(f[h]):f[h]);else{f[h].nodeType===1&&f.splice.apply(f,[h+1,0].concat(c.makeArray(f[h].getElementsByTagName("script")))); +d.appendChild(f[h])}return f},cleanData:function(a){for(var b,d,e=c.cache,f=c.event.special,h=c.support.deleteExpando,l=0,k;(k=a[l])!=null;l++)if(!(k.nodeName&&c.noData[k.nodeName.toLowerCase()]))if(d=k[c.expando]){if((b=e[d])&&b.events)for(var o in b.events)f[o]?c.event.remove(k,o):c.removeEvent(k,o,b.handle);if(h)delete k[c.expando];else k.removeAttribute&&k.removeAttribute(c.expando);delete e[d]}}});var Ea=/alpha\([^)]*\)/i,gb=/opacity=([^)]*)/,hb=/-([a-z])/ig,ib=/([A-Z])/g,Fa=/^-?\d+(?:px)?$/i, +jb=/^-?\d/,kb={position:"absolute",visibility:"hidden",display:"block"},Pa=["Left","Right"],Qa=["Top","Bottom"],W,Ga,aa,lb=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){if(arguments.length===2&&b===B)return this;return c.access(this,a,b,true,function(d,e,f){return f!==B?c.style(d,e,f):c.css(d,e)})};c.extend({cssHooks:{opacity:{get:function(a,b){if(b){var d=W(a,"opacity","opacity");return d===""?"1":d}else return a.style.opacity}}},cssNumber:{zIndex:true,fontWeight:true,opacity:true, +zoom:true,lineHeight:true},cssProps:{"float":c.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,d,e){if(!(!a||a.nodeType===3||a.nodeType===8||!a.style)){var f,h=c.camelCase(b),l=a.style,k=c.cssHooks[h];b=c.cssProps[h]||h;if(d!==B){if(!(typeof d==="number"&&isNaN(d)||d==null)){if(typeof d==="number"&&!c.cssNumber[h])d+="px";if(!k||!("set"in k)||(d=k.set(a,d))!==B)try{l[b]=d}catch(o){}}}else{if(k&&"get"in k&&(f=k.get(a,false,e))!==B)return f;return l[b]}}},css:function(a,b,d){var e,f=c.camelCase(b), +h=c.cssHooks[f];b=c.cssProps[f]||f;if(h&&"get"in h&&(e=h.get(a,true,d))!==B)return e;else if(W)return W(a,b,f)},swap:function(a,b,d){var e={},f;for(f in b){e[f]=a.style[f];a.style[f]=b[f]}d.call(a);for(f in b)a.style[f]=e[f]},camelCase:function(a){return a.replace(hb,lb)}});c.curCSS=c.css;c.each(["height","width"],function(a,b){c.cssHooks[b]={get:function(d,e,f){var h;if(e){if(d.offsetWidth!==0)h=oa(d,b,f);else c.swap(d,kb,function(){h=oa(d,b,f)});if(h<=0){h=W(d,b,b);if(h==="0px"&&aa)h=aa(d,b,b); +if(h!=null)return h===""||h==="auto"?"0px":h}if(h<0||h==null){h=d.style[b];return h===""||h==="auto"?"0px":h}return typeof h==="string"?h:h+"px"}},set:function(d,e){if(Fa.test(e)){e=parseFloat(e);if(e>=0)return e+"px"}else return e}}});if(!c.support.opacity)c.cssHooks.opacity={get:function(a,b){return gb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var d=a.style;d.zoom=1;var e=c.isNaN(b)?"":"alpha(opacity="+b*100+")",f= +d.filter||"";d.filter=Ea.test(f)?f.replace(Ea,e):d.filter+" "+e}};if(t.defaultView&&t.defaultView.getComputedStyle)Ga=function(a,b,d){var e;d=d.replace(ib,"-$1").toLowerCase();if(!(b=a.ownerDocument.defaultView))return B;if(b=b.getComputedStyle(a,null)){e=b.getPropertyValue(d);if(e===""&&!c.contains(a.ownerDocument.documentElement,a))e=c.style(a,d)}return e};if(t.documentElement.currentStyle)aa=function(a,b){var d,e,f=a.currentStyle&&a.currentStyle[b],h=a.style;if(!Fa.test(f)&&jb.test(f)){d=h.left; +e=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;h.left=b==="fontSize"?"1em":f||0;f=h.pixelLeft+"px";h.left=d;a.runtimeStyle.left=e}return f===""?"auto":f};W=Ga||aa;if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetHeight;return a.offsetWidth===0&&b===0||!c.support.reliableHiddenOffsets&&(a.style.display||c.css(a,"display"))==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var mb=c.now(),nb=/)<[^<]*)*<\/script>/gi, +ob=/^(?:select|textarea)/i,pb=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,qb=/^(?:GET|HEAD)$/,Ra=/\[\]$/,T=/\=\?(&|$)/,ja=/\?/,rb=/([?&])_=[^&]*/,sb=/^(\w+:)?\/\/([^\/?#]+)/,tb=/%20/g,ub=/#.*$/,Ha=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!=="string"&&Ha)return Ha.apply(this,arguments);else if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var f=a.slice(e,a.length);a=a.slice(0,e)}e="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b=== +"object"){b=c.param(b,c.ajaxSettings.traditional);e="POST"}var h=this;c.ajax({url:a,type:e,dataType:"html",data:b,complete:function(l,k){if(k==="success"||k==="notmodified")h.html(f?c("
    ").append(l.responseText.replace(nb,"")).find(f):l.responseText);d&&h.each(d,[l.responseText,k,l])}});return this},serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&& +!this.disabled&&(this.checked||ob.test(this.nodeName)||pb.test(this.type))}).map(function(a,b){var d=c(this).val();return d==null?null:c.isArray(d)?c.map(d,function(e){return{name:b.name,value:e}}):{name:b.name,value:d}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:e})}, +getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:e})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return new E.XMLHttpRequest},accepts:{xml:"application/xml, text/xml",html:"text/html", +script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},ajax:function(a){var b=c.extend(true,{},c.ajaxSettings,a),d,e,f,h=b.type.toUpperCase(),l=qb.test(h);b.url=b.url.replace(ub,"");b.context=a&&a.context!=null?a.context:b;if(b.data&&b.processData&&typeof b.data!=="string")b.data=c.param(b.data,b.traditional);if(b.dataType==="jsonp"){if(h==="GET")T.test(b.url)||(b.url+=(ja.test(b.url)?"&":"?")+(b.jsonp||"callback")+"=?");else if(!b.data|| +!T.test(b.data))b.data=(b.data?b.data+"&":"")+(b.jsonp||"callback")+"=?";b.dataType="json"}if(b.dataType==="json"&&(b.data&&T.test(b.data)||T.test(b.url))){d=b.jsonpCallback||"jsonp"+mb++;if(b.data)b.data=(b.data+"").replace(T,"="+d+"$1");b.url=b.url.replace(T,"="+d+"$1");b.dataType="script";var k=E[d];E[d]=function(m){if(c.isFunction(k))k(m);else{E[d]=B;try{delete E[d]}catch(p){}}f=m;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);r&&r.removeChild(A)}}if(b.dataType==="script"&&b.cache===null)b.cache= +false;if(b.cache===false&&l){var o=c.now(),x=b.url.replace(rb,"$1_="+o);b.url=x+(x===b.url?(ja.test(b.url)?"&":"?")+"_="+o:"")}if(b.data&&l)b.url+=(ja.test(b.url)?"&":"?")+b.data;b.global&&c.active++===0&&c.event.trigger("ajaxStart");o=(o=sb.exec(b.url))&&(o[1]&&o[1].toLowerCase()!==location.protocol||o[2].toLowerCase()!==location.host);if(b.dataType==="script"&&h==="GET"&&o){var r=t.getElementsByTagName("head")[0]||t.documentElement,A=t.createElement("script");if(b.scriptCharset)A.charset=b.scriptCharset; +A.src=b.url;if(!d){var C=false;A.onload=A.onreadystatechange=function(){if(!C&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){C=true;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);A.onload=A.onreadystatechange=null;r&&A.parentNode&&r.removeChild(A)}}}r.insertBefore(A,r.firstChild);return B}var J=false,w=b.xhr();if(w){b.username?w.open(h,b.url,b.async,b.username,b.password):w.open(h,b.url,b.async);try{if(b.data!=null&&!l||a&&a.contentType)w.setRequestHeader("Content-Type", +b.contentType);if(b.ifModified){c.lastModified[b.url]&&w.setRequestHeader("If-Modified-Since",c.lastModified[b.url]);c.etag[b.url]&&w.setRequestHeader("If-None-Match",c.etag[b.url])}o||w.setRequestHeader("X-Requested-With","XMLHttpRequest");w.setRequestHeader("Accept",b.dataType&&b.accepts[b.dataType]?b.accepts[b.dataType]+", */*; q=0.01":b.accepts._default)}catch(I){}if(b.beforeSend&&b.beforeSend.call(b.context,w,b)===false){b.global&&c.active--===1&&c.event.trigger("ajaxStop");w.abort();return false}b.global&& +c.triggerGlobal(b,"ajaxSend",[w,b]);var L=w.onreadystatechange=function(m){if(!w||w.readyState===0||m==="abort"){J||c.handleComplete(b,w,e,f);J=true;if(w)w.onreadystatechange=c.noop}else if(!J&&w&&(w.readyState===4||m==="timeout")){J=true;w.onreadystatechange=c.noop;e=m==="timeout"?"timeout":!c.httpSuccess(w)?"error":b.ifModified&&c.httpNotModified(w,b.url)?"notmodified":"success";var p;if(e==="success")try{f=c.httpData(w,b.dataType,b)}catch(q){e="parsererror";p=q}if(e==="success"||e==="notmodified")d|| +c.handleSuccess(b,w,e,f);else c.handleError(b,w,e,p);d||c.handleComplete(b,w,e,f);m==="timeout"&&w.abort();if(b.async)w=null}};try{var g=w.abort;w.abort=function(){w&&Function.prototype.call.call(g,w);L("abort")}}catch(i){}b.async&&b.timeout>0&&setTimeout(function(){w&&!J&&L("timeout")},b.timeout);try{w.send(l||b.data==null?null:b.data)}catch(n){c.handleError(b,w,null,n);c.handleComplete(b,w,e,f)}b.async||L();return w}},param:function(a,b){var d=[],e=function(h,l){l=c.isFunction(l)?l():l;d[d.length]= +encodeURIComponent(h)+"="+encodeURIComponent(l)};if(b===B)b=c.ajaxSettings.traditional;if(c.isArray(a)||a.jquery)c.each(a,function(){e(this.name,this.value)});else for(var f in a)da(f,a[f],b,e);return d.join("&").replace(tb,"+")}});c.extend({active:0,lastModified:{},etag:{},handleError:function(a,b,d,e){a.error&&a.error.call(a.context,b,d,e);a.global&&c.triggerGlobal(a,"ajaxError",[b,a,e])},handleSuccess:function(a,b,d,e){a.success&&a.success.call(a.context,e,d,b);a.global&&c.triggerGlobal(a,"ajaxSuccess", +[b,a])},handleComplete:function(a,b,d){a.complete&&a.complete.call(a.context,b,d);a.global&&c.triggerGlobal(a,"ajaxComplete",[b,a]);a.global&&c.active--===1&&c.event.trigger("ajaxStop")},triggerGlobal:function(a,b,d){(a.context&&a.context.url==null?c(a.context):c.event).trigger(b,d)},httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===1223}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"), +e=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(e)c.etag[b]=e;return a.status===304},httpData:function(a,b,d){var e=a.getResponseHeader("content-type")||"",f=b==="xml"||!b&&e.indexOf("xml")>=0;a=f?a.responseXML:a.responseText;f&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b==="json"||!b&&e.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&e.indexOf("javascript")>=0)c.globalEval(a);return a}}); +if(E.ActiveXObject)c.ajaxSettings.xhr=function(){if(E.location.protocol!=="file:")try{return new E.XMLHttpRequest}catch(a){}try{return new E.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}};c.support.ajax=!!c.ajaxSettings.xhr();var ea={},vb=/^(?:toggle|show|hide)$/,wb=/^([+\-]=)?([\d+.\-]+)(.*)$/,ba,pa=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b,d){if(a||a===0)return this.animate(S("show", +3),a,b,d);else{d=0;for(var e=this.length;d=0;e--)if(d[e].elem===this){b&&d[e](true);d.splice(e,1)}});b||this.dequeue();return this}});c.each({slideDown:S("show",1),slideUp:S("hide",1),slideToggle:S("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){c.fn[a]=function(d,e,f){return this.animate(b, +d,e,f)}});c.extend({speed:function(a,b,d){var e=a&&typeof a==="object"?c.extend({},a):{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};e.duration=c.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in c.fx.speeds?c.fx.speeds[e.duration]:c.fx.speeds._default;e.old=e.complete;e.complete=function(){e.queue!==false&&c(this).dequeue();c.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,d,e){return d+e*a},swing:function(a,b,d,e){return(-Math.cos(a* +Math.PI)/2+0.5)*e+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||c.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a=parseFloat(c.css(this.elem,this.prop));return a&&a>-1E4?a:0},custom:function(a,b,d){function e(l){return f.step(l)} +var f=this,h=c.fx;this.startTime=c.now();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;this.pos=this.state=0;e.elem=this.elem;if(e()&&c.timers.push(e)&&!ba)ba=setInterval(h.tick,h.interval)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true; +this.custom(this.cur(),0)},step:function(a){var b=c.now(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var e in this.options.curAnim)if(this.options.curAnim[e]!==true)d=false;if(d){if(this.options.overflow!=null&&!c.support.shrinkWrapBlocks){var f=this.elem,h=this.options;c.each(["","X","Y"],function(k,o){f.style["overflow"+o]=h.overflow[k]})}this.options.hide&&c(this.elem).hide();if(this.options.hide|| +this.options.show)for(var l in this.options.curAnim)c.style(this.elem,l,this.options.orig[l]);this.options.complete.call(this.elem)}return false}else{a=b-this.startTime;this.state=a/this.options.duration;b=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||b](this.state,a,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a= +c.timers,b=0;b-1;e={};var x={};if(o)x=f.position();l=o?x.top:parseInt(l,10)||0;k=o?x.left:parseInt(k,10)||0;if(c.isFunction(b))b=b.call(a,d,h);if(b.top!=null)e.top=b.top-h.top+l;if(b.left!=null)e.left=b.left-h.left+k;"using"in b?b.using.call(a, +e):f.css(e)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),e=Ia.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.css(a,"marginTop"))||0;d.left-=parseFloat(c.css(a,"marginLeft"))||0;e.top+=parseFloat(c.css(b[0],"borderTopWidth"))||0;e.left+=parseFloat(c.css(b[0],"borderLeftWidth"))||0;return{top:d.top-e.top,left:d.left-e.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||t.body;a&&!Ia.test(a.nodeName)&& +c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(e){var f=this[0],h;if(!f)return null;if(e!==B)return this.each(function(){if(h=fa(this))h.scrollTo(!a?e:c(h).scrollLeft(),a?e:c(h).scrollTop());else this[d]=e});else return(h=fa(f))?"pageXOffset"in h?h[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&h.document.documentElement[d]||h.document.body[d]:f[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase(); +c.fn["inner"+b]=function(){return this[0]?parseFloat(c.css(this[0],d,"padding")):null};c.fn["outer"+b]=function(e){return this[0]?parseFloat(c.css(this[0],d,e?"margin":"border")):null};c.fn[d]=function(e){var f=this[0];if(!f)return e==null?null:this;if(c.isFunction(e))return this.each(function(l){var k=c(this);k[d](e.call(this,l,k[d]()))});if(c.isWindow(f))return f.document.compatMode==="CSS1Compat"&&f.document.documentElement["client"+b]||f.document.body["client"+b];else if(f.nodeType===9)return Math.max(f.documentElement["client"+ +b],f.body["scroll"+b],f.documentElement["scroll"+b],f.body["offset"+b],f.documentElement["offset"+b]);else if(e===B){f=c.css(f,d);var h=parseFloat(f);return c.isNaN(h)?f:h}else return this.css(d,typeof e==="string"?e:e+"px")}})})(window); diff --git a/common/js/minify.ini b/common/js/minify.ini new file mode 100644 index 000000000..f03125728 --- /dev/null +++ b/common/js/minify.ini @@ -0,0 +1,17 @@ +[option] + +[skip] +jquery.js +js_app.js +common.js +xml_handler.js +xml_js_filter.js +iepngfix_tilebg.js +xe.header.js + +[merge >> xe.js] +xe.header.js +js_app.js +common.js +xml_hanlder.js +xml_js_filter.js diff --git a/common/js/x.min.js b/common/js/x.min.js new file mode 100644 index 000000000..a1dfffced --- /dev/null +++ b/common/js/x.min.js @@ -0,0 +1,56 @@ +/** + * x.js compiled from X 4.0 with XC 0.27b. + * Distributed by GNU LGPL. For copyrights, license, documentation and more visit Cross-Browser.com + * Copyright 2001-2005 Michael Foster (Cross-Browser.com) + **/ +function xDeprecate(funcName){var msg='DEPRECATED : '+funcName+'() is deprecated function.';if(typeof console=='object'&&typeof console.log=='function')console.log(msg)};var xOp7Up,xOp6Dn,xIE4Up,xIE4,xIE5,xIE6,xNN4,xUA=navigator.userAgent.toLowerCase();if(window.opera){var i=xUA.indexOf('opera');if(i!=-1){var v=parseInt(xUA.charAt(i+6));xOp7Up=v>=7;xOp6Dn=v<7}}else if(navigator.vendor!='KDE'&&document.all&&xUA.indexOf('msie')!=-1){xIE4Up=parseFloat(navigator.appVersion)>=4;xIE4=xUA.indexOf('msie 4')!=-1;xIE5=xUA.indexOf('msie 5')!=-1;xIE6=xUA.indexOf('msie 6')!=-1}else if(document.layers)xNN4=true;var xMac=xUA.indexOf('mac')!=-1,xFF=xUA.indexOf('firefox')!=-1 +function xAddEventListener(e,eT,eL,cap){xDeprecate('xAddEventListener');if(!(e=xGetElementById(e)))return;eT=eT.toLowerCase();if((!xIE4Up&&!xOp7Up)&&e==window){if(eT=='resize'){window.xPCW=xClientWidth();window.xPCH=xClientHeight();window.xREL=eL;xResizeEvent();return};if(eT=='scroll'){window.xPSL=xScrollLeft();window.xPST=xScrollTop();window.xSEL=eL;xScrollEvent();return}};var eh='e.on'+eT+'=eL';if(e.addEventListener){e.addEventListener(eT,eL,cap)}else if(e.attachEvent){e.attachEvent('on'+eT,eL)}else eval(eh)} +function xResizeEvent(){xDeprecate('xResizeEvent');if(window.xREL)setTimeout('xResizeEvent()',250);var cw=xClientWidth(),ch=xClientHeight();if(window.xPCW!=cw||window.xPCH!=ch){window.xPCW=cw;window.xPCH=ch;if(window.xREL)window.xREL()}} +function xScrollEvent(){xDeprecate('xScrollEvent');if(window.xSEL)setTimeout('xScrollEvent()',250);var sl=xScrollLeft(),st=xScrollTop();if(window.xPSL!=sl||window.xPST!=st){window.xPSL=sl;window.xPST=st;if(window.xSEL)window.xSEL()}} +function xAppendChild(oParent,oChild){xDeprecate('xAppendChild');if(oParent.appendChild){return oParent.appendChild(oChild)}else return null} +function xClientHeight(){xDeprecate('xClientHeight');var h=0;if(xOp6Dn){h=window.innerHeight}else if(document.compatMode=='CSS1Compat'&&!window.opera&&document.documentElement&&document.documentElement.clientHeight){h=document.documentElement.clientHeight}else if(document.body&&document.body.clientHeight){h=document.body.clientHeight}else if(xDef(window.innerWidth,window.innerHeight,document.width)){h=window.innerHeight;if(document.width>window.innerWidth)h-=16};return h} +function xClientWidth(){xDeprecate('xClientWidth');var w=0;if(xOp6Dn){w=window.innerWidth}else if(document.compatMode=='CSS1Compat'&&!window.opera&&document.documentElement&&document.documentElement.clientWidth){w=document.documentElement.clientWidth}else if(document.body&&document.body.clientWidth){w=document.body.clientWidth}else if(xDef(window.innerWidth,window.innerHeight,document.height)){w=window.innerWidth;if(document.height>window.innerHeight)w-=16};return w} +function xCreateElement(sTag){xDeprecate('xCreateElement');if(document.createElement){return document.createElement(sTag)}else return null} +function xDef(){xDeprecate('xDef');for(var i=0;i0){var offset=document.cookie.indexOf(search);if(offset!=-1){offset+=search.length;var end=document.cookie.indexOf(";",offset);if(end==-1)end=document.cookie.length;value=unescape(document.cookie.substring(offset,end))}};return value} +function xGetElementById(e){xDeprecate('xGetElementById');if(typeof (e)!='string')return e;if(document.getElementById){e=document.getElementById(e)}else if(document.all){e=document.all[e]}else e=null;return e} +function xGetElementsByAttribute(sTag,sAtt,sRE,fn){xDeprecate('xGetElementsByAttribute');var a,list,found=new Array(),re=new RegExp(sRE,'i');list=xGetElementsByTagName(sTag);for(var i=0;i=0){var pt=0,pb=0,bt=0,bb=0;if(document.compatMode=='CSS1Compat'){var gcs=xGetComputedStyle;pt=gcs(e,'padding-top',1);if(pt!==null){pb=gcs(e,'padding-bottom',1);bt=gcs(e,'border-top-width',1);bb=gcs(e,'border-bottom-width',1)}else if(xDef(e.offsetHeight,e.style.height)){e.style.height=h+'px';pt=e.offsetHeight-h}};h-=(pt+pb+bt+bb);if(isNaN(h)||h<0){return null}else e.style.height=h+'px'};h=e.offsetHeight}else if(css&&xDef(e.style.pixelHeight)){if(h>=0)e.style.pixelHeight=h;h=e.style.pixelHeight};return h} +function xHex(sn,digits,prefix){xDeprecate('xHex');var p='',n=Math.ceil(sn);if(prefix)p=prefix;n=n.toString(16);for(var i=0;i=0){var pl=0,pr=0,bl=0,br=0;if(document.compatMode=='CSS1Compat'){var gcs=xGetComputedStyle;pl=gcs(e,'padding-left',1);if(pl!==null){pr=gcs(e,'padding-right',1);bl=gcs(e,'border-left-width',1);br=gcs(e,'border-right-width',1)}else if(xDef(e.offsetWidth,e.style.width)){e.style.width=w+'px';pl=e.offsetWidth-w}};w-=(pl+pr+bl+br);if(isNaN(w)||w<0){return null}else e.style.width=w+'px'};w=e.offsetWidth}else if(css&&xDef(e.style.pixelWidth)){if(w>=0)e.style.pixelWidth=w;w=e.style.pixelWidth};return w} +function xZIndex(e,uZ){xDeprecate('xZIndex');if(!(e=xGetElementById(e)))return 0;if(e.style&&xDef(e.style.zIndex)){if(xNum(uZ))e.style.zIndex=uZ;uZ=parseInt(e.style.zIndex)};return uZ} +function xStopPropagation(evt){xDeprecate('xStopPropagation');if(evt&&evt.stopPropagation){evt.stopPropagation()}else if(window.event)window.event.cancelBubble=true} \ No newline at end of file diff --git a/common/js/xe.js b/common/js/xe.js new file mode 100644 index 000000000..10a756499 --- /dev/null +++ b/common/js/xe.js @@ -0,0 +1,1579 @@ +/** + * @file js_app.js + * @author NHN (developers@xpressengine.com) + * @brief XE JavaScript Application Framework (JAF) + * @namespace xe + * @update 20100701 + */ +(function($){ + +var _xe_base, _app_base, _plugin_base; +var _apps = []; + +_xe_base = { + /** + * @brief return the name of Core module + */ + getName : function() { + return 'Core'; + }, + + /** + * @brief Create an application class + */ + createApp : function(sName, oDef) { + var _base = getTypeBase(); + + $.extend(_base.prototype, _app_base, oDef); + + _base.prototype.getName = function() { + return sName; + }; + + return _base; + }, + + /** + * @brief Create a plugin class + */ + createPlugin : function(sName, oDef) { + var _base = getTypeBase(); + + $.extend(_base.prototype, _plugin_base, oDef); + + _base.prototype.getName = function() { + return sName; + }; + + return _base; + }, + + /** + * @brief Get the array of applications + */ + getApps : function() { + return $.makeArray(_apps); + }, + + /** + * @brief Get one application + */ + getApp : function(indexOrName) { + indexOrName = (indexOrName||'').toLowerCase(); + if(typeof _apps[indexOrName] != 'undefined') { + return _apps[indexOrName]; + } else { + return null; + } + }, + + /** + * @brief Register an application instance + */ + registerApp : function(oApp) { + var sName = oApp.getName().toLowerCase(); + + _apps.push(oApp); + if (!$.isArray(_apps[sName])) { + _apps[sName] = []; + } + _apps[sName].push(oApp); + + oApp.parent = this; + + // register event + if ($.isFunction(oApp.activate)) oApp.activate(); + }, + + /** + * @brief Unregister an application instance + */ + unregisterApp : function(oApp) { + var sName = oPlugin.getName().toLowerCase(); + var nIndex = $.inArray(oApp, _apps); + + if (nIndex >= 0) _apps.splice(nIndex, 1); + + if ($.isArray(_apps[sName])) { + nIndex = $.inArray(oApp, _apps[sName]); + if (nIndex >= 0) _apps[sName].splice(nIndex, 1); + } + + // unregister event + if ($.isFunction(oApp.deactivate)) oApp.deactivate(); + }, + + /** + * @brief overrides broadcast method + */ + broadcast : function(msg, params) { + this._broadcast(this, msg, params); + }, + + _broadcast : function(sender, msg, params) { + for(var i=0; i < _apps.length; i++) { + _apps[i]._cast(sender, msg, params); + } + + + // cast to child plugins + this._cast(sender, msg, params); + } +} + +_app_base = { + _plugins : [], + _messages : {}, + + /** + * @brief get plugin + */ + getPlugin : function(sPluginName) { + sPluginName = sPluginName.toLowerCase(); + if ($.isArray(this._plugins[sPluginName])) { + return this._plugins[sPluginName]; + } else { + return []; + } + }, + + /** + * @brief register a plugin instance + */ + registerPlugin : function(oPlugin) { + var self = this; + var sName = oPlugin.getName().toLowerCase(); + + // check if the plugin is already registered + if ($.inArray(oPlugin, this._plugins) >= 0) return false; + + // push the plugin into the _plugins array + this._plugins.push(oPlugin); + + if (!$.isArray(this._plugins[sName])) this._plugins[sName] = []; + this._plugins[sName].push(oPlugin); + + // register method pool + $.each(oPlugin._binded_fn, function(api, fn){ self.registerHandler(api, fn); }); + + // binding + oPlugin.oApp = this; + + // registered event + if ($.isFunction(oPlugin.activate)) oPlugin.activate(); + + return true; + }, + + /** + * @brief register api message handler + */ + registerHandler : function(api, func) { + var msgs = this._messages; api = api.toUpperCase(); + if (!$.isArray(msgs[api])) msgs[api] = []; + msgs[api].push(func); + }, + + cast : function(msg, params) { + return this._cast(this, msg, params || []); + }, + + broadcast : function(sender, msg, params) { + if (this.parent && this.parent._broadcast) { + this.parent._broadcast(sender, msg, params); + } + }, + + _cast : function(sender, msg, params) { + var i, len; + var aMsg = this._messages; + + msg = msg.toUpperCase(); + + // BEFORE hooker + if (aMsg['BEFORE_'+msg] || this['API_BEFORE_'+msg]) { + var bContinue = this._cast(sender, 'BEFORE_'+msg, params); + if (!bContinue) return; + } + + // main api function + var vRet = [], sFn = 'API_'+msg; + if ($.isArray(aMsg[msg])) { + for(i=0; i < aMsg[msg].length; i++) { + vRet.push( aMsg[msg][i](sender, params) ); + } + } + if (vRet.length < 2) vRet = vRet[0]; + + // AFTER hooker + if (aMsg['AFTER_'+msg] || this['API_AFTER_'+msg]) { + this._cast(sender, 'AFTER_'+msg, params); + } + + if (!/^(?:AFTER|BEFORE)_/.test(msg)) { // top level function + return vRet; + } else { + return $.isArray(vRet)?($.inArray(false, vRet)<0):((typeof vRet=='undefined')?true:!!vRet); + } + } +}; + +_plugin_base = { + oApp : null, + + cast : function(msg, params) { + if (this.oApp && this.oApp._cast) { + return this.oApp._cast(this, msg, params || []); + } + }, + + broadcast : function(msg, params) { + if (this.oApp && this.oApp.broadcast) { + this.oApp.broadcast(this, mag, params || []); + } + } + + /** + * Event handler prototype + * + * function (oSender, params) + */ +}; + +function getTypeBase() { + var _base = function() { + var self = this; + var pool = null; + + if ($.isArray(this._plugins)) this._plugins = []; + if (this._messages) this._messages = {}; + else this._binded_fn = {}; + + // bind functions + $.each(this, function(key, val){ + if (!$.isFunction(val)) return true; + if (!/^API_([A-Z0-9_]+)$/.test(key)) return true; + + var api = RegExp.$1; + var fn = function(sender, params){ return self[key](sender, params) }; + + if (self._messages) self._messages[api] = [fn]; + else self._binded_fn[api] = fn; + }); + + if ($.isFunction(this.init)) this.init.apply(this, arguments); + }; + + return _base; +} + +window.xe = $.extend(_app_base, _xe_base); +window.xe.lang = {}; // language repository + +// domready event +$(function(){ xe.broadcast('ONREADY'); }); + +// load event +$(window).load(function(){ xe.broadcast('ONLOAD'); }); + +})(jQuery); +/** + * @file common.js + * @author NHN (developers@xpressengine.com) + * @brief 몇가지 유용한 & 기본적으로 자주 사용되는 자바스크립트 함수들 모음 + **/ + +/* jQuery 참조변수($) 제거 */ +if(jQuery) jQuery.noConflict(); + +(function($) { + /* OS check */ + var UA = navigator.userAgent.toLowerCase(); + $.os = { + Linux: /linux/.test(UA), + Unix: /x11/.test(UA), + Mac: /mac/.test(UA), + Windows: /win/.test(UA) + }; + $.os.name = ($.os.Windows) ? 'Windows' : + ($.os.Linux) ? 'Linux' : + ($.os.Unix) ? 'Unix' : + ($.os.Mac) ? 'Mac' : ''; + + /** + * @brief XE 공용 유틸리티 함수 + * @namespace XE + */ + window.XE = { + loaded_popup_menus : new Array(), + addedDocument : new Array(), + /** + * @brief 특정 name을 가진 체크박스들의 checked 속성 변경 + * @param [itemName='cart',][options={}] + */ + checkboxToggleAll : function() { + var itemName='cart'; + var options = { + wrap : null, + checked : 'toggle', + doClick : false + }; + + switch(arguments.length) { + case 1: + if(typeof(arguments[0]) == "string") { + itemName = arguments[0]; + } else { + $.extend(options, arguments[0] || {}); + } + break; + case 2: + itemName = arguments[0]; + $.extend(options, arguments[1] || {}); + } + + if(options.doClick == true) options.checked = null; + if(typeof(options.wrap) == "string") options.wrap ='#'+options.wrap; + + if(options.wrap) { + var obj = $(options.wrap).find('input[name='+itemName+']:checkbox'); + } else { + var obj = $('input[name='+itemName+']:checkbox'); + } + + if(options.checked == 'toggle') { + obj.each(function() { + $(this).attr('checked', ($(this).attr('checked')) ? false : true); + }); + } else { + (options.doClick == true) ? obj.click() : obj.attr('checked', options.checked); + } + }, + + /** + * @brief 문서/회원 등 팝업 메뉴 출력 + */ + displayPopupMenu : function(ret_obj, response_tags, params) { + var target_srl = params["target_srl"]; + var menu_id = params["menu_id"]; + var menus = ret_obj['menus']; + var html = ""; + + if(this.loaded_popup_menus[menu_id]) { + html = this.loaded_popup_menus[menu_id]; + + } else { + if(menus) { + var item = menus['item']; + if(typeof(item.length)=='undefined' || item.length<1) item = new Array(item); + if(item.length) { + for(var i=0;i'+str+' '; + } + } + } + this.loaded_popup_menus[menu_id] = html; + } + + /* 레이어 출력 */ + if(html) { + var area = $('#popup_menu_area').html('
      '+html+'
    '); + var areaOffset = {top:params['page_y'], left:params['page_x']}; + + if(area.outerHeight()+areaOffset.top > $(window).height()+$(window).scrollTop()) + areaOffset.top = $(window).height() - area.outerHeight() + $(window).scrollTop(); + if(area.outerWidth()+areaOffset.left > $(window).width()+$(window).scrollLeft()) + areaOffset.left = $(window).width() - area.outerWidth() + $(window).scrollLeft(); + + area.css({ top:areaOffset.top, left:areaOffset.left }).show(); + } + } + } + +}) (jQuery); + + + +/* jQuery(document).ready() */ +jQuery(function($) { + + /* select - option의 disabled=disabled 속성을 IE에서도 체크하기 위한 함수 */ + if($.browser.msie) { + $('select').each(function(i, sels) { + var disabled_exists = false; + var first_enable = new Array(); + + for(var j=0; j < sels.options.length; j++) { + if(sels.options[j].disabled) { + sels.options[j].style.color = '#CCCCCC'; + disabled_exists = true; + }else{ + first_enable[i] = (first_enable[i] > -1) ? first_enable[i] : j; + } + } + + if(!disabled_exists) return; + + sels.oldonchange = sels.onchange; + sels.onchange = function() { + if(this.options[this.selectedIndex].disabled) { + + this.selectedIndex = first_enable[i]; + /* + if(this.options.length<=1) this.selectedIndex = -1; + else if(this.selectedIndex < this.options.length - 1) this.selectedIndex++; + else this.selectedIndex--; + */ + + } else { + if(this.oldonchange) this.oldonchange(); + } + }; + + if(sels.selectedIndex >= 0 && sels.options[ sels.selectedIndex ].disabled) sels.onchange(); + + }); + } + + /* 단락에디터 fold 컴포넌트 펼치기/접기 */ + var drEditorFold = $('.xe_content .fold_button'); + if(drEditorFold.size()) { + var fold_container = $('div.fold_container', drEditorFold); + $('button.more', drEditorFold).click(function() { + $(this).hide().next('button').show().parent().next(fold_container).show(); + }); + $('button.less', drEditorFold).click(function() { + $(this).hide().prev('button').show().parent().next(fold_container).hide(); + }); + } + +}); + + +/** + * @brief location.href에서 특정 key의 값을 return + **/ +String.prototype.getQuery = function(key) { + var idx = this.indexOf('?'); + if(idx == -1) return null; + var query_string = this.substr(idx+1, this.length); + var args = {}; + query_string.replace(/([^=]+)=([^&]*)(&|$)/g, function() { args[arguments[1]] = arguments[2]; }); + + var q = args[key]; + if(typeof(q)=="undefined") q = ""; + + return q; +} + +/** + * @brief location.href에서 특정 key의 값을 return + **/ +String.prototype.setQuery = function(key, val) { + var idx = this.indexOf('?'); + var uri = this.replace(/#$/, ''); + + if(idx != -1) { + var query_string = uri.substr(idx+1, this.length), args = {}, q_list = []; + uri = this.substr(0, idx); + query_string.replace(/([^=]+)=([^&]*)(&|$)/g, function(all,key,val) { args[key] = val; }); + + args[key] = val; + + jQuery.each(args, function(key,val){ + if (!jQuery.trim(val)) return; + q_list.push(key+'='+decodeURI(val)); + }); + + query_string = q_list.join('&'); + uri = uri+(query_string?'?'+query_string:''); + } else { + if(val.toString().trim()) uri = uri+"?"+key+"="+val; + } + + var re = /https:\/\/([^:\/]+)(:\d+|)/i; + var check = re.exec(uri); + if(check) + { + var toReplace = "http://"+check[1]; + if(typeof(http_port)!='undefined' && http_port != 80) + { + toReplace += ":" + http_port; + } + uri = uri.replace(re,toReplace); + } + var bUseSSL = false; + if(typeof(enforce_ssl)!='undefined' && enforce_ssl) + { + bUseSSL = true; + } + else if(typeof(ssl_actions)!='undefined' && typeof(ssl_actions.length)!='undefined' && uri.getQuery('act')) { + var act = uri.getQuery('act'); + for(i=0;i-1 && !url.getQuery('vid')) url = url.setQuery('vid',xeVid); + try { + if(target != "_blank" && winopen_list[target]) { + winopen_list[target].close(); + winopen_list[target] = null; + } + } catch(e) { + } + + if(typeof(target) == 'undefined') target = '_blank'; + if(typeof(attribute) == 'undefined') attribute = ''; + var win = window.open(url, target, attribute); + win.focus(); + if(target != "_blank") winopen_list[target] = win; +} + +/** + * @brief 팝업으로만 띄우기 + * common/tpl/popup_layout.html이 요청되는 XE내의 팝업일 경우에 사용 + **/ +function popopen(url, target) { + if(typeof(target) == "undefined") target = "_blank"; + if(typeof(xeVid)!='undefined' && url.indexOf(request_uri)>-1 && !url.getQuery('vid')) url = url.setQuery('vid',xeVid); + winopen(url, target, "left=10,top=10,width=10,height=10,scrollbars=no,resizable=yes,toolbars=no"); +} + +/** + * @brief 메일 보내기용 + **/ +function sendMailTo(to) { + location.href="mailto:"+to; +} + +/** + * @brief url이동 (open_window 값이 N 가 아니면 새창으로 띄움) + **/ +function move_url(url, open_wnidow) { + if(!url) return false; + if(typeof(open_wnidow) == 'undefined') open_wnidow = 'N'; + if(open_wnidow=='N') { + open_wnidow = false; + } else { + open_wnidow = true; + } + + if(/^\./.test(url)) url = request_uri+url; + + if(open_wnidow) { + winopen(url); + } else { + location.href=url; + } + + return false; +} + +/** + * @brief 멀티미디어 출력용 (IE에서 플래쉬/동영상 주변에 점선 생김 방지용) + **/ +function displayMultimedia(src, width, height, options) { + var html = _displayMultimedia(src, width, height, options); + if(html) document.writeln(html); +} +function _displayMultimedia(src, width, height, options) { + if(src.indexOf('files') == 0) src = request_uri + src; + + var defaults = { + wmode : 'transparent', + allowScriptAccess : 'sameDomain', + quality : 'high', + flashvars : '', + autostart : false + }; + + var params = jQuery.extend(defaults, options || {}); + var autostart = (params.autostart && params.autostart != 'false') ? 'true' : 'false'; + delete(params.autostart); + + var clsid = ""; + var codebase = ""; + var html = ""; + + if(/\.(gif|jpg|jpeg|bmp|png)$/i.test(src)){ + html = ''; + } else if(/\.flv$/i.test(src) || /\.mov$/i.test(src) || /\.moov$/i.test(src) || /\.m4v$/i.test(src)) { + html = ''; + } else if(/\.swf/i.test(src)) { + clsid = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000'; + + if(typeof(enforce_ssl)!='undefined' && enforce_ssl){ codebase = "https://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0"; } + else { codebase = "http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0"; } + html = ''; + html += ''; + for(var name in params) { + if(params[name] != 'undefined' && params[name] != '') { + html += ''; + } + } + html += '' + + '' + + ''; + } else { + if (jQuery.browser.mozilla || jQuery.browser.opera) { + // firefox and opera uses 0 or 1 for autostart parameter. + autostart = (params.autostart && params.autostart != 'false') ? '1' : '0'; + } + + html = ' 400) { + $body.css({ overflow:'auto', overflowX:'hidden', height:400+'px' }); + } + } + + var $win = $(window); + var $pc = $('#popup_content'); + var w = Math.max($pc[0].offsetWidth, 600); + var h = $pc[0].offsetHeight; + var dw = $win.width(); + var dh = $win.height(); + var _w = 0, _h = 0; + + if (w != dw) _w = w - dw; + if (h != dh) _h = h - dh; + + if (_w || _h) { + window.resizeBy(_w, _h); + } + + if (!arguments.callee.executed) { + setTimeout(setFixedPopupSize, 300); + arguments.callee.executed = true; + } +} + +/** + * @brief 추천/비추천,스크랩,신고기능등 특정 srl에 대한 특정 module/action을 호출하는 함수 + **/ +function doCallModuleAction(module, action, target_srl) { + var params = new Array(); + params['target_srl'] = target_srl; + params['cur_mid'] = current_mid; + exec_xml(module, action, params, completeCallModuleAction); +} + +function completeCallModuleAction(ret_obj, response_tags) { + if(ret_obj['message']!='success') alert(ret_obj['message']); + location.reload(); +} + +function completeMessage(ret_obj) { + alert(ret_obj['message']); + location.reload(); +} + + + +/* 언어코드 (lang_type) 쿠키값 변경 */ +function doChangeLangType(obj) { + if(typeof(obj) == "string") { + setLangType(obj); + } else { + var val = obj.options[obj.selectedIndex].value; + setLangType(val); + } + location.href = location.href.setQuery('l', ''); +} +function setLangType(lang_type) { + var expire = new Date(); + expire.setTime(expire.getTime()+ (7000 * 24 * 3600000)); + setCookie('lang_type', lang_type, expire, '/'); +} + +/* 미리보기 */ +function doDocumentPreview(obj) { + var fo_obj = obj; + while(fo_obj.nodeName != "FORM") { + fo_obj = fo_obj.parentNode; + } + if(fo_obj.nodeName != "FORM") return; + var editor_sequence = fo_obj.getAttribute('editor_sequence'); + + var content = editorGetContent(editor_sequence); + + var win = window.open("", "previewDocument","toolbars=no,width=700px;height=800px,scrollbars=yes,resizable=yes"); + + var dummy_obj = jQuery("#previewDocument"); + + if(!dummy_obj.length) { + jQuery( + '
    '+ + ''+ + ''+ + ''+ + '' + ).appendTo(document.body); + + dummy_obj = jQuery("#previewDocument")[0]; + } + + if(dummy_obj) { + dummy_obj.content.value = content; + dummy_obj.submit(); + } +} + +/* 게시글 저장 */ +function doDocumentSave(obj) { + var editor_sequence = obj.form.getAttribute('editor_sequence'); + var prev_content = editorRelKeys[editor_sequence]['content'].value; + if(typeof(editor_sequence)!='undefined' && editor_sequence && typeof(editorRelKeys)!='undefined' && typeof(editorGetContent)=='function') { + var content = editorGetContent(editor_sequence); + editorRelKeys[editor_sequence]['content'].value = content; + } + + var params={}, responses=['error','message','document_srl'], elms=obj.form.elements, data=jQuery(obj.form).serializeArray();; + jQuery.each(data, function(i, field){ + var val = jQuery.trim(field.value); + if(!val) return true; + if(/\[\]$/.test(field.name)) field.name = field.name.replace(/\[\]$/, ''); + if(params[field.name]) params[field.name] += '|@|'+val; + else params[field.name] = field.value; + }); + + exec_xml('member','procMemberSaveDocument', params, completeDocumentSave, responses, params, obj.form); + + editorRelKeys[editor_sequence]['content'].value = prev_content; + return false; +} + +function completeDocumentSave(ret_obj) { + jQuery('input[name=document_srl]').eq(0).val(ret_obj['document_srl']); + alert(ret_obj['message']); +} + +/* 저장된 게시글 불러오기 */ +var objForSavedDoc = null; +function doDocumentLoad(obj) { + // 저장된 게시글 목록 불러오기 + objForSavedDoc = obj.form; + popopen(request_uri.setQuery('module','member').setQuery('act','dispSavedDocumentList')); +} + +/* 저장된 게시글의 선택 */ +function doDocumentSelect(document_srl) { + if(!opener || !opener.objForSavedDoc) { + window.close(); + return; + } + + // 게시글을 가져와서 등록하기 + opener.location.href = opener.current_url.setQuery('document_srl', document_srl).setQuery('act', 'dispBoardWrite'); + window.close(); +} + + +/* 스킨 정보 */ +function viewSkinInfo(module, skin) { + popopen("./?module=module&act=dispModuleSkinInfo&selected_module="+module+"&skin="+skin, 'SkinInfo'); +} + + +/* 관리자가 문서를 관리하기 위해서 선택시 세션에 넣음 */ +var addedDocument = new Array(); +function doAddDocumentCart(obj) { + var srl = obj.value; + addedDocument[addedDocument.length] = srl; + setTimeout(function() { callAddDocumentCart(addedDocument.length); }, 100); +} + +function callAddDocumentCart(document_length) { + if(addedDocument.length<1 || document_length != addedDocument.length) return; + var params = new Array(); + params["srls"] = addedDocument.join(","); + exec_xml("document","procDocumentAddCart", params, null); + addedDocument = new Array(); +} + +/* ff의 rgb(a,b,c)를 #... 로 변경 */ +function transRGB2Hex(value) { + if(!value) return value; + if(value.indexOf('#') > -1) return value.replace(/^#/, ''); + + if(value.toLowerCase().indexOf('rgb') < 0) return value; + value = value.replace(/^rgb\(/i, '').replace(/\)$/, ''); + value_list = value.split(','); + + var hex = ''; + for(var i = 0; i < value_list.length; i++) { + var color = parseInt(value_list[i], 10).toString(16); + if(color.length == 1) color = '0'+color; + hex += color; + } + return hex; +} + +/* 보안 로그인 모드로 전환 */ +function toggleSecuritySignIn() { + var href = location.href; + if(/https:\/\//i.test(href)) location.href = href.replace(/^https/i,'http'); + else location.href = href.replace(/^http/i,'https'); +} + +function reloadDocument() { + location.reload(); +} + + +/** +* +* Base64 encode / decode +* http://www.webtoolkit.info/ +* +**/ + +var Base64 = { + + // private property + _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", + + // public method for encoding + encode : function (input) { + var output = ""; + var chr1, chr2, chr3, enc1, enc2, enc3, enc4; + var i = 0; + + input = Base64._utf8_encode(input); + + while (i < input.length) { + + chr1 = input.charCodeAt(i++); + chr2 = input.charCodeAt(i++); + chr3 = input.charCodeAt(i++); + + enc1 = chr1 >> 2; + enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); + enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); + enc4 = chr3 & 63; + + if (isNaN(chr2)) { + enc3 = enc4 = 64; + } else if (isNaN(chr3)) { + enc4 = 64; + } + + output = output + + this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) + + this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4); + + } + + return output; + }, + + // public method for decoding + decode : function (input) { + var output = ""; + var chr1, chr2, chr3; + var enc1, enc2, enc3, enc4; + var i = 0; + + input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); + + while (i < input.length) { + + enc1 = this._keyStr.indexOf(input.charAt(i++)); + enc2 = this._keyStr.indexOf(input.charAt(i++)); + enc3 = this._keyStr.indexOf(input.charAt(i++)); + enc4 = this._keyStr.indexOf(input.charAt(i++)); + + chr1 = (enc1 << 2) | (enc2 >> 4); + chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); + chr3 = ((enc3 & 3) << 6) | enc4; + + output = output + String.fromCharCode(chr1); + + if (enc3 != 64) { + output = output + String.fromCharCode(chr2); + } + if (enc4 != 64) { + output = output + String.fromCharCode(chr3); + } + + } + + output = Base64._utf8_decode(output); + + return output; + + }, + + // private method for UTF-8 encoding + _utf8_encode : function (string) { + string = string.replace(/\r\n/g,"\n"); + var utftext = ""; + + for (var n = 0; n < string.length; n++) { + + var c = string.charCodeAt(n); + + if (c < 128) { + utftext += String.fromCharCode(c); + } + else if((c > 127) && (c < 2048)) { + utftext += String.fromCharCode((c >> 6) | 192); + utftext += String.fromCharCode((c & 63) | 128); + } + else { + utftext += String.fromCharCode((c >> 12) | 224); + utftext += String.fromCharCode(((c >> 6) & 63) | 128); + utftext += String.fromCharCode((c & 63) | 128); + } + + } + + return utftext; + }, + + // private method for UTF-8 decoding + _utf8_decode : function (utftext) { + var string = ""; + var i = 0; + var c = c1 = c2 = 0; + + while ( i < utftext.length ) { + + c = utftext.charCodeAt(i); + + if (c < 128) { + string += String.fromCharCode(c); + i++; + } + else if((c > 191) && (c < 224)) { + c2 = utftext.charCodeAt(i+1); + string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); + i += 2; + } + else { + c2 = utftext.charCodeAt(i+1); + c3 = utftext.charCodeAt(i+2); + string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); + i += 3; + } + + } + + return string; + } + +} + + + + + + +/* ---------------------------------------------- + * DEPRECATED + * 하위호환용으로 남겨 놓음 + * ------------------------------------------- */ + +if(typeof(resizeImageContents) == 'undefined') { + function resizeImageContents() {} +} + +if(typeof(activateOptionDisabled) == 'undefined') { + function activateOptionDisabled() {} +} + +objectExtend = jQuery.extend; + +/** + * @brief 특정 Element의 display 옵션 토글 + **/ +function toggleDisplay(objId) { + jQuery('#'+objId).toggle(); +} + +/* 체크박스 선택 */ +function checkboxSelectAll(formObj, name, checked) { + var itemName = name; + var option = {}; + if(typeof(formObj) != "undefined") option.wrap = formObj; + if(typeof(checked) != "undefined") option.checked = checked; + + XE.checkboxToggleAll(itemName, option); +} + +/* 체크박스를 실행 */ +function clickCheckBoxAll(formObj, name) { + var itemName = name; + var option = { doClick:true }; + if(typeof(formObj) != "undefined") option.wrap = formObj; + + XE.checkboxToggleAll(itemName, option); +} + +/** + * @brief 에디터에서 사용하되 내용 여닫는 코드 (zb5beta beta 호환용으로 남겨 놓음) + **/ +function svc_folder_open(id) { + jQuery("#_folder_open_"+id).hide(); + jQuery("#_folder_close_"+id).show(); + jQuery("#_folder_"+id).show(); +} +function svc_folder_close(id) { + jQuery("#_folder_open_"+id).show(); + jQuery("#_folder_close_"+id).hide(); + jQuery("#_folder_"+id).hide(); +} + +/** + * @brief 날짜 선택 (달력 열기) + **/ +function open_calendar(fo_id, day_str, callback_func) { + if(typeof(day_str)=="undefined") day_str = ""; + + var url = "./common/tpl/calendar.php?"; + if(fo_id) url+="fo_id="+fo_id; + if(day_str) url+="&day_str="+day_str; + if(callback_func) url+="&callback_func="+callback_func; + + popopen(url, 'Calendar'); +} + +var loaded_popup_menus = XE.loaded_popup_menus; +function createPopupMenu() {} +function chkPopupMenu() {} +function displayPopupMenu(ret_obj, response_tags, params) { + XE.displayPopupMenu(ret_obj, response_tags, params); +} + +function GetObjLeft(obj) { + return jQuery(obj).offset().left; +} +function GetObjTop(obj) { + return jQuery(obj).offset().top; +} + +function replaceOuterHTML(obj, html) { + jQuery(obj).replaceWith(html); +} + +function getOuterHTML(obj) { + return jQuery(obj).html().trim(); +} + +function setCookie(name, value, expire, path) { + var s_cookie = name + "=" + escape(value) + + ((!expire) ? "" : ("; expires=" + expire.toGMTString())) + + "; path=" + ((!path) ? "/" : path); + + document.cookie = s_cookie; +} + +function is_def(v) { + return (typeof(v)!='undefined'); +} + +function ucfirst(str) { + return str.charAt(0).toUpperCase() + str.slice(1); +} + +jQuery(function($){ + $('.lang_code').each( + function() + { + var objText = $(this); + var targetName = objText.attr("id"); + if(typeof(targetName) == "undefined") targetName = objText.attr("name"); + if(typeof(targetName) == "undefined") return; + objText.after("find_langcode"); + } + ); + + // display popup menu that contains member actions and document actions + $(document).click(function(evt) { + var $area = $('#popup_menu_area'); + if(!$area.length) $area = $('
    a"; + // resolve with given context and args + resolveWith: function( context, args ) { + if ( !cancelled && !fired && !firing ) { + // make sure args are available (#8421) + args = args || []; + firing = 1; + try { + while( callbacks[ 0 ] ) { + callbacks.shift().apply( context, args ); + } + } + finally { + fired = [ context, args ]; + firing = 0; + } + } + return this; + }, - var all = div.getElementsByTagName("*"), - a = div.getElementsByTagName("a")[0], - select = document.createElement("select"), - opt = select.appendChild( document.createElement("option") ); + // resolve with this as context and given arguments + resolve: function() { + deferred.resolveWith( this, arguments ); + return this; + }, + + // Has this deferred been resolved? + isResolved: function() { + return !!( firing || fired ); + }, + + // Cancel + cancel: function() { + cancelled = 1; + callbacks = []; + return this; + } + }; + + return deferred; + }, + + // Full fledged deferred (two callbacks list) + Deferred: function( func ) { + var deferred = jQuery._Deferred(), + failDeferred = jQuery._Deferred(), + promise; + // Add errorDeferred methods, then and promise + jQuery.extend( deferred, { + then: function( doneCallbacks, failCallbacks ) { + deferred.done( doneCallbacks ).fail( failCallbacks ); + return this; + }, + always: function() { + return deferred.done.apply( deferred, arguments ).fail.apply( this, arguments ); + }, + fail: failDeferred.done, + rejectWith: failDeferred.resolveWith, + reject: failDeferred.resolve, + isRejected: failDeferred.isResolved, + pipe: function( fnDone, fnFail ) { + return jQuery.Deferred(function( newDefer ) { + jQuery.each( { + done: [ fnDone, "resolve" ], + fail: [ fnFail, "reject" ] + }, function( handler, data ) { + var fn = data[ 0 ], + action = data[ 1 ], + returned; + if ( jQuery.isFunction( fn ) ) { + deferred[ handler ](function() { + returned = fn.apply( this, arguments ); + if ( jQuery.isFunction( returned.promise ) ) { + returned.promise().then( newDefer.resolve, newDefer.reject ); + } else { + newDefer[ action ]( returned ); + } + }); + } else { + deferred[ handler ]( newDefer[ action ] ); + } + }); + }).promise(); + }, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + if ( obj == null ) { + if ( promise ) { + return promise; + } + promise = obj = {}; + } + var i = promiseMethods.length; + while( i-- ) { + obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ]; + } + return obj; + } + }); + // Make sure only one callback list will be used + deferred.done( failDeferred.cancel ).fail( deferred.cancel ); + // Unexpose cancel + delete deferred.cancel; + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + return deferred; + }, + + // Deferred helper + when: function( firstParam ) { + var args = arguments, + i = 0, + length = args.length, + count = length, + deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? + firstParam : + jQuery.Deferred(); + function resolveFunc( i ) { + return function( value ) { + args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; + if ( !( --count ) ) { + // Strange bug in FF4: + // Values changed onto the arguments object sometimes end up as undefined values + // outside the $.when method. Cloning the object into a fresh array solves the issue + deferred.resolveWith( deferred, sliceDeferred.call( args, 0 ) ); + } + }; + } + if ( length > 1 ) { + for( ; i < length; i++ ) { + if ( args[ i ] && jQuery.isFunction( args[ i ].promise ) ) { + args[ i ].promise().then( resolveFunc(i), deferred.reject ); + } else { + --count; + } + } + if ( !count ) { + deferred.resolveWith( deferred, args ); + } + } else if ( deferred !== firstParam ) { + deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); + } + return deferred.promise(); + } +}); + + + +jQuery.support = (function() { + + var div = document.createElement( "div" ), + all, + a, + select, + opt, + input, + marginDiv, + support, + fragment, + body, + bodyStyle, + tds, + events, + eventName, + i, + isSupported; + + // Preliminary tests + div.setAttribute("className", "t"); + div.innerHTML = "
    a"; + + all = div.getElementsByTagName( "*" ); + a = div.getElementsByTagName( "a" )[ 0 ]; // Can't get basic test support if ( !all || !all.length || !a ) { - return; + return {}; } - jQuery.support = { + // First batch of supports tests + select = document.createElement( "select" ); + opt = select.appendChild( document.createElement("option") ); + input = div.getElementsByTagName( "input" )[ 0 ]; + + support = { // IE strips leading whitespace when .innerHTML is used - leadingWhitespace: div.firstChild.nodeType === 3, + leadingWhitespace: ( div.firstChild.nodeType === 3 ), // Make sure that tbody elements aren't automatically inserted // IE will insert them into empty tables - tbody: !div.getElementsByTagName("tbody").length, + tbody: !div.getElementsByTagName( "tbody" ).length, // Make sure that link elements get serialized correctly by innerHTML // This requires a wrapper element in IE - htmlSerialize: !!div.getElementsByTagName("link").length, + htmlSerialize: !!div.getElementsByTagName( "link" ).length, // Get the style information from getAttribute - // (IE uses .cssText insted) - style: /red/.test( a.getAttribute("style") ), + // (IE uses .cssText instead) + style: /top/.test( a.getAttribute("style") ), // Make sure that URLs aren't manipulated // (IE normalizes it by default) - hrefNormalized: a.getAttribute("href") === "/a", + hrefNormalized: ( a.getAttribute( "href" ) === "/a" ), // Make sure that element opacity exists // (IE uses filter instead) @@ -964,150 +1202,183 @@ return (window.jQuery = window.$ = jQuery); // Make sure that if no value is specified for a checkbox // that it defaults to "on". // (WebKit defaults to "" instead) - checkOn: div.getElementsByTagName("input")[0].value === "on", + checkOn: ( input.value === "on" ), // Make sure that a selected-by-default option has a working selected property. // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) optSelected: opt.selected, + // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) + getSetAttribute: div.className !== "t", + // Will be defined later + submitBubbles: true, + changeBubbles: true, + focusinBubbles: false, deleteExpando: true, - optDisabled: false, - checkClone: false, - scriptEval: false, noCloneEvent: true, - boxModel: null, inlineBlockNeedsLayout: false, shrinkWrapBlocks: false, - reliableHiddenOffsets: true + reliableMarginRight: true }; + // Make sure checked status is properly cloned + input.checked = true; + support.noCloneChecked = input.cloneNode( true ).checked; + // Make sure that the options inside disabled selects aren't marked as disabled - // (WebKit marks them as diabled) + // (WebKit marks them as disabled) select.disabled = true; - jQuery.support.optDisabled = !opt.disabled; - - script.type = "text/javascript"; - try { - script.appendChild( document.createTextNode( "window." + id + "=1;" ) ); - } catch(e) {} - - root.insertBefore( script, root.firstChild ); - - // Make sure that the execution of code works by injecting a script - // tag with appendChild/createTextNode - // (IE doesn't support this, fails, and uses .text instead) - if ( window[ id ] ) { - jQuery.support.scriptEval = true; - delete window[ id ]; - } + support.optDisabled = !opt.disabled; // Test to see if it's possible to delete an expando from an element // Fails in Internet Explorer try { - delete script.test; - - } catch(e) { - jQuery.support.deleteExpando = false; + delete div.test; + } catch( e ) { + support.deleteExpando = false; } - root.removeChild( script ); - - if ( div.attachEvent && div.fireEvent ) { - div.attachEvent("onclick", function click() { + if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { + div.attachEvent( "onclick", function click() { // Cloning a node shouldn't copy over any // bound event handlers (IE does this) - jQuery.support.noCloneEvent = false; - div.detachEvent("onclick", click); + support.noCloneEvent = false; + div.detachEvent( "onclick", click ); }); - div.cloneNode(true).fireEvent("onclick"); + div.cloneNode( true ).fireEvent( "onclick" ); } - div = document.createElement("div"); - div.innerHTML = ""; + // Check if a radio maintains it's value + // after being appended to the DOM + input = document.createElement("input"); + input.value = "t"; + input.setAttribute("type", "radio"); + support.radioValue = input.value === "t"; - var fragment = document.createDocumentFragment(); + input.setAttribute("checked", "checked"); + div.appendChild( input ); + fragment = document.createDocumentFragment(); fragment.appendChild( div.firstChild ); // WebKit doesn't clone checked state correctly in fragments - jQuery.support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked; + support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; + + div.innerHTML = ""; // Figure out if the W3C box model works as expected - // document.body must exist before we can do this - jQuery(function() { - var div = document.createElement("div"); - div.style.width = div.style.paddingLeft = "1px"; + div.style.width = div.style.paddingLeft = "1px"; - document.body.appendChild( div ); - jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2; + // We use our own, invisible, body + body = document.createElement( "body" ); + bodyStyle = { + visibility: "hidden", + width: 0, + height: 0, + border: 0, + margin: 0, + // Set background to avoid IE crashes when removing (#9028) + background: "none" + }; + for ( i in bodyStyle ) { + body.style[ i ] = bodyStyle[ i ]; + } + body.appendChild( div ); + document.documentElement.appendChild( body ); - if ( "zoom" in div.style ) { - // Check if natively block-level elements act like inline-block - // elements when setting their display to 'inline' and giving - // them layout - // (IE < 8 does this) - div.style.display = "inline"; - div.style.zoom = 1; - jQuery.support.inlineBlockNeedsLayout = div.offsetWidth === 2; + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + support.appendChecked = input.checked; - // Check if elements with layout shrink-wrap their children - // (IE 6 does this) - div.style.display = ""; - div.innerHTML = "
    "; - jQuery.support.shrinkWrapBlocks = div.offsetWidth !== 2; - } + support.boxModel = div.offsetWidth === 2; - div.innerHTML = "
    t
    "; - var tds = div.getElementsByTagName("td"); + if ( "zoom" in div.style ) { + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + // (IE < 8 does this) + div.style.display = "inline"; + div.style.zoom = 1; + support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 ); - // Check if table cells still have offsetWidth/Height when they are set - // to display:none and there are still other visible table cells in a - // table row; if so, offsetWidth/Height are not reliable for use when - // determining if an element has been hidden directly using - // display:none (it is still safe to use offsets if a parent element is - // hidden; don safety goggles and see bug #4512 for more information). - // (only IE 8 fails this test) - jQuery.support.reliableHiddenOffsets = tds[0].offsetHeight === 0; + // Check if elements with layout shrink-wrap their children + // (IE 6 does this) + div.style.display = ""; + div.innerHTML = "
    "; + support.shrinkWrapBlocks = ( div.offsetWidth !== 2 ); + } - tds[0].style.display = ""; - tds[1].style.display = "none"; + div.innerHTML = "
    t
    "; + tds = div.getElementsByTagName( "td" ); - // Check if empty table cells still have offsetWidth/Height - // (IE < 8 fail this test) - jQuery.support.reliableHiddenOffsets = jQuery.support.reliableHiddenOffsets && tds[0].offsetHeight === 0; - div.innerHTML = ""; + // Check if table cells still have offsetWidth/Height when they are set + // to display:none and there are still other visible table cells in a + // table row; if so, offsetWidth/Height are not reliable for use when + // determining if an element has been hidden directly using + // display:none (it is still safe to use offsets if a parent element is + // hidden; don safety goggles and see bug #4512 for more information). + // (only IE 8 fails this test) + isSupported = ( tds[ 0 ].offsetHeight === 0 ); - document.body.removeChild( div ).style.display = "none"; - div = tds = null; - }); + tds[ 0 ].style.display = ""; + tds[ 1 ].style.display = "none"; + + // Check if empty table cells still have offsetWidth/Height + // (IE < 8 fail this test) + support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); + div.innerHTML = ""; + + // Check if div with explicit width and no margin-right incorrectly + // gets computed margin-right based on width of container. For more + // info see bug #3333 + // Fails in WebKit before Feb 2011 nightlies + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right + if ( document.defaultView && document.defaultView.getComputedStyle ) { + marginDiv = document.createElement( "div" ); + marginDiv.style.width = "0"; + marginDiv.style.marginRight = "0"; + div.appendChild( marginDiv ); + support.reliableMarginRight = + ( parseInt( document.defaultView.getComputedStyle( marginDiv, null ).marginRight, 10 ) || 0 ) === 0; + } + + // Remove the body element we added + body.innerHTML = ""; + document.documentElement.removeChild( body ); // Technique from Juriy Zaytsev // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/ - var eventSupported = function( eventName ) { - var el = document.createElement("div"); - eventName = "on" + eventName; - - var isSupported = (eventName in el); - if ( !isSupported ) { - el.setAttribute(eventName, "return;"); - isSupported = typeof el[eventName] === "function"; + // We only care about the case where non-standard event systems + // are used, namely in IE. Short-circuiting here helps us to + // avoid an eval call (in setAttribute) which can cause CSP + // to go haywire. See: https://developer.mozilla.org/en/Security/CSP + if ( div.attachEvent ) { + for( i in { + submit: 1, + change: 1, + focusin: 1 + } ) { + eventName = "on" + i; + isSupported = ( eventName in div ); + if ( !isSupported ) { + div.setAttribute( eventName, "return;" ); + isSupported = ( typeof div[ eventName ] === "function" ); + } + support[ i + "Bubbles" ] = isSupported; } - el = null; + } - return isSupported; - }; - - jQuery.support.submitBubbles = eventSupported("submit"); - jQuery.support.changeBubbles = eventSupported("change"); - - // release memory in IE - root = script = div = all = a = null; + return support; })(); +// Keep track of boxModel +jQuery.boxModel = jQuery.support.boxModel; -var windowData = {}, - rbrace = /^(?:\{.*\}|\[.*\])$/; + + +var rbrace = /^(?:\{.*\}|\[.*\])$/, + rmultiDash = /([a-z])([A-Z])/g; jQuery.extend({ cache: {}, @@ -1115,8 +1386,9 @@ jQuery.extend({ // Please use with caution uuid: 0, - // Unique for each copy of jQuery on the page - expando: "jQuery" + jQuery.now(), + // Unique for each copy of jQuery on the page + // Non-digits removed to match rinlinejQuery + expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), // The following elements throw uncatchable exceptions if you // attempt to add expando properties to them. @@ -1127,101 +1399,183 @@ jQuery.extend({ "applet": true }, - data: function( elem, name, data ) { + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; + + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data, pvt /* Internal Use Only */ ) { if ( !jQuery.acceptData( elem ) ) { return; } - elem = elem == window ? - windowData : - elem; + var internalKey = jQuery.expando, getByName = typeof name === "string", thisCache, - var isNode = elem.nodeType, - id = isNode ? elem[ jQuery.expando ] : null, - cache = jQuery.cache, thisCache; + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, - if ( isNode && !id && typeof name === "string" && data === undefined ) { + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( (!id || (pvt && id && !cache[ id ][ internalKey ])) && getByName && data === undefined ) { return; } - // Get the data from the object directly - if ( !isNode ) { - cache = elem; - - // Compute a unique ID for the element - } else if ( !id ) { - elem[ jQuery.expando ] = id = ++jQuery.uuid; + if ( !id ) { + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + elem[ jQuery.expando ] = id = ++jQuery.uuid; + } else { + id = jQuery.expando; + } } - // Avoid generating a new cache unless none exists and we - // want to manipulate it. - if ( typeof name === "object" ) { - if ( isNode ) { - cache[ id ] = jQuery.extend(cache[ id ], name); + if ( !cache[ id ] ) { + cache[ id ] = {}; + // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery + // metadata on plain JS objects when the object is serialized using + // JSON.stringify + if ( !isNode ) { + cache[ id ].toJSON = jQuery.noop; + } + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name); } else { - jQuery.extend( cache, name ); + cache[ id ] = jQuery.extend(cache[ id ], name); + } + } + + thisCache = cache[ id ]; + + // Internal jQuery data is stored in a separate object inside the object's data + // cache in order to avoid key collisions between internal data and user-defined + // data + if ( pvt ) { + if ( !thisCache[ internalKey ] ) { + thisCache[ internalKey ] = {}; } - } else if ( isNode && !cache[ id ] ) { - cache[ id ] = {}; + thisCache = thisCache[ internalKey ]; } - thisCache = isNode ? cache[ id ] : cache; - - // Prevent overriding the named cache with undefined values if ( data !== undefined ) { thisCache[ name ] = data; } - return typeof name === "string" ? thisCache[ name ] : thisCache; + // TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should + // not attempt to inspect the internal events object using jQuery.data, as this + // internal data object is undocumented and subject to change. + if ( name === "events" && !thisCache[name] ) { + return thisCache[ internalKey ] && thisCache[ internalKey ].events; + } + + return getByName ? thisCache[ name ] : thisCache; }, - removeData: function( elem, name ) { + removeData: function( elem, name, pvt /* Internal Use Only */ ) { if ( !jQuery.acceptData( elem ) ) { return; } - elem = elem == window ? - windowData : - elem; + var internalKey = jQuery.expando, isNode = elem.nodeType, - var isNode = elem.nodeType, - id = isNode ? elem[ jQuery.expando ] : elem, - cache = jQuery.cache, - thisCache = isNode ? cache[ id ] : id; + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + + // See jQuery.data for more information + id = isNode ? elem[ jQuery.expando ] : jQuery.expando; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } - // If we want to remove a specific section of the element's data if ( name ) { + var thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ]; + if ( thisCache ) { - // Remove the section of cache data delete thisCache[ name ]; - // If we've removed all the data, remove the element's cache - if ( isNode && jQuery.isEmptyObject(thisCache) ) { - jQuery.removeData( elem ); - } - } - - // Otherwise, we want to remove all of the element's data - } else { - if ( isNode && jQuery.support.deleteExpando ) { - delete elem[ jQuery.expando ]; - - } else if ( elem.removeAttribute ) { - elem.removeAttribute( jQuery.expando ); - - // Completely remove the data cache - } else if ( isNode ) { - delete cache[ id ]; - - // Remove all fields from the object - } else { - for ( var n in elem ) { - delete elem[ n ]; + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( !isEmptyDataObject(thisCache) ) { + return; } } } + + // See jQuery.data for more information + if ( pvt ) { + delete cache[ id ][ internalKey ]; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject(cache[ id ]) ) { + return; + } + } + + var internalCache = cache[ id ][ internalKey ]; + + // Browsers that fail expando deletion also refuse to delete expandos on + // the window, but it will allow it on all other JS objects; other browsers + // don't care + if ( jQuery.support.deleteExpando || cache != window ) { + delete cache[ id ]; + } else { + cache[ id ] = null; + } + + // We destroyed the entire user cache at once because it's faster than + // iterating through each key, but we need to continue to persist internal + // data if it existed + if ( internalCache ) { + cache[ id ] = {}; + // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery + // metadata on plain JS objects when the object is serialized using + // JSON.stringify + if ( !isNode ) { + cache[ id ].toJSON = jQuery.noop; + } + + cache[ id ][ internalKey ] = internalCache; + + // Otherwise, we need to eliminate the expando on the node to avoid + // false lookups in the cache for entries that no longer exist + } else if ( isNode ) { + // IE does not allow us to delete expando properties from nodes, + // nor does it have a removeAttribute function on Document nodes; + // we must handle all of these cases + if ( jQuery.support.deleteExpando ) { + delete elem[ jQuery.expando ]; + } else if ( elem.removeAttribute ) { + elem.removeAttribute( jQuery.expando ); + } else { + elem[ jQuery.expando ] = null; + } + } + }, + + // For internal use only. + _data: function( elem, name, data ) { + return jQuery.data( elem, name, data, true ); }, // A method for determining if a DOM node can handle the data expando @@ -1244,15 +1598,18 @@ jQuery.fn.extend({ if ( typeof key === "undefined" ) { if ( this.length ) { - var attr = this[0].attributes, name; data = jQuery.data( this[0] ); - for ( var i = 0, l = attr.length; i < l; i++ ) { - name = attr[i].name; + if ( this[0].nodeType === 1 ) { + var attr = this[0].attributes, name; + for ( var i = 0, l = attr.length; i < l; i++ ) { + name = attr[i].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = name.substr( 5 ); - dataAttr( this[0], name, data[ name ] ); + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.substring(5) ); + + dataAttr( this[0], name, data[ name ] ); + } } } } @@ -1304,7 +1661,9 @@ function dataAttr( elem, key, data ) { // If nothing was found internally, try to fetch any // data from the HTML5 data-* attribute if ( data === undefined && elem.nodeType === 1 ) { - data = elem.getAttribute( "data-" + key ); + name = "data-" + key.replace( rmultiDash, "$1-$2" ).toLowerCase(); + + data = elem.getAttribute( name ); if ( typeof data === "string" ) { try { @@ -1327,38 +1686,92 @@ function dataAttr( elem, key, data ) { return data; } +// TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON +// property to be considered empty objects; this property always exists in +// order to make sure JSON.stringify does not expose internal metadata +function isEmptyDataObject( obj ) { + for ( var name in obj ) { + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} + +function handleQueueMarkDefer( elem, type, src ) { + var deferDataKey = type + "defer", + queueDataKey = type + "queue", + markDataKey = type + "mark", + defer = jQuery.data( elem, deferDataKey, undefined, true ); + if ( defer && + ( src === "queue" || !jQuery.data( elem, queueDataKey, undefined, true ) ) && + ( src === "mark" || !jQuery.data( elem, markDataKey, undefined, true ) ) ) { + // Give room for hard-coded callbacks to fire first + // and eventually mark/queue something else on the element + setTimeout( function() { + if ( !jQuery.data( elem, queueDataKey, undefined, true ) && + !jQuery.data( elem, markDataKey, undefined, true ) ) { + jQuery.removeData( elem, deferDataKey, true ); + defer.resolve(); + } + }, 0 ); + } +} + jQuery.extend({ - queue: function( elem, type, data ) { - if ( !elem ) { - return; + + _mark: function( elem, type ) { + if ( elem ) { + type = (type || "fx") + "mark"; + jQuery.data( elem, type, (jQuery.data(elem,type,undefined,true) || 0) + 1, true ); } + }, - type = (type || "fx") + "queue"; - var q = jQuery.data( elem, type ); + _unmark: function( force, elem, type ) { + if ( force !== true ) { + type = elem; + elem = force; + force = false; + } + if ( elem ) { + type = type || "fx"; + var key = type + "mark", + count = force ? 0 : ( (jQuery.data( elem, key, undefined, true) || 1 ) - 1 ); + if ( count ) { + jQuery.data( elem, key, count, true ); + } else { + jQuery.removeData( elem, key, true ); + handleQueueMarkDefer( elem, type, "mark" ); + } + } + }, - // Speed up dequeue by getting out quickly if this is just a lookup - if ( !data ) { + queue: function( elem, type, data ) { + if ( elem ) { + type = (type || "fx") + "queue"; + var q = jQuery.data( elem, type, undefined, true ); + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !q || jQuery.isArray(data) ) { + q = jQuery.data( elem, type, jQuery.makeArray(data), true ); + } else { + q.push( data ); + } + } return q || []; } - - if ( !q || jQuery.isArray(data) ) { - q = jQuery.data( elem, type, jQuery.makeArray(data) ); - - } else { - q.push( data ); - } - - return q; }, dequeue: function( elem, type ) { type = type || "fx"; var queue = jQuery.queue( elem, type ), - fn = queue.shift(); + fn = queue.shift(), + defer; // If the fx queue is dequeued, always remove the progress sentinel if ( fn === "inprogress" ) { @@ -1376,6 +1789,11 @@ jQuery.extend({ jQuery.dequeue(elem, type); }); } + + if ( !queue.length ) { + jQuery.removeData( elem, type + "queue", true ); + handleQueueMarkDefer( elem, type, "queue" ); + } } }); @@ -1389,7 +1807,7 @@ jQuery.fn.extend({ if ( data === undefined ) { return jQuery.queue( this[0], type ); } - return this.each(function( i ) { + return this.each(function() { var queue = jQuery.queue( this, type, data ); if ( type === "fx" && queue[0] !== "inprogress" ) { @@ -1402,7 +1820,6 @@ jQuery.fn.extend({ jQuery.dequeue( this, type ); }); }, - // Based off of the plugin by Clint Helfers, with permission. // http://blindsignals.com/index.php/2009/07/jquery-delay/ delay: function( time, type ) { @@ -1416,61 +1833,91 @@ jQuery.fn.extend({ }, time ); }); }, - clearQueue: function( type ) { return this.queue( type || "fx", [] ); + }, + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, object ) { + if ( typeof type !== "string" ) { + object = type; + type = undefined; + } + type = type || "fx"; + var defer = jQuery.Deferred(), + elements = this, + i = elements.length, + count = 1, + deferDataKey = type + "defer", + queueDataKey = type + "queue", + markDataKey = type + "mark"; + function resolve() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + } + while( i-- ) { + if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) || + ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) || + jQuery.data( elements[ i ], markDataKey, undefined, true ) ) && + jQuery.data( elements[ i ], deferDataKey, jQuery._Deferred(), true ) )) { + count++; + tmp.done( resolve ); + } + } + resolve(); + return defer.promise(); } }); -var rclass = /[\n\t]/g, - rspaces = /\s+/, +var rclass = /[\n\t\r]/g, + rspace = /\s+/, rreturn = /\r/g, - rspecialurl = /^(?:href|src|style)$/, rtype = /^(?:button|input)$/i, rfocusable = /^(?:button|input|object|select|textarea)$/i, rclickable = /^a(?:rea)?$/i, - rradiocheck = /^(?:radio|checkbox)$/i; - -jQuery.props = { - "for": "htmlFor", - "class": "className", - readonly: "readOnly", - maxlength: "maxLength", - cellspacing: "cellSpacing", - rowspan: "rowSpan", - colspan: "colSpan", - tabindex: "tabIndex", - usemap: "useMap", - frameborder: "frameBorder" -}; + rspecial = /^(?:data-|aria-)/, + rinvalidChar = /\:/, + formHook; jQuery.fn.extend({ attr: function( name, value ) { return jQuery.access( this, name, value, true, jQuery.attr ); }, - removeAttr: function( name, fn ) { - return this.each(function(){ - jQuery.attr( this, name, "" ); - if ( this.nodeType === 1 ) { - this.removeAttribute( name ); - } + removeAttr: function( name ) { + return this.each(function() { + jQuery.removeAttr( this, name ); + }); + }, + + prop: function( name, value ) { + return jQuery.access( this, name, value, true, jQuery.prop ); + }, + + removeProp: function( name ) { + return this.each(function() { + // try/catch handles cases where IE balks (such as removing a property on window) + try { + this[ name ] = undefined; + delete this[ name ]; + } catch( e ) {} }); }, addClass: function( value ) { - if ( jQuery.isFunction(value) ) { + if ( jQuery.isFunction( value ) ) { return this.each(function(i) { var self = jQuery(this); - self.addClass( value.call(this, i, self.attr("class")) ); + self.addClass( value.call(this, i, self.attr("class") || "") ); }); } if ( value && typeof value === "string" ) { - var classNames = (value || "").split( rspaces ); + var classNames = (value || "").split( rspace ); for ( var i = 0, l = this.length; i < l; i++ ) { var elem = this[i]; @@ -1506,7 +1953,7 @@ jQuery.fn.extend({ } if ( (value && typeof value === "string") || value === undefined ) { - var classNames = (value || "").split( rspaces ); + var classNames = (value || "").split( rspace ); for ( var i = 0, l = this.length; i < l; i++ ) { var elem = this[i]; @@ -1547,7 +1994,7 @@ jQuery.fn.extend({ i = 0, self = jQuery( this ), state = stateVal, - classNames = value.split( rspaces ); + classNames = value.split( rspace ); while ( (className = classNames[ i++ ]) ) { // check each className given, space seperated list @@ -1558,11 +2005,11 @@ jQuery.fn.extend({ } else if ( type === "undefined" || type === "boolean" ) { if ( this.className ) { // store className if set - jQuery.data( this, "__className__", this.className ); + jQuery._data( this, "__className__", this.className ); } // toggle whole className - this.className = this.className || value === false ? "" : jQuery.data( this, "__className__" ) || ""; + this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; } }); }, @@ -1579,78 +2026,36 @@ jQuery.fn.extend({ }, val: function( value ) { + var hooks, ret, + elem = this[0]; + if ( !arguments.length ) { - var elem = this[0]; - if ( elem ) { - if ( jQuery.nodeName( elem, "option" ) ) { - // attributes.value is undefined in Blackberry 4.7 but - // uses .value. See #6932 - var val = elem.attributes.value; - return !val || val.specified ? elem.value : elem.text; + hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ]; + + if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { + return ret; } - // We need to handle select boxes special - if ( jQuery.nodeName( elem, "select" ) ) { - var index = elem.selectedIndex, - values = [], - options = elem.options, - one = elem.type === "select-one"; - - // Nothing was selected - if ( index < 0 ) { - return null; - } - - // Loop through all the selected options - for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { - var option = options[ i ]; - - // Don't return options that are disabled or in a disabled optgroup - if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && - (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { - - // Get the specific value for the option - value = jQuery(option).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - } - - // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified - if ( rradiocheck.test( elem.type ) && !jQuery.support.checkOn ) { - return elem.getAttribute("value") === null ? "on" : elem.value; - } - - - // Everything else, we just grab the value return (elem.value || "").replace(rreturn, ""); - } return undefined; } - var isFunction = jQuery.isFunction(value); + var isFunction = jQuery.isFunction( value ); - return this.each(function(i) { - var self = jQuery(this), val = value; + return this.each(function( i ) { + var self = jQuery(this), val; if ( this.nodeType !== 1 ) { return; } if ( isFunction ) { - val = value.call(this, i, self.val()); + val = value.call( this, i, self.val() ); + } else { + val = value; } // Treat null/undefined as ""; convert numbers to string @@ -1658,27 +2063,16 @@ jQuery.fn.extend({ val = ""; } else if ( typeof val === "number" ) { val += ""; - } else if ( jQuery.isArray(val) ) { - val = jQuery.map(val, function (value) { + } else if ( jQuery.isArray( val ) ) { + val = jQuery.map(val, function ( value ) { return value == null ? "" : value + ""; }); } - if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) { - this.checked = jQuery.inArray( self.val(), val ) >= 0; + hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ]; - } else if ( jQuery.nodeName( this, "select" ) ) { - var values = jQuery.makeArray(val); - - jQuery( "option", this ).each(function() { - this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; - }); - - if ( !values.length ) { - this.selectedIndex = -1; - } - - } else { + // If set returns undefined, fall back to normal setting + if ( !hooks || ("set" in hooks && hooks.set( this, val, "value" ) === undefined) ) { this.value = val; } }); @@ -1686,6 +2080,71 @@ jQuery.fn.extend({ }); jQuery.extend({ + valHooks: { + option: { + get: function( elem ) { + // attributes.value is undefined in Blackberry 4.7 but + // uses .value. See #6932 + var val = elem.attributes.value; + return !val || val.specified ? elem.value : elem.text; + } + }, + select: { + get: function( elem ) { + var index = elem.selectedIndex, + values = [], + options = elem.options, + one = elem.type === "select-one"; + + // Nothing was selected + if ( index < 0 ) { + return null; + } + + // Loop through all the selected options + for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { + var option = options[ i ]; + + // Don't return options that are disabled or in a disabled optgroup + if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && + (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + // Fixes Bug #2551 -- select.val() broken in IE after form.reset() + if ( one && !values.length && options.length ) { + return jQuery( options[ index ] ).val(); + } + + return values; + }, + + set: function( elem, value ) { + var values = jQuery.makeArray( value ); + + jQuery(elem).find("option").each(function() { + this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; + }); + + if ( !values.length ) { + elem.selectedIndex = -1; + } + return values; + } + } + }, + attrFn: { val: true, css: true, @@ -1696,31 +2155,247 @@ jQuery.extend({ height: true, offset: true }, - + + attrFix: { + // Always normalize to ensure hook usage + tabindex: "tabIndex", + readonly: "readOnly" + }, + attr: function( elem, name, value, pass ) { - // don't set attributes on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) { + var nType = elem.nodeType; + + // don't get/set attributes on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { return undefined; } if ( pass && name in jQuery.attrFn ) { - return jQuery(elem)[name](value); + return jQuery( elem )[ name ]( value ); } + + var ret, hooks, + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + // Normalize the name if needed + name = notxml && jQuery.attrFix[ name ] || name; - var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ), - // Whether we are setting (or getting) - set = value !== undefined; + // Get the appropriate hook, or the formHook + // if getSetAttribute is not supported and we have form objects in IE6/7 + hooks = jQuery.attrHooks[ name ] || + ( formHook && (jQuery.nodeName( elem, "form" ) || rinvalidChar.test( name )) ? + formHook : + undefined ); + if ( value !== undefined ) { + + if ( value === null || (value === false && !rspecial.test( name )) ) { + jQuery.removeAttr( elem, name ); + return undefined; + + } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + + // Set boolean attributes to the same name + if ( value === true && !rspecial.test( name ) ) { + value = name; + } + + elem.setAttribute( name, "" + value ); + return value; + } + + } else { + + if ( hooks && "get" in hooks && notxml ) { + return hooks.get( elem, name ); + + } else { + + ret = elem.getAttribute( name ); + + // Non-existent attributes return null, we normalize to undefined + return ret === null ? + undefined : + ret; + } + } + }, + + removeAttr: function( elem, name ) { + if ( elem.nodeType === 1 ) { + name = jQuery.attrFix[ name ] || name; + + if ( jQuery.support.getSetAttribute ) { + // Use removeAttribute in browsers that support it + elem.removeAttribute( name ); + } else { + jQuery.attr( elem, name, "" ); + elem.removeAttributeNode( elem.getAttributeNode( name ) ); + } + } + }, + + attrHooks: { + type: { + set: function( elem, value ) { + // We can't allow the type property to be changed (since it causes problems in IE) + if ( rtype.test( elem.nodeName ) && elem.parentNode ) { + jQuery.error( "type property can't be changed" ); + } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { + // Setting the type on a radio button after the value resets the value in IE6-9 + // Reset value to it's default in case type is set after value + // This is for element creation + var val = elem.getAttribute("value"); + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + }, + tabIndex: { + get: function( elem ) { + // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set + // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + var attributeNode = elem.getAttributeNode("tabIndex"); + + return attributeNode && attributeNode.specified ? + parseInt( attributeNode.value, 10 ) : + rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? + 0 : + undefined; + } + } + }, + + propFix: {}, + + prop: function( elem, name, value ) { + var nType = elem.nodeType; + + // don't get/set properties on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return undefined; + } + + var ret, hooks, + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + // Try to normalize/fix the name - name = notxml && jQuery.props[ name ] || name; + name = notxml && jQuery.propFix[ name ] || name; + + hooks = jQuery.propHooks[ name ]; + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + return (elem[ name ] = value); + } + + } else { + if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== undefined ) { + return ret; + + } else { + return elem[ name ]; + } + } + }, + + propHooks: {} +}); - // These attributes require special treatment - var special = rspecialurl.test( name ); +// IE6/7 do not support getting/setting some attributes with get/setAttribute +if ( !jQuery.support.getSetAttribute ) { + jQuery.attrFix = jQuery.extend( jQuery.attrFix, { + "for": "htmlFor", + "class": "className", + maxlength: "maxLength", + cellspacing: "cellSpacing", + cellpadding: "cellPadding", + rowspan: "rowSpan", + colspan: "colSpan", + usemap: "useMap", + frameborder: "frameBorder" + }); + + // Use this for any attribute on a form in IE6/7 + formHook = jQuery.attrHooks.name = jQuery.attrHooks.value = jQuery.valHooks.button = { + get: function( elem, name ) { + var ret; + if ( name === "value" && !jQuery.nodeName( elem, "button" ) ) { + return elem.getAttribute( name ); + } + ret = elem.getAttributeNode( name ); + // Return undefined if not specified instead of empty string + return ret && ret.specified ? + ret.nodeValue : + undefined; + }, + set: function( elem, value, name ) { + // Check form objects in IE (multiple bugs related) + // Only use nodeValue if the attribute node exists on the form + var ret = elem.getAttributeNode( name ); + if ( ret ) { + ret.nodeValue = value; + return value; + } + } + }; - // Safari mis-reports the default selected property of an option - // Accessing the parent's selectedIndex property fixes it - if ( name === "selected" && !jQuery.support.optSelected ) { + // Set width and height to auto instead of 0 on empty string( Bug #8150 ) + // This is for removals + jQuery.each([ "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + set: function( elem, value ) { + if ( value === "" ) { + elem.setAttribute( name, "auto" ); + return value; + } + } + }); + }); +} + + +// Some attributes require a special call on IE +if ( !jQuery.support.hrefNormalized ) { + jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + get: function( elem ) { + var ret = elem.getAttribute( name, 2 ); + return ret === null ? undefined : ret; + } + }); + }); +} + +if ( !jQuery.support.style ) { + jQuery.attrHooks.style = { + get: function( elem ) { + // Return undefined in the case of empty string + // Normalize to lowercase since IE uppercases css property names + return elem.style.cssText.toLowerCase() || undefined; + }, + set: function( elem, value ) { + return (elem.style.cssText = "" + value); + } + }; +} + +// Safari mis-reports the default selected property of an option +// Accessing the parent's selectedIndex property fixes it +if ( !jQuery.support.optSelected ) { + jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { + get: function( elem ) { var parent = elem.parentNode; + if ( parent ) { parent.selectedIndex; @@ -1730,87 +2405,42 @@ jQuery.extend({ } } } + }); +} - // If applicable, access the attribute via the DOM 0 way - // 'in' checks fail in Blackberry 4.7 #6931 - if ( (name in elem || elem[ name ] !== undefined) && notxml && !special ) { - if ( set ) { - // We can't allow the type property to be changed (since it causes problems in IE) - if ( name === "type" && rtype.test( elem.nodeName ) && elem.parentNode ) { - jQuery.error( "type property can't be changed" ); - } - - if ( value === null ) { - if ( elem.nodeType === 1 ) { - elem.removeAttribute( name ); - } - - } else { - elem[ name ] = value; - } +// Radios and checkboxes getter/setter +if ( !jQuery.support.checkOn ) { + jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + get: function( elem ) { + // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified + return elem.getAttribute("value") === null ? "on" : elem.value; } - - // browsers index elements by id/name on forms, give priority to attributes. - if ( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) { - return elem.getAttributeNode( name ).nodeValue; + }; + }); +} +jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { + set: function( elem, value ) { + if ( jQuery.isArray( value ) ) { + return (elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0); } - - // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set - // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - if ( name === "tabIndex" ) { - var attributeNode = elem.getAttributeNode( "tabIndex" ); - - return attributeNode && attributeNode.specified ? - attributeNode.value : - rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? - 0 : - undefined; - } - - return elem[ name ]; } - - if ( !jQuery.support.style && notxml && name === "style" ) { - if ( set ) { - elem.style.cssText = "" + value; - } - - return elem.style.cssText; - } - - if ( set ) { - // convert the value to a string (all browsers do this but IE) see #1070 - elem.setAttribute( name, "" + value ); - } - - // Ensure that missing attributes return undefined - // Blackberry 4.7 returns "" from getAttribute #6938 - if ( !elem.attributes[ name ] && (elem.hasAttribute && !elem.hasAttribute( name )) ) { - return undefined; - } - - var attr = !jQuery.support.hrefNormalized && notxml && special ? - // Some attributes require a special call on IE - elem.getAttribute( name, 2 ) : - elem.getAttribute( name ); - - // Non-existent attributes return null, we normalize to undefined - return attr === null ? undefined : attr; - } + }); }); -var rnamespaces = /\.(.*)$/, +var hasOwn = Object.prototype.hasOwnProperty, + rnamespaces = /\.(.*)$/, rformElems = /^(?:textarea|input|select)$/i, rperiod = /\./g, - rspace = / /g, + rspaces = / /g, rescape = /[^\w\s.|`]/g, fcleanup = function( nm ) { return nm.replace(rescape, "\\$&"); - }, - focusCounts = { focusin: 0, focusout: 0 }; + }; /* * A number of helper functions used for managing events. @@ -1826,17 +2456,11 @@ jQuery.event = { return; } - // For whatever reason, IE has trouble passing the window object - // around, causing it to be cloned in the process - if ( jQuery.isWindow( elem ) && ( elem !== window && !elem.frameElement ) ) { - elem = window; - } - if ( handler === false ) { handler = returnFalse; } else if ( !handler ) { // Fixes bug #7229. Fix recommended by jdalton - return; + return; } var handleObjIn, handleObj; @@ -1852,7 +2476,7 @@ jQuery.event = { } // Init the element's event structure - var elemData = jQuery.data( elem ); + var elemData = jQuery._data( elem ); // If no elemData is found then we must be trying to bind to one of the // banned noData elements @@ -1860,34 +2484,18 @@ jQuery.event = { return; } - // Use a key less likely to result in collisions for plain JS objects. - // Fixes bug #7150. - var eventKey = elem.nodeType ? "events" : "__events__", - events = elemData[ eventKey ], + var events = elemData.events, eventHandle = elemData.handle; - - if ( typeof events === "function" ) { - // On plain objects events is a fn that holds the the data - // which prevents this data from being JSON serialized - // the function does not need to be called, it just contains the data - eventHandle = events.handle; - events = events.events; - - } else if ( !events ) { - if ( !elem.nodeType ) { - // On plain objects, create a fn that acts as the holder - // of the values to avoid JSON serialization of event data - elemData[ eventKey ] = elemData = function(){}; - } + if ( !events ) { elemData.events = events = {}; } if ( !eventHandle ) { - elemData.handle = eventHandle = function() { - // Handle the second event of a trigger and when - // an event is called after a page has unloaded - return typeof jQuery !== "undefined" && !jQuery.event.triggered ? + elemData.handle = eventHandle = function( e ) { + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? jQuery.event.handle.apply( eventHandle.elem, arguments ) : undefined; }; @@ -1945,9 +2553,9 @@ jQuery.event = { } } } - - if ( special.add ) { - special.add.call( elem, handleObj ); + + if ( special.add ) { + special.add.call( elem, handleObj ); if ( !handleObj.handler.guid ) { handleObj.handler.guid = handler.guid; @@ -1957,7 +2565,7 @@ jQuery.event = { // Add the function to the element's handler list handlers.push( handleObj ); - // Keep track of which events have been used, for global triggering + // Keep track of which events have been used, for event optimization jQuery.event.global[ type ] = true; } @@ -1979,18 +2587,12 @@ jQuery.event = { } var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType, - eventKey = elem.nodeType ? "events" : "__events__", - elemData = jQuery.data( elem ), - events = elemData && elemData[ eventKey ]; + elemData = jQuery.hasData( elem ) && jQuery._data( elem ), + events = elemData && elemData.events; if ( !elemData || !events ) { return; } - - if ( typeof events === "function" ) { - elemData = events; - events = events.events; - } // types is actually an event object here if ( types && types.type ) { @@ -2024,7 +2626,7 @@ jQuery.event = { namespaces = type.split("."); type = namespaces.shift(); - namespace = new RegExp("(^|\\.)" + + namespace = new RegExp("(^|\\.)" + jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)"); } @@ -2091,189 +2693,190 @@ jQuery.event = { delete elemData.events; delete elemData.handle; - if ( typeof elemData === "function" ) { - jQuery.removeData( elem, eventKey ); - - } else if ( jQuery.isEmptyObject( elemData ) ) { - jQuery.removeData( elem ); + if ( jQuery.isEmptyObject( elemData ) ) { + jQuery.removeData( elem, undefined, true ); } } }, + + // Events that are safe to short-circuit if no handlers are attached. + // Native DOM events should not be added, they may have inline handlers. + customEvent: { + "getData": true, + "setData": true, + "changeData": true + }, - // bubbling is internal - trigger: function( event, data, elem /*, bubbling */ ) { + trigger: function( event, data, elem, onlyHandlers ) { // Event object or event type var type = event.type || event, - bubbling = arguments[3]; + namespaces = [], + exclusive; - if ( !bubbling ) { - event = typeof event === "object" ? - // jQuery.Event object - event[ jQuery.expando ] ? event : - // Object literal - jQuery.extend( jQuery.Event(type), event ) : - // Just the event type (string) - jQuery.Event(type); - - if ( type.indexOf("!") >= 0 ) { - event.type = type = type.slice(0, -1); - event.exclusive = true; - } - - // Handle a global trigger - if ( !elem ) { - // Don't bubble custom events when global (to avoid too much overhead) - event.stopPropagation(); - - // Only trigger if we've ever bound an event for it - if ( jQuery.event.global[ type ] ) { - jQuery.each( jQuery.cache, function() { - if ( this.events && this.events[type] ) { - jQuery.event.trigger( event, data, this.handle.elem ); - } - }); - } - } - - // Handle triggering a single element - - // don't do events on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) { - return undefined; - } - - // Clean up in case it is reused - event.result = undefined; - event.target = elem; - - // Clone the incoming data, if any - data = jQuery.makeArray( data ); - data.unshift( event ); + if ( type.indexOf("!") >= 0 ) { + // Exclusive events trigger only for the exact event (no namespaces) + type = type.slice(0, -1); + exclusive = true; } - event.currentTarget = elem; - - // Trigger the event, it is assumed that "handle" is a function - var handle = elem.nodeType ? - jQuery.data( elem, "handle" ) : - (jQuery.data( elem, "__events__" ) || {}).handle; - - if ( handle ) { - handle.apply( elem, data ); + if ( type.indexOf(".") >= 0 ) { + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); } - var parent = elem.parentNode || elem.ownerDocument; + if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { + // No jQuery handlers for this event type, and it can't have inline handlers + return; + } - // Trigger an inline bound script - try { - if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) { - if ( elem[ "on" + type ] && elem[ "on" + type ].apply( elem, data ) === false ) { - event.result = false; - event.preventDefault(); + // Caller can pass in an Event, Object, or just an event type string + event = typeof event === "object" ? + // jQuery.Event object + event[ jQuery.expando ] ? event : + // Object literal + new jQuery.Event( type, event ) : + // Just the event type (string) + new jQuery.Event( type ); + + event.type = type; + event.exclusive = exclusive; + event.namespace = namespaces.join("."); + event.namespace_re = new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)"); + + // triggerHandler() and global events don't bubble or run the default action + if ( onlyHandlers || !elem ) { + event.preventDefault(); + event.stopPropagation(); + } + + // Handle a global trigger + if ( !elem ) { + // TODO: Stop taunting the data cache; remove global events and always attach to document + jQuery.each( jQuery.cache, function() { + // internalKey variable is just used to make it easier to find + // and potentially change this stuff later; currently it just + // points to jQuery.expando + var internalKey = jQuery.expando, + internalCache = this[ internalKey ]; + if ( internalCache && internalCache.events && internalCache.events[ type ] ) { + jQuery.event.trigger( event, data, internalCache.handle.elem ); } + }); + return; + } + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // Clean up the event in case it is being reused + event.result = undefined; + event.target = elem; + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data ? jQuery.makeArray( data ) : []; + data.unshift( event ); + + var cur = elem, + // IE doesn't like method names with a colon (#3533, #8272) + ontype = type.indexOf(":") < 0 ? "on" + type : ""; + + // Fire event on the current element, then bubble up the DOM tree + do { + var handle = jQuery._data( cur, "handle" ); + + event.currentTarget = cur; + if ( handle ) { + handle.apply( cur, data ); } - // prevent IE from throwing an error for some elements with some event types, see #3533 - } catch (inlineError) {} + // Trigger an inline bound script + if ( ontype && jQuery.acceptData( cur ) && cur[ ontype ] && cur[ ontype ].apply( cur, data ) === false ) { + event.result = false; + event.preventDefault(); + } - if ( !event.isPropagationStopped() && parent ) { - jQuery.event.trigger( event, data, parent, true ); + // Bubble up to document, then to window + cur = cur.parentNode || cur.ownerDocument || cur === event.target.ownerDocument && window; + } while ( cur && !event.isPropagationStopped() ); - } else if ( !event.isDefaultPrevented() ) { + // If nobody prevented the default action, do it now + if ( !event.isDefaultPrevented() ) { var old, - target = event.target, - targetType = type.replace( rnamespaces, "" ), - isClick = jQuery.nodeName( target, "a" ) && targetType === "click", - special = jQuery.event.special[ targetType ] || {}; + special = jQuery.event.special[ type ] || {}; - if ( (!special._default || special._default.call( elem, event ) === false) && - !isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) { + if ( (!special._default || special._default.call( elem.ownerDocument, event ) === false) && + !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction)() check here because IE6/7 fails that test. + // IE<9 dies on focus to hidden element (#1486), may want to revisit a try/catch. try { - if ( target[ targetType ] ) { - // Make sure that we don't accidentally re-trigger the onFOO events - old = target[ "on" + targetType ]; + if ( ontype && elem[ type ] ) { + // Don't re-trigger an onFOO event when we call its FOO() method + old = elem[ ontype ]; if ( old ) { - target[ "on" + targetType ] = null; + elem[ ontype ] = null; } - jQuery.event.triggered = true; - target[ targetType ](); + jQuery.event.triggered = type; + elem[ type ](); } - - // prevent IE from throwing an error for some elements with some event types, see #3533 - } catch (triggerError) {} + } catch ( ieError ) {} if ( old ) { - target[ "on" + targetType ] = old; + elem[ ontype ] = old; } - jQuery.event.triggered = false; + jQuery.event.triggered = undefined; } } + + return event.result; }, handle: function( event ) { - var all, handlers, namespaces, namespace_re, events, - namespace_sort = [], - args = jQuery.makeArray( arguments ); + event = jQuery.event.fix( event || window.event ); + // Snapshot the handlers list since a called handler may add/remove events. + var handlers = ((jQuery._data( this, "events" ) || {})[ event.type ] || []).slice(0), + run_all = !event.exclusive && !event.namespace, + args = Array.prototype.slice.call( arguments, 0 ); - event = args[0] = jQuery.event.fix( event || window.event ); + // Use the fix-ed Event rather than the (read-only) native event + args[0] = event; event.currentTarget = this; - // Namespaced event handlers - all = event.type.indexOf(".") < 0 && !event.exclusive; + for ( var j = 0, l = handlers.length; j < l; j++ ) { + var handleObj = handlers[ j ]; - if ( !all ) { - namespaces = event.type.split("."); - event.type = namespaces.shift(); - namespace_sort = namespaces.slice(0).sort(); - namespace_re = new RegExp("(^|\\.)" + namespace_sort.join("\\.(?:.*\\.)?") + "(\\.|$)"); - } + // Triggered event must 1) be non-exclusive and have no namespace, or + // 2) have namespace(s) a subset or equal to those in the bound event. + if ( run_all || event.namespace_re.test( handleObj.namespace ) ) { + // Pass in a reference to the handler function itself + // So that we can later remove it + event.handler = handleObj.handler; + event.data = handleObj.data; + event.handleObj = handleObj; - event.namespace = event.namespace || namespace_sort.join("."); + var ret = handleObj.handler.apply( this, args ); - events = jQuery.data(this, this.nodeType ? "events" : "__events__"); - - if ( typeof events === "function" ) { - events = events.events; - } - - handlers = (events || {})[ event.type ]; - - if ( events && handlers ) { - // Clone the handlers to prevent manipulation - handlers = handlers.slice(0); - - for ( var j = 0, l = handlers.length; j < l; j++ ) { - var handleObj = handlers[ j ]; - - // Filter the functions by class - if ( all || namespace_re.test( handleObj.namespace ) ) { - // Pass in a reference to the handler function itself - // So that we can later remove it - event.handler = handleObj.handler; - event.data = handleObj.data; - event.handleObj = handleObj; - - var ret = handleObj.handler.apply( this, args ); - - if ( ret !== undefined ) { - event.result = ret; - if ( ret === false ) { - event.preventDefault(); - event.stopPropagation(); - } + if ( ret !== undefined ) { + event.result = ret; + if ( ret === false ) { + event.preventDefault(); + event.stopPropagation(); } + } - if ( event.isImmediatePropagationStopped() ) { - break; - } + if ( event.isImmediatePropagationStopped() ) { + break; } } } - return event.result; }, @@ -2312,8 +2915,9 @@ jQuery.event = { // Calculate pageX/Y if missing and clientX/Y available if ( event.pageX == null && event.clientX != null ) { - var doc = document.documentElement, - body = document.body; + var eventDocument = event.target.ownerDocument || document, + doc = eventDocument.documentElement, + body = eventDocument.body; event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0); event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0); @@ -2355,7 +2959,7 @@ jQuery.event = { add: function( handleObj ) { jQuery.event.add( this, liveConvert( handleObj.origType, handleObj.selector ), - jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) ); + jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) ); }, remove: function( handleObj ) { @@ -2385,28 +2989,39 @@ jQuery.removeEvent = document.removeEventListener ? if ( elem.removeEventListener ) { elem.removeEventListener( type, handle, false ); } - } : + } : function( elem, type, handle ) { if ( elem.detachEvent ) { elem.detachEvent( "on" + type, handle ); } }; -jQuery.Event = function( src ) { +jQuery.Event = function( src, props ) { // Allow instantiation without the 'new' keyword if ( !this.preventDefault ) { - return new jQuery.Event( src ); + return new jQuery.Event( src, props ); } // Event object if ( src && src.type ) { this.originalEvent = src; this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false || + src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse; + // Event type } else { this.type = src; } + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + // timeStamp is buggy for some events on Firefox(#3843) // So we won't rely on the native value this.timeStamp = jQuery.now(); @@ -2432,7 +3047,7 @@ jQuery.Event.prototype = { if ( !e ) { return; } - + // if preventDefault exists run it on the original event if ( e.preventDefault ) { e.preventDefault(); @@ -2474,6 +3089,12 @@ var withinElement = function( event ) { // Firefox sometimes assigns relatedTarget a XUL element // which we cannot access the parentNode property of try { + + // Chrome does something similar, the parentNode property + // can be accessed but is null. + if ( parent && parent !== document && !parent.parentNode ) { + return; + } // Traverse up the tree while ( parent && parent !== this ) { parent = parent.parentNode; @@ -2518,24 +3139,22 @@ if ( !jQuery.support.submitBubbles ) { jQuery.event.special.submit = { setup: function( data, namespaces ) { - if ( this.nodeName.toLowerCase() !== "form" ) { + if ( !jQuery.nodeName( this, "form" ) ) { jQuery.event.add(this, "click.specialSubmit", function( e ) { var elem = e.target, type = elem.type; if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) { - e.liveFired = undefined; - return trigger( "submit", this, arguments ); + trigger( "submit", this, arguments ); } }); - + jQuery.event.add(this, "keypress.specialSubmit", function( e ) { var elem = e.target, type = elem.type; if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) { - e.liveFired = undefined; - return trigger( "submit", this, arguments ); + trigger( "submit", this, arguments ); } }); @@ -2569,7 +3188,7 @@ if ( !jQuery.support.changeBubbles ) { }).join("-") : ""; - } else if ( elem.nodeName.toLowerCase() === "select" ) { + } else if ( jQuery.nodeName( elem, "select" ) ) { val = elem.selectedIndex; } @@ -2583,14 +3202,14 @@ if ( !jQuery.support.changeBubbles ) { return; } - data = jQuery.data( elem, "_change_data" ); + data = jQuery._data( elem, "_change_data" ); val = getVal(elem); // the current data will be also retrieved by beforeactivate if ( e.type !== "focusout" || elem.type !== "radio" ) { - jQuery.data( elem, "_change_data", val ); + jQuery._data( elem, "_change_data", val ); } - + if ( data === undefined || val === data ) { return; } @@ -2598,33 +3217,33 @@ if ( !jQuery.support.changeBubbles ) { if ( data != null || val ) { e.type = "change"; e.liveFired = undefined; - return jQuery.event.trigger( e, arguments[1], elem ); + jQuery.event.trigger( e, arguments[1], elem ); } }; jQuery.event.special.change = { filters: { - focusout: testChange, + focusout: testChange, beforedeactivate: testChange, click: function( e ) { - var elem = e.target, type = elem.type; + var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : ""; - if ( type === "radio" || type === "checkbox" || elem.nodeName.toLowerCase() === "select" ) { - return testChange.call( this, e ); + if ( type === "radio" || type === "checkbox" || jQuery.nodeName( elem, "select" ) ) { + testChange.call( this, e ); } }, // Change has to be called before submit // Keydown will be called before keypress, which is used in submit-event delegation keydown: function( e ) { - var elem = e.target, type = elem.type; + var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : ""; - if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== "textarea") || + if ( (e.keyCode === 13 && !jQuery.nodeName( elem, "textarea" ) ) || (e.keyCode === 32 && (type === "checkbox" || type === "radio")) || type === "select-multiple" ) { - return testChange.call( this, e ); + testChange.call( this, e ); } }, @@ -2633,7 +3252,7 @@ if ( !jQuery.support.changeBubbles ) { // information beforeactivate: function( e ) { var elem = e.target; - jQuery.data( elem, "_change_data", getVal(elem) ); + jQuery._data( elem, "_change_data", getVal(elem) ); } }, @@ -2663,36 +3282,58 @@ if ( !jQuery.support.changeBubbles ) { } function trigger( type, elem, args ) { - args[0].type = type; - return jQuery.event.handle.apply( elem, args ); + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + // Don't pass args or remember liveFired; they apply to the donor event. + var event = jQuery.extend( {}, args[ 0 ] ); + event.type = type; + event.originalEvent = {}; + event.liveFired = undefined; + jQuery.event.handle.call( elem, event ); + if ( event.isDefaultPrevented() ) { + args[ 0 ].preventDefault(); + } } // Create "bubbling" focus and blur events -if ( document.addEventListener ) { +if ( !jQuery.support.focusinBubbles ) { jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler while someone wants focusin/focusout + var attaches = 0; + jQuery.event.special[ fix ] = { setup: function() { - if ( focusCounts[fix]++ === 0 ) { + if ( attaches++ === 0 ) { document.addEventListener( orig, handler, true ); } - }, - teardown: function() { - if ( --focusCounts[fix] === 0 ) { + }, + teardown: function() { + if ( --attaches === 0 ) { document.removeEventListener( orig, handler, true ); } } }; - function handler( e ) { - e = jQuery.event.fix( e ); + function handler( donor ) { + // Donor event is always a native one; fix it and switch its type. + // Let focusin/out handler cancel the donor focus/blur event. + var e = jQuery.event.fix( donor ); e.type = fix; - return jQuery.event.trigger( e, null, e.target ); + e.originalEvent = {}; + jQuery.event.trigger( e, null, e.target ); + if ( e.isDefaultPrevented() ) { + donor.preventDefault(); + } } }); } jQuery.each(["bind", "one"], function( i, name ) { jQuery.fn[ name ] = function( type, data, fn ) { + var handler; + // Handle object literals if ( typeof type === "object" ) { for ( var key in type ) { @@ -2700,16 +3341,21 @@ jQuery.each(["bind", "one"], function( i, name ) { } return this; } - - if ( jQuery.isFunction( data ) || data === false ) { + + if ( arguments.length === 2 || data === false ) { fn = data; data = undefined; } - var handler = name === "one" ? jQuery.proxy( fn, function( event ) { - jQuery( this ).unbind( event, handler ); - return fn.apply( this, arguments ); - }) : fn; + if ( name === "one" ) { + handler = function( event ) { + jQuery( this ).unbind( event, handler ); + return fn.apply( this, arguments ); + }; + handler.guid = fn.guid || jQuery.guid++; + } else { + handler = fn; + } if ( type === "unload" && name !== "one" ) { this.one( type, data, fn ); @@ -2740,20 +3386,20 @@ jQuery.fn.extend({ return this; }, - + delegate: function( selector, types, data, fn ) { return this.live( types, data, fn, selector ); }, - + undelegate: function( selector, types, fn ) { if ( arguments.length === 0 ) { - return this.unbind( "live" ); - + return this.unbind( "live" ); + } else { return this.die( types, null, fn, selector ); } }, - + trigger: function( type, data ) { return this.each(function() { jQuery.event.trigger( type, data, this ); @@ -2762,35 +3408,34 @@ jQuery.fn.extend({ triggerHandler: function( type, data ) { if ( this[0] ) { - var event = jQuery.Event( type ); - event.preventDefault(); - event.stopPropagation(); - jQuery.event.trigger( event, data, this[0] ); - return event.result; + return jQuery.event.trigger( type, data, this[0], true ); } }, toggle: function( fn ) { // Save reference to arguments for access in closure var args = arguments, - i = 1; + guid = fn.guid || jQuery.guid++, + i = 0, + toggler = function( event ) { + // Figure out which function to execute + var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i; + jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 ); + + // Make sure that clicks stop + event.preventDefault(); + + // and execute the function + return args[ lastToggle ].apply( this, arguments ) || false; + }; // link all the functions, so any of them can unbind this click handler + toggler.guid = guid; while ( i < args.length ) { - jQuery.proxy( fn, args[ i++ ] ); + args[ i++ ].guid = guid; } - return this.click( jQuery.proxy( fn, function( event ) { - // Figure out which function to execute - var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i; - jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 ); - - // Make sure that clicks stop - event.preventDefault(); - - // and execute the function - return args[ lastToggle ].apply( this, arguments ) || false; - })); + return this.click( toggler ); }, hover: function( fnOver, fnOut ) { @@ -2810,17 +3455,25 @@ jQuery.each(["live", "die"], function( i, name ) { var type, i = 0, match, namespaces, preType, selector = origSelector || this.selector, context = origSelector ? this : jQuery( this.context ); - + if ( typeof types === "object" && !types.preventDefault ) { for ( var key in types ) { context[ name ]( key, data, types[key], selector ); } - + return this; } - if ( jQuery.isFunction( data ) ) { - fn = data; + if ( name === "die" && !types && + origSelector && origSelector.charAt(0) === "." ) { + + context.unbind( origSelector ); + + return this; + } + + if ( data === false || jQuery.isFunction( data ) ) { + fn = data || returnFalse; data = undefined; } @@ -2842,7 +3495,7 @@ jQuery.each(["live", "die"], function( i, name ) { preType = type; - if ( type === "focus" || type === "blur" ) { + if ( liveMap[ type ] ) { types.push( liveMap[ type ] + namespaces ); type = type + namespaces; @@ -2862,7 +3515,7 @@ jQuery.each(["live", "die"], function( i, name ) { context.unbind( "live." + liveConvert( type, selector ), fn ); } } - + return this; }; }); @@ -2871,17 +3524,13 @@ function liveHandler( event ) { var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret, elems = [], selectors = [], - events = jQuery.data( this, this.nodeType ? "events" : "__events__" ); + events = jQuery._data( this, "events" ); - if ( typeof events === "function" ) { - events = events.events; - } - - // Make sure we avoid non-left-click bubbling in Firefox (#3861) - if ( event.liveFired === this || !events || !events.live || event.button && event.type === "click" ) { + // Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911) + if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) { return; } - + if ( event.namespace ) { namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)"); } @@ -2909,7 +3558,7 @@ function liveHandler( event ) { for ( j = 0; j < live.length; j++ ) { handleObj = live[j]; - if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) ) { + if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) { elem = close.elem; related = null; @@ -2917,6 +3566,11 @@ function liveHandler( event ) { if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) { event.type = handleObj.preType; related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0]; + + // Make sure not to accidentally match a child element with the same selector + if ( related && jQuery.contains( elem, related ) ) { + related = elem; + } } if ( !related || related !== elem ) { @@ -2955,7 +3609,7 @@ function liveHandler( event ) { } function liveConvert( type, selector ) { - return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspace, "&"); + return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspaces, "&"); } jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + @@ -2979,27 +3633,11 @@ jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblcl } }); -// Prevent memory leaks in IE -// Window isn't included so as not to unbind existing unload events -// More info: -// - http://isaacschlueter.com/2006/10/msie-memory-leaks/ -if ( window.attachEvent && !window.addEventListener ) { - jQuery(window).bind("unload", function() { - for ( var id in jQuery.cache ) { - if ( jQuery.cache[ id ].handle ) { - // Try/Catch is to handle iframes being unloaded, see #4280 - try { - jQuery.event.remove( jQuery.cache[ id ].handle.elem ); - } catch(e) {} - } - } - }); -} /*! - * Sizzle CSS Selector Engine - v1.0 - * Copyright 2009, The Dojo Foundation + * Sizzle CSS Selector Engine + * Copyright 2011, The Dojo Foundation * Released under the MIT, BSD, and GPL Licenses. * More information: http://sizzlejs.com/ */ @@ -3009,7 +3647,9 @@ var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[ done = 0, toString = Object.prototype.toString, hasDuplicate = false, - baseHasDuplicate = true; + baseHasDuplicate = true, + rBackslash = /\\/g, + rNonWord = /\W/; // Here we check if the JavaScript engine is using some sort of // optimization where it does not always call our comparision @@ -3208,7 +3848,7 @@ Sizzle.find = function( expr, context, isXML ) { match.splice( 1, 1 ); if ( left.substr( left.length - 1 ) !== "\\" ) { - match[1] = (match[1] || "").replace(/\\/g, ""); + match[1] = (match[1] || "").replace( rBackslash, "" ); set = Expr.find[ type ]( match, context, isXML ); if ( set != null ) { @@ -3220,7 +3860,9 @@ Sizzle.find = function( expr, context, isXML ) { } if ( !set ) { - set = context.getElementsByTagName( "*" ); + set = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName( "*" ) : + []; } return { set: set, expr: expr }; @@ -3328,9 +3970,9 @@ var Expr = Sizzle.selectors = { ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, - ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/, + ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, - CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+\-]*)\))?/, + CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ }, @@ -3345,13 +3987,16 @@ var Expr = Sizzle.selectors = { attrHandle: { href: function( elem ) { return elem.getAttribute( "href" ); + }, + type: function( elem ) { + return elem.getAttribute( "type" ); } }, relative: { "+": function(checkSet, part){ var isPartStr = typeof part === "string", - isTag = isPartStr && !/\W/.test( part ), + isTag = isPartStr && !rNonWord.test( part ), isPartStrNotTag = isPartStr && !isTag; if ( isTag ) { @@ -3379,7 +4024,7 @@ var Expr = Sizzle.selectors = { i = 0, l = checkSet.length; - if ( isPartStr && !/\W/.test( part ) ) { + if ( isPartStr && !rNonWord.test( part ) ) { part = part.toLowerCase(); for ( ; i < l; i++ ) { @@ -3413,7 +4058,7 @@ var Expr = Sizzle.selectors = { doneName = done++, checkFn = dirCheck; - if ( typeof part === "string" && !/\W/.test(part) ) { + if ( typeof part === "string" && !rNonWord.test( part ) ) { part = part.toLowerCase(); nodeCheck = part; checkFn = dirNodeCheck; @@ -3427,7 +4072,7 @@ var Expr = Sizzle.selectors = { doneName = done++, checkFn = dirCheck; - if ( typeof part === "string" && !/\W/.test( part ) ) { + if ( typeof part === "string" && !rNonWord.test( part ) ) { part = part.toLowerCase(); nodeCheck = part; checkFn = dirNodeCheck; @@ -3463,12 +4108,14 @@ var Expr = Sizzle.selectors = { }, TAG: function( match, context ) { - return context.getElementsByTagName( match[1] ); + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( match[1] ); + } } }, preFilter: { CLASS: function( match, curLoop, inplace, result, not, isXML ) { - match = " " + match[1].replace(/\\/g, "") + " "; + match = " " + match[1].replace( rBackslash, "" ) + " "; if ( isXML ) { return match; @@ -3476,7 +4123,7 @@ var Expr = Sizzle.selectors = { for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { if ( elem ) { - if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n]/g, " ").indexOf(match) >= 0) ) { + if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { if ( !inplace ) { result.push( elem ); } @@ -3491,17 +4138,23 @@ var Expr = Sizzle.selectors = { }, ID: function( match ) { - return match[1].replace(/\\/g, ""); + return match[1].replace( rBackslash, "" ); }, TAG: function( match, curLoop ) { - return match[1].toLowerCase(); + return match[1].replace( rBackslash, "" ).toLowerCase(); }, CHILD: function( match ) { if ( match[1] === "nth" ) { + if ( !match[2] ) { + Sizzle.error( match[0] ); + } + + match[2] = match[2].replace(/^\+|\s*/g, ''); + // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' - var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec( + var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); @@ -3509,6 +4162,9 @@ var Expr = Sizzle.selectors = { match[2] = (test[1] + (test[2] || 1)) - 0; match[3] = test[3] - 0; } + else if ( match[2] ) { + Sizzle.error( match[0] ); + } // TODO: Move to normal caching system match[0] = done++; @@ -3517,12 +4173,15 @@ var Expr = Sizzle.selectors = { }, ATTR: function( match, curLoop, inplace, result, not, isXML ) { - var name = match[1].replace(/\\/g, ""); + var name = match[1] = match[1].replace( rBackslash, "" ); if ( !isXML && Expr.attrMap[name] ) { match[1] = Expr.attrMap[name]; } + // Handle if an un-quoted value was used + match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); + if ( match[2] === "~=" ) { match[4] = " " + match[4] + " "; } @@ -3576,7 +4235,9 @@ var Expr = Sizzle.selectors = { selected: function( elem ) { // Accessing this property makes selected-by-default // options in Safari work properly - elem.parentNode.selectedIndex; + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } return elem.selected === true; }, @@ -3598,41 +4259,52 @@ var Expr = Sizzle.selectors = { }, text: function( elem ) { - return "text" === elem.type; + var attr = elem.getAttribute( "type" ), type = elem.type; + // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) + // use getAttribute instead to test this case + return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null ); }, + radio: function( elem ) { - return "radio" === elem.type; + return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type; }, checkbox: function( elem ) { - return "checkbox" === elem.type; + return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type; }, file: function( elem ) { - return "file" === elem.type; + return elem.nodeName.toLowerCase() === "input" && "file" === elem.type; }, + password: function( elem ) { - return "password" === elem.type; + return elem.nodeName.toLowerCase() === "input" && "password" === elem.type; }, submit: function( elem ) { - return "submit" === elem.type; + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && "submit" === elem.type; }, image: function( elem ) { - return "image" === elem.type; + return elem.nodeName.toLowerCase() === "input" && "image" === elem.type; }, reset: function( elem ) { - return "reset" === elem.type; + return elem.nodeName.toLowerCase() === "input" && "reset" === elem.type; }, button: function( elem ) { - return "button" === elem.type || elem.nodeName.toLowerCase() === "button"; + var name = elem.nodeName.toLowerCase(); + return name === "input" && "button" === elem.type || name === "button"; }, input: function( elem ) { return (/input|select|textarea|button/i).test( elem.nodeName ); + }, + + focus: function( elem ) { + return elem === elem.ownerDocument.activeElement; } }, setFilters: { @@ -3691,7 +4363,7 @@ var Expr = Sizzle.selectors = { return true; } else { - Sizzle.error( "Syntax error, unrecognized expression: " + name ); + Sizzle.error( name ); } }, @@ -4081,13 +4753,47 @@ if ( document.querySelectorAll ) { Sizzle = function( query, context, extra, seed ) { context = context || document; - // Make sure that attribute selectors are quoted - query = query.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); - // Only use querySelectorAll on non-XML documents // (ID selectors don't work in non-HTML documents) if ( !seed && !Sizzle.isXML(context) ) { + // See if we find a selector to speed up + var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); + + if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { + // Speed-up: Sizzle("TAG") + if ( match[1] ) { + return makeArray( context.getElementsByTagName( query ), extra ); + + // Speed-up: Sizzle(".CLASS") + } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { + return makeArray( context.getElementsByClassName( match[2] ), extra ); + } + } + if ( context.nodeType === 9 ) { + // Speed-up: Sizzle("body") + // The body element only exists once, optimize finding it + if ( query === "body" && context.body ) { + return makeArray( [ context.body ], extra ); + + // Speed-up: Sizzle("#ID") + } else if ( match && match[3] ) { + var elem = context.getElementById( match[3] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id === match[3] ) { + return makeArray( [ elem ], extra ); + } + + } else { + return makeArray( [], extra ); + } + } + try { return makeArray( context.querySelectorAll(query), extra ); } catch(qsaError) {} @@ -4097,20 +4803,30 @@ if ( document.querySelectorAll ) { // and working up from there (Thanks to Andrew Dupont for the technique) // IE 8 doesn't work on object elements } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { - var old = context.getAttribute( "id" ), - nid = old || id; + var oldContext = context, + old = context.getAttribute( "id" ), + nid = old || id, + hasParent = context.parentNode, + relativeHierarchySelector = /^\s*[+~]/.test( query ); if ( !old ) { context.setAttribute( "id", nid ); + } else { + nid = nid.replace( /'/g, "\\$&" ); + } + if ( relativeHierarchySelector && hasParent ) { + context = context.parentNode; } try { - return makeArray( context.querySelectorAll( "#" + nid + " " + query ), extra ); + if ( !relativeHierarchySelector || hasParent ) { + return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); + } } catch(pseudoError) { } finally { if ( !old ) { - context.removeAttribute( "id" ); + oldContext.removeAttribute( "id" ); } } } @@ -4130,19 +4846,23 @@ if ( document.querySelectorAll ) { (function(){ var html = document.documentElement, - matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector, - pseudoWorks = false; - - try { - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( document.documentElement, "[test!='']:sizzle" ); - - } catch( pseudoError ) { - pseudoWorks = true; - } + matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; if ( matches ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9 fails this) + var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ), + pseudoWorks = false; + + try { + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( document.documentElement, "[test!='']:sizzle" ); + + } catch( pseudoError ) { + pseudoWorks = true; + } + Sizzle.matchesSelector = function( node, expr ) { // Make sure that attribute selectors are quoted expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); @@ -4150,7 +4870,15 @@ if ( document.querySelectorAll ) { if ( !Sizzle.isXML( node ) ) { try { if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { - return matches.call( node, expr ); + var ret = matches.call( node, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || !disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9, so check for that + node.document && node.document.nodeType !== 11 ) { + return ret; + } } } catch(e) {} } @@ -4328,21 +5056,41 @@ var runtil = /Until$/, rmultiselector = /,/, isSimple = /^.[^:#\[\.,]*$/, slice = Array.prototype.slice, - POS = jQuery.expr.match.POS; + POS = jQuery.expr.match.POS, + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; jQuery.fn.extend({ find: function( selector ) { - var ret = this.pushStack( "", "find", selector ), - length = 0; + var self = this, + i, l; - for ( var i = 0, l = this.length; i < l; i++ ) { + if ( typeof selector !== "string" ) { + return jQuery( selector ).filter(function() { + for ( i = 0, l = self.length; i < l; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + }); + } + + var ret = this.pushStack( "", "find", selector ), + length, n, r; + + for ( i = 0, l = this.length; i < l; i++ ) { length = ret.length; jQuery.find( selector, this[i], ret ); if ( i > 0 ) { // Make sure that the results are unique - for ( var n = length; n < ret.length; n++ ) { - for ( var r = 0; r < length; r++ ) { + for ( n = length; n < ret.length; n++ ) { + for ( r = 0; r < length; r++ ) { if ( ret[r] === ret[n] ) { ret.splice(n--, 1); break; @@ -4373,14 +5121,17 @@ jQuery.fn.extend({ filter: function( selector ) { return this.pushStack( winnow(this, selector, true), "filter", selector ); }, - + is: function( selector ) { - return !!selector && jQuery.filter( selector, this ).length > 0; + return !!selector && ( typeof selector === "string" ? + jQuery.filter( selector, this ).length > 0 : + this.filter( selector ).length > 0 ); }, closest: function( selectors, context ) { var ret = [], i, l, cur = this[0]; - + + // Array if ( jQuery.isArray( selectors ) ) { var match, selector, matches = {}, @@ -4390,8 +5141,8 @@ jQuery.fn.extend({ for ( i = 0, l = selectors.length; i < l; i++ ) { selector = selectors[i]; - if ( !matches[selector] ) { - matches[selector] = jQuery.expr.match.POS.test( selector ) ? + if ( !matches[ selector ] ) { + matches[ selector ] = POS.test( selector ) ? jQuery( selector, context || this.context ) : selector; } @@ -4399,9 +5150,9 @@ jQuery.fn.extend({ while ( cur && cur.ownerDocument && cur !== context ) { for ( selector in matches ) { - match = matches[selector]; + match = matches[ selector ]; - if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) { + if ( match.jquery ? match.index( cur ) > -1 : jQuery( cur ).is( match ) ) { ret.push({ selector: selector, elem: cur, level: level }); } } @@ -4414,8 +5165,10 @@ jQuery.fn.extend({ return ret; } - var pos = POS.test( selectors ) ? - jQuery( selectors, context || this.context ) : null; + // String + var pos = POS.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; for ( i = 0, l = this.length; i < l; i++ ) { cur = this[i]; @@ -4427,18 +5180,18 @@ jQuery.fn.extend({ } else { cur = cur.parentNode; - if ( !cur || !cur.ownerDocument || cur === context ) { + if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) { break; } } } } - ret = ret.length > 1 ? jQuery.unique(ret) : ret; - + ret = ret.length > 1 ? jQuery.unique( ret ) : ret; + return this.pushStack( ret, "closest", selectors ); }, - + // Determine the position of an element within // the matched set of elements index: function( elem ) { @@ -4456,8 +5209,8 @@ jQuery.fn.extend({ add: function( selector, context ) { var set = typeof selector === "string" ? - jQuery( selector, context || this.context ) : - jQuery.makeArray( selector ), + jQuery( selector, context ) : + jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), all = jQuery.merge( this.get(), set ); return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? @@ -4518,8 +5271,13 @@ jQuery.each({ } }, function( name, fn ) { jQuery.fn[ name ] = function( until, selector ) { - var ret = jQuery.map( this, fn, until ); - + var ret = jQuery.map( this, fn, until ), + // The variable 'args' was introduced in + // https://github.com/jquery/jquery/commit/52a0238 + // to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed. + // http://code.google.com/p/v8/issues/detail?id=1050 + args = slice.call(arguments); + if ( !runtil.test( name ) ) { selector = until; } @@ -4528,13 +5286,13 @@ jQuery.each({ ret = jQuery.filter( selector, ret ); } - ret = this.length > 1 ? jQuery.unique( ret ) : ret; + ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { ret = ret.reverse(); } - return this.pushStack( ret, name, slice.call(arguments).join(",") ); + return this.pushStack( ret, name, args.join(",") ); }; }); @@ -4548,7 +5306,7 @@ jQuery.extend({ jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : jQuery.find.matches(expr, elems); }, - + dir: function( elem, dir, until ) { var matched = [], cur = elem[ dir ]; @@ -4590,6 +5348,11 @@ jQuery.extend({ // Implement the identical functionality for filter and not function winnow( elements, qualifier, keep ) { + + // Can't pass null or undefined to indexOf in Firefox 4 + // Set to 0 to skip string check + qualifier = qualifier || 0; + if ( jQuery.isFunction( qualifier ) ) { return jQuery.grep(elements, function( elem, i ) { var retVal = !!qualifier.call( elem, i, elem ); @@ -4628,9 +5391,9 @@ var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, rtbody = /\s]+\/)>/g, + rscriptType = /\/(java|ecma)script/i, wrapMap = { option: [ 1, "" ], legend: [ 1, "
    ", "
    " ], @@ -4691,7 +5454,7 @@ jQuery.fn.extend({ } return elem; - }).append(this); + }).append( this ); } return this; @@ -4770,7 +5533,7 @@ jQuery.fn.extend({ return set; } }, - + // keepData is for internal use only--do not document remove: function( selector, keepData ) { for ( var i = 0, elem; (elem = this[i]) != null; i++ ) { @@ -4781,11 +5544,11 @@ jQuery.fn.extend({ } if ( elem.parentNode ) { - elem.parentNode.removeChild( elem ); + elem.parentNode.removeChild( elem ); } } } - + return this; }, @@ -4801,48 +5564,17 @@ jQuery.fn.extend({ elem.removeChild( elem.firstChild ); } } - + return this; }, - clone: function( events ) { - // Do the clone - var ret = this.map(function() { - if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) { - // IE copies events bound via attachEvent when - // using cloneNode. Calling detachEvent on the - // clone will also remove the events from the orignal - // In order to get around this, we use innerHTML. - // Unfortunately, this means some modifications to - // attributes in IE that are actually only stored - // as properties will not be copied (such as the - // the name attribute on an input). - var html = this.outerHTML, - ownerDocument = this.ownerDocument; + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - if ( !html ) { - var div = ownerDocument.createElement("div"); - div.appendChild( this.cloneNode(true) ); - html = div.innerHTML; - } - - return jQuery.clean([html.replace(rinlinejQuery, "") - // Handle the case in IE 8 where action=/test/> self-closes a tag - .replace(raction, '="$1">') - .replace(rleadingWhitespace, "")], ownerDocument)[0]; - } else { - return this.cloneNode(true); - } + return this.map( function () { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); }); - - // Copy the events from the original to the clone - if ( events === true ) { - cloneCopyEvent( this, ret ); - cloneCopyEvent( this.find("*"), ret.find("*") ); - } - - // Return the cloned set - return ret; }, html: function( value ) { @@ -4914,7 +5646,9 @@ jQuery.fn.extend({ } }); } else { - return this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ); + return this.length ? + this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) : + this; } }, @@ -4952,9 +5686,9 @@ jQuery.fn.extend({ } else { results = jQuery.buildFragment( args, this, scripts ); } - + fragment = results.fragment; - + if ( fragment.childNodes.length === 1 ) { first = fragment = fragment.firstChild; } else { @@ -4964,13 +5698,20 @@ jQuery.fn.extend({ if ( first ) { table = table && jQuery.nodeName( first, "tr" ); - for ( var i = 0, l = this.length; i < l; i++ ) { + for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) { callback.call( table ? root(this[i], first) : this[i], - i > 0 || results.cacheable || this.length > 1 ? - fragment.cloneNode(true) : + // Make sure that we do not leak memory by inadvertently discarding + // the original fragment (which might have attached data) instead of + // using it; in addition, use the original fragment object for the last + // item instead of first because it can end up being emptied incorrectly + // in certain situations (Bug #8070). + // Fragments from the fragment cache must always be cloned and never used + // in place. + results.cacheable || (l > 1 && i < lastIndex) ? + jQuery.clone( fragment, true, true ) : fragment ); } @@ -4992,48 +5733,109 @@ function root( elem, cur ) { elem; } -function cloneCopyEvent(orig, ret) { - var i = 0; +function cloneCopyEvent( src, dest ) { - ret.each(function() { - if ( this.nodeName !== (orig[i] && orig[i].nodeName) ) { - return; - } + if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { + return; + } - var oldData = jQuery.data( orig[i++] ), - curData = jQuery.data( this, oldData ), - events = oldData && oldData.events; + var internalKey = jQuery.expando, + oldData = jQuery.data( src ), + curData = jQuery.data( dest, oldData ); + + // Switch to use the internal data object, if it exists, for the next + // stage of data copying + if ( (oldData = oldData[ internalKey ]) ) { + var events = oldData.events; + curData = curData[ internalKey ] = jQuery.extend({}, oldData); if ( events ) { delete curData.handle; curData.events = {}; for ( var type in events ) { - for ( var handler in events[ type ] ) { - jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data ); + for ( var i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data ); } } } - }); + } +} + +function cloneFixAttributes( src, dest ) { + var nodeName; + + // We do not need to do anything for non-Elements + if ( dest.nodeType !== 1 ) { + return; + } + + // clearAttributes removes the attributes, which we don't want, + // but also removes the attachEvent events, which we *do* want + if ( dest.clearAttributes ) { + dest.clearAttributes(); + } + + // mergeAttributes, in contrast, only merges back on the + // original attributes, not the events + if ( dest.mergeAttributes ) { + dest.mergeAttributes( src ); + } + + nodeName = dest.nodeName.toLowerCase(); + + // IE6-8 fail to clone children inside object elements that use + // the proprietary classid attribute value (rather than the type + // attribute) to identify the type of content to display + if ( nodeName === "object" ) { + dest.outerHTML = src.outerHTML; + + } else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) { + // IE6-8 fails to persist the checked state of a cloned checkbox + // or radio button. Worse, IE6-7 fail to give the cloned element + // a checked appearance if the defaultChecked value isn't also set + if ( src.checked ) { + dest.defaultChecked = dest.checked = src.checked; + } + + // IE6-7 get confused and end up setting the value of a cloned + // checkbox/radio button to an empty string instead of "on" + if ( dest.value !== src.value ) { + dest.value = src.value; + } + + // IE6-8 fails to return the selected option to the default selected + // state when cloning options + } else if ( nodeName === "option" ) { + dest.selected = src.defaultSelected; + + // IE6-8 fails to set the defaultValue to the correct value when + // cloning other types of input fields + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } + + // Event data gets referenced instead of copied if the expando + // gets copied too + dest.removeAttribute( jQuery.expando ); } jQuery.buildFragment = function( args, nodes, scripts ) { var fragment, cacheable, cacheresults, doc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document); - // Only cache "small" (1/2 KB) strings that are associated with the main document + // Only cache "small" (1/2 KB) HTML strings that are associated with the main document // Cloning options loses the selected state, so don't cache them // IE 6 doesn't like it when you put or elements in a fragment // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document && - !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) { + args[0].charAt(0) === "<" && !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) { cacheable = true; + cacheresults = jQuery.fragments[ args[0] ]; - if ( cacheresults ) { - if ( cacheresults !== 1 ) { - fragment = cacheresults; - } + if ( cacheresults && cacheresults !== 1 ) { + fragment = cacheresults; } } @@ -5062,25 +5864,101 @@ jQuery.each({ var ret = [], insert = jQuery( selector ), parent = this.length === 1 && this[0].parentNode; - + if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) { insert[ original ]( this[0] ); return this; - + } else { for ( var i = 0, l = insert.length; i < l; i++ ) { var elems = (i > 0 ? this.clone(true) : this).get(); jQuery( insert[i] )[ original ]( elems ); ret = ret.concat( elems ); } - + return this.pushStack( ret, name, insert.selector ); } }; }); +function getAll( elem ) { + if ( "getElementsByTagName" in elem ) { + return elem.getElementsByTagName( "*" ); + + } else if ( "querySelectorAll" in elem ) { + return elem.querySelectorAll( "*" ); + + } else { + return []; + } +} + +// Used in clean, fixes the defaultChecked property +function fixDefaultChecked( elem ) { + if ( elem.type === "checkbox" || elem.type === "radio" ) { + elem.defaultChecked = elem.checked; + } +} +// Finds all inputs and passes them to fixDefaultChecked +function findInputs( elem ) { + if ( jQuery.nodeName( elem, "input" ) ) { + fixDefaultChecked( elem ); + } else if ( elem.getElementsByTagName ) { + jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked ); + } +} + jQuery.extend({ + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var clone = elem.cloneNode(true), + srcElements, + destElements, + i; + + if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) && + (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) { + // IE copies events bound via attachEvent when using cloneNode. + // Calling detachEvent on the clone will also remove the events + // from the original. In order to get around this, we use some + // proprietary methods to clear the events. Thanks to MooTools + // guys for this hotness. + + cloneFixAttributes( elem, clone ); + + // Using Sizzle here is crazy slow, so we use getElementsByTagName + // instead + srcElements = getAll( elem ); + destElements = getAll( clone ); + + // Weird iteration because IE will replace the length property + // with an element if you are cloning the body and one of the + // elements on the page has a name or id of "length" + for ( i = 0; srcElements[i]; ++i ) { + cloneFixAttributes( srcElements[i], destElements[i] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + cloneCopyEvent( elem, clone ); + + if ( deepDataAndEvents ) { + srcElements = getAll( elem ); + destElements = getAll( clone ); + + for ( i = 0; srcElements[i]; ++i ) { + cloneCopyEvent( srcElements[i], destElements[i] ); + } + } + } + + // Return the cloned set + return clone; + }, + clean: function( elems, context, fragment, scripts ) { + var checkScriptType; + context = context || document; // !context.createElement fails in IE with an error but returns typeof 'object' @@ -5100,54 +5978,67 @@ jQuery.extend({ } // Convert html string into DOM nodes - if ( typeof elem === "string" && !rhtml.test( elem ) ) { - elem = context.createTextNode( elem ); + if ( typeof elem === "string" ) { + if ( !rhtml.test( elem ) ) { + elem = context.createTextNode( elem ); + } else { + // Fix "XHTML"-style tags in all browsers + elem = elem.replace(rxhtmlTag, "<$1>"); - } else if ( typeof elem === "string" ) { - // Fix "XHTML"-style tags in all browsers - elem = elem.replace(rxhtmlTag, "<$1>"); + // Trim whitespace, otherwise indexOf won't work as expected + var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(), + wrap = wrapMap[ tag ] || wrapMap._default, + depth = wrap[0], + div = context.createElement("div"); - // Trim whitespace, otherwise indexOf won't work as expected - var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(), - wrap = wrapMap[ tag ] || wrapMap._default, - depth = wrap[0], - div = context.createElement("div"); + // Go to html and back, then peel off extra wrappers + div.innerHTML = wrap[1] + elem + wrap[2]; - // Go to html and back, then peel off extra wrappers - div.innerHTML = wrap[1] + elem + wrap[2]; + // Move to the right depth + while ( depth-- ) { + div = div.lastChild; + } - // Move to the right depth - while ( depth-- ) { - div = div.lastChild; - } + // Remove IE's autoinserted from table fragments + if ( !jQuery.support.tbody ) { - // Remove IE's autoinserted from table fragments - if ( !jQuery.support.tbody ) { + // String was a , *may* have spurious + var hasBody = rtbody.test(elem), + tbody = tag === "table" && !hasBody ? + div.firstChild && div.firstChild.childNodes : - // String was a
    , *may* have spurious - var hasBody = rtbody.test(elem), - tbody = tag === "table" && !hasBody ? - div.firstChild && div.firstChild.childNodes : + // String was a bare or + wrap[1] === "
    " && !hasBody ? + div.childNodes : + []; - // String was a bare or - wrap[1] === "
    " && !hasBody ? - div.childNodes : - []; - - for ( var j = tbody.length - 1; j >= 0 ; --j ) { - if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) { - tbody[ j ].parentNode.removeChild( tbody[ j ] ); + for ( var j = tbody.length - 1; j >= 0 ; --j ) { + if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) { + tbody[ j ].parentNode.removeChild( tbody[ j ] ); + } } } - } + // IE completely kills leading whitespace when innerHTML is used + if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { + div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild ); + } - // IE completely kills leading whitespace when innerHTML is used - if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { - div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild ); + elem = div.childNodes; } + } - elem = div.childNodes; + // Resets defaultChecked for any radios and checkboxes + // about to be appended to the DOM in IE 6/7 (#8060) + var len; + if ( !jQuery.support.appendChecked ) { + if ( elem[0] && typeof (len = elem.length) === "number" ) { + for ( i = 0; i < len; i++ ) { + findInputs( elem[i] ); + } + } else { + findInputs( elem ); + } } if ( elem.nodeType ) { @@ -5158,13 +6049,18 @@ jQuery.extend({ } if ( fragment ) { + checkScriptType = function( elem ) { + return !elem.type || rscriptType.test( elem.type ); + }; for ( i = 0; ret[i]; i++ ) { if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) { scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] ); - + } else { if ( ret[i].nodeType === 1 ) { - ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) ); + var jsTags = jQuery.grep( ret[i].getElementsByTagName( "script" ), checkScriptType ); + + ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) ); } fragment.appendChild( ret[i] ); } @@ -5173,40 +6069,45 @@ jQuery.extend({ return ret; }, - + cleanData: function( elems ) { - var data, id, cache = jQuery.cache, - special = jQuery.event.special, + var data, id, cache = jQuery.cache, internalKey = jQuery.expando, special = jQuery.event.special, deleteExpando = jQuery.support.deleteExpando; - + for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) { continue; } id = elem[ jQuery.expando ]; - + if ( id ) { - data = cache[ id ]; - + data = cache[ id ] && cache[ id ][ internalKey ]; + if ( data && data.events ) { for ( var type in data.events ) { if ( special[ type ] ) { jQuery.event.remove( elem, type ); + // This is a shortcut to avoid jQuery.event.remove's overhead } else { jQuery.removeEvent( elem, type, data.handle ); } } + + // Null the DOM reference to avoid IE6/7/8 leak (#7054) + if ( data.handle ) { + data.handle.elem = null; + } } - + if ( deleteExpando ) { delete elem[ jQuery.expando ]; } else if ( elem.removeAttribute ) { elem.removeAttribute( jQuery.expando ); } - + delete cache[ id ]; } } @@ -5235,9 +6136,12 @@ function evalScript( i, elem ) { var ralpha = /alpha\([^)]*\)/i, ropacity = /opacity=([^)]*)/, rdashAlpha = /-([a-z])/ig, - rupper = /([A-Z])/g, + // fixed for IE9, see #8346 + rupper = /([A-Z]|^ms)/g, rnumpx = /^-?\d+(?:px)?$/i, rnum = /^-?\d/, + rrelNum = /^[+\-]=/, + rrelNumFilter = /[^+\-\.\de]+/g, cssShow = { position: "absolute", visibility: "hidden", display: "block" }, cssWidth = [ "Left", "Right" ], @@ -5288,7 +6192,9 @@ jQuery.extend({ "fontWeight": true, "opacity": true, "zoom": true, - "lineHeight": true + "lineHeight": true, + "widows": true, + "orphans": true }, // Add in properties whose names you wish to fix before @@ -5306,20 +6212,27 @@ jQuery.extend({ } // Make sure that we're working with the right name - var ret, origName = jQuery.camelCase( name ), + var ret, type, origName = jQuery.camelCase( name ), style = elem.style, hooks = jQuery.cssHooks[ origName ]; name = jQuery.cssProps[ origName ] || origName; // Check if we're setting a value if ( value !== undefined ) { + type = typeof value; + // Make sure that NaN and null values aren't set. See: #7116 - if ( typeof value === "number" && isNaN( value ) || value == null ) { + if ( type === "number" && isNaN( value ) || value == null ) { return; } + // convert relative number strings (+= or -=) to relative numbers. #7345 + if ( type === "string" && rrelNum.test( value ) ) { + value = +value.replace( rrelNumFilter, "" ) + parseFloat( jQuery.css( elem, name ) ); + } + // If a number was passed in, add 'px' to the (except for certain CSS properties) - if ( typeof value === "number" && !jQuery.cssNumber[ origName ] ) { + if ( type === "number" && !jQuery.cssNumber[ origName ] ) { value += "px"; } @@ -5344,11 +6257,17 @@ jQuery.extend({ }, css: function( elem, name, extra ) { - // Make sure that we're working with the right name - var ret, origName = jQuery.camelCase( name ), - hooks = jQuery.cssHooks[ origName ]; + var ret, hooks; - name = jQuery.cssProps[ origName ] || origName; + // Make sure that we're working with the right name + name = jQuery.camelCase( name ); + hooks = jQuery.cssHooks[ name ]; + name = jQuery.cssProps[ name ] || name; + + // cssFloat needs a special treatment + if ( name === "cssFloat" ) { + name = "float"; + } // If a hook was provided get the computed value from there if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) { @@ -5356,7 +6275,7 @@ jQuery.extend({ // Otherwise, if a way to get the computed value exists, use that } else if ( curCSS ) { - return curCSS( elem, name, origName ); + return curCSS( elem, name ); } }, @@ -5447,33 +6366,56 @@ if ( !jQuery.support.opacity ) { jQuery.cssHooks.opacity = { get: function( elem, computed ) { // IE uses filters for opacity - return ropacity.test((computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "") ? - (parseFloat(RegExp.$1) / 100) + "" : + return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ? + ( parseFloat( RegExp.$1 ) / 100 ) + "" : computed ? "1" : ""; }, set: function( elem, value ) { - var style = elem.style; + var style = elem.style, + currentStyle = elem.currentStyle; // IE has trouble with opacity if it does not have layout // Force it by setting the zoom level style.zoom = 1; // Set the alpha filter to set the opacity - var opacity = jQuery.isNaN(value) ? + var opacity = jQuery.isNaN( value ) ? "" : "alpha(opacity=" + value * 100 + ")", - filter = style.filter || ""; + filter = currentStyle && currentStyle.filter || style.filter || ""; - style.filter = ralpha.test(filter) ? - filter.replace(ralpha, opacity) : - style.filter + ' ' + opacity; + style.filter = ralpha.test( filter ) ? + filter.replace( ralpha, opacity ) : + filter + " " + opacity; } }; } +jQuery(function() { + // This hook cannot be added until DOM ready because the support test + // for it is not run until after DOM ready + if ( !jQuery.support.reliableMarginRight ) { + jQuery.cssHooks.marginRight = { + get: function( elem, computed ) { + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right + // Work around by temporarily setting element display to inline-block + var ret; + jQuery.swap( elem, { "display": "inline-block" }, function() { + if ( computed ) { + ret = curCSS( elem, "margin-right", "marginRight" ); + } else { + ret = elem.style.marginRight; + } + }); + return ret; + } + }; + } +}); + if ( document.defaultView && document.defaultView.getComputedStyle ) { - getComputedStyle = function( elem, newName, name ) { + getComputedStyle = function( elem, name ) { var ret, defaultView, computedStyle; name = name.replace( rupper, "-$1" ).toLowerCase(); @@ -5495,8 +6437,9 @@ if ( document.defaultView && document.defaultView.getComputedStyle ) { if ( document.documentElement.currentStyle ) { currentStyle = function( elem, name ) { - var left, rsLeft, + var left, ret = elem.currentStyle && elem.currentStyle[ name ], + rsLeft = elem.runtimeStyle && elem.runtimeStyle[ name ], style = elem.style; // From the awesome hack by Dean Edwards @@ -5507,16 +6450,19 @@ if ( document.documentElement.currentStyle ) { if ( !rnumpx.test( ret ) && rnum.test( ret ) ) { // Remember the original values left = style.left; - rsLeft = elem.runtimeStyle.left; // Put in the new values to get a computed value out - elem.runtimeStyle.left = elem.currentStyle.left; + if ( rsLeft ) { + elem.runtimeStyle.left = elem.currentStyle.left; + } style.left = name === "fontSize" ? "1em" : (ret || 0); ret = style.pixelLeft + "px"; // Revert the changed values style.left = left; - elem.runtimeStyle.left = rsLeft; + if ( rsLeft ) { + elem.runtimeStyle.left = rsLeft; + } } return ret === "" ? "auto" : ret; @@ -5565,21 +6511,140 @@ if ( jQuery.expr && jQuery.expr.filters ) { -var jsc = jQuery.now(), +var r20 = /%20/g, + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rhash = /#.*$/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL + rinput = /^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i, + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + rquery = /\?/, rscript = /)<[^<]*)*<\/script>/gi, rselectTextarea = /^(?:select|textarea)/i, - rinput = /^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i, - rnoContent = /^(?:GET|HEAD)$/, - rbracket = /\[\]$/, - jsre = /\=\?(&|$)/, - rquery = /\?/, + rspacesAjax = /\s+/, rts = /([?&])_=[^&]*/, - rurl = /^(\w+:)?\/\/([^\/?#]+)/, - r20 = /%20/g, - rhash = /#.*$/, + rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/, // Keep a copy of the old load method - _load = jQuery.fn.load; + _load = jQuery.fn.load, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Document location + ajaxLocation, + + // Document location segments + ajaxLocParts; + +// #8138, IE may throw an exception when accessing +// a field from window.location if document.domain has been set +try { + ajaxLocation = location.href; +} catch( e ) { + // Use the href attribute of an A element + // since IE will modify it given document.location + ajaxLocation = document.createElement( "a" ); + ajaxLocation.href = ""; + ajaxLocation = ajaxLocation.href; +} + +// Segment location into parts +ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || []; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + if ( jQuery.isFunction( func ) ) { + var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ), + i = 0, + length = dataTypes.length, + dataType, + list, + placeBefore; + + // For each dataType in the dataTypeExpression + for(; i < length; i++ ) { + dataType = dataTypes[ i ]; + // We control if we're asked to add before + // any existing element + placeBefore = /^\+/.test( dataType ); + if ( placeBefore ) { + dataType = dataType.substr( 1 ) || "*"; + } + list = structure[ dataType ] = structure[ dataType ] || []; + // then we add to the structure accordingly + list[ placeBefore ? "unshift" : "push" ]( func ); + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR, + dataType /* internal */, inspected /* internal */ ) { + + dataType = dataType || options.dataTypes[ 0 ]; + inspected = inspected || {}; + + inspected[ dataType ] = true; + + var list = structure[ dataType ], + i = 0, + length = list ? list.length : 0, + executeOnly = ( structure === prefilters ), + selection; + + for(; i < length && ( executeOnly || !selection ); i++ ) { + selection = list[ i ]( options, originalOptions, jqXHR ); + // If we got redirected to another dataType + // we try there if executing only and not done already + if ( typeof selection === "string" ) { + if ( !executeOnly || inspected[ selection ] ) { + selection = undefined; + } else { + options.dataTypes.unshift( selection ); + selection = inspectPrefiltersOrTransports( + structure, options, originalOptions, jqXHR, selection, inspected ); + } + } + } + // If we're only executing or nothing was selected + // we try the catchall dataType if not done already + if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) { + selection = inspectPrefiltersOrTransports( + structure, options, originalOptions, jqXHR, "*", inspected ); + } + // unnecessary when only executing (prefilters) + // but it'll be ignored by the caller in that case + return selection; +} jQuery.fn.extend({ load: function( url, params, callback ) { @@ -5591,10 +6656,10 @@ jQuery.fn.extend({ return this; } - var off = url.indexOf(" "); + var off = url.indexOf( " " ); if ( off >= 0 ) { - var selector = url.slice(off, url.length); - url = url.slice(0, off); + var selector = url.slice( off, url.length ); + url = url.slice( 0, off ); } // Default to a GET request @@ -5606,7 +6671,7 @@ jQuery.fn.extend({ if ( jQuery.isFunction( params ) ) { // We assume that it's the callback callback = params; - params = null; + params = undefined; // Otherwise, build a param string } else if ( typeof params === "object" ) { @@ -5623,26 +6688,34 @@ jQuery.fn.extend({ type: type, dataType: "html", data: params, - complete: function( res, status ) { + // Complete callback (responseText is used internally) + complete: function( jqXHR, status, responseText ) { + // Store the response as specified by the jqXHR object + responseText = jqXHR.responseText; // If successful, inject the HTML into all the matched elements - if ( status === "success" || status === "notmodified" ) { + if ( jqXHR.isResolved() ) { + // #4825: Get the actual response in case + // a dataFilter is present in ajaxSettings + jqXHR.done(function( r ) { + responseText = r; + }); // See if a selector was specified self.html( selector ? // Create a dummy div to hold the results jQuery("
    ") // inject the contents of the document in, removing the scripts // to avoid any 'Permission Denied' errors in IE - .append(res.responseText.replace(rscript, "")) + .append(responseText.replace(rscript, "")) // Locate the specified elements .find(selector) : // If not, just inject the full result - res.responseText ); + responseText ); } if ( callback ) { - self.each( callback, [res.responseText, status, res] ); + self.each( callback, [ responseText, status, jqXHR ] ); } } }); @@ -5651,88 +6724,94 @@ jQuery.fn.extend({ }, serialize: function() { - return jQuery.param(this.serializeArray()); + return jQuery.param( this.serializeArray() ); }, serializeArray: function() { - return this.map(function() { - return this.elements ? jQuery.makeArray(this.elements) : this; + return this.map(function(){ + return this.elements ? jQuery.makeArray( this.elements ) : this; }) - .filter(function() { + .filter(function(){ return this.name && !this.disabled && - (this.checked || rselectTextarea.test(this.nodeName) || - rinput.test(this.type)); + ( this.checked || rselectTextarea.test( this.nodeName ) || + rinput.test( this.type ) ); }) - .map(function( i, elem ) { - var val = jQuery(this).val(); + .map(function( i, elem ){ + var val = jQuery( this ).val(); return val == null ? null : - jQuery.isArray(val) ? - jQuery.map( val, function( val, i ) { - return { name: elem.name, value: val }; + jQuery.isArray( val ) ? + jQuery.map( val, function( val, i ){ + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; }) : - { name: elem.name, value: val }; + { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; }).get(); } }); // Attach a bunch of functions for handling common AJAX events -jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), function( i, o ) { - jQuery.fn[o] = function( f ) { - return this.bind(o, f); +jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){ + jQuery.fn[ o ] = function( f ){ + return this.bind( o, f ); + }; +}); + +jQuery.each( [ "get", "post" ], function( i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + // shift arguments if data argument was omitted + if ( jQuery.isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + return jQuery.ajax({ + type: method, + url: url, + data: data, + success: callback, + dataType: type + }); }; }); jQuery.extend({ - get: function( url, data, callback, type ) { - // shift arguments if data argument was omited - if ( jQuery.isFunction( data ) ) { - type = type || callback; - callback = data; - data = null; - } - - return jQuery.ajax({ - type: "GET", - url: url, - data: data, - success: callback, - dataType: type - }); - }, getScript: function( url, callback ) { - return jQuery.get(url, null, callback, "script"); + return jQuery.get( url, undefined, callback, "script" ); }, getJSON: function( url, data, callback ) { - return jQuery.get(url, data, callback, "json"); + return jQuery.get( url, data, callback, "json" ); }, - post: function( url, data, callback, type ) { - // shift arguments if data argument was omited - if ( jQuery.isFunction( data ) ) { - type = type || callback; - callback = data; - data = {}; + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function ( target, settings ) { + if ( !settings ) { + // Only one parameter, we extend ajaxSettings + settings = target; + target = jQuery.extend( true, jQuery.ajaxSettings, settings ); + } else { + // target was provided, we extend into it + jQuery.extend( true, target, jQuery.ajaxSettings, settings ); } - - return jQuery.ajax({ - type: "POST", - url: url, - data: data, - success: callback, - dataType: type - }); - }, - - ajaxSetup: function( settings ) { - jQuery.extend( jQuery.ajaxSettings, settings ); + // Flatten fields we don't want deep extended + for( var field in { context: 1, url: 1 } ) { + if ( field in settings ) { + target[ field ] = settings[ field ]; + } else if( field in jQuery.ajaxSettings ) { + target[ field ] = jQuery.ajaxSettings[ field ]; + } + } + return target; }, ajaxSettings: { - url: location.href, + url: ajaxLocation, + isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ), global: true, type: "GET", contentType: "application/x-www-form-urlencoded", @@ -5741,332 +6820,434 @@ jQuery.extend({ /* timeout: 0, data: null, + dataType: null, username: null, password: null, + cache: null, traditional: false, + headers: {}, */ - // This function can be overriden by calling jQuery.ajaxSetup - xhr: function() { - return new window.XMLHttpRequest(); - }, + accepts: { xml: "application/xml, text/xml", html: "text/html", - script: "text/javascript, application/javascript", - json: "application/json, text/javascript", text: "text/plain", - _default: "*/*" + json: "application/json, text/javascript", + "*": "*/*" + }, + + contents: { + xml: /xml/, + html: /html/, + json: /json/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText" + }, + + // List of data converters + // 1) key format is "source_type destination_type" (a single space in-between) + // 2) the catchall symbol "*" can be used for source_type + converters: { + + // Convert anything to text + "* text": window.String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": jQuery.parseJSON, + + // Parse text as xml + "text xml": jQuery.parseXML } }, - ajax: function( origSettings ) { - var s = jQuery.extend(true, {}, jQuery.ajaxSettings, origSettings), - jsonp, status, data, type = s.type.toUpperCase(), noContent = rnoContent.test(type); + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), - s.url = s.url.replace( rhash, "" ); + // Main method + ajax: function( url, options ) { - // Use original (not extended) context object if it was provided - s.context = origSettings && origSettings.context != null ? origSettings.context : s; + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } - // convert data if not already a string + // Force options to be an object + options = options || {}; + + var // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + // Callbacks context + callbackContext = s.context || s, + // Context for global events + // It's the callbackContext if one was provided in the options + // and if it's a DOM node or a jQuery collection + globalEventContext = callbackContext !== s && + ( callbackContext.nodeType || callbackContext instanceof jQuery ) ? + jQuery( callbackContext ) : jQuery.event, + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery._Deferred(), + // Status-dependent callbacks + statusCode = s.statusCode || {}, + // ifModified key + ifModifiedKey, + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + // Response headers + responseHeadersString, + responseHeaders, + // transport + transport, + // timeout handle + timeoutTimer, + // Cross-domain detection vars + parts, + // The jqXHR state + state = 0, + // To know if global events are to be dispatched + fireGlobals, + // Loop variable + i, + // Fake xhr + jqXHR = { + + readyState: 0, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( !state ) { + var lname = name.toLowerCase(); + name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Raw string + getAllResponseHeaders: function() { + return state === 2 ? responseHeadersString : null; + }, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( state === 2 ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[1].toLowerCase() ] = match[ 2 ]; + } + } + match = responseHeaders[ key.toLowerCase() ]; + } + return match === undefined ? null : match; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( !state ) { + s.mimeType = type; + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + statusText = statusText || "abort"; + if ( transport ) { + transport.abort( statusText ); + } + done( 0, statusText ); + return this; + } + }; + + // Callback for when everything is done + // It is defined here because jslint complains if it is declared + // at the end of the function (which would be more logical and readable) + function done( status, statusText, responses, headers ) { + + // Called once + if ( state === 2 ) { + return; + } + + // State is "done" now + state = 2; + + // Clear timeout if it exists + if ( timeoutTimer ) { + clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status ? 4 : 0; + + var isSuccess, + success, + error, + response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined, + lastModified, + etag; + + // If successful, handle type chaining + if ( status >= 200 && status < 300 || status === 304 ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + + if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) { + jQuery.lastModified[ ifModifiedKey ] = lastModified; + } + if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) { + jQuery.etag[ ifModifiedKey ] = etag; + } + } + + // If not modified + if ( status === 304 ) { + + statusText = "notmodified"; + isSuccess = true; + + // If we have data + } else { + + try { + success = ajaxConvert( s, response ); + statusText = "success"; + isSuccess = true; + } catch(e) { + // We have a parsererror + statusText = "parsererror"; + error = e; + } + } + } else { + // We extract error from statusText + // then normalize statusText and status for non-aborts + error = statusText; + if( !statusText || status ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = statusText; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ), + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.resolveWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s] ); + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + // Attach deferreds + deferred.promise( jqXHR ); + jqXHR.success = jqXHR.done; + jqXHR.error = jqXHR.fail; + jqXHR.complete = completeDeferred.done; + + // Status-dependent callbacks + jqXHR.statusCode = function( map ) { + if ( map ) { + var tmp; + if ( state < 2 ) { + for( tmp in map ) { + statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ]; + } + } else { + tmp = map[ jqXHR.status ]; + jqXHR.then( tmp, tmp ); + } + } + return this; + }; + + // Remove hash character (#7531: and string promotion) + // Add protocol if not provided (#5866: IE7 issue with protocol-less urls) + // We also use the url parameter if available + s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" ); + + // Extract dataTypes list + s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax ); + + // Determine if a cross-domain request is in order + if ( s.crossDomain == null ) { + parts = rurl.exec( s.url.toLowerCase() ); + s.crossDomain = !!( parts && + ( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] || + ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) != + ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) ) + ); + } + + // Convert data if not already a string if ( s.data && s.processData && typeof s.data !== "string" ) { s.data = jQuery.param( s.data, s.traditional ); } - // Handle JSONP Parameter Callbacks - if ( s.dataType === "jsonp" ) { - if ( type === "GET" ) { - if ( !jsre.test( s.url ) ) { - s.url += (rquery.test( s.url ) ? "&" : "?") + (s.jsonp || "callback") + "=?"; - } - } else if ( !s.data || !jsre.test(s.data) ) { - s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?"; - } - s.dataType = "json"; - } + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); - // Build temporary JSONP function - if ( s.dataType === "json" && (s.data && jsre.test(s.data) || jsre.test(s.url)) ) { - jsonp = s.jsonpCallback || ("jsonp" + jsc++); - - // Replace the =? sequence both in the query string and the data - if ( s.data ) { - s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1"); - } - - s.url = s.url.replace(jsre, "=" + jsonp + "$1"); - - // We need to make sure - // that a JSONP style response is executed properly - s.dataType = "script"; - - // Handle JSONP-style loading - var customJsonp = window[ jsonp ]; - - window[ jsonp ] = function( tmp ) { - if ( jQuery.isFunction( customJsonp ) ) { - customJsonp( tmp ); - - } else { - // Garbage collect - window[ jsonp ] = undefined; - - try { - delete window[ jsonp ]; - } catch( jsonpError ) {} - } - - data = tmp; - jQuery.handleSuccess( s, xhr, status, data ); - jQuery.handleComplete( s, xhr, status, data ); - - if ( head ) { - head.removeChild( script ); - } - }; - } - - if ( s.dataType === "script" && s.cache === null ) { - s.cache = false; - } - - if ( s.cache === false && noContent ) { - var ts = jQuery.now(); - - // try replacing _= if it is there - var ret = s.url.replace(rts, "$1_=" + ts); - - // if nothing was replaced, add timestamp to the end - s.url = ret + ((ret === s.url) ? (rquery.test(s.url) ? "&" : "?") + "_=" + ts : ""); - } - - // If data is available, append data to url for GET/HEAD requests - if ( s.data && noContent ) { - s.url += (rquery.test(s.url) ? "&" : "?") + s.data; - } - - // Watch for a new set of requests - if ( s.global && jQuery.active++ === 0 ) { - jQuery.event.trigger( "ajaxStart" ); - } - - // Matches an absolute URL, and saves the domain - var parts = rurl.exec( s.url ), - remote = parts && (parts[1] && parts[1].toLowerCase() !== location.protocol || parts[2].toLowerCase() !== location.host); - - // If we're requesting a remote document - // and trying to load JSON or Script with a GET - if ( s.dataType === "script" && type === "GET" && remote ) { - var head = document.getElementsByTagName("head")[0] || document.documentElement; - var script = document.createElement("script"); - if ( s.scriptCharset ) { - script.charset = s.scriptCharset; - } - script.src = s.url; - - // Handle Script loading - if ( !jsonp ) { - var done = false; - - // Attach handlers for all browsers - script.onload = script.onreadystatechange = function() { - if ( !done && (!this.readyState || - this.readyState === "loaded" || this.readyState === "complete") ) { - done = true; - jQuery.handleSuccess( s, xhr, status, data ); - jQuery.handleComplete( s, xhr, status, data ); - - // Handle memory leak in IE - script.onload = script.onreadystatechange = null; - if ( head && script.parentNode ) { - head.removeChild( script ); - } - } - }; - } - - // Use insertBefore instead of appendChild to circumvent an IE6 bug. - // This arises when a base node is used (#2709 and #4378). - head.insertBefore( script, head.firstChild ); - - // We handle everything using the script element injection - return undefined; - } - - var requestDone = false; - - // Create the request object - var xhr = s.xhr(); - - if ( !xhr ) { - return; - } - - // Open the socket - // Passing null username, generates a login popup on Opera (#2865) - if ( s.username ) { - xhr.open(type, s.url, s.async, s.username, s.password); - } else { - xhr.open(type, s.url, s.async); - } - - // Need an extra try/catch for cross domain requests in Firefox 3 - try { - // Set content-type if data specified and content-body is valid for this type - if ( (s.data != null && !noContent) || (origSettings && origSettings.contentType) ) { - xhr.setRequestHeader("Content-Type", s.contentType); - } - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - if ( jQuery.lastModified[s.url] ) { - xhr.setRequestHeader("If-Modified-Since", jQuery.lastModified[s.url]); - } - - if ( jQuery.etag[s.url] ) { - xhr.setRequestHeader("If-None-Match", jQuery.etag[s.url]); - } - } - - // Set header so the called script knows that it's an XMLHttpRequest - // Only send the header if it's not a remote XHR - if ( !remote ) { - xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); - } - - // Set the Accepts header for the server, depending on the dataType - xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ? - s.accepts[ s.dataType ] + ", */*; q=0.01" : - s.accepts._default ); - } catch( headerError ) {} - - // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && s.beforeSend.call(s.context, xhr, s) === false ) { - // Handle the global AJAX counter - if ( s.global && jQuery.active-- === 1 ) { - jQuery.event.trigger( "ajaxStop" ); - } - - // close opended socket - xhr.abort(); + // If request was aborted inside a prefiler, stop there + if ( state === 2 ) { return false; } - if ( s.global ) { - jQuery.triggerGlobal( s, "ajaxSend", [xhr, s] ); + // We can fire global events as of now if asked to + fireGlobals = s.global; + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); } - // Wait for a response to come back - var onreadystatechange = xhr.onreadystatechange = function( isTimeout ) { - // The request was aborted - if ( !xhr || xhr.readyState === 0 || isTimeout === "abort" ) { - // Opera doesn't call onreadystatechange before this point - // so we simulate the call - if ( !requestDone ) { - jQuery.handleComplete( s, xhr, status, data ); - } + // More options handling for requests with no content + if ( !s.hasContent ) { - requestDone = true; - if ( xhr ) { - xhr.onreadystatechange = jQuery.noop; - } + // If data is available, append data to url + if ( s.data ) { + s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data; + } - // The transfer is complete and the data is available, or the request timed out - } else if ( !requestDone && xhr && (xhr.readyState === 4 || isTimeout === "timeout") ) { - requestDone = true; - xhr.onreadystatechange = jQuery.noop; + // Get ifModifiedKey before adding the anti-cache parameter + ifModifiedKey = s.url; - status = isTimeout === "timeout" ? - "timeout" : - !jQuery.httpSuccess( xhr ) ? - "error" : - s.ifModified && jQuery.httpNotModified( xhr, s.url ) ? - "notmodified" : - "success"; + // Add anti-cache in url if needed + if ( s.cache === false ) { - var errMsg; + var ts = jQuery.now(), + // try replacing _= if it is there + ret = s.url.replace( rts, "$1_=" + ts ); - if ( status === "success" ) { - // Watch for, and catch, XML document parse errors - try { - // process the data (runs the xml through httpData regardless of callback) - data = jQuery.httpData( xhr, s.dataType, s ); - } catch( parserError ) { - status = "parsererror"; - errMsg = parserError; - } - } + // if nothing was replaced, add timestamp to the end + s.url = ret + ( (ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" ); + } + } - // Make sure that the request was successful or notmodified - if ( status === "success" || status === "notmodified" ) { - // JSONP handles its own success callback - if ( !jsonp ) { - jQuery.handleSuccess( s, xhr, status, data ); - } + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + ifModifiedKey = ifModifiedKey || s.url; + if ( jQuery.lastModified[ ifModifiedKey ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] ); + } + if ( jQuery.etag[ ifModifiedKey ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] ); + } + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ? + s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", */*; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) { + // Abort if not done already + jqXHR.abort(); + return false; + + } + + // Install callbacks on deferreds + for ( i in { success: 1, error: 1, complete: 1 } ) { + jqXHR[ i ]( s[ i ] ); + } + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = setTimeout( function(){ + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + state = 1; + transport.send( requestHeaders, done ); + } catch (e) { + // Propagate exception as error if not done + if ( status < 2 ) { + done( -1, e ); + // Simply rethrow otherwise } else { - jQuery.handleError( s, xhr, status, errMsg ); - } - - // Fire the complete handlers - if ( !jsonp ) { - jQuery.handleComplete( s, xhr, status, data ); - } - - if ( isTimeout === "timeout" ) { - xhr.abort(); - } - - // Stop memory leaks - if ( s.async ) { - xhr = null; + jQuery.error( e ); } } - }; - - // Override the abort handler, if we can (IE 6 doesn't allow it, but that's OK) - // Opera doesn't fire onreadystatechange at all on abort - try { - var oldAbort = xhr.abort; - xhr.abort = function() { - if ( xhr ) { - // oldAbort has no call property in IE7 so - // just do it this way, which works in all - // browsers - Function.prototype.call.call( oldAbort, xhr ); - } - - onreadystatechange( "abort" ); - }; - } catch( abortError ) {} - - // Timeout checker - if ( s.async && s.timeout > 0 ) { - setTimeout(function() { - // Check to see if the request is still happening - if ( xhr && !requestDone ) { - onreadystatechange( "timeout" ); - } - }, s.timeout); } - // Send the data - try { - xhr.send( noContent || s.data == null ? null : s.data ); - - } catch( sendError ) { - jQuery.handleError( s, xhr, null, sendError ); - - // Fire the complete handlers - jQuery.handleComplete( s, xhr, status, data ); - } - - // firefox 1.5 doesn't fire statechange for sync requests - if ( !s.async ) { - onreadystatechange(); - } - - // return XMLHttpRequest to allow aborting the request etc. - return xhr; + return jqXHR; }, // Serialize an array of form elements or a set of @@ -6075,37 +7256,37 @@ jQuery.extend({ var s = [], add = function( key, value ) { // If value is a function, invoke it and return its value - value = jQuery.isFunction(value) ? value() : value; - s[ s.length ] = encodeURIComponent(key) + "=" + encodeURIComponent(value); + value = jQuery.isFunction( value ) ? value() : value; + s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value ); }; - + // Set traditional to true for jQuery <= 1.3.2 behavior. if ( traditional === undefined ) { traditional = jQuery.ajaxSettings.traditional; } - + // If an array was passed in, assume that it is an array of form elements. - if ( jQuery.isArray(a) || a.jquery ) { + if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { // Serialize the form elements jQuery.each( a, function() { add( this.name, this.value ); }); - + } else { // If traditional, encode the "old" way (the way 1.3.2 or older // did it), otherwise encode params recursively. for ( var prefix in a ) { - buildParams( prefix, a[prefix], traditional, add ); + buildParams( prefix, a[ prefix ], traditional, add ); } } // Return the resulting serialization - return s.join("&").replace(r20, "+"); + return s.join( "&" ).replace( r20, "+" ); } }); function buildParams( prefix, obj, traditional, add ) { - if ( jQuery.isArray(obj) && obj.length ) { + if ( jQuery.isArray( obj ) ) { // Serialize array item. jQuery.each( obj, function( i, v ) { if ( traditional || rbracket.test( prefix ) ) { @@ -6123,18 +7304,13 @@ function buildParams( prefix, obj, traditional, add ) { buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add ); } }); - - } else if ( !traditional && obj != null && typeof obj === "object" ) { - if ( jQuery.isEmptyObject( obj ) ) { - add( prefix, "" ); + } else if ( !traditional && obj != null && typeof obj === "object" ) { // Serialize object item. - } else { - jQuery.each( obj, function( k, v ) { - buildParams( prefix + "[" + k + "]", v, traditional, add ); - }); + for ( var name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); } - + } else { // Serialize scalar item. add( prefix, obj ); @@ -6150,143 +7326,557 @@ jQuery.extend({ // Last-Modified header cache for next request lastModified: {}, - etag: {}, - - handleError: function( s, xhr, status, e ) { - // If a local callback was specified, fire it - if ( s.error ) { - s.error.call( s.context, xhr, status, e ); - } - - // Fire the global callback - if ( s.global ) { - jQuery.triggerGlobal( s, "ajaxError", [xhr, s, e] ); - } - }, - - handleSuccess: function( s, xhr, status, data ) { - // If a local callback was specified, fire it and pass it the data - if ( s.success ) { - s.success.call( s.context, data, status, xhr ); - } - - // Fire the global callback - if ( s.global ) { - jQuery.triggerGlobal( s, "ajaxSuccess", [xhr, s] ); - } - }, - - handleComplete: function( s, xhr, status ) { - // Process result - if ( s.complete ) { - s.complete.call( s.context, xhr, status ); - } - - // The request was completed - if ( s.global ) { - jQuery.triggerGlobal( s, "ajaxComplete", [xhr, s] ); - } - - // Handle the global AJAX counter - if ( s.global && jQuery.active-- === 1 ) { - jQuery.event.trigger( "ajaxStop" ); - } - }, - - triggerGlobal: function( s, type, args ) { - (s.context && s.context.url == null ? jQuery(s.context) : jQuery.event).trigger(type, args); - }, - - // Determines if an XMLHttpRequest was successful or not - httpSuccess: function( xhr ) { - try { - // IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450 - return !xhr.status && location.protocol === "file:" || - xhr.status >= 200 && xhr.status < 300 || - xhr.status === 304 || xhr.status === 1223; - } catch(e) {} - - return false; - }, - - // Determines if an XMLHttpRequest returns NotModified - httpNotModified: function( xhr, url ) { - var lastModified = xhr.getResponseHeader("Last-Modified"), - etag = xhr.getResponseHeader("Etag"); - - if ( lastModified ) { - jQuery.lastModified[url] = lastModified; - } - - if ( etag ) { - jQuery.etag[url] = etag; - } - - return xhr.status === 304; - }, - - httpData: function( xhr, type, s ) { - var ct = xhr.getResponseHeader("content-type") || "", - xml = type === "xml" || !type && ct.indexOf("xml") >= 0, - data = xml ? xhr.responseXML : xhr.responseText; - - if ( xml && data.documentElement.nodeName === "parsererror" ) { - jQuery.error( "parsererror" ); - } - - // Allow a pre-filtering function to sanitize the response - // s is checked to keep backwards compatibility - if ( s && s.dataFilter ) { - data = s.dataFilter( data, type ); - } - - // The filter can actually parse the response - if ( typeof data === "string" ) { - // Get the JavaScript object, if JSON is used. - if ( type === "json" || !type && ct.indexOf("json") >= 0 ) { - data = jQuery.parseJSON( data ); - - // If the type is "script", eval it in global context - } else if ( type === "script" || !type && ct.indexOf("javascript") >= 0 ) { - jQuery.globalEval( data ); - } - } - - return data; - } + etag: {} }); -/* - * Create the request object; Microsoft failed to properly - * implement the XMLHttpRequest in IE7 (can't request local files), - * so we use the ActiveXObject when it is available - * Additionally XMLHttpRequest can be disabled in IE7/IE8 so - * we need a fallback. +/* Handles responses to an ajax request: + * - sets all responseXXX fields accordingly + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response */ -if ( window.ActiveXObject ) { - jQuery.ajaxSettings.xhr = function() { - if ( window.location.protocol !== "file:" ) { - try { - return new window.XMLHttpRequest(); - } catch(xhrError) {} - } +function ajaxHandleResponses( s, jqXHR, responses ) { - try { - return new window.ActiveXObject("Microsoft.XMLHTTP"); - } catch(activeError) {} - }; + var contents = s.contents, + dataTypes = s.dataTypes, + responseFields = s.responseFields, + ct, + type, + finalDataType, + firstDataType; + + // Fill responseXXX fields + for( type in responseFields ) { + if ( type in responses ) { + jqXHR[ responseFields[type] ] = responses[ type ]; + } + } + + // Remove auto dataType and get content-type in the process + while( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "content-type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } } -// Does this browser support XHR requests? -jQuery.support.ajax = !!jQuery.ajaxSettings.xhr(); +// Chain conversions given the request and the original response +function ajaxConvert( s, response ) { + + // Apply the dataFilter if provided + if ( s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + var dataTypes = s.dataTypes, + converters = {}, + i, + key, + length = dataTypes.length, + tmp, + // Current and previous dataTypes + current = dataTypes[ 0 ], + prev, + // Conversion expression + conversion, + // Conversion function + conv, + // Conversion functions (transitive conversion) + conv1, + conv2; + + // For each dataType in the chain + for( i = 1; i < length; i++ ) { + + // Create converters map + // with lowercased keys + if ( i === 1 ) { + for( key in s.converters ) { + if( typeof key === "string" ) { + converters[ key.toLowerCase() ] = s.converters[ key ]; + } + } + } + + // Get the dataTypes + prev = current; + current = dataTypes[ i ]; + + // If current is auto dataType, update it to prev + if( current === "*" ) { + current = prev; + // If no auto and dataTypes are actually different + } else if ( prev !== "*" && prev !== current ) { + + // Get the converter + conversion = prev + " " + current; + conv = converters[ conversion ] || converters[ "* " + current ]; + + // If there is no direct converter, search transitively + if ( !conv ) { + conv2 = undefined; + for( conv1 in converters ) { + tmp = conv1.split( " " ); + if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) { + conv2 = converters[ tmp[1] + " " + current ]; + if ( conv2 ) { + conv1 = converters[ conv1 ]; + if ( conv1 === true ) { + conv = conv2; + } else if ( conv2 === true ) { + conv = conv1; + } + break; + } + } + } + } + // If we found no converter, dispatch an error + if ( !( conv || conv2 ) ) { + jQuery.error( "No conversion from " + conversion.replace(" "," to ") ); + } + // If found converter is not an equivalence + if ( conv !== true ) { + // Convert with 1 or 2 converters accordingly + response = conv ? conv( response ) : conv2( conv1(response) ); + } + } + } + return response; +} + + + + +var jsc = jQuery.now(), + jsre = /(\=)\?(&|$)|\?\?/i; + +// Default jsonp settings +jQuery.ajaxSetup({ + jsonp: "callback", + jsonpCallback: function() { + return jQuery.expando + "_" + ( jsc++ ); + } +}); + +// Detect, normalize options and install callbacks for jsonp requests +jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { + + var inspectData = s.contentType === "application/x-www-form-urlencoded" && + ( typeof s.data === "string" ); + + if ( s.dataTypes[ 0 ] === "jsonp" || + s.jsonp !== false && ( jsre.test( s.url ) || + inspectData && jsre.test( s.data ) ) ) { + + var responseContainer, + jsonpCallback = s.jsonpCallback = + jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback, + previous = window[ jsonpCallback ], + url = s.url, + data = s.data, + replace = "$1" + jsonpCallback + "$2"; + + if ( s.jsonp !== false ) { + url = url.replace( jsre, replace ); + if ( s.url === url ) { + if ( inspectData ) { + data = data.replace( jsre, replace ); + } + if ( s.data === data ) { + // Add callback manually + url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback; + } + } + } + + s.url = url; + s.data = data; + + // Install callback + window[ jsonpCallback ] = function( response ) { + responseContainer = [ response ]; + }; + + // Clean-up function + jqXHR.always(function() { + // Set callback back to previous value + window[ jsonpCallback ] = previous; + // Call if it was a function and we have a response + if ( responseContainer && jQuery.isFunction( previous ) ) { + window[ jsonpCallback ]( responseContainer[ 0 ] ); + } + }); + + // Use data converter to retrieve json after script execution + s.converters["script json"] = function() { + if ( !responseContainer ) { + jQuery.error( jsonpCallback + " was not called" ); + } + return responseContainer[ 0 ]; + }; + + // force json dataType + s.dataTypes[ 0 ] = "json"; + + // Delegate to script + return "script"; + } +}); + + + + +// Install script dataType +jQuery.ajaxSetup({ + accepts: { + script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /javascript|ecmascript/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +}); + +// Handle cache's special case and global +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + s.global = false; + } +}); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function(s) { + + // This transport only deals with cross domain requests + if ( s.crossDomain ) { + + var script, + head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement; + + return { + + send: function( _, callback ) { + + script = document.createElement( "script" ); + + script.async = "async"; + + if ( s.scriptCharset ) { + script.charset = s.scriptCharset; + } + + script.src = s.url; + + // Attach handlers for all browsers + script.onload = script.onreadystatechange = function( _, isAbort ) { + + if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) { + + // Handle memory leak in IE + script.onload = script.onreadystatechange = null; + + // Remove the script + if ( head && script.parentNode ) { + head.removeChild( script ); + } + + // Dereference the script + script = undefined; + + // Callback if not abort + if ( !isAbort ) { + callback( 200, "success" ); + } + } + }; + // Use insertBefore instead of appendChild to circumvent an IE6 bug. + // This arises when a base node is used (#2709 and #4378). + head.insertBefore( script, head.firstChild ); + }, + + abort: function() { + if ( script ) { + script.onload( 0, 1 ); + } + } + }; + } +}); + + + + +var // #5280: Internet Explorer will keep connections alive if we don't abort on unload + xhrOnUnloadAbort = window.ActiveXObject ? function() { + // Abort all pending requests + for ( var key in xhrCallbacks ) { + xhrCallbacks[ key ]( 0, 1 ); + } + } : false, + xhrId = 0, + xhrCallbacks; + +// Functions to create xhrs +function createStandardXHR() { + try { + return new window.XMLHttpRequest(); + } catch( e ) {} +} + +function createActiveXHR() { + try { + return new window.ActiveXObject( "Microsoft.XMLHTTP" ); + } catch( e ) {} +} + +// Create the request object +// (This is still attached to ajaxSettings for backward compatibility) +jQuery.ajaxSettings.xhr = window.ActiveXObject ? + /* Microsoft failed to properly + * implement the XMLHttpRequest in IE7 (can't request local files), + * so we use the ActiveXObject when it is available + * Additionally XMLHttpRequest can be disabled in IE7/IE8 so + * we need a fallback. + */ + function() { + return !this.isLocal && createStandardXHR() || createActiveXHR(); + } : + // For all other browsers, use the standard XMLHttpRequest object + createStandardXHR; + +// Determine support properties +(function( xhr ) { + jQuery.extend( jQuery.support, { + ajax: !!xhr, + cors: !!xhr && ( "withCredentials" in xhr ) + }); +})( jQuery.ajaxSettings.xhr() ); + +// Create transport if the browser can provide an xhr +if ( jQuery.support.ajax ) { + + jQuery.ajaxTransport(function( s ) { + // Cross domain only allowed if supported through XMLHttpRequest + if ( !s.crossDomain || jQuery.support.cors ) { + + var callback; + + return { + send: function( headers, complete ) { + + // Get a new xhr + var xhr = s.xhr(), + handle, + i; + + // Open the socket + // Passing null username, generates a login popup on Opera (#2865) + if ( s.username ) { + xhr.open( s.type, s.url, s.async, s.username, s.password ); + } else { + xhr.open( s.type, s.url, s.async ); + } + + // Apply custom fields if provided + if ( s.xhrFields ) { + for ( i in s.xhrFields ) { + xhr[ i ] = s.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( s.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( s.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !s.crossDomain && !headers["X-Requested-With"] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Need an extra try/catch for cross domain requests in Firefox 3 + try { + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + } catch( _ ) {} + + // Do send the request + // This may raise an exception which is actually + // handled in jQuery.ajax (so no try/catch here) + xhr.send( ( s.hasContent && s.data ) || null ); + + // Listener + callback = function( _, isAbort ) { + + var status, + statusText, + responseHeaders, + responses, + xml; + + // Firefox throws exceptions when accessing properties + // of an xhr when a network error occured + // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE) + try { + + // Was never called and is aborted or complete + if ( callback && ( isAbort || xhr.readyState === 4 ) ) { + + // Only called once + callback = undefined; + + // Do not keep as active anymore + if ( handle ) { + xhr.onreadystatechange = jQuery.noop; + if ( xhrOnUnloadAbort ) { + delete xhrCallbacks[ handle ]; + } + } + + // If it's an abort + if ( isAbort ) { + // Abort it manually if needed + if ( xhr.readyState !== 4 ) { + xhr.abort(); + } + } else { + status = xhr.status; + responseHeaders = xhr.getAllResponseHeaders(); + responses = {}; + xml = xhr.responseXML; + + // Construct response list + if ( xml && xml.documentElement /* #4958 */ ) { + responses.xml = xml; + } + responses.text = xhr.responseText; + + // Firefox throws an exception when accessing + // statusText for faulty cross-domain requests + try { + statusText = xhr.statusText; + } catch( e ) { + // We normalize with Webkit giving an empty statusText + statusText = ""; + } + + // Filter status for non standard behaviors + + // If the request is local and we have data: assume a success + // (success with no data won't get notified, that's the best we + // can do given current implementations) + if ( !status && s.isLocal && !s.crossDomain ) { + status = responses.text ? 200 : 404; + // IE - #1450: sometimes returns 1223 when it should be 204 + } else if ( status === 1223 ) { + status = 204; + } + } + } + } catch( firefoxAccessException ) { + if ( !isAbort ) { + complete( -1, firefoxAccessException ); + } + } + + // Call complete if needed + if ( responses ) { + complete( status, statusText, responses, responseHeaders ); + } + }; + + // if we're in sync mode or it's in cache + // and has been retrieved directly (IE6 & IE7) + // we need to manually fire the callback + if ( !s.async || xhr.readyState === 4 ) { + callback(); + } else { + handle = ++xhrId; + if ( xhrOnUnloadAbort ) { + // Create the active xhrs callbacks list if needed + // and attach the unload handler + if ( !xhrCallbacks ) { + xhrCallbacks = {}; + jQuery( window ).unload( xhrOnUnloadAbort ); + } + // Add to list of active xhrs callbacks + xhrCallbacks[ handle ] = callback; + } + xhr.onreadystatechange = callback; + } + }, + + abort: function() { + if ( callback ) { + callback(0,1); + } + } + }; + } + }); +} var elemdisplay = {}, + iframe, iframeDoc, rfxtypes = /^(?:toggle|show|hide)$/, - rfxnum = /^([+\-]=)?([\d+.\-]+)(.*)$/, + rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i, timerId, fxAttrs = [ // height animations @@ -6295,7 +7885,11 @@ var elemdisplay = {}, [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ], // opacity animations [ "opacity" ] - ]; + ], + fxNow, + requestAnimationFrame = window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame; jQuery.fn.extend({ show: function( speed, easing, callback ) { @@ -6307,19 +7901,22 @@ jQuery.fn.extend({ } else { for ( var i = 0, j = this.length; i < j; i++ ) { elem = this[i]; - display = elem.style.display; - // Reset the inline display of this element to learn if it is - // being hidden by cascaded rules or not - if ( !jQuery.data(elem, "olddisplay") && display === "none" ) { - display = elem.style.display = ""; - } + if ( elem.style ) { + display = elem.style.display; - // Set elements which have been overridden with display: none - // in a stylesheet to whatever the default browser style is - // for such an element - if ( display === "" && jQuery.css( elem, "display" ) === "none" ) { - jQuery.data(elem, "olddisplay", defaultDisplay(elem.nodeName)); + // Reset the inline display of this element to learn if it is + // being hidden by cascaded rules or not + if ( !jQuery._data(elem, "olddisplay") && display === "none" ) { + display = elem.style.display = ""; + } + + // Set elements which have been overridden with display: none + // in a stylesheet to whatever the default browser style is + // for such an element + if ( display === "" && jQuery.css( elem, "display" ) === "none" ) { + jQuery._data(elem, "olddisplay", defaultDisplay(elem.nodeName)); + } } } @@ -6327,10 +7924,13 @@ jQuery.fn.extend({ // to avoid the constant reflow for ( i = 0; i < j; i++ ) { elem = this[i]; - display = elem.style.display; - if ( display === "" || display === "none" ) { - elem.style.display = jQuery.data(elem, "olddisplay") || ""; + if ( elem.style ) { + display = elem.style.display; + + if ( display === "" || display === "none" ) { + elem.style.display = jQuery._data(elem, "olddisplay") || ""; + } } } @@ -6344,17 +7944,21 @@ jQuery.fn.extend({ } else { for ( var i = 0, j = this.length; i < j; i++ ) { - var display = jQuery.css( this[i], "display" ); + if ( this[i].style ) { + var display = jQuery.css( this[i], "display" ); - if ( display !== "none" ) { - jQuery.data( this[i], "olddisplay", display ); + if ( display !== "none" && !jQuery._data( this[i], "olddisplay" ) ) { + jQuery._data( this[i], "olddisplay", display ); + } } } // Set the display of the elements in a second loop // to avoid the constant reflow for ( i = 0; i < j; i++ ) { - this[i].style.display = "none"; + if ( this[i].style ) { + this[i].style.display = "none"; + } } return this; @@ -6392,32 +7996,43 @@ jQuery.fn.extend({ var optall = jQuery.speed(speed, easing, callback); if ( jQuery.isEmptyObject( prop ) ) { - return this.each( optall.complete ); + return this.each( optall.complete, [ false ] ); } return this[ optall.queue === false ? "each" : "queue" ](function() { // XXX 'this' does not always have a nodeName when running the // test suite - var opt = jQuery.extend({}, optall), p, + if ( optall.queue === false ) { + jQuery._mark( this ); + } + + var opt = jQuery.extend({}, optall), isElement = this.nodeType === 1, hidden = isElement && jQuery(this).is(":hidden"), - self = this; + name, val, p, + display, e, + parts, start, end, unit; + + // will store per property easing and be used to determine when an animation is complete + opt.animatedProperties = {}; for ( p in prop ) { - var name = jQuery.camelCase( p ); + // property name normalization + name = jQuery.camelCase( p ); if ( p !== name ) { prop[ name ] = prop[ p ]; delete prop[ p ]; - p = name; } - if ( prop[p] === "hide" && hidden || prop[p] === "show" && !hidden ) { + val = prop[name]; + + if ( val === "hide" && hidden || val === "show" && !hidden ) { return opt.complete.call(this); } - if ( isElement && ( p === "height" || p === "width" ) ) { + if ( isElement && ( name === "height" || name === "width" ) ) { // Make sure that nothing sneaks out // Record all 3 overflow attributes because IE does not // change the overflow attribute when overflowX and @@ -6433,7 +8048,7 @@ jQuery.fn.extend({ this.style.display = "inline-block"; } else { - var display = defaultDisplay(this.nodeName); + display = defaultDisplay(this.nodeName); // inline-level elements accept inline-block; // block-level elements need to be inline with layout @@ -6448,38 +8063,37 @@ jQuery.fn.extend({ } } - if ( jQuery.isArray( prop[p] ) ) { - // Create (if needed) and add to specialEasing - (opt.specialEasing = opt.specialEasing || {})[p] = prop[p][1]; - prop[p] = prop[p][0]; - } + // easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default) + opt.animatedProperties[name] = jQuery.isArray( val ) ? + val[1]: + opt.specialEasing && opt.specialEasing[name] || opt.easing || 'swing'; } if ( opt.overflow != null ) { this.style.overflow = "hidden"; } - opt.curAnim = jQuery.extend({}, prop); + for ( p in prop ) { + e = new jQuery.fx( this, opt, p ); - jQuery.each( prop, function( name, val ) { - var e = new jQuery.fx( self, opt, name ); + val = prop[p]; if ( rfxtypes.test(val) ) { - e[ val === "toggle" ? hidden ? "show" : "hide" : val ]( prop ); + e[ val === "toggle" ? hidden ? "show" : "hide" : val ](); } else { - var parts = rfxnum.exec(val), - start = e.cur() || 0; + parts = rfxnum.exec(val); + start = e.cur(); if ( parts ) { - var end = parseFloat( parts[2] ), - unit = parts[3] || "px"; + end = parseFloat( parts[2] ); + unit = parts[3] || ( jQuery.cssNumber[ name ] ? "" : "px" ); // We need to compute starting value if ( unit !== "px" ) { - jQuery.style( self, name, (end || 1) + unit); + jQuery.style( this, p, (end || 1) + unit); start = ((end || 1) / e.cur()) * start; - jQuery.style( self, name, start + unit); + jQuery.style( this, p, start + unit); } // If a +=/-= token was provided, we're doing a relative animation @@ -6493,7 +8107,7 @@ jQuery.fn.extend({ e.custom( start, val, "" ); } } - }); + } // For JS strict compliance return true; @@ -6501,15 +8115,19 @@ jQuery.fn.extend({ }, stop: function( clearQueue, gotoEnd ) { - var timers = jQuery.timers; - if ( clearQueue ) { this.queue([]); } this.each(function() { + var timers = jQuery.timers, + i = timers.length; + // clear marker counters if we know they won't be + if ( !gotoEnd ) { + jQuery._unmark( true, this ); + } // go in reverse order so anything added to the queue during the loop is ignored - for ( var i = timers.length - 1; i >= 0; i-- ) { + while ( i-- ) { if ( timers[i].elem === this ) { if (gotoEnd) { // force the next step to be the last @@ -6531,6 +8149,17 @@ jQuery.fn.extend({ }); +// Animations created synchronously will run synchronously +function createFxNow() { + setTimeout( clearFxNow, 0 ); + return ( fxNow = jQuery.now() ); +} + +function clearFxNow() { + fxNow = undefined; +} + +// Generate parameters to create a standard animation function genFx( type, num ) { var obj = {}; @@ -6569,10 +8198,13 @@ jQuery.extend({ // Queueing opt.old = opt.complete; - opt.complete = function() { + opt.complete = function( noUnmark ) { if ( opt.queue !== false ) { - jQuery(this).dequeue(); + jQuery.dequeue( this ); + } else if ( noUnmark !== false ) { + jQuery._unmark( this ); } + if ( jQuery.isFunction( opt.old ) ) { opt.old.call( this ); } @@ -6597,9 +8229,7 @@ jQuery.extend({ this.elem = elem; this.prop = prop; - if ( !options.orig ) { - options.orig = {}; - } + options.orig = options.orig || {}; } }); @@ -6620,19 +8250,24 @@ jQuery.fx.prototype = { return this.elem[ this.prop ]; } - var r = parseFloat( jQuery.css( this.elem, this.prop ) ); - return r && r > -10000 ? r : 0; + var parsed, + r = jQuery.css( this.elem, this.prop ); + // Empty strings, null, undefined and "auto" are converted to 0, + // complex values such as "rotate(1rad)" are returned as is, + // simple values such as "10px" are parsed to Float. + return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed; }, // Start an animation from one number to another custom: function( from, to, unit ) { var self = this, - fx = jQuery.fx; + fx = jQuery.fx, + raf; - this.startTime = jQuery.now(); + this.startTime = fxNow || createFxNow(); this.start = from; this.end = to; - this.unit = unit || this.unit || "px"; + this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" ); this.now = this.start; this.pos = this.state = 0; @@ -6643,7 +8278,20 @@ jQuery.fx.prototype = { t.elem = this.elem; if ( t() && jQuery.timers.push(t) && !timerId ) { - timerId = setInterval(fx.tick, fx.interval); + // Use requestAnimationFrame instead of setInterval if available + if ( requestAnimationFrame ) { + timerId = 1; + raf = function() { + // When timerId gets set to null at any point, this stops + if ( timerId ) { + requestAnimationFrame( raf ); + fx.tick(); + } + }; + requestAnimationFrame( raf ); + } else { + timerId = setInterval( fx.tick, fx.interval ); + } } }, @@ -6674,60 +8322,64 @@ jQuery.fx.prototype = { // Each step of an animation step: function( gotoEnd ) { - var t = jQuery.now(), done = true; + var t = fxNow || createFxNow(), + done = true, + elem = this.elem, + options = this.options, + i, n; - if ( gotoEnd || t >= this.options.duration + this.startTime ) { + if ( gotoEnd || t >= options.duration + this.startTime ) { this.now = this.end; this.pos = this.state = 1; this.update(); - this.options.curAnim[ this.prop ] = true; + options.animatedProperties[ this.prop ] = true; - for ( var i in this.options.curAnim ) { - if ( this.options.curAnim[i] !== true ) { + for ( i in options.animatedProperties ) { + if ( options.animatedProperties[i] !== true ) { done = false; } } if ( done ) { // Reset the overflow - if ( this.options.overflow != null && !jQuery.support.shrinkWrapBlocks ) { - var elem = this.elem, - options = this.options; + if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) { jQuery.each( [ "", "X", "Y" ], function (index, value) { elem.style[ "overflow" + value ] = options.overflow[index]; - } ); + }); } // Hide the element if the "hide" operation was done - if ( this.options.hide ) { - jQuery(this.elem).hide(); + if ( options.hide ) { + jQuery(elem).hide(); } // Reset the properties, if the item has been hidden or shown - if ( this.options.hide || this.options.show ) { - for ( var p in this.options.curAnim ) { - jQuery.style( this.elem, p, this.options.orig[p] ); + if ( options.hide || options.show ) { + for ( var p in options.animatedProperties ) { + jQuery.style( elem, p, options.orig[p] ); } } // Execute the complete function - this.options.complete.call( this.elem ); + options.complete.call( elem ); } return false; } else { - var n = t - this.startTime; - this.state = n / this.options.duration; - - // Perform the easing function, defaults to swing - var specialEasing = this.options.specialEasing && this.options.specialEasing[this.prop]; - var defaultEasing = this.options.easing || (jQuery.easing.swing ? "swing" : "linear"); - this.pos = jQuery.easing[specialEasing || defaultEasing](this.state, n, 0, 1, this.options.duration); - this.now = this.start + ((this.end - this.start) * this.pos); + // classical easing cannot be used with an Infinity duration + if ( options.duration == Infinity ) { + this.now = t; + } else { + n = t - this.startTime; + this.state = n / options.duration; + // Perform the easing function, defaults to swing + this.pos = jQuery.easing[options.animatedProperties[this.prop]](this.state, n, 0, 1, options.duration); + this.now = this.start + ((this.end - this.start) * this.pos); + } // Perform the next step of the animation this.update(); } @@ -6738,11 +8390,11 @@ jQuery.fx.prototype = { jQuery.extend( jQuery.fx, { tick: function() { - var timers = jQuery.timers; - - for ( var i = 0; i < timers.length; i++ ) { + var timers = jQuery.timers, + i = timers.length; + while ( i-- ) { if ( !timers[i]() ) { - timers.splice(i--, 1); + timers.splice(i, 1); } } @@ -6788,17 +8440,45 @@ if ( jQuery.expr && jQuery.expr.filters ) { }; } +// Try to restore the default display value of an element function defaultDisplay( nodeName ) { + if ( !elemdisplay[ nodeName ] ) { - var elem = jQuery("<" + nodeName + ">").appendTo("body"), - display = elem.css("display"); + + var elem = jQuery( "<" + nodeName + ">" ).appendTo( "body" ), + display = elem.css( "display" ); elem.remove(); + // If the simple way fails, + // get element's real default display by attaching it to a temp iframe if ( display === "none" || display === "" ) { - display = "block"; + // No iframe to use yet, so create it + if ( !iframe ) { + iframe = document.createElement( "iframe" ); + iframe.frameBorder = iframe.width = iframe.height = 0; + } + + document.body.appendChild( iframe ); + + // Create a cacheable copy of the iframe document on first call. + // IE and Opera will allow us to reuse the iframeDoc without re-writing the fake html + // document to it, Webkit & Firefox won't allow reusing the iframe document + if ( !iframeDoc || !iframe.createElement ) { + iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document; + iframeDoc.write( "" ); + } + + elem = iframeDoc.createElement( nodeName ); + + iframeDoc.body.appendChild( elem ); + + display = jQuery.css( elem, "display" ); + + document.body.removeChild( iframe ); } + // Store the correct default display elemdisplay[ nodeName ] = display; } @@ -6815,7 +8495,7 @@ if ( "getBoundingClientRect" in document.documentElement ) { jQuery.fn.offset = function( options ) { var elem = this[0], box; - if ( options ) { + if ( options ) { return this.each(function( i ) { jQuery.offset.setOffset( this, options, i ); }); @@ -6838,15 +8518,15 @@ if ( "getBoundingClientRect" in document.documentElement ) { // Make sure we're not dealing with a disconnected DOM node if ( !box || !jQuery.contains( docElem, elem ) ) { - return box || { top: 0, left: 0 }; + return box ? { top: box.top, left: box.left } : { top: 0, left: 0 }; } var body = doc.body, win = getWindow(doc), clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0, - scrollTop = (win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop || body.scrollTop ), - scrollLeft = (win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft), + scrollTop = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop || body.scrollTop, + scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft, top = box.top + scrollTop - clientTop, left = box.left + scrollLeft - clientLeft; @@ -6857,7 +8537,7 @@ if ( "getBoundingClientRect" in document.documentElement ) { jQuery.fn.offset = function( options ) { var elem = this[0]; - if ( options ) { + if ( options ) { return this.each(function( i ) { jQuery.offset.setOffset( this, options, i ); }); @@ -6959,7 +8639,6 @@ jQuery.offset = { this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop); body.removeChild( container ); - body = container = innerDiv = checkDiv = table = td = null; jQuery.offset.initialize = jQuery.noop; }, @@ -6976,7 +8655,7 @@ jQuery.offset = { return { top: top, left: left }; }, - + setOffset: function( elem, options, i ) { var position = jQuery.css( elem, "position" ); @@ -6989,17 +8668,19 @@ jQuery.offset = { curOffset = curElem.offset(), curCSSTop = jQuery.css( elem, "top" ), curCSSLeft = jQuery.css( elem, "left" ), - calculatePosition = (position === "absolute" && jQuery.inArray('auto', [curCSSTop, curCSSLeft]) > -1), + calculatePosition = (position === "absolute" || position === "fixed") && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1, props = {}, curPosition = {}, curTop, curLeft; - // need to be able to calculate position if either top or left is auto and position is absolute + // need to be able to calculate position if either top or left is auto and position is either absolute or fixed if ( calculatePosition ) { curPosition = curElem.position(); + curTop = curPosition.top; + curLeft = curPosition.left; + } else { + curTop = parseFloat( curCSSTop ) || 0; + curLeft = parseFloat( curCSSLeft ) || 0; } - curTop = calculatePosition ? curPosition.top : parseInt( curCSSTop, 10 ) || 0; - curLeft = calculatePosition ? curPosition.left : parseInt( curCSSLeft, 10 ) || 0; - if ( jQuery.isFunction( options ) ) { options = options.call( elem, i, curOffset ); } @@ -7010,7 +8691,7 @@ jQuery.offset = { if (options.left != null) { props.left = (options.left - curOffset.left) + curLeft; } - + if ( "using" in options ) { options.using.call( elem, props ); } else { @@ -7068,29 +8749,16 @@ jQuery.fn.extend({ jQuery.each( ["Left", "Top"], function( i, name ) { var method = "scroll" + name; - jQuery.fn[ method ] = function(val) { - var elem = this[0], win; - - if ( !elem ) { - return null; - } + jQuery.fn[ method ] = function( val ) { + var elem, win; - if ( val !== undefined ) { - // Set the scroll offset - return this.each(function() { - win = getWindow( this ); + if ( val === undefined ) { + elem = this[ 0 ]; - if ( win ) { - win.scrollTo( - !i ? val : jQuery(win).scrollLeft(), - i ? val : jQuery(win).scrollTop() - ); + if ( !elem ) { + return null; + } - } else { - this[ method ] = val; - } - }); - } else { win = getWindow( elem ); // Return the scroll offset @@ -7099,6 +8767,21 @@ jQuery.each( ["Left", "Top"], function( i, name ) { win.document.body[ method ] : elem[ method ]; } + + // Set the scroll offset + return this.each(function() { + win = getWindow( this ); + + if ( win ) { + win.scrollTo( + !i ? val : jQuery( win ).scrollLeft(), + i ? val : jQuery( win ).scrollTop() + ); + + } else { + this[ method ] = val; + } + }); }; }); @@ -7138,7 +8821,7 @@ jQuery.each([ "Height", "Width" ], function( i, name ) { if ( !elem ) { return size == null ? null : this; } - + if ( jQuery.isFunction( size ) ) { return this.each(function( i ) { var self = jQuery( this ); @@ -7148,8 +8831,10 @@ jQuery.each([ "Height", "Width" ], function( i, name ) { if ( jQuery.isWindow( elem ) ) { // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode - return elem.document.compatMode === "CSS1Compat" && elem.document.documentElement[ "client" + name ] || - elem.document.body[ "client" + name ]; + // 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat + var docElemProp = elem.document.documentElement[ "client" + name ]; + return elem.document.compatMode === "CSS1Compat" && docElemProp || + elem.document.body[ "client" + name ] || docElemProp; // Get document width or height } else if ( elem.nodeType === 9 ) { @@ -7176,4 +8861,5 @@ jQuery.each([ "Height", "Width" ], function( i, name ) { }); -})(window); \ No newline at end of file +window.jQuery = window.$ = jQuery; +})(window); diff --git a/common/js/jquery.min.js b/common/js/jquery.min.js index 8f3ca2e2d..c72011dfa 100644 --- a/common/js/jquery.min.js +++ b/common/js/jquery.min.js @@ -1,167 +1,16 @@ /*! - * jQuery JavaScript Library v1.4.4 + * jQuery JavaScript Library v1.6 * http://jquery.com/ * - * Copyright 2010, John Resig + * Copyright 2011, John Resig * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * Includes Sizzle.js * http://sizzlejs.com/ - * Copyright 2010, The Dojo Foundation + * Copyright 2011, The Dojo Foundation * Released under the MIT, BSD, and GPL Licenses. * - * Date: Thu Nov 11 19:04:53 2010 -0500 + * Date: Mon May 2 13:50:00 2011 -0400 */ -(function(E,B){function ka(a,b,d){if(d===B&&a.nodeType===1){d=a.getAttribute("data-"+b);if(typeof d==="string"){try{d=d==="true"?true:d==="false"?false:d==="null"?null:!c.isNaN(d)?parseFloat(d):Ja.test(d)?c.parseJSON(d):d}catch(e){}c.data(a,b,d)}else d=B}return d}function U(){return false}function ca(){return true}function la(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function Ka(a){var b,d,e,f,h,l,k,o,x,r,A,C=[];f=[];h=c.data(this,this.nodeType?"events":"__events__");if(typeof h==="function")h= -h.events;if(!(a.liveFired===this||!h||!h.live||a.button&&a.type==="click")){if(a.namespace)A=RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)");a.liveFired=this;var J=h.live.slice(0);for(k=0;kd)break;a.currentTarget=f.elem;a.data=f.handleObj.data;a.handleObj=f.handleObj;A=f.handleObj.origHandler.apply(f.elem,arguments);if(A===false||a.isPropagationStopped()){d=f.level;if(A===false)b=false;if(a.isImmediatePropagationStopped())break}}return b}}function Y(a,b){return(a&&a!=="*"?a+".":"")+b.replace(La, -"`").replace(Ma,"&")}function ma(a,b,d){if(c.isFunction(b))return c.grep(a,function(f,h){return!!b.call(f,h,f)===d});else if(b.nodeType)return c.grep(a,function(f){return f===b===d});else if(typeof b==="string"){var e=c.grep(a,function(f){return f.nodeType===1});if(Na.test(b))return c.filter(b,e,!d);else b=c.filter(b,e)}return c.grep(a,function(f){return c.inArray(f,b)>=0===d})}function na(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var e=c.data(a[d++]),f=c.data(this, -e);if(e=e&&e.events){delete f.handle;f.events={};for(var h in e)for(var l in e[h])c.event.add(this,h,e[h][l],e[h][l].data)}}})}function Oa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function oa(a,b,d){var e=b==="width"?a.offsetWidth:a.offsetHeight;if(d==="border")return e;c.each(b==="width"?Pa:Qa,function(){d||(e-=parseFloat(c.css(a,"padding"+this))||0);if(d==="margin")e+=parseFloat(c.css(a, -"margin"+this))||0;else e-=parseFloat(c.css(a,"border"+this+"Width"))||0});return e}function da(a,b,d,e){if(c.isArray(b)&&b.length)c.each(b,function(f,h){d||Ra.test(a)?e(a,h):da(a+"["+(typeof h==="object"||c.isArray(h)?f:"")+"]",h,d,e)});else if(!d&&b!=null&&typeof b==="object")c.isEmptyObject(b)?e(a,""):c.each(b,function(f,h){da(a+"["+f+"]",h,d,e)});else e(a,b)}function S(a,b){var d={};c.each(pa.concat.apply([],pa.slice(0,b)),function(){d[this]=a});return d}function qa(a){if(!ea[a]){var b=c("<"+ -a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d==="")d="block";ea[a]=d}return ea[a]}function fa(a){return c.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var t=E.document,c=function(){function a(){if(!b.isReady){try{t.documentElement.doScroll("left")}catch(j){setTimeout(a,1);return}b.ready()}}var b=function(j,s){return new b.fn.init(j,s)},d=E.jQuery,e=E.$,f,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,l=/\S/,k=/^\s+/,o=/\s+$/,x=/\W/,r=/\d/,A=/^<(\w+)\s*\/?>(?:<\/\1>)?$/, -C=/^[\],:{}\s]*$/,J=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,w=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,I=/(?:^|:|,)(?:\s*\[)+/g,L=/(webkit)[ \/]([\w.]+)/,g=/(opera)(?:.*version)?[ \/]([\w.]+)/,i=/(msie) ([\w.]+)/,n=/(mozilla)(?:.*? rv:([\w.]+))?/,m=navigator.userAgent,p=false,q=[],u,y=Object.prototype.toString,F=Object.prototype.hasOwnProperty,M=Array.prototype.push,N=Array.prototype.slice,O=String.prototype.trim,D=Array.prototype.indexOf,R={};b.fn=b.prototype={init:function(j, -s){var v,z,H;if(!j)return this;if(j.nodeType){this.context=this[0]=j;this.length=1;return this}if(j==="body"&&!s&&t.body){this.context=t;this[0]=t.body;this.selector="body";this.length=1;return this}if(typeof j==="string")if((v=h.exec(j))&&(v[1]||!s))if(v[1]){H=s?s.ownerDocument||s:t;if(z=A.exec(j))if(b.isPlainObject(s)){j=[t.createElement(z[1])];b.fn.attr.call(j,s,true)}else j=[H.createElement(z[1])];else{z=b.buildFragment([v[1]],[H]);j=(z.cacheable?z.fragment.cloneNode(true):z.fragment).childNodes}return b.merge(this, -j)}else{if((z=t.getElementById(v[2]))&&z.parentNode){if(z.id!==v[2])return f.find(j);this.length=1;this[0]=z}this.context=t;this.selector=j;return this}else if(!s&&!x.test(j)){this.selector=j;this.context=t;j=t.getElementsByTagName(j);return b.merge(this,j)}else return!s||s.jquery?(s||f).find(j):b(s).find(j);else if(b.isFunction(j))return f.ready(j);if(j.selector!==B){this.selector=j.selector;this.context=j.context}return b.makeArray(j,this)},selector:"",jquery:"1.4.4",length:0,size:function(){return this.length}, -toArray:function(){return N.call(this,0)},get:function(j){return j==null?this.toArray():j<0?this.slice(j)[0]:this[j]},pushStack:function(j,s,v){var z=b();b.isArray(j)?M.apply(z,j):b.merge(z,j);z.prevObject=this;z.context=this.context;if(s==="find")z.selector=this.selector+(this.selector?" ":"")+v;else if(s)z.selector=this.selector+"."+s+"("+v+")";return z},each:function(j,s){return b.each(this,j,s)},ready:function(j){b.bindReady();if(b.isReady)j.call(t,b);else q&&q.push(j);return this},eq:function(j){return j=== --1?this.slice(j):this.slice(j,+j+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(N.apply(this,arguments),"slice",N.call(arguments).join(","))},map:function(j){return this.pushStack(b.map(this,function(s,v){return j.call(s,v,s)}))},end:function(){return this.prevObject||b(null)},push:M,sort:[].sort,splice:[].splice};b.fn.init.prototype=b.fn;b.extend=b.fn.extend=function(){var j,s,v,z,H,G=arguments[0]||{},K=1,Q=arguments.length,ga=false; -if(typeof G==="boolean"){ga=G;G=arguments[1]||{};K=2}if(typeof G!=="object"&&!b.isFunction(G))G={};if(Q===K){G=this;--K}for(;K0))if(q){var s=0,v=q;for(q=null;j=v[s++];)j.call(t,b);b.fn.trigger&&b(t).trigger("ready").unbind("ready")}}},bindReady:function(){if(!p){p=true;if(t.readyState==="complete")return setTimeout(b.ready,1);if(t.addEventListener){t.addEventListener("DOMContentLoaded",u,false);E.addEventListener("load",b.ready,false)}else if(t.attachEvent){t.attachEvent("onreadystatechange",u);E.attachEvent("onload", -b.ready);var j=false;try{j=E.frameElement==null}catch(s){}t.documentElement.doScroll&&j&&a()}}},isFunction:function(j){return b.type(j)==="function"},isArray:Array.isArray||function(j){return b.type(j)==="array"},isWindow:function(j){return j&&typeof j==="object"&&"setInterval"in j},isNaN:function(j){return j==null||!r.test(j)||isNaN(j)},type:function(j){return j==null?String(j):R[y.call(j)]||"object"},isPlainObject:function(j){if(!j||b.type(j)!=="object"||j.nodeType||b.isWindow(j))return false;if(j.constructor&& -!F.call(j,"constructor")&&!F.call(j.constructor.prototype,"isPrototypeOf"))return false;for(var s in j);return s===B||F.call(j,s)},isEmptyObject:function(j){for(var s in j)return false;return true},error:function(j){throw j;},parseJSON:function(j){if(typeof j!=="string"||!j)return null;j=b.trim(j);if(C.test(j.replace(J,"@").replace(w,"]").replace(I,"")))return E.JSON&&E.JSON.parse?E.JSON.parse(j):(new Function("return "+j))();else b.error("Invalid JSON: "+j)},noop:function(){},globalEval:function(j){if(j&& -l.test(j)){var s=t.getElementsByTagName("head")[0]||t.documentElement,v=t.createElement("script");v.type="text/javascript";if(b.support.scriptEval)v.appendChild(t.createTextNode(j));else v.text=j;s.insertBefore(v,s.firstChild);s.removeChild(v)}},nodeName:function(j,s){return j.nodeName&&j.nodeName.toUpperCase()===s.toUpperCase()},each:function(j,s,v){var z,H=0,G=j.length,K=G===B||b.isFunction(j);if(v)if(K)for(z in j){if(s.apply(j[z],v)===false)break}else for(;H
    a";var f=d.getElementsByTagName("*"),h=d.getElementsByTagName("a")[0],l=t.createElement("select"), -k=l.appendChild(t.createElement("option"));if(!(!f||!f.length||!h)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(h.getAttribute("style")),hrefNormalized:h.getAttribute("href")==="/a",opacity:/^0.55$/.test(h.style.opacity),cssFloat:!!h.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:k.selected,deleteExpando:true,optDisabled:false,checkClone:false, -scriptEval:false,noCloneEvent:true,boxModel:null,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableHiddenOffsets:true};l.disabled=true;c.support.optDisabled=!k.disabled;b.type="text/javascript";try{b.appendChild(t.createTextNode("window."+e+"=1;"))}catch(o){}a.insertBefore(b,a.firstChild);if(E[e]){c.support.scriptEval=true;delete E[e]}try{delete b.test}catch(x){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function r(){c.support.noCloneEvent= -false;d.detachEvent("onclick",r)});d.cloneNode(true).fireEvent("onclick")}d=t.createElement("div");d.innerHTML="";a=t.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var r=t.createElement("div");r.style.width=r.style.paddingLeft="1px";t.body.appendChild(r);c.boxModel=c.support.boxModel=r.offsetWidth===2;if("zoom"in r.style){r.style.display="inline";r.style.zoom= -1;c.support.inlineBlockNeedsLayout=r.offsetWidth===2;r.style.display="";r.innerHTML="
    ";c.support.shrinkWrapBlocks=r.offsetWidth!==2}r.innerHTML="
    t
    ";var A=r.getElementsByTagName("td");c.support.reliableHiddenOffsets=A[0].offsetHeight===0;A[0].style.display="";A[1].style.display="none";c.support.reliableHiddenOffsets=c.support.reliableHiddenOffsets&&A[0].offsetHeight===0;r.innerHTML="";t.body.removeChild(r).style.display= -"none"});a=function(r){var A=t.createElement("div");r="on"+r;var C=r in A;if(!C){A.setAttribute(r,"return;");C=typeof A[r]==="function"}return C};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=f=h=null}})();var ra={},Ja=/^(?:\{.*\}|\[.*\])$/;c.extend({cache:{},uuid:0,expando:"jQuery"+c.now(),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},data:function(a,b,d){if(c.acceptData(a)){a=a==E?ra:a;var e=a.nodeType,f=e?a[c.expando]:null,h= -c.cache;if(!(e&&!f&&typeof b==="string"&&d===B)){if(e)f||(a[c.expando]=f=++c.uuid);else h=a;if(typeof b==="object")if(e)h[f]=c.extend(h[f],b);else c.extend(h,b);else if(e&&!h[f])h[f]={};a=e?h[f]:h;if(d!==B)a[b]=d;return typeof b==="string"?a[b]:a}}},removeData:function(a,b){if(c.acceptData(a)){a=a==E?ra:a;var d=a.nodeType,e=d?a[c.expando]:a,f=c.cache,h=d?f[e]:e;if(b){if(h){delete h[b];d&&c.isEmptyObject(h)&&c.removeData(a)}}else if(d&&c.support.deleteExpando)delete a[c.expando];else if(a.removeAttribute)a.removeAttribute(c.expando); -else if(d)delete f[e];else for(var l in a)delete a[l]}},acceptData:function(a){if(a.nodeName){var b=c.noData[a.nodeName.toLowerCase()];if(b)return!(b===true||a.getAttribute("classid")!==b)}return true}});c.fn.extend({data:function(a,b){var d=null;if(typeof a==="undefined"){if(this.length){var e=this[0].attributes,f;d=c.data(this[0]);for(var h=0,l=e.length;h-1)return true;return false},val:function(a){if(!arguments.length){var b=this[0];if(b){if(c.nodeName(b,"option")){var d=b.attributes.value;return!d||d.specified?b.value:b.text}if(c.nodeName(b,"select")){var e=b.selectedIndex;d=[];var f=b.options;b=b.type==="select-one"; -if(e<0)return null;var h=b?e:0;for(e=b?e+1:f.length;h=0;else if(c.nodeName(this,"select")){var A=c.makeArray(r);c("option",this).each(function(){this.selected=c.inArray(c(this).val(),A)>=0});if(!A.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true}, -attr:function(a,b,d,e){if(!a||a.nodeType===3||a.nodeType===8)return B;if(e&&b in c.attrFn)return c(a)[b](d);e=a.nodeType!==1||!c.isXMLDoc(a);var f=d!==B;b=e&&c.props[b]||b;var h=Ta.test(b);if((b in a||a[b]!==B)&&e&&!h){if(f){b==="type"&&Ua.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");if(d===null)a.nodeType===1&&a.removeAttribute(b);else a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&& -b.specified?b.value:Va.test(a.nodeName)||Wa.test(a.nodeName)&&a.href?0:B;return a[b]}if(!c.support.style&&e&&b==="style"){if(f)a.style.cssText=""+d;return a.style.cssText}f&&a.setAttribute(b,""+d);if(!a.attributes[b]&&a.hasAttribute&&!a.hasAttribute(b))return B;a=!c.support.hrefNormalized&&e&&h?a.getAttribute(b,2):a.getAttribute(b);return a===null?B:a}});var X=/\.(.*)$/,ia=/^(?:textarea|input|select)$/i,La=/\./g,Ma=/ /g,Xa=/[^\w\s.|`]/g,Ya=function(a){return a.replace(Xa,"\\$&")},ua={focusin:0,focusout:0}; -c.event={add:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(c.isWindow(a)&&a!==E&&!a.frameElement)a=E;if(d===false)d=U;else if(!d)return;var f,h;if(d.handler){f=d;d=f.handler}if(!d.guid)d.guid=c.guid++;if(h=c.data(a)){var l=a.nodeType?"events":"__events__",k=h[l],o=h.handle;if(typeof k==="function"){o=k.handle;k=k.events}else if(!k){a.nodeType||(h[l]=h=function(){});h.events=k={}}if(!o)h.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem, -arguments):B};o.elem=a;b=b.split(" ");for(var x=0,r;l=b[x++];){h=f?c.extend({},f):{handler:d,data:e};if(l.indexOf(".")>-1){r=l.split(".");l=r.shift();h.namespace=r.slice(0).sort().join(".")}else{r=[];h.namespace=""}h.type=l;if(!h.guid)h.guid=d.guid;var A=k[l],C=c.event.special[l]||{};if(!A){A=k[l]=[];if(!C.setup||C.setup.call(a,e,r,o)===false)if(a.addEventListener)a.addEventListener(l,o,false);else a.attachEvent&&a.attachEvent("on"+l,o)}if(C.add){C.add.call(a,h);if(!h.handler.guid)h.handler.guid= -d.guid}A.push(h);c.event.global[l]=true}a=null}}},global:{},remove:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(d===false)d=U;var f,h,l=0,k,o,x,r,A,C,J=a.nodeType?"events":"__events__",w=c.data(a),I=w&&w[J];if(w&&I){if(typeof I==="function"){w=I;I=I.events}if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(f in I)c.event.remove(a,f+b)}else{for(b=b.split(" ");f=b[l++];){r=f;k=f.indexOf(".")<0;o=[];if(!k){o=f.split(".");f=o.shift();x=RegExp("(^|\\.)"+ -c.map(o.slice(0).sort(),Ya).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(A=I[f])if(d){r=c.event.special[f]||{};for(h=e||0;h=0){a.type=f=f.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[f]&&c.each(c.cache,function(){this.events&&this.events[f]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType=== -8)return B;a.result=B;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(e=d.nodeType?c.data(d,"handle"):(c.data(d,"__events__")||{}).handle)&&e.apply(d,b);e=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+f]&&d["on"+f].apply(d,b)===false){a.result=false;a.preventDefault()}}catch(h){}if(!a.isPropagationStopped()&&e)c.event.trigger(a,b,e,true);else if(!a.isDefaultPrevented()){var l;e=a.target;var k=f.replace(X,""),o=c.nodeName(e,"a")&&k=== -"click",x=c.event.special[k]||{};if((!x._default||x._default.call(d,a)===false)&&!o&&!(e&&e.nodeName&&c.noData[e.nodeName.toLowerCase()])){try{if(e[k]){if(l=e["on"+k])e["on"+k]=null;c.event.triggered=true;e[k]()}}catch(r){}if(l)e["on"+k]=l;c.event.triggered=false}}},handle:function(a){var b,d,e,f;d=[];var h=c.makeArray(arguments);a=h[0]=c.event.fix(a||E.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;if(!b){e=a.type.split(".");a.type=e.shift();d=e.slice(0).sort();e=RegExp("(^|\\.)"+ -d.join("\\.(?:.*\\.)?")+"(\\.|$)")}a.namespace=a.namespace||d.join(".");f=c.data(this,this.nodeType?"events":"__events__");if(typeof f==="function")f=f.events;d=(f||{})[a.type];if(f&&d){d=d.slice(0);f=0;for(var l=d.length;f-1?c.map(a.options,function(e){return e.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},Z=function(a,b){var d=a.target,e,f;if(!(!ia.test(d.nodeName)||d.readOnly)){e=c.data(d,"_change_data");f=xa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",f);if(!(e===B||f===e))if(e!=null||f){a.type="change";a.liveFired= -B;return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:Z,beforedeactivate:Z,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return Z.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return Z.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,"_change_data",xa(a))}},setup:function(){if(this.type=== -"file")return false;for(var a in V)c.event.add(this,a+".specialChange",V[a]);return ia.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return ia.test(this.nodeName)}};V=c.event.special.change.filters;V.focus=V.beforeactivate}t.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.trigger(e,null,e.target)}c.event.special[b]={setup:function(){ua[b]++===0&&t.addEventListener(a,d,true)},teardown:function(){--ua[b]=== -0&&t.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,e,f){if(typeof d==="object"){for(var h in d)this[b](h,e,d[h],f);return this}if(c.isFunction(e)||e===false){f=e;e=B}var l=b==="one"?c.proxy(f,function(o){c(this).unbind(o,l);return f.apply(this,arguments)}):f;if(d==="unload"&&b!=="one")this.one(d,e,f);else{h=0;for(var k=this.length;h0?this.bind(b,d,e):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});E.attachEvent&&!E.addEventListener&&c(E).bind("unload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}}); -(function(){function a(g,i,n,m,p,q){p=0;for(var u=m.length;p0){F=y;break}}y=y[g]}m[p]=F}}}var d=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,h=false,l=true;[0,0].sort(function(){l=false;return 0});var k=function(g,i,n,m){n=n||[];var p=i=i||t;if(i.nodeType!==1&&i.nodeType!==9)return[];if(!g||typeof g!=="string")return n;var q,u,y,F,M,N=true,O=k.isXML(i),D=[],R=g;do{d.exec("");if(q=d.exec(R)){R=q[3];D.push(q[1]);if(q[2]){F=q[3]; -break}}}while(q);if(D.length>1&&x.exec(g))if(D.length===2&&o.relative[D[0]])u=L(D[0]+D[1],i);else for(u=o.relative[D[0]]?[i]:k(D.shift(),i);D.length;){g=D.shift();if(o.relative[g])g+=D.shift();u=L(g,u)}else{if(!m&&D.length>1&&i.nodeType===9&&!O&&o.match.ID.test(D[0])&&!o.match.ID.test(D[D.length-1])){q=k.find(D.shift(),i,O);i=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]}if(i){q=m?{expr:D.pop(),set:C(m)}:k.find(D.pop(),D.length===1&&(D[0]==="~"||D[0]==="+")&&i.parentNode?i.parentNode:i,O);u=q.expr?k.filter(q.expr, -q.set):q.set;if(D.length>0)y=C(u);else N=false;for(;D.length;){q=M=D.pop();if(o.relative[M])q=D.pop();else M="";if(q==null)q=i;o.relative[M](y,q,O)}}else y=[]}y||(y=u);y||k.error(M||g);if(f.call(y)==="[object Array]")if(N)if(i&&i.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&k.contains(i,y[g])))n.push(u[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&n.push(u[g]);else n.push.apply(n,y);else C(y,n);if(F){k(F,p,n,m);k.uniqueSort(n)}return n};k.uniqueSort=function(g){if(w){h= -l;g.sort(w);if(h)for(var i=1;i0};k.find=function(g,i,n){var m;if(!g)return[];for(var p=0,q=o.order.length;p":function(g,i){var n,m=typeof i==="string",p=0,q=g.length;if(m&&!/\W/.test(i))for(i=i.toLowerCase();p=0))n||m.push(u);else if(n)i[q]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var i=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=i[1]+(i[2]||1)-0;g[3]=i[3]-0}g[0]=e++;return g},ATTR:function(g,i,n, -m,p,q){i=g[1].replace(/\\/g,"");if(!q&&o.attrMap[i])g[1]=o.attrMap[i];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,i,n,m,p){if(g[1]==="not")if((d.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,i);else{g=k.filter(g[3],i,n,true^p);n||m.push.apply(m,g);return false}else if(o.match.POS.test(g[0])||o.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled=== -true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,i,n){return!!k(n[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"=== -g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,i){return i===0},last:function(g,i,n,m){return i===m.length-1},even:function(g,i){return i%2===0},odd:function(g,i){return i%2===1},lt:function(g,i,n){return in[3]-0},nth:function(g,i,n){return n[3]- -0===i},eq:function(g,i,n){return n[3]-0===i}},filter:{PSEUDO:function(g,i,n,m){var p=i[1],q=o.filters[p];if(q)return q(g,n,i,m);else if(p==="contains")return(g.textContent||g.innerText||k.getText([g])||"").indexOf(i[3])>=0;else if(p==="not"){i=i[3];n=0;for(m=i.length;n=0}},ID:function(g,i){return g.nodeType===1&&g.getAttribute("id")===i},TAG:function(g,i){return i==="*"&&g.nodeType===1||g.nodeName.toLowerCase()=== -i},CLASS:function(g,i){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(i)>-1},ATTR:function(g,i){var n=i[1];n=o.attrHandle[n]?o.attrHandle[n](g):g[n]!=null?g[n]:g.getAttribute(n);var m=n+"",p=i[2],q=i[4];return n==null?p==="!=":p==="="?m===q:p==="*="?m.indexOf(q)>=0:p==="~="?(" "+m+" ").indexOf(q)>=0:!q?m&&n!==false:p==="!="?m!==q:p==="^="?m.indexOf(q)===0:p==="$="?m.substr(m.length-q.length)===q:p==="|="?m===q||m.substr(0,q.length+1)===q+"-":false},POS:function(g,i,n,m){var p=o.setFilters[i[2]]; -if(p)return p(g,n,i,m)}}},x=o.match.POS,r=function(g,i){return"\\"+(i-0+1)},A;for(A in o.match){o.match[A]=RegExp(o.match[A].source+/(?![^\[]*\])(?![^\(]*\))/.source);o.leftMatch[A]=RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[A].source.replace(/\\(\d+)/g,r))}var C=function(g,i){g=Array.prototype.slice.call(g,0);if(i){i.push.apply(i,g);return i}return g};try{Array.prototype.slice.call(t.documentElement.childNodes,0)}catch(J){C=function(g,i){var n=0,m=i||[];if(f.call(g)==="[object Array]")Array.prototype.push.apply(m, -g);else if(typeof g.length==="number")for(var p=g.length;n";n.insertBefore(g,n.firstChild);if(t.getElementById(i)){o.find.ID=function(m,p,q){if(typeof p.getElementById!=="undefined"&&!q)return(p=p.getElementById(m[1]))?p.id===m[1]||typeof p.getAttributeNode!=="undefined"&&p.getAttributeNode("id").nodeValue===m[1]?[p]:B:[]};o.filter.ID=function(m,p){var q=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&q&&q.nodeValue===p}}n.removeChild(g); -n=g=null})();(function(){var g=t.createElement("div");g.appendChild(t.createComment(""));if(g.getElementsByTagName("*").length>0)o.find.TAG=function(i,n){var m=n.getElementsByTagName(i[1]);if(i[1]==="*"){for(var p=[],q=0;m[q];q++)m[q].nodeType===1&&p.push(m[q]);m=p}return m};g.innerHTML="";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")o.attrHandle.href=function(i){return i.getAttribute("href",2)};g=null})();t.querySelectorAll&& -function(){var g=k,i=t.createElement("div");i.innerHTML="

    ";if(!(i.querySelectorAll&&i.querySelectorAll(".TEST").length===0)){k=function(m,p,q,u){p=p||t;m=m.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!u&&!k.isXML(p))if(p.nodeType===9)try{return C(p.querySelectorAll(m),q)}catch(y){}else if(p.nodeType===1&&p.nodeName.toLowerCase()!=="object"){var F=p.getAttribute("id"),M=F||"__sizzle__";F||p.setAttribute("id",M);try{return C(p.querySelectorAll("#"+M+" "+m),q)}catch(N){}finally{F|| -p.removeAttribute("id")}}return g(m,p,q,u)};for(var n in g)k[n]=g[n];i=null}}();(function(){var g=t.documentElement,i=g.matchesSelector||g.mozMatchesSelector||g.webkitMatchesSelector||g.msMatchesSelector,n=false;try{i.call(t.documentElement,"[test!='']:sizzle")}catch(m){n=true}if(i)k.matchesSelector=function(p,q){q=q.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(p))try{if(n||!o.match.PSEUDO.test(q)&&!/!=/.test(q))return i.call(p,q)}catch(u){}return k(q,null,null,[p]).length>0}})();(function(){var g= -t.createElement("div");g.innerHTML="
    ";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){o.order.splice(1,0,"CLASS");o.find.CLASS=function(i,n,m){if(typeof n.getElementsByClassName!=="undefined"&&!m)return n.getElementsByClassName(i[1])};g=null}}})();k.contains=t.documentElement.contains?function(g,i){return g!==i&&(g.contains?g.contains(i):true)}:t.documentElement.compareDocumentPosition? -function(g,i){return!!(g.compareDocumentPosition(i)&16)}:function(){return false};k.isXML=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false};var L=function(g,i){for(var n,m=[],p="",q=i.nodeType?[i]:i;n=o.match.PSEUDO.exec(g);){p+=n[0];g=g.replace(o.match.PSEUDO,"")}g=o.relative[g]?g+"*":g;n=0;for(var u=q.length;n0)for(var h=d;h0},closest:function(a,b){var d=[],e,f,h=this[0];if(c.isArray(a)){var l,k={},o=1;if(h&&a.length){e=0;for(f=a.length;e-1:c(h).is(e))d.push({selector:l,elem:h,level:o})}h= -h.parentNode;o++}}return d}l=cb.test(a)?c(a,b||this.context):null;e=0;for(f=this.length;e-1:c.find.matchesSelector(h,a)){d.push(h);break}else{h=h.parentNode;if(!h||!h.ownerDocument||h===b)break}d=d.length>1?c.unique(d):d;return this.pushStack(d,"closest",a)},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var d=typeof a==="string"?c(a,b||this.context): -c.makeArray(a),e=c.merge(this.get(),d);return this.pushStack(!d[0]||!d[0].parentNode||d[0].parentNode.nodeType===11||!e[0]||!e[0].parentNode||e[0].parentNode.nodeType===11?e:c.unique(e))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a, -2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a, -b){c.fn[a]=function(d,e){var f=c.map(this,b,d);Za.test(a)||(e=d);if(e&&typeof e==="string")f=c.filter(e,f);f=this.length>1?c.unique(f):f;if((this.length>1||ab.test(e))&&$a.test(a))f=f.reverse();return this.pushStack(f,a,bb.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return b.length===1?c.find.matchesSelector(b[0],a)?[b[0]]:[]:c.find.matches(a,b)},dir:function(a,b,d){var e=[];for(a=a[b];a&&a.nodeType!==9&&(d===B||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&& -e.push(a);a=a[b]}return e},nth:function(a,b,d){b=b||1;for(var e=0;a;a=a[d])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var za=/ jQuery\d+="(?:\d+|null)"/g,$=/^\s+/,Aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Ba=/<([\w:]+)/,db=/\s]+\/)>/g,P={option:[1, -""],legend:[1,"
    ","
    "],thead:[1,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]};P.optgroup=P.option;P.tbody=P.tfoot=P.colgroup=P.caption=P.thead;P.th=P.td;if(!c.support.htmlSerialize)P._default=[1,"div
    ","
    "];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d= -c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==B)return this.empty().append((this[0]&&this[0].ownerDocument||t).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this}, -wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})}, -prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b, -this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,e;(e=this[d])!=null;d++)if(!a||c.filter(a,[e]).length){if(!b&&e.nodeType===1){c.cleanData(e.getElementsByTagName("*"));c.cleanData([e])}e.parentNode&&e.parentNode.removeChild(e)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild); -return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,e=this.ownerDocument;if(!d){d=e.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(za,"").replace(fb,'="$1">').replace($,"")],e)[0]}else return this.cloneNode(true)});if(a===true){na(this,b);na(this.find("*"),b.find("*"))}return b},html:function(a){if(a===B)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(za,""):null; -else if(typeof a==="string"&&!Ca.test(a)&&(c.support.leadingWhitespace||!$.test(a))&&!P[(Ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Aa,"<$1>");try{for(var b=0,d=this.length;b0||e.cacheable||this.length>1?h.cloneNode(true):h)}k.length&&c.each(k,Oa)}return this}});c.buildFragment=function(a,b,d){var e,f,h;b=b&&b[0]?b[0].ownerDocument||b[0]:t;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===t&&!Ca.test(a[0])&&(c.support.checkClone||!Da.test(a[0]))){f=true;if(h=c.fragments[a[0]])if(h!==1)e=h}if(!e){e=b.createDocumentFragment();c.clean(a,b,e,d)}if(f)c.fragments[a[0]]=h?e:1;return{fragment:e,cacheable:f}};c.fragments={};c.each({appendTo:"append", -prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var e=[];d=c(d);var f=this.length===1&&this[0].parentNode;if(f&&f.nodeType===11&&f.childNodes.length===1&&d.length===1){d[b](this[0]);return this}else{f=0;for(var h=d.length;f0?this.clone(true):this).get();c(d[f])[b](l);e=e.concat(l)}return this.pushStack(e,a,d.selector)}}});c.extend({clean:function(a,b,d,e){b=b||t;if(typeof b.createElement==="undefined")b=b.ownerDocument|| -b[0]&&b[0].ownerDocument||t;for(var f=[],h=0,l;(l=a[h])!=null;h++){if(typeof l==="number")l+="";if(l){if(typeof l==="string"&&!eb.test(l))l=b.createTextNode(l);else if(typeof l==="string"){l=l.replace(Aa,"<$1>");var k=(Ba.exec(l)||["",""])[1].toLowerCase(),o=P[k]||P._default,x=o[0],r=b.createElement("div");for(r.innerHTML=o[1]+l+o[2];x--;)r=r.lastChild;if(!c.support.tbody){x=db.test(l);k=k==="table"&&!x?r.firstChild&&r.firstChild.childNodes:o[1]===""&&!x?r.childNodes:[];for(o=k.length- -1;o>=0;--o)c.nodeName(k[o],"tbody")&&!k[o].childNodes.length&&k[o].parentNode.removeChild(k[o])}!c.support.leadingWhitespace&&$.test(l)&&r.insertBefore(b.createTextNode($.exec(l)[0]),r.firstChild);l=r.childNodes}if(l.nodeType)f.push(l);else f=c.merge(f,l)}}if(d)for(h=0;f[h];h++)if(e&&c.nodeName(f[h],"script")&&(!f[h].type||f[h].type.toLowerCase()==="text/javascript"))e.push(f[h].parentNode?f[h].parentNode.removeChild(f[h]):f[h]);else{f[h].nodeType===1&&f.splice.apply(f,[h+1,0].concat(c.makeArray(f[h].getElementsByTagName("script")))); -d.appendChild(f[h])}return f},cleanData:function(a){for(var b,d,e=c.cache,f=c.event.special,h=c.support.deleteExpando,l=0,k;(k=a[l])!=null;l++)if(!(k.nodeName&&c.noData[k.nodeName.toLowerCase()]))if(d=k[c.expando]){if((b=e[d])&&b.events)for(var o in b.events)f[o]?c.event.remove(k,o):c.removeEvent(k,o,b.handle);if(h)delete k[c.expando];else k.removeAttribute&&k.removeAttribute(c.expando);delete e[d]}}});var Ea=/alpha\([^)]*\)/i,gb=/opacity=([^)]*)/,hb=/-([a-z])/ig,ib=/([A-Z])/g,Fa=/^-?\d+(?:px)?$/i, -jb=/^-?\d/,kb={position:"absolute",visibility:"hidden",display:"block"},Pa=["Left","Right"],Qa=["Top","Bottom"],W,Ga,aa,lb=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){if(arguments.length===2&&b===B)return this;return c.access(this,a,b,true,function(d,e,f){return f!==B?c.style(d,e,f):c.css(d,e)})};c.extend({cssHooks:{opacity:{get:function(a,b){if(b){var d=W(a,"opacity","opacity");return d===""?"1":d}else return a.style.opacity}}},cssNumber:{zIndex:true,fontWeight:true,opacity:true, -zoom:true,lineHeight:true},cssProps:{"float":c.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,d,e){if(!(!a||a.nodeType===3||a.nodeType===8||!a.style)){var f,h=c.camelCase(b),l=a.style,k=c.cssHooks[h];b=c.cssProps[h]||h;if(d!==B){if(!(typeof d==="number"&&isNaN(d)||d==null)){if(typeof d==="number"&&!c.cssNumber[h])d+="px";if(!k||!("set"in k)||(d=k.set(a,d))!==B)try{l[b]=d}catch(o){}}}else{if(k&&"get"in k&&(f=k.get(a,false,e))!==B)return f;return l[b]}}},css:function(a,b,d){var e,f=c.camelCase(b), -h=c.cssHooks[f];b=c.cssProps[f]||f;if(h&&"get"in h&&(e=h.get(a,true,d))!==B)return e;else if(W)return W(a,b,f)},swap:function(a,b,d){var e={},f;for(f in b){e[f]=a.style[f];a.style[f]=b[f]}d.call(a);for(f in b)a.style[f]=e[f]},camelCase:function(a){return a.replace(hb,lb)}});c.curCSS=c.css;c.each(["height","width"],function(a,b){c.cssHooks[b]={get:function(d,e,f){var h;if(e){if(d.offsetWidth!==0)h=oa(d,b,f);else c.swap(d,kb,function(){h=oa(d,b,f)});if(h<=0){h=W(d,b,b);if(h==="0px"&&aa)h=aa(d,b,b); -if(h!=null)return h===""||h==="auto"?"0px":h}if(h<0||h==null){h=d.style[b];return h===""||h==="auto"?"0px":h}return typeof h==="string"?h:h+"px"}},set:function(d,e){if(Fa.test(e)){e=parseFloat(e);if(e>=0)return e+"px"}else return e}}});if(!c.support.opacity)c.cssHooks.opacity={get:function(a,b){return gb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var d=a.style;d.zoom=1;var e=c.isNaN(b)?"":"alpha(opacity="+b*100+")",f= -d.filter||"";d.filter=Ea.test(f)?f.replace(Ea,e):d.filter+" "+e}};if(t.defaultView&&t.defaultView.getComputedStyle)Ga=function(a,b,d){var e;d=d.replace(ib,"-$1").toLowerCase();if(!(b=a.ownerDocument.defaultView))return B;if(b=b.getComputedStyle(a,null)){e=b.getPropertyValue(d);if(e===""&&!c.contains(a.ownerDocument.documentElement,a))e=c.style(a,d)}return e};if(t.documentElement.currentStyle)aa=function(a,b){var d,e,f=a.currentStyle&&a.currentStyle[b],h=a.style;if(!Fa.test(f)&&jb.test(f)){d=h.left; -e=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;h.left=b==="fontSize"?"1em":f||0;f=h.pixelLeft+"px";h.left=d;a.runtimeStyle.left=e}return f===""?"auto":f};W=Ga||aa;if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetHeight;return a.offsetWidth===0&&b===0||!c.support.reliableHiddenOffsets&&(a.style.display||c.css(a,"display"))==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var mb=c.now(),nb=/)<[^<]*)*<\/script>/gi, -ob=/^(?:select|textarea)/i,pb=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,qb=/^(?:GET|HEAD)$/,Ra=/\[\]$/,T=/\=\?(&|$)/,ja=/\?/,rb=/([?&])_=[^&]*/,sb=/^(\w+:)?\/\/([^\/?#]+)/,tb=/%20/g,ub=/#.*$/,Ha=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!=="string"&&Ha)return Ha.apply(this,arguments);else if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var f=a.slice(e,a.length);a=a.slice(0,e)}e="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b=== -"object"){b=c.param(b,c.ajaxSettings.traditional);e="POST"}var h=this;c.ajax({url:a,type:e,dataType:"html",data:b,complete:function(l,k){if(k==="success"||k==="notmodified")h.html(f?c("
    ").append(l.responseText.replace(nb,"")).find(f):l.responseText);d&&h.each(d,[l.responseText,k,l])}});return this},serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&& -!this.disabled&&(this.checked||ob.test(this.nodeName)||pb.test(this.type))}).map(function(a,b){var d=c(this).val();return d==null?null:c.isArray(d)?c.map(d,function(e){return{name:b.name,value:e}}):{name:b.name,value:d}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:e})}, -getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:e})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return new E.XMLHttpRequest},accepts:{xml:"application/xml, text/xml",html:"text/html", -script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},ajax:function(a){var b=c.extend(true,{},c.ajaxSettings,a),d,e,f,h=b.type.toUpperCase(),l=qb.test(h);b.url=b.url.replace(ub,"");b.context=a&&a.context!=null?a.context:b;if(b.data&&b.processData&&typeof b.data!=="string")b.data=c.param(b.data,b.traditional);if(b.dataType==="jsonp"){if(h==="GET")T.test(b.url)||(b.url+=(ja.test(b.url)?"&":"?")+(b.jsonp||"callback")+"=?");else if(!b.data|| -!T.test(b.data))b.data=(b.data?b.data+"&":"")+(b.jsonp||"callback")+"=?";b.dataType="json"}if(b.dataType==="json"&&(b.data&&T.test(b.data)||T.test(b.url))){d=b.jsonpCallback||"jsonp"+mb++;if(b.data)b.data=(b.data+"").replace(T,"="+d+"$1");b.url=b.url.replace(T,"="+d+"$1");b.dataType="script";var k=E[d];E[d]=function(m){if(c.isFunction(k))k(m);else{E[d]=B;try{delete E[d]}catch(p){}}f=m;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);r&&r.removeChild(A)}}if(b.dataType==="script"&&b.cache===null)b.cache= -false;if(b.cache===false&&l){var o=c.now(),x=b.url.replace(rb,"$1_="+o);b.url=x+(x===b.url?(ja.test(b.url)?"&":"?")+"_="+o:"")}if(b.data&&l)b.url+=(ja.test(b.url)?"&":"?")+b.data;b.global&&c.active++===0&&c.event.trigger("ajaxStart");o=(o=sb.exec(b.url))&&(o[1]&&o[1].toLowerCase()!==location.protocol||o[2].toLowerCase()!==location.host);if(b.dataType==="script"&&h==="GET"&&o){var r=t.getElementsByTagName("head")[0]||t.documentElement,A=t.createElement("script");if(b.scriptCharset)A.charset=b.scriptCharset; -A.src=b.url;if(!d){var C=false;A.onload=A.onreadystatechange=function(){if(!C&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){C=true;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);A.onload=A.onreadystatechange=null;r&&A.parentNode&&r.removeChild(A)}}}r.insertBefore(A,r.firstChild);return B}var J=false,w=b.xhr();if(w){b.username?w.open(h,b.url,b.async,b.username,b.password):w.open(h,b.url,b.async);try{if(b.data!=null&&!l||a&&a.contentType)w.setRequestHeader("Content-Type", -b.contentType);if(b.ifModified){c.lastModified[b.url]&&w.setRequestHeader("If-Modified-Since",c.lastModified[b.url]);c.etag[b.url]&&w.setRequestHeader("If-None-Match",c.etag[b.url])}o||w.setRequestHeader("X-Requested-With","XMLHttpRequest");w.setRequestHeader("Accept",b.dataType&&b.accepts[b.dataType]?b.accepts[b.dataType]+", */*; q=0.01":b.accepts._default)}catch(I){}if(b.beforeSend&&b.beforeSend.call(b.context,w,b)===false){b.global&&c.active--===1&&c.event.trigger("ajaxStop");w.abort();return false}b.global&& -c.triggerGlobal(b,"ajaxSend",[w,b]);var L=w.onreadystatechange=function(m){if(!w||w.readyState===0||m==="abort"){J||c.handleComplete(b,w,e,f);J=true;if(w)w.onreadystatechange=c.noop}else if(!J&&w&&(w.readyState===4||m==="timeout")){J=true;w.onreadystatechange=c.noop;e=m==="timeout"?"timeout":!c.httpSuccess(w)?"error":b.ifModified&&c.httpNotModified(w,b.url)?"notmodified":"success";var p;if(e==="success")try{f=c.httpData(w,b.dataType,b)}catch(q){e="parsererror";p=q}if(e==="success"||e==="notmodified")d|| -c.handleSuccess(b,w,e,f);else c.handleError(b,w,e,p);d||c.handleComplete(b,w,e,f);m==="timeout"&&w.abort();if(b.async)w=null}};try{var g=w.abort;w.abort=function(){w&&Function.prototype.call.call(g,w);L("abort")}}catch(i){}b.async&&b.timeout>0&&setTimeout(function(){w&&!J&&L("timeout")},b.timeout);try{w.send(l||b.data==null?null:b.data)}catch(n){c.handleError(b,w,null,n);c.handleComplete(b,w,e,f)}b.async||L();return w}},param:function(a,b){var d=[],e=function(h,l){l=c.isFunction(l)?l():l;d[d.length]= -encodeURIComponent(h)+"="+encodeURIComponent(l)};if(b===B)b=c.ajaxSettings.traditional;if(c.isArray(a)||a.jquery)c.each(a,function(){e(this.name,this.value)});else for(var f in a)da(f,a[f],b,e);return d.join("&").replace(tb,"+")}});c.extend({active:0,lastModified:{},etag:{},handleError:function(a,b,d,e){a.error&&a.error.call(a.context,b,d,e);a.global&&c.triggerGlobal(a,"ajaxError",[b,a,e])},handleSuccess:function(a,b,d,e){a.success&&a.success.call(a.context,e,d,b);a.global&&c.triggerGlobal(a,"ajaxSuccess", -[b,a])},handleComplete:function(a,b,d){a.complete&&a.complete.call(a.context,b,d);a.global&&c.triggerGlobal(a,"ajaxComplete",[b,a]);a.global&&c.active--===1&&c.event.trigger("ajaxStop")},triggerGlobal:function(a,b,d){(a.context&&a.context.url==null?c(a.context):c.event).trigger(b,d)},httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===1223}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"), -e=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(e)c.etag[b]=e;return a.status===304},httpData:function(a,b,d){var e=a.getResponseHeader("content-type")||"",f=b==="xml"||!b&&e.indexOf("xml")>=0;a=f?a.responseXML:a.responseText;f&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b==="json"||!b&&e.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&e.indexOf("javascript")>=0)c.globalEval(a);return a}}); -if(E.ActiveXObject)c.ajaxSettings.xhr=function(){if(E.location.protocol!=="file:")try{return new E.XMLHttpRequest}catch(a){}try{return new E.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}};c.support.ajax=!!c.ajaxSettings.xhr();var ea={},vb=/^(?:toggle|show|hide)$/,wb=/^([+\-]=)?([\d+.\-]+)(.*)$/,ba,pa=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b,d){if(a||a===0)return this.animate(S("show", -3),a,b,d);else{d=0;for(var e=this.length;d=0;e--)if(d[e].elem===this){b&&d[e](true);d.splice(e,1)}});b||this.dequeue();return this}});c.each({slideDown:S("show",1),slideUp:S("hide",1),slideToggle:S("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){c.fn[a]=function(d,e,f){return this.animate(b, -d,e,f)}});c.extend({speed:function(a,b,d){var e=a&&typeof a==="object"?c.extend({},a):{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};e.duration=c.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in c.fx.speeds?c.fx.speeds[e.duration]:c.fx.speeds._default;e.old=e.complete;e.complete=function(){e.queue!==false&&c(this).dequeue();c.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,d,e){return d+e*a},swing:function(a,b,d,e){return(-Math.cos(a* -Math.PI)/2+0.5)*e+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||c.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a=parseFloat(c.css(this.elem,this.prop));return a&&a>-1E4?a:0},custom:function(a,b,d){function e(l){return f.step(l)} -var f=this,h=c.fx;this.startTime=c.now();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;this.pos=this.state=0;e.elem=this.elem;if(e()&&c.timers.push(e)&&!ba)ba=setInterval(h.tick,h.interval)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true; -this.custom(this.cur(),0)},step:function(a){var b=c.now(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var e in this.options.curAnim)if(this.options.curAnim[e]!==true)d=false;if(d){if(this.options.overflow!=null&&!c.support.shrinkWrapBlocks){var f=this.elem,h=this.options;c.each(["","X","Y"],function(k,o){f.style["overflow"+o]=h.overflow[k]})}this.options.hide&&c(this.elem).hide();if(this.options.hide|| -this.options.show)for(var l in this.options.curAnim)c.style(this.elem,l,this.options.orig[l]);this.options.complete.call(this.elem)}return false}else{a=b-this.startTime;this.state=a/this.options.duration;b=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||b](this.state,a,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a= -c.timers,b=0;b-1;e={};var x={};if(o)x=f.position();l=o?x.top:parseInt(l,10)||0;k=o?x.left:parseInt(k,10)||0;if(c.isFunction(b))b=b.call(a,d,h);if(b.top!=null)e.top=b.top-h.top+l;if(b.left!=null)e.left=b.left-h.left+k;"using"in b?b.using.call(a, -e):f.css(e)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),e=Ia.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.css(a,"marginTop"))||0;d.left-=parseFloat(c.css(a,"marginLeft"))||0;e.top+=parseFloat(c.css(b[0],"borderTopWidth"))||0;e.left+=parseFloat(c.css(b[0],"borderLeftWidth"))||0;return{top:d.top-e.top,left:d.left-e.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||t.body;a&&!Ia.test(a.nodeName)&& -c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(e){var f=this[0],h;if(!f)return null;if(e!==B)return this.each(function(){if(h=fa(this))h.scrollTo(!a?e:c(h).scrollLeft(),a?e:c(h).scrollTop());else this[d]=e});else return(h=fa(f))?"pageXOffset"in h?h[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&h.document.documentElement[d]||h.document.body[d]:f[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase(); -c.fn["inner"+b]=function(){return this[0]?parseFloat(c.css(this[0],d,"padding")):null};c.fn["outer"+b]=function(e){return this[0]?parseFloat(c.css(this[0],d,e?"margin":"border")):null};c.fn[d]=function(e){var f=this[0];if(!f)return e==null?null:this;if(c.isFunction(e))return this.each(function(l){var k=c(this);k[d](e.call(this,l,k[d]()))});if(c.isWindow(f))return f.document.compatMode==="CSS1Compat"&&f.document.documentElement["client"+b]||f.document.body["client"+b];else if(f.nodeType===9)return Math.max(f.documentElement["client"+ -b],f.body["scroll"+b],f.documentElement["scroll"+b],f.body["offset"+b],f.documentElement["offset"+b]);else if(e===B){f=c.css(f,d);var h=parseFloat(f);return c.isNaN(h)?f:h}else return this.css(d,typeof e==="string"?e:e+"px")}})})(window); +(function(a,b){function cw(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function ct(a){if(!ch[a]){var b=f("<"+a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d===""){ci||(ci=c.createElement("iframe"),ci.frameBorder=ci.width=ci.height=0),c.body.appendChild(ci);if(!cj||!ci.createElement)cj=(ci.contentWindow||ci.contentDocument).document,cj.write("");b=cj.createElement(a),cj.body.appendChild(b),d=f.css(b,"display"),c.body.removeChild(ci)}ch[a]=d}return ch[a]}function cs(a,b){var c={};f.each(cn.concat.apply([],cn.slice(0,b)),function(){c[this]=a});return c}function cr(){co=b}function cq(){setTimeout(cr,0);return co=f.now()}function cg(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function cf(){try{return new a.XMLHttpRequest}catch(b){}}function b_(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g=0===c})}function V(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function N(a,b){return(a&&a!=="*"?a+".":"")+b.replace(z,"`").replace(A,"&")}function M(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;ic)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function K(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function E(){return!0}function D(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){name="data-"+c.replace(j,"$1-$2").toLowerCase(),d=a.getAttribute(name);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(e){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function H(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(H,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=d.userAgent,x,y,z,A=Object.prototype.toString,B=Object.prototype.hasOwnProperty,C=Array.prototype.push,D=Array.prototype.slice,E=String.prototype.trim,F=Array.prototype.indexOf,G={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)==="<"&&a.charAt(a.length-1)===">"&&a.length>=3?g=[null,a,null]:g=i.exec(a);if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6",length:0,size:function(){return this.length},toArray:function(){return D.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?C.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),y.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(D.apply(this,arguments),"slice",D.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:C,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;y.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!y){y=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",z,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",z),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&H()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):G[A.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;if(a.constructor&&!B.call(a,"constructor")&&!B.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a);return c===b||B.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(b,c,d){a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),d=c.documentElement,(!d||!d.nodeName||d.nodeName==="parsererror")&&e.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c
    a",b=a.getElementsByTagName("*"),d=a.getElementsByTagName("a")[0];if(!b||!b.length||!d)return{};e=c.createElement("select"),f=e.appendChild(c.createElement("option")),g=a.getElementsByTagName("input")[0],i={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(d.getAttribute("style")),hrefNormalized:d.getAttribute("href")==="/a",opacity:/^0.55$/.test(d.style.opacity),cssFloat:!!d.style.cssFloat,checkOn:g.value==="on",optSelected:f.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},g.checked=!0,i.noCloneChecked=g.cloneNode(!0).checked,e.disabled=!0,i.optDisabled=!f.disabled;try{delete a.test}catch(r){i.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function click(){i.noCloneEvent=!1,a.detachEvent("onclick",click)}),a.cloneNode(!0).fireEvent("onclick")),g=c.createElement("input"),g.value="t",g.setAttribute("type","radio"),i.radioValue=g.value==="t",g.setAttribute("checked","checked"),a.appendChild(g),j=c.createDocumentFragment(),j.appendChild(a.firstChild),i.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",k=c.createElement("body"),l={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"};for(p in l)k.style[p]=l[p];k.appendChild(a),c.documentElement.appendChild(k),i.appendChecked=g.checked,i.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,i.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
    ",i.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
    t
    ",m=a.getElementsByTagName("td"),q=m[0].offsetHeight===0,m[0].style.display="",m[1].style.display="none",i.reliableHiddenOffsets=q&&m[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(h=c.createElement("div"),h.style.width="0",h.style.marginRight="0",a.appendChild(h),i.reliableMarginRight=(parseInt(c.defaultView.getComputedStyle(h,null).marginRight,10)||0)===0),k.innerHTML="",c.documentElement.removeChild(k);if(a.attachEvent)for(p in{submit:1,change:1,focusin:1})o="on"+p,q=o in a,q||(a.setAttribute(o,"return;"),q=typeof a[o]=="function"),i[p+"Bubbles"]=q;return i}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([a-z])([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g=f.expando,h=typeof c=="string",i,j=a.nodeType,k=j?f.cache:a,l=j?a[f.expando]:a[f.expando]&&f.expando;if((!l||e&&l&&!k[l][g])&&h&&d===b)return;l||(j?a[f.expando]=l=++f.uuid:l=f.expando),k[l]||(k[l]={},j||(k[l].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?k[l][g]=f.extend(k[l][g],c):k[l]=f.extend(k[l],c);i=k[l],e&&(i[g]||(i[g]={}),i=i[g]),d!==b&&(i[c]=d);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[c]:i}},removeData:function(b,c,d){if(!!f.acceptData(b)){var e=f.expando,g=b.nodeType,h=g?f.cache:b,i=g?b[f.expando]:f.expando;if(!h[i])return;if(c){var j=d?h[i][e]:h[i];if(j){delete j[c];if(!l(j))return}}if(d){delete h[i][e];if(!l(h[i]))return}var k=h[i][e];f.support.deleteExpando||h!=a?delete h[i]:h[i]=null,k?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=k):g&&(f.support.deleteExpando?delete b[f.expando]:b.removeAttribute?b.removeAttribute(f.expando):b[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;return(e.value||"").replace(p,"")}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||"set"in c&&c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b=a.selectedIndex,c=[],d=a.options,e=a.type==="select-one";if(b<0)return null;for(var g=e?b:0,h=e?b+1:d.length;g=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex",readonly:"readOnly"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);var h,i,j=g!==1||!f.isXMLDoc(a);c=j&&f.attrFix[c]||c,i=f.attrHooks[c]||(v&&(f.nodeName(a,"form")||u.test(c))?v:b);if(d!==b){if(d===null||d===!1&&!t.test(c)){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;d===!0&&!t.test(c)&&(d=c),a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j)return i.get(a,c);h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){a.nodeType===1&&(b=f.attrFix[b]||b,f.support.getSetAttribute?a.removeAttribute(b):(f.attr(a,b,""),a.removeAttributeNode(a.getAttributeNode(b))))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.getAttribute("value");a.setAttribute("type",b),c&&(a.value=c);return b}}},tabIndex:{get:function(a){var c=a.getAttributeNode("tabIndex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}}},propFix:{},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);c=i&&f.propFix[c]||c,h=f.propHooks[c];return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==b?g:a[c]},propHooks:{}}),f.support.getSetAttribute||(f.attrFix=f.extend(f.attrFix,{"for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder"}),v=f.attrHooks.name=f.attrHooks.value=f.valHooks.button={get:function(a,c){var d;if(c==="value"&&!f.nodeName(a,"button"))return a.getAttribute(c);d=a.getAttributeNode(c);return d&&d.specified?d.nodeValue:b},set:function(a,b,c){var d=a.getAttributeNode(c);if(d){d.nodeValue=b;return b}}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var w=Object.prototype.hasOwnProperty,x=/\.(.*)$/,y=/^(?:textarea|input|select)$/i,z=/\./g,A=/ /g,B=/[^\w\s.|`]/g,C=function(a){return a.replace(B,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=D;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=D);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),C).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},J=function J(a){var c=a.target,d,e;if(!!y.test(c.nodeName)&&!c.readOnly){d=f._data(c,"_change_data"),e=I(c),(a.type!=="focusout"||c.type!=="radio")&&f._data(c,"_change_data",e);if(d===b||e===d)return;if(d!=null||e)a.type="change",a.liveFired=b,f.event.trigger(a,arguments[1],c)}};f.event.special.change={filters:{focusout:J,beforedeactivate:J,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&J.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&J.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",I(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in H)f.event.add(this,c+".specialChange",H[c]);return y.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return y.test(this.nodeName)}},H=f.event.special.change.filters,H.focus=H.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){return a.nodeName.toLowerCase()==="input"&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

    ";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
    ";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g0)for(h=g;h0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=T.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a=="string")return f.inArray(this[0],a?f(a):this.parent().children());return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(V(c[0])||V(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=S.call(arguments);O.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!U[a]?f.unique(e):e,(this.length>1||Q.test(d))&&P.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var X=/ jQuery\d+="(?:\d+|null)"/g,Y=/^\s+/,Z=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,$=/<([\w:]+)/,_=/",""],legend:[1,"
    ","
    "],thead:[1,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]};be.optgroup=be.option,be.tbody=be.tfoot=be.colgroup=be.caption=be.thead,be.th=be.td,f.support.htmlSerialize||(be._default=[1,"div
    ","
    "]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(X,""):null;if(typeof a=="string"&&!bb.test(a)&&(f.support.leadingWhitespace||!Y.test(a))&&!be[($.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Z,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bh(a,d),e=bi(a),g=bi(d);for(h=0;e[h];++h)bh(e[h],g[h])}if(b){bg(a,d);if(c){e=bi(a),g=bi(d);for(h=0;e[h];++h)bg(e[h],g[h])}}return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[];for(var i=0,j;(j=a[i])!=null;i++){typeof j=="number"&&(j+="");if(!j)continue;if(typeof j=="string")if(!ba.test(j))j=b.createTextNode(j);else{j=j.replace(Z,"<$1>");var k=($.exec(j)||["",""])[1].toLowerCase(),l=be[k]||be._default,m=l[0],n=b.createElement("div");n.innerHTML=l[1]+j+l[2];while(m--)n=n.lastChild;if(!f.support.tbody){var o=_.test(j),p=k==="table"&&!o?n.firstChild&&n.firstChild.childNodes:l[1]===""&&!o?n.childNodes:[];for(var q=p.length-1;q>=0;--q)f.nodeName(p[q],"tbody")&&!p[q].childNodes.length&&p[q].parentNode.removeChild(p[q])}!f.support.leadingWhitespace&&Y.test(j)&&n.insertBefore(b.createTextNode(Y.exec(j)[0]),n.firstChild),j=n.childNodes}var r;if(!f.support.appendChecked)if(j[0]&&typeof (r=j.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bn.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle;c.zoom=1;var e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.filter=bm.test(g)?g.replace(bm,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bx(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(by=function(a,c){var d,e,g;c=c.replace(bp,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bz=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bq.test(d)&&br.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bx=by||bz,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV;try{bU=e.href}catch(bW){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
    ").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?f.extend(!0,a,f.ajaxSettings,b):(b=a,a=f.extend(!0,f.ajaxSettings,b));for(var c in{context:1,url:1})c in b?a[c]=b[c]:c in f.ajaxSettings&&(a[c]=f.ajaxSettings[c]);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML}},ajaxPrefilter:bX(bS),ajaxTransport:bX(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a?4:0;var o,r,u,w=l?b$(d,v,l):b,x,y;if(a>=200&&a<300||a===304){if(d.ifModified){if(x=v.getResponseHeader("Last-Modified"))f.lastModified[k]=x;if(y=v.getResponseHeader("Etag"))f.etag[k]=y}if(a===304)c="notmodified",o=!0;else try{r=b_(d,w),c="success",o=!0}catch(z){c="parsererror",u=z}}else{u=c;if(!c||a)c="error",a<0&&(a=0)}v.status=a,v.statusText=c,o?h.resolveWith(e,[r,c,v]):h.rejectWith(e,[v,c,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,c]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bY(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", */*; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bY(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){status<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bZ(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var ca=f.now(),cb=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+ca++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cb.test(b.url)||e&&cb.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cb,l),b.url===j&&(e&&(k=k.replace(cb,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cc=a.ActiveXObject?function(){for(var a in ce)ce[a](0,1)}:!1,cd=0,ce;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&cf()||cg()}:cf,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cc&&delete ce[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cd,cc&&(ce||(ce={},f(a).unload(cc)),ce[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ch={},ci,cj,ck=/^(?:toggle|show|hide)$/,cl=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cm,cn=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],co,cp=a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cs("show",3),a,b,c);for(var g=0,h=this.length;g=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a=f.timers,b=a.length;while(b--)a[b]()||a.splice(b,1);a.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cm),cm=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit:a.elem[a.prop]=a.now}}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cu=/^t(?:able|d|h)$/i,cv=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cw(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);f.offset.initialize();var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.offset.supportsFixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.offset.doesNotAddBorder&&(!f.offset.doesAddBorderForTableAndCells||!cu.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.offset.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.offset.supportsFixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={initialize:function(){var a=c.body,b=c.createElement("div"),d,e,g,h,i=parseFloat(f.css(a,"marginTop"))||0,j="
    ";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cv.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cv.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cw(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cw(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){return this[0]?parseFloat(f.css(this[0],d,"padding")):null},f.fn["outer"+c]=function(a){return this[0]?parseFloat(f.css(this[0],d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c];return e.document.compatMode==="CSS1Compat"&&g||e.document.body["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var h=f.css(e,d),i=parseFloat(h);return f.isNaN(i)?h:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window); \ No newline at end of file From 4f03c141346b1928995d0bf12e97684a10967814 Mon Sep 17 00:00:00 2001 From: ovclas Date: Thu, 12 May 2011 00:36:13 +0000 Subject: [PATCH 0069/1372] #19705602 session, trackback, poll module refactoring, DB Column select specify git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8364 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/poll/poll.model.php | 10 ++++++---- modules/session/session.model.php | 3 ++- modules/trackback/trackback.model.php | 5 +++-- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/modules/poll/poll.model.php b/modules/poll/poll.model.php index a554d507a..c4335fde0 100644 --- a/modules/poll/poll.model.php +++ b/modules/poll/poll.model.php @@ -35,17 +35,18 @@ * Return the result after checking if the poll has responses **/ function getPollHtml($poll_srl, $style = '', $skin = 'default') { - $args->poll_srl = $poll_srl; // Get the information related to the survey - $output = executeQuery('poll.getPoll', $args); + $columnList = array('poll_count', 'stop_date'); + $output = executeQuery('poll.getPoll', $args, $columnList); if(!$output->data) return ''; $poll->style = $style; $poll->poll_count = (int)$output->data->poll_count; $poll->stop_date = $output->data->stop_date; - $output = executeQuery('poll.getPollTitle', $args); + $columnList = array('poll_index_srl', 'title', 'checkcount', 'poll_count'); + $output = executeQuery('poll.getPollTitle', $args, $columnList); if(!$output->data) return; if(!is_array($output->data)) $output->data = array($output->data); foreach($output->data as $key => $val) { @@ -90,7 +91,8 @@ $poll->poll_count = (int)$output->data->poll_count; $poll->stop_date = $output->data->stop_date; - $output = executeQuery('poll.getPollTitle', $args); + $columnList = array('poll_index_srl', 'checkcount', 'poll_count'); + $output = executeQuery('poll.getPollTitle', $args, $columnList); if(!$output->data) return; if(!is_array($output->data)) $output->data = array($output->data); foreach($output->data as $key => $val) { diff --git a/modules/session/session.model.php b/modules/session/session.model.php index 792b6ff4f..4a8d07d25 100644 --- a/modules/session/session.model.php +++ b/modules/session/session.model.php @@ -21,7 +21,8 @@ if(!$session_key || !$this->session_started) return; $args->session_key = $session_key; - $output = executeQuery('session.getSession', $args); + $columnList = array('session_key', 'cur_mid', 'val'); + $output = executeQuery('session.getSession', $args, $columnList); // Confirm there is a table created if read error occurs if(!$output->toBool()) { $oDB = &DB::getInstance(); diff --git a/modules/trackback/trackback.model.php b/modules/trackback/trackback.model.php index 8c2311e54..16d4e570c 100644 --- a/modules/trackback/trackback.model.php +++ b/modules/trackback/trackback.model.php @@ -16,9 +16,10 @@ /** * @brief Wanted a trackback information **/ - function getTrackback($trackback_srl) { + function getTrackback($trackback_srl, $columnList = array()) { $args->trackback_srl = $trackback_srl; - return executeQuery('trackback.getTrackback', $args); + $output = executeQuery('trackback.getTrackback', $args, $columnList); + return $output; } /** From 9f1c561955223993f5740799b9ca762f675ac053 Mon Sep 17 00:00:00 2001 From: taggon Date: Thu, 12 May 2011 00:46:49 +0000 Subject: [PATCH 0070/1372] #19659920 jQueryUI is updated to ver 1.8.12 git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8365 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/js/plugins/ui/jquery-ui.css | 214 ++-- common/js/plugins/ui/jquery-ui.packed.js | 1127 +++++++++++++++------- 2 files changed, 924 insertions(+), 417 deletions(-) diff --git a/common/js/plugins/ui/jquery-ui.css b/common/js/plugins/ui/jquery-ui.css index a5e31ab44..c85aabaec 100644 --- a/common/js/plugins/ui/jquery-ui.css +++ b/common/js/plugins/ui/jquery-ui.css @@ -1,13 +1,17 @@ /* -* jQuery UI CSS Framework -* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) -* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. -*/ + * jQuery UI CSS Framework 1.8.12 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + */ /* Layout helpers ----------------------------------*/ .ui-helper-hidden { display: none; } -.ui-helper-hidden-accessible { position: absolute; left: -99999999px; } +.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); } .ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } .ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } .ui-helper-clearfix { display: inline-block; } @@ -38,11 +42,16 @@ /* -* jQuery UI CSS Framework -* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) -* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. -* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana,Arial,sans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px -*/ + * jQuery UI CSS Framework 1.8.12 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + * + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana,Arial,sans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px + */ /* Component containers @@ -57,24 +66,24 @@ /* Interaction states ----------------------------------*/ -.ui-state-default, .ui-widget-content .ui-state-default { border: 1px solid #d3d3d3; background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #555555; } +.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3; background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #555555; } .ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; } -.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus { border: 1px solid #999999; background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; } +.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999; background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; } .ui-state-hover a, .ui-state-hover a:hover { color: #212121; text-decoration: none; } -.ui-state-active, .ui-widget-content .ui-state-active { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; } +.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; } .ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; } .ui-widget :active { outline: none; } /* Interaction Cues ----------------------------------*/ -.ui-state-highlight, .ui-widget-content .ui-state-highlight {border: 1px solid #fcefa1; background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x; color: #363636; } -.ui-state-highlight a, .ui-widget-content .ui-state-highlight a { color: #363636; } -.ui-state-error, .ui-widget-content .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; } -.ui-state-error a, .ui-widget-content .ui-state-error a { color: #cd0a0a; } -.ui-state-error-text, .ui-widget-content .ui-state-error-text { color: #cd0a0a; } -.ui-priority-primary, .ui-widget-content .ui-priority-primary { font-weight: bold; } -.ui-priority-secondary, .ui-widget-content .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } -.ui-state-disabled, .ui-widget-content .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } +.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1; background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x; color: #363636; } +.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; } +.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; } +.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; } +.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; } +.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } +.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } +.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } /* Icons ----------------------------------*/ @@ -283,10 +292,22 @@ /* Overlays */ .ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); } -.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }/* Resizable -----------------------------------*/ +.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }/* + * jQuery UI Resizable 1.8.12 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Resizable#theming + */ .ui-resizable { position: relative;} -.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;} +.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block; + /* http://bugs.jqueryui.com/ticket/7233 + - Resizable: resizable handles fail to work in IE if transparent and content overlaps + */ + background-image:url(data:); +} .ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } .ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; } .ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; } @@ -295,8 +316,27 @@ .ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } .ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } .ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } -.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/* Accordion -----------------------------------*/ +.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/* + * jQuery UI Selectable 1.8.12 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Selectable#theming + */ +.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; } +/* + * jQuery UI Accordion 1.8.12 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Accordion#theming + */ +/* IE/Win - Fix animation bug - #4615 */ +.ui-accordion { width: 100%; } .ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; } .ui-accordion .ui-accordion-li-fix { display: inline; } .ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; } @@ -304,21 +344,36 @@ .ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; } .ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } .ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; } -.ui-accordion .ui-accordion-content-active { display: block; }/* Autocomplete -----------------------------------*/ +.ui-accordion .ui-accordion-content-active { display: block; } +/* + * jQuery UI Autocomplete 1.8.12 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Autocomplete#theming + */ .ui-autocomplete { position: absolute; cursor: default; } -.ui-autocomplete-loading { background: white url('images/ui-anim_basic_16x16.gif') right center no-repeat; } /* workarounds */ * html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */ -/* Menu -----------------------------------*/ +/* + * jQuery UI Menu 1.8.12 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Menu#theming + */ .ui-menu { list-style:none; padding: 2px; margin: 0; display:block; + float: left; } .ui-menu .ui-menu { margin-top: -3px; @@ -326,6 +381,9 @@ .ui-menu .ui-menu-item { margin:0; padding: 0; + zoom: 1; + float: left; + clear: left; width: 100%; } .ui-menu .ui-menu-item a { @@ -337,11 +395,18 @@ } .ui-menu .ui-menu-item a.ui-state-hover, .ui-menu .ui-menu-item a.ui-state-active { + font-weight: normal; margin: -1px; } -/* Button -----------------------------------*/ - +/* + * jQuery UI Button 1.8.12 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Button#theming + */ .ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */ .ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */ button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */ @@ -352,15 +417,17 @@ button.ui-button-icons-only { width: 3.7em; } .ui-button .ui-button-text { display: block; line-height: 1.4; } .ui-button-text-only .ui-button-text { padding: .4em 1em; } .ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; } -.ui-button-text-icon .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; } +.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; } +.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; } .ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; } /* no icon support for input elements, provide padding by default */ input.ui-button { padding: .4em 1em; } /*button icon element(s) */ -.ui-button-icon-only .ui-icon, .ui-button-text-icon .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; } +.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; } .ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; } -.ui-button-text-icon .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; } +.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; } +.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } /*button sets*/ @@ -369,26 +436,36 @@ input.ui-button { padding: .4em 1em; } /* workarounds */ button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */ - - - - - -/* Dialog -----------------------------------*/ +/* + * jQuery UI Dialog 1.8.12 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Dialog#theming + */ .ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; } -.ui-dialog .ui-dialog-titlebar { padding: .5em 1em .3em; position: relative; } -.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .2em 0; } +.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative; } +.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } .ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; } .ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; } .ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; } -.ui-dialog .ui-dialog-content { border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; } +.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; } .ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; } -.ui-dialog .ui-dialog-buttonpane button { float: right; margin: .5em .4em .5em 0; cursor: pointer; padding: .2em .6em .3em .6em; line-height: 1.4em; width:auto; overflow:visible; } +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; } +.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; } .ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } .ui-draggable .ui-dialog-titlebar { cursor: move; } -/* Slider -----------------------------------*/ +/* + * jQuery UI Slider 1.8.12 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Slider#theming + */ .ui-slider { position: relative; text-align: left; } .ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; } .ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; } @@ -403,8 +480,15 @@ button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra pad .ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } .ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } .ui-slider-vertical .ui-slider-range-min { bottom: 0; } -.ui-slider-vertical .ui-slider-range-max { top: 0; }/* Tabs -----------------------------------*/ +.ui-slider-vertical .ui-slider-range-max { top: 0; }/* + * jQuery UI Tabs 1.8.12 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Tabs#theming + */ .ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ .ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; } .ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; } @@ -412,11 +496,18 @@ button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra pad .ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; } .ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; } .ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ -.ui-tabs .ui-tabs-panel { display: block; border: 0; padding: 1em 1.4em; background: none; } +.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; } .ui-tabs .ui-tabs-hide { display: none !important; } -/* Datepicker -----------------------------------*/ -.ui-datepicker { width: 17em; padding: .2em .2em 0; } +/* + * jQuery UI Datepicker 1.8.12 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Datepicker#theming + */ +.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; } .ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; } .ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } .ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } @@ -474,7 +565,14 @@ button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra pad left: -4px; /*must have*/ width: 200px; /*must have*/ height: 200px; /*must have*/ -}/* Progressbar -----------------------------------*/ +}/* + * jQuery UI Progressbar 1.8.12 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Progressbar#theming + */ .ui-progressbar { height:2em; text-align: left; } .ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; } \ No newline at end of file diff --git a/common/js/plugins/ui/jquery-ui.packed.js b/common/js/plugins/ui/jquery-ui.packed.js index c1df6b8bd..1b1c88f30 100644 --- a/common/js/plugins/ui/jquery-ui.packed.js +++ b/common/js/plugins/ui/jquery-ui.packed.js @@ -1,374 +1,783 @@ -/*! - * jQuery UI 1.8 - * - * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. - * - * http://docs.jquery.com/UI - */ /* - * jQuery UI 1.8 +/*! + * jQuery UI 1.8.12 * - * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license * * http://docs.jquery.com/UI */ -jQuery.ui||(function(a){a.ui={version:"1.8",plugin:{add:function(c,d,f){var e=a.ui[c].prototype;for(var b in f){e.plugins[b]=e.plugins[b]||[];e.plugins[b].push([d,f[b]])}},call:function(b,d,c){var f=b.plugins[d];if(!f||!b.element[0].parentNode){return}for(var e=0;e0){return true}e[b]=1;d=(e[b]>0);e[b]=0;return d},isOverAxis:function(c,b,d){return(c>b)&&(c<(b+d))},isOver:function(g,c,f,e,b,d){return a.ui.isOverAxis(g,f,b)&&a.ui.isOverAxis(c,e,d)},keyCode:{BACKSPACE:8,CAPS_LOCK:20,COMMA:188,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38}};a.fn.extend({_focus:a.fn.focus,focus:function(b,c){return typeof b==="number"?this.each(function(){var d=this;setTimeout(function(){a(d).focus();(c&&c.call(d))},b)}):this._focus.apply(this,arguments)},enableSelection:function(){return this.attr("unselectable","off").css("MozUserSelect","").unbind("selectstart.ui")},disableSelection:function(){return this.attr("unselectable","on").css("MozUserSelect","none").bind("selectstart.ui",function(){return false})},scrollParent:function(){var b;if((a.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){b=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(a.curCSS(this,"position",1))&&(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}else{b=this.parents().filter(function(){return(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!b.length?a(document):b},zIndex:function(e){if(e!==undefined){return this.css("zIndex",e)}if(this.length){var c=a(this[0]),b,d;while(c.length&&c[0]!==document){b=c.css("position");if(b=="absolute"||b=="relative"||b=="fixed"){d=parseInt(c.css("zIndex"));if(!isNaN(d)&&d!=0){return d}}c=c.parent()}}return 0}});a.extend(a.expr[":"],{data:function(d,c,b){return !!a.data(d,b[3])},focusable:function(c){var d=c.nodeName.toLowerCase(),b=a.attr(c,"tabindex");return(/input|select|textarea|button|object/.test(d)?!c.disabled:"a"==d||"area"==d?c.href||!isNaN(b):!isNaN(b))&&!a(c)["area"==d?"parents":"closest"](":hidden").length},tabbable:function(c){var b=a.attr(c,"tabindex");return(isNaN(b)||b>=0)&&a(c).is(":focusable")}})})(jQuery);;/*! - * jQuery UI Widget 1.8 - * - * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. - * - * http://docs.jquery.com/UI/Widget - */ /* - * jQuery UI Widget 1.8 +(function(c,j){function k(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.12",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106, +NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this, +"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position"); +if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"),10);if(!isNaN(b)&&b!==0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind((c.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,l,m){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(l)g-=parseFloat(c.curCSS(f, +"border"+this+"Width",true))||0;if(m)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight,outerWidth:c.fn.outerWidth,outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c(this).css(h,d(this,f)+"px")})};c.fn["outer"+b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c(this).css(h, +d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){var b=a.nodeName.toLowerCase(),d=c.attr(a,"tabindex");if("area"===b){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&k(a)}return(/input|select|textarea|button|object/.test(b)?!a.disabled:"a"==b?a.href||!isNaN(d):!isNaN(d))&&k(a)},tabbable:function(a){var b=c.attr(a,"tabindex");return(isNaN(b)||b>=0)&&c(a).is(":focusable")}}); +c(function(){var a=document.body,b=a.appendChild(b=document.createElement("div"));c.extend(b.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.offsetHeight===100;c.support.selectstart="onselectstart"in b;a.removeChild(b).style.display="none"});c.extend(c.ui,{plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e=0;e0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a=this.options.distance)},_mouseDelayMet:function(b){return this.mouseDelayMet},_mouseStart:function(b){},_mouseDrag:function(b){},_mouseStop:function(b){},_mouseCapture:function(b){return true}})})(jQuery);;/* - * jQuery UI Position 1.8 - * - * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. - * - * http://docs.jquery.com/UI/Position - */ (function(f){f.ui=f.ui||{};var c=/left|center|right/,e="center",d=/top|center|bottom/,g="center",a=f.fn.position,b=f.fn.offset;f.fn.position=function(i){if(!i||!i.of){return a.apply(this,arguments)}i=f.extend({},i);var l=f(i.of),n=(i.collision||"flip").split(" "),m=i.offset?i.offset.split(" "):[0,0],k,h,j;if(i.of.nodeType===9){k=l.width();h=l.height();j={top:0,left:0}}else{if(i.of.scrollTo&&i.of.document){k=l.width();h=l.height();j={top:l.scrollTop(),left:l.scrollLeft()}}else{if(i.of.preventDefault){i.at="left top";k=h=0;j={top:i.of.pageY,left:i.of.pageX}}else{k=l.outerWidth();h=l.outerHeight();j=l.offset()}}}f.each(["my","at"],function(){var o=(i[this]||"").split(" ");if(o.length===1){o=c.test(o[0])?o.concat([g]):d.test(o[0])?[e].concat(o):[e,g]}o[0]=c.test(o[0])?o[0]:e;o[1]=d.test(o[1])?o[1]:g;i[this]=o});if(n.length===1){n[1]=n[0]}m[0]=parseInt(m[0],10)||0;if(m.length===1){m[1]=m[0]}m[1]=parseInt(m[1],10)||0;if(i.at[0]==="right"){j.left+=k}else{if(i.at[0]===e){j.left+=k/2}}if(i.at[1]==="bottom"){j.top+=h}else{if(i.at[1]===g){j.top+=h/2}}j.left+=m[0];j.top+=m[1];return this.each(function(){var r=f(this),q=r.outerWidth(),p=r.outerHeight(),o=f.extend({},j);if(i.my[0]==="right"){o.left-=q}else{if(i.my[0]===e){o.left-=q/2}}if(i.my[1]==="bottom"){o.top-=p}else{if(i.my[1]===g){o.top-=p/2}}f.each(["left","top"],function(t,s){if(f.ui.position[n[t]]){f.ui.position[n[t]][s](o,{targetWidth:k,targetHeight:h,elemWidth:q,elemHeight:p,offset:m,my:i.my,at:i.at})}});if(f.fn.bgiframe){r.bgiframe()}r.offset(f.extend(o,{using:i.using}))})};f.ui.position={fit:{left:function(h,i){var k=f(window),j=h.left+i.elemWidth-k.width()-k.scrollLeft();h.left=j>0?h.left-j:Math.max(0,h.left)},top:function(h,i){var k=f(window),j=h.top+i.elemHeight-k.height()-k.scrollTop();h.top=j>0?h.top-j:Math.max(0,h.top)}},flip:{left:function(i,j){if(j.at[0]==="center"){return}var l=f(window),k=i.left+j.elemWidth-l.width()-l.scrollLeft(),h=j.my[0]==="left"?-j.elemWidth:j.my[0]==="right"?j.elemWidth:0,m=-2*j.offset[0];i.left+=i.left<0?h+j.targetWidth+m:k>0?h-j.targetWidth+m:0},top:function(i,k){if(k.at[1]==="center"){return}var m=f(window),l=i.top+k.elemHeight-m.height()-m.scrollTop(),h=k.my[1]==="top"?-k.elemHeight:k.my[1]==="bottom"?k.elemHeight:0,j=k.at[1]==="top"?k.targetHeight:-k.targetHeight,n=-2*k.offset[1];i.top+=i.top<0?h+k.targetHeight+n:l>0?h+j+n:0}}};if(!f.offset.setOffset){f.offset.setOffset=function(l,i){if(/static/.test(f.curCSS(l,"position"))){l.style.position="relative"}var k=f(l),n=k.offset(),h=parseInt(f.curCSS(l,"top",true),10)||0,m=parseInt(f.curCSS(l,"left",true),10)||0,j={top:(i.top-n.top)+h,left:(i.left-n.left)+m};if("using" in i){i.using.call(l,j)}else{k.css(j)}};f.fn.offset=function(h){var i=this[0];if(!i||!i.ownerDocument){return null}if(h){return this.each(function(){f.offset.setOffset(this,h)})}return b.call(this)}}}(jQuery));;/* - * jQuery UI Draggable 1.8 - * - * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. - * - * http://docs.jquery.com/UI/Draggables - * - * Depends: - * jquery.ui.core.js - * jquery.ui.mouse.js - * jquery.ui.widget.js - */ (function(a){a.widget("ui.draggable",a.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:true,appendTo:"parent",axis:false,connectToSortable:false,containment:false,cursor:"auto",cursorAt:false,grid:false,handle:false,helper:"original",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:false},_create:function(){if(this.options.helper=="original"&&!(/^(?:r|a|f)/).test(this.element.css("position"))){this.element[0].style.position="relative"}(this.options.addClasses&&this.element.addClass("ui-draggable"));(this.options.disabled&&this.element.addClass("ui-draggable-disabled"));this._mouseInit()},destroy:function(){if(!this.element.data("draggable")){return}this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy();return this},_mouseCapture:function(b){var c=this.options;if(this.helper||c.disabled||a(b.target).is(".ui-resizable-handle")){return false}this.handle=this._getHandle(b);if(!this.handle){return false}return true},_mouseStart:function(b){var c=this.options;this.helper=this._createHelper(b);this._cacheHelperProportions();if(a.ui.ddmanager){a.ui.ddmanager.current=this}this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.positionAbs=this.element.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};a.extend(this.offset,{click:{left:b.pageX-this.offset.left,top:b.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this.position=this._generatePosition(b);this.originalPageX=b.pageX;this.originalPageY=b.pageY;(c.cursorAt&&this._adjustOffsetFromHelper(c.cursorAt));if(c.containment){this._setContainment()}if(this._trigger("start",b)===false){this._clear();return false}this._cacheHelperProportions();if(a.ui.ddmanager&&!c.dropBehaviour){a.ui.ddmanager.prepareOffsets(this,b)}this.helper.addClass("ui-draggable-dragging");this._mouseDrag(b,true);return true},_mouseDrag:function(b,d){this.position=this._generatePosition(b);this.positionAbs=this._convertPositionTo("absolute");if(!d){var c=this._uiHash();if(this._trigger("drag",b,c)===false){this._mouseUp({});return false}this.position=c.position}if(!this.options.axis||this.options.axis!="y"){this.helper[0].style.left=this.position.left+"px"}if(!this.options.axis||this.options.axis!="x"){this.helper[0].style.top=this.position.top+"px"}if(a.ui.ddmanager){a.ui.ddmanager.drag(this,b)}return false},_mouseStop:function(c){var d=false;if(a.ui.ddmanager&&!this.options.dropBehaviour){d=a.ui.ddmanager.drop(this,c)}if(this.dropped){d=this.dropped;this.dropped=false}if(!this.element[0]||!this.element[0].parentNode){return false}if((this.options.revert=="invalid"&&!d)||(this.options.revert=="valid"&&d)||this.options.revert===true||(a.isFunction(this.options.revert)&&this.options.revert.call(this.element,d))){var b=this;a(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){if(b._trigger("stop",c)!==false){b._clear()}})}else{if(this._trigger("stop",c)!==false){this._clear()}}return false},cancel:function(){if(this.helper.is(".ui-draggable-dragging")){this._mouseUp({})}else{this._clear()}return this},_getHandle:function(b){var c=!this.options.handle||!a(this.options.handle,this.element).length?true:false;a(this.options.handle,this.element).find("*").andSelf().each(function(){if(this==b.target){c=true}});return c},_createHelper:function(c){var d=this.options;var b=a.isFunction(d.helper)?a(d.helper.apply(this.element[0],[c])):(d.helper=="clone"?this.element.clone():this.element);if(!b.parents("body").length){b.appendTo((d.appendTo=="parent"?this.element[0].parentNode:d.appendTo))}if(b[0]!=this.element[0]&&!(/(fixed|absolute)/).test(b.css("position"))){b.css("position","absolute")}return b},_adjustOffsetFromHelper:function(b){if(typeof b=="string"){b=b.split(" ")}if(a.isArray(b)){b={left:+b[0],top:+b[1]||0}}if("left" in b){this.offset.click.left=b.left+this.margins.left}if("right" in b){this.offset.click.left=this.helperProportions.width-b.right+this.margins.left}if("top" in b){this.offset.click.top=b.top+this.margins.top}if("bottom" in b){this.offset.click.top=this.helperProportions.height-b.bottom+this.margins.top}},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var b=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])){b.left+=this.scrollParent.scrollLeft();b.top+=this.scrollParent.scrollTop()}if((this.offsetParent[0]==document.body)||(this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)){b={top:0,left:0}}return{top:b.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:b.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var b=this.element.position();return{top:b.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:b.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else{return{top:0,left:0}}},_cacheMargins:function(){this.margins={left:(parseInt(this.element.css("marginLeft"),10)||0),top:(parseInt(this.element.css("marginTop"),10)||0)}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e=this.options;if(e.containment=="parent"){e.containment=this.helper[0].parentNode}if(e.containment=="document"||e.containment=="window"){this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,a(e.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a(e.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]}if(!(/^(document|window|parent)$/).test(e.containment)&&e.containment.constructor!=Array){var c=a(e.containment)[0];if(!c){return}var d=a(e.containment).offset();var b=(a(c).css("overflow")!="hidden");this.containment=[d.left+(parseInt(a(c).css("borderLeftWidth"),10)||0)+(parseInt(a(c).css("paddingLeft"),10)||0)-this.margins.left,d.top+(parseInt(a(c).css("borderTopWidth"),10)||0)+(parseInt(a(c).css("paddingTop"),10)||0)-this.margins.top,d.left+(b?Math.max(c.scrollWidth,c.offsetWidth):c.offsetWidth)-(parseInt(a(c).css("borderLeftWidth"),10)||0)-(parseInt(a(c).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,d.top+(b?Math.max(c.scrollHeight,c.offsetHeight):c.offsetHeight)-(parseInt(a(c).css("borderTopWidth"),10)||0)-(parseInt(a(c).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}else{if(e.containment.constructor==Array){this.containment=e.containment}}},_convertPositionTo:function(f,h){if(!h){h=this.position}var c=f=="absolute"?1:-1;var e=this.options,b=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,g=(/(html|body)/i).test(b[0].tagName);return{top:(h.top+this.offset.relative.top*c+this.offset.parent.top*c-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():(g?0:b.scrollTop()))*c)),left:(h.left+this.offset.relative.left*c+this.offset.parent.left*c-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():g?0:b.scrollLeft())*c))}},_generatePosition:function(e){var h=this.options,b=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,i=(/(html|body)/i).test(b[0].tagName);var d=e.pageX;var c=e.pageY;if(this.originalPosition){if(this.containment){if(e.pageX-this.offset.click.leftthis.containment[2]){d=this.containment[2]+this.offset.click.left}if(e.pageY-this.offset.click.top>this.containment[3]){c=this.containment[3]+this.offset.click.top}}if(h.grid){var g=this.originalPageY+Math.round((c-this.originalPageY)/h.grid[1])*h.grid[1];c=this.containment?(!(g-this.offset.click.topthis.containment[3])?g:(!(g-this.offset.click.topthis.containment[2])?f:(!(f-this.offset.click.left').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1000}).css(a(this).offset()).appendTo("body")})},stop:function(b,c){a("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)})}});a.ui.plugin.add("draggable","opacity",{start:function(c,d){var b=a(d.helper),e=a(this).data("draggable").options;if(b.css("opacity")){e._opacity=b.css("opacity")}b.css("opacity",e.opacity)},stop:function(b,c){var d=a(this).data("draggable").options;if(d._opacity){a(c.helper).css("opacity",d._opacity)}}});a.ui.plugin.add("draggable","scroll",{start:function(c,d){var b=a(this).data("draggable");if(b.scrollParent[0]!=document&&b.scrollParent[0].tagName!="HTML"){b.overflowOffset=b.scrollParent.offset()}},drag:function(d,e){var c=a(this).data("draggable"),f=c.options,b=false;if(c.scrollParent[0]!=document&&c.scrollParent[0].tagName!="HTML"){if(!f.axis||f.axis!="x"){if((c.overflowOffset.top+c.scrollParent[0].offsetHeight)-d.pageY=0;v--){var s=g.snapElements[v].left,n=s+g.snapElements[v].width,m=g.snapElements[v].top,A=m+g.snapElements[v].height;if(!((s-y=p&&n<=k)||(m>=p&&m<=k)||(nk))&&((e>=g&&e<=c)||(d>=g&&d<=c)||(ec));break;default:return false;break}};a.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(e,g){var b=a.ui.ddmanager.droppables[e.options.scope]||[];var f=g?g.type:null;var h=(e.currentItem||e.element).find(":data(droppable)").andSelf();droppablesLoop:for(var d=0;d').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=j.handles||(!c(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var k=this.handles.split(",");this.handles={};for(var f=0;f');if(/sw|se|ne|nw/.test(h)){g.css({zIndex:++j.zIndex})}if("se"==h){g.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[h]=".ui-resizable-"+h;this.element.append(g)}}this._renderAxis=function(p){p=p||this.element;for(var m in this.handles){if(this.handles[m].constructor==String){this.handles[m]=c(this.handles[m],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var n=c(this.handles[m],this.element),o=0;o=/sw|ne|nw|se|n|s/.test(m)?n.outerHeight():n.outerWidth();var l=["padding",/ne|nw|n/.test(m)?"Top":/se|sw|s/.test(m)?"Bottom":/^e$/.test(m)?"Right":"Left"].join("");p.css(l,o);this._proportionallyResize()}if(!c(this.handles[m]).length){continue}}};this._renderAxis(this.element);this._handles=c(".ui-resizable-handle",this.element).disableSelection();this._handles.mouseover(function(){if(!e.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}e.axis=i&&i[1]?i[1]:"se"}});if(j.autoHide){this._handles.hide();c(this.element).addClass("ui-resizable-autohide").hover(function(){c(this).removeClass("ui-resizable-autohide");e._handles.show()},function(){if(!e.resizing){c(this).addClass("ui-resizable-autohide");e._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var d=function(f){c(f).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){d(this.element);var e=this.element;e.after(this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);d(this.originalElement);return this},_mouseCapture:function(e){var f=false;for(var d in this.handles){if(c(this.handles[d])[0]==e.target){f=true}}return !this.options.disabled&&f},_mouseStart:function(f){var i=this.options,e=this.element.position(),d=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(d.is(".ui-draggable")||(/absolute/).test(d.css("position"))){d.css({position:"absolute",top:e.top,left:e.left})}if(c.browser.opera&&(/relative/).test(d.css("position"))){d.css({position:"relative",top:"auto",left:"auto"})}this._renderProxy();var j=b(this.helper.css("left")),g=b(this.helper.css("top"));if(i.containment){j+=c(i.containment).scrollLeft()||0;g+=c(i.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:j,top:g};this.size=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalSize=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalPosition={left:j,top:g};this.sizeDiff={width:d.outerWidth()-d.width(),height:d.outerHeight()-d.height()};this.originalMousePosition={left:f.pageX,top:f.pageY};this.aspectRatio=(typeof i.aspectRatio=="number")?i.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var h=c(".ui-resizable-"+this.axis).css("cursor");c("body").css("cursor",h=="auto"?this.axis+"-resize":h);d.addClass("ui-resizable-resizing");this._propagate("start",f);return true},_mouseDrag:function(d){var g=this.helper,f=this.options,l={},p=this,i=this.originalMousePosition,m=this.axis;var q=(d.pageX-i.left)||0,n=(d.pageY-i.top)||0;var h=this._change[m];if(!h){return false}var k=h.apply(this,[d,q,n]),j=c.browser.msie&&c.browser.version<7,e=this.sizeDiff;if(this._aspectRatio||d.shiftKey){k=this._updateRatio(k,d)}k=this._respectSize(k,d);this._propagate("resize",d);g.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(k);this._trigger("resize",d,this.ui());return false},_mouseStop:function(g){this.resizing=false;var h=this.options,l=this;if(this._helper){var f=this._proportionallyResizeElements,d=f.length&&(/textarea/i).test(f[0].nodeName),e=d&&c.ui.hasScroll(f[0],"left")?0:l.sizeDiff.height,j=d?0:l.sizeDiff.width;var m={width:(l.size.width-j),height:(l.size.height-e)},i=(parseInt(l.element.css("left"),10)+(l.position.left-l.originalPosition.left))||null,k=(parseInt(l.element.css("top"),10)+(l.position.top-l.originalPosition.top))||null;if(!h.animate){this.element.css(c.extend(m,{top:k,left:i}))}l.helper.height(l.size.height);l.helper.width(l.size.width);if(this._helper&&!h.animate){this._proportionallyResize()}}c("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",g);if(this._helper){this.helper.remove()}return false},_updateCache:function(d){var e=this.options;this.offset=this.helper.offset();if(a(d.left)){this.position.left=d.left}if(a(d.top)){this.position.top=d.top}if(a(d.height)){this.size.height=d.height}if(a(d.width)){this.size.width=d.width}},_updateRatio:function(g,f){var h=this.options,i=this.position,e=this.size,d=this.axis;if(g.height){g.width=(e.height*this.aspectRatio)}else{if(g.width){g.height=(e.width/this.aspectRatio)}}if(d=="sw"){g.left=i.left+(e.width-g.width);g.top=null}if(d=="nw"){g.top=i.top+(e.height-g.height);g.left=i.left+(e.width-g.width)}return g},_respectSize:function(k,f){var i=this.helper,h=this.options,q=this._aspectRatio||f.shiftKey,p=this.axis,s=a(k.width)&&h.maxWidth&&(h.maxWidthk.width),r=a(k.height)&&h.minHeight&&(h.minHeight>k.height);if(g){k.width=h.minWidth}if(r){k.height=h.minHeight}if(s){k.width=h.maxWidth}if(l){k.height=h.maxHeight}var e=this.originalPosition.left+this.originalSize.width,n=this.position.top+this.size.height;var j=/sw|nw|w/.test(p),d=/nw|ne|n/.test(p);if(g&&j){k.left=e-h.minWidth}if(s&&j){k.left=e-h.maxWidth}if(r&&d){k.top=n-h.minHeight}if(l&&d){k.top=n-h.maxHeight}var m=!k.width&&!k.height;if(m&&!k.left&&k.top){k.top=null}else{if(m&&!k.top&&k.left){k.left=null}}return k},_proportionallyResize:function(){var j=this.options;if(!this._proportionallyResizeElements.length){return}var f=this.helper||this.element;for(var e=0;e');var d=c.browser.msie&&c.browser.version<7,f=(d?1:0),g=(d?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+g,height:this.element.outerHeight()+g,position:"absolute",left:this.elementOffset.left-f+"px",top:this.elementOffset.top-f+"px",zIndex:++h.zIndex});this.helper.appendTo("body").disableSelection()}else{this.helper=this.element}},_change:{e:function(f,e,d){return{width:this.originalSize.width+e}},w:function(g,e,d){var i=this.options,f=this.originalSize,h=this.originalPosition;return{left:h.left+e,width:f.width-e}},n:function(g,e,d){var i=this.options,f=this.originalSize,h=this.originalPosition;return{top:h.top+d,height:f.height-d}},s:function(f,e,d){return{height:this.originalSize.height+d}},se:function(f,e,d){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[f,e,d]))},sw:function(f,e,d){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[f,e,d]))},ne:function(f,e,d){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[f,e,d]))},nw:function(f,e,d){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[f,e,d]))}},_propagate:function(e,d){c.ui.plugin.call(this,e,[d,this.ui()]);(e!="resize"&&this._trigger(e,d,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});c.extend(c.ui.resizable,{version:"1.8"});c.ui.plugin.add("resizable","alsoResize",{start:function(e,f){var d=c(this).data("resizable"),h=d.options;var g=function(i){c(i).each(function(){c(this).data("resizable-alsoresize",{width:parseInt(c(this).width(),10),height:parseInt(c(this).height(),10),left:parseInt(c(this).css("left"),10),top:parseInt(c(this).css("top"),10)})})};if(typeof(h.alsoResize)=="object"&&!h.alsoResize.parentNode){if(h.alsoResize.length){h.alsoResize=h.alsoResize[0];g(h.alsoResize)}else{c.each(h.alsoResize,function(i,j){g(i)})}}else{g(h.alsoResize)}},resize:function(f,h){var e=c(this).data("resizable"),i=e.options,g=e.originalSize,k=e.originalPosition;var j={height:(e.size.height-g.height)||0,width:(e.size.width-g.width)||0,top:(e.position.top-k.top)||0,left:(e.position.left-k.left)||0},d=function(l,m){c(l).each(function(){var p=c(this),q=c(this).data("resizable-alsoresize"),o={},n=m&&m.length?m:["width","height","top","left"];c.each(n||["width","height","top","left"],function(r,t){var s=(q[t]||0)+(j[t]||0);if(s&&s>=0){o[t]=s||null}});if(/relative/.test(p.css("position"))&&c.browser.opera){e._revertToRelativePosition=true;p.css({position:"absolute",top:"auto",left:"auto"})}p.css(o)})};if(typeof(i.alsoResize)=="object"&&!i.alsoResize.nodeType){c.each(i.alsoResize,function(l,m){d(l,m)})}else{d(i.alsoResize)}},stop:function(e,f){var d=c(this).data("resizable");if(d._revertToRelativePosition&&c.browser.opera){d._revertToRelativePosition=false;el.css({position:"relative"})}c(this).removeData("resizable-alsoresize-start")}});c.ui.plugin.add("resizable","animate",{stop:function(h,m){var n=c(this).data("resizable"),i=n.options;var g=n._proportionallyResizeElements,d=g.length&&(/textarea/i).test(g[0].nodeName),e=d&&c.ui.hasScroll(g[0],"left")?0:n.sizeDiff.height,k=d?0:n.sizeDiff.width;var f={width:(n.size.width-k),height:(n.size.height-e)},j=(parseInt(n.element.css("left"),10)+(n.position.left-n.originalPosition.left))||null,l=(parseInt(n.element.css("top"),10)+(n.position.top-n.originalPosition.top))||null;n.element.animate(c.extend(f,l&&j?{top:l,left:j}:{}),{duration:i.animateDuration,easing:i.animateEasing,step:function(){var o={width:parseInt(n.element.css("width"),10),height:parseInt(n.element.css("height"),10),top:parseInt(n.element.css("top"),10),left:parseInt(n.element.css("left"),10)};if(g&&g.length){c(g[0]).css({width:o.width,height:o.height})}n._updateCache(o);n._propagate("resize",h)}})}});c.ui.plugin.add("resizable","containment",{start:function(e,q){var s=c(this).data("resizable"),i=s.options,k=s.element;var f=i.containment,j=(f instanceof c)?f.get(0):(/parent/.test(f))?k.parent().get(0):f;if(!j){return}s.containerElement=c(j);if(/document/.test(f)||f==document){s.containerOffset={left:0,top:0};s.containerPosition={left:0,top:0};s.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var m=c(j),h=[];c(["Top","Right","Left","Bottom"]).each(function(p,o){h[p]=b(m.css("padding"+o))});s.containerOffset=m.offset();s.containerPosition=m.position();s.containerSize={height:(m.innerHeight()-h[3]),width:(m.innerWidth()-h[1])};var n=s.containerOffset,d=s.containerSize.height,l=s.containerSize.width,g=(c.ui.hasScroll(j,"left")?j.scrollWidth:l),r=(c.ui.hasScroll(j)?j.scrollHeight:d);s.parentData={element:j,left:n.left,top:n.top,width:g,height:r}}},resize:function(f,p){var s=c(this).data("resizable"),h=s.options,e=s.containerSize,n=s.containerOffset,l=s.size,m=s.position,q=s._aspectRatio||f.shiftKey,d={top:0,left:0},g=s.containerElement;if(g[0]!=document&&(/static/).test(g.css("position"))){d=n}if(m.left<(s._helper?n.left:0)){s.size.width=s.size.width+(s._helper?(s.position.left-n.left):(s.position.left-d.left));if(q){s.size.height=s.size.width/h.aspectRatio}s.position.left=h.helper?n.left:0}if(m.top<(s._helper?n.top:0)){s.size.height=s.size.height+(s._helper?(s.position.top-n.top):s.position.top);if(q){s.size.width=s.size.height*h.aspectRatio}s.position.top=s._helper?n.top:0}s.offset.left=s.parentData.left+s.position.left;s.offset.top=s.parentData.top+s.position.top;var k=Math.abs((s._helper?s.offset.left-d.left:(s.offset.left-d.left))+s.sizeDiff.width),r=Math.abs((s._helper?s.offset.top-d.top:(s.offset.top-n.top))+s.sizeDiff.height);var j=s.containerElement.get(0)==s.element.parent().get(0),i=/relative|absolute/.test(s.containerElement.css("position"));if(j&&i){k-=s.parentData.left}if(k+s.size.width>=s.parentData.width){s.size.width=s.parentData.width-k;if(q){s.size.height=s.size.width/s.aspectRatio}}if(r+s.size.height>=s.parentData.height){s.size.height=s.parentData.height-r;if(q){s.size.width=s.size.height*s.aspectRatio}}},stop:function(e,m){var p=c(this).data("resizable"),f=p.options,k=p.position,l=p.containerOffset,d=p.containerPosition,g=p.containerElement;var i=c(p.helper),q=i.offset(),n=i.outerWidth()-p.sizeDiff.width,j=i.outerHeight()-p.sizeDiff.height;if(p._helper&&!f.animate&&(/relative/).test(g.css("position"))){c(this).css({left:q.left-d.left-l.left,width:n,height:j})}if(p._helper&&!f.animate&&(/static/).test(g.css("position"))){c(this).css({left:q.left-d.left-l.left,width:n,height:j})}}});c.ui.plugin.add("resizable","ghost",{start:function(f,g){var d=c(this).data("resizable"),h=d.options,e=d.size;d.ghost=d.originalElement.clone();d.ghost.css({opacity:0.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof h.ghost=="string"?h.ghost:"");d.ghost.appendTo(d.helper)},resize:function(e,f){var d=c(this).data("resizable"),g=d.options;if(d.ghost){d.ghost.css({position:"relative",height:d.size.height,width:d.size.width})}},stop:function(e,f){var d=c(this).data("resizable"),g=d.options;if(d.ghost&&d.helper){d.helper.get(0).removeChild(d.ghost.get(0))}}});c.ui.plugin.add("resizable","grid",{resize:function(d,l){var n=c(this).data("resizable"),g=n.options,j=n.size,h=n.originalSize,i=n.originalPosition,m=n.axis,k=g._aspectRatio||d.shiftKey;g.grid=typeof g.grid=="number"?[g.grid,g.grid]:g.grid;var f=Math.round((j.width-h.width)/(g.grid[0]||1))*(g.grid[0]||1),e=Math.round((j.height-h.height)/(g.grid[1]||1))*(g.grid[1]||1);if(/^(se|s|e)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e}else{if(/^(ne)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e;n.position.top=i.top-e}else{if(/^(sw)$/.test(m)){n.size.width=h.width+f;n.size.height=h.height+e;n.position.left=i.left-f}else{n.size.width=h.width+f;n.size.height=h.height+e;n.position.top=i.top-e;n.position.left=i.left-f}}}}});var b=function(d){return parseInt(d,10)||0};var a=function(d){return !isNaN(parseInt(d,10))}})(jQuery);;/* - * jQuery UI Selectable 1.8 - * - * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. - * - * http://docs.jquery.com/UI/Selectables - * - * Depends: - * jquery.ui.core.js - * jquery.ui.mouse.js - * jquery.ui.widget.js - */ (function(a){a.widget("ui.selectable",a.ui.mouse,{options:{appendTo:"body",autoRefresh:true,distance:0,filter:"*",tolerance:"touch"},_create:function(){var b=this;this.element.addClass("ui-selectable");this.dragged=false;var c;this.refresh=function(){c=a(b.options.filter,b.element[0]);c.each(function(){var d=a(this);var e=d.offset();a.data(this,"selectable-item",{element:this,$element:d,left:e.left,top:e.top,right:e.left+d.outerWidth(),bottom:e.top+d.outerHeight(),startselected:false,selected:d.hasClass("ui-selected"),selecting:d.hasClass("ui-selecting"),unselecting:d.hasClass("ui-unselecting")})})};this.refresh();this.selectees=c.addClass("ui-selectee");this._mouseInit();this.helper=a(document.createElement("div")).css({border:"1px dotted black"}).addClass("ui-selectable-helper")},destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item");this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable");this._mouseDestroy();return this},_mouseStart:function(d){var b=this;this.opos=[d.pageX,d.pageY];if(this.options.disabled){return}var c=this.options;this.selectees=a(c.filter,this.element[0]);this._trigger("start",d);a(c.appendTo).append(this.helper);this.helper.css({"z-index":100,position:"absolute",left:d.clientX,top:d.clientY,width:0,height:0});if(c.autoRefresh){this.refresh()}this.selectees.filter(".ui-selected").each(function(){var e=a.data(this,"selectable-item");e.startselected=true;if(!d.metaKey){e.$element.removeClass("ui-selected");e.selected=false;e.$element.addClass("ui-unselecting");e.unselecting=true;b._trigger("unselecting",d,{unselecting:e.element})}});a(d.target).parents().andSelf().each(function(){var e=a.data(this,"selectable-item");if(e){e.$element.removeClass("ui-unselecting").addClass("ui-selecting");e.unselecting=false;e.selecting=true;e.selected=true;b._trigger("selecting",d,{selecting:e.element});return false}})},_mouseDrag:function(i){var c=this;this.dragged=true;if(this.options.disabled){return}var e=this.options;var d=this.opos[0],h=this.opos[1],b=i.pageX,g=i.pageY;if(d>b){var f=b;b=d;d=f}if(h>g){var f=g;g=h;h=f}this.helper.css({left:d,top:h,width:b-d,height:g-h});this.selectees.each(function(){var j=a.data(this,"selectable-item");if(!j||j.element==c.element[0]){return}var k=false;if(e.tolerance=="touch"){k=(!(j.left>b||j.rightg||j.bottomd&&j.righth&&j.bottom *",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1000},_create:function(){var b=this.options;this.containerCache={};this.element.addClass("ui-sortable");this.refresh();this.floating=this.items.length?(/left|right/).test(this.items[0].item.css("float")):false;this.offset=this.element.offset();this._mouseInit()},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").removeData("sortable").unbind(".sortable");this._mouseDestroy();for(var b=this.items.length-1;b>=0;b--){this.items[b].item.removeData("sortable-item")}return this},_mouseCapture:function(e,f){if(this.reverting){return false}if(this.options.disabled||this.options.type=="static"){return false}this._refreshItems(e);var d=null,c=this,b=a(e.target).parents().each(function(){if(a.data(this,"sortable-item")==c){d=a(this);return false}});if(a.data(e.target,"sortable-item")==c){d=a(e.target)}if(!d){return false}if(this.options.handle&&!f){var g=false;a(this.options.handle,d).find("*").andSelf().each(function(){if(this==e.target){g=true}});if(!g){return false}}this.currentItem=d;this._removeCurrentsFromItems();return true},_mouseStart:function(e,f,b){var g=this.options,c=this;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(e);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");a.extend(this.offset,{click:{left:e.pageX-this.offset.left,top:e.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(e);this.originalPageX=e.pageX;this.originalPageY=e.pageY;(g.cursorAt&&this._adjustOffsetFromHelper(g.cursorAt));this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]};if(this.helper[0]!=this.currentItem[0]){this.currentItem.hide()}this._createPlaceholder();if(g.containment){this._setContainment()}if(g.cursor){if(a("body").css("cursor")){this._storedCursor=a("body").css("cursor")}a("body").css("cursor",g.cursor)}if(g.opacity){if(this.helper.css("opacity")){this._storedOpacity=this.helper.css("opacity")}this.helper.css("opacity",g.opacity)}if(g.zIndex){if(this.helper.css("zIndex")){this._storedZIndex=this.helper.css("zIndex")}this.helper.css("zIndex",g.zIndex)}if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){this.overflowOffset=this.scrollParent.offset()}this._trigger("start",e,this._uiHash());if(!this._preserveHelperProportions){this._cacheHelperProportions()}if(!b){for(var d=this.containers.length-1;d>=0;d--){this.containers[d]._trigger("activate",e,c._uiHash(this))}}if(a.ui.ddmanager){a.ui.ddmanager.current=this}if(a.ui.ddmanager&&!g.dropBehaviour){a.ui.ddmanager.prepareOffsets(this,e)}this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(e);return true},_mouseDrag:function(f){this.position=this._generatePosition(f);this.positionAbs=this._convertPositionTo("absolute");if(!this.lastPositionAbs){this.lastPositionAbs=this.positionAbs}if(this.options.scroll){var g=this.options,b=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if((this.overflowOffset.top+this.scrollParent[0].offsetHeight)-f.pageY=0;d--){var e=this.items[d],c=e.item[0],h=this._intersectsWithPointer(e);if(!h){continue}if(c!=this.currentItem[0]&&this.placeholder[h==1?"next":"prev"]()[0]!=c&&!a.ui.contains(this.placeholder[0],c)&&(this.options.type=="semi-dynamic"?!a.ui.contains(this.element[0],c):true)){this.direction=h==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(e)){this._rearrange(f,e)}else{break}this._trigger("change",f,this._uiHash());break}}this._contactContainers(f);if(a.ui.ddmanager){a.ui.ddmanager.drag(this,f)}this._trigger("sort",f,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(c,d){if(!c){return}if(a.ui.ddmanager&&!this.options.dropBehaviour){a.ui.ddmanager.drop(this,c)}if(this.options.revert){var b=this;var e=b.placeholder.offset();b.reverting=true;a(this.helper).animate({left:e.left-this.offset.parent.left-b.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:e.top-this.offset.parent.top-b.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){b._clear(c)})}else{this._clear(c,d)}return false},cancel:function(){var b=this;if(this.dragging){this._mouseUp();if(this.options.helper=="original"){this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else{this.currentItem.show()}for(var c=this.containers.length-1;c>=0;c--){this.containers[c]._trigger("deactivate",null,b._uiHash(this));if(this.containers[c].containerCache.over){this.containers[c]._trigger("out",null,b._uiHash(this));this.containers[c].containerCache.over=0}}}if(this.placeholder[0].parentNode){this.placeholder[0].parentNode.removeChild(this.placeholder[0])}if(this.options.helper!="original"&&this.helper&&this.helper[0].parentNode){this.helper.remove()}a.extend(this,{helper:null,dragging:false,reverting:false,_noFinalSort:null});if(this.domPosition.prev){a(this.domPosition.prev).after(this.currentItem)}else{a(this.domPosition.parent).prepend(this.currentItem)}return this},serialize:function(d){var b=this._getItemsAsjQuery(d&&d.connected);var c=[];d=d||{};a(b).each(function(){var e=(a(d.item||this).attr(d.attribute||"id")||"").match(d.expression||(/(.+)[-=_](.+)/));if(e){c.push((d.key||e[1]+"[]")+"="+(d.key&&d.expression?e[1]:e[2]))}});return c.join("&")},toArray:function(d){var b=this._getItemsAsjQuery(d&&d.connected);var c=[];d=d||{};b.each(function(){c.push(a(d.item||this).attr(d.attribute||"id")||"")});return c},_intersectsWith:function(m){var e=this.positionAbs.left,d=e+this.helperProportions.width,k=this.positionAbs.top,j=k+this.helperProportions.height;var f=m.left,c=f+m.width,n=m.top,i=n+m.height;var o=this.offset.click.top,h=this.offset.click.left;var g=(k+o)>n&&(k+o)f&&(e+h)m[this.floating?"width":"height"])){return g}else{return(f0?"down":"up")},_getDragHorizontalDirection:function(){var b=this.positionAbs.left-this.lastPositionAbs.left;return b!=0&&(b>0?"right":"left")},refresh:function(b){this._refreshItems(b);this.refreshPositions();return this},_connectWith:function(){var b=this.options;return b.connectWith.constructor==String?[b.connectWith]:b.connectWith},_getItemsAsjQuery:function(b){var l=this;var g=[];var e=[];var h=this._connectWith();if(h&&b){for(var d=h.length-1;d>=0;d--){var k=a(h[d]);for(var c=k.length-1;c>=0;c--){var f=a.data(k[c],"sortable");if(f&&f!=this&&!f.options.disabled){e.push([a.isFunction(f.options.items)?f.options.items.call(f.element):a(f.options.items,f.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),f])}}}}e.push([a.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):a(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(var d=e.length-1;d>=0;d--){e[d][0].each(function(){g.push(this)})}return a(g)},_removeCurrentsFromItems:function(){var d=this.currentItem.find(":data(sortable-item)");for(var c=0;c=0;e--){var m=a(l[e]);for(var d=m.length-1;d>=0;d--){var g=a.data(m[d],"sortable");if(g&&g!=this&&!g.options.disabled){f.push([a.isFunction(g.options.items)?g.options.items.call(g.element[0],b,{item:this.currentItem}):a(g.options.items,g.element),g]);this.containers.push(g)}}}}for(var e=f.length-1;e>=0;e--){var k=f[e][1];var c=f[e][0];for(var d=0,n=c.length;d=0;d--){var e=this.items[d];var c=this.options.toleranceElement?a(this.options.toleranceElement,e.item):e.item;if(!b){e.width=c.outerWidth();e.height=c.outerHeight()}var f=c.offset();e.left=f.left;e.top=f.top}if(this.options.custom&&this.options.custom.refreshContainers){this.options.custom.refreshContainers.call(this)}else{for(var d=this.containers.length-1;d>=0;d--){var f=this.containers[d].element.offset();this.containers[d].containerCache.left=f.left;this.containers[d].containerCache.top=f.top;this.containers[d].containerCache.width=this.containers[d].element.outerWidth();this.containers[d].containerCache.height=this.containers[d].element.outerHeight()}}return this},_createPlaceholder:function(d){var b=d||this,e=b.options;if(!e.placeholder||e.placeholder.constructor==String){var c=e.placeholder;e.placeholder={element:function(){var f=a(document.createElement(b.currentItem[0].nodeName)).addClass(c||b.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];if(!c){f.style.visibility="hidden"}return f},update:function(f,g){if(c&&!e.forcePlaceholderSize){return}if(!g.height()){g.height(b.currentItem.innerHeight()-parseInt(b.currentItem.css("paddingTop")||0,10)-parseInt(b.currentItem.css("paddingBottom")||0,10))}if(!g.width()){g.width(b.currentItem.innerWidth()-parseInt(b.currentItem.css("paddingLeft")||0,10)-parseInt(b.currentItem.css("paddingRight")||0,10))}}}}b.placeholder=a(e.placeholder.element.call(b.element,b.currentItem));b.currentItem.after(b.placeholder);e.placeholder.update(b,b.placeholder)},_contactContainers:function(b){var d=null,k=null;for(var f=this.containers.length-1;f>=0;f--){if(a.ui.contains(this.currentItem[0],this.containers[f].element[0])){continue}if(this._intersectsWith(this.containers[f].containerCache)){if(d&&a.ui.contains(this.containers[f].element[0],d.element[0])){continue}d=this.containers[f];k=f}else{if(this.containers[f].containerCache.over){this.containers[f]._trigger("out",b,this._uiHash(this));this.containers[f].containerCache.over=0}}}if(!d){return}if(this.containers.length===1){this.containers[k]._trigger("over",b,this._uiHash(this));this.containers[k].containerCache.over=1}else{if(this.currentContainer!=this.containers[k]){var h=10000;var g=null;var c=this.positionAbs[this.containers[k].floating?"left":"top"];for(var e=this.items.length-1;e>=0;e--){if(!a.ui.contains(this.containers[k].element[0],this.items[e].item[0])){continue}var l=this.items[e][this.containers[k].floating?"left":"top"];if(Math.abs(l-c)this.containment[2]){d=this.containment[2]+this.offset.click.left}if(e.pageY-this.offset.click.top>this.containment[3]){c=this.containment[3]+this.offset.click.top}}if(h.grid){var g=this.originalPageY+Math.round((c-this.originalPageY)/h.grid[1])*h.grid[1];c=this.containment?(!(g-this.offset.click.topthis.containment[3])?g:(!(g-this.offset.click.topthis.containment[2])?f:(!(f-this.offset.click.left=0;c--){if(a.ui.contains(this.containers[c].element[0],this.currentItem[0])&&!e){f.push((function(g){return function(h){g._trigger("receive",h,this._uiHash(this))}}).call(this,this.containers[c]));f.push((function(g){return function(h){g._trigger("update",h,this._uiHash(this))}}).call(this,this.containers[c]))}}}for(var c=this.containers.length-1;c>=0;c--){if(!e){f.push((function(g){return function(h){g._trigger("deactivate",h,this._uiHash(this))}}).call(this,this.containers[c]))}if(this.containers[c].containerCache.over){f.push((function(g){return function(h){g._trigger("out",h,this._uiHash(this))}}).call(this,this.containers[c]));this.containers[c].containerCache.over=0}}if(this._storedCursor){a("body").css("cursor",this._storedCursor)}if(this._storedOpacity){this.helper.css("opacity",this._storedOpacity)}if(this._storedZIndex){this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex)}this.dragging=false;if(this.cancelHelperRemoval){if(!e){this._trigger("beforeStop",d,this._uiHash());for(var c=0;c li > :first-child,> :not(li):even",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:false,navigationFilter:function(){return this.href.toLowerCase()==location.href.toLowerCase()}},_create:function(){var d=this.options,b=this;this.running=0;this.element.addClass("ui-accordion ui-widget ui-helper-reset");if(this.element[0].nodeName=="UL"){this.element.children("li").addClass("ui-accordion-li-fix")}this.headers=this.element.find(d.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){a(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){a(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){a(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){a(this).removeClass("ui-state-focus")});this.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom");if(d.navigation){var c=this.element.find("a").filter(d.navigationFilter);if(c.length){var e=c.closest(".ui-accordion-header");if(e.length){this.active=e}else{this.active=c.closest(".ui-accordion-content").prev()}}}this.active=this._findActive(this.active||d.active).toggleClass("ui-state-default").toggleClass("ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top");this.active.next().addClass("ui-accordion-content-active");this._createIcons();if(a.browser.msie){this.element.find("a").css("zoom","1")}this.resize();this.element.attr("role","tablist");this.headers.attr("role","tab").bind("keydown",function(f){return b._keydown(f)}).next().attr("role","tabpanel");this.headers.not(this.active||"").attr("aria-expanded","false").attr("tabIndex","-1").next().hide();if(!this.active.length){this.headers.eq(0).attr("tabIndex","0")}else{this.active.attr("aria-expanded","true").attr("tabIndex","0")}if(!a.browser.safari){this.headers.find("a").attr("tabIndex","-1")}if(d.event){this.headers.bind((d.event)+".accordion",function(f){b._clickHandler.call(b,f,this);f.preventDefault()})}},_createIcons:function(){var b=this.options;if(b.icons){a("").addClass("ui-icon "+b.icons.header).prependTo(this.headers);this.active.find(".ui-icon").toggleClass(b.icons.header).toggleClass(b.icons.headerSelected);this.element.addClass("ui-accordion-icons")}},_destroyIcons:function(){this.headers.children(".ui-icon").remove();this.element.removeClass("ui-accordion-icons")},destroy:function(){var c=this.options;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role").unbind(".accordion").removeData("accordion");this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("tabindex");this.headers.find("a").removeAttr("tabindex");this._destroyIcons();var b=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active");if(c.autoHeight||c.fillHeight){b.css("height","")}return this},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments);if(b=="active"){this.activate(c)}if(b=="icons"){this._destroyIcons();if(c){this._createIcons()}}},_keydown:function(e){var g=this.options,f=a.ui.keyCode;if(g.disabled||e.altKey||e.ctrlKey){return}var d=this.headers.length;var b=this.headers.index(e.target);var c=false;switch(e.keyCode){case f.RIGHT:case f.DOWN:c=this.headers[(b+1)%d];break;case f.LEFT:case f.UP:c=this.headers[(b-1+d)%d];break;case f.SPACE:case f.ENTER:this._clickHandler({target:e.target},e.target);e.preventDefault()}if(c){a(e.target).attr("tabIndex","-1");a(c).attr("tabIndex","0");c.focus();return false}return true},resize:function(){var d=this.options,c;if(d.fillSpace){if(a.browser.msie){var b=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}c=this.element.parent().height();if(a.browser.msie){this.element.parent().css("overflow",b)}this.headers.each(function(){c-=a(this).outerHeight(true)});this.headers.next().each(function(){a(this).height(Math.max(0,c-a(this).innerHeight()+a(this).height()))}).css("overflow","auto")}else{if(d.autoHeight){c=0;this.headers.next().each(function(){c=Math.max(c,a(this).height())}).height(c)}}return this},activate:function(b){this.options.active=b;var c=this._findActive(b)[0];this._clickHandler({target:c},c);return this},_findActive:function(b){return b?typeof b=="number"?this.headers.filter(":eq("+b+")"):this.headers.not(this.headers.not(b)):b===false?a([]):this.headers.filter(":eq(0)")},_clickHandler:function(b,f){var d=this.options;if(d.disabled){return}if(!b.target){if(!d.collapsible){return}this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").find(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);this.active.next().addClass("ui-accordion-content-active");var h=this.active.next(),e={options:d,newHeader:a([]),oldHeader:d.active,newContent:a([]),oldContent:h},c=(this.active=a([]));this._toggle(c,h,e);return}var g=a(b.currentTarget||f);var i=g[0]==this.active[0];d.active=d.collapsible&&i?false:a(".ui-accordion-header",this.element).index(g);if(this.running||(!d.collapsible&&i)){return}this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").find(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);if(!i){g.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").find(".ui-icon").removeClass(d.icons.header).addClass(d.icons.headerSelected);g.next().addClass("ui-accordion-content-active")}var c=g.next(),h=this.active.next(),e={options:d,newHeader:i&&d.collapsible?a([]):g,oldHeader:this.active,newContent:i&&d.collapsible?a([]):c,oldContent:h},j=this.headers.index(this.active[0])>this.headers.index(g[0]);this.active=i?a([]):g;this._toggle(c,h,e,i,j);return},_toggle:function(b,i,g,j,k){var d=this.options,m=this;this.toShow=b;this.toHide=i;this.data=g;var c=function(){if(!m){return}return m._completed.apply(m,arguments)};this._trigger("changestart",null,this.data);this.running=i.size()===0?b.size():i.size();if(d.animated){var f={};if(d.collapsible&&j){f={toShow:a([]),toHide:i,complete:c,down:k,autoHeight:d.autoHeight||d.fillSpace}}else{f={toShow:b,toHide:i,complete:c,down:k,autoHeight:d.autoHeight||d.fillSpace}}if(!d.proxied){d.proxied=d.animated}if(!d.proxiedDuration){d.proxiedDuration=d.duration}d.animated=a.isFunction(d.proxied)?d.proxied(f):d.proxied;d.duration=a.isFunction(d.proxiedDuration)?d.proxiedDuration(f):d.proxiedDuration;var l=a.ui.accordion.animations,e=d.duration,h=d.animated;if(h&&!l[h]&&!a.easing[h]){h="slide"}if(!l[h]){l[h]=function(n){this.slide(n,{easing:h,duration:e||700})}}l[h](f)}else{if(d.collapsible&&j){b.toggle()}else{i.hide();b.show()}c(true)}i.prev().attr("aria-expanded","false").attr("tabIndex","-1").blur();b.prev().attr("aria-expanded","true").attr("tabIndex","0").focus()},_completed:function(b){var c=this.options;this.running=b?0:--this.running;if(this.running){return}if(c.clearStyle){this.toShow.add(this.toHide).css({height:"",overflow:""})}this.toHide.removeClass("ui-accordion-content-active");this._trigger("change",null,this.data)}});a.extend(a.ui.accordion,{version:"1.8",animations:{slide:function(j,h){j=a.extend({easing:"swing",duration:300},j,h);if(!j.toHide.size()){j.toShow.animate({height:"show"},j);return}if(!j.toShow.size()){j.toHide.animate({height:"hide"},j);return}var c=j.toShow.css("overflow"),g=0,d={},f={},e=["height","paddingTop","paddingBottom"],b;var i=j.toShow;b=i[0].style.width;i.width(parseInt(i.parent().width(),10)-parseInt(i.css("paddingLeft"),10)-parseInt(i.css("paddingRight"),10)-(parseInt(i.css("borderLeftWidth"),10)||0)-(parseInt(i.css("borderRightWidth"),10)||0));a.each(e,function(k,m){f[m]="hide";var l=(""+a.css(j.toShow[0],m)).match(/^([\d+-.]+)(.*)$/);d[m]={value:l[1],unit:l[2]||"px"}});j.toShow.css({height:0,overflow:"hidden"}).show();j.toHide.filter(":hidden").each(j.complete).end().filter(":visible").animate(f,{step:function(k,l){if(l.prop=="height"){g=(l.end-l.start===0)?0:(l.now-l.start)/(l.end-l.start)}j.toShow[0].style[l.prop]=(g*d[l.prop].value)+d[l.prop].unit},duration:j.duration,easing:j.easing,complete:function(){if(!j.autoHeight){j.toShow.css("height","")}j.toShow.css("width",b);j.toShow.css({overflow:c});j.complete()}})},bounceslide:function(b){this.slide(b,{easing:b.down?"easeOutBounce":"swing",duration:b.down?1000:200})}}})})(jQuery);;/* - * jQuery UI Autocomplete 1.8 - * - * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. - * - * http://docs.jquery.com/UI/Autocomplete - * - * Depends: - * jquery.ui.core.js - * jquery.ui.widget.js - * jquery.ui.position.js - */ (function(a){a.widget("ui.autocomplete",{options:{minLength:1,delay:300},_create:function(){var b=this,c=this.element[0].ownerDocument;this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(d){var e=a.ui.keyCode;switch(d.keyCode){case e.PAGE_UP:b._move("previousPage",d);break;case e.PAGE_DOWN:b._move("nextPage",d);break;case e.UP:b._move("previous",d);d.preventDefault();break;case e.DOWN:b._move("next",d);d.preventDefault();break;case e.ENTER:if(b.menu.active){d.preventDefault()}case e.TAB:if(!b.menu.active){return}b.menu.select();break;case e.ESCAPE:b.element.val(b.term);b.close(d);break;case e.SHIFT:case e.CONTROL:case 18:break;default:clearTimeout(b.searching);b.searching=setTimeout(function(){b.search(null,d)},b.options.delay);break}}).bind("focus.autocomplete",function(){b.previous=b.element.val()}).bind("blur.autocomplete",function(d){clearTimeout(b.searching);b.closing=setTimeout(function(){b.close(d)},150)});this._initSource();this.response=function(){return b._response.apply(b,arguments)};this.menu=a("
      ").addClass("ui-autocomplete").appendTo("body",c).menu({focus:function(e,f){var d=f.item.data("item.autocomplete");if(false!==b._trigger("focus",null,{item:d})){b.element.val(d.value)}},selected:function(e,f){var d=f.item.data("item.autocomplete");if(false!==b._trigger("select",e,{item:d})){b.element.val(d.value)}b.close(e);b.previous=b.element.val();if(b.element[0]!==c.activeElement){b.element.focus()}},blur:function(d,e){if(b.menu.element.is(":visible")){b.element.val(b.term)}}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu");if(a.fn.bgiframe){this.menu.element.bgiframe()}},destroy:function(){this.element.removeClass("ui-autocomplete-input ui-widget ui-widget-content").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup");this.menu.element.remove();a.Widget.prototype.destroy.call(this)},_setOption:function(b){a.Widget.prototype._setOption.apply(this,arguments);if(b==="source"){this._initSource()}},_initSource:function(){var c,b;if(a.isArray(this.options.source)){c=this.options.source;this.source=function(e,d){var f=new RegExp(a.ui.autocomplete.escapeRegex(e.term),"i");d(a.grep(c,function(g){return f.test(g.label||g.value||g)}))}}else{if(typeof this.options.source==="string"){b=this.options.source;this.source=function(e,d){a.getJSON(b,e,d)}}else{this.source=this.options.source}}},search:function(c,b){c=c!=null?c:this.element.val();if(c.length").data("item.autocomplete",c).append(""+c.label+"").appendTo(b)},_move:function(c,b){if(!this.menu.element.is(":visible")){this.search(null,b);return}if(this.menu.first()&&/^previous/.test(c)||this.menu.last()&&/^next/.test(c)){this.element.val(this.term);this.menu.deactivate();return}this.menu[c]()},widget:function(){return this.menu.element}});a.extend(a.ui.autocomplete,{escapeRegex:function(b){return b.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi,"\\$1")}})}(jQuery));(function(a){a.widget("ui.menu",{_create:function(){var b=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(c){c.preventDefault();b.select()});this.refresh()},refresh:function(){var c=this;var b=this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem");b.children("a").addClass("ui-corner-all").attr("tabindex",-1).mouseenter(function(){c.activate(a(this).parent())}).mouseleave(function(){c.deactivate()})},activate:function(d){this.deactivate();if(this.hasScroll()){var e=d.offset().top-this.element.offset().top,b=this.element.attr("scrollTop"),c=this.element.height();if(e<0){this.element.attr("scrollTop",b+e)}else{if(e>c){this.element.attr("scrollTop",b+e-c+d.height())}}}this.active=d.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",null,{item:d})},deactivate:function(){if(!this.active){return}this.active.children("a").removeClass("ui-state-hover").removeAttr("id");this._trigger("blur");this.active=null},next:function(){this.move("next","li:first")},previous:function(){this.move("prev","li:last")},first:function(){return this.active&&!this.active.prev().length},last:function(){return this.active&&!this.active.next().length},move:function(d,c){if(!this.active){this.activate(this.element.children(c));return}var b=this.active[d]();if(b.length){this.activate(b)}else{this.activate(this.element.children(c))}},nextPage:function(){if(this.hasScroll()){if(!this.active||this.last()){this.activate(this.element.children(":first"));return}var d=this.active.offset().top,c=this.element.height(),b=this.element.children("li").filter(function(){var e=a(this).offset().top-d-c+a(this).height();return e<10&&e>-10});if(!b.length){b=this.element.children(":last")}this.activate(b)}else{this.activate(this.element.children(!this.active||this.last()?":first":":last"))}},previousPage:function(){if(this.hasScroll()){if(!this.active||this.first()){this.activate(this.element.children(":last"));return}var c=this.active.offset().top,b=this.element.height();result=this.element.children("li").filter(function(){var d=a(this).offset().top-c+b-a(this).height();return d<10&&d>-10});if(!result.length){result=this.element.children(":first")}this.activate(result)}else{this.activate(this.element.children(!this.active||this.first()?":last":":first"))}},hasScroll:function(){return this.element.height()
      ").addClass("ui-button-text").html(this.options.label).appendTo(j.empty()).text(),h=this.options.icons,g=h.primary&&h.secondary;if(h.primary||h.secondary){j.addClass("ui-button-text-icon"+(g?"s":""));if(h.primary){j.prepend("")}if(h.secondary){j.append("")}if(!this.options.text){j.addClass(g?"ui-button-icons-only":"ui-button-icon-only").removeClass("ui-button-text-icons ui-button-text-icon");if(!this.hasTitle){j.attr("title",i)}}}else{j.addClass("ui-button-text-only")}}});f.widget("ui.buttonset",{_create:function(){this.element.addClass("ui-buttonset");this._init()},_init:function(){this.refresh()},_setOption:function(g,h){if(g==="disabled"){this.buttons.button("option",g,h)}f.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){this.buttons=this.element.find(":button, :submit, :reset, :checkbox, :radio, a, :data(button)").filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return f(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass("ui-corner-left").end().filter(":last").addClass("ui-corner-right").end().end()},destroy:function(){this.element.removeClass("ui-buttonset");this.buttons.map(function(){return f(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy");f.Widget.prototype.destroy.call(this)}})}(jQuery));;/* - * jQuery UI Dialog 1.8 - * - * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. - * - * http://docs.jquery.com/UI/Dialog - * - * Depends: - * jquery.ui.core.js - * jquery.ui.widget.js - * jquery.ui.button.js - * jquery.ui.draggable.js - * jquery.ui.mouse.js - * jquery.ui.position.js - * jquery.ui.resizable.js - */ (function(b){var a="ui-dialog ui-widget ui-widget-content ui-corner-all ";b.widget("ui.dialog",{options:{autoOpen:true,buttons:{},closeOnEscape:true,closeText:"close",dialogClass:"",draggable:true,hide:null,height:"auto",maxHeight:false,maxWidth:false,minHeight:150,minWidth:150,modal:false,position:"center",resizable:true,show:null,stack:true,title:"",width:300,zIndex:1000},_create:function(){this.originalTitle=this.element.attr("title");var k=this,l=k.options,i=l.title||k.originalTitle||" ",d=b.ui.dialog.getTitleId(k.element),j=(k.uiDialog=b("
      ")).appendTo(document.body).hide().addClass(a+l.dialogClass).css({zIndex:l.zIndex}).attr("tabIndex",-1).css("outline",0).keydown(function(m){if(l.closeOnEscape&&m.keyCode&&m.keyCode===b.ui.keyCode.ESCAPE){k.close(m);m.preventDefault()}}).attr({role:"dialog","aria-labelledby":d}).mousedown(function(m){k.moveToTop(false,m)}),f=k.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(j),e=(k.uiDialogTitlebar=b("
      ")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(j),h=b('').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role","button").hover(function(){h.addClass("ui-state-hover")},function(){h.removeClass("ui-state-hover")}).focus(function(){h.addClass("ui-state-focus")}).blur(function(){h.removeClass("ui-state-focus")}).click(function(m){k.close(m);return false}).appendTo(e),g=(k.uiDialogTitlebarCloseText=b("")).addClass("ui-icon ui-icon-closethick").text(l.closeText).appendTo(h),c=b("").addClass("ui-dialog-title").attr("id",d).html(i).prependTo(e);if(b.isFunction(l.beforeclose)&&!b.isFunction(l.beforeClose)){l.beforeClose=l.beforeclose}e.find("*").add(e).disableSelection();if(l.draggable&&b.fn.draggable){k._makeDraggable()}if(l.resizable&&b.fn.resizable){k._makeResizable()}k._createButtons(l.buttons);k._isOpen=false;if(b.fn.bgiframe){j.bgiframe()}},_init:function(){if(this.options.autoOpen){this.open()}},destroy:function(){var c=this;if(c.overlay){c.overlay.destroy()}c.uiDialog.hide();c.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body");c.uiDialog.remove();if(c.originalTitle){c.element.attr("title",c.originalTitle)}return c},widget:function(){return this.uiDialog},close:function(e){var c=this,d;if(false===c._trigger("beforeClose",e)){return}if(c.overlay){c.overlay.destroy()}c.uiDialog.unbind("keypress.ui-dialog");c._isOpen=false;if(c.options.hide){c.uiDialog.hide(c.options.hide,function(){c._trigger("close",e)})}else{c.uiDialog.hide();c._trigger("close",e)}b.ui.dialog.overlay.resize();if(c.options.modal){d=0;b(".ui-dialog").each(function(){if(this!==c.uiDialog[0]){d=Math.max(d,b(this).css("z-index"))}});b.ui.dialog.maxZ=d}return c},isOpen:function(){return this._isOpen},moveToTop:function(g,f){var c=this,e=c.options,d;if((e.modal&&!g)||(!e.stack&&!e.modal)){return c._trigger("focus",f)}if(e.zIndex>b.ui.dialog.maxZ){b.ui.dialog.maxZ=e.zIndex}if(c.overlay){b.ui.dialog.maxZ+=1;c.overlay.$el.css("z-index",b.ui.dialog.overlay.maxZ=b.ui.dialog.maxZ)}d={scrollTop:c.element.attr("scrollTop"),scrollLeft:c.element.attr("scrollLeft")};b.ui.dialog.maxZ+=1;c.uiDialog.css("z-index",b.ui.dialog.maxZ);c.element.attr(d);c._trigger("focus",f);return c},open:function(){if(this._isOpen){return}var d=this,e=d.options,c=d.uiDialog;d.overlay=e.modal?new b.ui.dialog.overlay(d):null;if(c.next().length){c.appendTo("body")}d._size();d._position(e.position);c.show(e.show);d.moveToTop(true);if(e.modal){c.bind("keypress.ui-dialog",function(h){if(h.keyCode!==b.ui.keyCode.TAB){return}var g=b(":tabbable",this),i=g.filter(":first"),f=g.filter(":last");if(h.target===f[0]&&!h.shiftKey){i.focus(1);return false}else{if(h.target===i[0]&&h.shiftKey){f.focus(1);return false}}})}b([]).add(c.find(".ui-dialog-content :tabbable:first")).add(c.find(".ui-dialog-buttonpane :tabbable:first")).add(c).filter(":first").focus();d._trigger("open");d._isOpen=true;return d},_createButtons:function(f){var e=this,c=false,d=b("
      ").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix");e.uiDialog.find(".ui-dialog-buttonpane").remove();if(typeof f==="object"&&f!==null){b.each(f,function(){return !(c=true)})}if(c){b.each(f,function(g,i){var h=b('').text(g).click(function(){i.apply(e.element[0],arguments)}).appendTo(d);if(b.fn.button){h.button()}});d.appendTo(e.uiDialog)}},_makeDraggable:function(){var c=this,f=c.options,g=b(document),e;function d(h){return{position:h.position,offset:h.offset}}c.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(h,i){e=f.height==="auto"?"auto":b(this).height();b(this).height(b(this).height()).addClass("ui-dialog-dragging");c._trigger("dragStart",h,d(i))},drag:function(h,i){c._trigger("drag",h,d(i))},stop:function(h,i){f.position=[i.position.left-g.scrollLeft(),i.position.top-g.scrollTop()];b(this).removeClass("ui-dialog-dragging").height(e);c._trigger("dragStop",h,d(i));b.ui.dialog.overlay.resize()}})},_makeResizable:function(h){h=(h===undefined?this.options.resizable:h);var d=this,g=d.options,c=d.uiDialog.css("position"),f=(typeof h==="string"?h:"n,e,s,w,se,sw,ne,nw");function e(i){return{originalPosition:i.originalPosition,originalSize:i.originalSize,position:i.position,size:i.size}}d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:g.maxWidth,maxHeight:g.maxHeight,minWidth:g.minWidth,minHeight:d._minHeight(),handles:f,start:function(i,j){b(this).addClass("ui-dialog-resizing");d._trigger("resizeStart",i,e(j))},resize:function(i,j){d._trigger("resize",i,e(j))},stop:function(i,j){b(this).removeClass("ui-dialog-resizing");g.height=b(this).height();g.width=b(this).width();d._trigger("resizeStop",i,e(j));b.ui.dialog.overlay.resize()}}).css("position",c).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var c=this.options;if(c.height==="auto"){return c.minHeight}else{return Math.min(c.minHeight,c.height)}},_position:function(d){var e=[],f=[0,0],c;d=d||b.ui.dialog.prototype.options.position;if(typeof d==="string"||(typeof d==="object"&&"0" in d)){e=d.split?d.split(" "):[d[0],d[1]];if(e.length===1){e[1]=e[0]}b.each(["left","top"],function(h,g){if(+e[h]===e[h]){f[h]=e[h];e[h]=g}})}else{if(typeof d==="object"){if("left" in d){e[0]="left";f[0]=d.left}else{if("right" in d){e[0]="right";f[0]=-d.right}}if("top" in d){e[1]="top";f[1]=d.top}else{if("bottom" in d){e[1]="bottom";f[1]=-d.bottom}}}}c=this.uiDialog.is(":visible");if(!c){this.uiDialog.show()}this.uiDialog.css({top:0,left:0}).position({my:e.join(" "),at:e.join(" "),offset:f.join(" "),of:window,collision:"fit",using:function(h){var g=b(this).css(h).offset().top;if(g<0){b(this).css("top",h.top-g)}}});if(!c){this.uiDialog.hide()}},_setOption:function(f,g){var d=this,c=d.uiDialog,h=c.is(":data(resizable)"),e=false;switch(f){case"beforeclose":f="beforeClose";break;case"buttons":d._createButtons(g);break;case"closeText":d.uiDialogTitlebarCloseText.text(""+g);break;case"dialogClass":c.removeClass(d.options.dialogClass).addClass(a+g);break;case"disabled":if(g){c.addClass("ui-dialog-disabled")}else{c.removeClass("ui-dialog-disabled")}break;case"draggable":if(g){d._makeDraggable()}else{c.draggable("destroy")}break;case"height":e=true;break;case"maxHeight":if(h){c.resizable("option","maxHeight",g)}e=true;break;case"maxWidth":if(h){c.resizable("option","maxWidth",g)}e=true;break;case"minHeight":if(h){c.resizable("option","minHeight",g)}e=true;break;case"minWidth":if(h){c.resizable("option","minWidth",g)}e=true;break;case"position":d._position(g);break;case"resizable":if(h&&!g){c.resizable("destroy")}if(h&&typeof g==="string"){c.resizable("option","handles",g)}if(!h&&g!==false){d._makeResizable(g)}break;case"title":b(".ui-dialog-title",d.uiDialogTitlebar).html(""+(g||" "));break;case"width":e=true;break}b.Widget.prototype._setOption.apply(d,arguments);if(e){d._size()}},_size:function(){var d=this.options,c;this.element.css("width","auto").hide();c=this.uiDialog.css({height:"auto",width:d.width}).height();this.element.css(d.height==="auto"?{minHeight:Math.max(d.minHeight-c,0),height:"auto"}:{minHeight:0,height:Math.max(d.height-c,0)}).show();if(this.uiDialog.is(":data(resizable)")){this.uiDialog.resizable("option","minHeight",this._minHeight())}}});b.extend(b.ui.dialog,{version:"1.8",uuid:0,maxZ:0,getTitleId:function(c){var d=c.attr("id");if(!d){this.uuid+=1;d=this.uuid}return"ui-dialog-title-"+d},overlay:function(c){this.$el=b.ui.dialog.overlay.create(c)}});b.extend(b.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:b.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(c){return c+".dialog-overlay"}).join(" "),create:function(d){if(this.instances.length===0){setTimeout(function(){if(b.ui.dialog.overlay.instances.length){b(document).bind(b.ui.dialog.overlay.events,function(e){return(b(e.target).zIndex()>=b.ui.dialog.overlay.maxZ)})}},1);b(document).bind("keydown.dialog-overlay",function(e){if(d.options.closeOnEscape&&e.keyCode&&e.keyCode===b.ui.keyCode.ESCAPE){d.close(e);e.preventDefault()}});b(window).bind("resize.dialog-overlay",b.ui.dialog.overlay.resize)}var c=(this.oldInstances.pop()||b("
      ").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),height:this.height()});if(b.fn.bgiframe){c.bgiframe()}this.instances.push(c);return c},destroy:function(c){this.oldInstances.push(this.instances.splice(b.inArray(c,this.instances),1)[0]);if(this.instances.length===0){b([document,window]).unbind(".dialog-overlay")}c.remove();var d=0;b.each(this.instances,function(){d=Math.max(d,this.css("z-index"))});this.maxZ=d},height:function(){var d,c;if(b.browser.msie&&b.browser.version<7){d=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight);c=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);if(d");if(!d.values){d.values=[this._valueMin(),this._valueMin()]}if(d.values.length&&d.values.length!=2){d.values=[d.values[0],d.values[0]]}}else{this.range=b("
      ")}this.range.appendTo(this.element).addClass("ui-slider-range");if(d.range=="min"||d.range=="max"){this.range.addClass("ui-slider-range-"+d.range)}this.range.addClass("ui-widget-header")}if(b(".ui-slider-handle",this.element).length==0){b('').appendTo(this.element).addClass("ui-slider-handle")}if(d.values&&d.values.length){while(b(".ui-slider-handle",this.element).length').appendTo(this.element).addClass("ui-slider-handle")}}this.handles=b(".ui-slider-handle",this.element).addClass("ui-state-default ui-corner-all");this.handle=this.handles.eq(0);this.handles.add(this.range).filter("a").click(function(e){e.preventDefault()}).hover(function(){if(!d.disabled){b(this).addClass("ui-state-hover")}},function(){b(this).removeClass("ui-state-hover")}).focus(function(){if(!d.disabled){b(".ui-slider .ui-state-focus").removeClass("ui-state-focus");b(this).addClass("ui-state-focus")}else{b(this).blur()}}).blur(function(){b(this).removeClass("ui-state-focus")});this.handles.each(function(e){b(this).data("index.ui-slider-handle",e)});this.handles.keydown(function(j){var g=true;var f=b(this).data("index.ui-slider-handle");if(c.options.disabled){return}switch(j.keyCode){case b.ui.keyCode.HOME:case b.ui.keyCode.END:case b.ui.keyCode.PAGE_UP:case b.ui.keyCode.PAGE_DOWN:case b.ui.keyCode.UP:case b.ui.keyCode.RIGHT:case b.ui.keyCode.DOWN:case b.ui.keyCode.LEFT:g=false;if(!c._keySliding){c._keySliding=true;b(this).addClass("ui-state-active");c._start(j,f)}break}var h,e,i=c._step();if(c.options.values&&c.options.values.length){h=e=c.values(f)}else{h=e=c.value()}switch(j.keyCode){case b.ui.keyCode.HOME:e=c._valueMin();break;case b.ui.keyCode.END:e=c._valueMax();break;case b.ui.keyCode.PAGE_UP:e=h+((c._valueMax()-c._valueMin())/a);break;case b.ui.keyCode.PAGE_DOWN:e=h-((c._valueMax()-c._valueMin())/a);break;case b.ui.keyCode.UP:case b.ui.keyCode.RIGHT:if(h==c._valueMax()){return}e=h+i;break;case b.ui.keyCode.DOWN:case b.ui.keyCode.LEFT:if(h==c._valueMin()){return}e=h-i;break}c._slide(j,f,e);return g}).keyup(function(f){var e=b(this).data("index.ui-slider-handle");if(c._keySliding){c._keySliding=false;c._stop(f,e);c._change(f,e);b(this).removeClass("ui-state-active")}});this._refreshValue();this._animateOff=false},destroy:function(){this.handles.remove();this.range.remove();this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider");this._mouseDestroy();return this},_mouseCapture:function(e){var f=this.options;if(f.disabled){return false}this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();var i={x:e.pageX,y:e.pageY};var k=this._normValueFromMouse(i);var d=this._valueMax()-this._valueMin()+1,g;var l=this,j;this.handles.each(function(m){var n=Math.abs(k-l.values(m));if(d>n){d=n;g=b(this);j=m}});if(f.range==true&&this.values(1)==f.min){g=b(this.handles[++j])}this._start(e,j);this._mouseSliding=true;l._handleIndex=j;g.addClass("ui-state-active").focus();var h=g.offset();var c=!b(e.target).parents().andSelf().is(".ui-slider-handle");this._clickOffset=c?{left:0,top:0}:{left:e.pageX-h.left-(g.width()/2),top:e.pageY-h.top-(g.height()/2)-(parseInt(g.css("borderTopWidth"),10)||0)-(parseInt(g.css("borderBottomWidth"),10)||0)+(parseInt(g.css("marginTop"),10)||0)};k=this._normValueFromMouse(i);this._slide(e,j,k);this._animateOff=true;return true},_mouseStart:function(c){return true},_mouseDrag:function(e){var c={x:e.pageX,y:e.pageY};var d=this._normValueFromMouse(c);this._slide(e,this._handleIndex,d);return false},_mouseStop:function(c){this.handles.removeClass("ui-state-active");this._mouseSliding=false;this._stop(c,this._handleIndex);this._change(c,this._handleIndex);this._handleIndex=null;this._clickOffset=null;this._animateOff=false;return false},_detectOrientation:function(){this.orientation=this.options.orientation=="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(e){var d,i;if("horizontal"==this.orientation){d=this.elementSize.width;i=e.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{d=this.elementSize.height;i=e.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}var g=(i/d);if(g>1){g=1}if(g<0){g=0}if("vertical"==this.orientation){g=1-g}var f=this._valueMax()-this._valueMin(),j=g*f,c=j%this.options.step,h=this._valueMin()+j-c;if(c>(this.options.step/2)){h+=this.options.step}return parseFloat(h.toFixed(5))},_start:function(e,d){var c={handle:this.handles[d],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(d);c.values=this.values()}this._trigger("start",e,c)},_slide:function(g,f,e){var h=this.handles[f];if(this.options.values&&this.options.values.length){var c=this.values(f?0:1);if((this.options.values.length==2&&this.options.range===true)&&((f==0&&e>c)||(f==1&&e1){this.options.values[e]=this._trimValue(h);this._refreshValue();this._change(null,e)}if(arguments.length){if(b.isArray(arguments[0])){var g=this.options.values,d=arguments[0];for(var f=0,c=g.length;fthis._valueMax()){c=this._valueMax()}return c},_valueMin:function(){var c=this.options.min;return c},_valueMax:function(){var c=this.options.max;return c},_refreshValue:function(){var g=this.options.range,e=this.options,m=this;var d=(!this._animateOff)?e.animate:false;if(this.options.values&&this.options.values.length){var j,i;this.handles.each(function(q,o){var p=(m.values(q)-m._valueMin())/(m._valueMax()-m._valueMin())*100;var n={};n[m.orientation=="horizontal"?"left":"bottom"]=p+"%";b(this).stop(1,1)[d?"animate":"css"](n,e.animate);if(m.options.range===true){if(m.orientation=="horizontal"){(q==0)&&m.range.stop(1,1)[d?"animate":"css"]({left:p+"%"},e.animate);(q==1)&&m.range[d?"animate":"css"]({width:(p-lastValPercent)+"%"},{queue:false,duration:e.animate})}else{(q==0)&&m.range.stop(1,1)[d?"animate":"css"]({bottom:(p)+"%"},e.animate);(q==1)&&m.range[d?"animate":"css"]({height:(p-lastValPercent)+"%"},{queue:false,duration:e.animate})}}lastValPercent=p})}else{var k=this.value(),h=this._valueMin(),l=this._valueMax(),f=l!=h?(k-h)/(l-h)*100:0;var c={};c[m.orientation=="horizontal"?"left":"bottom"]=f+"%";this.handle.stop(1,1)[d?"animate":"css"](c,e.animate);(g=="min")&&(this.orientation=="horizontal")&&this.range.stop(1,1)[d?"animate":"css"]({width:f+"%"},e.animate);(g=="max")&&(this.orientation=="horizontal")&&this.range[d?"animate":"css"]({width:(100-f)+"%"},{queue:false,duration:e.animate});(g=="min")&&(this.orientation=="vertical")&&this.range.stop(1,1)[d?"animate":"css"]({height:f+"%"},e.animate);(g=="max")&&(this.orientation=="vertical")&&this.range[d?"animate":"css"]({height:(100-f)+"%"},{queue:false,duration:e.animate})}}});b.extend(b.ui.slider,{version:"1.8"})})(jQuery);;/* - * jQuery UI Tabs 1.8 - * - * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. - * - * http://docs.jquery.com/UI/Tabs - * - * Depends: - * jquery.ui.core.js - * jquery.ui.widget.js - */ (function(c){var b=0,a=0;c.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:false,cookie:null,collapsible:false,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"
      ",remove:null,select:null,show:null,spinner:"Loading…",tabTemplate:'
    • #{label}
    • '},_create:function(){this._tabify(true)},_setOption:function(d,e){if(d=="selected"){if(this.options.collapsible&&e==this.options.selected){return}this.select(e)}else{this.options[d]=e;this._tabify()}},_tabId:function(d){return d.title&&d.title.replace(/\s/g,"_").replace(/[^A-Za-z0-9\-_:\.]/g,"")||this.options.idPrefix+(++b)},_sanitizeSelector:function(d){return d.replace(/:/g,"\\:")},_cookie:function(){var d=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+(++a));return c.cookie.apply(null,[d].concat(c.makeArray(arguments)))},_ui:function(e,d){return{tab:e,panel:d,index:this.anchors.index(e)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var d=c(this);d.html(d.data("label.tabs")).removeData("label.tabs")})},_tabify:function(q){this.list=this.element.find("ol,ul").eq(0);this.lis=c("li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return c("a",this)[0]});this.panels=c([]);var r=this,f=this.options;var e=/^#.+/;this.anchors.each(function(u,o){var s=c(o).attr("href");var v=s.split("#")[0],w;if(v&&(v===location.toString().split("#")[0]||(w=c("base")[0])&&v===w.href)){s=o.hash;o.href=s}if(e.test(s)){r.panels=r.panels.add(r._sanitizeSelector(s))}else{if(s!="#"){c.data(o,"href.tabs",s);c.data(o,"load.tabs",s.replace(/#.*$/,""));var y=r._tabId(o);o.href="#"+y;var x=c("#"+y);if(!x.length){x=c(f.panelTemplate).attr("id",y).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(r.panels[u-1]||r.list);x.data("destroy.tabs",true)}r.panels=r.panels.add(x)}else{f.disabled.push(u)}}});if(q){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all");this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");if(f.selected===undefined){if(location.hash){this.anchors.each(function(s,o){if(o.hash==location.hash){f.selected=s;return false}})}if(typeof f.selected!="number"&&f.cookie){f.selected=parseInt(r._cookie(),10)}if(typeof f.selected!="number"&&this.lis.filter(".ui-tabs-selected").length){f.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"))}f.selected=f.selected||(this.lis.length?0:-1)}else{if(f.selected===null){f.selected=-1}}f.selected=((f.selected>=0&&this.anchors[f.selected])||f.selected<0)?f.selected:0;f.disabled=c.unique(f.disabled.concat(c.map(this.lis.filter(".ui-state-disabled"),function(s,o){return r.lis.index(s)}))).sort();if(c.inArray(f.selected,f.disabled)!=-1){f.disabled.splice(c.inArray(f.selected,f.disabled),1)}this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active");if(f.selected>=0&&this.anchors.length){this.panels.eq(f.selected).removeClass("ui-tabs-hide");this.lis.eq(f.selected).addClass("ui-tabs-selected ui-state-active");r.element.queue("tabs",function(){r._trigger("show",null,r._ui(r.anchors[f.selected],r.panels[f.selected]))});this.load(f.selected)}c(window).bind("unload",function(){r.lis.add(r.anchors).unbind(".tabs");r.lis=r.anchors=r.panels=null})}else{f.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"))}this.element[f.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible");if(f.cookie){this._cookie(f.selected,f.cookie)}for(var j=0,p;(p=this.lis[j]);j++){c(p)[c.inArray(j,f.disabled)!=-1&&!c(p).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled")}if(f.cache===false){this.anchors.removeData("cache.tabs")}this.lis.add(this.anchors).unbind(".tabs");if(f.event!="mouseover"){var h=function(o,i){if(i.is(":not(.ui-state-disabled)")){i.addClass("ui-state-"+o)}};var l=function(o,i){i.removeClass("ui-state-"+o)};this.lis.bind("mouseover.tabs",function(){h("hover",c(this))});this.lis.bind("mouseout.tabs",function(){l("hover",c(this))});this.anchors.bind("focus.tabs",function(){h("focus",c(this).closest("li"))});this.anchors.bind("blur.tabs",function(){l("focus",c(this).closest("li"))})}var d,k;if(f.fx){if(c.isArray(f.fx)){d=f.fx[0];k=f.fx[1]}else{d=k=f.fx}}function g(i,o){i.css({display:""});if(!c.support.opacity&&o.opacity){i[0].style.removeAttribute("filter")}}var m=k?function(i,o){c(i).closest("li").addClass("ui-tabs-selected ui-state-active");o.hide().removeClass("ui-tabs-hide").animate(k,k.duration||"normal",function(){g(o,k);r._trigger("show",null,r._ui(i,o[0]))})}:function(i,o){c(i).closest("li").addClass("ui-tabs-selected ui-state-active");o.removeClass("ui-tabs-hide");r._trigger("show",null,r._ui(i,o[0]))};var n=d?function(o,i){i.animate(d,d.duration||"normal",function(){r.lis.removeClass("ui-tabs-selected ui-state-active");i.addClass("ui-tabs-hide");g(i,d);r.element.dequeue("tabs")})}:function(o,i,s){r.lis.removeClass("ui-tabs-selected ui-state-active");i.addClass("ui-tabs-hide");r.element.dequeue("tabs")};this.anchors.bind(f.event+".tabs",function(){var o=this,u=c(this).closest("li"),i=r.panels.filter(":not(.ui-tabs-hide)"),s=c(r._sanitizeSelector(this.hash));if((u.hasClass("ui-tabs-selected")&&!f.collapsible)||u.hasClass("ui-state-disabled")||u.hasClass("ui-state-processing")||r._trigger("select",null,r._ui(this,s[0]))===false){this.blur();return false}f.selected=r.anchors.index(this);r.abort();if(f.collapsible){if(u.hasClass("ui-tabs-selected")){f.selected=-1;if(f.cookie){r._cookie(f.selected,f.cookie)}r.element.queue("tabs",function(){n(o,i)}).dequeue("tabs");this.blur();return false}else{if(!i.length){if(f.cookie){r._cookie(f.selected,f.cookie)}r.element.queue("tabs",function(){m(o,s)});r.load(r.anchors.index(this));this.blur();return false}}}if(f.cookie){r._cookie(f.selected,f.cookie)}if(s.length){if(i.length){r.element.queue("tabs",function(){n(o,i)})}r.element.queue("tabs",function(){m(o,s)});r.load(r.anchors.index(this))}else{throw"jQuery UI Tabs: Mismatching fragment identifier."}if(c.browser.msie){this.blur()}});this.anchors.bind("click.tabs",function(){return false})},destroy:function(){var d=this.options;this.abort();this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.each(function(){var e=c.data(this,"href.tabs");if(e){this.href=e}var f=c(this).unbind(".tabs");c.each(["href","load","cache"],function(g,h){f.removeData(h+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){if(c.data(this,"destroy.tabs")){c(this).remove()}else{c(this).removeClass(["ui-state-default","ui-corner-top","ui-tabs-selected","ui-state-active","ui-state-hover","ui-state-focus","ui-state-disabled","ui-tabs-panel","ui-widget-content","ui-corner-bottom","ui-tabs-hide"].join(" "))}});if(d.cookie){this._cookie(null,d.cookie)}return this},add:function(g,f,e){if(e===undefined){e=this.anchors.length}var d=this,i=this.options,k=c(i.tabTemplate.replace(/#\{href\}/g,g).replace(/#\{label\}/g,f)),j=!g.indexOf("#")?g.replace("#",""):this._tabId(c("a",k)[0]);k.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var h=c("#"+j);if(!h.length){h=c(i.panelTemplate).attr("id",j).data("destroy.tabs",true)}h.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(e>=this.lis.length){k.appendTo(this.list);h.appendTo(this.list[0].parentNode)}else{k.insertBefore(this.lis[e]);h.insertBefore(this.panels[e])}i.disabled=c.map(i.disabled,function(m,l){return m>=e?++m:m});this._tabify();if(this.anchors.length==1){i.selected=0;k.addClass("ui-tabs-selected ui-state-active");h.removeClass("ui-tabs-hide");this.element.queue("tabs",function(){d._trigger("show",null,d._ui(d.anchors[0],d.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[e],this.panels[e]));return this},remove:function(d){var f=this.options,g=this.lis.eq(d).remove(),e=this.panels.eq(d).remove();if(g.hasClass("ui-tabs-selected")&&this.anchors.length>1){this.select(d+(d+1=d?--j:j});this._tabify();this._trigger("remove",null,this._ui(g.find("a")[0],e[0]));return this},enable:function(d){var e=this.options;if(c.inArray(d,e.disabled)==-1){return}this.lis.eq(d).removeClass("ui-state-disabled");e.disabled=c.grep(e.disabled,function(g,f){return g!=d});this._trigger("enable",null,this._ui(this.anchors[d],this.panels[d]));return this},disable:function(e){var d=this,f=this.options;if(e!=f.selected){this.lis.eq(e).addClass("ui-state-disabled");f.disabled.push(e);f.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[e],this.panels[e]))}return this},select:function(d){if(typeof d=="string"){d=this.anchors.index(this.anchors.filter("[href$="+d+"]"))}else{if(d===null){d=-1}}if(d==-1&&this.options.collapsible){d=this.options.selected}this.anchors.eq(d).trigger(this.options.event+".tabs");return this},load:function(g){var e=this,i=this.options,d=this.anchors.eq(g)[0],f=c.data(d,"load.tabs");this.abort();if(!f||this.element.queue("tabs").length!==0&&c.data(d,"cache.tabs")){this.element.dequeue("tabs");return}this.lis.eq(g).addClass("ui-state-processing");if(i.spinner){var h=c("span",d);h.data("label.tabs",h.html()).html(i.spinner)}this.xhr=c.ajax(c.extend({},i.ajaxOptions,{url:f,success:function(k,j){c(e._sanitizeSelector(d.hash)).html(k);e._cleanup();if(i.cache){c.data(d,"cache.tabs",true)}e._trigger("load",null,e._ui(e.anchors[g],e.panels[g]));try{i.ajaxOptions.success(k,j)}catch(l){}},error:function(l,j,k){e._cleanup();e._trigger("load",null,e._ui(e.anchors[g],e.panels[g]));try{i.ajaxOptions.error(l,j,g,d)}catch(k){}}}));e.element.dequeue("tabs");return this},abort:function(){this.element.queue([]);this.panels.stop(false,true);this.element.queue("tabs",this.element.queue("tabs").splice(-2,2));if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup();return this},url:function(e,d){this.anchors.eq(e).removeData("cache.tabs").data("load.tabs",d);return this},length:function(){return this.anchors.length}});c.extend(c.ui.tabs,{version:"1.8"});c.extend(c.ui.tabs.prototype,{rotation:null,rotate:function(f,h){var d=this,i=this.options;var e=d._rotate||(d._rotate=function(j){clearTimeout(d.rotation);d.rotation=setTimeout(function(){var k=i.selected;d.select(++k')}$.extend(Datepicker.prototype,{markerClassName:"hasDatepicker",log:function(){if(this.debug){console.log.apply("",arguments)}},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(settings){extendRemove(this._defaults,settings||{});return this},_attachDatepicker:function(target,settings){var inlineSettings=null;for(var attrName in this._defaults){var attrValue=target.getAttribute("date:"+attrName);if(attrValue){inlineSettings=inlineSettings||{};try{inlineSettings[attrName]=eval(attrValue)}catch(err){inlineSettings[attrName]=attrValue}}}var nodeName=target.nodeName.toLowerCase();var inline=(nodeName=="div"||nodeName=="span");if(!target.id){target.id="dp"+(++this.uuid)}var inst=this._newInst($(target),inline);inst.settings=$.extend({},settings||{},inlineSettings||{});if(nodeName=="input"){this._connectDatepicker(target,inst)}else{if(inline){this._inlineDatepicker(target,inst)}}},_newInst:function(target,inline){var id=target[0].id.replace(/([^A-Za-z0-9_])/g,"\\\\$1");return{id:id,input:target,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:inline,dpDiv:(!inline?this.dpDiv:$('
      '))}},_connectDatepicker:function(target,inst){var input=$(target);inst.append=$([]);inst.trigger=$([]);if(input.hasClass(this.markerClassName)){return}this._attachments(input,inst);input.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(event,key,value){inst.settings[key]=value}).bind("getData.datepicker",function(event,key){return this._get(inst,key)});this._autoSize(inst);$.data(target,PROP_NAME,inst)},_attachments:function(input,inst){var appendText=this._get(inst,"appendText");var isRTL=this._get(inst,"isRTL");if(inst.append){inst.append.remove()}if(appendText){inst.append=$(''+appendText+"");input[isRTL?"before":"after"](inst.append)}input.unbind("focus",this._showDatepicker);if(inst.trigger){inst.trigger.remove()}var showOn=this._get(inst,"showOn");if(showOn=="focus"||showOn=="both"){input.focus(this._showDatepicker)}if(showOn=="button"||showOn=="both"){var buttonText=this._get(inst,"buttonText");var buttonImage=this._get(inst,"buttonImage");inst.trigger=$(this._get(inst,"buttonImageOnly")?$("").addClass(this._triggerClass).attr({src:buttonImage,alt:buttonText,title:buttonText}):$('').addClass(this._triggerClass).html(buttonImage==""?buttonText:$("").attr({src:buttonImage,alt:buttonText,title:buttonText})));input[isRTL?"before":"after"](inst.trigger);inst.trigger.click(function(){if($.datepicker._datepickerShowing&&$.datepicker._lastInput==input[0]){$.datepicker._hideDatepicker()}else{$.datepicker._showDatepicker(input[0])}return false})}},_autoSize:function(inst){if(this._get(inst,"autoSize")&&!inst.inline){var date=new Date(2009,12-1,20);var dateFormat=this._get(inst,"dateFormat");if(dateFormat.match(/[DM]/)){var findMax=function(names){var max=0;var maxI=0;for(var i=0;imax){max=names[i].length;maxI=i}}return maxI};date.setMonth(findMax(this._get(inst,(dateFormat.match(/MM/)?"monthNames":"monthNamesShort"))));date.setDate(findMax(this._get(inst,(dateFormat.match(/DD/)?"dayNames":"dayNamesShort")))+20-date.getDay())}inst.input.attr("size",this._formatDate(inst,date).length)}},_inlineDatepicker:function(target,inst){var divSpan=$(target);if(divSpan.hasClass(this.markerClassName)){return}divSpan.addClass(this.markerClassName).append(inst.dpDiv).bind("setData.datepicker",function(event,key,value){inst.settings[key]=value}).bind("getData.datepicker",function(event,key){return this._get(inst,key)});$.data(target,PROP_NAME,inst);this._setDate(inst,this._getDefaultDate(inst),true);this._updateDatepicker(inst);this._updateAlternate(inst)},_dialogDatepicker:function(input,date,onSelect,settings,pos){var inst=this._dialogInst;if(!inst){var id="dp"+(++this.uuid);this._dialogInput=$('');this._dialogInput.keydown(this._doKeyDown);$("body").append(this._dialogInput);inst=this._dialogInst=this._newInst(this._dialogInput,false);inst.settings={};$.data(this._dialogInput[0],PROP_NAME,inst)}extendRemove(inst.settings,settings||{});date=(date&&date.constructor==Date?this._formatDate(inst,date):date);this._dialogInput.val(date);this._pos=(pos?(pos.length?pos:[pos.pageX,pos.pageY]):null);if(!this._pos){var browserWidth=document.documentElement.clientWidth;var browserHeight=document.documentElement.clientHeight;var scrollX=document.documentElement.scrollLeft||document.body.scrollLeft;var scrollY=document.documentElement.scrollTop||document.body.scrollTop;this._pos=[(browserWidth/2)-100+scrollX,(browserHeight/2)-150+scrollY]}this._dialogInput.css("left",(this._pos[0]+20)+"px").css("top",this._pos[1]+"px");inst.settings.onSelect=onSelect;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);this._showDatepicker(this._dialogInput[0]);if($.blockUI){$.blockUI(this.dpDiv)}$.data(this._dialogInput[0],PROP_NAME,inst);return this},_destroyDatepicker:function(target){var $target=$(target);var inst=$.data(target,PROP_NAME);if(!$target.hasClass(this.markerClassName)){return}var nodeName=target.nodeName.toLowerCase();$.removeData(target,PROP_NAME);if(nodeName=="input"){inst.append.remove();inst.trigger.remove();$target.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)}else{if(nodeName=="div"||nodeName=="span"){$target.removeClass(this.markerClassName).empty()}}},_enableDatepicker:function(target){var $target=$(target);var inst=$.data(target,PROP_NAME);if(!$target.hasClass(this.markerClassName)){return}var nodeName=target.nodeName.toLowerCase();if(nodeName=="input"){target.disabled=false;inst.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else{if(nodeName=="div"||nodeName=="span"){var inline=$target.children("."+this._inlineClass);inline.children().removeClass("ui-state-disabled")}}this._disabledInputs=$.map(this._disabledInputs,function(value){return(value==target?null:value)})},_disableDatepicker:function(target){var $target=$(target);var inst=$.data(target,PROP_NAME);if(!$target.hasClass(this.markerClassName)){return}var nodeName=target.nodeName.toLowerCase();if(nodeName=="input"){target.disabled=true;inst.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else{if(nodeName=="div"||nodeName=="span"){var inline=$target.children("."+this._inlineClass);inline.children().addClass("ui-state-disabled")}}this._disabledInputs=$.map(this._disabledInputs,function(value){return(value==target?null:value)});this._disabledInputs[this._disabledInputs.length]=target},_isDisabledDatepicker:function(target){if(!target){return false}for(var i=0;i-1)}},_doKeyUp:function(event){var inst=$.datepicker._getInst(event.target);if(inst.input.val()!=inst.lastVal){try{var date=$.datepicker.parseDate($.datepicker._get(inst,"dateFormat"),(inst.input?inst.input.val():null),$.datepicker._getFormatConfig(inst));if(date){$.datepicker._setDateFromField(inst);$.datepicker._updateAlternate(inst);$.datepicker._updateDatepicker(inst)}}catch(event){$.datepicker.log(event)}}return true},_showDatepicker:function(input){input=input.target||input;if(input.nodeName.toLowerCase()!="input"){input=$("input",input.parentNode)[0]}if($.datepicker._isDisabledDatepicker(input)||$.datepicker._lastInput==input){return}var inst=$.datepicker._getInst(input);if($.datepicker._curInst&&$.datepicker._curInst!=inst){$.datepicker._curInst.dpDiv.stop(true,true)}var beforeShow=$.datepicker._get(inst,"beforeShow");extendRemove(inst.settings,(beforeShow?beforeShow.apply(input,[input,inst]):{}));inst.lastVal=null;$.datepicker._lastInput=input;$.datepicker._setDateFromField(inst);if($.datepicker._inDialog){input.value=""}if(!$.datepicker._pos){$.datepicker._pos=$.datepicker._findPos(input);$.datepicker._pos[1]+=input.offsetHeight}var isFixed=false;$(input).parents().each(function(){isFixed|=$(this).css("position")=="fixed";return !isFixed});if(isFixed&&$.browser.opera){$.datepicker._pos[0]-=document.documentElement.scrollLeft;$.datepicker._pos[1]-=document.documentElement.scrollTop}var offset={left:$.datepicker._pos[0],top:$.datepicker._pos[1]};$.datepicker._pos=null;inst.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});$.datepicker._updateDatepicker(inst);offset=$.datepicker._checkOffset(inst,offset,isFixed);inst.dpDiv.css({position:($.datepicker._inDialog&&$.blockUI?"static":(isFixed?"fixed":"absolute")),display:"none",left:offset.left+"px",top:offset.top+"px"});if(!inst.inline){var showAnim=$.datepicker._get(inst,"showAnim");var duration=$.datepicker._get(inst,"duration");var postProcess=function(){$.datepicker._datepickerShowing=true;var borders=$.datepicker._getBorders(inst.dpDiv);inst.dpDiv.find("iframe.ui-datepicker-cover").css({left:-borders[0],top:-borders[1],width:inst.dpDiv.outerWidth(),height:inst.dpDiv.outerHeight()})};inst.dpDiv.zIndex(999);if($.effects&&$.effects[showAnim]){inst.dpDiv.show(showAnim,$.datepicker._get(inst,"showOptions"),duration,postProcess)}else{inst.dpDiv[showAnim||"show"]((showAnim?duration:null),postProcess)}if(!showAnim||!duration){postProcess()}if(inst.input.is(":visible")&&!inst.input.is(":disabled")){inst.input.focus()}$.datepicker._curInst=inst}},_updateDatepicker:function(inst){var self=this;var borders=$.datepicker._getBorders(inst.dpDiv);inst.dpDiv.empty().append(this._generateHTML(inst)).find("iframe.ui-datepicker-cover").css({left:-borders[0],top:-borders[1],width:inst.dpDiv.outerWidth(),height:inst.dpDiv.outerHeight()}).end().find("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a").bind("mouseout",function(){$(this).removeClass("ui-state-hover");if(this.className.indexOf("ui-datepicker-prev")!=-1){$(this).removeClass("ui-datepicker-prev-hover")}if(this.className.indexOf("ui-datepicker-next")!=-1){$(this).removeClass("ui-datepicker-next-hover")}}).bind("mouseover",function(){if(!self._isDisabledDatepicker(inst.inline?inst.dpDiv.parent()[0]:inst.input[0])){$(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");$(this).addClass("ui-state-hover");if(this.className.indexOf("ui-datepicker-prev")!=-1){$(this).addClass("ui-datepicker-prev-hover")}if(this.className.indexOf("ui-datepicker-next")!=-1){$(this).addClass("ui-datepicker-next-hover")}}}).end().find("."+this._dayOverClass+" a").trigger("mouseover").end();var numMonths=this._getNumberOfMonths(inst);var cols=numMonths[1];var width=17;if(cols>1){inst.dpDiv.addClass("ui-datepicker-multi-"+cols).css("width",(width*cols)+"em")}else{inst.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("")}inst.dpDiv[(numMonths[0]!=1||numMonths[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");inst.dpDiv[(this._get(inst,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl");if(inst==$.datepicker._curInst&&$.datepicker._datepickerShowing&&inst.input&&inst.input.is(":visible")&&!inst.input.is(":disabled")){inst.input.focus()}},_getBorders:function(elem){var convert=function(value){return{thin:1,medium:2,thick:3}[value]||value};return[parseFloat(convert(elem.css("border-left-width"))),parseFloat(convert(elem.css("border-top-width")))]},_checkOffset:function(inst,offset,isFixed){var dpWidth=inst.dpDiv.outerWidth();var dpHeight=inst.dpDiv.outerHeight();var inputWidth=inst.input?inst.input.outerWidth():0;var inputHeight=inst.input?inst.input.outerHeight():0;var viewWidth=document.documentElement.clientWidth+$(document).scrollLeft();var viewHeight=document.documentElement.clientHeight+$(document).scrollTop();offset.left-=(this._get(inst,"isRTL")?(dpWidth-inputWidth):0);offset.left-=(isFixed&&offset.left==inst.input.offset().left)?$(document).scrollLeft():0;offset.top-=(isFixed&&offset.top==(inst.input.offset().top+inputHeight))?$(document).scrollTop():0;offset.left-=Math.min(offset.left,(offset.left+dpWidth>viewWidth&&viewWidth>dpWidth)?Math.abs(offset.left+dpWidth-viewWidth):0);offset.top-=Math.min(offset.top,(offset.top+dpHeight>viewHeight&&viewHeight>dpHeight)?Math.abs(dpHeight+inputHeight):0);return offset},_findPos:function(obj){var inst=this._getInst(obj);var isRTL=this._get(inst,"isRTL");while(obj&&(obj.type=="hidden"||obj.nodeType!=1)){obj=obj[isRTL?"previousSibling":"nextSibling"]}var position=$(obj).offset();return[position.left,position.top]},_hideDatepicker:function(input){var inst=this._curInst;if(!inst||(input&&inst!=$.data(input,PROP_NAME))){return}if(this._datepickerShowing){var showAnim=this._get(inst,"showAnim");var duration=this._get(inst,"duration");var postProcess=function(){$.datepicker._tidyDialog(inst);this._curInst=null};if($.effects&&$.effects[showAnim]){inst.dpDiv.hide(showAnim,$.datepicker._get(inst,"showOptions"),duration,postProcess)}else{inst.dpDiv[(showAnim=="slideDown"?"slideUp":(showAnim=="fadeIn"?"fadeOut":"hide"))]((showAnim?duration:null),postProcess)}if(!showAnim){postProcess()}var onClose=this._get(inst,"onClose");if(onClose){onClose.apply((inst.input?inst.input[0]:null),[(inst.input?inst.input.val():""),inst])}this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if($.blockUI){$.unblockUI();$("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(inst){inst.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(event){if(!$.datepicker._curInst){return}var $target=$(event.target);if($target[0].id!=$.datepicker._mainDivId&&$target.parents("#"+$.datepicker._mainDivId).length==0&&!$target.hasClass($.datepicker.markerClassName)&&!$target.hasClass($.datepicker._triggerClass)&&$.datepicker._datepickerShowing&&!($.datepicker._inDialog&&$.blockUI)){$.datepicker._hideDatepicker()}},_adjustDate:function(id,offset,period){var target=$(id);var inst=this._getInst(target[0]);if(this._isDisabledDatepicker(target[0])){return}this._adjustInstDate(inst,offset+(period=="M"?this._get(inst,"showCurrentAtPos"):0),period);this._updateDatepicker(inst)},_gotoToday:function(id){var target=$(id);var inst=this._getInst(target[0]);if(this._get(inst,"gotoCurrent")&&inst.currentDay){inst.selectedDay=inst.currentDay;inst.drawMonth=inst.selectedMonth=inst.currentMonth;inst.drawYear=inst.selectedYear=inst.currentYear}else{var date=new Date();inst.selectedDay=date.getDate();inst.drawMonth=inst.selectedMonth=date.getMonth();inst.drawYear=inst.selectedYear=date.getFullYear()}this._notifyChange(inst);this._adjustDate(target)},_selectMonthYear:function(id,select,period){var target=$(id);var inst=this._getInst(target[0]);inst._selectingMonthYear=false;inst["selected"+(period=="M"?"Month":"Year")]=inst["draw"+(period=="M"?"Month":"Year")]=parseInt(select.options[select.selectedIndex].value,10);this._notifyChange(inst);this._adjustDate(target)},_clickMonthYear:function(id){var target=$(id);var inst=this._getInst(target[0]);if(inst.input&&inst._selectingMonthYear&&!$.browser.msie){inst.input.focus()}inst._selectingMonthYear=!inst._selectingMonthYear},_selectDay:function(id,month,year,td){var target=$(id);if($(td).hasClass(this._unselectableClass)||this._isDisabledDatepicker(target[0])){return}var inst=this._getInst(target[0]);inst.selectedDay=inst.currentDay=$("a",td).html();inst.selectedMonth=inst.currentMonth=month;inst.selectedYear=inst.currentYear=year;this._selectDate(id,this._formatDate(inst,inst.currentDay,inst.currentMonth,inst.currentYear))},_clearDate:function(id){var target=$(id);var inst=this._getInst(target[0]);this._selectDate(target,"")},_selectDate:function(id,dateStr){var target=$(id);var inst=this._getInst(target[0]);dateStr=(dateStr!=null?dateStr:this._formatDate(inst));if(inst.input){inst.input.val(dateStr)}this._updateAlternate(inst);var onSelect=this._get(inst,"onSelect");if(onSelect){onSelect.apply((inst.input?inst.input[0]:null),[dateStr,inst])}else{if(inst.input){inst.input.trigger("change")}}if(inst.inline){this._updateDatepicker(inst)}else{this._hideDatepicker();this._lastInput=inst.input[0];if(typeof(inst.input[0])!="object"){inst.input.focus()}this._lastInput=null}},_updateAlternate:function(inst){var altField=this._get(inst,"altField");if(altField){var altFormat=this._get(inst,"altFormat")||this._get(inst,"dateFormat");var date=this._getDate(inst);var dateStr=this.formatDate(altFormat,date,this._getFormatConfig(inst));$(altField).each(function(){$(this).val(dateStr)})}},noWeekends:function(date){var day=date.getDay();return[(day>0&&day<6),""]},iso8601Week:function(date){var checkDate=new Date(date.getTime());checkDate.setDate(checkDate.getDate()+4-(checkDate.getDay()||7));var time=checkDate.getTime();checkDate.setMonth(0);checkDate.setDate(1);return Math.floor(Math.round((time-checkDate)/86400000)/7)+1},parseDate:function(format,value,settings){if(format==null||value==null){throw"Invalid arguments"}value=(typeof value=="object"?value.toString():value+"");if(value==""){return null}var shortYearCutoff=(settings?settings.shortYearCutoff:null)||this._defaults.shortYearCutoff;var dayNamesShort=(settings?settings.dayNamesShort:null)||this._defaults.dayNamesShort;var dayNames=(settings?settings.dayNames:null)||this._defaults.dayNames;var monthNamesShort=(settings?settings.monthNamesShort:null)||this._defaults.monthNamesShort;var monthNames=(settings?settings.monthNames:null)||this._defaults.monthNames;var year=-1;var month=-1;var day=-1;var doy=-1;var literal=false;var lookAhead=function(match){var matches=(iFormat+1-1){month=1;day=doy;do{var dim=this._getDaysInMonth(year,month-1);if(day<=dim){break}month++;day-=dim}while(true)}var date=this._daylightSavingAdjust(new Date(year,month-1,day));if(date.getFullYear()!=year||date.getMonth()+1!=month||date.getDate()!=day){throw"Invalid date"}return date},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(((1970-1)*365+Math.floor(1970/4)-Math.floor(1970/100)+Math.floor(1970/400))*24*60*60*10000000),formatDate:function(format,date,settings){if(!date){return""}var dayNamesShort=(settings?settings.dayNamesShort:null)||this._defaults.dayNamesShort;var dayNames=(settings?settings.dayNames:null)||this._defaults.dayNames;var monthNamesShort=(settings?settings.monthNamesShort:null)||this._defaults.monthNamesShort;var monthNames=(settings?settings.monthNames:null)||this._defaults.monthNames;var lookAhead=function(match){var matches=(iFormat+112?date.getHours()+2:0);return date},_setDate:function(inst,date,noChange){var clear=!(date);var origMonth=inst.selectedMonth;var origYear=inst.selectedYear;date=this._restrictMinMax(inst,this._determineDate(inst,date,new Date()));inst.selectedDay=inst.currentDay=date.getDate();inst.drawMonth=inst.selectedMonth=inst.currentMonth=date.getMonth();inst.drawYear=inst.selectedYear=inst.currentYear=date.getFullYear();if((origMonth!=inst.selectedMonth||origYear!=inst.selectedYear)&&!noChange){this._notifyChange(inst)}this._adjustInstDate(inst);if(inst.input){inst.input.val(clear?"":this._formatDate(inst))}},_getDate:function(inst){var startDate=(!inst.currentYear||(inst.input&&inst.input.val()=="")?null:this._daylightSavingAdjust(new Date(inst.currentYear,inst.currentMonth,inst.currentDay)));return startDate},_generateHTML:function(inst){var today=new Date();today=this._daylightSavingAdjust(new Date(today.getFullYear(),today.getMonth(),today.getDate()));var isRTL=this._get(inst,"isRTL");var showButtonPanel=this._get(inst,"showButtonPanel");var hideIfNoPrevNext=this._get(inst,"hideIfNoPrevNext");var navigationAsDateFormat=this._get(inst,"navigationAsDateFormat");var numMonths=this._getNumberOfMonths(inst);var showCurrentAtPos=this._get(inst,"showCurrentAtPos");var stepMonths=this._get(inst,"stepMonths");var isMultiMonth=(numMonths[0]!=1||numMonths[1]!=1);var currentDate=this._daylightSavingAdjust((!inst.currentDay?new Date(9999,9,9):new Date(inst.currentYear,inst.currentMonth,inst.currentDay)));var minDate=this._getMinMaxDate(inst,"min");var maxDate=this._getMinMaxDate(inst,"max");var drawMonth=inst.drawMonth-showCurrentAtPos;var drawYear=inst.drawYear;if(drawMonth<0){drawMonth+=12;drawYear--}if(maxDate){var maxDraw=this._daylightSavingAdjust(new Date(maxDate.getFullYear(),maxDate.getMonth()-(numMonths[0]*numMonths[1])+1,maxDate.getDate()));maxDraw=(minDate&&maxDrawmaxDraw){drawMonth--;if(drawMonth<0){drawMonth=11;drawYear--}}}inst.drawMonth=drawMonth;inst.drawYear=drawYear;var prevText=this._get(inst,"prevText");prevText=(!navigationAsDateFormat?prevText:this.formatDate(prevText,this._daylightSavingAdjust(new Date(drawYear,drawMonth-stepMonths,1)),this._getFormatConfig(inst)));var prev=(this._canAdjustMonth(inst,-1,drawYear,drawMonth)?''+prevText+"":(hideIfNoPrevNext?"":''+prevText+""));var nextText=this._get(inst,"nextText");nextText=(!navigationAsDateFormat?nextText:this.formatDate(nextText,this._daylightSavingAdjust(new Date(drawYear,drawMonth+stepMonths,1)),this._getFormatConfig(inst)));var next=(this._canAdjustMonth(inst,+1,drawYear,drawMonth)?''+nextText+"":(hideIfNoPrevNext?"":''+nextText+""));var currentText=this._get(inst,"currentText");var gotoDate=(this._get(inst,"gotoCurrent")&&inst.currentDay?currentDate:today);currentText=(!navigationAsDateFormat?currentText:this.formatDate(currentText,gotoDate,this._getFormatConfig(inst)));var controls=(!inst.inline?'":"");var buttonPanel=(showButtonPanel)?'
      '+(isRTL?controls:"")+(this._isInRange(inst,gotoDate)?'":"")+(isRTL?"":controls)+"
      ":"";var firstDay=parseInt(this._get(inst,"firstDay"),10);firstDay=(isNaN(firstDay)?0:firstDay);var showWeek=this._get(inst,"showWeek");var dayNames=this._get(inst,"dayNames");var dayNamesShort=this._get(inst,"dayNamesShort");var dayNamesMin=this._get(inst,"dayNamesMin");var monthNames=this._get(inst,"monthNames");var monthNamesShort=this._get(inst,"monthNamesShort");var beforeShowDay=this._get(inst,"beforeShowDay");var showOtherMonths=this._get(inst,"showOtherMonths");var selectOtherMonths=this._get(inst,"selectOtherMonths");var calculateWeek=this._get(inst,"calculateWeek")||this.iso8601Week;var defaultDate=this._getDefaultDate(inst);var html="";for(var row=0;row1){switch(col){case 0:calender+=" ui-datepicker-group-first";cornerClass=" ui-corner-"+(isRTL?"right":"left");break;case numMonths[1]-1:calender+=" ui-datepicker-group-last";cornerClass=" ui-corner-"+(isRTL?"left":"right");break;default:calender+=" ui-datepicker-group-middle";cornerClass="";break}}calender+='">'}calender+='
      '+(/all|left/.test(cornerClass)&&row==0?(isRTL?next:prev):"")+(/all|right/.test(cornerClass)&&row==0?(isRTL?prev:next):"")+this._generateMonthYearHeader(inst,drawMonth,drawYear,minDate,maxDate,row>0||col>0,monthNames,monthNamesShort)+'
      ';var thead=(showWeek?'":"");for(var dow=0;dow<7;dow++){var day=(dow+firstDay)%7;thead+="=5?' class="ui-datepicker-week-end"':"")+'>'+dayNamesMin[day]+""}calender+=thead+"";var daysInMonth=this._getDaysInMonth(drawYear,drawMonth);if(drawYear==inst.selectedYear&&drawMonth==inst.selectedMonth){inst.selectedDay=Math.min(inst.selectedDay,daysInMonth)}var leadDays=(this._getFirstDayOfMonth(drawYear,drawMonth)-firstDay+7)%7;var numRows=(isMultiMonth?6:Math.ceil((leadDays+daysInMonth)/7));var printDate=this._daylightSavingAdjust(new Date(drawYear,drawMonth,1-leadDays));for(var dRow=0;dRow";var tbody=(!showWeek?"":'");for(var dow=0;dow<7;dow++){var daySettings=(beforeShowDay?beforeShowDay.apply((inst.input?inst.input[0]:null),[printDate]):[true,""]);var otherMonth=(printDate.getMonth()!=drawMonth);var unselectable=(otherMonth&&!selectOtherMonths)||!daySettings[0]||(minDate&&printDatemaxDate);tbody+='";printDate.setDate(printDate.getDate()+1);printDate=this._daylightSavingAdjust(printDate)}calender+=tbody+""}drawMonth++;if(drawMonth>11){drawMonth=0;drawYear++}calender+="
      '+this._get(inst,"weekHeader")+"
      '+this._get(inst,"calculateWeek")(printDate)+""+(otherMonth&&!showOtherMonths?" ":(unselectable?''+printDate.getDate()+"":''+printDate.getDate()+""))+"
      "+(isMultiMonth?""+((numMonths[0]>0&&col==numMonths[1]-1)?'
      ':""):"");group+=calender}html+=group}html+=buttonPanel+($.browser.msie&&parseInt($.browser.version,10)<7&&!inst.inline?'':"");inst._keyEvent=false;return html},_generateMonthYearHeader:function(inst,drawMonth,drawYear,minDate,maxDate,secondary,monthNames,monthNamesShort){var changeMonth=this._get(inst,"changeMonth");var changeYear=this._get(inst,"changeYear");var showMonthAfterYear=this._get(inst,"showMonthAfterYear");var html='
      ';var monthHtml="";if(secondary||!changeMonth){monthHtml+=''+monthNames[drawMonth]+""}else{var inMinYear=(minDate&&minDate.getFullYear()==drawYear);var inMaxYear=(maxDate&&maxDate.getFullYear()==drawYear);monthHtml+='"}if(!showMonthAfterYear){html+=monthHtml+(secondary||!(changeMonth&&changeYear)?" ":"")}if(secondary||!changeYear){html+=''+drawYear+""}else{var years=this._get(inst,"yearRange").split(":");var thisYear=new Date().getFullYear();var determineYear=function(value){var year=(value.match(/c[+-].*/)?drawYear+parseInt(value.substring(1),10):(value.match(/[+-].*/)?thisYear+parseInt(value,10):parseInt(value,10)));return(isNaN(year)?thisYear:year)};var year=determineYear(years[0]);var endYear=Math.max(year,determineYear(years[1]||""));year=(minDate?Math.max(year,minDate.getFullYear()):year);endYear=(maxDate?Math.min(endYear,maxDate.getFullYear()):endYear);html+='"}html+=this._get(inst,"yearSuffix");if(showMonthAfterYear){html+=(secondary||!(changeMonth&&changeYear)?" ":"")+monthHtml}html+="
      ";return html},_adjustInstDate:function(inst,offset,period){var year=inst.drawYear+(period=="Y"?offset:0);var month=inst.drawMonth+(period=="M"?offset:0);var day=Math.min(inst.selectedDay,this._getDaysInMonth(year,month))+(period=="D"?offset:0);var date=this._restrictMinMax(inst,this._daylightSavingAdjust(new Date(year,month,day)));inst.selectedDay=date.getDate();inst.drawMonth=inst.selectedMonth=date.getMonth();inst.drawYear=inst.selectedYear=date.getFullYear();if(period=="M"||period=="Y"){this._notifyChange(inst)}},_restrictMinMax:function(inst,date){var minDate=this._getMinMaxDate(inst,"min");var maxDate=this._getMinMaxDate(inst,"max");date=(minDate&&datemaxDate?maxDate:date);return date},_notifyChange:function(inst){var onChange=this._get(inst,"onChangeMonthYear");if(onChange){onChange.apply((inst.input?inst.input[0]:null),[inst.selectedYear,inst.selectedMonth+1,inst])}},_getNumberOfMonths:function(inst){var numMonths=this._get(inst,"numberOfMonths");return(numMonths==null?[1,1]:(typeof numMonths=="number"?[1,numMonths]:numMonths))},_getMinMaxDate:function(inst,minMax){return this._determineDate(inst,this._get(inst,minMax+"Date"),null)},_getDaysInMonth:function(year,month){return 32-new Date(year,month,32).getDate()},_getFirstDayOfMonth:function(year,month){return new Date(year,month,1).getDay()},_canAdjustMonth:function(inst,offset,curYear,curMonth){var numMonths=this._getNumberOfMonths(inst);var date=this._daylightSavingAdjust(new Date(curYear,curMonth+(offset<0?offset:numMonths[0]*numMonths[1]),1));if(offset<0){date.setDate(this._getDaysInMonth(date.getFullYear(),date.getMonth()))}return this._isInRange(inst,date)},_isInRange:function(inst,date){var minDate=this._getMinMaxDate(inst,"min");var maxDate=this._getMinMaxDate(inst,"max");return((!minDate||date.getTime()>=minDate.getTime())&&(!maxDate||date.getTime()<=maxDate.getTime()))},_getFormatConfig:function(inst){var shortYearCutoff=this._get(inst,"shortYearCutoff");shortYearCutoff=(typeof shortYearCutoff!="string"?shortYearCutoff:new Date().getFullYear()%100+parseInt(shortYearCutoff,10));return{shortYearCutoff:shortYearCutoff,dayNamesShort:this._get(inst,"dayNamesShort"),dayNames:this._get(inst,"dayNames"),monthNamesShort:this._get(inst,"monthNamesShort"),monthNames:this._get(inst,"monthNames")}},_formatDate:function(inst,day,month,year){if(!day){inst.currentDay=inst.selectedDay;inst.currentMonth=inst.selectedMonth;inst.currentYear=inst.selectedYear}var date=(day?(typeof day=="object"?day:this._daylightSavingAdjust(new Date(year,month,day))):this._daylightSavingAdjust(new Date(inst.currentYear,inst.currentMonth,inst.currentDay)));return this.formatDate(this._get(inst,"dateFormat"),date,this._getFormatConfig(inst))}});function extendRemove(target,props){$.extend(target,props);for(var name in props){if(props[name]==null||props[name]==undefined){target[name]=props[name]}}return target}function isArray(a){return(a&&(($.browser.safari&&typeof a=="object"&&a.length)||(a.constructor&&a.constructor.toString().match(/\Array\(\)/))))}$.fn.datepicker=function(options){if(!$.datepicker.initialized){$(document).mousedown($.datepicker._checkExternalClick).find("body").append($.datepicker.dpDiv);$.datepicker.initialized=true}var otherArgs=Array.prototype.slice.call(arguments,1);if(typeof options=="string"&&(options=="isDisabled"||options=="getDate"||options=="widget")){return $.datepicker["_"+options+"Datepicker"].apply($.datepicker,[this[0]].concat(otherArgs))}if(options=="option"&&arguments.length==2&&typeof arguments[1]=="string"){return $.datepicker["_"+options+"Datepicker"].apply($.datepicker,[this[0]].concat(otherArgs))}return this.each(function(){typeof options=="string"?$.datepicker["_"+options+"Datepicker"].apply($.datepicker,[this].concat(otherArgs)):$.datepicker._attachDatepicker(this,options)})};$.datepicker=new Datepicker();$.datepicker.initialized=false;$.datepicker.uuid=new Date().getTime();$.datepicker.version="1.8";window["DP_jQuery_"+dpuuid]=$})(jQuery);;/* - * jQuery UI Progressbar 1.8 - * - * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. - * - * http://docs.jquery.com/UI/Progressbar - * - * Depends: - * jquery.ui.core.js - * jquery.ui.widget.js - */ (function(a){a.widget("ui.progressbar",{options:{value:0},_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this._valueMin(),"aria-valuemax":this._valueMax(),"aria-valuenow":this._value()});this.valueDiv=a("
      ").appendTo(this.element);this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow");this.valueDiv.remove();a.Widget.prototype.destroy.apply(this,arguments)},value:function(b){if(b===undefined){return this._value()}this._setOption("value",b);return this},_setOption:function(b,c){switch(b){case"value":this.options.value=c;this._refreshValue();this._trigger("change");break}a.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var b=this.options.value;if(typeof b!=="number"){b=0}if(bthis._valueMax()){b=this._valueMax()}return b},_valueMin:function(){return 0},_valueMax:function(){return 100},_refreshValue:function(){var b=this.value();this.valueDiv[b===this._valueMax()?"addClass":"removeClass"]("ui-corner-right").width(b+"%");this.element.attr("aria-valuenow",b)}});a.extend(a.ui.progressbar,{version:"1.8"})})(jQuery);;/* - * jQuery UI Effects 1.8 - * - * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. - * - * http://docs.jquery.com/UI/Effects/ - */ jQuery.effects||(function(g){g.effects={};g.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor","borderTopColor","color","outlineColor"],function(l,k){g.fx.step[k]=function(m){if(!m.colorInit){m.start=j(m.elem,k);m.end=i(m.end);m.colorInit=true}m.elem.style[k]="rgb("+Math.max(Math.min(parseInt((m.pos*(m.end[0]-m.start[0]))+m.start[0],10),255),0)+","+Math.max(Math.min(parseInt((m.pos*(m.end[1]-m.start[1]))+m.start[1],10),255),0)+","+Math.max(Math.min(parseInt((m.pos*(m.end[2]-m.start[2]))+m.start[2],10),255),0)+")"}});function i(l){var k;if(l&&l.constructor==Array&&l.length==3){return l}if(k=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(l)){return[parseInt(k[1],10),parseInt(k[2],10),parseInt(k[3],10)]}if(k=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(l)){return[parseFloat(k[1])*2.55,parseFloat(k[2])*2.55,parseFloat(k[3])*2.55]}if(k=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(l)){return[parseInt(k[1],16),parseInt(k[2],16),parseInt(k[3],16)]}if(k=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(l)){return[parseInt(k[1]+k[1],16),parseInt(k[2]+k[2],16),parseInt(k[3]+k[3],16)]}if(k=/rgba\(0, 0, 0, 0\)/.exec(l)){return a.transparent}return a[g.trim(l).toLowerCase()]}function j(m,k){var l;do{l=g.curCSS(m,k);if(l!=""&&l!="transparent"||g.nodeName(m,"body")){break}k="backgroundColor"}while(m=m.parentNode);return i(l)}var a={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]};var e=["add","remove","toggle"],c={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};function f(){var n=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle,o={},l,m;if(n&&n.length&&n[0]&&n[n[0]]){var k=n.length;while(k--){l=n[k];if(typeof n[l]=="string"){m=l.replace(/\-(\w)/g,function(p,q){return q.toUpperCase()});o[m]=n[l]}}}else{for(l in n){if(typeof n[l]==="string"){o[l]=n[l]}}}return o}function b(l){var k,m;for(k in l){m=l[k];if(m==null||g.isFunction(m)||k in c||(/scrollbar/).test(k)||(!(/color/i).test(k)&&isNaN(parseFloat(m)))){delete l[k]}}return l}function h(k,m){var n={_:0},l;for(l in m){if(k[l]!=m[l]){n[l]=m[l]}}return n}g.effects.animateClass=function(k,l,n,m){if(g.isFunction(n)){m=n;n=null}return this.each(function(){var r=g(this),o=r.attr("style")||" ",s=b(f.call(this)),q,p=r.attr("className");g.each(e,function(t,u){if(k[u]){r[u+"Class"](k[u])}});q=b(f.call(this));r.attr("className",p);r.animate(h(s,q),l,n,function(){g.each(e,function(t,u){if(k[u]){r[u+"Class"](k[u])}});if(typeof r.attr("style")=="object"){r.attr("style").cssText="";r.attr("style").cssText=o}else{r.attr("style",o)}if(m){m.apply(this,arguments)}})})};g.fn.extend({_addClass:g.fn.addClass,addClass:function(l,k,n,m){return k?g.effects.animateClass.apply(this,[{add:l},k,n,m]):this._addClass(l)},_removeClass:g.fn.removeClass,removeClass:function(l,k,n,m){return k?g.effects.animateClass.apply(this,[{remove:l},k,n,m]):this._removeClass(l)},_toggleClass:g.fn.toggleClass,toggleClass:function(m,l,k,o,n){if(typeof l=="boolean"||l===undefined){if(!k){return this._toggleClass(m,l)}else{return g.effects.animateClass.apply(this,[(l?{add:m}:{remove:m}),k,o,n])}}else{return g.effects.animateClass.apply(this,[{toggle:m},l,k,o])}},switchClass:function(k,m,l,o,n){return g.effects.animateClass.apply(this,[{add:m,remove:k},l,o,n])}});g.extend(g.effects,{version:"1.8",save:function(l,m){for(var k=0;k").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0});k.wrap(m);m=k.parent();if(k.css("position")=="static"){m.css({position:"relative"});k.css({position:"relative"})}else{g.extend(l,{position:k.css("position"),zIndex:k.css("z-index")});g.each(["top","left","bottom","right"],function(n,o){l[o]=k.css(o);if(isNaN(parseInt(l[o],10))){l[o]="auto"}});k.css({position:"relative",top:0,left:0})}return m.css(l).show()},removeWrapper:function(k){if(k.parent().is(".ui-effects-wrapper")){return k.parent().replaceWith(k)}return k},setTransition:function(l,n,k,m){m=m||{};g.each(n,function(p,o){unit=l.cssUnit(o);if(unit[0]>0){m[o]=unit[0]*k+unit[1]}});return m}});function d(l,k,m,n){if(typeof l=="object"){n=k;m=null;k=l;l=k.effect}if(g.isFunction(k)){n=k;m=null;k={}}if(g.isFunction(m)){n=m;m=null}if(typeof k=="number"||g.fx.speeds[k]){n=m;m=k;k={}}k=k||{};m=m||k.duration;m=g.fx.off?0:typeof m=="number"?m:g.fx.speeds[m]||g.fx.speeds._default;n=n||k.complete;return[l,k,m,n]}g.fn.extend({effect:function(n,m,p,q){var l=d.apply(this,arguments),o={options:l[1],duration:l[2],callback:l[3]},k=g.effects[n];return k&&!g.fx.off?k.call(this,o):this},_show:g.fn.show,show:function(l){if(!l||typeof l=="number"||g.fx.speeds[l]){return this._show.apply(this,arguments)}else{var k=d.apply(this,arguments);k[1].mode="show";return this.effect.apply(this,k)}},_hide:g.fn.hide,hide:function(l){if(!l||typeof l=="number"||g.fx.speeds[l]){return this._hide.apply(this,arguments)}else{var k=d.apply(this,arguments);k[1].mode="hide";return this.effect.apply(this,k)}},__toggle:g.fn.toggle,toggle:function(l){if(!l||typeof l=="number"||g.fx.speeds[l]||typeof l=="boolean"||g.isFunction(l)){return this.__toggle.apply(this,arguments)}else{var k=d.apply(this,arguments);k[1].mode="toggle";return this.effect.apply(this,k)}},cssUnit:function(k){var l=this.css(k),m=[];g.each(["em","px","%","pt"],function(n,o){if(l.indexOf(o)>0){m=[parseFloat(l),o]}});return m}});g.easing.jswing=g.easing.swing;g.extend(g.easing,{def:"easeOutQuad",swing:function(l,m,k,o,n){return g.easing[g.easing.def](l,m,k,o,n)},easeInQuad:function(l,m,k,o,n){return o*(m/=n)*m+k},easeOutQuad:function(l,m,k,o,n){return -o*(m/=n)*(m-2)+k},easeInOutQuad:function(l,m,k,o,n){if((m/=n/2)<1){return o/2*m*m+k}return -o/2*((--m)*(m-2)-1)+k},easeInCubic:function(l,m,k,o,n){return o*(m/=n)*m*m+k},easeOutCubic:function(l,m,k,o,n){return o*((m=m/n-1)*m*m+1)+k},easeInOutCubic:function(l,m,k,o,n){if((m/=n/2)<1){return o/2*m*m*m+k}return o/2*((m-=2)*m*m+2)+k},easeInQuart:function(l,m,k,o,n){return o*(m/=n)*m*m*m+k},easeOutQuart:function(l,m,k,o,n){return -o*((m=m/n-1)*m*m*m-1)+k},easeInOutQuart:function(l,m,k,o,n){if((m/=n/2)<1){return o/2*m*m*m*m+k}return -o/2*((m-=2)*m*m*m-2)+k},easeInQuint:function(l,m,k,o,n){return o*(m/=n)*m*m*m*m+k},easeOutQuint:function(l,m,k,o,n){return o*((m=m/n-1)*m*m*m*m+1)+k},easeInOutQuint:function(l,m,k,o,n){if((m/=n/2)<1){return o/2*m*m*m*m*m+k}return o/2*((m-=2)*m*m*m*m+2)+k},easeInSine:function(l,m,k,o,n){return -o*Math.cos(m/n*(Math.PI/2))+o+k},easeOutSine:function(l,m,k,o,n){return o*Math.sin(m/n*(Math.PI/2))+k},easeInOutSine:function(l,m,k,o,n){return -o/2*(Math.cos(Math.PI*m/n)-1)+k},easeInExpo:function(l,m,k,o,n){return(m==0)?k:o*Math.pow(2,10*(m/n-1))+k},easeOutExpo:function(l,m,k,o,n){return(m==n)?k+o:o*(-Math.pow(2,-10*m/n)+1)+k},easeInOutExpo:function(l,m,k,o,n){if(m==0){return k}if(m==n){return k+o}if((m/=n/2)<1){return o/2*Math.pow(2,10*(m-1))+k}return o/2*(-Math.pow(2,-10*--m)+2)+k},easeInCirc:function(l,m,k,o,n){return -o*(Math.sqrt(1-(m/=n)*m)-1)+k},easeOutCirc:function(l,m,k,o,n){return o*Math.sqrt(1-(m=m/n-1)*m)+k},easeInOutCirc:function(l,m,k,o,n){if((m/=n/2)<1){return -o/2*(Math.sqrt(1-m*m)-1)+k}return o/2*(Math.sqrt(1-(m-=2)*m)+1)+k},easeInElastic:function(l,n,k,u,r){var o=1.70158;var q=0;var m=u;if(n==0){return k}if((n/=r)==1){return k+u}if(!q){q=r*0.3}if(m").css({position:"absolute",visibility:"visible",left:-d*(g/e),top:-f*(c/k)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:g/e,height:c/k,left:l.left+d*(g/e)+(b.options.mode=="show"?(d-Math.floor(e/2))*(g/e):0),top:l.top+f*(c/k)+(b.options.mode=="show"?(f-Math.floor(k/2))*(c/k):0),opacity:b.options.mode=="show"?0:1}).animate({left:l.left+d*(g/e)+(b.options.mode=="show"?0:(d-Math.floor(e/2))*(g/e)),top:l.top+f*(c/k)+(b.options.mode=="show"?0:(f-Math.floor(k/2))*(c/k)),opacity:b.options.mode=="show"?1:0},b.duration||500)}}setTimeout(function(){b.options.mode=="show"?h.css({visibility:"visible"}):h.css({visibility:"visible"}).hide();if(b.callback){b.callback.apply(h[0])}h.dequeue();a("div.ui-effects-explode").remove()},b.duration||500)})}})(jQuery);;/* - * jQuery UI Effects Fold 1.8 - * - * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. - * - * http://docs.jquery.com/UI/Effects/Fold - * - * Depends: - * jquery.effects.core.js - */ (function(a){a.effects.fold=function(b){return this.queue(function(){var e=a(this),k=["position","top","left"];var h=a.effects.setMode(e,b.options.mode||"hide");var o=b.options.size||15;var n=!(!b.options.horizFirst);var g=b.duration?b.duration/2:a.fx.speeds._default/2;a.effects.save(e,k);e.show();var d=a.effects.createWrapper(e).css({overflow:"hidden"});var i=((h=="show")!=n);var f=i?["width","height"]:["height","width"];var c=i?[d.width(),d.height()]:[d.height(),d.width()];var j=/([0-9]+)%/.exec(o);if(j){o=parseInt(j[1],10)/100*c[h=="hide"?0:1]}if(h=="show"){d.css(n?{height:0,width:o}:{height:o,width:0})}var m={},l={};m[f[0]]=h=="show"?c[0]:o;l[f[1]]=h=="show"?c[1]:0;d.animate(m,g,b.options.easing).animate(l,g,b.options.easing,function(){if(h=="hide"){e.hide()}a.effects.restore(e,k);a.effects.removeWrapper(e);if(b.callback){b.callback.apply(e[0],arguments)}e.dequeue()})})}})(jQuery);;/* - * jQuery UI Effects Highlight 1.8 - * - * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. - * - * http://docs.jquery.com/UI/Effects/Highlight - * - * Depends: - * jquery.effects.core.js - */ (function(a){a.effects.highlight=function(b){return this.queue(function(){var d=a(this),c=["backgroundImage","backgroundColor","opacity"],f=a.effects.setMode(d,b.options.mode||"show"),e={backgroundColor:d.css("backgroundColor")};if(f=="hide"){e.opacity=0}a.effects.save(d,c);d.show().css({backgroundImage:"none",backgroundColor:b.options.color||"#ffff99"}).animate(e,{queue:false,duration:b.duration,easing:b.options.easing,complete:function(){(f=="hide"&&d.hide());a.effects.restore(d,c);(f=="show"&&!a.support.opacity&&this.style.removeAttribute("filter"));(b.callback&&b.callback.apply(this,arguments));d.dequeue()}})})}})(jQuery);;/* - * jQuery UI Effects Pulsate 1.8 - * - * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. - * - * http://docs.jquery.com/UI/Effects/Pulsate - * - * Depends: - * jquery.effects.core.js - */ (function(a){a.effects.pulsate=function(b){return this.queue(function(){var d=a(this),e=a.effects.setMode(d,b.options.mode||"show");times=((b.options.times||5)*2)-1;duration=b.duration?b.duration/2:a.fx.speeds._default/2,isVisible=d.is(":visible"),animateTo=0;if(!isVisible){d.css("opacity",0).show();animateTo=1}if((e=="hide"&&isVisible)||(e=="show"&&!isVisible)){times--}for(var c=0;c').appendTo(document.body).addClass(b.options.className).css({top:d.top,left:d.left,height:f.innerHeight(),width:f.innerWidth(),position:"absolute"}).animate(g,b.duration,b.options.easing,function(){c.remove();(b.callback&&b.callback.apply(f[0],arguments));f.dequeue()})})}})(jQuery);; +(function(b){b.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var a=this;this.element.bind("mousedown."+this.widgetName,function(c){return a._mouseDown(c)}).bind("click."+this.widgetName,function(c){if(true===b.data(c.target,a.widgetName+".preventClickEvent")){b.removeData(c.target,a.widgetName+".preventClickEvent");c.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(a){a.originalEvent= +a.originalEvent||{};if(!a.originalEvent.mouseHandled){this._mouseStarted&&this._mouseUp(a);this._mouseDownEvent=a;var c=this,e=a.which==1,f=typeof this.options.cancel=="string"?b(a.target).parents().add(a.target).filter(this.options.cancel).length:false;if(!e||f||!this._mouseCapture(a))return true;this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet)this._mouseDelayTimer=setTimeout(function(){c.mouseDelayMet=true},this.options.delay);if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a)){this._mouseStarted= +this._mouseStart(a)!==false;if(!this._mouseStarted){a.preventDefault();return true}}true===b.data(a.target,this.widgetName+".preventClickEvent")&&b.removeData(a.target,this.widgetName+".preventClickEvent");this._mouseMoveDelegate=function(d){return c._mouseMove(d)};this._mouseUpDelegate=function(d){return c._mouseUp(d)};b(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);a.preventDefault();return a.originalEvent.mouseHandled= +true}},_mouseMove:function(a){if(b.browser.msie&&!(document.documentMode>=9)&&!a.button)return this._mouseUp(a);if(this._mouseStarted){this._mouseDrag(a);return a.preventDefault()}if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,a)!==false)?this._mouseDrag(a):this._mouseUp(a);return!this._mouseStarted},_mouseUp:function(a){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate); +if(this._mouseStarted){this._mouseStarted=false;a.target==this._mouseDownEvent.target&&b.data(a.target,this.widgetName+".preventClickEvent",true);this._mouseStop(a)}return false},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery); +;/* + * jQuery UI Position 1.8.12 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Position + */ +(function(c){c.ui=c.ui||{};var n=/left|center|right/,o=/top|center|bottom/,t=c.fn.position,u=c.fn.offset;c.fn.position=function(b){if(!b||!b.of)return t.apply(this,arguments);b=c.extend({},b);var a=c(b.of),d=a[0],g=(b.collision||"flip").split(" "),e=b.offset?b.offset.split(" "):[0,0],h,k,j;if(d.nodeType===9){h=a.width();k=a.height();j={top:0,left:0}}else if(d.setTimeout){h=a.width();k=a.height();j={top:a.scrollTop(),left:a.scrollLeft()}}else if(d.preventDefault){b.at="left top";h=k=0;j={top:b.of.pageY, +left:b.of.pageX}}else{h=a.outerWidth();k=a.outerHeight();j=a.offset()}c.each(["my","at"],function(){var f=(b[this]||"").split(" ");if(f.length===1)f=n.test(f[0])?f.concat(["center"]):o.test(f[0])?["center"].concat(f):["center","center"];f[0]=n.test(f[0])?f[0]:"center";f[1]=o.test(f[1])?f[1]:"center";b[this]=f});if(g.length===1)g[1]=g[0];e[0]=parseInt(e[0],10)||0;if(e.length===1)e[1]=e[0];e[1]=parseInt(e[1],10)||0;if(b.at[0]==="right")j.left+=h;else if(b.at[0]==="center")j.left+=h/2;if(b.at[1]==="bottom")j.top+= +k;else if(b.at[1]==="center")j.top+=k/2;j.left+=e[0];j.top+=e[1];return this.each(function(){var f=c(this),l=f.outerWidth(),m=f.outerHeight(),p=parseInt(c.curCSS(this,"marginLeft",true))||0,q=parseInt(c.curCSS(this,"marginTop",true))||0,v=l+p+(parseInt(c.curCSS(this,"marginRight",true))||0),w=m+q+(parseInt(c.curCSS(this,"marginBottom",true))||0),i=c.extend({},j),r;if(b.my[0]==="right")i.left-=l;else if(b.my[0]==="center")i.left-=l/2;if(b.my[1]==="bottom")i.top-=m;else if(b.my[1]==="center")i.top-= +m/2;i.left=Math.round(i.left);i.top=Math.round(i.top);r={left:i.left-p,top:i.top-q};c.each(["left","top"],function(s,x){c.ui.position[g[s]]&&c.ui.position[g[s]][x](i,{targetWidth:h,targetHeight:k,elemWidth:l,elemHeight:m,collisionPosition:r,collisionWidth:v,collisionHeight:w,offset:e,my:b.my,at:b.at})});c.fn.bgiframe&&f.bgiframe();f.offset(c.extend(i,{using:b.using}))})};c.ui.position={fit:{left:function(b,a){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();b.left= +d>0?b.left-d:Math.max(b.left-a.collisionPosition.left,b.left)},top:function(b,a){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();b.top=d>0?b.top-d:Math.max(b.top-a.collisionPosition.top,b.top)}},flip:{left:function(b,a){if(a.at[0]!=="center"){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();var g=a.my[0]==="left"?-a.elemWidth:a.my[0]==="right"?a.elemWidth:0,e=a.at[0]==="left"?a.targetWidth:-a.targetWidth,h=-2*a.offset[0];b.left+= +a.collisionPosition.left<0?g+e+h:d>0?g+e+h:0}},top:function(b,a){if(a.at[1]!=="center"){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();var g=a.my[1]==="top"?-a.elemHeight:a.my[1]==="bottom"?a.elemHeight:0,e=a.at[1]==="top"?a.targetHeight:-a.targetHeight,h=-2*a.offset[1];b.top+=a.collisionPosition.top<0?g+e+h:d>0?g+e+h:0}}}};if(!c.offset.setOffset){c.offset.setOffset=function(b,a){if(/static/.test(c.curCSS(b,"position")))b.style.position="relative";var d=c(b), +g=d.offset(),e=parseInt(c.curCSS(b,"top",true),10)||0,h=parseInt(c.curCSS(b,"left",true),10)||0;g={top:a.top-g.top+e,left:a.left-g.left+h};"using"in a?a.using.call(b,g):d.css(g)};c.fn.offset=function(b){var a=this[0];if(!a||!a.ownerDocument)return null;if(b)return this.each(function(){c.offset.setOffset(this,b)});return u.call(this)}}})(jQuery); +;/* + * jQuery UI Draggable 1.8.12 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Draggables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function(d){d.widget("ui.draggable",d.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:true,appendTo:"parent",axis:false,connectToSortable:false,containment:false,cursor:"auto",cursorAt:false,grid:false,handle:false,helper:"original",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:false},_create:function(){if(this.options.helper== +"original"&&!/^(?:r|a|f)/.test(this.element.css("position")))this.element[0].style.position="relative";this.options.addClasses&&this.element.addClass("ui-draggable");this.options.disabled&&this.element.addClass("ui-draggable-disabled");this._mouseInit()},destroy:function(){if(this.element.data("draggable")){this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy();return this}},_mouseCapture:function(a){var b= +this.options;if(this.helper||b.disabled||d(a.target).is(".ui-resizable-handle"))return false;this.handle=this._getHandle(a);if(!this.handle)return false;return true},_mouseStart:function(a){var b=this.options;this.helper=this._createHelper(a);this._cacheHelperProportions();if(d.ui.ddmanager)d.ui.ddmanager.current=this;this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.positionAbs=this.element.offset();this.offset={top:this.offset.top- +this.margins.top,left:this.offset.left-this.margins.left};d.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this.position=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);b.containment&&this._setContainment();if(this._trigger("start",a)===false){this._clear();return false}this._cacheHelperProportions(); +d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.helper.addClass("ui-draggable-dragging");this._mouseDrag(a,true);return true},_mouseDrag:function(a,b){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");if(!b){b=this._uiHash();if(this._trigger("drag",a,b)===false){this._mouseUp({});return false}this.position=b.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis|| +this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);return false},_mouseStop:function(a){var b=false;if(d.ui.ddmanager&&!this.options.dropBehaviour)b=d.ui.ddmanager.drop(this,a);if(this.dropped){b=this.dropped;this.dropped=false}if((!this.element[0]||!this.element[0].parentNode)&&this.options.helper=="original")return false;if(this.options.revert=="invalid"&&!b||this.options.revert=="valid"&&b||this.options.revert===true||d.isFunction(this.options.revert)&& +this.options.revert.call(this.element,b)){var c=this;d(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){c._trigger("stop",a)!==false&&c._clear()})}else this._trigger("stop",a)!==false&&this._clear();return false},cancel:function(){this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear();return this},_getHandle:function(a){var b=!this.options.handle||!d(this.options.handle,this.element).length?true:false;d(this.options.handle,this.element).find("*").andSelf().each(function(){if(this== +a.target)b=true});return b},_createHelper:function(a){var b=this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a])):b.helper=="clone"?this.element.clone():this.element;a.parents("body").length||a.appendTo(b.appendTo=="parent"?this.element[0].parentNode:b.appendTo);a[0]!=this.element[0]&&!/(fixed|absolute)/.test(a.css("position"))&&a.css("position","absolute");return a},_adjustOffsetFromHelper:function(a){if(typeof a=="string")a=a.split(" ");if(d.isArray(a))a={left:+a[0],top:+a[1]|| +0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0], +this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a={top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.element.position();return{top:a.top- +(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(), +height:this.helper.outerHeight()}},_setContainment:function(){var a=this.options;if(a.containment=="parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[(a.containment=="document"?0:d(window).scrollLeft())-this.offset.relative.left-this.offset.parent.left,(a.containment=="document"?0:d(window).scrollTop())-this.offset.relative.top-this.offset.parent.top,(a.containment=="document"?0:d(window).scrollLeft())+d(a.containment=="document"? +document:window).width()-this.helperProportions.width-this.margins.left,(a.containment=="document"?0:d(window).scrollTop())+(d(a.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)&&a.containment.constructor!=Array){var b=d(a.containment)[0];if(b){a=d(a.containment).offset();var c=d(b).css("overflow")!="hidden";this.containment=[a.left+(parseInt(d(b).css("borderLeftWidth"), +10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0),a.top+(parseInt(d(b).css("borderTopWidth"),10)||0)+(parseInt(d(b).css("paddingTop"),10)||0),a.left+(c?Math.max(b.scrollWidth,b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"),10)||0)-(parseInt(d(b).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,a.top+(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"),10)||0)-(parseInt(d(b).css("paddingBottom"), +10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom]}}else if(a.containment.constructor==Array)this.containment=a.containment},_convertPositionTo:function(a,b){if(!b)b=this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName);return{top:b.top+this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&& +d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=this.options,c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0], +this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName),e=a.pageX,g=a.pageY;if(this.originalPosition){if(this.containment){if(a.pageX-this.offset.click.leftthis.containment[2])e=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g= +this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g-this.originalPageY)/b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.topthis.containment[3])?g:!(g-this.offset.click.topthis.containment[2])? +e:!(e-this.offset.click.left').css({width:this.offsetWidth+ +"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1E3}).css(d(this).offset()).appendTo("body")})},stop:function(){d("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)})}});d.ui.plugin.add("draggable","opacity",{start:function(a,b){a=d(b.helper);b=d(this).data("draggable").options;if(a.css("opacity"))b._opacity=a.css("opacity");a.css("opacity",b.opacity)},stop:function(a,b){a=d(this).data("draggable").options;a._opacity&&d(b.helper).css("opacity", +a._opacity)}});d.ui.plugin.add("draggable","scroll",{start:function(){var a=d(this).data("draggable");if(a.scrollParent[0]!=document&&a.scrollParent[0].tagName!="HTML")a.overflowOffset=a.scrollParent.offset()},drag:function(a){var b=d(this).data("draggable"),c=b.options,f=false;if(b.scrollParent[0]!=document&&b.scrollParent[0].tagName!="HTML"){if(!c.axis||c.axis!="x")if(b.overflowOffset.top+b.scrollParent[0].offsetHeight-a.pageY=0;h--){var i=c.snapElements[h].left,k=i+c.snapElements[h].width,j=c.snapElements[h].top,l=j+c.snapElements[h].height;if(i-e=j&&f<=l||h>=j&&h<=l||fl)&&(e>= +i&&e<=k||g>=i&&g<=k||ek);default:return false}};d.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(a,b){var c=d.ui.ddmanager.droppables[a.options.scope]||[],e=b?b.type:null,g=(a.currentItem||a.element).find(":data(droppable)").andSelf(),f=0;a:for(;f').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(), +top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle= +this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=a.handles||(!e(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne", +nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all")this.handles="n,e,s,w,se,sw,ne,nw";var c=this.handles.split(",");this.handles={};for(var d=0;d');/sw|se|ne|nw/.test(f)&&g.css({zIndex:++a.zIndex});"se"==f&&g.addClass("ui-icon ui-icon-gripsmall-diagonal-se");this.handles[f]=".ui-resizable-"+f;this.element.append(g)}}this._renderAxis=function(h){h=h||this.element;for(var i in this.handles){if(this.handles[i].constructor== +String)this.handles[i]=e(this.handles[i],this.element).show();if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var j=e(this.handles[i],this.element),k=0;k=/sw|ne|nw|se|n|s/.test(i)?j.outerHeight():j.outerWidth();j=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join("");h.css(j,k);this._proportionallyResize()}e(this.handles[i])}};this._renderAxis(this.element);this._handles=e(".ui-resizable-handle",this.element).disableSelection(); +this._handles.mouseover(function(){if(!b.resizing){if(this.className)var h=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=h&&h[1]?h[1]:"se"}});if(a.autoHide){this._handles.hide();e(this.element).addClass("ui-resizable-autohide").hover(function(){e(this).removeClass("ui-resizable-autohide");b._handles.show()},function(){if(!b.resizing){e(this).addClass("ui-resizable-autohide");b._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var b=function(c){e(c).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()}; +if(this.elementIsWrapper){b(this.element);var a=this.element;a.after(this.originalElement.css({position:a.css("position"),width:a.outerWidth(),height:a.outerHeight(),top:a.css("top"),left:a.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);b(this.originalElement);return this},_mouseCapture:function(b){var a=false;for(var c in this.handles)if(e(this.handles[c])[0]==b.target)a=true;return!this.options.disabled&&a},_mouseStart:function(b){var a=this.options,c=this.element.position(), +d=this.element;this.resizing=true;this.documentScroll={top:e(document).scrollTop(),left:e(document).scrollLeft()};if(d.is(".ui-draggable")||/absolute/.test(d.css("position")))d.css({position:"absolute",top:c.top,left:c.left});e.browser.opera&&/relative/.test(d.css("position"))&&d.css({position:"relative",top:"auto",left:"auto"});this._renderProxy();c=m(this.helper.css("left"));var f=m(this.helper.css("top"));if(a.containment){c+=e(a.containment).scrollLeft()||0;f+=e(a.containment).scrollTop()||0}this.offset= +this.helper.offset();this.position={left:c,top:f};this.size=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalSize=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalPosition={left:c,top:f};this.sizeDiff={width:d.outerWidth()-d.width(),height:d.outerHeight()-d.height()};this.originalMousePosition={left:b.pageX,top:b.pageY};this.aspectRatio=typeof a.aspectRatio=="number"?a.aspectRatio: +this.originalSize.width/this.originalSize.height||1;a=e(".ui-resizable-"+this.axis).css("cursor");e("body").css("cursor",a=="auto"?this.axis+"-resize":a);d.addClass("ui-resizable-resizing");this._propagate("start",b);return true},_mouseDrag:function(b){var a=this.helper,c=this.originalMousePosition,d=this._change[this.axis];if(!d)return false;c=d.apply(this,[b,b.pageX-c.left||0,b.pageY-c.top||0]);if(this._aspectRatio||b.shiftKey)c=this._updateRatio(c,b);c=this._respectSize(c,b);this._propagate("resize", +b);a.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize();this._updateCache(c);this._trigger("resize",b,this.ui());return false},_mouseStop:function(b){this.resizing=false;var a=this.options,c=this;if(this._helper){var d=this._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName);d=f&&e.ui.hasScroll(d[0],"left")?0:c.sizeDiff.height; +f=f?0:c.sizeDiff.width;f={width:c.helper.width()-f,height:c.helper.height()-d};d=parseInt(c.element.css("left"),10)+(c.position.left-c.originalPosition.left)||null;var g=parseInt(c.element.css("top"),10)+(c.position.top-c.originalPosition.top)||null;a.animate||this.element.css(e.extend(f,{top:g,left:d}));c.helper.height(c.size.height);c.helper.width(c.size.width);this._helper&&!a.animate&&this._proportionallyResize()}e("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing"); +this._propagate("stop",b);this._helper&&this.helper.remove();return false},_updateCache:function(b){this.offset=this.helper.offset();if(l(b.left))this.position.left=b.left;if(l(b.top))this.position.top=b.top;if(l(b.height))this.size.height=b.height;if(l(b.width))this.size.width=b.width},_updateRatio:function(b){var a=this.position,c=this.size,d=this.axis;if(b.height)b.width=c.height*this.aspectRatio;else if(b.width)b.height=c.width/this.aspectRatio;if(d=="sw"){b.left=a.left+(c.width-b.width);b.top= +null}if(d=="nw"){b.top=a.top+(c.height-b.height);b.left=a.left+(c.width-b.width)}return b},_respectSize:function(b){var a=this.options,c=this.axis,d=l(b.width)&&a.maxWidth&&a.maxWidthb.width,h=l(b.height)&&a.minHeight&&a.minHeight>b.height;if(g)b.width=a.minWidth;if(h)b.height=a.minHeight;if(d)b.width=a.maxWidth;if(f)b.height=a.maxHeight;var i=this.originalPosition.left+this.originalSize.width,j=this.position.top+ +this.size.height,k=/sw|nw|w/.test(c);c=/nw|ne|n/.test(c);if(g&&k)b.left=i-a.minWidth;if(d&&k)b.left=i-a.maxWidth;if(h&&c)b.top=j-a.minHeight;if(f&&c)b.top=j-a.maxHeight;if((a=!b.width&&!b.height)&&!b.left&&b.top)b.top=null;else if(a&&!b.top&&b.left)b.left=null;return b},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var b=this.helper||this.element,a=0;a');var a=e.browser.msie&&e.browser.version<7,c=a?1:0;a=a?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+a,height:this.element.outerHeight()+a,position:"absolute",left:this.elementOffset.left-c+"px",top:this.elementOffset.top-c+"px",zIndex:++b.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(b, +a){return{width:this.originalSize.width+a}},w:function(b,a){return{left:this.originalPosition.left+a,width:this.originalSize.width-a}},n:function(b,a,c){return{top:this.originalPosition.top+c,height:this.originalSize.height-c}},s:function(b,a,c){return{height:this.originalSize.height+c}},se:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},sw:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,a, +c]))},ne:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},nw:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,a,c]))}},_propagate:function(b,a){e.ui.plugin.call(this,b,[a,this.ui()]);b!="resize"&&this._trigger(b,a,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize, +originalPosition:this.originalPosition}}});e.extend(e.ui.resizable,{version:"1.8.12"});e.ui.plugin.add("resizable","alsoResize",{start:function(){var b=e(this).data("resizable").options,a=function(c){e(c).each(function(){var d=e(this);d.data("resizable-alsoresize",{width:parseInt(d.width(),10),height:parseInt(d.height(),10),left:parseInt(d.css("left"),10),top:parseInt(d.css("top"),10),position:d.css("position")})})};if(typeof b.alsoResize=="object"&&!b.alsoResize.parentNode)if(b.alsoResize.length){b.alsoResize= +b.alsoResize[0];a(b.alsoResize)}else e.each(b.alsoResize,function(c){a(c)});else a(b.alsoResize)},resize:function(b,a){var c=e(this).data("resizable");b=c.options;var d=c.originalSize,f=c.originalPosition,g={height:c.size.height-d.height||0,width:c.size.width-d.width||0,top:c.position.top-f.top||0,left:c.position.left-f.left||0},h=function(i,j){e(i).each(function(){var k=e(this),q=e(this).data("resizable-alsoresize"),p={},r=j&&j.length?j:k.parents(a.originalElement[0]).length?["width","height"]:["width", +"height","top","left"];e.each(r,function(n,o){if((n=(q[o]||0)+(g[o]||0))&&n>=0)p[o]=n||null});if(e.browser.opera&&/relative/.test(k.css("position"))){c._revertToRelativePosition=true;k.css({position:"absolute",top:"auto",left:"auto"})}k.css(p)})};typeof b.alsoResize=="object"&&!b.alsoResize.nodeType?e.each(b.alsoResize,function(i,j){h(i,j)}):h(b.alsoResize)},stop:function(){var b=e(this).data("resizable"),a=b.options,c=function(d){e(d).each(function(){var f=e(this);f.css({position:f.data("resizable-alsoresize").position})})}; +if(b._revertToRelativePosition){b._revertToRelativePosition=false;typeof a.alsoResize=="object"&&!a.alsoResize.nodeType?e.each(a.alsoResize,function(d){c(d)}):c(a.alsoResize)}e(this).removeData("resizable-alsoresize")}});e.ui.plugin.add("resizable","animate",{stop:function(b){var a=e(this).data("resizable"),c=a.options,d=a._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName),g=f&&e.ui.hasScroll(d[0],"left")?0:a.sizeDiff.height;f={width:a.size.width-(f?0:a.sizeDiff.width),height:a.size.height- +g};g=parseInt(a.element.css("left"),10)+(a.position.left-a.originalPosition.left)||null;var h=parseInt(a.element.css("top"),10)+(a.position.top-a.originalPosition.top)||null;a.element.animate(e.extend(f,h&&g?{top:h,left:g}:{}),{duration:c.animateDuration,easing:c.animateEasing,step:function(){var i={width:parseInt(a.element.css("width"),10),height:parseInt(a.element.css("height"),10),top:parseInt(a.element.css("top"),10),left:parseInt(a.element.css("left"),10)};d&&d.length&&e(d[0]).css({width:i.width, +height:i.height});a._updateCache(i);a._propagate("resize",b)}})}});e.ui.plugin.add("resizable","containment",{start:function(){var b=e(this).data("resizable"),a=b.element,c=b.options.containment;if(a=c instanceof e?c.get(0):/parent/.test(c)?a.parent().get(0):c){b.containerElement=e(a);if(/document/.test(c)||c==document){b.containerOffset={left:0,top:0};b.containerPosition={left:0,top:0};b.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}}else{var d= +e(a),f=[];e(["Top","Right","Left","Bottom"]).each(function(i,j){f[i]=m(d.css("padding"+j))});b.containerOffset=d.offset();b.containerPosition=d.position();b.containerSize={height:d.innerHeight()-f[3],width:d.innerWidth()-f[1]};c=b.containerOffset;var g=b.containerSize.height,h=b.containerSize.width;h=e.ui.hasScroll(a,"left")?a.scrollWidth:h;g=e.ui.hasScroll(a)?a.scrollHeight:g;b.parentData={element:a,left:c.left,top:c.top,width:h,height:g}}}},resize:function(b){var a=e(this).data("resizable"),c=a.options, +d=a.containerOffset,f=a.position;b=a._aspectRatio||b.shiftKey;var g={top:0,left:0},h=a.containerElement;if(h[0]!=document&&/static/.test(h.css("position")))g=d;if(f.left<(a._helper?d.left:0)){a.size.width+=a._helper?a.position.left-d.left:a.position.left-g.left;if(b)a.size.height=a.size.width/c.aspectRatio;a.position.left=c.helper?d.left:0}if(f.top<(a._helper?d.top:0)){a.size.height+=a._helper?a.position.top-d.top:a.position.top;if(b)a.size.width=a.size.height*c.aspectRatio;a.position.top=a._helper? +d.top:0}a.offset.left=a.parentData.left+a.position.left;a.offset.top=a.parentData.top+a.position.top;c=Math.abs((a._helper?a.offset.left-g.left:a.offset.left-g.left)+a.sizeDiff.width);d=Math.abs((a._helper?a.offset.top-g.top:a.offset.top-d.top)+a.sizeDiff.height);f=a.containerElement.get(0)==a.element.parent().get(0);g=/relative|absolute/.test(a.containerElement.css("position"));if(f&&g)c-=a.parentData.left;if(c+a.size.width>=a.parentData.width){a.size.width=a.parentData.width-c;if(b)a.size.height= +a.size.width/a.aspectRatio}if(d+a.size.height>=a.parentData.height){a.size.height=a.parentData.height-d;if(b)a.size.width=a.size.height*a.aspectRatio}},stop:function(){var b=e(this).data("resizable"),a=b.options,c=b.containerOffset,d=b.containerPosition,f=b.containerElement,g=e(b.helper),h=g.offset(),i=g.outerWidth()-b.sizeDiff.width;g=g.outerHeight()-b.sizeDiff.height;b._helper&&!a.animate&&/relative/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g});b._helper&&!a.animate&& +/static/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g})}});e.ui.plugin.add("resizable","ghost",{start:function(){var b=e(this).data("resizable"),a=b.options,c=b.size;b.ghost=b.originalElement.clone();b.ghost.css({opacity:0.25,display:"block",position:"relative",height:c.height,width:c.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof a.ghost=="string"?a.ghost:"");b.ghost.appendTo(b.helper)},resize:function(){var b=e(this).data("resizable"); +b.ghost&&b.ghost.css({position:"relative",height:b.size.height,width:b.size.width})},stop:function(){var b=e(this).data("resizable");b.ghost&&b.helper&&b.helper.get(0).removeChild(b.ghost.get(0))}});e.ui.plugin.add("resizable","grid",{resize:function(){var b=e(this).data("resizable"),a=b.options,c=b.size,d=b.originalSize,f=b.originalPosition,g=b.axis;a.grid=typeof a.grid=="number"?[a.grid,a.grid]:a.grid;var h=Math.round((c.width-d.width)/(a.grid[0]||1))*(a.grid[0]||1);a=Math.round((c.height-d.height)/ +(a.grid[1]||1))*(a.grid[1]||1);if(/^(se|s|e)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a}else if(/^(ne)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}else{if(/^(sw)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a}else{b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}b.position.left=f.left-h}}});var m=function(b){return parseInt(b,10)||0},l=function(b){return!isNaN(parseInt(b,10))}})(jQuery); +;/* + * jQuery UI Selectable 1.8.12 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Selectables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function(e){e.widget("ui.selectable",e.ui.mouse,{options:{appendTo:"body",autoRefresh:true,distance:0,filter:"*",tolerance:"touch"},_create:function(){var c=this;this.element.addClass("ui-selectable");this.dragged=false;var f;this.refresh=function(){f=e(c.options.filter,c.element[0]);f.each(function(){var d=e(this),b=d.offset();e.data(this,"selectable-item",{element:this,$element:d,left:b.left,top:b.top,right:b.left+d.outerWidth(),bottom:b.top+d.outerHeight(),startselected:false,selected:d.hasClass("ui-selected"), +selecting:d.hasClass("ui-selecting"),unselecting:d.hasClass("ui-unselecting")})})};this.refresh();this.selectees=f.addClass("ui-selectee");this._mouseInit();this.helper=e("
      ")},destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item");this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable");this._mouseDestroy();return this},_mouseStart:function(c){var f=this;this.opos=[c.pageX, +c.pageY];if(!this.options.disabled){var d=this.options;this.selectees=e(d.filter,this.element[0]);this._trigger("start",c);e(d.appendTo).append(this.helper);this.helper.css({left:c.clientX,top:c.clientY,width:0,height:0});d.autoRefresh&&this.refresh();this.selectees.filter(".ui-selected").each(function(){var b=e.data(this,"selectable-item");b.startselected=true;if(!c.metaKey){b.$element.removeClass("ui-selected");b.selected=false;b.$element.addClass("ui-unselecting");b.unselecting=true;f._trigger("unselecting", +c,{unselecting:b.element})}});e(c.target).parents().andSelf().each(function(){var b=e.data(this,"selectable-item");if(b){var g=!c.metaKey||!b.$element.hasClass("ui-selected");b.$element.removeClass(g?"ui-unselecting":"ui-selected").addClass(g?"ui-selecting":"ui-unselecting");b.unselecting=!g;b.selecting=g;(b.selected=g)?f._trigger("selecting",c,{selecting:b.element}):f._trigger("unselecting",c,{unselecting:b.element});return false}})}},_mouseDrag:function(c){var f=this;this.dragged=true;if(!this.options.disabled){var d= +this.options,b=this.opos[0],g=this.opos[1],h=c.pageX,i=c.pageY;if(b>h){var j=h;h=b;b=j}if(g>i){j=i;i=g;g=j}this.helper.css({left:b,top:g,width:h-b,height:i-g});this.selectees.each(function(){var a=e.data(this,"selectable-item");if(!(!a||a.element==f.element[0])){var k=false;if(d.tolerance=="touch")k=!(a.left>h||a.righti||a.bottomb&&a.rightg&&a.bottom *",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1E3},_create:function(){this.containerCache={};this.element.addClass("ui-sortable"); +this.refresh();this.floating=this.items.length?/left|right/.test(this.items[0].item.css("float"))||/inline|table-cell/.test(this.items[0].item.css("display")):false;this.offset=this.element.offset();this._mouseInit()},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").removeData("sortable").unbind(".sortable");this._mouseDestroy();for(var a=this.items.length-1;a>=0;a--)this.items[a].item.removeData("sortable-item");return this},_setOption:function(a,b){if(a==="disabled"){this.options[a]= +b;this.widget()[b?"addClass":"removeClass"]("ui-sortable-disabled")}else d.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(a,b){if(this.reverting)return false;if(this.options.disabled||this.options.type=="static")return false;this._refreshItems(a);var c=null,e=this;d(a.target).parents().each(function(){if(d.data(this,"sortable-item")==e){c=d(this);return false}});if(d.data(a.target,"sortable-item")==e)c=d(a.target);if(!c)return false;if(this.options.handle&&!b){var f=false; +d(this.options.handle,c).find("*").andSelf().each(function(){if(this==a.target)f=true});if(!f)return false}this.currentItem=c;this._removeCurrentsFromItems();return true},_mouseStart:function(a,b,c){b=this.options;var e=this;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(a);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left- +this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");d.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]}; +this.helper[0]!=this.currentItem[0]&&this.currentItem.hide();this._createPlaceholder();b.containment&&this._setContainment();if(b.cursor){if(d("body").css("cursor"))this._storedCursor=d("body").css("cursor");d("body").css("cursor",b.cursor)}if(b.opacity){if(this.helper.css("opacity"))this._storedOpacity=this.helper.css("opacity");this.helper.css("opacity",b.opacity)}if(b.zIndex){if(this.helper.css("zIndex"))this._storedZIndex=this.helper.css("zIndex");this.helper.css("zIndex",b.zIndex)}if(this.scrollParent[0]!= +document&&this.scrollParent[0].tagName!="HTML")this.overflowOffset=this.scrollParent.offset();this._trigger("start",a,this._uiHash());this._preserveHelperProportions||this._cacheHelperProportions();if(!c)for(c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("activate",a,e._uiHash(this));if(d.ui.ddmanager)d.ui.ddmanager.current=this;d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(a); +return true},_mouseDrag:function(a){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");if(!this.lastPositionAbs)this.lastPositionAbs=this.positionAbs;if(this.options.scroll){var b=this.options,c=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if(this.overflowOffset.top+this.scrollParent[0].offsetHeight-a.pageY=0;b--){c=this.items[b];var e=c.item[0],f=this._intersectsWithPointer(c);if(f)if(e!=this.currentItem[0]&&this.placeholder[f==1?"next":"prev"]()[0]!=e&&!d.ui.contains(this.placeholder[0],e)&&(this.options.type=="semi-dynamic"?!d.ui.contains(this.element[0], +e):true)){this.direction=f==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(c))this._rearrange(a,c);else break;this._trigger("change",a,this._uiHash());break}}this._contactContainers(a);d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);this._trigger("sort",a,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(a,b){if(a){d.ui.ddmanager&&!this.options.dropBehaviour&&d.ui.ddmanager.drop(this,a);if(this.options.revert){var c=this;b=c.placeholder.offset(); +c.reverting=true;d(this.helper).animate({left:b.left-this.offset.parent.left-c.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:b.top-this.offset.parent.top-c.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){c._clear(a)})}else this._clear(a,b);return false}},cancel:function(){var a=this;if(this.dragging){this._mouseUp({target:null});this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"): +this.currentItem.show();for(var b=this.containers.length-1;b>=0;b--){this.containers[b]._trigger("deactivate",null,a._uiHash(this));if(this.containers[b].containerCache.over){this.containers[b]._trigger("out",null,a._uiHash(this));this.containers[b].containerCache.over=0}}}if(this.placeholder){this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove();d.extend(this,{helper:null, +dragging:false,reverting:false,_noFinalSort:null});this.domPosition.prev?d(this.domPosition.prev).after(this.currentItem):d(this.domPosition.parent).prepend(this.currentItem)}return this},serialize:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};d(b).each(function(){var e=(d(a.item||this).attr(a.attribute||"id")||"").match(a.expression||/(.+)[-=_](.+)/);if(e)c.push((a.key||e[1]+"[]")+"="+(a.key&&a.expression?e[1]:e[2]))});!c.length&&a.key&&c.push(a.key+"=");return c.join("&")}, +toArray:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};b.each(function(){c.push(d(a.item||this).attr(a.attribute||"id")||"")});return c},_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,e=this.positionAbs.top,f=e+this.helperProportions.height,g=a.left,h=g+a.width,i=a.top,k=i+a.height,j=this.offset.click.top,l=this.offset.click.left;j=e+j>i&&e+jg&&b+la[this.floating?"width":"height"]?j:g0?"down":"up")},_getDragHorizontalDirection:function(){var a=this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){this._refreshItems(a);this.refreshPositions();return this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(a){var b=[],c=[],e=this._connectWith(); +if(e&&a)for(a=e.length-1;a>=0;a--)for(var f=d(e[a]),g=f.length-1;g>=0;g--){var h=d.data(f[g],"sortable");if(h&&h!=this&&!h.options.disabled)c.push([d.isFunction(h.options.items)?h.options.items.call(h.element):d(h.options.items,h.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),h])}c.push([d.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):d(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"), +this]);for(a=c.length-1;a>=0;a--)c[a][0].each(function(){b.push(this)});return d(b)},_removeCurrentsFromItems:function(){for(var a=this.currentItem.find(":data(sortable-item)"),b=0;b=0;f--)for(var g=d(e[f]),h=g.length-1;h>=0;h--){var i=d.data(g[h],"sortable");if(i&&i!=this&&!i.options.disabled){c.push([d.isFunction(i.options.items)?i.options.items.call(i.element[0],a,{item:this.currentItem}):d(i.options.items,i.element),i]);this.containers.push(i)}}for(f=c.length-1;f>=0;f--){a=c[f][1];e=c[f][0];h=0;for(g=e.length;h=0;b--){var c=this.items[b];if(!(c.instance!=this.currentContainer&&this.currentContainer&&c.item[0]!=this.currentItem[0])){var e=this.options.toleranceElement?d(this.options.toleranceElement,c.item):c.item;if(!a){c.width=e.outerWidth();c.height=e.outerHeight()}e=e.offset();c.left=e.left;c.top=e.top}}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(b= +this.containers.length-1;b>=0;b--){e=this.containers[b].element.offset();this.containers[b].containerCache.left=e.left;this.containers[b].containerCache.top=e.top;this.containers[b].containerCache.width=this.containers[b].element.outerWidth();this.containers[b].containerCache.height=this.containers[b].element.outerHeight()}return this},_createPlaceholder:function(a){var b=a||this,c=b.options;if(!c.placeholder||c.placeholder.constructor==String){var e=c.placeholder;c.placeholder={element:function(){var f= +d(document.createElement(b.currentItem[0].nodeName)).addClass(e||b.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];if(!e)f.style.visibility="hidden";return f},update:function(f,g){if(!(e&&!c.forcePlaceholderSize)){g.height()||g.height(b.currentItem.innerHeight()-parseInt(b.currentItem.css("paddingTop")||0,10)-parseInt(b.currentItem.css("paddingBottom")||0,10));g.width()||g.width(b.currentItem.innerWidth()-parseInt(b.currentItem.css("paddingLeft")||0,10)-parseInt(b.currentItem.css("paddingRight")|| +0,10))}}}}b.placeholder=d(c.placeholder.element.call(b.element,b.currentItem));b.currentItem.after(b.placeholder);c.placeholder.update(b,b.placeholder)},_contactContainers:function(a){for(var b=null,c=null,e=this.containers.length-1;e>=0;e--)if(!d.ui.contains(this.currentItem[0],this.containers[e].element[0]))if(this._intersectsWith(this.containers[e].containerCache)){if(!(b&&d.ui.contains(this.containers[e].element[0],b.element[0]))){b=this.containers[e];c=e}}else if(this.containers[e].containerCache.over){this.containers[e]._trigger("out", +a,this._uiHash(this));this.containers[e].containerCache.over=0}if(b)if(this.containers.length===1){this.containers[c]._trigger("over",a,this._uiHash(this));this.containers[c].containerCache.over=1}else if(this.currentContainer!=this.containers[c]){b=1E4;e=null;for(var f=this.positionAbs[this.containers[c].floating?"left":"top"],g=this.items.length-1;g>=0;g--)if(d.ui.contains(this.containers[c].element[0],this.items[g].item[0])){var h=this.items[g][this.containers[c].floating?"left":"top"];if(Math.abs(h- +f)this.containment[2])f=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g- +this.originalPageY)/b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.topthis.containment[3])?g:!(g-this.offset.click.topthis.containment[2])?f:!(f-this.offset.click.left=0;e--)if(d.ui.contains(this.containers[e].element[0],this.currentItem[0])&&!b){c.push(function(f){return function(g){f._trigger("receive",g,this._uiHash(this))}}.call(this,this.containers[e]));c.push(function(f){return function(g){f._trigger("update",g,this._uiHash(this))}}.call(this,this.containers[e]))}}for(e=this.containers.length-1;e>=0;e--){b||c.push(function(f){return function(g){f._trigger("deactivate",g,this._uiHash(this))}}.call(this, +this.containers[e]));if(this.containers[e].containerCache.over){c.push(function(f){return function(g){f._trigger("out",g,this._uiHash(this))}}.call(this,this.containers[e]));this.containers[e].containerCache.over=0}}this._storedCursor&&d("body").css("cursor",this._storedCursor);this._storedOpacity&&this.helper.css("opacity",this._storedOpacity);if(this._storedZIndex)this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex);this.dragging=false;if(this.cancelHelperRemoval){if(!b){this._trigger("beforeStop", +a,this._uiHash());for(e=0;e li > :first-child,> :not(li):even",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:false,navigationFilter:function(){return this.href.toLowerCase()===location.href.toLowerCase()}},_create:function(){var a=this,b=a.options;a.running=0;a.element.addClass("ui-accordion ui-widget ui-helper-reset").children("li").addClass("ui-accordion-li-fix"); +a.headers=a.element.find(b.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){b.disabled||c(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){b.disabled||c(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){b.disabled||c(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){b.disabled||c(this).removeClass("ui-state-focus")});a.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom"); +if(b.navigation){var d=a.element.find("a").filter(b.navigationFilter).eq(0);if(d.length){var h=d.closest(".ui-accordion-header");a.active=h.length?h:d.closest(".ui-accordion-content").prev()}}a.active=a._findActive(a.active||b.active).addClass("ui-state-default ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top");a.active.next().addClass("ui-accordion-content-active");a._createIcons();a.resize();a.element.attr("role","tablist");a.headers.attr("role","tab").bind("keydown.accordion", +function(f){return a._keydown(f)}).next().attr("role","tabpanel");a.headers.not(a.active||"").attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).next().hide();a.active.length?a.active.attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}):a.headers.eq(0).attr("tabIndex",0);c.browser.safari||a.headers.find("a").attr("tabIndex",-1);b.event&&a.headers.bind(b.event.split(" ").join(".accordion ")+".accordion",function(f){a._clickHandler.call(a,f,this);f.preventDefault()})},_createIcons:function(){var a= +this.options;if(a.icons){c("").addClass("ui-icon "+a.icons.header).prependTo(this.headers);this.active.children(".ui-icon").toggleClass(a.icons.header).toggleClass(a.icons.headerSelected);this.element.addClass("ui-accordion-icons")}},_destroyIcons:function(){this.headers.children(".ui-icon").remove();this.element.removeClass("ui-accordion-icons")},destroy:function(){var a=this.options;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role");this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("tabIndex"); +this.headers.find("a").removeAttr("tabIndex");this._destroyIcons();var b=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled");if(a.autoHeight||a.fillHeight)b.css("height","");return c.Widget.prototype.destroy.call(this)},_setOption:function(a,b){c.Widget.prototype._setOption.apply(this,arguments);a=="active"&&this.activate(b);if(a=="icons"){this._destroyIcons(); +b&&this._createIcons()}if(a=="disabled")this.headers.add(this.headers.next())[b?"addClass":"removeClass"]("ui-accordion-disabled ui-state-disabled")},_keydown:function(a){if(!(this.options.disabled||a.altKey||a.ctrlKey)){var b=c.ui.keyCode,d=this.headers.length,h=this.headers.index(a.target),f=false;switch(a.keyCode){case b.RIGHT:case b.DOWN:f=this.headers[(h+1)%d];break;case b.LEFT:case b.UP:f=this.headers[(h-1+d)%d];break;case b.SPACE:case b.ENTER:this._clickHandler({target:a.target},a.target); +a.preventDefault()}if(f){c(a.target).attr("tabIndex",-1);c(f).attr("tabIndex",0);f.focus();return false}return true}},resize:function(){var a=this.options,b;if(a.fillSpace){if(c.browser.msie){var d=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}b=this.element.parent().height();c.browser.msie&&this.element.parent().css("overflow",d);this.headers.each(function(){b-=c(this).outerHeight(true)});this.headers.next().each(function(){c(this).height(Math.max(0,b-c(this).innerHeight()+ +c(this).height()))}).css("overflow","auto")}else if(a.autoHeight){b=0;this.headers.next().each(function(){b=Math.max(b,c(this).height("").height())}).height(b)}return this},activate:function(a){this.options.active=a;a=this._findActive(a)[0];this._clickHandler({target:a},a);return this},_findActive:function(a){return a?typeof a==="number"?this.headers.filter(":eq("+a+")"):this.headers.not(this.headers.not(a)):a===false?c([]):this.headers.filter(":eq(0)")},_clickHandler:function(a,b){var d=this.options; +if(!d.disabled)if(a.target){a=c(a.currentTarget||b);b=a[0]===this.active[0];d.active=d.collapsible&&b?false:this.headers.index(a);if(!(this.running||!d.collapsible&&b)){var h=this.active;j=a.next();g=this.active.next();e={options:d,newHeader:b&&d.collapsible?c([]):a,oldHeader:this.active,newContent:b&&d.collapsible?c([]):j,oldContent:g};var f=this.headers.index(this.active[0])>this.headers.index(a[0]);this.active=b?c([]):a;this._toggle(j,g,e,b,f);h.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header); +if(!b){a.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").children(".ui-icon").removeClass(d.icons.header).addClass(d.icons.headerSelected);a.next().addClass("ui-accordion-content-active")}}}else if(d.collapsible){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);this.active.next().addClass("ui-accordion-content-active");var g=this.active.next(), +e={options:d,newHeader:c([]),oldHeader:d.active,newContent:c([]),oldContent:g},j=this.active=c([]);this._toggle(j,g,e)}},_toggle:function(a,b,d,h,f){var g=this,e=g.options;g.toShow=a;g.toHide=b;g.data=d;var j=function(){if(g)return g._completed.apply(g,arguments)};g._trigger("changestart",null,g.data);g.running=b.size()===0?a.size():b.size();if(e.animated){d={};d=e.collapsible&&h?{toShow:c([]),toHide:b,complete:j,down:f,autoHeight:e.autoHeight||e.fillSpace}:{toShow:a,toHide:b,complete:j,down:f,autoHeight:e.autoHeight|| +e.fillSpace};if(!e.proxied)e.proxied=e.animated;if(!e.proxiedDuration)e.proxiedDuration=e.duration;e.animated=c.isFunction(e.proxied)?e.proxied(d):e.proxied;e.duration=c.isFunction(e.proxiedDuration)?e.proxiedDuration(d):e.proxiedDuration;h=c.ui.accordion.animations;var i=e.duration,k=e.animated;if(k&&!h[k]&&!c.easing[k])k="slide";h[k]||(h[k]=function(l){this.slide(l,{easing:k,duration:i||700})});h[k](d)}else{if(e.collapsible&&h)a.toggle();else{b.hide();a.show()}j(true)}b.prev().attr({"aria-expanded":"false", +"aria-selected":"false",tabIndex:-1}).blur();a.prev().attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}).focus()},_completed:function(a){this.running=a?0:--this.running;if(!this.running){this.options.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""});this.toHide.removeClass("ui-accordion-content-active");if(this.toHide.length)this.toHide.parent()[0].className=this.toHide.parent()[0].className;this._trigger("change",null,this.data)}}});c.extend(c.ui.accordion,{version:"1.8.12", +animations:{slide:function(a,b){a=c.extend({easing:"swing",duration:300},a,b);if(a.toHide.size())if(a.toShow.size()){var d=a.toShow.css("overflow"),h=0,f={},g={},e;b=a.toShow;e=b[0].style.width;b.width(parseInt(b.parent().width(),10)-parseInt(b.css("paddingLeft"),10)-parseInt(b.css("paddingRight"),10)-(parseInt(b.css("borderLeftWidth"),10)||0)-(parseInt(b.css("borderRightWidth"),10)||0));c.each(["height","paddingTop","paddingBottom"],function(j,i){g[i]="hide";j=(""+c.css(a.toShow[0],i)).match(/^([\d+-.]+)(.*)$/); +f[i]={value:j[1],unit:j[2]||"px"}});a.toShow.css({height:0,overflow:"hidden"}).show();a.toHide.filter(":hidden").each(a.complete).end().filter(":visible").animate(g,{step:function(j,i){if(i.prop=="height")h=i.end-i.start===0?0:(i.now-i.start)/(i.end-i.start);a.toShow[0].style[i.prop]=h*f[i.prop].value+f[i.prop].unit},duration:a.duration,easing:a.easing,complete:function(){a.autoHeight||a.toShow.css("height","");a.toShow.css({width:e,overflow:d});a.complete()}})}else a.toHide.animate({height:"hide", +paddingTop:"hide",paddingBottom:"hide"},a);else a.toShow.animate({height:"show",paddingTop:"show",paddingBottom:"show"},a)},bounceslide:function(a){this.slide(a,{easing:a.down?"easeOutBounce":"swing",duration:a.down?1E3:200})}}})})(jQuery); +;/* + * jQuery UI Autocomplete 1.8.12 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Autocomplete + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + * jquery.ui.position.js + */ +(function(d){var e=0;d.widget("ui.autocomplete",{options:{appendTo:"body",autoFocus:false,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},pending:0,_create:function(){var a=this,b=this.element[0].ownerDocument,g;this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(c){if(!(a.options.disabled||a.element.attr("readonly"))){g= +false;var f=d.ui.keyCode;switch(c.keyCode){case f.PAGE_UP:a._move("previousPage",c);break;case f.PAGE_DOWN:a._move("nextPage",c);break;case f.UP:a._move("previous",c);c.preventDefault();break;case f.DOWN:a._move("next",c);c.preventDefault();break;case f.ENTER:case f.NUMPAD_ENTER:if(a.menu.active){g=true;c.preventDefault()}case f.TAB:if(!a.menu.active)return;a.menu.select(c);break;case f.ESCAPE:a.element.val(a.term);a.close(c);break;default:clearTimeout(a.searching);a.searching=setTimeout(function(){if(a.term!= +a.element.val()){a.selectedItem=null;a.search(null,c)}},a.options.delay);break}}}).bind("keypress.autocomplete",function(c){if(g){g=false;c.preventDefault()}}).bind("focus.autocomplete",function(){if(!a.options.disabled){a.selectedItem=null;a.previous=a.element.val()}}).bind("blur.autocomplete",function(c){if(!a.options.disabled){clearTimeout(a.searching);a.closing=setTimeout(function(){a.close(c);a._change(c)},150)}});this._initSource();this.response=function(){return a._response.apply(a,arguments)}; +this.menu=d("
        ").addClass("ui-autocomplete").appendTo(d(this.options.appendTo||"body",b)[0]).mousedown(function(c){var f=a.menu.element[0];d(c.target).closest(".ui-menu-item").length||setTimeout(function(){d(document).one("mousedown",function(h){h.target!==a.element[0]&&h.target!==f&&!d.ui.contains(f,h.target)&&a.close()})},1);setTimeout(function(){clearTimeout(a.closing)},13)}).menu({focus:function(c,f){f=f.item.data("item.autocomplete");false!==a._trigger("focus",c,{item:f})&&/^key/.test(c.originalEvent.type)&& +a.element.val(f.value)},selected:function(c,f){var h=f.item.data("item.autocomplete"),i=a.previous;if(a.element[0]!==b.activeElement){a.element.focus();a.previous=i;setTimeout(function(){a.previous=i;a.selectedItem=h},1)}false!==a._trigger("select",c,{item:h})&&a.element.val(h.value);a.term=a.element.val();a.close(c);a.selectedItem=h},blur:function(){a.menu.element.is(":visible")&&a.element.val()!==a.term&&a.element.val(a.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu"); +d.fn.bgiframe&&this.menu.element.bgiframe()},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup");this.menu.element.remove();d.Widget.prototype.destroy.call(this)},_setOption:function(a,b){d.Widget.prototype._setOption.apply(this,arguments);a==="source"&&this._initSource();if(a==="appendTo")this.menu.element.appendTo(d(b||"body",this.element[0].ownerDocument)[0]);a==="disabled"&& +b&&this.xhr&&this.xhr.abort()},_initSource:function(){var a=this,b,g;if(d.isArray(this.options.source)){b=this.options.source;this.source=function(c,f){f(d.ui.autocomplete.filter(b,c.term))}}else if(typeof this.options.source==="string"){g=this.options.source;this.source=function(c,f){a.xhr&&a.xhr.abort();a.xhr=d.ajax({url:g,data:c,dataType:"json",autocompleteRequest:++e,success:function(h){this.autocompleteRequest===e&&f(h)},error:function(){this.autocompleteRequest===e&&f([])}})}}else this.source= +this.options.source},search:function(a,b){a=a!=null?a:this.element.val();this.term=this.element.val();if(a.length").data("item.autocomplete",b).append(d("").text(b.label)).appendTo(a)},_move:function(a,b){if(this.menu.element.is(":visible"))if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term);this.menu.deactivate()}else this.menu[a](b);else this.search(null,b)},widget:function(){return this.menu.element}});d.extend(d.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, +"\\$&")},filter:function(a,b){var g=new RegExp(d.ui.autocomplete.escapeRegex(b),"i");return d.grep(a,function(c){return g.test(c.label||c.value||c)})}})})(jQuery); +(function(d){d.widget("ui.menu",{_create:function(){var e=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(a){if(d(a.target).closest(".ui-menu-item a").length){a.preventDefault();e.select(a)}});this.refresh()},refresh:function(){var e=this;this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem").children("a").addClass("ui-corner-all").attr("tabindex", +-1).mouseenter(function(a){e.activate(a,d(this).parent())}).mouseleave(function(){e.deactivate()})},activate:function(e,a){this.deactivate();if(this.hasScroll()){var b=a.offset().top-this.element.offset().top,g=this.element.attr("scrollTop"),c=this.element.height();if(b<0)this.element.attr("scrollTop",g+b);else b>=c&&this.element.attr("scrollTop",g+b-c+a.height())}this.active=a.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",e,{item:a})}, +deactivate:function(){if(this.active){this.active.children("a").removeClass("ui-state-hover").removeAttr("id");this._trigger("blur");this.active=null}},next:function(e){this.move("next",".ui-menu-item:first",e)},previous:function(e){this.move("prev",".ui-menu-item:last",e)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(e,a,b){if(this.active){e=this.active[e+"All"](".ui-menu-item").eq(0); +e.length?this.activate(b,e):this.activate(b,this.element.children(a))}else this.activate(b,this.element.children(a))},nextPage:function(e){if(this.hasScroll())if(!this.active||this.last())this.activate(e,this.element.children(".ui-menu-item:first"));else{var a=this.active.offset().top,b=this.element.height(),g=this.element.children(".ui-menu-item").filter(function(){var c=d(this).offset().top-a-b+d(this).height();return c<10&&c>-10});g.length||(g=this.element.children(".ui-menu-item:last"));this.activate(e, +g)}else this.activate(e,this.element.children(".ui-menu-item").filter(!this.active||this.last()?":first":":last"))},previousPage:function(e){if(this.hasScroll())if(!this.active||this.first())this.activate(e,this.element.children(".ui-menu-item:last"));else{var a=this.active.offset().top,b=this.element.height();result=this.element.children(".ui-menu-item").filter(function(){var g=d(this).offset().top-a+b-d(this).height();return g<10&&g>-10});result.length||(result=this.element.children(".ui-menu-item:first")); +this.activate(e,result)}else this.activate(e,this.element.children(".ui-menu-item").filter(!this.active||this.first()?":last":":first"))},hasScroll:function(){return this.element.height()").addClass("ui-button-text").html(this.options.label).appendTo(b.empty()).text(),d=this.options.icons,f=d.primary&&d.secondary,e=[];if(d.primary||d.secondary){if(this.options.text)e.push("ui-button-text-icon"+(f?"s":d.primary?"-primary":"-secondary"));d.primary&&b.prepend("");d.secondary&&b.append("");if(!this.options.text){e.push(f?"ui-button-icons-only": +"ui-button-icon-only");this.hasTitle||b.attr("title",c)}}else e.push("ui-button-text-only");b.addClass(e.join(" "))}}});a.widget("ui.buttonset",{options:{items:":button, :submit, :reset, :checkbox, :radio, a, :data(button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(b,c){b==="disabled"&&this.buttons.button("option",b,c);a.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass("ui-corner-left").end().filter(":last").addClass("ui-corner-right").end().end()}, +destroy:function(){this.element.removeClass("ui-buttonset");this.buttons.map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy");a.Widget.prototype.destroy.call(this)}})})(jQuery); +;/* + * jQuery UI Dialog 1.8.12 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Dialog + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + * jquery.ui.button.js + * jquery.ui.draggable.js + * jquery.ui.mouse.js + * jquery.ui.position.js + * jquery.ui.resizable.js + */ +(function(c,l){var m={buttons:true,height:true,maxHeight:true,maxWidth:true,minHeight:true,minWidth:true,width:true},n={maxHeight:true,maxWidth:true,minHeight:true,minWidth:true},o=c.attrFn||{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true,click:true};c.widget("ui.dialog",{options:{autoOpen:true,buttons:{},closeOnEscape:true,closeText:"close",dialogClass:"",draggable:true,hide:null,height:"auto",maxHeight:false,maxWidth:false,minHeight:150,minWidth:150,modal:false, +position:{my:"center",at:"center",collision:"fit",using:function(a){var b=c(this).css(a).offset().top;b<0&&c(this).css("top",a.top-b)}},resizable:true,show:null,stack:true,title:"",width:300,zIndex:1E3},_create:function(){this.originalTitle=this.element.attr("title");if(typeof this.originalTitle!=="string")this.originalTitle="";this.options.title=this.options.title||this.originalTitle;var a=this,b=a.options,d=b.title||" ",e=c.ui.dialog.getTitleId(a.element),g=(a.uiDialog=c("
        ")).appendTo(document.body).hide().addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+ +b.dialogClass).css({zIndex:b.zIndex}).attr("tabIndex",-1).css("outline",0).keydown(function(i){if(b.closeOnEscape&&i.keyCode&&i.keyCode===c.ui.keyCode.ESCAPE){a.close(i);i.preventDefault()}}).attr({role:"dialog","aria-labelledby":e}).mousedown(function(i){a.moveToTop(false,i)});a.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g);var f=(a.uiDialogTitlebar=c("
        ")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g), +h=c('').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role","button").hover(function(){h.addClass("ui-state-hover")},function(){h.removeClass("ui-state-hover")}).focus(function(){h.addClass("ui-state-focus")}).blur(function(){h.removeClass("ui-state-focus")}).click(function(i){a.close(i);return false}).appendTo(f);(a.uiDialogTitlebarCloseText=c("")).addClass("ui-icon ui-icon-closethick").text(b.closeText).appendTo(h);c("").addClass("ui-dialog-title").attr("id", +e).html(d).prependTo(f);if(c.isFunction(b.beforeclose)&&!c.isFunction(b.beforeClose))b.beforeClose=b.beforeclose;f.find("*").add(f).disableSelection();b.draggable&&c.fn.draggable&&a._makeDraggable();b.resizable&&c.fn.resizable&&a._makeResizable();a._createButtons(b.buttons);a._isOpen=false;c.fn.bgiframe&&g.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var a=this;a.overlay&&a.overlay.destroy();a.uiDialog.hide();a.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body"); +a.uiDialog.remove();a.originalTitle&&a.element.attr("title",a.originalTitle);return a},widget:function(){return this.uiDialog},close:function(a){var b=this,d,e;if(false!==b._trigger("beforeClose",a)){b.overlay&&b.overlay.destroy();b.uiDialog.unbind("keypress.ui-dialog");b._isOpen=false;if(b.options.hide)b.uiDialog.hide(b.options.hide,function(){b._trigger("close",a)});else{b.uiDialog.hide();b._trigger("close",a)}c.ui.dialog.overlay.resize();if(b.options.modal){d=0;c(".ui-dialog").each(function(){if(this!== +b.uiDialog[0]){e=c(this).css("z-index");isNaN(e)||(d=Math.max(d,e))}});c.ui.dialog.maxZ=d}return b}},isOpen:function(){return this._isOpen},moveToTop:function(a,b){var d=this,e=d.options;if(e.modal&&!a||!e.stack&&!e.modal)return d._trigger("focus",b);if(e.zIndex>c.ui.dialog.maxZ)c.ui.dialog.maxZ=e.zIndex;if(d.overlay){c.ui.dialog.maxZ+=1;d.overlay.$el.css("z-index",c.ui.dialog.overlay.maxZ=c.ui.dialog.maxZ)}a={scrollTop:d.element.attr("scrollTop"),scrollLeft:d.element.attr("scrollLeft")};c.ui.dialog.maxZ+= +1;d.uiDialog.css("z-index",c.ui.dialog.maxZ);d.element.attr(a);d._trigger("focus",b);return d},open:function(){if(!this._isOpen){var a=this,b=a.options,d=a.uiDialog;a.overlay=b.modal?new c.ui.dialog.overlay(a):null;a._size();a._position(b.position);d.show(b.show);a.moveToTop(true);b.modal&&d.bind("keypress.ui-dialog",function(e){if(e.keyCode===c.ui.keyCode.TAB){var g=c(":tabbable",this),f=g.filter(":first");g=g.filter(":last");if(e.target===g[0]&&!e.shiftKey){f.focus(1);return false}else if(e.target=== +f[0]&&e.shiftKey){g.focus(1);return false}}});c(a.element.find(":tabbable").get().concat(d.find(".ui-dialog-buttonpane :tabbable").get().concat(d.get()))).eq(0).focus();a._isOpen=true;a._trigger("open");return a}},_createButtons:function(a){var b=this,d=false,e=c("
        ").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),g=c("
        ").addClass("ui-dialog-buttonset").appendTo(e);b.uiDialog.find(".ui-dialog-buttonpane").remove();typeof a==="object"&&a!==null&&c.each(a, +function(){return!(d=true)});if(d){c.each(a,function(f,h){h=c.isFunction(h)?{click:h,text:f}:h;var i=c('').click(function(){h.click.apply(b.element[0],arguments)}).appendTo(g);c.each(h,function(j,k){if(j!=="click")j in o?i[j](k):i.attr(j,k)});c.fn.button&&i.button()});e.appendTo(b.uiDialog)}},_makeDraggable:function(){function a(f){return{position:f.position,offset:f.offset}}var b=this,d=b.options,e=c(document),g;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close", +handle:".ui-dialog-titlebar",containment:"document",start:function(f,h){g=d.height==="auto"?"auto":c(this).height();c(this).height(c(this).height()).addClass("ui-dialog-dragging");b._trigger("dragStart",f,a(h))},drag:function(f,h){b._trigger("drag",f,a(h))},stop:function(f,h){d.position=[h.position.left-e.scrollLeft(),h.position.top-e.scrollTop()];c(this).removeClass("ui-dialog-dragging").height(g);b._trigger("dragStop",f,a(h));c.ui.dialog.overlay.resize()}})},_makeResizable:function(a){function b(f){return{originalPosition:f.originalPosition, +originalSize:f.originalSize,position:f.position,size:f.size}}a=a===l?this.options.resizable:a;var d=this,e=d.options,g=d.uiDialog.css("position");a=typeof a==="string"?a:"n,e,s,w,se,sw,ne,nw";d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:e.maxWidth,maxHeight:e.maxHeight,minWidth:e.minWidth,minHeight:d._minHeight(),handles:a,start:function(f,h){c(this).addClass("ui-dialog-resizing");d._trigger("resizeStart",f,b(h))},resize:function(f,h){d._trigger("resize", +f,b(h))},stop:function(f,h){c(this).removeClass("ui-dialog-resizing");e.height=c(this).height();e.width=c(this).width();d._trigger("resizeStop",f,b(h));c.ui.dialog.overlay.resize()}}).css("position",g).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight,a.height)},_position:function(a){var b=[],d=[0,0],e;if(a){if(typeof a==="string"||typeof a==="object"&&"0"in a){b=a.split?a.split(" "): +[a[0],a[1]];if(b.length===1)b[1]=b[0];c.each(["left","top"],function(g,f){if(+b[g]===b[g]){d[g]=b[g];b[g]=f}});a={my:b.join(" "),at:b.join(" "),offset:d.join(" ")}}a=c.extend({},c.ui.dialog.prototype.options.position,a)}else a=c.ui.dialog.prototype.options.position;(e=this.uiDialog.is(":visible"))||this.uiDialog.show();this.uiDialog.css({top:0,left:0}).position(c.extend({of:window},a));e||this.uiDialog.hide()},_setOptions:function(a){var b=this,d={},e=false;c.each(a,function(g,f){b._setOption(g,f); +if(g in m)e=true;if(g in n)d[g]=f});e&&this._size();this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",d)},_setOption:function(a,b){var d=this,e=d.uiDialog;switch(a){case "beforeclose":a="beforeClose";break;case "buttons":d._createButtons(b);break;case "closeText":d.uiDialogTitlebarCloseText.text(""+b);break;case "dialogClass":e.removeClass(d.options.dialogClass).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b);break;case "disabled":b?e.addClass("ui-dialog-disabled"): +e.removeClass("ui-dialog-disabled");break;case "draggable":var g=e.is(":data(draggable)");g&&!b&&e.draggable("destroy");!g&&b&&d._makeDraggable();break;case "position":d._position(b);break;case "resizable":(g=e.is(":data(resizable)"))&&!b&&e.resizable("destroy");g&&typeof b==="string"&&e.resizable("option","handles",b);!g&&b!==false&&d._makeResizable(b);break;case "title":c(".ui-dialog-title",d.uiDialogTitlebar).html(""+(b||" "));break}c.Widget.prototype._setOption.apply(d,arguments)},_size:function(){var a= +this.options,b,d,e=this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0});if(a.minWidth>a.width)a.width=a.minWidth;b=this.uiDialog.css({height:"auto",width:a.width}).height();d=Math.max(0,a.minHeight-b);if(a.height==="auto")if(c.support.minHeight)this.element.css({minHeight:d,height:"auto"});else{this.uiDialog.show();a=this.element.css("height","auto").height();e||this.uiDialog.hide();this.element.height(Math.max(a,d))}else this.element.height(Math.max(a.height- +b,0));this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())}});c.extend(c.ui.dialog,{version:"1.8.12",uuid:0,maxZ:0,getTitleId:function(a){a=a.attr("id");if(!a){this.uuid+=1;a=this.uuid}return"ui-dialog-title-"+a},overlay:function(a){this.$el=c.ui.dialog.overlay.create(a)}});c.extend(c.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:c.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "), +create:function(a){if(this.instances.length===0){setTimeout(function(){c.ui.dialog.overlay.instances.length&&c(document).bind(c.ui.dialog.overlay.events,function(d){if(c(d.target).zIndex()").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(), +height:this.height()});c.fn.bgiframe&&b.bgiframe();this.instances.push(b);return b},destroy:function(a){var b=c.inArray(a,this.instances);b!=-1&&this.oldInstances.push(this.instances.splice(b,1)[0]);this.instances.length===0&&c([document,window]).unbind(".dialog-overlay");a.remove();var d=0;c.each(this.instances,function(){d=Math.max(d,this.css("z-index"))});this.maxZ=d},height:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight); +b=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);return a");if(!a.values)a.values=[this._valueMin(),this._valueMin()];if(a.values.length&&a.values.length!==2)a.values=[a.values[0],a.values[0]]}else this.range=d("
        ");this.range.appendTo(this.element).addClass("ui-slider-range");if(a.range==="min"||a.range==="max")this.range.addClass("ui-slider-range-"+a.range);this.range.addClass("ui-widget-header")}d(".ui-slider-handle",this.element).length===0&&d("").appendTo(this.element).addClass("ui-slider-handle"); +if(a.values&&a.values.length)for(;d(".ui-slider-handle",this.element).length").appendTo(this.element).addClass("ui-slider-handle");this.handles=d(".ui-slider-handle",this.element).addClass("ui-state-default ui-corner-all");this.handle=this.handles.eq(0);this.handles.add(this.range).filter("a").click(function(c){c.preventDefault()}).hover(function(){a.disabled||d(this).addClass("ui-state-hover")},function(){d(this).removeClass("ui-state-hover")}).focus(function(){if(a.disabled)d(this).blur(); +else{d(".ui-slider .ui-state-focus").removeClass("ui-state-focus");d(this).addClass("ui-state-focus")}}).blur(function(){d(this).removeClass("ui-state-focus")});this.handles.each(function(c){d(this).data("index.ui-slider-handle",c)});this.handles.keydown(function(c){var e=true,f=d(this).data("index.ui-slider-handle"),h,g,i;if(!b.options.disabled){switch(c.keyCode){case d.ui.keyCode.HOME:case d.ui.keyCode.END:case d.ui.keyCode.PAGE_UP:case d.ui.keyCode.PAGE_DOWN:case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:e= +false;if(!b._keySliding){b._keySliding=true;d(this).addClass("ui-state-active");h=b._start(c,f);if(h===false)return}break}i=b.options.step;h=b.options.values&&b.options.values.length?(g=b.values(f)):(g=b.value());switch(c.keyCode){case d.ui.keyCode.HOME:g=b._valueMin();break;case d.ui.keyCode.END:g=b._valueMax();break;case d.ui.keyCode.PAGE_UP:g=b._trimAlignValue(h+(b._valueMax()-b._valueMin())/5);break;case d.ui.keyCode.PAGE_DOWN:g=b._trimAlignValue(h-(b._valueMax()-b._valueMin())/5);break;case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:if(h=== +b._valueMax())return;g=b._trimAlignValue(h+i);break;case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:if(h===b._valueMin())return;g=b._trimAlignValue(h-i);break}b._slide(c,f,g);return e}}).keyup(function(c){var e=d(this).data("index.ui-slider-handle");if(b._keySliding){b._keySliding=false;b._stop(c,e);b._change(c,e);d(this).removeClass("ui-state-active")}});this._refreshValue();this._animateOff=false},destroy:function(){this.handles.remove();this.range.remove();this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider"); +this._mouseDestroy();return this},_mouseCapture:function(b){var a=this.options,c,e,f,h,g;if(a.disabled)return false;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();c=this._normValueFromMouse({x:b.pageX,y:b.pageY});e=this._valueMax()-this._valueMin()+1;h=this;this.handles.each(function(i){var j=Math.abs(c-h.values(i));if(e>j){e=j;f=d(this);g=i}});if(a.range===true&&this.values(1)===a.min){g+=1;f=d(this.handles[g])}if(this._start(b, +g)===false)return false;this._mouseSliding=true;h._handleIndex=g;f.addClass("ui-state-active").focus();a=f.offset();this._clickOffset=!d(b.target).parents().andSelf().is(".ui-slider-handle")?{left:0,top:0}:{left:b.pageX-a.left-f.width()/2,top:b.pageY-a.top-f.height()/2-(parseInt(f.css("borderTopWidth"),10)||0)-(parseInt(f.css("borderBottomWidth"),10)||0)+(parseInt(f.css("marginTop"),10)||0)};this.handles.hasClass("ui-state-hover")||this._slide(b,g,c);return this._animateOff=true},_mouseStart:function(){return true}, +_mouseDrag:function(b){var a=this._normValueFromMouse({x:b.pageX,y:b.pageY});this._slide(b,this._handleIndex,a);return false},_mouseStop:function(b){this.handles.removeClass("ui-state-active");this._mouseSliding=false;this._stop(b,this._handleIndex);this._change(b,this._handleIndex);this._clickOffset=this._handleIndex=null;return this._animateOff=false},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(b){var a; +if(this.orientation==="horizontal"){a=this.elementSize.width;b=b.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{a=this.elementSize.height;b=b.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}a=b/a;if(a>1)a=1;if(a<0)a=0;if(this.orientation==="vertical")a=1-a;b=this._valueMax()-this._valueMin();return this._trimAlignValue(this._valueMin()+a*b)},_start:function(b,a){var c={handle:this.handles[a],value:this.value()};if(this.options.values&&this.options.values.length){c.value= +this.values(a);c.values=this.values()}return this._trigger("start",b,c)},_slide:function(b,a,c){var e;if(this.options.values&&this.options.values.length){e=this.values(a?0:1);if(this.options.values.length===2&&this.options.range===true&&(a===0&&c>e||a===1&&c1){this.options.values[b]=this._trimAlignValue(a);this._refreshValue();this._change(null,b)}else if(arguments.length)if(d.isArray(arguments[0])){c=this.options.values;e=arguments[0];for(f=0;f=this._valueMax())return this._valueMax();var a=this.options.step>0?this.options.step:1,c=(b-this._valueMin())%a;alignValue=b-c;if(Math.abs(c)*2>=a)alignValue+=c>0?a:-a;return parseFloat(alignValue.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max}, +_refreshValue:function(){var b=this.options.range,a=this.options,c=this,e=!this._animateOff?a.animate:false,f,h={},g,i,j,l;if(this.options.values&&this.options.values.length)this.handles.each(function(k){f=(c.values(k)-c._valueMin())/(c._valueMax()-c._valueMin())*100;h[c.orientation==="horizontal"?"left":"bottom"]=f+"%";d(this).stop(1,1)[e?"animate":"css"](h,a.animate);if(c.options.range===true)if(c.orientation==="horizontal"){if(k===0)c.range.stop(1,1)[e?"animate":"css"]({left:f+"%"},a.animate); +if(k===1)c.range[e?"animate":"css"]({width:f-g+"%"},{queue:false,duration:a.animate})}else{if(k===0)c.range.stop(1,1)[e?"animate":"css"]({bottom:f+"%"},a.animate);if(k===1)c.range[e?"animate":"css"]({height:f-g+"%"},{queue:false,duration:a.animate})}g=f});else{i=this.value();j=this._valueMin();l=this._valueMax();f=l!==j?(i-j)/(l-j)*100:0;h[c.orientation==="horizontal"?"left":"bottom"]=f+"%";this.handle.stop(1,1)[e?"animate":"css"](h,a.animate);if(b==="min"&&this.orientation==="horizontal")this.range.stop(1, +1)[e?"animate":"css"]({width:f+"%"},a.animate);if(b==="max"&&this.orientation==="horizontal")this.range[e?"animate":"css"]({width:100-f+"%"},{queue:false,duration:a.animate});if(b==="min"&&this.orientation==="vertical")this.range.stop(1,1)[e?"animate":"css"]({height:f+"%"},a.animate);if(b==="max"&&this.orientation==="vertical")this.range[e?"animate":"css"]({height:100-f+"%"},{queue:false,duration:a.animate})}}});d.extend(d.ui.slider,{version:"1.8.12"})})(jQuery); +;/* + * jQuery UI Tabs 1.8.12 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Tabs + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + */ +(function(d,p){function u(){return++v}function w(){return++x}var v=0,x=0;d.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:false,cookie:null,collapsible:false,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"
        ",remove:null,select:null,show:null,spinner:"Loading…",tabTemplate:"
      • #{label}
      • "},_create:function(){this._tabify(true)},_setOption:function(b,e){if(b=="selected")this.options.collapsible&& +e==this.options.selected||this.select(e);else{this.options[b]=e;this._tabify()}},_tabId:function(b){return b.title&&b.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+u()},_sanitizeSelector:function(b){return b.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+w());return d.cookie.apply(null,[b].concat(d.makeArray(arguments)))},_ui:function(b,e){return{tab:b,panel:e,index:this.anchors.index(b)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var b= +d(this);b.html(b.data("label.tabs")).removeData("label.tabs")})},_tabify:function(b){function e(g,f){g.css("display","");!d.support.opacity&&f.opacity&&g[0].style.removeAttribute("filter")}var a=this,c=this.options,h=/^#.+/;this.list=this.element.find("ol,ul").eq(0);this.lis=d(" > li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return d("a",this)[0]});this.panels=d([]);this.anchors.each(function(g,f){var i=d(f).attr("href"),l=i.split("#")[0],q;if(l&&(l===location.toString().split("#")[0]|| +(q=d("base")[0])&&l===q.href)){i=f.hash;f.href=i}if(h.test(i))a.panels=a.panels.add(a.element.find(a._sanitizeSelector(i)));else if(i&&i!=="#"){d.data(f,"href.tabs",i);d.data(f,"load.tabs",i.replace(/#.*$/,""));i=a._tabId(f);f.href="#"+i;f=a.element.find("#"+i);if(!f.length){f=d(c.panelTemplate).attr("id",i).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(a.panels[g-1]||a.list);f.data("destroy.tabs",true)}a.panels=a.panels.add(f)}else c.disabled.push(g)});if(b){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all"); +this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");if(c.selected===p){location.hash&&this.anchors.each(function(g,f){if(f.hash==location.hash){c.selected=g;return false}});if(typeof c.selected!=="number"&&c.cookie)c.selected=parseInt(a._cookie(),10);if(typeof c.selected!=="number"&&this.lis.filter(".ui-tabs-selected").length)c.selected= +this.lis.index(this.lis.filter(".ui-tabs-selected"));c.selected=c.selected||(this.lis.length?0:-1)}else if(c.selected===null)c.selected=-1;c.selected=c.selected>=0&&this.anchors[c.selected]||c.selected<0?c.selected:0;c.disabled=d.unique(c.disabled.concat(d.map(this.lis.filter(".ui-state-disabled"),function(g){return a.lis.index(g)}))).sort();d.inArray(c.selected,c.disabled)!=-1&&c.disabled.splice(d.inArray(c.selected,c.disabled),1);this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active"); +if(c.selected>=0&&this.anchors.length){a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash)).removeClass("ui-tabs-hide");this.lis.eq(c.selected).addClass("ui-tabs-selected ui-state-active");a.element.queue("tabs",function(){a._trigger("show",null,a._ui(a.anchors[c.selected],a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash))[0]))});this.load(c.selected)}d(window).bind("unload",function(){a.lis.add(a.anchors).unbind(".tabs");a.lis=a.anchors=a.panels=null})}else c.selected=this.lis.index(this.lis.filter(".ui-tabs-selected")); +this.element[c.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible");c.cookie&&this._cookie(c.selected,c.cookie);b=0;for(var j;j=this.lis[b];b++)d(j)[d.inArray(b,c.disabled)!=-1&&!d(j).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");c.cache===false&&this.anchors.removeData("cache.tabs");this.lis.add(this.anchors).unbind(".tabs");if(c.event!=="mouseover"){var k=function(g,f){f.is(":not(.ui-state-disabled)")&&f.addClass("ui-state-"+g)},n=function(g,f){f.removeClass("ui-state-"+ +g)};this.lis.bind("mouseover.tabs",function(){k("hover",d(this))});this.lis.bind("mouseout.tabs",function(){n("hover",d(this))});this.anchors.bind("focus.tabs",function(){k("focus",d(this).closest("li"))});this.anchors.bind("blur.tabs",function(){n("focus",d(this).closest("li"))})}var m,o;if(c.fx)if(d.isArray(c.fx)){m=c.fx[0];o=c.fx[1]}else m=o=c.fx;var r=o?function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.hide().removeClass("ui-tabs-hide").animate(o,o.duration||"normal", +function(){e(f,o);a._trigger("show",null,a._ui(g,f[0]))})}:function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.removeClass("ui-tabs-hide");a._trigger("show",null,a._ui(g,f[0]))},s=m?function(g,f){f.animate(m,m.duration||"normal",function(){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");e(f,m);a.element.dequeue("tabs")})}:function(g,f){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");a.element.dequeue("tabs")}; +this.anchors.bind(c.event+".tabs",function(){var g=this,f=d(g).closest("li"),i=a.panels.filter(":not(.ui-tabs-hide)"),l=a.element.find(a._sanitizeSelector(g.hash));if(f.hasClass("ui-tabs-selected")&&!c.collapsible||f.hasClass("ui-state-disabled")||f.hasClass("ui-state-processing")||a.panels.filter(":animated").length||a._trigger("select",null,a._ui(this,l[0]))===false){this.blur();return false}c.selected=a.anchors.index(this);a.abort();if(c.collapsible)if(f.hasClass("ui-tabs-selected")){c.selected= +-1;c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){s(g,i)}).dequeue("tabs");this.blur();return false}else if(!i.length){c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this));this.blur();return false}c.cookie&&a._cookie(c.selected,c.cookie);if(l.length){i.length&&a.element.queue("tabs",function(){s(g,i)});a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this))}else throw"jQuery UI Tabs: Mismatching fragment identifier."; +d.browser.msie&&this.blur()});this.anchors.bind("click.tabs",function(){return false})},_getIndex:function(b){if(typeof b=="string")b=this.anchors.index(this.anchors.filter("[href$="+b+"]"));return b},destroy:function(){var b=this.options;this.abort();this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.each(function(){var e= +d.data(this,"href.tabs");if(e)this.href=e;var a=d(this).unbind(".tabs");d.each(["href","load","cache"],function(c,h){a.removeData(h+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){d.data(this,"destroy.tabs")?d(this).remove():d(this).removeClass("ui-state-default ui-corner-top ui-tabs-selected ui-state-active ui-state-hover ui-state-focus ui-state-disabled ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide")});b.cookie&&this._cookie(null,b.cookie);return this},add:function(b, +e,a){if(a===p)a=this.anchors.length;var c=this,h=this.options;e=d(h.tabTemplate.replace(/#\{href\}/g,b).replace(/#\{label\}/g,e));b=!b.indexOf("#")?b.replace("#",""):this._tabId(d("a",e)[0]);e.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var j=c.element.find("#"+b);j.length||(j=d(h.panelTemplate).attr("id",b).data("destroy.tabs",true));j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(a>=this.lis.length){e.appendTo(this.list);j.appendTo(this.list[0].parentNode)}else{e.insertBefore(this.lis[a]); +j.insertBefore(this.panels[a])}h.disabled=d.map(h.disabled,function(k){return k>=a?++k:k});this._tabify();if(this.anchors.length==1){h.selected=0;e.addClass("ui-tabs-selected ui-state-active");j.removeClass("ui-tabs-hide");this.element.queue("tabs",function(){c._trigger("show",null,c._ui(c.anchors[0],c.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[a],this.panels[a]));return this},remove:function(b){b=this._getIndex(b);var e=this.options,a=this.lis.eq(b).remove(),c=this.panels.eq(b).remove(); +if(a.hasClass("ui-tabs-selected")&&this.anchors.length>1)this.select(b+(b+1=b?--h:h});this._tabify();this._trigger("remove",null,this._ui(a.find("a")[0],c[0]));return this},enable:function(b){b=this._getIndex(b);var e=this.options;if(d.inArray(b,e.disabled)!=-1){this.lis.eq(b).removeClass("ui-state-disabled");e.disabled=d.grep(e.disabled,function(a){return a!=b});this._trigger("enable",null, +this._ui(this.anchors[b],this.panels[b]));return this}},disable:function(b){b=this._getIndex(b);var e=this.options;if(b!=e.selected){this.lis.eq(b).addClass("ui-state-disabled");e.disabled.push(b);e.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[b],this.panels[b]))}return this},select:function(b){b=this._getIndex(b);if(b==-1)if(this.options.collapsible&&this.options.selected!=-1)b=this.options.selected;else return this;this.anchors.eq(b).trigger(this.options.event+".tabs");return this}, +load:function(b){b=this._getIndex(b);var e=this,a=this.options,c=this.anchors.eq(b)[0],h=d.data(c,"load.tabs");this.abort();if(!h||this.element.queue("tabs").length!==0&&d.data(c,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(b).addClass("ui-state-processing");if(a.spinner){var j=d("span",c);j.data("label.tabs",j.html()).html(a.spinner)}this.xhr=d.ajax(d.extend({},a.ajaxOptions,{url:h,success:function(k,n){e.element.find(e._sanitizeSelector(c.hash)).html(k);e._cleanup();a.cache&&d.data(c, +"cache.tabs",true);e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.success(k,n)}catch(m){}},error:function(k,n){e._cleanup();e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.error(k,n,b,c)}catch(m){}}}));e.element.dequeue("tabs");return this}},abort:function(){this.element.queue([]);this.panels.stop(false,true);this.element.queue("tabs",this.element.queue("tabs").splice(-2,2));if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup();return this}, +url:function(b,e){this.anchors.eq(b).removeData("cache.tabs").data("load.tabs",e);return this},length:function(){return this.anchors.length}});d.extend(d.ui.tabs,{version:"1.8.12"});d.extend(d.ui.tabs.prototype,{rotation:null,rotate:function(b,e){var a=this,c=this.options,h=a._rotate||(a._rotate=function(j){clearTimeout(a.rotation);a.rotation=setTimeout(function(){var k=c.selected;a.select(++k')}function F(a,b){d.extend(a,b);for(var c in b)if(b[c]== +null||b[c]==A)a[c]=b[c];return a}d.extend(d.ui,{datepicker:{version:"1.8.12"}});var y=(new Date).getTime();d.extend(K.prototype,{markerClassName:"hasDatepicker",log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){F(this._defaults,a||{});return this},_attachDatepicker:function(a,b){var c=null;for(var e in this._defaults){var f=a.getAttribute("date:"+e);if(f){c=c||{};try{c[e]=eval(f)}catch(h){c[e]=f}}}e=a.nodeName.toLowerCase(); +f=e=="div"||e=="span";if(!a.id){this.uuid+=1;a.id="dp"+this.uuid}var i=this._newInst(d(a),f);i.settings=d.extend({},b||{},c||{});if(e=="input")this._connectDatepicker(a,i);else f&&this._inlineDatepicker(a,i)},_newInst:function(a,b){return{id:a[0].id.replace(/([^A-Za-z0-9_-])/g,"\\\\$1"),input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:!b?this.dpDiv:d('
        ')}}, +_connectDatepicker:function(a,b){var c=d(a);b.append=d([]);b.trigger=d([]);if(!c.hasClass(this.markerClassName)){this._attachments(c,b);c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});this._autoSize(b);d.data(a,"datepicker",b)}},_attachments:function(a,b){var c=this._get(b,"appendText"),e=this._get(b,"isRTL");b.append&& +b.append.remove();if(c){b.append=d(''+c+"");a[e?"before":"after"](b.append)}a.unbind("focus",this._showDatepicker);b.trigger&&b.trigger.remove();c=this._get(b,"showOn");if(c=="focus"||c=="both")a.focus(this._showDatepicker);if(c=="button"||c=="both"){c=this._get(b,"buttonText");var f=this._get(b,"buttonImage");b.trigger=d(this._get(b,"buttonImageOnly")?d("").addClass(this._triggerClass).attr({src:f,alt:c,title:c}):d('').addClass(this._triggerClass).html(f== +""?c:d("").attr({src:f,alt:c,title:c})));a[e?"before":"after"](b.trigger);b.trigger.click(function(){d.datepicker._datepickerShowing&&d.datepicker._lastInput==a[0]?d.datepicker._hideDatepicker():d.datepicker._showDatepicker(a[0]);return false})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var e=function(f){for(var h=0,i=0,g=0;gh){h=f[g].length;i=g}return i};b.setMonth(e(this._get(a, +c.match(/MM/)?"monthNames":"monthNamesShort")));b.setDate(e(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a,b){var c=d(a);if(!c.hasClass(this.markerClassName)){c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});d.data(a,"datepicker",b);this._setDate(b,this._getDefaultDate(b), +true);this._updateDatepicker(b);this._updateAlternate(b);b.dpDiv.show()}},_dialogDatepicker:function(a,b,c,e,f){a=this._dialogInst;if(!a){this.uuid+=1;this._dialogInput=d('');this._dialogInput.keydown(this._doKeyDown);d("body").append(this._dialogInput);a=this._dialogInst=this._newInst(this._dialogInput,false);a.settings={};d.data(this._dialogInput[0],"datepicker",a)}F(a.settings,e||{}); +b=b&&b.constructor==Date?this._formatDate(a,b):b;this._dialogInput.val(b);this._pos=f?f.length?f:[f.pageX,f.pageY]:null;if(!this._pos)this._pos=[document.documentElement.clientWidth/2-100+(document.documentElement.scrollLeft||document.body.scrollLeft),document.documentElement.clientHeight/2-150+(document.documentElement.scrollTop||document.body.scrollTop)];this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px");a.settings.onSelect=c;this._inDialog=true;this.dpDiv.addClass(this._dialogClass); +this._showDatepicker(this._dialogInput[0]);d.blockUI&&d.blockUI(this.dpDiv);d.data(this._dialogInput[0],"datepicker",a);return this},_destroyDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();d.removeData(a,"datepicker");if(e=="input"){c.append.remove();c.trigger.remove();b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup", +this._doKeyUp)}else if(e=="div"||e=="span")b.removeClass(this.markerClassName).empty()}},_enableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=false;c.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(e=="div"||e=="span")b.children("."+this._inlineClass).children().removeClass("ui-state-disabled");this._disabledInputs=d.map(this._disabledInputs, +function(f){return f==a?null:f})}},_disableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=true;c.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else if(e=="div"||e=="span")b.children("."+this._inlineClass).children().addClass("ui-state-disabled");this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null: +f});this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return false;for(var b=0;b-1}},_doKeyUp:function(a){a=d.datepicker._getInst(a.target); +if(a.input.val()!=a.lastVal)try{if(d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),a.input?a.input.val():null,d.datepicker._getFormatConfig(a))){d.datepicker._setDateFromField(a);d.datepicker._updateAlternate(a);d.datepicker._updateDatepicker(a)}}catch(b){d.datepicker.log(b)}return true},_showDatepicker:function(a){a=a.target||a;if(a.nodeName.toLowerCase()!="input")a=d("input",a.parentNode)[0];if(!(d.datepicker._isDisabledDatepicker(a)||d.datepicker._lastInput==a)){var b=d.datepicker._getInst(a); +d.datepicker._curInst&&d.datepicker._curInst!=b&&d.datepicker._curInst.dpDiv.stop(true,true);var c=d.datepicker._get(b,"beforeShow");F(b.settings,c?c.apply(a,[a,b]):{});b.lastVal=null;d.datepicker._lastInput=a;d.datepicker._setDateFromField(b);if(d.datepicker._inDialog)a.value="";if(!d.datepicker._pos){d.datepicker._pos=d.datepicker._findPos(a);d.datepicker._pos[1]+=a.offsetHeight}var e=false;d(a).parents().each(function(){e|=d(this).css("position")=="fixed";return!e});if(e&&d.browser.opera){d.datepicker._pos[0]-= +document.documentElement.scrollLeft;d.datepicker._pos[1]-=document.documentElement.scrollTop}c={left:d.datepicker._pos[0],top:d.datepicker._pos[1]};d.datepicker._pos=null;b.dpDiv.empty();b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});d.datepicker._updateDatepicker(b);c=d.datepicker._checkOffset(b,c,e);b.dpDiv.css({position:d.datepicker._inDialog&&d.blockUI?"static":e?"fixed":"absolute",display:"none",left:c.left+"px",top:c.top+"px"});if(!b.inline){c=d.datepicker._get(b,"showAnim"); +var f=d.datepicker._get(b,"duration"),h=function(){d.datepicker._datepickerShowing=true;var i=b.dpDiv.find("iframe.ui-datepicker-cover");if(i.length){var g=d.datepicker._getBorders(b.dpDiv);i.css({left:-g[0],top:-g[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})}};b.dpDiv.zIndex(d(a).zIndex()+1);d.effects&&d.effects[c]?b.dpDiv.show(c,d.datepicker._get(b,"showOptions"),f,h):b.dpDiv[c||"show"](c?f:null,h);if(!c||!f)h();b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus();d.datepicker._curInst= +b}}},_updateDatepicker:function(a){var b=this,c=d.datepicker._getBorders(a.dpDiv);a.dpDiv.empty().append(this._generateHTML(a));var e=a.dpDiv.find("iframe.ui-datepicker-cover");e.length&&e.css({left:-c[0],top:-c[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()});a.dpDiv.find("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a").bind("mouseout",function(){d(this).removeClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).removeClass("ui-datepicker-prev-hover"); +this.className.indexOf("ui-datepicker-next")!=-1&&d(this).removeClass("ui-datepicker-next-hover")}).bind("mouseover",function(){if(!b._isDisabledDatepicker(a.inline?a.dpDiv.parent()[0]:a.input[0])){d(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");d(this).addClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).addClass("ui-datepicker-prev-hover");this.className.indexOf("ui-datepicker-next")!=-1&&d(this).addClass("ui-datepicker-next-hover")}}).end().find("."+ +this._dayOverClass+" a").trigger("mouseover").end();c=this._getNumberOfMonths(a);e=c[1];e>1?a.dpDiv.addClass("ui-datepicker-multi-"+e).css("width",17*e+"em"):a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");a.dpDiv[(c[0]!=1||c[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl");a==d.datepicker._curInst&&d.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&& +a.input[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var f=a.yearshtml;setTimeout(function(){f===a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml);f=a.yearshtml=null},0)}},_getBorders:function(a){var b=function(c){return{thin:1,medium:2,thick:3}[c]||c};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var e=a.dpDiv.outerWidth(),f=a.dpDiv.outerHeight(),h=a.input?a.input.outerWidth(): +0,i=a.input?a.input.outerHeight():0,g=document.documentElement.clientWidth+d(document).scrollLeft(),j=document.documentElement.clientHeight+d(document).scrollTop();b.left-=this._get(a,"isRTL")?e-h:0;b.left-=c&&b.left==a.input.offset().left?d(document).scrollLeft():0;b.top-=c&&b.top==a.input.offset().top+i?d(document).scrollTop():0;b.left-=Math.min(b.left,b.left+e>g&&g>e?Math.abs(b.left+e-g):0);b.top-=Math.min(b.top,b.top+f>j&&j>f?Math.abs(f+i):0);return b},_findPos:function(a){for(var b=this._get(this._getInst(a), +"isRTL");a&&(a.type=="hidden"||a.nodeType!=1||d.expr.filters.hidden(a));)a=a[b?"previousSibling":"nextSibling"];a=d(a).offset();return[a.left,a.top]},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=d.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(b,"showAnim");var c=this._get(b,"duration"),e=function(){d.datepicker._tidyDialog(b);this._curInst=null};d.effects&&d.effects[a]?b.dpDiv.hide(a,d.datepicker._get(b,"showOptions"),c,e):b.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"? +"fadeOut":"hide"](a?c:null,e);a||e();if(a=this._get(b,"onClose"))a.apply(b.input?b.input[0]:null,[b.input?b.input.val():"",b]);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(d.blockUI){d.unblockUI();d("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(a){if(d.datepicker._curInst){a= +d(a.target);a[0].id!=d.datepicker._mainDivId&&a.parents("#"+d.datepicker._mainDivId).length==0&&!a.hasClass(d.datepicker.markerClassName)&&!a.hasClass(d.datepicker._triggerClass)&&d.datepicker._datepickerShowing&&!(d.datepicker._inDialog&&d.blockUI)&&d.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){a=d(a);var e=this._getInst(a[0]);if(!this._isDisabledDatepicker(a[0])){this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"):0),c);this._updateDatepicker(e)}},_gotoToday:function(a){a= +d(a);var b=this._getInst(a[0]);if(this._get(b,"gotoCurrent")&&b.currentDay){b.selectedDay=b.currentDay;b.drawMonth=b.selectedMonth=b.currentMonth;b.drawYear=b.selectedYear=b.currentYear}else{var c=new Date;b.selectedDay=c.getDate();b.drawMonth=b.selectedMonth=c.getMonth();b.drawYear=b.selectedYear=c.getFullYear()}this._notifyChange(b);this._adjustDate(a)},_selectMonthYear:function(a,b,c){a=d(a);var e=this._getInst(a[0]);e._selectingMonthYear=false;e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c== +"M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10);this._notifyChange(e);this._adjustDate(a)},_clickMonthYear:function(a){var b=this._getInst(d(a)[0]);b.input&&b._selectingMonthYear&&setTimeout(function(){b.input.focus()},0);b._selectingMonthYear=!b._selectingMonthYear},_selectDay:function(a,b,c,e){var f=d(a);if(!(d(e).hasClass(this._unselectableClass)||this._isDisabledDatepicker(f[0]))){f=this._getInst(f[0]);f.selectedDay=f.currentDay=d("a",e).html();f.selectedMonth=f.currentMonth= +b;f.selectedYear=f.currentYear=c;this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))}},_clearDate:function(a){a=d(a);this._getInst(a[0]);this._selectDate(a,"")},_selectDate:function(a,b){a=this._getInst(d(a)[0]);b=b!=null?b:this._formatDate(a);a.input&&a.input.val(b);this._updateAlternate(a);var c=this._get(a,"onSelect");if(c)c.apply(a.input?a.input[0]:null,[b,a]);else a.input&&a.input.trigger("change");if(a.inline)this._updateDatepicker(a);else{this._hideDatepicker(); +this._lastInput=a.input[0];typeof a.input[0]!="object"&&a.input.focus();this._lastInput=null}},_updateAlternate:function(a){var b=this._get(a,"altField");if(b){var c=this._get(a,"altFormat")||this._get(a,"dateFormat"),e=this._getDate(a),f=this.formatDate(c,e,this._getFormatConfig(a));d(b).each(function(){d(this).val(f)})}},noWeekends:function(a){a=a.getDay();return[a>0&&a<6,""]},iso8601Week:function(a){a=new Date(a.getTime());a.setDate(a.getDate()+4-(a.getDay()||7));var b=a.getTime();a.setMonth(0); +a.setDate(1);return Math.floor(Math.round((b-a)/864E5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b=="object"?b.toString():b+"";if(b=="")return null;var e=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff;e=typeof e!="string"?e:(new Date).getFullYear()%100+parseInt(e,10);for(var f=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,h=(c?c.dayNames:null)||this._defaults.dayNames,i=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c? +c.monthNames:null)||this._defaults.monthNames,j=c=-1,l=-1,u=-1,k=false,o=function(p){(p=z+1-1){j=1;l=u;do{e=this._getDaysInMonth(c,j-1);if(l<=e)break;j++;l-=e}while(1)}w=this._daylightSavingAdjust(new Date(c,j-1,l));if(w.getFullYear()!=c||w.getMonth()+1!=j||w.getDate()!=l)throw"Invalid date";return w},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y", +RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1E7,formatDate:function(a,b,c){if(!b)return"";var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames,h=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort;c=(c?c.monthNames:null)||this._defaults.monthNames;var i=function(o){(o=k+112?a.getHours()+2:0);return a},_setDate:function(a,b,c){var e=!b,f=a.selectedMonth,h=a.selectedYear;b=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay= +a.currentDay=b.getDate();a.drawMonth=a.selectedMonth=a.currentMonth=b.getMonth();a.drawYear=a.selectedYear=a.currentYear=b.getFullYear();if((f!=a.selectedMonth||h!=a.selectedYear)&&!c)this._notifyChange(a);this._adjustInstDate(a);if(a.input)a.input.val(e?"":this._formatDate(a))},_getDate:function(a){return!a.currentYear||a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay))},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(), +b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),e=this._get(a,"showButtonPanel"),f=this._get(a,"hideIfNoPrevNext"),h=this._get(a,"navigationAsDateFormat"),i=this._getNumberOfMonths(a),g=this._get(a,"showCurrentAtPos"),j=this._get(a,"stepMonths"),l=i[0]!=1||i[1]!=1,u=this._daylightSavingAdjust(!a.currentDay?new Date(9999,9,9):new Date(a.currentYear,a.currentMonth,a.currentDay)),k=this._getMinMaxDate(a,"min"),o=this._getMinMaxDate(a,"max");g=a.drawMonth-g;var m=a.drawYear;if(g<0){g+=12;m--}if(o){var n= +this._daylightSavingAdjust(new Date(o.getFullYear(),o.getMonth()-i[0]*i[1]+1,o.getDate()));for(n=k&&nn;){g--;if(g<0){g=11;m--}}}a.drawMonth=g;a.drawYear=m;n=this._get(a,"prevText");n=!h?n:this.formatDate(n,this._daylightSavingAdjust(new Date(m,g-j,1)),this._getFormatConfig(a));n=this._canAdjustMonth(a,-1,m,g)?''+n+"":f?"":''+n+"";var r=this._get(a,"nextText");r=!h?r:this.formatDate(r,this._daylightSavingAdjust(new Date(m,g+j,1)),this._getFormatConfig(a));f=this._canAdjustMonth(a,+1,m,g)?''+r+"":f?"":''+r+"";j=this._get(a,"currentText");r=this._get(a,"gotoCurrent")&&a.currentDay?u:b;j=!h?j:this.formatDate(j,r,this._getFormatConfig(a));h=!a.inline?'":"";e=e?'
        '+(c?h:"")+(this._isInRange(a,r)?'":"")+(c?"":h)+"
        ":"";h=parseInt(this._get(a,"firstDay"),10);h=isNaN(h)?0:h;j=this._get(a,"showWeek");r=this._get(a,"dayNames");this._get(a,"dayNamesShort");var s=this._get(a,"dayNamesMin"),z= +this._get(a,"monthNames"),w=this._get(a,"monthNamesShort"),p=this._get(a,"beforeShowDay"),v=this._get(a,"showOtherMonths"),H=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var L=this._getDefaultDate(a),I="",D=0;D1)switch(E){case 0:x+=" ui-datepicker-group-first";t=" ui-corner-"+(c?"right":"left");break;case i[1]- +1:x+=" ui-datepicker-group-last";t=" ui-corner-"+(c?"left":"right");break;default:x+=" ui-datepicker-group-middle";t="";break}x+='">'}x+='
        '+(/all|left/.test(t)&&D==0?c?f:n:"")+(/all|right/.test(t)&&D==0?c?n:f:"")+this._generateMonthYearHeader(a,g,m,k,o,D>0||E>0,z,w)+'
        ';var B=j?'":"";for(t=0;t<7;t++){var q= +(t+h)%7;B+="=5?' class="ui-datepicker-week-end"':"")+'>'+s[q]+""}x+=B+"";B=this._getDaysInMonth(m,g);if(m==a.selectedYear&&g==a.selectedMonth)a.selectedDay=Math.min(a.selectedDay,B);t=(this._getFirstDayOfMonth(m,g)-h+7)%7;B=l?6:Math.ceil((t+B)/7);q=this._daylightSavingAdjust(new Date(m,g,1-t));for(var O=0;O";var P=!j?"":'";for(t=0;t<7;t++){var G= +p?p.apply(a.input?a.input[0]:null,[q]):[true,""],C=q.getMonth()!=g,J=C&&!H||!G[0]||k&&qo;P+='";q.setDate(q.getDate()+1);q=this._daylightSavingAdjust(q)}x+= +P+""}g++;if(g>11){g=0;m++}x+="
        '+this._get(a,"weekHeader")+"
        '+this._get(a,"calculateWeek")(q)+""+(C&&!v?" ":J?''+q.getDate()+"":''+q.getDate()+"")+"
        "+(l?""+(i[0]>0&&E==i[1]-1?'
        ':""):"");M+=x}I+=M}I+=e+(d.browser.msie&&parseInt(d.browser.version,10)<7&&!a.inline?'':"");a._keyEvent=false;return I},_generateMonthYearHeader:function(a,b,c,e,f,h,i,g){var j=this._get(a,"changeMonth"),l=this._get(a,"changeYear"),u=this._get(a,"showMonthAfterYear"),k='
        ', +o="";if(h||!j)o+=''+i[b]+"";else{i=e&&e.getFullYear()==c;var m=f&&f.getFullYear()==c;o+='"}u||(k+=o+(h||!(j&& +l)?" ":""));if(!a.yearshtml){a.yearshtml="";if(h||!l)k+=''+c+"";else{g=this._get(a,"yearRange").split(":");var r=(new Date).getFullYear();i=function(s){s=s.match(/c[+-].*/)?c+parseInt(s.substring(1),10):s.match(/[+-].*/)?r+parseInt(s,10):parseInt(s,10);return isNaN(s)?r:s};b=i(g[0]);g=Math.max(b,i(g[1]||""));b=e?Math.max(b,e.getFullYear()):b;g=f?Math.min(g,f.getFullYear()):g;for(a.yearshtml+='";if(d.browser.mozilla)k+='";else{k+=a.yearshtml;a.yearshtml=null}}}k+=this._get(a,"yearSuffix");if(u)k+=(h||!(j&&l)?" ":"")+o;k+="
        ";return k},_adjustInstDate:function(a,b,c){var e= +a.drawYear+(c=="Y"?b:0),f=a.drawMonth+(c=="M"?b:0);b=Math.min(a.selectedDay,this._getDaysInMonth(e,f))+(c=="D"?b:0);e=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(e,f,b)));a.selectedDay=e.getDate();a.drawMonth=a.selectedMonth=e.getMonth();a.drawYear=a.selectedYear=e.getFullYear();if(c=="M"||c=="Y")this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");b=c&&ba?a:b},_notifyChange:function(a){var b=this._get(a, +"onChangeMonthYear");if(b)b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-this._daylightSavingAdjust(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,e){var f=this._getNumberOfMonths(a); +c=this._daylightSavingAdjust(new Date(c,e+(b<0?b:f[0]*f[1]),1));b<0&&c.setDate(this._getDaysInMonth(c.getFullYear(),c.getMonth()));return this._isInRange(a,c)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!a||b.getTime()<=a.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a, +"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,e){if(!b){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}b=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(e,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),b,this._getFormatConfig(a))}});d.fn.datepicker= +function(a){if(!this.length)return this;if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker, +[this[0]].concat(b));return this.each(function(){typeof a=="string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new K;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.12";window["DP_jQuery_"+y]=d})(jQuery); +;/* + * jQuery UI Progressbar 1.8.12 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Progressbar + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + */ +(function(b,d){b.widget("ui.progressbar",{options:{value:0,max:100},min:0,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.options.max,"aria-valuenow":this._value()});this.valueDiv=b("
        ").appendTo(this.element);this.oldValue=this._value();this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"); +this.valueDiv.remove();b.Widget.prototype.destroy.apply(this,arguments)},value:function(a){if(a===d)return this._value();this._setOption("value",a);return this},_setOption:function(a,c){if(a==="value"){this.options.value=c;this._refreshValue();this._value()===this.options.max&&this._trigger("complete")}b.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;if(typeof a!=="number")a=0;return Math.min(this.options.max,Math.max(this.min,a))},_percentage:function(){return 100* +this._value()/this.options.max},_refreshValue:function(){var a=this.value(),c=this._percentage();if(this.oldValue!==a){this.oldValue=a;this._trigger("change")}this.valueDiv.toggle(a>this.min).toggleClass("ui-corner-right",a===this.options.max).width(c.toFixed(0)+"%");this.element.attr("aria-valuenow",a)}});b.extend(b.ui.progressbar,{version:"1.8.12"})})(jQuery); +;/* + * jQuery UI Effects 1.8.12 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/ + */ +jQuery.effects||function(f,j){function n(c){var a;if(c&&c.constructor==Array&&c.length==3)return c;if(a=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c))return[parseInt(a[1],10),parseInt(a[2],10),parseInt(a[3],10)];if(a=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c))return[parseFloat(a[1])*2.55,parseFloat(a[2])*2.55,parseFloat(a[3])*2.55];if(a=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c))return[parseInt(a[1], +16),parseInt(a[2],16),parseInt(a[3],16)];if(a=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c))return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)];if(/rgba\(0, 0, 0, 0\)/.exec(c))return o.transparent;return o[f.trim(c).toLowerCase()]}function s(c,a){var b;do{b=f.curCSS(c,a);if(b!=""&&b!="transparent"||f.nodeName(c,"body"))break;a="backgroundColor"}while(c=c.parentNode);return n(b)}function p(){var c=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle, +a={},b,d;if(c&&c.length&&c[0]&&c[c[0]])for(var e=c.length;e--;){b=c[e];if(typeof c[b]=="string"){d=b.replace(/\-(\w)/g,function(g,h){return h.toUpperCase()});a[d]=c[b]}}else for(b in c)if(typeof c[b]==="string")a[b]=c[b];return a}function q(c){var a,b;for(a in c){b=c[a];if(b==null||f.isFunction(b)||a in t||/scrollbar/.test(a)||!/color/i.test(a)&&isNaN(parseFloat(b)))delete c[a]}return c}function u(c,a){var b={_:0},d;for(d in a)if(c[d]!=a[d])b[d]=a[d];return b}function k(c,a,b,d){if(typeof c=="object"){d= +a;b=null;a=c;c=a.effect}if(f.isFunction(a)){d=a;b=null;a={}}if(typeof a=="number"||f.fx.speeds[a]){d=b;b=a;a={}}if(f.isFunction(b)){d=b;b=null}a=a||{};b=b||a.duration;b=f.fx.off?0:typeof b=="number"?b:b in f.fx.speeds?f.fx.speeds[b]:f.fx.speeds._default;d=d||a.complete;return[c,a,b,d]}function m(c){if(!c||typeof c==="number"||f.fx.speeds[c])return true;if(typeof c==="string"&&!f.effects[c])return true;return false}f.effects={};f.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor", +"borderTopColor","borderColor","color","outlineColor"],function(c,a){f.fx.step[a]=function(b){if(!b.colorInit){b.start=s(b.elem,a);b.end=n(b.end);b.colorInit=true}b.elem.style[a]="rgb("+Math.max(Math.min(parseInt(b.pos*(b.end[0]-b.start[0])+b.start[0],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[1]-b.start[1])+b.start[1],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[2]-b.start[2])+b.start[2],10),255),0)+")"}});var o={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0, +0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211, +211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},r=["add","remove","toggle"],t={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};f.effects.animateClass=function(c,a,b, +d){if(f.isFunction(b)){d=b;b=null}return this.queue("fx",function(){var e=f(this),g=e.attr("style")||" ",h=q(p.call(this)),l,v=e.attr("className");f.each(r,function(w,i){c[i]&&e[i+"Class"](c[i])});l=q(p.call(this));e.attr("className",v);e.animate(u(h,l),a,b,function(){f.each(r,function(w,i){c[i]&&e[i+"Class"](c[i])});if(typeof e.attr("style")=="object"){e.attr("style").cssText="";e.attr("style").cssText=g}else e.attr("style",g);d&&d.apply(this,arguments)});h=f.queue(this);l=h.splice(h.length-1,1)[0]; +h.splice(1,0,l);f.dequeue(this)})};f.fn.extend({_addClass:f.fn.addClass,addClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{add:c},a,b,d]):this._addClass(c)},_removeClass:f.fn.removeClass,removeClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{remove:c},a,b,d]):this._removeClass(c)},_toggleClass:f.fn.toggleClass,toggleClass:function(c,a,b,d,e){return typeof a=="boolean"||a===j?b?f.effects.animateClass.apply(this,[a?{add:c}:{remove:c},b,d,e]):this._toggleClass(c, +a):f.effects.animateClass.apply(this,[{toggle:c},a,b,d])},switchClass:function(c,a,b,d,e){return f.effects.animateClass.apply(this,[{add:a,remove:c},b,d,e])}});f.extend(f.effects,{version:"1.8.12",save:function(c,a){for(var b=0;b").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent", +border:"none",margin:0,padding:0});c.wrap(b);b=c.parent();if(c.css("position")=="static"){b.css({position:"relative"});c.css({position:"relative"})}else{f.extend(a,{position:c.css("position"),zIndex:c.css("z-index")});f.each(["top","left","bottom","right"],function(d,e){a[e]=c.css(e);if(isNaN(parseInt(a[e],10)))a[e]="auto"});c.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})}return b.css(a).show()},removeWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent().replaceWith(c); +return c},setTransition:function(c,a,b,d){d=d||{};f.each(a,function(e,g){unit=c.cssUnit(g);if(unit[0]>0)d[g]=unit[0]*b+unit[1]});return d}});f.fn.extend({effect:function(c){var a=k.apply(this,arguments),b={options:a[1],duration:a[2],callback:a[3]};a=b.options.mode;var d=f.effects[c];if(f.fx.off||!d)return a?this[a](b.duration,b.callback):this.each(function(){b.callback&&b.callback.call(this)});return d.call(this,b)},_show:f.fn.show,show:function(c){if(m(c))return this._show.apply(this,arguments); +else{var a=k.apply(this,arguments);a[1].mode="show";return this.effect.apply(this,a)}},_hide:f.fn.hide,hide:function(c){if(m(c))return this._hide.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="hide";return this.effect.apply(this,a)}},__toggle:f.fn.toggle,toggle:function(c){if(m(c)||typeof c==="boolean"||f.isFunction(c))return this.__toggle.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="toggle";return this.effect.apply(this,a)}},cssUnit:function(c){var a=this.css(c), +b=[];f.each(["em","px","%","pt"],function(d,e){if(a.indexOf(e)>0)b=[parseFloat(a),e]});return b}});f.easing.jswing=f.easing.swing;f.extend(f.easing,{def:"easeOutQuad",swing:function(c,a,b,d,e){return f.easing[f.easing.def](c,a,b,d,e)},easeInQuad:function(c,a,b,d,e){return d*(a/=e)*a+b},easeOutQuad:function(c,a,b,d,e){return-d*(a/=e)*(a-2)+b},easeInOutQuad:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a+b;return-d/2*(--a*(a-2)-1)+b},easeInCubic:function(c,a,b,d,e){return d*(a/=e)*a*a+b},easeOutCubic:function(c, +a,b,d,e){return d*((a=a/e-1)*a*a+1)+b},easeInOutCubic:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a+b;return d/2*((a-=2)*a*a+2)+b},easeInQuart:function(c,a,b,d,e){return d*(a/=e)*a*a*a+b},easeOutQuart:function(c,a,b,d,e){return-d*((a=a/e-1)*a*a*a-1)+b},easeInOutQuart:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a+b;return-d/2*((a-=2)*a*a*a-2)+b},easeInQuint:function(c,a,b,d,e){return d*(a/=e)*a*a*a*a+b},easeOutQuint:function(c,a,b,d,e){return d*((a=a/e-1)*a*a*a*a+1)+b},easeInOutQuint:function(c, +a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a*a+b;return d/2*((a-=2)*a*a*a*a+2)+b},easeInSine:function(c,a,b,d,e){return-d*Math.cos(a/e*(Math.PI/2))+d+b},easeOutSine:function(c,a,b,d,e){return d*Math.sin(a/e*(Math.PI/2))+b},easeInOutSine:function(c,a,b,d,e){return-d/2*(Math.cos(Math.PI*a/e)-1)+b},easeInExpo:function(c,a,b,d,e){return a==0?b:d*Math.pow(2,10*(a/e-1))+b},easeOutExpo:function(c,a,b,d,e){return a==e?b+d:d*(-Math.pow(2,-10*a/e)+1)+b},easeInOutExpo:function(c,a,b,d,e){if(a==0)return b;if(a== +e)return b+d;if((a/=e/2)<1)return d/2*Math.pow(2,10*(a-1))+b;return d/2*(-Math.pow(2,-10*--a)+2)+b},easeInCirc:function(c,a,b,d,e){return-d*(Math.sqrt(1-(a/=e)*a)-1)+b},easeOutCirc:function(c,a,b,d,e){return d*Math.sqrt(1-(a=a/e-1)*a)+b},easeInOutCirc:function(c,a,b,d,e){if((a/=e/2)<1)return-d/2*(Math.sqrt(1-a*a)-1)+b;return d/2*(Math.sqrt(1-(a-=2)*a)+1)+b},easeInElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h").css({position:"absolute",visibility:"visible",left:-f*(h/d),top:-e*(i/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:h/d,height:i/c,left:g.left+f*(h/d)+(a.options.mode=="show"?(f-Math.floor(d/2))*(h/d):0),top:g.top+e*(i/c)+(a.options.mode=="show"?(e-Math.floor(c/2))*(i/c):0),opacity:a.options.mode=="show"?0:1}).animate({left:g.left+f*(h/d)+(a.options.mode=="show"?0:(f-Math.floor(d/2))*(h/d)),top:g.top+ +e*(i/c)+(a.options.mode=="show"?0:(e-Math.floor(c/2))*(i/c)),opacity:a.options.mode=="show"?1:0},a.duration||500);setTimeout(function(){a.options.mode=="show"?b.css({visibility:"visible"}):b.css({visibility:"visible"}).hide();a.callback&&a.callback.apply(b[0]);b.dequeue();j("div.ui-effects-explode").remove()},a.duration||500)})}})(jQuery); +;/* + * jQuery UI Effects Fade 1.8.12 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/Fade + * + * Depends: + * jquery.effects.core.js + */ +(function(b){b.effects.fade=function(a){return this.queue(function(){var c=b(this),d=b.effects.setMode(c,a.options.mode||"hide");c.animate({opacity:d},{queue:false,duration:a.duration,easing:a.options.easing,complete:function(){a.callback&&a.callback.apply(this,arguments);c.dequeue()}})})}})(jQuery); +;/* + * jQuery UI Effects Fold 1.8.12 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/Fold + * + * Depends: + * jquery.effects.core.js + */ +(function(c){c.effects.fold=function(a){return this.queue(function(){var b=c(this),j=["position","top","bottom","left","right"],d=c.effects.setMode(b,a.options.mode||"hide"),g=a.options.size||15,h=!!a.options.horizFirst,k=a.duration?a.duration/2:c.fx.speeds._default/2;c.effects.save(b,j);b.show();var e=c.effects.createWrapper(b).css({overflow:"hidden"}),f=d=="show"!=h,l=f?["width","height"]:["height","width"];f=f?[e.width(),e.height()]:[e.height(),e.width()];var i=/([0-9]+)%/.exec(g);if(i)g=parseInt(i[1], +10)/100*f[d=="hide"?0:1];if(d=="show")e.css(h?{height:0,width:g}:{height:g,width:0});h={};i={};h[l[0]]=d=="show"?f[0]:g;i[l[1]]=d=="show"?f[1]:0;e.animate(h,k,a.options.easing).animate(i,k,a.options.easing,function(){d=="hide"&&b.hide();c.effects.restore(b,j);c.effects.removeWrapper(b);a.callback&&a.callback.apply(b[0],arguments);b.dequeue()})})}})(jQuery); +;/* + * jQuery UI Effects Highlight 1.8.12 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/Highlight + * + * Depends: + * jquery.effects.core.js + */ +(function(b){b.effects.highlight=function(c){return this.queue(function(){var a=b(this),e=["backgroundImage","backgroundColor","opacity"],d=b.effects.setMode(a,c.options.mode||"show"),f={backgroundColor:a.css("backgroundColor")};if(d=="hide")f.opacity=0;b.effects.save(a,e);a.show().css({backgroundImage:"none",backgroundColor:c.options.color||"#ffff99"}).animate(f,{queue:false,duration:c.duration,easing:c.options.easing,complete:function(){d=="hide"&&a.hide();b.effects.restore(a,e);d=="show"&&!b.support.opacity&& +this.style.removeAttribute("filter");c.callback&&c.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery); +;/* + * jQuery UI Effects Pulsate 1.8.12 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/Pulsate + * + * Depends: + * jquery.effects.core.js + */ +(function(d){d.effects.pulsate=function(a){return this.queue(function(){var b=d(this),c=d.effects.setMode(b,a.options.mode||"show");times=(a.options.times||5)*2-1;duration=a.duration?a.duration/2:d.fx.speeds._default/2;isVisible=b.is(":visible");animateTo=0;if(!isVisible){b.css("opacity",0).show();animateTo=1}if(c=="hide"&&isVisible||c=="show"&&!isVisible)times--;for(c=0;c').appendTo(document.body).addClass(a.options.className).css({top:d.top,left:d.left,height:b.innerHeight(),width:b.innerWidth(),position:"absolute"}).animate(c,a.duration,a.options.easing,function(){f.remove();a.callback&&a.callback.apply(b[0],arguments); +b.dequeue()})})}})(jQuery); +; \ No newline at end of file From 412f95de4813d40bf636f745e04a4cb17e98b08b Mon Sep 17 00:00:00 2001 From: taggon Date: Thu, 12 May 2011 01:11:59 +0000 Subject: [PATCH 0071/1372] #19745331 Converted four spaces to a tab in language files of the admin module. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8366 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/lang/en.lang.php | 159 +++++++++++++-------------- modules/admin/lang/es.lang.php | 173 +++++++++++++++--------------- modules/admin/lang/fr.lang.php | 159 ++++++++++++++------------- modules/admin/lang/jp.lang.php | 155 +++++++++++++------------- modules/admin/lang/ko.lang.php | 162 ++++++++++++++-------------- modules/admin/lang/ru.lang.php | 156 +++++++++++++-------------- modules/admin/lang/tr.lang.php | 160 +++++++++++++-------------- modules/admin/lang/vi.lang.php | 165 ++++++++++++++-------------- modules/admin/lang/zh-CN.lang.php | 154 +++++++++++++------------- modules/admin/lang/zh-TW.lang.php | 154 +++++++++++++------------- 10 files changed, 799 insertions(+), 798 deletions(-) diff --git a/modules/admin/lang/en.lang.php b/modules/admin/lang/en.lang.php index f3a41e394..9bcb0e062 100644 --- a/modules/admin/lang/en.lang.php +++ b/modules/admin/lang/en.lang.php @@ -1,92 +1,95 @@ admin_info = 'Administrator Info'; - $lang->admin_index = 'Index Admin Page'; - $lang->control_panel = 'Dashboard'; - $lang->start_module = 'Default Module'; - $lang->about_start_module = 'You can specify the default module for the site.'; +$lang->admin_info = 'Administrator Info'; +$lang->admin_index = 'Index Admin Page'; +$lang->control_panel = 'Dashboard'; +$lang->start_module = 'Default Module'; +$lang->about_start_module = 'You can specify the default module for the site.'; - $lang->module_category_title = array( - 'service' => 'Services', - 'member' => 'Members', - 'content' => 'Contents', - 'statistics' => 'Statistics', - 'construction' => 'Construction', - 'utility' => 'Utilities', - 'interlock' => 'Embedded', - 'accessory' => 'Accessories', - 'migration' => 'Data Migration', - 'system' => 'System Setting', - ); +$lang->module_category_title = array( + 'service' => 'Services', + 'member' => 'Members', + 'content' => 'Contents', + 'statistics' => 'Statistics', + 'construction' => 'Construction', + 'utility' => 'Utilities', + 'interlock' => 'Embedded', + 'accessory' => 'Accessories', + 'migration' => 'Data Migration', + 'system' => 'System Setting', +); - $lang->newest_news = "Latest News"; - - $lang->env_setup = "Setting"; - $lang->default_url = "Default URL"; - $lang->about_default_url = "If you use a virtual site feature (e.g., cafeXE), input default URL (parent-site's address), then SSO would be enabled, thus connection to documents/modules works properly."; +$lang->newest_news = "Latest News"; - $lang->env_information = "Environment Information"; - $lang->current_version = "Current Version"; - $lang->current_path = "Installed Path"; - $lang->released_version = "Latest Version"; - $lang->about_download_link = "New version of Zerboard XE is now available!\nPlease click the download link to get the latest version."; - - $lang->item_module = "Module List"; - $lang->item_addon = "Addon List"; - $lang->item_widget = "Widget List"; - $lang->item_layout = "Layout List"; +$lang->env_setup = "Setting"; +$lang->default_url = "Default URL"; +$lang->about_default_url = "If you use a virtual site feature (e.g., cafeXE), input default URL (parent-site's address), then SSO would be enabled, thus connection to documents/modules works properly."; - $lang->module_name = "Module Name"; - $lang->addon_name = "Addon Name"; - $lang->version = "Version"; - $lang->author = "Developer"; - $lang->table_count = "Number of Table"; - $lang->installed_path = "Installed Path"; +$lang->env_information = "Environment Information"; +$lang->current_version = "Current Version"; +$lang->current_path = "Installed Path"; +$lang->released_version = "Latest Version"; +$lang->about_download_link = "New version of Zerboard XE is now available!\nPlease click the download link to get the latest version."; - $lang->cmd_shortcut_management = "Edit Menu"; +$lang->item_module = "Module List"; +$lang->item_addon = "Addon List"; +$lang->item_widget = "Widget List"; +$lang->item_layout = "Layout List"; - $lang->msg_is_not_administrator = 'Administrator Only'; - $lang->msg_manage_module_cannot_delete = 'Shortcuts of module, addon, layout, widget cannot be removed'; - $lang->msg_default_act_is_null = 'Shortcut could not be registered because the default admin Action is not set'; +$lang->module_name = "Module Name"; +$lang->addon_name = "Addon Name"; +$lang->version = "Version"; +$lang->author = "Developer"; +$lang->table_count = "Number of Table"; +$lang->installed_path = "Installed Path"; - $lang->welcome_to_xe = 'Welcome to the admin page of XE'; - $lang->about_admin_page = "Admin page is still under development,\nWe will add essential contents by accepting many good suggestions during the Closed-beta."; - $lang->about_lang_env = "To set the selected language as the default language, click on the Save button."; +$lang->cmd_shortcut_management = "Edit Menu"; - $lang->xe_license = 'XE complies with the GPL'; - $lang->about_shortcut = 'You may remove shortcuts of modules which are registered on frequently using module list'; +$lang->msg_is_not_administrator = 'Administrator Only'; +$lang->msg_manage_module_cannot_delete = 'Shortcuts of module, addon, layout, widget cannot be removed'; +$lang->msg_default_act_is_null = 'Shortcut could not be registered because the default admin Action is not set'; - $lang->yesterday = "Yesterday"; - $lang->today = "Today"; +$lang->welcome_to_xe = 'Welcome to the admin page of XE'; +$lang->about_admin_page = "Admin page is still under development,\nWe will add essential contents by accepting many good suggestions during the Closed-beta."; +$lang->about_lang_env = "To set the selected language as the default language, click on the Save button."; - $lang->cmd_lang_select = "Language"; - $lang->about_cmd_lang_select = "Only selected languages will be served."; - $lang->about_recompile_cache = "You can delete useless or invalid cache files."; - $lang->use_ssl = "Use SSL"; - $lang->ssl_options = array( - 'none' => "Never", - 'optional' => "Optional", - 'always' => "Always" - ); - $lang->about_use_ssl = "In case of 'Optional', SSL will be used for actions such as signing up / changing information. And for 'Always', your site will be served only via https."; - $lang->server_ports = "Server Port"; - $lang->about_server_ports = "If your web server does not use 80 for HTTP or 443 for HTTPS port, 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"; - $lang->ftp_get_list = "Get List"; - $lang->ftp_remove_info = 'Remove FTP Info.'; - $lang->msg_ftp_invalid_path = 'Failed to read the specified FTP Path.'; - $lang->msg_self_restart_cache_engine = 'Please restart Memcached or cache daemon.'; - $lang->mobile_view = 'Mobile View'; - $lang->about_mobile_view = 'Mobile View will display the best layout when accessing with smartphones.'; - $lang->autoinstall = 'EasyInstall'; +$lang->xe_license = 'XE complies with the GPL'; +$lang->about_shortcut = 'You may remove shortcuts of modules which are registered on frequently using module list'; - $lang->last_week = 'Last week'; - $lang->this_week = 'This week'; +$lang->yesterday = "Yesterday"; +$lang->today = "Today"; + +$lang->cmd_lang_select = "Language"; +$lang->about_cmd_lang_select = "Only selected languages will be served."; +$lang->about_recompile_cache = "You can delete useless or invalid cache files."; +$lang->use_ssl = "Use SSL"; +$lang->ssl_options = array( + 'none' => "Never", + 'optional' => "Optional", + 'always' => "Always" +); +$lang->about_use_ssl = "In case of 'Optional', SSL will be used for actions such as signing up / changing information. And for 'Always', your site will be served only via https."; +$lang->server_ports = "Server Port"; +$lang->about_server_ports = "If your web server does not use 80 for HTTP or 443 for HTTPS port, 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"; +$lang->ftp_get_list = "Get List"; +$lang->ftp_remove_info = 'Remove FTP Info.'; +$lang->msg_ftp_invalid_path = 'Failed to read the specified FTP Path.'; +$lang->msg_self_restart_cache_engine = 'Please restart Memcached or cache daemon.'; +$lang->mobile_view = 'Mobile View'; +$lang->about_mobile_view = 'Mobile View will display the best layout when accessing with smartphones.'; +$lang->autoinstall = 'EasyInstall'; + +$lang->last_week = 'Last week'; +$lang->this_week = 'This week'; + +$lang->use_html5 = 'HTML5 DTD'; +$lang->about_html5 = 'Use HTML5 DTD'; ?> diff --git a/modules/admin/lang/es.lang.php b/modules/admin/lang/es.lang.php index d82c58ee4..c8c9b785d 100644 --- a/modules/admin/lang/es.lang.php +++ b/modules/admin/lang/es.lang.php @@ -1,97 +1,96 @@ admin_info = 'Administrador de Información'; - $lang->admin_index = 'Índice de la página admin'; - $lang->control_panel = 'Control panel'; - $lang->start_module = 'Módulo de inicio'; - $lang->about_start_module = 'Puede especificar el módulo de inicio por defecto.'; +$lang->admin_info = 'Administrador de Información'; +$lang->admin_index = 'Índice de la página admin'; +$lang->control_panel = 'Control panel'; +$lang->start_module = 'Módulo de inicio'; +$lang->about_start_module = 'Puede especificar el módulo de inicio por defecto.'; - $lang->module_category_title = array( - 'service' => 'Service Setting', - 'member' => 'Member Setting', - 'content' => 'Content Setting', - 'statistics' => 'Statistics', - 'construction' => 'Construction', - 'utility' => 'Utility Setting', - 'interlock' => 'Interlock Setting', - 'accessory' => 'Accessories', - 'migration' => 'Data Migration', - 'system' => 'System Setting', - ); +$lang->module_category_title = array( + 'service' => 'Service Setting', + 'member' => 'Member Setting', + 'content' => 'Content Setting', + 'statistics' => 'Statistics', + 'construction' => 'Construction', + 'utility' => 'Utility Setting', + 'interlock' => 'Interlock Setting', + 'accessory' => 'Accessories', + 'migration' => 'Data Migration', + 'system' => 'System Setting', +); + +$lang->newest_news = "Noticias recientes"; + +$lang->env_setup = "Configuración"; +$lang->default_url = "기본 URL"; +$lang->about_default_url = "XE sitio virtual (cafeXE, etc) tiene que introducir la URL base, al utilizar las capacidades de trabajo virtual y el tema de autenticación sayiteugan / módulos y las conexiones se realizan correctamente. (Ej: http:// dominio / ruta de instalación)"; + +$lang->env_information = "Información Ambiental"; +$lang->current_version = "Versión actual"; +$lang->current_path = "Instalado Sendero"; +$lang->released_version = "Versión más reciente"; +$lang->about_download_link = "La versión más reciente Zerboard XE está disponible.\nPara descargar la versión más reciente, haga clic en enlace de descarga."; + +$lang->item_module = "Lista de Módulos"; +$lang->item_addon = "Lista de Addons"; +$lang->item_widget = "Lista de Widgets"; +$lang->item_layout = "Liasta de Diseños"; + +$lang->module_name = "Nombre del Módulo"; +$lang->addon_name = "Nombre de Addon"; +$lang->version = "Versión"; +$lang->author = "Autor"; +$lang->table_count = "Número de los tableros"; +$lang->installed_path = "Ruta de instalación"; + +$lang->cmd_shortcut_management = "Editar el Menú"; + +$lang->msg_is_not_administrator = 'Sólo se permite el ingreso del administrador.'; +$lang->msg_manage_module_cannot_delete = 'No se puede eliminar acceso directo del Módulo, Addon, Diseño y Widget.'; +$lang->msg_default_act_is_null = 'No se puede registrar acceso directo por no estar determinada la acción del administrador predefinido.'; + +$lang->welcome_to_xe = 'Esta es la página del Administrador de XE'; +$lang->about_admin_page = "La página del Administrador aún está en desarrollo."; +$lang->about_lang_env = "Para aplicar idioma seleccionado conjunto de los usuarios, como por defecto, haga clic en el botón [Guardar] el cambio."; - $lang->newest_news = "Noticias recientes"; - - $lang->env_setup = "Configuración"; - $lang->default_url = "기본 URL"; - $lang->about_default_url = "XE sitio virtual (cafeXE, etc) tiene que introducir la URL base, al utilizar las capacidades de trabajo virtual y el tema de autenticación sayiteugan / módulos y las conexiones se realizan correctamente. (Ej: http:// dominio / ruta de instalación)"; +$lang->xe_license = 'XE está bajo la Licencia de GPL'; +$lang->about_shortcut = 'Puede Eliminar los accesos directos de módulos, los cuales fueron registrados en la lista de módulos usados frecuentemente'; - $lang->env_information = "Información Ambiental"; - $lang->current_version = "Versión actual"; - $lang->current_path = "Instalado Sendero"; - $lang->released_version = "Versión más reciente"; - $lang->about_download_link = "La versión más reciente Zerboard XE está disponible.\nPara descargar la versión más reciente, haga clic en enlace de descarga."; - - $lang->item_module = "Lista de Módulos"; - $lang->item_addon = "Lista de Addons"; - $lang->item_widget = "Lista de Widgets"; - $lang->item_layout = "Liasta de Diseños"; +$lang->yesterday = "Yesterday"; +$lang->today = "Today"; - $lang->module_name = "Nombre del Módulo"; - $lang->addon_name = "Nombre de Addon"; - $lang->version = "Versión"; - $lang->author = "Autor"; - $lang->table_count = "Número de los tableros"; - $lang->installed_path = "Ruta de instalación"; +$lang->cmd_lang_select = "Selección de Idioma"; +$lang->about_cmd_lang_select = "Seleccione el idioma es sólo el servicio"; +$lang->about_recompile_cache = "Inválido inútil archivo de caché puede organizar jyeotgeona"; +$lang->use_ssl = "Usar SSL"; +$lang->ssl_options = array( + 'none' => "Desactivar", + 'optional' => "Opcionalmente el", + 'always' => "Utilice siempre el" +); +$lang->about_use_ssl = "Opcionalmente, la composición de suscripción / editar la información y el uso de SSL especificada en la acción es siempre el uso de SSL para todos los servicios que se utilizarán"; +$lang->server_ports = "Especifique el puerto del servidor"; +$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"; +$lang->ftp_get_list = "Get List"; +$lang->ftp_remove_info = 'Remove FTP Info.'; +$lang->msg_ftp_invalid_path = 'Failed to read the specified FTP Path.'; +$lang->msg_self_restart_cache_engine = 'Please restart Memcached or cache daemon.'; +$lang->mobile_view = 'Use Mobile View'; +$lang->about_mobile_view = 'If accessing with a smartphone, display content with mobile layout.'; +$lang->autoinstall = 'EasyInstall'; - $lang->cmd_shortcut_management = "Editar el Menú"; +$lang->last_week = 'Last week'; +$lang->this_week = 'This week'; - $lang->msg_is_not_administrator = 'Sólo se permite el ingreso del administrador.'; - $lang->msg_manage_module_cannot_delete = 'No se puede eliminar acceso directo del Módulo, Addon, Diseño y Widget.'; - $lang->msg_default_act_is_null = 'No se puede registrar acceso directo por no estar determinada la acción del administrador predefinido.'; - - $lang->welcome_to_xe = 'Esta es la página del Administrador de XE'; - $lang->about_admin_page = "La página del Administrador aún está en desarrollo."; - $lang->about_lang_env = "Para aplicar idioma seleccionado conjunto de los usuarios, como por defecto, haga clic en el botón [Guardar] el cambio."; - - - $lang->xe_license = 'XE está bajo la Licencia de GPL'; - $lang->about_shortcut = 'Puede Eliminar los accesos directos de módulos, los cuales fueron registrados en la lista de módulos usados frecuentemente'; - - $lang->yesterday = "Yesterday"; - $lang->today = "Today"; - - $lang->cmd_lang_select = "Selección de Idioma"; - $lang->about_cmd_lang_select = "Seleccione el idioma es sólo el servicio"; - $lang->about_recompile_cache = "Inválido inútil archivo de caché puede organizar jyeotgeona"; - $lang->use_ssl = "Usar SSL"; - $lang->ssl_options = array( - 'none' => "Desactivar", - 'optional' => "Opcionalmente el", - 'always' => "Utilice siempre el" - ); - $lang->about_use_ssl = "Opcionalmente, la composición de suscripción / editar la información y el uso de SSL especificada en la acción es siempre el uso de SSL para todos los servicios que se utilizarán"; - $lang->server_ports = "Especifique el puerto del servidor"; - $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"; - $lang->ftp_get_list = "Get List"; - $lang->ftp_remove_info = 'Remove FTP Info.'; - $lang->msg_ftp_invalid_path = 'Failed to read the specified FTP Path.'; - $lang->msg_self_restart_cache_engine = 'Please restart Memcached or cache daemon.'; - $lang->mobile_view = 'Use Mobile View'; - $lang->about_mobile_view = 'If accessing with a smartphone, display content with mobile layout.'; - $lang->autoinstall = 'EasyInstall'; - - $lang->last_week = 'Last week'; - $lang->this_week = 'This week'; - - $lang->use_html5 = 'HTML5 DTD'; - $lang->about_html5 = 'Use HTML5 DTD'; +$lang->use_html5 = 'HTML5 DTD'; +$lang->about_html5 = 'Use HTML5 DTD'; ?> diff --git a/modules/admin/lang/fr.lang.php b/modules/admin/lang/fr.lang.php index 6fd5125f5..fc92dcf5b 100644 --- a/modules/admin/lang/fr.lang.php +++ b/modules/admin/lang/fr.lang.php @@ -1,96 +1,95 @@ admin_info = 'Informations d\'Administrateur'; - $lang->admin_index = 'Page de l\'indice pour l\'Administrateur'; - $lang->control_panel = 'Control panel'; - $lang->start_module = 'Start Module'; - $lang->about_start_module = 'Vous pouvez spécifier début module par défaut.'; +$lang->admin_info = 'Informations d\'Administrateur'; +$lang->admin_index = 'Page de l\'indice pour l\'Administrateur'; +$lang->control_panel = 'Control panel'; +$lang->start_module = 'Start Module'; +$lang->about_start_module = 'Vous pouvez spécifier début module par défaut.'; - $lang->module_category_title = array( - 'service' => 'Service Setting', - 'member' => 'Member Setting', - 'content' => 'Content Setting', - 'statistics' => 'Statistics', - 'construction' => 'Construction', - 'utility' => 'Utility Setting', - 'interlock' => 'Interlock Setting', - 'accessory' => 'Accessories', - 'migration' => 'Data Migration', - 'system' => 'System Setting', - ); +$lang->module_category_title = array( + 'service' => 'Service Setting', + 'member' => 'Member Setting', + 'content' => 'Content Setting', + 'statistics' => 'Statistics', + 'construction' => 'Construction', + 'utility' => 'Utility Setting', + 'interlock' => 'Interlock Setting', + 'accessory' => 'Accessories', + 'migration' => 'Data Migration', + 'system' => 'System Setting', +); - $lang->newest_news = "Dernières Nouvelles"; - - $lang->env_setup = "Configuration"; - $lang->default_url = "기본 URL"; - $lang->about_default_url = "XE 가상 사이트(cafeXE등)의 기능을 사용할때 기본 URL을 입력해 주셔야 가상 사이트간 인증 연동이 되고 게시글/모듈등의 연결이 정상적으로 이루어집니다. (ex: http://도메인/설치경로)"; +$lang->newest_news = "Dernières Nouvelles"; +$lang->env_setup = "Configuration"; +$lang->default_url = "기본 URL"; +$lang->about_default_url = "XE 가상 사이트(cafeXE등)의 기능을 사용할때 기본 URL을 입력해 주셔야 가상 사이트간 인증 연동이 되고 게시글/모듈등의 연결이 정상적으로 이루어집니다. (ex: http://도메인/설치경로)"; - $lang->env_information = "Informations de l'Environnement"; - $lang->current_version = "Version Courante"; - $lang->current_path = "Chemin Installé"; - $lang->released_version = "Dernière Version"; - $lang->about_download_link = "Nouvelle version est disponible.\nPour télécharger la dernière version, cliquez le lien."; - - $lang->item_module = "Liste des Modules"; - $lang->item_addon = "Liste des Compagnons"; - $lang->item_widget = "Liste des Gadgets"; - $lang->item_layout = "Liste des Mises en Pages"; +$lang->env_information = "Informations de l'Environnement"; +$lang->current_version = "Version Courante"; +$lang->current_path = "Chemin Installé"; +$lang->released_version = "Dernière Version"; +$lang->about_download_link = "Nouvelle version est disponible.\nPour télécharger la dernière version, cliquez le lien."; - $lang->module_name = "Nom de Module"; - $lang->addon_name = "Nom de Compagnon"; - $lang->version = "Version"; - $lang->author = "Auteur"; - $lang->table_count = "Somme de Tables"; - $lang->installed_path = "Chemin Installé"; +$lang->item_module = "Liste des Modules"; +$lang->item_addon = "Liste des Compagnons"; +$lang->item_widget = "Liste des Gadgets"; +$lang->item_layout = "Liste des Mises en Pages"; - $lang->cmd_shortcut_management = "Editer le Menu"; +$lang->module_name = "Nom de Module"; +$lang->addon_name = "Nom de Compagnon"; +$lang->version = "Version"; +$lang->author = "Auteur"; +$lang->table_count = "Somme de Tables"; +$lang->installed_path = "Chemin Installé"; - $lang->msg_is_not_administrator = 'Administrateur seulement'; - $lang->msg_manage_module_cannot_delete = 'On ne peut pas supprimer les raccourcis pour les modules, les compagnons, les mises en page ou les gadgets'; - $lang->msg_default_act_is_null = 'on ne peut pas enrégistrer les raccourcis parce que les Actions Par Défaut de l\'Administrateur ne sont pas établies'; +$lang->cmd_shortcut_management = "Editer le Menu"; - $lang->welcome_to_xe = 'Bienvenue sur la Page d\'Administration du XE'; - $lang->about_admin_page = "La Page d\'Administration est encore en train de développer,\nNous allons ajouter des contenus essentiels par accepter beauoup de bons suggestions pendant Béta Proche."; - $lang->about_lang_env = "Vous pouvez fixer la Langue Par Défaut par cliquer le boutton [Conserver] au-dessous. Les visiteurs vont voir tous les menus et les messages en langue que vous choisissez."; +$lang->msg_is_not_administrator = 'Administrateur seulement'; +$lang->msg_manage_module_cannot_delete = 'On ne peut pas supprimer les raccourcis pour les modules, les compagnons, les mises en page ou les gadgets'; +$lang->msg_default_act_is_null = 'on ne peut pas enrégistrer les raccourcis parce que les Actions Par Défaut de l\'Administrateur ne sont pas établies'; - $lang->xe_license = 'XE s\'applique la GPL'; - $lang->about_shortcut = 'Vous pouvez supprimer les raccourcis pour les modules qui sont enrgistrés sur le liste des modules qui sont utilisés fréquemment'; +$lang->welcome_to_xe = 'Bienvenue sur la Page d\'Administration du XE'; +$lang->about_admin_page = "La Page d\'Administration est encore en train de développer,\nNous allons ajouter des contenus essentiels par accepter beauoup de bons suggestions pendant Béta Proche."; +$lang->about_lang_env = "Vous pouvez fixer la Langue Par Défaut par cliquer le boutton [Conserver] au-dessous. Les visiteurs vont voir tous les menus et les messages en langue que vous choisissez."; - $lang->yesterday = "Yesterday"; - $lang->today = "Today"; +$lang->xe_license = 'XE s\'applique la GPL'; +$lang->about_shortcut = 'Vous pouvez supprimer les raccourcis pour les modules qui sont enrgistrés sur le liste des modules qui sont utilisés fréquemment'; - $lang->cmd_lang_select = "langue"; - $lang->about_cmd_lang_select = "La langue choisie seulement sera servie"; - $lang->about_recompile_cache = "Vous pouvez arranger les fichiers inutils ou les fichiers invalides d'antémémoire"; - $lang->use_ssl = "Utiliser SSL"; - $lang->ssl_options = array( - 'none' => "Ne Pas utiliser", - 'optional' => "Optionnel", - 'always' => "Toujours" - ); - $lang->about_use_ssl = "Si l'on choisit 'Optionnel' , on utilise protocole SSL seulement dans quelques services comme inscription ou modification. Si l'on choisit 'Toujours', on utilise protocole SSL dans tous les services."; - $lang->server_ports = "déclarer le port de serveur"; - $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"; - $lang->ftp_get_list = "Get List"; - $lang->ftp_remove_info = 'Remove FTP Info.'; - $lang->msg_ftp_invalid_path = 'Failed to read the specified FTP Path.'; - $lang->msg_self_restart_cache_engine = 'Please restart Memcached or cache daemon.'; - $lang->mobile_view = 'Use Mobile View'; - $lang->about_mobile_view = 'If accessing with a smartphone, display content with mobile layout.'; - $lang->autoinstall = 'EasyInstall'; +$lang->yesterday = "Yesterday"; +$lang->today = "Today"; - $lang->last_week = 'Last week'; - $lang->this_week = 'This week'; +$lang->cmd_lang_select = "langue"; +$lang->about_cmd_lang_select = "La langue choisie seulement sera servie"; +$lang->about_recompile_cache = "Vous pouvez arranger les fichiers inutils ou les fichiers invalides d'antémémoire"; +$lang->use_ssl = "Utiliser SSL"; +$lang->ssl_options = array( + 'none' => "Ne Pas utiliser", + 'optional' => "Optionnel", + 'always' => "Toujours" +); +$lang->about_use_ssl = "Si l'on choisit 'Optionnel' , on utilise protocole SSL seulement dans quelques services comme inscription ou modification. Si l'on choisit 'Toujours', on utilise protocole SSL dans tous les services."; +$lang->server_ports = "déclarer le port de serveur"; +$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"; +$lang->ftp_get_list = "Get List"; +$lang->ftp_remove_info = 'Remove FTP Info.'; +$lang->msg_ftp_invalid_path = 'Failed to read the specified FTP Path.'; +$lang->msg_self_restart_cache_engine = 'Please restart Memcached or cache daemon.'; +$lang->mobile_view = 'Use Mobile View'; +$lang->about_mobile_view = 'If accessing with a smartphone, display content with mobile layout.'; +$lang->autoinstall = 'EasyInstall'; - $lang->use_html5 = 'HTML5 DTD'; - $lang->about_html5 = 'Use HTML5 DTD'; +$lang->last_week = 'Last week'; +$lang->this_week = 'This week'; + +$lang->use_html5 = 'HTML5 DTD'; +$lang->about_html5 = 'Use HTML5 DTD'; ?> diff --git a/modules/admin/lang/jp.lang.php b/modules/admin/lang/jp.lang.php index be1344b8c..bd9b39dff 100644 --- a/modules/admin/lang/jp.lang.php +++ b/modules/admin/lang/jp.lang.php @@ -1,96 +1,95 @@ admin_info = '管理者情報'; - $lang->admin_index = '管理者トップページ'; - $lang->control_panel = 'コントロールパネル'; - $lang->start_module = '初期起動モジュール'; - $lang->about_start_module = 'デフォルトで起動するモジュールを指定することができます。'; +$lang->admin_info = '管理者情報'; +$lang->admin_index = '管理者トップページ'; +$lang->control_panel = 'コントロールパネル'; +$lang->start_module = '初期起動モジュール'; +$lang->about_start_module = 'デフォルトで起動するモジュールを指定することができます。'; - $lang->module_category_title = array( - 'service' => 'サービス管理', - 'member' => '会員管理', - 'content' => 'コンテンツ管理', - 'statistics' => '統計確認', - 'construction' => 'サイト設定', - 'utility' => '機能設定', - 'interlock' => '連動設定', - 'accessory' => '付加機能設定', - 'migration' => 'データ管理/復元', - 'system' => 'システム管理', - ); +$lang->module_category_title = array( + 'service' => 'サービス管理', + 'member' => '会員管理', + 'content' => 'コンテンツ管理', + 'statistics' => '統計確認', + 'construction' => 'サイト設定', + 'utility' => '機能設定', + 'interlock' => '連動設定', + 'accessory' => '付加機能設定', + 'migration' => 'データ管理/復元', + 'system' => 'システム管理', +); - $lang->newest_news = '最新ニュース'; +$lang->newest_news = '最新ニュース'; - $lang->env_setup = '環境設定'; - $lang->default_url = '基本URL'; - $lang->about_default_url = '複数のバーチャル(Virtual)サイトを運営する場合、どちらからログインしてもバーチャル(Virtual)サイトの間でログイン情報を維持出来るようにするためには、基本になるサイトでのXEをインストールしたurlを登録して下さい。 (例: http://ドメイン/インストールパス)'; +$lang->env_setup = '環境設定'; +$lang->default_url = '基本URL'; +$lang->about_default_url = '複数のバーチャル(Virtual)サイトを運営する場合、どちらからログインしてもバーチャル(Virtual)サイトの間でログイン情報を維持出来るようにするためには、基本になるサイトでのXEをインストールしたurlを登録して下さい。 (例: http://ドメイン/インストールパス)'; +$lang->env_information = '環境情報'; +$lang->current_version = 'インストール済みバージョン'; +$lang->current_path = 'インストールパス'; +$lang->released_version = '最新バージョン'; +$lang->about_download_link = "新しいバージョンが配布されています。\n「ダウンロード」リンクをクリックするとダウンロード出来ます。"; - $lang->env_information = '環境情報'; - $lang->current_version = 'インストール済みバージョン'; - $lang->current_path = 'インストールパス'; - $lang->released_version = '最新バージョン'; - $lang->about_download_link = "新しいバージョンが配布されています。\n「ダウンロード」リンクをクリックするとダウンロード出来ます。"; +$lang->item_module = 'モジュールリスト'; +$lang->item_addon = 'アドオンリスト'; +$lang->item_widget = 'ウィジェットリスト'; +$lang->item_layout = 'レイアウトリスト'; - $lang->item_module = 'モジュールリスト'; - $lang->item_addon = 'アドオンリスト'; - $lang->item_widget = 'ウィジェットリスト'; - $lang->item_layout = 'レイアウトリスト'; +$lang->module_name = 'モジュール名'; +$lang->addon_name = 'アドオン名'; +$lang->version = 'バージョン'; +$lang->author = '制作者'; +$lang->table_count = 'テーブル数'; +$lang->installed_path = 'インストールパス'; - $lang->module_name = 'モジュール名'; - $lang->addon_name = 'アドオン名'; - $lang->version = 'バージョン'; - $lang->author = '制作者'; - $lang->table_count = 'テーブル数'; - $lang->installed_path = 'インストールパス'; +$lang->cmd_shortcut_management = 'メニューの編集'; - $lang->cmd_shortcut_management = 'メニューの編集'; +$lang->msg_is_not_administrator = '管理者のみアクセス出来ます'; +$lang->msg_manage_module_cannot_delete = 'モジュール、アドオン、ウィジェットのショットカットは削除出来ません。'; +$lang->msg_default_act_is_null = 'デフォルトの管理者のアクションが指定されていないため、ショットカットを登録することが出来ません。'; - $lang->msg_is_not_administrator = '管理者のみアクセス出来ます'; - $lang->msg_manage_module_cannot_delete = 'モジュール、アドオン、ウィジェットのショットカットは削除出来ません。'; - $lang->msg_default_act_is_null = 'デフォルトの管理者のアクションが指定されていないため、ショットカットを登録することが出来ません。'; +$lang->welcome_to_xe = 'XEの管理者ページです。'; +$lang->about_lang_env = '初めてサイトに訪問したユーザーに対し、上記の選択した言語でサイトを表示させるためには、必ず下記の「保存」ボタンをクリックして適用して下さい。'; - $lang->welcome_to_xe = 'XEの管理者ページです。'; - $lang->about_lang_env = '初めてサイトに訪問したユーザーに対し、上記の選択した言語でサイトを表示させるためには、必ず下記の「保存」ボタンをクリックして適用して下さい。'; +$lang->xe_license = 'XEのライセンスはGPLです。'; +$lang->about_shortcut = 'よく使用するモジュールに登録されたショートカットは削除出来ます。'; - $lang->xe_license = 'XEのライセンスはGPLです。'; - $lang->about_shortcut = 'よく使用するモジュールに登録されたショートカットは削除出来ます。'; +$lang->yesterday = '昨日'; +$lang->today = '今日'; - $lang->yesterday = '昨日'; - $lang->today = '今日'; +$lang->cmd_lang_select = '言語選択'; +$lang->about_cmd_lang_select = '選択した言語だけでサービスを行います。'; +$lang->about_recompile_cache = '要らないかごみのキャッシューファイルを整理します。'; +$lang->use_ssl = 'SSL環境設定'; +$lang->ssl_options = array( + 'none' => '使わない', + 'optional' => '部分的に使う', + 'always' => '常に使う' +); +$lang->about_use_ssl = '「部分的に使う場合」は「会員登録/会員情報変更」など特定のactionでSSLを利用する場合、「常に使う」は全てのサービスがSSLを使う場合に選択します。'; +$lang->server_ports = 'サーバーポート指定'; +$lang->about_server_ports = '一般的に使われているHTTPの80、HTTPSの443以外の他のポートを使うために、ポートを指定して下さい。'; +$lang->use_db_session = 'DBで認証セッション管理'; +$lang->about_db_session = '認証の時に使われるPHPセッションをDBで使う機能です。
        ウェブサーバーの負荷が低いサイトではこの機能をオフにすることでむしろサイトのレスポンスが向上されることもあります。
        また、この機能をオンにすると、「現在ログイン中の会員」の機能が不可になります。'; +$lang->sftp = "SFTP使用"; +$lang->ftp_get_list = "ディレクトリ目録要請"; +$lang->ftp_remove_info = 'FTP情報削除'; +$lang->msg_ftp_invalid_path = '指定されたFTPパスへのアクセスに失敗しました。'; +$lang->msg_self_restart_cache_engine = 'メムキャッシュドまたはキャッシュデーモンを再起動して下さい。'; +$lang->mobile_view = 'モバイルスキン使用'; +$lang->about_mobile_view = 'スマート携帯などを通じてサイトに接続した場合、モバイル画面に最適化されたレイアウトを使用するように設定します。'; - $lang->cmd_lang_select = '言語選択'; - $lang->about_cmd_lang_select = '選択した言語だけでサービスを行います。'; - $lang->about_recompile_cache = '要らないかごみのキャッシューファイルを整理します。'; - $lang->use_ssl = 'SSL環境設定'; - $lang->ssl_options = array( - 'none' => '使わない', - 'optional' => '部分的に使う', - 'always' => '常に使う' - ); - $lang->about_use_ssl = '「部分的に使う場合」は「会員登録/会員情報変更」など特定のactionでSSLを利用する場合、「常に使う」は全てのサービスがSSLを使う場合に選択します。'; - $lang->server_ports = 'サーバーポート指定'; - $lang->about_server_ports = '一般的に使われているHTTPの80、HTTPSの443以外の他のポートを使うために、ポートを指定して下さい。'; - $lang->use_db_session = 'DBで認証セッション管理'; - $lang->about_db_session = '認証の時に使われるPHPセッションをDBで使う機能です。
        ウェブサーバーの負荷が低いサイトではこの機能をオフにすることでむしろサイトのレスポンスが向上されることもあります。
        また、この機能をオンにすると、「現在ログイン中の会員」の機能が不可になります。'; - $lang->sftp = "SFTP使用"; - $lang->ftp_get_list = "ディレクトリ目録要請"; - $lang->ftp_remove_info = 'FTP情報削除'; - $lang->msg_ftp_invalid_path = '指定されたFTPパスへのアクセスに失敗しました。'; - $lang->msg_self_restart_cache_engine = 'メムキャッシュドまたはキャッシュデーモンを再起動して下さい。'; - $lang->mobile_view = 'モバイルスキン使用'; - $lang->about_mobile_view = 'スマート携帯などを通じてサイトに接続した場合、モバイル画面に最適化されたレイアウトを使用するように設定します。'; +$lang->autoinstall = 'イージーインストール'; - $lang->autoinstall = 'イージーインストール'; +$lang->last_week = '先週'; +$lang->this_week = '今週'; - $lang->last_week = '先週'; - $lang->this_week = '今週'; - - $lang->use_html5 = 'HTML5 DTD'; - $lang->about_html5 = 'Use HTML5 DTD'; +$lang->use_html5 = 'HTML5 DTD'; +$lang->about_html5 = 'Use HTML5 DTD'; ?> diff --git a/modules/admin/lang/ko.lang.php b/modules/admin/lang/ko.lang.php index 97c362692..51895838a 100644 --- a/modules/admin/lang/ko.lang.php +++ b/modules/admin/lang/ko.lang.php @@ -1,82 +1,84 @@ admin_info = '관리자 정보'; - $lang->admin_index = '관리자 초기 페이지'; - $lang->control_panel = '제어판'; - $lang->start_module = '시작 모듈'; - $lang->about_start_module = '사이트 접속 시 기본으로 호출될 모듈을 지정할 수 있습니다.'; - $lang->module_category_title = array( - 'service' => '서비스 관리', - 'member' => '회원 관리', - 'content' => '정보 관리', - 'statistics' => '통계 열람', - 'construction' => '사이트 설정', - 'utility' => '기능 설정', - 'interlock' => '연동 설정', - 'accessory' => '부가 기능 설정', - 'migration' => '데이터 관리/복원', - 'system' => '시스템 관리', - ); - $lang->newest_news = '최신 소식'; - $lang->env_setup = '환경 설정'; - $lang->default_url = '기본 URL'; - $lang->about_default_url = 'XE 가상 사이트(cafeXE 등)의 기능을 사용할 때 기본 URL을 입력하셔야 가상 사이트간 인증 연동이 되고 게시글, 모듈 등의 연결이 정상적으로 이루어집니다. (예: http://도메인/설치경로)'; - $lang->env_information = '환경 정보'; - $lang->current_version = '설치된 버전'; - $lang->current_path = '설치된 경로'; - $lang->released_version = '최신 버전'; - $lang->about_download_link = "최신 버전이 배포되었습니다.\ndownload 링크를 클릭하시면 다운 받으실 수 있습니다."; - $lang->item_module = '모듈 목록'; - $lang->item_addon = '애드온 목록'; - $lang->item_widget = '위젯 목록'; - $lang->item_layout = '레이아웃 목록'; - $lang->module_name = '모듈 이름'; - $lang->addon_name = '애드온 이름'; - $lang->version = '버전'; - $lang->author = '제작자'; - $lang->table_count = '테이블 수'; - $lang->installed_path = '설치 경로'; - $lang->cmd_shortcut_management = '메뉴 편집하기'; - $lang->msg_is_not_administrator = '관리자만 접속이 가능합니다.'; - $lang->msg_manage_module_cannot_delete = '모듈, 애드온, 레이아웃, 위젯 모듈의 바로가기는 삭제 불가능합니다.'; - $lang->msg_default_act_is_null = '기본 관리자 Action이 지정되어 있지 않아 바로가기 등록을 할 수 없습니다.'; - $lang->welcome_to_xe = 'XE 관리자'; - $lang->about_lang_env = '처음 방문하는 사용자들의 언어 설정을 동일하게 하려면, 원하는 언어로 변경 후 아래 [저장] 버튼을 클릭하시면 됩니다.'; - $lang->xe_license = 'XE는 GPL을 따릅니다.'; - $lang->about_shortcut = '자주 사용하는 모듈에 등록된 모듈의 바로가기를 삭제할 수 있습니다.'; - $lang->yesterday = '어제'; - $lang->today = '오늘'; - $lang->cmd_lang_select = '언어선택'; - $lang->about_cmd_lang_select = '선택된 언어들만 서비스 됩니다.'; - $lang->about_recompile_cache = '쓸모 없어졌거나 잘못된 캐시파일들을 정리할 수 있습니다.'; - $lang->use_ssl = 'SSL 사용'; - $lang->ssl_options = array( - 'none' => '사용 안함', - 'optional' => '선택적으로', - 'always' => '항상 사용' - ); - $lang->about_use_ssl = '\'선택적으로\'는 회원가입, 정보수정 등의 지정된 action에서 SSL을 사용하고 \'항상 사용\'은 모든 서비스에 SSL을 사용 합니다.'; - $lang->server_ports = '서버포트지정'; - $lang->about_server_ports = 'HTTP는 80, HTTPS는 443 이 아닌, 다른 포트를 사용할 경우에 포트를 지정해 주어야 합니다.'; - $lang->use_db_session = '인증 세션 DB 사용'; - $lang->about_db_session = '인증 시 사용되는 PHP 세션을 DB로 사용하는 기능입니다.
        웹서버의 사용률이 낮은 사이트에서는 비활성화시 사이트 응답 속도가 향상될 수 있습니다.
        단 현재 접속자를 구할 수 없어 관련된 기능을 사용할 수 없게 됩니다.'; - $lang->sftp = 'SFTP 사용'; - $lang->ftp_get_list = '목록 가져오기'; - $lang->ftp_remove_info = 'FTP 정보 삭제'; - $lang->msg_ftp_invalid_path = 'FTP Path를 읽을 수 없습니다.'; - $lang->msg_self_restart_cache_engine = 'Memcached 또는 캐쉬데몬을 재시작 해주세요.'; - $lang->mobile_view = '모바일 뷰 사용'; - $lang->about_mobile_view = '스마트폰 등을 이용하여 접속할 때 모바일 화면에 최적화된 레이아웃을 이용하도록 합니다.'; - $lang->autoinstall = '쉬운 설치'; - $lang->last_week = '지난 주'; - $lang->this_week = '이번 주'; +/**[ORIGINAL] + * @file ko.lang.php + * @author NHN (developers@xpressengine.com) + * @brief 한국어 언어팩 (기본적인 내용만 수록) + **/ +/**[TRANSLATE] + * @file ko.lang.php + * @author NHN (developers@xpressengine.com) + * @brief Korean language pack (only the more basic) + **/ +$lang->admin_info = '관리자 정보'; +$lang->admin_index = '관리자 초기 페이지'; +$lang->control_panel = '제어판'; +$lang->start_module = '시작 모듈'; +$lang->about_start_module = '사이트 접속 시 기본으로 호출될 모듈을 지정할 수 있습니다.'; +$lang->module_category_title = array( + 'service' => '서비스 관리', + 'member' => '회원 관리', + 'content' => '정보 관리', + 'statistics' => '통계 열람', + 'construction' => '사이트 설정', + 'utility' => '기능 설정', + 'interlock' => '연동 설정', + 'accessory' => '부가 기능 설정', + 'migration' => '데이터 관리/복원', + 'system' => '시스템 관리', +); +$lang->newest_news = '최신 소식'; +$lang->env_setup = '환경 설정'; +$lang->default_url = '기본 URL'; +$lang->about_default_url = 'XE 가상 사이트(cafeXE 등)의 기능을 사용할 때 기본 URL을 입력하셔야 가상 사이트간 인증 연동이 되고 게시글, 모듈 등의 연결이 정상적으로 이루어집니다. (예: http://도메인/설치경로)'; +$lang->env_information = '환경 정보'; +$lang->current_version = '설치된 버전'; +$lang->current_path = '설치된 경로'; +$lang->released_version = '최신 버전'; +$lang->about_download_link = "최신 버전이 배포되었습니다.\ndownload 링크를 클릭하시면 다운 받으실 수 있습니다."; +$lang->item_module = '모듈 목록'; +$lang->item_addon = '애드온 목록'; +$lang->item_widget = '위젯 목록'; +$lang->item_layout = '레이아웃 목록'; +$lang->module_name = '모듈 이름'; +$lang->addon_name = '애드온 이름'; +$lang->version = '버전'; +$lang->author = '제작자'; +$lang->table_count = '테이블 수'; +$lang->installed_path = '설치 경로'; +$lang->cmd_shortcut_management = '메뉴 편집하기'; +$lang->msg_is_not_administrator = '관리자만 접속이 가능합니다.'; +$lang->msg_manage_module_cannot_delete = '모듈, 애드온, 레이아웃, 위젯 모듈의 바로가기는 삭제 불가능합니다.'; +$lang->msg_default_act_is_null = '기본 관리자 Action이 지정되어 있지 않아 바로가기 등록을 할 수 없습니다.'; +$lang->welcome_to_xe = 'XE 관리자'; +$lang->about_lang_env = '처음 방문하는 사용자들의 언어 설정을 동일하게 하려면, 원하는 언어로 변경 후 아래 [저장] 버튼을 클릭하시면 됩니다.'; +$lang->xe_license = 'XE는 GPL을 따릅니다.'; +$lang->about_shortcut = '자주 사용하는 모듈에 등록된 모듈의 바로가기를 삭제할 수 있습니다.'; +$lang->yesterday = '어제'; +$lang->today = '오늘'; +$lang->cmd_lang_select = '언어선택'; +$lang->about_cmd_lang_select = '선택된 언어들만 서비스 됩니다.'; +$lang->about_recompile_cache = '쓸모 없어졌거나 잘못된 캐시파일들을 정리할 수 있습니다.'; +$lang->use_ssl = 'SSL 사용'; +$lang->ssl_options = array( + 'none' => '사용 안함', + 'optional' => '선택적으로', + 'always' => '항상 사용' +); +$lang->about_use_ssl = '\'선택적으로\'는 회원가입, 정보수정 등의 지정된 action에서 SSL을 사용하고 \'항상 사용\'은 모든 서비스에 SSL을 사용 합니다.'; +$lang->server_ports = '서버포트지정'; +$lang->about_server_ports = 'HTTP는 80, HTTPS는 443 이 아닌, 다른 포트를 사용할 경우에 포트를 지정해 주어야 합니다.'; +$lang->use_db_session = '인증 세션 DB 사용'; +$lang->about_db_session = '인증 시 사용되는 PHP 세션을 DB로 사용하는 기능입니다.
        웹서버의 사용률이 낮은 사이트에서는 비활성화시 사이트 응답 속도가 향상될 수 있습니다.
        단 현재 접속자를 구할 수 없어 관련된 기능을 사용할 수 없게 됩니다.'; +$lang->sftp = 'SFTP 사용'; +$lang->ftp_get_list = '목록 가져오기'; +$lang->ftp_remove_info = 'FTP 정보 삭제'; +$lang->msg_ftp_invalid_path = 'FTP Path를 읽을 수 없습니다.'; +$lang->msg_self_restart_cache_engine = 'Memcached 또는 캐쉬데몬을 재시작 해주세요.'; +$lang->mobile_view = '모바일 뷰 사용'; +$lang->about_mobile_view = '스마트폰 등을 이용하여 접속할 때 모바일 화면에 최적화된 레이아웃을 이용하도록 합니다.'; +$lang->autoinstall = '쉬운 설치'; +$lang->last_week = '지난 주'; +$lang->this_week = '이번 주'; +$lang->use_html5 = 'HTML5 DTD'; +$lang->about_html5 = 'HTML5 DTD 사용'; ?> diff --git a/modules/admin/lang/ru.lang.php b/modules/admin/lang/ru.lang.php index 67f5e4dd0..4abfc88f8 100644 --- a/modules/admin/lang/ru.lang.php +++ b/modules/admin/lang/ru.lang.php @@ -1,94 +1,94 @@ admin_info = 'Информация администратора'; - $lang->admin_index = 'Индексная страница администратора'; - $lang->control_panel = 'Контрольная панель'; - $lang->start_module = 'Стартовый модуль'; - $lang->about_start_module = 'Вы можете указать модуль запуска по умолчанию.'; +$lang->admin_info = 'Информация администратора'; +$lang->admin_index = 'Индексная страница администратора'; +$lang->control_panel = 'Контрольная панель'; +$lang->start_module = 'Стартовый модуль'; +$lang->about_start_module = 'Вы можете указать модуль запуска по умолчанию.'; - $lang->module_category_title = array( - 'service' => 'Service Setting', - 'member' => 'Member Setting', - 'content' => 'Content Setting', - 'statistics' => 'Statistics', - 'construction' => 'Construction', - 'utility' => 'Utility Setting', - 'interlock' => 'Interlock Setting', - 'accessory' => 'Accessories', - 'migration' => 'Data Migration', - 'system' => 'System Setting', - ); +$lang->module_category_title = array( + 'service' => 'Service Setting', + 'member' => 'Member Setting', + 'content' => 'Content Setting', + 'statistics' => 'Statistics', + 'construction' => 'Construction', + 'utility' => 'Utility Setting', + 'interlock' => 'Interlock Setting', + 'accessory' => 'Accessories', + 'migration' => 'Data Migration', + 'system' => 'System Setting', +); - $lang->newest_news = 'Последние новости'; - - $lang->env_setup = 'Настройка'; - $lang->default_url = 'Основной URL'; - $lang->about_default_url = 'If you use a virtual site feature (e.g., cafeXE), input default URL (parent-sites address), then SSO would be enabled, thus connection to documents/modules works properly'; +$lang->newest_news = 'Последние новости'; - $lang->env_information = 'Информация окружения'; - $lang->current_version = 'Текущая версия'; - $lang->current_path = 'Текущий путь'; - $lang->released_version = 'Последняя версия'; - $lang->about_download_link = 'Новая версия XE доступна.\nЧтобы скачать последнюю версию, нажмите ссылку закачки'; - - $lang->item_module = 'Список модулей'; - $lang->item_addon = 'Список аддонов'; - $lang->item_widget = 'Список виджетов'; - $lang->item_layout = 'Список лейаутов'; +$lang->env_setup = 'Настройка'; +$lang->default_url = 'Основной URL'; +$lang->about_default_url = 'If you use a virtual site feature (e.g., cafeXE), input default URL (parent-sites address), then SSO would be enabled, thus connection to documents/modules works properly'; - $lang->module_name = 'Имя модуля'; - $lang->addon_name = 'Имя аддона'; - $lang->version = 'Версия'; - $lang->author = 'Разработчик'; - $lang->table_count = 'Номер таблицы'; - $lang->installed_path = 'Путь установки'; +$lang->env_information = 'Информация окружения'; +$lang->current_version = 'Текущая версия'; +$lang->current_path = 'Текущий путь'; +$lang->released_version = 'Последняя версия'; +$lang->about_download_link = 'Новая версия XE доступна.\nЧтобы скачать последнюю версию, нажмите ссылку закачки'; - $lang->cmd_shortcut_management = 'Редактировать меню'; +$lang->item_module = 'Список модулей'; +$lang->item_addon = 'Список аддонов'; +$lang->item_widget = 'Список виджетов'; +$lang->item_layout = 'Список лейаутов'; - $lang->msg_is_not_administrator = 'Только для администраторов!'; - $lang->msg_manage_module_cannot_delete = 'Ярлыки модулей, аддонов, лейаутов, виджетов не могут быть удалены'; - $lang->msg_default_act_is_null = 'Ярлык не может быть зарегистрирован, поскольку стандартное административное действие не установлено'; +$lang->module_name = 'Имя модуля'; +$lang->addon_name = 'Имя аддона'; +$lang->version = 'Версия'; +$lang->author = 'Разработчик'; +$lang->table_count = 'Номер таблицы'; +$lang->installed_path = 'Путь установки'; - $lang->welcome_to_xe = 'Добро пожаловать на страницу администратора XE'; - $lang->about_lang_env = 'Чтобы применить выбранный язык для пользователей как страндартный, нажмите кнопку Сохранить [Save] после изменения'; +$lang->cmd_shortcut_management = 'Редактировать меню'; - $lang->xe_license = 'XE подчиняется Стандартной Общественной Лицензии GPL'; - $lang->about_shortcut = 'Вы можете удалить ярлыки модулей, зарегистрированных в списке часто используемых модулей'; +$lang->msg_is_not_administrator = 'Только для администраторов!'; +$lang->msg_manage_module_cannot_delete = 'Ярлыки модулей, аддонов, лейаутов, виджетов не могут быть удалены'; +$lang->msg_default_act_is_null = 'Ярлык не может быть зарегистрирован, поскольку стандартное административное действие не установлено'; - $lang->yesterday = 'Вчера'; - $lang->today = 'Сегодня'; +$lang->welcome_to_xe = 'Добро пожаловать на страницу администратора XE'; +$lang->about_lang_env = 'Чтобы применить выбранный язык для пользователей как страндартный, нажмите кнопку Сохранить [Save] после изменения'; - $lang->cmd_lang_select = 'Выбор языка'; - $lang->about_cmd_lang_select = 'Возможно использование только выбранных языков'; - $lang->about_recompile_cache = 'You can delete useless or invalid cache files'; - $lang->use_ssl = 'Использовать SSL'; - $lang->ssl_options = array( - 'none' => 'Никогда', - 'optional' => 'На выбор', - 'always' => 'Всегда' - ); - $lang->about_use_ssl = 'In case of "Optional", SSL will be used for actions such as signing up / changing information. And for "Always", your site will be served only via https'; - $lang->server_ports = 'Server Port'; - $lang->about_server_ports = 'If your web server does not use 80 for HTTP or 443 for HTTPS port, 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'; - $lang->ftp_get_list = 'Get List'; - $lang->ftp_remove_info = 'Remove FTP Info'; - $lang->msg_ftp_invalid_path = 'Failed to read the specified FTP Path.'; - $lang->msg_self_restart_cache_engine = 'Please restart Memcached or cache daemon.'; - $lang->mobile_view = 'Use Mobile View'; - $lang->about_mobile_view = 'If accessing with a smartphone, display content with mobile layout.'; - $lang->autoinstall = 'EasyInstall'; +$lang->xe_license = 'XE подчиняется Стандартной Общественной Лицензии GPL'; +$lang->about_shortcut = 'Вы можете удалить ярлыки модулей, зарегистрированных в списке часто используемых модулей'; - $lang->last_week = 'Last week'; - $lang->this_week = 'This week'; +$lang->yesterday = 'Вчера'; +$lang->today = 'Сегодня'; - $lang->use_html5 = 'HTML5 DTD'; - $lang->about_html5 = 'Use HTML5 DTD'; +$lang->cmd_lang_select = 'Выбор языка'; +$lang->about_cmd_lang_select = 'Возможно использование только выбранных языков'; +$lang->about_recompile_cache = 'You can delete useless or invalid cache files'; +$lang->use_ssl = 'Использовать SSL'; +$lang->ssl_options = array( + 'none' => 'Никогда', + 'optional' => 'На выбор', + 'always' => 'Всегда' +); +$lang->about_use_ssl = 'In case of "Optional", SSL will be used for actions such as signing up / changing information. And for "Always", your site will be served only via https'; +$lang->server_ports = 'Server Port'; +$lang->about_server_ports = 'If your web server does not use 80 for HTTP or 443 for HTTPS port, 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'; +$lang->ftp_get_list = 'Get List'; +$lang->ftp_remove_info = 'Remove FTP Info'; +$lang->msg_ftp_invalid_path = 'Failed to read the specified FTP Path.'; +$lang->msg_self_restart_cache_engine = 'Please restart Memcached or cache daemon.'; +$lang->mobile_view = 'Use Mobile View'; +$lang->about_mobile_view = 'If accessing with a smartphone, display content with mobile layout.'; +$lang->autoinstall = 'EasyInstall'; + +$lang->last_week = 'Last week'; +$lang->this_week = 'This week'; + +$lang->use_html5 = 'HTML5 DTD'; +$lang->about_html5 = 'Use HTML5 DTD'; ?> diff --git a/modules/admin/lang/tr.lang.php b/modules/admin/lang/tr.lang.php index d14892ef8..46aa333ae 100644 --- a/modules/admin/lang/tr.lang.php +++ b/modules/admin/lang/tr.lang.php @@ -1,95 +1,95 @@ admin_info = 'Yönetici Bilgisi'; - $lang->admin_index = 'Indeks Yönetici Sayfası'; - $lang->control_panel = 'Dashboard'; - $lang->start_module = 'Varsayılan Modül'; - $lang->about_start_module = 'Sitenin varsayılan modülünü belirleyebilirsiniz.'; +$lang->admin_info = 'Yönetici Bilgisi'; +$lang->admin_index = 'Indeks Yönetici Sayfası'; +$lang->control_panel = 'Dashboard'; +$lang->start_module = 'Varsayılan Modül'; +$lang->about_start_module = 'Sitenin varsayılan modülünü belirleyebilirsiniz.'; - $lang->module_category_title = array( - 'service' => 'Hizmetler', - 'member' => 'Yöneticiler', - 'content' => 'İçerikler', - 'statistics' => 'İstatistikler', - 'construction' => 'Yapı', - 'utility' => 'Yardımcı Uygulamalar', - 'interlock' => 'Gömülü', - 'accessory' => 'Donatılar', - 'migration' => 'Veri Geçişi', - 'system' => 'Sistem Ayarları', - ); +$lang->module_category_title = array( + 'service' => 'Hizmetler', + 'member' => 'Yöneticiler', + 'content' => 'İçerikler', + 'statistics' => 'İstatistikler', + 'construction' => 'Yapı', + 'utility' => 'Yardımcı Uygulamalar', + 'interlock' => 'Gömülü', + 'accessory' => 'Donatılar', + 'migration' => 'Veri Geçişi', + 'system' => 'Sistem Ayarları', +); - $lang->newest_news = "Son Gelişmeler"; - - $lang->env_setup = "Ayarlar"; - $lang->default_url = "Varsayılan URL"; - $lang->about_default_url = "Eğer sanal site özelliği kullanıyorsanız (örneğin, cafeXE), varsayılan URL girdisini yapınız (üst-sitenin adresi), SSO etkinleştirilecektir, böylece belgelere/modüllere sağlanan bağlantı uygun bir şekilde çalışacaktır. "; +$lang->newest_news = "Son Gelişmeler"; - $lang->env_information = "Ortam Bilgisi"; - $lang->current_version = "Güncel Sürüm"; - $lang->current_path = "Yükleme Yolu"; - $lang->released_version = "Son Sürüm"; - $lang->about_download_link = "Zeroboard XE'nin yeni sürümü yayımlandı!\nLütfen son sürümü için indirme linkine tıklayınız."; - - $lang->item_module = "Modül Listesi"; - $lang->item_addon = "Eklenti Listesi"; - $lang->item_widget = "Widget Listesi"; - $lang->item_layout = "Yerleşim Düzeni Listesi"; +$lang->env_setup = "Ayarlar"; +$lang->default_url = "Varsayılan URL"; +$lang->about_default_url = "Eğer sanal site özelliği kullanıyorsanız (örneğin, cafeXE), varsayılan URL girdisini yapınız (üst-sitenin adresi), SSO etkinleştirilecektir, böylece belgelere/modüllere sağlanan bağlantı uygun bir şekilde çalışacaktır. "; - $lang->module_name = "Modül İsmi"; - $lang->addon_name = "Eklenti İsmi"; - $lang->version = "Sürüm"; - $lang->author = "Geliştirici"; - $lang->table_count = "Tablo Numarası"; - $lang->installed_path = "Yükleme Yolu"; +$lang->env_information = "Ortam Bilgisi"; +$lang->current_version = "Güncel Sürüm"; +$lang->current_path = "Yükleme Yolu"; +$lang->released_version = "Son Sürüm"; +$lang->about_download_link = "Zeroboard XE'nin yeni sürümü yayımlandı!\nLütfen son sürümü için indirme linkine tıklayınız."; - $lang->cmd_shortcut_management = "Menü Düzenle"; +$lang->item_module = "Modül Listesi"; +$lang->item_addon = "Eklenti Listesi"; +$lang->item_widget = "Widget Listesi"; +$lang->item_layout = "Yerleşim Düzeni Listesi"; - $lang->msg_is_not_administrator = 'Sadece Yöneticiler'; - $lang->msg_manage_module_cannot_delete = 'Modüllerin, eklentilerin, yerleşim düzenlerinin, widgetların kısayolları silinemez.'; - $lang->msg_default_act_is_null = 'Kısayol varsayılan yönetici eylemi ayarlanmadığından kayıt edilemiyor.'; +$lang->module_name = "Modül İsmi"; +$lang->addon_name = "Eklenti İsmi"; +$lang->version = "Sürüm"; +$lang->author = "Geliştirici"; +$lang->table_count = "Tablo Numarası"; +$lang->installed_path = "Yükleme Yolu"; - $lang->welcome_to_xe = 'XE Yönetici Sayfasına Hoşgeldiniz'; - $lang->about_admin_page = "Yönetici sayfası hâla geliştirilmektedir,\nClosebeta sürecinde birçok iyi öneriyi kabul ederek gerekli içerikleri ekleyeceğiz."; - $lang->about_lang_env = "Seçilen dili varsayılan dil olarak uygulamak için, lütfen Kaydet tuşuna basınız."; +$lang->cmd_shortcut_management = "Menü Düzenle"; - $lang->xe_license = 'XE GPL ile uyumludur'; - $lang->about_shortcut = 'Sık kullanılan modüller listesine kaydedilmiş modüllerin kısayollarını silebilirsiniz.'; +$lang->msg_is_not_administrator = 'Sadece Yöneticiler'; +$lang->msg_manage_module_cannot_delete = 'Modüllerin, eklentilerin, yerleşim düzenlerinin, widgetların kısayolları silinemez.'; +$lang->msg_default_act_is_null = 'Kısayol varsayılan yönetici eylemi ayarlanmadığından kayıt edilemiyor.'; - $lang->yesterday = "Dün"; - $lang->today = "Bugün"; +$lang->welcome_to_xe = 'XE Yönetici Sayfasına Hoşgeldiniz'; +$lang->about_admin_page = "Yönetici sayfası hâla geliştirilmektedir,\nClosebeta sürecinde birçok iyi öneriyi kabul ederek gerekli içerikleri ekleyeceğiz."; +$lang->about_lang_env = "Seçilen dili varsayılan dil olarak uygulamak için, lütfen Kaydet tuşuna basınız."; - $lang->cmd_lang_select = "Dil"; - $lang->about_cmd_lang_select = "Sadece seçili dillerde hizmet verecektir."; - $lang->about_recompile_cache = "Gereksiz veya geçersiz önbellek dosyalarını silebilirsiniz."; - $lang->use_ssl = "SSL Kullan"; - $lang->ssl_options = array( - 'none' => "Hiçbir zaman", - 'optional' => "İsteğe Bağlı", - 'always' => "Her zaman" - ); - $lang->about_use_ssl = "'İsteği Bağlı' seçiminde; SSL, kayıt olma/bilgi değiştirme gibi eylemler için kullanılacaktır. 'Her zaman' seçiminde, siteniz sadece http yoluyla hizmet verecektir."; - $lang->server_ports = "Sunucu Bağlantı Noktası (port)"; - $lang->about_server_ports = "Eğer web sunucunuz, HTTP bağlantı noktaları için 80 ya da HTTPS 443 portunu kullanmıyorsa, sunucu bağlantı noktalarını belirtmeniz gerekmektedir."; - $lang->use_db_session = 'Oturum Veritabanı Kullanımı'; - $lang->about_db_session = 'Yetersiz web sunucusu kullanımı olan websiteleri için, bu özellik devredışı bırakıldığı zaman daha hızlı bir tepki beklenebilir.
        Ancak oturum veritabanı, mevcut kullanıcılar için veritabanını erişilemez hâle getirecektir ve ilgili işler kullanılamaz hale gelecektir.'; - $lang->sftp = "SFTP Kullan"; - $lang->ftp_get_list = "Listeyi Al"; - $lang->ftp_remove_info = 'FTP Bilgisini Sil.'; - $lang->msg_ftp_invalid_path = 'Belirtilen FTP Yolunu okuma işlemi başarız oldu.'; - $lang->msg_self_restart_cache_engine = 'Lütfen önbellek geri plan yordamını veya Memcached\' ı yeniden başlatınız.'; - $lang->mobile_view = 'Hareketli Görünümü'; - $lang->about_mobile_view = 'Hareketli görünümü, mobil cihazlarla giriş yapılırken, mobil cihazlara uygun en iyi yerleşim düzenini göstermek içindir.'; - $lang->autoinstall = 'KolayKurulum'; +$lang->xe_license = 'XE GPL ile uyumludur'; +$lang->about_shortcut = 'Sık kullanılan modüller listesine kaydedilmiş modüllerin kısayollarını silebilirsiniz.'; - $lang->last_week = 'Geçen Hafta'; - $lang->this_week = 'Bu Hafta'; +$lang->yesterday = "Dün"; +$lang->today = "Bugün"; - $lang->use_html5 = 'HTML5 DTD'; - $lang->about_html5 = 'Use HTML5 DTD'; +$lang->cmd_lang_select = "Dil"; +$lang->about_cmd_lang_select = "Sadece seçili dillerde hizmet verecektir."; +$lang->about_recompile_cache = "Gereksiz veya geçersiz önbellek dosyalarını silebilirsiniz."; +$lang->use_ssl = "SSL Kullan"; +$lang->ssl_options = array( + 'none' => "Hiçbir zaman", + 'optional' => "İsteğe Bağlı", + 'always' => "Her zaman" +); +$lang->about_use_ssl = "'İsteği Bağlı' seçiminde; SSL, kayıt olma/bilgi değiştirme gibi eylemler için kullanılacaktır. 'Her zaman' seçiminde, siteniz sadece http yoluyla hizmet verecektir."; +$lang->server_ports = "Sunucu Bağlantı Noktası (port)"; +$lang->about_server_ports = "Eğer web sunucunuz, HTTP bağlantı noktaları için 80 ya da HTTPS 443 portunu kullanmıyorsa, sunucu bağlantı noktalarını belirtmeniz gerekmektedir."; +$lang->use_db_session = 'Oturum Veritabanı Kullanımı'; +$lang->about_db_session = 'Yetersiz web sunucusu kullanımı olan websiteleri için, bu özellik devredışı bırakıldığı zaman daha hızlı bir tepki beklenebilir.
        Ancak oturum veritabanı, mevcut kullanıcılar için veritabanını erişilemez hâle getirecektir ve ilgili işler kullanılamaz hale gelecektir.'; +$lang->sftp = "SFTP Kullan"; +$lang->ftp_get_list = "Listeyi Al"; +$lang->ftp_remove_info = 'FTP Bilgisini Sil.'; +$lang->msg_ftp_invalid_path = 'Belirtilen FTP Yolunu okuma işlemi başarız oldu.'; +$lang->msg_self_restart_cache_engine = 'Lütfen önbellek geri plan yordamını veya Memcached\' ı yeniden başlatınız.'; +$lang->mobile_view = 'Hareketli Görünümü'; +$lang->about_mobile_view = 'Hareketli görünümü, mobil cihazlarla giriş yapılırken, mobil cihazlara uygun en iyi yerleşim düzenini göstermek içindir.'; +$lang->autoinstall = 'KolayKurulum'; + +$lang->last_week = 'Geçen Hafta'; +$lang->this_week = 'Bu Hafta'; + +$lang->use_html5 = 'HTML5 DTD'; +$lang->about_html5 = 'Use HTML5 DTD'; ?> diff --git a/modules/admin/lang/vi.lang.php b/modules/admin/lang/vi.lang.php index 58b854d59..af89e10f2 100644 --- a/modules/admin/lang/vi.lang.php +++ b/modules/admin/lang/vi.lang.php @@ -1,98 +1,97 @@ admin_info = 'Thông tin Administrator'; - $lang->admin_index = 'Trang chủ Admin'; - $lang->control_panel = 'Bảng điều khiển'; - $lang->start_module = 'Module trang chủ'; - $lang->about_start_module = 'Bạn có thể chọn một Module và đặt là trang chủ của Website.'; +$lang->admin_info = 'Thông tin Administrator'; +$lang->admin_index = 'Trang chủ Admin'; +$lang->control_panel = 'Bảng điều khiển'; +$lang->start_module = 'Module trang chủ'; +$lang->about_start_module = 'Bạn có thể chọn một Module và đặt là trang chủ của Website.'; - $lang->module_category_title = array( - 'service' => 'Thiết lập dịch vụ', - 'member' => 'Thiết lập thành viên', - 'content' => 'Thiết lập nội dung', - 'statistics' => 'Thống kê', - 'construction' => 'Xây dựng giao diện', - 'utility' => 'Thiết lập tiện ích', - 'interlock' => 'Tiện ích nâng cao', - 'accessory' => 'Dịch vụ phụ', - 'migration' => 'Chuyển đổi dữ liệu', - 'system' => 'Thiết lập hệ thống', - ); +$lang->module_category_title = array( + 'service' => 'Thiết lập dịch vụ', + 'member' => 'Thiết lập thành viên', + 'content' => 'Thiết lập nội dung', + 'statistics' => 'Thống kê', + 'construction' => 'Xây dựng giao diện', + 'utility' => 'Thiết lập tiện ích', + 'interlock' => 'Tiện ích nâng cao', + 'accessory' => 'Dịch vụ phụ', + 'migration' => 'Chuyển đổi dữ liệu', + 'system' => 'Thiết lập hệ thống', +); - $lang->newest_news = "Tin mới nhất"; - - $lang->env_setup = "Thiết lập "; - $lang->default_url = "URL mặc định"; - $lang->about_default_url = "Nếu bạn sử dụng tính năng trang Web ảo (Ví dụ: PlanetXE, cafeXE), hãy chọn URL mặc định (địa chỉ trang chủ), khi khi kích hoạt SSO với thư mục hay Module làm việc."; +$lang->newest_news = "Tin mới nhất"; - $lang->env_information = "Thông tin"; - $lang->current_version = "Phiên bản"; - $lang->current_path = "Thư mục cài đặt"; - $lang->released_version = "Phiên bản mới nhất"; - $lang->about_download_link = "Đã có phiên bản mới nhất của XE.\n Hãy bấm vào Link để Download."; - - $lang->item_module = "Danh sách Module"; - $lang->item_addon = "Danh sách Addon"; - $lang->item_widget = "Danh sách Widget"; - $lang->item_layout = "Danh sách Layout"; +$lang->env_setup = "Thiết lập "; +$lang->default_url = "URL mặc định"; +$lang->about_default_url = "Nếu bạn sử dụng tính năng trang Web ảo (Ví dụ: PlanetXE, cafeXE), hãy chọn URL mặc định (địa chỉ trang chủ), khi khi kích hoạt SSO với thư mục hay Module làm việc."; - $lang->module_name = "Tên Module"; - $lang->addon_name = "Tên Addon"; - $lang->version = "Phiên bản"; - $lang->author = "Thiết kế"; - $lang->table_count = "Table"; - $lang->installed_path = "Thư mục đã cài đặt"; +$lang->env_information = "Thông tin"; +$lang->current_version = "Phiên bản"; +$lang->current_path = "Thư mục cài đặt"; +$lang->released_version = "Phiên bản mới nhất"; +$lang->about_download_link = "Đã có phiên bản mới nhất của XE.\n Hãy bấm vào Link để Download."; - $lang->cmd_shortcut_management = "Sửa Menu"; +$lang->item_module = "Danh sách Module"; +$lang->item_addon = "Danh sách Addon"; +$lang->item_widget = "Danh sách Widget"; +$lang->item_layout = "Danh sách Layout"; - $lang->msg_is_not_administrator = 'Dành riêng Administrator'; - $lang->msg_manage_module_cannot_delete = 'Không thể xóa những phím tắt của Module, Addon, Layout, Widget.'; - $lang->msg_default_act_is_null = 'Phím tắt đã không được tạo, bởi vì bạn không được đặt quyền là quản lý toàn diện.'; +$lang->module_name = "Tên Module"; +$lang->addon_name = "Tên Addon"; +$lang->version = "Phiên bản"; +$lang->author = "Thiết kế"; +$lang->table_count = "Table"; +$lang->installed_path = "Thư mục đã cài đặt"; - $lang->welcome_to_xe = 'Chào mừng bạn đến với trang quản lý của XE!'; - $lang->about_admin_page = "Trang Admin này vẫn đang được phát triển,\n Chúng tôi sẽ thêm vào những nội dung chủ yếu từ những ý kiến của người sử dụng."; - $lang->about_lang_env = "Để hiển thị ngôn ngữ đã chọn là mặc định. Hãy bấm [Lưu] phía dưới để lưu lại."; +$lang->cmd_shortcut_management = "Sửa Menu"; - $lang->xe_license = 'XE sử dụng giấy phép GPL'; - $lang->about_shortcut = 'Bạn có thể loại bỏ phím tắt của Module được sử dụng thường xuyên trên danh sách.'; +$lang->msg_is_not_administrator = 'Dành riêng Administrator'; +$lang->msg_manage_module_cannot_delete = 'Không thể xóa những phím tắt của Module, Addon, Layout, Widget.'; +$lang->msg_default_act_is_null = 'Phím tắt đã không được tạo, bởi vì bạn không được đặt quyền là quản lý toàn diện.'; - $lang->yesterday = "Hôm qua"; - $lang->today = "Hôm nay"; +$lang->welcome_to_xe = 'Chào mừng bạn đến với trang quản lý của XE!'; +$lang->about_admin_page = "Trang Admin này vẫn đang được phát triển,\n Chúng tôi sẽ thêm vào những nội dung chủ yếu từ những ý kiến của người sử dụng."; +$lang->about_lang_env = "Để hiển thị ngôn ngữ đã chọn là mặc định. Hãy bấm [Lưu] phía dưới để lưu lại."; - $lang->cmd_lang_select = "Ngôn ngữ"; - $lang->about_cmd_lang_select = "Chỉ chọn được những ngôn ngữ có sẵn."; - $lang->about_recompile_cache = "Bạn có thể sắp xếp lại File Cache cho những việc đã làm hoặc bị lỗi."; - $lang->use_ssl = "Sử dụng SSL"; - $lang->ssl_options = array( - 'none' => "Không sử dụng", - 'optional' => "Tùy chỉnh", - 'always' => "Luôn luôn" - ); - $lang->about_use_ssl = "Nếu bạn chọn 'Tùy chỉnh', SSL sẽ sử dụng và những công việc như đăng kí, sửa thông tin thành viên, .
        Chỉ chọn 'Luôn luôn' khi Website của bạn đang chạy trên Server có hỗ trợ https."; - $lang->server_ports = "Cổng kết nối"; - $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 = "Sử dụng SFTP"; - $lang->ftp_get_list = "Nhận danh sách"; - $lang->ftp_remove_info = 'Xóa thông tin FTP.'; - $lang->msg_ftp_invalid_path = 'Không tìm thấy thông tin của thư mục bạn đã nhập trên FTP.'; - $lang->msg_self_restart_cache_engine = 'Hãy thiết lập lại bộ nhớ Cache hoặc Deamon Cache.'; - $lang->mobile_view = 'Xem bằng di động'; - $lang->about_mobile_view = 'Nếu truy cập bằng thiết bị di động, nội dung sẽ được bố trí theo từng loại thiết bị.'; - $lang->autoinstall = 'Cập nhật tự động'; +$lang->xe_license = 'XE sử dụng giấy phép GPL'; +$lang->about_shortcut = 'Bạn có thể loại bỏ phím tắt của Module được sử dụng thường xuyên trên danh sách.'; - $lang->last_week = 'Last week'; - $lang->this_week = 'This week'; +$lang->yesterday = "Hôm qua"; +$lang->today = "Hôm nay"; - $lang->use_html5 = 'HTML5 DTD'; - $lang->about_html5 = 'Use HTML5 DTD'; +$lang->cmd_lang_select = "Ngôn ngữ"; +$lang->about_cmd_lang_select = "Chỉ chọn được những ngôn ngữ có sẵn."; +$lang->about_recompile_cache = "Bạn có thể sắp xếp lại File Cache cho những việc đã làm hoặc bị lỗi."; +$lang->use_ssl = "Sử dụng SSL"; +$lang->ssl_options = array( + 'none' => "Không sử dụng", + 'optional' => "Tùy chỉnh", + 'always' => "Luôn luôn" +); +$lang->about_use_ssl = "Nếu bạn chọn 'Tùy chỉnh', SSL sẽ sử dụng và những công việc như đăng kí, sửa thông tin thành viên, .
        Chỉ chọn 'Luôn luôn' khi Website của bạn đang chạy trên Server có hỗ trợ https."; +$lang->server_ports = "Cổng kết nối"; +$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 = "Sử dụng SFTP"; +$lang->ftp_get_list = "Nhận danh sách"; +$lang->ftp_remove_info = 'Xóa thông tin FTP.'; +$lang->msg_ftp_invalid_path = 'Không tìm thấy thông tin của thư mục bạn đã nhập trên FTP.'; +$lang->msg_self_restart_cache_engine = 'Hãy thiết lập lại bộ nhớ Cache hoặc Deamon Cache.'; +$lang->mobile_view = 'Xem bằng di động'; +$lang->about_mobile_view = 'Nếu truy cập bằng thiết bị di động, nội dung sẽ được bố trí theo từng loại thiết bị.'; +$lang->autoinstall = 'Cập nhật tự động'; + +$lang->last_week = 'Last week'; +$lang->this_week = 'This week'; + +$lang->use_html5 = 'HTML5 DTD'; +$lang->about_html5 = 'Use HTML5 DTD'; ?> diff --git a/modules/admin/lang/zh-CN.lang.php b/modules/admin/lang/zh-CN.lang.php index 053ea7a06..1cd355705 100644 --- a/modules/admin/lang/zh-CN.lang.php +++ b/modules/admin/lang/zh-CN.lang.php @@ -1,95 +1,95 @@ admin_info = '管理员信息'; - $lang->admin_index = '管理首页'; - $lang->control_panel = '控制面板'; - $lang->start_module = '首页模块'; - $lang->about_start_module = '可指定用户访问网站时的默认首页模块。'; +$lang->admin_info = '管理员信息'; +$lang->admin_index = '管理首页'; +$lang->control_panel = '控制面板'; +$lang->start_module = '首页模块'; +$lang->about_start_module = '可指定用户访问网站时的默认首页模块。'; - $lang->module_category_title = array( - 'service' => '应用管理', - 'member' => '用户管理', - 'content' => '资源管理', - 'statistics' => '统计管理', - 'construction' => '界面管理', - 'utility' => '扩展管理', - 'interlock' => '辅助联动', - 'accessory' => '附加功能', - 'migration' => '数据导入', - 'system' => '系统管理', - ); +$lang->module_category_title = array( + 'service' => '应用管理', + 'member' => '用户管理', + 'content' => '资源管理', + 'statistics' => '统计管理', + 'construction' => '界面管理', + 'utility' => '扩展管理', + 'interlock' => '辅助联动', + 'accessory' => '附加功能', + 'migration' => '数据导入', + 'system' => '系统管理', +); - $lang->newest_news = "最新消息"; +$lang->newest_news = "最新消息"; - $lang->env_setup = "系统设置"; - $lang->default_url = "XE通行证"; - $lang->about_default_url = "请输入默认站点的XE安装地址(ex: http://域名/xe)。
        说明:简单的说,就是绑定帐号系统。只需要登录一次,就可以在用站点模块生成的多个子站点中随意漫游。"; +$lang->env_setup = "系统设置"; +$lang->default_url = "XE通行证"; +$lang->about_default_url = "请输入默认站点的XE安装地址(ex: http://域名/xe)。
        说明:简单的说,就是绑定帐号系统。只需要登录一次,就可以在用站点模块生成的多个子站点中随意漫游。"; - $lang->env_information = "系统信息"; - $lang->current_version = "安装版本"; - $lang->current_path = "安装路径"; - $lang->released_version = "最新版本"; - $lang->about_download_link = "官方网站已发布最新版本XE。\n请点击[下载]链接下载最新版本。"; +$lang->env_information = "系统信息"; +$lang->current_version = "安装版本"; +$lang->current_path = "安装路径"; +$lang->released_version = "最新版本"; +$lang->about_download_link = "官方网站已发布最新版本XE。\n请点击[下载]链接下载最新版本。"; - $lang->item_module = "模块目录"; - $lang->item_addon = "插件目录"; - $lang->item_widget = "控件目录"; - $lang->item_layout = "布局目录"; +$lang->item_module = "模块目录"; +$lang->item_addon = "插件目录"; +$lang->item_widget = "控件目录"; +$lang->item_layout = "布局目录"; - $lang->module_name = "模块名称"; - $lang->addon_name = "插件名称"; - $lang->version = "版本"; - $lang->author = "作者"; - $lang->table_count = "表格数"; - $lang->installed_path = "安装路径"; +$lang->module_name = "模块名称"; +$lang->addon_name = "插件名称"; +$lang->version = "版本"; +$lang->author = "作者"; +$lang->table_count = "表格数"; +$lang->installed_path = "安装路径"; - $lang->cmd_shortcut_management = "编辑菜单"; +$lang->cmd_shortcut_management = "编辑菜单"; - $lang->msg_is_not_administrator = '只允许管理员访问'; - $lang->msg_manage_module_cannot_delete = '模块,插件,布局,控件模块的快捷菜单是不能删除的。'; - $lang->msg_default_act_is_null = '没有指定默认管理员的动作,是不能添加到快捷菜单的。'; +$lang->msg_is_not_administrator = '只允许管理员访问'; +$lang->msg_manage_module_cannot_delete = '模块,插件,布局,控件模块的快捷菜单是不能删除的。'; +$lang->msg_default_act_is_null = '没有指定默认管理员的动作,是不能添加到快捷菜单的。'; - $lang->welcome_to_xe = 'XE 管理页面'; - $lang->about_lang_env = "可以设置显示给首次访问者的同一语言环境。修改语言环境后请点击 [保存] 按钮进行保存。"; +$lang->welcome_to_xe = 'XE 管理页面'; +$lang->about_lang_env = "可以设置显示给首次访问者的同一语言环境。修改语言环境后请点击 [保存] 按钮进行保存。"; - $lang->xe_license = 'XE遵循 GPL协议'; - $lang->about_shortcut = '可以删除添加到常用模块中的快捷菜单。'; +$lang->xe_license = 'XE遵循 GPL协议'; +$lang->about_shortcut = '可以删除添加到常用模块中的快捷菜单。'; - $lang->yesterday = "Yesterday"; - $lang->today = "Today"; +$lang->yesterday = "Yesterday"; +$lang->today = "Today"; - $lang->cmd_lang_select = "多国语言支持"; - $lang->about_cmd_lang_select = "请选择要使用的语言。"; - $lang->about_recompile_cache = "整理无用的或错误的缓冲文件。"; - $lang->use_ssl = "SSL使用"; - $lang->ssl_options = array( - 'none' => "不使用", - 'optional' => "选择性", - 'always' => "使用" - ); - $lang->about_use_ssl = "选择性使用选项应用于新用户注册/修改用户信息等已指定的action当中,使用选项应用于所有服务。"; - $lang->server_ports = "指定服务器端口"; - $lang->about_server_ports = "使用除HTTP(80), HTTPS(443)以外的端口时,必须得指定该服务器端口号。"; - $lang->use_db_session = 'DB储存认证会话'; - $lang->about_db_session = '用DB储存认证时的PHP会话。
        服务器使用率较少的网站建议不要勾选此项(可提高网站访问速度)。
        只是无法统计在线会员。'; - $lang->sftp = '使用sSFTP'; - $lang->ftp_get_list = '载入列表'; - $lang->ftp_remove_info = '删除FTP信息'; - $lang->msg_ftp_invalid_path = '无法读取FTP路径。'; - $lang->msg_self_restart_cache_engine = '请重新启动Memcached或CacheDaemon。'; - $lang->mobile_view = '开启移动版'; - $lang->about_mobile_view = '为智能手机访问网站,提供最佳视觉效果。'; - $lang->autoinstall = '安装·更新'; +$lang->cmd_lang_select = "多国语言支持"; +$lang->about_cmd_lang_select = "请选择要使用的语言。"; +$lang->about_recompile_cache = "整理无用的或错误的缓冲文件。"; +$lang->use_ssl = "SSL使用"; +$lang->ssl_options = array( + 'none' => "不使用", + 'optional' => "选择性", + 'always' => "使用" +); +$lang->about_use_ssl = "选择性使用选项应用于新用户注册/修改用户信息等已指定的action当中,使用选项应用于所有服务。"; +$lang->server_ports = "指定服务器端口"; +$lang->about_server_ports = "使用除HTTP(80), HTTPS(443)以外的端口时,必须得指定该服务器端口号。"; +$lang->use_db_session = 'DB储存认证会话'; +$lang->about_db_session = '用DB储存认证时的PHP会话。
        服务器使用率较少的网站建议不要勾选此项(可提高网站访问速度)。
        只是无法统计在线会员。'; +$lang->sftp = '使用sSFTP'; +$lang->ftp_get_list = '载入列表'; +$lang->ftp_remove_info = '删除FTP信息'; +$lang->msg_ftp_invalid_path = '无法读取FTP路径。'; +$lang->msg_self_restart_cache_engine = '请重新启动Memcached或CacheDaemon。'; +$lang->mobile_view = '开启移动版'; +$lang->about_mobile_view = '为智能手机访问网站,提供最佳视觉效果。'; +$lang->autoinstall = '安装·更新'; - $lang->last_week = 'Last week'; - $lang->this_week = 'This week'; +$lang->last_week = 'Last week'; +$lang->this_week = 'This week'; - $lang->use_html5 = 'HTML5 DTD'; - $lang->about_html5 = 'Use HTML5 DTD'; +$lang->use_html5 = 'HTML5 DTD'; +$lang->about_html5 = 'Use HTML5 DTD'; ?> diff --git a/modules/admin/lang/zh-TW.lang.php b/modules/admin/lang/zh-TW.lang.php index 809e2fb21..0ba06a224 100644 --- a/modules/admin/lang/zh-TW.lang.php +++ b/modules/admin/lang/zh-TW.lang.php @@ -1,95 +1,95 @@ admin_info = '管理員資訊'; - $lang->admin_index = '管理頁面'; - $lang->control_panel = '控制介面'; - $lang->start_module = '預設首頁'; - $lang->about_start_module = '可將所選擇的模組作為預設首頁。'; +$lang->admin_info = '管理員資訊'; +$lang->admin_index = '管理頁面'; +$lang->control_panel = '控制介面'; +$lang->start_module = '預設首頁'; +$lang->about_start_module = '可將所選擇的模組作為預設首頁。'; - $lang->module_category_title = array( - 'service' => '服務設定', - 'member' => '會員管理', - 'content' => '內容管理', - 'statistics' => '統計資料', - 'construction' => '界面設定', - 'utility' => '擴充功能', - 'interlock' => '連動設定', - 'accessory' => '附加功能管理', - 'migration' => '資料轉換', - 'system' => '系統管理', - ); +$lang->module_category_title = array( + 'service' => '服務設定', + 'member' => '會員管理', + 'content' => '內容管理', + 'statistics' => '統計資料', + 'construction' => '界面設定', + 'utility' => '擴充功能', + 'interlock' => '連動設定', + 'accessory' => '附加功能管理', + 'migration' => '資料轉換', + 'system' => '系統管理', +); - $lang->newest_news = "最新消息"; +$lang->newest_news = "最新消息"; - $lang->env_setup = "系統設置"; - $lang->default_url = "預設網址"; - $lang->about_default_url = "XE虛擬網站必須要先輸入預設的網址確保虛擬網站的運作,請輸入預設程式安裝路徑。
        (例: http://網域名稱/安裝路徑)"; +$lang->env_setup = "系統設置"; +$lang->default_url = "預設網址"; +$lang->about_default_url = "XE虛擬網站必須要先輸入預設的網址確保虛擬網站的運作,請輸入預設程式安裝路徑。
        (例: http://網域名稱/安裝路徑)"; - $lang->env_information = "系統資訊"; - $lang->current_version = "安裝版本"; - $lang->current_path = "安裝路徑"; - $lang->released_version = "最新版本"; - $lang->about_download_link = "官方網站已發佈最新版本。\n請按[下載]下載最新版本。"; +$lang->env_information = "系統資訊"; +$lang->current_version = "安裝版本"; +$lang->current_path = "安裝路徑"; +$lang->released_version = "最新版本"; +$lang->about_download_link = "官方網站已發佈最新版本。\n請按[下載]下載最新版本。"; - $lang->item_module = "模組列表"; - $lang->item_addon = "元件列表"; - $lang->item_widget = "Widget列表"; - $lang->item_layout = "版面列表"; +$lang->item_module = "模組列表"; +$lang->item_addon = "元件列表"; +$lang->item_widget = "Widget列表"; +$lang->item_layout = "版面列表"; - $lang->module_name = "模組名稱"; - $lang->addon_name = "元件名稱"; - $lang->version = "版本"; - $lang->author = "作者"; - $lang->table_count = "表格數"; - $lang->installed_path = "安裝路徑"; +$lang->module_name = "模組名稱"; +$lang->addon_name = "元件名稱"; +$lang->version = "版本"; +$lang->author = "作者"; +$lang->table_count = "表格數"; +$lang->installed_path = "安裝路徑"; - $lang->cmd_shortcut_management = "編輯選單"; +$lang->cmd_shortcut_management = "編輯選單"; - $lang->msg_is_not_administrator = '只有管理員才可以檢視'; - $lang->msg_manage_module_cannot_delete = '模組,附加元件,版面設計,Widget的快速選單是無法刪除的。'; - $lang->msg_default_act_is_null = '沒有指定預設管理員的動作,是無法新增到快速選單的。'; +$lang->msg_is_not_administrator = '只有管理員才可以檢視'; +$lang->msg_manage_module_cannot_delete = '模組,附加元件,版面設計,Widget的快速選單是無法刪除的。'; +$lang->msg_default_act_is_null = '沒有指定預設管理員的動作,是無法新增到快速選單的。'; - $lang->welcome_to_xe = 'XE管理頁面'; - $lang->about_lang_env = "請選擇預設語言。選擇完畢後,請按[儲存]按鈕。"; +$lang->welcome_to_xe = 'XE管理頁面'; +$lang->about_lang_env = "請選擇預設語言。選擇完畢後,請按[儲存]按鈕。"; - $lang->xe_license = 'XE遵循 GPL 協議'; - $lang->about_shortcut = '可以刪除新增到常用模組中的快速選單。'; +$lang->xe_license = 'XE遵循 GPL 協議'; +$lang->about_shortcut = '可以刪除新增到常用模組中的快速選單。'; - $lang->yesterday = "昨天"; - $lang->today = "今天"; +$lang->yesterday = "昨天"; +$lang->today = "今天"; - $lang->cmd_lang_select = "選擇語言"; - $lang->about_cmd_lang_select = "只提供所選擇的語言服務"; - $lang->about_recompile_cache = "可有效的整理錯誤的暫存檔"; - $lang->use_ssl = "SSL功能"; - $lang->ssl_options = array( - 'none' => "關閉", - 'optional' => "手動", - 'always' => "開啟" - ); - $lang->about_use_ssl = "選擇手動時,在會員註冊或修改資料等動作時才會使用 SSL 功能。
        選擇開啟時,所有的服務都會使用 SSL 功能。"; - $lang->server_ports = "主機埠口"; - $lang->about_server_ports = "HTTP、HTTPS預設埠口分別是『80』、『443』
        如果想使用其他的埠口的話,請自行設定。"; - $lang->use_db_session = 'DB session認證'; - $lang->about_db_session = '使用 PHP session 進行 DB 認證。
        關閉此功能對於負荷較低的網站可提高效率。
        使用此功能會無法統計線上人數。'; - $lang->sftp = "使用 SFTP"; - $lang->ftp_get_list = "取得列表"; - $lang->ftp_remove_info = '移除 FTP 資料'; - $lang->msg_ftp_invalid_path = '指定的 FTP 路徑讀取失敗。'; - $lang->msg_self_restart_cache_engine = '請重新啟動 Memcached 快取程式。'; - $lang->mobile_view = '手機瀏覽'; - $lang->about_mobile_view = '使用手機瀏覽時將會顯示最適當的畫面。'; - $lang->autoinstall = '自動安裝'; +$lang->cmd_lang_select = "選擇語言"; +$lang->about_cmd_lang_select = "只提供所選擇的語言服務"; +$lang->about_recompile_cache = "可有效的整理錯誤的暫存檔"; +$lang->use_ssl = "SSL功能"; +$lang->ssl_options = array( + 'none' => "關閉", + 'optional' => "手動", + 'always' => "開啟" +); +$lang->about_use_ssl = "選擇手動時,在會員註冊或修改資料等動作時才會使用 SSL 功能。
        選擇開啟時,所有的服務都會使用 SSL 功能。"; +$lang->server_ports = "主機埠口"; +$lang->about_server_ports = "HTTP、HTTPS預設埠口分別是『80』、『443』
        如果想使用其他的埠口的話,請自行設定。"; +$lang->use_db_session = 'DB session認證'; +$lang->about_db_session = '使用 PHP session 進行 DB 認證。
        關閉此功能對於負荷較低的網站可提高效率。
        使用此功能會無法統計線上人數。'; +$lang->sftp = "使用 SFTP"; +$lang->ftp_get_list = "取得列表"; +$lang->ftp_remove_info = '移除 FTP 資料'; +$lang->msg_ftp_invalid_path = '指定的 FTP 路徑讀取失敗。'; +$lang->msg_self_restart_cache_engine = '請重新啟動 Memcached 快取程式。'; +$lang->mobile_view = '手機瀏覽'; +$lang->about_mobile_view = '使用手機瀏覽時將會顯示最適當的畫面。'; +$lang->autoinstall = '自動安裝'; - $lang->last_week = '上週'; - $lang->this_week = '本週'; +$lang->last_week = '上週'; +$lang->this_week = '本週'; - $lang->use_html5 = 'HTML5 DTD'; - $lang->about_html5 = 'Use HTML5 DTD'; +$lang->use_html5 = 'HTML5 DTD'; +$lang->about_html5 = 'Use HTML5 DTD'; ?> From 4cd47ec681d81e1f4619201bb1a01765e83b1e1a Mon Sep 17 00:00:00 2001 From: taggon Date: Thu, 12 May 2011 07:55:07 +0000 Subject: [PATCH 0072/1372] #19746027 XEHttpRequest is improved as followings: 1. "Transfer-Encoding: chunked" response header is processed now. 2. send() method can submit POST variables. File attachement is not supported yet. 3. sendWithCurl() method does NOT return the error anymore: 417 Expectation Failed. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8367 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/httprequest/XEHttpRequest.class.php | 67 +++++++++++++++++---- 1 file changed, 54 insertions(+), 13 deletions(-) diff --git a/classes/httprequest/XEHttpRequest.class.php b/classes/httprequest/XEHttpRequest.class.php index 76c635f9f..13dcea703 100644 --- a/classes/httprequest/XEHttpRequest.class.php +++ b/classes/httprequest/XEHttpRequest.class.php @@ -39,9 +39,10 @@ class XEHttpRequest { * @param[in] target ip or url of the external server * @param[in] method HTTP method such as GET and POST * @param[in] timeout time out value for HTTP request expiration + * @param[in] post variables to send * @return Returns an object containing HTTP Response body and HTTP response code */ - function send($target='/', $method='GET', $timeout=3) + function send($target='/', $method='GET', $timeout=3, $post_vars=null) { static $allow_methods=null; @@ -49,16 +50,19 @@ class XEHttpRequest { $this->addToHeader('Connection', 'close'); $method = strtoupper($method); - if(!$allow_methods) $allow_methods = explode(' ', 'GET POST PUT DELETE'); + if(!$allow_methods) $allow_methods = explode(' ', 'GET POST PUT'); if(!in_array($method, $allow_methods)) $method = $allow_methods[0]; // $timeout should be an integer that is bigger than zero $timout = max((int)$timeout, 0); - if(is_callable('curl_init')) { - return $this->sendWithCurl($target, $method, $timeout); + // list of post variables + if(!is_array($post_vars)) $post_vars = array(); + + if(false && is_callable('curl_init')) { + return $this->sendWithCurl($target, $method, $timeout, $post_vars); } else { - return $this->sendWithSock($target, $method, $timeout); + return $this->sendWithSock($target, $method, $timeout, $post_vars); } } @@ -66,7 +70,7 @@ class XEHttpRequest { * @brief Send a request with the file socket * @private */ - function sendWithSock($target, $method, $timeout) + function sendWithSock($target, $method, $timeout, $post_vars) { static $crlf = "\r\n"; @@ -75,24 +79,47 @@ class XEHttpRequest { return new Object(-1, 'socket_connect_failed'); } - $request = "$method $target HTTP/1.1$crlf"; + $headers = $this->m_headers + array(); + if(!isset($headers['Accept-Encoding'])) $headers['Accept-Encoding'] = 'identity'; - foreach($this->m_headers as $equiv=>$content) { + // post body + $post_body = ''; + if($method == 'POST' && count($post_vars)) { + foreach($post_vars as $key=>$value) { + $post_body .= urlencode($key).'='.urlencode($value).'&'; + } + $post_body = substr($post_body, 0, -1); + + $headers['Content-Length'] = strlen($post_body); + $headers['Content-Type'] = 'application/x-www-form-urlencoded'; + } + + $request = "$method $target HTTP/1.1$crlf"; + foreach($headers as $equiv=>$content) { $request .= "$equiv: $content$crlf"; } - $request .= $crlf; + $request .= $crlf.$post_body; fwrite($sock, $request); list($httpver, $code, $status) = split(' +', rtrim(fgets($sock))); // read response headers + $is_chunked = false; while(strlen(trim($line = fgets($sock)))) { list($equiv, $content) = split(' *: *', rtrim($line)); + if(!strcasecmp($equiv, 'Transfer-Encoding') && $content == 'chunked') { + $is_chunked = true; + } } $body = ''; while(!feof($sock)) { - $body .= fgets($sock, 512); + if ($is_chunked) { + $chunk_size = hexdec(fgets($sock)); + if($chunk_size) $body .= fread($sock, $chunk_size); + } else { + $body .= fgets($sock, 512); + } } fclose($sock); @@ -107,25 +134,39 @@ class XEHttpRequest { * @brief Send a request with the curl library * @private */ - function sendWithCurl($target, $method, $timeout) + function sendWithCurl($target, $method, $timeout, $post_vars) { + $headers = $this->m_headers + array(); + // creat a new cURL resource $ch = curl_init(); + $headers['Expect'] = ''; + // set URL and other appropriate options curl_setopt($ch, CURLOPT_URL, "http://{$this->m_host}{$target}"); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_PORT, $this->m_port); - curl_setopt($ch, CURLOPT_CONNECTIMEOUT, $timeout); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); switch($method) { case 'GET': curl_setopt($ch, CURLOPT_HTTPGET, true); break; - case 'POST': curl_setopt($ch, CURLOPT_POST, true); break; case 'PUT': curl_setopt($ch, CURLOPT_PUT, true); break; + case 'POST': + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, $post_vars); + break; } + $arr_headers = array(); + foreach($headers as $key=>$value){ + $arr_headers[] = "$key: $value"; + } + + curl_setopt($ch, CURLOPT_HTTPHEADER, $arr_headers); + $body = curl_exec($ch); if(curl_errno($ch)) { return new Object(-1, 'socket_connect_failed'); From f73c89d32c6e87792742b6094fc2abdcad64da6b Mon Sep 17 00:00:00 2001 From: taggon Date: Thu, 12 May 2011 10:19:17 +0000 Subject: [PATCH 0073/1372] #19692545 Minifier can use both Google closure compiler and JSMinPlus. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8368 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- tools/minify.php | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/tools/minify.php b/tools/minify.php index 8aff95c5a..66473a38a 100644 --- a/tools/minify.php +++ b/tools/minify.php @@ -57,7 +57,7 @@ function execute($dir) { echo " Minifying JavaScript files..."; $js_files = get_target_files('js', $dir, $files_to_skip); - + if(count($js_files) && !class_exists('JSMinPlus')) { require dirname(__FILE__).'/minify/jsminplus/jsminplus.php'; } @@ -74,7 +74,18 @@ function execute($dir) { $copyright = ''; } - file_put_contents($target, $copyright.JSMinPlus::minify($content)); + if($config['use_closure_compiler']) { + $content = closure_compile($content); + if(!$content) { + echo " CANNOT compile the js file with closure compiler.\n"; + echo " Trying again with JSMinPlus.\n"; + $content = JSMinPlus::minify($content); + } + } else { + $content = JSMinPlus::minify($content); + } + + file_put_contents($target, $copyright.$content); echo '.'; } @@ -167,6 +178,20 @@ function get_target_files($ext, $dir, $files_to_skip) { return $files; } +function closure_compile($content) { + require_once dirname(__FILE__).'/../classes/httprequest/XEHttpRequest.class.php'; + + $req = new XEHttpRequest('closure-compiler.appspot.com', 80); + $ret = $req->send('/compile', 'POST', 5, array( + 'output_info' => 'compiled_code', + 'output_format' => 'text', + 'compilation_level' => 'SIMPLE_OPTIMIZATIONS', + 'js_code' => $content + )); + + return $ret->body; +} + // run main function error_reporting(E_ALL & ~E_NOTICE); main(); From d0a270a5591583b9f769058451a0324659de3aea Mon Sep 17 00:00:00 2001 From: taggon Date: Mon, 16 May 2011 05:27:57 +0000 Subject: [PATCH 0074/1372] #19756885 Validator class' interface. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8369 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/validator/Validator.class.php | 76 +++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 classes/validator/Validator.class.php diff --git a/classes/validator/Validator.class.php b/classes/validator/Validator.class.php new file mode 100644 index 000000000..b7eef3ca3 --- /dev/null +++ b/classes/validator/Validator.class.php @@ -0,0 +1,76 @@ + Date: Mon, 16 May 2011 05:35:56 +0000 Subject: [PATCH 0075/1372] #19756885 Modify some comments git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8370 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/validator/Validator.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/classes/validator/Validator.class.php b/classes/validator/Validator.class.php index b7eef3ca3..88594cc44 100644 --- a/classes/validator/Validator.class.php +++ b/classes/validator/Validator.class.php @@ -34,8 +34,8 @@ class Validator } /** - * Returns the last error message - * @return string error message + * Returns the last error infomation including a field name and an error message. + * @return array The last error infomation */ function getLastError(){ } From 5f55d907ccf56ba93fb097db0012f5468cbc2e9c Mon Sep 17 00:00:00 2001 From: taggon Date: Mon, 16 May 2011 06:39:29 +0000 Subject: [PATCH 0076/1372] #19692161 Add a minified css file. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8371 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/css/minify.ini | 7 ++++ common/css/xe.css | 91 +++++++++++++++++++++++++++++++++++++++++++ common/css/xe.min.css | 1 + 3 files changed, 99 insertions(+) create mode 100644 common/css/minify.ini create mode 100644 common/css/xe.css create mode 100644 common/css/xe.min.css diff --git a/common/css/minify.ini b/common/css/minify.ini new file mode 100644 index 000000000..04f9f3646 --- /dev/null +++ b/common/css/minify.ini @@ -0,0 +1,7 @@ +[skip] +button.css +default.css + +[merge >> xe.css] +default.css +button;.css diff --git a/common/css/xe.css b/common/css/xe.css new file mode 100644 index 000000000..b9e81d058 --- /dev/null +++ b/common/css/xe.css @@ -0,0 +1,91 @@ +/* default.css - Type Selector Definition */ +body { margin:0;padding:0; font-size:.75em;} + +img { border:none; } +label { cursor:pointer; } +form { margin:0; padding:0; } + +/* Special Class Selector */ +.fr { float:right; } +.fl { float:left; } +.clear { clear:both; } +.fwB { font-weight:bold;} +.tCenter { text-align:center; } +.tRight { text-align:right; } +.tLeft { text-align:left; } +.gap1 { margin-top:.8em; } +.nowrap { white-space:nowrap; } + +.iePngFix { behavior:url(./common/js/iePngFix.htc); } +.zbxe_info { vertical-align:middle; behavior:url(./common/js/iePngFix.htc); } + +/* Input Style Definition */ +.inputTypeText { border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; height:1.4em; padding:.2em 0 0 .3em; background:#ffffff; font-size:1em; _font-size:9pt; } +*:first-child+html .inputTypeText { font-size:9pt; } +.inputTypeText:hover, +.inputTypeText:focus { background:#f4f4f4; } +.inputTypeTextArea { border:1px solid !important; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6 !important; background:#ffffff; font-size:1em; _font-size:9pt; height:100px;} +*:first-child+html .inputTypeTextArea { font-size:9pt; } + +.w40 { width:40px; } +.w60 { width:60px; } +.w70 { width:70px; } +.w80 { width:80px; } +.w90 { width:90px; } +.w100 { width:100px; } +.w110 { width:110px; } +.w120 { width:120px; } +.w130 { width:130px; } +.w140 { width:140px; } +.w150 { width:150px; } +.w160 { width:160px; } +.w170 { width:170px; } +.w180 { width:180px; } +.w190 { width:190px; } +.w200 { width:200px; } +.w210 { width:210px; } +.w220 { width:220px; } +.w230 { width:230px; } +.w240 { width:240px; } +.w250 { width:250px; } +.w260 { width:260px; } +.w270 { width:270px; } +.w280 { width:280px; } +.w290 { width:290px; } +.w300 { width:300px; } +.w400 { width:400px; } + +/* editor style */ +a.bold { font-weight:bold; } + +.editor_blue_text { color: #145ff9 !important; text-decoration:underline !important; } +.editor_blue_text a { color: #145ff9 !important; text-decoration:underline !important; } +.editor_red_text { color: #f42126 !important; text-decoration:underline !important; } +.editor_red_text a { color: #f42126 !important; text-decoration:underline !important; } +.editor_yellow_text { color: #c9bd00 !important; text-decoration:underline !important; } +.editor_yellow_text a { color: #c9bd00 !important; text-decoration:underline !important; } +.editor_green_text { color: #08830B !important; text-decoration:underline !important; } +.editor_green_text a { color: #08830B !important; text-decoration:underline !important; } + +.folder_opener { display: block; } +.folder_closer { display: none; } +.folder_area { display: none; } + +.xe_content { line-height:1.6; overflow:hidden; } + +.zbxe_widget_output { background:url(../tpl/images/widget_text.gif) no-repeat center bottom; display:block;} + +/* xe layer */ +#waitingforserverresponse { border:2px solid #444444; font-weight:bold; color:#444444; padding: 7px 5px 5px 25px; background:#FFFFFF url("../tpl/images/loading.gif") no-repeat 5px 5px; top:40px; left:40px; position:absolute; z-index:100; visibility:hidden; } + +#popup_menu_area{ position:absolute; background:#fff; border:2px solid #eee; -moz-border-radius:5px; -webkit-border-radius:5px; margin:0; padding:0;} +#popup_menu_area *{ margin:0; padding:0; list-style:none; font-size:12px; line-height:normal;} +#popup_menu_area ul{ border:1px solid #ddd; -moz-border-radius:5px; -webkit-border-radius:5px; padding:10px 10px 5px 10px;} +#popup_menu_area li{ padding:2px 0 2px 20px; background-repeat:no-repeat; background-position:left center; margin-bottom:3px; white-space:nowrap;} +#popup_menu_area li a{ text-decoration:none; color:#000;} +#popup_menu_area li a:hover, +#popup_menu_area li a:active, +#popup_menu_area li a:focus{ font-weight:bold; letter-spacing:-1px;} + +/* xe faceoff */ +.faceOffManager { position:fixed; _position:absolute; right:3px; top:3px; height:23px; } diff --git a/common/css/xe.min.css b/common/css/xe.min.css new file mode 100644 index 000000000..fc1bb3af2 --- /dev/null +++ b/common/css/xe.min.css @@ -0,0 +1 @@ +body{margin:0;padding:0;font-size:.75em}img{border:none}label{cursor:pointer}form{margin:0;padding:0}.fr{float:right}.fl{float:left}.clear{clear:both}.fwB{font-weight:bold}.tCenter{text-align:center}.tRight{text-align:right}.tLeft{text-align:left}.gap1{margin-top:.8em}.nowrap{white-space:nowrap}.iePngFix{behavior:url(./common/js/iePngFix.htc)}.zbxe_info{vertical-align:middle;behavior:url(./common/js/iePngFix.htc)}.inputTypeText{border:1px solid;border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6;height:1.4em;padding:.2em 0 0 .3em;background:#ffffff;font-size:1em;_font-size:9pt}*:first-child+html .inputTypeText{font-size:9pt}.inputTypeText:hover,.inputTypeText:focus{background:#f4f4f4}.inputTypeTextArea{border:1px solid !important;border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6 !important;background:#ffffff;font-size:1em;_font-size:9pt;height:100px}*:first-child+html .inputTypeTextArea{font-size:9pt}.w40{width:40px}.w60{width:60px}.w70{width:70px}.w80{width:80px}.w90{width:90px}.w100{width:100px}.w110{width:110px}.w120{width:120px}.w130{width:130px}.w140{width:140px}.w150{width:150px}.w160{width:160px}.w170{width:170px}.w180{width:180px}.w190{width:190px}.w200{width:200px}.w210{width:210px}.w220{width:220px}.w230{width:230px}.w240{width:240px}.w250{width:250px}.w260{width:260px}.w270{width:270px}.w280{width:280px}.w290{width:290px}.w300{width:300px}.w400{width:400px}a.bold{font-weight:bold}.editor_blue_text{color:#145ff9 !important;text-decoration:underline !important}.editor_blue_text a{color:#145ff9 !important;text-decoration:underline !important}.editor_red_text{color:#f42126 !important;text-decoration:underline !important}.editor_red_text a{color:#f42126 !important;text-decoration:underline !important}.editor_yellow_text{color:#c9bd00 !important;text-decoration:underline !important}.editor_yellow_text a{color:#c9bd00 !important;text-decoration:underline !important}.editor_green_text{color:#08830B !important;text-decoration:underline !important}.editor_green_text a{color:#08830B !important;text-decoration:underline !important}.folder_opener{display:block}.folder_closer{display:none}.folder_area{display:none}.xe_content{line-height:1.6;overflow:hidden}.zbxe_widget_output{background:url(../tpl/images/widget_text.gif) no-repeat center bottom;display:block}#waitingforserverresponse{border:2px solid #444444;font-weight:bold;color:#444444;padding:7px 5px 5px 25px;background:#FFFFFF url("../tpl/images/loading.gif") no-repeat 5px 5px;top:40px;left:40px;position:absolute;z-index:100;visibility:hidden}#popup_menu_area{position:absolute;background:#fff;border:2px solid #eee;-moz-border-radius:5px;-webkit-border-radius:5px;margin:0;padding:0}#popup_menu_area *{margin:0;padding:0;list-style:none;font-size:12px;line-height:normal}#popup_menu_area ul{border:1px solid #ddd;-moz-border-radius:5px;-webkit-border-radius:5px;padding:10px 10px 5px 10px}#popup_menu_area li{padding:2px 0 2px 20px;background-repeat:no-repeat;background-position:left center;margin-bottom:3px;white-space:nowrap}#popup_menu_area li a{text-decoration:none;color:#000}#popup_menu_area li a:hover,#popup_menu_area li a:active,#popup_menu_area li a:focus{font-weight:bold;letter-spacing:-1px}.faceOffManager{position:fixed;_position:absolute;right:3px;top:3px;height:23px} \ No newline at end of file From 9e04e84a651e0410a27a268ca266efbf8d399052 Mon Sep 17 00:00:00 2001 From: taggon Date: Mon, 16 May 2011 06:40:09 +0000 Subject: [PATCH 0077/1372] Fixed a typo. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8372 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/css/minify.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/css/minify.ini b/common/css/minify.ini index 04f9f3646..c52670b7f 100644 --- a/common/css/minify.ini +++ b/common/css/minify.ini @@ -4,4 +4,4 @@ default.css [merge >> xe.css] default.css -button;.css +button.css From 7dbe0626b6f6aa67bd9b3916778aa7e137596fb2 Mon Sep 17 00:00:00 2001 From: mosmartin Date: Thu, 19 May 2011 13:06:56 +0000 Subject: [PATCH 0079/1372] Update new xml query classes with xe 1.5 with improved query argument support and update and delete queries git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0-DB@8378 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/db/DB.class.php | 10 + classes/db/DBCubrid.class.php | 61 +- .../queryparts/condition/Condition.class.php | 87 +++ .../condition/ConditionGroup.class.php | 27 + .../expression/ClickCountExpression.class.php | 33 + .../expression/DeleteExpression.class.php | 34 ++ .../expression/Expression.class.php | 30 + .../expression/InsertExpression.class.php | 28 + .../expression/SelectExpression.class.php | 32 + .../expression/StarExpression.class.php | 16 + .../expression/UpdateExpression.class.php | 34 ++ .../queryparts/order/OrderByColumn.class.php | 16 + .../db/queryparts/table/JoinTable.class.php | 37 ++ classes/db/queryparts/table/Table.class.php | 26 + classes/display/HTMLDisplayHandler.php | 1 + classes/xml/XmlQueryParser.class.php | 574 ++---------------- classes/xml/xmlquery/DBParser.class.php | 98 +++ classes/xml/xmlquery/QueryParser.class.php | 160 +++++ .../xml/xmlquery/argument/Argument.class.php | 113 ++++ .../ConditionQueryArgument.class.php | 26 + .../queryargument/DefaultValue.class.php | 61 ++ .../queryargument/QueryArgument.class.php | 52 ++ .../ConditionQueryArgumentValidator.class.php | 20 + .../validator/DefaultCheck.class.php | 25 + .../validator/EscapeCheck.class.php | 21 + .../validator/FilterValidator.class.php | 16 + .../validator/MaxLengthValidator.class.php | 22 + .../validator/MinLengthValidator.class.php | 22 + .../validator/NotNullValidator.class.php | 18 + .../QueryArgumentValidator.class.php | 62 ++ .../validator/Validator.class.php | 7 + .../condition/ConditionGroupTag.class.php | 52 ++ .../tags/condition/ConditionTag.class.php | 49 ++ .../tags/condition/ConditionsTag.class.php | 51 ++ .../xmlquery/tags/group/GroupsTag.class.php | 36 ++ .../tags/navigation/IndexTag.class.php | 49 ++ .../tags/navigation/NavigationTag.class.php | 60 ++ .../xmlquery/tags/table/TableTag.class.php | 60 ++ .../xmlquery/tags/table/TablesTag.class.php | 33 + 39 files changed, 1619 insertions(+), 540 deletions(-) create mode 100644 classes/db/queryparts/condition/Condition.class.php create mode 100644 classes/db/queryparts/condition/ConditionGroup.class.php create mode 100644 classes/db/queryparts/expression/ClickCountExpression.class.php create mode 100644 classes/db/queryparts/expression/DeleteExpression.class.php create mode 100644 classes/db/queryparts/expression/Expression.class.php create mode 100644 classes/db/queryparts/expression/InsertExpression.class.php create mode 100644 classes/db/queryparts/expression/SelectExpression.class.php create mode 100644 classes/db/queryparts/expression/StarExpression.class.php create mode 100644 classes/db/queryparts/expression/UpdateExpression.class.php create mode 100644 classes/db/queryparts/order/OrderByColumn.class.php create mode 100644 classes/db/queryparts/table/JoinTable.class.php create mode 100644 classes/db/queryparts/table/Table.class.php create mode 100644 classes/xml/xmlquery/DBParser.class.php create mode 100644 classes/xml/xmlquery/QueryParser.class.php create mode 100644 classes/xml/xmlquery/argument/Argument.class.php create mode 100644 classes/xml/xmlquery/queryargument/ConditionQueryArgument.class.php create mode 100644 classes/xml/xmlquery/queryargument/DefaultValue.class.php create mode 100644 classes/xml/xmlquery/queryargument/QueryArgument.class.php create mode 100644 classes/xml/xmlquery/queryargument/validator/ConditionQueryArgumentValidator.class.php create mode 100644 classes/xml/xmlquery/queryargument/validator/DefaultCheck.class.php create mode 100644 classes/xml/xmlquery/queryargument/validator/EscapeCheck.class.php create mode 100644 classes/xml/xmlquery/queryargument/validator/FilterValidator.class.php create mode 100644 classes/xml/xmlquery/queryargument/validator/MaxLengthValidator.class.php create mode 100644 classes/xml/xmlquery/queryargument/validator/MinLengthValidator.class.php create mode 100644 classes/xml/xmlquery/queryargument/validator/NotNullValidator.class.php create mode 100644 classes/xml/xmlquery/queryargument/validator/QueryArgumentValidator.class.php create mode 100644 classes/xml/xmlquery/queryargument/validator/Validator.class.php create mode 100644 classes/xml/xmlquery/tags/condition/ConditionGroupTag.class.php create mode 100644 classes/xml/xmlquery/tags/condition/ConditionTag.class.php create mode 100644 classes/xml/xmlquery/tags/condition/ConditionsTag.class.php create mode 100644 classes/xml/xmlquery/tags/group/GroupsTag.class.php create mode 100644 classes/xml/xmlquery/tags/navigation/IndexTag.class.php create mode 100644 classes/xml/xmlquery/tags/navigation/NavigationTag.class.php create mode 100644 classes/xml/xmlquery/tags/table/TableTag.class.php create mode 100644 classes/xml/xmlquery/tags/table/TablesTag.class.php diff --git a/classes/db/DB.class.php b/classes/db/DB.class.php index 08a62d266..2d1f9dd27 100644 --- a/classes/db/DB.class.php +++ b/classes/db/DB.class.php @@ -314,6 +314,16 @@ if($source_args) $args = @clone($source_args); + require_once(_XE_PATH_.'classes/xml/xmlquery/DBParser.class.php'); + require_once(_XE_PATH_.'classes/db/queryparts/expression/Expression.class.php'); + require_once(_XE_PATH_.'classes/db/queryparts/expression/SelectExpression.class.php'); + require_once(_XE_PATH_.'classes/db/queryparts/expression/InsertExpression.class.php'); + require_once(_XE_PATH_.'classes/db/queryparts/table/Table.class.php'); + require_once(_XE_PATH_.'classes/db/queryparts/table/JoinTable.class.php'); + require_once(_XE_PATH_.'classes/db/queryparts/condition/ConditionGroup.class.php'); + require_once(_XE_PATH_.'classes/db/queryparts/condition/Condition.class.php'); + require_once(_XE_PATH_.'classes/db/queryparts/expression/StarExpression.class.php'); + $output = @include($cache_file); if( (is_a($output, 'Object') || is_subclass_of($output, 'Object')) && !$output->toBool()) return $output; diff --git a/classes/db/DBCubrid.class.php b/classes/db/DBCubrid.class.php index d938d4001..171bf6a47 100644 --- a/classes/db/DBCubrid.class.php +++ b/classes/db/DBCubrid.class.php @@ -812,7 +812,65 @@ * to get a specific page list easily in select statement,\n * a method, navigation, is used **/ - function _executeSelectAct ($output) + function _executeSelectAct($output){ + $query = ''; + + $select = 'SELECT '; + foreach($output->columns as $column){ + if($column->show()) + $select .= $column->getExpression() . ', '; + } + $select = substr($select, 0, -2); + + $from = 'FROM '; + $simple_table_count = 0; + foreach($output->tables as $table){ + /*if($simple_table_count > 0) $from .= ', '; + + $from .= $table->toString() . ' '; + if(!$table->isJoinTable()) $simple_table_count++; + */ + if($table->isJoinTable() || !$simple_table_count) $from .= $table->toString() . ' '; + else $from .= ', '.$table->toString() . ' '; + $simple_table_count++; + } + + $where = ''; + if(count($output->conditions) > 0){ + $where = 'WHERE '; + foreach($output->conditions as $conditionGroup){ + $where .= $conditionGroup->toString(); + } + } + + $groupBy = ''; + if($output->groups) if($output->groups[0] !== "") + $groupBy = 'GROUP BY ' . implode(', ', $output->groups); + + $orderBy = ''; + if(count($output->orderby) > 0){ + $orderBy = 'ORDER BY '; + foreach($output->orderby as $order){ + $orderBy .= $order->toString() .', '; + } + $orderBy = substr($orderBy, 0, -2); + } + + + $query = $select . ' ' . $from . ' ' . $where . ' ' . $groupBy . ' ' . $orderBy; + + //$query = sprintf ("select %s from %s %s %s %s", $columns, implode (',',$table_list), implode (' ',$left_join), $condition, //$groupby_query.$orderby_query); + //$query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; + $result = $this->_query ($query); + if ($this->isError ()) return; + $data = $this->_fetch ($result); + + $buff = new Object (); + $buff->data = $data; + + return $buff; + } + /*function _executeSelectAct ($output) { // tables $table_list = array (); @@ -1049,6 +1107,7 @@ return $buff; } + */ /** * @brief displays the current stack trace. Fetch the result diff --git a/classes/db/queryparts/condition/Condition.class.php b/classes/db/queryparts/condition/Condition.class.php new file mode 100644 index 000000000..ea8657b71 --- /dev/null +++ b/classes/db/queryparts/condition/Condition.class.php @@ -0,0 +1,87 @@ +column_name = $column_name; + $this->value = $value; + $this->operation = $operation; + $this->pipe = $pipe; + } + + function toString(){ + return $this->pipe . ' ' . $this->getConditionPart($this->column_name, $this->value, $this->operation); + } + + function getConditionPart($name, $value, $operation) { + switch($operation) { + case 'equal' : + case 'more' : + case 'excess' : + case 'less' : + case 'below' : + case 'like_tail' : + case 'like_prefix' : + case 'like' : + case 'in' : + case 'notin' : + case 'notequal' : + // if variable is not set or is not string or number, return + if(!isset($value)) return; + if($value === '') return; + if(!in_array(gettype($value), array('string', 'integer'))) return; + break; + case 'between' : + if(!is_array($value)) return; + if(count($value)!=2) return; + + } + + switch($operation) { + case 'equal' : + return $name.' = '.$value; + break; + case 'more' : + return $name.' >= '.$value; + break; + case 'excess' : + return $name.' > '.$value; + break; + case 'less' : + return $name.' <= '.$value; + break; + case 'below' : + return $name.' < '.$value; + break; + case 'like_tail' : + case 'like_prefix' : + case 'like' : + return $name.' like '.$value; + break; + case 'in' : + return $name.' in ('.$value.')'; + break; + case 'notin' : + return $name.' not in ('.$value.')'; + break; + case 'notequal' : + return $name.' <> '.$value; + break; + case 'notnull' : + return $name.' is not null'; + break; + case 'null' : + return $name.' is null'; + break; + case 'between' : + return $name.' between ' . $value[0] . ' and ' . $value[1]; + break; + } + } + } + +?> \ No newline at end of file diff --git a/classes/db/queryparts/condition/ConditionGroup.class.php b/classes/db/queryparts/condition/ConditionGroup.class.php new file mode 100644 index 000000000..ecf5870f1 --- /dev/null +++ b/classes/db/queryparts/condition/ConditionGroup.class.php @@ -0,0 +1,27 @@ +conditions = $conditions; + $this->pipe = $pipe; + } + + function toString(){ + if($this->pipe !== "") + $group = $this->pipe .'('; + else $group = ''; + + foreach($this->conditions as $condition){ + $group .= $condition->toString() . ' '; + } + + if($this->pipe !== "") + $group .= ')'; + + return $group; + } + } +?> \ No newline at end of file diff --git a/classes/db/queryparts/expression/ClickCountExpression.class.php b/classes/db/queryparts/expression/ClickCountExpression.class.php new file mode 100644 index 000000000..a112368e8 --- /dev/null +++ b/classes/db/queryparts/expression/ClickCountExpression.class.php @@ -0,0 +1,33 @@ +click_count = false; + return; + } + $this->click_count = $click_count; + } + + function show() { + return $this->click_count; + } + + function getExpression(){ + return "$this->column_name = $this->column_name + 1"; + } + } + +?> \ No newline at end of file diff --git a/classes/db/queryparts/expression/DeleteExpression.class.php b/classes/db/queryparts/expression/DeleteExpression.class.php new file mode 100644 index 000000000..041173f2f --- /dev/null +++ b/classes/db/queryparts/expression/DeleteExpression.class.php @@ -0,0 +1,34 @@ +value = $value; + } + + function getExpression(){ + return "$this->column_name = $this->value"; + } + + function getValue(){ + // TODO Escape value according to column type instead of variable type + if(!is_numeric($this->value)) return "'".$this->value."'"; + return $this->value; + } + + function show(){ + if(!$this->value) return false; + return true; + } + } + + +?> \ No newline at end of file diff --git a/classes/db/queryparts/expression/Expression.class.php b/classes/db/queryparts/expression/Expression.class.php new file mode 100644 index 000000000..bd11929f6 --- /dev/null +++ b/classes/db/queryparts/expression/Expression.class.php @@ -0,0 +1,30 @@ +column_name = $column_name; + } + + function getColumnName(){ + return $this->column_name; + } + + function show() { + return false; + } + + function getExpression() { + } + } \ No newline at end of file diff --git a/classes/db/queryparts/expression/InsertExpression.class.php b/classes/db/queryparts/expression/InsertExpression.class.php new file mode 100644 index 000000000..633bacaf5 --- /dev/null +++ b/classes/db/queryparts/expression/InsertExpression.class.php @@ -0,0 +1,28 @@ +value = $value; + } + + function getValue(){ + return $this->value; + } + + function show(){ + if(!isset($this->value)) return false; + return true; + } + } + +?> \ No newline at end of file diff --git a/classes/db/queryparts/expression/SelectExpression.class.php b/classes/db/queryparts/expression/SelectExpression.class.php new file mode 100644 index 000000000..5de23b43a --- /dev/null +++ b/classes/db/queryparts/expression/SelectExpression.class.php @@ -0,0 +1,32 @@ +column_alias = $alias; + } + + function getExpression() { + return sprintf("%s%s", $this->column_name, $this->column_alias ? " as ".$this->column_alias : ""); + } + + function show() { + return true; + } + } +?> \ No newline at end of file diff --git a/classes/db/queryparts/expression/StarExpression.class.php b/classes/db/queryparts/expression/StarExpression.class.php new file mode 100644 index 000000000..c718fdbc9 --- /dev/null +++ b/classes/db/queryparts/expression/StarExpression.class.php @@ -0,0 +1,16 @@ + \ No newline at end of file diff --git a/classes/db/queryparts/expression/UpdateExpression.class.php b/classes/db/queryparts/expression/UpdateExpression.class.php new file mode 100644 index 000000000..fb3047ee3 --- /dev/null +++ b/classes/db/queryparts/expression/UpdateExpression.class.php @@ -0,0 +1,34 @@ +value = $value; + } + + function getExpression(){ + return "$this->column_name = $this->value"; + } + + function getValue(){ + // TODO Escape value according to column type instead of variable type + if(!is_numeric($this->value)) return "'".$this->value."'"; + return $this->value; + } + + function show(){ + if(!$this->value) return false; + return true; + } + } + + +?> \ No newline at end of file diff --git a/classes/db/queryparts/order/OrderByColumn.class.php b/classes/db/queryparts/order/OrderByColumn.class.php new file mode 100644 index 000000000..b5db8e9ce --- /dev/null +++ b/classes/db/queryparts/order/OrderByColumn.class.php @@ -0,0 +1,16 @@ +column_name = $column_name; + $this->sort_order = $sort_order; + } + + function toString(){ + return $this->column_name . ' ' . $this->sort_order; + } + } + +?> \ No newline at end of file diff --git a/classes/db/queryparts/table/JoinTable.class.php b/classes/db/queryparts/table/JoinTable.class.php new file mode 100644 index 000000000..7294a5167 --- /dev/null +++ b/classes/db/queryparts/table/JoinTable.class.php @@ -0,0 +1,37 @@ +join_type = $join_type; + $this->conditions = $conditions; + } + + function toString(){ + $part = $this->join_type . ' ' . $this->name ; + $part .= $this->alias ? ' as ' . $this->alias : ''; + $part .= ' on '; + foreach($this->conditions as $conditionGroup) + $part .= $conditionGroup->toString(); + return $part; + } + + function isJoinTable(){ + return true; + } + } + +?> \ No newline at end of file diff --git a/classes/db/queryparts/table/Table.class.php b/classes/db/queryparts/table/Table.class.php new file mode 100644 index 000000000..b2b7d5506 --- /dev/null +++ b/classes/db/queryparts/table/Table.class.php @@ -0,0 +1,26 @@ +name = $name; + $this->alias = $alias; + } + + function toString(){ + return sprintf("%s%s", $this->name, $this->alias ? ' as ' . $this->alias : ''); + } + + function getName(){ + return $this->name; + } + + function isJoinTable(){ + if(in_array($tableName,array('left join','left outer join','right join','right outer join'))) return true; + return false; + } + } + +?> \ No newline at end of file diff --git a/classes/display/HTMLDisplayHandler.php b/classes/display/HTMLDisplayHandler.php index 6df5a2c02..34c8ea3f0 100644 --- a/classes/display/HTMLDisplayHandler.php +++ b/classes/display/HTMLDisplayHandler.php @@ -151,6 +151,7 @@ class HTMLDisplayHandler { $oContext->addJsFile('./common/js/x.min.js', false, '', -100000); $oContext->addJsFile('./common/js/xe.min.js', false, '', -100000); $oContext->addCSSFile('./common/css/xe.min.css', false, 'all', '', -100000); + $oContext->addJsFile('./common/js/xml_handler.js', false, '', -100000); } // for admin page, add admin css diff --git a/classes/xml/XmlQueryParser.class.php b/classes/xml/XmlQueryParser.class.php index 27e6692ba..6c7192bf1 100644 --- a/classes/xml/XmlQueryParser.class.php +++ b/classes/xml/XmlQueryParser.class.php @@ -1,558 +1,54 @@ getXmlFileContent($xml_file); + + // insert, update, delete, select action + $action = strtolower($xml_obj->query->attrs->action); + if(!$action) return; + + //$oDB = &DB::getParser(); + //$dbParser = $oDB->getParser(); + $dbParser = getDBParser(); + $parser = new QueryParser($xml_obj->query, $dbParser); + + FileHandler::writeFile($cache_file, $parser->toString()); + } + + // singleton + function getDBParser(){ + if(!$this->dbParser){ + //$oDB = &DB::getParser(); + //$dbParser = $oDB->getParser(); + $this->dbParser = new DBParser('`'); + } + return $this->dbParser; + } + + function getXmlFileContent($xml_file){ $buff = FileHandler::readFile($xml_file); $xml_obj = parent::parse($buff); if(!$xml_obj) return; unset($buff); - - $id_args = explode('.', $query_id); - if(count($id_args)==2) { - $target = 'modules'; - $module = $id_args[0]; - $id = $id_args[1]; - } elseif(count($id_args)==3) { - $target = $id_args[0]; - if(!in_array($target, array('modules','addons','widgets'))) return; - $module = $id_args[1]; - $id = $id_args[2]; - } - // actions like insert, update, delete, select and so on - $action = strtolower($xml_obj->query->attrs->action); - if(!$action) return; - // get the table list(converting an array code) - $tables = $xml_obj->query->tables->table; - $output->left_tables = array(); - - $left_conditions = array(); - - if(!$tables) return; - if(!is_array($tables)) $tables = array($tables); - foreach($tables as $key => $val) { - // get the name of tables and aliases - $table_name = $val->attrs->name; - $alias = $val->attrs->alias; - if(!$alias) $alias = $table_name; - - $output->tables[$alias] = $table_name; - - if(in_array($val->attrs->type,array('left join','left outer join','right join','right outer join')) && count($val->conditions)){ - $output->left_tables[$alias] = $val->attrs->type; - $left_conditions[$alias] = $val->conditions; - } - // get column properties from the table - $table_file = sprintf('%s%s/%s/schemas/%s.xml', _XE_PATH_, 'modules', $module, $table_name); - if(!file_exists($table_file)) { - $searched_list = FileHandler::readDir(_XE_PATH_.'modules'); - $searched_count = count($searched_list); - for($i=0;$i<$searched_count;$i++) { - $table_file = sprintf('%s%s/%s/schemas/%s.xml', _XE_PATH_, 'modules', $searched_list[$i], $table_name); - if(file_exists($table_file)) break; - } - } - - if(file_exists($table_file)) { - $table_xml = FileHandler::readFile($table_file); - $table_obj = parent::parse($table_xml); - if($table_obj->table) { - if(isset($table_obj->table->column) && !is_array($table_obj->table->column)) - { - $table_obj->table->column = array($table_obj->table->column); - } - - foreach($table_obj->table->column as $k => $v) { - $buff .= sprintf('$output->column_type["%s"] = "%s";%s', $v->attrs->name, $v->attrs->type, "\n"); - } - } - } - } - // Column list - $columns = $xml_obj->query->columns->column; - $out = $this->_setColumn($columns); - $output->columns = $out->columns; - - $conditions = $xml_obj->query->conditions; - $out = $this->_setConditions($conditions); - $output->conditions = $out->conditions; - - foreach($output->left_tables as $key => $val){ - if($left_conditions[$key]){ - $out = $this->_setConditions($left_conditions[$key]); - $output->left_conditions[$key] = $out->conditions; - } - } - - $group_list = $xml_obj->query->groups->group; - $out = $this->_setGroup($group_list); - $output->groups = $out->groups; - - //priority arrange - $priority = $xml_obj->query->priority; - if($priority) $output->priority['type'] = $priority->attrs->type; - - //index hint arrange - $index_hint = $xml_obj->query->index_hint; - if($index_hint) - { - $output->index_hint['name'] = $index_hint->attrs->name; - $output->index_hint['type'] = $index_hint->attrs->type; - } - - // Navigation - $out = $this->_setNavigation($xml_obj); - $output->order = $out->order; - $output->list_count = $out->list_count; - $output->page_count = $out->page_count; - $output->page = $out->page; - - $column_count = count($output->columns); - $priority_count = count($output->priority); - $index_hint_count = count($output->index_hint); - $condition_count = count($output->conditions); - - $buff .= '$output->tables = array( '; - foreach($output->tables as $key => $val) { - if(!array_key_exists($key,$output->left_tables)){ - $buff .= sprintf('"%s"=>"%s",', $key, $val); - } - } - $buff .= ' );'."\n"; - // generates a php script - $buff .= '$output->_tables = array( '; - foreach($output->tables as $key => $val) { - $buff .= sprintf('"%s"=>"%s",', $key, $val); - } - $buff .= ' );'."\n"; - - if(count($output->left_tables)){ - $buff .= '$output->left_tables = array( '; - foreach($output->left_tables as $key => $val) { - $buff .= sprintf('"%s"=>"%s",', $key, $val); - } - $buff .= ' );'."\n"; - } - // column info - if($column_count) { - $buff .= '$output->columns = array ( '; - $buff .= $this->_getColumn($output->columns); - $buff .= ' );'."\n"; - } - - //priority arrange - if($priority_count) { - $priority_str .= '$output->priority = array("type"=>"%s");'."\n"; - $buff .= vsprintf($priority_str, $output->priority); - } - - // index arrange - if($index_hint_count) { - $index_hint_str .= '$output->index_hint = array("name"=>"%s", "type"=>"%s");'."\n"; - $buff .= vsprintf($index_hint_str, $output->index_hint); - } - - // get conditions - if($condition_count) { - $buff .= '$output->conditions = array ( '; - $buff .= $this->_getConditions($output->conditions); - $buff .= ' );'."\n"; - } - // get conditions - if(count($output->left_conditions)) { - $buff .= '$output->left_conditions = array ( '; - foreach($output->left_conditions as $key => $val){ - $buff .= "'{$key}' => array ( "; - $buff .= $this->_getConditions($val); - $buff .= "),\n"; - } - $buff .= ' );'."\n"; - } - - // get arguments - $arg_list = $this->getArguments(); - if($arg_list) - { - foreach($arg_list as $arg) - { - $pre_buff .= 'if(is_object($args->'.$arg.')){ $args->'.$arg.' = array_values(get_method_vars($args->'.$arg.')); }'. "\n"; - $pre_buff .= 'if(is_array($args->'.$arg.') && count($args->'.$arg.')==0){ unset($args->'.$arg.'); };'."\n"; - } - } - - // order - if($output->order) { - $buff .= '$output->order = array('; - foreach($output->order as $key => $val) { - $buff .= sprintf('array($args->%s?$args->%s:"%s",in_array($args->%s,array("asc","desc"))?$args->%s:("%s"?"%s":"asc")),', $val->var, $val->var, $val->default, $val->order, $val->order, $val->order, $val->order); - } - $buff .= ');'."\n"; - } - - // list_count - if($output->list_count) { - $buff .= sprintf('$output->list_count = array("var"=>"%s", "value"=>$args->%s?$args->%s:"%s");%s', $output->list_count->var, $output->list_count->var, $output->list_count->var, $output->list_count->default,"\n"); - } - - // page_count - if($output->page_count) { - $buff .= sprintf('$output->page_count = array("var"=>"%s", "value"=>$args->%s?$args->%s:"%s");%s', $output->page_count->var, $output->page_count->var, $output->page_count->var, $output->list_count->default,"\n"); - } - - // page order - if($output->page) { - $buff .= sprintf('$output->page = array("var"=>"%s", "value"=>$args->%s?$args->%s:"%s");%s', $output->page->var, $output->page->var, $output->page->var, $output->list->default,"\n"); - } - - // group by - if($output->groups) { - $buff .= sprintf('$output->groups = array("%s");%s', implode('","',$output->groups),"\n"); - } - - // minlength check - if(count($minlength_list)) { - foreach($minlength_list as $key => $val) { - $pre_buff .= 'if($args->'.$key.'&&strlen($args->'.$key.')<'.$val.') return new Object(-1, sprintf($lang->filter->outofrange, $lang->'.$key.'?$lang->'.$key.':\''.$key.'\'));'."\n"; - } - } - - // maxlength check - if(count($maxlength_list)) { - foreach($maxlength_list as $key => $val) { - $pre_buff .= 'if($args->'.$key.'&&strlen($args->'.$key.')>'.$val.') return new Object(-1, sprintf($lang->filter->outofrange, $lang->'.$key.'?$lang->'.$key.':\''.$key.'\'));'."\n"; - } - } - - // filter check - if(count($this->filter_list)) { - foreach($this->filter_list as $key => $val) { - $pre_buff .= sprintf('if(isset($args->%s)) { unset($_output); $_output = $this->checkFilter("%s",$args->%s,"%s"); if(!$_output->toBool()) return $_output; } %s',$val->var, $val->var,$val->var,$val->filter,"\n"); - } - } - - // default check - if(count($this->default_list)) { - foreach($this->default_list as $key => $val) { - $pre_buff .= 'if(!isset($args->'.$key.')) $args->'.$key.' = '.$val.';'."\n"; - } - } - - // not null check - if(count($this->notnull_list)) { - foreach($this->notnull_list as $key => $val) { - $pre_buff .= 'if(!isset($args->'.$val.')) return new Object(-1, sprintf($lang->filter->isnull, $lang->'.$val.'?$lang->'.$val.':\''.$val.'\'));'."\n"; - } - } - - $buff = "query_id = "%s";%s', $query_id, "\n") - . sprintf('$output->action = "%s";%s', $action, "\n") - . $pre_buff - . $buff - . 'return $output; ?>'; - - // Save - FileHandler::writeFile($cache_file, $buff); + return $xml_obj; } - /** - * @brief transfer given column information to object->columns - * @param[in] column information - * @result Returns $object - */ - - function _setColumn($columns){ - if(!$columns) { - $output->column[] = array("*" => "*"); - } else { - if(!is_array($columns)) $columns = array($columns); - foreach($columns as $key => $val) { - $name = $val->attrs->name; - /* - if(strpos('.',$name)===false && count($output->tables)==1) { - $tmp = array_values($output->tables); - $name = sprintf('%s.%s', $tmp[0], $val->attrs->name); - } - */ - - $output->columns[] = array( - "name" => $name, - "var" => $val->attrs->var, - "default" => $val->attrs->default, - "notnull" => $val->attrs->notnull, - "filter" => $val->attrs->filter, - "minlength" => $val->attrs->minlength, - "maxlength" => $val->attrs->maxlength, - "alias" => $val->attrs->alias, - "click_count" => $val->attrs->click_count, - ); - } - } - return $output; - } - - /** - * @brief transfer condition information to $object->conditions - * @param[in] SQL condition information - * @result Returns $output - */ - function _setConditions($conditions){ - // Conditional clause - $condition = $conditions->condition; - if($condition) { - $obj->condition = $condition; - unset($condition); - $condition = array($obj); - } - $condition_group = $conditions->group; - if($condition_group && !is_array($condition_group)) $condition_group = array($condition_group); - - if($condition && $condition_group) $cond = array_merge($condition, $condition_group); - elseif($condition_group) $cond = $condition_group; - else $cond = $condition; - - if($cond) { - foreach($cond as $key => $val) { - unset($cond_output); - - if($val->attrs->pipe) $cond_output->pipe = $val->attrs->pipe; - else $cond_output->pipe = null; - - if(!$val->condition) continue; - if(!is_array($val->condition)) $val->condition = array($val->condition); - - foreach($val->condition as $k => $v) { - $obj = $v->attrs; - if(!$obj->alias) $obj->alias = $obj->column; - $cond_output->condition[] = $obj; - } - - $output->conditions[] = $cond_output; - } - } - return $output; - } - - /** - * @brief transfer condition information to $object->groups - * @param[in] SQL group information - * @result Returns $output - */ - function _setGroup($group_list){ - // group list - - if($group_list) { - if(!is_array($group_list)) $group_list = array($group_list); - for($i=0;$iattrs->column); - if(!$column) continue; - $group_column_list[] = $column; - } - if(count($group_column_list)) $output->groups = $group_column_list; - } - return $output; - } - - - /** - * @brief transfer pagnation information to $output - * @param[in] $xml_obj xml object containing Navigation information - * @result Returns $output - */ - function _setNavigation($xml_obj){ - $navigation = $xml_obj->query->navigation; - if($navigation) { - $order = $navigation->index; - if($order) { - if(!is_array($order)) $order = array($order); - foreach($order as $order_info) { - $output->order[] = $order_info->attrs; - } - } - - $list_count = $navigation->list_count->attrs; - $output->list_count = $list_count; - - $page_count = $navigation->page_count->attrs; - $output->page_count = $page_count; - - $page = $navigation->page->attrs; - $output->page = $page ; - } - return $output; - } - - /** - * @brief retrieve column information from $output->colums to generate corresponding php code - * @param[in] $column - * @remarks the name of this method is misleading. - * @result Returns string buffer containing php code - */ - function _getColumn($columns){ - $buff = ''; - $str = ''; - $print_vars = array(); - - foreach($columns as $key => $val) { - $str = 'array("name"=>"%s","alias"=>"%s"'; - $print_vars = array(); - $print_vars[] = $val['name']; - $print_vars[] = $val['alias']; - - $val['default'] = $this->getDefault($val['name'], $val['default']); - if($val['var'] && strpos($val['var'],'.')===false) { - - if($val['default']){ - $str .= ',"value"=>$args->%s?$args->%s:%s'; - $print_vars[] = $val['var']; - $print_vars[] = $val['var']; - $print_vars[] = $val['default']; - }else{ - $str .= ',"value"=>$args->%s'; - $print_vars[] = $val['var']; - } - - } else { - if($val['default']){ - $str .= ',"value"=>%s'; - $print_vars[] = $val['default']; - } - } - - if($val['click_count']){ - $str .= ',"click_count"=>$args->%s'; - $print_vars[] = $val['click_count']; - } - - $str .= '),%s'; - $print_vars[] = "\n"; - - $buff .= vsprintf($str, $print_vars); - } - return $buff; - } - - /** - * @brief retrieve condition information from $output->condition to generate corresponding php code - * @param[in] $conditions array containing Query conditions - * @remarks the name of this method is misleading. - * @return Returns string buffer containing php code - */ - function _getConditions($conditions){ - $buff = ''; - foreach($conditions as $key => $val) { - $buff .= sprintf('array("pipe"=>"%s",%s"condition"=>array(', $val->pipe,"\n"); - foreach($val->condition as $k => $v) { - $v->default = $this->getDefault($v->column, $v->default); - if($v->var) { - if(strpos($v->var,".")===false) { - if($v->default) $this->default_list[$v->var] = $v->default; - if($v->filter) $this->filter_list[] = $v; - if($v->notnull) $this->notnull_list[] = $v->var; - if($v->default) $buff .= sprintf('array("column"=>"%s", "value"=>$args->%s?$args->%s:%s,"pipe"=>"%s","operation"=>"%s",),%s', $v->column, $v->var, $v->var, $v->default, $v->pipe, $v->operation, "\n"); - else $buff .= sprintf('array("column"=>"%s", "value"=>$args->%s,"pipe"=>"%s","operation"=>"%s",),%s', $v->column, $v->var, $v->pipe, $v->operation, "\n"); - - $this->addArguments($v->var); - } else { - $buff .= sprintf('array("column"=>"%s", "value"=>"%s","pipe"=>"%s","operation"=>"%s",),%s', $v->column, $v->var, $v->pipe, $v->operation, "\n"); - } - } else { - if($v->default) $buff .= sprintf('array("column"=>"%s", "value"=>%s,"pipe"=>"%s","operation"=>"%s",),%s', $v->column, $v->default ,$v->pipe, $v->operation,"\n"); - else $buff .= sprintf('array("column"=>"%s", "pipe"=>"%s","operation"=>"%s",),%s', $v->column, $v->pipe, $v->operation,"\n"); - } - } - $buff .= ')),'."\n"; - } - return $buff; - } - - function addArguments($args_name) - { - $this->args[] = $args_name; - } - - function getArguments() - { - return $this->args; - } - - /** - * @brief returns predefined default values correspoding to given parameters - * @param[in] $name - * @param[in] $value - * @return Returns a default value for specified field - */ - function getDefault($name, $value) { - $db_info = Context::getDBInfo (); - if(!isset($value)) return; - $str_pos = strpos($value, '('); - if($str_pos===false) return '"'.$value.'"'; - - $func_name = substr($value, 0, $str_pos); - $args = substr($value, $str_pos+1, strlen($value)-1); - - switch($func_name) { - case 'ipaddress' : - $val = '$_SERVER[\'REMOTE_ADDR\']'; - break; - case 'unixtime' : - $val = 'time()'; - break; - case 'curdate' : - $val = 'date("YmdHis")'; - break; - case 'sequence' : - $val = '$this->getNextSequence()'; - break; - case 'plus' : - $args = abs($args); - if ($db_info->db_type == 'cubrid') { - $val = sprintf ('"\\"%s\\"+%d"', $name, $args); - } else { - $val = sprintf('"%s+%d"', $name, $args); - } - break; - case 'minus' : - $args = abs($args); - if ($db_info->db_type == 'cubrid') { - $val = sprintf ('"\\"%s\\"-%d"', $name, $args); - } else { - $val = sprintf('"%s-%d"', $name, $args); - } - break; - case 'multiply' : - $args = intval($args); - if ($db_info->db_type == 'cubrid') { - $val = sprintf ('"\\"%s\\"*%d"', $name, $args); - } else { - $val = sprintf('"%s*%d"', $name, $args); - } - break; - } - - return $val; - } + } ?> diff --git a/classes/xml/xmlquery/DBParser.class.php b/classes/xml/xmlquery/DBParser.class.php new file mode 100644 index 000000000..00b65ee93 --- /dev/null +++ b/classes/xml/xmlquery/DBParser.class.php @@ -0,0 +1,98 @@ +escape_char = $escape_char; + $this->table_prefix = $table_prefix; + } + + function getEscapeChar(){ + return $this->escape_char; + } + + function escape($name){ + return $this->escape_char . $name . $this->escape_char; + } + + function escapeString($name){ + return "'".$name."'"; + } + + function parseTableName($name){ + return $this->table_prefix . $name; + } + + function parseColumnName($name){ + return $this->escapeColumn($name); + } + + function escapeColumn($column_name){ + if($this->isUnqualifiedColumnName($column_name)) + return $this->escape($column_name); + if($this->isQualifiedColumnName($column_name)){ + list($table, $column) = explode('.', $column_name); + // $table can also be an alias, so the prefix should not be added + return $this->escape($table).'.'.$this->escape($column); + //return $this->escape($this->parseTableName($table)).'.'.$this->escape($column); + } + } + + function isUnqualifiedColumnName($column_name){ + if(strpos($column_name,'.')===false && strpos($column_name,'(')===false) return true; + return false; + } + + function isQualifiedColumnName($column_name){ + if(strpos($column_name,'.')!==false && strpos($column_name,'(')===false) return true; + return false; + } + + function parseExpression($column_name){ + $functions = preg_split('/([\+\-\*\/\ ])/', $column_name, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY); + foreach($functions as &$function){ + if(strlen($function)==1) continue; // skip delimiters + $pos = strrpos("(", $function); + $matches = preg_split('/([a-zA-Z0-9_*]+)/', $function, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY); + $total_brackets = substr_count($function, "("); + $brackets = 0; + foreach($matches as &$match){ + if($match == '(') {$brackets++; continue;} + if(strpos($match,')') !== false) continue; + if(in_array($match, array(',', '.'))) continue; + if($brackets == $total_brackets){ + if(!is_numeric($match)) { + $match = $this->escapeColumnExpression($match); + } + } + } + $function = implode('', $matches); + } + return implode('', $functions); + } + + function isStar($column_name){ + if(substr($column_name,-1) == '*') return true; + return false; + } + + /* + * Checks to see if expression is an aggregate star function + * like count(*) + */ + function isStarFunction($column_name){ + if(strpos($column_name, "(*)")!==false) return true; + return false; + } + + function escapeColumnExpression($column_name){ + if($this->isStar($column_name)) return $column_name; + if($this->isStarFunction($column_name)){ + return $column_name; + } + return $this->escapeColumn($column_name); + } + } + + \ No newline at end of file diff --git a/classes/xml/xmlquery/QueryParser.class.php b/classes/xml/xmlquery/QueryParser.class.php new file mode 100644 index 000000000..00f95d5b8 --- /dev/null +++ b/classes/xml/xmlquery/QueryParser.class.php @@ -0,0 +1,160 @@ +query = $query; + $this->action = $this->query->attrs->action; + $this->query_id = $this->query->attrs->id; + + $this->dbParser = $dbParser; + } + + function getQueryId(){ + return $this->query->attrs->query_id ? $this->query->attrs->query_id : $this->query->attrs->id; + } + + function getAction(){ + return $this->query->attrs->action; + } + + function getTableInfo($query_id, $table_name){ + $column_type = array(); + + $id_args = explode('.', $query_id); + if(count($id_args)==2) { + $target = 'modules'; + $module = $id_args[0]; + $id = $id_args[1]; + } elseif(count($id_args)==3) { + $target = $id_args[0]; + if(!in_array($target, array('modules','addons','widgets'))) return; + $module = $id_args[1]; + $id = $id_args[2]; + } + + // get column properties from the table + $table_file = sprintf('%s%s/%s/schemas/%s.xml', _XE_PATH_, 'modules', $module, $table_name); + if(!file_exists($table_file)) { + $searched_list = FileHandler::readDir(_XE_PATH_.'modules'); + $searched_count = count($searched_list); + for($i=0;$i<$searched_count;$i++) { + $table_file = sprintf('%s%s/%s/schemas/%s.xml', _XE_PATH_, 'modules', $searched_list[$i], $table_name); + if(file_exists($table_file)) break; + } + } + + if(file_exists($table_file)) { + $table_xml = FileHandler::readFile($table_file); + $xml_parser = new XmlParser(); + $table_obj = $xml_parser->parse($table_xml); + if($table_obj->table) { + if(isset($table_obj->table->column) && !is_array($table_obj->table->column)) + { + $table_obj->table->column = array($table_obj->table->column); + } + + foreach($table_obj->table->column as $k => $v) { + $column_type[$v->attrs->name] = $v->attrs->type; + } + } + } + + return $column_type; + } + + function setTableColumnTypes($tables){ + $query_id = $this->getQueryId(); + if(!isset($this->column_type[$query_id])){ + $table_tags = $tables->getTables(); + $column_type = array(); + foreach($table_tags as $table_tag){ + $tag_column_type = $this->getTableInfo($query_id, $table_tag->getTableName()); + $column_type = array_merge($column_type, $tag_column_type); + } + $this->column_type[$query_id] = $column_type; + } + } + + function toString(){ + // TODO Add tags for update, insert .. + if($this->action == 'select'){ + $columns = new SelectColumnsTag($this->query->columns->column, $this->dbParser); + }else if($this->action == 'insert'){ + $columns = new InsertColumnsTag($this->query->columns->column, $this->dbParser); + }else if($this->action == 'update') { + $columns = new UpdateColumnsTag($this->query->columns->column, $this->dbParser); + }else if($this->action == 'delete') { + $columns = new DeleteColumnsTag($this->query->columns->column, $this->dbParser); + } + + + $tables = new TablesTag($this->query->tables->table, $this->dbParser); + $conditions = new ConditionsTag($this->query->conditions, $this->dbParser); + $groups = new GroupsTag($this->query->groups->group, $this->dbParser); + $navigation = new NavigationTag($this->query->navigation, $this->dbParser); + + $this->setTableColumnTypes($tables); + + $arguments = array(); + $arguments = array_merge($arguments, $columns->getArguments()); + $arguments = array_merge($arguments, $conditions->getArguments()); + $arguments = array_merge($arguments, $navigation->getArguments()); + //foreach($arguments as $argument){ + // var_dump($argument); + // var_dump($this->column_type[$this->getQueryId()][$argument->getColumnName()]); + //} + + $prebuff = ''; + //$prebuff .= $columns->getValidatorString(); + //$prebuff .= $conditions->getValidatorString(); + //$prebuff .= $navigation->getValidatorString(); + foreach($arguments as $argument){ + if($argument->getArgumentName()){ + $prebuff .= $argument->toString(); + $prebuff .= sprintf("$%s_argument->escapeValue('%s');\n" + , $argument->getArgumentName() + , $this->column_type[$this->getQueryId()][$argument->getColumnName()] ); + } + } + $prebuff .= "\n"; + + $buff = ''; + + $buff .= '$output->columns = ' . $columns->toString() . ';'.PHP_EOL; + $buff .= '$output->tables = ' . $tables->toString() .';'.PHP_EOL; + $buff .= '$output->conditions = '.$conditions->toString() .';'.PHP_EOL; + $buff .= '$output->groups = ' . $groups->toString() . ';'; + $buff .= '$output->orderby = ' . $navigation->getOrderByString() .';'; + + return "dbParser->getEscapeChar()."');\n" + . sprintf('$output->query_id = "%s";%s', $this->query_id, "\n") + . sprintf('$output->action = "%s";%s', $this->action, "\n") + . $prebuff + . $buff + . 'return $output; ?>'; + + + } +} + +?> \ No newline at end of file diff --git a/classes/xml/xmlquery/argument/Argument.class.php b/classes/xml/xmlquery/argument/Argument.class.php new file mode 100644 index 000000000..9b88296bb --- /dev/null +++ b/classes/xml/xmlquery/argument/Argument.class.php @@ -0,0 +1,113 @@ +name = $name; + $this->value = $value; + $this->isValid = true; + } + + function getValue(){ + return $this->value; + } + + function isValid(){ + return $this->isValid; + } + + function getErrorMessage(){ + return $this->errorMessage; + } + + function ensureDefaultValue($default_value){ + if(!isset($this->value)) + $this->value = $default_value; + } + + function escapeValue($column_type){ + if(in_array($column_type, array('date', 'varchar', 'char'))) + $this->value = '\''.$this->value.'\''; + } + + function checkFilter($filter_type){ + if(isset($this->value)){ + $val = $this->value; + $key = $this->name; + switch($filter_type) { + case 'email' : + case 'email_address' : + if(!preg_match('/^[_0-9a-z-]+(\.[_0-9a-z-]+)*@[0-9a-z-]+(\.[0-9a-z-]+)*$/is', $val)) { + $this->isValid = false; + $this->errorMessage = new Object(-1, sprintf($lang->filter->invalid_email, $lang->{$key} ? $lang->{$key} : $key)); + } + break; + case 'homepage' : + if(!preg_match('/^(http|https)+(:\/\/)+[0-9a-z_-]+\.[^ ]+$/is', $val)) { + $this->isValid = false; + $this->errorMessage = new Object(-1, sprintf($lang->filter->invalid_homepage, $lang->{$key} ? $lang->{$key} : $key)); + } + break; + case 'userid' : + case 'user_id' : + if(!preg_match('/^[a-zA-Z]+([_0-9a-zA-Z]+)*$/is', $val)) { + $this->isValid = false; + $this->errorMessage = new Object(-1, sprintf($lang->filter->invalid_userid, $lang->{$key} ? $lang->{$key} : $key)); + } + break; + case 'number' : + case 'numbers' : + if(is_array($val)) $val = join(',', $val); + if(!preg_match('/^(-?)[0-9]+(,\-?[0-9]+)*$/is', $val)){ + $this->isValid = false; + $this->errorMessage = new Object(-1, sprintf($lang->filter->invalid_number, $lang->{$key} ? $lang->{$key} : $key)); + } + break; + case 'alpha' : + if(!preg_match('/^[a-z]+$/is', $val)) { + $this->isValid = false; + $this->errorMessage = new Object(-1, sprintf($lang->filter->invalid_alpha, $lang->{$key} ? $lang->{$key} : $key)); + } + break; + case 'alpha_number' : + if(!preg_match('/^[0-9a-z]+$/is', $val)) { + $this->isValid = false; + $this->errorMessage = new Object(-1, sprintf($lang->filter->invalid_alpha_number, $lang->{$key} ? $lang->{$key} : $key)); + } + break; + } + } + } + + function checkMaxLength($length){ + if($this->value && (strlen($this->value) > $length)){ + $this->isValid = false; + $key = $this->name; + $this->errorMessage = new Object(-1, $lang->filter->outofrange, $lang->{$key} ? $lang->{$key} : $key); + } + } + + function checkMinLength($length){ + if($this->value && (strlen($this->value) > $length)){ + $this->isValid = false; + $key = $this->name; + $this->errorMessage = new Object(-1, $lang->filter->outofrange, $lang->{$key} ? $lang->{$key} : $key); + } + } + + function checkNotNull(){ + if(!isset($this->value)){ + $this->isValid = false; + $key = $this->name; + $this->errorMessage = new Object(-1, $lang->filter->isnull, $lang->{$key} ? $lang->{$key} : $key); + } + } + } + + +?> \ No newline at end of file diff --git a/classes/xml/xmlquery/queryargument/ConditionQueryArgument.class.php b/classes/xml/xmlquery/queryargument/ConditionQueryArgument.class.php new file mode 100644 index 000000000..8c5743dc0 --- /dev/null +++ b/classes/xml/xmlquery/queryargument/ConditionQueryArgument.class.php @@ -0,0 +1,26 @@ +argument_name = $tag->attrs->var; + + $name = $tag->attrs->column; + if(strpos($name, '.') === false) $this->column_name = $name; + else { + list($prefix, $name) = explode('.', $name); + $this->column_name = $name; + } + + require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/validator/QueryArgumentValidator.class.php'); + require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/validator/ConditionQueryArgumentValidator.class.php'); + $this->argument_validator = new ConditionQueryArgumentValidator($tag); + } + + function getColumnName(){ + return $this->column_name; + } + } +?> \ No newline at end of file diff --git a/classes/xml/xmlquery/queryargument/DefaultValue.class.php b/classes/xml/xmlquery/queryargument/DefaultValue.class.php new file mode 100644 index 000000000..33f5776d3 --- /dev/null +++ b/classes/xml/xmlquery/queryargument/DefaultValue.class.php @@ -0,0 +1,61 @@ +column_name = $column_name; + $this->value = $value; + } + + function isString(){ + $str_pos = strpos($this->value, '('); + if($str_pos===false) return true; + return false; + } + + function toString(){ + if(!isset($this->value)) return; + + $str_pos = strpos($this->value, '('); + if($str_pos===false) return '"'.$this->value.'"'; + + $func_name = substr($this->value, 0, $str_pos); + $args = substr($this->value, $str_pos+1, strlen($value)-1); + + switch($func_name) { + case 'ipaddress' : + $val = '$_SERVER[\'REMOTE_ADDR\']'; + break; + case 'unixtime' : + $val = 'time()'; + break; + case 'curdate' : + $val = 'date("YmdHis")'; + break; + case 'sequence' : + $val = '$this->getNextSequence()'; + break; + case 'plus' : + $args = abs($args); + // TODO Make sure column name is escaped + $val = sprintf('"%s+%d"', $this->column_name, $args); + break; + case 'minus' : + $args = abs($args); + $val = sprintf('"%s-%d"', $this->column_name, $args); + break; + case 'multiply' : + $args = intval($args); + $val = sprintf('"%s*%d"', $this->column_name, $args); + break; + default : + $val = '"' . $this->value . '"'; + } + + return $val; + } + } + +?> \ No newline at end of file diff --git a/classes/xml/xmlquery/queryargument/QueryArgument.class.php b/classes/xml/xmlquery/queryargument/QueryArgument.class.php new file mode 100644 index 000000000..b18e6d784 --- /dev/null +++ b/classes/xml/xmlquery/queryargument/QueryArgument.class.php @@ -0,0 +1,52 @@ +argument_name = $tag->attrs->var; + + $name = $tag->attrs->name; + if(!$name) $name = $tag->attrs->column; + if(strpos($name, '.') === false) $this->column_name = $name; + else { + list($prefix, $name) = explode('.', $name); + $this->column_name = $name; + } + + if(!$this->argument_name) $this->argument_name = $tag->attrs->name; + require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/validator/QueryArgumentValidator.class.php'); + $this->argument_validator = new QueryArgumentValidator($tag); + + } + + function getArgumentName(){ + return $this->argument_name; + } + + function getColumnName(){ + return $this->column_name; + } + + function getValidatorString(){ + return $this->argument_validator->toString(); + } + + function toString(){ + $arg = sprintf("\n$%s_argument = new Argument('%s', %s);\n" + , $this->argument_name + , $this->argument_name + , '$args->'.$this->argument_name); + $arg .= $this->argument_validator->toString(); + $arg .= sprintf("if(!$%s_argument->isValid()) return $%s_argument->getErrorMessage();\n" + , $this->argument_name + , $this->argument_name + ); + return $arg; + } + + } + +?> \ No newline at end of file diff --git a/classes/xml/xmlquery/queryargument/validator/ConditionQueryArgumentValidator.class.php b/classes/xml/xmlquery/queryargument/validator/ConditionQueryArgumentValidator.class.php new file mode 100644 index 000000000..4a74b809c --- /dev/null +++ b/classes/xml/xmlquery/queryargument/validator/ConditionQueryArgumentValidator.class.php @@ -0,0 +1,20 @@ +argument_name) return ''; + if(!isset($this->validator_string)){ + $validator = parent::toString(); + require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/validator/EscapeCheck.class.php'); + $v = new EscapeCheck($this->argument_name); + $validator .= $v->toString(); + $this->validator_string = $validator; + } + return $this->validator_string; + } + } +?> \ No newline at end of file diff --git a/classes/xml/xmlquery/queryargument/validator/DefaultCheck.class.php b/classes/xml/xmlquery/queryargument/validator/DefaultCheck.class.php new file mode 100644 index 000000000..e6048fc28 --- /dev/null +++ b/classes/xml/xmlquery/queryargument/validator/DefaultCheck.class.php @@ -0,0 +1,25 @@ +argument_name = $argument_name; + $this->value = $value; + } + + function toString(){ + if(!isset($this->argument_name)) return ''; + + $value = $this->value->toString(); + + if($this->value->isString()) { + $value = "'".$value."'"; + } + + return 'if(!isset($args->'.$this->argument_name.')) $args->'.$this->argument_name.' = '.$value.';'."\n"; + } + } + +?> \ No newline at end of file diff --git a/classes/xml/xmlquery/queryargument/validator/EscapeCheck.class.php b/classes/xml/xmlquery/queryargument/validator/EscapeCheck.class.php new file mode 100644 index 000000000..1d37cb953 --- /dev/null +++ b/classes/xml/xmlquery/queryargument/validator/EscapeCheck.class.php @@ -0,0 +1,21 @@ +argument_name = $argument_name; + } + + function toString(){ + return sprintf("if(is_string(\$args->%s) && !is_numeric(\$args->%s)) \$args->%s = \$dbParser->escapeString(\$args->%s);\n" + , $this->argument_name + , $this->argument_name + , $this->argument_name + , $this->argument_name); + } + } + +?> \ No newline at end of file diff --git a/classes/xml/xmlquery/queryargument/validator/FilterValidator.class.php b/classes/xml/xmlquery/queryargument/validator/FilterValidator.class.php new file mode 100644 index 000000000..29a8e9cbf --- /dev/null +++ b/classes/xml/xmlquery/queryargument/validator/FilterValidator.class.php @@ -0,0 +1,16 @@ +argument_name = $argument_name; + $this->filter = $filter; + } + + function toString(){ + return sprintf('if(isset($args->%s)) { unset($_output); $_output = $this->checkFilter("%s",$args->%s,"%s"); if(!$_output->toBool()) return $_output; } %s',$this->argument_name, $this->argument_name,$this->argument_name,$this->filter,"\n"); + } + } + +?> \ No newline at end of file diff --git a/classes/xml/xmlquery/queryargument/validator/MaxLengthValidator.class.php b/classes/xml/xmlquery/queryargument/validator/MaxLengthValidator.class.php new file mode 100644 index 000000000..3d94cd12e --- /dev/null +++ b/classes/xml/xmlquery/queryargument/validator/MaxLengthValidator.class.php @@ -0,0 +1,22 @@ +argument_name = $argument_name; + $this->value = $value; + } + + function toString(){ + return 'if($args->' + .$this->argument_name + .'&&strlen($args->'.$this->argument_name.')>'.$this->value + .') return new Object(-1, sprintf($lang->filter->outofrange, $lang->' + .$this->argument_name.'?$lang->' + .$this->argument_name.':\''.$this->argument_name.'\'));'."\n"; + } + } + +?> \ No newline at end of file diff --git a/classes/xml/xmlquery/queryargument/validator/MinLengthValidator.class.php b/classes/xml/xmlquery/queryargument/validator/MinLengthValidator.class.php new file mode 100644 index 000000000..2717f4487 --- /dev/null +++ b/classes/xml/xmlquery/queryargument/validator/MinLengthValidator.class.php @@ -0,0 +1,22 @@ +argument_name = $argument_name; + $this->value = $value; + } + + function toString(){ + return 'if($args->' + .$this->argument_name + .'&&strlen($args->'.$this->argument_name.')<'.$this->value + .') return new Object(-1, sprintf($lang->filter->outofrange, $lang->' + .$this->argument_name.'?$lang->' + .$this->argument_name.':\''.$this->argument_name.'\'));'."\n"; + } + } + +?> \ No newline at end of file diff --git a/classes/xml/xmlquery/queryargument/validator/NotNullValidator.class.php b/classes/xml/xmlquery/queryargument/validator/NotNullValidator.class.php new file mode 100644 index 000000000..4f87b0462 --- /dev/null +++ b/classes/xml/xmlquery/queryargument/validator/NotNullValidator.class.php @@ -0,0 +1,18 @@ +argument_name = $argument_name; + $this->value = $value; + } + + function toString(){ + return 'if(!isset($args->'.$this->argument_name.')) return new Object(-1, sprintf($lang->filter->isnull, $lang->' + .$this->argument_name.'?$lang->'.$this->argument_name.':\''.$this->argument_name.'\'));'."\n"; + } + + } +?> \ No newline at end of file diff --git a/classes/xml/xmlquery/queryargument/validator/QueryArgumentValidator.class.php b/classes/xml/xmlquery/queryargument/validator/QueryArgumentValidator.class.php new file mode 100644 index 000000000..cfaeab5de --- /dev/null +++ b/classes/xml/xmlquery/queryargument/validator/QueryArgumentValidator.class.php @@ -0,0 +1,62 @@ +argument_name = $tag->attrs->var; + if(!$this->argument_name) $this->argument_name = $tag->attrs->name; + $this->default_value = $tag->attrs->default; + $this->notnull = $tag->attrs->notnull; + $this->filter = $tag->attrs->filter; + $this->min_length = $tag->attrs->min_length; + $this->max_length = $tag->attrs->max_length; + } + + function toString(){ + $validator = ''; + if(isset($this->default_value)){ + $this->default_value = new DefaultValue($this->argument_name, $this->default_value); + //$v = new DefaultCheck($this->argument_name, $this->default_value); + //$validator .= $v->toString(); + $validator .= sprintf("$%s_argument->ensureDefaultValue(%s);\n" + , $this->argument_name + , $this->default_value->toString() + ); + } + if($this->notnull){ + $validator .= sprintf("$%s_argument->checkNotNull();\n" + , $this->argument_name + ); + } + if($this->filter){ + $validator .= sprintf("$%s_argument->checkFilter(%s);\n" + , $this->argument_name + , $this->filter + ); + } + if($this->min_length){ + $validator .= sprintf("$%s_argument->checkMinLength(%s);\n" + , $this->argument_name + , $this->min_length + ); + } + if($this->max_length){ + $validator .= sprintf("$%s_argument->checkMaxLength(%s);\n" + , $this->argument_name + , $this->max_length + ); + } + return $validator; + } + } + +?> \ No newline at end of file diff --git a/classes/xml/xmlquery/queryargument/validator/Validator.class.php b/classes/xml/xmlquery/queryargument/validator/Validator.class.php new file mode 100644 index 000000000..6fb7426bc --- /dev/null +++ b/classes/xml/xmlquery/queryargument/validator/Validator.class.php @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/classes/xml/xmlquery/tags/condition/ConditionGroupTag.class.php b/classes/xml/xmlquery/tags/condition/ConditionGroupTag.class.php new file mode 100644 index 000000000..93de1dde9 --- /dev/null +++ b/classes/xml/xmlquery/tags/condition/ConditionGroupTag.class.php @@ -0,0 +1,52 @@ +dbParser = $dbParser; + $this->pipe = $pipe; + + if(!is_array($conditions)) $conditions = array($conditions); + if(count($conditions))require_once(_XE_PATH_.'classes/xml/xmlquery/tags/condition/ConditionTag.class.php'); + + foreach($conditions as $condition){ + $this->conditions[] = new ConditionTag($condition, $dbParser); + } + } + + function getConditions(){ + return $this->conditions; + } + + function getConditionGroupString(){ + $conditions_string = 'array('.PHP_EOL; + foreach($this->conditions as $condition) + $conditions_string .= $condition->getConditionString() . PHP_EOL . ','; + $conditions_string = substr($conditions_string, 0, -2);//remove ',' + $conditions_string .= ')'; + + return sprintf("new ConditionGroup(%s%s)", $conditions_string, $this->pipe ? ','.$this->pipe : ''); + } + + function getArguments(){ + $arguments = array(); + foreach($this->conditions as $condition){ + $arguments[] = $condition->getArgument(); + } + return $arguments; + } + + function getValidatorString(){ + $validator = ''; + foreach($this->conditions as $condition){ + $validator .= $condition->getValidatorString(); + } + return $validator; + } + + } +?> \ No newline at end of file diff --git a/classes/xml/xmlquery/tags/condition/ConditionTag.class.php b/classes/xml/xmlquery/tags/condition/ConditionTag.class.php new file mode 100644 index 000000000..a96a9a98d --- /dev/null +++ b/classes/xml/xmlquery/tags/condition/ConditionTag.class.php @@ -0,0 +1,49 @@ + tag inside an XML Query file. Base class. + * + */ + + class ConditionTag { + var $dbParser; + var $operation; + var $column_name; + + var $pipe; + var $argument_name; + var $argument; + var $default_column; + + function ConditionTag($condition, $dbParser){ + $this->dbParser = $dbParser; + $this->operation = $condition->attrs->operation; + $this->pipe = $condition->attrs->pipe; + $this->column_name = $this->dbParser->parseColumnName($condition->attrs->column); + // TODO fix this hack - should use default value for query argument + $this->argument_name = $condition->attrs->var; + $this->default_column = $this->dbParser->parseColumnName($condition->attrs->default); + require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/QueryArgument.class.php'); + $this->argument = new QueryArgument($condition); + } + + function getArgument(){ + return $this->argument; + } + + function getConditionString(){ + return sprintf("new Condition('%s',%s,%s%s)" + , $this->column_name + , $this->argument_name ? '$' . $this->argument_name . '_argument->getValue()' : "'" . $this->default_column . "'" + , '"'.$this->operation.'"' + , $this->pipe ? ", '" . $this->pipe . "'" : '' + ); + } + + function getValidatorString(){ + return $this->argument->getValidatorString(); + } + } +?> \ No newline at end of file diff --git a/classes/xml/xmlquery/tags/condition/ConditionsTag.class.php b/classes/xml/xmlquery/tags/condition/ConditionsTag.class.php new file mode 100644 index 000000000..864634131 --- /dev/null +++ b/classes/xml/xmlquery/tags/condition/ConditionsTag.class.php @@ -0,0 +1,51 @@ +dbParser = $dbParser; + $this->condition_groups = array(); + + $xml_condition_list = $xml_conditions->condition; + if($xml_condition_list){ + require_once(_XE_PATH_.'classes/xml/xmlquery/tags/condition/ConditionGroupTag.class.php'); + $this->condition_groups[] = new ConditionGroupTag($xml_condition_list, $this->dbParser); + } + + $xml_groups = $xml_conditions->group; + if($xml_groups){ + require_once(_XE_PATH_.'classes/xml/xmlquery/tags/condition/ConditionGroupTag.class.php'); + foreach($xml_groups as $group){ + $this->condition_groups[] = new ConditionGroupTag($group->condition, $this->dbParser, $group->pipe); + } + } + } + + function toString(){ + $output_conditions = 'array(' . PHP_EOL; + foreach($this->condition_groups as $condition){ + $output_conditions .= $condition->getConditionGroupString() . PHP_EOL . ','; + } + $output_conditions = substr($output_conditions, 0, -1); + $output_conditions .= ')'; + return $output_conditions; + } + + function getArguments(){ + $arguments = array(); + foreach($this->condition_groups as $condition){ + $arguments = array_merge($arguments, $condition->getArguments()); + } + return $arguments; + } + + function getValidatorString(){ + $validator = ''; + foreach($this->condition_groups as $condition){ + $validator .= $condition->getValidatorString(); + } + return $validator; + } + } +?> \ No newline at end of file diff --git a/classes/xml/xmlquery/tags/group/GroupsTag.class.php b/classes/xml/xmlquery/tags/group/GroupsTag.class.php new file mode 100644 index 000000000..266e9accb --- /dev/null +++ b/classes/xml/xmlquery/tags/group/GroupsTag.class.php @@ -0,0 +1,36 @@ +dbParser = $dbParser; + + $this->groups = array(); + + if($xml_groups) { + if(!is_array($xml_groups)) $xml_groups = array($xml_groups); + + for($i=0;$iattrs->column); + if(!$column) continue; + $column = $this->dbParser->parseExpression($column); + $this->groups[] = $column; + } + } + } + + function toString(){ + $output = 'array(' . PHP_EOL; + foreach($this->groups as $group){ + $output .= "'" . $group . "' ,"; + } + $output = substr($output, 0, -1); + $output .= ')'; + return $output; + } + } + +?> \ No newline at end of file diff --git a/classes/xml/xmlquery/tags/navigation/IndexTag.class.php b/classes/xml/xmlquery/tags/navigation/IndexTag.class.php new file mode 100644 index 000000000..afdfaa17c --- /dev/null +++ b/classes/xml/xmlquery/tags/navigation/IndexTag.class.php @@ -0,0 +1,49 @@ +dbParser = $dbParser; + $this->argument_name = $index->attrs->var; + $index->attrs->default = $this->dbParser->parseExpression($index->attrs->default); + $this->default = $index->attrs->default; + require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/QueryArgument.class.php'); + $this->argument = new QueryArgument($index); + $this->sort_order = $index->attrs->order; + if(!in_array($this->sort_order, array("asc", "desc"))){ + $arg->var = $this->sort_order; + $arg->default = '"asc"'; + $this->sort_order_argument = new QueryArgument($arg); + $this->sort_order = "\$args->".$this->sort_order; + } + //else $this->sort_order = '"'.$this->sort_order.'"'; + } + + function toString(){ + return sprintf("new OrderByColumn(\$%s_argument->getValue(), %s)", $this->argument_name, $this->sort_order); + } + + function getArguments(){ + $arguments = array(); + $arguments[] = $this->argument; + if($this->sort_order_argument) + $arguments[] = $this->sort_order_argument; + return $arguments; + } + + function getValidatorString(){ + $validator = $this->argument->getValidatorString(); + if($this->sort_order_argument) + $validator .= $this->sort_order_argument->getValidatorString(); + return $validator; + } + } + +?> \ No newline at end of file diff --git a/classes/xml/xmlquery/tags/navigation/NavigationTag.class.php b/classes/xml/xmlquery/tags/navigation/NavigationTag.class.php new file mode 100644 index 000000000..98824592b --- /dev/null +++ b/classes/xml/xmlquery/tags/navigation/NavigationTag.class.php @@ -0,0 +1,60 @@ +order = array(); + if($xml_navigation) { + $order = $xml_navigation->index; + if($order) { + if(!is_array($order)) $order = array($order); + foreach($order as $order_info) { + $this->order[] = new IndexTag($order_info, $dbParser); + } + } + + $list_count = $xml_navigation->list_count->attrs; + $this->list_count = $list_count; + + $page_count = $xml_navigation->page_count->attrs; + $this->page_count = $page_count; + + $page = $xml_navigation->page->attrs; + $this->page = $page ; + } + } + + function getOrderByString(){ + $output = 'array(' . PHP_EOL; + foreach($this->order as $order){ + $output .= $order->toString() . PHP_EOL . ','; + } + $output = substr($output, 0, -1); + $output .= ')'; + return $output; + } + + function getArguments(){ + $arguments = array(); + foreach($this->order as $order){ + $arguments = array_merge($order->getArguments(), $arguments); + } + return $arguments; + } + + function getValidatorString(){ + $validator = ''; + foreach ($this->order as $order){ + $validator .= $order->getValidatorString(); + } + return $validator; + } + } + +?> \ No newline at end of file diff --git a/classes/xml/xmlquery/tags/table/TableTag.class.php b/classes/xml/xmlquery/tags/table/TableTag.class.php new file mode 100644 index 000000000..4797df04c --- /dev/null +++ b/classes/xml/xmlquery/tags/table/TableTag.class.php @@ -0,0 +1,60 @@ + tag inside an XML Query file + * + */ + + class TableTag { + var $unescaped_name; + var $name; + var $alias; + var $join_type; + var $conditions; + + var $dbParser; + + function TableTag($table, $dbParser){ + $this->dbParser = $dbParser; + + $this->unescaped_name = $table->attrs->name; + $this->name = $this->dbParser->parseTableName($table->attrs->name); + $this->alias = $table->attrs->alias; + //if(!$this->alias) $this->alias = $alias; + + $this->join_type = $table->attrs->type; + $this->conditions = $table->conditions; + } + + function isJoinTable(){ + if(in_array($this->join_type,array('left join','left outer join','right join','right outer join')) + && count($this->conditions)) return true; + return false; + } + + function getTableAlias(){ + return $this->alias; + } + + function getTableName(){ + return $this->unescaped_name; + } + + function getTableString(){ + if($this->isJoinTable()){ + $conditionsTag = new ConditionsTag($this->conditions, $this->dbParser); + return sprintf('new JoinTable(\'%s\', \'%s\', "%s", %s)' + , $this->dbParser->escape($this->name) + , $this->dbParser->escape($this->alias) + , $this->join_type, $conditionsTag->toString()); + } + return sprintf('new Table(\'%s\'%s)' + , $this->dbParser->escape($this->name) + , $this->alias ? ', \'' . $this->dbParser->escape($this->alias) .'\'' : ''); + } + } + +?> \ No newline at end of file diff --git a/classes/xml/xmlquery/tags/table/TablesTag.class.php b/classes/xml/xmlquery/tags/table/TablesTag.class.php new file mode 100644 index 000000000..862cfd9ae --- /dev/null +++ b/classes/xml/xmlquery/tags/table/TablesTag.class.php @@ -0,0 +1,33 @@ +dbParser = $dbParser; + $this->tables = array(); + if(!is_array($xml_tables)) $xml_tables = array($xml_tables); + + if(count($xml_tables)) require_once(_XE_PATH_.'classes/xml/xmlquery/tags/table/TableTag.class.php'); + + foreach($xml_tables as $table){ + $this->tables[] = new TableTag($table, $this->dbParser); + } + } + + function getTables(){ + return $this->tables; + } + + function toString(){ + $output_tables = 'array(' . PHP_EOL; + foreach($this->tables as $table){ + $output_tables .= $table->getTableString() . PHP_EOL . ','; + } + $output_tables = substr($output_tables, 0, -1); + $output_tables .= ')'; + return $output_tables; + } + } +?> \ No newline at end of file From 2a35558b4e429210fc366ff78938bc5249b1aeee Mon Sep 17 00:00:00 2001 From: mosmartin Date: Thu, 19 May 2011 13:17:46 +0000 Subject: [PATCH 0080/1372] Update new xml query classes with xe 1.5 with improved query argument support and update and delete queries git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0-DB@8379 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- .../xmlquery/tags/column/ColumnTag.class.php | 21 +++++++ .../tags/column/DeleteColumnTag.class.php | 43 +++++++++++++ .../tags/column/DeleteColumnsTag.class.php | 58 ++++++++++++++++++ .../tags/column/InsertColumnTag.class.php | 45 ++++++++++++++ .../tags/column/InsertColumnsTag.class.php | 58 ++++++++++++++++++ .../tags/column/SelectColumnTag.class.php | 31 ++++++++++ .../tags/column/SelectColumnsTag.class.php | 45 ++++++++++++++ .../tags/column/UpdateColumnTag.class.php | 46 ++++++++++++++ .../tags/column/UpdateColumnsTag.class.php | 61 +++++++++++++++++++ 9 files changed, 408 insertions(+) create mode 100644 classes/xml/xmlquery/tags/column/ColumnTag.class.php create mode 100644 classes/xml/xmlquery/tags/column/DeleteColumnTag.class.php create mode 100644 classes/xml/xmlquery/tags/column/DeleteColumnsTag.class.php create mode 100644 classes/xml/xmlquery/tags/column/InsertColumnTag.class.php create mode 100644 classes/xml/xmlquery/tags/column/InsertColumnsTag.class.php create mode 100644 classes/xml/xmlquery/tags/column/SelectColumnTag.class.php create mode 100644 classes/xml/xmlquery/tags/column/SelectColumnsTag.class.php create mode 100644 classes/xml/xmlquery/tags/column/UpdateColumnTag.class.php create mode 100644 classes/xml/xmlquery/tags/column/UpdateColumnsTag.class.php diff --git a/classes/xml/xmlquery/tags/column/ColumnTag.class.php b/classes/xml/xmlquery/tags/column/ColumnTag.class.php new file mode 100644 index 000000000..7cf066013 --- /dev/null +++ b/classes/xml/xmlquery/tags/column/ColumnTag.class.php @@ -0,0 +1,21 @@ + tag inside an XML Query file + * + * Since the tag supports different attributes depending on + * the type of query (select, update, insert, delete) this is only + * the base class for the classes that will model each type tag. + * + **/ + + class ColumnTag { + var $name; + var $dbParser; + + function ColumnTag($name, $dbParser){ + $this->dbParser = $dbParser; + $this->name = $name; + } + } \ No newline at end of file diff --git a/classes/xml/xmlquery/tags/column/DeleteColumnTag.class.php b/classes/xml/xmlquery/tags/column/DeleteColumnTag.class.php new file mode 100644 index 000000000..0c2b1b6db --- /dev/null +++ b/classes/xml/xmlquery/tags/column/DeleteColumnTag.class.php @@ -0,0 +1,43 @@ + tag inside an XML Query file whose action is 'delete' + * + **/ + + + class DeleteColumnTag extends ColumnTag { + var $argument; + + function DeleteColumnTag($column, $dbParser) { + parent::ColumnTag($column->attrs->name, $dbParser); + $this->name = $this->dbParser->parseColumnName($this->name); + require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/QueryArgument.class.php'); + $this->argument = new QueryArgument($column); + } + function toString(){ + $output_columns = 'array(' . PHP_EOL; + foreach($this->argument as $argument){ + $output_columns .= $argument->getExpressionString() . PHP_EOL . ','; + } + $output_columns = substr($output_columns, 0, -1); + $output_columns .= ')'; + return $output_columns; + } + function getExpressionString(){ + return sprintf('new DeleteExpression(\'%s\', $args->%s)' + , $this->name + , $this->argument->argument_name); + } + + function getArgument(){ + return $this->argument; + } + + function getValidatorString(){ + return $this->argument->getValidatorString(); + } + + } +?> \ No newline at end of file diff --git a/classes/xml/xmlquery/tags/column/DeleteColumnsTag.class.php b/classes/xml/xmlquery/tags/column/DeleteColumnsTag.class.php new file mode 100644 index 000000000..b242d7ca0 --- /dev/null +++ b/classes/xml/xmlquery/tags/column/DeleteColumnsTag.class.php @@ -0,0 +1,58 @@ + tag inside an XML Query file whose action is 'delete' + * + **/ + + require_once(_XE_PATH_.'classes/xml/xmlquery/tags/column/ColumnTag.class.php'); + require_once(_XE_PATH_.'classes/xml/xmlquery/tags/column/DeleteColumnTag.class.php'); + + class DeleteColumnsTag{ + var $dbParser; + var $columns; + + function DeleteColumnsTag($xml_columns, $dbParser) { + $this->dbParser = $dbParser; + + $this->columns = array(); + + if(!$xml_columns) + return; + + if(!is_array($xml_columns)) $xml_columns = array($xml_columns); + + foreach($xml_columns as $column){ + $this->columns[] = new DeleteColumnTag($column, $this->dbParser); + } + } + function toString(){ + $output_columns = 'array(' . PHP_EOL; + foreach($this->columns as $column){ + $output_columns .= $column->getExpressionString() . PHP_EOL . ','; + } + $output_columns = substr($output_columns, 0, -1); + $output_columns .= ')'; + return $output_columns; + } + + function getArguments(){ + $arguments = array(); + foreach($this->columns as $column){ + $arguments[] = $column->getArgument(); + } + return $arguments; + } + + function getValidatorString(){ + $validator = ''; + foreach($this->columns as $column){ + $validator .= $column->getValidatorString(); + } + return $validator; + } + + } + +?> \ No newline at end of file diff --git a/classes/xml/xmlquery/tags/column/InsertColumnTag.class.php b/classes/xml/xmlquery/tags/column/InsertColumnTag.class.php new file mode 100644 index 000000000..9dfba9247 --- /dev/null +++ b/classes/xml/xmlquery/tags/column/InsertColumnTag.class.php @@ -0,0 +1,45 @@ + tag inside an XML Query file whose action is 'insert' + * + **/ + + + class InsertColumnTag extends ColumnTag { + var $argument; + + function InsertColumnTag($column, $dbParser) { + parent::ColumnTag($column->attrs->name, $dbParser); + $this->name = $this->dbParser->parseColumnName($this->name); + require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/QueryArgument.class.php'); + $this->argument = new QueryArgument($column); + } + + function toString(){ + $output_columns = 'array(' . PHP_EOL; + foreach($this->argument as $argument){ + $output_columns .= $argument->getExpressionString() . PHP_EOL . ','; + } + $output_columns = substr($output_columns, 0, -1); + $output_columns .= ')'; + return $output_columns; + } + + function getExpressionString(){ + return sprintf('new InsertExpression(\'%s\', $%s_argument->getValue())' + , $this->name + , $this->argument->argument_name); + } + + function getArgument(){ + return $this->argument; + } + + function getValidatorString(){ + return $this->argument->getValidatorString(); + } + + } +?> \ No newline at end of file diff --git a/classes/xml/xmlquery/tags/column/InsertColumnsTag.class.php b/classes/xml/xmlquery/tags/column/InsertColumnsTag.class.php new file mode 100644 index 000000000..086cbba2d --- /dev/null +++ b/classes/xml/xmlquery/tags/column/InsertColumnsTag.class.php @@ -0,0 +1,58 @@ + tag inside an XML Query file whose action is 'insert' + * + **/ + + require_once(_XE_PATH_.'classes/xml/xmlquery/tags/column/ColumnTag.class.php'); + require_once(_XE_PATH_.'classes/xml/xmlquery/tags/column/InsertColumnTag.class.php'); + + class InsertColumnsTag{ + var $dbParser; + var $columns; + + function InsertColumnsTag($xml_columns, $dbParser) { + $this->dbParser = $dbParser; + + $this->columns = array(); + + if(!$xml_columns) + return; + + if(!is_array($xml_columns)) $xml_columns = array($xml_columns); + + foreach($xml_columns as $column){ + $this->columns[] = new InsertColumnTag($column, $this->dbParser); + } + } + function toString(){ + $output_columns = 'array(' . PHP_EOL; + foreach($this->columns as $column){ + $output_columns .= $column->getExpressionString() . PHP_EOL . ','; + } + $output_columns = substr($output_columns, 0, -1); + $output_columns .= ')'; + return $output_columns; + } + + function getArguments(){ + $arguments = array(); + foreach($this->columns as $column){ + $arguments[] = $column->getArgument(); + } + return $arguments; + } + + function getValidatorString(){ + $validator = ''; + foreach($this->columns as $column){ + $validator .= $column->getValidatorString(); + } + return $validator; + } + + } + +?> \ No newline at end of file diff --git a/classes/xml/xmlquery/tags/column/SelectColumnTag.class.php b/classes/xml/xmlquery/tags/column/SelectColumnTag.class.php new file mode 100644 index 000000000..ca7a40eff --- /dev/null +++ b/classes/xml/xmlquery/tags/column/SelectColumnTag.class.php @@ -0,0 +1,31 @@ + tag inside an XML Query file whose action is 'select' + * + **/ + + class SelectColumnTag extends ColumnTag{ + var $alias; + var $click_count; + + function SelectColumnTag($column, $dbParser){ + parent::ColumnTag($column->attrs->name, $dbParser); + if(!$this->name) $this->name = "*"; + if($this->name != "*") + $this->name = $this->dbParser->parseExpression($this->name); + + $this->alias = $column->attrs->alias; + $this->click_count = $column->attrs->click_count; + } + + function getExpressionString(){ + if($this->name == '*') return "new StarExpression()"; + if($this->click_count) + return sprintf('new ClickCountExpression(%s, %s, $args->%s)', $this->name, $this->alias,$this->click_count); + return sprintf('new SelectExpression(\'%s\'%s)', $this->name, $this->alias ? ', \''.$this->dbParser->escape($this->alias) .'\'': ''); + } + } +?> \ No newline at end of file diff --git a/classes/xml/xmlquery/tags/column/SelectColumnsTag.class.php b/classes/xml/xmlquery/tags/column/SelectColumnsTag.class.php new file mode 100644 index 000000000..15102f130 --- /dev/null +++ b/classes/xml/xmlquery/tags/column/SelectColumnsTag.class.php @@ -0,0 +1,45 @@ +dbParser = $dbParser; + + $this->columns = array(); + + if(!$xml_columns) { + $this->columns[] = new SelectColumnTag("*", $this->dbParser); + return; + } + + if(!is_array($xml_columns)) $xml_columns = array($xml_columns); + + foreach($xml_columns as $column){ + $this->columns[] = new SelectColumnTag($column, $this->dbParser); + } + } + + function toString(){ + $output_columns = 'array(' . PHP_EOL; + foreach($this->columns as $column){ + $output_columns .= $column->getExpressionString() . PHP_EOL . ','; + } + $output_columns = substr($output_columns, 0, -1); + $output_columns .= ')'; + return $output_columns; + } + + function getArguments(){ + return array(); + } + + function getValidatorString(){ + return ''; + } + } +?> diff --git a/classes/xml/xmlquery/tags/column/UpdateColumnTag.class.php b/classes/xml/xmlquery/tags/column/UpdateColumnTag.class.php new file mode 100644 index 000000000..d41905e59 --- /dev/null +++ b/classes/xml/xmlquery/tags/column/UpdateColumnTag.class.php @@ -0,0 +1,46 @@ + tag inside an XML Query file whose action is 'update' + * + **/ + + + + class UpdateColumnTag extends ColumnTag { + var $argument; + + function UpdateColumnTag($column, $dbParser) { + parent::ColumnTag($column->attrs->name, $dbParser); + $this->name = $this->dbParser->parseColumnName($this->name); + require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/QueryArgument.class.php'); + $this->argument = new QueryArgument($column); + } + + function toString(){ + $output_columns = 'array(' . PHP_EOL; + foreach($this->argument as $argument){ + $output_columns .= $argument->getExpressionString() . PHP_EOL . ','; + } + $output_columns = substr($output_columns, 0, -1); + $output_columns .= ')'; + return $output_columns; + } + function getExpressionString(){ + return sprintf('new UpdateExpression(\'%s\', $%s_argument->getValue())' + , $this->name + , $this->argument->argument_name); + } + + function getArgument(){ + return $this->argument; + } + + function getValidatorString(){ + return $this->argument->getValidatorString(); + } + } + +?> \ No newline at end of file diff --git a/classes/xml/xmlquery/tags/column/UpdateColumnsTag.class.php b/classes/xml/xmlquery/tags/column/UpdateColumnsTag.class.php new file mode 100644 index 000000000..2f1feba0f --- /dev/null +++ b/classes/xml/xmlquery/tags/column/UpdateColumnsTag.class.php @@ -0,0 +1,61 @@ + tag inside an XML Query file whose action is 'update' + * + **/ + + require_once(_XE_PATH_.'classes/xml/xmlquery/tags/column/ColumnTag.class.php'); + require_once(_XE_PATH_.'classes/xml/xmlquery/tags/column/UpdateColumnTag.class.php'); + + class UpdateColumnsTag{ + var $dbParser; + var $columns; + + function UpdateColumnsTag($xml_columns, $dbParser) { + $this->dbParser = $dbParser; + + $this->columns = array(); + + if(!$xml_columns) { + $this->columns[] = new UpdateColumnTag("*", $this->dbParser); + return; + } + + if(!is_array($xml_columns)) $xml_columns = array($xml_columns); + + foreach($xml_columns as $column){ + $this->columns[] = new UpdateColumnTag($column, $this->dbParser); + } + } + + function toString(){ + $output_columns = 'array(' . PHP_EOL; + foreach($this->columns as $column){ + $output_columns .= $column->getExpressionString() . PHP_EOL . ','; + } + $output_columns = substr($output_columns, 0, -1); + $output_columns .= ')'; + return $output_columns; + } + + function getArguments(){ + $arguments = array(); + foreach($this->columns as $column){ + $arguments[] = $column->getArgument(); + } + return $arguments; + } + + function getValidatorString(){ + $validator = ''; + foreach($this->columns as $column){ + $validator .= $column->getValidatorString(); + } + return $validator; + } + } + +?> \ No newline at end of file From 7fe8000d0f8b3826a65936315272fe63ee0524cb Mon Sep 17 00:00:00 2001 From: mosmartin Date: Thu, 19 May 2011 13:39:38 +0000 Subject: [PATCH 0081/1372] Fix for XmlQueryParser. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0-DB@8380 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/xml/XmlQueryParser.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/classes/xml/XmlQueryParser.class.php b/classes/xml/XmlQueryParser.class.php index 6c7192bf1..fde5ade4d 100644 --- a/classes/xml/XmlQueryParser.class.php +++ b/classes/xml/XmlQueryParser.class.php @@ -12,7 +12,7 @@ require_once(_XE_PATH_.'classes/xml/xmlquery/DBParser.class.php'); require_once(_XE_PATH_.'classes/xml/xmlquery/QueryParser.class.php'); - class NewXmlQueryParser extends XmlParser { + class XmlQueryParser extends XmlParser { var $dbParser; function parse($query_id, $xml_file, $cache_file) { @@ -25,7 +25,7 @@ //$oDB = &DB::getParser(); //$dbParser = $oDB->getParser(); - $dbParser = getDBParser(); + $dbParser = $this->getDBParser(); $parser = new QueryParser($xml_obj->query, $dbParser); FileHandler::writeFile($cache_file, $parser->toString()); From 6e11747960035fd7b7b3f1824452d0fe4ff4de64 Mon Sep 17 00:00:00 2001 From: mosmartin Date: Thu, 19 May 2011 14:31:05 +0000 Subject: [PATCH 0082/1372] add support for insert select update and delete queries in CUBRID class git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0-DB@8381 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/db/DBCubrid.class.php | 229 ++++++++++++---------------------- 1 file changed, 82 insertions(+), 147 deletions(-) diff --git a/classes/db/DBCubrid.class.php b/classes/db/DBCubrid.class.php index 171bf6a47..10b96ca97 100644 --- a/classes/db/DBCubrid.class.php +++ b/classes/db/DBCubrid.class.php @@ -654,156 +654,106 @@ **/ function _executeInsertAct ($output) { - // tables - foreach ($output->tables as $val) { - $table_list[] = '"'.$this->prefix.$val.'"'; - } - - // columns - foreach ($output->columns as $key => $val) { - $name = $val['name']; - $value = $val['value']; - //if ($this->getColumnType ($output->column_type, $name) != 'number') - if ($output->column_type[$name] != 'number') { - if (!is_null($value)) { - $value = "'" . $this->addQuotes($value) ."'"; - } - else { - if ($val['notnull']=='notnull') { - $value = "''"; - } - else { - //$value = 'null'; - $value = "''"; - } - } + $query = ''; + + $tableName = $output->tables[0]->getName(); + + $columnsList = ''; + $valuesList = ''; + foreach($output->columns as $column){ + if($column->show()){ + $columnsList .= $column->getColumnName() . ', '; + $valuesList .= $column->getValue() . ', '; } - else $this->_filterNumber(&$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 .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; + $columnsList = substr($columnsList, 0, -2); + $valuesList = substr($valuesList, 0, -2); + + // TODO Make sure column values are escaped. Preferably directly from the cache file and not in here + $query = "INSERT INTO $tableName ($columnsList) VALUES ($valuesList)"; + + return $query; + /*$query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; $result = $this->_query ($query); if ($result && !$this->transaction_started) { @cubrid_commit ($this->fd); } return $result; - } + */ + } - /** - * @brief handles updateAct - **/ function _executeUpdateAct ($output) { - // tables - foreach ($output->tables as $key => $val) { - $table_list[] = '"'.$this->prefix.$val.'" as "'.$key.'"'; - } - - $check_click_count = true; - - // columns - foreach ($output->columns as $key => $val) { - if (!isset ($val['value'])) continue; - $name = $val['name']; - $value = $val['value']; - - if (substr ($value, -2) != '+1' || $output->column_type[$name] != 'number') { - $check_click_count = false; - } - - for ($i = 0; $i < $key; $i++) { - // not allows to define the same property repeatedly in a single query in CUBRID - if ($output->columns[$i]['name'] == $name) break; - } - if ($i < $key) continue; // ignore the rest of properties if duplicated property found - - if (strpos ($name, '.') !== false && strpos ($value, '.') !== false) { - $column_list[] = $name.' = '.$value; - } - else { - if ($output->column_type[$name] != 'number') { - $check_column = false; - $value = "'".$this->addQuotes ($value)."'"; - } - else $this->_filterNumber(&$value); - - $column_list[] = sprintf ("\"%s\" = %s", $name, $value); + $query = ''; + + $tableName = $output->tables[0]->getName(); + + $columnsList = ''; + $valuesList = ''; + foreach($output->columns as $column){ + if($column->show()){ + $columnsList .= $column->getColumnName() . ', '; + $valuesList .= $column->getValue() . ', '; } } - - // conditional clause - $condition = $this->getCondition ($output); - - $check_click_count_condition = false; - if ($check_click_count) { - foreach ($output->conditions as $val) { - if ($val['pipe'] == 'or') { - $check_click_count_condition = false; - break; - } - - foreach ($val['condition'] as $v) { - if ($v['operation'] == 'equal') { - $check_click_count_condition = true; - } - else { - if ($v['operation'] == 'in' && !strpos ($v['value'], ',')) { - $check_click_count_condition = true; - } - else { - $check_click_count_condition = false; - } - } - - if ($v['pipe'] == 'or') { - $check_click_count_condition = false; - break; - } - } - } - } - - if ($check_click_count&& $check_click_count_condition && count ($output->tables) == 1 && count ($output->conditions) > 0 && count ($output->groups) == 0 && count ($output->order) == 0) { - foreach ($output->columns as $v) { - $incr_columns[] = 'incr("'.$v['name'].'")'; - } - - $query = sprintf ('select %s from %s %s', join (',', $incr_columns), implode(',', $table_list), $condition); - } - else { - $query = sprintf ("update %s set %s %s", implode (',', $table_list), implode (',', $column_list), $condition); - } - + $columnsList = substr($columnsList, 0, -2); + $valuesList = substr($valuesList, 0, -2); + + // TODO Make sure column values are escaped. Preferably directly from the cache file and not in here + $query = "UPDATE INTO $tableName ($columnsList) VALUES ($valuesList)"; + + return $query; + /*$query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; $result = $this->_query ($query); - if ($result && !$this->transaction_started) @cubrid_commit ($this->fd); + if ($result && !$this->transaction_started) { + @cubrid_commit ($this->fd); + } return $result; - } + */ + } /** * @brief handles deleteAct **/ - function _executeDeleteAct ($output) - { - // tables - foreach ($output->tables as $val) { - $table_list[] = '"'.$this->prefix.$val.'"'; + function _executeDeleteAct($output){ + $query = ''; + + $select = 'DELETE '; + + $from = 'FROM '; + $simple_table_count = 0; + foreach($output->tables as $table){ + if($simple_table_count > 0) $from .= ', '; + $from .= $table->toString() . ' '; + if(!$table->isJoinTable()) $simple_table_count++; } - - // Conditional clauses - $condition = $this->getCondition ($output); - - $query = sprintf ("delete from %s %s", implode (',',$table_list), $condition); - $result = $this->_query ($query); - if ($result && !$this->transaction_started) @cubrid_commit ($this->fd); - - return $result; + + $where = ''; + if(count($output->conditions) > 0){ + $where = 'WHERE '; + foreach($output->conditions as $conditionGroup){ + $where .= $conditionGroup->toString(); + } + } + /* + $groupBy = ''; + if($output->groups) if($output->groups[0] !== "") + $groupBy = 'GROUP BY ' . implode(', ', $output->groups); + + $orderBy = ''; + if(count($output->orderby) > 0){ + $orderBy = 'ORDER BY '; + foreach($output->orderby as $order){ + $orderBy .= $order->toString() .', '; + } + $orderBy = substr($orderBy, 0, -2); + } + */ + + $query = $select . ' ' . $from . ' ' . $where . ' ' . $groupBy . ' ' . $orderBy; + return $query; } /** @@ -825,14 +775,9 @@ $from = 'FROM '; $simple_table_count = 0; foreach($output->tables as $table){ - /*if($simple_table_count > 0) $from .= ', '; - + if($simple_table_count > 0) $from .= ', '; $from .= $table->toString() . ' '; if(!$table->isJoinTable()) $simple_table_count++; - */ - if($table->isJoinTable() || !$simple_table_count) $from .= $table->toString() . ' '; - else $from .= ', '.$table->toString() . ' '; - $simple_table_count++; } $where = ''; @@ -858,18 +803,8 @@ $query = $select . ' ' . $from . ' ' . $where . ' ' . $groupBy . ' ' . $orderBy; - - //$query = sprintf ("select %s from %s %s %s %s", $columns, implode (',',$table_list), implode (' ',$left_join), $condition, //$groupby_query.$orderby_query); - //$query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; - $result = $this->_query ($query); - if ($this->isError ()) return; - $data = $this->_fetch ($result); - - $buff = new Object (); - $buff->data = $data; - - return $buff; - } + return $query; + } /*function _executeSelectAct ($output) { // tables From 9a2c0a8ff9398ab424923b23511aa252fd92ed2d Mon Sep 17 00:00:00 2001 From: mosmartin Date: Thu, 19 May 2011 14:46:11 +0000 Subject: [PATCH 0083/1372] fixed an issue when Argument class is required git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0-DB@8382 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/db/DB.class.php | 1 + 1 file changed, 1 insertion(+) diff --git a/classes/db/DB.class.php b/classes/db/DB.class.php index 2d1f9dd27..f49e8710b 100644 --- a/classes/db/DB.class.php +++ b/classes/db/DB.class.php @@ -315,6 +315,7 @@ if($source_args) $args = @clone($source_args); require_once(_XE_PATH_.'classes/xml/xmlquery/DBParser.class.php'); + require_once(_XE_PATH_.'classes/xml/xmlquery/argument/Argument.class.php'); require_once(_XE_PATH_.'classes/db/queryparts/expression/Expression.class.php'); require_once(_XE_PATH_.'classes/db/queryparts/expression/SelectExpression.class.php'); require_once(_XE_PATH_.'classes/db/queryparts/expression/InsertExpression.class.php'); From 0f61e5d499deb6191f0a5a56be4c0192d9da07d7 Mon Sep 17 00:00:00 2001 From: mosmartin Date: Thu, 19 May 2011 15:31:47 +0000 Subject: [PATCH 0084/1372] Included some missing classes. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0-DB@8383 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/db/DB.class.php | 5 +- classes/db/DBCubrid.class.php | 85 ++++++++++--------- classes/xml/XmlQueryParser.class.php | 2 +- .../queryargument/DefaultValue.class.php | 1 + .../QueryArgumentValidator.class.php | 2 - .../tags/navigation/IndexTag.class.php | 4 +- config/config.inc.php | 2 +- modules/member/queries/getAutologin.xml | 2 +- 8 files changed, 55 insertions(+), 48 deletions(-) diff --git a/classes/db/DB.class.php b/classes/db/DB.class.php index f49e8710b..71dc76e34 100644 --- a/classes/db/DB.class.php +++ b/classes/db/DB.class.php @@ -319,13 +319,16 @@ require_once(_XE_PATH_.'classes/db/queryparts/expression/Expression.class.php'); require_once(_XE_PATH_.'classes/db/queryparts/expression/SelectExpression.class.php'); require_once(_XE_PATH_.'classes/db/queryparts/expression/InsertExpression.class.php'); + require_once(_XE_PATH_.'classes/db/queryparts/expression/UpdateExpression.class.php'); require_once(_XE_PATH_.'classes/db/queryparts/table/Table.class.php'); require_once(_XE_PATH_.'classes/db/queryparts/table/JoinTable.class.php'); require_once(_XE_PATH_.'classes/db/queryparts/condition/ConditionGroup.class.php'); require_once(_XE_PATH_.'classes/db/queryparts/condition/Condition.class.php'); require_once(_XE_PATH_.'classes/db/queryparts/expression/StarExpression.class.php'); + require_once(_XE_PATH_.'classes/db/queryparts/order/OrderByColumn.class.php'); - $output = @include($cache_file); + + $output = include($cache_file); if( (is_a($output, 'Object') || is_subclass_of($output, 'Object')) && !$output->toBool()) return $output; $output->_tables = ($output->_tables && is_array($output->_tables)) ? $output->_tables : array(); diff --git a/classes/db/DBCubrid.class.php b/classes/db/DBCubrid.class.php index 10b96ca97..1df9d207e 100644 --- a/classes/db/DBCubrid.class.php +++ b/classes/db/DBCubrid.class.php @@ -669,20 +669,20 @@ $columnsList = substr($columnsList, 0, -2); $valuesList = substr($valuesList, 0, -2); - // TODO Make sure column values are escaped. Preferably directly from the cache file and not in here - $query = "INSERT INTO $tableName ($columnsList) VALUES ($valuesList)"; - - return $query; - /*$query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; + $query = "INSERT INTO $tableName \n ($columnsList) \n VALUES ($valuesList)"; + + $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; $result = $this->_query ($query); if ($result && !$this->transaction_started) { @cubrid_commit ($this->fd); } return $result; - */ - } + } + /** + * @brief handles updateAct + **/ function _executeUpdateAct ($output) { $query = ''; @@ -690,34 +690,35 @@ $tableName = $output->tables[0]->getName(); $columnsList = ''; - $valuesList = ''; foreach($output->columns as $column){ if($column->show()){ - $columnsList .= $column->getColumnName() . ', '; - $valuesList .= $column->getValue() . ', '; + $columnsList .= $column->getExpression() . ', '; } } $columnsList = substr($columnsList, 0, -2); - $valuesList = substr($valuesList, 0, -2); + + $where = ''; + if(count($output->conditions) > 0){ + $where = 'WHERE '; + foreach($output->conditions as $conditionGroup){ + $where .= $conditionGroup->toString(); + } + } - // TODO Make sure column values are escaped. Preferably directly from the cache file and not in here - $query = "UPDATE INTO $tableName ($columnsList) VALUES ($valuesList)"; - - return $query; - /*$query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; + $query = "UPDATE $tableName SET $columnsList ".$where; + + $result = $this->_query ($query); - if ($result && !$this->transaction_started) { - @cubrid_commit ($this->fd); - } + if ($result && !$this->transaction_started) @cubrid_commit ($this->fd); return $result; - */ - } + } /** * @brief handles deleteAct **/ - function _executeDeleteAct($output){ + function _executeDeleteAct ($output) + { $query = ''; $select = 'DELETE '; @@ -737,23 +738,12 @@ $where .= $conditionGroup->toString(); } } - /* - $groupBy = ''; - if($output->groups) if($output->groups[0] !== "") - $groupBy = 'GROUP BY ' . implode(', ', $output->groups); - - $orderBy = ''; - if(count($output->orderby) > 0){ - $orderBy = 'ORDER BY '; - foreach($output->orderby as $order){ - $orderBy .= $order->toString() .', '; - } - $orderBy = substr($orderBy, 0, -2); - } - */ $query = $select . ' ' . $from . ' ' . $where . ' ' . $groupBy . ' ' . $orderBy; - return $query; + $result = $this->_query ($query); + if ($result && !$this->transaction_started) @cubrid_commit ($this->fd); + + return $result; } /** @@ -775,9 +765,14 @@ $from = 'FROM '; $simple_table_count = 0; foreach($output->tables as $table){ - if($simple_table_count > 0) $from .= ', '; + /*if($simple_table_count > 0) $from .= ', '; + $from .= $table->toString() . ' '; if(!$table->isJoinTable()) $simple_table_count++; + */ + if($table->isJoinTable() || !$simple_table_count) $from .= $table->toString() . ' '; + else $from .= ', '.$table->toString() . ' '; + $simple_table_count++; } $where = ''; @@ -803,8 +798,18 @@ $query = $select . ' ' . $from . ' ' . $where . ' ' . $groupBy . ' ' . $orderBy; - return $query; - } + + //$query = sprintf ("select %s from %s %s %s %s", $columns, implode (',',$table_list), implode (' ',$left_join), $condition, //$groupby_query.$orderby_query); + //$query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; + $result = $this->_query ($query); + if ($this->isError ()) return; + $data = $this->_fetch ($result); + + $buff = new Object (); + $buff->data = $data; + + return $buff; + } /*function _executeSelectAct ($output) { // tables diff --git a/classes/xml/XmlQueryParser.class.php b/classes/xml/XmlQueryParser.class.php index fde5ade4d..8e1595056 100644 --- a/classes/xml/XmlQueryParser.class.php +++ b/classes/xml/XmlQueryParser.class.php @@ -36,7 +36,7 @@ if(!$this->dbParser){ //$oDB = &DB::getParser(); //$dbParser = $oDB->getParser(); - $this->dbParser = new DBParser('`'); + $this->dbParser = new DBParser('"'); } return $this->dbParser; } diff --git a/classes/xml/xmlquery/queryargument/DefaultValue.class.php b/classes/xml/xmlquery/queryargument/DefaultValue.class.php index 33f5776d3..060261b65 100644 --- a/classes/xml/xmlquery/queryargument/DefaultValue.class.php +++ b/classes/xml/xmlquery/queryargument/DefaultValue.class.php @@ -19,6 +19,7 @@ if(!isset($this->value)) return; $str_pos = strpos($this->value, '('); + // TODO Replace this with parseExpression if($str_pos===false) return '"'.$this->value.'"'; $func_name = substr($this->value, 0, $str_pos); diff --git a/classes/xml/xmlquery/queryargument/validator/QueryArgumentValidator.class.php b/classes/xml/xmlquery/queryargument/validator/QueryArgumentValidator.class.php index cfaeab5de..371dd33c3 100644 --- a/classes/xml/xmlquery/queryargument/validator/QueryArgumentValidator.class.php +++ b/classes/xml/xmlquery/queryargument/validator/QueryArgumentValidator.class.php @@ -25,8 +25,6 @@ $validator = ''; if(isset($this->default_value)){ $this->default_value = new DefaultValue($this->argument_name, $this->default_value); - //$v = new DefaultCheck($this->argument_name, $this->default_value); - //$validator .= $v->toString(); $validator .= sprintf("$%s_argument->ensureDefaultValue(%s);\n" , $this->argument_name , $this->default_value->toString() diff --git a/classes/xml/xmlquery/tags/navigation/IndexTag.class.php b/classes/xml/xmlquery/tags/navigation/IndexTag.class.php index afdfaa17c..cbe726b99 100644 --- a/classes/xml/xmlquery/tags/navigation/IndexTag.class.php +++ b/classes/xml/xmlquery/tags/navigation/IndexTag.class.php @@ -12,7 +12,7 @@ function IndexTag($index, $dbParser){ $this->dbParser = $dbParser; $this->argument_name = $index->attrs->var; - $index->attrs->default = $this->dbParser->parseExpression($index->attrs->default); + //$index->attrs->default = $this->dbParser->parseExpression($index->attrs->default); $this->default = $index->attrs->default; require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/QueryArgument.class.php'); $this->argument = new QueryArgument($index); @@ -23,7 +23,7 @@ $this->sort_order_argument = new QueryArgument($arg); $this->sort_order = "\$args->".$this->sort_order; } - //else $this->sort_order = '"'.$this->sort_order.'"'; + else $this->sort_order = '"'.$this->sort_order.'"'; } function toString(){ diff --git a/config/config.inc.php b/config/config.inc.php index 91ebb2fa1..24636abac 100644 --- a/config/config.inc.php +++ b/config/config.inc.php @@ -97,7 +97,7 @@ * 1: Enabled * Only particular servers may have a problem in IE browser when sending a compression **/ - if(!defined('__OB_GZHANDLER_ENABLE__')) define('__OB_GZHANDLER_ENABLE__', 1); + if(!defined('__OB_GZHANDLER_ENABLE__')) define('__OB_GZHANDLER_ENABLE__', 0); /** * @brief decide to use/not use the php unit test (Path/tests/index.php) diff --git a/modules/member/queries/getAutologin.xml b/modules/member/queries/getAutologin.xml index eef12f490..73065636b 100644 --- a/modules/member/queries/getAutologin.xml +++ b/modules/member/queries/getAutologin.xml @@ -10,6 +10,6 @@ - + From 520300fad11f48dea7ece6120ccd8a65ab9cc163 Mon Sep 17 00:00:00 2001 From: mosmartin Date: Fri, 20 May 2011 09:25:59 +0000 Subject: [PATCH 0085/1372] Updated WHERE clause to ignore expressions when the argument value is not set. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0-DB@8386 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/db/DBMysql.class.php | 2 +- .../queryparts/condition/Condition.class.php | 21 +++++++++++-------- .../condition/ConditionGroup.class.php | 3 ++- classes/xml/xmlquery/QueryParser.class.php | 1 - .../xml/xmlquery/argument/Argument.class.php | 2 ++ .../tags/condition/ConditionsTag.class.php | 1 + 6 files changed, 18 insertions(+), 12 deletions(-) diff --git a/classes/db/DBMysql.class.php b/classes/db/DBMysql.class.php index 59501f161..6ee269ba5 100644 --- a/classes/db/DBMysql.class.php +++ b/classes/db/DBMysql.class.php @@ -666,7 +666,7 @@ /** * @brief Paging is handled if navigation information exists in the query xml * - * It is quite convenient although its structure is not good at all .. -_-; + * It is quite convenient although its structure is not good at all .. -_-; **/ function _getNavigationData($table_list, $columns, $left_join, $index_hint, $condition, $output) { require_once(_XE_PATH_.'classes/page/PageHandler.class.php'); diff --git a/classes/db/queryparts/condition/Condition.class.php b/classes/db/queryparts/condition/Condition.class.php index ea8657b71..4db069e72 100644 --- a/classes/db/queryparts/condition/Condition.class.php +++ b/classes/db/queryparts/condition/Condition.class.php @@ -17,8 +17,8 @@ return $this->pipe . ' ' . $this->getConditionPart($this->column_name, $this->value, $this->operation); } - function getConditionPart($name, $value, $operation) { - switch($operation) { + function show(){ + switch($this->operation) { case 'equal' : case 'more' : case 'excess' : @@ -31,16 +31,19 @@ case 'notin' : case 'notequal' : // if variable is not set or is not string or number, return - if(!isset($value)) return; - if($value === '') return; - if(!in_array(gettype($value), array('string', 'integer'))) return; + if(!isset($this->value)) return false; + if($this->value === '') return false; + if(!in_array(gettype($this->value), array('string', 'integer'))) return false; break; case 'between' : - if(!is_array($value)) return; - if(count($value)!=2) return; - - } + if(!is_array($this->value)) return false; + if(count($this->value)!=2) return false; + } + return true; + } + + function getConditionPart($name, $value, $operation) { switch($operation) { case 'equal' : return $name.' = '.$value; diff --git a/classes/db/queryparts/condition/ConditionGroup.class.php b/classes/db/queryparts/condition/ConditionGroup.class.php index ecf5870f1..bc3a1b888 100644 --- a/classes/db/queryparts/condition/ConditionGroup.class.php +++ b/classes/db/queryparts/condition/ConditionGroup.class.php @@ -15,7 +15,8 @@ else $group = ''; foreach($this->conditions as $condition){ - $group .= $condition->toString() . ' '; + if($condition->show()) + $group .= $condition->toString() . ' '; } if($this->pipe !== "") diff --git a/classes/xml/xmlquery/QueryParser.class.php b/classes/xml/xmlquery/QueryParser.class.php index 00f95d5b8..852aeced1 100644 --- a/classes/xml/xmlquery/QueryParser.class.php +++ b/classes/xml/xmlquery/QueryParser.class.php @@ -95,7 +95,6 @@ class QueryParser { } function toString(){ - // TODO Add tags for update, insert .. if($this->action == 'select'){ $columns = new SelectColumnsTag($this->query->columns->column, $this->dbParser); }else if($this->action == 'insert'){ diff --git a/classes/xml/xmlquery/argument/Argument.class.php b/classes/xml/xmlquery/argument/Argument.class.php index 9b88296bb..f24dd4a20 100644 --- a/classes/xml/xmlquery/argument/Argument.class.php +++ b/classes/xml/xmlquery/argument/Argument.class.php @@ -31,6 +31,8 @@ } function escapeValue($column_type){ + if(!isset($this->value)) return; + if($column_type === '') $column_type = 'varchar'; if(in_array($column_type, array('date', 'varchar', 'char'))) $this->value = '\''.$this->value.'\''; } diff --git a/classes/xml/xmlquery/tags/condition/ConditionsTag.class.php b/classes/xml/xmlquery/tags/condition/ConditionsTag.class.php index 864634131..ef174bc2e 100644 --- a/classes/xml/xmlquery/tags/condition/ConditionsTag.class.php +++ b/classes/xml/xmlquery/tags/condition/ConditionsTag.class.php @@ -15,6 +15,7 @@ $xml_groups = $xml_conditions->group; if($xml_groups){ + if(!is_array($xml_groups)) $xml_groups = array($xml_groups); require_once(_XE_PATH_.'classes/xml/xmlquery/tags/condition/ConditionGroupTag.class.php'); foreach($xml_groups as $group){ $this->condition_groups[] = new ConditionGroupTag($group->condition, $this->dbParser, $group->pipe); From d3067703a434970b44af1199a92026ee6793ec28 Mon Sep 17 00:00:00 2001 From: mosmartin Date: Fri, 20 May 2011 12:24:50 +0000 Subject: [PATCH 0086/1372] Fixed join condidition bug: if the user specifies the "pipe" attribute of a condition in a join cause, it should be ignored (otherwise the sql string is like INNER JOIN ... ON AND a = b). Fixed order by bug. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0-DB@8387 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/db/DBCubrid.class.php | 2 +- classes/xml/xmlquery/QueryParser.class.php | 1 + classes/xml/xmlquery/argument/Argument.class.php | 3 ++- .../xml/xmlquery/queryargument/DefaultValue.class.php | 8 +++++--- .../xmlquery/tags/condition/ConditionTag.class.php | 4 ++++ .../tags/condition/JoinConditionsTag.class.php | 11 +++++++++++ .../xml/xmlquery/tags/navigation/IndexTag.class.php | 2 +- classes/xml/xmlquery/tags/table/TableTag.class.php | 2 +- modules/module/queries/getDefaultModules.xml | 6 +++--- modules/module/queries/getSiteModules.xml | 4 ++-- 10 files changed, 31 insertions(+), 12 deletions(-) create mode 100644 classes/xml/xmlquery/tags/condition/JoinConditionsTag.class.php diff --git a/classes/db/DBCubrid.class.php b/classes/db/DBCubrid.class.php index 1df9d207e..4193f8270 100644 --- a/classes/db/DBCubrid.class.php +++ b/classes/db/DBCubrid.class.php @@ -199,7 +199,7 @@ if (cubrid_error_code ()) { $code = cubrid_error_code (); $msg = cubrid_error_msg (); - + $this->setError ($code, $msg); } diff --git a/classes/xml/xmlquery/QueryParser.class.php b/classes/xml/xmlquery/QueryParser.class.php index 852aeced1..c7a50717a 100644 --- a/classes/xml/xmlquery/QueryParser.class.php +++ b/classes/xml/xmlquery/QueryParser.class.php @@ -7,6 +7,7 @@ require_once(_XE_PATH_.'classes/xml/xmlquery/tags/column/UpdateColumnsTag.class. require_once(_XE_PATH_.'classes/xml/xmlquery/tags/column/DeleteColumnsTag.class.php'); require_once(_XE_PATH_.'classes/xml/xmlquery/tags/table/TablesTag.class.php'); require_once(_XE_PATH_.'classes/xml/xmlquery/tags/condition/ConditionsTag.class.php'); +require_once(_XE_PATH_.'classes/xml/xmlquery/tags/condition/JoinConditionsTag.class.php'); require_once(_XE_PATH_.'classes/xml/xmlquery/tags/group/GroupsTag.class.php'); require_once(_XE_PATH_.'classes/xml/xmlquery/tags/navigation/NavigationTag.class.php'); require_once(_XE_PATH_.'classes/xml/xmlquery/tags/navigation/IndexTag.class.php'); diff --git a/classes/xml/xmlquery/argument/Argument.class.php b/classes/xml/xmlquery/argument/Argument.class.php index f24dd4a20..23cb46539 100644 --- a/classes/xml/xmlquery/argument/Argument.class.php +++ b/classes/xml/xmlquery/argument/Argument.class.php @@ -32,7 +32,8 @@ function escapeValue($column_type){ if(!isset($this->value)) return; - if($column_type === '') $column_type = 'varchar'; + if($column_type === '') return; + //if($column_type === '') $column_type = 'varchar'; if(in_array($column_type, array('date', 'varchar', 'char'))) $this->value = '\''.$this->value.'\''; } diff --git a/classes/xml/xmlquery/queryargument/DefaultValue.class.php b/classes/xml/xmlquery/queryargument/DefaultValue.class.php index 060261b65..4cac606fe 100644 --- a/classes/xml/xmlquery/queryargument/DefaultValue.class.php +++ b/classes/xml/xmlquery/queryargument/DefaultValue.class.php @@ -19,8 +19,9 @@ if(!isset($this->value)) return; $str_pos = strpos($this->value, '('); - // TODO Replace this with parseExpression - if($str_pos===false) return '"'.$this->value.'"'; + // // TODO Replace this with parseExpression + if($str_pos===false) return '\''.$this->value.'\''; + //if($str_pos===false) return $this->value; $func_name = substr($this->value, 0, $str_pos); $args = substr($this->value, $str_pos+1, strlen($value)-1); @@ -52,7 +53,8 @@ $val = sprintf('"%s*%d"', $this->column_name, $args); break; default : - $val = '"' . $this->value . '"'; + $val = '\'' . $this->value . '\''; + //$val = $this->value; } return $val; diff --git a/classes/xml/xmlquery/tags/condition/ConditionTag.class.php b/classes/xml/xmlquery/tags/condition/ConditionTag.class.php index a96a9a98d..626a4a0b0 100644 --- a/classes/xml/xmlquery/tags/condition/ConditionTag.class.php +++ b/classes/xml/xmlquery/tags/condition/ConditionTag.class.php @@ -29,6 +29,10 @@ $this->argument = new QueryArgument($condition); } + function setPipe($pipe){ + $this->pipe = $pipe; + } + function getArgument(){ return $this->argument; } diff --git a/classes/xml/xmlquery/tags/condition/JoinConditionsTag.class.php b/classes/xml/xmlquery/tags/condition/JoinConditionsTag.class.php new file mode 100644 index 000000000..1568ecbb7 --- /dev/null +++ b/classes/xml/xmlquery/tags/condition/JoinConditionsTag.class.php @@ -0,0 +1,11 @@ +condition_groups[0]->conditions[0]->setPipe(""); + } + } + +?> \ No newline at end of file diff --git a/classes/xml/xmlquery/tags/navigation/IndexTag.class.php b/classes/xml/xmlquery/tags/navigation/IndexTag.class.php index cbe726b99..febb8628f 100644 --- a/classes/xml/xmlquery/tags/navigation/IndexTag.class.php +++ b/classes/xml/xmlquery/tags/navigation/IndexTag.class.php @@ -12,7 +12,7 @@ function IndexTag($index, $dbParser){ $this->dbParser = $dbParser; $this->argument_name = $index->attrs->var; - //$index->attrs->default = $this->dbParser->parseExpression($index->attrs->default); + $index->attrs->default = $this->dbParser->parseExpression($index->attrs->default); $this->default = $index->attrs->default; require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/QueryArgument.class.php'); $this->argument = new QueryArgument($index); diff --git a/classes/xml/xmlquery/tags/table/TableTag.class.php b/classes/xml/xmlquery/tags/table/TableTag.class.php index 4797df04c..dea2729b7 100644 --- a/classes/xml/xmlquery/tags/table/TableTag.class.php +++ b/classes/xml/xmlquery/tags/table/TableTag.class.php @@ -45,7 +45,7 @@ function getTableString(){ if($this->isJoinTable()){ - $conditionsTag = new ConditionsTag($this->conditions, $this->dbParser); + $conditionsTag = new JoinConditionsTag($this->conditions, $this->dbParser); return sprintf('new JoinTable(\'%s\', \'%s\', "%s", %s)' , $this->dbParser->escape($this->name) , $this->dbParser->escape($this->alias) diff --git a/modules/module/queries/getDefaultModules.xml b/modules/module/queries/getDefaultModules.xml index dd847508e..c6ffd842f 100644 --- a/modules/module/queries/getDefaultModules.xml +++ b/modules/module/queries/getDefaultModules.xml @@ -19,8 +19,8 @@ - - - + + + diff --git a/modules/module/queries/getSiteModules.xml b/modules/module/queries/getSiteModules.xml index 2c80abe39..6d9988eea 100644 --- a/modules/module/queries/getSiteModules.xml +++ b/modules/module/queries/getSiteModules.xml @@ -17,7 +17,7 @@ - - + + From 8f3df45a2a592b8fa862c9d96f7cc208d7dacea9 Mon Sep 17 00:00:00 2001 From: ovclas Date: Mon, 23 May 2011 04:48:43 +0000 Subject: [PATCH 0087/1372] #19745697 trash module makem document, comment module modify, because object in to trash and trash restore to object feature git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8388 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/module/ModuleHandler.class.php | 13 ++ common/lang/ko.lang.php | 2 + config/config.inc.php | 1 + modules/comment/comment.admin.controller.php | 108 ++++++++++++-- modules/comment/comment.controller.php | 18 ++- modules/comment/lang/ko.lang.php | 1 + modules/comment/tpl/comment_list.html | 4 +- modules/comment/tpl/declared_list.html | 4 +- .../document/document.admin.controller.php | 58 +++++++- modules/document/document.controller.php | 74 ++++++--- modules/module/module.model.php | 20 +++ modules/trash/conf/info.xml | 20 +++ modules/trash/conf/module.xml | 13 ++ modules/trash/lang/ko.lang.php | 23 +++ modules/trash/model/TrashVO.php | 103 +++++++++++++ modules/trash/queries/deleteTrash.xml | 9 ++ modules/trash/queries/getTrash.xml | 11 ++ modules/trash/queries/getTrashList.xml | 21 +++ modules/trash/queries/insertTrash.xml | 15 ++ modules/trash/schemas/trash.xml | 10 ++ modules/trash/tpl/filter/emptyTrash.xml | 12 ++ modules/trash/tpl/header.html | 2 + modules/trash/tpl/js/trash_admin.js | 33 +++++ modules/trash/tpl/trash_list.html | 69 +++++++++ modules/trash/trash.admin.controller.php | 140 ++++++++++++++++++ modules/trash/trash.admin.view.php | 36 +++++ modules/trash/trash.class.php | 39 +++++ modules/trash/trash.controller.php | 31 ++++ modules/trash/trash.model.php | 58 ++++++++ modules/trash/trash.view.php | 35 +++++ 30 files changed, 949 insertions(+), 34 deletions(-) create mode 100644 modules/trash/conf/info.xml create mode 100644 modules/trash/conf/module.xml create mode 100644 modules/trash/lang/ko.lang.php create mode 100644 modules/trash/model/TrashVO.php create mode 100644 modules/trash/queries/deleteTrash.xml create mode 100644 modules/trash/queries/getTrash.xml create mode 100644 modules/trash/queries/getTrashList.xml create mode 100644 modules/trash/queries/insertTrash.xml create mode 100644 modules/trash/schemas/trash.xml create mode 100644 modules/trash/tpl/filter/emptyTrash.xml create mode 100644 modules/trash/tpl/header.html create mode 100644 modules/trash/tpl/js/trash_admin.js create mode 100644 modules/trash/tpl/trash_list.html create mode 100644 modules/trash/trash.admin.controller.php create mode 100644 modules/trash/trash.admin.view.php create mode 100644 modules/trash/trash.class.php create mode 100644 modules/trash/trash.controller.php create mode 100644 modules/trash/trash.model.php create mode 100644 modules/trash/trash.view.php diff --git a/classes/module/ModuleHandler.class.php b/classes/module/ModuleHandler.class.php index ea58a4a07..ce35ac090 100644 --- a/classes/module/ModuleHandler.class.php +++ b/classes/module/ModuleHandler.class.php @@ -189,6 +189,7 @@ // get type, kind $type = $xml_info->action->{$this->act}->type; + $ruleset = $xml_info->action->{$this->act}->ruleset; $kind = strpos(strtolower($this->act),'admin')!==false?'admin':''; if(!$kind && $this->module == 'admin') $kind = 'admin'; if($this->module_info->use_mobile != "Y") Mobile::setMobile(false); @@ -289,6 +290,18 @@ } } + //TODO ruleset check... + if(!empty($ruleset)) + { + $rulesetFile = $oModuleModel->getValidatorFilePath($this->module, $ruleset); + if(!empty($rulesetFile)) + { + $Validator = new Validator($rulesetFile); + if(!$Validator->validate()) + return $Validator->getLastError(); + } + } + $oModule->setAct($this->act); $this->module_info->module_type = $type; diff --git a/common/lang/ko.lang.php b/common/lang/ko.lang.php index fe1d1db23..c0e6823ad 100644 --- a/common/lang/ko.lang.php +++ b/common/lang/ko.lang.php @@ -95,6 +95,7 @@ $lang->browser_title = '브라우저 제목'; $lang->title = '제목'; $lang->title_content = '제목+내용'; + $lang->untitle = '제목없슴'; $lang->topic = '주제'; $lang->replies = '댓글'; $lang->content = '내용'; @@ -165,6 +166,7 @@ $lang->not_exists = '없음'; $lang->public = '공개'; $lang->private = '비공개'; + $lang->etc = '기타'; $lang->unit_sec = '초'; $lang->unit_min = '분'; $lang->unit_hour = '시'; diff --git a/config/config.inc.php b/config/config.inc.php index 91ebb2fa1..70f5e28ca 100644 --- a/config/config.inc.php +++ b/config/config.inc.php @@ -158,6 +158,7 @@ require(_XE_PATH_.'classes/mail/Mail.class.php'); require(_XE_PATH_.'classes/page/PageHandler.class.php'); require(_XE_PATH_.'classes/mobile/Mobile.class.php'); + require(_XE_PATH_.'classes/validator/Validator.class.php'); if(__DEBUG__) $GLOBALS['__elapsed_class_load__'] = getMicroTime() - __ClassLoadStartTime__; } ?> diff --git a/modules/comment/comment.admin.controller.php b/modules/comment/comment.admin.controller.php index c14534f6b..22f710673 100644 --- a/modules/comment/comment.admin.controller.php +++ b/modules/comment/comment.admin.controller.php @@ -17,6 +17,8 @@ * @brief Delete the selected comment from the administrator page **/ function procCommentAdminDeleteChecked() { + $isTrash = Context::get('is_trash'); + // Error display if none is selected $cart = Context::get('cart'); if(!$cart) return $this->stop('msg_cart_is_null'); @@ -24,23 +26,65 @@ $comment_count = count($comment_srl_list); if(!$comment_count) return $this->stop('msg_cart_is_null'); - $oCommentController = &getController('comment'); + $oCommentController = &getController('comment'); + // begin transaction + $oDB = &DB::getInstance(); + $oDB->begin(); - $deleted_count = 0; - // Delete the comment posting - for($i=0;$i<$comment_count;$i++) { - $comment_srl = trim($comment_srl_list[$i]); - if(!$comment_srl) continue; + // comment into trash + if($isTrash == 'true') $this->_moveCommentToTrash($comment_srl_list, &$oCommentController, &$oDB); - $output = $oCommentController->deleteComment($comment_srl, true); - if(!$output->toBool()) continue; + $deleted_count = 0; + // Delete the comment posting + for($i=0;$i<$comment_count;$i++) { + $comment_srl = trim($comment_srl_list[$i]); + if(!$comment_srl) continue; - $deleted_count ++; - } + $output = $oCommentController->deleteComment($comment_srl, true, $isTrash); + if(!$output->toBool()) + { + $oDB->rollback(); + return $output; + } + + $deleted_count ++; + } + $oDB->commit(); $this->setMessage( sprintf(Context::getLang('msg_checked_comment_is_deleted'), $deleted_count) ); } + function _moveCommentToTrash($commentSrlList, &$oCommentController, &$oDB) + { + require_once(_XE_PATH_.'modules/trash/model/TrashVO.php'); + + if(is_array($commentSrlList)) + { + $logged_info = Context::get('logged_info'); + $oCommentModel = &getModel('comment'); + $commentItemList = $oCommentModel->getComments($commentSrlList); + $oTrashController = &getController('trash'); + + foreach($commentItemList AS $key=>$oComment) + { + $oTrashVO = new TrashVO(); + $oTrashVO->setTrashSrl(getNextSequence()); + $oTrashVO->setTitle(trim(strip_tags($oComment->variables['content']))); + $oTrashVO->setOriginModule('comment'); + $oTrashVO->setSerializedObject(serialize($oComment->variables)); + $oTrashVO->setIpaddress($_SERVER['REMOTE_ADDR']); + $oTrashVO->setRemoverSrl($logged_info->member_srl); + $oTrashVO->setRegdate(date('YmdHis')); + + $output = $oTrashController->insertTrash($oTrashVO); + if (!$output->toBool()) { + $oDB->rollback(); + return $output; + } + } + } + } + /** * @brief cancel the blacklist of abused comments reported by other users **/ @@ -66,5 +110,49 @@ return $output; } + /** + * @brief restore comment from trash module, called by trash module + * this method is passived + **/ + function restoreTrash($originObject) + { + if(is_array($originObject)) $originObject = (object)$originObject; + + $obj->document_srl = $originObject->document_srl; + $obj->comment_srl = $originObject->comment_srl; + $obj->parent_srl = $originObject->parent_srl; + $obj->content = $originObject->content; + $obj->password = $originObject->password; + $obj->nick_name = $originObject->nick_name; + $obj->member_srl = $originObject->member_srl; + $obj->email_address = $originObject->email_address; + $obj->homepage = $originObject->homepage; + $obj->is_secret = $originObject->is_secret; + $obj->notify_message = $originObject->notify_message; + $obj->module_srl = $originObject->module_srl; + + $oCommentController = &getController('comment'); + $output = $oCommentController->insertComment($obj); + + return $output; + } + + /** + * @brief empty comment in trash, called by trash module + * this method is passived + **/ + function emptyTrash($originObject) + { + $originObject = unserialize($originObject); + if(is_array($originObject)) $originObject = (object) $originObject; + + $oComment = new commentItem(); + $oComment->setAttribute($originObject); + + //already comment deleted, therefore only comment log delete + $oCommentController = &getController('comment'); + $output = $oCommentController->deleteCommentLog($oComment->get('comment_srl')); + return $output; + } } ?> diff --git a/modules/comment/comment.controller.php b/modules/comment/comment.controller.php index ee56533b0..f0c21923d 100644 --- a/modules/comment/comment.controller.php +++ b/modules/comment/comment.controller.php @@ -322,7 +322,7 @@ /** * @brief Delete comment **/ - function deleteComment($comment_srl, $is_admin = false) { + function deleteComment($comment_srl, $is_admin = false, $isMoveToTrash = false) { // create the comment model object $oCommentModel = &getModel('comment'); // check if comment already exists @@ -369,8 +369,11 @@ } } - $this->_deleteDeclaredComments($args); - $this->_deleteVotedComments($args); + if(!$isMoveToTrash) + { + $this->_deleteDeclaredComments($args); + $this->_deleteVotedComments($args); + } // commit $oDB->commit(); @@ -379,6 +382,15 @@ return $output; } + /** + * @brief remove all comment relation log + **/ + function deleteCommentLog() + { + $this->_deleteDeclaredComments($args); + $this->_deleteVotedComments($args); + } + /** * @brief remove all comments of the article **/ diff --git a/modules/comment/lang/ko.lang.php b/modules/comment/lang/ko.lang.php index d9e146fb9..f78c98402 100644 --- a/modules/comment/lang/ko.lang.php +++ b/modules/comment/lang/ko.lang.php @@ -9,6 +9,7 @@ $lang->comment_list = '댓글 목록'; $lang->cmd_toggle_checked_comment = '선택항목 반전'; $lang->cmd_delete_checked_comment = '선택항목 삭제'; + $lang->cmd_trash = '휴지통으로 이동'; $lang->comment_count = '댓글 수'; $lang->about_comment_count = '댓글을 정해진 수 만큼만 표시하고 그 이상일 경우 목록으로 이동할 수 있게 합니다.'; $lang->msg_cart_is_null = '삭제할 글을 선택해주세요.'; diff --git a/modules/comment/tpl/comment_list.html b/modules/comment/tpl/comment_list.html index bba19cf53..55cc4c0d6 100644 --- a/modules/comment/tpl/comment_list.html +++ b/modules/comment/tpl/comment_list.html @@ -23,11 +23,13 @@
        + diff --git a/modules/comment/tpl/declared_list.html b/modules/comment/tpl/declared_list.html index 9dbe1b7be..b6dc0d3e1 100644 --- a/modules/comment/tpl/declared_list.html +++ b/modules/comment/tpl/declared_list.html @@ -3,6 +3,7 @@ + @@ -33,7 +34,8 @@ {$lang->cmd_cancel_declare}{$lang->cmd_select_all}{$lang->cmd_reverse_all} - + + diff --git a/modules/document/document.admin.controller.php b/modules/document/document.admin.controller.php index 8528b5fe1..c7605a870 100644 --- a/modules/document/document.admin.controller.php +++ b/modules/document/document.admin.controller.php @@ -467,7 +467,7 @@ $this->restoreTrash($trash_srl); } - function restoreTrash($trash_srl){ + /*function restoreTrash($trash_srl){ $oDB = &DB::getInstance(); $oDocumentModel = &getModel('document'); @@ -516,7 +516,63 @@ // commit $oDB->commit(); return $output; + }*/ + + /** + * @brief restore document from trash module, called by trash module + * this method is passived + **/ + function restoreTrash($originObject) + { + if(is_array($originObject)) $originObject = (object)$originObject; + + $oDocumentController = &getController('document'); + $oDocumentModel = &getModel('document'); + + $oDB = &DB::getInstance(); + $oDB->begin(); + + //DB restore + $output = $oDocumentController->insertDocument($originObject, false, true); + + //FILE restore + $oDocument = $oDocumentModel->getDocument($originObject->document_srl); + // If the post was not temorarily saved, set the attachment's status to be valid + if($oDocument->hasUploadedFiles() && $originObject->member_srl != $originObject->module_srl) { + $args->upload_target_srl = $oDocument->document_srl; + $args->isvalid = 'Y'; + $output = executeQuery('file.updateFileValid', $args); + } + + // call a trigger (after) + if($output->toBool()) { + $trigger_output = ModuleHandler::triggerCall('document.restoreTrash', 'after', $originObject); + if(!$trigger_output->toBool()) { + $oDB->rollback(); + return $trigger_output; + } + } + + // commit + $oDB->commit(); + return new Object(0, 'success'); } + /** + * @brief empty document in trash, called by trash module + * this method is passived + **/ + function emptyTrash($originObject) + { + $originObject = unserialize($originObject); + if(is_array($originObject)) $originObject = (object) $originObject; + + $oDocument = new documentItem(); + $oDocument->setAttribute($originObject); + + $oDocumentController = &getController('document'); + $output = $oDocumentController->deleteDocument($oDocument->get('document_srl'), true, true, $oDocument); + return $output; + } } ?> diff --git a/modules/document/document.controller.php b/modules/document/document.controller.php index 1baa10f86..40adab898 100644 --- a/modules/document/document.controller.php +++ b/modules/document/document.controller.php @@ -136,7 +136,7 @@ class documentController extends document { /** * @brief Insert the document **/ - function insertDocument($obj, $manual_inserted = false) { + function insertDocument($obj, $manual_inserted = false, $isRestore = false) { // begin transaction $oDB = &DB::getInstance(); $oDB->begin(); @@ -147,10 +147,10 @@ class documentController extends document { if($obj->allow_trackback!='Y') $obj->allow_trackback = 'N'; if($obj->homepage && !preg_match('/^[a-z]+:\/\//i',$obj->homepage)) $obj->homepage = 'http://'.$obj->homepage; if($obj->notify_message != 'Y') $obj->notify_message = 'N'; - $obj->ipaddress = $_SERVER['REMOTE_ADDR']; //board에서 form key값으로 ipaddress를 사용하면 엄한 ip가 등록됨. 필터와는 상관없슴 + if(!$isRestore) $obj->ipaddress = $_SERVER['REMOTE_ADDR']; //board에서 form key값으로 ipaddress를 사용하면 엄한 ip가 등록됨. 필터와는 상관없슴 // Serialize the $extra_vars - $obj->extra_vars = serialize($obj->extra_vars); + if(!$isRestore) $obj->extra_vars = serialize($obj->extra_vars); // Remove the columns for automatic saving unset($obj->_saved_doc_srl); unset($obj->_saved_doc_title); @@ -170,11 +170,12 @@ class documentController extends document { } // Set the read counts and update order. if(!$obj->readed_count) $obj->readed_count = 0; - $obj->update_order = $obj->list_order = getNextSequence() * -1; + if(!$isRestore) $obj->update_order = $obj->list_order = getNextSequence() * -1; + else $obj->update_order = $obj->list_order; // Check the status of password hash for manually inserting. Apply md5 hashing for otherwise. if($obj->password && !$obj->password_is_hashed) $obj->password = md5($obj->password); // Insert member's information only if the member is logged-in and not manually registered. - if(Context::get('is_logged')&&!$manual_inserted) { + if(Context::get('is_logged') && !$manual_inserted && !$isRestore) { $logged_info = Context::get('logged_info'); $obj->member_srl = $logged_info->member_srl; $obj->user_id = $logged_info->user_id; @@ -391,7 +392,7 @@ class documentController extends document { /** * @brief Deleting Documents **/ - function deleteDocument($document_srl, $is_admin = false) { + function deleteDocument($document_srl, $is_admin = false, $isEmptyTrash = false, $oDocument = null) { // Call a trigger (before) $trigger_obj->document_srl = $document_srl; $output = ModuleHandler::triggerCall('document.deleteDocument', 'before', $trigger_obj); @@ -400,19 +401,31 @@ class documentController extends document { // begin transaction $oDB = &DB::getInstance(); $oDB->begin(); - // get model object of the document - $oDocumentModel = &getModel('document'); - // Check if the documnet exists - $oDocument = $oDocumentModel->getDocument($document_srl, $is_admin); + + if(!$isEmptyTrash) + { + // get model object of the document + $oDocumentModel = &getModel('document'); + // Check if the documnet exists + $oDocument = $oDocumentModel->getDocument($document_srl, $is_admin); + debugPrint('normal'); + } + else if($isEmptyTrash && $oDocument == null) return new Object(-1, 'document is not exists'); + if(!$oDocument->isExists() || $oDocument->document_srl != $document_srl) return new Object(-1, 'msg_invalid_document'); // Check if a permossion is granted if(!$oDocument->isGranted()) return new Object(-1, 'msg_not_permitted'); - // Delete the document + + //if empty trash, document already deleted, therefore document not delete $args->document_srl = $document_srl; - $output = executeQuery('document.deleteDocument', $args); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; + if(!$isEmptyTrash) + { + // Delete the document + $output = executeQuery('document.deleteDocument', $args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } } $this->deleteDocumentAliasByDocument($document_srl); @@ -512,18 +525,43 @@ class documentController extends document { $oDB = &DB::getInstance(); $oDB->begin(); - $output = executeQuery('document.insertTrash', $trash_args); + /*$output = executeQuery('document.insertTrash', $trash_args); + if (!$output->toBool()) { + $oDB->rollback(); + return $output; + }*/ + + // new trash module + require_once(_XE_PATH_.'modules/trash/model/TrashVO.php'); + $oTrashVO = new TrashVO(); + $oTrashVO->setTrashSrl(getNextSequence()); + $oTrashVO->setTitle($oDocument->variables['title']); + $oTrashVO->setOriginModule('document'); + $oTrashVO->setSerializedObject(serialize($oDocument->variables)); + $oTrashVO->setDescription($obj->description); + $oTrashVO->setIpaddress($_SERVER['REMOTE_ADDR']); + $oTrashVO->setRemoverSrl($logged_info->member_srl); + $oTrashVO->setRegdate(date('YmdHis')); + + $oTrashController = &getController('trash'); + $output = $oTrashController->insertTrash($oTrashVO); if (!$output->toBool()) { $oDB->rollback(); return $output; } - $output = executeQuery('document.updateDocument', $document_args); - if (!$output->toBool()) { + $output = executeQuery('document.deleteDocument', $trash_args); + if(!$output->toBool()) { $oDB->rollback(); return $output; } + /*$output = executeQuery('document.updateDocument', $document_args); + if (!$output->toBool()) { + $oDB->rollback(); + return $output; + }*/ + // update category if($oDocument->get('category_srl')) $this->updateCategoryCount($oDocument->get('module_srl'),$oDocument->get('category_srl')); diff --git a/modules/module/module.model.php b/modules/module/module.model.php index 2f7f0cbdd..2f1d9e8a0 100644 --- a/modules/module/module.model.php +++ b/modules/module/module.model.php @@ -515,6 +515,7 @@ $type = $action->attrs->type; $grant = $action->attrs->grant?$action->attrs->grant:'guest'; $standalone = $action->attrs->standalone=='true'?'true':'false'; + $ruleset = $action->attrs->ruleset?$action->attrs->ruleset:''; $index = $action->attrs->index; $admin_index = $action->attrs->admin_index; @@ -527,10 +528,12 @@ $info->action->{$name}->type = $type; $info->action->{$name}->grant = $grant; $info->action->{$name}->standalone = $standalone=='true'?true:false; + $info->action->{$name}->ruleset = $ruleset; $buff .= sprintf('$info->action->%s->type=\'%s\';', $name, $type); $buff .= sprintf('$info->action->%s->grant=\'%s\';', $name, $grant); $buff .= sprintf('$info->action->%s->standalone=%s;', $name, $standalone); + $buff .= sprintf('$info->action->%s->ruleset=\'%s\';', $name, $ruleset); if($index=='true') { $default_index_act = $name; @@ -1280,5 +1283,22 @@ function getModuleFileBoxPath($module_filebox_srl){ return sprintf("./files/attach/filebox/%s",getNumberingPath($module_filebox_srl,3)); } + + /** + * @brief Return ruleset cache file path + * @param module, act + **/ + function getValidatorFilePath($module, $ruleset) { + // Get a path of the requested module. Return if not exists. + $class_path = ModuleHandler::getModulePath($module); + if(!$class_path) return; + + // Check if module.xml exists in the path. Return if not exist + $xml_file = sprintf("%sruleset/%s.xml", $class_path, $ruleset); + if(!file_exists($xml_file)) return; + + return $xml_file; + } + } ?> diff --git a/modules/trash/conf/info.xml b/modules/trash/conf/info.xml new file mode 100644 index 000000000..575a7e247 --- /dev/null +++ b/modules/trash/conf/info.xml @@ -0,0 +1,20 @@ + + + 휴지통 + trash + 문서, 댓글 등을 완전히 삭제하지 않고 복구 가능한 상태로 만들어 관리하는 모듈입니다. + 0.1 + 2011-05-12 + content + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + diff --git a/modules/trash/conf/module.xml b/modules/trash/conf/module.xml new file mode 100644 index 000000000..7c21e2f84 --- /dev/null +++ b/modules/trash/conf/module.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/modules/trash/lang/ko.lang.php b/modules/trash/lang/ko.lang.php new file mode 100644 index 000000000..3f0866fd0 --- /dev/null +++ b/modules/trash/lang/ko.lang.php @@ -0,0 +1,23 @@ +cmd_trash = '휴지통'; + $lang->cmd_restore = '복원'; + $lang->cmd_restore_all = '모두 복원'; + $lang->in_trash = '휴지통'; + $lang->trash_nick_name = '삭제자 닉네임'; + $lang->trash_date = '삭제 날짜'; + $lang->trash_description = '설명'; + $lang->trash_type = '원본 종류'; + $lang->success_trashed = '휴지통으로 이동되었습니다.'; + $lang->empty_trash_selected = '선택 비우기'; + $lang->empty_trash_all = '휴지통 비우기'; + $lang->confirm_restore = '복원하시겠습니까?'; + $lang->success_empty = '성공적으로 비웠습니다.'; + $lang->fail_empty = '휴지통 비우기에 실패하였습니다.'; + $lang->success_restore = '성공적으로 복원하였습니다.'; + $lang->fail_restore = '복원에 실패하였습니다.'; +?> diff --git a/modules/trash/model/TrashVO.php b/modules/trash/model/TrashVO.php new file mode 100644 index 000000000..9061d8b9e --- /dev/null +++ b/modules/trash/model/TrashVO.php @@ -0,0 +1,103 @@ +trashSrl; + } + function setTrashSrl($trashSrl) + { + $this->trashSrl = $trashSrl; + } + function getTitle() + { + if(empty($this->title)) return $lang->untitle; + return $this->title; + } + function setTitle($title) + { + $this->title = $title; + } + function getOriginModule() + { + if(empty($this->originModule)) return 'document'; + return $this->originModule; + } + function setOriginModule($originModule) + { + $this->originModule = $originModule; + } + function getSerializedObject() + { + return $this->serializedObject; + } + function setSerializedObject($serializedObject) + { + $this->serializedObject = $serializedObject; + } + function getDescription() + { + return $this->description; + } + function setDescription($description) + { + $this->description = $description; + } + function getIpaddress() + { + return $this->ipaddress; + } + function setIpaddress($ipaddress) + { + $this->ipaddress = $ipaddress; + } + function getRemoverSrl() + { + return $this->removerSrl; + } + function setRemoverSrl($removerSrl) + { + $this->removerSrl = $removerSrl; + } + function getUserId() + { + return $this->userId; + } + function setUserId($userId) + { + $this->userId = $userId; + } + function getNickName() + { + return $this->nickName; + } + function setNickName($nickName) + { + $this->nickName = $nickName; + } + function getRegdate() + { + if(empty($this->regdate)) return date('YmdHis'); + + return $this->regdate; + } + function setRegdate($regdate) + { + $this->regdate = $regdate; + } +} + +/* End of file Trash.php */ +/* Location: ./modules/trash/model/Trash.php */ diff --git a/modules/trash/queries/deleteTrash.xml b/modules/trash/queries/deleteTrash.xml new file mode 100644 index 000000000..7374de69c --- /dev/null +++ b/modules/trash/queries/deleteTrash.xml @@ -0,0 +1,9 @@ + + +
        + + + + + + diff --git a/modules/trash/queries/getTrash.xml b/modules/trash/queries/getTrash.xml new file mode 100644 index 000000000..0acccabc9 --- /dev/null +++ b/modules/trash/queries/getTrash.xml @@ -0,0 +1,11 @@ + + +
        + + + + + + + + diff --git a/modules/trash/queries/getTrashList.xml b/modules/trash/queries/getTrashList.xml new file mode 100644 index 000000000..78bea0734 --- /dev/null +++ b/modules/trash/queries/getTrashList.xml @@ -0,0 +1,21 @@ + + +
        +
        + + + + + + + + + + + + + + + + + diff --git a/modules/trash/queries/insertTrash.xml b/modules/trash/queries/insertTrash.xml new file mode 100644 index 000000000..c8fadb3d6 --- /dev/null +++ b/modules/trash/queries/insertTrash.xml @@ -0,0 +1,15 @@ + + +
        + + + + + + + + + + + + diff --git a/modules/trash/schemas/trash.xml b/modules/trash/schemas/trash.xml new file mode 100644 index 000000000..ee69509da --- /dev/null +++ b/modules/trash/schemas/trash.xml @@ -0,0 +1,10 @@ +
        + + + + + + + + +
        diff --git a/modules/trash/tpl/filter/emptyTrash.xml b/modules/trash/tpl/filter/emptyTrash.xml new file mode 100644 index 000000000..6976c489f --- /dev/null +++ b/modules/trash/tpl/filter/emptyTrash.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + +
        diff --git a/modules/trash/tpl/header.html b/modules/trash/tpl/header.html new file mode 100644 index 000000000..87a81480c --- /dev/null +++ b/modules/trash/tpl/header.html @@ -0,0 +1,2 @@ + +

        {$lang->cmd_trash} {$lang->cmd_management}

        diff --git a/modules/trash/tpl/js/trash_admin.js b/modules/trash/tpl/js/trash_admin.js new file mode 100644 index 000000000..376b39989 --- /dev/null +++ b/modules/trash/tpl/js/trash_admin.js @@ -0,0 +1,33 @@ +/** + * @file modules/trash/js/trash_admin.js + * @author NHN (developers@xpressengine.com) + * @brief trash 모듈의 관리자용 javascript + **/ + + +/* 휴지통 비우기 후 */ +function completeEmptyTrash(ret_obj) { + var error = ret_obj['error']; + var message = ret_obj['message']; + + alert(message); + if(error == '0') window.location.reload(); +} + +function goRestore(trash_srl) +{ + if(confirm(confirm_restore_msg)) + { + var params = {'trash_srl':trash_srl}; + exec_xml('admin', 'procTrashAdminRestore', params, completeRestore); + } +} + +function completeRestore(ret_obj) +{ + var error = ret_obj['error']; + var message = ret_obj['message']; + + alert(message); + if(error == '0') window.location.reload(); +} diff --git a/modules/trash/tpl/trash_list.html b/modules/trash/tpl/trash_list.html new file mode 100644 index 000000000..8225d0fb1 --- /dev/null +++ b/modules/trash/tpl/trash_list.html @@ -0,0 +1,69 @@ + + + + +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
        {$lang->no}
        {$lang->document} ({$lang->trash_type})
        {$lang->trash_nick_name}
        {$lang->trash_date}
        {$lang->ipaddress}
        {$lang->trash_description}
        {$lang->cmd_restore}
        {$no}
        +
        + {$oTrashVO->getTitle()} ( + + {$lang->document} + + {$lang->replies} + + {$lang->etc} + + ) + {htmlspecialchars($oTrashVO->getNickName())}{zdate($oTrashVO->getRegdate(), "Y-m-d H:i:s")}{$oTrashVO->getIpaddress()}{$oTrashVO->getDescription()}{$lang->cmd_restore}
        + +
        + + +
        +
        + + + diff --git a/modules/trash/trash.admin.controller.php b/modules/trash/trash.admin.controller.php new file mode 100644 index 000000000..5bf9ae510 --- /dev/null +++ b/modules/trash/trash.admin.controller.php @@ -0,0 +1,140 @@ +setTrashSrl(getNextSequence()); + $oTrashVO->setTitle($obj->title); + $oTrashVO->setOriginModule($obj->trashType); + $oTrashVO->setSerializedObject(serialize($obj->originObject)); + $oTrashVO->setDescription($obj->description); + $oTrashVO->setIpaddress($_SERVER['REMOTE_ADDR']); + $oTrashVO->setRemoverSrl($logged_info->member_srl); + $oTrashVO->setRegdate(date('YmdHis')); + + $output = executeQuery('trash.insertTrash', $oTrashVO); + return $output; + } + return new Object(-1, 'msg_not_permitted'); + } + + /** + * @brief empty trash + * @param trashSrls : trash_srl in array + **/ + function procTrashAdminEmptyTrash() + { + global $lang; + $isAll = Context::get('is_all'); + $trashSrls = explode('|@|', Context::get('trash_srls')); + + $oTrashModel = &getModel('trash'); + if($isAll == 'true') + { + $trashSrls = array(); + + //module relation data delete... + $output = $oTrashModel->getTrashList($args); + if(!$output->toBool()) return new Object(-1, $output->message); + + if(is_array($output->data)) + { + foreach($output->data AS $key=>$oTrashVO) + { + //class file check + $classPath = ModuleHandler::getModulePath($oTrashVO->getOriginModule()); + if(!is_dir(FileHandler::getRealPath($classPath))) return new Object(-1, 'not exist restore module directory'); + + $classFile = sprintf('%s%s.admin.controller.php', $classPath, $oTrashVO->getOriginModule()); + $classFile = FileHandler::getRealPath($classFile); + if(!file_exists($classFile)) return new Object(-1, 'not exist restore module class file'); + + $oAdminController = &getAdminController($oTrashVO->getOriginModule()); + if(!method_exists($oAdminController, 'emptyTrash')) return new Object(-1, 'not exist restore method in module class file'); + + $output = $oAdminController->emptyTrash($oTrashVO->getSerializedObject()); + } + } + } + + if(!$this->_emptyTrash($trashSrls)) + return new Object(-1, $lang->fail_empty); + + return new Object(0, $lang->success_empty); + } + + function procTrashAdminRestore() + { + global $lang; + $trashSrl = Context::get('trash_srl'); + + $oTrashModel = &getModel('trash'); + $output = $oTrashModel->getTrash($trashSrl); + if(!$output->toBool()) return new Object(-1, $output->message); + + //class file check + $classPath = ModuleHandler::getModulePath($output->data->getOriginModule()); + if(!is_dir(FileHandler::getRealPath($classPath))) return new Object(-1, 'not exist restore module directory'); + + $classFile = sprintf('%s%s.admin.controller.php', $classPath, $output->data->getOriginModule()); + $classFile = FileHandler::getRealPath($classFile); + if(!file_exists($classFile)) return new Object(-1, 'not exist restore module class file'); + + $oAdminController = &getAdminController($output->data->getOriginModule()); + if(!method_exists($oAdminController, 'restoreTrash')) return new Object(-1, 'not exist restore method in module class file'); + + // begin transaction + $oDB = &DB::getInstance(); + $oDB->begin(); + + $originObject = unserialize($output->data->getSerializedObject()); + $output = $oAdminController->restoreTrash($originObject); + + if(!$output->toBool()) { + $oDB->rollback(); + return new Object(-1, $output->message); + } + else + { + Context::set('is_all', 'false'); + Context::set('trash_srls', $trashSrl); + $output = $this->procTrashAdminEmptyTrash(); + if(!$output->toBool()) { + $oDB->rollback(); + return new Object(-1, $output->message); + } + } + $oDB->commit(); + return new Object(0, $lang->success_restore); + } + + /** + * @brief empty trash + * @param trashSrls : trash_srl in array + **/ + function _emptyTrash($trashSrls) + { + if(!is_array($trashSrls)) return false; + $args->trashSrls = $trashSrls; + $output = executeQuery('trash.deleteTrash', $args); + if(!$output->toBool()) return false; + + return true; + } +} + +/* End of file trash.controller.php */ +/* Location: ./modules/trash/trash.controller.php */ diff --git a/modules/trash/trash.admin.view.php b/modules/trash/trash.admin.view.php new file mode 100644 index 000000000..2ccc38a85 --- /dev/null +++ b/modules/trash/trash.admin.view.php @@ -0,0 +1,36 @@ +module_path); + $this->setTemplatePath($template_path); + } + + /** + * @brief trash list + **/ + function dispTrashAdminList() { + $oTrashModel = getModel('trash'); + $output = $oTrashModel->getTrashList($args); + + Context::set('trash_list', $output->data); + Context::set('total_count', $output->total_count); + Context::set('total_page', $output->total_page); + Context::set('page', $output->page); + Context::set('page_navigation', $output->page_navigation); + + // 템플릿 파일 지정 + $this->setTemplateFile('trash_list'); + } +} +?> diff --git a/modules/trash/trash.class.php b/modules/trash/trash.class.php new file mode 100644 index 000000000..067c04079 --- /dev/null +++ b/modules/trash/trash.class.php @@ -0,0 +1,39 @@ + diff --git a/modules/trash/trash.controller.php b/modules/trash/trash.controller.php new file mode 100644 index 000000000..c4cf443a2 --- /dev/null +++ b/modules/trash/trash.controller.php @@ -0,0 +1,31 @@ +trashSrl = $trashSrl; + $output = executeQuery('trash.getTrash', $args, $columnList); + + $this->_setTrashObject(&$oTrashVO, $output->data); + $output->data = $oTrashVO; + + return $output; + } + + /** + * @brief get trash object list + **/ + function getTrashList($args, $columnList = array()) + { + $output = executeQueryArray('trash.getTrashList', $args, $columnList); + + if(is_array($output->data)) + { + foreach($output->data AS $key=>$value) + { + $oTrashVO = new TrashVO(); + $this->_setTrashObject(&$oTrashVO, $value); + $output->data[$key] = $oTrashVO; + } + } + return $output; + } + + /** + * @brief set trash object from std object + **/ + function _setTrashObject(&$oTrashVO, $stdObject) + { + $oTrashVO->setTrashSrl($stdObject->trash_srl); + $oTrashVO->setTitle($stdObject->title); + $oTrashVO->setOriginModule($stdObject->origin_module); + $oTrashVO->setSerializedObject($stdObject->serialized_object); + $oTrashVO->setDescription($stdObject->description); + $oTrashVO->setIpaddress($stdObject->ipaddress); + $oTrashVO->setRemoverSrl($stdObject->remover_srl); + $oTrashVO->setUserId($stdObject->user_id); + $oTrashVO->setNickName($stdObject->nick_name); + $oTrashVO->setRegdate($stdObject->regdate); + } +} + diff --git a/modules/trash/trash.view.php b/modules/trash/trash.view.php new file mode 100644 index 000000000..27f2a02d3 --- /dev/null +++ b/modules/trash/trash.view.php @@ -0,0 +1,35 @@ +getTrash($trashSrl); + } + + /** + * @brief + **/ + function dispTrashList() { + $oWastebasketModel = getModel('trash'); + $output = $oWastebasketModel->getTrashList(); + } +} +?> From 0fa007a938b0163a81b9da87f4cd97389485e80b Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Mon, 23 May 2011 05:04:42 +0000 Subject: [PATCH 0088/1372] #19678379 Mobile view meta tag debugging. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8389 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/tpl/mobile_layout.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/tpl/mobile_layout.html b/common/tpl/mobile_layout.html index 10b0e6dab..3d4c20a3c 100644 --- a/common/tpl/mobile_layout.html +++ b/common/tpl/mobile_layout.html @@ -2,7 +2,7 @@ - + {Context::getBrowserTitle()} {@ $css_files = Context::getCssFile() } From a8bed44a83b26277a51e9cb10de580af13233d27 Mon Sep 17 00:00:00 2001 From: mosmartin Date: Mon, 23 May 2011 08:18:19 +0000 Subject: [PATCH 0089/1372] Cleaned up some classes that weren't needed. Removed calls to getValidatorString from tags, since the argument escaping is now done directly in the QueryParser class. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0-DB@8390 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/xml/xmlquery/QueryParser.class.php | 7 ----- .../ConditionQueryArgument.class.php | 26 ------------------- .../ConditionQueryArgumentValidator.class.php | 20 -------------- .../validator/DefaultCheck.class.php | 25 ------------------ .../validator/EscapeCheck.class.php | 21 --------------- .../validator/FilterValidator.class.php | 16 ------------ .../validator/MaxLengthValidator.class.php | 22 ---------------- .../validator/MinLengthValidator.class.php | 22 ---------------- .../validator/NotNullValidator.class.php | 18 ------------- .../tags/column/DeleteColumnTag.class.php | 16 ++---------- .../tags/column/DeleteColumnsTag.class.php | 11 ++------ .../tags/column/InsertColumnTag.class.php | 18 ++----------- .../tags/column/InsertColumnsTag.class.php | 11 ++------ .../tags/column/SelectColumnsTag.class.php | 6 +---- .../tags/column/UpdateColumnTag.class.php | 15 +---------- .../tags/column/UpdateColumnsTag.class.php | 9 +------ .../condition/ConditionGroupTag.class.php | 8 ------ .../tags/condition/ConditionTag.class.php | 6 +---- .../tags/condition/ConditionsTag.class.php | 10 +------ .../tags/navigation/IndexTag.class.php | 9 +------ .../tags/navigation/NavigationTag.class.php | 8 ------ 21 files changed, 14 insertions(+), 290 deletions(-) delete mode 100644 classes/xml/xmlquery/queryargument/ConditionQueryArgument.class.php delete mode 100644 classes/xml/xmlquery/queryargument/validator/ConditionQueryArgumentValidator.class.php delete mode 100644 classes/xml/xmlquery/queryargument/validator/DefaultCheck.class.php delete mode 100644 classes/xml/xmlquery/queryargument/validator/EscapeCheck.class.php delete mode 100644 classes/xml/xmlquery/queryargument/validator/FilterValidator.class.php delete mode 100644 classes/xml/xmlquery/queryargument/validator/MaxLengthValidator.class.php delete mode 100644 classes/xml/xmlquery/queryargument/validator/MinLengthValidator.class.php delete mode 100644 classes/xml/xmlquery/queryargument/validator/NotNullValidator.class.php diff --git a/classes/xml/xmlquery/QueryParser.class.php b/classes/xml/xmlquery/QueryParser.class.php index c7a50717a..a446c38f9 100644 --- a/classes/xml/xmlquery/QueryParser.class.php +++ b/classes/xml/xmlquery/QueryParser.class.php @@ -118,15 +118,8 @@ class QueryParser { $arguments = array_merge($arguments, $columns->getArguments()); $arguments = array_merge($arguments, $conditions->getArguments()); $arguments = array_merge($arguments, $navigation->getArguments()); - //foreach($arguments as $argument){ - // var_dump($argument); - // var_dump($this->column_type[$this->getQueryId()][$argument->getColumnName()]); - //} $prebuff = ''; - //$prebuff .= $columns->getValidatorString(); - //$prebuff .= $conditions->getValidatorString(); - //$prebuff .= $navigation->getValidatorString(); foreach($arguments as $argument){ if($argument->getArgumentName()){ $prebuff .= $argument->toString(); diff --git a/classes/xml/xmlquery/queryargument/ConditionQueryArgument.class.php b/classes/xml/xmlquery/queryargument/ConditionQueryArgument.class.php deleted file mode 100644 index 8c5743dc0..000000000 --- a/classes/xml/xmlquery/queryargument/ConditionQueryArgument.class.php +++ /dev/null @@ -1,26 +0,0 @@ -argument_name = $tag->attrs->var; - - $name = $tag->attrs->column; - if(strpos($name, '.') === false) $this->column_name = $name; - else { - list($prefix, $name) = explode('.', $name); - $this->column_name = $name; - } - - require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/validator/QueryArgumentValidator.class.php'); - require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/validator/ConditionQueryArgumentValidator.class.php'); - $this->argument_validator = new ConditionQueryArgumentValidator($tag); - } - - function getColumnName(){ - return $this->column_name; - } - } -?> \ No newline at end of file diff --git a/classes/xml/xmlquery/queryargument/validator/ConditionQueryArgumentValidator.class.php b/classes/xml/xmlquery/queryargument/validator/ConditionQueryArgumentValidator.class.php deleted file mode 100644 index 4a74b809c..000000000 --- a/classes/xml/xmlquery/queryargument/validator/ConditionQueryArgumentValidator.class.php +++ /dev/null @@ -1,20 +0,0 @@ -argument_name) return ''; - if(!isset($this->validator_string)){ - $validator = parent::toString(); - require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/validator/EscapeCheck.class.php'); - $v = new EscapeCheck($this->argument_name); - $validator .= $v->toString(); - $this->validator_string = $validator; - } - return $this->validator_string; - } - } -?> \ No newline at end of file diff --git a/classes/xml/xmlquery/queryargument/validator/DefaultCheck.class.php b/classes/xml/xmlquery/queryargument/validator/DefaultCheck.class.php deleted file mode 100644 index e6048fc28..000000000 --- a/classes/xml/xmlquery/queryargument/validator/DefaultCheck.class.php +++ /dev/null @@ -1,25 +0,0 @@ -argument_name = $argument_name; - $this->value = $value; - } - - function toString(){ - if(!isset($this->argument_name)) return ''; - - $value = $this->value->toString(); - - if($this->value->isString()) { - $value = "'".$value."'"; - } - - return 'if(!isset($args->'.$this->argument_name.')) $args->'.$this->argument_name.' = '.$value.';'."\n"; - } - } - -?> \ No newline at end of file diff --git a/classes/xml/xmlquery/queryargument/validator/EscapeCheck.class.php b/classes/xml/xmlquery/queryargument/validator/EscapeCheck.class.php deleted file mode 100644 index 1d37cb953..000000000 --- a/classes/xml/xmlquery/queryargument/validator/EscapeCheck.class.php +++ /dev/null @@ -1,21 +0,0 @@ -argument_name = $argument_name; - } - - function toString(){ - return sprintf("if(is_string(\$args->%s) && !is_numeric(\$args->%s)) \$args->%s = \$dbParser->escapeString(\$args->%s);\n" - , $this->argument_name - , $this->argument_name - , $this->argument_name - , $this->argument_name); - } - } - -?> \ No newline at end of file diff --git a/classes/xml/xmlquery/queryargument/validator/FilterValidator.class.php b/classes/xml/xmlquery/queryargument/validator/FilterValidator.class.php deleted file mode 100644 index 29a8e9cbf..000000000 --- a/classes/xml/xmlquery/queryargument/validator/FilterValidator.class.php +++ /dev/null @@ -1,16 +0,0 @@ -argument_name = $argument_name; - $this->filter = $filter; - } - - function toString(){ - return sprintf('if(isset($args->%s)) { unset($_output); $_output = $this->checkFilter("%s",$args->%s,"%s"); if(!$_output->toBool()) return $_output; } %s',$this->argument_name, $this->argument_name,$this->argument_name,$this->filter,"\n"); - } - } - -?> \ No newline at end of file diff --git a/classes/xml/xmlquery/queryargument/validator/MaxLengthValidator.class.php b/classes/xml/xmlquery/queryargument/validator/MaxLengthValidator.class.php deleted file mode 100644 index 3d94cd12e..000000000 --- a/classes/xml/xmlquery/queryargument/validator/MaxLengthValidator.class.php +++ /dev/null @@ -1,22 +0,0 @@ -argument_name = $argument_name; - $this->value = $value; - } - - function toString(){ - return 'if($args->' - .$this->argument_name - .'&&strlen($args->'.$this->argument_name.')>'.$this->value - .') return new Object(-1, sprintf($lang->filter->outofrange, $lang->' - .$this->argument_name.'?$lang->' - .$this->argument_name.':\''.$this->argument_name.'\'));'."\n"; - } - } - -?> \ No newline at end of file diff --git a/classes/xml/xmlquery/queryargument/validator/MinLengthValidator.class.php b/classes/xml/xmlquery/queryargument/validator/MinLengthValidator.class.php deleted file mode 100644 index 2717f4487..000000000 --- a/classes/xml/xmlquery/queryargument/validator/MinLengthValidator.class.php +++ /dev/null @@ -1,22 +0,0 @@ -argument_name = $argument_name; - $this->value = $value; - } - - function toString(){ - return 'if($args->' - .$this->argument_name - .'&&strlen($args->'.$this->argument_name.')<'.$this->value - .') return new Object(-1, sprintf($lang->filter->outofrange, $lang->' - .$this->argument_name.'?$lang->' - .$this->argument_name.':\''.$this->argument_name.'\'));'."\n"; - } - } - -?> \ No newline at end of file diff --git a/classes/xml/xmlquery/queryargument/validator/NotNullValidator.class.php b/classes/xml/xmlquery/queryargument/validator/NotNullValidator.class.php deleted file mode 100644 index 4f87b0462..000000000 --- a/classes/xml/xmlquery/queryargument/validator/NotNullValidator.class.php +++ /dev/null @@ -1,18 +0,0 @@ -argument_name = $argument_name; - $this->value = $value; - } - - function toString(){ - return 'if(!isset($args->'.$this->argument_name.')) return new Object(-1, sprintf($lang->filter->isnull, $lang->' - .$this->argument_name.'?$lang->'.$this->argument_name.':\''.$this->argument_name.'\'));'."\n"; - } - - } -?> \ No newline at end of file diff --git a/classes/xml/xmlquery/tags/column/DeleteColumnTag.class.php b/classes/xml/xmlquery/tags/column/DeleteColumnTag.class.php index 0c2b1b6db..24c5d094c 100644 --- a/classes/xml/xmlquery/tags/column/DeleteColumnTag.class.php +++ b/classes/xml/xmlquery/tags/column/DeleteColumnTag.class.php @@ -16,15 +16,7 @@ require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/QueryArgument.class.php'); $this->argument = new QueryArgument($column); } - function toString(){ - $output_columns = 'array(' . PHP_EOL; - foreach($this->argument as $argument){ - $output_columns .= $argument->getExpressionString() . PHP_EOL . ','; - } - $output_columns = substr($output_columns, 0, -1); - $output_columns .= ')'; - return $output_columns; - } + function getExpressionString(){ return sprintf('new DeleteExpression(\'%s\', $args->%s)' , $this->name @@ -33,11 +25,7 @@ function getArgument(){ return $this->argument; - } - - function getValidatorString(){ - return $this->argument->getValidatorString(); - } + } } ?> \ No newline at end of file diff --git a/classes/xml/xmlquery/tags/column/DeleteColumnsTag.class.php b/classes/xml/xmlquery/tags/column/DeleteColumnsTag.class.php index b242d7ca0..662328479 100644 --- a/classes/xml/xmlquery/tags/column/DeleteColumnsTag.class.php +++ b/classes/xml/xmlquery/tags/column/DeleteColumnsTag.class.php @@ -27,6 +27,7 @@ $this->columns[] = new DeleteColumnTag($column, $this->dbParser); } } + function toString(){ $output_columns = 'array(' . PHP_EOL; foreach($this->columns as $column){ @@ -43,15 +44,7 @@ $arguments[] = $column->getArgument(); } return $arguments; - } - - function getValidatorString(){ - $validator = ''; - foreach($this->columns as $column){ - $validator .= $column->getValidatorString(); - } - return $validator; - } + } } diff --git a/classes/xml/xmlquery/tags/column/InsertColumnTag.class.php b/classes/xml/xmlquery/tags/column/InsertColumnTag.class.php index 9dfba9247..d18f95685 100644 --- a/classes/xml/xmlquery/tags/column/InsertColumnTag.class.php +++ b/classes/xml/xmlquery/tags/column/InsertColumnTag.class.php @@ -15,17 +15,7 @@ $this->name = $this->dbParser->parseColumnName($this->name); require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/QueryArgument.class.php'); $this->argument = new QueryArgument($column); - } - - function toString(){ - $output_columns = 'array(' . PHP_EOL; - foreach($this->argument as $argument){ - $output_columns .= $argument->getExpressionString() . PHP_EOL . ','; - } - $output_columns = substr($output_columns, 0, -1); - $output_columns .= ')'; - return $output_columns; - } + } function getExpressionString(){ return sprintf('new InsertExpression(\'%s\', $%s_argument->getValue())' @@ -35,11 +25,7 @@ function getArgument(){ return $this->argument; - } - - function getValidatorString(){ - return $this->argument->getValidatorString(); - } + } } ?> \ No newline at end of file diff --git a/classes/xml/xmlquery/tags/column/InsertColumnsTag.class.php b/classes/xml/xmlquery/tags/column/InsertColumnsTag.class.php index 086cbba2d..d5aafd30a 100644 --- a/classes/xml/xmlquery/tags/column/InsertColumnsTag.class.php +++ b/classes/xml/xmlquery/tags/column/InsertColumnsTag.class.php @@ -27,6 +27,7 @@ $this->columns[] = new InsertColumnTag($column, $this->dbParser); } } + function toString(){ $output_columns = 'array(' . PHP_EOL; foreach($this->columns as $column){ @@ -43,15 +44,7 @@ $arguments[] = $column->getArgument(); } return $arguments; - } - - function getValidatorString(){ - $validator = ''; - foreach($this->columns as $column){ - $validator .= $column->getValidatorString(); - } - return $validator; - } + } } diff --git a/classes/xml/xmlquery/tags/column/SelectColumnsTag.class.php b/classes/xml/xmlquery/tags/column/SelectColumnsTag.class.php index 15102f130..ef0d952a2 100644 --- a/classes/xml/xmlquery/tags/column/SelectColumnsTag.class.php +++ b/classes/xml/xmlquery/tags/column/SelectColumnsTag.class.php @@ -36,10 +36,6 @@ function getArguments(){ return array(); - } - - function getValidatorString(){ - return ''; - } + } } ?> diff --git a/classes/xml/xmlquery/tags/column/UpdateColumnTag.class.php b/classes/xml/xmlquery/tags/column/UpdateColumnTag.class.php index d41905e59..90b44b0e9 100644 --- a/classes/xml/xmlquery/tags/column/UpdateColumnTag.class.php +++ b/classes/xml/xmlquery/tags/column/UpdateColumnTag.class.php @@ -19,15 +19,6 @@ $this->argument = new QueryArgument($column); } - function toString(){ - $output_columns = 'array(' . PHP_EOL; - foreach($this->argument as $argument){ - $output_columns .= $argument->getExpressionString() . PHP_EOL . ','; - } - $output_columns = substr($output_columns, 0, -1); - $output_columns .= ')'; - return $output_columns; - } function getExpressionString(){ return sprintf('new UpdateExpression(\'%s\', $%s_argument->getValue())' , $this->name @@ -36,11 +27,7 @@ function getArgument(){ return $this->argument; - } - - function getValidatorString(){ - return $this->argument->getValidatorString(); - } + } } ?> \ No newline at end of file diff --git a/classes/xml/xmlquery/tags/column/UpdateColumnsTag.class.php b/classes/xml/xmlquery/tags/column/UpdateColumnsTag.class.php index 2f1feba0f..9ead8811a 100644 --- a/classes/xml/xmlquery/tags/column/UpdateColumnsTag.class.php +++ b/classes/xml/xmlquery/tags/column/UpdateColumnsTag.class.php @@ -48,14 +48,7 @@ } return $arguments; } - - function getValidatorString(){ - $validator = ''; - foreach($this->columns as $column){ - $validator .= $column->getValidatorString(); - } - return $validator; - } + } ?> \ No newline at end of file diff --git a/classes/xml/xmlquery/tags/condition/ConditionGroupTag.class.php b/classes/xml/xmlquery/tags/condition/ConditionGroupTag.class.php index 93de1dde9..58546f761 100644 --- a/classes/xml/xmlquery/tags/condition/ConditionGroupTag.class.php +++ b/classes/xml/xmlquery/tags/condition/ConditionGroupTag.class.php @@ -39,14 +39,6 @@ } return $arguments; } - - function getValidatorString(){ - $validator = ''; - foreach($this->conditions as $condition){ - $validator .= $condition->getValidatorString(); - } - return $validator; - } } ?> \ No newline at end of file diff --git a/classes/xml/xmlquery/tags/condition/ConditionTag.class.php b/classes/xml/xmlquery/tags/condition/ConditionTag.class.php index 626a4a0b0..ae5eb08d2 100644 --- a/classes/xml/xmlquery/tags/condition/ConditionTag.class.php +++ b/classes/xml/xmlquery/tags/condition/ConditionTag.class.php @@ -44,10 +44,6 @@ , '"'.$this->operation.'"' , $this->pipe ? ", '" . $this->pipe . "'" : '' ); - } - - function getValidatorString(){ - return $this->argument->getValidatorString(); - } + } } ?> \ No newline at end of file diff --git a/classes/xml/xmlquery/tags/condition/ConditionsTag.class.php b/classes/xml/xmlquery/tags/condition/ConditionsTag.class.php index ef174bc2e..fec1063cd 100644 --- a/classes/xml/xmlquery/tags/condition/ConditionsTag.class.php +++ b/classes/xml/xmlquery/tags/condition/ConditionsTag.class.php @@ -39,14 +39,6 @@ $arguments = array_merge($arguments, $condition->getArguments()); } return $arguments; - } - - function getValidatorString(){ - $validator = ''; - foreach($this->condition_groups as $condition){ - $validator .= $condition->getValidatorString(); - } - return $validator; - } + } } ?> \ No newline at end of file diff --git a/classes/xml/xmlquery/tags/navigation/IndexTag.class.php b/classes/xml/xmlquery/tags/navigation/IndexTag.class.php index febb8628f..ed2d79e54 100644 --- a/classes/xml/xmlquery/tags/navigation/IndexTag.class.php +++ b/classes/xml/xmlquery/tags/navigation/IndexTag.class.php @@ -36,14 +36,7 @@ if($this->sort_order_argument) $arguments[] = $this->sort_order_argument; return $arguments; - } - - function getValidatorString(){ - $validator = $this->argument->getValidatorString(); - if($this->sort_order_argument) - $validator .= $this->sort_order_argument->getValidatorString(); - return $validator; - } + } } ?> \ No newline at end of file diff --git a/classes/xml/xmlquery/tags/navigation/NavigationTag.class.php b/classes/xml/xmlquery/tags/navigation/NavigationTag.class.php index 98824592b..c8dba8b94 100644 --- a/classes/xml/xmlquery/tags/navigation/NavigationTag.class.php +++ b/classes/xml/xmlquery/tags/navigation/NavigationTag.class.php @@ -46,14 +46,6 @@ $arguments = array_merge($order->getArguments(), $arguments); } return $arguments; - } - - function getValidatorString(){ - $validator = ''; - foreach ($this->order as $order){ - $validator .= $order->getValidatorString(); - } - return $validator; } } From abba8761cccdef26c8f454e0bb917b660ac86ae9 Mon Sep 17 00:00:00 2001 From: mosmartin Date: Mon, 23 May 2011 08:42:16 +0000 Subject: [PATCH 0090/1372] fixed an issue when default argument name is column name git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0-DB@8391 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/xml/xmlquery/argument/Argument.class.php | 2 +- classes/xml/xmlquery/queryargument/QueryArgument.class.php | 2 ++ .../queryargument/validator/QueryArgumentValidator.class.php | 1 + classes/xml/xmlquery/tags/condition/ConditionTag.class.php | 3 ++- 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/classes/xml/xmlquery/argument/Argument.class.php b/classes/xml/xmlquery/argument/Argument.class.php index 23cb46539..8e8e3fb88 100644 --- a/classes/xml/xmlquery/argument/Argument.class.php +++ b/classes/xml/xmlquery/argument/Argument.class.php @@ -34,7 +34,7 @@ if(!isset($this->value)) return; if($column_type === '') return; //if($column_type === '') $column_type = 'varchar'; - if(in_array($column_type, array('date', 'varchar', 'char'))) + if(in_array($column_type, array('date', 'varchar', 'char', 'bigtext'))) $this->value = '\''.$this->value.'\''; } diff --git a/classes/xml/xmlquery/queryargument/QueryArgument.class.php b/classes/xml/xmlquery/queryargument/QueryArgument.class.php index b18e6d784..a8df696f7 100644 --- a/classes/xml/xmlquery/queryargument/QueryArgument.class.php +++ b/classes/xml/xmlquery/queryargument/QueryArgument.class.php @@ -17,6 +17,8 @@ } if(!$this->argument_name) $this->argument_name = $tag->attrs->name; + if(!$this->argument_name) $this->argument_name = $tag->attrs->column; + require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/validator/QueryArgumentValidator.class.php'); $this->argument_validator = new QueryArgumentValidator($tag); diff --git a/classes/xml/xmlquery/queryargument/validator/QueryArgumentValidator.class.php b/classes/xml/xmlquery/queryargument/validator/QueryArgumentValidator.class.php index 371dd33c3..9c4d478df 100644 --- a/classes/xml/xmlquery/queryargument/validator/QueryArgumentValidator.class.php +++ b/classes/xml/xmlquery/queryargument/validator/QueryArgumentValidator.class.php @@ -14,6 +14,7 @@ function QueryArgumentValidator($tag){ $this->argument_name = $tag->attrs->var; if(!$this->argument_name) $this->argument_name = $tag->attrs->name; + if(!$this->argument_name) $this->argument_name = $tag->attrs->column; $this->default_value = $tag->attrs->default; $this->notnull = $tag->attrs->notnull; $this->filter = $tag->attrs->filter; diff --git a/classes/xml/xmlquery/tags/condition/ConditionTag.class.php b/classes/xml/xmlquery/tags/condition/ConditionTag.class.php index ae5eb08d2..563f2c4e0 100644 --- a/classes/xml/xmlquery/tags/condition/ConditionTag.class.php +++ b/classes/xml/xmlquery/tags/condition/ConditionTag.class.php @@ -22,8 +22,9 @@ $this->operation = $condition->attrs->operation; $this->pipe = $condition->attrs->pipe; $this->column_name = $this->dbParser->parseColumnName($condition->attrs->column); - // TODO fix this hack - should use default value for query argument + // TODO fix this hack - argument_name is initialized in three places :) [ here, queryArgument and queryArgumentValidator] $this->argument_name = $condition->attrs->var; + if(!$this->argument_name) $this->argument_name = $condition->attrs->column; $this->default_column = $this->dbParser->parseColumnName($condition->attrs->default); require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/QueryArgument.class.php'); $this->argument = new QueryArgument($condition); From 52c3d503bc220fb77efbc144ba1f4e20055f8428 Mon Sep 17 00:00:00 2001 From: mosmartin Date: Mon, 23 May 2011 09:01:00 +0000 Subject: [PATCH 0091/1372] Changed code to use dbParser as singleton - instead of passing it in the constructor every time. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0-DB@8392 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/xml/XmlQueryParser.class.php | 16 ++++++------- classes/xml/xmlquery/QueryParser.class.php | 23 ++++++++----------- .../xmlquery/tags/column/ColumnTag.class.php | 4 +--- .../tags/column/DeleteColumnTag.class.php | 7 +++--- .../tags/column/DeleteColumnsTag.class.php | 7 ++---- .../tags/column/InsertColumnTag.class.php | 7 +++--- .../tags/column/InsertColumnsTag.class.php | 7 ++---- .../tags/column/SelectColumnTag.class.php | 13 +++++++---- .../tags/column/SelectColumnsTag.class.php | 9 +++----- .../tags/column/UpdateColumnTag.class.php | 7 +++--- .../tags/column/UpdateColumnsTag.class.php | 14 +++-------- .../condition/ConditionGroupTag.class.php | 9 +++----- .../tags/condition/ConditionTag.class.php | 9 ++++---- .../tags/condition/ConditionsTag.class.php | 8 +++---- .../condition/JoinConditionsTag.class.php | 4 ++-- .../xmlquery/tags/group/GroupsTag.class.php | 9 ++++---- .../tags/navigation/IndexTag.class.php | 11 ++++----- .../tags/navigation/NavigationTag.class.php | 5 ++-- .../xmlquery/tags/table/TableTag.class.php | 20 ++++++++-------- .../xmlquery/tags/table/TablesTag.class.php | 6 ++--- 20 files changed, 82 insertions(+), 113 deletions(-) diff --git a/classes/xml/XmlQueryParser.class.php b/classes/xml/XmlQueryParser.class.php index 8e1595056..1b4b4514d 100644 --- a/classes/xml/XmlQueryParser.class.php +++ b/classes/xml/XmlQueryParser.class.php @@ -23,22 +23,20 @@ $action = strtolower($xml_obj->query->attrs->action); if(!$action) return; - //$oDB = &DB::getParser(); - //$dbParser = $oDB->getParser(); - $dbParser = $this->getDBParser(); - $parser = new QueryParser($xml_obj->query, $dbParser); + $parser = new QueryParser($xml_obj->query); FileHandler::writeFile($cache_file, $parser->toString()); } // singleton - function getDBParser(){ - if(!$this->dbParser){ + function &getDBParser(){ + static $dbParser; + if(!$dbParser){ //$oDB = &DB::getParser(); - //$dbParser = $oDB->getParser(); - $this->dbParser = new DBParser('"'); + //self::$dbParser = $oDB->getParser(); + $dbParser = new DBParser('"'); } - return $this->dbParser; + return $dbParser; } function getXmlFileContent($xml_file){ diff --git a/classes/xml/xmlquery/QueryParser.class.php b/classes/xml/xmlquery/QueryParser.class.php index a446c38f9..96898c5f2 100644 --- a/classes/xml/xmlquery/QueryParser.class.php +++ b/classes/xml/xmlquery/QueryParser.class.php @@ -17,16 +17,12 @@ class QueryParser { var $action; var $query_id; - var $dbParser; - var $column_type; - function QueryParser($query, $dbParser){ + function QueryParser($query){ $this->query = $query; $this->action = $this->query->attrs->action; $this->query_id = $this->query->attrs->id; - - $this->dbParser = $dbParser; } function getQueryId(){ @@ -97,20 +93,20 @@ class QueryParser { function toString(){ if($this->action == 'select'){ - $columns = new SelectColumnsTag($this->query->columns->column, $this->dbParser); + $columns = new SelectColumnsTag($this->query->columns->column); }else if($this->action == 'insert'){ - $columns = new InsertColumnsTag($this->query->columns->column, $this->dbParser); + $columns = new InsertColumnsTag($this->query->columns->column); }else if($this->action == 'update') { - $columns = new UpdateColumnsTag($this->query->columns->column, $this->dbParser); + $columns = new UpdateColumnsTag($this->query->columns->column); }else if($this->action == 'delete') { - $columns = new DeleteColumnsTag($this->query->columns->column, $this->dbParser); + $columns = new DeleteColumnsTag($this->query->columns->column); } - $tables = new TablesTag($this->query->tables->table, $this->dbParser); - $conditions = new ConditionsTag($this->query->conditions, $this->dbParser); - $groups = new GroupsTag($this->query->groups->group, $this->dbParser); - $navigation = new NavigationTag($this->query->navigation, $this->dbParser); + $tables = new TablesTag($this->query->tables->table); + $conditions = new ConditionsTag($this->query->conditions); + $groups = new GroupsTag($this->query->groups->group); + $navigation = new NavigationTag($this->query->navigation); $this->setTableColumnTypes($tables); @@ -139,7 +135,6 @@ class QueryParser { $buff .= '$output->orderby = ' . $navigation->getOrderByString() .';'; return "dbParser->getEscapeChar()."');\n" . sprintf('$output->query_id = "%s";%s', $this->query_id, "\n") . sprintf('$output->action = "%s";%s', $this->action, "\n") . $prebuff diff --git a/classes/xml/xmlquery/tags/column/ColumnTag.class.php b/classes/xml/xmlquery/tags/column/ColumnTag.class.php index 7cf066013..8ffe77373 100644 --- a/classes/xml/xmlquery/tags/column/ColumnTag.class.php +++ b/classes/xml/xmlquery/tags/column/ColumnTag.class.php @@ -12,10 +12,8 @@ class ColumnTag { var $name; - var $dbParser; - function ColumnTag($name, $dbParser){ - $this->dbParser = $dbParser; + function ColumnTag($name){ $this->name = $name; } } \ No newline at end of file diff --git a/classes/xml/xmlquery/tags/column/DeleteColumnTag.class.php b/classes/xml/xmlquery/tags/column/DeleteColumnTag.class.php index 24c5d094c..3ac64a2c4 100644 --- a/classes/xml/xmlquery/tags/column/DeleteColumnTag.class.php +++ b/classes/xml/xmlquery/tags/column/DeleteColumnTag.class.php @@ -10,9 +10,10 @@ class DeleteColumnTag extends ColumnTag { var $argument; - function DeleteColumnTag($column, $dbParser) { - parent::ColumnTag($column->attrs->name, $dbParser); - $this->name = $this->dbParser->parseColumnName($this->name); + function DeleteColumnTag($column) { + parent::ColumnTag($column->attrs->name); + $dbParser = XmlQueryParser::getDBParser(); + $this->name = $dbParser->parseColumnName($this->name); require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/QueryArgument.class.php'); $this->argument = new QueryArgument($column); } diff --git a/classes/xml/xmlquery/tags/column/DeleteColumnsTag.class.php b/classes/xml/xmlquery/tags/column/DeleteColumnsTag.class.php index 662328479..753d79cf0 100644 --- a/classes/xml/xmlquery/tags/column/DeleteColumnsTag.class.php +++ b/classes/xml/xmlquery/tags/column/DeleteColumnsTag.class.php @@ -10,12 +10,9 @@ require_once(_XE_PATH_.'classes/xml/xmlquery/tags/column/DeleteColumnTag.class.php'); class DeleteColumnsTag{ - var $dbParser; var $columns; - function DeleteColumnsTag($xml_columns, $dbParser) { - $this->dbParser = $dbParser; - + function DeleteColumnsTag($xml_columns) { $this->columns = array(); if(!$xml_columns) @@ -24,7 +21,7 @@ if(!is_array($xml_columns)) $xml_columns = array($xml_columns); foreach($xml_columns as $column){ - $this->columns[] = new DeleteColumnTag($column, $this->dbParser); + $this->columns[] = new DeleteColumnTag($column); } } diff --git a/classes/xml/xmlquery/tags/column/InsertColumnTag.class.php b/classes/xml/xmlquery/tags/column/InsertColumnTag.class.php index d18f95685..1d42ffb3a 100644 --- a/classes/xml/xmlquery/tags/column/InsertColumnTag.class.php +++ b/classes/xml/xmlquery/tags/column/InsertColumnTag.class.php @@ -10,9 +10,10 @@ class InsertColumnTag extends ColumnTag { var $argument; - function InsertColumnTag($column, $dbParser) { - parent::ColumnTag($column->attrs->name, $dbParser); - $this->name = $this->dbParser->parseColumnName($this->name); + function InsertColumnTag($column) { + parent::ColumnTag($column->attrs->name); + $dbParser = XmlQueryParser::getDBParser(); + $this->name = $dbParser->parseColumnName($this->name); require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/QueryArgument.class.php'); $this->argument = new QueryArgument($column); } diff --git a/classes/xml/xmlquery/tags/column/InsertColumnsTag.class.php b/classes/xml/xmlquery/tags/column/InsertColumnsTag.class.php index d5aafd30a..5f0893b1f 100644 --- a/classes/xml/xmlquery/tags/column/InsertColumnsTag.class.php +++ b/classes/xml/xmlquery/tags/column/InsertColumnsTag.class.php @@ -10,12 +10,9 @@ require_once(_XE_PATH_.'classes/xml/xmlquery/tags/column/InsertColumnTag.class.php'); class InsertColumnsTag{ - var $dbParser; var $columns; - function InsertColumnsTag($xml_columns, $dbParser) { - $this->dbParser = $dbParser; - + function InsertColumnsTag($xml_columns) { $this->columns = array(); if(!$xml_columns) @@ -24,7 +21,7 @@ if(!is_array($xml_columns)) $xml_columns = array($xml_columns); foreach($xml_columns as $column){ - $this->columns[] = new InsertColumnTag($column, $this->dbParser); + $this->columns[] = new InsertColumnTag($column); } } diff --git a/classes/xml/xmlquery/tags/column/SelectColumnTag.class.php b/classes/xml/xmlquery/tags/column/SelectColumnTag.class.php index ca7a40eff..61031dfcc 100644 --- a/classes/xml/xmlquery/tags/column/SelectColumnTag.class.php +++ b/classes/xml/xmlquery/tags/column/SelectColumnTag.class.php @@ -11,11 +11,13 @@ var $alias; var $click_count; - function SelectColumnTag($column, $dbParser){ - parent::ColumnTag($column->attrs->name, $dbParser); + function SelectColumnTag($column){ + parent::ColumnTag($column->attrs->name); if(!$this->name) $this->name = "*"; - if($this->name != "*") - $this->name = $this->dbParser->parseExpression($this->name); + if($this->name != "*") { + $dbParser = XmlQueryParser::getDBParser(); + $this->name = $dbParser->parseExpression($this->name); + } $this->alias = $column->attrs->alias; $this->click_count = $column->attrs->click_count; @@ -25,7 +27,8 @@ if($this->name == '*') return "new StarExpression()"; if($this->click_count) return sprintf('new ClickCountExpression(%s, %s, $args->%s)', $this->name, $this->alias,$this->click_count); - return sprintf('new SelectExpression(\'%s\'%s)', $this->name, $this->alias ? ', \''.$this->dbParser->escape($this->alias) .'\'': ''); + $dbParser = XmlQueryParser::getDBParser(); + return sprintf('new SelectExpression(\'%s\'%s)', $this->name, $this->alias ? ', \''.$dbParser->escape($this->alias) .'\'': ''); } } ?> \ No newline at end of file diff --git a/classes/xml/xmlquery/tags/column/SelectColumnsTag.class.php b/classes/xml/xmlquery/tags/column/SelectColumnsTag.class.php index ef0d952a2..e5e741042 100644 --- a/classes/xml/xmlquery/tags/column/SelectColumnsTag.class.php +++ b/classes/xml/xmlquery/tags/column/SelectColumnsTag.class.php @@ -4,23 +4,20 @@ require_once(_XE_PATH_.'classes/xml/xmlquery/tags/column/SelectColumnTag.class.php'); class SelectColumnsTag { - var $dbParser; var $columns; - function SelectColumnsTag($xml_columns, $dbParser){ - $this->dbParser = $dbParser; - + function SelectColumnsTag($xml_columns){ $this->columns = array(); if(!$xml_columns) { - $this->columns[] = new SelectColumnTag("*", $this->dbParser); + $this->columns[] = new SelectColumnTag("*"); return; } if(!is_array($xml_columns)) $xml_columns = array($xml_columns); foreach($xml_columns as $column){ - $this->columns[] = new SelectColumnTag($column, $this->dbParser); + $this->columns[] = new SelectColumnTag($column); } } diff --git a/classes/xml/xmlquery/tags/column/UpdateColumnTag.class.php b/classes/xml/xmlquery/tags/column/UpdateColumnTag.class.php index 90b44b0e9..93d4c2b5b 100644 --- a/classes/xml/xmlquery/tags/column/UpdateColumnTag.class.php +++ b/classes/xml/xmlquery/tags/column/UpdateColumnTag.class.php @@ -12,9 +12,10 @@ class UpdateColumnTag extends ColumnTag { var $argument; - function UpdateColumnTag($column, $dbParser) { - parent::ColumnTag($column->attrs->name, $dbParser); - $this->name = $this->dbParser->parseColumnName($this->name); + function UpdateColumnTag($column) { + parent::ColumnTag($column->attrs->name); + $dbParser = XmlQueryParser::getDBParser(); + $this->name = $dbParser->parseColumnName($this->name); require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/QueryArgument.class.php'); $this->argument = new QueryArgument($column); } diff --git a/classes/xml/xmlquery/tags/column/UpdateColumnsTag.class.php b/classes/xml/xmlquery/tags/column/UpdateColumnsTag.class.php index 9ead8811a..a0a856af1 100644 --- a/classes/xml/xmlquery/tags/column/UpdateColumnsTag.class.php +++ b/classes/xml/xmlquery/tags/column/UpdateColumnsTag.class.php @@ -11,23 +11,15 @@ require_once(_XE_PATH_.'classes/xml/xmlquery/tags/column/UpdateColumnTag.class.php'); class UpdateColumnsTag{ - var $dbParser; var $columns; - function UpdateColumnsTag($xml_columns, $dbParser) { - $this->dbParser = $dbParser; - + function UpdateColumnsTag($xml_columns) { $this->columns = array(); - - if(!$xml_columns) { - $this->columns[] = new UpdateColumnTag("*", $this->dbParser); - return; - } - + if(!is_array($xml_columns)) $xml_columns = array($xml_columns); foreach($xml_columns as $column){ - $this->columns[] = new UpdateColumnTag($column, $this->dbParser); + $this->columns[] = new UpdateColumnTag($column); } } diff --git a/classes/xml/xmlquery/tags/condition/ConditionGroupTag.class.php b/classes/xml/xmlquery/tags/condition/ConditionGroupTag.class.php index 58546f761..bd62f0137 100644 --- a/classes/xml/xmlquery/tags/condition/ConditionGroupTag.class.php +++ b/classes/xml/xmlquery/tags/condition/ConditionGroupTag.class.php @@ -1,20 +1,17 @@ dbParser = $dbParser; + function ConditionGroupTag($conditions, $pipe = ""){ $this->pipe = $pipe; if(!is_array($conditions)) $conditions = array($conditions); if(count($conditions))require_once(_XE_PATH_.'classes/xml/xmlquery/tags/condition/ConditionTag.class.php'); foreach($conditions as $condition){ - $this->conditions[] = new ConditionTag($condition, $dbParser); + $this->conditions[] = new ConditionTag($condition); } } diff --git a/classes/xml/xmlquery/tags/condition/ConditionTag.class.php b/classes/xml/xmlquery/tags/condition/ConditionTag.class.php index 563f2c4e0..a422cd7c3 100644 --- a/classes/xml/xmlquery/tags/condition/ConditionTag.class.php +++ b/classes/xml/xmlquery/tags/condition/ConditionTag.class.php @@ -8,7 +8,6 @@ */ class ConditionTag { - var $dbParser; var $operation; var $column_name; @@ -17,15 +16,15 @@ var $argument; var $default_column; - function ConditionTag($condition, $dbParser){ - $this->dbParser = $dbParser; + function ConditionTag($condition){ $this->operation = $condition->attrs->operation; $this->pipe = $condition->attrs->pipe; - $this->column_name = $this->dbParser->parseColumnName($condition->attrs->column); + $dbParser = XmlQueryParser::getDBParser(); + $this->column_name = $dbParser->parseColumnName($condition->attrs->column); // TODO fix this hack - argument_name is initialized in three places :) [ here, queryArgument and queryArgumentValidator] $this->argument_name = $condition->attrs->var; if(!$this->argument_name) $this->argument_name = $condition->attrs->column; - $this->default_column = $this->dbParser->parseColumnName($condition->attrs->default); + $this->default_column = $dbParser->parseColumnName($condition->attrs->default); require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/QueryArgument.class.php'); $this->argument = new QueryArgument($condition); } diff --git a/classes/xml/xmlquery/tags/condition/ConditionsTag.class.php b/classes/xml/xmlquery/tags/condition/ConditionsTag.class.php index fec1063cd..1d17ea1e3 100644 --- a/classes/xml/xmlquery/tags/condition/ConditionsTag.class.php +++ b/classes/xml/xmlquery/tags/condition/ConditionsTag.class.php @@ -1,16 +1,14 @@ dbParser = $dbParser; + function ConditionsTag($xml_conditions){ $this->condition_groups = array(); $xml_condition_list = $xml_conditions->condition; if($xml_condition_list){ require_once(_XE_PATH_.'classes/xml/xmlquery/tags/condition/ConditionGroupTag.class.php'); - $this->condition_groups[] = new ConditionGroupTag($xml_condition_list, $this->dbParser); + $this->condition_groups[] = new ConditionGroupTag($xml_condition_list); } $xml_groups = $xml_conditions->group; @@ -18,7 +16,7 @@ if(!is_array($xml_groups)) $xml_groups = array($xml_groups); require_once(_XE_PATH_.'classes/xml/xmlquery/tags/condition/ConditionGroupTag.class.php'); foreach($xml_groups as $group){ - $this->condition_groups[] = new ConditionGroupTag($group->condition, $this->dbParser, $group->pipe); + $this->condition_groups[] = new ConditionGroupTag($group->condition, $group->pipe); } } } diff --git a/classes/xml/xmlquery/tags/condition/JoinConditionsTag.class.php b/classes/xml/xmlquery/tags/condition/JoinConditionsTag.class.php index 1568ecbb7..3b59989f6 100644 --- a/classes/xml/xmlquery/tags/condition/JoinConditionsTag.class.php +++ b/classes/xml/xmlquery/tags/condition/JoinConditionsTag.class.php @@ -2,8 +2,8 @@ class JoinConditionsTag extends ConditionsTag { - function JoinConditionsTag($xml_conditions, $dbParser){ - parent::ConditionsTag($xml_conditions, $dbParser); + function JoinConditionsTag($xml_conditions){ + parent::ConditionsTag($xml_conditions); $this->condition_groups[0]->conditions[0]->setPipe(""); } } diff --git a/classes/xml/xmlquery/tags/group/GroupsTag.class.php b/classes/xml/xmlquery/tags/group/GroupsTag.class.php index 266e9accb..19f74fe43 100644 --- a/classes/xml/xmlquery/tags/group/GroupsTag.class.php +++ b/classes/xml/xmlquery/tags/group/GroupsTag.class.php @@ -2,21 +2,20 @@ class GroupsTag { var $groups; - var $dbParser; - function GroupsTag($xml_groups, $dbParser){ - $this->dbParser = $dbParser; - + function GroupsTag($xml_groups){ $this->groups = array(); if($xml_groups) { if(!is_array($xml_groups)) $xml_groups = array($xml_groups); + $dbParser = XmlQueryParser::getDBParser(); for($i=0;$iattrs->column); if(!$column) continue; - $column = $this->dbParser->parseExpression($column); + + $column = $dbParser->parseExpression($column); $this->groups[] = $column; } } diff --git a/classes/xml/xmlquery/tags/navigation/IndexTag.class.php b/classes/xml/xmlquery/tags/navigation/IndexTag.class.php index ed2d79e54..aae32d16b 100644 --- a/classes/xml/xmlquery/tags/navigation/IndexTag.class.php +++ b/classes/xml/xmlquery/tags/navigation/IndexTag.class.php @@ -1,18 +1,17 @@ dbParser = $dbParser; + function IndexTag($index){ $this->argument_name = $index->attrs->var; - $index->attrs->default = $this->dbParser->parseExpression($index->attrs->default); + + $dbParser = XmlQueryParser::getDBParser(); + $index->attrs->default = $dbParser->parseExpression($index->attrs->default); $this->default = $index->attrs->default; require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/QueryArgument.class.php'); $this->argument = new QueryArgument($index); diff --git a/classes/xml/xmlquery/tags/navigation/NavigationTag.class.php b/classes/xml/xmlquery/tags/navigation/NavigationTag.class.php index c8dba8b94..87fa9d064 100644 --- a/classes/xml/xmlquery/tags/navigation/NavigationTag.class.php +++ b/classes/xml/xmlquery/tags/navigation/NavigationTag.class.php @@ -2,20 +2,19 @@ require_once(_XE_PATH_.'classes/xml/xmlquery/tags/navigation/IndexTag.class.php'); class NavigationTag { - var $dbParser; var $order; var $list_count; var $page_count; var $page; - function NavigationTag($xml_navigation, $dbParser){ + function NavigationTag($xml_navigation){ $this->order = array(); if($xml_navigation) { $order = $xml_navigation->index; if($order) { if(!is_array($order)) $order = array($order); foreach($order as $order_info) { - $this->order[] = new IndexTag($order_info, $dbParser); + $this->order[] = new IndexTag($order_info); } } diff --git a/classes/xml/xmlquery/tags/table/TableTag.class.php b/classes/xml/xmlquery/tags/table/TableTag.class.php index dea2729b7..3f432770d 100644 --- a/classes/xml/xmlquery/tags/table/TableTag.class.php +++ b/classes/xml/xmlquery/tags/table/TableTag.class.php @@ -15,13 +15,12 @@ var $join_type; var $conditions; - var $dbParser; - - function TableTag($table, $dbParser){ - $this->dbParser = $dbParser; + function TableTag($table){ $this->unescaped_name = $table->attrs->name; - $this->name = $this->dbParser->parseTableName($table->attrs->name); + + $dbParser = XmlQueryParser::getDBParser(); + $this->name = $dbParser->parseTableName($table->attrs->name); $this->alias = $table->attrs->alias; //if(!$this->alias) $this->alias = $alias; @@ -44,16 +43,17 @@ } function getTableString(){ + $dbParser = XmlQueryParser::getDBParser(); if($this->isJoinTable()){ - $conditionsTag = new JoinConditionsTag($this->conditions, $this->dbParser); + $conditionsTag = new JoinConditionsTag($this->conditions); return sprintf('new JoinTable(\'%s\', \'%s\', "%s", %s)' - , $this->dbParser->escape($this->name) - , $this->dbParser->escape($this->alias) + , $dbParser->escape($this->name) + , $dbParser->escape($this->alias) , $this->join_type, $conditionsTag->toString()); } return sprintf('new Table(\'%s\'%s)' - , $this->dbParser->escape($this->name) - , $this->alias ? ', \'' . $this->dbParser->escape($this->alias) .'\'' : ''); + , $dbParser->escape($this->name) + , $this->alias ? ', \'' . $dbParser->escape($this->alias) .'\'' : ''); } } diff --git a/classes/xml/xmlquery/tags/table/TablesTag.class.php b/classes/xml/xmlquery/tags/table/TablesTag.class.php index 862cfd9ae..d4560594b 100644 --- a/classes/xml/xmlquery/tags/table/TablesTag.class.php +++ b/classes/xml/xmlquery/tags/table/TablesTag.class.php @@ -1,18 +1,16 @@ dbParser = $dbParser; + function TablesTag($xml_tables){ $this->tables = array(); if(!is_array($xml_tables)) $xml_tables = array($xml_tables); if(count($xml_tables)) require_once(_XE_PATH_.'classes/xml/xmlquery/tags/table/TableTag.class.php'); foreach($xml_tables as $table){ - $this->tables[] = new TableTag($table, $this->dbParser); + $this->tables[] = new TableTag($table); } } From c40ccf777f7486eadfe5d1e104f529fc15a20fab Mon Sep 17 00:00:00 2001 From: mosmartin Date: Mon, 23 May 2011 09:28:18 +0000 Subject: [PATCH 0092/1372] Fixed condition tag bug. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0-DB@8393 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/xml/xmlquery/QueryParser.class.php | 2 +- .../queryargument/QueryArgument.class.php | 2 +- .../tags/condition/ConditionTag.class.php | 17 ++++++++++------- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/classes/xml/xmlquery/QueryParser.class.php b/classes/xml/xmlquery/QueryParser.class.php index 96898c5f2..805140fe5 100644 --- a/classes/xml/xmlquery/QueryParser.class.php +++ b/classes/xml/xmlquery/QueryParser.class.php @@ -117,7 +117,7 @@ class QueryParser { $prebuff = ''; foreach($arguments as $argument){ - if($argument->getArgumentName()){ + if(isset($argument) && $argument->getArgumentName()){ $prebuff .= $argument->toString(); $prebuff .= sprintf("$%s_argument->escapeValue('%s');\n" , $argument->getArgumentName() diff --git a/classes/xml/xmlquery/queryargument/QueryArgument.class.php b/classes/xml/xmlquery/queryargument/QueryArgument.class.php index a8df696f7..63dc9fb98 100644 --- a/classes/xml/xmlquery/queryargument/QueryArgument.class.php +++ b/classes/xml/xmlquery/queryargument/QueryArgument.class.php @@ -17,7 +17,7 @@ } if(!$this->argument_name) $this->argument_name = $tag->attrs->name; - if(!$this->argument_name) $this->argument_name = $tag->attrs->column; + if(!$this->argument_name) $this->argument_name = str_replace('.', '_', $condition->attrs->column); require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/validator/QueryArgumentValidator.class.php'); $this->argument_validator = new QueryArgumentValidator($tag); diff --git a/classes/xml/xmlquery/tags/condition/ConditionTag.class.php b/classes/xml/xmlquery/tags/condition/ConditionTag.class.php index a422cd7c3..4f6017478 100644 --- a/classes/xml/xmlquery/tags/condition/ConditionTag.class.php +++ b/classes/xml/xmlquery/tags/condition/ConditionTag.class.php @@ -21,12 +21,15 @@ $this->pipe = $condition->attrs->pipe; $dbParser = XmlQueryParser::getDBParser(); $this->column_name = $dbParser->parseColumnName($condition->attrs->column); - // TODO fix this hack - argument_name is initialized in three places :) [ here, queryArgument and queryArgumentValidator] - $this->argument_name = $condition->attrs->var; - if(!$this->argument_name) $this->argument_name = $condition->attrs->column; - $this->default_column = $dbParser->parseColumnName($condition->attrs->default); - require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/QueryArgument.class.php'); - $this->argument = new QueryArgument($condition); + + if($condition->attrs->var){ + require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/QueryArgument.class.php'); + $this->argument_name = $condition->attrs->var; + $this->argument = new QueryArgument($condition); + } + else { + $this->default_column = $dbParser->parseColumnName($condition->attrs->default); + } } function setPipe($pipe){ @@ -40,7 +43,7 @@ function getConditionString(){ return sprintf("new Condition('%s',%s,%s%s)" , $this->column_name - , $this->argument_name ? '$' . $this->argument_name . '_argument->getValue()' : "'" . $this->default_column . "'" + , $this->default_column ? "'" . $this->default_column . "'" : '$' . $this->argument_name . '_argument->getValue()' , '"'.$this->operation.'"' , $this->pipe ? ", '" . $this->pipe . "'" : '' ); From 4d2d18b53b9bfe10ed6573e729fe42add5806620 Mon Sep 17 00:00:00 2001 From: mosmartin Date: Mon, 23 May 2011 14:45:00 +0000 Subject: [PATCH 0093/1372] Fixed condition group bug. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0-DB@8394 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- .../queryparts/condition/Condition.class.php | 15 ++- .../condition/ConditionGroup.class.php | 9 +- .../argument/ConditionArgument.class.php | 111 ++++++++++++++++++ .../queryargument/QueryArgument.class.php | 38 ++++-- .../condition/ConditionGroupTag.class.php | 2 +- .../tags/condition/ConditionTag.class.php | 12 +- .../tags/condition/ConditionsTag.class.php | 4 +- .../tags/navigation/NavigationTag.class.php | 4 + modules/opage/queries/getOpageList.xml | 2 +- 9 files changed, 178 insertions(+), 19 deletions(-) create mode 100644 classes/xml/xmlquery/argument/ConditionArgument.class.php diff --git a/classes/db/queryparts/condition/Condition.class.php b/classes/db/queryparts/condition/Condition.class.php index 4db069e72..b77ed1173 100644 --- a/classes/db/queryparts/condition/Condition.class.php +++ b/classes/db/queryparts/condition/Condition.class.php @@ -14,7 +14,11 @@ } function toString(){ - return $this->pipe . ' ' . $this->getConditionPart($this->column_name, $this->value, $this->operation); + return $this->pipe . ' ' . $this->getConditionPart(); + } + + function setPipe($pipe){ + $this->pipe = $pipe; } function show(){ @@ -42,8 +46,13 @@ } return true; } - - function getConditionPart($name, $value, $operation) { + + function getConditionPart() { + + $name = $this->column_name; + $value = $this->value; + $operation = $this->operation; + switch($operation) { case 'equal' : return $name.' = '.$value; diff --git a/classes/db/queryparts/condition/ConditionGroup.class.php b/classes/db/queryparts/condition/ConditionGroup.class.php index bc3a1b888..5e9a943b9 100644 --- a/classes/db/queryparts/condition/ConditionGroup.class.php +++ b/classes/db/queryparts/condition/ConditionGroup.class.php @@ -11,12 +11,17 @@ function toString(){ if($this->pipe !== "") - $group = $this->pipe .'('; + $group = $this->pipe .' ('; else $group = ''; + $cond_indx = 0; + foreach($this->conditions as $condition){ - if($condition->show()) + if($condition->show()){ + if($cond_indx === 0) $condition->setPipe(""); $group .= $condition->toString() . ' '; + $cond_indx++; + } } if($this->pipe !== "") diff --git a/classes/xml/xmlquery/argument/ConditionArgument.class.php b/classes/xml/xmlquery/argument/ConditionArgument.class.php new file mode 100644 index 000000000..7e6040990 --- /dev/null +++ b/classes/xml/xmlquery/argument/ConditionArgument.class.php @@ -0,0 +1,111 @@ +operation = $operation; + } + + function createConditionValue(){ + if(!isset($this->value)) return; + + $name = $this->column_name; + $operation = $this->operation; + $value = $this->value; + + switch($operation) { + case 'like_prefix' : + $this->value = $value.'%'; + break; + case 'like_tail' : + $this-> value = '%'.$value; + break; + case 'like' : + $this->value = '%'.$value.'%'; + break; + } + /* + //if(!in_array($operation,array('in','notin','between')) && is_array($value)){ + // $value = join(',', $value); + //} + // Daca operatia nu este in, notin, between si coloana e de tip numeric + // daca valoarea e array -> concatenare + // daca valoarea nu e array si nici nu contine paranteze (nu e functie) -> return (int) + // altfel return valoare + +// if(!in_array($operation,array('in','notin','between')) && $type == 'number') { +// if(is_array($value)){ +// $value = join(',',$value); +// } +// if(strpos($value, ',') === false && strpos($value, '(') === false) return (int)$value; +// return $value; +// } +// +// if(!is_array($value) && strpos($name, '.') !== false && strpos($value, '.') !== false) { +// list($table_name, $column_name) = explode('.', $value); +// if($column_type[$column_name]) return $value; +// } + + switch($operation) { + case 'like_prefix' : + if(!is_array($value)) $value = preg_replace('/(^\'|\'$){1}/', '', $value); + $value = $value.'%'; + break; + case 'like_tail' : + if(!is_array($value)) $value = preg_replace('/(^\'|\'$){1}/', '', $value); + $value = '%'.$value; + break; + case 'like' : + if(!is_array($value)) $value = preg_replace('/(^\'|\'$){1}/', '', $value); + $value = '%'.$value.'%'; + break; +// case 'notin' : +// if(is_array($value)) +// { +// $value = $this->addQuotesArray($value); +// if($type=='number') return join(',',$value); +// else return "'". join("','",$value)."'"; +// } +// else +// { +// return $value; +// } +// break; +// case 'in' : +// if(is_array($value)) +// { +// $value = $this->addQuotesArray($value); +// if($type=='number') return join(',',$value); +// else return "'". join("','",$value)."'"; +// } +// else +// { +// return $value; +// } +// break; +// case 'between' : +// if(!is_array($value)) $value = array($value); +// $value = $this->addQuotesArray($value); +// if($type!='number') +// { +// foreach($value as $k=>$v) +// { +// $value[$k] = "'".$v."'"; +// } +// } + + //return $value; + break; + default: + if(!is_array($value)) $value = preg_replace('/(^\'|\'$){1}/', '', $value); + } + $this->value = $value; + //return "'".$this->addQuotes($value)."'"; + */ + + } + } + +?> \ No newline at end of file diff --git a/classes/xml/xmlquery/queryargument/QueryArgument.class.php b/classes/xml/xmlquery/queryargument/QueryArgument.class.php index 63dc9fb98..e4dfbe7ab 100644 --- a/classes/xml/xmlquery/queryargument/QueryArgument.class.php +++ b/classes/xml/xmlquery/queryargument/QueryArgument.class.php @@ -4,9 +4,16 @@ var $argument_name; var $argument_validator; var $column_name; + var $operation; + var $ignoreValue; function QueryArgument($tag){ $this->argument_name = $tag->attrs->var; + if(!$this->argument_name) $this->ignoreValue = true; + else $this->ignoreValue = false; + + if(!$this->argument_name) $this->argument_name = $tag->attrs->name; + if(!$this->argument_name) $this->argument_name = $tag->attrs->column; $name = $tag->attrs->name; if(!$name) $name = $tag->attrs->column; @@ -14,10 +21,9 @@ else { list($prefix, $name) = explode('.', $name); $this->column_name = $name; - } + } - if(!$this->argument_name) $this->argument_name = $tag->attrs->name; - if(!$this->argument_name) $this->argument_name = str_replace('.', '_', $condition->attrs->column); + if($tag->attrs->operation) $this->operation = $tag->attrs->operation; require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/validator/QueryArgumentValidator.class.php'); $this->argument_validator = new QueryArgumentValidator($tag); @@ -37,11 +43,29 @@ } function toString(){ - $arg = sprintf("\n$%s_argument = new Argument('%s', %s);\n" - , $this->argument_name - , $this->argument_name - , '$args->'.$this->argument_name); + if($this->operation) + $arg = sprintf("\n$%s_argument = new ConditionArgument('%s', %s, '%s');\n" + , $this->argument_name + , $this->argument_name + , $this->ignoreValue ? 'null' : '$args->'.$this->argument_name + , $this->operation + ); + + else + $arg = sprintf("\n$%s_argument = new Argument('%s', %s);\n" + , $this->argument_name + , $this->argument_name + , $this->ignoreValue ? 'null' : '$args->'.$this->argument_name); + + $arg .= $this->argument_validator->toString(); + + if($this->operation){ + $arg .= sprintf("$%s_argument->createConditionValue();\n" + , $this->argument_name + ); + } + $arg .= sprintf("if(!$%s_argument->isValid()) return $%s_argument->getErrorMessage();\n" , $this->argument_name , $this->argument_name diff --git a/classes/xml/xmlquery/tags/condition/ConditionGroupTag.class.php b/classes/xml/xmlquery/tags/condition/ConditionGroupTag.class.php index bd62f0137..728be23b1 100644 --- a/classes/xml/xmlquery/tags/condition/ConditionGroupTag.class.php +++ b/classes/xml/xmlquery/tags/condition/ConditionGroupTag.class.php @@ -26,7 +26,7 @@ $conditions_string = substr($conditions_string, 0, -2);//remove ',' $conditions_string .= ')'; - return sprintf("new ConditionGroup(%s%s)", $conditions_string, $this->pipe ? ','.$this->pipe : ''); + return sprintf("new ConditionGroup(%s%s)", $conditions_string, $this->pipe ? ',\''.$this->pipe . '\'': ''); } function getArguments(){ diff --git a/classes/xml/xmlquery/tags/condition/ConditionTag.class.php b/classes/xml/xmlquery/tags/condition/ConditionTag.class.php index 4f6017478..aed904eff 100644 --- a/classes/xml/xmlquery/tags/condition/ConditionTag.class.php +++ b/classes/xml/xmlquery/tags/condition/ConditionTag.class.php @@ -22,11 +22,17 @@ $dbParser = XmlQueryParser::getDBParser(); $this->column_name = $dbParser->parseColumnName($condition->attrs->column); - if($condition->attrs->var){ + $isColumnName = strpos($condition->attrs->default, '.'); + + if($condition->attrs->var || $isColumnName === false){ require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/QueryArgument.class.php'); - $this->argument_name = $condition->attrs->var; - $this->argument = new QueryArgument($condition); + //$this->argument_name = $condition->attrs->var; + $this->argument = new QueryArgument($condition); + $this->argument_name = $this->argument->getArgumentName(); } + //else if($isColumnName === false){ + // $this->default_column = $condition->attrs->default; + //} else { $this->default_column = $dbParser->parseColumnName($condition->attrs->default); } diff --git a/classes/xml/xmlquery/tags/condition/ConditionsTag.class.php b/classes/xml/xmlquery/tags/condition/ConditionsTag.class.php index 1d17ea1e3..983f0e1fd 100644 --- a/classes/xml/xmlquery/tags/condition/ConditionsTag.class.php +++ b/classes/xml/xmlquery/tags/condition/ConditionsTag.class.php @@ -16,9 +16,9 @@ if(!is_array($xml_groups)) $xml_groups = array($xml_groups); require_once(_XE_PATH_.'classes/xml/xmlquery/tags/condition/ConditionGroupTag.class.php'); foreach($xml_groups as $group){ - $this->condition_groups[] = new ConditionGroupTag($group->condition, $group->pipe); + $this->condition_groups[] = new ConditionGroupTag($group->condition, $group->attrs->pipe); } - } + } } function toString(){ diff --git a/classes/xml/xmlquery/tags/navigation/NavigationTag.class.php b/classes/xml/xmlquery/tags/navigation/NavigationTag.class.php index 87fa9d064..c37f94652 100644 --- a/classes/xml/xmlquery/tags/navigation/NavigationTag.class.php +++ b/classes/xml/xmlquery/tags/navigation/NavigationTag.class.php @@ -38,6 +38,10 @@ $output .= ')'; return $output; } + + function getLimitString(){ + + } function getArguments(){ $arguments = array(); diff --git a/modules/opage/queries/getOpageList.xml b/modules/opage/queries/getOpageList.xml index 1703e5d4d..ceef2a03e 100644 --- a/modules/opage/queries/getOpageList.xml +++ b/modules/opage/queries/getOpageList.xml @@ -9,7 +9,7 @@ - + From 750733936bb866ebc4a8068c005ffcb8d059672b Mon Sep 17 00:00:00 2001 From: mosmartin Date: Wed, 25 May 2011 11:32:54 +0000 Subject: [PATCH 0094/1372] add "limit" navigation control to xml query and db classes git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0-DB@8395 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/db/DB.class.php | 2 ++ classes/db/DBCubrid.class.php | 10 ++++--- classes/db/queryparts/limit/Limit.class.php | 16 +++++++++++ classes/xml/xmlquery/QueryParser.class.php | 7 ++--- .../tags/navigation/LimitTag.class.php | 27 +++++++++++++++++++ .../tags/navigation/NavigationTag.class.php | 11 ++++++-- 6 files changed, 65 insertions(+), 8 deletions(-) create mode 100644 classes/db/queryparts/limit/Limit.class.php create mode 100644 classes/xml/xmlquery/tags/navigation/LimitTag.class.php diff --git a/classes/db/DB.class.php b/classes/db/DB.class.php index 71dc76e34..1e4785941 100644 --- a/classes/db/DB.class.php +++ b/classes/db/DB.class.php @@ -316,6 +316,7 @@ require_once(_XE_PATH_.'classes/xml/xmlquery/DBParser.class.php'); require_once(_XE_PATH_.'classes/xml/xmlquery/argument/Argument.class.php'); + require_once(_XE_PATH_.'classes/xml/xmlquery/argument/ConditionArgument.class.php'); require_once(_XE_PATH_.'classes/db/queryparts/expression/Expression.class.php'); require_once(_XE_PATH_.'classes/db/queryparts/expression/SelectExpression.class.php'); require_once(_XE_PATH_.'classes/db/queryparts/expression/InsertExpression.class.php'); @@ -326,6 +327,7 @@ require_once(_XE_PATH_.'classes/db/queryparts/condition/Condition.class.php'); require_once(_XE_PATH_.'classes/db/queryparts/expression/StarExpression.class.php'); require_once(_XE_PATH_.'classes/db/queryparts/order/OrderByColumn.class.php'); + require_once(_XE_PATH_.'classes/db/queryparts/limit/Limit.class.php'); $output = include($cache_file); diff --git a/classes/db/DBCubrid.class.php b/classes/db/DBCubrid.class.php index 4193f8270..54aca4125 100644 --- a/classes/db/DBCubrid.class.php +++ b/classes/db/DBCubrid.class.php @@ -795,9 +795,13 @@ } $orderBy = substr($orderBy, 0, -2); } - - - $query = $select . ' ' . $from . ' ' . $where . ' ' . $groupBy . ' ' . $orderBy; + $limit = ''; + if(count($output->limit) > 0){ + $limit = 'limit '; + $limit .= $output->limit->toString(); + } + + $query = $select . ' ' . $from . ' ' . $where . ' ' . $groupBy . ' ' . $orderBy . ' ' . $limit; //$query = sprintf ("select %s from %s %s %s %s", $columns, implode (',',$table_list), implode (' ',$left_join), $condition, //$groupby_query.$orderby_query); //$query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; diff --git a/classes/db/queryparts/limit/Limit.class.php b/classes/db/queryparts/limit/Limit.class.php new file mode 100644 index 000000000..fc20d3fbe --- /dev/null +++ b/classes/db/queryparts/limit/Limit.class.php @@ -0,0 +1,16 @@ +start = ($page-1)*$list_count; + $this->end = $list_count; + } + + function toString(){ + return $this->start . ' , ' . $this->end; + } + } + +?> \ No newline at end of file diff --git a/classes/xml/xmlquery/QueryParser.class.php b/classes/xml/xmlquery/QueryParser.class.php index 805140fe5..20dd541d3 100644 --- a/classes/xml/xmlquery/QueryParser.class.php +++ b/classes/xml/xmlquery/QueryParser.class.php @@ -131,9 +131,10 @@ class QueryParser { $buff .= '$output->columns = ' . $columns->toString() . ';'.PHP_EOL; $buff .= '$output->tables = ' . $tables->toString() .';'.PHP_EOL; $buff .= '$output->conditions = '.$conditions->toString() .';'.PHP_EOL; - $buff .= '$output->groups = ' . $groups->toString() . ';'; - $buff .= '$output->orderby = ' . $navigation->getOrderByString() .';'; - + $buff .= '$output->groups = ' . $groups->toString() . ';'; + $buff .= '$output->orderby = ' . $navigation->getOrderByString() .';'; + $buff .= $navigation->getLimitString()?'$output->limit = ' . $navigation->getLimitString() .';':""; + return "query_id = "%s";%s', $this->query_id, "\n") . sprintf('$output->action = "%s";%s', $this->action, "\n") diff --git a/classes/xml/xmlquery/tags/navigation/LimitTag.class.php b/classes/xml/xmlquery/tags/navigation/LimitTag.class.php new file mode 100644 index 000000000..52b81b8d0 --- /dev/null +++ b/classes/xml/xmlquery/tags/navigation/LimitTag.class.php @@ -0,0 +1,27 @@ +page = $index->page->attrs; + $this->page_count = $index->page_count->attrs; + $this->list_count = $index->list_count->attrs; + + require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/QueryArgument.class.php'); + $this->arguments[] = new QueryArgument($index->page); + $this->arguments[] = new QueryArgument($index->list_count); + } + + function toString(){ + return sprintf("new Limit(\$%s_argument->getValue(), \$%s_argument->getValue())", $this->page->var, $this->list_count->var); + } + + function getArguments(){ + return $this->arguments; + } + } +?> \ No newline at end of file diff --git a/classes/xml/xmlquery/tags/navigation/NavigationTag.class.php b/classes/xml/xmlquery/tags/navigation/NavigationTag.class.php index c37f94652..7edf8d519 100644 --- a/classes/xml/xmlquery/tags/navigation/NavigationTag.class.php +++ b/classes/xml/xmlquery/tags/navigation/NavigationTag.class.php @@ -1,11 +1,13 @@ order = array(); @@ -17,7 +19,10 @@ $this->order[] = new IndexTag($order_info); } } - + + if($xml_navigation->page->attrs && $xml_navigation->list_count->attrs) + $this->limit = new LimitTag($xml_navigation); + $list_count = $xml_navigation->list_count->attrs; $this->list_count = $list_count; @@ -40,7 +45,8 @@ } function getLimitString(){ - + if ($this->limit) return $this->limit->toString(); + else return ""; } function getArguments(){ @@ -48,6 +54,7 @@ foreach($this->order as $order){ $arguments = array_merge($order->getArguments(), $arguments); } + if($this->limit) $arguments = array_merge($this->limit->getArguments(), $arguments); return $arguments; } } From d77165d263ccf35df900ed944a30ff2d767c42ac Mon Sep 17 00:00:00 2001 From: devjin Date: Thu, 26 May 2011 05:07:20 +0000 Subject: [PATCH 0095/1372] merge 1.4.5 git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8396 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- .../member_extra_info.lib.php | 2 +- .../point_level_icon/point_level_icon.lib.php | 7 ++- modules/addon/addon.admin.controller.php | 6 +-- modules/member/conf/module.xml | 2 +- modules/member/lang/ko.lang.php | 3 +- modules/member/member.admin.controller.php | 20 +++++--- modules/member/member.admin.view.php | 3 +- modules/member/member.class.php | 14 +++++- modules/member/member.model.php | 50 +++++++++++-------- modules/member/queries/getGroups.xml | 2 +- modules/member/queries/insertGroup.xml | 3 +- .../queries/updateAllMemberGroupListOrder.xml | 8 +++ .../queries/updateMemberGroupListOrder.xml | 11 ++++ modules/member/schemas/member_group.xml | 1 + modules/member/tpl/group_list.html | 17 ++++++- modules/member/tpl/js/member_admin.js | 48 ++++++++++-------- 16 files changed, 131 insertions(+), 66 deletions(-) create mode 100644 modules/member/queries/updateAllMemberGroupListOrder.xml create mode 100644 modules/member/queries/updateMemberGroupListOrder.xml diff --git a/addons/member_extra_info/member_extra_info.lib.php b/addons/member_extra_info/member_extra_info.lib.php index 3cb808e31..fe2edfaf5 100644 --- a/addons/member_extra_info/member_extra_info.lib.php +++ b/addons/member_extra_info/member_extra_info.lib.php @@ -32,7 +32,7 @@ if($image_name_file) $nick_name = sprintf('id: %s', Context::getRequestUri(),$image_name_file, strip_tags($nick_name), strip_tags($nick_name)); if($image_mark_file) $nick_name = sprintf('id: %s%s', Context::getRequestUri(),$image_mark_file, strip_tags($nick_name), strip_tags($nick_name), $nick_name); - if($group_image) $nick_name = sprintf('%s', $group_image->src, $nick_name); + if($group_image) $nick_name = sprintf('%s%s', $group_image->src, $group_image->title, $group_image->description, $nick_name); $orig_text = preg_replace('/'.preg_quote($matches[5],'/').'<\/'.$matches[6].'>$/', '', $matches[0]); diff --git a/addons/point_level_icon/point_level_icon.lib.php b/addons/point_level_icon/point_level_icon.lib.php index 014e31e23..a81829bc4 100644 --- a/addons/point_level_icon/point_level_icon.lib.php +++ b/addons/point_level_icon/point_level_icon.lib.php @@ -6,6 +6,12 @@ $member_srl = $matches[3]; if($member_srl<1) return $matches[0]; + $orig_text = preg_replace('/'.preg_quote($matches[5],'/').'<\/'.$matches[6].'>$/', '', $matches[0]); + + // Check Group Image Mark + $oMemberModel = &getModel('member'); + if($oMemberModel->getGroupImageMark($member_srl)) return $orig_text.$matches[5].''; + if(!isset($GLOBALS['_pointLevelIcon'][$member_srl])) { // Get point configuration if(!$GLOBALS['_pointConfig']) { @@ -40,7 +46,6 @@ } $text = $GLOBALS['_pointLevelIcon'][$member_srl]; - $orig_text = preg_replace('/'.preg_quote($matches[5],'/').'<\/'.$matches[6].'>$/', '', $matches[0]); return $orig_text.$text.$matches[5].''; } ?> diff --git a/modules/addon/addon.admin.controller.php b/modules/addon/addon.admin.controller.php index 0af987029..8d3bad635 100644 --- a/modules/addon/addon.admin.controller.php +++ b/modules/addon/addon.admin.controller.php @@ -4,7 +4,7 @@ * @author NHN (developers@xpressengine.com) * @brief admin controller class of addon modules **/ - include_once('addon.controller.php'); + require_once(_XE_PATH_.'modules/addon/addon.controller.php'); class addonAdminController extends addonController { @@ -94,7 +94,5 @@ $args->site_srl = $site_srl; return executeQuery('addon.updateSiteAddon', $args); } - - } -?> +?> \ No newline at end of file diff --git a/modules/member/conf/module.xml b/modules/member/conf/module.xml index 288de53c6..bafe3eb3e 100644 --- a/modules/member/conf/module.xml +++ b/modules/member/conf/module.xml @@ -78,6 +78,6 @@ - + diff --git a/modules/member/lang/ko.lang.php b/modules/member/lang/ko.lang.php index 910355c26..0b766d55f 100644 --- a/modules/member/lang/ko.lang.php +++ b/modules/member/lang/ko.lang.php @@ -27,6 +27,8 @@ $lang->group = '소속 그룹'; $lang->group_title = '그룹제목'; $lang->group_srl = '그룹번호'; + $lang->group_order = '그룹 우선순위'; + $lang->group_order_change = '그룹 우선순위 변경'; $lang->signature = '서명'; $lang->profile_image = '프로필 사진'; $lang->profile_image_max_width = '가로 제한 길이'; @@ -40,7 +42,6 @@ $lang->group_image_mark = '그룹 이미지 마크'; $lang->group_image_mark_max_width = '가로 제한 길이'; $lang->group_image_mark_max_height = '세로 제한 길이'; - $lang->group_image_mark_order = '그룹 이미지 마크 순서'; $lang->signature_max_height = '서명 높이 제한'; $lang->enable_openid = 'OpenID 지원'; $lang->enable_join = '회원 가입 허가'; diff --git a/modules/member/member.admin.controller.php b/modules/member/member.admin.controller.php index d64981c6c..190b749dd 100644 --- a/modules/member/member.admin.controller.php +++ b/modules/member/member.admin.controller.php @@ -352,6 +352,8 @@ $output = executeQuery('member.updateGroupDefaultClear', $args); if(!$output->toBool()) return $output; } + + if (!$args->group_srl) $args->group_srl = getNextSequence(); return executeQuery('member.insertGroup', $args); } @@ -394,14 +396,16 @@ } - function procMemberAdminGroupImageMarkUpdateOrder() { - $oModuleModel = &getModel('module'); - $oModuleControll = getController('module'); + function procMemberAdminUpdateGroupOrder() { + $vars = Context::getRequestVars(); + + foreach($vars->group_srls as $key => $val){ + $args->group_srl = $val; + $args->list_order = $key + 1; + executeQuery('member.updateMemberGroupListOrder', $args); + } - $config = $oModuleModel->getModuleConfig('member'); - // $config->group_image_mark_order = Context::get('group_image_mark_order'); - - $oModuleControll->insertModuleConfig('member', $config); + header(sprintf('Location:%s', getNotEncodedUrl('', 'module', 'admin', 'act', 'dispMemberAdminGroupList'))); } /** @@ -511,4 +515,4 @@ return new Object(); } } -?> +?> \ No newline at end of file diff --git a/modules/member/member.admin.view.php b/modules/member/member.admin.view.php index 63427b88e..512ceb520 100644 --- a/modules/member/member.admin.view.php +++ b/modules/member/member.admin.view.php @@ -146,7 +146,6 @@ $oModuleModel = &getModel('module'); $config = $oModuleModel->getModuleConfig('member'); - if($config->group_image_mark_order) $config->group_image_mark_order = explode(',', $config->group_image_mark_order); Context::set('config', $config); $group_srl = Context::get('group_srl'); @@ -235,4 +234,4 @@ $this->setTemplateFile('delete_members'); } } -?> +?> \ No newline at end of file diff --git a/modules/member/member.class.php b/modules/member/member.class.php index a67571416..bf24732c5 100644 --- a/modules/member/member.class.php +++ b/modules/member/member.class.php @@ -131,7 +131,11 @@ if(!$oDB->isColumnExists("member_group_member", "site_srl")) return true; if(!$oDB->isColumnExists("member_group", "site_srl")) return true; if($oDB->isIndexExists("member_group","uni_member_group_title")) return true; - // Add a column for image_mark (02/14/2009) + + // Add a column for list_order (05/18/2011) + if(!$oDB->isColumnExists("member_group", "list_order")) return true; + + // image_mark 추가 (2009. 02. 14) if(!$oDB->isColumnExists("member_group", "image_mark")) return true; // Add c column for password expiration date if(!$oDB->isColumnExists("member", "change_password_date")) return true; @@ -173,6 +177,13 @@ if($oDB->isIndexExists("member_group","uni_member_group_title")) { $oDB->dropIndex("member_group","uni_member_group_title",true); } + + // Add a column(list_order) to "member_group" table (05/18/2011) + if (!$oDB->isColumnExists("member_group", "list_order")) { + $oDB->addColumn("member_group", "list_order", "number", 11, '', true); + $oDB->addIndex("member_group","idx_list_order", "list_order",false); + $output = executeQuery('member.updateAllMemberGroupListOrder'); + } // Add a column for image_mark (02/14/2009) if(!$oDB->isColumnExists("member_group", "image_mark")) { $oDB->addColumn("member_group", "image_mark", "text"); @@ -198,7 +209,6 @@ executeQuery('member.updateMemberListOrderAll',$args); executeQuery('member.updateMemberListOrderAll'); } - if(!$oDB->isIndexExists("member","idx_list_order")) { $oDB->addIndex("member","idx_list_order", array("list_order")); } diff --git a/modules/member/member.model.php b/modules/member/member.model.php index f91b48d77..96c87c8f0 100644 --- a/modules/member/member.model.php +++ b/modules/member/member.model.php @@ -341,6 +341,8 @@ function getGroups($site_srl = 0) { if(!$GLOBALS['__group_info__'][$site_srl]) { $args->site_srl = $site_srl; + $args->sort_index = 'list_order'; + $args->order_type = 'asc'; $output = executeQuery('member.getGroups', $args); if(!$output->data) return; @@ -580,27 +582,35 @@ * @brief Get the image mark of the group **/ function getGroupImageMark($member_srl,$site_srl=0) { - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('member'); - if($config->group_image_mark!='Y'){ - return null; - } - $member_group = $this->getMemberGroups($member_srl,$site_srl); + if(!isset($GLOBALS['__member_info__']['group_image_mark'][$member_srl])) { + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('member'); + if($config->group_image_mark!='Y'){ + return null; + } + $member_group = $this->getMemberGroups($member_srl,$site_srl); + $groups_info = $this->getGroups($site_srl); + $image_mark_info = null; + if(count($member_group) > 0 && is_array($member_group)){ + $group_srl = array_keys($member_group); + } - $groups_info = $this->getGroups($site_srl); - $image_mark = null; - if(count($member_group) > 0 && is_array($member_group)){ - $group_srl = array_keys($member_group); - $image_mark = $groups_info[$group_srl[0]]->image_mark; - } - if($image_mark){ -// list($width, $height, $type, $attrs) = getimagesize($image_mark); -// $info->width = $width; -// $info->height = $height; - $info->src = $image_mark; - return $info; + $i = 0; + while($i < count($group_srl)){ + $target = $groups_info[$group_srl[$i++]]; + if ($target->image_mark) + { + $info->title = $target->title; + $info->description = $target->description; + $info->src = $target->image_mark; + $GLOBALS['__member_info__']['group_image_mark'][$member_srl] = $info; + } + } + if (!$info) $GLOBALS['__member_info__']['group_image_mark'][$member_srl] == 'N'; + } + if ($GLOBALS['__member_info__']['group_image_mark'][$member_srl] == 'N') return null; - }else return false; + return $GLOBALS['__member_info__']['group_image_mark'][$member_srl]; } /** @@ -688,4 +698,4 @@ } } -?> +?> \ No newline at end of file diff --git a/modules/member/queries/getGroups.xml b/modules/member/queries/getGroups.xml index d851fb651..65b1367c1 100644 --- a/modules/member/queries/getGroups.xml +++ b/modules/member/queries/getGroups.xml @@ -3,7 +3,7 @@ - + diff --git a/modules/member/queries/insertGroup.xml b/modules/member/queries/insertGroup.xml index 938dc6e31..40305009e 100644 --- a/modules/member/queries/insertGroup.xml +++ b/modules/member/queries/insertGroup.xml @@ -4,7 +4,8 @@ - + + diff --git a/modules/member/queries/updateAllMemberGroupListOrder.xml b/modules/member/queries/updateAllMemberGroupListOrder.xml new file mode 100644 index 000000000..55cfb243e --- /dev/null +++ b/modules/member/queries/updateAllMemberGroupListOrder.xml @@ -0,0 +1,8 @@ + + +
        + + + + + diff --git a/modules/member/queries/updateMemberGroupListOrder.xml b/modules/member/queries/updateMemberGroupListOrder.xml new file mode 100644 index 000000000..657858012 --- /dev/null +++ b/modules/member/queries/updateMemberGroupListOrder.xml @@ -0,0 +1,11 @@ + + +
        + + + + + + + + diff --git a/modules/member/schemas/member_group.xml b/modules/member/schemas/member_group.xml index bd5d42808..2ae50d762 100644 --- a/modules/member/schemas/member_group.xml +++ b/modules/member/schemas/member_group.xml @@ -1,6 +1,7 @@
        + diff --git a/modules/member/tpl/group_list.html b/modules/member/tpl/group_list.html index 8c81dcde6..48611968c 100644 --- a/modules/member/tpl/group_list.html +++ b/modules/member/tpl/group_list.html @@ -13,13 +13,17 @@ +
        +
        + + @@ -29,12 +33,16 @@ +{@$__i=1} + + + + + +
        {$lang->group_order}
        {$lang->group_title}
        {$lang->description}
        {$lang->regdate}
        {$lang->is_default}
        {$lang->group_order_change}
         
        {$lang->msg_group_is_null}
        {$__i++} {$group_info->title} {nl2br($group_info->description)}  {zdate($group_info->regdate,"Y-m-d H:i:s")} Y 위로 아래로 {$lang->cmd_modify} @@ -45,9 +53,14 @@
        + +
        - +
        @@ -84,4 +97,4 @@ -
        \ No newline at end of file + diff --git a/modules/member/tpl/js/member_admin.js b/modules/member/tpl/js/member_admin.js index 4a2c01bcd..dbfdeb8a5 100644 --- a/modules/member/tpl/js/member_admin.js +++ b/modules/member/tpl/js/member_admin.js @@ -339,27 +339,31 @@ function completeDeleteMembers(ret_obj) { window.close(); } - -function doGorupImageMarkUpdateOrder(id) { - var sort = jQuery('#'+id).sortable('toArray'); - var params = { group_image_mark_order : [] }; - - jQuery.each(sort, function(i, val) { - params['group_image_mark_order'].push(val.replace('group_srl_', '')); - }); - - var response_tags = ['error','message']; - exec_xml('member', 'procMemberAdminGroupImageMarkUpdateOrder', params, completeGroupImageMarkUpdateOrder, response_tags); -} - -function completeGroupImageMarkUpdateOrder(ret_obj) { - alert(ret_obj['message']); -} - jQuery(function($) { - $("#group_image_mark_order") - .sortable({ - cursor: 'move', - cancel: '.inactive' - }); + $("#fo_group_order > table") + .find("a._up") + .click(function(e){ + var $tr = $(this).parent().parent(); + var $prev = $tr.prev("tr"); + if($prev.length) + { + $prev.before($tr); + $tr.parent().find("tr").removeClass("bg1").filter(":odd").addClass("bg1"); + } + e.preventDefault(); + }) + .end() + .find("a._down") + .click(function(){ + var $tr = $(this).parent().parent(); + var $next = $tr.next("tr"); + if($next.length) + { + $next.after($tr); + $tr.parent().find("tr").removeClass("bg1").filter(":odd").addClass("bg1"); + } + e.preventDefault(); + }) + .end() + }); From 4b9faef300a72421c45ac776232d9542d06518ff Mon Sep 17 00:00:00 2001 From: ngleader Date: Thu, 26 May 2011 07:57:23 +0000 Subject: [PATCH 0096/1372] add sort function for document extra_vars git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8397 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/document/document.model.php | 304 ++++++++++-------- .../queries/getDocumentListExtraSort.xml | 53 +++ 2 files changed, 227 insertions(+), 130 deletions(-) create mode 100644 modules/document/queries/getDocumentListExtraSort.xml diff --git a/modules/document/document.model.php b/modules/document/document.model.php index 630ddfbf1..e0563112c 100644 --- a/modules/document/document.model.php +++ b/modules/document/document.model.php @@ -153,8 +153,10 @@ * @brief module_srl value, bringing the list of documents **/ function getDocumentList($obj, $except_notice = false, $load_extra_vars=true, $columnList = array()) { - // Check the target and sequence alignment - if(!in_array($obj->sort_index, array('list_order','regdate','last_update','update_order','readed_count','voted_count','comment_count','trackback_count','uploaded_count','title','category_srl'))) $obj->sort_index = 'list_order'; + $sort_check = $this->_setSortIndex($obj, $load_extra_vars); + + $obj->sort_index = $sort_check->sort_index; + // Check the target and sequence alignment if(!in_array($obj->order_type, array('desc','asc'))) $obj->order_type = 'asc'; // If that came across mid module_srl instead of a direct module_srl guhaejum if($obj->mid) { @@ -195,141 +197,149 @@ $searchOpt->search_keyword = $obj->search_keyword; $this->_setSearchOption($searchOpt, $args, $query_id, $use_division); - /** - * list_order asc sort of division that can be used only when - **/ - if($args->sort_index != 'list_order' || $args->order_type != 'asc') $use_division = false; + if ($sort_check->isExtraVars) + { + $query_id = 'document.getDocumentListExtraSort'; + $output = executeQueryArray($query_id, $args); + } + else + { + /** + * list_order asc sort of division that can be used only when + **/ + if($args->sort_index != 'list_order' || $args->order_type != 'asc') $use_division = false; - /** - * If it is true, use_division changed to use the document division - **/ - if($use_division) { - // Division begins - $division = (int)Context::get('division'); + /** + * If it is true, use_division changed to use the document division + **/ + if($use_division) { + // Division begins + $division = (int)Context::get('division'); - // order by list_order and (module_srl===0 or module_srl many count), therefore case table full scan - if($args->sort_index == 'list_order' && ($args->exclude_module_srl === 0 || count($args->module_srl) > 10)) - { - $listSqlID = 'document.getDocumentListUseIndex'; - $divisionSqlID = 'document.getDocumentDivisionUseIndex'; + // order by list_order and (module_srl===0 or module_srl many count), therefore case table full scan + if($args->sort_index == 'list_order' && ($args->exclude_module_srl === 0 || count($args->module_srl) > 10)) + { + $listSqlID = 'document.getDocumentListUseIndex'; + $divisionSqlID = 'document.getDocumentDivisionUseIndex'; + } + else + { + $listSqlID = 'document.getDocumentList'; + $divisionSqlID = 'document.getDocumentDivision'; + } + + // If you do not value the best division top + if(!$division) { + $division_args->module_srl = $args->module_srl; + $division_args->exclude_module_srl = $args->exclude_module_srl; + $division_args->list_count = 1; + $division_args->sort_index = $args->sort_index; + $division_args->order_type = $args->order_type; + $output = executeQuery($listSqlID, $division_args, $columnList); + if($output->data) { + $item = array_pop($output->data); + $division = $item->list_order; + } + $division_args = null; + } + // The last division + $last_division = (int)Context::get('last_division'); + // Division after division from the 5000 value of the specified Wanted + if(!$last_division) { + $last_division_args->module_srl = $args->module_srl; + $last_division_args->exclude_module_srl = $args->exclude_module_srl; + $last_division_args->list_count = 1; + $last_division_args->sort_index = $args->sort_index; + $last_division_args->order_type = $args->order_type; + $last_division_args->list_order = $division; + $last_division_args->page = 5001; + $output = executeQuery($divisionSqlID, $last_division_args, $columnList); + if($output->data) { + $item = array_pop($output->data); + $last_division = $item->list_order; + } + + } + // Make sure that after last_division article + if($last_division) { + $last_division_args = null; + $last_division_args->module_srl = $args->module_srl; + $last_division_args->exclude_module_srl = $args->exclude_module_srl; + $last_division_args->list_order = $last_division; + $output = executeQuery("document.getDocumentDivisionCount", $last_division_args); + if($output->data->count<1) $last_division = null; + } + + $args->division = $division; + $args->last_division = $last_division; + Context::set('division', $division); + Context::set('last_division', $last_division); } - else - { - $listSqlID = 'document.getDocumentList'; - $divisionSqlID = 'document.getDocumentDivision'; + // document.getDocumentList query execution + // Query_id if you have a group by clause getDocumentListWithinTag getDocumentListWithinComment or used again to perform the query because + if(in_array($query_id, array('document.getDocumentListWithinComment', 'document.getDocumentListWithinTag'))) { + $group_args = clone($args); + $group_args->sort_index = 'documents.'.$args->sort_index; + $output = executeQueryArray($query_id, $group_args); + if(!$output->toBool()||!count($output->data)) return $output; + + foreach($output->data as $key => $val) { + if($val->document_srl) $target_srls[] = $val->document_srl; + } + + $page_navigation = $output->page_navigation; + $keys = array_keys($output->data); + $virtual_number = $keys[0]; + + $target_args->document_srls = implode(',',$target_srls); + $target_args->list_order = $args->sort_index; + $target_args->order_type = $args->order_type; + $target_args->list_count = $args->list_count; + $target_args->page = 1; + $output = executeQueryArray('document.getDocuments', $target_args); + $output->page_navigation = $page_navigation; + $output->total_count = $page_navigation->total_count; + $output->total_page = $page_navigation->total_page; + $output->page = $page_navigation->cur_page; + } else { + $output = executeQueryArray($query_id, $args, $columnList); + } + } + // Return if no result or an error occurs + if(!$output->toBool()||!count($output->data)) return $output; + + $idx = 0; + $data = $output->data; + unset($output->data); + + if(!isset($virtual_number)) + { + $keys = array_keys($data); + $virtual_number = $keys[0]; + } + + if($except_notice) { + foreach($data as $key => $attribute) { + if($attribute->is_notice == 'Y') $virtual_number --; + } + } + + foreach($data as $key => $attribute) { + if($except_notice && $attribute->is_notice == 'Y') continue; + $document_srl = $attribute->document_srl; + if(!$GLOBALS['XE_DOCUMENT_LIST'][$document_srl]) { + $oDocument = null; + $oDocument = new documentItem(); + $oDocument->setAttribute($attribute, false); + if($is_admin) $oDocument->setGrant(); + $GLOBALS['XE_DOCUMENT_LIST'][$document_srl] = $oDocument; } - // If you do not value the best division top - if(!$division) { - $division_args->module_srl = $args->module_srl; - $division_args->exclude_module_srl = $args->exclude_module_srl; - $division_args->list_count = 1; - $division_args->sort_index = $args->sort_index; - $division_args->order_type = $args->order_type; - $output = executeQuery($listSqlID, $division_args, $columnList); - if($output->data) { - $item = array_pop($output->data); - $division = $item->list_order; - } - $division_args = null; - } - // The last division - $last_division = (int)Context::get('last_division'); - // Division after division from the 5000 value of the specified Wanted - if(!$last_division) { - $last_division_args->module_srl = $args->module_srl; - $last_division_args->exclude_module_srl = $args->exclude_module_srl; - $last_division_args->list_count = 1; - $last_division_args->sort_index = $args->sort_index; - $last_division_args->order_type = $args->order_type; - $last_division_args->list_order = $division; - $last_division_args->page = 5001; - $output = executeQuery($divisionSqlID, $last_division_args, $columnList); - if($output->data) { - $item = array_pop($output->data); - $last_division = $item->list_order; - } + $output->data[$virtual_number] = $GLOBALS['XE_DOCUMENT_LIST'][$document_srl]; + $virtual_number --; - } - // Make sure that after last_division article - if($last_division) { - $last_division_args = null; - $last_division_args->module_srl = $args->module_srl; - $last_division_args->exclude_module_srl = $args->exclude_module_srl; - $last_division_args->list_order = $last_division; - $output = executeQuery("document.getDocumentDivisionCount", $last_division_args); - if($output->data->count<1) $last_division = null; - } + } - $args->division = $division; - $args->last_division = $last_division; - Context::set('division', $division); - Context::set('last_division', $last_division); - } - // document.getDocumentList query execution - // Query_id if you have a group by clause getDocumentListWithinTag getDocumentListWithinComment or used again to perform the query because - if(in_array($query_id, array('document.getDocumentListWithinComment', 'document.getDocumentListWithinTag'))) { - $group_args = clone($args); - $group_args->sort_index = 'documents.'.$args->sort_index; - $output = executeQueryArray($query_id, $group_args); - if(!$output->toBool()||!count($output->data)) return $output; - - foreach($output->data as $key => $val) { - if($val->document_srl) $target_srls[] = $val->document_srl; - } - - $page_navigation = $output->page_navigation; - $keys = array_keys($output->data); - $virtual_number = $keys[0]; - - $target_args->document_srls = implode(',',$target_srls); - $target_args->list_order = $args->sort_index; - $target_args->order_type = $args->order_type; - $target_args->list_count = $args->list_count; - $target_args->page = 1; - $output = executeQueryArray('document.getDocuments', $target_args); - $output->page_navigation = $page_navigation; - $output->total_count = $page_navigation->total_count; - $output->total_page = $page_navigation->total_page; - $output->page = $page_navigation->cur_page; - } else { - $output = executeQueryArray($query_id, $args, $columnList); - } - // Return if no result or an error occurs - if(!$output->toBool()||!count($output->data)) return $output; - - $idx = 0; - $data = $output->data; - unset($output->data); - - if(!isset($virtual_number)) - { - $keys = array_keys($data); - $virtual_number = $keys[0]; - } - - if($except_notice) { - foreach($data as $key => $attribute) { - if($attribute->is_notice == 'Y') $virtual_number --; - } - } - - foreach($data as $key => $attribute) { - if($except_notice && $attribute->is_notice == 'Y') continue; - $document_srl = $attribute->document_srl; - if(!$GLOBALS['XE_DOCUMENT_LIST'][$document_srl]) { - $oDocument = null; - $oDocument = new documentItem(); - $oDocument->setAttribute($attribute, false); - if($is_admin) $oDocument->setGrant(); - $GLOBALS['XE_DOCUMENT_LIST'][$document_srl] = $oDocument; - } - - $output->data[$virtual_number] = $GLOBALS['XE_DOCUMENT_LIST'][$document_srl]; - $virtual_number --; - - } - if($load_extra_vars) $this->setToAllDocumentExtraVars(); if(count($output->data)) { @@ -992,6 +1002,40 @@ $this->add('voted_member_list',$output->data); } + function _setSortIndex($obj, $load_extra_vars) + { + $sortIndex = $obj->sort_index; + $isExtraVars = false; + if(!in_array($sortIndex, array('list_order','regdate','last_update','update_order','readed_count','voted_count','comment_count','trackback_count','uploaded_count','title','category_srl'))) + { + // get module_srl extra_vars list + if ($load_extra_vars) + { + $extra_args->module_srl = $obj->module_srl; + $extra_output = executeQueryArray('document.getGroupsExtraVars', $extra_args); + if (!$extra_output->data || !$extra_output->toBool()) + { + $sortIndex = 'list_order'; + } + else + { + $check_array = array(); + foreach($extra_output->data as $val){ + $check_array[] = $val->eid; + } + if(!in_array($sortIndex, $check_array)) $sortIndex = 'list_order'; + else $isExtraVars = true; + } + } + else + $sortIndex = 'list_order'; + } + $returnObj->sort_index = $sortIndex; + $returnObj->isExtraVars = $isExtraVars; + + return $returnObj; + } + /** * @brief 게시물 목록의 검색 옵션을 Setting함(2011.03.08 - cherryfilter) * page변수가 없는 상태에서 page 값을 알아오는 method(getDocumentPage)는 검색하지 않은 값을 return해서 검색한 값을 가져오도록 검색옵션이 추가 됨. diff --git a/modules/document/queries/getDocumentListExtraSort.xml b/modules/document/queries/getDocumentListExtraSort.xml new file mode 100644 index 000000000..eba5bc7b2 --- /dev/null +++ b/modules/document/queries/getDocumentListExtraSort.xml @@ -0,0 +1,53 @@ + + + +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 0b78e26357f39d3e64eaaf173d073b932d7400c5 Mon Sep 17 00:00:00 2001 From: mosmartin Date: Fri, 27 May 2011 11:39:45 +0000 Subject: [PATCH 0097/1372] Fix condition/ConditionGroup.class.php when all conditions have no value. Add page navigation mechanism. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0-DB@8399 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/db/DBCubrid.class.php | 54 +++++++++++++++++-- .../condition/ConditionGroup.class.php | 2 + classes/db/queryparts/limit/Limit.class.php | 18 +++++-- .../tags/navigation/LimitTag.class.php | 3 +- 4 files changed, 66 insertions(+), 11 deletions(-) diff --git a/classes/db/DBCubrid.class.php b/classes/db/DBCubrid.class.php index 54aca4125..04a86c357 100644 --- a/classes/db/DBCubrid.class.php +++ b/classes/db/DBCubrid.class.php @@ -802,15 +802,59 @@ } $query = $select . ' ' . $from . ' ' . $where . ' ' . $groupBy . ' ' . $orderBy . ' ' . $limit; - + //$query = sprintf ("select %s from %s %s %s %s", $columns, implode (',',$table_list), implode (' ',$left_join), $condition, //$groupby_query.$orderby_query); //$query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; $result = $this->_query ($query); - if ($this->isError ()) return; - $data = $this->_fetch ($result); + if ($this->isError ()) { + if ($limit && $output->limit->isPageHandler()){ + $buff = new Object (); + $buff->total_count = 0; + $buff->total_page = 0; + $buff->page = 1; + $buff->data = array (); + $buff->page_navigation = new PageHandler (/*$total_count*/0, /*$total_page*/1, /*$page*/1, /*$page_count*/10);//default page handler values + return $buff; + }else return; + } - $buff = new Object (); - $buff->data = $data; + if ($limit && $output->limit->isPageHandler()) { + $count_query = sprintf('select count(*) as "count" %s %s', $from, $where); + if (count($output->groups)) { + $count_query = sprintf('select count(*) as "count" from (%s) xet', $count_query); + } + + //$count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; + $result_count = $this->_query($count_query); + $count_output = $this->_fetch($result_count); + $total_count = (int)$count_output->count; + + // total pages + if ($total_count) { + $total_page = (int) (($total_count - 1) / $output->limit->list_count) + 1; + } else $total_page = 1; + + $virtual_no = $total_count - ($output->limit->page - 1) * $output->limit->list_count; + while ($tmp = cubrid_fetch ($result, CUBRID_OBJECT)) { + if ($tmp) { + foreach ($tmp as $k => $v) { + $tmp->{$k} = rtrim($v); + } + } + $data[$virtual_no--] = $tmp; + } + + $buff = new Object (); + $buff->total_count = $total_count; + $buff->total_page = $total_page; + $buff->page = $output->limit->page; + $buff->data = $data; + $buff->page_navigation = new PageHandler ($total_count, $total_page, $output->limit->page, $output->limit->page_count); + }else{ + $data = $this->_fetch ($result); + $buff = new Object (); + $buff->data = $data; + } return $buff; } diff --git a/classes/db/queryparts/condition/ConditionGroup.class.php b/classes/db/queryparts/condition/ConditionGroup.class.php index 5e9a943b9..cab975d7d 100644 --- a/classes/db/queryparts/condition/ConditionGroup.class.php +++ b/classes/db/queryparts/condition/ConditionGroup.class.php @@ -23,6 +23,8 @@ $cond_indx++; } } + // If the group has no conditions in it, return '' + if($cond_indx === 0) return ''; if($this->pipe !== "") $group .= ')'; diff --git a/classes/db/queryparts/limit/Limit.class.php b/classes/db/queryparts/limit/Limit.class.php index fc20d3fbe..46090ddff 100644 --- a/classes/db/queryparts/limit/Limit.class.php +++ b/classes/db/queryparts/limit/Limit.class.php @@ -1,15 +1,23 @@ start = ($page-1)*$list_count; - $this->end = $list_count; + $this->list_count = $list_count; + $this->page_count = $page_count; + $this->page = $page; + } + + function isPageHandler(){//in case you choose to use query limit in other cases than page select + return true; } function toString(){ - return $this->start . ' , ' . $this->end; + return $this->start . ' , ' . $this->list_count; } } diff --git a/classes/xml/xmlquery/tags/navigation/LimitTag.class.php b/classes/xml/xmlquery/tags/navigation/LimitTag.class.php index 52b81b8d0..a6d2734ae 100644 --- a/classes/xml/xmlquery/tags/navigation/LimitTag.class.php +++ b/classes/xml/xmlquery/tags/navigation/LimitTag.class.php @@ -14,10 +14,11 @@ require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/QueryArgument.class.php'); $this->arguments[] = new QueryArgument($index->page); $this->arguments[] = new QueryArgument($index->list_count); + $this->arguments[] = new QueryArgument($index->page_count); } function toString(){ - return sprintf("new Limit(\$%s_argument->getValue(), \$%s_argument->getValue())", $this->page->var, $this->list_count->var); + return sprintf("new Limit(\$%s_argument->getValue(), \$%s_argument->getValue(), \$%s_argument->getValue())", $this->page->var, $this->list_count->var, $this->page_count->var); } function getArguments(){ From 64d268ab6b510f5e2531917eb8593d8eab7a1e9a Mon Sep 17 00:00:00 2001 From: mosmartin Date: Fri, 27 May 2011 12:25:43 +0000 Subject: [PATCH 0098/1372] Added a wrapper for queries - select can now be called like: $query->select(..)->from(..)->where(..) git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0-DB@8400 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/db/queryparts/Query.class.php | 124 ++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 classes/db/queryparts/Query.class.php diff --git a/classes/db/queryparts/Query.class.php b/classes/db/queryparts/Query.class.php new file mode 100644 index 000000000..a0fb13e09 --- /dev/null +++ b/classes/db/queryparts/Query.class.php @@ -0,0 +1,124 @@ +action = 'select'; + if(!isset($columns) || count($columns) === 0){ + $this->columns = array(new StarExpression()); + return $this; + } + + if(!is_array($columns)) $columns = array($columns); + + $this->columns = $columns; + return $this; + } + + function from($tables){ + if(!isset($tables) || count($tables) === 0){ + $this->setError(true); + $this->setMessage("You must provide at least one table for the query."); + return $this; + } + + if(!is_array($tables)) $tables = array($tables); + + $this->tables = $tables; + return $this; + } + + function where($conditions){ + if(!isset($conditions) || count($conditions) === 0) return $this; + if(!is_array($conditions)) $conditions = array($conditions); + + $this->conditions = $conditions; + return $this; + } + + function groupBy($groups){ + if(!isset($groups) || count($groups) === 0) return $this; + if(!is_array($groups)) $groups = array($groups); + + $this->groups = $groups; + return $this; + } + + function orderBy($order){ + if(!isset($order) || count($order) === 0) return $this; + if(!is_array($order)) $order = array($order); + + $this->orderby = $order; + return $this; + } + + function limit($limit){ + if(!isset($limit)) return $this; + $this->limit = $limit; + return $this; + } + + function getSql(){ + if($this->action == 'select') return $this->getSelectSql(); + } + + function getSelectSql(){ + $query = ''; + + $select = 'SELECT '; + foreach($this->columns as $column){ + if($column->show()) + $select .= $column->getExpression() . ', '; + } + $select = substr($select, 0, -2); + + $from = 'FROM '; + $simple_table_count = 0; + foreach($this->tables as $table){ + if($table->isJoinTable() || !$simple_table_count) $from .= $table->toString() . ' '; + else $from .= ', '.$table->toString() . ' '; + $simple_table_count++; + } + + $where = ''; + if(count($this->conditions) > 0){ + $where = 'WHERE '; + foreach($this->conditions as $conditionGroup){ + $where .= $conditionGroup->toString(); + } + } + + $groupBy = ''; + if($this->groups) if($this->groups[0] !== "") + $groupBy = 'GROUP BY ' . implode(', ', $this->groups); + + $orderBy = ''; + if(count($this->orderby) > 0){ + $orderBy = 'ORDER BY '; + foreach($this->orderby as $order){ + $orderBy .= $order->toString() .', '; + } + $orderBy = substr($orderBy, 0, -2); + } + $limit = ''; + if(count($this->limit) > 0){ + $limit = 'limit '; + $limit .= $this->limit->toString(); + } + + $query = $select . ' ' . $from . ' ' . $where . ' ' . $groupBy . ' ' . $orderBy . ' ' . $limit; + return $query; + + } + } + + + +?> \ No newline at end of file From 2e86e56bf5a90f49d681f22e804f5b051f6f0c23 Mon Sep 17 00:00:00 2001 From: ovclas Date: Mon, 30 May 2011 01:25:01 +0000 Subject: [PATCH 0099/1372] #19745697 trash module devlopement Document Status DB Column added, and Document module refactoring git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8401 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/js/common.js | 4 +- modules/document/conf/module.xml | 2 + modules/document/document.admin.view.php | 4 ++ modules/document/document.class.php | 13 +++++ modules/document/document.controller.php | 53 +++++++++++++++++-- modules/document/document.item.php | 25 +++++++-- modules/document/document.model.php | 24 ++++++--- modules/document/document.view.php | 25 +++++++++ modules/document/lang/ko.lang.php | 2 + modules/document/queries/getDocumentList.xml | 2 +- .../queries/getDocumentListUseIndex.xml | 1 - .../queries/getDocumentListWithinMember.xml | 2 +- modules/document/queries/getDocumentPage.xml | 2 +- modules/document/queries/insertDocument.xml | 2 +- modules/document/queries/updateDocument.xml | 2 +- .../document/queries/updateDocumentStatus.xml | 13 +++++ modules/document/schemas/documents.xml | 2 +- modules/document/tpl/document_list.html | 2 + modules/document/tpl/header.html | 2 +- modules/document/tpl/saved_list_popup.html | 49 +++++++++++++++++ .../importer/importer.admin.controller.php | 2 +- modules/importer/ttimport.class.php | 4 +- modules/member/member.api.php | 2 +- modules/member/member.controller.php | 41 +------------- modules/member/member.view.php | 22 +------- modules/module/module.controller.php | 2 +- modules/opage/opage.model.php | 1 - .../syndication/queries/getDocumentList.xml | 2 +- modules/trash/conf/module.xml | 4 +- modules/trash/trash.controller.php | 19 ------- modules/trash/trash.view.php | 19 ------- 31 files changed, 220 insertions(+), 129 deletions(-) create mode 100644 modules/document/queries/updateDocumentStatus.xml create mode 100644 modules/document/tpl/saved_list_popup.html diff --git a/common/js/common.js b/common/js/common.js index 44cc7d7da..1e22ce64b 100644 --- a/common/js/common.js +++ b/common/js/common.js @@ -571,7 +571,7 @@ function doDocumentSave(obj) { else params[field.name] = field.value; }); - exec_xml('member','procMemberSaveDocument', params, completeDocumentSave, responses, params, obj.form); + exec_xml('document','procDocumentTempSave', params, completeDocumentSave, responses, params, obj.form); editorRelKeys[editor_sequence]['content'].value = prev_content; return false; @@ -587,7 +587,7 @@ var objForSavedDoc = null; function doDocumentLoad(obj) { // 저장된 게시글 목록 불러오기 objForSavedDoc = obj.form; - popopen(request_uri.setQuery('module','member').setQuery('act','dispSavedDocumentList')); + popopen(request_uri.setQuery('module','document').setQuery('act','dispTempSavedList')); } /* 저장된 게시글의 선택 */ diff --git a/modules/document/conf/module.xml b/modules/document/conf/module.xml index 65c226c30..b6a64a9f4 100644 --- a/modules/document/conf/module.xml +++ b/modules/document/conf/module.xml @@ -17,6 +17,7 @@ + @@ -41,6 +42,7 @@ + diff --git a/modules/document/document.admin.view.php b/modules/document/document.admin.view.php index 4dea2efcc..bf5f09445 100644 --- a/modules/document/document.admin.view.php +++ b/modules/document/document.admin.view.php @@ -33,11 +33,15 @@ $oDocumentModel = &getModel('document'); $output = $oDocumentModel->getDocumentList($args); + // get Status name list + $statusNameList = $oDocumentModel->getStatusConfigList(); + // Set values of document_model::getDocumentList() objects for a template Context::set('total_count', $output->total_count); Context::set('total_page', $output->total_page); Context::set('page', $output->page); Context::set('document_list', $output->data); + Context::set('status_name_list', $statusNameList); Context::set('page_navigation', $output->page_navigation); // set a search option used in the template diff --git a/modules/document/document.class.php b/modules/document/document.class.php index f4cb79912..a0842cacf 100644 --- a/modules/document/document.class.php +++ b/modules/document/document.class.php @@ -102,6 +102,9 @@ //2011. 04. 07 adding description column to document categories if(!$oDB->isColumnExists("document_categories","description")) return true; + //2011. 05. 23 adding status column to document + if(!$oDB->isColumnExists('documents', 'status')) return true; + return false; } @@ -237,6 +240,16 @@ //2011. 04. 07 adding description column to document categories if(!$oDB->isColumnExists("document_categories","description")) $oDB->addColumn('document_categories',"description","varchar",200,0); + //2011. 05. 23 adding status column to document + if(!$oDB->isColumnExists('documents', 'status')) + { + $oDB->addColumn('documents', 'status', 'varchar', 20, 'PUBLIC'); + $args->is_secret = 'Y'; + $output = executeQuery('document.updateDocumentStatus', $args); + if($output->toBool()) + $oDB->dropColumn('documents', 'is_secret'); + } + return new Object(0,'success_updated'); } diff --git a/modules/document/document.controller.php b/modules/document/document.controller.php index 40adab898..72fd4962a 100644 --- a/modules/document/document.controller.php +++ b/modules/document/document.controller.php @@ -141,7 +141,6 @@ class documentController extends document { $oDB = &DB::getInstance(); $oDB->begin(); // List variables - if($obj->is_secret!='Y') $obj->is_secret = 'N'; if($obj->allow_comment!='Y') $obj->allow_comment = 'N'; if($obj->lock_comment!='Y') $obj->lock_comment = 'N'; if($obj->allow_trackback!='Y') $obj->allow_trackback = 'N'; @@ -275,7 +274,6 @@ class documentController extends document { $obj->ipaddress = $source_obj->get('ipaddress'); } // List variables - if($obj->is_secret!='Y') $obj->is_secret = 'N'; if($obj->allow_comment!='Y') $obj->allow_comment = 'N'; if($obj->lock_comment!='Y') $obj->lock_comment = 'N'; if($obj->allow_trackback!='Y') $obj->allow_trackback = 'N'; @@ -408,7 +406,6 @@ class documentController extends document { $oDocumentModel = &getModel('document'); // Check if the documnet exists $oDocument = $oDocumentModel->getDocument($document_srl, $is_admin); - debugPrint('normal'); } else if($isEmptyTrash && $oDocument == null) return new Object(-1, 'document is not exists'); @@ -1621,6 +1618,8 @@ class documentController extends document { $document_config->use_vote_down = Context::get('use_vote_down'); if(!$document_config->use_vote_down) $document_config->use_vote_down = 'Y'; + $document_config->use_status = Context::get('use_status'); + $oModuleController = &getController('module'); for($i=0;$isetError(-1); $this->setMessage('success_updated'); } + + /** + * @brief + **/ + function procDocumentTempSave() + { + // Check login information + if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); + + $module_info = Context::get('module_info'); + $logged_info = Context::get('logged_info'); + // Get form information + $obj = Context::getRequestVars(); + // Change the target module to log-in information + $obj->module_srl = $module_info->module_srl; + $obj->status = 'TEMP'; + unset($obj->is_notice); + + // Extract from beginning part of contents in the guestbook + if(!$obj->title) { + $obj->title = cut_str(strip_tags($obj->content), 20, '...'); + } + + $oDocumentModel = &getModel('document'); + $oDocumentController = &getController('document'); + // Check if already exist geulinji + $oDocument = $oDocumentModel->getDocument($obj->document_srl, $this->grant->manager); + // Update if already exists + if($oDocument->isExists() && $oDocument->document_srl == $obj->document_srl) { + $output = $oDocumentController->updateDocument($oDocument, $obj); + $msg_code = 'success_updated'; + // Otherwise, get a new + } else { + $output = $oDocumentController->insertDocument($obj); + $msg_code = 'success_registed'; + $obj->document_srl = $output->get('document_srl'); + $oDocument = $oDocumentModel->getDocument($obj->document_srl, $this->grant->manager); + } + // Set the attachment to be invalid state + if($oDocument->hasUploadedFiles()) { + $args->upload_target_srl = $oDocument->document_srl; + $args->isvalid = 'N'; + executeQuery('file.updateFileValid', $args); + } + + $this->setMessage('success_saved'); + $this->add('document_srl', $obj->document_srl); + } } ?> diff --git a/modules/document/document.item.php b/modules/document/document.item.php index ce2426b08..f6563ae9a 100644 --- a/modules/document/document.item.php +++ b/modules/document/document.item.php @@ -122,7 +122,7 @@ } function isSecret() { - return $this->get('is_secret') == 'Y' ? true : false; + return $this->get('status') == 'SECRET' ? true : false; } function isNotice() { @@ -239,7 +239,8 @@ if($this->isSecret() && !$this->isGranted() && !$this->isAccessible()) return Context::getLang('msg_is_secret'); - $_SESSION['accessible'][$this->document_srl] = true; + $result = $this->_checkAccessibleFromStatus(); + if($result) $_SESSION['accessible'][$this->document_srl] = true; $content = $this->get('content'); @@ -253,7 +254,8 @@ if($this->isSecret() && !$this->isGranted() && !$this->isAccessible()) return Context::getLang('msg_is_secret'); - $_SESSION['accessible'][$this->document_srl] = true; + $result = $this->_checkAccessibleFromStatus(); + if($result) $_SESSION['accessible'][$this->document_srl] = true; $content = $this->get('content'); if(!$stripEmbedTagException) stripEmbedTagForAdmin($content, $this->get('member_srl')); @@ -738,5 +740,22 @@ function replaceResourceRealPath($matches) { return preg_replace('/src=(["\']?)files/i','src=$1'.Context::getRequestUri().'files', $matches[0]); } + + function _checkAccessibleFromStatus() + { + $logged_info = Context::get('logged_info'); + if($logged_info->is_admin == 'Y') return true; + + $status = $this->get('status'); + if(empty($status)) return false; + + if($status == 'PUBLIC' || $status == 'PUBLISH') return true; + else if($status == 'PRIVATE' || $status == 'SECRET') + { + if($this->get('member_srl') == $logged_info->member_srl) + return true; + } + return false; + } } ?> diff --git a/modules/document/document.model.php b/modules/document/document.model.php index e0563112c..8cf806b9a 100644 --- a/modules/document/document.model.php +++ b/modules/document/document.model.php @@ -6,7 +6,6 @@ **/ class documentModel extends document { - /** * @brief Initialization **/ @@ -153,6 +152,7 @@ * @brief module_srl value, bringing the list of documents **/ function getDocumentList($obj, $except_notice = false, $load_extra_vars=true, $columnList = array()) { + $logged_info = Context::get('logged_info'); $sort_check = $this->_setSortIndex($obj, $load_extra_vars); $obj->sort_index = $sort_check->sort_index; @@ -180,6 +180,8 @@ $args->start_date = $obj->start_date?$obj->start_date:null; $args->end_date = $obj->end_date?$obj->end_date:null; $args->member_srl = $obj->member_srl; + $args->statusList = $obj->statusList?$obj->statusList:array('SECRET', 'PUBLIC', 'PUBLISH'); + if($logged_info->is_admin == 'Y') $args->statusList = array('SECRET', 'PUBLIC', 'PUBLISH'); // Category is selected, further sub-categories until all conditions if($args->category_srl) { $category_list = $this->getCategoryList($args->module_srl); @@ -235,6 +237,7 @@ $division_args->list_count = 1; $division_args->sort_index = $args->sort_index; $division_args->order_type = $args->order_type; + $division_args->statusList = $args->statusList; $output = executeQuery($listSqlID, $division_args, $columnList); if($output->data) { $item = array_pop($output->data); @@ -258,7 +261,6 @@ $item = array_pop($output->data); $last_division = $item->list_order; } - } // Make sure that after last_division article if($last_division) { @@ -925,9 +927,8 @@ break; case 'is_notice' : case 'is_secret' : - if($search_keyword=='N') $args->{"s_".$search_target} = 'N'; - elseif($search_keyword=='Y') $args->{"s_".$search_target} = 'Y'; - else $args->{"s_".$search_target} = ''; + if($search_keyword=='N') $args->statusList = array('PUBLIC', 'PUBLISH'); + elseif($search_keyword=='Y') $args->statusList = array('SECRET'); break; case 'member_srl' : case 'readed_count' : @@ -1002,6 +1003,14 @@ $this->add('voted_member_list',$output->data); } + function getStatusConfigList() + { + global $lang; + if(!isset($lang->status_name_list)) + return array('PRIVATE'=>'private', 'PUBLIC'=>'public', 'SECRET'=>'secret', 'TEMP'=>'temporary'); + else return $lang->status_name_list; + } + function _setSortIndex($obj, $load_extra_vars) { $sortIndex = $obj->sort_index; @@ -1074,9 +1083,8 @@ break; case 'is_notice' : case 'is_secret' : - if($search_keyword=='N') $args->{"s_".$search_target} = 'N'; - elseif($search_keyword=='Y') $args->{"s_".$search_target} = 'Y'; - else $args->{"s_".$search_target} = ''; + if($search_keyword=='N') $args->statusList = array('PUBLIC', 'PUBLISH'); + elseif($search_keyword=='Y') $args->statusList = array('SECRET'); break; case 'member_srl' : case 'readed_count' : diff --git a/modules/document/document.view.php b/modules/document/document.view.php index 9fa5e055d..c089dc722 100644 --- a/modules/document/document.view.php +++ b/modules/document/document.view.php @@ -111,5 +111,30 @@ return new Object(); } + function dispTempSavedList() + { + $this->setLayoutFile('popup_layout'); + + $oMemberModel = &getModel('member'); + // A message appears if the user is not logged-in + if(!$oMemberModel->isLogged()) return $this->stop('msg_not_logged'); + // Get the saved document (module_srl is set to member_srl instead) + $logged_info = Context::get('logged_info'); + $args->member_srl = $logged_info->member_srl; + $args->statusList = array('TEMP'); + $args->page = (int)Context::get('page'); + $args->list_count = 10; + + $oDocumentModel = &getModel('document'); + $output = $oDocumentModel->getDocumentList($args, true); + Context::set('total_count', $output->total_count); + Context::set('total_page', $output->total_page); + Context::set('page', $output->page); + Context::set('document_list', $output->data); + Context::set('page_navigation', $output->page_navigation); + + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('saved_list_popup'); + } } ?> diff --git a/modules/document/lang/ko.lang.php b/modules/document/lang/ko.lang.php index 6d0255307..8bafaa1a1 100644 --- a/modules/document/lang/ko.lang.php +++ b/modules/document/lang/ko.lang.php @@ -83,4 +83,6 @@ $lang->success_trashed = '휴지통으로 이동되었습니다.'; $lang->msg_not_selected_document = '선택된 문서가 없습니다.'; $lang->show_voted_member = '사용자 노출'; + $lang->status = '상태'; + $lang->status_name_list = array('PRIVATE'=>'비공개', 'PUBLIC'=>'공개', 'SECRET'=>'비밀', 'TEMP'=>'임시'); ?> diff --git a/modules/document/queries/getDocumentList.xml b/modules/document/queries/getDocumentList.xml index a8726e1df..768d2c33e 100644 --- a/modules/document/queries/getDocumentList.xml +++ b/modules/document/queries/getDocumentList.xml @@ -11,6 +11,7 @@ + @@ -24,7 +25,6 @@ - diff --git a/modules/document/queries/getDocumentListUseIndex.xml b/modules/document/queries/getDocumentListUseIndex.xml index b31de45d7..d7338d5b7 100644 --- a/modules/document/queries/getDocumentListUseIndex.xml +++ b/modules/document/queries/getDocumentListUseIndex.xml @@ -25,7 +25,6 @@ - diff --git a/modules/document/queries/getDocumentListWithinMember.xml b/modules/document/queries/getDocumentListWithinMember.xml index 1f5f93ea7..af2f1b610 100644 --- a/modules/document/queries/getDocumentListWithinMember.xml +++ b/modules/document/queries/getDocumentListWithinMember.xml @@ -9,6 +9,7 @@ + @@ -18,7 +19,6 @@ - diff --git a/modules/document/queries/getDocumentPage.xml b/modules/document/queries/getDocumentPage.xml index b98bd3b96..3c8ec5aea 100644 --- a/modules/document/queries/getDocumentPage.xml +++ b/modules/document/queries/getDocumentPage.xml @@ -21,6 +21,7 @@ + @@ -30,7 +31,6 @@ - diff --git a/modules/document/queries/insertDocument.xml b/modules/document/queries/insertDocument.xml index d576d28c7..f6e3cdd0a 100644 --- a/modules/document/queries/insertDocument.xml +++ b/modules/document/queries/insertDocument.xml @@ -9,7 +9,6 @@ - @@ -38,5 +37,6 @@ + diff --git a/modules/document/queries/updateDocument.xml b/modules/document/queries/updateDocument.xml index 47492becd..57eb9f0cc 100644 --- a/modules/document/queries/updateDocument.xml +++ b/modules/document/queries/updateDocument.xml @@ -7,7 +7,6 @@ - @@ -30,6 +29,7 @@ + diff --git a/modules/document/queries/updateDocumentStatus.xml b/modules/document/queries/updateDocumentStatus.xml new file mode 100644 index 000000000..391354a80 --- /dev/null +++ b/modules/document/queries/updateDocumentStatus.xml @@ -0,0 +1,13 @@ + + +
        + + + + + + + + + + diff --git a/modules/document/schemas/documents.xml b/modules/document/schemas/documents.xml index aaa53a832..6ec6a2e9c 100644 --- a/modules/document/schemas/documents.xml +++ b/modules/document/schemas/documents.xml @@ -4,7 +4,6 @@ - @@ -34,4 +33,5 @@ +
        diff --git a/modules/document/tpl/document_list.html b/modules/document/tpl/document_list.html index 4c0e52f0a..18d1b14f9 100644 --- a/modules/document/tpl/document_list.html +++ b/modules/document/tpl/document_list.html @@ -41,6 +41,7 @@
        {$lang->no}
        {$lang->document}
        +
        {$lang->status}
        {$lang->nick_name}
        {$lang->readed_count}
        {$lang->voted_count}
        @@ -73,6 +74,7 @@ [{$oDocument->getTrackbackCount()}] + {$status_name_list[$oDocument->get('status')]} {$oDocument->getNickName()} {$oDocument->get('readed_count')} {$oDocument->get('voted_count')} / {$oDocument->get('blamed_count')} diff --git a/modules/document/tpl/header.html b/modules/document/tpl/header.html index d93706b4a..5e259198f 100644 --- a/modules/document/tpl/header.html +++ b/modules/document/tpl/header.html @@ -7,6 +7,6 @@
      • class="on">{$lang->document_list}
      • class="on">{$lang->cmd_module_config}
      • class="on">{$lang->cmd_declared_list}
      • -
      • class="on">{$lang->cmd_trash}
      • + class="on">{$lang->cmd_trash} diff --git a/modules/document/tpl/saved_list_popup.html b/modules/document/tpl/saved_list_popup.html new file mode 100644 index 000000000..e791907ed --- /dev/null +++ b/modules/document/tpl/saved_list_popup.html @@ -0,0 +1,49 @@ + + +
        + +
        +

        {$lang->cmd_view_saved_document}

        +
        + +
        +
        + + + + + + + + + + + + + + + + + + + +
        Total : {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
        {$lang->date}
        {$lang->title}
        {$lang->cmd_select}
        {$val->getRegdate("Y-m-d H:i:s")} + + + {$lang->cmd_select}
        + + + +
        +
        +
        diff --git a/modules/importer/importer.admin.controller.php b/modules/importer/importer.admin.controller.php index 7b6490173..65b83b403 100644 --- a/modules/importer/importer.admin.controller.php +++ b/modules/importer/importer.admin.controller.php @@ -539,7 +539,7 @@ $obj->member_srl = 0; $obj->is_notice = base64_decode($xmlDoc->post->is_notice->body)=='Y'?'Y':'N'; - $obj->is_secret = base64_decode($xmlDoc->post->is_secret->body)=='Y'?'Y':'N'; + $obj->status = base64_decode($xmlDoc->post->is_secret->body)=='Y'?'SECRET':'PUBLIC'; $obj->title = base64_decode($xmlDoc->post->title->body); $obj->content = base64_decode($xmlDoc->post->content->body); $obj->readed_count = base64_decode($xmlDoc->post->readed_count->body); diff --git a/modules/importer/ttimport.class.php b/modules/importer/ttimport.class.php index c198626a5..9dd856bd7 100644 --- a/modules/importer/ttimport.class.php +++ b/modules/importer/ttimport.class.php @@ -113,7 +113,7 @@ } $obj->is_notice = 'N'; - $obj->is_secret = in_array($xmlDoc->post->visibility->body, array('public','syndicated'))?'N':'Y'; + $obj->status = in_array($xmlDoc->post->visibility->body, array('public','syndicated'))?'PUBLIC':'SECRET'; $obj->title = $xmlDoc->post->title->body; $obj->content = $xmlDoc->post->content->body; $obj->password = md5($xmlDoc->post->password->body); @@ -275,7 +275,7 @@ $obj->document_srl = getNextSequence(); $obj->uploaded_count = 0; $obj->is_notice = 'N'; - $obj->is_secret = $val->secret->body=='1'?'Y':'N'; + $obj->status = $val->secret->body=='1'?'SECRET':'PUBLIC'; $obj->content = nl2br($val->content->body); // Extract a title form the bocy diff --git a/modules/member/member.api.php b/modules/member/member.api.php index 87c2cb696..a749955ff 100644 --- a/modules/member/member.api.php +++ b/modules/member/member.api.php @@ -31,7 +31,7 @@ function arrangeContent($content) { $output = null; if($content){ - $output= $content->gets('document_srl','category_srl','is_secret','nick_name','user_id','user_name','title','content','tags','voted_count','blamed_count','comment_count','regdate','last_update','extra_vars'); + $output= $content->gets('document_srl','category_srl','nick_name','user_id','user_name','title','content','tags','voted_count','blamed_count','comment_count','regdate','last_update','extra_vars','status'); } return $output; } diff --git a/modules/member/member.controller.php b/modules/member/member.controller.php index 1514dc58e..02f669459 100644 --- a/modules/member/member.controller.php +++ b/modules/member/member.controller.php @@ -406,47 +406,10 @@ /** * @brief Save posts + * @Deplicated - instead Document Controller - procDocumentTempSave method use **/ function procMemberSaveDocument() { - // Check login information - if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); - - $logged_info = Context::get('logged_info'); - // Get form information - $obj = Context::getRequestVars(); - // Change the target module to log-in information - $obj->module_srl = $logged_info->member_srl; - unset($obj->is_notice); - - // Extract from beginning part of contents in the guestbook - if(!$obj->title) { - $obj->title = cut_str(strip_tags($obj->content), 20, '...'); - } - - $oDocumentModel = &getModel('document'); - $oDocumentController = &getController('document'); - // Check if already exist geulinji - $oDocument = $oDocumentModel->getDocument($obj->document_srl, $this->grant->manager); - // Update if already exists - if($oDocument->isExists() && $oDocument->document_srl == $obj->document_srl) { - $output = $oDocumentController->updateDocument($oDocument, $obj); - $msg_code = 'success_updated'; - // Otherwise, get a new - } else { - $output = $oDocumentController->insertDocument($obj); - $msg_code = 'success_registed'; - $obj->document_srl = $output->get('document_srl'); - $oDocument = $oDocumentModel->getDocument($obj->document_srl, $this->grant->manager); - } - // Set the attachment to be invalid state - if($oDocument->hasUploadedFiles()) { - $args->upload_target_srl = $oDocument->document_srl; - $args->isvalid = 'N'; - executeQuery('file.updateFileValid', $args); - } - - $this->setMessage('success_saved'); - $this->add('document_srl', $obj->document_srl); + return new Object(0, 'Deplicated method'); } /** diff --git a/modules/member/member.view.php b/modules/member/member.view.php index d9fc563d0..10540763c 100644 --- a/modules/member/member.view.php +++ b/modules/member/member.view.php @@ -275,28 +275,10 @@ /** * @brief Display a list of saved articles + * @Deplicated - instead Document View - dispTempSavedList method use **/ function dispSavedDocumentList() { - $this->setLayoutFile('popup_layout'); - - $oMemberModel = &getModel('member'); - // A message appears if the user is not logged-in - if(!$oMemberModel->isLogged()) return $this->stop('msg_not_logged'); - // Get the saved document (module_srl is set to member_srl instead) - $logged_info = Context::get('logged_info'); - $args->module_srl = $logged_info->member_srl; - $args->page = (int)Context::get('page'); - $args->list_count = 10; - - $oDocumentModel = &getModel('document'); - $output = $oDocumentModel->getDocumentList($args, true); - Context::set('total_count', $output->total_count); - Context::set('total_page', $output->total_page); - Context::set('page', $output->page); - Context::set('document_list', $output->data); - Context::set('page_navigation', $output->page_navigation); - - $this->setTemplateFile('saved_list_popup'); + return new Object(0, 'Deplicated method'); } /** diff --git a/modules/module/module.controller.php b/modules/module/module.controller.php index aea33194e..5da8acdb4 100644 --- a/modules/module/module.controller.php +++ b/modules/module/module.controller.php @@ -509,7 +509,7 @@ $args->name = trim($key); $args->value = trim($val); if(!$args->name || !$args->value) continue; - executeQuery('module.insertModuleExtraVars', $args); + $output = executeQuery('module.insertModuleExtraVars', $args); } } diff --git a/modules/opage/opage.model.php b/modules/opage/opage.model.php index 645acaf76..03e9f4de3 100644 --- a/modules/opage/opage.model.php +++ b/modules/opage/opage.model.php @@ -17,7 +17,6 @@ * Use a separate model method because external page handles information and configurations of the defaul module either. **/ function getOpage($module_srl) { - debugPrint('getOpage'); $oModuleModel = &getModel('module'); $columnList = array('module_srl'); $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl, $columnList); diff --git a/modules/syndication/queries/getDocumentList.xml b/modules/syndication/queries/getDocumentList.xml index 79c2ea8b4..a5916f0a6 100644 --- a/modules/syndication/queries/getDocumentList.xml +++ b/modules/syndication/queries/getDocumentList.xml @@ -16,7 +16,7 @@ - + diff --git a/modules/trash/conf/module.xml b/modules/trash/conf/module.xml index 7c21e2f84..2b204cee3 100644 --- a/modules/trash/conf/module.xml +++ b/modules/trash/conf/module.xml @@ -2,9 +2,11 @@ + + + - diff --git a/modules/trash/trash.controller.php b/modules/trash/trash.controller.php index c4cf443a2..ab78afa50 100644 --- a/modules/trash/trash.controller.php +++ b/modules/trash/trash.controller.php @@ -6,25 +6,6 @@ **/ class trashController extends trash { - /** - * @brief object insert to trash - **/ - function insertTrash($oTrashVO) - { - $output = executeQuery('trash.insertTrash', $oTrashVO); - debugPrint($output); - return $output; - } - - /** - * @brief empty trash - * @param trashSrls : trash_srl in array - **/ - function emptyTrash($trashSrls) - { - if(!is_array($trashSrls)) return false; - executeQuery('trash.deleteTrash', $trashSrls); - } } /* End of file trash.controller.php */ diff --git a/modules/trash/trash.view.php b/modules/trash/trash.view.php index 27f2a02d3..7536c6294 100644 --- a/modules/trash/trash.view.php +++ b/modules/trash/trash.view.php @@ -12,24 +12,5 @@ class trashView extends trash { **/ function init() { } - - /** - * @brief - **/ - function dispTrash() { - $trashSrl = Context::get('trashSrl'); - debugPrint($trashSrl); - - $oWastebasketModel = getModel('trash'); - $output = $oWastebasketModel->getTrash($trashSrl); - } - - /** - * @brief - **/ - function dispTrashList() { - $oWastebasketModel = getModel('trash'); - $output = $oWastebasketModel->getTrashList(); - } } ?> From b611f9040ed49135de1c93be337844f2ed8e4b66 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Mon, 30 May 2011 05:01:12 +0000 Subject: [PATCH 0100/1372] #19790379 install environment gathering agreement UI update. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8402 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/install/lang/en.lang.php | 9 ++++---- modules/install/lang/es.lang.php | 9 ++++---- modules/install/lang/fr.lang.php | 9 ++++---- modules/install/lang/jp.lang.php | 4 ---- modules/install/lang/ko.lang.php | 6 +++++ modules/install/lang/ru.lang.php | 9 ++++---- modules/install/lang/tr.lang.php | 9 ++++---- modules/install/lang/vi.lang.php | 9 ++++---- modules/install/lang/zh-CN.lang.php | 11 +++++---- modules/install/lang/zh-TW.lang.php | 9 ++++---- modules/install/tpl/css/install.css | 7 ++++-- modules/install/tpl/introduce.html | 35 ++++++++++++++++++----------- modules/install/tpl/js/install.js | 10 +++++++++ 13 files changed, 83 insertions(+), 53 deletions(-) diff --git a/modules/install/lang/en.lang.php b/modules/install/lang/en.lang.php index 3cfd7cac8..71be8fee9 100644 --- a/modules/install/lang/en.lang.php +++ b/modules/install/lang/en.lang.php @@ -229,17 +229,18 @@ EndOfLicense; $lang->about_time_zone = "If the server time and the time on your location don't accord each other, you can set the time to be same as your location by using the time zone"; $lang->qmail_compatibility = 'Enable Qmail'; $lang->about_qmail_compatibility = 'It will enable sending mails from MTA which cannot distinguish CRLF like Qmail.'; - $lang->about_database_file = 'Sqlite saves data in a file. Location of the database file should be unreachable by web
        Data file should be inside the permission of 707.'; - $lang->success_installed = 'Installation has been completed'; - $lang->msg_cannot_proc = 'Installation environment is not proper to proceed.'; $lang->msg_already_installed = 'XE is already installed'; $lang->msg_dbconnect_failed = "Error has occurred while connecting DB.\nPlease check DB information again"; $lang->msg_table_is_exists = "Table is already created in the DB.\nConfig file is recreated"; $lang->msg_install_completed = "Installation has been completed.\nThank you for choosing XE"; $lang->msg_install_failed = "An error has occurred while creating installation file."; - $lang->ftp_get_list = "Get List"; + $lang->msg_read_all = '전문 읽기'; + $lang->msg_license_agreement_desc = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; + $lang->msg_license_agreement_alert = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; + $lang->msg_intall_env_agreement = '설치 환경 수집 동의'; + $lang->msg_intall_env_agreement_desc = '설치 환경 수집에 동의하는 경우 사용자의 XE 설치 환경과 관련되어 있는 \'OS, DBMS, #, #\' 정보가 XE 통계 수집 서버로 전송됩니다. 수집된 정보는 더 나은 SW를 제작하기 위한 통계 수집 이외의 목적으로 활용하지 않습니다. XE는 사용자의 설치 환경 정보를 외부에 공개하지 않습니다. 이 항목에 반드시 동의하지 않아도 됩니다.'; ?> diff --git a/modules/install/lang/es.lang.php b/modules/install/lang/es.lang.php index f5f5ea8eb..c33097996 100644 --- a/modules/install/lang/es.lang.php +++ b/modules/install/lang/es.lang.php @@ -226,17 +226,18 @@ EndOfLicense; $lang->about_time_zone = "Si la hora del servidor y la hora de su ubicación es diferente, Usted puede elegir la hora por zona para corregir"; $lang->qmail_compatibility = 'Compatible con Qmail'; $lang->about_qmail_compatibility = 'Qmail como MTA no reconoce CRLF como la línea de separación que se enviará por correo.'; - $lang->about_database_file = 'Sqlite guarda el dato en el archivo. Es necesario crear archivo de BD en un lugar inaccesible de la web.
        El archivo de dato debe estar ubicado en un lugar con la atribución 707.'; - $lang->success_installed = 'Instalación finalizada'; - $lang->msg_cannot_proc = 'No puede ser ejecutado lo requerido por no disponer del ambiente de instalación.'; $lang->msg_already_installed = 'Instalación de XE ya existe.'; $lang->msg_dbconnect_failed = "Ha ocurrido un error en la conección de BD.\n Por favor chequee la información de BD nuevamente"; $lang->msg_table_is_exists = "La tabla ya ha sido creado en BD.\n Creado nuevamente el archivo de configuración."; $lang->msg_install_completed = "Instalación finalizada.\n Muchas gracias."; $lang->msg_install_failed = "Ha ocurrido un error al crear el archivo de instalación."; - $lang->ftp_get_list = "Get List"; + $lang->msg_read_all = '전문 읽기'; + $lang->msg_license_agreement_desc = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; + $lang->msg_license_agreement_alert = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; + $lang->msg_intall_env_agreement = '설치 환경 수집 동의'; + $lang->msg_intall_env_agreement_desc = '설치 환경 수집에 동의하는 경우 사용자의 XE 설치 환경과 관련되어 있는 \'OS, DBMS, #, #\' 정보가 XE 통계 수집 서버로 전송됩니다. 수집된 정보는 더 나은 SW를 제작하기 위한 통계 수집 이외의 목적으로 활용하지 않습니다. XE는 사용자의 설치 환경 정보를 외부에 공개하지 않습니다. 이 항목에 반드시 동의하지 않아도 됩니다.'; ?> diff --git a/modules/install/lang/fr.lang.php b/modules/install/lang/fr.lang.php index 560809fc4..31ac41553 100644 --- a/modules/install/lang/fr.lang.php +++ b/modules/install/lang/fr.lang.php @@ -227,17 +227,18 @@ EndOfLicense; $lang->about_time_zone = "Si l'heure de serveur et celle de votre emplacement ne s'accordent pas, vous pouvez remettre l'heure comme le même heure de votre lieu en configurant le fuseau horaire "; $lang->qmail_compatibility = 'Compatible avec Qmail'; $lang->about_qmail_compatibility = 'Le mél sera envoyé en MTA qui ne peut pas reconnaître le CRLF comme délimiteur des lignes comme le Qmail.'; - $lang->about_database_file = 'Sqlite conserve des données dans le fichier. Vous devez placer le fichier de la base de données où l\'on ne peut pas accéder par web.
        Le fichier des Donées doit être en dedans la permission 707.'; - $lang->success_installed = 'Installation s\'est complété'; - $lang->msg_cannot_proc = 'Environnement d\'Installation n\'est pas équipé à procéder.'; $lang->msg_already_installed = 'XE est déjà installé'; $lang->msg_dbconnect_failed = "Erreur a lieu en essayant connecter à la Base de Données.\nVérifiez encore une fois les informations sur la Base de Données, S.V.P."; $lang->msg_table_is_exists = "La Table est déjà créée dans la Base de Données.\nLe fichier de Configuration est recréé."; $lang->msg_install_completed = "Installation a complété.\nMerci pour choisir XE"; $lang->msg_install_failed = "Une erreur a lieu en créant le fichier d\'installation."; - $lang->ftp_get_list = "Get List"; + $lang->msg_read_all = '전문 읽기'; + $lang->msg_license_agreement_desc = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; + $lang->msg_license_agreement_alert = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; + $lang->msg_intall_env_agreement = '설치 환경 수집 동의'; + $lang->msg_intall_env_agreement_desc = '설치 환경 수집에 동의하는 경우 사용자의 XE 설치 환경과 관련되어 있는 \'OS, DBMS, #, #\' 정보가 XE 통계 수집 서버로 전송됩니다. 수집된 정보는 더 나은 SW를 제작하기 위한 통계 수집 이외의 목적으로 활용하지 않습니다. XE는 사용자의 설치 환경 정보를 외부에 공개하지 않습니다. 이 항목에 반드시 동의하지 않아도 됩니다.'; ?> diff --git a/modules/install/lang/jp.lang.php b/modules/install/lang/jp.lang.php index cb10322c4..fba36d64f 100644 --- a/modules/install/lang/jp.lang.php +++ b/modules/install/lang/jp.lang.php @@ -228,17 +228,13 @@ EndOfLicense; $lang->about_time_zone = 'サーバの設定時間とサービスしているローカル時間との差がある場合、タイムゾーンを指定して表示時間を合わせることが出来ます。'; $lang->qmail_compatibility = 'Qmail 互換'; $lang->about_qmail_compatibility = 'Qmail等、CRLFを改行コードとして認識出来ないMTA(Message Transfer Agent)で、メールの送信が出来るようにします。'; - $lang->about_database_file = 'Sqliteはファイルにデータを保存します。そのため、データベースファイルにはウェブからアクセス出来ない場所にしなければなりません。
        データファイルのパーミッションは「707」に設定して下さい。'; - $lang->success_installed = '正常にインストールされました。'; - $lang->msg_cannot_proc = 'インストール出来る環境が整っていないため、リクエストを実行出来ませんでした。'; $lang->msg_already_installed = '既にインストールされています。'; $lang->msg_dbconnect_failed = "データベースアクセスにエラーが発生しました。\nデータベースの情報をもう一度確認して下さい。"; $lang->msg_table_is_exists = "既にデータベースにデーブルが作成されています。\nconfigファイルを再作成しました。"; $lang->msg_install_completed = "インストールが完了しました。\nありがとうございます。"; $lang->msg_install_failed = 'インストールファイルを作成する際にエラーが発生しました。'; - $lang->ftp_get_list = "Get List"; ?> diff --git a/modules/install/lang/ko.lang.php b/modules/install/lang/ko.lang.php index 77f2cfb23..8690bb326 100644 --- a/modules/install/lang/ko.lang.php +++ b/modules/install/lang/ko.lang.php @@ -237,4 +237,10 @@ EndOfLicense; $lang->msg_install_completed = "설치가 완료되었습니다.\n감사합니다."; $lang->msg_install_failed = '설치 파일 생성 시에 오류가 발생하였습니다.'; $lang->ftp_get_list = '목록 가져오기'; + $lang->msg_license_agreement = 'GNU 약소 일반 공중 사용 허가서(LGPL v2) 동의'; + $lang->msg_read_all = '전문 읽기'; + $lang->msg_license_agreement_desc = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; + $lang->msg_license_agreement_alert = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; + $lang->msg_intall_env_agreement = '설치 환경 수집 동의'; + $lang->msg_intall_env_agreement_desc = '설치 환경 수집에 동의하는 경우 사용자의 XE 설치 환경과 관련되어 있는 \'OS, DBMS, #, #\' 정보가 XE 통계 수집 서버로 전송됩니다. 수집된 정보는 더 나은 SW를 제작하기 위한 통계 수집 이외의 목적으로 활용하지 않습니다. XE는 사용자의 설치 환경 정보를 외부에 공개하지 않습니다. 이 항목에 반드시 동의하지 않아도 됩니다.'; ?> diff --git a/modules/install/lang/ru.lang.php b/modules/install/lang/ru.lang.php index d14b33b47..2ad244dc3 100644 --- a/modules/install/lang/ru.lang.php +++ b/modules/install/lang/ru.lang.php @@ -227,17 +227,18 @@ EndOfLicense; $lang->about_time_zone = "Если серверное время и Ваше локальное время не совпадают, Вы можете установить такое же время, как Ваше локальное, используя часовой пояс"; $lang->qmail_compatibility = 'Qmail 호환'; $lang->about_qmail_compatibility = 'Qmail등 CRLF를 줄 구분자로 인식하지 못하는 MTA에서 메일이 발송되도록 합니다.'; - $lang->about_database_file = 'Sqlite сохраняет данные в файл. Размещение базы данных должно быть недоступно с веб
        Файл базы данных должен иметь права доступа 707.'; - $lang->success_installed = 'Установка завершена'; - $lang->msg_cannot_proc = 'Невозможно исполнить запрос, поскольку окружение установки не указано'; $lang->msg_already_installed = 'XE уже установлена'; $lang->msg_dbconnect_failed = "Произошла ошибка подключения к базе данных.\nПожалуйста, проверьте иформацию базы данных еще раз"; $lang->msg_table_is_exists = "Таблица существует в базе данных.\nФайл конфигурации создан заново"; $lang->msg_install_completed = "Установка завершена.\nСпасибо Вам за выбор XE"; $lang->msg_install_failed = "Произошла ошибка при создании файла конфигурации."; - $lang->ftp_get_list = 'Get List'; + $lang->msg_read_all = '전문 읽기'; + $lang->msg_license_agreement_desc = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; + $lang->msg_license_agreement_alert = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; + $lang->msg_intall_env_agreement = '설치 환경 수집 동의'; + $lang->msg_intall_env_agreement_desc = '설치 환경 수집에 동의하는 경우 사용자의 XE 설치 환경과 관련되어 있는 \'OS, DBMS, #, #\' 정보가 XE 통계 수집 서버로 전송됩니다. 수집된 정보는 더 나은 SW를 제작하기 위한 통계 수집 이외의 목적으로 활용하지 않습니다. XE는 사용자의 설치 환경 정보를 외부에 공개하지 않습니다. 이 항목에 반드시 동의하지 않아도 됩니다.'; ?> diff --git a/modules/install/lang/tr.lang.php b/modules/install/lang/tr.lang.php index 463e89efe..ac96abf5f 100644 --- a/modules/install/lang/tr.lang.php +++ b/modules/install/lang/tr.lang.php @@ -223,17 +223,18 @@ EndOfLicense; $lang->about_time_zone = "Eğer sunucu zaman dilimi ve bulunduğunuz yerin zaman dilimi uyumlu değilse; zaman dilimi özelliğini kullanarak zamanı bulunduğunuz yere göre ayarlayabilirsiniz "; $lang->qmail_compatibility = 'Qmail\'i Etkinleştir'; $lang->about_qmail_compatibility = 'Bu size QMail gibi CRLF\'den ayırt edilemeyen MTA\'dan mail gönderme imkanı sağlayacaktır.'; - $lang->about_database_file = 'Sqlite veriyi dosyaya kaydeder. Veritabanı dosyası tarayıcıyla erişilebilir olmamalıdır.
        Veri dosyası 707 yetki kapsamı içinde olmalıdır.'; - $lang->success_installed = 'Kurulum tamamlandı'; - $lang->msg_cannot_proc = 'Kurulum ortamı devam etmek için uygun değil.'; $lang->msg_already_installed = 'XE zaten kurulmuştur'; $lang->msg_dbconnect_failed = "VT\'ye ulaşırken bir hata oluştu.\nLütfen VT bilgisini tekrar kontrol ediniz"; $lang->msg_table_is_exists = "Tablo zaten VT\'da oluşturuldu.\nYapılandırma dosyası yeniden oluşturuldu"; $lang->msg_install_completed = "Kurulum tamamlandı.\nXE\'yi seçtiğiniz için teşekkür ederiz"; $lang->msg_install_failed = "Kurulum dosyası oluşturulurken bir hata oluştu."; - $lang->ftp_get_list = "Liste Al"; + $lang->msg_read_all = '전문 읽기'; + $lang->msg_license_agreement_desc = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; + $lang->msg_license_agreement_alert = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; + $lang->msg_intall_env_agreement = '설치 환경 수집 동의'; + $lang->msg_intall_env_agreement_desc = '설치 환경 수집에 동의하는 경우 사용자의 XE 설치 환경과 관련되어 있는 \'OS, DBMS, #, #\' 정보가 XE 통계 수집 서버로 전송됩니다. 수집된 정보는 더 나은 SW를 제작하기 위한 통계 수집 이외의 목적으로 활용하지 않습니다. XE는 사용자의 설치 환경 정보를 외부에 공개하지 않습니다. 이 항목에 반드시 동의하지 않아도 됩니다.'; ?> diff --git a/modules/install/lang/vi.lang.php b/modules/install/lang/vi.lang.php index 182a7b5ed..243912ef5 100644 --- a/modules/install/lang/vi.lang.php +++ b/modules/install/lang/vi.lang.php @@ -229,17 +229,18 @@ EndOfLicense; $lang->about_time_zone = "Nếu thời gian của khu vực bạn không tự động cập nhật. Bạn có thể chọn thời gian để hiển thị cho Website."; $lang->qmail_compatibility = 'Mở Qmail'; $lang->about_qmail_compatibility = 'Nó sẽ cho phép gửi thư từ MTA mà không phân biệt CRLF.'; - $lang->about_database_file = 'Sqlite lưu trữ dữ liệu trong một File, vì vậy cần tới sự truy cập đến nó trong Database.
        Hãy CHMOD thành 707.'; - $lang->success_installed = 'Chúc mừng bạn đã cài đặt XE thành công!'; - $lang->msg_cannot_proc = 'Môi trường cài đặt không thích hợp.'; $lang->msg_already_installed = 'Một phiên bản nào đó của XE đã được cài đặt từ trước.
        Xin hãy kiểm tra lại!'; $lang->msg_dbconnect_failed = "Đã có lỗi xảy ra khi kết nối tới Database.\nXin vui lòng kiểm tra lại thông tin!"; $lang->msg_table_is_exists = "Table đã có sẵn trên Database.\nFile Config đã đuwọc thiết lập lại."; $lang->msg_install_completed = "Đã cài đặt XE thành công!.\nXin cảm ơn đã sử dụng XE!"; $lang->msg_install_failed = "Đã có lỗi xảy ra khi tạo File cài đặt."; - $lang->ftp_get_list = "Nhận danh sách"; + $lang->msg_read_all = '전문 읽기'; + $lang->msg_license_agreement_desc = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; + $lang->msg_license_agreement_alert = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; + $lang->msg_intall_env_agreement = '설치 환경 수집 동의'; + $lang->msg_intall_env_agreement_desc = '설치 환경 수집에 동의하는 경우 사용자의 XE 설치 환경과 관련되어 있는 \'OS, DBMS, #, #\' 정보가 XE 통계 수집 서버로 전송됩니다. 수집된 정보는 더 나은 SW를 제작하기 위한 통계 수집 이외의 목적으로 활용하지 않습니다. XE는 사용자의 설치 환경 정보를 외부에 공개하지 않습니다. 이 항목에 반드시 동의하지 않아도 됩니다.'; ?> diff --git a/modules/install/lang/zh-CN.lang.php b/modules/install/lang/zh-CN.lang.php index a0cc4b9f7..7fead739a 100644 --- a/modules/install/lang/zh-CN.lang.php +++ b/modules/install/lang/zh-CN.lang.php @@ -216,9 +216,7 @@ EndOfLicense; $lang->db_database = '数据库名'; $lang->db_database_file = '数据库文件'; $lang->db_table_prefix = '前缀'; - $lang->admin_title = '管理员信息'; - $lang->env_title = '环境设置'; $lang->use_optimizer = '使用Optimizer'; $lang->about_optimizer = '使用Optimizer可以对大部分的CSS/ JS文件进行整合/压缩传送使之加快网站访问速度。
        只是有时会发生小小的问题。这时候请暂时不要使用Optimizer。'; @@ -230,17 +228,18 @@ EndOfLicense; $lang->about_time_zone = '服务器时间和您所处的时间有差异时,可以设置时区来满足你所需要的时间显示。'; $lang->qmail_compatibility = 'Qmail互换'; $lang->about_qmail_compatibility = '支持不能识别CRLF为换行符的Qmail等MTA,也能发送电子邮件。'; - $lang->about_database_file = 'Sqlite是文件里保存数据。数据库的文件位置应该放在web不能访问的地方。
        数据文件应放在具有707属性的位置。'; - $lang->success_installed = '已完成安装。'; - $lang->msg_cannot_proc = '不具备安装所需环境,不能继续进行。'; $lang->msg_already_installed = '已安装'; $lang->msg_dbconnect_failed = "连接DB时发生错误。\n请重新确认DB信息。"; $lang->msg_table_is_exists = "已生成数据表。\n重新生成了config文件。"; $lang->msg_install_completed = "安装完成。\n非常感谢。"; $lang->msg_install_failed = "生成安装文件时发生错误。"; - $lang->ftp_get_list = '载入FTP列表'; + $lang->msg_read_all = '전문 읽기'; + $lang->msg_license_agreement_desc = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; + $lang->msg_license_agreement_alert = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; + $lang->msg_intall_env_agreement = '설치 환경 수집 동의'; + $lang->msg_intall_env_agreement_desc = '설치 환경 수집에 동의하는 경우 사용자의 XE 설치 환경과 관련되어 있는 \'OS, DBMS, #, #\' 정보가 XE 통계 수집 서버로 전송됩니다. 수집된 정보는 더 나은 SW를 제작하기 위한 통계 수집 이외의 목적으로 활용하지 않습니다. XE는 사용자의 설치 환경 정보를 외부에 공개하지 않습니다. 이 항목에 반드시 동의하지 않아도 됩니다.'; ?> diff --git a/modules/install/lang/zh-TW.lang.php b/modules/install/lang/zh-TW.lang.php index 304ca8a71..b21adc3a3 100644 --- a/modules/install/lang/zh-TW.lang.php +++ b/modules/install/lang/zh-TW.lang.php @@ -227,17 +227,18 @@ EndOfLicense; $lang->about_time_zone = '主機時間和您所處的時間有差異時,可以設置時區來滿足你所需要的時間顯示。'; $lang->qmail_compatibility = 'Qmail互換'; $lang->about_qmail_compatibility = '支援無法識別 CRLF 為換行符的 Qmail 等 MTA,也能發送電子郵件。'; - $lang->about_database_file = 'Sqlite是保存資料於檔案中。資料庫的檔案位置應該放在 web 不能訪問的地方。
        資料檔案應放在具有 707 權限的位置。'; - $lang->success_installed = '已完成安裝。'; - $lang->msg_cannot_proc = '不具備安裝所需環境,無法繼續安裝。'; $lang->msg_already_installed = '已安裝'; $lang->msg_dbconnect_failed = "連接資料庫時發生錯誤。\n請重新確認資料庫資訊。"; $lang->msg_table_is_exists = "已建立資料表。\n重新建立 config 檔案。"; $lang->msg_install_completed = "安裝完成。\n非常感謝。"; $lang->msg_install_failed = "建立安裝檔案時,發生錯誤。"; - $lang->ftp_get_list = "取得列表"; + $lang->msg_read_all = '전문 읽기'; + $lang->msg_license_agreement_desc = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; + $lang->msg_license_agreement_alert = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; + $lang->msg_intall_env_agreement = '설치 환경 수집 동의'; + $lang->msg_intall_env_agreement_desc = '설치 환경 수집에 동의하는 경우 사용자의 XE 설치 환경과 관련되어 있는 \'OS, DBMS, #, #\' 정보가 XE 통계 수집 서버로 전송됩니다. 수집된 정보는 더 나은 SW를 제작하기 위한 통계 수집 이외의 목적으로 활용하지 않습니다. XE는 사용자의 설치 환경 정보를 외부에 공개하지 않습니다. 이 항목에 반드시 동의하지 않아도 됩니다.'; ?> diff --git a/modules/install/tpl/css/install.css b/modules/install/tpl/css/install.css index 2302d3f48..8109098ec 100644 --- a/modules/install/tpl/css/install.css +++ b/modules/install/tpl/css/install.css @@ -91,7 +91,6 @@ html{height:100%;background:url(../img/bgHtml.gif) repeat-x 0 0} .item{position:relative} .iLabel{display:block;position:static;top:4px;left:5px;color:#eee} .iText{position:relative;padding:3px 4px;border:1px solid #444;border-right-color:#555;border-bottom-color:#555;background:transparent;color:#fff} -.agreement{padding:0;margin:0 20px 20px 20px;overflow:auto;height:300px;font-family:Tahoma, Geneva, sans-serif;color:#fff} .form{padding:0;margin:0 20px 20px 20px;list-style:none} .form li{margin:0 0 10px 0} .form.formFtp label, @@ -107,4 +106,8 @@ html{height:100%;background:url(../img/bgHtml.gif) repeat-x 0 0} .desc{padding:10px 20px;margin:0 20px 20px 20px;background:#555;color:#eee} .desc ul{margin:0 0 0 20px;padding:0} .desc strong{color:#F60} - +.agreement{color:#eee} +.agreement label{font-weight:bold;vertical-align:middle;cursor:pointer} +.agreement a{color:#6CF;text-decoration:underline;vertical-align:middle} +.agreement em{color:#f60} +.agreement p{line-height:1.5} \ No newline at end of file diff --git a/modules/install/tpl/introduce.html b/modules/install/tpl/introduce.html index 30bbd8313..7d01347aa 100644 --- a/modules/install/tpl/introduce.html +++ b/modules/install/tpl/introduce.html @@ -3,21 +3,30 @@
        -
        {str_replace("\n", '

        ', $lang->license)}

        -
        -
        -
        - - - +
        +
        +

        - {$lang->read_all}

        +

        {$lang->msg_license_agreement_desc}

        +
        +
        +

        +

        {$lang->msg_intall_env_agreement_desc}

        +
        +
        +
        +
        + + + +
        +
        +
        +
        - -
        +
        diff --git a/modules/install/tpl/js/install.js b/modules/install/tpl/js/install.js index 7f329106e..f7bba6123 100644 --- a/modules/install/tpl/js/install.js +++ b/modules/install/tpl/js/install.js @@ -1,4 +1,14 @@ jQuery(function($){ + // Agreement + var agree = $('.agreement'); + agree.submit(function(){ + if($('#lgpl:checked').length==0){ + alert('{$lang->msg_license_agreement_alert}'); + $('#lgpl').focus(); + return false; + } + }); + // Input Clear var iText = $('.item>.iLabel').next('.iText'); $('.item>.iLabel').css('position','absolute'); From a247e1608f59119058bef2a838cdf2f42db3ed1a Mon Sep 17 00:00:00 2001 From: ovclas Date: Mon, 30 May 2011 05:35:38 +0000 Subject: [PATCH 0101/1372] #19728240 install language file modified git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8403 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/install/lang/en.lang.php | 18 +++++++++++++----- modules/install/lang/ko.lang.php | 1 - 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/modules/install/lang/en.lang.php b/modules/install/lang/en.lang.php index 71be8fee9..ef992a007 100644 --- a/modules/install/lang/en.lang.php +++ b/modules/install/lang/en.lang.php @@ -157,9 +157,16 @@ Each version is given a distinguishing version number. If the Library specifies END OF TERMS AND CONDITIONS EndOfLicense; - + $lang->install_progress_menu = array( + 'agree'=>'Acceptance of terms', + 'condition'=>'Check the installation conditions', + 'ftp'=>'Input FTP information', + 'dbSelect'=>'Choose database type', + 'dbInfo'=>'Input Database information', + 'configInfo'=>'Preferences', + 'adminInfo'=>'Enter Administrator information' + ); $lang->install_condition_title = "Please check the installation requirement."; - $lang->install_checklist_title = array( 'php_version' => 'PHP Version', 'permission' => 'Permission', @@ -182,11 +189,10 @@ EndOfLicense; $lang->install_without_xml = 'XML Library is not installed'; $lang->install_checklist_gd = 'Install GD Library'; $lang->install_without_gd = 'GD Library is not installed for image convertion'; - $lang->install_checklist_gd = 'Intall GD Library'; $lang->install_without_iconv = 'Iconv Library is not installed for processing characters'; $lang->install_session_auto_start = 'Possible problems might occur due to the php setting. session.auto_start is equal to 1'; $lang->install_permission_denied = 'Installation path\'s permission doesn\'t equal to 707'; - + $lang->install_notandum = 'All form must be filled, but you can modify all of settings after finish the installation.'; $lang->cmd_agree_license = 'I agree with the license'; $lang->cmd_install_fix_checklist = 'I have fixed the required conditions.'; $lang->cmd_install_next = 'Continue installation'; @@ -214,7 +220,8 @@ EndOfLicense; $lang->db_password = 'DB Password'; $lang->db_database = 'DB Database'; $lang->db_database_file = 'DB Database File'; - $lang->db_table_prefix = 'Table Header'; + $lang->db_table_prefix = 'Table Header'; + $lang->db_info_desc = '

        Please check database information to server master.

        You can modify database table preface, and can use small letters(small letter is recommended), and numbers, but you can not use special letters.

        '; $lang->admin_title = 'Administrator Info'; @@ -238,6 +245,7 @@ EndOfLicense; $lang->msg_install_completed = "Installation has been completed.\nThank you for choosing XE"; $lang->msg_install_failed = "An error has occurred while creating installation file."; $lang->ftp_get_list = "Get List"; + $lang->msg_license_agreement = 'GNU 약소 일반 공중 사용 허가서(LGPL v2) 동의'; $lang->msg_read_all = '전문 읽기'; $lang->msg_license_agreement_desc = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; $lang->msg_license_agreement_alert = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; diff --git a/modules/install/lang/ko.lang.php b/modules/install/lang/ko.lang.php index 8690bb326..5ec337b13 100644 --- a/modules/install/lang/ko.lang.php +++ b/modules/install/lang/ko.lang.php @@ -185,7 +185,6 @@ EndOfLicense; $lang->install_without_xml = 'xml 라이브러리가 설치되어 있지 않습니다.'; $lang->install_checklist_gd = 'GD라이브러리 설치'; $lang->install_without_gd = '이미지 변환을 위한 GD 라이브러리가 설치되어 있지 않습니다.'; - $lang->install_checklist_gd = 'GD라이브러리 설치'; $lang->install_without_iconv = '문자열을 처리하기 위한 iconv 라이브러리가 설치되어 있지 않습니다.'; $lang->install_session_auto_start = 'php설정의 session.auto_start==1 이라 세션 처리에 문제가 발생할 수 있습니다.'; $lang->install_permission_denied = '설치대상 디렉토리의 퍼미션이 707이 아닙니다.'; From ae259db337249ca22409e208674be940c87cd6b9 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Mon, 30 May 2011 08:08:12 +0000 Subject: [PATCH 0102/1372] #19678504 HTML5 UI Bug Fix. html5.js Added. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8404 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/js/html5.js | 4 + common/tpl/common_layout.html | 32 +- layouts/user_layout/conf/info.xml | 19 + layouts/user_layout/layout.html | 47 ++ layouts/user_layout/user_layout.css | 15 + layouts/user_layout/user_layout.js | 5 + modules/admin/tpl/_header.html | 4 +- modules/admin/tpl/config.html | 12 +- modules/admin/tpl/css/admin.css | 794 +++++++++++++++++------ modules/admin/tpl/css/dashboard.css | 203 +++--- modules/admin/tpl/css/font.css | 60 -- modules/admin/tpl/css/layout.css | 47 -- modules/admin/tpl/css/minify.ini | 11 - modules/admin/tpl/css/pagination.css | 85 --- modules/admin/tpl/css/xe_admin.css | 368 ----------- modules/admin/tpl/css/xe_admin.min.css | 1 - modules/admin/tpl/img/bgFooter.gif | Bin 54 -> 0 bytes modules/admin/tpl/img/bgHeader.gif | Bin 177 -> 0 bytes modules/admin/tpl/img/btnPlusMinus.gif | Bin 0 -> 91 bytes modules/admin/tpl/img/iconNavVr.gif | Bin 0 -> 134 bytes modules/admin/tpl/img/iconStarRating.gif | Bin 0 -> 1330 bytes modules/admin/tpl/img/lineTree.gif | Bin 0 -> 727 bytes modules/admin/tpl/js/admin.js | 232 +++++++ modules/install/lang/ko.lang.php | 2 +- 24 files changed, 1029 insertions(+), 912 deletions(-) create mode 100644 common/js/html5.js create mode 100644 layouts/user_layout/conf/info.xml create mode 100644 layouts/user_layout/layout.html create mode 100644 layouts/user_layout/user_layout.css create mode 100644 layouts/user_layout/user_layout.js delete mode 100755 modules/admin/tpl/css/font.css delete mode 100755 modules/admin/tpl/css/layout.css delete mode 100644 modules/admin/tpl/css/minify.ini delete mode 100755 modules/admin/tpl/css/pagination.css delete mode 100644 modules/admin/tpl/css/xe_admin.css delete mode 100644 modules/admin/tpl/css/xe_admin.min.css delete mode 100755 modules/admin/tpl/img/bgFooter.gif delete mode 100755 modules/admin/tpl/img/bgHeader.gif create mode 100644 modules/admin/tpl/img/btnPlusMinus.gif create mode 100644 modules/admin/tpl/img/iconNavVr.gif create mode 100644 modules/admin/tpl/img/iconStarRating.gif create mode 100644 modules/admin/tpl/img/lineTree.gif diff --git a/common/js/html5.js b/common/js/html5.js new file mode 100644 index 000000000..b87a4e57a --- /dev/null +++ b/common/js/html5.js @@ -0,0 +1,4 @@ +// html5shiv @rem remysharp.com/html5-enabling-script +// iepp v1.6.2 @jon_neal iecss.com/print-protector +// Dual licensed under the MIT or GPL Version 2 licenses +/*@cc_on(function(a,b){function r(a){var b=-1;while(++b";return a.childNodes.length!==1}())){a.iepp=a.iepp||{};var c=a.iepp,d=c.html5elements||"abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",e=d.split("|"),f=e.length,g=new RegExp("(^|\\s)("+d+")","gi"),h=new RegExp("<(/*)("+d+")","gi"),i=/^\s*[\{\}]\s*$/,j=new RegExp("(^|[^\\n]*?\\s)("+d+")([^\\n]*)({[\\n\\w\\W]*?})","gi"),k=b.createDocumentFragment(),l=b.documentElement,m=l.firstChild,n=b.createElement("body"),o=b.createElement("style"),p=/print|all/,q;c.getCSS=function(a,b){if(a+""===undefined)return"";var d=-1,e=a.length,f,g=[];while(++duse_html5=='Y')--> - + @@ -26,24 +26,26 @@ {Context::getBrowserTitle()} {@ $css_files = Context::getCssFile() } - - - - - - + + + + + + {@ $js_files = Context::getJsFile() } - - - - - - + + + + + + + + diff --git a/layouts/user_layout/conf/info.xml b/layouts/user_layout/conf/info.xml new file mode 100644 index 000000000..109143907 --- /dev/null +++ b/layouts/user_layout/conf/info.xml @@ -0,0 +1,19 @@ + + + 사용자 정의 레이아웃 + User defined layout + ユーザー定義のレイアウト + 사용자 정의 레이아웃에 관한 설명 입니다. + Description for user defined layout. + ユーザー定義のレイアウトについての説明です。 + 1.0 + 2010-12-24 + + User Name + + + + 메뉴 + + + diff --git a/layouts/user_layout/layout.html b/layouts/user_layout/layout.html new file mode 100644 index 000000000..5a3554723 --- /dev/null +++ b/layouts/user_layout/layout.html @@ -0,0 +1,47 @@ + +
        +
        +

        Site Logo

        + +
        +
        + .gnb + +
        +
        +
        +
        +
        + +
        + .lnb +

        {$val1['link']}

        + +
        +
        +
        .content{$content}
        +
        +
        + +
        diff --git a/layouts/user_layout/user_layout.css b/layouts/user_layout/user_layout.css new file mode 100644 index 000000000..23e516620 --- /dev/null +++ b/layouts/user_layout/user_layout.css @@ -0,0 +1,15 @@ +@charset "utf-8"; +/* Layout */ +hr{ display:none;} +form, fieldset{ border:0; margin:0; padding:0;} +.user_layout{ width:960px; margin:0 auto;} +.header{ zoom:1; background:#ddd;} +.header:after{ content:""; display:block; clear:both;} +.header .search{ float:right;} +.gnb{ float:left;} +.body{ margin:20px 0; zoom:1; background:#eee;} +.body:after{ content:""; display:block; clear:both;} +.lnb{ float:left; width:200px; background:#ddd;} +.account{} +.content{ float:right; width:740px; background:#ddd;} +.footer{ background:#ddd;} \ No newline at end of file diff --git a/layouts/user_layout/user_layout.js b/layouts/user_layout/user_layout.js new file mode 100644 index 000000000..19a0de06c --- /dev/null +++ b/layouts/user_layout/user_layout.js @@ -0,0 +1,5 @@ +// diff --git a/modules/admin/tpl/_header.html b/modules/admin/tpl/_header.html index a5c75ef79..c577cb4ea 100644 --- a/modules/admin/tpl/_header.html +++ b/modules/admin/tpl/_header.html @@ -1,5 +1,5 @@ - - + +

        XpressEngine

        diff --git a/modules/admin/tpl/config.html b/modules/admin/tpl/config.html index 5ce2cd344..780c13fd7 100644 --- a/modules/admin/tpl/config.html +++ b/modules/admin/tpl/config.html @@ -101,7 +101,7 @@

        {$lang->about_use_ssl}

        @@ -110,8 +110,8 @@
        {$lang->server_ports}
        - HTTP : , - HTTPS: + HTTP : , + HTTPS:

        {$lang->about_server_ports}

        @@ -138,7 +138,7 @@
        - +
        @@ -171,13 +171,13 @@
        - +
        - + diff --git a/modules/admin/tpl/css/admin.css b/modules/admin/tpl/css/admin.css index 655d94d92..3553d19f0 100644 --- a/modules/admin/tpl/css/admin.css +++ b/modules/admin/tpl/css/admin.css @@ -1,190 +1,569 @@ @charset "utf-8"; /* NHN (developers@xpressengine.com) */ - -#xeAdmin .open{ display:block !important;} -#xeAdmin h1.xeAdmin { float:left; white-space:nowrap; margin:0;padding:0;} -#xeAdmin caption{ text-align:left;} -#xeAdmin button{ cursor:pointer;} -#xeAdmin hr{ display:none;} -#xeAdmin fieldset{ border:0;} -#xeAdmin fieldset legend{ font-size:0; line-height:0; position:absolute; visibility:hidden;} -#xeAdmin .section{ margin-bottom:20px;} -#xeAdmin .buttonArea{ text-align:center; padding:15px 0;} -#xeAdmin button.text{ background:none; border:0; color:#0000ee;} -#xeAdmin img.graphHr{ height:5px; vertical-align:middle;} -#xeAdmin .ac{ text-align:center;} -#xeAdmin .al{ text-align:left;} -#xeAdmin .ar{ text-align:right;} - -.crossTable{ width:100%; border:0; margin:0 0 20px 0; padding:0;} -.crossTable th div { white-space:nowrap; } +/* Element Reset */ +body,table,input,textarea,select,button{font-family:Tahoma,Geneva,sans-serif;font-size:14px;color:#333} +header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{display:block} +button,input[type=submit],input[type=reset],input[type=button]{cursor:pointer;overflow:visible} +body{margin:0} +img{border:0} +/* Section & Heading */ +.section{margin:1em 0} +.h1{border-bottom:4px solid #ccc;font-size:24px;zoom:1} +.h2{border-bottom:3px solid #ccc;font-size:20px;zoom:1} +.h3{border-bottom:2px solid #ccc;font-size:16px;zoom:1} +.h4{border-bottom:1px solid #ccc;font-size:12px;zoom:1} +/* Portlet */ +.portlet{position:relative;border:1px solid #e9e9e9;margin:1em 0;background:#fff;zoom:1} +.portlet h2, .portlet h3{margin:0;padding:.5em 1em;font-size:14px;border:1px solid #fff;border-bottom:1px solid #e9e9e9;background:#f7f7f7} +.portlet p{margin:1em 1.2em} +.portlet li{position:relative;padding-right:8em} +.portlet .lined{margin:1px;padding:0;list-style:none} +.portlet .lined li{padding:.5em 1em;border-top:1px solid #eee} +.portlet .lined li:first-child{border:0} +.portlet .time{position:absolute;top:0;right:1em;color:#666} +.portlet .lined .time{top:.5em} +.portlet .more{position:absolute;top:.5em;right:1em;text-decoration:none !important} +.portlet .more span{color:#999} +/* Table */ +.table{margin:1em 0} +.table table{width:100%;border:0;border-collapse:collapse;border-top:2px solid #666} +.table caption{padding:8px 0;font-weight:bold;text-align:left} +.table caption em{float:right;font-style:normal;font-weight:normal;color:#f60} +.table th,.table td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd} +.table th{background:#f8f8f8} +.table thead th{border-bottom:1px solid #999} +.table tfoot td{font-weight:bold;background:#f8f8f8} +/* Form */ +.form{margin:1em 0;padding:0} +.form fieldset{margin:0 0 2em 0;padding:0;border:0} +.form em{font-style:normal;color:#f60} +.form label{margin:0 10px 0 0;line-height:1} +.form input[type=checkbox]+label,.form input[type=radio]+label,.form input[type=file]{cursor:pointer} +.form ul{position:relative;overflow:hidden;margin:0;padding:0;list-style:none;border-top:2px solid #999;border-bottom:1px solid #ccc;zoom:1} +.form li{border:1px solid #eee;border-left:0;border-right:0;margin:-1px 0;padding:8px 0;vertical-align:top;zoom:1} +.form li label:first-child{display:block;font-weight:bold} +.form li label em{font-weight:normal} +.form input[type=text],.form input[type=password],.form input[type=file],textarea{position:relative;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:transparent} +.form input[type=text],.form input[type=password],.form input[type=file]{height:22px;line-height:22px;vertical-align:top;padding:0 4px} +.form input[type=checkbox],.form input[type=radio]{margin:0;padding:0;width:13px;height:13px;vertical-align:middle} +.form textarea{padding:3px 4px} +.form span.desc{line-height:22px;vertical-align:middle;margin:0 10px} +.form p.desc{margin:.25em 0;line-height:1.4} +.form .question{font-weight:bold;margin:0 0 5px 0} +.form .answer{margin:0} +/* Lined Tab Navigation */ +.tab.line{padding:0 0 35px 0;margin:1em 0} +.tab.line ul{position:relative;margin:0;padding:0;list-style:none;border-bottom:1px solid #ccc;zoom:1} +.tab.line ul:after{content:"";display:block;clear:both} +.tab.line li{float:left;margin-bottom:-1px} +.tab.line li a{position:relative;float:left;text-decoration:none;border:1px solid #eee;border-bottom-color:#ccc;background:#fafafa;color:#333} +.tab.line li a span{display:inline-block;height:14px;padding:6px 25px 6px 25px;letter-spacing:-1px;cursor:pointer} +.tab.line li ul{width:100%;position:absolute;top:40px;left:0;list-style:none;border:0;margin:0;padding:0;white-space:nowrap;overflow:hidden;zoom:1} +.tab.line li ul:after{content:"";display:block;clear:both} +.tab.line li li{position:relative;left:-1px;padding:0 10px;border-left:1px solid #ddd;overflow:visible} +.tab.line li li a{padding:0;margin:0;border:0 !important;color:#666 !important;font-weight:normal;background:transparent;letter-spacing:normal} +.tab.line li.active a{border:1px solid #ccc;border-bottom:1px solid #fff;margin-top:-1px;background:transparent} +.tab.line li.active a span{padding-top:7px;font-weight:bold} +.tab.line li li a:hover, +.tab.line li li a:active, +.tab.line li li a:focus, +.tab.line li li.active a{font-weight:bold;letter-spacing:-1px;color:#333 !important} +.tab.line.jx{padding:0} +.tab.line.jx ul{border:0} +.tab.line.jx li{float:none} +.tab.line.jx li a{float:none;display:block;font-weight:bold;color:#333;border:1px solid #eee !important;border-bottom-color:#ccc !important;background:#fafafa !important} +.tab.line.jx li ul{position:static;display:block;padding:5px 0;left:0;top:0} +.tab.line.jx li li{display:inline} +.tab.line.jx li li a{display:inline;letter-spacing:normal;border:0 !important;font-weight:normal !important;color:#666 !important;background:none !important} +.tab.line.jx li li a:hover, +.tab.line.jx li li a:active, +.tab.line.jx li li a:focus{text-decoration:underline} +/* Faced Tab Navigation */ +.tab.face{padding:0 0 35px 0;margin:1em 0} +.tab.face ul{position:relative;margin:0;padding:0;_padding:2px 0 0 0;list-style:none;border-bottom:2px solid #315593;zoom:1} +.tab.face ul:after{content:"";display:block;clear:both} +.tab.face li{float:left;margin-right:1px;background:#4CB1E5} +.tab.face li a, +.tab.face li a span{position:relative;cursor:pointer} +.tab.face li a{float:left;text-decoration:none} +.tab.face li a span{display:inline-block;padding:6px 25px 6px 25px;color:#fff} +.tab.face li ul{width:100%;position:absolute;top:40px;left:0;list-style:none;border:0;margin:0;padding:0;white-space:nowrap;overflow:hidden;zoom:1} +.tab.face li ul:after{content:"";display:block;clear:both} +.tab.face li li{position:relative;left:-1px;padding:0 10px;border-left:1px solid #ddd;overflow:visible;background:transparent !important} +.tab.face li li a{padding:0;margin:0;font-weight:normal;color:#666} +.tab.face li.active{background-color:#315593;margin-top:-1px} +.tab.face li.active a span{padding-top:7px;padding-bottom:7px;font-weight:bold;letter-spacing:-1px} +.tab.face li li a:hover, +.tab.face li li a:active, +.tab.face li li a:focus, +.tab.face li li.active a{font-weight:bold;letter-spacing:-1px;color:#333} +.tab.face.jx{padding:0} +.tab.face.jx ul{border:0} +.tab.face.jx li{float:none} +.tab.face.jx li a{float:none;font-weight:bold} +.tab.face.jx li ul{display:block;position:static;padding:5px 0;left:0;top:0;background:#fff} +.tab.face.jx li li{display:inline} +.tab.face.jx li li a{font-weight:normal !important;color:#666;letter-spacing:normal} +.tab.face.jx li li a:hover, +.tab.face.jx li li a:active, +.tab.face.jx li li a:focus{text-decoration:underline} +/* Tab + List */ +.tab.list{height:160px;margin:1em 0} +.tab.list ul{position:relative;margin:0;padding:0;list-style:none;border-bottom:1px solid #ccc;zoom:1} +.tab.list ul:after{content:"";display:block;clear:both} +.tab.list li{float:left;margin-bottom:-1px} +.tab.list li a{position:relative;float:left;text-decoration:none;border:1px solid #eee;border-bottom-color:#ccc;background:#fafafa;color:#666} +.tab.list li a span{display:inline-block;padding:6px 25px 6px 25px;letter-spacing:-1px;cursor:pointer} +.tab.list li ul{width:100%;position:absolute;top:40px;left:0;list-style:none;border:0;margin:0;padding:0;zoom:1} +.tab.list li ul:after{content:"";display:block;clear:both} +.tab.list li li{float:none;position:relative;margin:0 0 8px 0;color:#999} +.tab.list li li a{float:none;padding:0;margin:0;border:0 !important;color:#666 !important;font-weight:normal;background:transparent;letter-spacing:normal} +.tab.list li li a:hover, +.tab.list li li a:active, +.tab.list li li a:focus{color:#000 !important;text-decoration:underline} +.tab.list li li time, +.tab.list li li .time{position:absolute;top:0;right:0;color:#767676} +.tab.list li li.more{position:absolute;top:-30px;right:0;border:0 !important;background:transparent} +.tab.list li.active a{border:1px solid #ccc;border-bottom:1px solid #fff;margin-top:-1px;background:transparent;color:#333} +.tab.list li.active a span{padding-top:7px;font-weight:bold} +.tab.list.jx{height:auto} +.tab.list.jx ul{border:0} +.tab.list.jx li{float:none;position:relative} +.tab.list.jx li a{float:none;display:block;font-weight:bold;color:#333;border:1px solid #eee !important;border-bottom-color:#ccc !important;background:#fafafa !important} +.tab.list.jx li ul{position:static;display:block;left:0;top:0;padding:5px 0} +.tab.list.jx li li a{display:inline;border:0 !important;background:none !important;font-weight:normal} +.tab.list.jx li li.more{top:7px;right:15px} +/* Vertical Navigation */ +.vNav{position:relative;margin:1em 0;line-height:normal;zoom:1} +.vNav ul{margin:0;padding:0;list-style:none} +.vNav li{position:relative;margin:0 0 -1px 0;vertical-align:top;zoom:1} +.vNav li a{display:block;position:relative;padding:8px 10px;text-decoration:none;color:#666;font-weight:bold;background:#fafafa;border:1px solid #eee;zoom:1} +.vNav li a .i{position:absolute;top:50%;left:100%;margin:-4px 0 0 -16px;width:8px;height:8px;color:#ccc;background:url(../img/iconNavVr.gif) no-repeat left top} +.vNav li ul{padding:5px 0;background:#fff} +.vNav li li{margin:0} +.vNav li li a{font-weight:normal;background:#fff;padding:5px 10px;border:0} +.vNav li li a span{color:#666} +.vNav li.active{border:1px solid #ccc;z-index:2} +.vNav li li.active{border:0} +.vNav li.active a{color:#000;border:0} +.vNav li.active .i{background-position:0 -44px} +.vNav li.active li a{border:0} +.vNav li.active ul{display:block;border-top:1px solid #eee} +.vNav li.active li.active a span{color:#13b200;font-weight:bold;letter-spacing:-1px} +/* Tree Navigation */ +.tNav{position:relative;margin:1em 0;zoom:1} +.tNav ul{list-style:none;margin:0;padding:0} +.tNav ul ul{margin:0 0 0 -3px} +.tNav li{position:relative;padding:0 0 0 22px;white-space:nowrap;line-height:20px;background:url(../img/lineTree.gif) no-repeat 9px 0;*zoom:1} +.tNav li.last{background-position:9px -1766px} +.tNav li.active a{font-weight:bold;color:#333} +.tNav li.active li a{font-weight:normal;color:#767676} +.tNav a{text-decoration:none;color:#767676} +.tNav a:hover, +.tNav a:active, +.tNav a:focus{text-decoration:underline} +.tNav .tNavToggle{position:absolute;top:0;left:0;width:19px;height:19px;padding:0;overflow:hidden;border:0;font-size:0;color:#fff;vertical-align:middle;text-indent:19px;*text-indent:0;background:transparent url(../img/btnPlusMinus.gif) no-repeat;cursor:pointer} +.tNav .tNavToggle.plus{background-position:5px -15px} +.tNav .tNavToggle.minus{background-position:5px 5px} +/* Pagination */ +.pagination{padding:15px 0;text-align:center;line-height:normal} +.pagination a, +.pagination strong{position:relative;display:inline-block;padding:2px 4px;font-weight:bold;text-decoration:none;line-height:normal;color:#333;vertical-align:middle} +.pagination a:hover, +.pagination a:active, +.pagination a:focus{border:1px solid #ddd;margin:0 -1px} +.pagination strong{color:#ff6600;font-size:20px} +.pagination .direction{font-weight:normal;white-space:nowrap} +.pagination .direction span{font-weight:bold;font-size:14px} +.pagination .direction:hover, +.pagination .direction:active, +.pagination .direction:focus{border:0;margin:0} +/* Button */ +.btn{position:relative;display:inline-block;margin:2px;vertical-align:top} +.btn *{display:inline-block;height:22px;line-height:22px;margin:0;font-weight:bold;font-size:14px;color:#fff;text-decoration:none;border:1px solid;cursor:pointer;overflow:visible;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;box-shadow:inset 0 0 1px #fff;-moz-box-shadow:inset 0 0 1px #fff;-webkit-box-shadow:inset 0 0 1px #fff;background-color:#666;text-shadow:0 -1px 0 #333;zoom:1} +.btn a, +.btn button{border-color:#ccc;color:#333;background:#eee -webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#ddd));background:#eee -moz-linear-gradient(top,#fff,#ddd);background-color:#eee;text-shadow:1px 1px 0 #fff;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#ffffff, endColorStr=#dddddd)} +.btn input{border-color:#666;background:#333 -webkit-gradient(linear,0% 0%,0% 100%,from(#777),to(#777),color-stop(0.5,#333),color-stop(0.5,#000));background:#333 -moz-linear-gradient(top,#777,#000);background-color:#333;color:#ffc;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#777777, endColorStr=#333333)} +.btn.small *{padding:0 8px;font-size:14px;height:24px;line-height:22px} +.btn.small a{height:22px} +.btn.medium *{padding:0 12px;font-size:18px;height:30px;line-height:28px} +.btn.medium a{height:28px} +.btn.large *{padding:0 18px;font-size:24px;height:36px;line-height:34px} +.btn.large a{height:34px} +/* FAQ */ +.faq{border-bottom:1px solid #ddd;margin:1em 0} +.faq .faqHeader{position:relative;zoom:1} +.faq .faqHeader .showAll{position:absolute;bottom:0;right:0;border:0;padding:0;overflow:visible;background:none;cursor:pointer} +.faq .faqBody{margin:0;padding:0} +.faq .faqBody .article{list-style:none} +.faq .q{margin:0;border-top:1px solid #ddd} +.faq .q a{display:block;padding:.5em 1em;text-align:left;font-weight:bold;background:#fafafa;color:#000;text-decoration:none !important} +.faq .q a:hover, .faq .q a:active, .faq .q a:focus{background:#f8f8f8} +.faq .a{margin:0;padding:1em;line-height:1.5} +/* Horizontal Bar Graph */ +.hGraph ul{margin:1em 50px 1em 50px;padding:1px 0 0 0;border:1px solid #ddd;border-top:0;border-right:0;list-style:none} +.hGraph li{position:relative;margin:10px 0;white-space:nowrap;vertical-align:top} +.hGraph .gTerm{position:absolute;width:40px;top:0;left:-50px;line-height:20px;text-align:right;font-weight:bold} +.hGraph .gBar{position:relative;display:inline-block;height:20px;border:1px solid #ccc;border-left:0;background:#e9e9e9} +.hGraph .gBar span{position:absolute;width:40px;line-height:20px;top:0;right:-50px} +/* Vertical Bar Graph */ +.vGraph{margin:1em 0;padding:20px 0} +.vGraph ul{margin:0;padding:0;height:200px;border:1px solid #ddd;border-top:0;border-right:0;list-style:none} +.vGraph ul:after{content:"";display:block;clear:both} +.vGraph li{float:left;display:inline;width:8%;height:100%;margin:0 3%;position:relative;text-align:center;white-space:nowrap} +.vGraph .gTerm{position:relative;display:inline-block;width:100%;height:20px;line-height:20px;margin:0 -100% -20px 0;padding:200px 0 0 0;vertical-align:bottom;font-weight:bold} +.vGraph .gBar{position:relative;display:inline-block;width:100%;margin:-1px 0 0 0;border:1px solid #ccc;border-bottom:0;background:#e9e9e9;vertical-align:bottom} +.vGraph .gBar span{position:absolute;width:100%;top:-20px;left:0} +/* Star Rating */ +.starRating, .starRating span{display:inline-block;height:14px;height:14px;background:transparent url(../img/iconStarRating.gif) no-repeat;overflow:hidden} +.starRating{width:79px;vertical-align:top} +.starRating span{font-size:0;line-height:0;vertical-align:top;text-indent:-100px;*text-indent:0;background-position:0 -14px} +/* Progress */ +.prgrs{white-space:nowrap;line-height:normal;vertical-align:middle} +.prgrs *{vertical-align:middle} +.prgrs .pBar{position:relative;display:inline-block;background:#e9e9e9;margin:0 5px 0 0} +.prgrs .pAction{display:inline-block;vertical-align:top;background:#99a6b6} +.prgrs .pNum{position:absolute;width:100%;left:0;top:0;text-align:center;text-shadow:1px 1px 0 #fff} +.prgrs.prgrsSmall{font-size:14px;line-height:14px} +.prgrs.prgrsSmall .pBar, +.prgrs.prgrsSmall .pAction, +.prgrs.prgrsSmall .pNum{height:16px;line-height:16px;font-size:11px} +.prgrs.prgrsMedium {font-size:24px;line-height:24px} +.prgrs.prgrsMedium .pBar, +.prgrs.prgrsMedium .pAction, +.prgrs.prgrsMedium .pNum{height:22px;line-height:22px;font-size:12px} +.prgrs.prgrsLarge{font-size:38px;line-height:38px} +.prgrs.prgrsLarge .pBar, +.prgrs.prgrsLarge .pAction, +.prgrs.prgrsLarge .pNum{height:34px;line-height:34px;font-size:14px} +/* Modal Window */ +.modal .bg{position:absolute;background:#000;_background:none;width:100%;height:100%;opacity:.5;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1} +.modal .fg{position:relative;width:50%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:10px solid #ddd;z-index:2;zoom:1} +.modalActive{position:fixed;_position:absolute;top:0;left:0;width:100%;height:100%} +.modalClose{position:absolute;right:-10px;top:-10px;border:0;background:#ddd;padding:0;width:34px;height:34px;font-size:16px;font-weight:bold;cursor:pointer;color:#999} +.modalBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden} +/* Layout */ +#xeAdmin .header{position:relative;padding:10px 15px 10px 30px;background:#1f2e3c;border-bottom:3px solid #ccc;z-index:10} +#xeAdmin .header:after{content:"";display:block;clear:both} +#xeAdmin .footer{height:26px;padding-top:10px;background:#f4f4f4;border-top:1px solid #ddd;text-align:center} +#xeAdmin .gnb{position:relative;float:right;white-space:nowrap;clear:right;margin:0;padding:0} +#xeAdmin .gnb li{position:relative;float:left;margin:0 15px 0 0;padding:0;list-style:none} +#xeAdmin .gnb #adminLang {position:absolute;top:18px;right:0;display:none;background:#fff;margin:0;padding:5px;border:1px solid #ddd;z-index:999} +#xeAdmin .gnb #adminLang li{float:none;margin:0} +.body{position:relative;margin:0;padding:0 0 0 200px;background:url(../img/lineBody.gif) repeat-y 180px 0;zoom:1;clear:both} +.body:after {content:"";display:block;clear:both} +.c .body {padding:20px;background:none;} +.ece .body {padding-right:340px} +.ec .body {padding-right:20px} +.extension{position:relative} +.body .e1 {float:left;width:180px;margin-right:-180px;left:-200px} +.content {position:relative;width:100%;margin-right:-100%;float:left;padding:0} +.ec .content {padding-top:10px;} +.c .e1, .c .e2 {display:none;} +.ece .e2 {width:300px;float:right;right:-320px;border-left:1px solid #ddd;padding-bottom:20px} +.ec .e2 {display:none} +#xeAdmin .lnb {position:relative;left:-3px;float:left;clear:left;margin:5px 0 0 0;padding:0} +#xeAdmin .lnb:after{content:"";display:block;clear:both} +#xeAdmin .lnb li, +#xeAdmin .lnb li a{position:relative;float:left;background:url(../img/buttonLNB.gif) no-repeat;white-space:nowrap} +#xeAdmin .lnb li{margin:0 1px 0 0;padding:0;list-style:none;background-position:0 0} +#xeAdmin .lnb li a{left:1px;height:30px;padding:10px 15px 0 15px;text-decoration:none !important;background-position:right 0} +#xeAdmin .lnb li.core{margin-right:6px;background-position:0 -50px} +#xeAdmin .lnb li.core a{padding-right:20px;left:5px;background-position:right -50px} +#xeAdmin .lnb li.first{background-position:0 -50px;margin-right:5px} +#xeAdmin .lnb li.first a{left:5px} +#xeAdmin .lnb li.end{} +#xeAdmin .lnb li.end a{padding-right:20px;background-position:right -50px} +#xeAdmin .lnb li.core.selected {background-position:0 -150px} +#xeAdmin .lnb li.core.selected a{background-position:right -150px} +#xeAdmin .lnb li.first.selected {background-position:0 -150px} +#xeAdmin .lnb li.first.selected a{background-position:right -100px} +#xeAdmin .lnb li.mid.selected {background-position:0 -100px} +#xeAdmin .lnb li.mid.selected a{background-position:right -100px} +#xeAdmin .lnb li.end.selected {background-position:0 -100px} +#xeAdmin .lnb li.end.selected a{background-position:right -150px} +#xeAdmin .path{padding:0 0 0 25px;margin:0 0 20px 0;background:url(../img/iconPath.gif) no-repeat left center} +/* Font */ +#xeAdmin{font-family:Sans-serif} +#xeAdmin a{text-decoration:none !important} +#xeAdmin a:hover, +#xeAdmin a:active, +#xeAdmin a:focus{text-decoration:underline !important} +#xeAdmin h1.xeAdmin a{text-decoration:none !important;font-family:Arial;font-size:16px;color:#fff;margin:0;padding:0} +#xeAdmin table th{color:#666} +#xeAdmin table th a {color:#666} +#xeAdmin table td{color:#767676} +#xeAdmin table td a {color:#767676} +#xeAdmin caption{font-size:11px;font-family:Tahoma;color:#767676} +#xeAdmin div.summary {font-size:11px;font-family:Tahoma;color:#767676} +#xeAdmin div.summary strong {font-weight:normal;} +#xeAdmin button.text{font-size:12px} +#xeAdmin em, +#xeAdmin address{font-style:normal} +#xeAdmin select{font-size:12px} +#xeAdmin input{font-size:12px} +#xeAdmin .buttonTypeGo{padding:0;cursor:pointer} +#xeAdmin .footer address{font:10px Tahoma} +#xeAdmin .footer address a{color:#777e86;} +#xeAdmin .gnb li a {color:#777e86;font-size:11px;font-family:Tahoma} +#adminLang li a{font-size:12px} +#xeAdmin .lnb li, +#xeAdmin .lnb li a{color:#fff;font-size:14px;font-family:Dotum, Tahoma} +#xeAdmin .path{color:#ccc;font-size:11px} +#xeAdmin .path a{color:#767676;font-size:11px;font-family:Dotum, Sans-serif} +.e1 .navigation li a{color:#000;text-decoration:none} +.e1 .navigation li ul li a{color:#767676} +.e1 .navigation li ul li.active a{font-weight:bold;color:#666} +.e2 .section h2.xeAdmin {font-size:12px;margin:0;padding:0} +.e2 .section h2.xeAdmin .date{font:Tahoma;color:#999} +.e2 table tbody th{font-weight:normal;font-family:Dotum} +.e2 .notice li a{color:#666;} +.e2 .notice li .date{color:#767676;font:10px Tahoma} +.localNavigation li a{text-decoration:none !important;color:#666} +.localNavigation li.active a{font-weight:bold;color:#1e6aac} +#xeAdmin h2.xeAdmin {font-size:12px} +#xeAdmin h3.xeAdmin {font-size:12px;color:#666;margin:0;padding:0} +#xeAdmin p.summary{color:#767676} +#xeAdmin p.summary a {text-decoration:none;color:#767676;} +#xeAdmin p.summary.red {color:#A54D4D;} +#xeAdmin p.summary.red a {text-decoration:none;color:#A54D4D;} +#xeAdmin div.infoText {color:#767676} +#xeAdmin div.infoText p.warning{margin:0 0 10px 0;padding:0 0 0 25px;background:url(../img/iconWarning.gif) no-repeat left top} +#xeAdmin div.infoText p.update{margin:0 0 10px 0;padding:0 0 0 25px;background:url(../img/iconRefresh.gif) no-repeat left top} +/* Pagination */ +#xeAdmin .pagination{padding:15px 0;margin:0;text-align:center;clear:both;} +#xeAdmin .pagination *{margin:0;padding:0} +#xeAdmin .pagination img{border:0} +#xeAdmin .pagination a, +#xeAdmin .pagination strong{position:relative;display:inline-block;text-decoration:none;line-height:normal;color:#333;font-family:Tahoma, Sans-serif;vertical-align:middle} +#xeAdmin .pagination a:hover, +#xeAdmin .pagination a:active, +#xeAdmin .pagination a:focus{background-color:#f4f4f4 !important;} +#xeAdmin .pagination strong{color:#ff6600 !important} +#xeAdmin .pagination a.prev, +#xeAdmin .pagination a.prevEnd, +#xeAdmin .pagination a.next, +#xeAdmin .pagination a.nextEnd{font-weight:normal !important;border:none !important;margin:0 !important;white-space:nowrap;} +#xeAdmin .pagination.a1 a, +#xeAdmin .pagination.a1 strong{margin:0 -4px;padding:1px 10px 1px 8px;border:none;border-left:1px solid #ccc;border-right:1px solid #ddd;font-weight:bold;font-size:12px;background:#fff} +#xeAdmin .pagination.a1 a.prev{padding-left:10px;background:#fff url(../img/arrowPrevA1.gif) no-repeat left center;} +#xeAdmin .pagination.a1 a.prevEnd{padding-left:15px;background:#fff url(../img/arrowPrevEndA1.gif) no-repeat left center;} +#xeAdmin .pagination.a1 a.next{padding-right:10px;background:#fff url(../img/arrowNextA1.gif) no-repeat right center;} +#xeAdmin .pagination.a1 a.nextEnd{padding-right:15px;background:#fff url(../img/arrowNextEndA1.gif) no-repeat right center;} +#xeAdmin .pagination.a2 a, +#xeAdmin .pagination.a2 strong{margin:0 -4px;padding:0 10px 0 8px;font-weight:bold;font-size:11px;border:none;border-left:1px solid #ddd;border-right:1px solid #ccc;background:#fff;} +#xeAdmin .pagination.a2 a.prev{padding-left:10px;background:#fff url(../img/arrowPrevA1.gif) no-repeat left center;} +#xeAdmin .pagination.a2 a.prevEnd{padding-left:15px;background:#fff url(../img/arrowPrevEndA1.gif) no-repeat left center;} +#xeAdmin .pagination.a2 a.next{padding-right:10px;background:#fff url(../img/arrowNextA1.gif) no-repeat right center;} +#xeAdmin .pagination.a2 a.nextEnd{padding-right:15px;background:#fff url(../img/arrowNextEndA1.gif) no-repeat right center;} +#xeAdmin .pagination.b1 a, +#xeAdmin .pagination.b1 strong{margin:0 -2px;padding:2px 8px;font-weight:bold;font-size:12px} +#xeAdmin .pagination.b1 a.prev, +#xeAdmin .pagination.b1 a.prevEnd{padding-left:16px;background:url(../img/arrowPrevB1.gif) no-repeat left center;} +#xeAdmin .pagination.b1 a.next, +#xeAdmin .pagination.b1 a.nextEnd{padding-right:16px;background:url(../img/arrowNextB1.gif) no-repeat right center;} +#xeAdmin .pagination.b2 a, +#xeAdmin .pagination.b2 strong{margin:0 -2px;padding:2px 6px;font-size:11px} +#xeAdmin .pagination.b2 a.prev, +#xeAdmin .pagination.b2 a.prevEnd{padding-left:12px;background:url(../img/arrowPrevB1.gif) no-repeat left center;} +#xeAdmin .pagination.b2 a.next, +#xeAdmin .pagination.b2 a.nextEnd{padding-right:12px;background:url(../img/arrowNextB1.gif) no-repeat right center;} +#xeAdmin .pagination.c1 a, +#xeAdmin .pagination.c1 strong{margin:0 -2px;padding:2px 4px;font-size:12px} +#xeAdmin .pagination.c1 a.prev, +#xeAdmin .pagination.c1 a.prevEnd, +#xeAdmin .pagination.c1 a.next, +#xeAdmin .pagination.c1 a.nextEnd{display:inline-block;width:13px;height:14px;padding:3px 4px;margin:0} +#xeAdmin .pagination.c1 a.prev, +#xeAdmin .pagination.c1 a.prevEnd{background:url(../img/arrowPrevC1.gif) no-repeat center} +#xeAdmin .pagination.c1 a.next, +#xeAdmin .pagination.c1 a.nextEnd{background:url(../img/arrowNextC1.gif) no-repeat center} +#xeAdmin .pagination.c1 a.prev span, +#xeAdmin .pagination.c1 a.prevEnd span, +#xeAdmin .pagination.c1 a.next span, +#xeAdmin .pagination.c1 a.nextEnd span{position:absolute;width:0;height:0;overflow:hidden;visibility:hidden} +#xeAdmin .pagination.c2 a, +#xeAdmin .pagination.c2 strong{margin:0 -2px;padding:2px 4px;font-size:11px} +#xeAdmin .pagination.c2 a.prev, +#xeAdmin .pagination.c2 a.prevEnd, +#xeAdmin .pagination.c2 a.next, +#xeAdmin .pagination.c2 a.nextEnd{display:inline-block;width:13px;height:14px;padding:3px 4px;margin:0} +#xeAdmin .pagination.c2 a.prev, +#xeAdmin .pagination.c2 a.prevEnd{background:url(../img/arrowPrevC1.gif) no-repeat center} +#xeAdmin .pagination.c2 a.next, +#xeAdmin .pagination.c2 a.nextEnd{background:url(../img/arrowNextC1.gif) no-repeat center} +#xeAdmin .pagination.c2 a.prev span, +#xeAdmin .pagination.c2 a.prevEnd span, +#xeAdmin .pagination.c2 a.next span, +#xeAdmin .pagination.c2 a.nextEnd span{position:absolute;width:0;height:0;overflow:hidden;visibility:hidden} +/* Content */ +#xeAdmin .open{display:block !important} +#xeAdmin h1.xeAdmin {float:left;white-space:nowrap;margin:0;padding:0} +#xeAdmin caption{text-align:left} +#xeAdmin button{cursor:pointer} +#xeAdmin hr{display:none} +#xeAdmin fieldset{border:0} +#xeAdmin fieldset legend{font-size:0;line-height:0;position:absolute;visibility:hidden} +#xeAdmin .section{margin:0 0 1em 0} +#xeAdmin .buttonArea{text-align:center;padding:15px 0} +#xeAdmin button.text{background:none;border:0;color:#0000ee} +#xeAdmin img.graphHr{height:5px;vertical-align:middle} +#xeAdmin .ac{text-align:center} +#xeAdmin .al{text-align:left} +#xeAdmin .ar{text-align:right} +.crossTable{width:100%;border:0;margin:0 0 20px 0;padding:0} +.crossTable th div {white-space:nowrap;} .crossTable th, -.crossTable td{ border:0; padding:5px 10px; vertical-align:top;} -.crossTable th{ background:#f4f4f4;} -.crossTable thead th{ border-top:2px solid #cfcfcf; border-bottom:1px solid #e5e5e5; background-image:url(../img/lineVrText.gif); background-repeat:no-repeat; background-position:left center;} -.crossTable thead th:first-child{ background-image:none;} -.crossTable tbody th{ border-bottom:1px solid #e5e5e5; text-align:left;} -.crossTable td{ border-bottom:1px solid #f0f0f0;} - -.colTable{ width:100%; border:0; margin:0 0 20px 0; padding:0;} -.colTable th div { white-space:nowrap; } -.colTable tr.bg0{ background:#fff;} -.colTable tr.bg1{ background:#f8f8f8;} +.crossTable td{border:0;padding:5px 10px;vertical-align:top} +.crossTable th{background:#f4f4f4} +.crossTable thead th{border-top:2px solid #cfcfcf;border-bottom:1px solid #e5e5e5;background-image:url(../img/lineVrText.gif);background-repeat:no-repeat;background-position:left center} +.crossTable thead th:first-child{background-image:none} +.crossTable tbody th{border-bottom:1px solid #e5e5e5;text-align:left} +.crossTable td{border-bottom:1px solid #f0f0f0} +.colTable{width:100%;border:0;margin:0 0 20px 0;padding:0} +.colTable th div {white-space:nowrap;} +.colTable tr.bg0{background:#fff} +.colTable tr.bg1{background:#f8f8f8} .colTable th, -.colTable td{ border:0; padding:5px 10px; vertical-align:top;} -.colTable th{ border-top:2px solid #cfcfcf; border-bottom:1px solid #e5e5e5; background:#f4f4f4; background-image:url(../img/lineVrText.gif); background-repeat:no-repeat; background-position:left center;} -.colTable th:first-child{ background-image:none;} -.colTable td{ border-bottom:1px solid #f0f0f0;} - -.rowTable{ width:100%; border:0; border-top:2px solid #cfcfcf; margin:0 0 20px 0; padding:0;} -.rowTable th div { white-space:nowrap; } -.rowTable tr.bg0{ background:#fff;} -.rowTable tr.bg1{ background:#f8f8f8;} +.colTable td{border:0;padding:5px 10px;vertical-align:top} +.colTable th{border-top:2px solid #cfcfcf;border-bottom:1px solid #e5e5e5;background:#f4f4f4;background-image:url(../img/lineVrText.gif);background-repeat:no-repeat;background-position:left center} +.colTable th:first-child{background-image:none} +.colTable td{border-bottom:1px solid #f0f0f0} +.rowTable{width:100%;border:0;border-top:2px solid #cfcfcf;margin:0 0 20px 0;padding:0} +.rowTable th div {white-space:nowrap;} +.rowTable tr.bg0{background:#fff} +.rowTable tr.bg1{background:#f8f8f8} .rowTable th, -.rowTable td{ border:0; padding:5px 10px; text-align:left; vertical-align:top;} -.rowTable th{ background:#f4f4f4;} -.rowTable tbody th{ border-bottom:1px solid #e5e5e5;} -.rowTable td{ border-bottom:1px solid #f0f0f0;} - -.rowTable th.button, .colTable th.button, .crossTable th.button { text-align:right; } -.rowTable td.alert, .colTable td.alert, .crossTable td.alert { color:red !important; } -.rowTable td.alert a, .colTable td.alert a, .crossTable td.alert a { text-decoration:none; color:red !important; } - -.colTable td.wide, .rowTable td.wide, .crossTable td.wide { width:100%;} - -.e1 .navigation { list-style:none; position:relative; *zoom:1; margin:0; padding:0; border-bottom:1px solid #c2c2c2;} -.e1 .navigation ul { list-style:none; position:relative; *zoom:1; margin:0; padding:0;} -.e1 .navigation li { list-style:none; position:relative; *zoom:1; margin:0; padding:0; background-color:#f7f7f7; } -.e1 .navigation li a.parent { border-top:1px solid #c2c2c2; display:block; padding:10px 20px 10px 35px ;background-image:url(../img/iconNavigation.gif); background-repeat:no-repeat; background-position:160px -35px; font-weight:bold; color:#888; text-decoration:none;} -.e1 .navigation li.close a.parent { background-position:160px 13px; border-bottom:none; } - -#module_service { background-image:url(../img/mIcon.gif); background-repeat:no-repeat; background-position:10px 10px;} -#module_member { background-image:url(../img/mIcon.gif); background-repeat:no-repeat; background-position:10px -40px;} -#module_content { background-image:url(../img/mIcon.gif); background-repeat:no-repeat; background-position:10px -90px;} -#module_construction { background-image:url(../img/mIcon.gif); background-repeat:no-repeat; background-position:10px -140px;} -#module_utility { background-image:url(../img/mIcon.gif); background-repeat:no-repeat; background-position:10px -190px;} -#module_accessory { background-image:url(../img/mIcon.gif); background-repeat:no-repeat; background-position:10px -240px;} -#module_system { background-image:url(../img/mIcon.gif); background-repeat:no-repeat; background-position:10px -290px;} - -.e1 .navigation li ul{ border-top:1px solid #d2d2d2; margin:0; padding:5px 0; background-color:#fff;} -.e1 .navigation li ul li { margin:5px 0; padding:0 10px 0 35px; background-color:#fff;} -.e1 .navigation li.close ul{ display:none;} -.e1 .navigation li ul li a { text-decoration:none; } -.e1 .navigation li ul li a:hover { font-weight:bold; text-decoration:none; letter-spacing:-1px;} -.e1 .navigation li ul li.active a { color:#ea3f22; letter-spacing:-1px;} - -.e2 .section{ margin-left:20px;} -.e2 .section h4.xeAdmin { margin:10px 0 0 0; padding:0 0 0 25px; } -.e2 .section .date{ background:url(../img/lineVrText.gif) no-repeat left center; font-size:9px; padding-left:5px;} -.e2 .section .contentBox { padding:10px 0; margin:0 0 20px 0; border-bottom:1px solid #ccc;} - -.e2 table tbody td{ text-align:left; word-break:break-all; -ms-word-break:break-all; } - -#xeAdmin .localNavigation { position:relative; border-bottom:1px solid #ccc; *zoom:1; margin:0 0 40px 0; padding:0; font-size:12px;} -#xeAdmin .localNavigation:after {content:""; display:block; clear:both;} -#xeAdmin .localNavigation ul{ display:none; position:absolute; top:40px; left:0; list-style:none; margin:0; padding:0; overflow:hidden;} -#xeAdmin .localNavigation li{ list-style:none; float:left; margin:0 -1px 0 0; padding:0;background:#fff;} -#xeAdmin .localNavigation li a{ float:left; padding:7px 15px 0 15px; height:18px; border:1px solid #ddd; border-bottom:none; background:url(../img/bgTab.gif) repeat-x; text-decoration:none !important; color:#666} -#xeAdmin .localNavigation li.on { margin-bottom:-1px;} -#xeAdmin .localNavigation li.on ul{ display:block;} -#xeAdmin .localNavigation li.on a{ height:19px; background:none; font-weight:bold;} -#xeAdmin .localNavigation li li{ position:relative; left:-1px; display:inline; float:none; margin:0; padding:0 6px 0 10px; border-left:1px solid #ddd;} -#xeAdmin .localNavigation li li a{ font-weight:normal !important; float:none; padding:0; height:auto; border:0; background:none;} -#xeAdmin .localNavigation li li.on a{ font-weight:bold !important;} - -#xeAdmin h3.xeAdmin {border-bottom:2px solid #ccc; padding:5px 0 5px 25px; margin:0 0 10px 0; background:url(../img/iconH2.gif) no-repeat left center;} -#xeAdmin h4.xeAdmin {padding:5px 0 5px 20px; background:url(../img/iconH3.gif) no-repeat left center;} -#xeAdmin h4.xeAdmin span.vr { font-size:11px; color:#AAA; } -#xeAdmin h4.xeAdmin a.view { font-size:11px; font-family:vertical; color:#777e86; } -#xeAdmin p.summary, div.infoText { margin:0 0 15px 0; line-height:1.6;} - -.layer { display:none; position:absolute; border:2px solid #777; margin:0; font-size:12px; background:#fff;} -.layer * { margin:0; padding:0; font-size:12px; } -.layer h4.xeAdmin { font-size:14px !important; font-family:Dotum; background:#f4f4f4 !important; padding:8px 30px 8px 15px !important; letter-spacing:-1px !important; } -.layer .xButton { position:absolute; top:9px; right:9px; width:15px; height:14px; background-color:transparent; background:url(../img/buttonClose.gif) no-repeat; border:0; cursor:pointer; overflow:hidden; } -.layer .xButton span { position:relative; z-index:-1; visibility:hidden; } -.layer .layerBody{ margin:15px;} - -.boxModelControler select { margin-bottom:3px; } -.boxModelControler .inputText { border:1px solid #ccc; padding:2px 3px; margin-bottom:3px; vertical-align:top; *margin-top:-1px; } -.boxModelControler .inputCheck { width:13px; height:13px; vertical-align:middle; } -.boxModelControler .layerBody { margin:15px; } -.boxModelControler .preview{ overflow:hidden; margin-bottom:20px;} -.boxModelControler .dragAble { position:relative; padding:15px 0 0 15px; background:url(../img/bgRuler.gif) no-repeat; *zoom:1; cursor:move;} -.boxModelControler .dragAble .prevGrid { position:relative; margin:-1px; background:url(../img/bgGrid.gif) 0 0; border:1px solid #000; *zoom:1;} -.boxModelControler .dragAble .prevBox { position:relative; } -.boxModelControler .dragAble .prevBox .prevContent { position:relative; } -.boxModelControler .boxModelTable { width:100%; border:0; border-bottom:1px solid #ddd; margin:0; padding:0;} +.rowTable td{border:0;padding:5px 10px;text-align:left;vertical-align:top} +.rowTable th{background:#f4f4f4} +.rowTable tbody th{border-bottom:1px solid #e5e5e5} +.rowTable td{border-bottom:1px solid #f0f0f0} +.rowTable th.button, .colTable th.button, .crossTable th.button {text-align:right;} +.rowTable td.alert, .colTable td.alert, .crossTable td.alert {color:red !important;} +.rowTable td.alert a, .colTable td.alert a, .crossTable td.alert a {text-decoration:none;color:red !important;} +.colTable td.wide, .rowTable td.wide, .crossTable td.wide {width:100%} +.e1 .navigation {list-style:none;position:relative;*zoom:1;margin:0;padding:0;border-bottom:1px solid #c2c2c2} +.e1 .navigation ul {list-style:none;position:relative;*zoom:1;margin:0;padding:0} +.e1 .navigation li {list-style:none;position:relative;*zoom:1;margin:0;padding:0;background-color:#f7f7f7;} +.e1 .navigation li a.parent {border-top:1px solid #c2c2c2;display:block;padding:10px 20px 10px 35px ;background-image:url(../img/iconNavigation.gif);background-repeat:no-repeat;background-position:160px -35px;font-weight:bold;color:#888;text-decoration:none} +.e1 .navigation li.close a.parent {background-position:160px 13px;border-bottom:none;} +#module_service {background-image:url(../img/mIcon.gif);background-repeat:no-repeat;background-position:10px 10px} +#module_member {background-image:url(../img/mIcon.gif);background-repeat:no-repeat;background-position:10px -40px} +#module_content {background-image:url(../img/mIcon.gif);background-repeat:no-repeat;background-position:10px -90px} +#module_construction {background-image:url(../img/mIcon.gif);background-repeat:no-repeat;background-position:10px -140px} +#module_utility {background-image:url(../img/mIcon.gif);background-repeat:no-repeat;background-position:10px -190px} +#module_accessory {background-image:url(../img/mIcon.gif);background-repeat:no-repeat;background-position:10px -240px} +#module_system {background-image:url(../img/mIcon.gif);background-repeat:no-repeat;background-position:10px -290px} +.e1 .navigation li ul{border-top:1px solid #d2d2d2;margin:0;padding:5px 0;background-color:#fff} +.e1 .navigation li ul li {margin:5px 0;padding:0 10px 0 35px;background-color:#fff} +.e1 .navigation li.close ul{display:none} +.e1 .navigation li ul li a {text-decoration:none;} +.e1 .navigation li ul li a:hover {font-weight:bold;text-decoration:none;letter-spacing:-1px} +.e1 .navigation li ul li.active a {color:#ea3f22;letter-spacing:-1px} +.e2 .section{margin-left:20px} +.e2 .section h4.xeAdmin {margin:10px 0 0 0;padding:0 0 0 25px;} +.e2 .section .date{background:url(../img/lineVrText.gif) no-repeat left center;font-size:9px;padding-left:5px} +.e2 .section .contentBox {padding:10px 0;margin:0 0 20px 0;border-bottom:1px solid #ccc} +.e2 table tbody td{text-align:left;word-break:break-all;-ms-word-break:break-all;} +#xeAdmin .localNavigation {position:relative;border-bottom:1px solid #ccc;*zoom:1;margin:0 0 40px 0;padding:0;font-size:12px} +#xeAdmin .localNavigation:after {content:"";display:block;clear:both} +#xeAdmin .localNavigation ul{display:none;position:absolute;top:40px;left:0;list-style:none;margin:0;padding:0;overflow:hidden} +#xeAdmin .localNavigation li{list-style:none;float:left;margin:0 -1px 0 0;padding:0;background:#fff} +#xeAdmin .localNavigation li a{float:left;padding:7px 15px 0 15px;height:18px;border:1px solid #ddd;border-bottom:none;background:url(../img/bgTab.gif) repeat-x;text-decoration:none !important;color:#666} +#xeAdmin .localNavigation li.on {margin-bottom:-1px} +#xeAdmin .localNavigation li.on ul{display:block} +#xeAdmin .localNavigation li.on a{height:19px;background:none;font-weight:bold} +#xeAdmin .localNavigation li li{position:relative;left:-1px;display:inline;float:none;margin:0;padding:0 6px 0 10px;border-left:1px solid #ddd} +#xeAdmin .localNavigation li li a{font-weight:normal !important;float:none;padding:0;height:auto;border:0;background:none} +#xeAdmin .localNavigation li li.on a{font-weight:bold !important} +#xeAdmin h3.xeAdmin {border-bottom:2px solid #ccc;padding:5px 0 5px 25px;margin:0 0 10px 0;background:url(../img/iconH2.gif) no-repeat left center} +#xeAdmin h4.xeAdmin {padding:5px 0 5px 20px;background:url(../img/iconH3.gif) no-repeat left center} +#xeAdmin h4.xeAdmin span.vr {font-size:11px;color:#AAA;} +#xeAdmin h4.xeAdmin a.view {font-size:11px;font-family:vertical;color:#777e86;} +#xeAdmin p.summary, div.infoText {margin:0 0 15px 0;line-height:1.6} +.layer {display:none;position:absolute;border:2px solid #777;margin:0;font-size:12px;background:#fff} +.layer * {margin:0;padding:0;font-size:12px;} +.layer h4.xeAdmin {font-size:14px !important;font-family:Dotum;background:#f4f4f4 !important;padding:8px 30px 8px 15px !important;letter-spacing:-1px !important;} +.layer .xButton {position:absolute;top:9px;right:9px;width:15px;height:14px;background-color:transparent;background:url(../img/buttonClose.gif) no-repeat;border:0;cursor:pointer;overflow:hidden;} +.layer .xButton span {position:relative;z-index:-1;visibility:hidden;} +.layer .layerBody{margin:15px} +.boxModelControler select {margin-bottom:3px;} +.boxModelControler .inputText {border:1px solid #ccc;padding:2px 3px;margin-bottom:3px;vertical-align:top;*margin-top:-1px;} +.boxModelControler .inputCheck {width:13px;height:13px;vertical-align:middle;} +.boxModelControler .layerBody {margin:15px;} +.boxModelControler .preview{overflow:hidden;margin-bottom:20px} +.boxModelControler .dragAble {position:relative;padding:15px 0 0 15px;background:url(../img/bgRuler.gif) no-repeat;*zoom:1;cursor:move} +.boxModelControler .dragAble .prevGrid {position:relative;margin:-1px;background:url(../img/bgGrid.gif) 0 0;border:1px solid #000;*zoom:1} +.boxModelControler .dragAble .prevBox {position:relative;} +.boxModelControler .dragAble .prevBox .prevContent {position:relative;} +.boxModelControler .boxModelTable {width:100%;border:0;border-bottom:1px solid #ddd;margin:0;padding:0} .boxModelControler .boxModelTable th, -.boxModelControler .boxModelTable td { border:0; border-top:1px solid #ddd; vertical-align:top; padding:5px 10px; text-align:left; } -.boxModelControler .boxModelTable th { height:50px; *height:40px; background:#f1f1f1; padding-left:70px; background-repeat:no-repeat; background-position:10px 10px; } -.boxModelControler .boxModelTable th.width { background-image:url(../img/exWidth.gif); } -.boxModelControler .boxModelTable th.margin { background-image:url(../img/exMargin.gif); } -.boxModelControler .boxModelTable th.padding { background-image:url(../img/exPadding.gif); } -.boxModelControler .boxModelTable th.border { background-image:url(../img/exBorder.gif); } -.boxModelControler .boxModelTable th.bgColor { background-image:url(../img/exBgColor.gif); } -.boxModelControler .boxModelTable th.bgImage { background-image:url(../img/exBgImage.gif); } -.boxModelControler .boxModelTable th sup { font-weight:normal; font-size:11px; font-family:Dotum; color:#999; } -.boxModelControler .boxModelTable td dl.iList dt { display:inline; position:relative; top:3px; } -.boxModelControler .boxModelTable td dl.iList dd { display:inline; } -.boxModelControler .boxModelTable td dl.dList dt { float:left; clear:left; margin-right:5px; padding-top:3px; } -.boxModelControler .boxModelTable td dl.dList dd { clear:right; } -.boxModelControler .colorPicker { position:relative; display:inline; vertical-align:top; } -.boxModelControler .colorPicker .picker { position:relative; top:2px; left:-22px; width:16px; height:16px; border:1px solid #ccc; background-color:transparent; background-position:right top; cursor:pointer; vertical-align:top; } -.boxModelControler .colorPicker .picker span { font-size:0; line-height:0; z-index:-1; visibility:hidden; } -.boxModelControler .colorPicker .palette { position:absolute; top:0px; left:0; display:none; width:272px; height:64px; list-style:none; margin:0; padding:1px 0 0 1px; border:1px solid #ccc; background:#fff; overflow:hidden; } -.boxModelControler .colorPicker .palette.open { display:block; } -.boxModelControler .colorPicker .palette li { float:left; margin:0 1px 1px 0; font-size:0; line-height:0; } -.boxModelControler .colorPicker .palette li button { width:15px; height:15px; border:0; cursor:pointer; } -.boxModelControler .colorPicker .palette li button span { position:relative; z-index:-1; font-size:0; line-height:0; visibility:hidden; } -.boxModelControler .colorPicker .palette li button.transparent { background:url(../img/bgNone.gif) no-repeat right top; border:1px solid #ddd; } -.boxModelControler .borderDetach { display:none; } -.boxModelControler .borderDetach.open { display:block; } -.boxModelControler .buttonArea{ padding:15px 0 0 0; text-align:center;} - -#popup_content { border:2px solid #777; margin:0; font-size:12px; background:#fff; position:relative;} -#popup_content .xButton { position:absolute; top:9px; right:18px; width:15px; height:14px; padding:0; background-color:transparent; background:url(../img/buttonClose.gif) no-repeat; border:0; cursor:pointer; overflow:hidden; } -#popup_content .xButton span { position:relative; z-index:-1; visibility:hidden; } -#popup_content * { font-size:12px; } -#popHeadder h4.xeAdmin, #popHeadder h1.xeAdmin, #popHeadder h3.xeAdmin { font-size:14px !important; font-family:Dotum !important; background:#f4f4f4 !important; padding:8px 30px 8px 15px !important; letter-spacing:-1px !important; border:none !important; margin:0 !important;} -#popHeader h4.xeAdmin, #popHeader h1.xeAdmin, #popHeader h3.xeAdmin { font-size:14px !important; font-family:Dotum !important; background:#f4f4f4 !important; padding:8px 30px 8px 15px !important; letter-spacing:-1px !important; border:none !important; margin:0 !important;} -#popHeader, #popBody, #popFooter { position:relative; *zoom:1; overflow:hidden;} -#popBody, #popHistoryBody { margin:15px !important;} -#popFooter { padding:10px 0 0 0; height:28px; text-align:center; background:#f4f4f4;} -#popHeader { } -#popHeader.wide { width:600px;} - -.adminTable { width:100%; border:1px solid #EEE; border-bottom:none; border-right:none; margin-bottom:15px; } -.adminTable caption { background:url("../img/n_caption_head.gif") no-repeat left top; padding:8px 0 5px 30px; text-align:left; font-weight:bold !important; color:#FFFFFF !important; background-color:#888 !important; border-bottom:1px solid #FFFFFF; font-size:12px !important;} -.adminTable thead tr th div { text-align:center;} -.adminTable thead tr th { background-color:#AAA; color:#FFFFFF !important; } -.adminTable tr th { background-color:#FFFFFF; padding:6px; font-weight:bold; text-align:left; color:#666; border-right:1px solid #EEE; border-bottom:1px solid #EEE; } -.adminTable tr.row2 th { background-color:#F3F3F3; } -.adminTable tr th { width:10px; } -.adminTable tr th div { white-space:nowrap; margin:0 5px; } -.adminTable tr th select { height:20px; } -.adminTable tr th.wide { width:100%; } -.adminTable tr th.half_wide { width:50%; } -.adminTable tr th.quarter_wide { width:25%; } -.adminTable tr td.wide { width:100%; } -.adminTable tr td { background-color:#FFFFFF;white-space:normal; font-weight:normal; text-align:left; color:#222222; border-bottom:1px solid #EEE; border-right:1px solid #EEE; padding:4px 6px 4px 6px;} -.adminTable tr.row2 td { background-color:#F3F3F3; } -.adminTable tr a { color:#222222; text-decoration:none; } -.adminTable tr a:hover { color:#3D83B8; } -.adminTable tr td.nowrap { white-space:nowrap !important; } -.adminTable tr td.alert, .adminTable tr td.alert a { color:red; } -.adminTable tr td.number { font-size:8pt; font-family:tahoma; color:#27536C; } +.boxModelControler .boxModelTable td {border:0;border-top:1px solid #ddd;vertical-align:top;padding:5px 10px;text-align:left;} +.boxModelControler .boxModelTable th {height:50px;*height:40px;background:#f1f1f1;padding-left:70px;background-repeat:no-repeat;background-position:10px 10px;} +.boxModelControler .boxModelTable th.width {background-image:url(../img/exWidth.gif);} +.boxModelControler .boxModelTable th.margin {background-image:url(../img/exMargin.gif);} +.boxModelControler .boxModelTable th.padding {background-image:url(../img/exPadding.gif);} +.boxModelControler .boxModelTable th.border {background-image:url(../img/exBorder.gif);} +.boxModelControler .boxModelTable th.bgColor {background-image:url(../img/exBgColor.gif);} +.boxModelControler .boxModelTable th.bgImage {background-image:url(../img/exBgImage.gif);} +.boxModelControler .boxModelTable th sup {font-weight:normal;font-size:11px;font-family:Dotum;color:#999;} +.boxModelControler .boxModelTable td dl.iList dt {display:inline;position:relative;top:3px;} +.boxModelControler .boxModelTable td dl.iList dd {display:inline;} +.boxModelControler .boxModelTable td dl.dList dt {float:left;clear:left;margin-right:5px;padding-top:3px;} +.boxModelControler .boxModelTable td dl.dList dd {clear:right;} +.boxModelControler .colorPicker {position:relative;display:inline;vertical-align:top;} +.boxModelControler .colorPicker .picker {position:relative;top:2px;left:-22px;width:16px;height:16px;border:1px solid #ccc;background-color:transparent;background-position:right top;cursor:pointer;vertical-align:top;} +.boxModelControler .colorPicker .picker span {font-size:0;line-height:0;z-index:-1;visibility:hidden;} +.boxModelControler .colorPicker .palette {position:absolute;top:0px;left:0;display:none;width:272px;height:64px;list-style:none;margin:0;padding:1px 0 0 1px;border:1px solid #ccc;background:#fff;overflow:hidden;} +.boxModelControler .colorPicker .palette.open {display:block;} +.boxModelControler .colorPicker .palette li {float:left;margin:0 1px 1px 0;font-size:0;line-height:0;} +.boxModelControler .colorPicker .palette li button {width:15px;height:15px;border:0;cursor:pointer;} +.boxModelControler .colorPicker .palette li button span {position:relative;z-index:-1;font-size:0;line-height:0;visibility:hidden;} +.boxModelControler .colorPicker .palette li button.transparent {background:url(../img/bgNone.gif) no-repeat right top;border:1px solid #ddd;} +.boxModelControler .borderDetach {display:none;} +.boxModelControler .borderDetach.open {display:block;} +.boxModelControler .buttonArea{padding:15px 0 0 0;text-align:center} +#popup_content {border:2px solid #777;margin:0;font-size:12px;background:#fff;position:relative} +#popup_content .xButton {position:absolute;top:9px;right:18px;width:15px;height:14px;padding:0;background-color:transparent;background:url(../img/buttonClose.gif) no-repeat;border:0;cursor:pointer;overflow:hidden;} +#popup_content .xButton span {position:relative;z-index:-1;visibility:hidden;} +#popup_content * {font-size:12px;} +#popHeadder h4.xeAdmin, #popHeadder h1.xeAdmin, #popHeadder h3.xeAdmin {font-size:14px !important;font-family:Dotum !important;background:#f4f4f4 !important;padding:8px 30px 8px 15px !important;letter-spacing:-1px !important;border:none !important;margin:0 !important} +#popHeader h4.xeAdmin, #popHeader h1.xeAdmin, #popHeader h3.xeAdmin {font-size:14px !important;font-family:Dotum !important;background:#f4f4f4 !important;padding:8px 30px 8px 15px !important;letter-spacing:-1px !important;border:none !important;margin:0 !important} +#popHeader, #popBody, #popFooter {position:relative;*zoom:1;overflow:hidden} +#popBody, #popHistoryBody {margin:15px !important} +#popFooter {padding:10px 0 0 0;height:28px;text-align:center;background:#f4f4f4} +#popHeader.wide {width:600px} +.adminTable {width:100%;border:1px solid #EEE;border-bottom:none;border-right:none;margin-bottom:15px;} +.adminTable caption {background:url("../img/n_caption_head.gif") no-repeat left top;padding:8px 0 5px 30px;text-align:left;font-weight:bold !important;color:#FFFFFF !important;background-color:#888 !important;border-bottom:1px solid #FFFFFF;font-size:12px !important} +.adminTable thead tr th div {text-align:center} +.adminTable thead tr th {background-color:#AAA;color:#FFFFFF !important;} +.adminTable tr th {background-color:#FFFFFF;padding:6px;font-weight:bold;text-align:left;color:#666;border-right:1px solid #EEE;border-bottom:1px solid #EEE;} +.adminTable tr.row2 th {background-color:#F3F3F3;} +.adminTable tr th {width:10px;} +.adminTable tr th div {white-space:nowrap;margin:0 5px;} +.adminTable tr th select {height:20px;} +.adminTable tr th.wide {width:100%;} +.adminTable tr th.half_wide {width:50%;} +.adminTable tr th.quarter_wide {width:25%;} +.adminTable tr td.wide {width:100%;} +.adminTable tr td {background-color:#FFFFFF;white-space:normal;font-weight:normal;text-align:left;color:#222222; border-bottom:1px solid #EEE;border-right:1px solid #EEE;padding:4px 6px 4px 6px} +.adminTable tr.row2 td {background-color:#F3F3F3;} +.adminTable tr a {color:#222222;text-decoration:none;} +.adminTable tr a:hover {color:#3D83B8;} +.adminTable tr td.nowrap {white-space:nowrap !important;} +.adminTable tr td.alert, .adminTable tr td.alert a {color:red;} +.adminTable tr td.number {font-size:8pt;font-family:tahoma;color:#27536C;} .adminTable tr td.date, -.adminTable tr td span.date { font-size:8pt; font-family:tahoma; color:#666666;} -.adminTable tr td.center { text-align:center; } -.adminTable tr td.right { text-align:right; } -.adminTable tr td.paper { background:transparent url("../img/n_paper_bullet.gif") no-repeat 6px 8px; padding-left:20px; } -.adminTable tr.row2 td.paper { background:#F3F3F3 url("../img/n_paper_bullet.gif") no-repeat 6px 8px; padding-left:20px; } -.adminTable tr td.circle { background:#FFFFFF url("../img/n_circle_bullet.gif") no-repeat 6px 8px; padding-left:20px; } -.adminTable tr.row2 td.circle { background:#F3F3F3 url("../img/n_circle_bullet.gif") no-repeat 6px 8px; padding-left:20px; } -.adminTable tr td strong.alert { color:red; } -.adminTable tr td p { padding:0; margin:5px 0 0 5px; color:#777777; } -.adminTable tr td p a { color:#9F875F; font-weight:bold; text-decoration:underline; } +.adminTable tr td span.date {font-size:8pt;font-family:tahoma;color:#666666} +.adminTable tr td.center {text-align:center;} +.adminTable tr td.right {text-align:right;} +.adminTable tr td.paper {background:transparent url("../img/n_paper_bullet.gif") no-repeat 6px 8px;padding-left:20px;} +.adminTable tr.row2 td.paper {background:#F3F3F3 url("../img/n_paper_bullet.gif") no-repeat 6px 8px;padding-left:20px;} +.adminTable tr td.circle {background:#FFFFFF url("../img/n_circle_bullet.gif") no-repeat 6px 8px;padding-left:20px;} +.adminTable tr.row2 td.circle {background:#F3F3F3 url("../img/n_circle_bullet.gif") no-repeat 6px 8px;padding-left:20px;} +.adminTable tr td strong.alert {color:red;} +.adminTable tr td p {padding:0;margin:5px 0 0 5px;color:#777777;} +.adminTable tr td p a {color:#9F875F;font-weight:bold;text-decoration:underline;} .adminTable tr td.modify a, .adminTable tr td.delete a, .adminTable tr td.copy a, @@ -194,34 +573,31 @@ .adminTable tr td.moveupdown a, .adminTable tr td.selectAll a, .adminTable tr td.deSelectAll a, -.adminTable tr td.view a { margin:0 auto; } -.adminTable tr td.modify a { width:14px; height:14px; overflow:hidden; display:block; font-size:1px; line-height:100px; background:url("../img/n_icon_modify.gif") no-repeat left top; } -.adminTable tr td.delete a { width:14px; height:14px; overflow:hidden; display:block; font-size:1px; line-height:100px; background:url("../img/n_icon_delete.gif") no-repeat left top; } -.adminTable tr td.copy a { width:16px; height:16px; overflow:hidden; display:block; font-size:1px; line-height:100px; background:url("../img/n_icon_copy.gif") no-repeat left top; } -.adminTable tr td.view a { width:14px; height:14px; overflow:hidden; display:block; font-size:1px; line-height:100px; background:url("../img/n_icon_view.gif") no-repeat left top; } -.adminTable tr td.setup a { width:16px; height:16px; overflow:hidden; display:block; font-size:1px; line-height:100px; background:url("../img/n_setup.gif") no-repeat left top; } -.adminTable tr td.activated a { width:16px; height:16px; overflow:hidden; display:block; font-size:1px; line-height:100px; background:url("../img/n_light_on.gif") no-repeat left top; } -.adminTable tr td.deactivated a { width:16px; height:16px; overflow:hidden; display:block; font-size:1px; line-height:100px; background:url("../img/n_light_off.gif") no-repeat left top; } -.adminTable tr td.selectAll a { width:16px; height:16px; overflow:hidden; display:block; font-size:1px; line-height:100px; background:url("../img/n_icon_select_all.gif") no-repeat left top; } -.adminTable tr td.deSelectAll a { width:16px; height:16px; overflow:hidden; display:block; font-size:1px; line-height:100px; background:url("../img/n_icon_remove.gif") no-repeat left top; } -.adminTable tr td.moveupdown a.up { float:left; width:14px; height:14px; overflow:hidden; display:block; font-size:1px; line-height:100px; background:url("../img/n_button_up.gif") no-repeat left top; margin-right:5px; } -.adminTable tr td.moveupdown a.down{ float:left; width:14px; height:14px; overflow:hidden; display:block; font-size:1px; line-height:100px; background:url("../img/n_button_down.gif") no-repeat left top; } -.adminTable tr td.blue, .adminTable tr td.blue a { color:blue; } -.adminTable tr td.red, .adminTable tr td.red a { color:red; } - -.fullWidth { width:80%; } - -.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; } - -#search_nav { border:3px solid #ccc; margin:0; padding:3px; } -#search_nav input { border:0; height:17px; width:140px; padding:3px 0 0 4px; vertical-align:middle;} -#search_nav button { padding:0; border:0; height:17px; width:17px; background:transparent url(../img/buttonSearch.gif) no-repeat center; vertical-align:middle;} -#search_nav button.close {background:transparent url(../img/buttonClose.gif) no-repeat center;} -.e1 .section ._result{ list-style:none; margin:10px 0 0 0; padding:0;} -.e1 .section ._result li{ margin:0;} -.e1 .section ._result a{ display:block; color:#767676; padding:4px 5px 4px 10px;} +.adminTable tr td.view a {margin:0 auto;} +.adminTable tr td.modify a {width:14px;height:14px;overflow:hidden;display:block;font-size:1px;line-height:100px;background:url("../img/n_icon_modify.gif") no-repeat left top;} +.adminTable tr td.delete a {width:14px;height:14px;overflow:hidden;display:block;font-size:1px;line-height:100px;background:url("../img/n_icon_delete.gif") no-repeat left top;} +.adminTable tr td.copy a {width:16px;height:16px;overflow:hidden;display:block;font-size:1px;line-height:100px;background:url("../img/n_icon_copy.gif") no-repeat left top;} +.adminTable tr td.view a {width:14px;height:14px;overflow:hidden;display:block;font-size:1px;line-height:100px;background:url("../img/n_icon_view.gif") no-repeat left top;} +.adminTable tr td.setup a {width:16px;height:16px;overflow:hidden;display:block;font-size:1px;line-height:100px;background:url("../img/n_setup.gif") no-repeat left top;} +.adminTable tr td.activated a {width:16px;height:16px;overflow:hidden;display:block;font-size:1px;line-height:100px;background:url("../img/n_light_on.gif") no-repeat left top;} +.adminTable tr td.deactivated a {width:16px;height:16px;overflow:hidden;display:block;font-size:1px;line-height:100px;background:url("../img/n_light_off.gif") no-repeat left top; } +.adminTable tr td.selectAll a {width:16px;height:16px;overflow:hidden;display:block;font-size:1px;line-height:100px;background:url("../img/n_icon_select_all.gif") no-repeat left top;} +.adminTable tr td.deSelectAll a {width:16px;height:16px;overflow:hidden;display:block;font-size:1px;line-height:100px;background:url("../img/n_icon_remove.gif") no-repeat left top;} +.adminTable tr td.moveupdown a.up {float:left;width:14px;height:14px;overflow:hidden;display:block;font-size:1px;line-height:100px;background:url("../img/n_button_up.gif") no-repeat left top;margin-right:5px;} +.adminTable tr td.moveupdown a.down{float:left;width:14px;height:14px;overflow:hidden;display:block;font-size:1px;line-height:100px;background:url("../img/n_button_down.gif") no-repeat left top;} +.adminTable tr td.blue, .adminTable tr td.blue a {color:blue;} +.adminTable tr td.red, .adminTable tr td.red a {color:red;} +.fullWidth {width:80%;} +.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; } +#search_nav {border:3px solid #ccc;margin:-3px 0 0 0;padding:3px;} +#search_nav input {border:0;height:17px;width:140px;padding:3px 0 0 4px;vertical-align:middle} +#search_nav button {padding:0;border:0;height:17px;width:17px;background:transparent url(../img/buttonSearch.gif) no-repeat center;vertical-align:middle} +#search_nav button.close {background:transparent url(../img/buttonClose.gif) no-repeat center} +.e1 .section ._result{list-style:none;margin:10px 0 0 0;padding:0} +.e1 .section ._result li{margin:0} +.e1 .section ._result a{display:block;color:#767676;padding:4px 5px 4px 10px} .e1 .section ._result a:hover, .e1 .section ._result a:active, -.e1 .section ._result a:focus{ background:#f8f8f8;} +.e1 .section ._result a:focus{background:#f8f8f8} \ No newline at end of file diff --git a/modules/admin/tpl/css/dashboard.css b/modules/admin/tpl/css/dashboard.css index ba9196adf..3e41358ec 100644 --- a/modules/admin/tpl/css/dashboard.css +++ b/modules/admin/tpl/css/dashboard.css @@ -1,123 +1,112 @@ +@charset "utf-8"; +/* NHN (developers@xpressengine.com) */ /* Dashboard Header */ -.dashboardHeader{ position:relative; padding:29px 0 23px 0; border-bottom:2px solid #cbd4df; background:url(../img/iconH3dashboard.gif) no-repeat left center;} -.dashboardHeader .h3{ font-size:18px; text-indent:50px; margin:0;} - +.dashboardHeader{position:relative;padding:29px 0 23px 0;border-bottom:2px solid #cbd4df;background:url(../img/iconH3dashboard.gif) no-repeat left center} +.dashboardHeader .h3{font-size:18px;text-indent:50px;margin:0} /* Dashboard Notice */ -.dashboardNotice{ padding:10px 0 0 0;} -.dashboardNotice .h4{ margin:0 0 12px 0; color:#ea3f22; font-size:11px;} -.dashboardNotice button{ position:absolute; top:10px; right:0; font-size:11px; color:#8b8b8b; padding:0 0 0 10px; text-align:right; border:0; background-color:transparent; background-image:url(../img/iconDashboardNoticeOpen.gif); background-repeat:no-repeat; background-position:left -25px; cursor:pointer; *zoom:1; overflow:visible;} -.dashboardNotice.open button{ background-position:left 5px;} -.dashboardNotice ul{ height:0; margin:0; padding:0; list-style:none; font-size:12px; line-height:1;} -.dashboardNotice.open ul{ height:auto; padding:10px 0 5px 9px; border-top:1px solid #ededed;} -.dashboardNotice li{ display:none; margin:0 0 7px 0; padding:0 0 0 13px; background:url(../img/iconDashboardSummary.gif) no-repeat left center;} -.dashboardNotice li.first{ position:absolute; top:11px; left:90px; display:block; background:none; padding:0; margin:0;} -.dashboardNotice li.first .date{ display:none;} -.dashboardNotice.open li{ display:block;} -.dashboardNotice.open li.first{ position:static; margin:0 0 7px 0; padding:0 0 0 13px; background:url(../img/iconDashboardSummary.gif) no-repeat left center;} -.dashboardNotice li a{ text-decoration:none; color:#555; margin-right:15px;} +.dashboardNotice{padding:10px 0 0 0} +.dashboardNotice .h4{margin:0 0 12px 0;color:#ea3f22;font-size:11px} +.dashboardNotice button{position:absolute;top:10px;right:0;font-size:11px;color:#8b8b8b;padding:0 0 0 10px;text-align:right;border:0;background-color:transparent;background-image:url(../img/iconDashboardNoticeOpen.gif);background-repeat:no-repeat;background-position:left -25px;cursor:pointer;*zoom:1;overflow:visible} +.dashboardNotice.open button{background-position:left 5px} +.dashboardNotice ul{height:0;margin:0;padding:0;list-style:none;font-size:12px;line-height:1} +.dashboardNotice.open ul{height:auto;padding:10px 0 5px 9px;border-top:1px solid #ededed} +.dashboardNotice li{display:none;margin:0 0 7px 0;padding:0 0 0 13px;background:url(../img/iconDashboardSummary.gif) no-repeat left center} +.dashboardNotice li.first{position:absolute;top:11px;left:90px;display:block;background:none;padding:0;margin:0} +.dashboardNotice li.first .date{display:none} +.dashboardNotice.open li{display:block} +.dashboardNotice.open li.first{position:static;margin:0 0 7px 0;padding:0 0 0 13px;background:url(../img/iconDashboardSummary.gif) no-repeat left center} +.dashboardNotice li a{text-decoration:none;color:#555;margin-right:15px} .dashboardNotice li a:hover, .dashboardNotice li a:active, -.dashboardNotice li a:focus{ text-decoration:underline;} -.dashboardNotice li .date{ color:#8b8b8b; font-size:11px;} -.dashboardNotice.open li.first .date{ display:inline;} - +.dashboardNotice li a:focus{text-decoration:underline} +.dashboardNotice li .date{color:#8b8b8b;font-size:11px} +.dashboardNotice.open li.first .date{display:inline} /* Dashboard Statistic */ -.dashboardStatistic{ position:relative; width:100%; height:183px; _height:189px; *zoom:1; margin-bottom:30px;} -.dashboardStatistic .statistic{ position:relative; height:138px; padding:20px 20px 25px 20px; background:url(../img/bgDashboardStatistic.gif) repeat-x left top; font-size:12px; line-height:1;} -.dashboardStatistic .statistic:after{ content:""; display:block; clear:both;} -.dashboardStatistic .outline{position:absolute; overflow:hidden; font-size:0; line-height:0; background-image:url(../img/bgDashboardStatistic.gif);} -.dashboardStatistic .outline.ml{ top:0; left:-2px; width:4px; height:100%; background-position:left -300px; background-repeat:no-repeat;} -.dashboardStatistic .outline.mr{ top:0; right:-2px; width:4px; height:100%; background-position:right -300px; background-repeat:no-repeat;} -.dashboardStatistic .outline.tc{ top:0; left:0; width:100%; height:3px; background-position:left -600px; background-repeat:repeat-x;} -.dashboardStatistic .outline.bc{ bottom:0; left:0; width:100%; height:5px; background-position:left bottom; background-repeat:repeat-x;} -.dashboardStatistic .outline.tl{ top:0; left:-2px; width:4px; height:3px; background-position:left -603px; background-repeat:no-repeat;} -.dashboardStatistic .outline.tr{ top:0; right:-2px; width:4px; height:3px; background-position:right -603px; background-repeat:no-repeat;} -.dashboardStatistic .outline.bl{ bottom:0; left:-2px; width:4px; height:5px; background-position:left -606px; background-repeat:no-repeat;} -.dashboardStatistic .outline.br{ bottom:0; right:-2px; width:4px; height:5px; background-position:right -606px; background-repeat:no-repeat;} - -.dashboardStatistic .statistic h4{ font-size:12px; height:22px; width:67%; margin:0 0 10px 0; background:url(../img/bgDashboardStatisticHeader.gif) repeat-x 0 -22px; text-align:center;} -.dashboardStatistic .statistic h4 span{ display:block; height:18px; padding-top:4px; margin:0 1px; color:#747482; background:url(../img/bgDashboardStatisticHeader.gif) repeat-x;} -.dashboardStatistic .statistic h4 em{ font-style:normal; font-size:9px; color:#b7b7c4; margin-left:5px;} - -.dashboardStatistic dl{ position:relative; float:left; height:100px; margin:0; background:url(../img/vrDashboardStatistic.gif) no-repeat left center;} -.dashboardStatistic dt { position:absolute; width:0; height:0; overflow:hidden; font-size:0; line-height:0; visibility:hidden;} -.dashboardStatistic dd { position:absolute; margin:0; padding-top:40px; width:100%; text-align:center; background-image:url(../img/iconDashboardStatistic.gif); background-repeat:no-repeat; font-size:56px; font-weight:bold;} +.dashboardStatistic{position:relative;width:100%;height:183px;_height:189px;*zoom:1;margin-bottom:30px} +.dashboardStatistic .statistic{position:relative;height:138px;padding:20px 20px 25px 20px;background:url(../img/bgDashboardStatistic.gif) repeat-x left top;font-size:12px;line-height:1} +.dashboardStatistic .statistic:after{content:"";display:block;clear:both} +.dashboardStatistic .outline{position:absolute;overflow:hidden;font-size:0;line-height:0;background-image:url(../img/bgDashboardStatistic.gif)} +.dashboardStatistic .outline.ml{top:0;left:-2px;width:4px;height:100%;background-position:left -300px;background-repeat:no-repeat} +.dashboardStatistic .outline.mr{top:0;right:-2px;width:4px;height:100%;background-position:right -300px;background-repeat:no-repeat} +.dashboardStatistic .outline.tc{top:0;left:0;width:100%;height:3px;background-position:left -600px;background-repeat:repeat-x} +.dashboardStatistic .outline.bc{bottom:0;left:0;width:100%;height:5px;background-position:left bottom;background-repeat:repeat-x} +.dashboardStatistic .outline.tl{top:0;left:-2px;width:4px;height:3px;background-position:left -603px;background-repeat:no-repeat} +.dashboardStatistic .outline.tr{top:0;right:-2px;width:4px;height:3px;background-position:right -603px;background-repeat:no-repeat} +.dashboardStatistic .outline.bl{bottom:0;left:-2px;width:4px;height:5px;background-position:left -606px;background-repeat:no-repeat} +.dashboardStatistic .outline.br{bottom:0;right:-2px;width:4px;height:5px;background-position:right -606px;background-repeat:no-repeat} +.dashboardStatistic .statistic h4{font-size:12px;height:22px;width:67%;margin:0 0 10px 0;background:url(../img/bgDashboardStatisticHeader.gif) repeat-x 0 -22px;text-align:center} +.dashboardStatistic .statistic h4 span{display:block;height:18px;padding-top:4px;margin:0 1px;color:#747482;background:url(../img/bgDashboardStatisticHeader.gif) repeat-x} +.dashboardStatistic .statistic h4 em{font-style:normal;font-size:9px;color:#b7b7c4;margin-left:5px} +.dashboardStatistic dl{position:relative;float:left;height:100px;margin:0;background:url(../img/vrDashboardStatistic.gif) no-repeat left center} +.dashboardStatistic dt {position:absolute;width:0;height:0;overflow:hidden;font-size:0;line-height:0;visibility:hidden} +.dashboardStatistic dd {position:absolute;margin:0;padding-top:40px;width:100%;text-align:center;background-image:url(../img/iconDashboardStatistic.gif);background-repeat:no-repeat;font-size:56px;font-weight:bold} .dashboardStatistic dd object, -.dashboardStatistic dd embed{ vertical-align:top;} -.dashboardStatistic dl.visit{ background:none; width:28%;} -.dashboardStatistic dl.visit dd{ background-position:center 5px; color:#e3391d ;} -.dashboardStatistic dl.reply { background:none; width:22%;} -.dashboardStatistic dl.reply dd{ background-position:center -195px; color:#28313d;} -.dashboardStatistic dl.trackback { background:none; width:15%;} -.dashboardStatistic dl.trackback dd{ background-position:center -395px; color:#4e4f54;} - -.dashboardStatistic .summary{ float:right; width:30%; margin-top:-27px;} -.dashboardStatistic .summary caption{ position:relative; padding-bottom:20px; text-align:left; font-size:12px; line-height:1; font-weight:bold; color:#626972;} +.dashboardStatistic dd embed{vertical-align:top} +.dashboardStatistic dl.visit{background:none;width:28%} +.dashboardStatistic dl.visit dd{background-position:center 5px;color:#e3391d } +.dashboardStatistic dl.reply {background:none;width:22%} +.dashboardStatistic dl.reply dd{background-position:center -195px;color:#28313d} +.dashboardStatistic dl.trackback {background:none;width:15%} +.dashboardStatistic dl.trackback dd{background-position:center -395px;color:#4e4f54} +.dashboardStatistic .summary{float:right;width:30%;margin-top:-27px} +.dashboardStatistic .summary caption{position:relative;padding-bottom:20px;text-align:left;font-size:12px;line-height:1;font-weight:bold;color:#626972} .dashboardStatistic .summary table, .dashboardStatistic .summary th, -.dashboardStatistic .summary td{ border-spacing:0; border:0; font-weight:normal; text-align:left;} -.dashboardStatistic .summary table{ width:100%; border-bottom:1px solid #e3e6e6;} +.dashboardStatistic .summary td{border-spacing:0;border:0;font-weight:normal;text-align:left} +.dashboardStatistic .summary table{width:100%;border-bottom:1px solid #e3e6e6} .dashboardStatistic .summary th, -.dashboardStatistic .summary td{ padding-top:6px; padding-bottom:6px; border-top:1px solid #e3e6e6; vertical-align:top;} -.dashboardStatistic .summary th{ padding-left:18px; padding-right:12px; white-space:nowrap; color:#8b8b8b; background:url(../img/iconDashboardSummary.gif) no-repeat 2px 9px;} -.dashboardStatistic .summary td{ color:#555;} -.dashboardStatistic .summary td strong{ font-size:11px; color:#ea3f22;} -.dashboardStatistic .summary td .description{ color:#8b8b8b;} -.dashboardStatistic .summary td .description strong{ color:#8b8b8b;} - +.dashboardStatistic .summary td{padding-top:6px;padding-bottom:6px;border-top:1px solid #e3e6e6;vertical-align:top} +.dashboardStatistic .summary th{padding-left:18px;padding-right:12px;white-space:nowrap;color:#8b8b8b;background:url(../img/iconDashboardSummary.gif) no-repeat 2px 9px} +.dashboardStatistic .summary td{color:#555} +.dashboardStatistic .summary td strong{font-size:11px;color:#ea3f22} +.dashboardStatistic .summary td .description{color:#8b8b8b} +.dashboardStatistic .summary td .description strong{color:#8b8b8b} /* Dashboard Wire */ -.dashboardH4{ margin:0 0 7px 0; font-size:14px; color:#555;} -.dashboardH4 a { font-size:11px; color:#b1b1b1; font-style:normal; margin-left:5px;} -.dashboardH4 em{ font-size:11px; color:#b1b1b1; font-style:normal; margin-left:5px;} -.dashboardMoreTop{ position:absolute; top:4px; right:0; padding-left:7px; font-size:11px; display:block; white-space:nowrap; color:#8a919a; text-decoration:none; background:url(../img/iconMoreTop.gif) no-repeat left center;} - -.dashboardWire{ position:relative; margin-bottom:40px; border-top:2px solid #cbd4df; border-left:1px solid #e3e5e7; border-right:1px solid #e3e5e7; border-bottom:1px solid #f1f1f1; background:#fff; *border-bottom:1px solid #d0d1d2; *zoom:1; *filter:progid:DXImageTransform.Microsoft.dropshadow(OffX='0', OffY='1', Color='#f1f1f1', positive='true');} -.dashboardWire:after{ content:""; display:block; height:1px; background:#d0d1d2; overflow:hidden;} -.dashboardWire .buttonArea{ padding:8px 14px; background:#fafafa; border-top:1px solid #e3e5e7; text-align:right; position:relative;} -.dashboardWire ul{ position:relative; list-style:none; margin:0; padding:0; font-size:12px; overflow:hidden;} -.dashboardWire li{ position:relative; top:-1px; border-top:1px solid #e3e5e7;} - -.dashboardWire blockquote{ margin:0;} -.dashboardWire .noData{ color:#767676; padding:0 2em;} - -.dashboardWire .legend{ position:absolute; top:15px; left:20px; margin:0; white-space:nowrap; font-size:12px;} -.dashboardWire .legend *{ display:inline;} -.dashboardWire .legend dt img{ border:1px solid;} -.dashboardWire .legend dt.past img{ border-color:#c3d1db;} -.dashboardWire .legend dt.today img{ border-color:#dc3835;} -.dashboardWire .legend dd{ font-size:11px; color:#b1b1b1; margin:0 5px 0 0;} - -.dashboardWire .summary{ position:absolute; top:15px; right:20px; margin:0; white-space:nowrap; font-size:12px;} -.dashboardWire .summary *{ display:inline;} -.dashboardWire .summary dt{ margin-left:10px; color:#555;} -.dashboardWire .summary dd{ margin:0; font-size:11px; font-weight:bold; color:#ea3f22;} - -.dashboardWire .graph{ position:relative; height:131px; padding-top:63px; margin:0 20px 26px 20px; background:url(../img/bgDashboardGraph.gif) repeat-x 0 63px;} -.dashboardWire .graph:after{ content:""; display:block; clear:both;} -.dashboardWire .graph dl{ position:relative; float:left; width:10%; height:100%; margin:0 2%; *margin:0 1.8%; _margin:0 2% 0 1.1%;} -.dashboardWire .graph dl dt{ position:absolute; width:100%; text-align:center; font-size:9px; bottom:-16px; color:#707070;} -.dashboardWire .graph dl dd{ position:absolute; bottom:6px; width:30%; margin:0; border:1px solid; font-size:0; line-height:0; overflow:hidden;} -.dashboardWire .graph dl dd.past{ left:0; border-color:#c3d1db; background:#d0dde5;} -.dashboardWire .graph dl dd.today{ right:0; border-color:#dc3835; background:#fe5656;} -.dashboardWire .graph dl dd span{ position:relative; width:0; height:0; font-size:0; line-height:0; overflow:hidden; z-index:-1; visibility:hidden;} +.dashboardH4{margin:0 0 7px 0;font-size:14px;color:#555} +.dashboardH4 a {font-size:11px;color:#b1b1b1;font-style:normal;margin-left:5px} +.dashboardH4 em{font-size:11px;color:#b1b1b1;font-style:normal;margin-left:5px} +.dashboardMoreTop{position:absolute;top:4px;right:0;padding-left:7px;font-size:11px;display:block;white-space:nowrap;color:#8a919a;text-decoration:none;background:url(../img/iconMoreTop.gif) no-repeat left center} +.dashboardWire{position:relative;margin-bottom:40px;border-top:2px solid #cbd4df;border-left:1px solid #e3e5e7;border-right:1px solid #e3e5e7;border-bottom:1px solid #f1f1f1;background:#fff;*border-bottom:1px solid #d0d1d2;*zoom:1;*filter:progid:DXImageTransform.Microsoft.dropshadow(OffX='0', OffY='1', Color='#f1f1f1', positive='true')} +.dashboardWire:after{content:"";display:block;height:1px;background:#d0d1d2;overflow:hidden} +.dashboardWire .buttonArea{padding:8px 14px;background:#fafafa;border-top:1px solid #e3e5e7;text-align:right;position:relative} +.dashboardWire ul{position:relative;list-style:none;margin:0;padding:0;font-size:12px;overflow:hidden} +.dashboardWire li{position:relative;top:-1px;border-top:1px solid #e3e5e7} +.dashboardWire blockquote{margin:0} +.dashboardWire .noData{color:#767676;padding:0 2em} +.dashboardWire .legend{position:absolute;top:15px;left:20px;margin:0;white-space:nowrap;font-size:12px} +.dashboardWire .legend *{display:inline} +.dashboardWire .legend dt img{border:1px solid} +.dashboardWire .legend dt.past img{border-color:#c3d1db} +.dashboardWire .legend dt.today img{border-color:#dc3835} +.dashboardWire .legend dd{font-size:11px;color:#b1b1b1;margin:0 5px 0 0} +.dashboardWire .summary{position:absolute;top:15px;right:20px;margin:0;white-space:nowrap;font-size:12px} +.dashboardWire .summary *{display:inline} +.dashboardWire .summary dt{margin-left:10px;color:#555} +.dashboardWire .summary dd{margin:0;font-size:11px;font-weight:bold;color:#ea3f22} +.dashboardWire .graph{position:relative;height:131px;padding-top:63px;margin:0 20px 26px 20px;background:url(../img/bgDashboardGraph.gif) repeat-x 0 63px} +.dashboardWire .graph:after{content:"";display:block;clear:both} +.dashboardWire .graph dl{position:relative;float:left;width:10%;height:100%;margin:0 2%;*margin:0 1.8%;_margin:0 2% 0 1.1%} +.dashboardWire .graph dl dt{position:absolute;width:100%;text-align:center;font-size:9px;bottom:-16px;color:#707070} +.dashboardWire .graph dl dd{position:absolute;bottom:6px;width:30%;margin:0;border:1px solid;font-size:0;line-height:0;overflow:hidden} +.dashboardWire .graph dl dd.past{left:0;border-color:#c3d1db;background:#d0dde5} +.dashboardWire .graph dl dd.today{right:0;border-color:#dc3835;background:#fe5656} +.dashboardWire .graph dl dd span{position:relative;width:0;height:0;font-size:0;line-height:0;overflow:hidden;z-index:-1;visibility:hidden} .dashboardWire .graph object, -.dashboardWire .graph embed{ margin-top:-20px;} - -.dashboardWire a{ text-decoration:none; color:#648AB9;} +.dashboardWire .graph embed{margin-top:-20px} +.dashboardWire a{text-decoration:none;color:#648AB9} .dashboardWire a:hover, .dashboardWire a:active, -.dashboardWire a:focus{ text-decoration:underline;} - +.dashboardWire a:focus{text-decoration:underline} .section table, .section th, -.section td{ border-spacing:0; border:0; font-weight:normal; text-align:left;} -.section table{ width:100%; border-bottom:1px solid #e3e6e6;} +.section td{border-spacing:0;border:0;font-weight:normal;text-align:left} +.section table{width:100%;border-bottom:1px solid #e3e6e6} .section th, -.section td{ padding-top:6px; padding-bottom:6px; border-top:1px solid #e3e6e6; vertical-align:top;} -.section th{ padding-left:18px; padding-right:12px; color:#8b8b8b; background:url(../img/iconDashboardSummary.gif) no-repeat 2px 9px;} -.section td{ color:#555;} -.section td strong{ font-size:11px; color:#ea3f22;} -.section td.center { text-align:center;} -.section td .description{ color:#8b8b8b;} -.section td .description strong{ color:#8b8b8b;} -.section thead th{ background:none; background-color:#efefef; font-weight:bold; padding:6px 5px 6px 5px; } +.section td{padding-top:6px;padding-bottom:6px;border-top:1px solid #e3e6e6;vertical-align:top} +.section th{padding-left:18px;padding-right:12px;color:#8b8b8b;background:url(../img/iconDashboardSummary.gif) no-repeat 2px 9px} +.section td{color:#555} +.section td strong{font-size:11px;color:#ea3f22} +.section td.center {text-align:center} +.section td .description{color:#8b8b8b} +.section td .description strong{color:#8b8b8b} +.section thead th{background:none;background-color:#efefef;font-weight:bold;padding:6px 5px 6px 5px;} \ No newline at end of file diff --git a/modules/admin/tpl/css/font.css b/modules/admin/tpl/css/font.css deleted file mode 100755 index ba60a9aaa..000000000 --- a/modules/admin/tpl/css/font.css +++ /dev/null @@ -1,60 +0,0 @@ -@charset "utf-8"; -/* NHN (developers@xpressengine.com) */ - -#xeAdmin{ font-family:Sans-serif;} - -#xeAdmin a{ text-decoration:none !important;} -#xeAdmin a:hover, -#xeAdmin a:active, -#xeAdmin a:focus{ text-decoration:underline !important;} - -#xeAdmin h1.xeAdmin a{ text-decoration:none !important; font-family:Arial; font-size:16px; color:#fff; margin:0; padding:0;} -#xeAdmin table th{ color:#666;} -#xeAdmin table th a { color:#666;} -#xeAdmin table td{ color:#767676;} -#xeAdmin table td a { color:#767676;} -#xeAdmin caption{ font-size:11px; font-family:Tahoma; color:#767676;} -#xeAdmin div.summary { font-size:11px; font-family:Tahoma; color:#767676;} -#xeAdmin div.summary strong { font-weight:normal; } -#xeAdmin button.text{ font-size:12px;} -#xeAdmin em, -#xeAdmin address{ font-style:normal;} -#xeAdmin select{ font-size:12px;} -#xeAdmin input{ font-size:12px;} -#xeAdmin .buttonTypeGo{ padding:0; cursor:pointer;} - -#xeAdmin .footer address{ font:10px Tahoma;} -#xeAdmin .footer address a{ color:#777e86; } -#xeAdmin .gnb li a { color:#777e86; font-size:11px; font-family:Tahoma;} -#adminLang li a{ font-size:12px;} -#xeAdmin .lnb li, -#xeAdmin .lnb li a{ color:#fff; font-size:14px; font-family:Dotum, Tahoma;} - -#xeAdmin .path{ color:#ccc; font-size:11px;} -#xeAdmin .path a{ color:#767676; font-size:11px; font-family:Dotum, Sans-serif;} - -.e1 .navigation li a{ color:#000; text-decoration:none;} -.e1 .navigation li ul li a{ color:#767676;} -.e1 .navigation li ul li.active a{ font-weight:bold; color:#666;} - -.e2 .section h2.xeAdmin { font-size:12px; margin:0; padding:0;} -.e2 .section h2.xeAdmin .date{ font:Tahoma; color:#999;} - -.e2 table tbody th{ font-weight:normal; font-family:Dotum;} - -.e2 .notice li a{ color:#666; } -.e2 .notice li .date{ color:#767676; font:10px Tahoma;} - -.localNavigation li a{ text-decoration:none !important; color:#666;} -.localNavigation li.active a{ font-weight:bold; color:#1e6aac;} - -#xeAdmin h2.xeAdmin { font-size:12px;} -#xeAdmin h3.xeAdmin { font-size:12px; color:#666; margin:0; padding:0;} -#xeAdmin p.summary{ color:#767676;} -#xeAdmin p.summary a { text-decoration:none; color:#767676; } -#xeAdmin p.summary.red { color:#A54D4D; } -#xeAdmin p.summary.red a { text-decoration:none; color:#A54D4D; } -#xeAdmin div.infoText { color:#767676;} -#xeAdmin div.infoText p.warning{ margin:0 0 10px 0; padding:0 0 0 25px; background:url(../img/iconWarning.gif) no-repeat left top;} -#xeAdmin div.infoText p.update{ margin:0 0 10px 0; padding:0 0 0 25px; background:url(../img/iconRefresh.gif) no-repeat left top;} -#xeAdmin .buttonAction{} diff --git a/modules/admin/tpl/css/layout.css b/modules/admin/tpl/css/layout.css deleted file mode 100755 index 18dd2d017..000000000 --- a/modules/admin/tpl/css/layout.css +++ /dev/null @@ -1,47 +0,0 @@ -@charset "utf-8"; - -/* NHN (developers@xpressengine.com) */ - -#xeAdmin .header{ position:relative; height:62px; padding:10px 15px 10px 30px; background:url(../img/bgHeader.gif) repeat-x; z-index:10;} -#xeAdmin .footer{ height:26px; padding-top:10px; background:url(../img/bgFooter.gif) repeat-x; text-align:center;} -#xeAdmin .gnb{ position:relative; float:right; white-space:nowrap; clear:right; margin:0; padding:0;} -#xeAdmin .gnb li{ position:relative; float:left; margin:0 15px 0 0; padding:0;list-style:none;} - -#xeAdmin .gnb #adminLang { position:absolute; top:18px; right:0; display:none; background:#fff; margin:0; padding:5px; border:1px solid #ddd; z-index:999;} -#xeAdmin .gnb #adminLang li{ float:none; margin:0;} - -.body{ position:relative; margin:0; padding:0 0 0 200px; background:url(../img/lineBody.gif) repeat-y 180px 0; *zoom:1;} -.body:after {content:""; display:block; clear:both;} -.c .body { padding:20px; background:none; } -.ece .body {padding-right:340px;} -.ec .body {padding-right:20px;} -.extension{ position:relative;} -.body .e1 { float:left; width:180px; margin-right:-180px; left:-200px;} -.content { position:relative; width:100%; margin-right:-100%; float:left; padding:0;} -.ec .content { padding-top:10px; } -.c .e1, .c .e2 { display:none; } -.ece .e2 { width:300px; float:right; right:-320px; border-left:1px solid #ddd; padding-bottom:20px;} -.ec .e2 { display:none;} - -#xeAdmin .lnb { position:relative; left:-3px; float:left; clear:left; margin:5px 0 0 0; padding:0;} -#xeAdmin .lnb li, -#xeAdmin .lnb li a{ position:relative; float:left; background:url(../img/buttonLNB.gif) no-repeat; white-space:nowrap;} -#xeAdmin .lnb li{ margin:0 1px 0 0; padding:0;list-style:none; background-position:0 0;} -#xeAdmin .lnb li a{ left:1px; height:30px; padding:10px 15px 0 15px; text-decoration:none !important; background-position:right 0;} -#xeAdmin .lnb li.core{ margin-right:6px; background-position:0 -50px;} -#xeAdmin .lnb li.core a{ padding-right:20px; left:5px; background-position:right -50px;} -#xeAdmin .lnb li.first{ background-position:0 -50px; margin-right:5px;} -#xeAdmin .lnb li.first a{ left:5px;} -#xeAdmin .lnb li.end{} -#xeAdmin .lnb li.end a{ padding-right:20px; background-position:right -50px;} - -#xeAdmin .lnb li.core.selected { background-position:0 -150px;} -#xeAdmin .lnb li.core.selected a{ background-position:right -150px;} -#xeAdmin .lnb li.first.selected { background-position:0 -150px;} -#xeAdmin .lnb li.first.selected a{ background-position:right -100px;} -#xeAdmin .lnb li.mid.selected { background-position:0 -100px;} -#xeAdmin .lnb li.mid.selected a{ background-position:right -100px;} -#xeAdmin .lnb li.end.selected { background-position:0 -100px;} -#xeAdmin .lnb li.end.selected a{ background-position:right -150px;} - -#xeAdmin .path{ padding:0 0 0 25px; margin:0 0 20px 0; background:url(../img/iconPath.gif) no-repeat left center;} diff --git a/modules/admin/tpl/css/minify.ini b/modules/admin/tpl/css/minify.ini deleted file mode 100644 index ff927560b..000000000 --- a/modules/admin/tpl/css/minify.ini +++ /dev/null @@ -1,11 +0,0 @@ -[skip] -font.css -pagination.css -admin.css -layout.css -dashboard.css - -[merge >> xe_admin.css] -font.css -pagination.css -admin.css diff --git a/modules/admin/tpl/css/pagination.css b/modules/admin/tpl/css/pagination.css deleted file mode 100755 index 315223db3..000000000 --- a/modules/admin/tpl/css/pagination.css +++ /dev/null @@ -1,85 +0,0 @@ -@charset "utf-8"; -/* NHN (developers@xpressengine.com) */ - -/* Pagination Reset */ -#xeAdmin .pagination{ padding:15px 0; margin:0; text-align:center; clear:both; } -#xeAdmin .pagination *{ margin:0; padding:0;} -#xeAdmin .pagination img{ border:0;} -#xeAdmin .pagination a, -#xeAdmin .pagination strong{ position:relative; display:inline-block; text-decoration:none; line-height:normal; color:#333; font-family:Tahoma, Sans-serif; vertical-align:middle;} -#xeAdmin .pagination a:hover, -#xeAdmin .pagination a:active, -#xeAdmin .pagination a:focus{ background-color:#f4f4f4 !important; } -#xeAdmin .pagination strong{ color:#ff6600 !important;} -#xeAdmin .pagination a.prev, -#xeAdmin .pagination a.prevEnd, -#xeAdmin .pagination a.next, -#xeAdmin .pagination a.nextEnd{ font-weight:normal !important; border:none !important; margin:0 !important; white-space:nowrap; } - -/* Pagination A1 */ -#xeAdmin .pagination.a1 a, -#xeAdmin .pagination.a1 strong{ margin:0 -4px; padding:1px 10px 1px 8px; border:none; border-left:1px solid #ccc; border-right:1px solid #ddd; font-weight:bold; font-size:12px; background:#fff;} -#xeAdmin .pagination.a1 a.prev{ padding-left:10px; background:#fff url(../img/arrowPrevA1.gif) no-repeat left center; } -#xeAdmin .pagination.a1 a.prevEnd{ padding-left:15px; background:#fff url(../img/arrowPrevEndA1.gif) no-repeat left center; } -#xeAdmin .pagination.a1 a.next{ padding-right:10px; background:#fff url(../img/arrowNextA1.gif) no-repeat right center; } -#xeAdmin .pagination.a1 a.nextEnd{ padding-right:15px; background:#fff url(../img/arrowNextEndA1.gif) no-repeat right center; } - -/* Pagination A2 */ -#xeAdmin .pagination.a2 a, -#xeAdmin .pagination.a2 strong{ margin:0 -4px; padding:0 10px 0 8px; font-weight:bold; font-size:11px; border:none; border-left:1px solid #ddd; border-right:1px solid #ccc; background:#fff; } -#xeAdmin .pagination.a2 a.prev{ padding-left:10px; background:#fff url(../img/arrowPrevA1.gif) no-repeat left center; } -#xeAdmin .pagination.a2 a.prevEnd{ padding-left:15px; background:#fff url(../img/arrowPrevEndA1.gif) no-repeat left center; } -#xeAdmin .pagination.a2 a.next{ padding-right:10px; background:#fff url(../img/arrowNextA1.gif) no-repeat right center; } -#xeAdmin .pagination.a2 a.nextEnd{ padding-right:15px; background:#fff url(../img/arrowNextEndA1.gif) no-repeat right center; } - -/* Pagination B1 */ -#xeAdmin .pagination.b1 a, -#xeAdmin .pagination.b1 strong{ margin:0 -2px; padding:2px 8px; font-weight:bold; font-size:12px;} -#xeAdmin .pagination.b1 a.prev, -#xeAdmin .pagination.b1 a.prevEnd{ padding-left:16px; background:url(../img/arrowPrevB1.gif) no-repeat left center; } -#xeAdmin .pagination.b1 a.next, -#xeAdmin .pagination.b1 a.nextEnd{ padding-right:16px; background:url(../img/arrowNextB1.gif) no-repeat right center; } - -/* Pagination B2 */ -#xeAdmin .pagination.b2 a, -#xeAdmin .pagination.b2 strong{ margin:0 -2px; padding:2px 6px; font-size:11px;} -#xeAdmin .pagination.b2 a.prev, -#xeAdmin .pagination.b2 a.prevEnd{ padding-left:12px; background:url(../img/arrowPrevB1.gif) no-repeat left center; } -#xeAdmin .pagination.b2 a.next, -#xeAdmin .pagination.b2 a.nextEnd{ padding-right:12px; background:url(../img/arrowNextB1.gif) no-repeat right center; } - -/* Pagination C1 */ -#xeAdmin .pagination.c1 a, -#xeAdmin .pagination.c1 strong{ margin:0 -2px; padding:2px 4px; font-size:12px;} -#xeAdmin .pagination.c1 a.prev, -#xeAdmin .pagination.c1 a.prevEnd, -#xeAdmin .pagination.c1 a.next, -#xeAdmin .pagination.c1 a.nextEnd{ display:inline-block; width:13px; height:14px; padding:3px 4px; margin:0;} -#xeAdmin .pagination.c1 a.prev, -#xeAdmin .pagination.c1 a.prevEnd{ background:url(../img/arrowPrevC1.gif) no-repeat center;} -#xeAdmin .pagination.c1 a.next, -#xeAdmin .pagination.c1 a.nextEnd{ background:url(../img/arrowNextC1.gif) no-repeat center;} -#xeAdmin .pagination.c1 a.prev span, -#xeAdmin .pagination.c1 a.prevEnd span, -#xeAdmin .pagination.c1 a.next span, -#xeAdmin .pagination.c1 a.nextEnd span{ position:absolute; width:0; height:0; overflow:hidden; visibility:hidden;} - -/* Pagination C2 */ -#xeAdmin .pagination.c2 a, -#xeAdmin .pagination.c2 strong{ margin:0 -2px; padding:2px 4px; font-size:11px;} -#xeAdmin .pagination.c2 a.prev, -#xeAdmin .pagination.c2 a.prevEnd, -#xeAdmin .pagination.c2 a.next, -#xeAdmin .pagination.c2 a.nextEnd{ display:inline-block; width:13px; height:14px; padding:3px 4px; margin:0;} -#xeAdmin .pagination.c2 a.prev, -#xeAdmin .pagination.c2 a.prevEnd{ background:url(../img/arrowPrevC1.gif) no-repeat center;} -#xeAdmin .pagination.c2 a.next, -#xeAdmin .pagination.c2 a.nextEnd{ background:url(../img/arrowNextC1.gif) no-repeat center;} -#xeAdmin .pagination.c2 a.prev span, -#xeAdmin .pagination.c2 a.prevEnd span, -#xeAdmin .pagination.c2 a.next span, -#xeAdmin .pagination.c2 a.nextEnd span{ position:absolute; width:0; height:0; overflow:hidden; visibility:hidden;} - - - - diff --git a/modules/admin/tpl/css/xe_admin.css b/modules/admin/tpl/css/xe_admin.css deleted file mode 100644 index d0ab69058..000000000 --- a/modules/admin/tpl/css/xe_admin.css +++ /dev/null @@ -1,368 +0,0 @@ -@charset "utf-8"; -/* NHN (developers@xpressengine.com) */ - -#xeAdmin{ font-family:Sans-serif;} - -#xeAdmin a{ text-decoration:none !important;} -#xeAdmin a:hover, -#xeAdmin a:active, -#xeAdmin a:focus{ text-decoration:underline !important;} - -#xeAdmin h1.xeAdmin a{ text-decoration:none !important; font-family:Arial; font-size:16px; color:#fff; margin:0; padding:0;} -#xeAdmin table th{ color:#666;} -#xeAdmin table th a { color:#666;} -#xeAdmin table td{ color:#767676;} -#xeAdmin table td a { color:#767676;} -#xeAdmin caption{ font-size:11px; font-family:Tahoma; color:#767676;} -#xeAdmin div.summary { font-size:11px; font-family:Tahoma; color:#767676;} -#xeAdmin div.summary strong { font-weight:normal; } -#xeAdmin button.text{ font-size:12px;} -#xeAdmin em, -#xeAdmin address{ font-style:normal;} -#xeAdmin select{ font-size:12px;} -#xeAdmin input{ font-size:12px;} -#xeAdmin .buttonTypeGo{ padding:0; cursor:pointer;} - -#xeAdmin .footer address{ font:10px Tahoma;} -#xeAdmin .footer address a{ color:#777e86; } -#xeAdmin .gnb li a { color:#777e86; font-size:11px; font-family:Tahoma;} -#adminLang li a{ font-size:12px;} -#xeAdmin .lnb li, -#xeAdmin .lnb li a{ color:#fff; font-size:14px; font-family:Dotum, Tahoma;} - -#xeAdmin .path{ color:#ccc; font-size:11px;} -#xeAdmin .path a{ color:#767676; font-size:11px; font-family:Dotum, Sans-serif;} - -.e1 .navigation li a{ color:#000; text-decoration:none;} -.e1 .navigation li ul li a{ color:#767676;} -.e1 .navigation li ul li.active a{ font-weight:bold; color:#666;} - -.e2 .section h2.xeAdmin { font-size:12px; margin:0; padding:0;} -.e2 .section h2.xeAdmin .date{ font:Tahoma; color:#999;} - -.e2 table tbody th{ font-weight:normal; font-family:Dotum;} - -.e2 .notice li a{ color:#666; } -.e2 .notice li .date{ color:#767676; font:10px Tahoma;} - -.localNavigation li a{ text-decoration:none !important; color:#666;} -.localNavigation li.active a{ font-weight:bold; color:#1e6aac;} - -#xeAdmin h2.xeAdmin { font-size:12px;} -#xeAdmin h3.xeAdmin { font-size:12px; color:#666; margin:0; padding:0;} -#xeAdmin p.summary{ color:#767676;} -#xeAdmin p.summary a { text-decoration:none; color:#767676; } -#xeAdmin p.summary.red { color:#A54D4D; } -#xeAdmin p.summary.red a { text-decoration:none; color:#A54D4D; } -#xeAdmin div.infoText { color:#767676;} -#xeAdmin div.infoText p.warning{ margin:0 0 10px 0; padding:0 0 0 25px; background:url(../img/iconWarning.gif) no-repeat left top;} -#xeAdmin div.infoText p.update{ margin:0 0 10px 0; padding:0 0 0 25px; background:url(../img/iconRefresh.gif) no-repeat left top;} -#xeAdmin .buttonAction{} - -/* NHN (developers@xpressengine.com) */ - -/* Pagination Reset */ -#xeAdmin .pagination{ padding:15px 0; margin:0; text-align:center; clear:both; } -#xeAdmin .pagination *{ margin:0; padding:0;} -#xeAdmin .pagination img{ border:0;} -#xeAdmin .pagination a, -#xeAdmin .pagination strong{ position:relative; display:inline-block; text-decoration:none; line-height:normal; color:#333; font-family:Tahoma, Sans-serif; vertical-align:middle;} -#xeAdmin .pagination a:hover, -#xeAdmin .pagination a:active, -#xeAdmin .pagination a:focus{ background-color:#f4f4f4 !important; } -#xeAdmin .pagination strong{ color:#ff6600 !important;} -#xeAdmin .pagination a.prev, -#xeAdmin .pagination a.prevEnd, -#xeAdmin .pagination a.next, -#xeAdmin .pagination a.nextEnd{ font-weight:normal !important; border:none !important; margin:0 !important; white-space:nowrap; } - -/* Pagination A1 */ -#xeAdmin .pagination.a1 a, -#xeAdmin .pagination.a1 strong{ margin:0 -4px; padding:1px 10px 1px 8px; border:none; border-left:1px solid #ccc; border-right:1px solid #ddd; font-weight:bold; font-size:12px; background:#fff;} -#xeAdmin .pagination.a1 a.prev{ padding-left:10px; background:#fff url(../img/arrowPrevA1.gif) no-repeat left center; } -#xeAdmin .pagination.a1 a.prevEnd{ padding-left:15px; background:#fff url(../img/arrowPrevEndA1.gif) no-repeat left center; } -#xeAdmin .pagination.a1 a.next{ padding-right:10px; background:#fff url(../img/arrowNextA1.gif) no-repeat right center; } -#xeAdmin .pagination.a1 a.nextEnd{ padding-right:15px; background:#fff url(../img/arrowNextEndA1.gif) no-repeat right center; } - -/* Pagination A2 */ -#xeAdmin .pagination.a2 a, -#xeAdmin .pagination.a2 strong{ margin:0 -4px; padding:0 10px 0 8px; font-weight:bold; font-size:11px; border:none; border-left:1px solid #ddd; border-right:1px solid #ccc; background:#fff; } -#xeAdmin .pagination.a2 a.prev{ padding-left:10px; background:#fff url(../img/arrowPrevA1.gif) no-repeat left center; } -#xeAdmin .pagination.a2 a.prevEnd{ padding-left:15px; background:#fff url(../img/arrowPrevEndA1.gif) no-repeat left center; } -#xeAdmin .pagination.a2 a.next{ padding-right:10px; background:#fff url(../img/arrowNextA1.gif) no-repeat right center; } -#xeAdmin .pagination.a2 a.nextEnd{ padding-right:15px; background:#fff url(../img/arrowNextEndA1.gif) no-repeat right center; } - -/* Pagination B1 */ -#xeAdmin .pagination.b1 a, -#xeAdmin .pagination.b1 strong{ margin:0 -2px; padding:2px 8px; font-weight:bold; font-size:12px;} -#xeAdmin .pagination.b1 a.prev, -#xeAdmin .pagination.b1 a.prevEnd{ padding-left:16px; background:url(../img/arrowPrevB1.gif) no-repeat left center; } -#xeAdmin .pagination.b1 a.next, -#xeAdmin .pagination.b1 a.nextEnd{ padding-right:16px; background:url(../img/arrowNextB1.gif) no-repeat right center; } - -/* Pagination B2 */ -#xeAdmin .pagination.b2 a, -#xeAdmin .pagination.b2 strong{ margin:0 -2px; padding:2px 6px; font-size:11px;} -#xeAdmin .pagination.b2 a.prev, -#xeAdmin .pagination.b2 a.prevEnd{ padding-left:12px; background:url(../img/arrowPrevB1.gif) no-repeat left center; } -#xeAdmin .pagination.b2 a.next, -#xeAdmin .pagination.b2 a.nextEnd{ padding-right:12px; background:url(../img/arrowNextB1.gif) no-repeat right center; } - -/* Pagination C1 */ -#xeAdmin .pagination.c1 a, -#xeAdmin .pagination.c1 strong{ margin:0 -2px; padding:2px 4px; font-size:12px;} -#xeAdmin .pagination.c1 a.prev, -#xeAdmin .pagination.c1 a.prevEnd, -#xeAdmin .pagination.c1 a.next, -#xeAdmin .pagination.c1 a.nextEnd{ display:inline-block; width:13px; height:14px; padding:3px 4px; margin:0;} -#xeAdmin .pagination.c1 a.prev, -#xeAdmin .pagination.c1 a.prevEnd{ background:url(../img/arrowPrevC1.gif) no-repeat center;} -#xeAdmin .pagination.c1 a.next, -#xeAdmin .pagination.c1 a.nextEnd{ background:url(../img/arrowNextC1.gif) no-repeat center;} -#xeAdmin .pagination.c1 a.prev span, -#xeAdmin .pagination.c1 a.prevEnd span, -#xeAdmin .pagination.c1 a.next span, -#xeAdmin .pagination.c1 a.nextEnd span{ position:absolute; width:0; height:0; overflow:hidden; visibility:hidden;} - -/* Pagination C2 */ -#xeAdmin .pagination.c2 a, -#xeAdmin .pagination.c2 strong{ margin:0 -2px; padding:2px 4px; font-size:11px;} -#xeAdmin .pagination.c2 a.prev, -#xeAdmin .pagination.c2 a.prevEnd, -#xeAdmin .pagination.c2 a.next, -#xeAdmin .pagination.c2 a.nextEnd{ display:inline-block; width:13px; height:14px; padding:3px 4px; margin:0;} -#xeAdmin .pagination.c2 a.prev, -#xeAdmin .pagination.c2 a.prevEnd{ background:url(../img/arrowPrevC1.gif) no-repeat center;} -#xeAdmin .pagination.c2 a.next, -#xeAdmin .pagination.c2 a.nextEnd{ background:url(../img/arrowNextC1.gif) no-repeat center;} -#xeAdmin .pagination.c2 a.prev span, -#xeAdmin .pagination.c2 a.prevEnd span, -#xeAdmin .pagination.c2 a.next span, -#xeAdmin .pagination.c2 a.nextEnd span{ position:absolute; width:0; height:0; overflow:hidden; visibility:hidden;} - -/* NHN (developers@xpressengine.com) */ - -#xeAdmin .open{ display:block !important;} -#xeAdmin h1.xeAdmin { float:left; white-space:nowrap; margin:0;padding:0;} -#xeAdmin caption{ text-align:left;} -#xeAdmin button{ cursor:pointer;} -#xeAdmin hr{ display:none;} -#xeAdmin fieldset{ border:0;} -#xeAdmin fieldset legend{ font-size:0; line-height:0; position:absolute; visibility:hidden;} -#xeAdmin .section{ margin-bottom:20px;} -#xeAdmin .buttonArea{ text-align:center; padding:15px 0;} -#xeAdmin button.text{ background:none; border:0; color:#0000ee;} -#xeAdmin img.graphHr{ height:5px; vertical-align:middle;} -#xeAdmin .ac{ text-align:center;} -#xeAdmin .al{ text-align:left;} -#xeAdmin .ar{ text-align:right;} - -.crossTable{ width:100%; border:0; margin:0 0 20px 0; padding:0;} -.crossTable th div { white-space:nowrap; } -.crossTable th, -.crossTable td{ border:0; padding:5px 10px; vertical-align:top;} -.crossTable th{ background:#f4f4f4;} -.crossTable thead th{ border-top:2px solid #cfcfcf; border-bottom:1px solid #e5e5e5; background-image:url(../img/lineVrText.gif); background-repeat:no-repeat; background-position:left center;} -.crossTable thead th:first-child{ background-image:none;} -.crossTable tbody th{ border-bottom:1px solid #e5e5e5; text-align:left;} -.crossTable td{ border-bottom:1px solid #f0f0f0;} - -.colTable{ width:100%; border:0; margin:0 0 20px 0; padding:0;} -.colTable th div { white-space:nowrap; } -.colTable tr.bg0{ background:#fff;} -.colTable tr.bg1{ background:#f8f8f8;} -.colTable th, -.colTable td{ border:0; padding:5px 10px; vertical-align:top;} -.colTable th{ border-top:2px solid #cfcfcf; border-bottom:1px solid #e5e5e5; background:#f4f4f4; background-image:url(../img/lineVrText.gif); background-repeat:no-repeat; background-position:left center;} -.colTable th:first-child{ background-image:none;} -.colTable td{ border-bottom:1px solid #f0f0f0;} - -.rowTable{ width:100%; border:0; border-top:2px solid #cfcfcf; margin:0 0 20px 0; padding:0;} -.rowTable th div { white-space:nowrap; } -.rowTable tr.bg0{ background:#fff;} -.rowTable tr.bg1{ background:#f8f8f8;} -.rowTable th, -.rowTable td{ border:0; padding:5px 10px; text-align:left; vertical-align:top;} -.rowTable th{ background:#f4f4f4;} -.rowTable tbody th{ border-bottom:1px solid #e5e5e5;} -.rowTable td{ border-bottom:1px solid #f0f0f0;} - -.rowTable th.button, .colTable th.button, .crossTable th.button { text-align:right; } -.rowTable td.alert, .colTable td.alert, .crossTable td.alert { color:red !important; } -.rowTable td.alert a, .colTable td.alert a, .crossTable td.alert a { text-decoration:none; color:red !important; } - -.colTable td.wide, .rowTable td.wide, .crossTable td.wide { width:100%;} - -.e1 .navigation { list-style:none; position:relative; *zoom:1; margin:0; padding:0; border-bottom:1px solid #c2c2c2;} -.e1 .navigation ul { list-style:none; position:relative; *zoom:1; margin:0; padding:0;} -.e1 .navigation li { list-style:none; position:relative; *zoom:1; margin:0; padding:0; background-color:#f7f7f7; } -.e1 .navigation li a.parent { border-top:1px solid #c2c2c2; display:block; padding:10px 20px 10px 35px ;background-image:url(../img/iconNavigation.gif); background-repeat:no-repeat; background-position:160px -35px; font-weight:bold; color:#888; text-decoration:none;} -.e1 .navigation li.close a.parent { background-position:160px 13px; border-bottom:none; } - -#module_service { background-image:url(../img/mIcon.gif); background-repeat:no-repeat; background-position:10px 10px;} -#module_member { background-image:url(../img/mIcon.gif); background-repeat:no-repeat; background-position:10px -40px;} -#module_content { background-image:url(../img/mIcon.gif); background-repeat:no-repeat; background-position:10px -90px;} -#module_construction { background-image:url(../img/mIcon.gif); background-repeat:no-repeat; background-position:10px -140px;} -#module_utility { background-image:url(../img/mIcon.gif); background-repeat:no-repeat; background-position:10px -190px;} -#module_accessory { background-image:url(../img/mIcon.gif); background-repeat:no-repeat; background-position:10px -240px;} -#module_system { background-image:url(../img/mIcon.gif); background-repeat:no-repeat; background-position:10px -290px;} - -.e1 .navigation li ul{ border-top:1px solid #d2d2d2; margin:0; padding:5px 0; background-color:#fff;} -.e1 .navigation li ul li { margin:5px 0; padding:0 10px 0 35px; background-color:#fff;} -.e1 .navigation li.close ul{ display:none;} -.e1 .navigation li ul li a { text-decoration:none; } -.e1 .navigation li ul li a:hover { font-weight:bold; text-decoration:none; letter-spacing:-1px;} -.e1 .navigation li ul li.active a { color:#ea3f22; letter-spacing:-1px;} - -.e2 .section{ margin-left:20px;} -.e2 .section h4.xeAdmin { margin:10px 0 0 0; padding:0 0 0 25px; } -.e2 .section .date{ background:url(../img/lineVrText.gif) no-repeat left center; font-size:9px; padding-left:5px;} -.e2 .section .contentBox { padding:10px 0; margin:0 0 20px 0; border-bottom:1px solid #ccc;} - -.e2 table tbody td{ text-align:left; word-break:break-all; -ms-word-break:break-all; } - -#xeAdmin .localNavigation { position:relative; border-bottom:1px solid #ccc; *zoom:1; margin:0 0 40px 0; padding:0; font-size:12px;} -#xeAdmin .localNavigation:after {content:""; display:block; clear:both;} -#xeAdmin .localNavigation ul{ display:none; position:absolute; top:40px; left:0; list-style:none; margin:0; padding:0; overflow:hidden;} -#xeAdmin .localNavigation li{ list-style:none; float:left; margin:0 -1px 0 0; padding:0;background:#fff;} -#xeAdmin .localNavigation li a{ float:left; padding:7px 15px 0 15px; height:18px; border:1px solid #ddd; border-bottom:none; background:url(../img/bgTab.gif) repeat-x; text-decoration:none !important; color:#666} -#xeAdmin .localNavigation li.on { margin-bottom:-1px;} -#xeAdmin .localNavigation li.on ul{ display:block;} -#xeAdmin .localNavigation li.on a{ height:19px; background:none; font-weight:bold;} -#xeAdmin .localNavigation li li{ position:relative; left:-1px; display:inline; float:none; margin:0; padding:0 6px 0 10px; border-left:1px solid #ddd;} -#xeAdmin .localNavigation li li a{ font-weight:normal !important; float:none; padding:0; height:auto; border:0; background:none;} -#xeAdmin .localNavigation li li.on a{ font-weight:bold !important;} - -#xeAdmin h3.xeAdmin {border-bottom:2px solid #ccc; padding:5px 0 5px 25px; margin:0 0 10px 0; background:url(../img/iconH2.gif) no-repeat left center;} -#xeAdmin h4.xeAdmin {padding:5px 0 5px 20px; background:url(../img/iconH3.gif) no-repeat left center;} -#xeAdmin h4.xeAdmin span.vr { font-size:11px; color:#AAA; } -#xeAdmin h4.xeAdmin a.view { font-size:11px; font-family:vertical; color:#777e86; } -#xeAdmin p.summary, div.infoText { margin:0 0 15px 0; line-height:1.6;} - -.layer { display:none; position:absolute; border:2px solid #777; margin:0; font-size:12px; background:#fff;} -.layer * { margin:0; padding:0; font-size:12px; } -.layer h4.xeAdmin { font-size:14px !important; font-family:Dotum; background:#f4f4f4 !important; padding:8px 30px 8px 15px !important; letter-spacing:-1px !important; } -.layer .xButton { position:absolute; top:9px; right:9px; width:15px; height:14px; background-color:transparent; background:url(../img/buttonClose.gif) no-repeat; border:0; cursor:pointer; overflow:hidden; } -.layer .xButton span { position:relative; z-index:-1; visibility:hidden; } -.layer .layerBody{ margin:15px;} - -.boxModelControler select { margin-bottom:3px; } -.boxModelControler .inputText { border:1px solid #ccc; padding:2px 3px; margin-bottom:3px; vertical-align:top; *margin-top:-1px; } -.boxModelControler .inputCheck { width:13px; height:13px; vertical-align:middle; } -.boxModelControler .layerBody { margin:15px; } -.boxModelControler .preview{ overflow:hidden; margin-bottom:20px;} -.boxModelControler .dragAble { position:relative; padding:15px 0 0 15px; background:url(../img/bgRuler.gif) no-repeat; *zoom:1; cursor:move;} -.boxModelControler .dragAble .prevGrid { position:relative; margin:-1px; background:url(../img/bgGrid.gif) 0 0; border:1px solid #000; *zoom:1;} -.boxModelControler .dragAble .prevBox { position:relative; } -.boxModelControler .dragAble .prevBox .prevContent { position:relative; } -.boxModelControler .boxModelTable { width:100%; border:0; border-bottom:1px solid #ddd; margin:0; padding:0;} -.boxModelControler .boxModelTable th, -.boxModelControler .boxModelTable td { border:0; border-top:1px solid #ddd; vertical-align:top; padding:5px 10px; text-align:left; } -.boxModelControler .boxModelTable th { height:50px; *height:40px; background:#f1f1f1; padding-left:70px; background-repeat:no-repeat; background-position:10px 10px; } -.boxModelControler .boxModelTable th.width { background-image:url(../img/exWidth.gif); } -.boxModelControler .boxModelTable th.margin { background-image:url(../img/exMargin.gif); } -.boxModelControler .boxModelTable th.padding { background-image:url(../img/exPadding.gif); } -.boxModelControler .boxModelTable th.border { background-image:url(../img/exBorder.gif); } -.boxModelControler .boxModelTable th.bgColor { background-image:url(../img/exBgColor.gif); } -.boxModelControler .boxModelTable th.bgImage { background-image:url(../img/exBgImage.gif); } -.boxModelControler .boxModelTable th sup { font-weight:normal; font-size:11px; font-family:Dotum; color:#999; } -.boxModelControler .boxModelTable td dl.iList dt { display:inline; position:relative; top:3px; } -.boxModelControler .boxModelTable td dl.iList dd { display:inline; } -.boxModelControler .boxModelTable td dl.dList dt { float:left; clear:left; margin-right:5px; padding-top:3px; } -.boxModelControler .boxModelTable td dl.dList dd { clear:right; } -.boxModelControler .colorPicker { position:relative; display:inline; vertical-align:top; } -.boxModelControler .colorPicker .picker { position:relative; top:2px; left:-22px; width:16px; height:16px; border:1px solid #ccc; background-color:transparent; background-position:right top; cursor:pointer; vertical-align:top; } -.boxModelControler .colorPicker .picker span { font-size:0; line-height:0; z-index:-1; visibility:hidden; } -.boxModelControler .colorPicker .palette { position:absolute; top:0px; left:0; display:none; width:272px; height:64px; list-style:none; margin:0; padding:1px 0 0 1px; border:1px solid #ccc; background:#fff; overflow:hidden; } -.boxModelControler .colorPicker .palette.open { display:block; } -.boxModelControler .colorPicker .palette li { float:left; margin:0 1px 1px 0; font-size:0; line-height:0; } -.boxModelControler .colorPicker .palette li button { width:15px; height:15px; border:0; cursor:pointer; } -.boxModelControler .colorPicker .palette li button span { position:relative; z-index:-1; font-size:0; line-height:0; visibility:hidden; } -.boxModelControler .colorPicker .palette li button.transparent { background:url(../img/bgNone.gif) no-repeat right top; border:1px solid #ddd; } -.boxModelControler .borderDetach { display:none; } -.boxModelControler .borderDetach.open { display:block; } -.boxModelControler .buttonArea{ padding:15px 0 0 0; text-align:center;} - -#popup_content { border:2px solid #777; margin:0; font-size:12px; background:#fff; position:relative;} -#popup_content .xButton { position:absolute; top:9px; right:18px; width:15px; height:14px; padding:0; background-color:transparent; background:url(../img/buttonClose.gif) no-repeat; border:0; cursor:pointer; overflow:hidden; } -#popup_content .xButton span { position:relative; z-index:-1; visibility:hidden; } -#popup_content * { font-size:12px; } -#popHeadder h4.xeAdmin, #popHeadder h1.xeAdmin, #popHeadder h3.xeAdmin { font-size:14px !important; font-family:Dotum !important; background:#f4f4f4 !important; padding:8px 30px 8px 15px !important; letter-spacing:-1px !important; border:none !important; margin:0 !important;} -#popHeader h4.xeAdmin, #popHeader h1.xeAdmin, #popHeader h3.xeAdmin { font-size:14px !important; font-family:Dotum !important; background:#f4f4f4 !important; padding:8px 30px 8px 15px !important; letter-spacing:-1px !important; border:none !important; margin:0 !important;} -#popHeader, #popBody, #popFooter { position:relative; *zoom:1; overflow:hidden;} -#popBody, #popHistoryBody { margin:15px !important;} -#popFooter { padding:10px 0 0 0; height:28px; text-align:center; background:#f4f4f4;} -#popHeader { } -#popHeader.wide { width:600px;} - -.adminTable { width:100%; border:1px solid #EEE; border-bottom:none; border-right:none; margin-bottom:15px; } -.adminTable caption { background:url("../img/n_caption_head.gif") no-repeat left top; padding:8px 0 5px 30px; text-align:left; font-weight:bold !important; color:#FFFFFF !important; background-color:#888 !important; border-bottom:1px solid #FFFFFF; font-size:12px !important;} -.adminTable thead tr th div { text-align:center;} -.adminTable thead tr th { background-color:#AAA; color:#FFFFFF !important; } -.adminTable tr th { background-color:#FFFFFF; padding:6px; font-weight:bold; text-align:left; color:#666; border-right:1px solid #EEE; border-bottom:1px solid #EEE; } -.adminTable tr.row2 th { background-color:#F3F3F3; } -.adminTable tr th { width:10px; } -.adminTable tr th div { white-space:nowrap; margin:0 5px; } -.adminTable tr th select { height:20px; } -.adminTable tr th.wide { width:100%; } -.adminTable tr th.half_wide { width:50%; } -.adminTable tr th.quarter_wide { width:25%; } -.adminTable tr td.wide { width:100%; } -.adminTable tr td { background-color:#FFFFFF;white-space:normal; font-weight:normal; text-align:left; color:#222222; border-bottom:1px solid #EEE; border-right:1px solid #EEE; padding:4px 6px 4px 6px;} -.adminTable tr.row2 td { background-color:#F3F3F3; } -.adminTable tr a { color:#222222; text-decoration:none; } -.adminTable tr a:hover { color:#3D83B8; } -.adminTable tr td.nowrap { white-space:nowrap !important; } -.adminTable tr td.alert, .adminTable tr td.alert a { color:red; } -.adminTable tr td.number { font-size:8pt; font-family:tahoma; color:#27536C; } -.adminTable tr td.date, -.adminTable tr td span.date { font-size:8pt; font-family:tahoma; color:#666666;} -.adminTable tr td.center { text-align:center; } -.adminTable tr td.right { text-align:right; } -.adminTable tr td.paper { background:transparent url("../img/n_paper_bullet.gif") no-repeat 6px 8px; padding-left:20px; } -.adminTable tr.row2 td.paper { background:#F3F3F3 url("../img/n_paper_bullet.gif") no-repeat 6px 8px; padding-left:20px; } -.adminTable tr td.circle { background:#FFFFFF url("../img/n_circle_bullet.gif") no-repeat 6px 8px; padding-left:20px; } -.adminTable tr.row2 td.circle { background:#F3F3F3 url("../img/n_circle_bullet.gif") no-repeat 6px 8px; padding-left:20px; } -.adminTable tr td strong.alert { color:red; } -.adminTable tr td p { padding:0; margin:5px 0 0 5px; color:#777777; } -.adminTable tr td p a { color:#9F875F; font-weight:bold; text-decoration:underline; } -.adminTable tr td.modify a, -.adminTable tr td.delete a, -.adminTable tr td.copy a, -.adminTable tr td.setup a, -.adminTable tr td.activated a, -.adminTable tr td.deactivated a, -.adminTable tr td.moveupdown a, -.adminTable tr td.selectAll a, -.adminTable tr td.deSelectAll a, -.adminTable tr td.view a { margin:0 auto; } -.adminTable tr td.modify a { width:14px; height:14px; overflow:hidden; display:block; font-size:1px; line-height:100px; background:url("../img/n_icon_modify.gif") no-repeat left top; } -.adminTable tr td.delete a { width:14px; height:14px; overflow:hidden; display:block; font-size:1px; line-height:100px; background:url("../img/n_icon_delete.gif") no-repeat left top; } -.adminTable tr td.copy a { width:16px; height:16px; overflow:hidden; display:block; font-size:1px; line-height:100px; background:url("../img/n_icon_copy.gif") no-repeat left top; } -.adminTable tr td.view a { width:14px; height:14px; overflow:hidden; display:block; font-size:1px; line-height:100px; background:url("../img/n_icon_view.gif") no-repeat left top; } -.adminTable tr td.setup a { width:16px; height:16px; overflow:hidden; display:block; font-size:1px; line-height:100px; background:url("../img/n_setup.gif") no-repeat left top; } -.adminTable tr td.activated a { width:16px; height:16px; overflow:hidden; display:block; font-size:1px; line-height:100px; background:url("../img/n_light_on.gif") no-repeat left top; } -.adminTable tr td.deactivated a { width:16px; height:16px; overflow:hidden; display:block; font-size:1px; line-height:100px; background:url("../img/n_light_off.gif") no-repeat left top; } -.adminTable tr td.selectAll a { width:16px; height:16px; overflow:hidden; display:block; font-size:1px; line-height:100px; background:url("../img/n_icon_select_all.gif") no-repeat left top; } -.adminTable tr td.deSelectAll a { width:16px; height:16px; overflow:hidden; display:block; font-size:1px; line-height:100px; background:url("../img/n_icon_remove.gif") no-repeat left top; } -.adminTable tr td.moveupdown a.up { float:left; width:14px; height:14px; overflow:hidden; display:block; font-size:1px; line-height:100px; background:url("../img/n_button_up.gif") no-repeat left top; margin-right:5px; } -.adminTable tr td.moveupdown a.down{ float:left; width:14px; height:14px; overflow:hidden; display:block; font-size:1px; line-height:100px; background:url("../img/n_button_down.gif") no-repeat left top; } -.adminTable tr td.blue, .adminTable tr td.blue a { color:blue; } -.adminTable tr td.red, .adminTable tr td.red a { color:red; } - -.fullWidth { width:80%; } - -.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; } - -#search_nav { border:3px solid #ccc; margin:0; padding:3px; } -#search_nav input { border:0; height:17px; width:140px; padding:3px 0 0 4px; vertical-align:middle;} -#search_nav button { padding:0; border:0; height:17px; width:17px; background:transparent url(../img/buttonSearch.gif) no-repeat center; vertical-align:middle;} -#search_nav button.close {background:transparent url(../img/buttonClose.gif) no-repeat center;} -.e1 .section ._result{ list-style:none; margin:10px 0 0 0; padding:0;} -.e1 .section ._result li{ margin:0;} -.e1 .section ._result a{ display:block; color:#767676; padding:4px 5px 4px 10px;} -.e1 .section ._result a:hover, -.e1 .section ._result a:active, -.e1 .section ._result a:focus{ background:#f8f8f8;} diff --git a/modules/admin/tpl/css/xe_admin.min.css b/modules/admin/tpl/css/xe_admin.min.css deleted file mode 100644 index 88c9ffe85..000000000 --- a/modules/admin/tpl/css/xe_admin.min.css +++ /dev/null @@ -1 +0,0 @@ -@charset "utf-8";#xeAdmin{font-family:Sans-serif}#xeAdmin a{text-decoration:none !important}#xeAdmin a:hover,#xeAdmin a:active,#xeAdmin a:focus{text-decoration:underline !important}#xeAdmin h1.xeAdmin a{text-decoration:none !important;font-family:Arial;font-size:16px;color:#fff;margin:0;padding:0}#xeAdmin table th{color:#666}#xeAdmin table th a{color:#666}#xeAdmin table td{color:#767676}#xeAdmin table td a{color:#767676}#xeAdmin caption{font-size:11px;font-family:Tahoma;color:#767676}#xeAdmin div.summary{font-size:11px;font-family:Tahoma;color:#767676}#xeAdmin div.summary strong{font-weight:normal}#xeAdmin button.text{font-size:12px}#xeAdmin em,#xeAdmin address{font-style:normal}#xeAdmin select{font-size:12px}#xeAdmin input{font-size:12px}#xeAdmin .buttonTypeGo{padding:0;cursor:pointer}#xeAdmin .footer address{font:10px Tahoma}#xeAdmin .footer address a{color:#777e86}#xeAdmin .gnb li a{color:#777e86;font-size:11px;font-family:Tahoma}#adminLang li a{font-size:12px}#xeAdmin .lnb li,#xeAdmin .lnb li a{color:#fff;font-size:14px;font-family:Dotum, Tahoma}#xeAdmin .path{color:#ccc;font-size:11px}#xeAdmin .path a{color:#767676;font-size:11px;font-family:Dotum, Sans-serif}.e1 .navigation li a{color:#000;text-decoration:none}.e1 .navigation li ul li a{color:#767676}.e1 .navigation li ul li.active a{font-weight:bold;color:#666}.e2 .section h2.xeAdmin{font-size:12px;margin:0;padding:0}.e2 .section h2.xeAdmin .date{font:Tahoma;color:#999}.e2 table tbody th{font-weight:normal;font-family:Dotum}.e2 .notice li a{color:#666}.e2 .notice li .date{color:#767676;font:10px Tahoma}.localNavigation li a{text-decoration:none !important;color:#666}.localNavigation li.active a{font-weight:bold;color:#1e6aac}#xeAdmin h2.xeAdmin{font-size:12px}#xeAdmin h3.xeAdmin{font-size:12px;color:#666;margin:0;padding:0}#xeAdmin p.summary{color:#767676}#xeAdmin p.summary a{text-decoration:none;color:#767676}#xeAdmin p.summary.red{color:#A54D4D}#xeAdmin p.summary.red a{text-decoration:none;color:#A54D4D}#xeAdmin div.infoText{color:#767676}#xeAdmin div.infoText p.warning{margin:0 0 10px 0;padding:0 0 0 25px;background:url(../img/iconWarning.gif) no-repeat left top}#xeAdmin div.infoText p.update{margin:0 0 10px 0;padding:0 0 0 25px;background:url(../img/iconRefresh.gif) no-repeat left top}#xeAdmin .pagination{padding:15px 0;margin:0;text-align:center;clear:both}#xeAdmin .pagination *{margin:0;padding:0}#xeAdmin .pagination img{border:0}#xeAdmin .pagination a,#xeAdmin .pagination strong{position:relative;display:inline-block;text-decoration:none;line-height:normal;color:#333;font-family:Tahoma, Sans-serif;vertical-align:middle}#xeAdmin .pagination a:hover,#xeAdmin .pagination a:active,#xeAdmin .pagination a:focus{background-color:#f4f4f4 !important}#xeAdmin .pagination strong{color:#ff6600 !important}#xeAdmin .pagination a.prev,#xeAdmin .pagination a.prevEnd,#xeAdmin .pagination a.next,#xeAdmin .pagination a.nextEnd{font-weight:normal !important;border:none !important;margin:0 !important;white-space:nowrap}#xeAdmin .pagination.a1 a,#xeAdmin .pagination.a1 strong{margin:0 -4px;padding:1px 10px 1px 8px;border:none;border-left:1px solid #ccc;border-right:1px solid #ddd;font-weight:bold;font-size:12px;background:#fff}#xeAdmin .pagination.a1 a.prev{padding-left:10px;background:#fff url(../img/arrowPrevA1.gif) no-repeat left center}#xeAdmin .pagination.a1 a.prevEnd{padding-left:15px;background:#fff url(../img/arrowPrevEndA1.gif) no-repeat left center}#xeAdmin .pagination.a1 a.next{padding-right:10px;background:#fff url(../img/arrowNextA1.gif) no-repeat right center}#xeAdmin .pagination.a1 a.nextEnd{padding-right:15px;background:#fff url(../img/arrowNextEndA1.gif) no-repeat right center}#xeAdmin .pagination.a2 a,#xeAdmin .pagination.a2 strong{margin:0 -4px;padding:0 10px 0 8px;font-weight:bold;font-size:11px;border:none;border-left:1px solid #ddd;border-right:1px solid #ccc;background:#fff}#xeAdmin .pagination.a2 a.prev{padding-left:10px;background:#fff url(../img/arrowPrevA1.gif) no-repeat left center}#xeAdmin .pagination.a2 a.prevEnd{padding-left:15px;background:#fff url(../img/arrowPrevEndA1.gif) no-repeat left center}#xeAdmin .pagination.a2 a.next{padding-right:10px;background:#fff url(../img/arrowNextA1.gif) no-repeat right center}#xeAdmin .pagination.a2 a.nextEnd{padding-right:15px;background:#fff url(../img/arrowNextEndA1.gif) no-repeat right center}#xeAdmin .pagination.b1 a,#xeAdmin .pagination.b1 strong{margin:0 -2px;padding:2px 8px;font-weight:bold;font-size:12px}#xeAdmin .pagination.b1 a.prev,#xeAdmin .pagination.b1 a.prevEnd{padding-left:16px;background:url(../img/arrowPrevB1.gif) no-repeat left center}#xeAdmin .pagination.b1 a.next,#xeAdmin .pagination.b1 a.nextEnd{padding-right:16px;background:url(../img/arrowNextB1.gif) no-repeat right center}#xeAdmin .pagination.b2 a,#xeAdmin .pagination.b2 strong{margin:0 -2px;padding:2px 6px;font-size:11px}#xeAdmin .pagination.b2 a.prev,#xeAdmin .pagination.b2 a.prevEnd{padding-left:12px;background:url(../img/arrowPrevB1.gif) no-repeat left center}#xeAdmin .pagination.b2 a.next,#xeAdmin .pagination.b2 a.nextEnd{padding-right:12px;background:url(../img/arrowNextB1.gif) no-repeat right center}#xeAdmin .pagination.c1 a,#xeAdmin .pagination.c1 strong{margin:0 -2px;padding:2px 4px;font-size:12px}#xeAdmin .pagination.c1 a.prev,#xeAdmin .pagination.c1 a.prevEnd,#xeAdmin .pagination.c1 a.next,#xeAdmin .pagination.c1 a.nextEnd{display:inline-block;width:13px;height:14px;padding:3px 4px;margin:0}#xeAdmin .pagination.c1 a.prev,#xeAdmin .pagination.c1 a.prevEnd{background:url(../img/arrowPrevC1.gif) no-repeat center}#xeAdmin .pagination.c1 a.next,#xeAdmin .pagination.c1 a.nextEnd{background:url(../img/arrowNextC1.gif) no-repeat center}#xeAdmin .pagination.c1 a.prev span,#xeAdmin .pagination.c1 a.prevEnd span,#xeAdmin .pagination.c1 a.next span,#xeAdmin .pagination.c1 a.nextEnd span{position:absolute;width:0;height:0;overflow:hidden;visibility:hidden}#xeAdmin .pagination.c2 a,#xeAdmin .pagination.c2 strong{margin:0 -2px;padding:2px 4px;font-size:11px}#xeAdmin .pagination.c2 a.prev,#xeAdmin .pagination.c2 a.prevEnd,#xeAdmin .pagination.c2 a.next,#xeAdmin .pagination.c2 a.nextEnd{display:inline-block;width:13px;height:14px;padding:3px 4px;margin:0}#xeAdmin .pagination.c2 a.prev,#xeAdmin .pagination.c2 a.prevEnd{background:url(../img/arrowPrevC1.gif) no-repeat center}#xeAdmin .pagination.c2 a.next,#xeAdmin .pagination.c2 a.nextEnd{background:url(../img/arrowNextC1.gif) no-repeat center}#xeAdmin .pagination.c2 a.prev span,#xeAdmin .pagination.c2 a.prevEnd span,#xeAdmin .pagination.c2 a.next span,#xeAdmin .pagination.c2 a.nextEnd span{position:absolute;width:0;height:0;overflow:hidden;visibility:hidden}#xeAdmin .open{display:block !important}#xeAdmin h1.xeAdmin{float:left;white-space:nowrap;margin:0;padding:0}#xeAdmin caption{text-align:left}#xeAdmin button{cursor:pointer}#xeAdmin hr{display:none}#xeAdmin fieldset{border:0}#xeAdmin fieldset legend{font-size:0;line-height:0;position:absolute;visibility:hidden}#xeAdmin .section{margin-bottom:20px}#xeAdmin .buttonArea{text-align:center;padding:15px 0}#xeAdmin button.text{background:none;border:0;color:#0000ee}#xeAdmin img.graphHr{height:5px;vertical-align:middle}#xeAdmin .ac{text-align:center}#xeAdmin .al{text-align:left}#xeAdmin .ar{text-align:right}.crossTable{width:100%;border:0;margin:0 0 20px 0;padding:0}.crossTable th div{white-space:nowrap}.crossTable th,.crossTable td{border:0;padding:5px 10px;vertical-align:top}.crossTable th{background:#f4f4f4}.crossTable thead th{border-top:2px solid #cfcfcf;border-bottom:1px solid #e5e5e5;background-image:url(../img/lineVrText.gif);background-repeat:no-repeat;background-position:left center}.crossTable thead th:first-child{background-image:none}.crossTable tbody th{border-bottom:1px solid #e5e5e5;text-align:left}.crossTable td{border-bottom:1px solid #f0f0f0}.colTable{width:100%;border:0;margin:0 0 20px 0;padding:0}.colTable th div{white-space:nowrap}.colTable tr.bg0{background:#fff}.colTable tr.bg1{background:#f8f8f8}.colTable th,.colTable td{border:0;padding:5px 10px;vertical-align:top}.colTable th{border-top:2px solid #cfcfcf;border-bottom:1px solid #e5e5e5;background:#f4f4f4;background-image:url(../img/lineVrText.gif);background-repeat:no-repeat;background-position:left center}.colTable th:first-child{background-image:none}.colTable td{border-bottom:1px solid #f0f0f0}.rowTable{width:100%;border:0;border-top:2px solid #cfcfcf;margin:0 0 20px 0;padding:0}.rowTable th div{white-space:nowrap}.rowTable tr.bg0{background:#fff}.rowTable tr.bg1{background:#f8f8f8}.rowTable th,.rowTable td{border:0;padding:5px 10px;text-align:left;vertical-align:top}.rowTable th{background:#f4f4f4}.rowTable tbody th{border-bottom:1px solid #e5e5e5}.rowTable td{border-bottom:1px solid #f0f0f0}.rowTable th.button,.colTable th.button,.crossTable th.button{text-align:right}.rowTable td.alert,.colTable td.alert,.crossTable td.alert{color:red !important}.rowTable td.alert a,.colTable td.alert a,.crossTable td.alert a{text-decoration:none;color:red !important}.colTable td.wide,.rowTable td.wide,.crossTable td.wide{width:100%}.e1 .navigation{list-style:none;position:relative;*zoom:1;margin:0;padding:0;border-bottom:1px solid #c2c2c2}.e1 .navigation ul{list-style:none;position:relative;*zoom:1;margin:0;padding:0}.e1 .navigation li{list-style:none;position:relative;*zoom:1;margin:0;padding:0;background-color:#f7f7f7}.e1 .navigation li a.parent{border-top:1px solid #c2c2c2;display:block;padding:10px 20px 10px 35px;background-image:url(../img/iconNavigation.gif);background-repeat:no-repeat;background-position:160px -35px;font-weight:bold;color:#888;text-decoration:none}.e1 .navigation li.close a.parent{background-position:160px 13px;border-bottom:none}#module_service{background-image:url(../img/mIcon.gif);background-repeat:no-repeat;background-position:10px 10px}#module_member{background-image:url(../img/mIcon.gif);background-repeat:no-repeat;background-position:10px -40px}#module_content{background-image:url(../img/mIcon.gif);background-repeat:no-repeat;background-position:10px -90px}#module_construction{background-image:url(../img/mIcon.gif);background-repeat:no-repeat;background-position:10px -140px}#module_utility{background-image:url(../img/mIcon.gif);background-repeat:no-repeat;background-position:10px -190px}#module_accessory{background-image:url(../img/mIcon.gif);background-repeat:no-repeat;background-position:10px -240px}#module_system{background-image:url(../img/mIcon.gif);background-repeat:no-repeat;background-position:10px -290px}.e1 .navigation li ul{border-top:1px solid #d2d2d2;margin:0;padding:5px 0;background-color:#fff}.e1 .navigation li ul li{margin:5px 0;padding:0 10px 0 35px;background-color:#fff}.e1 .navigation li.close ul{display:none}.e1 .navigation li ul li a{text-decoration:none}.e1 .navigation li ul li a:hover{font-weight:bold;text-decoration:none;letter-spacing:-1px}.e1 .navigation li ul li.active a{color:#ea3f22;letter-spacing:-1px}.e2 .section{margin-left:20px}.e2 .section h4.xeAdmin{margin:10px 0 0 0;padding:0 0 0 25px}.e2 .section .date{background:url(../img/lineVrText.gif) no-repeat left center;font-size:9px;padding-left:5px}.e2 .section .contentBox{padding:10px 0;margin:0 0 20px 0;border-bottom:1px solid #ccc}.e2 table tbody td{text-align:left;word-break:break-all;-ms-word-break:break-all}#xeAdmin .localNavigation{position:relative;border-bottom:1px solid #ccc;*zoom:1;margin:0 0 40px 0;padding:0;font-size:12px}#xeAdmin .localNavigation:after{content:"";display:block;clear:both}#xeAdmin .localNavigation ul{display:none;position:absolute;top:40px;left:0;list-style:none;margin:0;padding:0;overflow:hidden}#xeAdmin .localNavigation li{list-style:none;float:left;margin:0 -1px 0 0;padding:0;background:#fff}#xeAdmin .localNavigation li a{float:left;padding:7px 15px 0 15px;height:18px;border:1px solid #ddd;border-bottom:none;background:url(../img/bgTab.gif) repeat-x;text-decoration:none !important;color:#666}#xeAdmin .localNavigation li.on{margin-bottom:-1px}#xeAdmin .localNavigation li.on ul{display:block}#xeAdmin .localNavigation li.on a{height:19px;background:none;font-weight:bold}#xeAdmin .localNavigation li li{position:relative;left:-1px;display:inline;float:none;margin:0;padding:0 6px 0 10px;border-left:1px solid #ddd}#xeAdmin .localNavigation li li a{font-weight:normal !important;float:none;padding:0;height:auto;border:0;background:none}#xeAdmin .localNavigation li li.on a{font-weight:bold !important}#xeAdmin h3.xeAdmin{border-bottom:2px solid #ccc;padding:5px 0 5px 25px;margin:0 0 10px 0;background:url(../img/iconH2.gif) no-repeat left center}#xeAdmin h4.xeAdmin{padding:5px 0 5px 20px;background:url(../img/iconH3.gif) no-repeat left center}#xeAdmin h4.xeAdmin span.vr{font-size:11px;color:#AAA}#xeAdmin h4.xeAdmin a.view{font-size:11px;font-family:vertical;color:#777e86}#xeAdmin p.summary,div.infoText{margin:0 0 15px 0;line-height:1.6}.layer{display:none;position:absolute;border:2px solid #777;margin:0;font-size:12px;background:#fff}.layer *{margin:0;padding:0;font-size:12px}.layer h4.xeAdmin{font-size:14px !important;font-family:Dotum;background:#f4f4f4 !important;padding:8px 30px 8px 15px !important;letter-spacing:-1px !important}.layer .xButton{position:absolute;top:9px;right:9px;width:15px;height:14px;background-color:transparent;background:url(../img/buttonClose.gif) no-repeat;border:0;cursor:pointer;overflow:hidden}.layer .xButton span{position:relative;z-index:-1;visibility:hidden}.layer .layerBody{margin:15px}.boxModelControler select{margin-bottom:3px}.boxModelControler .inputText{border:1px solid #ccc;padding:2px 3px;margin-bottom:3px;vertical-align:top;*margin-top:-1px}.boxModelControler .inputCheck{width:13px;height:13px;vertical-align:middle}.boxModelControler .layerBody{margin:15px}.boxModelControler .preview{overflow:hidden;margin-bottom:20px}.boxModelControler .dragAble{position:relative;padding:15px 0 0 15px;background:url(../img/bgRuler.gif) no-repeat;*zoom:1;cursor:move}.boxModelControler .dragAble .prevGrid{position:relative;margin:-1px;background:url(../img/bgGrid.gif) 0 0;border:1px solid #000;*zoom:1}.boxModelControler .dragAble .prevBox{position:relative}.boxModelControler .dragAble .prevBox .prevContent{position:relative}.boxModelControler .boxModelTable{width:100%;border:0;border-bottom:1px solid #ddd;margin:0;padding:0}.boxModelControler .boxModelTable th,.boxModelControler .boxModelTable td{border:0;border-top:1px solid #ddd;vertical-align:top;padding:5px 10px;text-align:left}.boxModelControler .boxModelTable th{height:50px;*height:40px;background:#f1f1f1;padding-left:70px;background-repeat:no-repeat;background-position:10px 10px}.boxModelControler .boxModelTable th.width{background-image:url(../img/exWidth.gif)}.boxModelControler .boxModelTable th.margin{background-image:url(../img/exMargin.gif)}.boxModelControler .boxModelTable th.padding{background-image:url(../img/exPadding.gif)}.boxModelControler .boxModelTable th.border{background-image:url(../img/exBorder.gif)}.boxModelControler .boxModelTable th.bgColor{background-image:url(../img/exBgColor.gif)}.boxModelControler .boxModelTable th.bgImage{background-image:url(../img/exBgImage.gif)}.boxModelControler .boxModelTable th sup{font-weight:normal;font-size:11px;font-family:Dotum;color:#999}.boxModelControler .boxModelTable td dl.iList dt{display:inline;position:relative;top:3px}.boxModelControler .boxModelTable td dl.iList dd{display:inline}.boxModelControler .boxModelTable td dl.dList dt{float:left;clear:left;margin-right:5px;padding-top:3px}.boxModelControler .boxModelTable td dl.dList dd{clear:right}.boxModelControler .colorPicker{position:relative;display:inline;vertical-align:top}.boxModelControler .colorPicker .picker{position:relative;top:2px;left:-22px;width:16px;height:16px;border:1px solid #ccc;background-color:transparent;background-position:right top;cursor:pointer;vertical-align:top}.boxModelControler .colorPicker .picker span{font-size:0;line-height:0;z-index:-1;visibility:hidden}.boxModelControler .colorPicker .palette{position:absolute;top:0px;left:0;display:none;width:272px;height:64px;list-style:none;margin:0;padding:1px 0 0 1px;border:1px solid #ccc;background:#fff;overflow:hidden}.boxModelControler .colorPicker .palette.open{display:block}.boxModelControler .colorPicker .palette li{float:left;margin:0 1px 1px 0;font-size:0;line-height:0}.boxModelControler .colorPicker .palette li button{width:15px;height:15px;border:0;cursor:pointer}.boxModelControler .colorPicker .palette li button span{position:relative;z-index:-1;font-size:0;line-height:0;visibility:hidden}.boxModelControler .colorPicker .palette li button.transparent{background:url(../img/bgNone.gif) no-repeat right top;border:1px solid #ddd}.boxModelControler .borderDetach{display:none}.boxModelControler .borderDetach.open{display:block}.boxModelControler .buttonArea{padding:15px 0 0 0;text-align:center}#popup_content{border:2px solid #777;margin:0;font-size:12px;background:#fff;position:relative}#popup_content .xButton{position:absolute;top:9px;right:18px;width:15px;height:14px;padding:0;background-color:transparent;background:url(../img/buttonClose.gif) no-repeat;border:0;cursor:pointer;overflow:hidden}#popup_content .xButton span{position:relative;z-index:-1;visibility:hidden}#popup_content *{font-size:12px}#popHeadder h4.xeAdmin,#popHeadder h1.xeAdmin,#popHeadder h3.xeAdmin{font-size:14px !important;font-family:Dotum !important;background:#f4f4f4 !important;padding:8px 30px 8px 15px !important;letter-spacing:-1px !important;border:none !important;margin:0 !important}#popHeader h4.xeAdmin,#popHeader h1.xeAdmin,#popHeader h3.xeAdmin{font-size:14px !important;font-family:Dotum !important;background:#f4f4f4 !important;padding:8px 30px 8px 15px !important;letter-spacing:-1px !important;border:none !important;margin:0 !important}#popHeader,#popBody,#popFooter{position:relative;*zoom:1;overflow:hidden}#popBody,#popHistoryBody{margin:15px !important}#popFooter{padding:10px 0 0 0;height:28px;text-align:center;background:#f4f4f4}#popHeader.wide{width:600px}.adminTable{width:100%;border:1px solid #EEE;border-bottom:none;border-right:none;margin-bottom:15px}.adminTable caption{background:url("../img/n_caption_head.gif") no-repeat left top;padding:8px 0 5px 30px;text-align:left;font-weight:bold !important;color:#FFFFFF !important;background-color:#888 !important;border-bottom:1px solid #FFFFFF;font-size:12px !important}.adminTable thead tr th div{text-align:center}.adminTable thead tr th{background-color:#AAA;color:#FFFFFF !important}.adminTable tr th{background-color:#FFFFFF;padding:6px;font-weight:bold;text-align:left;color:#666;border-right:1px solid #EEE;border-bottom:1px solid #EEE}.adminTable tr.row2 th{background-color:#F3F3F3}.adminTable tr th{width:10px}.adminTable tr th div{white-space:nowrap;margin:0 5px}.adminTable tr th select{height:20px}.adminTable tr th.wide{width:100%}.adminTable tr th.half_wide{width:50%}.adminTable tr th.quarter_wide{width:25%}.adminTable tr td.wide{width:100%}.adminTable tr td{background-color:#FFFFFF;white-space:normal;font-weight:normal;text-align:left;color:#222222;border-bottom:1px solid #EEE;border-right:1px solid #EEE;padding:4px 6px 4px 6px}.adminTable tr.row2 td{background-color:#F3F3F3}.adminTable tr a{color:#222222;text-decoration:none}.adminTable tr a:hover{color:#3D83B8}.adminTable tr td.nowrap{white-space:nowrap !important}.adminTable tr td.alert,.adminTable tr td.alert a{color:red}.adminTable tr td.number{font-size:8pt;font-family:tahoma;color:#27536C}.adminTable tr td.date,.adminTable tr td span.date{font-size:8pt;font-family:tahoma;color:#666666}.adminTable tr td.center{text-align:center}.adminTable tr td.right{text-align:right}.adminTable tr td.paper{background:transparent url("../img/n_paper_bullet.gif") no-repeat 6px 8px;padding-left:20px}.adminTable tr.row2 td.paper{background:#F3F3F3 url("../img/n_paper_bullet.gif") no-repeat 6px 8px;padding-left:20px}.adminTable tr td.circle{background:#FFFFFF url("../img/n_circle_bullet.gif") no-repeat 6px 8px;padding-left:20px}.adminTable tr.row2 td.circle{background:#F3F3F3 url("../img/n_circle_bullet.gif") no-repeat 6px 8px;padding-left:20px}.adminTable tr td strong.alert{color:red}.adminTable tr td p{padding:0;margin:5px 0 0 5px;color:#777777}.adminTable tr td p a{color:#9F875F;font-weight:bold;text-decoration:underline}.adminTable tr td.modify a,.adminTable tr td.delete a,.adminTable tr td.copy a,.adminTable tr td.setup a,.adminTable tr td.activated a,.adminTable tr td.deactivated a,.adminTable tr td.moveupdown a,.adminTable tr td.selectAll a,.adminTable tr td.deSelectAll a,.adminTable tr td.view a{margin:0 auto}.adminTable tr td.modify a{width:14px;height:14px;overflow:hidden;display:block;font-size:1px;line-height:100px;background:url("../img/n_icon_modify.gif") no-repeat left top}.adminTable tr td.delete a{width:14px;height:14px;overflow:hidden;display:block;font-size:1px;line-height:100px;background:url("../img/n_icon_delete.gif") no-repeat left top}.adminTable tr td.copy a{width:16px;height:16px;overflow:hidden;display:block;font-size:1px;line-height:100px;background:url("../img/n_icon_copy.gif") no-repeat left top}.adminTable tr td.view a{width:14px;height:14px;overflow:hidden;display:block;font-size:1px;line-height:100px;background:url("../img/n_icon_view.gif") no-repeat left top}.adminTable tr td.setup a{width:16px;height:16px;overflow:hidden;display:block;font-size:1px;line-height:100px;background:url("../img/n_setup.gif") no-repeat left top}.adminTable tr td.activated a{width:16px;height:16px;overflow:hidden;display:block;font-size:1px;line-height:100px;background:url("../img/n_light_on.gif") no-repeat left top}.adminTable tr td.deactivated a{width:16px;height:16px;overflow:hidden;display:block;font-size:1px;line-height:100px;background:url("../img/n_light_off.gif") no-repeat left top}.adminTable tr td.selectAll a{width:16px;height:16px;overflow:hidden;display:block;font-size:1px;line-height:100px;background:url("../img/n_icon_select_all.gif") no-repeat left top}.adminTable tr td.deSelectAll a{width:16px;height:16px;overflow:hidden;display:block;font-size:1px;line-height:100px;background:url("../img/n_icon_remove.gif") no-repeat left top}.adminTable tr td.moveupdown a.up{float:left;width:14px;height:14px;overflow:hidden;display:block;font-size:1px;line-height:100px;background:url("../img/n_button_up.gif") no-repeat left top;margin-right:5px}.adminTable tr td.moveupdown a.down{float:left;width:14px;height:14px;overflow:hidden;display:block;font-size:1px;line-height:100px;background:url("../img/n_button_down.gif") no-repeat left top}.adminTable tr td.blue,.adminTable tr td.blue a{color:blue}.adminTable tr td.red,.adminTable tr td.red a{color:red}.fullWidth{width:80%}.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}#search_nav{border:3px solid #ccc;margin:0;padding:3px}#search_nav input{border:0;height:17px;width:140px;padding:3px 0 0 4px;vertical-align:middle}#search_nav button{padding:0;border:0;height:17px;width:17px;background:transparent url(../img/buttonSearch.gif) no-repeat center;vertical-align:middle}#search_nav button.close{background:transparent url(../img/buttonClose.gif) no-repeat center}.e1 .section ._result{list-style:none;margin:10px 0 0 0;padding:0}.e1 .section ._result li{margin:0}.e1 .section ._result a{display:block;color:#767676;padding:4px 5px 4px 10px}.e1 .section ._result a:hover,.e1 .section ._result a:active,.e1 .section ._result a:focus{background:#f8f8f8} \ No newline at end of file diff --git a/modules/admin/tpl/img/bgFooter.gif b/modules/admin/tpl/img/bgFooter.gif deleted file mode 100755 index d49c3c5f830630965d068b6cb01c792954ae9a02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54 zcmZ?wbhEHbWMoibn8?6zuMfo4bmuo670gsF*k@8rn;1TPhhj$m&{aSh%U0Ix861NoiR~XqYiz0L7myU@;vK z39^%cRqsKAjA!aB-(73MZaWzqITLK_T2b=W=7GIKSAc|uSD#Q%(aMapc>(Pq4gw-P HiVW5O_RuPL diff --git a/modules/admin/tpl/img/btnPlusMinus.gif b/modules/admin/tpl/img/btnPlusMinus.gif new file mode 100644 index 0000000000000000000000000000000000000000..d413d4e24ef7ab7598ac45a6fc73442fbd5eef7d GIT binary patch literal 91 zcmZ?wbhEHbo{(v2)zMA|9@bCL77EN Rmxrg&%n&nOS8o;uYXCHODK!89 literal 0 HcmV?d00001 diff --git a/modules/admin/tpl/img/iconStarRating.gif b/modules/admin/tpl/img/iconStarRating.gif new file mode 100644 index 0000000000000000000000000000000000000000..4f901e9059cde84cc4ad9488202667bd6758dd9d GIT binary patch literal 1330 zcmV-21jGQ4-qP+WMe_w6wIbv9b7{f~2IR`LLS!s*(3>KL21N(9qD`-QCE@$mrb$(X#l^+X&(HYy`1!V>(b3VY ztgQa?@6OK7_4W1o!m-B2#>dCUqN1Yz;Lrb~dH0WL`LCJ$%)0za4EU#w|86_~v5NXf z3IC2}{Myj?cTWCgFaL&H|ASSaprGgH=l{N%|Eq}qe@6OfFYD{;|6d~iwwL*MPWN(0 zudlEF{rmrvX#R*%`oF9Ak8AtPz5C9<{Lj9bnVJ9D$p5#Psi~>_)ye$X&HvoX|G}pF z!mj_EcldHf!NI}#h-3e7H20*6`Fc_PTp!id)w8p+|MTqmq=^0O=l6V6{-1pP-P7FM z-2d0a_i{x4=-v2qN&VQ%{A4Nn#kBi_TJG-d|7tbj;^O~H3;+NBA^8LW004ggEC2ui z08aoM000O7fPaF6e;x~jh=_)XjD?4dijRN5z=$6nOC%EpBv5@GAIi+m(9+b_&Ck)( z)r8C4+2GvR-`jsPYb^^4Ehiu#1O^8N2CVGv@bdKb`1G}V7jIs@d->K4>}L>Q!hHn& z9Sq1~L4*SYP-xi55d?`oe=1(g$g$(ckQOm&EUCdGNRcX8wmb=wBukecKtRC2vnNjh zCrk*+xzlG)ph7R{GC`_e2&l=xwQC9yFbHMc+Li0qu!F{yH49d( z*0mY`&blRAR_>q>Gy3S=O9m|=ynFfjy_+|1pT3Cz8%B&sabU)S`i$5>xiSbwk}F%r zJX!OG%ZW0328~FxX3~R3^a)|afr$_yL@-j#+BIz1iD3^@V> zjF7>iPjTbOl{0tF=y>ww&7TjlE;hQ#xs7lvp-dC6p_iLBR@F-0=k%O~9dt6KEvR#vfshS>~B( zuG!|Bagu2!nrgD?CY)mGNoSvT0xIX8b^6&x3^7E(MhysTfrJ=83_(Nzb^!1PqmDu< zDW#TTswtA+dSRB!V4N_dn10O<+;e{Z#=DKUI z1^gQ9uzwV*E3du+D=e|NK8vif(>7b}vC%FohzmDNk%SpcG~kCHIwar*A>fKjuDR%{ z%Wk;imV0ix>kiUxz3}2Yueg0s#%GxD<^ zJCiJQ&O`^D$k0XGOb8tV3=qTv7Wkk*&x1fMHPu#QEr`}rSA8`jU~@foB4vw>wF^%? o&;hYsl<`I)Y`YD&+;q47cC&HMjY!>lbI^C*cJqz*Ab|h?JLP)QIRF3v literal 0 HcmV?d00001 diff --git a/modules/admin/tpl/img/lineTree.gif b/modules/admin/tpl/img/lineTree.gif new file mode 100644 index 0000000000000000000000000000000000000000..ad659a6795b0c7818654a9ea27c62de52bd1ff88 GIT binary patch literal 727 zcmV;|0x11QNk%w1VF>{627mzofPjGi|NkNR1OWg50RSuj000090PqF?0{@JEfXk*0 z!;5TEq_W)5UiU5DH(n)mMrjvfZSsQg+R#Bo2(*!ZMb=y?d5m`Ms*DtStoYPpJO`icsxD$7di8jCxdTf2L!`^yXL z8%#WGyeaC~ioE>U9Qr(J%RKE|4Sg-$OTBH~js2}H%suX14t_3POula3j{dHG>^=`) zFVB9joV_33pZ+giKz*H}4a|p-UP5~d@hN=B5Te6~6en6dC=p{tjsF)5^7H5qBtVe@ zNfOMF%w$83ELCQ7xe;bZlm=zCr1=qNNSz~jmh^ej3DA``iw=ExG-lG7LYuB3y7Z<~ zK}M%?idyw4QmZMkdgWU4t5&68bC%tCwrAR(YlDtu`c`V(tW?F;Z3`9e*12}C>Lttf zFWkF<3ll!<*KlIQT?NZ!9M&=2#grQ>whY#?`j{+_$~`RwVtw+|n`{QCUw_pZS literal 0 HcmV?d00001 diff --git a/modules/admin/tpl/js/admin.js b/modules/admin/tpl/js/admin.js index 940112377..33a04ad21 100644 --- a/modules/admin/tpl/js/admin.js +++ b/modules/admin/tpl/js/admin.js @@ -155,3 +155,235 @@ jQuery(function($){ }); }); + +// XE UI Library +jQuery(function($){ + // Label Overlapping + var overlapLabel = $('.form li').find(':text,:password,textarea').prev('label'); + var overlapInput = overlapLabel.next(':text,:password,textarea'); + overlapLabel.css({'position':'absolute','top':'15px','left':'5px'}).parent().css('position','relative'); + overlapInput + .focus(function(){ + $(this).prev(overlapLabel).css('visibility','hidden'); + }) + .blur(function(){ + if($(this).val() == ''){ + $(this).prev(overlapLabel).css('visibility','visible'); + } else { + $(this).prev(overlapLabel).css('visibility','hidden'); + } + }) + .change(function(){ + if($(this).val() == ''){ + $(this).prev(overlapLabel).css('visibility','visible'); + } else { + $(this).prev(overlapLabel).css('visibility','hidden'); + } + }) + .blur(); + // Lined Tab Navigation + var tab_line = $('div.tab.line'); + var tab_line_i = tab_line.find('>ul>li'); + var tab_line_ii = tab_line.find('>ul>li>ul>li'); + tab_line.removeClass('jx'); + tab_line_i.find('>ul').hide(); + tab_line_i.find('>ul>li[class=active]').parents('li').attr('class','active'); + tab_line.find('>ul>li[class=active]').find('>ul').show(); + function lineTabMenuToggle(event){ + var t = $(this); + tab_line_i.find('>ul').hide(); + t.next('ul').show(); + tab_line_i.removeClass('active'); + t.parent('li').addClass('active'); + return false; + } + function lineTabSubMenuActive(){ + tab_line_ii.removeClass('active'); + $(this).parent(tab_line_ii).addClass('active'); + return false; + }; + tab_line_i.find('>a[href=#]').click(lineTabMenuToggle).focus(lineTabMenuToggle); + tab_line_ii.find('>a[href=#]').click(lineTabSubMenuActive).focus(lineTabSubMenuActive); + // Faced Tab Navigation + var tab_face = $('div.tab.face'); + var tab_face_i = tab_face.find('>ul>li'); + var tab_face_ii = tab_face.find('>ul>li>ul>li'); + tab_face.removeClass('jx'); + tab_face_i.find('>ul').hide(); + tab_face_i.find('>ul>li[class=active]').parents('li').attr('class','active'); + tab_face.find('>ul>li[class=active]').find('>ul').show(); + function faceTabMenuToggle(event){ + var t = $(this); + tab_face_i.find('>ul').hide(); + t.next('ul').show(); + tab_face_i.removeClass('active'); + t.parent('li').addClass('active'); + return false; + } + function faceTabSubMenuActive(){ + tab_face_ii.removeClass('active'); + $(this).parent(tab_face_ii).addClass('active'); + return false; + }; + tab_face_i.find('>a[href=#]').click(faceTabMenuToggle).focus(faceTabMenuToggle); + tab_face_ii.find('>a[href=#]').click(faceTabSubMenuActive).focus(faceTabSubMenuActive); + // List Tab Navigation + var tab_list = $('div.tab.list'); + var tab_list_i = tab_list.find('>ul>li'); + tab_list.removeClass('jx'); + tab_list_i.find('>ul').hide(); + tab_list.find('>ul>li[class=active]').find('>ul').show(); + tab_list.css('height', tab_list.find('>ul>li.active>ul').height()+40); + function listTabMenuToggle(event){ + var t = $(this); + tab_list_i.find('>ul').hide(); + t.next('ul').show(); + tab_list_i.removeClass('active'); + t.parent('li').addClass('active'); + tab_list.css('height', t.next('ul').height()+40); + return false; + } + tab_list_i.find('>a[href=#]').click(listTabMenuToggle).focus(listTabMenuToggle); + // Vertical Navigation + var vNav = $('div.vNav'); + var vNav_i = vNav.find('>ul>li'); + var vNav_ii = vNav.find('>ul>li>ul>li'); + vNav_i.find('>ul').hide(); + vNav.find('>ul>li>ul>li[class=active]').parents('li').attr('class','active'); + vNav.find('>ul>li[class=active]').find('>ul').show(); + function vNavToggle(event){ + var t = $(this); + if (t.next('ul').is(':hidden')) { + vNav_i.find('>ul').slideUp(100); + t.next('ul').slideDown(100); + } else if (t.next('ul').is(':visible')){ + t.next('ul').show(); + } else if (!t.next('ul').langth) { + vNav_i.find('>ul').slideUp(100); + } + vNav_i.removeClass('active'); + t.parent('li').addClass('active'); + return false; + } + vNav_i.find('>a[href=#]').click(vNavToggle).focus(vNavToggle); + function vNavActive(){ + vNav_ii.removeClass('active'); + $(this).parent(vNav_ii).addClass('active'); + return false; + }; + vNav_ii.find('>a[href=#]').click(vNavActive).focus(vNavActive); + vNav.find('>ul>li>ul').prev('a').append(''); + // Tree Navigation + var tNav = $('.tNav'); + var tNavPlus = '\'; + var modalBlurHtml = ''; + modal.appendTo('body').hide().prepend(''); + modalFg.prepend(modalCloseHtml); + var modalClose = $('.modalClose'); + modalClose.clone().appendTo(modalFg); + modalFg.prepend(modalBlurHtml); + var modalBlur = $('.modalBlur'); + modalBlur.clone().appendTo(modalFg); + modalAnchor.click(function(){ + htmlBody.css({'width':'100%','height':'100%'}); + modal.fadeToggle().toggleClass('modalActive'); + modalFg.find('>.modalClose:first').focus(); + return false; + }); + $(document).keydown(function(event){ + if(event.keyCode != 27) return true; + htmlBody.removeAttr('style'); + modal.fadeOut().removeClass('modalActive'); + modalAnchor.focus(); + return false; + }); + $('.modal>.bg, .modalClose').click(function(event){ + htmlBody.removeAttr('style'); + modal.fadeOut().removeClass('modalActive'); + modalAnchor.focus(); + return false; + }); + $('.modalBlur').focusin(function(event){ + modalClose.click(); + }); + // XEUI container & codeBlock Toggle + var container = $('.container'); + container.hide().before(''); + $('.itemToggle').click(function(){ + $(this).next(container).stop().slideToggle(100); + }); + var codeBlock = $('.codeBlock'); + codeBlock.hide().before(''); + $('.codeToggle').click(function(){ + $(this).next(codeBlock).slideToggle(100); + }); +}); diff --git a/modules/install/lang/ko.lang.php b/modules/install/lang/ko.lang.php index 5ec337b13..cf69446f3 100644 --- a/modules/install/lang/ko.lang.php +++ b/modules/install/lang/ko.lang.php @@ -222,7 +222,7 @@ EndOfLicense; $lang->about_optimizer = 'Optimizer를 사용하면 다수의 CSS/JS파일을 통합/압축 전송하여 매우 빠르게 사이트 접속이 가능하게 합니다.
        다만 CSS나 JS에 따라서 문제가 생길 수 있습니다. 이때는 Optimizer 비활성화 하시면 정상적인 동작은 가능합니다.'; $lang->use_rewrite = '짧은 주소 사용'; $lang->use_sso = 'SSO 사용'; - $lang->about_rewrite = '

        이 기능을 사용하면 http://yourdomain/?document_srl=123 과 같이 복잡한 주소를 http://yourdomain/123 과 같이 간단하게 줄일 수 있습니다. 이 기능을 사용하려면 웹 서버에서 rewrite_mod를 지원해야 합니다. 웹 서버에서 rewrite_mod를 지원하는지 여부는 서버 관리자에게 문의하세요.

        '; + $lang->about_rewrite = '이 기능을 사용하면 http://yourdomain/?document_srl=123 과 같이 복잡한 주소를 http://yourdomain/123 과 같이 간단하게 줄일 수 있습니다. 이 기능을 사용하려면 웹 서버에서 rewrite_mod를 지원해야 합니다. 웹 서버에서 rewrite_mod를 지원하는지 여부는 서버 관리자에게 문의하세요.'; $lang->time_zone = '표준 시간대'; $lang->about_time_zone = '서버의 설정시간과 사용하려는 장소의 시간이 차이가 날 경우 표준 시간대를 지정하면 표시되는 시간을 지정된 곳의 시간으로 사용하실 수 있습니다.'; $lang->qmail_compatibility = 'Qmail 호환'; From 2cca2a79135e249685ccab7edd53edc4ba606c5c Mon Sep 17 00:00:00 2001 From: ovclas Date: Mon, 30 May 2011 09:31:27 +0000 Subject: [PATCH 0103/1372] #19790379 agreement form added before install, session handeler not use db git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8405 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/context/Context.class.php | 2 +- modules/install/conf/module.xml | 1 + modules/install/install.controller.php | 20 ++++++++++++++++++++ modules/install/lang/en.lang.php | 2 ++ modules/install/lang/es.lang.php | 13 ++++++++++++- modules/install/lang/fr.lang.php | 14 ++++++++++++-- modules/install/lang/jp.lang.php | 19 +++++++++++++++++-- modules/install/lang/ko.lang.php | 2 ++ modules/install/lang/ru.lang.php | 14 ++++++++++++-- modules/install/lang/tr.lang.php | 14 ++++++++++++-- modules/install/lang/vi.lang.php | 14 ++++++++++++-- modules/install/lang/zh-CN.lang.php | 12 ++++++++++++ modules/install/lang/zh-TW.lang.php | 12 ++++++++++++ modules/install/tpl/check_env.html | 1 - modules/install/tpl/filter/introduce.xml | 10 ++++++++++ modules/install/tpl/introduce.html | 10 +++++++--- modules/install/tpl/js/install_admin.js | 6 ++++++ 17 files changed, 150 insertions(+), 16 deletions(-) create mode 100644 modules/install/tpl/filter/introduce.xml diff --git a/classes/context/Context.class.php b/classes/context/Context.class.php index 10ece000d..1c30c6fe0 100644 --- a/classes/context/Context.class.php +++ b/classes/context/Context.class.php @@ -120,7 +120,7 @@ class Context { $this->loadLang(_XE_PATH_.'modules/module/lang'); // set session handler - if($this->db_info->use_db_session != 'N') { + if(Context::isInstalled() && $this->db_info->use_db_session != 'N') { $oSessionModel = &getModel('session'); $oSessionController = &getController('session'); session_set_save_handler( diff --git a/modules/install/conf/module.xml b/modules/install/conf/module.xml index 301a407b0..0b055f111 100644 --- a/modules/install/conf/module.xml +++ b/modules/install/conf/module.xml @@ -10,6 +10,7 @@ + diff --git a/modules/install/install.controller.php b/modules/install/install.controller.php index 29a8d90ee..0109833f3 100644 --- a/modules/install/install.controller.php +++ b/modules/install/install.controller.php @@ -22,6 +22,26 @@ $this->etc_tmp_config_file = _XE_PATH_.'files/config/tmpEtc.config.php'; } + /** + * @brief LGPL, Enviroment gathering agreement + **/ + function procInstallAgreement() + { + $requestVars = Context::gets('lgpl_agree', 'enviroment_gather'); + + /*$buff = '%s = '%s';\n", 'lgpl_agree', $requestVars->lgpl_agree); + $buff .= sprintf("\$agreement->%s = '%s';\n", 'enviroment_gather', $requestVars->enviroment_gather); + $buff .= "?>"; + + $this->db_tmp_config_file = _XE_PATH_.'files/config/tmpDB.config.php'; + FileHandler::writeFile(_XE_PATH_.'files/config/agreement', $buff);*/ + $_SESSION['lgpl_agree'] = $requestVars->lgpl_agree; + $_SESSION['enviroment_gather'] = $requestVars->enviroment_gather; + + return new Object(0, 'success'); + } + /** * @brief division install step... DB Config temp file create **/ diff --git a/modules/install/lang/en.lang.php b/modules/install/lang/en.lang.php index ef992a007..6e5a36f84 100644 --- a/modules/install/lang/en.lang.php +++ b/modules/install/lang/en.lang.php @@ -157,6 +157,8 @@ Each version is given a distinguishing version number. If the Library specifies END OF TERMS AND CONDITIONS EndOfLicense; + $lang->lgpl_agree = 'GNU 약소 일반 공중 사용 허가서(LGPL v2) 동의'; + $lang->enviroment_gather = '설치 환경 수집 동의'; $lang->install_progress_menu = array( 'agree'=>'Acceptance of terms', 'condition'=>'Check the installation conditions', diff --git a/modules/install/lang/es.lang.php b/modules/install/lang/es.lang.php index c33097996..f55527e95 100644 --- a/modules/install/lang/es.lang.php +++ b/modules/install/lang/es.lang.php @@ -154,7 +154,17 @@ Each version is given a distinguishing version number. If the Library specifies END OF TERMS AND CONDITIONS EndOfLicense; - + $lang->lgpl_agree = 'GNU 약소 일반 공중 사용 허가서(LGPL v2) 동의'; + $lang->enviroment_gather = '설치 환경 수집 동의'; + $lang->install_progress_menu = array( + 'agree'=>'라이선스 동의', + 'condition'=>'설치 조건 확인', + 'ftp'=>'FTP 정보 입력', + 'dbSelect'=>'DB 선택', + 'dbInfo'=>'DB 정보 입력', + 'configInfo'=>'환경 설정', + 'adminInfo'=>'관리자 정보 입력' + ); $lang->install_condition_title = "Por favor chequee los requerimientos de la instalación."; $lang->install_checklist_title = array( @@ -235,6 +245,7 @@ EndOfLicense; $lang->msg_install_completed = "Instalación finalizada.\n Muchas gracias."; $lang->msg_install_failed = "Ha ocurrido un error al crear el archivo de instalación."; $lang->ftp_get_list = "Get List"; + $lang->msg_license_agreement = 'GNU 약소 일반 공중 사용 허가서(LGPL v2) 동의'; $lang->msg_read_all = '전문 읽기'; $lang->msg_license_agreement_desc = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; $lang->msg_license_agreement_alert = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; diff --git a/modules/install/lang/fr.lang.php b/modules/install/lang/fr.lang.php index 31ac41553..ed59db7ea 100644 --- a/modules/install/lang/fr.lang.php +++ b/modules/install/lang/fr.lang.php @@ -155,9 +155,18 @@ Each version is given a distinguishing version number. If the Library specifies END OF TERMS AND CONDITIONS EndOfLicense; - + $lang->lgpl_agree = 'GNU 약소 일반 공중 사용 허가서(LGPL v2) 동의'; + $lang->enviroment_gather = '설치 환경 수집 동의'; + $lang->install_progress_menu = array( + 'agree'=>'라이선스 동의', + 'condition'=>'설치 조건 확인', + 'ftp'=>'FTP 정보 입력', + 'dbSelect'=>'DB 선택', + 'dbInfo'=>'DB 정보 입력', + 'configInfo'=>'환경 설정', + 'adminInfo'=>'관리자 정보 입력' + ); $lang->install_condition_title = "Vérifiez les conditions obligatoires pour l'installation, S.V.P."; - $lang->install_checklist_title = array( 'php_version' => 'Version de PHP', 'permission' => 'Autorisation', @@ -236,6 +245,7 @@ EndOfLicense; $lang->msg_install_completed = "Installation a complété.\nMerci pour choisir XE"; $lang->msg_install_failed = "Une erreur a lieu en créant le fichier d\'installation."; $lang->ftp_get_list = "Get List"; + $lang->msg_license_agreement = 'GNU 약소 일반 공중 사용 허가서(LGPL v2) 동의'; $lang->msg_read_all = '전문 읽기'; $lang->msg_license_agreement_desc = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; $lang->msg_license_agreement_alert = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; diff --git a/modules/install/lang/jp.lang.php b/modules/install/lang/jp.lang.php index fba36d64f..eaf077798 100644 --- a/modules/install/lang/jp.lang.php +++ b/modules/install/lang/jp.lang.php @@ -156,9 +156,18 @@ Each version is given a distinguishing version number. If the Library specifies END OF TERMS AND CONDITIONS EndOfLicense; - + $lang->lgpl_agree = 'GNU 약소 일반 공중 사용 허가서(LGPL v2) 동의'; + $lang->enviroment_gather = '설치 환경 수집 동의'; $lang->install_condition_title = "インストールするための必須条件を確認して下さい。"; - + $lang->install_progress_menu = array( + 'agree'=>'라이선스 동의', + 'condition'=>'설치 조건 확인', + 'ftp'=>'FTP 정보 입력', + 'dbSelect'=>'DB 선택', + 'dbInfo'=>'DB 정보 입력', + 'configInfo'=>'환경 설정', + 'adminInfo'=>'관리자 정보 입력' + ); $lang->install_checklist_title = array( 'php_version' => 'PHPバージョン', 'permission' => 'パーミッション', @@ -237,4 +246,10 @@ EndOfLicense; $lang->msg_install_completed = "インストールが完了しました。\nありがとうございます。"; $lang->msg_install_failed = 'インストールファイルを作成する際にエラーが発生しました。'; $lang->ftp_get_list = "Get List"; + $lang->msg_license_agreement = 'GNU 약소 일반 공중 사용 허가서(LGPL v2) 동의'; + $lang->msg_read_all = '전문 읽기'; + $lang->msg_license_agreement_desc = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; + $lang->msg_license_agreement_alert = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; + $lang->msg_intall_env_agreement = '설치 환경 수집 동의'; + $lang->msg_intall_env_agreement_desc = '설치 환경 수집에 동의하는 경우 사용자의 XE 설치 환경과 관련되어 있는 \'OS, DBMS, #, #\' 정보가 XE 통계 수집 서버로 전송됩니다. 수집된 정보는 더 나은 SW를 제작하기 위한 통계 수집 이외의 목적으로 활용하지 않습니다. XE는 사용자의 설치 환경 정보를 외부에 공개하지 않습니다. 이 항목에 반드시 동의하지 않아도 됩니다.'; ?> diff --git a/modules/install/lang/ko.lang.php b/modules/install/lang/ko.lang.php index cf69446f3..262b97fda 100644 --- a/modules/install/lang/ko.lang.php +++ b/modules/install/lang/ko.lang.php @@ -155,6 +155,8 @@ Each version is given a distinguishing version number. If the Library specifies END OF TERMS AND CONDITIONS EndOfLicense; + $lang->lgpl_agree = 'GNU 약소 일반 공중 사용 허가서(LGPL v2) 동의'; + $lang->enviroment_gather = '설치 환경 수집 동의'; $lang->install_progress_menu = array( 'agree'=>'라이선스 동의', 'condition'=>'설치 조건 확인', diff --git a/modules/install/lang/ru.lang.php b/modules/install/lang/ru.lang.php index 2ad244dc3..2b26408ce 100644 --- a/modules/install/lang/ru.lang.php +++ b/modules/install/lang/ru.lang.php @@ -155,9 +155,18 @@ Each version is given a distinguishing version number. If the Library specifies END OF TERMS AND CONDITIONS EndOfLicense; - + $lang->lgpl_agree = 'GNU 약소 일반 공중 사용 허가서(LGPL v2) 동의'; + $lang->enviroment_gather = '설치 환경 수집 동의'; + $lang->install_progress_menu = array( + 'agree'=>'라이선스 동의', + 'condition'=>'설치 조건 확인', + 'ftp'=>'FTP 정보 입력', + 'dbSelect'=>'DB 선택', + 'dbInfo'=>'DB 정보 입력', + 'configInfo'=>'환경 설정', + 'adminInfo'=>'관리자 정보 입력' + ); $lang->install_condition_title = "Пожалуйста, проверьте требования к установке."; - $lang->install_checklist_title = array( 'php_version' => 'Версия PHP', 'permission' => 'Права доступа', @@ -236,6 +245,7 @@ EndOfLicense; $lang->msg_install_completed = "Установка завершена.\nСпасибо Вам за выбор XE"; $lang->msg_install_failed = "Произошла ошибка при создании файла конфигурации."; $lang->ftp_get_list = 'Get List'; + $lang->msg_license_agreement = 'GNU 약소 일반 공중 사용 허가서(LGPL v2) 동의'; $lang->msg_read_all = '전문 읽기'; $lang->msg_license_agreement_desc = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; $lang->msg_license_agreement_alert = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; diff --git a/modules/install/lang/tr.lang.php b/modules/install/lang/tr.lang.php index ac96abf5f..a47f1134a 100644 --- a/modules/install/lang/tr.lang.php +++ b/modules/install/lang/tr.lang.php @@ -151,9 +151,18 @@ Her yeni biçime ayırdedici bir sürüm numarası verilmektedir. Eğer Kitaplı ŞART VE KAYITLARIN SONU EndOfLicense; - + $lang->lgpl_agree = 'GNU 약소 일반 공중 사용 허가서(LGPL v2) 동의'; + $lang->enviroment_gather = '설치 환경 수집 동의'; + $lang->install_progress_menu = array( + 'agree'=>'라이선스 동의', + 'condition'=>'설치 조건 확인', + 'ftp'=>'FTP 정보 입력', + 'dbSelect'=>'DB 선택', + 'dbInfo'=>'DB 정보 입력', + 'configInfo'=>'환경 설정', + 'adminInfo'=>'관리자 정보 입력' + ); $lang->install_condition_title = "Lütfen kurulum gereksinimlerini kontrol ediniz."; - $lang->install_checklist_title = array( 'php_version' => 'PHP Sürümü', 'permission' => 'Yetki', @@ -232,6 +241,7 @@ EndOfLicense; $lang->msg_install_completed = "Kurulum tamamlandı.\nXE\'yi seçtiğiniz için teşekkür ederiz"; $lang->msg_install_failed = "Kurulum dosyası oluşturulurken bir hata oluştu."; $lang->ftp_get_list = "Liste Al"; + $lang->msg_license_agreement = 'GNU 약소 일반 공중 사용 허가서(LGPL v2) 동의'; $lang->msg_read_all = '전문 읽기'; $lang->msg_license_agreement_desc = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; $lang->msg_license_agreement_alert = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; diff --git a/modules/install/lang/vi.lang.php b/modules/install/lang/vi.lang.php index 243912ef5..75d5c43f4 100644 --- a/modules/install/lang/vi.lang.php +++ b/modules/install/lang/vi.lang.php @@ -158,9 +158,18 @@ Each version is given a distinguishing version number. If the Library specifies END OF TERMS AND CONDITIONS EndOfLicense; - + $lang->lgpl_agree = 'GNU 약소 일반 공중 사용 허가서(LGPL v2) 동의'; + $lang->enviroment_gather = '설치 환경 수집 동의'; + $lang->install_progress_menu = array( + 'agree'=>'라이선스 동의', + 'condition'=>'설치 조건 확인', + 'ftp'=>'FTP 정보 입력', + 'dbSelect'=>'DB 선택', + 'dbInfo'=>'DB 정보 입력', + 'configInfo'=>'환경 설정', + 'adminInfo'=>'관리자 정보 입력' + ); $lang->install_condition_title = "Xin hãy kiểm tra những yêu cầu cài đặt."; - $lang->install_checklist_title = array( 'php_version' => 'Phiên bản PHP', 'permission' => 'Sự cho phép', @@ -238,6 +247,7 @@ EndOfLicense; $lang->msg_install_completed = "Đã cài đặt XE thành công!.\nXin cảm ơn đã sử dụng XE!"; $lang->msg_install_failed = "Đã có lỗi xảy ra khi tạo File cài đặt."; $lang->ftp_get_list = "Nhận danh sách"; + $lang->msg_license_agreement = 'GNU 약소 일반 공중 사용 허가서(LGPL v2) 동의'; $lang->msg_read_all = '전문 읽기'; $lang->msg_license_agreement_desc = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; $lang->msg_license_agreement_alert = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; diff --git a/modules/install/lang/zh-CN.lang.php b/modules/install/lang/zh-CN.lang.php index 7fead739a..071c271b4 100644 --- a/modules/install/lang/zh-CN.lang.php +++ b/modules/install/lang/zh-CN.lang.php @@ -158,6 +158,17 @@ -条文结束- EndOfLicense; + $lang->lgpl_agree = 'GNU 약소 일반 공중 사용 허가서(LGPL v2) 동의'; + $lang->enviroment_gather = '설치 환경 수집 동의'; + $lang->install_progress_menu = array( + 'agree'=>'라이선스 동의', + 'condition'=>'설치 조건 확인', + 'ftp'=>'FTP 정보 입력', + 'dbSelect'=>'DB 선택', + 'dbInfo'=>'DB 정보 입력', + 'configInfo'=>'환경 설정', + 'adminInfo'=>'관리자 정보 입력' + ); $lang->install_condition_title = "检测运行环境"; @@ -237,6 +248,7 @@ EndOfLicense; $lang->msg_install_completed = "安装完成。\n非常感谢。"; $lang->msg_install_failed = "生成安装文件时发生错误。"; $lang->ftp_get_list = '载入FTP列表'; + $lang->msg_license_agreement = 'GNU 약소 일반 공중 사용 허가서(LGPL v2) 동의'; $lang->msg_read_all = '전문 읽기'; $lang->msg_license_agreement_desc = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; $lang->msg_license_agreement_alert = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; diff --git a/modules/install/lang/zh-TW.lang.php b/modules/install/lang/zh-TW.lang.php index b21adc3a3..1131fd5ee 100644 --- a/modules/install/lang/zh-TW.lang.php +++ b/modules/install/lang/zh-TW.lang.php @@ -155,6 +155,17 @@ Each version is given a distinguishing version number. If the Library specifies END OF TERMS AND CONDITIONS EndOfLicense; + $lang->lgpl_agree = 'GNU 약소 일반 공중 사용 허가서(LGPL v2) 동의'; + $lang->enviroment_gather = '설치 환경 수집 동의'; + $lang->install_progress_menu = array( + 'agree'=>'라이선스 동의', + 'condition'=>'설치 조건 확인', + 'ftp'=>'FTP 정보 입력', + 'dbSelect'=>'DB 선택', + 'dbInfo'=>'DB 정보 입력', + 'configInfo'=>'환경 설정', + 'adminInfo'=>'관리자 정보 입력' + ); $lang->install_condition_title = '確認安裝時必備的條件'; @@ -236,6 +247,7 @@ EndOfLicense; $lang->msg_install_completed = "安裝完成。\n非常感謝。"; $lang->msg_install_failed = "建立安裝檔案時,發生錯誤。"; $lang->ftp_get_list = "取得列表"; + $lang->msg_license_agreement = 'GNU 약소 일반 공중 사용 허가서(LGPL v2) 동의'; $lang->msg_read_all = '전문 읽기'; $lang->msg_license_agreement_desc = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; $lang->msg_license_agreement_alert = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; diff --git a/modules/install/tpl/check_env.html b/modules/install/tpl/check_env.html index aff29a8c4..88ba56365 100644 --- a/modules/install/tpl/check_env.html +++ b/modules/install/tpl/check_env.html @@ -25,5 +25,4 @@
        - diff --git a/modules/install/tpl/filter/introduce.xml b/modules/install/tpl/filter/introduce.xml new file mode 100644 index 000000000..ee9c9843d --- /dev/null +++ b/modules/install/tpl/filter/introduce.xml @@ -0,0 +1,10 @@ + +
        + + + + + + + +
        diff --git a/modules/install/tpl/introduce.html b/modules/install/tpl/introduce.html index 7d01347aa..d2e8e8b73 100644 --- a/modules/install/tpl/introduce.html +++ b/modules/install/tpl/introduce.html @@ -1,15 +1,19 @@ + +
        -
        + +
        -

        - {$lang->read_all}

        +

        - {$lang->read_all}

        {$lang->msg_license_agreement_desc}

        -

        +

        {$lang->msg_intall_env_agreement_desc}

        diff --git a/modules/install/tpl/js/install_admin.js b/modules/install/tpl/js/install_admin.js index fc0e99f54..706d939f1 100644 --- a/modules/install/tpl/js/install_admin.js +++ b/modules/install/tpl/js/install_admin.js @@ -1,6 +1,12 @@ /** * @brief DB정보 Setting후 실행될 함수 */ +function completeAgreement(ret_obj) +{ + var url = current_url.setQuery('act', 'dispInstallCheckEnv'); + location.href = url; +} + function completeDBSetting(ret_obj) { if(ret_obj['error'] != 0) { alert(ret_obj['message']); From 9f927639888b4537a12a0b8e93a0e56b8e65ef1e Mon Sep 17 00:00:00 2001 From: ovclas Date: Mon, 30 May 2011 09:38:41 +0000 Subject: [PATCH 0104/1372] #19790379 license agreement validate git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8406 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/install/install.controller.php | 10 +++------- modules/install/tpl/js/install_admin.js | 9 +++++++-- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/modules/install/install.controller.php b/modules/install/install.controller.php index 0109833f3..dd1e55cda 100644 --- a/modules/install/install.controller.php +++ b/modules/install/install.controller.php @@ -27,15 +27,11 @@ **/ function procInstallAgreement() { + global $lang; $requestVars = Context::gets('lgpl_agree', 'enviroment_gather'); + if($requestVars->lgpl_agree != 'on') + return new Object('-1', $lang->msg_license_agreement_alert); - /*$buff = '%s = '%s';\n", 'lgpl_agree', $requestVars->lgpl_agree); - $buff .= sprintf("\$agreement->%s = '%s';\n", 'enviroment_gather', $requestVars->enviroment_gather); - $buff .= "?>"; - - $this->db_tmp_config_file = _XE_PATH_.'files/config/tmpDB.config.php'; - FileHandler::writeFile(_XE_PATH_.'files/config/agreement', $buff);*/ $_SESSION['lgpl_agree'] = $requestVars->lgpl_agree; $_SESSION['enviroment_gather'] = $requestVars->enviroment_gather; diff --git a/modules/install/tpl/js/install_admin.js b/modules/install/tpl/js/install_admin.js index 706d939f1..a1eff2e46 100644 --- a/modules/install/tpl/js/install_admin.js +++ b/modules/install/tpl/js/install_admin.js @@ -3,8 +3,13 @@ */ function completeAgreement(ret_obj) { - var url = current_url.setQuery('act', 'dispInstallCheckEnv'); - location.href = url; + if(ret_obj['error'] != 0) { + alert(ret_obj['message']); + return; + } else { + var url = current_url.setQuery('act', 'dispInstallCheckEnv'); + location.href = url; + } } function completeDBSetting(ret_obj) { From 7778fa6c0eacd6976196e7c1e40f08d0a69d7d8f Mon Sep 17 00:00:00 2001 From: ovclas Date: Mon, 30 May 2011 09:48:26 +0000 Subject: [PATCH 0105/1372] #19790379 remove test code git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8407 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/install/tpl/introduce.html | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/install/tpl/introduce.html b/modules/install/tpl/introduce.html index d2e8e8b73..ef8adae87 100644 --- a/modules/install/tpl/introduce.html +++ b/modules/install/tpl/introduce.html @@ -5,8 +5,6 @@
        -

        - {$lang->read_all}

        From 28495431ffaba1f3b6f864b941e71bbe537e976d Mon Sep 17 00:00:00 2001 From: ovclas Date: Mon, 30 May 2011 10:04:34 +0000 Subject: [PATCH 0106/1372] #19790379 css apply git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8408 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/install/tpl/introduce.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/install/tpl/introduce.html b/modules/install/tpl/introduce.html index ef8adae87..822458bee 100644 --- a/modules/install/tpl/introduce.html +++ b/modules/install/tpl/introduce.html @@ -5,9 +5,9 @@
        - +
        -

        - {$lang->read_all}

        +

        - {$lang->msg_read_all}

        {$lang->msg_license_agreement_desc}

        From 68f068cf886f4d83ffc2afc4d526a0bee4f606ed Mon Sep 17 00:00:00 2001 From: mosmartin Date: Mon, 30 May 2011 13:20:28 +0000 Subject: [PATCH 0107/1372] fix query "limit" tag in other cases than page select git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0-DB@8409 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/db/queryparts/limit/Limit.class.php | 17 ++++++++++------- .../tags/navigation/LimitTag.class.php | 18 +++++++++++------- .../tags/navigation/NavigationTag.class.php | 2 +- 3 files changed, 22 insertions(+), 15 deletions(-) diff --git a/classes/db/queryparts/limit/Limit.class.php b/classes/db/queryparts/limit/Limit.class.php index 46090ddff..fd8147e47 100644 --- a/classes/db/queryparts/limit/Limit.class.php +++ b/classes/db/queryparts/limit/Limit.class.php @@ -5,20 +5,23 @@ var $page_count; var $page; - function Limit($page, $list_count, $page_count){ - $this->start = ($page-1)*$list_count; + function Limit($list_count, $page= NULL, $page_count= NULL){ $this->list_count = $list_count; - $this->page_count = $page_count; - $this->page = $page; + if ($page){ + $this->start = ($page-1)*$list_count; + $this->page_count = $page_count; + $this->page = $page; + } } function isPageHandler(){//in case you choose to use query limit in other cases than page select - return true; + if ($this->page)return true; + else return false; } function toString(){ - return $this->start . ' , ' . $this->list_count; + if ($this->page) return $this->start . ' , ' . $this->list_count; + else return $this->list_count; } } - ?> \ No newline at end of file diff --git a/classes/xml/xmlquery/tags/navigation/LimitTag.class.php b/classes/xml/xmlquery/tags/navigation/LimitTag.class.php index a6d2734ae..68a006946 100644 --- a/classes/xml/xmlquery/tags/navigation/LimitTag.class.php +++ b/classes/xml/xmlquery/tags/navigation/LimitTag.class.php @@ -7,18 +7,22 @@ var $list_count; function LimitTag($index){ - $this->page = $index->page->attrs; - $this->page_count = $index->page_count->attrs; - $this->list_count = $index->list_count->attrs; - require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/QueryArgument.class.php'); - $this->arguments[] = new QueryArgument($index->page); + + if($index->page->attrs && $index->page_count->attrs){ + $this->page = $index->page->attrs; + $this->page_count = $index->page_count->attrs; + $this->arguments[] = new QueryArgument($index->page); + $this->arguments[] = new QueryArgument($index->page_count); + } + + $this->list_count = $index->list_count->attrs; $this->arguments[] = new QueryArgument($index->list_count); - $this->arguments[] = new QueryArgument($index->page_count); } function toString(){ - return sprintf("new Limit(\$%s_argument->getValue(), \$%s_argument->getValue(), \$%s_argument->getValue())", $this->page->var, $this->list_count->var, $this->page_count->var); + if ($this->page)return sprintf("new Limit(\$%s_argument->getValue(), \$%s_argument->getValue(), \$%s_argument->getValue())",$this->list_count->var, $this->page->var, $this->page_count->var); + else return sprintf("new Limit(\$%s_argument->getValue())", $this->list_count->var); } function getArguments(){ diff --git a/classes/xml/xmlquery/tags/navigation/NavigationTag.class.php b/classes/xml/xmlquery/tags/navigation/NavigationTag.class.php index 7edf8d519..1c364643e 100644 --- a/classes/xml/xmlquery/tags/navigation/NavigationTag.class.php +++ b/classes/xml/xmlquery/tags/navigation/NavigationTag.class.php @@ -20,7 +20,7 @@ } } - if($xml_navigation->page->attrs && $xml_navigation->list_count->attrs) + if($xml_navigation->page->attrs || $xml_navigation->list_count->attrs) $this->limit = new LimitTag($xml_navigation); $list_count = $xml_navigation->list_count->attrs; From ba8550b6204c96f40d6e32735b0920b1cc30fcfd Mon Sep 17 00:00:00 2001 From: mosmartin Date: Mon, 30 May 2011 15:25:15 +0000 Subject: [PATCH 0108/1372] Google Code Issue Id:4 Summary: Enhancement for Managing Documents Popup git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8410 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/document/document.view.php | 8 ++++++++ modules/document/tpl/checked_list.html | 6 +++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/modules/document/document.view.php b/modules/document/document.view.php index c089dc722..4e79bb041 100644 --- a/modules/document/document.view.php +++ b/modules/document/document.view.php @@ -77,6 +77,14 @@ $oModuleModel = &getModel('module'); // The combination of module categories list and the list of modules if(count($module_list)>1) Context::set('module_list', $module_categories); + + $module_srl=Context::get('module_srl'); + Context::set('module_srl',$module_srl); + $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); + Context::set('mid',$module_info->mid); + Context::set('browser_title',$module_info->browser_title); + + // Select Pop-up layout $this->setLayoutPath('./common/tpl'); $this->setLayoutFile('popup_layout'); diff --git a/modules/document/tpl/checked_list.html b/modules/document/tpl/checked_list.html index a7225332f..08fcfd618 100644 --- a/modules/document/tpl/checked_list.html +++ b/modules/document/tpl/checked_list.html @@ -29,8 +29,8 @@
        {$lang->move_target_module}
        - - {$lang->cmd_select} + + {$lang->cmd_select} @@ -57,7 +57,7 @@
        From 82ac064cff0b072cbe1327d1d4ab4c769b886e63 Mon Sep 17 00:00:00 2001 From: ovclas Date: Tue, 31 May 2011 00:48:20 +0000 Subject: [PATCH 0109/1372] #19790379 lgpl license url added git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8411 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/install/lang/en.lang.php | 1 + 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 | 1 + modules/install/lang/ru.lang.php | 1 + modules/install/lang/tr.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/introduce.html | 2 +- 11 files changed, 11 insertions(+), 1 deletion(-) diff --git a/modules/install/lang/en.lang.php b/modules/install/lang/en.lang.php index 6e5a36f84..18b1768cd 100644 --- a/modules/install/lang/en.lang.php +++ b/modules/install/lang/en.lang.php @@ -253,4 +253,5 @@ EndOfLicense; $lang->msg_license_agreement_alert = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; $lang->msg_intall_env_agreement = '설치 환경 수집 동의'; $lang->msg_intall_env_agreement_desc = '설치 환경 수집에 동의하는 경우 사용자의 XE 설치 환경과 관련되어 있는 \'OS, DBMS, #, #\' 정보가 XE 통계 수집 서버로 전송됩니다. 수집된 정보는 더 나은 SW를 제작하기 위한 통계 수집 이외의 목적으로 활용하지 않습니다. XE는 사용자의 설치 환경 정보를 외부에 공개하지 않습니다. 이 항목에 반드시 동의하지 않아도 됩니다.'; + $lang->lgpl_license_url = 'http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html'; ?> diff --git a/modules/install/lang/es.lang.php b/modules/install/lang/es.lang.php index f55527e95..c9805940f 100644 --- a/modules/install/lang/es.lang.php +++ b/modules/install/lang/es.lang.php @@ -251,4 +251,5 @@ EndOfLicense; $lang->msg_license_agreement_alert = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; $lang->msg_intall_env_agreement = '설치 환경 수집 동의'; $lang->msg_intall_env_agreement_desc = '설치 환경 수집에 동의하는 경우 사용자의 XE 설치 환경과 관련되어 있는 \'OS, DBMS, #, #\' 정보가 XE 통계 수집 서버로 전송됩니다. 수집된 정보는 더 나은 SW를 제작하기 위한 통계 수집 이외의 목적으로 활용하지 않습니다. XE는 사용자의 설치 환경 정보를 외부에 공개하지 않습니다. 이 항목에 반드시 동의하지 않아도 됩니다.'; + $lang->lgpl_license_url = 'http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html'; ?> diff --git a/modules/install/lang/fr.lang.php b/modules/install/lang/fr.lang.php index ed59db7ea..8fbfe6959 100644 --- a/modules/install/lang/fr.lang.php +++ b/modules/install/lang/fr.lang.php @@ -251,4 +251,5 @@ EndOfLicense; $lang->msg_license_agreement_alert = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; $lang->msg_intall_env_agreement = '설치 환경 수집 동의'; $lang->msg_intall_env_agreement_desc = '설치 환경 수집에 동의하는 경우 사용자의 XE 설치 환경과 관련되어 있는 \'OS, DBMS, #, #\' 정보가 XE 통계 수집 서버로 전송됩니다. 수집된 정보는 더 나은 SW를 제작하기 위한 통계 수집 이외의 목적으로 활용하지 않습니다. XE는 사용자의 설치 환경 정보를 외부에 공개하지 않습니다. 이 항목에 반드시 동의하지 않아도 됩니다.'; + $lang->lgpl_license_url = 'http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html'; ?> diff --git a/modules/install/lang/jp.lang.php b/modules/install/lang/jp.lang.php index eaf077798..361328c47 100644 --- a/modules/install/lang/jp.lang.php +++ b/modules/install/lang/jp.lang.php @@ -252,4 +252,5 @@ EndOfLicense; $lang->msg_license_agreement_alert = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; $lang->msg_intall_env_agreement = '설치 환경 수집 동의'; $lang->msg_intall_env_agreement_desc = '설치 환경 수집에 동의하는 경우 사용자의 XE 설치 환경과 관련되어 있는 \'OS, DBMS, #, #\' 정보가 XE 통계 수집 서버로 전송됩니다. 수집된 정보는 더 나은 SW를 제작하기 위한 통계 수집 이외의 목적으로 활용하지 않습니다. XE는 사용자의 설치 환경 정보를 외부에 공개하지 않습니다. 이 항목에 반드시 동의하지 않아도 됩니다.'; + $lang->lgpl_license_url = 'http://www.gnu.org/licenses/old-licenses/lgpl-2.1.ja.html'; ?> diff --git a/modules/install/lang/ko.lang.php b/modules/install/lang/ko.lang.php index 262b97fda..2395cab5a 100644 --- a/modules/install/lang/ko.lang.php +++ b/modules/install/lang/ko.lang.php @@ -244,4 +244,5 @@ EndOfLicense; $lang->msg_license_agreement_alert = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; $lang->msg_intall_env_agreement = '설치 환경 수집 동의'; $lang->msg_intall_env_agreement_desc = '설치 환경 수집에 동의하는 경우 사용자의 XE 설치 환경과 관련되어 있는 \'OS, DBMS, #, #\' 정보가 XE 통계 수집 서버로 전송됩니다. 수집된 정보는 더 나은 SW를 제작하기 위한 통계 수집 이외의 목적으로 활용하지 않습니다. XE는 사용자의 설치 환경 정보를 외부에 공개하지 않습니다. 이 항목에 반드시 동의하지 않아도 됩니다.'; + $lang->lgpl_license_url = 'http://korea.gnu.org/people/chsong/copyleft/lgpl.ko.html'; ?> diff --git a/modules/install/lang/ru.lang.php b/modules/install/lang/ru.lang.php index 2b26408ce..7b5caa95f 100644 --- a/modules/install/lang/ru.lang.php +++ b/modules/install/lang/ru.lang.php @@ -251,4 +251,5 @@ EndOfLicense; $lang->msg_license_agreement_alert = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; $lang->msg_intall_env_agreement = '설치 환경 수집 동의'; $lang->msg_intall_env_agreement_desc = '설치 환경 수집에 동의하는 경우 사용자의 XE 설치 환경과 관련되어 있는 \'OS, DBMS, #, #\' 정보가 XE 통계 수집 서버로 전송됩니다. 수집된 정보는 더 나은 SW를 제작하기 위한 통계 수집 이외의 목적으로 활용하지 않습니다. XE는 사용자의 설치 환경 정보를 외부에 공개하지 않습니다. 이 항목에 반드시 동의하지 않아도 됩니다.'; + $lang->lgpl_license_url = 'http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html'; ?> diff --git a/modules/install/lang/tr.lang.php b/modules/install/lang/tr.lang.php index a47f1134a..68ccd87c2 100644 --- a/modules/install/lang/tr.lang.php +++ b/modules/install/lang/tr.lang.php @@ -247,4 +247,5 @@ EndOfLicense; $lang->msg_license_agreement_alert = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; $lang->msg_intall_env_agreement = '설치 환경 수집 동의'; $lang->msg_intall_env_agreement_desc = '설치 환경 수집에 동의하는 경우 사용자의 XE 설치 환경과 관련되어 있는 \'OS, DBMS, #, #\' 정보가 XE 통계 수집 서버로 전송됩니다. 수집된 정보는 더 나은 SW를 제작하기 위한 통계 수집 이외의 목적으로 활용하지 않습니다. XE는 사용자의 설치 환경 정보를 외부에 공개하지 않습니다. 이 항목에 반드시 동의하지 않아도 됩니다.'; + $lang->lgpl_license_url = 'http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html'; ?> diff --git a/modules/install/lang/vi.lang.php b/modules/install/lang/vi.lang.php index 75d5c43f4..5962fcaff 100644 --- a/modules/install/lang/vi.lang.php +++ b/modules/install/lang/vi.lang.php @@ -253,4 +253,5 @@ EndOfLicense; $lang->msg_license_agreement_alert = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; $lang->msg_intall_env_agreement = '설치 환경 수집 동의'; $lang->msg_intall_env_agreement_desc = '설치 환경 수집에 동의하는 경우 사용자의 XE 설치 환경과 관련되어 있는 \'OS, DBMS, #, #\' 정보가 XE 통계 수집 서버로 전송됩니다. 수집된 정보는 더 나은 SW를 제작하기 위한 통계 수집 이외의 목적으로 활용하지 않습니다. XE는 사용자의 설치 환경 정보를 외부에 공개하지 않습니다. 이 항목에 반드시 동의하지 않아도 됩니다.'; + $lang->lgpl_license_url = 'http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html'; ?> diff --git a/modules/install/lang/zh-CN.lang.php b/modules/install/lang/zh-CN.lang.php index 071c271b4..7e5e36998 100644 --- a/modules/install/lang/zh-CN.lang.php +++ b/modules/install/lang/zh-CN.lang.php @@ -254,4 +254,5 @@ EndOfLicense; $lang->msg_license_agreement_alert = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; $lang->msg_intall_env_agreement = '설치 환경 수집 동의'; $lang->msg_intall_env_agreement_desc = '설치 환경 수집에 동의하는 경우 사용자의 XE 설치 환경과 관련되어 있는 \'OS, DBMS, #, #\' 정보가 XE 통계 수집 서버로 전송됩니다. 수집된 정보는 더 나은 SW를 제작하기 위한 통계 수집 이외의 목적으로 활용하지 않습니다. XE는 사용자의 설치 환경 정보를 외부에 공개하지 않습니다. 이 항목에 반드시 동의하지 않아도 됩니다.'; + $lang->lgpl_license_url = 'http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html'; ?> diff --git a/modules/install/lang/zh-TW.lang.php b/modules/install/lang/zh-TW.lang.php index 1131fd5ee..236039029 100644 --- a/modules/install/lang/zh-TW.lang.php +++ b/modules/install/lang/zh-TW.lang.php @@ -253,4 +253,5 @@ EndOfLicense; $lang->msg_license_agreement_alert = 'XE를 사용하려면 \'GNU 약소 일반 공중 사용 허가서(LGPL v2)\'에 반드시 동의해야 합니다.'; $lang->msg_intall_env_agreement = '설치 환경 수집 동의'; $lang->msg_intall_env_agreement_desc = '설치 환경 수집에 동의하는 경우 사용자의 XE 설치 환경과 관련되어 있는 \'OS, DBMS, #, #\' 정보가 XE 통계 수집 서버로 전송됩니다. 수집된 정보는 더 나은 SW를 제작하기 위한 통계 수집 이외의 목적으로 활용하지 않습니다. XE는 사용자의 설치 환경 정보를 외부에 공개하지 않습니다. 이 항목에 반드시 동의하지 않아도 됩니다.'; + $lang->lgpl_license_url = 'http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html'; ?> diff --git a/modules/install/tpl/introduce.html b/modules/install/tpl/introduce.html index 822458bee..322887f3b 100644 --- a/modules/install/tpl/introduce.html +++ b/modules/install/tpl/introduce.html @@ -7,7 +7,7 @@
        -

        - {$lang->msg_read_all}

        +

        - {$lang->msg_read_all}

        {$lang->msg_license_agreement_desc}

        From 6e2fb02acde69dff0d5312411804b91f1f31b1c7 Mon Sep 17 00:00:00 2001 From: ovclas Date: Tue, 31 May 2011 01:45:08 +0000 Subject: [PATCH 0110/1372] #19790379 added db check in enviroment git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8412 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/db/DB.class.php | 42 ++++++++++++++++++++++++++ modules/install/install.controller.php | 7 ++++- modules/install/lang/en.lang.php | 1 + modules/install/lang/es.lang.php | 1 + modules/install/lang/fr.lang.php | 1 + modules/install/lang/ko.lang.php | 1 + modules/install/lang/ru.lang.php | 1 + modules/install/lang/tr.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/check_env.html | 2 +- modules/install/tpl/select_db.html | 8 ++++- 13 files changed, 65 insertions(+), 3 deletions(-) diff --git a/classes/db/DB.class.php b/classes/db/DB.class.php index 08a62d266..02157f1a8 100644 --- a/classes/db/DB.class.php +++ b/classes/db/DB.class.php @@ -89,6 +89,48 @@ return $oDB->_getSupportedList(); } + /** + * @brief returns list of enable in supported db + * @return list of enable in supported db + **/ + function getEnableList() + { + if(!$this->supported_list) + { + $oDB = new DB(); + $this->supported_list = $oDB->_getSupportedList(); + } + + $enableList = array(); + if(is_array($this->supported_list)) + { + foreach($this->supported_list AS $key=>$value) + if($value->enable) array_push($enableList, $value); + } + return $enableList; + } + + /** + * @brief returns list of disable in supported db + * @return list of disable in supported db + **/ + function getDisableList() + { + if(!$this->supported_list) + { + $oDB = new DB(); + $this->supported_list = $oDB->_getSupportedList(); + } + + $disableList = array(); + if(is_array($this->supported_list)) + { + foreach($this->supported_list AS $key=>$value) + if(!$value->enable) array_push($disableList, $value); + } + return $disableList; + } + /** * @brief returns list of supported db * @return list of supported db diff --git a/modules/install/install.controller.php b/modules/install/install.controller.php index dd1e55cda..d6fd4d515 100644 --- a/modules/install/install.controller.php +++ b/modules/install/install.controller.php @@ -230,12 +230,17 @@ // 5. Check gd(imagecreatefromgif function) if(function_exists('imagecreatefromgif')) $checklist['gd'] = true; else $checklist['gd'] = false; + // 6. Check DB + if(DB::getEnableList()) $checklist['db'] = true; + else $checklist['db'] = false; - if(!$checklist['php_version'] || !$checklist['permission'] || !$checklist['xml'] || !$checklist['session']) $install_enable = false; + if(!$checklist['php_version'] || !$checklist['permission'] || !$checklist['xml'] || !$checklist['session'] || !$checklist['db']) $install_enable = false; else $install_enable = true; + // Save the checked result to the Context Context::set('checklist', $checklist); Context::set('install_enable', $install_enable); + Context::set('phpversion', phpversion()); return $install_enable; } diff --git a/modules/install/lang/en.lang.php b/modules/install/lang/en.lang.php index 18b1768cd..b54a67d7d 100644 --- a/modules/install/lang/en.lang.php +++ b/modules/install/lang/en.lang.php @@ -176,6 +176,7 @@ EndOfLicense; 'iconv' => 'ICONV Library', 'gd' => 'GD Library', 'session' => 'Session.auto_start setting', + 'db' => 'DB', ); $lang->install_checklist_desc = array( diff --git a/modules/install/lang/es.lang.php b/modules/install/lang/es.lang.php index c9805940f..9aa8a2aac 100644 --- a/modules/install/lang/es.lang.php +++ b/modules/install/lang/es.lang.php @@ -174,6 +174,7 @@ EndOfLicense; 'iconv' => 'Librería ICONV', 'gd' => 'Librería GD', 'session' => 'Configuración Session.auto_start', + 'db' => 'DB', ); $lang->install_checklist_desc = array( diff --git a/modules/install/lang/fr.lang.php b/modules/install/lang/fr.lang.php index 8fbfe6959..427a747ff 100644 --- a/modules/install/lang/fr.lang.php +++ b/modules/install/lang/fr.lang.php @@ -174,6 +174,7 @@ EndOfLicense; 'iconv' => 'Bibliothèque de ICONV', 'gd' => 'Bibliothèque de GD', 'session' => 'Configuration de Session.auto_start', + 'db' => 'DB', ); $lang->install_checklist_desc = array( diff --git a/modules/install/lang/ko.lang.php b/modules/install/lang/ko.lang.php index 2395cab5a..5601a1429 100644 --- a/modules/install/lang/ko.lang.php +++ b/modules/install/lang/ko.lang.php @@ -174,6 +174,7 @@ EndOfLicense; 'iconv' => 'ICONV 라이브러리', 'gd' => 'GD 라이브러리', 'session' => 'Session.auto_start 설정', + 'db' => 'DB', ); $lang->install_checklist_desc = array( 'php_version' => '[필수] PHP버전이 5.2.2일 경우 PHP의 버그로 인하여 설치되지 않습니다.', diff --git a/modules/install/lang/ru.lang.php b/modules/install/lang/ru.lang.php index 7b5caa95f..8fc95225e 100644 --- a/modules/install/lang/ru.lang.php +++ b/modules/install/lang/ru.lang.php @@ -174,6 +174,7 @@ EndOfLicense; 'iconv' => 'ICONV библиотека', 'gd' => 'GD библиотека', 'session' => 'Session.auto_start настройка', + 'db' => 'DB', ); $lang->install_checklist_desc = array( diff --git a/modules/install/lang/tr.lang.php b/modules/install/lang/tr.lang.php index 68ccd87c2..11445cd83 100644 --- a/modules/install/lang/tr.lang.php +++ b/modules/install/lang/tr.lang.php @@ -170,6 +170,7 @@ EndOfLicense; 'iconv' => 'ICONV Kitaplığı', 'gd' => 'GD Kitaplığı', 'session' => 'Session.auto_start(otomatik.oturum_acma) ayarı', + 'db' => 'DB', ); $lang->install_checklist_desc = array( diff --git a/modules/install/lang/vi.lang.php b/modules/install/lang/vi.lang.php index 5962fcaff..125c38edf 100644 --- a/modules/install/lang/vi.lang.php +++ b/modules/install/lang/vi.lang.php @@ -177,6 +177,7 @@ EndOfLicense; 'iconv' => 'ICONV Library', 'gd' => 'GD Library', 'session' => 'Thiết lập Session.auto_start', + 'db' => 'DB', ); $lang->install_checklist_desc = array( diff --git a/modules/install/lang/zh-CN.lang.php b/modules/install/lang/zh-CN.lang.php index 7e5e36998..1891a4659 100644 --- a/modules/install/lang/zh-CN.lang.php +++ b/modules/install/lang/zh-CN.lang.php @@ -179,6 +179,7 @@ EndOfLicense; 'iconv' => 'ICONV库', 'gd' => 'GD库', 'session' => 'Session.auto_start 设置', + 'db' => 'DB', ); $lang->install_checklist_desc = array( diff --git a/modules/install/lang/zh-TW.lang.php b/modules/install/lang/zh-TW.lang.php index 236039029..9f036550d 100644 --- a/modules/install/lang/zh-TW.lang.php +++ b/modules/install/lang/zh-TW.lang.php @@ -176,6 +176,7 @@ EndOfLicense; 'iconv' => 'ICONV Library', 'gd' => 'GD Library', 'session' => 'Session.auto_start設置', + 'db' => 'DB', ); $lang->install_checklist_desc = array( diff --git a/modules/install/tpl/check_env.html b/modules/install/tpl/check_env.html index 88ba56365..48cd35380 100644 --- a/modules/install/tpl/check_env.html +++ b/modules/install/tpl/check_env.html @@ -8,7 +8,7 @@ - {$lang->install_checklist_title[$key]} + {$lang->install_checklist_title[$key]} (Ver. {$phpversion}) {$lang->enable}{$lang->disable}
        {$lang->install_checklist_desc[$key]} diff --git a/modules/install/tpl/select_db.html b/modules/install/tpl/select_db.html index d5a6e28c0..20f07d620 100644 --- a/modules/install/tpl/select_db.html +++ b/modules/install/tpl/select_db.html @@ -8,7 +8,13 @@ @@ -60,20 +60,20 @@ $('#theme').data('themes', themes);

        선택한 레이아웃

        • - Thumbnail does not exist + Thumbnail does not exist layout_srl == $current_layout)-->checked="checked" />
            -
          • › 버전: {$val->version}
          • -
          • › 제작: +
          • · 버전: {$val->version}
          • +
          • · 제작: {$author->name} {$author->name}
          • -
          • › 설명: {$val->description}
          • -
          • › 경로: {$val->path}
          • -
          • › 설정: Edit
          • +
          • · 설명: {$val->description}
          • +
          • · 경로: {$val->path}
          • +
          • · 설정: Edit
        @@ -94,14 +94,14 @@ $('#theme').data('themes', themes);
          -
        • › 버전: {$sval->version}
        • -
        • › 제작: +
        • · 버전: {$sval->version}
        • +
        • · 제작: {$author->name} {$author->name}
        • -
        • › 설명: {$sval->description}
        • +
        • · 설명: {$sval->description}
      • From a63723c0b954506e5da311c9286fb655c5ff7cfd Mon Sep 17 00:00:00 2001 From: ovclas Date: Wed, 3 Aug 2011 08:34:11 +0000 Subject: [PATCH 0362/1372] issue 70 data migration management modified. but UI not completed. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8717 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/importer/conf/module.xml | 2 +- modules/importer/tpl/index.html | 64 +++++++++++++------------------- 2 files changed, 27 insertions(+), 39 deletions(-) diff --git a/modules/importer/conf/module.xml b/modules/importer/conf/module.xml index e675a93b8..ed3a7282c 100644 --- a/modules/importer/conf/module.xml +++ b/modules/importer/conf/module.xml @@ -3,7 +3,7 @@ - + diff --git a/modules/importer/tpl/index.html b/modules/importer/tpl/index.html index 2c0b66e25..17eb16e1a 100644 --- a/modules/importer/tpl/index.html +++ b/modules/importer/tpl/index.html @@ -6,45 +6,33 @@ -

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

        - - -
        {nl2br($lang->about_importer)}
        - - -
        -
        +
        + -

        {$lang->import_step_title[1]} - {$lang->import_step_desc[1]}

        - - - - - - - - - - - - - - - - - - - - - - - - -
        - -
        - +

        {$lang->importer}

        +

        {nl2br($lang->about_importer)}

        +

        {$lang->import_step_title[1]} - {$lang->import_step_desc[1]}

        +
          +
        • + +
        • +
        • + +
        • +
        • + +
        • +
        • + +
        • +
        • + +
        • +
        +
        + +
        +
        - From 689a9a73c461e5015071ab55d929b8ba1bb7d056 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Thu, 4 Aug 2011 02:53:18 +0000 Subject: [PATCH 0363/1372] Multilingual page created. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8718 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/tpl/css/admin.css | 220 +++++++--------------------- modules/admin/tpl/css/admin.min.css | 2 +- 2 files changed, 52 insertions(+), 170 deletions(-) diff --git a/modules/admin/tpl/css/admin.css b/modules/admin/tpl/css/admin.css index f0da2fe05..444ddc105 100644 --- a/modules/admin/tpl/css/admin.css +++ b/modules/admin/tpl/css/admin.css @@ -109,11 +109,11 @@ p{line-height:1.5} .gnb.jx li a:active, .gnb.jx li a:focus{background:none} .gnb.jx li.activeOn>a{background:#ddd} -@media only all and (max-width:860px) { +@media only all and (max-width:860px){ .gnb ul{padding-left:1em} .gnb .setting{right:1em} } -@media only all and (max-width:640px) { +@media only all and (max-width:640px){ .gnb ul{display:block;position:static;padding:0} .gnb li{float:none;clear:both;border-top:1px solid #ccc} .gnb ul ul{border:0;position:static} @@ -124,119 +124,6 @@ p{line-height:1.5} .gnb li a:focus{background:none} .gnb li.activeOn>a{background:#ddd} } -/* Lined Tab Navigation */ -.tab.line{padding:0 0 35px 0;margin:1em 0} -.tab.line ul{position:relative;margin:0;padding:0;list-style:none;border-bottom:1px solid #ccc;zoom:1} -.tab.line ul:after{content:"";display:block;clear:both} -.tab.line li{float:left;margin-bottom:-1px} -.tab.line li a{position:relative;float:left;text-decoration:none;border:1px solid #eee;border-bottom-color:#ccc;background:#fafafa;color:#333} -.tab.line li a span{display:inline-block;height:14px;padding:6px 25px 6px 25px;letter-spacing:-1px;cursor:pointer} -.tab.line li ul{width:100%;position:absolute;top:40px;left:0;list-style:none;border:0;margin:0;padding:0;white-space:nowrap;overflow:hidden;zoom:1} -.tab.line li ul:after{content:"";display:block;clear:both} -.tab.line li li{position:relative;left:-1px;padding:0 10px;border-left:1px solid #ddd;overflow:visible} -.tab.line li li a{padding:0;margin:0;border:0 !important;color:#666 !important;font-weight:normal;background:transparent;letter-spacing:normal} -.tab.line li.active a{border:1px solid #ccc;border-bottom:1px solid #fff;margin-top:-1px;background:transparent} -.tab.line li.active a span{padding-top:7px;font-weight:bold} -.tab.line li li a:hover, -.tab.line li li a:active, -.tab.line li li a:focus, -.tab.line li li.active a{font-weight:bold;letter-spacing:-1px;color:#333 !important} -.tab.line.jx{padding:0} -.tab.line.jx ul{border:0} -.tab.line.jx li{float:none} -.tab.line.jx li a{float:none;display:block;font-weight:bold;color:#333;border:1px solid #eee !important;border-bottom-color:#ccc !important;background:#fafafa !important} -.tab.line.jx li ul{position:static;display:block !important;padding:5px 0;left:0;top:0} -.tab.line.jx li li{display:inline} -.tab.line.jx li li a{display:inline;letter-spacing:normal;border:0 !important;font-weight:normal !important;color:#666 !important;background:none !important} -.tab.line.jx li li a:hover, -.tab.line.jx li li a:active, -.tab.line.jx li li a:focus{text-decoration:underline} -/* Faced Tab Navigation */ -.tab.face{padding:0 0 35px 0;margin:1em 0} -.tab.face ul{position:relative;margin:0;padding:0;_padding:2px 0 0 0;list-style:none;border-bottom:2px solid #315593;zoom:1} -.tab.face ul:after{content:"";display:block;clear:both} -.tab.face li{float:left;margin-right:1px;background:#4CB1E5} -.tab.face li a, -.tab.face li a span{position:relative;cursor:pointer} -.tab.face li a{float:left;text-decoration:none} -.tab.face li a span{display:inline-block;padding:6px 25px 6px 25px;color:#fff} -.tab.face li ul{width:100%;position:absolute;top:40px;left:0;list-style:none;border:0;margin:0;padding:0;white-space:nowrap;overflow:hidden;zoom:1} -.tab.face li ul:after{content:"";display:block;clear:both} -.tab.face li li{position:relative;left:-1px;padding:0 10px;border-left:1px solid #ddd;overflow:visible;background:transparent !important} -.tab.face li li a{padding:0;margin:0;font-weight:normal;color:#666} -.tab.face li.active{background-color:#315593;margin-top:-1px} -.tab.face li.active a span{padding-top:7px;padding-bottom:7px;font-weight:bold;letter-spacing:-1px} -.tab.face li li a:hover, -.tab.face li li a:active, -.tab.face li li a:focus, -.tab.face li li.active a{font-weight:bold;letter-spacing:-1px;color:#333} -.tab.face.jx{padding:0} -.tab.face.jx ul{border:0} -.tab.face.jx li{float:none} -.tab.face.jx li a{float:none;font-weight:bold} -.tab.face.jx li ul{display:block !important;position:static;padding:5px 0;left:0;top:0;background:#fff} -.tab.face.jx li li{display:inline} -.tab.face.jx li li a{font-weight:normal !important;color:#666;letter-spacing:normal} -.tab.face.jx li li a:hover, -.tab.face.jx li li a:active, -.tab.face.jx li li a:focus{text-decoration:underline} -/* Tab + List */ -.tab.list{height:160px;margin:1em 0} -.tab.list ul{position:relative;margin:0;padding:0;list-style:none;border-bottom:1px solid #ccc;zoom:1} -.tab.list ul:after{content:"";display:block;clear:both} -.tab.list li{float:left;margin-bottom:-1px} -.tab.list li a{position:relative;float:left;text-decoration:none;border:1px solid #eee;border-bottom-color:#ccc;background:#fafafa;color:#666} -.tab.list li a span{display:inline-block;padding:6px 25px 6px 25px;letter-spacing:-1px;cursor:pointer} -.tab.list li ul{width:100%;position:absolute;top:40px;left:0;list-style:none;border:0;margin:0;padding:0;zoom:1} -.tab.list li ul:after{content:"";display:block;clear:both} -.tab.list li li{float:none;position:relative;margin:0 0 8px 0;color:#999} -.tab.list li li a{float:none;padding:0;margin:0;border:0 !important;color:#666 !important;font-weight:normal;background:transparent;letter-spacing:normal} -.tab.list li li a:hover, -.tab.list li li a:active, -.tab.list li li a:focus{color:#000 !important;text-decoration:underline} -.tab.list li li .side{position:absolute;top:0;right:0;color:#767676} -.tab.list li li.more{position:absolute;top:-30px;right:0;border:0 !important;background:transparent} -.tab.list li.active a{border:1px solid #ccc;border-bottom:1px solid #fff;margin-top:-1px;background:transparent;color:#333} -.tab.list li.active a span{padding-top:7px;font-weight:bold} -.tab.list.jx{height:auto} -.tab.list.jx ul{border:0} -.tab.list.jx li{float:none;position:relative} -.tab.list.jx li a{float:none;display:block;font-weight:bold;color:#333;border:1px solid #eee !important;border-bottom-color:#ccc !important;background:#fafafa !important} -.tab.list.jx li ul{position:static;display:block !important;left:0;top:0;padding:5px 0} -.tab.list.jx li li a{display:inline;border:0 !important;background:none !important;font-weight:normal} -.tab.list.jx li li.more{top:7px;right:15px} -/* Vertical Navigation */ -.vNav{position:relative;margin:1em 0;line-height:normal;zoom:1} -.vNav ul{margin:0;padding:0;list-style:none} -.vNav li{position:relative;margin:0 0 -1px 0;vertical-align:top;zoom:1} -.vNav li a{display:block;position:relative;padding:8px 10px;text-decoration:none;color:#666;font-weight:bold;background:#fafafa;border:1px solid #eee;zoom:1} -.vNav li a .i{position:absolute;top:50%;left:100%;margin:-4px 0 0 -16px;width:8px;height:8px;color:#ccc;background:url(../img/iconNavVr.gif) no-repeat left top} -.vNav li ul{padding:5px 0;background:#fff} -.vNav li li{margin:0} -.vNav li li a{font-weight:normal;background:#fff;padding:5px 10px;border:0} -.vNav li li a span{color:#666} -.vNav li.active{border:1px solid #ccc;z-index:2} -.vNav li li.active{border:0} -.vNav li.active a{color:#000;border:0} -.vNav li.active .i{background-position:0 -44px} -.vNav li.active li a{border:0} -.vNav li.active ul{display:block;border-top:1px solid #eee} -.vNav li.active li.active a span{color:#13b200;font-weight:bold;letter-spacing:-1px} -/* Tree Navigation */ -.tNav{position:relative;margin:1em 0;zoom:1} -.tNav ul{list-style:none;margin:0;padding:0} -.tNav ul ul{margin:0 0 0 -3px} -.tNav li{position:relative;padding:0 0 0 22px;white-space:nowrap;line-height:20px;background:url(../img/lineTree.gif) no-repeat 9px 0;*zoom:1} -.tNav li.last{background-position:9px -1766px} -.tNav li.active a{font-weight:bold;color:#333} -.tNav li.active li a{font-weight:normal;color:#767676} -.tNav a{text-decoration:none;color:#767676} -.tNav a:hover, -.tNav a:active, -.tNav a:focus{text-decoration:underline} -.tNav .tNavToggle{position:absolute;top:0;left:0;width:19px;height:19px;padding:0;overflow:hidden;border:0;font-size:0;color:#fff;vertical-align:middle;text-indent:19px;*text-indent:0;background:transparent url(../img/btnPlusMinus.gif) no-repeat;cursor:pointer} -.tNav .tNavToggle.plus{background-position:5px -15px} -.tNav .tNavToggle.minus{background-position:5px 5px} /* Pagination */ .pagination{margin:1em 0;text-align:center;line-height:normal} .pagination *{vertical-align:middle} @@ -263,30 +150,6 @@ p{line-height:1.5} .btn.medium a{height:28px} .btn.large *{padding:0 18px;font-size:22px;height:36px;line-height:34px} .btn.large a{height:34px} -/* FAQ */ -.faq{border-bottom:1px solid #ddd;margin:1em 0} -.faq .faqHeader{position:relative;zoom:1} -.faq .faqHeader .showAll{position:absolute;bottom:0;right:0;border:0;padding:0;overflow:visible;background:none;cursor:pointer} -.faq .faqBody{margin:0;padding:0} -.faq .faqBody .article{list-style:none} -.faq .q{margin:0;border-top:1px solid #ddd} -.faq .q a{display:block;padding:.5em 1em;text-align:left;font-weight:bold;background:#fafafa;color:#000;text-decoration:none !important} -.faq .q a:hover, .faq .q a:active, .faq .q a:focus{background:#f8f8f8} -.faq .a{margin:0;padding:1em;line-height:1.5} -/* Horizontal Bar Graph */ -.hGraph ul{margin:1em 50px 1em 50px;padding:1px 0 0 0;border:1px solid #ddd;border-top:0;border-right:0;list-style:none} -.hGraph li{position:relative;margin:10px 0;white-space:nowrap;vertical-align:top} -.hGraph .gTerm{position:absolute;width:40px;top:0;left:-50px;line-height:20px;text-align:right;font-weight:bold} -.hGraph .gBar{position:relative;display:inline-block;height:20px;border:1px solid #ccc;border-left:0;background:#e9e9e9} -.hGraph .gBar span{position:absolute;width:40px;line-height:20px;top:0;right:-50px} -/* Vertical Bar Graph */ -.vGraph{margin:1em 0;padding:20px 0} -.vGraph ul{margin:0;padding:0;height:200px;border:1px solid #ddd;border-top:0;border-right:0;list-style:none} -.vGraph ul:after{content:"";display:block;clear:both} -.vGraph li{float:left;display:inline;width:8%;height:100%;margin:0 3%;position:relative;text-align:center;white-space:nowrap} -.vGraph .gTerm{position:relative;display:inline-block;width:100%;height:20px;line-height:20px;margin:0 -100% -20px 0;padding:200px 0 0 0;vertical-align:bottom;font-weight:bold} -.vGraph .gBar{position:relative;display:inline-block;width:100%;margin:-1px 0 0 0;border:1px solid #ccc;border-bottom:0;background:#e9e9e9;vertical-align:bottom} -.vGraph .gBar span{position:absolute;width:100%;top:-20px;left:0} /* Star Rating */ .starRating, .starRating span{display:inline-block;height:14px;background:transparent url(../img/iconStarRating.gif) no-repeat;overflow:hidden} .starRating{width:79px;vertical-align:top} @@ -301,7 +164,7 @@ p{line-height:1.5} .prgrs.prgrsSmall .pBar, .prgrs.prgrsSmall .pAction, .prgrs.prgrsSmall .pNum{height:16px;line-height:16px;font-size:11px} -.prgrs.prgrsMedium {font-size:24px;line-height:24px} +.prgrs.prgrsMedium{font-size:24px;line-height:24px} .prgrs.prgrsMedium .pBar, .prgrs.prgrsMedium .pAction, .prgrs.prgrsMedium .pNum{height:22px;line-height:22px;font-size:12px} @@ -385,7 +248,7 @@ button.text{border:0;overflow:visible;padding:0;margin:0;color:#33a;background:n .header .account a.language{padding-right:2px} .header #language{position:absolute;top:19px;right:0;padding:6px 4px !important;border:1px solid #666;border-top:0;background:#333} .header #language li{border:0;display:block;padding:1px 8px;text-align:left;line-height:1} -.header #language li.selected{background:transparent url(../img/checked.png) no-repeat left center;} +.header #language li.selected{background:transparent url(../img/checked.png) no-repeat left center} .header h1 a:hover, .header h1 a:active, .header h1 a:focus, @@ -414,10 +277,10 @@ button.text{border:0;overflow:visible;padding:0;margin:0;color:#33a;background:n .content .portlet a:active, .content .portlet a:focus{text-decoration:underline} /* Dashboard */ -.dashboard{position:relative; float:none;width:auto;margin-left:-230px} -.dashboard .portlet{float:left;width:48%; margin-right:1em} -.dashboard .portlet:nth-of-type(even){ float:left; width:49%; margin-right:0 } -.dashboard .portlet:nth-of-type(even){ float:right; width:49%; margin-right:0} +.dashboard{position:relative;float:none;width:auto;margin-left:-230px} +.dashboard .portlet{float:left;width:48%;margin-right:1em} +.dashboard .portlet:nth-of-type(even){ float:left;width:49%;margin-right:0 } +.dashboard .portlet:nth-of-type(even){ float:right;width:49%;margin-right:0} /* Local Navigation */ .lnb{position:relative;float:left;width:200px;margin:1em 0 1em -230px;line-height:normal;zoom:1;display:inline} .lnb .h2{margin-top:0} @@ -501,24 +364,44 @@ button.text{border:0;overflow:visible;padding:0;margin:0;color:#33a;background:n .btnArea{margin:1em 0;text-align:right;zoom:1} .btnArea:after{content:"";display:block;clear:both} /* Multilingual */ -#vLangEdit{background:#fff;position:absolute;*left:0;*margin-top:28px;z-index:10;box-shadow:3px 3px 6px #999;-moz-box-shadow:3px 3px 6px #999;-webkit-box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} -#vLangEdit ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0} -#vLangEdit li{padding:.5em 10px} -#vLangEdit input[type=text]{width:220px;padding-right:40px} -#vLangEdit label{left:15px !important} -#vLangEdit .action{border:1px solid #eee;width:268px;padding:0 10px} -#vLangEdit p, #vLangEdit .btnArea{white-space:normal} -input#lang_en{background:url(../img/flag.us.gif) no-repeat 96% center} -input#lang_ko{background:url(../img/flag.kr.gif) no-repeat 96% center} -input#lang_ja{background:url(../img/flag.jp.gif) no-repeat 96% center} -input#lang_zh{background:url(../img/flag.cn.gif) no-repeat 96% center} -input#lang_fr{background:url(../img/flag.fr.gif) no-repeat 96% center} -input#lang_de{background:url(../img/flag.de.gif) no-repeat 96% center} -input#lang_ru{background:url(../img/flag.ru.gif) no-repeat 96% center} -input#lang_tr{background:url(../img/flag.tr.gif) no-repeat 96% center} -input#lang_vi{background:url(../img/flag.vn.gif) no-repeat 96% center} -input#lang_mn{background:url(../img/flag.mn.gif) no-repeat 96% center} - +.langEdit{background:#fff;position:absolute;*left:0;*margin-top:28px;z-index:10;box-shadow:3px 3px 6px #999;-moz-box-shadow:3px 3px 6px #999;-webkit-box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} +.langEdit ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0} +.langEdit li{padding:.5em 10px} +.langEdit input[type=text]{width:220px;padding-right:40px} +.langEdit label{left:15px !important} +.langEdit .action{border:1px solid #eee;width:268px;padding:0 10px} +.langEdit p, .langEdit .btnArea{white-space:normal} +.langEdit li.en input, .mLangEdit li.en textarea{background:url(../img/flag.us.gif) no-repeat 99% 5px} +.langEdit li.ko input, .mLangEdit li.ko textarea{background:url(../img/flag.kr.gif) no-repeat 99% 5px} +.langEdit li.ja input, .mLangEdit li.ja textarea{background:url(../img/flag.jp.gif) no-repeat 99% 5px} +.langEdit li.zh input, .mLangEdit li.zh textarea{background:url(../img/flag.cn.gif) no-repeat 99% 5px} +.langEdit li.fr input, .mLangEdit li.fr textarea{background:url(../img/flag.fr.gif) no-repeat 99% 5px} +.langEdit li.de input, .mLangEdit li.de textarea{background:url(../img/flag.de.gif) no-repeat 99% 5px} +.langEdit li.ru input, .mLangEdit li.ru textarea{background:url(../img/flag.ru.gif) no-repeat 99% 5px} +.langEdit li.es input, .mLangEdit li.es textarea{background:url(../img/flag.es.gif) no-repeat 99% 5px} +.langEdit li.tr input, .mLangEdit li.tr textarea{background:url(../img/flag.tr.gif) no-repeat 99% 5px} +.langEdit li.vi input, .mLangEdit li.vi textarea{background:url(../img/flag.vn.gif) no-repeat 99% 5px} +.langEdit li.mn input, .mLangEdit li.mn textarea{background:url(../img/flag.mn.gif) no-repeat 99% 5px} +.mLangEdit.en strong{background:url(../img/flag.us.gif) no-repeat 0 10px} +.mLangEdit.ko strong{background:url(../img/flag.kr.gif) no-repeat 0 10px} +.mLangEdit.ja strong{background:url(../img/flag.jp.gif) no-repeat 0 10px} +.mLangEdit.zh strong{background:url(../img/flag.cn.gif) no-repeat 0 10px} +.mLangEdit.fr strong{background:url(../img/flag.fr.gif) no-repeat 0 10px} +.mLangEdit.de strong{background:url(../img/flag.de.gif) no-repeat 0 10px} +.mLangEdit.ru strong{background:url(../img/flag.ru.gif) no-repeat 0 10px} +.mLangEdit.es strong{background:url(../img/flag.es.gif) no-repeat 0 10px} +.mLangEdit.tr strong{background:url(../img/flag.tr.gif) no-repeat 0 10px} +.mLangEdit.vi strong{background:url(../img/flag.vn.gif) no-repeat 0 10px} +.mLangEdit.mn strong{background:url(../img/flag.mn.gif) no-repeat 0 10px} +.mLangEdit ul{ border:0} +.mLangEdit li{ position:relative;padding:0} +.mLangEdit li strong{ display:inline-block;padding:6px 100px 8px 24px;font-weight:normal;line-height:1.5} +.mLangEdit li .side{ position:absolute;top:8px;right:0;padding-right:18px;background:url(../img/iconArrow.gif) no-repeat right -160px} +.mLangEdit li li{ border:0;padding-right:40px} +.mLangEdit li li textarea{ width:100%;height:16px;padding-right:30px;resize:vertical;line-height:1.4} +.mLangEdit li label{ top:8px !important} +.mLangEdit li.active strong{ font-weight:bold} +.mLangEdit li.active .side{ background-position:right -128px} /* Suggestion */ .suggestion{display:none;position:absolute;background:#fff;z-index:10;_height:200px;max-height:200px;overflow:auto;*left:0;*margin-top:28px;box-shadow:3px 3px 6px #999;-moz-box-shadow:3px 3px 6px #999;-webkit-box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} .suggestion ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0} @@ -573,8 +456,8 @@ input#lang_mn{background:url(../img/flag.mn.gif) no-repeat 96% center} .thumbPreview .selected .i ul{display:block;list-style:none;border:0;margin:1em 0 1em 200px} .thumbPreview .selected .i li{border:0;padding:0;margin:0 0 .2em 0} .thumbPreview.jx .i label{display:inline;width:auto} -.thumbPreview.jx .i.noDirection {display:none} -.thumbPreview.jx .i input {display:inline} +.thumbPreview.jx .i.noDirection{display:none} +.thumbPreview.jx .i input{display:inline} #skin .showAll{float:right;border:0;overflow:visible;padding:0 18px 0 0;cursor:pointer;color:#00f;background:url(../img/iconArrow.gif) no-repeat right -32px} #skin .showAll.hideAll{background-position:right 0} /* Sign Up Form */ @@ -602,9 +485,8 @@ input#lang_mn{background:url(../img/flag.mn.gif) no-repeat 96% center} .textList li{border:0;padding:.25em 1em;height:1.5em;white-space:nowrap;overflow:hidden} .textList li:nth-child(even){background:#eee} .textList li a{float:right} - /* Responsive Layout */ -@media only all and (max-width:860px) { +@media only all and (max-width:860px){ .header h1{margin-left:.7em} .header .account{padding-right:1em} .header .siteTool{padding-right:1em} @@ -612,13 +494,13 @@ input#lang_mn{background:url(../img/flag.mn.gif) no-repeat 96% center} .body{padding:1em} .content{float:none;margin-left:0} .lnb{float:none;width:auto;margin:1em 0} - .dashboard .portlet{float:none !important;width:auto !important; margin-right:0} + .dashboard .portlet{float:none !important;width:auto !important;margin-right:0} .modal .fg, .wfsr .fg{width:auto} .easyNav .category{float:none;display:block;width:auto} .easyNav .filter{position:static} } -@media only all and (max-width:640px) { +@media only all and (max-width:640px){ .skipNav a{position:relative;width:auto;height:auto} .modal{position:absolute} } diff --git a/modules/admin/tpl/css/admin.min.css b/modules/admin/tpl/css/admin.min.css index 6c7901900..09a40e563 100644 --- a/modules/admin/tpl/css/admin.min.css +++ b/modules/admin/tpl/css/admin.min.css @@ -1 +1 @@ -@charset "utf-8";/* NHN (developers@xpressengine.com) *//* Element Reset */body,table,input,textarea,select,button{font-family:Tahoma,Geneva,sans-serif;font-size:12px;color:#333}header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{display:block}button,input[type=submit],input[type=reset],input[type=button]{cursor:pointer;overflow:visible}body{margin:0}img{border:0}p{line-height:1.5}/* Section & Heading */.section{margin:1em 0;padding:0;border:0}.h1, .h2, .h3, .h4{position:relative;border-bottom-style:solid;border-bottom-color:#ccc;zoom:1}.h1{border-bottom-width:4px;font-size:24px}.h2{border-bottom-width:3px;font-size:20px}.h3{border-bottom-width:2px;font-size:16px}.h4{border-bottom-width:1px;font-size:12px}/* Portlet */.portlet{position:relative;border:1px solid #e9e9e9;margin:1em 0;padding:0;background:#fff;zoom:1;overflow:hidden;border-radius:5px}.portlet h2, .portlet h3{margin:0;padding:.5em 1em;font-size:14px;border:1px solid #fff;border-bottom:1px solid #e9e9e9;background:#f7f7f7;border-radius:5px 5px 0 0}.portlet p{margin:1em 1.2em}.portlet li{position:relative;padding-right:8em}.portlet .lined{margin:1px;padding:0;list-style:none}.portlet .lined li{padding:.5em 8em .5em 1em;border-top:1px solid #eee;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis}.portlet .lined li:first-child{border:0}.portlet .side{position:absolute;top:0;_top:1px;right:0;color:#666;background:#fff;padding:0 1em}.portlet .lined .side{padding:.5em 1em}.portlet .more{position:absolute;top:.5em;right:1em;text-decoration:none !important;color:#666}.portlet .more span{color:#999}.portlet .action{text-align:right;top:0;right:0;padding:.5em 1em .5em 3em;background:#fff;background:-webkit-gradient(linear, 0% 0%, 100% 0%, from(rgba(255,255,255,0)), to(rgba(255,255,255,1)), color-stop(15%, #fff));background:-moz-linear-gradient(left, rgba(255,255,255,0) 0, rgba(255,255,255,1) 15%)}.portlet .action a,.portlet .action button{margin-left:1em}.portlet .btnArea{border-top:1px solid #ddd;margin:0;padding:.5em 1em;margin:0 1px 1px 1px;background:#f7f7f7;border-radius:0 0 5px 5px}/* Table */.table{margin:1em 0}.table table{width:100%;border:0;border-collapse:collapse;border-top:2px solid #ccc}.table caption{padding:8px 0;font-weight:bold;text-align:left;line-height:32px}.table caption:after{content:"";display:block;clear:both}.table caption a{font-weight:normal}.table caption em{float:right;font-style:normal;font-weight:normal;color:#e00;margin-left:1em}.table caption strong{color:#e00}.table caption .side{float:right;font-weight:normal;margin-left:1em}.table th,.table td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd;white-space:nowrap}.table th{background:#f8f8f8}.table thead th{border-bottom:1px solid #999}.table tfoot td{font-weight:bold;background:#f8f8f8}.table.even tbody tr:nth-of-type(even) td{background-color:#fafafa}.table input[type=text]{margin:-1px 0 -3px 0;vertical-align:middle}.table img{vertical-align:middle}.table .title,.table .text{white-space:normal}.table .h1 + table,.table .h2 + table,.table .h3 + table,.table .h4 + table,.h1 + .table table,.h2 + .table table,.h3 + .table table,.h4 + .table table{border-top:0}/* Form */.form{margin:1em 0;padding:0}.form fieldset{margin:0 0 2em 0;padding:0;border:0}.form em{font-style:normal;color:#e00}.form label{margin-right:1em;line-height:1}.form input[type=checkbox]+label,.form input[type=radio]+label,.form input[type=file]{cursor:pointer}.form ul{position:relative;margin:0;padding:0;list-style:none;border-top:2px solid #ccc;border-bottom:1px solid #ccc;zoom:1}.form li{list-style:none;border:1px solid #ddd;border-left:0;border-right:0;margin:-1px 0;padding:8px 0;vertical-align:top;zoom:1}.form li:first-child{border-top:0}.form li>label:first-child{display:block;font-weight:bold}.form li label em{font-weight:normal}.form input[type=text],.form input[type=password],.form input[type=file],textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:transparent}.form input[type=text],.form input[type=password],.form input[type=file]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px}.form input[type=checkbox],.form input[type=radio]{margin:0;padding:0;width:13px;height:13px;vertical-align:middle}.form *[disabled=disabled]{background:#ddd;text-shadow:1px 1px 0 #fff}.form textarea{padding:3px 4px;vertical-align:top}.form span.desc{line-height:22px;vertical-align:middle;margin:0 10px}.form p.desc{margin:.25em 0;line-height:1.4}.form .q{font-weight:bold;margin:0 0 5px 0}.form .a{margin:0 0 5px 0}.form .tgForm{margin-right:1em}.form .h1 + ul,.form .h2 + ul,.form .h3 + ul,.form .h4 + ul{border-top:0}/* Global Navigation Bar */.gnb{position:relative;clear:both;border:1px solid #c1c1c1;border-left:0;border-right:0;background-color:#efefef;background:#efefef -webkit-gradient(linear, 0% 0%, 0% 100%, from(#efefef), to(#dcdcdc));background:#efefef -moz-linear-gradient(top, #efefef, #dcdcdc);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#efefef, endColorStr=#dcdcdc);zoom:1}.gnb ul{margin:0;padding:0 0 0 2em;list-style:none;border:1px solid #fff;border-left:0;border-right:0;zoom:1}.gnb ul ul{position:absolute;top:33px;left:0;border:1px solid #ccc;padding:0;background:#fff}.gnb ul:after{content:"";display:block;clear:both}.gnb li{position:relative;float:left;border:1px solid #fff;border-top:0;border-bottom:0;margin:0 -1px 0 0}.gnb li li{float:none;clear:both;overflow:hidden;border:0;border-top:1px dotted #ccc;margin:0;padding:2px}.gnb li li:first-child{border:0}.gnb li a{float:left;font-weight:bold;color:#333;font-size:12px;padding:8px 18px;white-space:nowrap;text-decoration:none;text-shadow:0 1px 0 #fff;zoom:1}.gnb li a:hover,.gnb li a:active,.gnb li a:focus,.gnb li.active a,.gnb li.activeOn a{background:#fff;border:1px solid #ddd;padding:7px 17px}.gnb li li a{display:block;float:none;color:#555;padding:5px 15px !important;font-weight:normal !important;border:0 !important}.gnb li li a:hover,.gnb li li a:active,.gnb li li a:focus{border:0;background:#eee}.gnb .setting{position:absolute;top:8px;right:2em;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;background:url(../img/iconSetting.gif) no-repeat center}.gnb.jx ul{display:block;position:static;padding:0}.gnb.jx li{float:none;clear:both;border-top:1px solid #ccc}.gnb.jx ul ul{border:0}.gnb.jx li li{border:0}.gnb.jx li a{float:none;display:block}.gnb.jx li a:hover,.gnb.jx li a:active,.gnb.jx li a:focus{background:none}.gnb.jx li.activeOn>a{background:#ddd}@media only all and (max-width:860px) { .gnb ul{padding-left:1em} .gnb .setting{right:1em}}@media only all and (max-width:640px) { .gnb ul{display:block;position:static;padding:0} .gnb li{float:none;clear:both;border-top:1px solid #ccc} .gnb ul ul{border:0;position:static} .gnb li li{border:0} .gnb li a{float:none;display:block} .gnb li a:hover, .gnb li a:active, .gnb li a:focus{background:none} .gnb li.activeOn>a{background:#ddd}}/* Lined Tab Navigation */.tab.line{padding:0 0 35px 0;margin:1em 0}.tab.line ul{position:relative;margin:0;padding:0;list-style:none;border-bottom:1px solid #ccc;zoom:1}.tab.line ul:after{content:"";display:block;clear:both}.tab.line li{float:left;margin-bottom:-1px}.tab.line li a{position:relative;float:left;text-decoration:none;border:1px solid #eee;border-bottom-color:#ccc;background:#fafafa;color:#333}.tab.line li a span{display:inline-block;height:14px;padding:6px 25px 6px 25px;letter-spacing:-1px;cursor:pointer}.tab.line li ul{width:100%;position:absolute;top:40px;left:0;list-style:none;border:0;margin:0;padding:0;white-space:nowrap;overflow:hidden;zoom:1}.tab.line li ul:after{content:"";display:block;clear:both}.tab.line li li{position:relative;left:-1px;padding:0 10px;border-left:1px solid #ddd;overflow:visible}.tab.line li li a{padding:0;margin:0;border:0 !important;color:#666 !important;font-weight:normal;background:transparent;letter-spacing:normal}.tab.line li.active a{border:1px solid #ccc;border-bottom:1px solid #fff;margin-top:-1px;background:transparent}.tab.line li.active a span{padding-top:7px;font-weight:bold}.tab.line li li a:hover,.tab.line li li a:active,.tab.line li li a:focus,.tab.line li li.active a{font-weight:bold;letter-spacing:-1px;color:#333 !important}.tab.line.jx{padding:0}.tab.line.jx ul{border:0}.tab.line.jx li{float:none}.tab.line.jx li a{float:none;display:block;font-weight:bold;color:#333;border:1px solid #eee !important;border-bottom-color:#ccc !important;background:#fafafa !important}.tab.line.jx li ul{position:static;display:block !important;padding:5px 0;left:0;top:0}.tab.line.jx li li{display:inline}.tab.line.jx li li a{display:inline;letter-spacing:normal;border:0 !important;font-weight:normal !important;color:#666 !important;background:none !important}.tab.line.jx li li a:hover,.tab.line.jx li li a:active,.tab.line.jx li li a:focus{text-decoration:underline}/* Faced Tab Navigation */.tab.face{padding:0 0 35px 0;margin:1em 0}.tab.face ul{position:relative;margin:0;padding:0;_padding:2px 0 0 0;list-style:none;border-bottom:2px solid #315593;zoom:1}.tab.face ul:after{content:"";display:block;clear:both}.tab.face li{float:left;margin-right:1px;background:#4CB1E5}.tab.face li a,.tab.face li a span{position:relative;cursor:pointer}.tab.face li a{float:left;text-decoration:none}.tab.face li a span{display:inline-block;padding:6px 25px 6px 25px;color:#fff}.tab.face li ul{width:100%;position:absolute;top:40px;left:0;list-style:none;border:0;margin:0;padding:0;white-space:nowrap;overflow:hidden;zoom:1}.tab.face li ul:after{content:"";display:block;clear:both}.tab.face li li{position:relative;left:-1px;padding:0 10px;border-left:1px solid #ddd;overflow:visible;background:transparent !important}.tab.face li li a{padding:0;margin:0;font-weight:normal;color:#666}.tab.face li.active{background-color:#315593;margin-top:-1px}.tab.face li.active a span{padding-top:7px;padding-bottom:7px;font-weight:bold;letter-spacing:-1px}.tab.face li li a:hover,.tab.face li li a:active,.tab.face li li a:focus,.tab.face li li.active a{font-weight:bold;letter-spacing:-1px;color:#333}.tab.face.jx{padding:0}.tab.face.jx ul{border:0}.tab.face.jx li{float:none}.tab.face.jx li a{float:none;font-weight:bold}.tab.face.jx li ul{display:block !important;position:static;padding:5px 0;left:0;top:0;background:#fff}.tab.face.jx li li{display:inline}.tab.face.jx li li a{font-weight:normal !important;color:#666;letter-spacing:normal}.tab.face.jx li li a:hover,.tab.face.jx li li a:active,.tab.face.jx li li a:focus{text-decoration:underline}/* Tab + List */.tab.list{height:160px;margin:1em 0}.tab.list ul{position:relative;margin:0;padding:0;list-style:none;border-bottom:1px solid #ccc;zoom:1}.tab.list ul:after{content:"";display:block;clear:both}.tab.list li{float:left;margin-bottom:-1px}.tab.list li a{position:relative;float:left;text-decoration:none;border:1px solid #eee;border-bottom-color:#ccc;background:#fafafa;color:#666}.tab.list li a span{display:inline-block;padding:6px 25px 6px 25px;letter-spacing:-1px;cursor:pointer}.tab.list li ul{width:100%;position:absolute;top:40px;left:0;list-style:none;border:0;margin:0;padding:0;zoom:1}.tab.list li ul:after{content:"";display:block;clear:both}.tab.list li li{float:none;position:relative;margin:0 0 8px 0;color:#999}.tab.list li li a{float:none;padding:0;margin:0;border:0 !important;color:#666 !important;font-weight:normal;background:transparent;letter-spacing:normal}.tab.list li li a:hover,.tab.list li li a:active,.tab.list li li a:focus{color:#000 !important;text-decoration:underline}.tab.list li li .side{position:absolute;top:0;right:0;color:#767676}.tab.list li li.more{position:absolute;top:-30px;right:0;border:0 !important;background:transparent}.tab.list li.active a{border:1px solid #ccc;border-bottom:1px solid #fff;margin-top:-1px;background:transparent;color:#333}.tab.list li.active a span{padding-top:7px;font-weight:bold}.tab.list.jx{height:auto}.tab.list.jx ul{border:0}.tab.list.jx li{float:none;position:relative}.tab.list.jx li a{float:none;display:block;font-weight:bold;color:#333;border:1px solid #eee !important;border-bottom-color:#ccc !important;background:#fafafa !important}.tab.list.jx li ul{position:static;display:block !important;left:0;top:0;padding:5px 0}.tab.list.jx li li a{display:inline;border:0 !important;background:none !important;font-weight:normal}.tab.list.jx li li.more{top:7px;right:15px}/* Vertical Navigation */.vNav{position:relative;margin:1em 0;line-height:normal;zoom:1}.vNav ul{margin:0;padding:0;list-style:none}.vNav li{position:relative;margin:0 0 -1px 0;vertical-align:top;zoom:1}.vNav li a{display:block;position:relative;padding:8px 10px;text-decoration:none;color:#666;font-weight:bold;background:#fafafa;border:1px solid #eee;zoom:1}.vNav li a .i{position:absolute;top:50%;left:100%;margin:-4px 0 0 -16px;width:8px;height:8px;color:#ccc;background:url(../img/iconNavVr.gif) no-repeat left top}.vNav li ul{padding:5px 0;background:#fff}.vNav li li{margin:0}.vNav li li a{font-weight:normal;background:#fff;padding:5px 10px;border:0}.vNav li li a span{color:#666}.vNav li.active{border:1px solid #ccc;z-index:2}.vNav li li.active{border:0}.vNav li.active a{color:#000;border:0}.vNav li.active .i{background-position:0 -44px}.vNav li.active li a{border:0}.vNav li.active ul{display:block;border-top:1px solid #eee}.vNav li.active li.active a span{color:#13b200;font-weight:bold;letter-spacing:-1px}/* Tree Navigation */.tNav{position:relative;margin:1em 0;zoom:1}.tNav ul{list-style:none;margin:0;padding:0}.tNav ul ul{margin:0 0 0 -3px}.tNav li{position:relative;padding:0 0 0 22px;white-space:nowrap;line-height:20px;background:url(../img/lineTree.gif) no-repeat 9px 0;*zoom:1}.tNav li.last{background-position:9px -1766px}.tNav li.active a{font-weight:bold;color:#333}.tNav li.active li a{font-weight:normal;color:#767676}.tNav a{text-decoration:none;color:#767676}.tNav a:hover,.tNav a:active,.tNav a:focus{text-decoration:underline}.tNav .tNavToggle{position:absolute;top:0;left:0;width:19px;height:19px;padding:0;overflow:hidden;border:0;font-size:0;color:#fff;vertical-align:middle;text-indent:19px;*text-indent:0;background:transparent url(../img/btnPlusMinus.gif) no-repeat;cursor:pointer}.tNav .tNavToggle.plus{background-position:5px -15px}.tNav .tNavToggle.minus{background-position:5px 5px}/* Pagination */.pagination{margin:1em 0;text-align:center;line-height:normal}.pagination *{vertical-align:middle}.pagination a,.pagination strong{position:relative;display:inline-block;padding:2px 4px;font-weight:bold;text-decoration:none;line-height:normal;color:#333 !important;vertical-align:middle}.pagination a:hover,.pagination a:active,.pagination a:focus{border:1px solid #ddd;margin:0 -1px}.pagination strong{color:#e00 !important;font-size:20px}.pagination .direction{font-weight:normal;white-space:nowrap}.pagination .direction:hover,.pagination .direction:active,.pagination .direction:focus{border:0;margin:0;text-decoration:underline}.pagination input{width:30px;text-align:center}.pagination button{overflow:visible}/* Button */.btn{position:relative;display:inline-block;margin:2px;vertical-align:top}.btn *{display:inline-block;padding:0 8px;font-size:12px;height:24px;line-height:22px;margin:0;font-weight:bold !important;color:#fff;text-decoration:none !important;border:1px solid;cursor:pointer;overflow:visible;border-radius:3px;box-shadow:inset 0 0 1px #fff;-moz-box-shadow:inset 0 0 1px #fff;-webkit-box-shadow:inset 0 0 1px #fff;background-color:#666;text-shadow:0 -1px 0 #333;zoom:1}.btn a, .btn button[type=button]{border-color:#ccc;color:#333 !important;background:#eee -webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#ddd));background:#eee -moz-linear-gradient(top,#fff,#ddd);background-color:#eee;text-shadow:1px 1px 0 #fff;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#ffffff, endColorStr=#dddddd)}.btn input, .btn button[type=submit]{border-color:#666;background:#333 -webkit-gradient(linear,0% 0%,0% 100%,from(#777),to(#777),color-stop(0.5,#333),color-stop(0.5,#000));background:#333 -moz-linear-gradient(top,#777,#000);background-color:#333;color:#ffc;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#777777, endColorStr=#333333)}.btn a{height:22px}.btn.medium *{padding:0 12px;font-size:16px;height:30px;line-height:28px}.btn.medium a{height:28px}.btn.large *{padding:0 18px;font-size:22px;height:36px;line-height:34px}.btn.large a{height:34px}/* FAQ */.faq{border-bottom:1px solid #ddd;margin:1em 0}.faq .faqHeader{position:relative;zoom:1}.faq .faqHeader .showAll{position:absolute;bottom:0;right:0;border:0;padding:0;overflow:visible;background:none;cursor:pointer}.faq .faqBody{margin:0;padding:0}.faq .faqBody .article{list-style:none}.faq .q{margin:0;border-top:1px solid #ddd}.faq .q a{display:block;padding:.5em 1em;text-align:left;font-weight:bold;background:#fafafa;color:#000;text-decoration:none !important}.faq .q a:hover, .faq .q a:active, .faq .q a:focus{background:#f8f8f8}.faq .a{margin:0;padding:1em;line-height:1.5}/* Horizontal Bar Graph */.hGraph ul{margin:1em 50px 1em 50px;padding:1px 0 0 0;border:1px solid #ddd;border-top:0;border-right:0;list-style:none}.hGraph li{position:relative;margin:10px 0;white-space:nowrap;vertical-align:top}.hGraph .gTerm{position:absolute;width:40px;top:0;left:-50px;line-height:20px;text-align:right;font-weight:bold}.hGraph .gBar{position:relative;display:inline-block;height:20px;border:1px solid #ccc;border-left:0;background:#e9e9e9}.hGraph .gBar span{position:absolute;width:40px;line-height:20px;top:0;right:-50px}/* Vertical Bar Graph */.vGraph{margin:1em 0;padding:20px 0}.vGraph ul{margin:0;padding:0;height:200px;border:1px solid #ddd;border-top:0;border-right:0;list-style:none}.vGraph ul:after{content:"";display:block;clear:both}.vGraph li{float:left;display:inline;width:8%;height:100%;margin:0 3%;position:relative;text-align:center;white-space:nowrap}.vGraph .gTerm{position:relative;display:inline-block;width:100%;height:20px;line-height:20px;margin:0 -100% -20px 0;padding:200px 0 0 0;vertical-align:bottom;font-weight:bold}.vGraph .gBar{position:relative;display:inline-block;width:100%;margin:-1px 0 0 0;border:1px solid #ccc;border-bottom:0;background:#e9e9e9;vertical-align:bottom}.vGraph .gBar span{position:absolute;width:100%;top:-20px;left:0}/* Star Rating */.starRating, .starRating span{display:inline-block;height:14px;background:transparent url(../img/iconStarRating.gif) no-repeat;overflow:hidden}.starRating{width:79px;vertical-align:top}.starRating span{font-size:0;line-height:0;vertical-align:top;text-indent:-100px;*text-indent:0;background-position:0 -14px}/* Progress */.prgrs{white-space:nowrap;line-height:normal;vertical-align:middle}.prgrs *{vertical-align:middle}.prgrs .pBar{position:relative;display:inline-block;background:#e9e9e9;margin:0 5px 0 0}.prgrs .pAction{display:inline-block;vertical-align:top;background:#99a6b6}.prgrs .pNum{position:absolute;width:100%;left:0;top:0;text-align:center;text-shadow:1px 1px 0 #fff}.prgrs.prgrsSmall{font-size:14px;line-height:14px}.prgrs.prgrsSmall .pBar,.prgrs.prgrsSmall .pAction,.prgrs.prgrsSmall .pNum{height:16px;line-height:16px;font-size:11px}.prgrs.prgrsMedium {font-size:24px;line-height:24px}.prgrs.prgrsMedium .pBar,.prgrs.prgrsMedium .pAction,.prgrs.prgrsMedium .pNum{height:22px;line-height:22px;font-size:12px}.prgrs.prgrsLarge{font-size:38px;line-height:38px}.prgrs.prgrsLarge .pBar,.prgrs.prgrsLarge .pAction,.prgrs.prgrsLarge .pNum{height:34px;line-height:34px;font-size:14px}/* Layer */.layer{position:absolute;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;font-weight:normal;z-index:2;zoom:1;border-radius:5px;box-shadow:0 0 6px #666;-moz-box-shadow:0 0 6px #666;-webkit-box-shadow:0 0 6px #666;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.layer h2{margin-top:1em}.layer ul, .layer ol, .layer .lined, .layer .table{margin-bottom:1em}.layerClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px}.layerBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}/* Modal Window */.modal{position:fixed;*position:absolute;top:0;left:0;width:100%;_height:100%;min-height:100%;z-index:100}.modal .bg{position:absolute;background:#000;_background:none;width:100%;height:100%;opacity:.5;z-index:2;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1}.modal .fg{position:relative;width:50%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:3;zoom:1;border-radius:5px;box-shadow:0 0 6px #000;-moz-box-shadow:0 0 6px #000;-webkit-box-shadow:0 0 6px #000}.modal h2{margin-top:1em}.modal ul, .modal ol, .modal .lined, .modal .table{margin-bottom:1em}.modal .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1}.modalClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px}.modalBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}html.modalContainer,body.modalContainer{_height:100%;_width:100%} /* IE6 only */ /* Message */.message{border:1px solid #ddd;background:#f8f8f8;margin:1em 0;padding:0 1em;border-radius:5px}.message em{font-style:normal;color:#e00}.message.info,.message.error,.message.update{padding-left:55px}.message.info{border-color:#E0E8EC;background:#EDF9FF url(../img/msg.Info.png) no-repeat 1em .5em}.message.error{border-color:#EFDCDC;background:#FFECEC url(../img/msg.error.png) no-repeat 1em .5em}.message.update{border-color:#EAE9DC;background:#FFFDEF url(../img/msg.update.png) no-repeat 1em .5em}/* Text Button */input.text, button.text{border:0;overflow:visible;padding:0;margin:0;color:#33a;background:none;text-decoration:underline}/* H2 Anchor */.h2Anchor{position:absolute;right:0;border:0;background:none;color:#00f;text-decoration:underline}/* Waiting for server response */#wfsr .bg{position:absolute;background:#000;_background:none;width:100%;height:100%;opacity:.5;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1}#wfsr .fg{position:relative;width:50%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:10px solid #ddd;z-index:2;zoom:1}#wfsr .fg p{padding:0 0 0 2.5em;background:url(../img/preLoader16.gif) no-repeat 1em .4em}#wfsr .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1}.wfsrActive{position:fixed;_position:absolute;top:0;left:0;width:100%;height:100%;z-index:100}.wfsrClose{position:absolute;right:-10px;top:-10px;border:0;background:#ddd;padding:0;width:34px;height:34px;font-size:16px;font-weight:bold;cursor:pointer;color:#999}.wfsrBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}/* Skip Navigation */.skipNav{margin:0;text-align:center;overflow:hidden}.skipNav a{position:absolute;width:1px;height:1px;display:block;color:#fff;font-weight:bold;padding:10px 0;background:#333;border-top:1px solid #656565}.skipNav a:hover,.skipNav a:active,.skipNav a:focus{position:relative;width:auto;height:auto}/* Header */.header{position:relative;z-index:2;padding:30px 0 0 0;background:#4c4c4c;box-shadow:0 0 10px #aaa;-moz-box-shadow:0 0 10px #aaa;-webkit-box-shadow:0 0 10px #aaa;zoom:1}.stAdmin .header{background:#2D808A}.header:after{content:"";display:block;clear:both}.header a{text-decoration:none}.header h1{margin:0 100px 10px 1.3em;font-size:24px;line-height:32px}.header h1 *{vertical-align:middle}.header h1 a{color:#fff;text-shadow:1px 1px 0 #000;filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=1, OffY=1, Color=#000000, Positive=true);zoom:1}.header h1 img{height:32px}.header h1 .url{font-size:12px;font-weight:normal}.header .siteTool{position:absolute !important;top:42px;right:0;padding:0 2em 0 0;z-index:2}.header .siteTool .i{position:relative;z-index:2;display:inline-block;color:#fff;padding:0 6px;line-height:24px}.header .siteTool .i:first-child{border:0}.header .siteTool .tgAnchor{padding-right:16px;background:url(../img/iconArrow.gif) no-repeat right -156px}.header .siteTool .tgAnchor.active{border:1px solid #ccc;border-bottom:0;background-color:#fff;color:#333;text-decoration:none;border-radius:5px 5px 0 0}.header .siteTool .tgContent{position:absolute;top:24px;right:2em;border:1px solid #ccc;z-index:1;background-color:#fff;border-radius:5px 0 5px 5px}.header .siteTool .tgContent .btnArea{margin:0}.header #moveSiteList{padding:10px 1em 5px 1em;margin:0}.header #moveSiteList ul{list-style:none;margin:0;padding:0}.header #moveSiteList li{white-space:nowrap;margin:0;padding:4px 0;border-bottom:1px dotted #ccc}.header #siteMapList{padding:0 1em 1em 1em;margin:0}.header #siteMapList li{white-space:nowrap}.header .account{position:absolute;z-index:3;width:100%;padding:5px 2em 5px 0;top:0;right:0;white-space:nowrap;text-align:right;background:#333;border-bottom:1px solid #656565;color:#fff;font-size:12px;box-shadow:0 0 10px #333;-moz-box-shadow:0 0 10px #333;-webkit-box-shadow:0 0 10px #333}.stAdmin .header .account{background:#0e5f69}.header .account ul{margin:0 2px 0 0;padding:0;list-style:none}.header .account li{position:relative;display:inline;border-left:1px solid #666;padding:0 6px 0 10px}.header .account li:first-child{border:0}.header .account a{color:#fff;display:inline-block;height:14px}.header .account a.language{padding-right:2px}.header #language{position:absolute;top:19px;right:0;padding:6px 4px !important;border:1px solid #666;border-top:0;background:#333}.header #language li{border:0;display:block;padding:1px 8px;text-align:left;line-height:1}.header #language li.selected{background:transparent url(../img/checked.png) no-repeat left center;}.header h1 a:hover,.header h1 a:active,.header h1 a:focus,.header .siteTool a:hover,.header .siteTool a:active,.header .siteTool a:focus,.header .account a:hover,.header .account a:active,.header .account a:focus{color:#6e9cf2;text-decoration:underline}/* Footer */.footer{border-top:1px solid #ddd;text-align:center;font-size:12px;padding:1.5em 0;margin:0 2em}.footer p{margin:0}.footer a{color:#6e9cf2;text-decoration:none}/* Body */.body{position:relative;z-index:1;padding:1em 2em 1em 260px;zoom:1}.body:after{content:"";display:block;clear:both}/* Content */.content{float:right;width:100%;margin-left:-230px;zoom:1}.content:after{content:"";display:block;clear:both}.content a{color:#33a}.content a:hover,.content a:active,.content a:focus{color:#a33}.content .portlet a{text-decoration:none}.content .portlet a:hover,.content .portlet a:active,.content .portlet a:focus{text-decoration:underline}/* Dashboard */.dashboard{position:relative; float:none;width:auto;margin-left:-230px}.dashboard .portlet{float:left;width:48%; margin-right:1em}.dashboard .portlet:nth-of-type(even){ float:left; width:49%; margin-right:0 }.dashboard .portlet:nth-of-type(even){ float:right; width:49%; margin-right:0}/* Local Navigation */.lnb{position:relative;float:left;width:200px;margin:1em 0 1em -230px;line-height:normal;zoom:1;display:inline}.lnb .h2{margin-top:0}.lnb ul{margin:0;padding:0;list-style:none}.lnb li{position:relative;margin:0 0 -1px 0;vertical-align:top;zoom:1}.lnb li a{display:block;position:relative;padding:8px 10px;text-decoration:none;color:#666;font-weight:bold;background:#fafafa;border:1px solid #eee;zoom:1}.lnb li a .i{position:absolute;top:50%;left:100%;margin:-4px 0 0 -16px;width:8px;height:8px;color:#ccc;background:url(../img/iconNavVr.gif) no-repeat left top}.lnb li ul{padding:5px 0;background:#fff}.lnb li li{margin:0;border-top:1px dotted #ddd}.lnb li li:first-child{border:0}.lnb li li a{font-weight:normal;background:#fff;padding:5px 10px;border:0}.lnb li li a span{color:#666}.lnb li.active{border:1px solid #ccc;z-index:2}.lnb li li.active{border:0}.lnb li.active a{color:#000;border:0}.lnb li.active .i{background-position:0 -44px}.lnb li.active li a{border:0}.lnb li.active ul{display:block;border-top:1px solid #eee}.lnb li.active li.active a span{color:#13b200;font-weight:bold;letter-spacing:-1px}/* Search */.search{zoom:1}.search:after{content:"";display:block;clear:both}.search .pagination{float:left;text-align:left}.search form{float:right;margin:1em 0}.search form *{vertical-align:middle}/* Site Map */.siteMap h2 input{font-size:12px;font-weight:bold;padding:0 .5em}.siteMap .lined ul{padding:0;margin:0;border-top:1px solid #eee;zoom:1}.siteMap .lined li{position:relative;padding:0;margin:0;cursor:all-scroll;list-style:none;zoom:1}.siteMap .lined li li{border-top:1px solid #eee}.siteMap li li{text-indent:32px}.siteMap li li li{text-indent:64px}.siteMap li li li li{text-indent:96px}.siteMap li li li li li{text-indent:128px}.siteMap li li li li li li{text-indent:160px}.siteMap li li li li li li li{text-indent:192px}.siteMap li li li li li li li li{text-indent:224px}.siteMap li li li li li li li li li{text-indent:256px}.siteMap li li li li li li li li li li{text-indent:288px}.siteMap li li li li li li li li li li li{text-indent:320px}.siteMap li li li li li li li li li li li li{text-indent:352px}.siteMap li *{vertical-align:middle}.siteMap li .moveTo+input{width:200px;border:0;padding:0 .5em}.siteMap li .moveTo+input:hover,.siteMap li .moveTo+input:active,.siteMap li .moveTo+input:focus{border:1px dotted #ccc;overflow:visible}.siteMap .moveTo{position:relative;z-index:2;width:32px;height:32px;padding:32px 0 0 0;margin:0 .5em;_margin-top:-1px;overflow:hidden;background:#fff url(../img/iconMoveTo.gif) no-repeat;border:0}.siteMap li.active li,.siteMap li.active ul{border-top-color:#fff}.siteMap li.active .moveTo{background-position:0 -32px}.siteMap .vr{display:none;position:absolute;z-index:1;left:16px;top:-16px;margin:0 .5em;height:100%;border-left:1px solid #ccc;overflow:hidden}.siteMap .hr{display:none;position:absolute;z-index:1;left:16px;top:16px;margin:0 .5em;width:16px;border-top:1px solid #ccc;overflow:hidden}.siteMap li.active .vr,.siteMap li.active li .hr{display:block}.siteMap li li .vr,.siteMap li li li .hr{left:48px}.siteMap li li li .vr,.siteMap li li li li .hr{left:80px}.siteMap li li li li .vr,.siteMap li li li li li .hr{left:112px}.siteMap li li li li li .vr,.siteMap li li li li li li .hr{left:144px}.siteMap li li li li li li .vr,.siteMap li li li li li li li .hr{left:176px}.siteMap li li li li li li li .vr,.siteMap li li li li li li li li .hr{left:208px}.siteMap li li li li li li li li .vr,.siteMap li li li li li li li li li .hr{left:240px}.siteMap li li li li li li li li li .vr,.siteMap li li li li li li li li li li .hr{left:272px}.siteMap li li li li li li li li li li .vr,.siteMap li li li li li li li li li li li .hr{left:304px}.siteMap li li li li li li li li li li li .vr,.siteMap li li li li li li li li li li li li .hr{left:336px}.siteMap .side{padding-top:0 !important;padding-bottom:0 !important;line-height:30px}.siteMap .side button{text-indent:0;line-height:1}.siteMap .tgMap{position:absolute;top:12px;right:1em;padding:0 16px 0 0;line-height:16px;background:url(../img/iconArrow.gif) no-repeat right -126px}.siteMap.fold .tgMap{background-position:right -158px}.siteMap.fold .h2{border-bottom-color:#fff;border-radius:5px}/* Button Area */.btnArea{margin:1em 0;text-align:right;zoom:1}.btnArea:after{content:"";display:block;clear:both}/* Multilingual */#vLangEdit{background:#fff;position:absolute;*left:0;*margin-top:28px;z-index:10;box-shadow:3px 3px 6px #999;-moz-box-shadow:3px 3px 6px #999;-webkit-box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}#vLangEdit ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0}#vLangEdit li{padding:.5em 10px}#vLangEdit input[type=text]{width:220px;padding-right:40px}#vLangEdit label{left:15px !important}#vLangEdit .action{border:1px solid #eee;width:268px;padding:0 10px}#vLangEdit p, #vLangEdit .btnArea{white-space:normal}input#lang_en{background:url(../img/flag.us.gif) no-repeat 96% center}input#lang_ko{background:url(../img/flag.kr.gif) no-repeat 96% center}input#lang_ja{background:url(../img/flag.jp.gif) no-repeat 96% center}input#lang_zh{background:url(../img/flag.cn.gif) no-repeat 96% center}input#lang_fr{background:url(../img/flag.fr.gif) no-repeat 96% center}input#lang_de{background:url(../img/flag.de.gif) no-repeat 96% center}input#lang_ru{background:url(../img/flag.ru.gif) no-repeat 96% center}input#lang_tr{background:url(../img/flag.tr.gif) no-repeat 96% center}input#lang_vi{background:url(../img/flag.vn.gif) no-repeat 96% center}input#lang_mn{background:url(../img/flag.mn.gif) no-repeat 96% center}/* Suggestion */.suggestion{display:none;position:absolute;background:#fff;z-index:10;_height:200px;max-height:200px;overflow:auto;*left:0;*margin-top:28px;box-shadow:3px 3px 6px #999;-moz-box-shadow:3px 3px 6px #999;-webkit-box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.suggestion ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0}.suggestion li{padding:0}.suggestion li:last-child{border-bottom:0}.suggestion li button{border:0;background:#fff;text-align:left;width:280px;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.suggestion li button:hover,.suggestion li button:active,.suggestion li button:focus{background:#eee}/* Image Mark */#imageMark{right:0}/* Easy Installer */.easyNav{position:relative;border:1px solid #e9e9e9;zoom:1}.easyNav:after{content:"";display:block;clear:both}.easyNav h2{font-size:16px}.easyNav .category{width:30%;float:left;margin:0 2em;display:inline}.easyNav .filter{position:absolute;top:0;right:0;margin:1em 2em;text-align:right}.easyList td p{margin-top:0}.easyList td p.update{background:#ffc;padding:.5em 1em;border:1px solid #fc9;border-left:0;border-right:0;text-align:center}/* Font Preview */.fontPreview{width:96%;border:1px solid #e9e9e9;zoom:1;padding:1em 2em;margin:.5em 0}/* FTP Suggestion */#ftpSuggestion{background:#fff;box-shadow:3px 3px 6px #999;-moz-box-shadow:3px 3px 6px #999;-webkit-box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}#ftpSuggestion ul{border-left:1px solid #eee;border-right:1px solid #eee}#ftpSuggestion li{padding:0}#ftpSuggestion li button{border:0;background:#fff;text-align:left;width:288px}#ftpSuggestion li button:hover,#ftpSuggestion li button:active,#ftpSuggestion li button:focus{background:#eee}/* Theme & Skin Preview */.thumbPreview li{position:relative;padding-left:10px;padding-right:10px}.thumbPreview li.active{background:#f9f9f9}.thumbPreview .prevToggle{position:absolute;top:8px;right:10px;line-height:16px;padding:0 18px 0 0;text-decoration:none;background:url(../img/iconArrow.gif) no-repeat right -32px}.thumbPreview li.active .prevToggle{background-position:right 0}.thumbPreview .a{border:0;margin:0;zoom:1}.thumbPreview .a:after{content:"";display:block;clear:both}.thumbPreview .i{float:left;vertical-align:top;margin:0 1em 1em 0;padding:0;border:0;zoom:1}.thumbPreview .i:after{content:"";display:block;clear:both}.thumbPreview .i .thumb{position:relative;width:120px;height:70px;padding:10px 0 0 0;text-align:center;overflow:hidden;border:1px solid #ddd;display:block;cursor:pointer;background:#fff}.thumbPreview .i .thumb .frame{position:absolute;width:120px;height:70px;left:0;top:0;border:3px solid #fff}.thumbPreview .i .thumb img{width:120px;margin:-10px 0 0 0}.thumbPreview .i input{display:none}.thumbPreview .i ul{display:none}.thumbPreview .i.checked{display:block;float:none}.thumbPreview .i.checked .thumb{float:left;width:180px;height:120px;margin:0 1em 0 0;border:2px solid #eee}.thumbPreview .i.checked .thumb .frame{width:180px;height:120px}.thumbPreview li.active .i.checked .thumb{border-color:#5ea8f6}.thumbPreview .i.checked .thumb img{width:180px;position:relative;z-index:-1}.thumbPreview li.active .i.checked .thumb img{z-index:auto}.thumbPreview .i.checked label{cursor:text}.thumbPreview .i.checked ul{display:block;list-style:none;border:0;margin:1em 0 1em 200px}.thumbPreview .i.checked li{border:0;padding:0;margin:0 0 .2em 0}#skin .showAll{float:right;border:0;overflow:visible;padding:0 18px 0 0;cursor:pointer;color:#00f;background:url(../img/iconArrow.gif) no-repeat right -32px}#skin .showAll.hideAll{background-position:right 0}/* Sign Up Form */.signUpForm li{position:relative}.signUpForm .side{position:absolute;top:8px;right:0}/* Favorite On | Off */.fvOff,.fvOn{display:inline-block;width:16px;height:16px;overflow:hidden;text-indent:16px;background:url(../img/iconFavorite.gif) no-repeat}.fvOn{background-position:0 -16px}/* Up-Down Dragable */.uDrag .wrap{position:relative;padding-left:20px}.uDrag .dragActive{background:#FFD}.uDrag .dragActive td{background:none !important}.uDrag .dragBtn{position:absolute;width:8px;height:100%;padding:0;overflow:hidden;background:url(../img/bgDragable.gif);top:1px;left:0;text-indent:12px;border:0;cursor:n-resize}/* Favicon Preview */.faviconPreview{position:relative;padding:60px 0 0 200px;background:url(../img/bgFavicon.gif) no-repeat}.faviconPreview img{position:absolute}.faviconPreview .fn1{top:30px;left:12px}.faviconPreview .fn2{top:55px;left:68px}/* Mobile Icon Preview */.mobiconPreview{position:relative;padding:252px 0 0 200px;background:url(../img/bgMobileTop.png) no-repeat}.mobiconPreview img{position:absolute;top:20px;left:10px}.mobiconPreview span{position:absolute;width:32px;text-align:center;top:52px;left:10px;color:#fff;font-size:9px}/* Text List */.textList{border:1px solid #ddd !important;line-height:1.5em;height:18.5em;overflow:auto}.textList li{border:0;padding:.25em 1em;height:1.5em;white-space:nowrap;overflow:hidden}.textList li:nth-child(even){background:#eee}.textList li a{float:right}/* Responsive Layout */@media only all and (max-width:860px) { .header h1{margin-left:.7em} .header .account{padding-right:1em} .header .siteTool{padding-right:1em} .header .siteTool .tgContent{right:1em} .body{padding:1em} .content{float:none;margin-left:0} .lnb{float:none;width:auto;margin:1em 0} .dashboard .portlet{float:none !important;width:auto !important; margin-right:0} .modal .fg, .wfsr .fg{width:auto} .easyNav .category{float:none;display:block;width:auto} .easyNav .filter{position:static}}@media only all and (max-width:640px) { .skipNav a{position:relative;width:auto;height:auto} .modal{position:absolute}} \ No newline at end of file +@charset "utf-8";/* NHN (developers@xpressengine.com) *//* Element Reset */body,table,input,textarea,select,button{font-family:Tahoma,Geneva,sans-serif;font-size:12px;color:#333}header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{display:block}button,input[type=submit],input[type=reset],input[type=button]{cursor:pointer;overflow:visible}body{margin:0}img{border:0}p{line-height:1.5}/* Section & Heading */.section{margin:1em 0;padding:0;border:0}.h1, .h2, .h3, .h4{position:relative;border-bottom-style:solid;border-bottom-color:#ccc;zoom:1}.h1{border-bottom-width:4px;font-size:24px}.h2{border-bottom-width:3px;font-size:20px}.h3{border-bottom-width:2px;font-size:16px}.h4{border-bottom-width:1px;font-size:12px}/* Portlet */.portlet{position:relative;border:1px solid #e9e9e9;margin:1em 0;padding:0;background:#fff;zoom:1;overflow:hidden;border-radius:5px}.portlet h2, .portlet h3{margin:0;padding:.5em 1em;font-size:14px;border:1px solid #fff;border-bottom:1px solid #e9e9e9;background:#f7f7f7;border-radius:5px 5px 0 0}.portlet p{margin:1em 1.2em}.portlet li{position:relative;padding-right:8em}.portlet .lined{margin:1px;padding:0;list-style:none}.portlet .lined li{padding:.5em 8em .5em 1em;border-top:1px solid #eee;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis}.portlet .lined li:first-child{border:0}.portlet .side{position:absolute;top:0;_top:1px;right:0;color:#666;background:#fff;padding:0 1em}.portlet .lined .side{padding:.5em 1em}.portlet .more{position:absolute;top:.5em;right:1em;text-decoration:none !important;color:#666}.portlet .more span{color:#999}.portlet .action{text-align:right;top:0;right:0;padding:.5em 1em .5em 3em;background:#fff;background:-webkit-gradient(linear, 0% 0%, 100% 0%, from(rgba(255,255,255,0)), to(rgba(255,255,255,1)), color-stop(15%, #fff));background:-moz-linear-gradient(left, rgba(255,255,255,0) 0, rgba(255,255,255,1) 15%)}.portlet .action a,.portlet .action button{margin-left:1em}.portlet .btnArea{border-top:1px solid #ddd;margin:0;padding:.5em 1em;margin:0 1px 1px 1px;background:#f7f7f7;border-radius:0 0 5px 5px}/* Table */.table{margin:1em 0}.table table{width:100%;border:0;border-collapse:collapse;border-top:2px solid #ccc}.table caption{padding:8px 0;font-weight:bold;text-align:left;line-height:32px}.table caption:after{content:"";display:block;clear:both}.table caption a{font-weight:normal}.table caption em{float:right;font-style:normal;font-weight:normal;color:#e00;margin-left:1em}.table caption strong{color:#e00}.table caption .side{float:right;font-weight:normal;margin-left:1em}.table th,.table td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd;white-space:nowrap}.table th{background:#f8f8f8}.table thead th{border-bottom:1px solid #999}.table tfoot td{font-weight:bold;background:#f8f8f8}.table.even tbody tr:nth-of-type(even) td{background-color:#fafafa}.table input[type=text]{margin:-1px 0 -3px 0;vertical-align:middle}.table img{vertical-align:middle}.table .title,.table .text{white-space:normal}.table .h1 + table,.table .h2 + table,.table .h3 + table,.table .h4 + table,.h1 + .table table,.h2 + .table table,.h3 + .table table,.h4 + .table table{border-top:0}/* Form */.form{margin:1em 0;padding:0}.form fieldset{margin:0 0 2em 0;padding:0;border:0}.form em{font-style:normal;color:#e00}.form label{margin-right:1em;line-height:1}.form input[type=checkbox]+label,.form input[type=radio]+label,.form input[type=file]{cursor:pointer}.form ul{position:relative;margin:0;padding:0;list-style:none;border-top:2px solid #ccc;border-bottom:1px solid #ccc;zoom:1}.form li{list-style:none;border:1px solid #ddd;border-left:0;border-right:0;margin:-1px 0;padding:8px 0;vertical-align:top;zoom:1}.form li:first-child{border-top:0}.form li>label:first-child{display:block;font-weight:bold}.form li label em{font-weight:normal}.form input[type=text],.form input[type=password],.form input[type=file],textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:transparent}.form input[type=text],.form input[type=password],.form input[type=file]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px}.form input[type=checkbox],.form input[type=radio]{margin:0;padding:0;width:13px;height:13px;vertical-align:middle}.form *[disabled=disabled]{background:#ddd;text-shadow:1px 1px 0 #fff}.form textarea{padding:3px 4px;vertical-align:top}.form span.desc{line-height:22px;vertical-align:middle;margin:0 10px}.form p.desc{margin:.25em 0;line-height:1.4}.form .q{font-weight:bold;margin:0 0 5px 0}.form .a{margin:0 0 5px 0}.form .tgForm{margin-right:1em}.form .h1 + ul,.form .h2 + ul,.form .h3 + ul,.form .h4 + ul{border-top:0}/* Global Navigation Bar */.gnb{position:relative;clear:both;border:1px solid #c1c1c1;border-left:0;border-right:0;background-color:#efefef;background:#efefef -webkit-gradient(linear, 0% 0%, 0% 100%, from(#efefef), to(#dcdcdc));background:#efefef -moz-linear-gradient(top, #efefef, #dcdcdc);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#efefef, endColorStr=#dcdcdc);zoom:1}.gnb ul{margin:0;padding:0 0 0 2em;list-style:none;border:1px solid #fff;border-left:0;border-right:0;zoom:1}.gnb ul ul{position:absolute;top:30px;left:0;border:1px solid #ccc;padding:0;background:#fff}.gnb ul:after{content:"";display:block;clear:both}.gnb li{position:relative;float:left;border:1px solid #fff;border-top:0;border-bottom:0;margin:0 -1px 0 0}.gnb li li{float:none;clear:both;overflow:hidden;border:0;border-top:1px dotted #ccc;margin:0;padding:2px}.gnb li li:first-child{border:0}.gnb li a{float:left;font-weight:bold;color:#333;font-size:12px;padding:8px 18px;white-space:nowrap;text-decoration:none;text-shadow:0 1px 0 #fff;zoom:1}.gnb li a:hover,.gnb li a:active,.gnb li a:focus,.gnb li.active a,.gnb li.activeOn a{background:#fff;border:1px solid #ddd;padding:7px 17px}.gnb li li a{display:block;float:none;color:#555;padding:5px 15px !important;font-weight:normal !important;border:0 !important}.gnb li li a:hover,.gnb li li a:active,.gnb li li a:focus{border:0;background:#eee}.gnb .setting{position:absolute;top:8px;right:2em;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;background:url(../img/iconSetting.gif) no-repeat center}.gnb.jx ul{display:block;position:static;padding:0}.gnb.jx li{float:none;clear:both;border-top:1px solid #ccc}.gnb.jx ul ul{border:0}.gnb.jx li li{border:0}.gnb.jx li a{float:none;display:block}.gnb.jx li a:hover,.gnb.jx li a:active,.gnb.jx li a:focus{background:none}.gnb.jx li.activeOn>a{background:#ddd}@media only all and (max-width:860px){ .gnb ul{padding-left:1em} .gnb .setting{right:1em}}@media only all and (max-width:640px){ .gnb ul{display:block;position:static;padding:0} .gnb li{float:none;clear:both;border-top:1px solid #ccc} .gnb ul ul{border:0;position:static} .gnb li li{border:0} .gnb li a{float:none;display:block} .gnb li a:hover, .gnb li a:active, .gnb li a:focus{background:none} .gnb li.activeOn>a{background:#ddd}}/* Pagination */.pagination{margin:1em 0;text-align:center;line-height:normal}.pagination *{vertical-align:middle}.pagination a,.pagination strong{position:relative;display:inline-block;padding:2px 4px;font-weight:bold;text-decoration:none;line-height:normal;color:#333 !important;vertical-align:middle}.pagination a:hover,.pagination a:active,.pagination a:focus{border:1px solid #ddd;margin:0 -1px}.pagination strong{color:#e00 !important;font-size:20px}.pagination .direction{font-weight:normal;white-space:nowrap}.pagination .direction:hover,.pagination .direction:active,.pagination .direction:focus{border:0;margin:0;text-decoration:underline}.pagination input{width:30px;text-align:center}.pagination button{overflow:visible}/* Button */.btn{position:relative;display:inline-block;margin:2px;vertical-align:top}.btn *{display:inline-block;padding:0 8px;font-size:12px;height:24px;line-height:22px;margin:0;font-weight:bold !important;color:#fff;text-decoration:none !important;border:1px solid;cursor:pointer;overflow:visible;border-radius:3px;box-shadow:inset 0 0 1px #fff;-moz-box-shadow:inset 0 0 1px #fff;-webkit-box-shadow:inset 0 0 1px #fff;background-color:#666;text-shadow:0 -1px 0 #333;zoom:1}.btn a, .btn button[type=button]{border-color:#ccc;color:#333 !important;background:#eee -webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#ddd));background:#eee -moz-linear-gradient(top,#fff,#ddd);background-color:#eee;text-shadow:1px 1px 0 #fff;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#ffffff, endColorStr=#dddddd)}.btn input, .btn button[type=submit]{border-color:#666;background:#333 -webkit-gradient(linear,0% 0%,0% 100%,from(#777),to(#777),color-stop(0.5,#333),color-stop(0.5,#000));background:#333 -moz-linear-gradient(top,#777,#000);background-color:#333;color:#ffc;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#777777, endColorStr=#333333)}.btn a{height:22px}.btn.medium *{padding:0 12px;font-size:16px;height:30px;line-height:28px}.btn.medium a{height:28px}.btn.large *{padding:0 18px;font-size:22px;height:36px;line-height:34px}.btn.large a{height:34px}/* Star Rating */.starRating, .starRating span{display:inline-block;height:14px;background:transparent url(../img/iconStarRating.gif) no-repeat;overflow:hidden}.starRating{width:79px;vertical-align:top}.starRating span{font-size:0;line-height:0;vertical-align:top;text-indent:-100px;*text-indent:0;background-position:0 -14px}/* Progress */.prgrs{white-space:nowrap;line-height:normal;vertical-align:middle}.prgrs *{vertical-align:middle}.prgrs .pBar{position:relative;display:inline-block;background:#e9e9e9;margin:0 5px 0 0}.prgrs .pAction{display:inline-block;vertical-align:top;background:#99a6b6}.prgrs .pNum{position:absolute;width:100%;left:0;top:0;text-align:center;text-shadow:1px 1px 0 #fff}.prgrs.prgrsSmall{font-size:14px;line-height:14px}.prgrs.prgrsSmall .pBar,.prgrs.prgrsSmall .pAction,.prgrs.prgrsSmall .pNum{height:16px;line-height:16px;font-size:11px}.prgrs.prgrsMedium{font-size:24px;line-height:24px}.prgrs.prgrsMedium .pBar,.prgrs.prgrsMedium .pAction,.prgrs.prgrsMedium .pNum{height:22px;line-height:22px;font-size:12px}.prgrs.prgrsLarge{font-size:38px;line-height:38px}.prgrs.prgrsLarge .pBar,.prgrs.prgrsLarge .pAction,.prgrs.prgrsLarge .pNum{height:34px;line-height:34px;font-size:14px}/* Layer */.layer{position:absolute;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;font-weight:normal;z-index:2;zoom:1;border-radius:5px;box-shadow:0 0 6px #666;-moz-box-shadow:0 0 6px #666;-webkit-box-shadow:0 0 6px #666;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.layer h2{margin-top:1em}.layer ul, .layer ol, .layer .lined, .layer .table{margin-bottom:1em}.layerClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px}.layerBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}/* Modal Window */.modal{position:fixed;*position:absolute;top:0;left:0;width:100%;_height:100%;min-height:100%;z-index:100}.modal .bg{position:absolute;background:#000;_background:none;width:100%;height:100%;opacity:.5;z-index:2;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1}.modal .fg{position:relative;width:50%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:3;zoom:1;border-radius:5px;box-shadow:0 0 6px #000;-moz-box-shadow:0 0 6px #000;-webkit-box-shadow:0 0 6px #000}.modal h2{margin-top:1em}.modal ul, .modal ol, .modal .lined, .modal .table{margin-bottom:1em}.modal .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1}.modalClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px}.modalBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}html.modalContainer,body.modalContainer{_height:100%;_width:100%} /* IE6 only */ /* Message */.message{border:1px solid #ddd;background:#f8f8f8;margin:1em 0;padding:0 1em;border-radius:5px}.message em{font-style:normal;color:#e00}.message.info,.message.error,.message.update{padding-left:55px}.message.info{border-color:#E0E8EC;background:#EDF9FF url(../img/msg.Info.png) no-repeat 1em .5em}.message.error{border-color:#EFDCDC;background:#FFECEC url(../img/msg.error.png) no-repeat 1em .5em}.message.update{border-color:#EAE9DC;background:#FFFDEF url(../img/msg.update.png) no-repeat 1em .5em}/* Text Button */input.text, button.text{border:0;overflow:visible;padding:0;margin:0;color:#33a;background:none;text-decoration:underline}/* H2 Anchor */.h2Anchor{position:absolute;right:0;border:0;background:none;color:#00f;text-decoration:underline}/* Waiting for server response */#wfsr .bg{position:absolute;background:#000;_background:none;width:100%;height:100%;opacity:.5;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1}#wfsr .fg{position:relative;width:50%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:10px solid #ddd;z-index:2;zoom:1}#wfsr .fg p{padding:0 0 0 2.5em;background:url(../img/preLoader16.gif) no-repeat 1em .4em}#wfsr .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1}.wfsrActive{position:fixed;_position:absolute;top:0;left:0;width:100%;height:100%;z-index:100}.wfsrClose{position:absolute;right:-10px;top:-10px;border:0;background:#ddd;padding:0;width:34px;height:34px;font-size:16px;font-weight:bold;cursor:pointer;color:#999}.wfsrBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}/* Skip Navigation */.skipNav{margin:0;text-align:center;overflow:hidden}.skipNav a{position:absolute;width:1px;height:1px;display:block;color:#fff;font-weight:bold;padding:10px 0;background:#333;border-top:1px solid #656565}.skipNav a:hover,.skipNav a:active,.skipNav a:focus{position:relative;width:auto;height:auto}/* Header */.header{position:relative;z-index:2;padding:30px 0 0 0;background:#4c4c4c;box-shadow:0 0 10px #aaa;-moz-box-shadow:0 0 10px #aaa;-webkit-box-shadow:0 0 10px #aaa;zoom:1}.stAdmin .header{background:#2D808A}.header:after{content:"";display:block;clear:both}.header a{text-decoration:none}.header h1{margin:0 100px 10px 1.3em;font-size:24px;line-height:32px}.header h1 *{vertical-align:middle}.header h1 a{color:#fff;text-shadow:1px 1px 0 #000;filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=1, OffY=1, Color=#000000, Positive=true);zoom:1}.header h1 img{height:32px}.header h1 .url{font-size:12px;font-weight:normal}.header .siteTool{position:absolute !important;top:42px;right:0;padding:0 2em 0 0;z-index:2}.header .siteTool .i{position:relative;z-index:2;display:inline-block;color:#fff;padding:0 6px;line-height:24px}.header .siteTool .i:first-child{border:0}.header .siteTool .tgAnchor{padding-right:16px;background:url(../img/iconArrow.gif) no-repeat right -156px}.header .siteTool .tgAnchor.active{border:1px solid #ccc;border-bottom:0;background-color:#fff;color:#333;text-decoration:none;border-radius:5px 5px 0 0}.header .siteTool .tgContent{position:absolute;top:24px;right:2em;border:1px solid #ccc;z-index:1;background-color:#fff;border-radius:5px 0 5px 5px}.header .siteTool .tgContent .btnArea{margin:0}.header #moveSiteList{padding:10px 1em 5px 1em;margin:0}.header #moveSiteList ul{list-style:none;margin:0;padding:0}.header #moveSiteList li{white-space:nowrap;margin:0;padding:4px 0;border-bottom:1px dotted #ccc}.header #siteMapList{padding:0 1em 1em 1em;margin:0}.header #siteMapList li{white-space:nowrap}.header .account{position:absolute;z-index:3;width:100%;padding:5px 2em 5px 0;top:0;right:0;white-space:nowrap;text-align:right;background:#333;border-bottom:1px solid #656565;color:#fff;font-size:12px;box-shadow:0 0 10px #333;-moz-box-shadow:0 0 10px #333;-webkit-box-shadow:0 0 10px #333}.stAdmin .header .account{background:#0e5f69}.header .account ul{margin:0 2px 0 0;padding:0;list-style:none}.header .account li{position:relative;display:inline;border-left:1px solid #666;padding:0 6px 0 10px}.header .account li:first-child{border:0}.header .account a{color:#fff;display:inline-block;height:14px}.header .account a.language{padding-right:2px}.header #language{position:absolute;top:19px;right:0;padding:6px 4px !important;border:1px solid #666;border-top:0;background:#333}.header #language li{border:0;display:block;padding:1px 8px;text-align:left;line-height:1}.header #language li.selected{background:transparent url(../img/checked.png) no-repeat left center}.header h1 a:hover,.header h1 a:active,.header h1 a:focus,.header .siteTool a:hover,.header .siteTool a:active,.header .siteTool a:focus,.header .account a:hover,.header .account a:active,.header .account a:focus{color:#6e9cf2;text-decoration:underline}/* Footer */.footer{border-top:1px solid #ddd;text-align:center;font-size:12px;padding:1.5em 0;margin:0 2em}.footer p{margin:0}.footer a{color:#6e9cf2;text-decoration:none}/* Body */.body{position:relative;z-index:1;padding:1em 2em 1em 260px;zoom:1}.body:after{content:"";display:block;clear:both}/* Content */.content{float:right;width:100%;margin-left:-230px;zoom:1}.content:after{content:"";display:block;clear:both}.content a{color:#33a}.content a:hover,.content a:active,.content a:focus{color:#a33}.content .portlet a{text-decoration:none}.content .portlet a:hover,.content .portlet a:active,.content .portlet a:focus{text-decoration:underline}/* Dashboard */.dashboard{position:relative;float:none;width:auto;margin-left:-230px}.dashboard .portlet{float:left;width:48%;margin-right:1em}.dashboard .portlet:nth-of-type(even){ float:left;width:49%;margin-right:0 }.dashboard .portlet:nth-of-type(even){ float:right;width:49%;margin-right:0}/* Local Navigation */.lnb{position:relative;float:left;width:200px;margin:1em 0 1em -230px;line-height:normal;zoom:1;display:inline}.lnb .h2{margin-top:0}.lnb ul{margin:0;padding:0;list-style:none}.lnb li{position:relative;margin:0 0 -1px 0;vertical-align:top;zoom:1}.lnb li a{display:block;position:relative;padding:8px 10px;text-decoration:none;color:#666;font-weight:bold;background:#fafafa;border:1px solid #eee;zoom:1}.lnb li a .i{position:absolute;top:50%;left:100%;margin:-4px 0 0 -16px;width:8px;height:8px;color:#ccc;background:url(../img/iconNavVr.gif) no-repeat left top}.lnb li ul{padding:5px 0;background:#fff}.lnb li li{margin:0;border-top:1px dotted #ddd}.lnb li li:first-child{border:0}.lnb li li a{font-weight:normal;background:#fff;padding:5px 10px;border:0}.lnb li li a span{color:#666}.lnb li.active{border:1px solid #ccc;z-index:2}.lnb li li.active{border:0}.lnb li.active a{color:#000;border:0}.lnb li.active .i{background-position:0 -44px}.lnb li.active li a{border:0}.lnb li.active ul{display:block;border-top:1px solid #eee}.lnb li.active li.active a span{color:#13b200;font-weight:bold;letter-spacing:-1px}/* Search */.search{zoom:1}.search:after{content:"";display:block;clear:both}.search .pagination{float:left;text-align:left}.search form{float:right;margin:1em 0}.search form *{vertical-align:middle}/* Site Map */.siteMap h2 input{font-size:12px;font-weight:bold;padding:0 .5em}.siteMap .lined ul{padding:0;margin:0;border-top:1px solid #eee;zoom:1}.siteMap .lined li{position:relative;padding:0;margin:0;cursor:all-scroll;list-style:none;zoom:1}.siteMap .lined li li{border-top:1px solid #eee}.siteMap li li{text-indent:32px}.siteMap li li li{text-indent:64px}.siteMap li li li li{text-indent:96px}.siteMap li li li li li{text-indent:128px}.siteMap li li li li li li{text-indent:160px}.siteMap li li li li li li li{text-indent:192px}.siteMap li li li li li li li li{text-indent:224px}.siteMap li li li li li li li li li{text-indent:256px}.siteMap li li li li li li li li li li{text-indent:288px}.siteMap li li li li li li li li li li li{text-indent:320px}.siteMap li li li li li li li li li li li li{text-indent:352px}.siteMap li *{vertical-align:middle}.siteMap li .moveTo+input{width:200px;border:0;padding:0 .5em}.siteMap li .moveTo+input:hover,.siteMap li .moveTo+input:active,.siteMap li .moveTo+input:focus{border:1px dotted #ccc;overflow:visible}.siteMap .moveTo{position:relative;z-index:2;width:32px;height:32px;padding:32px 0 0 0;margin:0 .5em;_margin-top:-1px;overflow:hidden;background:#fff url(../img/iconMoveTo.gif) no-repeat;border:0}.siteMap li.active li,.siteMap li.active ul{border-top-color:#fff}.siteMap li.active .moveTo{background-position:0 -32px}.siteMap .vr{display:none;position:absolute;z-index:1;left:16px;top:-16px;margin:0 .5em;height:100%;border-left:1px solid #ccc;overflow:hidden}.siteMap .hr{display:none;position:absolute;z-index:1;left:16px;top:16px;margin:0 .5em;width:16px;border-top:1px solid #ccc;overflow:hidden}.siteMap li.active .vr,.siteMap li.active li .hr{display:block}.siteMap li li .vr,.siteMap li li li .hr{left:48px}.siteMap li li li .vr,.siteMap li li li li .hr{left:80px}.siteMap li li li li .vr,.siteMap li li li li li .hr{left:112px}.siteMap li li li li li .vr,.siteMap li li li li li li .hr{left:144px}.siteMap li li li li li li .vr,.siteMap li li li li li li li .hr{left:176px}.siteMap li li li li li li li .vr,.siteMap li li li li li li li li .hr{left:208px}.siteMap li li li li li li li li .vr,.siteMap li li li li li li li li li .hr{left:240px}.siteMap li li li li li li li li li .vr,.siteMap li li li li li li li li li li .hr{left:272px}.siteMap li li li li li li li li li li .vr,.siteMap li li li li li li li li li li li .hr{left:304px}.siteMap li li li li li li li li li li li .vr,.siteMap li li li li li li li li li li li li .hr{left:336px}.siteMap .side{padding-top:0 !important;padding-bottom:0 !important;line-height:30px}.siteMap .side button{text-indent:0;line-height:1}.siteMap .tgMap{position:absolute;top:12px;right:1em;padding:0 16px 0 0;line-height:16px;background:url(../img/iconArrow.gif) no-repeat right -126px}.siteMap.fold .tgMap{background-position:right -158px}.siteMap.fold .h2{border-bottom-color:#fff;border-radius:5px}/* Button Area */.btnArea{margin:1em 0;text-align:right;zoom:1}.btnArea:after{content:"";display:block;clear:both}/* Multilingual */.langEdit{background:#fff;position:absolute;*left:0;*margin-top:28px;z-index:10;box-shadow:3px 3px 6px #999;-moz-box-shadow:3px 3px 6px #999;-webkit-box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.langEdit ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0}.langEdit li{padding:.5em 10px}.langEdit input[type=text]{width:220px;padding-right:40px}.langEdit label{left:15px !important}.langEdit .action{border:1px solid #eee;width:268px;padding:0 10px}.langEdit p, .langEdit .btnArea{white-space:normal}.langEdit li.en input, .mLangEdit li.en textarea{background:url(../img/flag.us.gif) no-repeat 99% 5px}.langEdit li.ko input, .mLangEdit li.ko textarea{background:url(../img/flag.kr.gif) no-repeat 99% 5px}.langEdit li.ja input, .mLangEdit li.ja textarea{background:url(../img/flag.jp.gif) no-repeat 99% 5px}.langEdit li.zh input, .mLangEdit li.zh textarea{background:url(../img/flag.cn.gif) no-repeat 99% 5px}.langEdit li.fr input, .mLangEdit li.fr textarea{background:url(../img/flag.fr.gif) no-repeat 99% 5px}.langEdit li.de input, .mLangEdit li.de textarea{background:url(../img/flag.de.gif) no-repeat 99% 5px}.langEdit li.ru input, .mLangEdit li.ru textarea{background:url(../img/flag.ru.gif) no-repeat 99% 5px}.langEdit li.es input, .mLangEdit li.es textarea{background:url(../img/flag.es.gif) no-repeat 99% 5px}.langEdit li.tr input, .mLangEdit li.tr textarea{background:url(../img/flag.tr.gif) no-repeat 99% 5px}.langEdit li.vi input, .mLangEdit li.vi textarea{background:url(../img/flag.vn.gif) no-repeat 99% 5px}.langEdit li.mn input, .mLangEdit li.mn textarea{background:url(../img/flag.mn.gif) no-repeat 99% 5px}.mLangEdit.en strong{background:url(../img/flag.us.gif) no-repeat 0 10px}.mLangEdit.ko strong{background:url(../img/flag.kr.gif) no-repeat 0 10px}.mLangEdit.ja strong{background:url(../img/flag.jp.gif) no-repeat 0 10px}.mLangEdit.zh strong{background:url(../img/flag.cn.gif) no-repeat 0 10px}.mLangEdit.fr strong{background:url(../img/flag.fr.gif) no-repeat 0 10px}.mLangEdit.de strong{background:url(../img/flag.de.gif) no-repeat 0 10px}.mLangEdit.ru strong{background:url(../img/flag.ru.gif) no-repeat 0 10px}.mLangEdit.es strong{background:url(../img/flag.es.gif) no-repeat 0 10px}.mLangEdit.tr strong{background:url(../img/flag.tr.gif) no-repeat 0 10px}.mLangEdit.vi strong{background:url(../img/flag.vn.gif) no-repeat 0 10px}.mLangEdit.mn strong{background:url(../img/flag.mn.gif) no-repeat 0 10px}.mLangEdit ul{ border:0}.mLangEdit li{ position:relative;padding:0}.mLangEdit li strong{ display:inline-block;padding:6px 100px 8px 24px;font-weight:normal;line-height:1.5}.mLangEdit li .side{ position:absolute;top:8px;right:0;padding-right:18px;background:url(../img/iconArrow.gif) no-repeat right -160px}.mLangEdit li li{ border:0;padding-right:40px}.mLangEdit li li textarea{ width:100%;height:16px;padding-right:30px;resize:vertical;line-height:1.4}.mLangEdit li label{ top:8px !important}.mLangEdit li.active strong{ font-weight:bold}.mLangEdit li.active .side{ background-position:right -128px}/* Suggestion */.suggestion{display:none;position:absolute;background:#fff;z-index:10;_height:200px;max-height:200px;overflow:auto;*left:0;*margin-top:28px;box-shadow:3px 3px 6px #999;-moz-box-shadow:3px 3px 6px #999;-webkit-box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.suggestion ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0}.suggestion li{padding:0}.suggestion li:last-child{border-bottom:0}.suggestion li button{border:0;background:#fff;text-align:left;width:280px;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.suggestion li button:hover,.suggestion li button:active,.suggestion li button:focus{background:#eee}/* Image Mark */#imageMark{right:0}/* Easy Installer */.easyNav{position:relative;border:1px solid #e9e9e9;zoom:1}.easyNav:after{content:"";display:block;clear:both}.easyNav h2{font-size:16px}.easyNav .category{width:30%;float:left;margin:0 2em;display:inline}.easyNav .filter{position:absolute;top:0;right:0;margin:1em 2em;text-align:right}.easyList td p{margin-top:0}.easyList td p.update{background:#ffc;padding:.5em 1em;border:1px solid #fc9;border-left:0;border-right:0;text-align:center}/* Font Preview */.fontPreview{width:96%;border:1px solid #e9e9e9;zoom:1;padding:1em 2em;margin:.5em 0}/* FTP Suggestion */#ftpSuggestion{background:#fff;box-shadow:3px 3px 6px #999;-moz-box-shadow:3px 3px 6px #999;-webkit-box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}#ftpSuggestion ul{border-left:1px solid #eee;border-right:1px solid #eee}#ftpSuggestion li{padding:0}#ftpSuggestion li button{border:0;background:#fff;text-align:left;width:288px}#ftpSuggestion li button:hover,#ftpSuggestion li button:active,#ftpSuggestion li button:focus{background:#eee}/* Theme & Skin Preview */.thumbPreview li{position:relative;padding-left:10px;padding-right:10px}.thumbPreview li.active.highlight{background:#f9f9f9}.thumbPreview .prevToggle{position:absolute;top:8px;right:10px;line-height:16px;padding:0 18px 0 0;text-decoration:none;background:url(../img/iconArrow.gif) no-repeat right -32px}.thumbPreview li.active .prevToggle{background-position:right 0}.thumbPreview .a{border:0;margin:0;zoom:1}.thumbPreview .a:after{content:"";display:block;clear:both}.thumbPreview .i{float:left;vertical-align:top;margin:0 1em 1em 0;padding:0;border:0;zoom:1}.thumbPreview .i:after{content:"";display:block;clear:both}.thumbPreview .i .thumb{position:relative;width:124px;height:84px;padding:0;margin-bottom:3px;text-align:center;overflow:hidden;border:1px solid #ddd;display:block;cursor:pointer;background:#fff}.thumbPreview .i .thumb .frame{position:absolute;width:120px;height:80px;left:0;top:0;border:2px solid #fff;overflow:hidden}.thumbPreview .i .thumb img{width:120px;margin:0}.thumbPreview .i label{display:block;position:relative;top:0;left:2px;width:122px;height:1.1em;margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.thumbPreview .i input{display:none}.thumbPreview .i ul{display:none}.thumbPreview .selected .i{display:block;float:none}.thumbPreview .selected .i .thumb{float:left;width:186px;height:126px;margin:0 1em 0 0;border:2px solid #eee}.thumbPreview .selected .i .thumb .frame{width:180px;height:120px;border-width:3px}.thumbPreview li.active.highlight .selected .i .thumb{border-color:#5ea8f6}.thumbPreview .selected .i .thumb img{width:180px;position:relative}.thumbPreview li.active .selected .i .thumb img{z-index:auto}.thumbPreview .selected .i label{cursor:text}.thumbPreview .selected .i ul{display:block;list-style:none;border:0;margin:1em 0 1em 200px}.thumbPreview .selected .i li{border:0;padding:0;margin:0 0 .2em 0}.thumbPreview.jx .i label{display:inline;width:auto}.thumbPreview.jx .i.noDirection{display:none}.thumbPreview.jx .i input{display:inline}#skin .showAll{float:right;border:0;overflow:visible;padding:0 18px 0 0;cursor:pointer;color:#00f;background:url(../img/iconArrow.gif) no-repeat right -32px}#skin .showAll.hideAll{background-position:right 0}/* Sign Up Form */.signUpForm li{position:relative}.signUpForm .side{position:absolute;top:8px;right:0}/* Favorite On | Off */.fvOff,.fvOn{display:inline-block;width:16px;height:16px;overflow:hidden;text-indent:16px;background:url(../img/iconFavorite.gif) no-repeat}.fvOn{background-position:0 -16px}/* Up-Down Dragable */.uDrag .wrap{position:relative;padding-left:20px}.uDrag .dragActive{background:#FFD}.uDrag .dragActive td{background:none !important}.uDrag .dragBtn{position:absolute;width:8px;height:100%;padding:0;overflow:hidden;background:url(../img/bgDragable.gif);top:1px;left:0;text-indent:12px;border:0;cursor:n-resize}/* Favicon Preview */.faviconPreview{position:relative;padding:60px 0 0 200px;background:url(../img/bgFavicon.gif) no-repeat}.faviconPreview img{position:absolute}.faviconPreview .fn1{top:30px;left:12px}.faviconPreview .fn2{top:55px;left:68px}/* Mobile Icon Preview */.mobiconPreview{position:relative;padding:252px 0 0 200px;background:url(../img/bgMobileTop.png) no-repeat}.mobiconPreview img{position:absolute;top:20px;left:10px}.mobiconPreview span{position:absolute;width:32px;text-align:center;top:52px;left:10px;color:#fff;font-size:9px}/* Text List */.textList{border:1px solid #ddd !important;line-height:1.5em;height:18.5em;overflow:auto}.textList li{border:0;padding:.25em 1em;height:1.5em;white-space:nowrap;overflow:hidden}.textList li:nth-child(even){background:#eee}.textList li a{float:right}/* Responsive Layout */@media only all and (max-width:860px){ .header h1{margin-left:.7em} .header .account{padding-right:1em} .header .siteTool{padding-right:1em} .header .siteTool .tgContent{right:1em} .body{padding:1em} .content{float:none;margin-left:0} .lnb{float:none;width:auto;margin:1em 0} .dashboard .portlet{float:none !important;width:auto !important;margin-right:0} .modal .fg, .wfsr .fg{width:auto} .easyNav .category{float:none;display:block;width:auto} .easyNav .filter{position:static}}@media only all and (max-width:640px){ .skipNav a{position:relative;width:auto;height:auto} .modal{position:absolute}} \ No newline at end of file From 6d3e7f62d6ed160485fe5f4e493b689f7ddfb427 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Thu, 4 Aug 2011 02:54:45 +0000 Subject: [PATCH 0364/1372] Message box UI updated. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8719 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/tpl/img/msg.Info.png | Bin 0 -> 1620 bytes modules/admin/tpl/img/msg.error.png | Bin 0 -> 1677 bytes modules/admin/tpl/img/msg.update.png | Bin 0 -> 2161 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 modules/admin/tpl/img/msg.Info.png create mode 100644 modules/admin/tpl/img/msg.error.png create mode 100644 modules/admin/tpl/img/msg.update.png diff --git a/modules/admin/tpl/img/msg.Info.png b/modules/admin/tpl/img/msg.Info.png new file mode 100644 index 0000000000000000000000000000000000000000..a6f3565c5bf7eb73e7b5546f490cd25f1085c722 GIT binary patch literal 1620 zcmV-a2CMmrP)p5p;c4xP{r9L^?vv=;jbI$pl-^`pjS42?+|7UaQ?}d-9Zg%__ z%G)Tfp(IFEKfjJrMEM!z{EI@3g8d*Oc(hg?zqgn__4UPDbNG1n-9x))5CXjd5d6cw0LN)yV1xDn zIUep$W}exW0@o4X2NJ?C;^D$O^)vDfh-!S_#rPOvM#hL$-|W*+_?1!uA?lj z6alPvie`bj5^{wAp4-(67|`VTU+=IMkmU z|MBXb$z}j1c07?}q%zXBjSq;lQI%WRqf!qghDxh zo#`!gEEoU>d%NNz5x65Jiz;3{LMoB;l5<`eeGHgf^!Jo^mTb7 zn0*i0iRdt{d??|nC8V6G$cO;WcqST&6gp}%GKgUm)1-+!iZp}uAV5DaW3Iq$iCMFB z7}YKr02!~{g$gDagP5IJ^c&}Ny}OWw1-)&dgWY!5Y|p7=V1`kohUSYwKZcRuU|u%^!zSJBgH z)~Z#VH31=cyD9*owM7kpRU9xt&+#PV*%sCwQO787-rvAK&@M7LKw3Z;06C^Z3{;RX<_y^5_?Xttl|5YK=%ZNXOnc1+@Y8a(4DD`AMXKpyAX>t(X8dssu#Fb_uIs=G z`qJfF6~LvnTxBlisx!VynKnWh%-7fI3E89tEygQ55!-fgzpv!VbJst4`IpACVD`~! ziIaq4!I}nRn58uX=DlByyhcCS^x`p7JIppajAjtPm3X_uG}TQ*6^Jwoh?7suRYHBx zxxUW1tTEum1hloq0DWA`j1A7TDoSVPALholr8{9MC~DeN5|JX(+hj<)uB{i!>dCF0T%>T7%e6wSIBC`hBvGDBv_S$tT<+e_LfH>L zMd!y`ewwvt$5C`cs-1oBBvd7Zy`s? zX10;`%>tlCis#VShbR*m)gG*za6z^6E{Qp69!$Sn3E&@ejBNd-9iQ3M$LS^-89IZ8 z_oKY|n2*yR(D85o>Fao-cH{K;F6(v)6oZMRLVPer@d6T{ zS4y~A(ssM_vfca6<@fx%Gi7Gm?Y6%7Cue8&{4?i#=bZ09|34Dv9RKHVh#yIk>OOcL zh?IamE{EeV7+a@nT2#|@zsy*cuU?=f>BMcwCwa+`SLv3v(l>zV~^7RV^sV4A;Np&?*;WF&mwig@AQ!xOwJ#_5R?{SeElA4gskJ0Z`iI z21)w8t)pX0`+=7o=olQ2H*Q`|bN(!W(5wKM6?BlX zk7CithW3N6IC$>>xZzv~rO_s{dW&erb@q8GnbvayZ3kX*hNF>9#HkOfOE{Z>?|^1{ zU~tE=H$!ZA1ei(BN$q@5@~XPdc}Ca>2EbdI@W&TlP8W5(gH}gkP6m98eX_QzGr&p; zbXr3ye2EZvvuQj!=31}13;1(mgX@m@L64M|zbh<2q3lZ}cy=FW= zD~4X3nnAR!HQ!?wMEoOSqGS3=L_W(`5e>C<+`8nTp;KXj-b~PS>M)*8w1$n2|38 zFn8q&l!=K7SDa215=oJrwEa8)jOUZdkl#Z9ip9D{>p8XoC0?n0eUN-UI9Iozz!l*y zX#+sxM&{PtcK_y0;OT6IfHVq6k5*Dkq9zhh?%e~YOqm^y&(jsH-P5M0_vAtrIciD- zf4~Mn<@{8lZ(v94$;|;9X)+mT$t2W~k;)3G(Q2!8)d0;o7LOn`bT>^LIAsGsyL|Ud zIwO~c??Cx`u-v{yDR`kUZ5Ig|jV;e?c4n{Kfch|HC)_*?uRf4CVj=i9t-z)ZM-vY}?bKdLqbhYl->gBlt^8NRqW%D(cp(%2M58jRzNM08n{Bk|7 z6iU5xfZx3zm{`(x!3iR695_yOI}&b+xEr^1F>ydGj!i1>+H~CmMu< zB6avZP$(_+LHwCpwvX*OI06qgigY~)+i0=lrZvvhs zFmX5Oh$}8yRthz;3^`3+1^)bzoR3tPE*z#US0PiVI+oWefdCP-WWr}$y@rr~xJ1c~ z(hH+XrKy7WR!+GorsK5fd?_ENV!~-S6plTHW0#>9ZB?}Zpt7TAI4&4EZK03Te+3u- Xv6o-i>F@k500000NkvXXu0mjfybKqK literal 0 HcmV?d00001 diff --git a/modules/admin/tpl/img/msg.update.png b/modules/admin/tpl/img/msg.update.png new file mode 100644 index 0000000000000000000000000000000000000000..598afd0a3edcad02ac7c08336b7dbafaf1516cad GIT binary patch literal 2161 zcmV-%2#)uOP)R~0_@&fJ;Z_4=`1 zKeLYG*lz5^t`oy6{A>qmBXcD(bvoIA7Ycii?@MwwmjJkI&fch33F3E`Z> z?K~*l=0g@Agpds%I@QG>Qd1WW*3`#Xd2AUi5@{%E>wF}zbw{^cTDe^chC@VADIqjx$OUd1 zuCt)&_FQ6!Maur`=&9qcePVv(-ZR#Q_K85T9s_UR9Uz58p^B27cRdzr-1(4Fv#l)u zAo>%ZxiEwk&lGrfi5D3+Cx>VC;q%X?E}VWcmDCb<^9r`K2`xibE1Fzhzl2~O? zOG)#t6T!yzJyZ=-5S`-UGb{{Jv=&%Z9Y~Q%{H^#eStdC1(_kgW!I^y@e``K9lmOO+ zn;q%zpTFFH^u~1R;ypbE-;jawFsmpiFMBkwscsM9F6DaC53YI#1a@=*i!}g|*_yP; zl`&8nTfv$f1LN{(u&-Yd;elM!N(0>9T`)88y{N8#2f&zG(*^nC`z!++%VYoXKq_t~OK$zUY zii(@KXAn~#Yr$OZ@T16TpuP4xu*L^+d0&!&MK>ze%B~|&(20x@y1dyz1SHZRG=dcs zHA%@#2j0230sv#QRbo=Wdl=tgn_CgF;uV}Vc^T~Zc|Xz>!z=$ccD{n0;iN$C`O~5> ziGQws6P)xkf)D@*P=zTnlUr9aKqU#9ux+S#kgyQ2iaM{=1f9n4DP%k;L}SSJw zYM%A%FJ)l8Jt7A}q_nObO1|`4Y`+lLb8(nEegspI@MCfvX} z{wIiBGR=tRldPCPWKAvPzobYE>1O_2L&LyzyzY88(U+EgDG$KaZ2n$3MH(m-oB;`z zg4}o?en*!%#n0?bu-`k0EX9|RAacG;nz5FZ=0o@`dnvQ0uV8_qPg&Fy@C^C_uh*6V zNE+@C4mp!aB;eU7DTBg;M}bu~uOL}}^B3Swph_|dWNiYx6wyt)L8GAW1gUBtI)4&awJ%^^3t#*ja(>;jDZI^VPVbc&Yix}Y{^7j-0h;;a*Q%Az z2167Fe{TD+7Q9I(WRz7mL(zjLz>4>y?7j|MyY5FHuEt^XX`CG$7t_$O1>e|S7dR|Qgb4<+m!8Hb!=N@lfQDqx z0o`^0)P`=cjQRjXwPV5McLWi+dG!S_`j6u^tU6@Vaa?;eVf7sE*H0&Ou-DxOk|t=+ z_UTW2B_xF#qUi(KzTXgQ^q**40_VnQtn7zy@n}aX6@Mv_*^2#+qm0|r17Hq4<3$d( z~yz9y!vx1S%-A5Z8!eanSJ94`+W?^c#b#~v)Yv8BTP*H$W4Jk$nz{3USa&f$i$ zA3^K|T7t^W3UURS0e*8B?8I5D__t7&Cy^E>r*)ivFmI2)d|~0(DEwCV=Y^&Sy!w~ZmfvN zu~2||MX-={Gt=|-6I)T^Ic* n28=G&!;PG-3*dGh{}*5Y7U{RlSLA0t00000NkvXXu0mjfc3KgJ literal 0 HcmV?d00001 From f7c964226a27366c2658895bf6c20674d8aca9ed Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Thu, 4 Aug 2011 04:33:46 +0000 Subject: [PATCH 0365/1372] Multilingual page created. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8720 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/tpl/css/admin.css | 8 +++++--- modules/admin/tpl/css/admin.min.css | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/modules/admin/tpl/css/admin.css b/modules/admin/tpl/css/admin.css index 444ddc105..0087644f1 100644 --- a/modules/admin/tpl/css/admin.css +++ b/modules/admin/tpl/css/admin.css @@ -393,15 +393,17 @@ button.text{border:0;overflow:visible;padding:0;margin:0;color:#33a;background:n .mLangEdit.tr strong{background:url(../img/flag.tr.gif) no-repeat 0 10px} .mLangEdit.vi strong{background:url(../img/flag.vn.gif) no-repeat 0 10px} .mLangEdit.mn strong{background:url(../img/flag.mn.gif) no-repeat 0 10px} -.mLangEdit ul{ border:0} +.mLangEdit ul ul{border:0} .mLangEdit li{ position:relative;padding:0} .mLangEdit li strong{ display:inline-block;padding:6px 100px 8px 24px;font-weight:normal;line-height:1.5} .mLangEdit li .side{ position:absolute;top:8px;right:0;padding-right:18px;background:url(../img/iconArrow.gif) no-repeat right -160px} -.mLangEdit li li{ border:0;padding-right:40px} -.mLangEdit li li textarea{ width:100%;height:16px;padding-right:30px;resize:vertical;line-height:1.4} +.mLangEdit li li{ border:0;padding-right:36px} +.mLangEdit li textarea{ width:100%;height:16px;padding-right:30px;resize:vertical;line-height:1.4} .mLangEdit li label{ top:8px !important} .mLangEdit li.active strong{ font-weight:bold} .mLangEdit li.active .side{ background-position:right -128px} +.modal .mLangEdit ul{padding-bottom:1em} +.modal .mLangEdit li{border:0;padding-right:36px} /* Suggestion */ .suggestion{display:none;position:absolute;background:#fff;z-index:10;_height:200px;max-height:200px;overflow:auto;*left:0;*margin-top:28px;box-shadow:3px 3px 6px #999;-moz-box-shadow:3px 3px 6px #999;-webkit-box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} .suggestion ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0} diff --git a/modules/admin/tpl/css/admin.min.css b/modules/admin/tpl/css/admin.min.css index 09a40e563..231878c73 100644 --- a/modules/admin/tpl/css/admin.min.css +++ b/modules/admin/tpl/css/admin.min.css @@ -1 +1 @@ -@charset "utf-8";/* NHN (developers@xpressengine.com) *//* Element Reset */body,table,input,textarea,select,button{font-family:Tahoma,Geneva,sans-serif;font-size:12px;color:#333}header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{display:block}button,input[type=submit],input[type=reset],input[type=button]{cursor:pointer;overflow:visible}body{margin:0}img{border:0}p{line-height:1.5}/* Section & Heading */.section{margin:1em 0;padding:0;border:0}.h1, .h2, .h3, .h4{position:relative;border-bottom-style:solid;border-bottom-color:#ccc;zoom:1}.h1{border-bottom-width:4px;font-size:24px}.h2{border-bottom-width:3px;font-size:20px}.h3{border-bottom-width:2px;font-size:16px}.h4{border-bottom-width:1px;font-size:12px}/* Portlet */.portlet{position:relative;border:1px solid #e9e9e9;margin:1em 0;padding:0;background:#fff;zoom:1;overflow:hidden;border-radius:5px}.portlet h2, .portlet h3{margin:0;padding:.5em 1em;font-size:14px;border:1px solid #fff;border-bottom:1px solid #e9e9e9;background:#f7f7f7;border-radius:5px 5px 0 0}.portlet p{margin:1em 1.2em}.portlet li{position:relative;padding-right:8em}.portlet .lined{margin:1px;padding:0;list-style:none}.portlet .lined li{padding:.5em 8em .5em 1em;border-top:1px solid #eee;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis}.portlet .lined li:first-child{border:0}.portlet .side{position:absolute;top:0;_top:1px;right:0;color:#666;background:#fff;padding:0 1em}.portlet .lined .side{padding:.5em 1em}.portlet .more{position:absolute;top:.5em;right:1em;text-decoration:none !important;color:#666}.portlet .more span{color:#999}.portlet .action{text-align:right;top:0;right:0;padding:.5em 1em .5em 3em;background:#fff;background:-webkit-gradient(linear, 0% 0%, 100% 0%, from(rgba(255,255,255,0)), to(rgba(255,255,255,1)), color-stop(15%, #fff));background:-moz-linear-gradient(left, rgba(255,255,255,0) 0, rgba(255,255,255,1) 15%)}.portlet .action a,.portlet .action button{margin-left:1em}.portlet .btnArea{border-top:1px solid #ddd;margin:0;padding:.5em 1em;margin:0 1px 1px 1px;background:#f7f7f7;border-radius:0 0 5px 5px}/* Table */.table{margin:1em 0}.table table{width:100%;border:0;border-collapse:collapse;border-top:2px solid #ccc}.table caption{padding:8px 0;font-weight:bold;text-align:left;line-height:32px}.table caption:after{content:"";display:block;clear:both}.table caption a{font-weight:normal}.table caption em{float:right;font-style:normal;font-weight:normal;color:#e00;margin-left:1em}.table caption strong{color:#e00}.table caption .side{float:right;font-weight:normal;margin-left:1em}.table th,.table td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd;white-space:nowrap}.table th{background:#f8f8f8}.table thead th{border-bottom:1px solid #999}.table tfoot td{font-weight:bold;background:#f8f8f8}.table.even tbody tr:nth-of-type(even) td{background-color:#fafafa}.table input[type=text]{margin:-1px 0 -3px 0;vertical-align:middle}.table img{vertical-align:middle}.table .title,.table .text{white-space:normal}.table .h1 + table,.table .h2 + table,.table .h3 + table,.table .h4 + table,.h1 + .table table,.h2 + .table table,.h3 + .table table,.h4 + .table table{border-top:0}/* Form */.form{margin:1em 0;padding:0}.form fieldset{margin:0 0 2em 0;padding:0;border:0}.form em{font-style:normal;color:#e00}.form label{margin-right:1em;line-height:1}.form input[type=checkbox]+label,.form input[type=radio]+label,.form input[type=file]{cursor:pointer}.form ul{position:relative;margin:0;padding:0;list-style:none;border-top:2px solid #ccc;border-bottom:1px solid #ccc;zoom:1}.form li{list-style:none;border:1px solid #ddd;border-left:0;border-right:0;margin:-1px 0;padding:8px 0;vertical-align:top;zoom:1}.form li:first-child{border-top:0}.form li>label:first-child{display:block;font-weight:bold}.form li label em{font-weight:normal}.form input[type=text],.form input[type=password],.form input[type=file],textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:transparent}.form input[type=text],.form input[type=password],.form input[type=file]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px}.form input[type=checkbox],.form input[type=radio]{margin:0;padding:0;width:13px;height:13px;vertical-align:middle}.form *[disabled=disabled]{background:#ddd;text-shadow:1px 1px 0 #fff}.form textarea{padding:3px 4px;vertical-align:top}.form span.desc{line-height:22px;vertical-align:middle;margin:0 10px}.form p.desc{margin:.25em 0;line-height:1.4}.form .q{font-weight:bold;margin:0 0 5px 0}.form .a{margin:0 0 5px 0}.form .tgForm{margin-right:1em}.form .h1 + ul,.form .h2 + ul,.form .h3 + ul,.form .h4 + ul{border-top:0}/* Global Navigation Bar */.gnb{position:relative;clear:both;border:1px solid #c1c1c1;border-left:0;border-right:0;background-color:#efefef;background:#efefef -webkit-gradient(linear, 0% 0%, 0% 100%, from(#efefef), to(#dcdcdc));background:#efefef -moz-linear-gradient(top, #efefef, #dcdcdc);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#efefef, endColorStr=#dcdcdc);zoom:1}.gnb ul{margin:0;padding:0 0 0 2em;list-style:none;border:1px solid #fff;border-left:0;border-right:0;zoom:1}.gnb ul ul{position:absolute;top:30px;left:0;border:1px solid #ccc;padding:0;background:#fff}.gnb ul:after{content:"";display:block;clear:both}.gnb li{position:relative;float:left;border:1px solid #fff;border-top:0;border-bottom:0;margin:0 -1px 0 0}.gnb li li{float:none;clear:both;overflow:hidden;border:0;border-top:1px dotted #ccc;margin:0;padding:2px}.gnb li li:first-child{border:0}.gnb li a{float:left;font-weight:bold;color:#333;font-size:12px;padding:8px 18px;white-space:nowrap;text-decoration:none;text-shadow:0 1px 0 #fff;zoom:1}.gnb li a:hover,.gnb li a:active,.gnb li a:focus,.gnb li.active a,.gnb li.activeOn a{background:#fff;border:1px solid #ddd;padding:7px 17px}.gnb li li a{display:block;float:none;color:#555;padding:5px 15px !important;font-weight:normal !important;border:0 !important}.gnb li li a:hover,.gnb li li a:active,.gnb li li a:focus{border:0;background:#eee}.gnb .setting{position:absolute;top:8px;right:2em;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;background:url(../img/iconSetting.gif) no-repeat center}.gnb.jx ul{display:block;position:static;padding:0}.gnb.jx li{float:none;clear:both;border-top:1px solid #ccc}.gnb.jx ul ul{border:0}.gnb.jx li li{border:0}.gnb.jx li a{float:none;display:block}.gnb.jx li a:hover,.gnb.jx li a:active,.gnb.jx li a:focus{background:none}.gnb.jx li.activeOn>a{background:#ddd}@media only all and (max-width:860px){ .gnb ul{padding-left:1em} .gnb .setting{right:1em}}@media only all and (max-width:640px){ .gnb ul{display:block;position:static;padding:0} .gnb li{float:none;clear:both;border-top:1px solid #ccc} .gnb ul ul{border:0;position:static} .gnb li li{border:0} .gnb li a{float:none;display:block} .gnb li a:hover, .gnb li a:active, .gnb li a:focus{background:none} .gnb li.activeOn>a{background:#ddd}}/* Pagination */.pagination{margin:1em 0;text-align:center;line-height:normal}.pagination *{vertical-align:middle}.pagination a,.pagination strong{position:relative;display:inline-block;padding:2px 4px;font-weight:bold;text-decoration:none;line-height:normal;color:#333 !important;vertical-align:middle}.pagination a:hover,.pagination a:active,.pagination a:focus{border:1px solid #ddd;margin:0 -1px}.pagination strong{color:#e00 !important;font-size:20px}.pagination .direction{font-weight:normal;white-space:nowrap}.pagination .direction:hover,.pagination .direction:active,.pagination .direction:focus{border:0;margin:0;text-decoration:underline}.pagination input{width:30px;text-align:center}.pagination button{overflow:visible}/* Button */.btn{position:relative;display:inline-block;margin:2px;vertical-align:top}.btn *{display:inline-block;padding:0 8px;font-size:12px;height:24px;line-height:22px;margin:0;font-weight:bold !important;color:#fff;text-decoration:none !important;border:1px solid;cursor:pointer;overflow:visible;border-radius:3px;box-shadow:inset 0 0 1px #fff;-moz-box-shadow:inset 0 0 1px #fff;-webkit-box-shadow:inset 0 0 1px #fff;background-color:#666;text-shadow:0 -1px 0 #333;zoom:1}.btn a, .btn button[type=button]{border-color:#ccc;color:#333 !important;background:#eee -webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#ddd));background:#eee -moz-linear-gradient(top,#fff,#ddd);background-color:#eee;text-shadow:1px 1px 0 #fff;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#ffffff, endColorStr=#dddddd)}.btn input, .btn button[type=submit]{border-color:#666;background:#333 -webkit-gradient(linear,0% 0%,0% 100%,from(#777),to(#777),color-stop(0.5,#333),color-stop(0.5,#000));background:#333 -moz-linear-gradient(top,#777,#000);background-color:#333;color:#ffc;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#777777, endColorStr=#333333)}.btn a{height:22px}.btn.medium *{padding:0 12px;font-size:16px;height:30px;line-height:28px}.btn.medium a{height:28px}.btn.large *{padding:0 18px;font-size:22px;height:36px;line-height:34px}.btn.large a{height:34px}/* Star Rating */.starRating, .starRating span{display:inline-block;height:14px;background:transparent url(../img/iconStarRating.gif) no-repeat;overflow:hidden}.starRating{width:79px;vertical-align:top}.starRating span{font-size:0;line-height:0;vertical-align:top;text-indent:-100px;*text-indent:0;background-position:0 -14px}/* Progress */.prgrs{white-space:nowrap;line-height:normal;vertical-align:middle}.prgrs *{vertical-align:middle}.prgrs .pBar{position:relative;display:inline-block;background:#e9e9e9;margin:0 5px 0 0}.prgrs .pAction{display:inline-block;vertical-align:top;background:#99a6b6}.prgrs .pNum{position:absolute;width:100%;left:0;top:0;text-align:center;text-shadow:1px 1px 0 #fff}.prgrs.prgrsSmall{font-size:14px;line-height:14px}.prgrs.prgrsSmall .pBar,.prgrs.prgrsSmall .pAction,.prgrs.prgrsSmall .pNum{height:16px;line-height:16px;font-size:11px}.prgrs.prgrsMedium{font-size:24px;line-height:24px}.prgrs.prgrsMedium .pBar,.prgrs.prgrsMedium .pAction,.prgrs.prgrsMedium .pNum{height:22px;line-height:22px;font-size:12px}.prgrs.prgrsLarge{font-size:38px;line-height:38px}.prgrs.prgrsLarge .pBar,.prgrs.prgrsLarge .pAction,.prgrs.prgrsLarge .pNum{height:34px;line-height:34px;font-size:14px}/* Layer */.layer{position:absolute;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;font-weight:normal;z-index:2;zoom:1;border-radius:5px;box-shadow:0 0 6px #666;-moz-box-shadow:0 0 6px #666;-webkit-box-shadow:0 0 6px #666;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.layer h2{margin-top:1em}.layer ul, .layer ol, .layer .lined, .layer .table{margin-bottom:1em}.layerClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px}.layerBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}/* Modal Window */.modal{position:fixed;*position:absolute;top:0;left:0;width:100%;_height:100%;min-height:100%;z-index:100}.modal .bg{position:absolute;background:#000;_background:none;width:100%;height:100%;opacity:.5;z-index:2;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1}.modal .fg{position:relative;width:50%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:3;zoom:1;border-radius:5px;box-shadow:0 0 6px #000;-moz-box-shadow:0 0 6px #000;-webkit-box-shadow:0 0 6px #000}.modal h2{margin-top:1em}.modal ul, .modal ol, .modal .lined, .modal .table{margin-bottom:1em}.modal .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1}.modalClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px}.modalBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}html.modalContainer,body.modalContainer{_height:100%;_width:100%} /* IE6 only */ /* Message */.message{border:1px solid #ddd;background:#f8f8f8;margin:1em 0;padding:0 1em;border-radius:5px}.message em{font-style:normal;color:#e00}.message.info,.message.error,.message.update{padding-left:55px}.message.info{border-color:#E0E8EC;background:#EDF9FF url(../img/msg.Info.png) no-repeat 1em .5em}.message.error{border-color:#EFDCDC;background:#FFECEC url(../img/msg.error.png) no-repeat 1em .5em}.message.update{border-color:#EAE9DC;background:#FFFDEF url(../img/msg.update.png) no-repeat 1em .5em}/* Text Button */input.text, button.text{border:0;overflow:visible;padding:0;margin:0;color:#33a;background:none;text-decoration:underline}/* H2 Anchor */.h2Anchor{position:absolute;right:0;border:0;background:none;color:#00f;text-decoration:underline}/* Waiting for server response */#wfsr .bg{position:absolute;background:#000;_background:none;width:100%;height:100%;opacity:.5;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1}#wfsr .fg{position:relative;width:50%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:10px solid #ddd;z-index:2;zoom:1}#wfsr .fg p{padding:0 0 0 2.5em;background:url(../img/preLoader16.gif) no-repeat 1em .4em}#wfsr .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1}.wfsrActive{position:fixed;_position:absolute;top:0;left:0;width:100%;height:100%;z-index:100}.wfsrClose{position:absolute;right:-10px;top:-10px;border:0;background:#ddd;padding:0;width:34px;height:34px;font-size:16px;font-weight:bold;cursor:pointer;color:#999}.wfsrBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}/* Skip Navigation */.skipNav{margin:0;text-align:center;overflow:hidden}.skipNav a{position:absolute;width:1px;height:1px;display:block;color:#fff;font-weight:bold;padding:10px 0;background:#333;border-top:1px solid #656565}.skipNav a:hover,.skipNav a:active,.skipNav a:focus{position:relative;width:auto;height:auto}/* Header */.header{position:relative;z-index:2;padding:30px 0 0 0;background:#4c4c4c;box-shadow:0 0 10px #aaa;-moz-box-shadow:0 0 10px #aaa;-webkit-box-shadow:0 0 10px #aaa;zoom:1}.stAdmin .header{background:#2D808A}.header:after{content:"";display:block;clear:both}.header a{text-decoration:none}.header h1{margin:0 100px 10px 1.3em;font-size:24px;line-height:32px}.header h1 *{vertical-align:middle}.header h1 a{color:#fff;text-shadow:1px 1px 0 #000;filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=1, OffY=1, Color=#000000, Positive=true);zoom:1}.header h1 img{height:32px}.header h1 .url{font-size:12px;font-weight:normal}.header .siteTool{position:absolute !important;top:42px;right:0;padding:0 2em 0 0;z-index:2}.header .siteTool .i{position:relative;z-index:2;display:inline-block;color:#fff;padding:0 6px;line-height:24px}.header .siteTool .i:first-child{border:0}.header .siteTool .tgAnchor{padding-right:16px;background:url(../img/iconArrow.gif) no-repeat right -156px}.header .siteTool .tgAnchor.active{border:1px solid #ccc;border-bottom:0;background-color:#fff;color:#333;text-decoration:none;border-radius:5px 5px 0 0}.header .siteTool .tgContent{position:absolute;top:24px;right:2em;border:1px solid #ccc;z-index:1;background-color:#fff;border-radius:5px 0 5px 5px}.header .siteTool .tgContent .btnArea{margin:0}.header #moveSiteList{padding:10px 1em 5px 1em;margin:0}.header #moveSiteList ul{list-style:none;margin:0;padding:0}.header #moveSiteList li{white-space:nowrap;margin:0;padding:4px 0;border-bottom:1px dotted #ccc}.header #siteMapList{padding:0 1em 1em 1em;margin:0}.header #siteMapList li{white-space:nowrap}.header .account{position:absolute;z-index:3;width:100%;padding:5px 2em 5px 0;top:0;right:0;white-space:nowrap;text-align:right;background:#333;border-bottom:1px solid #656565;color:#fff;font-size:12px;box-shadow:0 0 10px #333;-moz-box-shadow:0 0 10px #333;-webkit-box-shadow:0 0 10px #333}.stAdmin .header .account{background:#0e5f69}.header .account ul{margin:0 2px 0 0;padding:0;list-style:none}.header .account li{position:relative;display:inline;border-left:1px solid #666;padding:0 6px 0 10px}.header .account li:first-child{border:0}.header .account a{color:#fff;display:inline-block;height:14px}.header .account a.language{padding-right:2px}.header #language{position:absolute;top:19px;right:0;padding:6px 4px !important;border:1px solid #666;border-top:0;background:#333}.header #language li{border:0;display:block;padding:1px 8px;text-align:left;line-height:1}.header #language li.selected{background:transparent url(../img/checked.png) no-repeat left center}.header h1 a:hover,.header h1 a:active,.header h1 a:focus,.header .siteTool a:hover,.header .siteTool a:active,.header .siteTool a:focus,.header .account a:hover,.header .account a:active,.header .account a:focus{color:#6e9cf2;text-decoration:underline}/* Footer */.footer{border-top:1px solid #ddd;text-align:center;font-size:12px;padding:1.5em 0;margin:0 2em}.footer p{margin:0}.footer a{color:#6e9cf2;text-decoration:none}/* Body */.body{position:relative;z-index:1;padding:1em 2em 1em 260px;zoom:1}.body:after{content:"";display:block;clear:both}/* Content */.content{float:right;width:100%;margin-left:-230px;zoom:1}.content:after{content:"";display:block;clear:both}.content a{color:#33a}.content a:hover,.content a:active,.content a:focus{color:#a33}.content .portlet a{text-decoration:none}.content .portlet a:hover,.content .portlet a:active,.content .portlet a:focus{text-decoration:underline}/* Dashboard */.dashboard{position:relative;float:none;width:auto;margin-left:-230px}.dashboard .portlet{float:left;width:48%;margin-right:1em}.dashboard .portlet:nth-of-type(even){ float:left;width:49%;margin-right:0 }.dashboard .portlet:nth-of-type(even){ float:right;width:49%;margin-right:0}/* Local Navigation */.lnb{position:relative;float:left;width:200px;margin:1em 0 1em -230px;line-height:normal;zoom:1;display:inline}.lnb .h2{margin-top:0}.lnb ul{margin:0;padding:0;list-style:none}.lnb li{position:relative;margin:0 0 -1px 0;vertical-align:top;zoom:1}.lnb li a{display:block;position:relative;padding:8px 10px;text-decoration:none;color:#666;font-weight:bold;background:#fafafa;border:1px solid #eee;zoom:1}.lnb li a .i{position:absolute;top:50%;left:100%;margin:-4px 0 0 -16px;width:8px;height:8px;color:#ccc;background:url(../img/iconNavVr.gif) no-repeat left top}.lnb li ul{padding:5px 0;background:#fff}.lnb li li{margin:0;border-top:1px dotted #ddd}.lnb li li:first-child{border:0}.lnb li li a{font-weight:normal;background:#fff;padding:5px 10px;border:0}.lnb li li a span{color:#666}.lnb li.active{border:1px solid #ccc;z-index:2}.lnb li li.active{border:0}.lnb li.active a{color:#000;border:0}.lnb li.active .i{background-position:0 -44px}.lnb li.active li a{border:0}.lnb li.active ul{display:block;border-top:1px solid #eee}.lnb li.active li.active a span{color:#13b200;font-weight:bold;letter-spacing:-1px}/* Search */.search{zoom:1}.search:after{content:"";display:block;clear:both}.search .pagination{float:left;text-align:left}.search form{float:right;margin:1em 0}.search form *{vertical-align:middle}/* Site Map */.siteMap h2 input{font-size:12px;font-weight:bold;padding:0 .5em}.siteMap .lined ul{padding:0;margin:0;border-top:1px solid #eee;zoom:1}.siteMap .lined li{position:relative;padding:0;margin:0;cursor:all-scroll;list-style:none;zoom:1}.siteMap .lined li li{border-top:1px solid #eee}.siteMap li li{text-indent:32px}.siteMap li li li{text-indent:64px}.siteMap li li li li{text-indent:96px}.siteMap li li li li li{text-indent:128px}.siteMap li li li li li li{text-indent:160px}.siteMap li li li li li li li{text-indent:192px}.siteMap li li li li li li li li{text-indent:224px}.siteMap li li li li li li li li li{text-indent:256px}.siteMap li li li li li li li li li li{text-indent:288px}.siteMap li li li li li li li li li li li{text-indent:320px}.siteMap li li li li li li li li li li li li{text-indent:352px}.siteMap li *{vertical-align:middle}.siteMap li .moveTo+input{width:200px;border:0;padding:0 .5em}.siteMap li .moveTo+input:hover,.siteMap li .moveTo+input:active,.siteMap li .moveTo+input:focus{border:1px dotted #ccc;overflow:visible}.siteMap .moveTo{position:relative;z-index:2;width:32px;height:32px;padding:32px 0 0 0;margin:0 .5em;_margin-top:-1px;overflow:hidden;background:#fff url(../img/iconMoveTo.gif) no-repeat;border:0}.siteMap li.active li,.siteMap li.active ul{border-top-color:#fff}.siteMap li.active .moveTo{background-position:0 -32px}.siteMap .vr{display:none;position:absolute;z-index:1;left:16px;top:-16px;margin:0 .5em;height:100%;border-left:1px solid #ccc;overflow:hidden}.siteMap .hr{display:none;position:absolute;z-index:1;left:16px;top:16px;margin:0 .5em;width:16px;border-top:1px solid #ccc;overflow:hidden}.siteMap li.active .vr,.siteMap li.active li .hr{display:block}.siteMap li li .vr,.siteMap li li li .hr{left:48px}.siteMap li li li .vr,.siteMap li li li li .hr{left:80px}.siteMap li li li li .vr,.siteMap li li li li li .hr{left:112px}.siteMap li li li li li .vr,.siteMap li li li li li li .hr{left:144px}.siteMap li li li li li li .vr,.siteMap li li li li li li li .hr{left:176px}.siteMap li li li li li li li .vr,.siteMap li li li li li li li li .hr{left:208px}.siteMap li li li li li li li li .vr,.siteMap li li li li li li li li li .hr{left:240px}.siteMap li li li li li li li li li .vr,.siteMap li li li li li li li li li li .hr{left:272px}.siteMap li li li li li li li li li li .vr,.siteMap li li li li li li li li li li li .hr{left:304px}.siteMap li li li li li li li li li li li .vr,.siteMap li li li li li li li li li li li li .hr{left:336px}.siteMap .side{padding-top:0 !important;padding-bottom:0 !important;line-height:30px}.siteMap .side button{text-indent:0;line-height:1}.siteMap .tgMap{position:absolute;top:12px;right:1em;padding:0 16px 0 0;line-height:16px;background:url(../img/iconArrow.gif) no-repeat right -126px}.siteMap.fold .tgMap{background-position:right -158px}.siteMap.fold .h2{border-bottom-color:#fff;border-radius:5px}/* Button Area */.btnArea{margin:1em 0;text-align:right;zoom:1}.btnArea:after{content:"";display:block;clear:both}/* Multilingual */.langEdit{background:#fff;position:absolute;*left:0;*margin-top:28px;z-index:10;box-shadow:3px 3px 6px #999;-moz-box-shadow:3px 3px 6px #999;-webkit-box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.langEdit ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0}.langEdit li{padding:.5em 10px}.langEdit input[type=text]{width:220px;padding-right:40px}.langEdit label{left:15px !important}.langEdit .action{border:1px solid #eee;width:268px;padding:0 10px}.langEdit p, .langEdit .btnArea{white-space:normal}.langEdit li.en input, .mLangEdit li.en textarea{background:url(../img/flag.us.gif) no-repeat 99% 5px}.langEdit li.ko input, .mLangEdit li.ko textarea{background:url(../img/flag.kr.gif) no-repeat 99% 5px}.langEdit li.ja input, .mLangEdit li.ja textarea{background:url(../img/flag.jp.gif) no-repeat 99% 5px}.langEdit li.zh input, .mLangEdit li.zh textarea{background:url(../img/flag.cn.gif) no-repeat 99% 5px}.langEdit li.fr input, .mLangEdit li.fr textarea{background:url(../img/flag.fr.gif) no-repeat 99% 5px}.langEdit li.de input, .mLangEdit li.de textarea{background:url(../img/flag.de.gif) no-repeat 99% 5px}.langEdit li.ru input, .mLangEdit li.ru textarea{background:url(../img/flag.ru.gif) no-repeat 99% 5px}.langEdit li.es input, .mLangEdit li.es textarea{background:url(../img/flag.es.gif) no-repeat 99% 5px}.langEdit li.tr input, .mLangEdit li.tr textarea{background:url(../img/flag.tr.gif) no-repeat 99% 5px}.langEdit li.vi input, .mLangEdit li.vi textarea{background:url(../img/flag.vn.gif) no-repeat 99% 5px}.langEdit li.mn input, .mLangEdit li.mn textarea{background:url(../img/flag.mn.gif) no-repeat 99% 5px}.mLangEdit.en strong{background:url(../img/flag.us.gif) no-repeat 0 10px}.mLangEdit.ko strong{background:url(../img/flag.kr.gif) no-repeat 0 10px}.mLangEdit.ja strong{background:url(../img/flag.jp.gif) no-repeat 0 10px}.mLangEdit.zh strong{background:url(../img/flag.cn.gif) no-repeat 0 10px}.mLangEdit.fr strong{background:url(../img/flag.fr.gif) no-repeat 0 10px}.mLangEdit.de strong{background:url(../img/flag.de.gif) no-repeat 0 10px}.mLangEdit.ru strong{background:url(../img/flag.ru.gif) no-repeat 0 10px}.mLangEdit.es strong{background:url(../img/flag.es.gif) no-repeat 0 10px}.mLangEdit.tr strong{background:url(../img/flag.tr.gif) no-repeat 0 10px}.mLangEdit.vi strong{background:url(../img/flag.vn.gif) no-repeat 0 10px}.mLangEdit.mn strong{background:url(../img/flag.mn.gif) no-repeat 0 10px}.mLangEdit ul{ border:0}.mLangEdit li{ position:relative;padding:0}.mLangEdit li strong{ display:inline-block;padding:6px 100px 8px 24px;font-weight:normal;line-height:1.5}.mLangEdit li .side{ position:absolute;top:8px;right:0;padding-right:18px;background:url(../img/iconArrow.gif) no-repeat right -160px}.mLangEdit li li{ border:0;padding-right:40px}.mLangEdit li li textarea{ width:100%;height:16px;padding-right:30px;resize:vertical;line-height:1.4}.mLangEdit li label{ top:8px !important}.mLangEdit li.active strong{ font-weight:bold}.mLangEdit li.active .side{ background-position:right -128px}/* Suggestion */.suggestion{display:none;position:absolute;background:#fff;z-index:10;_height:200px;max-height:200px;overflow:auto;*left:0;*margin-top:28px;box-shadow:3px 3px 6px #999;-moz-box-shadow:3px 3px 6px #999;-webkit-box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.suggestion ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0}.suggestion li{padding:0}.suggestion li:last-child{border-bottom:0}.suggestion li button{border:0;background:#fff;text-align:left;width:280px;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.suggestion li button:hover,.suggestion li button:active,.suggestion li button:focus{background:#eee}/* Image Mark */#imageMark{right:0}/* Easy Installer */.easyNav{position:relative;border:1px solid #e9e9e9;zoom:1}.easyNav:after{content:"";display:block;clear:both}.easyNav h2{font-size:16px}.easyNav .category{width:30%;float:left;margin:0 2em;display:inline}.easyNav .filter{position:absolute;top:0;right:0;margin:1em 2em;text-align:right}.easyList td p{margin-top:0}.easyList td p.update{background:#ffc;padding:.5em 1em;border:1px solid #fc9;border-left:0;border-right:0;text-align:center}/* Font Preview */.fontPreview{width:96%;border:1px solid #e9e9e9;zoom:1;padding:1em 2em;margin:.5em 0}/* FTP Suggestion */#ftpSuggestion{background:#fff;box-shadow:3px 3px 6px #999;-moz-box-shadow:3px 3px 6px #999;-webkit-box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}#ftpSuggestion ul{border-left:1px solid #eee;border-right:1px solid #eee}#ftpSuggestion li{padding:0}#ftpSuggestion li button{border:0;background:#fff;text-align:left;width:288px}#ftpSuggestion li button:hover,#ftpSuggestion li button:active,#ftpSuggestion li button:focus{background:#eee}/* Theme & Skin Preview */.thumbPreview li{position:relative;padding-left:10px;padding-right:10px}.thumbPreview li.active.highlight{background:#f9f9f9}.thumbPreview .prevToggle{position:absolute;top:8px;right:10px;line-height:16px;padding:0 18px 0 0;text-decoration:none;background:url(../img/iconArrow.gif) no-repeat right -32px}.thumbPreview li.active .prevToggle{background-position:right 0}.thumbPreview .a{border:0;margin:0;zoom:1}.thumbPreview .a:after{content:"";display:block;clear:both}.thumbPreview .i{float:left;vertical-align:top;margin:0 1em 1em 0;padding:0;border:0;zoom:1}.thumbPreview .i:after{content:"";display:block;clear:both}.thumbPreview .i .thumb{position:relative;width:124px;height:84px;padding:0;margin-bottom:3px;text-align:center;overflow:hidden;border:1px solid #ddd;display:block;cursor:pointer;background:#fff}.thumbPreview .i .thumb .frame{position:absolute;width:120px;height:80px;left:0;top:0;border:2px solid #fff;overflow:hidden}.thumbPreview .i .thumb img{width:120px;margin:0}.thumbPreview .i label{display:block;position:relative;top:0;left:2px;width:122px;height:1.1em;margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.thumbPreview .i input{display:none}.thumbPreview .i ul{display:none}.thumbPreview .selected .i{display:block;float:none}.thumbPreview .selected .i .thumb{float:left;width:186px;height:126px;margin:0 1em 0 0;border:2px solid #eee}.thumbPreview .selected .i .thumb .frame{width:180px;height:120px;border-width:3px}.thumbPreview li.active.highlight .selected .i .thumb{border-color:#5ea8f6}.thumbPreview .selected .i .thumb img{width:180px;position:relative}.thumbPreview li.active .selected .i .thumb img{z-index:auto}.thumbPreview .selected .i label{cursor:text}.thumbPreview .selected .i ul{display:block;list-style:none;border:0;margin:1em 0 1em 200px}.thumbPreview .selected .i li{border:0;padding:0;margin:0 0 .2em 0}.thumbPreview.jx .i label{display:inline;width:auto}.thumbPreview.jx .i.noDirection{display:none}.thumbPreview.jx .i input{display:inline}#skin .showAll{float:right;border:0;overflow:visible;padding:0 18px 0 0;cursor:pointer;color:#00f;background:url(../img/iconArrow.gif) no-repeat right -32px}#skin .showAll.hideAll{background-position:right 0}/* Sign Up Form */.signUpForm li{position:relative}.signUpForm .side{position:absolute;top:8px;right:0}/* Favorite On | Off */.fvOff,.fvOn{display:inline-block;width:16px;height:16px;overflow:hidden;text-indent:16px;background:url(../img/iconFavorite.gif) no-repeat}.fvOn{background-position:0 -16px}/* Up-Down Dragable */.uDrag .wrap{position:relative;padding-left:20px}.uDrag .dragActive{background:#FFD}.uDrag .dragActive td{background:none !important}.uDrag .dragBtn{position:absolute;width:8px;height:100%;padding:0;overflow:hidden;background:url(../img/bgDragable.gif);top:1px;left:0;text-indent:12px;border:0;cursor:n-resize}/* Favicon Preview */.faviconPreview{position:relative;padding:60px 0 0 200px;background:url(../img/bgFavicon.gif) no-repeat}.faviconPreview img{position:absolute}.faviconPreview .fn1{top:30px;left:12px}.faviconPreview .fn2{top:55px;left:68px}/* Mobile Icon Preview */.mobiconPreview{position:relative;padding:252px 0 0 200px;background:url(../img/bgMobileTop.png) no-repeat}.mobiconPreview img{position:absolute;top:20px;left:10px}.mobiconPreview span{position:absolute;width:32px;text-align:center;top:52px;left:10px;color:#fff;font-size:9px}/* Text List */.textList{border:1px solid #ddd !important;line-height:1.5em;height:18.5em;overflow:auto}.textList li{border:0;padding:.25em 1em;height:1.5em;white-space:nowrap;overflow:hidden}.textList li:nth-child(even){background:#eee}.textList li a{float:right}/* Responsive Layout */@media only all and (max-width:860px){ .header h1{margin-left:.7em} .header .account{padding-right:1em} .header .siteTool{padding-right:1em} .header .siteTool .tgContent{right:1em} .body{padding:1em} .content{float:none;margin-left:0} .lnb{float:none;width:auto;margin:1em 0} .dashboard .portlet{float:none !important;width:auto !important;margin-right:0} .modal .fg, .wfsr .fg{width:auto} .easyNav .category{float:none;display:block;width:auto} .easyNav .filter{position:static}}@media only all and (max-width:640px){ .skipNav a{position:relative;width:auto;height:auto} .modal{position:absolute}} \ No newline at end of file +@charset "utf-8";/* NHN (developers@xpressengine.com) *//* Element Reset */body,table,input,textarea,select,button{font-family:Tahoma,Geneva,sans-serif;font-size:12px;color:#333}header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{display:block}button,input[type=submit],input[type=reset],input[type=button]{cursor:pointer;overflow:visible}body{margin:0}img{border:0}p{line-height:1.5}/* Section & Heading */.section{margin:1em 0;padding:0;border:0}.h1, .h2, .h3, .h4{position:relative;border-bottom-style:solid;border-bottom-color:#ccc;zoom:1}.h1{border-bottom-width:4px;font-size:24px}.h2{border-bottom-width:3px;font-size:20px}.h3{border-bottom-width:2px;font-size:16px}.h4{border-bottom-width:1px;font-size:12px}/* Portlet */.portlet{position:relative;border:1px solid #e9e9e9;margin:1em 0;padding:0;background:#fff;zoom:1;overflow:hidden;border-radius:5px}.portlet h2, .portlet h3{margin:0;padding:.5em 1em;font-size:14px;border:1px solid #fff;border-bottom:1px solid #e9e9e9;background:#f7f7f7;border-radius:5px 5px 0 0}.portlet p{margin:1em 1.2em}.portlet li{position:relative;padding-right:8em}.portlet .lined{margin:1px;padding:0;list-style:none}.portlet .lined li{padding:.5em 8em .5em 1em;border-top:1px solid #eee;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis}.portlet .lined li:first-child{border:0}.portlet .side{position:absolute;top:0;_top:1px;right:0;color:#666;background:#fff;padding:0 1em}.portlet .lined .side{padding:.5em 1em}.portlet .more{position:absolute;top:.5em;right:1em;text-decoration:none !important;color:#666}.portlet .more span{color:#999}.portlet .action{text-align:right;top:0;right:0;padding:.5em 1em .5em 3em;background:#fff;background:-webkit-gradient(linear, 0% 0%, 100% 0%, from(rgba(255,255,255,0)), to(rgba(255,255,255,1)), color-stop(15%, #fff));background:-moz-linear-gradient(left, rgba(255,255,255,0) 0, rgba(255,255,255,1) 15%)}.portlet .action a,.portlet .action button{margin-left:1em}.portlet .btnArea{border-top:1px solid #ddd;margin:0;padding:.5em 1em;margin:0 1px 1px 1px;background:#f7f7f7;border-radius:0 0 5px 5px}/* Table */.table{margin:1em 0}.table table{width:100%;border:0;border-collapse:collapse;border-top:2px solid #ccc}.table caption{padding:8px 0;font-weight:bold;text-align:left;line-height:32px}.table caption:after{content:"";display:block;clear:both}.table caption a{font-weight:normal}.table caption em{float:right;font-style:normal;font-weight:normal;color:#e00;margin-left:1em}.table caption strong{color:#e00}.table caption .side{float:right;font-weight:normal;margin-left:1em}.table th,.table td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd;white-space:nowrap}.table th{background:#f8f8f8}.table thead th{border-bottom:1px solid #999}.table tfoot td{font-weight:bold;background:#f8f8f8}.table.even tbody tr:nth-of-type(even) td{background-color:#fafafa}.table input[type=text]{margin:-1px 0 -3px 0;vertical-align:middle}.table img{vertical-align:middle}.table .title,.table .text{white-space:normal}.table .h1 + table,.table .h2 + table,.table .h3 + table,.table .h4 + table,.h1 + .table table,.h2 + .table table,.h3 + .table table,.h4 + .table table{border-top:0}/* Form */.form{margin:1em 0;padding:0}.form fieldset{margin:0 0 2em 0;padding:0;border:0}.form em{font-style:normal;color:#e00}.form label{margin-right:1em;line-height:1}.form input[type=checkbox]+label,.form input[type=radio]+label,.form input[type=file]{cursor:pointer}.form ul{position:relative;margin:0;padding:0;list-style:none;border-top:2px solid #ccc;border-bottom:1px solid #ccc;zoom:1}.form li{list-style:none;border:1px solid #ddd;border-left:0;border-right:0;margin:-1px 0;padding:8px 0;vertical-align:top;zoom:1}.form li:first-child{border-top:0}.form li>label:first-child{display:block;font-weight:bold}.form li label em{font-weight:normal}.form input[type=text],.form input[type=password],.form input[type=file],textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:transparent}.form input[type=text],.form input[type=password],.form input[type=file]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px}.form input[type=checkbox],.form input[type=radio]{margin:0;padding:0;width:13px;height:13px;vertical-align:middle}.form *[disabled=disabled]{background:#ddd;text-shadow:1px 1px 0 #fff}.form textarea{padding:3px 4px;vertical-align:top}.form span.desc{line-height:22px;vertical-align:middle;margin:0 10px}.form p.desc{margin:.25em 0;line-height:1.4}.form .q{font-weight:bold;margin:0 0 5px 0}.form .a{margin:0 0 5px 0}.form .tgForm{margin-right:1em}.form .h1 + ul,.form .h2 + ul,.form .h3 + ul,.form .h4 + ul{border-top:0}/* Global Navigation Bar */.gnb{position:relative;clear:both;border:1px solid #c1c1c1;border-left:0;border-right:0;background-color:#efefef;background:#efefef -webkit-gradient(linear, 0% 0%, 0% 100%, from(#efefef), to(#dcdcdc));background:#efefef -moz-linear-gradient(top, #efefef, #dcdcdc);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#efefef, endColorStr=#dcdcdc);zoom:1}.gnb ul{margin:0;padding:0 0 0 2em;list-style:none;border:1px solid #fff;border-left:0;border-right:0;zoom:1}.gnb ul ul{position:absolute;top:30px;left:0;border:1px solid #ccc;padding:0;background:#fff}.gnb ul:after{content:"";display:block;clear:both}.gnb li{position:relative;float:left;border:1px solid #fff;border-top:0;border-bottom:0;margin:0 -1px 0 0}.gnb li li{float:none;clear:both;overflow:hidden;border:0;border-top:1px dotted #ccc;margin:0;padding:2px}.gnb li li:first-child{border:0}.gnb li a{float:left;font-weight:bold;color:#333;font-size:12px;padding:8px 18px;white-space:nowrap;text-decoration:none;text-shadow:0 1px 0 #fff;zoom:1}.gnb li a:hover,.gnb li a:active,.gnb li a:focus,.gnb li.active a,.gnb li.activeOn a{background:#fff;border:1px solid #ddd;padding:7px 17px}.gnb li li a{display:block;float:none;color:#555;padding:5px 15px !important;font-weight:normal !important;border:0 !important}.gnb li li a:hover,.gnb li li a:active,.gnb li li a:focus{border:0;background:#eee}.gnb .setting{position:absolute;top:8px;right:2em;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;background:url(../img/iconSetting.gif) no-repeat center}.gnb.jx ul{display:block;position:static;padding:0}.gnb.jx li{float:none;clear:both;border-top:1px solid #ccc}.gnb.jx ul ul{border:0}.gnb.jx li li{border:0}.gnb.jx li a{float:none;display:block}.gnb.jx li a:hover,.gnb.jx li a:active,.gnb.jx li a:focus{background:none}.gnb.jx li.activeOn>a{background:#ddd}@media only all and (max-width:860px){ .gnb ul{padding-left:1em} .gnb .setting{right:1em}}@media only all and (max-width:640px){ .gnb ul{display:block;position:static;padding:0} .gnb li{float:none;clear:both;border-top:1px solid #ccc} .gnb ul ul{border:0;position:static} .gnb li li{border:0} .gnb li a{float:none;display:block} .gnb li a:hover, .gnb li a:active, .gnb li a:focus{background:none} .gnb li.activeOn>a{background:#ddd}}/* Pagination */.pagination{margin:1em 0;text-align:center;line-height:normal}.pagination *{vertical-align:middle}.pagination a,.pagination strong{position:relative;display:inline-block;padding:2px 4px;font-weight:bold;text-decoration:none;line-height:normal;color:#333 !important;vertical-align:middle}.pagination a:hover,.pagination a:active,.pagination a:focus{border:1px solid #ddd;margin:0 -1px}.pagination strong{color:#e00 !important;font-size:20px}.pagination .direction{font-weight:normal;white-space:nowrap}.pagination .direction:hover,.pagination .direction:active,.pagination .direction:focus{border:0;margin:0;text-decoration:underline}.pagination input{width:30px;text-align:center}.pagination button{overflow:visible}/* Button */.btn{position:relative;display:inline-block;margin:2px;vertical-align:top}.btn *{display:inline-block;padding:0 8px;font-size:12px;height:24px;line-height:22px;margin:0;font-weight:bold !important;color:#fff;text-decoration:none !important;border:1px solid;cursor:pointer;overflow:visible;border-radius:3px;box-shadow:inset 0 0 1px #fff;-moz-box-shadow:inset 0 0 1px #fff;-webkit-box-shadow:inset 0 0 1px #fff;background-color:#666;text-shadow:0 -1px 0 #333;zoom:1}.btn a, .btn button[type=button]{border-color:#ccc;color:#333 !important;background:#eee -webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#ddd));background:#eee -moz-linear-gradient(top,#fff,#ddd);background-color:#eee;text-shadow:1px 1px 0 #fff;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#ffffff, endColorStr=#dddddd)}.btn input, .btn button[type=submit]{border-color:#666;background:#333 -webkit-gradient(linear,0% 0%,0% 100%,from(#777),to(#777),color-stop(0.5,#333),color-stop(0.5,#000));background:#333 -moz-linear-gradient(top,#777,#000);background-color:#333;color:#ffc;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#777777, endColorStr=#333333)}.btn a{height:22px}.btn.medium *{padding:0 12px;font-size:16px;height:30px;line-height:28px}.btn.medium a{height:28px}.btn.large *{padding:0 18px;font-size:22px;height:36px;line-height:34px}.btn.large a{height:34px}/* Star Rating */.starRating, .starRating span{display:inline-block;height:14px;background:transparent url(../img/iconStarRating.gif) no-repeat;overflow:hidden}.starRating{width:79px;vertical-align:top}.starRating span{font-size:0;line-height:0;vertical-align:top;text-indent:-100px;*text-indent:0;background-position:0 -14px}/* Progress */.prgrs{white-space:nowrap;line-height:normal;vertical-align:middle}.prgrs *{vertical-align:middle}.prgrs .pBar{position:relative;display:inline-block;background:#e9e9e9;margin:0 5px 0 0}.prgrs .pAction{display:inline-block;vertical-align:top;background:#99a6b6}.prgrs .pNum{position:absolute;width:100%;left:0;top:0;text-align:center;text-shadow:1px 1px 0 #fff}.prgrs.prgrsSmall{font-size:14px;line-height:14px}.prgrs.prgrsSmall .pBar,.prgrs.prgrsSmall .pAction,.prgrs.prgrsSmall .pNum{height:16px;line-height:16px;font-size:11px}.prgrs.prgrsMedium{font-size:24px;line-height:24px}.prgrs.prgrsMedium .pBar,.prgrs.prgrsMedium .pAction,.prgrs.prgrsMedium .pNum{height:22px;line-height:22px;font-size:12px}.prgrs.prgrsLarge{font-size:38px;line-height:38px}.prgrs.prgrsLarge .pBar,.prgrs.prgrsLarge .pAction,.prgrs.prgrsLarge .pNum{height:34px;line-height:34px;font-size:14px}/* Layer */.layer{position:absolute;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;font-weight:normal;z-index:2;zoom:1;border-radius:5px;box-shadow:0 0 6px #666;-moz-box-shadow:0 0 6px #666;-webkit-box-shadow:0 0 6px #666;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.layer h2{margin-top:1em}.layer ul, .layer ol, .layer .lined, .layer .table{margin-bottom:1em}.layerClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px}.layerBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}/* Modal Window */.modal{position:fixed;*position:absolute;top:0;left:0;width:100%;_height:100%;min-height:100%;z-index:100}.modal .bg{position:absolute;background:#000;_background:none;width:100%;height:100%;opacity:.5;z-index:2;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1}.modal .fg{position:relative;width:50%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:3;zoom:1;border-radius:5px;box-shadow:0 0 6px #000;-moz-box-shadow:0 0 6px #000;-webkit-box-shadow:0 0 6px #000}.modal h2{margin-top:1em}.modal ul, .modal ol, .modal .lined, .modal .table{margin-bottom:1em}.modal .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1}.modalClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px}.modalBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}html.modalContainer,body.modalContainer{_height:100%;_width:100%} /* IE6 only */ /* Message */.message{border:1px solid #ddd;background:#f8f8f8;margin:1em 0;padding:0 1em;border-radius:5px}.message em{font-style:normal;color:#e00}.message.info,.message.error,.message.update{padding-left:55px}.message.info{border-color:#E0E8EC;background:#EDF9FF url(../img/msg.Info.png) no-repeat 1em .5em}.message.error{border-color:#EFDCDC;background:#FFECEC url(../img/msg.error.png) no-repeat 1em .5em}.message.update{border-color:#EAE9DC;background:#FFFDEF url(../img/msg.update.png) no-repeat 1em .5em}/* Text Button */input.text, button.text{border:0;overflow:visible;padding:0;margin:0;color:#33a;background:none;text-decoration:underline}/* H2 Anchor */.h2Anchor{position:absolute;right:0;border:0;background:none;color:#00f;text-decoration:underline}/* Waiting for server response */#wfsr .bg{position:absolute;background:#000;_background:none;width:100%;height:100%;opacity:.5;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1}#wfsr .fg{position:relative;width:50%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:10px solid #ddd;z-index:2;zoom:1}#wfsr .fg p{padding:0 0 0 2.5em;background:url(../img/preLoader16.gif) no-repeat 1em .4em}#wfsr .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1}.wfsrActive{position:fixed;_position:absolute;top:0;left:0;width:100%;height:100%;z-index:100}.wfsrClose{position:absolute;right:-10px;top:-10px;border:0;background:#ddd;padding:0;width:34px;height:34px;font-size:16px;font-weight:bold;cursor:pointer;color:#999}.wfsrBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}/* Skip Navigation */.skipNav{margin:0;text-align:center;overflow:hidden}.skipNav a{position:absolute;width:1px;height:1px;display:block;color:#fff;font-weight:bold;padding:10px 0;background:#333;border-top:1px solid #656565}.skipNav a:hover,.skipNav a:active,.skipNav a:focus{position:relative;width:auto;height:auto}/* Header */.header{position:relative;z-index:2;padding:30px 0 0 0;background:#4c4c4c;box-shadow:0 0 10px #aaa;-moz-box-shadow:0 0 10px #aaa;-webkit-box-shadow:0 0 10px #aaa;zoom:1}.stAdmin .header{background:#2D808A}.header:after{content:"";display:block;clear:both}.header a{text-decoration:none}.header h1{margin:0 100px 10px 1.3em;font-size:24px;line-height:32px}.header h1 *{vertical-align:middle}.header h1 a{color:#fff;text-shadow:1px 1px 0 #000;filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=1, OffY=1, Color=#000000, Positive=true);zoom:1}.header h1 img{height:32px}.header h1 .url{font-size:12px;font-weight:normal}.header .siteTool{position:absolute !important;top:42px;right:0;padding:0 2em 0 0;z-index:2}.header .siteTool .i{position:relative;z-index:2;display:inline-block;color:#fff;padding:0 6px;line-height:24px}.header .siteTool .i:first-child{border:0}.header .siteTool .tgAnchor{padding-right:16px;background:url(../img/iconArrow.gif) no-repeat right -156px}.header .siteTool .tgAnchor.active{border:1px solid #ccc;border-bottom:0;background-color:#fff;color:#333;text-decoration:none;border-radius:5px 5px 0 0}.header .siteTool .tgContent{position:absolute;top:24px;right:2em;border:1px solid #ccc;z-index:1;background-color:#fff;border-radius:5px 0 5px 5px}.header .siteTool .tgContent .btnArea{margin:0}.header #moveSiteList{padding:10px 1em 5px 1em;margin:0}.header #moveSiteList ul{list-style:none;margin:0;padding:0}.header #moveSiteList li{white-space:nowrap;margin:0;padding:4px 0;border-bottom:1px dotted #ccc}.header #siteMapList{padding:0 1em 1em 1em;margin:0}.header #siteMapList li{white-space:nowrap}.header .account{position:absolute;z-index:3;width:100%;padding:5px 2em 5px 0;top:0;right:0;white-space:nowrap;text-align:right;background:#333;border-bottom:1px solid #656565;color:#fff;font-size:12px;box-shadow:0 0 10px #333;-moz-box-shadow:0 0 10px #333;-webkit-box-shadow:0 0 10px #333}.stAdmin .header .account{background:#0e5f69}.header .account ul{margin:0 2px 0 0;padding:0;list-style:none}.header .account li{position:relative;display:inline;border-left:1px solid #666;padding:0 6px 0 10px}.header .account li:first-child{border:0}.header .account a{color:#fff;display:inline-block;height:14px}.header .account a.language{padding-right:2px}.header #language{position:absolute;top:19px;right:0;padding:6px 4px !important;border:1px solid #666;border-top:0;background:#333}.header #language li{border:0;display:block;padding:1px 8px;text-align:left;line-height:1}.header #language li.selected{background:transparent url(../img/checked.png) no-repeat left center}.header h1 a:hover,.header h1 a:active,.header h1 a:focus,.header .siteTool a:hover,.header .siteTool a:active,.header .siteTool a:focus,.header .account a:hover,.header .account a:active,.header .account a:focus{color:#6e9cf2;text-decoration:underline}/* Footer */.footer{border-top:1px solid #ddd;text-align:center;font-size:12px;padding:1.5em 0;margin:0 2em}.footer p{margin:0}.footer a{color:#6e9cf2;text-decoration:none}/* Body */.body{position:relative;z-index:1;padding:1em 2em 1em 260px;zoom:1}.body:after{content:"";display:block;clear:both}/* Content */.content{float:right;width:100%;margin-left:-230px;zoom:1}.content:after{content:"";display:block;clear:both}.content a{color:#33a}.content a:hover,.content a:active,.content a:focus{color:#a33}.content .portlet a{text-decoration:none}.content .portlet a:hover,.content .portlet a:active,.content .portlet a:focus{text-decoration:underline}/* Dashboard */.dashboard{position:relative;float:none;width:auto;margin-left:-230px}.dashboard .portlet{float:left;width:48%;margin-right:1em}.dashboard .portlet:nth-of-type(even){ float:left;width:49%;margin-right:0 }.dashboard .portlet:nth-of-type(even){ float:right;width:49%;margin-right:0}/* Local Navigation */.lnb{position:relative;float:left;width:200px;margin:1em 0 1em -230px;line-height:normal;zoom:1;display:inline}.lnb .h2{margin-top:0}.lnb ul{margin:0;padding:0;list-style:none}.lnb li{position:relative;margin:0 0 -1px 0;vertical-align:top;zoom:1}.lnb li a{display:block;position:relative;padding:8px 10px;text-decoration:none;color:#666;font-weight:bold;background:#fafafa;border:1px solid #eee;zoom:1}.lnb li a .i{position:absolute;top:50%;left:100%;margin:-4px 0 0 -16px;width:8px;height:8px;color:#ccc;background:url(../img/iconNavVr.gif) no-repeat left top}.lnb li ul{padding:5px 0;background:#fff}.lnb li li{margin:0;border-top:1px dotted #ddd}.lnb li li:first-child{border:0}.lnb li li a{font-weight:normal;background:#fff;padding:5px 10px;border:0}.lnb li li a span{color:#666}.lnb li.active{border:1px solid #ccc;z-index:2}.lnb li li.active{border:0}.lnb li.active a{color:#000;border:0}.lnb li.active .i{background-position:0 -44px}.lnb li.active li a{border:0}.lnb li.active ul{display:block;border-top:1px solid #eee}.lnb li.active li.active a span{color:#13b200;font-weight:bold;letter-spacing:-1px}/* Search */.search{zoom:1}.search:after{content:"";display:block;clear:both}.search .pagination{float:left;text-align:left}.search form{float:right;margin:1em 0}.search form *{vertical-align:middle}/* Site Map */.siteMap h2 input{font-size:12px;font-weight:bold;padding:0 .5em}.siteMap .lined ul{padding:0;margin:0;border-top:1px solid #eee;zoom:1}.siteMap .lined li{position:relative;padding:0;margin:0;cursor:all-scroll;list-style:none;zoom:1}.siteMap .lined li li{border-top:1px solid #eee}.siteMap li li{text-indent:32px}.siteMap li li li{text-indent:64px}.siteMap li li li li{text-indent:96px}.siteMap li li li li li{text-indent:128px}.siteMap li li li li li li{text-indent:160px}.siteMap li li li li li li li{text-indent:192px}.siteMap li li li li li li li li{text-indent:224px}.siteMap li li li li li li li li li{text-indent:256px}.siteMap li li li li li li li li li li{text-indent:288px}.siteMap li li li li li li li li li li li{text-indent:320px}.siteMap li li li li li li li li li li li li{text-indent:352px}.siteMap li *{vertical-align:middle}.siteMap li .moveTo+input{width:200px;border:0;padding:0 .5em}.siteMap li .moveTo+input:hover,.siteMap li .moveTo+input:active,.siteMap li .moveTo+input:focus{border:1px dotted #ccc;overflow:visible}.siteMap .moveTo{position:relative;z-index:2;width:32px;height:32px;padding:32px 0 0 0;margin:0 .5em;_margin-top:-1px;overflow:hidden;background:#fff url(../img/iconMoveTo.gif) no-repeat;border:0}.siteMap li.active li,.siteMap li.active ul{border-top-color:#fff}.siteMap li.active .moveTo{background-position:0 -32px}.siteMap .vr{display:none;position:absolute;z-index:1;left:16px;top:-16px;margin:0 .5em;height:100%;border-left:1px solid #ccc;overflow:hidden}.siteMap .hr{display:none;position:absolute;z-index:1;left:16px;top:16px;margin:0 .5em;width:16px;border-top:1px solid #ccc;overflow:hidden}.siteMap li.active .vr,.siteMap li.active li .hr{display:block}.siteMap li li .vr,.siteMap li li li .hr{left:48px}.siteMap li li li .vr,.siteMap li li li li .hr{left:80px}.siteMap li li li li .vr,.siteMap li li li li li .hr{left:112px}.siteMap li li li li li .vr,.siteMap li li li li li li .hr{left:144px}.siteMap li li li li li li .vr,.siteMap li li li li li li li .hr{left:176px}.siteMap li li li li li li li .vr,.siteMap li li li li li li li li .hr{left:208px}.siteMap li li li li li li li li .vr,.siteMap li li li li li li li li li .hr{left:240px}.siteMap li li li li li li li li li .vr,.siteMap li li li li li li li li li li .hr{left:272px}.siteMap li li li li li li li li li li .vr,.siteMap li li li li li li li li li li li .hr{left:304px}.siteMap li li li li li li li li li li li .vr,.siteMap li li li li li li li li li li li li .hr{left:336px}.siteMap .side{padding-top:0 !important;padding-bottom:0 !important;line-height:30px}.siteMap .side button{text-indent:0;line-height:1}.siteMap .tgMap{position:absolute;top:12px;right:1em;padding:0 16px 0 0;line-height:16px;background:url(../img/iconArrow.gif) no-repeat right -126px}.siteMap.fold .tgMap{background-position:right -158px}.siteMap.fold .h2{border-bottom-color:#fff;border-radius:5px}/* Button Area */.btnArea{margin:1em 0;text-align:right;zoom:1}.btnArea:after{content:"";display:block;clear:both}/* Multilingual */.langEdit{background:#fff;position:absolute;*left:0;*margin-top:28px;z-index:10;box-shadow:3px 3px 6px #999;-moz-box-shadow:3px 3px 6px #999;-webkit-box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.langEdit ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0}.langEdit li{padding:.5em 10px}.langEdit input[type=text]{width:220px;padding-right:40px}.langEdit label{left:15px !important}.langEdit .action{border:1px solid #eee;width:268px;padding:0 10px}.langEdit p, .langEdit .btnArea{white-space:normal}.langEdit li.en input, .mLangEdit li.en textarea{background:url(../img/flag.us.gif) no-repeat 99% 5px}.langEdit li.ko input, .mLangEdit li.ko textarea{background:url(../img/flag.kr.gif) no-repeat 99% 5px}.langEdit li.ja input, .mLangEdit li.ja textarea{background:url(../img/flag.jp.gif) no-repeat 99% 5px}.langEdit li.zh input, .mLangEdit li.zh textarea{background:url(../img/flag.cn.gif) no-repeat 99% 5px}.langEdit li.fr input, .mLangEdit li.fr textarea{background:url(../img/flag.fr.gif) no-repeat 99% 5px}.langEdit li.de input, .mLangEdit li.de textarea{background:url(../img/flag.de.gif) no-repeat 99% 5px}.langEdit li.ru input, .mLangEdit li.ru textarea{background:url(../img/flag.ru.gif) no-repeat 99% 5px}.langEdit li.es input, .mLangEdit li.es textarea{background:url(../img/flag.es.gif) no-repeat 99% 5px}.langEdit li.tr input, .mLangEdit li.tr textarea{background:url(../img/flag.tr.gif) no-repeat 99% 5px}.langEdit li.vi input, .mLangEdit li.vi textarea{background:url(../img/flag.vn.gif) no-repeat 99% 5px}.langEdit li.mn input, .mLangEdit li.mn textarea{background:url(../img/flag.mn.gif) no-repeat 99% 5px}.mLangEdit.en strong{background:url(../img/flag.us.gif) no-repeat 0 10px}.mLangEdit.ko strong{background:url(../img/flag.kr.gif) no-repeat 0 10px}.mLangEdit.ja strong{background:url(../img/flag.jp.gif) no-repeat 0 10px}.mLangEdit.zh strong{background:url(../img/flag.cn.gif) no-repeat 0 10px}.mLangEdit.fr strong{background:url(../img/flag.fr.gif) no-repeat 0 10px}.mLangEdit.de strong{background:url(../img/flag.de.gif) no-repeat 0 10px}.mLangEdit.ru strong{background:url(../img/flag.ru.gif) no-repeat 0 10px}.mLangEdit.es strong{background:url(../img/flag.es.gif) no-repeat 0 10px}.mLangEdit.tr strong{background:url(../img/flag.tr.gif) no-repeat 0 10px}.mLangEdit.vi strong{background:url(../img/flag.vn.gif) no-repeat 0 10px}.mLangEdit.mn strong{background:url(../img/flag.mn.gif) no-repeat 0 10px}.mLangEdit ul ul{border:0}.mLangEdit li{ position:relative;padding:0}.mLangEdit li strong{ display:inline-block;padding:6px 100px 8px 24px;font-weight:normal;line-height:1.5}.mLangEdit li .side{ position:absolute;top:8px;right:0;padding-right:18px;background:url(../img/iconArrow.gif) no-repeat right -160px}.mLangEdit li li{ border:0;padding-right:36px}.mLangEdit li textarea{ width:100%;height:16px;padding-right:30px;resize:vertical;line-height:1.4}.mLangEdit li label{ top:8px !important}.mLangEdit li.active strong{ font-weight:bold}.mLangEdit li.active .side{ background-position:right -128px}.modal .mLangEdit ul{padding-bottom:1em}.modal .mLangEdit li{border:0;padding-right:36px}/* Suggestion */.suggestion{display:none;position:absolute;background:#fff;z-index:10;_height:200px;max-height:200px;overflow:auto;*left:0;*margin-top:28px;box-shadow:3px 3px 6px #999;-moz-box-shadow:3px 3px 6px #999;-webkit-box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.suggestion ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0}.suggestion li{padding:0}.suggestion li:last-child{border-bottom:0}.suggestion li button{border:0;background:#fff;text-align:left;width:280px;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.suggestion li button:hover,.suggestion li button:active,.suggestion li button:focus{background:#eee}/* Image Mark */#imageMark{right:0}/* Easy Installer */.easyNav{position:relative;border:1px solid #e9e9e9;zoom:1}.easyNav:after{content:"";display:block;clear:both}.easyNav h2{font-size:16px}.easyNav .category{width:30%;float:left;margin:0 2em;display:inline}.easyNav .filter{position:absolute;top:0;right:0;margin:1em 2em;text-align:right}.easyList td p{margin-top:0}.easyList td p.update{background:#ffc;padding:.5em 1em;border:1px solid #fc9;border-left:0;border-right:0;text-align:center}/* Font Preview */.fontPreview{width:96%;border:1px solid #e9e9e9;zoom:1;padding:1em 2em;margin:.5em 0}/* FTP Suggestion */#ftpSuggestion{background:#fff;box-shadow:3px 3px 6px #999;-moz-box-shadow:3px 3px 6px #999;-webkit-box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}#ftpSuggestion ul{border-left:1px solid #eee;border-right:1px solid #eee}#ftpSuggestion li{padding:0}#ftpSuggestion li button{border:0;background:#fff;text-align:left;width:288px}#ftpSuggestion li button:hover,#ftpSuggestion li button:active,#ftpSuggestion li button:focus{background:#eee}/* Theme & Skin Preview */.thumbPreview li{position:relative;padding-left:10px;padding-right:10px}.thumbPreview li.active.highlight{background:#f9f9f9}.thumbPreview .prevToggle{position:absolute;top:8px;right:10px;line-height:16px;padding:0 18px 0 0;text-decoration:none;background:url(../img/iconArrow.gif) no-repeat right -32px}.thumbPreview li.active .prevToggle{background-position:right 0}.thumbPreview .a{border:0;margin:0;zoom:1}.thumbPreview .a:after{content:"";display:block;clear:both}.thumbPreview .i{float:left;vertical-align:top;margin:0 1em 1em 0;padding:0;border:0;zoom:1}.thumbPreview .i:after{content:"";display:block;clear:both}.thumbPreview .i .thumb{position:relative;width:124px;height:84px;padding:0;margin-bottom:3px;text-align:center;overflow:hidden;border:1px solid #ddd;display:block;cursor:pointer;background:#fff}.thumbPreview .i .thumb .frame{position:absolute;width:120px;height:80px;left:0;top:0;border:2px solid #fff;overflow:hidden}.thumbPreview .i .thumb img{width:120px;margin:0}.thumbPreview .i label{display:block;position:relative;top:0;left:2px;width:122px;height:1.1em;margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.thumbPreview .i input{display:none}.thumbPreview .i ul{display:none}.thumbPreview .selected .i{display:block;float:none}.thumbPreview .selected .i .thumb{float:left;width:186px;height:126px;margin:0 1em 0 0;border:2px solid #eee}.thumbPreview .selected .i .thumb .frame{width:180px;height:120px;border-width:3px}.thumbPreview li.active.highlight .selected .i .thumb{border-color:#5ea8f6}.thumbPreview .selected .i .thumb img{width:180px;position:relative}.thumbPreview li.active .selected .i .thumb img{z-index:auto}.thumbPreview .selected .i label{cursor:text}.thumbPreview .selected .i ul{display:block;list-style:none;border:0;margin:1em 0 1em 200px}.thumbPreview .selected .i li{border:0;padding:0;margin:0 0 .2em 0}.thumbPreview.jx .i label{display:inline;width:auto}.thumbPreview.jx .i.noDirection{display:none}.thumbPreview.jx .i input{display:inline}#skin .showAll{float:right;border:0;overflow:visible;padding:0 18px 0 0;cursor:pointer;color:#00f;background:url(../img/iconArrow.gif) no-repeat right -32px}#skin .showAll.hideAll{background-position:right 0}/* Sign Up Form */.signUpForm li{position:relative}.signUpForm .side{position:absolute;top:8px;right:0}/* Favorite On | Off */.fvOff,.fvOn{display:inline-block;width:16px;height:16px;overflow:hidden;text-indent:16px;background:url(../img/iconFavorite.gif) no-repeat}.fvOn{background-position:0 -16px}/* Up-Down Dragable */.uDrag .wrap{position:relative;padding-left:20px}.uDrag .dragActive{background:#FFD}.uDrag .dragActive td{background:none !important}.uDrag .dragBtn{position:absolute;width:8px;height:100%;padding:0;overflow:hidden;background:url(../img/bgDragable.gif);top:1px;left:0;text-indent:12px;border:0;cursor:n-resize}/* Favicon Preview */.faviconPreview{position:relative;padding:60px 0 0 200px;background:url(../img/bgFavicon.gif) no-repeat}.faviconPreview img{position:absolute}.faviconPreview .fn1{top:30px;left:12px}.faviconPreview .fn2{top:55px;left:68px}/* Mobile Icon Preview */.mobiconPreview{position:relative;padding:252px 0 0 200px;background:url(../img/bgMobileTop.png) no-repeat}.mobiconPreview img{position:absolute;top:20px;left:10px}.mobiconPreview span{position:absolute;width:32px;text-align:center;top:52px;left:10px;color:#fff;font-size:9px}/* Text List */.textList{border:1px solid #ddd !important;line-height:1.5em;height:18.5em;overflow:auto}.textList li{border:0;padding:.25em 1em;height:1.5em;white-space:nowrap;overflow:hidden}.textList li:nth-child(even){background:#eee}.textList li a{float:right}/* Responsive Layout */@media only all and (max-width:860px){ .header h1{margin-left:.7em} .header .account{padding-right:1em} .header .siteTool{padding-right:1em} .header .siteTool .tgContent{right:1em} .body{padding:1em} .content{float:none;margin-left:0} .lnb{float:none;width:auto;margin:1em 0} .dashboard .portlet{float:none !important;width:auto !important;margin-right:0} .modal .fg, .wfsr .fg{width:auto} .easyNav .category{float:none;display:block;width:auto} .easyNav .filter{position:static}}@media only all and (max-width:640px){ .skipNav a{position:relative;width:auto;height:auto} .modal{position:absolute}} \ No newline at end of file From 3e70a2c10c40194efb3e08f4d52d21bcb1f25c57 Mon Sep 17 00:00:00 2001 From: ovclas Date: Thu, 4 Aug 2011 05:34:03 +0000 Subject: [PATCH 0366/1372] issue 70 poll module's admin UI/UX modified. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8721 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/comment/tpl/comment_list.html | 11 + modules/document/tpl/document_list.html | 12 ++ modules/file/lang/en.lang.php | 2 +- modules/file/lang/es.lang.php | 2 +- modules/file/lang/fr.lang.php | 2 +- modules/file/lang/jp.lang.php | 2 +- modules/file/lang/ru.lang.php | 2 +- modules/file/lang/tr.lang.php | 2 +- modules/file/lang/vi.lang.php | 2 +- modules/file/lang/zh-CN.lang.php | 2 +- modules/file/lang/zh-TW.lang.php | 2 +- modules/poll/conf/module.xml | 4 +- modules/poll/lang/en.lang.php | 2 + modules/poll/lang/es.lang.php | 2 + modules/poll/lang/fr.lang.php | 2 + modules/poll/lang/jp.lang.php | 2 + modules/poll/lang/ko.lang.php | 2 + modules/poll/lang/ru.lang.php | 2 + modules/poll/lang/tr.lang.php | 2 + modules/poll/lang/vi.lang.php | 2 + modules/poll/lang/zh-CN.lang.php | 2 + modules/poll/lang/zh-TW.lang.php | 2 + modules/poll/poll.admin.controller.php | 21 ++ modules/poll/poll.admin.model.php | 15 +- modules/poll/poll.admin.view.php | 13 +- modules/poll/poll.controller.php | 40 ++++ modules/poll/queries/getPollList.xml | 3 +- .../poll/queries/getPollListWithMember.xml | 24 +++ modules/poll/tpl/js/poll_admin.js | 49 +++++ modules/poll/tpl/poll_list.html | 197 +++++++++++------- 30 files changed, 335 insertions(+), 92 deletions(-) create mode 100644 modules/poll/queries/getPollListWithMember.xml diff --git a/modules/comment/tpl/comment_list.html b/modules/comment/tpl/comment_list.html index c0acf5927..37e4b7946 100644 --- a/modules/comment/tpl/comment_list.html +++ b/modules/comment/tpl/comment_list.html @@ -23,6 +23,17 @@ + + + {$lang->comment} + {$lang->nick_name} + {$lang->cmd_vote}(+/-) + {$lang->date} + {$lang->ipaddress} + {$lang->status} + + + {@ $comment = cut_str(trim(htmlspecialchars(strip_tags($val->content))), 200, '...')} diff --git a/modules/document/tpl/document_list.html b/modules/document/tpl/document_list.html index 0c5ac41a5..4bc1c5b39 100644 --- a/modules/document/tpl/document_list.html +++ b/modules/document/tpl/document_list.html @@ -24,6 +24,18 @@ + + + {$lang->title} + {$lang->author} + {$lang->readed_count} + {$lang->cmd_vote}(+/-) + {$lang->date} + {$lang->ipaddress} + {$lang->status} + + + diff --git a/modules/file/lang/en.lang.php b/modules/file/lang/en.lang.php index 820ed2694..b27bb8a4a 100644 --- a/modules/file/lang/en.lang.php +++ b/modules/file/lang/en.lang.php @@ -56,5 +56,5 @@ $lang->msg_not_allowed_outlink = 'It is not allowed to download files from sites other than this.'; $lang->msg_not_permitted_create = 'Failed to create a file or directory.'; $lang->msg_file_upload_error = 'An error has occurred during uploading.'; - + $lang->no_files = 'No Files'; ?> diff --git a/modules/file/lang/es.lang.php b/modules/file/lang/es.lang.php index da9ded268..b8f584743 100644 --- a/modules/file/lang/es.lang.php +++ b/modules/file/lang/es.lang.php @@ -53,5 +53,5 @@ $lang->msg_not_allowed_outlink = 'It is not allowed to download files not from this site.'; $lang->msg_not_permitted_create = '파일 또는 디렉토리를 생성할 수 없습니다.'; $lang->msg_file_upload_error = '파일 업로드 중 에러가 발생하였습니다.'; - + $lang->no_files = 'No Files'; ?> diff --git a/modules/file/lang/fr.lang.php b/modules/file/lang/fr.lang.php index cdc448780..2e5e6f8dc 100644 --- a/modules/file/lang/fr.lang.php +++ b/modules/file/lang/fr.lang.php @@ -53,5 +53,5 @@ $lang->msg_not_allowed_outlink = 'It is not allowed to download files not from this site.'; $lang->msg_not_permitted_create = '파일 또는 디렉토리를 생성할 수 없습니다.'; $lang->msg_file_upload_error = '파일 업로드 중 에러가 발생하였습니다.'; - + $lang->no_files = 'No Files'; ?> diff --git a/modules/file/lang/jp.lang.php b/modules/file/lang/jp.lang.php index c2c5e1caa..fbd1ad4d0 100644 --- a/modules/file/lang/jp.lang.php +++ b/modules/file/lang/jp.lang.php @@ -55,5 +55,5 @@ $lang->msg_not_allowed_outlink = '外部リンクからのダウンロードは許可されていません。'; $lang->msg_not_permitted_create = 'ファイルまたはディレクトリを生成できません。'; $lang->msg_file_upload_error = 'ファイルアップロードに失敗しました。'; - + $lang->no_files = 'No Files'; ?> diff --git a/modules/file/lang/ru.lang.php b/modules/file/lang/ru.lang.php index ff88fae17..a86cb0b04 100644 --- a/modules/file/lang/ru.lang.php +++ b/modules/file/lang/ru.lang.php @@ -55,5 +55,5 @@ $lang->msg_not_allowed_outlink = 'It is not allowed to download files not from this site.'; $lang->msg_not_permitted_create = '파일 또는 디렉토리를 생성할 수 없습니다.'; $lang->msg_file_upload_error = '파일 업로드 중 에러가 발생하였습니다.'; - + $lang->no_files = 'No Files'; ?> diff --git a/modules/file/lang/tr.lang.php b/modules/file/lang/tr.lang.php index a25377052..7f3ba61dd 100644 --- a/modules/file/lang/tr.lang.php +++ b/modules/file/lang/tr.lang.php @@ -56,5 +56,5 @@ $lang->msg_not_allowed_outlink = 'Bu siteden dosya indirimine izin verilmemektedir.'; $lang->msg_not_permitted_create = 'Dosya veya dizin oluşturma hatası.'; $lang->msg_file_upload_error = 'Karşıya yükleme esnasında bir hata oluştu.'; - + $lang->no_files = 'No Files'; ?> diff --git a/modules/file/lang/vi.lang.php b/modules/file/lang/vi.lang.php index ce44c395b..e0cac981c 100644 --- a/modules/file/lang/vi.lang.php +++ b/modules/file/lang/vi.lang.php @@ -59,5 +59,5 @@ $lang->msg_not_allowed_outlink = 'Không cho phép tải file từ những trang khác ngoài trang này.'; $lang->msg_not_permitted_create = '파일 또는 디렉토리를 생성할 수 없습니다.'; $lang->msg_file_upload_error = '파일 업로드 중 에러가 발생하였습니다.'; - + $lang->no_files = 'No Files'; ?> diff --git a/modules/file/lang/zh-CN.lang.php b/modules/file/lang/zh-CN.lang.php index 02edc0c3e..31ce1148d 100644 --- a/modules/file/lang/zh-CN.lang.php +++ b/modules/file/lang/zh-CN.lang.php @@ -53,5 +53,5 @@ $lang->msg_not_allowed_outlink = '此站不允许外链下载。'; $lang->msg_not_permitted_create = '无法生成文件或文件夹。'; $lang->msg_file_upload_error = '上传文件发生出错。'; - + $lang->no_files = 'No Files'; ?> diff --git a/modules/file/lang/zh-TW.lang.php b/modules/file/lang/zh-TW.lang.php index 82823120e..a5cac4e44 100644 --- a/modules/file/lang/zh-TW.lang.php +++ b/modules/file/lang/zh-TW.lang.php @@ -55,5 +55,5 @@ $lang->msg_not_allowed_outlink = '無法從網站下載檔案。'; $lang->msg_not_permitted_create = '파일 또는 디렉토리를 생성할 수 없습니다.'; $lang->msg_file_upload_error = '파일 업로드 중 에러가 발생하였습니다.'; - + $lang->no_files = 'No Files'; ?> diff --git a/modules/poll/conf/module.xml b/modules/poll/conf/module.xml index 1effacb1f..13b483713 100644 --- a/modules/poll/conf/module.xml +++ b/modules/poll/conf/module.xml @@ -3,7 +3,7 @@ - + @@ -15,8 +15,10 @@ + + diff --git a/modules/poll/lang/en.lang.php b/modules/poll/lang/en.lang.php index d9f0fee15..c6aa8b63f 100644 --- a/modules/poll/lang/en.lang.php +++ b/modules/poll/lang/en.lang.php @@ -35,4 +35,6 @@ 'regdate' => 'Posting date', 'ipaddress' => 'IP Address', ); + $lang->single_check = 'Single Check'; + $lang->multi_check = 'Multi Check'; ?> diff --git a/modules/poll/lang/es.lang.php b/modules/poll/lang/es.lang.php index 2433fb1d3..382c96d65 100644 --- a/modules/poll/lang/es.lang.php +++ b/modules/poll/lang/es.lang.php @@ -35,4 +35,6 @@ 'regdate' => 'Fecha de la participación', 'ipaddress' => 'Dirección IP', ); + $lang->single_check = 'Single Check'; + $lang->multi_check = 'Multi Check'; ?> diff --git a/modules/poll/lang/fr.lang.php b/modules/poll/lang/fr.lang.php index 7651d1387..428d5cb80 100644 --- a/modules/poll/lang/fr.lang.php +++ b/modules/poll/lang/fr.lang.php @@ -35,4 +35,6 @@ 'regdate' => 'Jour posté', 'ipaddress' => 'Adresse IP', ); + $lang->single_check = 'Single Check'; + $lang->multi_check = 'Multi Check'; ?> diff --git a/modules/poll/lang/jp.lang.php b/modules/poll/lang/jp.lang.php index 0ce341f3b..63e7ebd03 100644 --- a/modules/poll/lang/jp.lang.php +++ b/modules/poll/lang/jp.lang.php @@ -35,4 +35,6 @@ 'regdate' => '登録日', 'ipaddress' => 'IPアドレス', ); + $lang->single_check = 'Single Check'; + $lang->multi_check = 'Multi Check'; ?> diff --git a/modules/poll/lang/ko.lang.php b/modules/poll/lang/ko.lang.php index aa6cd6a44..9b34df092 100644 --- a/modules/poll/lang/ko.lang.php +++ b/modules/poll/lang/ko.lang.php @@ -28,4 +28,6 @@ 'regdate' => '등록일', 'ipaddress' => 'IP 주소', ); + $lang->single_check = '단일 선택'; + $lang->multi_check = '다중 선택'; ?> diff --git a/modules/poll/lang/ru.lang.php b/modules/poll/lang/ru.lang.php index 523ca958f..4aa046b49 100644 --- a/modules/poll/lang/ru.lang.php +++ b/modules/poll/lang/ru.lang.php @@ -35,4 +35,6 @@ 'regdate' => 'Дата Размещения', // // translator's remark: this may be as "Дата Регистрации" 'ipaddress' => 'IP-адрес', ); + $lang->single_check = 'Single Check'; + $lang->multi_check = 'Multi Check'; ?> diff --git a/modules/poll/lang/tr.lang.php b/modules/poll/lang/tr.lang.php index 19fb4944b..9e0e58c67 100644 --- a/modules/poll/lang/tr.lang.php +++ b/modules/poll/lang/tr.lang.php @@ -35,4 +35,6 @@ 'regdate' => 'Mesaj Tarihi', 'ipaddress' => 'IP Adresi', ); + $lang->single_check = 'Single Check'; + $lang->multi_check = 'Multi Check'; ?> diff --git a/modules/poll/lang/vi.lang.php b/modules/poll/lang/vi.lang.php index 5fd71d5d8..484f8e5c1 100644 --- a/modules/poll/lang/vi.lang.php +++ b/modules/poll/lang/vi.lang.php @@ -37,4 +37,6 @@ 'regdate' => 'Ngày gửi', 'ipaddress' => 'IP', ); + $lang->single_check = 'Single Check'; + $lang->multi_check = 'Multi Check'; ?> diff --git a/modules/poll/lang/zh-CN.lang.php b/modules/poll/lang/zh-CN.lang.php index b18de80bf..6b5495990 100644 --- a/modules/poll/lang/zh-CN.lang.php +++ b/modules/poll/lang/zh-CN.lang.php @@ -35,4 +35,6 @@ 'regdate' => '登录日期', 'ipaddress' => 'IP 地址', ); + $lang->single_check = 'Single Check'; + $lang->multi_check = 'Multi Check'; ?> diff --git a/modules/poll/lang/zh-TW.lang.php b/modules/poll/lang/zh-TW.lang.php index f7bdd00d8..009d3cc62 100644 --- a/modules/poll/lang/zh-TW.lang.php +++ b/modules/poll/lang/zh-TW.lang.php @@ -35,4 +35,6 @@ 'regdate' => '登錄日期', 'ipaddress' => 'IP位址', ); + $lang->single_check = 'Single Check'; + $lang->multi_check = 'Multi Check'; ?> diff --git a/modules/poll/poll.admin.controller.php b/modules/poll/poll.admin.controller.php index 94f72bb71..7cc7bfc3b 100644 --- a/modules/poll/poll.admin.controller.php +++ b/modules/poll/poll.admin.controller.php @@ -60,6 +60,27 @@ } } + function procPollAdminAddCart() + { + $poll_index_srl = (int)Context::get('poll_index_srl'); + + $oPollAdminModel = &getAdminModel('poll'); + //$columnList = array('comment_srl'); + $args->pollIndexSrlList = array($poll_index_srl); + $args->list_count = 100; + + $output = $oPollAdminModel->getPollList($args); + + if(is_array($output->data)) + { + foreach($output->data AS $key=>$value) + { + if($_SESSION['poll_management'][$value->poll_index_srl]) unset($_SESSION['poll_management'][$value->poll_index_srl]); + else $_SESSION['poll_management'][$value->poll_index_srl] = true; + } + } + } + /** * @brief Delete the poll (when several questions are registered in one poll, delete this question) **/ diff --git a/modules/poll/poll.admin.model.php b/modules/poll/poll.admin.model.php index c7c0760b7..0c4a0ffb6 100644 --- a/modules/poll/poll.admin.model.php +++ b/modules/poll/poll.admin.model.php @@ -17,13 +17,24 @@ * @brief Get the list of polls **/ function getPollList($args) { - $output = executeQuery('poll.getPollList', $args); + $output = executeQueryArray('poll.getPollList', $args); if(!$output->toBool()) return $output; - if($output->data && !is_array($output->data)) $output->data = array($output->data); + //if($output->data && !is_array($output->data)) $output->data = array($output->data); return $output; } + /** + * @brief Get the list of polls with member info + **/ + function getPollListWithMember($args) + { + $output = executeQueryArray('poll.getPollListWithMember', $args); + if(!$output->toBool()) return $output; + + return $output; + } + /** * @brief Get the original poll **/ diff --git a/modules/poll/poll.admin.view.php b/modules/poll/poll.admin.view.php index 7ea864847..8c6b45c44 100644 --- a/modules/poll/poll.admin.view.php +++ b/modules/poll/poll.admin.view.php @@ -40,11 +40,20 @@ $args->list_count = 50; // The number of posts to show on one page $args->page_count = 10; // The number of pages to display in the page navigation - $args->sort_index = 'list_order'; // Sorting value + $args->sort_index = 'P.list_order'; // Sorting value // Get the list $oPollAdminModel = &getAdminModel('poll'); - $output = $oPollAdminModel->getPollList($args); + $output = $oPollAdminModel->getPollListWithMember($args); + if(is_array($output->data)) + { + foreach($output->data AS $key=>$value) + { + if($_SESSION['poll_management'][$value->poll_index_srl]) $value->isCarted = true; + else $value->isCarted = false; + } + } + // Configure the template variables Context::set('total_count', $output->total_count); Context::set('total_page', $output->total_page); diff --git a/modules/poll/poll.controller.php b/modules/poll/poll.controller.php index 2f2d10207..0ccae4189 100644 --- a/modules/poll/poll.controller.php +++ b/modules/poll/poll.controller.php @@ -191,6 +191,46 @@ $this->add('tpl',$tpl); } + /** + * @brief poll list + **/ + function procPollGetList() + { + if(!Context::get('is_logged')) return new Object(-1,'msg_not_permitted'); + // Taken from a list of selected sessions + $flagList = $_SESSION['poll_management']; + if(count($flagList)) { + foreach($flagList as $key => $val) { + if(!is_bool($val)) continue; + $pollSrlList[] = $key; + } + } + + global $lang; + if(count($pollSrlList) > 0) { + $oPollAdminModel = &getAdminModel('poll'); + $args->pollIndexSrlList = $pollSrlList; + $output = $oPollAdminModel->getPollListWithMember($args); + $pollList = $output->data; + + if(is_array($pollList)) + { + foreach($pollList AS $key=>$value) + { + if($value->checkcount == 1) $value->checkName = $lang->single_check; + else $value->checkName = $lang->multi_check; + } + } + } + else + { + $pollList = array(); + $this->setMessage($lang->no_documents); + } + + $this->add('poll_list', $pollList); + } + /** * @brief A poll synchronization trigger when a new post is registered **/ diff --git a/modules/poll/queries/getPollList.xml b/modules/poll/queries/getPollList.xml index 1e7bba724..1c2154a78 100644 --- a/modules/poll/queries/getPollList.xml +++ b/modules/poll/queries/getPollList.xml @@ -6,7 +6,8 @@ - + + diff --git a/modules/poll/queries/getPollListWithMember.xml b/modules/poll/queries/getPollListWithMember.xml new file mode 100644 index 000000000..92b229067 --- /dev/null +++ b/modules/poll/queries/getPollListWithMember.xml @@ -0,0 +1,24 @@ + + + +
        + + + + + + + + + + + + + + + + + + + + diff --git a/modules/poll/tpl/js/poll_admin.js b/modules/poll/tpl/js/poll_admin.js index 80a4ae155..2948acbb3 100644 --- a/modules/poll/tpl/js/poll_admin.js +++ b/modules/poll/tpl/js/poll_admin.js @@ -54,3 +54,52 @@ function completeMovePoll(ret_obj, response_tags) { if(comment_srl) url = url+'#comment_'+comment_srl; winopen(url, 'pollTarget'); } + +function getPollList() +{ + var params = new Array(); + var response_tags = ['error','message', 'poll_list']; + + exec_xml('poll','procPollGetList',params, completeGetPollList, response_tags); +} + +function completeGetPollList(ret_obj, response_tags) +{ + var htmlListBuffer = ''; + + if(ret_obj['poll_list'] == null) + { + htmlListBuffer = '' + + '' + + ''; + } + else + { + var poll_list = ret_obj['poll_list']['item']; + if(!jQuery.isArray(poll_list)) poll_list = [poll_list]; + for(var x in poll_list) + { + var objPoll = poll_list[x]; + htmlListBuffer += '' + + '' + + '' + + '' + + '' + + ''; + } + jQuery('#selectedPollCount').html(poll_list.length); + } + jQuery('#pollManageListTable>tbody').html(htmlListBuffer); +} + +function addCart(poll_index_srl) { + var params = new Array(); + var response_tags = ['error','message']; + params['poll_index_srl'] = poll_index_srl; + + exec_xml('poll','procPollAdminAddCart',params, completeAddCart, response_tags); +} + +function completeAddCart(ret_obj, response_tags) +{ +} diff --git a/modules/poll/tpl/poll_list.html b/modules/poll/tpl/poll_list.html index 18224be0b..dd32df9c6 100644 --- a/modules/poll/tpl/poll_list.html +++ b/modules/poll/tpl/poll_list.html @@ -1,82 +1,125 @@ - - - +

        {$XE_VALIDATOR_MESSAGE}

        -
        - - - - -
        '+ret_obj['message']+'
        '+objPoll.title+''+objPoll.poll_count+''+objPoll.nick_name+'
        - - - - - - - - - - - - - - - - - - - - - - - - - -
        Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
        {$lang->no}
        {$lang->title}
        {$lang->poll_checkcount}
        {$lang->poll_join_count}
        {$lang->regdate}
         
        {$no}{htmlspecialchars($val->title)}{$val->checkcount}{$val->poll_count}{zdate($val->regdate,"Y-m-d H:i")}{$lang->cmd_view}
        - - -
        - -
        - -
        + +

        Poll

        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + All({number_format($total_count)}) + 선택한 설문 관리... +
        {$lang->title}{$lang->poll_checkcount}{$lang->poll_join_count}Author{$lang->regdate}
        {$lang->title}{$lang->poll_checkcount}{$lang->poll_join_count}Author{$lang->regdate}
        {htmlspecialchars($val->title)}{$lang->single_check}{$lang->multi_check}{$val->poll_count}{$val->nick_name}{zdate($val->regdate,"Y-m-d H:i")} + isCarted)-->checked onclick="addCart({$val->poll_index_srl})" /> +
        +
        + + + +
        - - - - - - - -
        - - -
        - - - - {$lang->cmd_cancel} -
        -
        From c00dd923b81453bc37e40808087245ae1705e334 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Thu, 4 Aug 2011 06:40:07 +0000 Subject: [PATCH 0367/1372] Fix some of CSS. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8722 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/tpl/css/admin.css | 7 +++---- modules/admin/tpl/css/admin.min.css | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/modules/admin/tpl/css/admin.css b/modules/admin/tpl/css/admin.css index 0087644f1..632369b92 100644 --- a/modules/admin/tpl/css/admin.css +++ b/modules/admin/tpl/css/admin.css @@ -44,7 +44,7 @@ p{line-height:1.5} .table thead th{border-bottom:1px solid #999} .table tfoot td{font-weight:bold;background:#f8f8f8} .table.even tbody tr:nth-of-type(even) td{background-color:#fafafa} -.table input[type=text]{margin:-1px 0 -3px 0;vertical-align:middle} +.table td>input[type=text]{margin:-1px 0 -3px 0 !important;vertical-align:middle} .table img{vertical-align:middle} .table .title, .table .text{white-space:normal} @@ -84,7 +84,7 @@ p{line-height:1.5} /* Global Navigation Bar */ .gnb{position:relative;clear:both;border:1px solid #c1c1c1;border-left:0;border-right:0;background-color:#efefef;background:#efefef -webkit-gradient(linear, 0% 0%, 0% 100%, from(#efefef), to(#dcdcdc));background:#efefef -moz-linear-gradient(top, #efefef, #dcdcdc);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#efefef, endColorStr=#dcdcdc);zoom:1} .gnb ul{margin:0;padding:0 0 0 2em;list-style:none;border:1px solid #fff;border-left:0;border-right:0;zoom:1} -.gnb ul ul{position:absolute;top:30px;left:0;border:1px solid #ccc;padding:0;background:#fff} +.gnb ul ul{position:absolute;top:31px;left:0;border:1px solid #ccc;padding:0;background:#fff} .gnb ul:after{content:"";display:block;clear:both} .gnb li{position:relative;float:left;border:1px solid #fff;border-top:0;border-bottom:0;margin:0 -1px 0 0} .gnb li li{float:none;clear:both;overflow:hidden;border:0;border-top:1px dotted #ccc;margin:0;padding:2px} @@ -200,7 +200,6 @@ html.modalContainer,body.modalContainer{_height:100%;_width:100%} /* IE6 only */ /* Text Button */ input.text, button.text{border:0;overflow:visible;padding:0;margin:0;color:#33a;background:none;text-decoration:underline} - /* H2 Anchor */ .h2Anchor{position:absolute;right:0;border:0;background:none;color:#00f;text-decoration:underline} /* Waiting for server response */ @@ -409,7 +408,7 @@ button.text{border:0;overflow:visible;padding:0;margin:0;color:#33a;background:n .suggestion ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0} .suggestion li{padding:0} .suggestion li:last-child{border-bottom:0} -.suggestion li button{border:0;background:#fff;text-align:left;width:280px;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap} +.suggestion li button{border:0;background:#fff;text-align:left;width:288px;padding:2px 4px;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap} .suggestion li button:hover, .suggestion li button:active, .suggestion li button:focus{background:#eee} diff --git a/modules/admin/tpl/css/admin.min.css b/modules/admin/tpl/css/admin.min.css index 231878c73..80079e902 100644 --- a/modules/admin/tpl/css/admin.min.css +++ b/modules/admin/tpl/css/admin.min.css @@ -1 +1 @@ -@charset "utf-8";/* NHN (developers@xpressengine.com) *//* Element Reset */body,table,input,textarea,select,button{font-family:Tahoma,Geneva,sans-serif;font-size:12px;color:#333}header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{display:block}button,input[type=submit],input[type=reset],input[type=button]{cursor:pointer;overflow:visible}body{margin:0}img{border:0}p{line-height:1.5}/* Section & Heading */.section{margin:1em 0;padding:0;border:0}.h1, .h2, .h3, .h4{position:relative;border-bottom-style:solid;border-bottom-color:#ccc;zoom:1}.h1{border-bottom-width:4px;font-size:24px}.h2{border-bottom-width:3px;font-size:20px}.h3{border-bottom-width:2px;font-size:16px}.h4{border-bottom-width:1px;font-size:12px}/* Portlet */.portlet{position:relative;border:1px solid #e9e9e9;margin:1em 0;padding:0;background:#fff;zoom:1;overflow:hidden;border-radius:5px}.portlet h2, .portlet h3{margin:0;padding:.5em 1em;font-size:14px;border:1px solid #fff;border-bottom:1px solid #e9e9e9;background:#f7f7f7;border-radius:5px 5px 0 0}.portlet p{margin:1em 1.2em}.portlet li{position:relative;padding-right:8em}.portlet .lined{margin:1px;padding:0;list-style:none}.portlet .lined li{padding:.5em 8em .5em 1em;border-top:1px solid #eee;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis}.portlet .lined li:first-child{border:0}.portlet .side{position:absolute;top:0;_top:1px;right:0;color:#666;background:#fff;padding:0 1em}.portlet .lined .side{padding:.5em 1em}.portlet .more{position:absolute;top:.5em;right:1em;text-decoration:none !important;color:#666}.portlet .more span{color:#999}.portlet .action{text-align:right;top:0;right:0;padding:.5em 1em .5em 3em;background:#fff;background:-webkit-gradient(linear, 0% 0%, 100% 0%, from(rgba(255,255,255,0)), to(rgba(255,255,255,1)), color-stop(15%, #fff));background:-moz-linear-gradient(left, rgba(255,255,255,0) 0, rgba(255,255,255,1) 15%)}.portlet .action a,.portlet .action button{margin-left:1em}.portlet .btnArea{border-top:1px solid #ddd;margin:0;padding:.5em 1em;margin:0 1px 1px 1px;background:#f7f7f7;border-radius:0 0 5px 5px}/* Table */.table{margin:1em 0}.table table{width:100%;border:0;border-collapse:collapse;border-top:2px solid #ccc}.table caption{padding:8px 0;font-weight:bold;text-align:left;line-height:32px}.table caption:after{content:"";display:block;clear:both}.table caption a{font-weight:normal}.table caption em{float:right;font-style:normal;font-weight:normal;color:#e00;margin-left:1em}.table caption strong{color:#e00}.table caption .side{float:right;font-weight:normal;margin-left:1em}.table th,.table td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd;white-space:nowrap}.table th{background:#f8f8f8}.table thead th{border-bottom:1px solid #999}.table tfoot td{font-weight:bold;background:#f8f8f8}.table.even tbody tr:nth-of-type(even) td{background-color:#fafafa}.table input[type=text]{margin:-1px 0 -3px 0;vertical-align:middle}.table img{vertical-align:middle}.table .title,.table .text{white-space:normal}.table .h1 + table,.table .h2 + table,.table .h3 + table,.table .h4 + table,.h1 + .table table,.h2 + .table table,.h3 + .table table,.h4 + .table table{border-top:0}/* Form */.form{margin:1em 0;padding:0}.form fieldset{margin:0 0 2em 0;padding:0;border:0}.form em{font-style:normal;color:#e00}.form label{margin-right:1em;line-height:1}.form input[type=checkbox]+label,.form input[type=radio]+label,.form input[type=file]{cursor:pointer}.form ul{position:relative;margin:0;padding:0;list-style:none;border-top:2px solid #ccc;border-bottom:1px solid #ccc;zoom:1}.form li{list-style:none;border:1px solid #ddd;border-left:0;border-right:0;margin:-1px 0;padding:8px 0;vertical-align:top;zoom:1}.form li:first-child{border-top:0}.form li>label:first-child{display:block;font-weight:bold}.form li label em{font-weight:normal}.form input[type=text],.form input[type=password],.form input[type=file],textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:transparent}.form input[type=text],.form input[type=password],.form input[type=file]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px}.form input[type=checkbox],.form input[type=radio]{margin:0;padding:0;width:13px;height:13px;vertical-align:middle}.form *[disabled=disabled]{background:#ddd;text-shadow:1px 1px 0 #fff}.form textarea{padding:3px 4px;vertical-align:top}.form span.desc{line-height:22px;vertical-align:middle;margin:0 10px}.form p.desc{margin:.25em 0;line-height:1.4}.form .q{font-weight:bold;margin:0 0 5px 0}.form .a{margin:0 0 5px 0}.form .tgForm{margin-right:1em}.form .h1 + ul,.form .h2 + ul,.form .h3 + ul,.form .h4 + ul{border-top:0}/* Global Navigation Bar */.gnb{position:relative;clear:both;border:1px solid #c1c1c1;border-left:0;border-right:0;background-color:#efefef;background:#efefef -webkit-gradient(linear, 0% 0%, 0% 100%, from(#efefef), to(#dcdcdc));background:#efefef -moz-linear-gradient(top, #efefef, #dcdcdc);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#efefef, endColorStr=#dcdcdc);zoom:1}.gnb ul{margin:0;padding:0 0 0 2em;list-style:none;border:1px solid #fff;border-left:0;border-right:0;zoom:1}.gnb ul ul{position:absolute;top:30px;left:0;border:1px solid #ccc;padding:0;background:#fff}.gnb ul:after{content:"";display:block;clear:both}.gnb li{position:relative;float:left;border:1px solid #fff;border-top:0;border-bottom:0;margin:0 -1px 0 0}.gnb li li{float:none;clear:both;overflow:hidden;border:0;border-top:1px dotted #ccc;margin:0;padding:2px}.gnb li li:first-child{border:0}.gnb li a{float:left;font-weight:bold;color:#333;font-size:12px;padding:8px 18px;white-space:nowrap;text-decoration:none;text-shadow:0 1px 0 #fff;zoom:1}.gnb li a:hover,.gnb li a:active,.gnb li a:focus,.gnb li.active a,.gnb li.activeOn a{background:#fff;border:1px solid #ddd;padding:7px 17px}.gnb li li a{display:block;float:none;color:#555;padding:5px 15px !important;font-weight:normal !important;border:0 !important}.gnb li li a:hover,.gnb li li a:active,.gnb li li a:focus{border:0;background:#eee}.gnb .setting{position:absolute;top:8px;right:2em;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;background:url(../img/iconSetting.gif) no-repeat center}.gnb.jx ul{display:block;position:static;padding:0}.gnb.jx li{float:none;clear:both;border-top:1px solid #ccc}.gnb.jx ul ul{border:0}.gnb.jx li li{border:0}.gnb.jx li a{float:none;display:block}.gnb.jx li a:hover,.gnb.jx li a:active,.gnb.jx li a:focus{background:none}.gnb.jx li.activeOn>a{background:#ddd}@media only all and (max-width:860px){ .gnb ul{padding-left:1em} .gnb .setting{right:1em}}@media only all and (max-width:640px){ .gnb ul{display:block;position:static;padding:0} .gnb li{float:none;clear:both;border-top:1px solid #ccc} .gnb ul ul{border:0;position:static} .gnb li li{border:0} .gnb li a{float:none;display:block} .gnb li a:hover, .gnb li a:active, .gnb li a:focus{background:none} .gnb li.activeOn>a{background:#ddd}}/* Pagination */.pagination{margin:1em 0;text-align:center;line-height:normal}.pagination *{vertical-align:middle}.pagination a,.pagination strong{position:relative;display:inline-block;padding:2px 4px;font-weight:bold;text-decoration:none;line-height:normal;color:#333 !important;vertical-align:middle}.pagination a:hover,.pagination a:active,.pagination a:focus{border:1px solid #ddd;margin:0 -1px}.pagination strong{color:#e00 !important;font-size:20px}.pagination .direction{font-weight:normal;white-space:nowrap}.pagination .direction:hover,.pagination .direction:active,.pagination .direction:focus{border:0;margin:0;text-decoration:underline}.pagination input{width:30px;text-align:center}.pagination button{overflow:visible}/* Button */.btn{position:relative;display:inline-block;margin:2px;vertical-align:top}.btn *{display:inline-block;padding:0 8px;font-size:12px;height:24px;line-height:22px;margin:0;font-weight:bold !important;color:#fff;text-decoration:none !important;border:1px solid;cursor:pointer;overflow:visible;border-radius:3px;box-shadow:inset 0 0 1px #fff;-moz-box-shadow:inset 0 0 1px #fff;-webkit-box-shadow:inset 0 0 1px #fff;background-color:#666;text-shadow:0 -1px 0 #333;zoom:1}.btn a, .btn button[type=button]{border-color:#ccc;color:#333 !important;background:#eee -webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#ddd));background:#eee -moz-linear-gradient(top,#fff,#ddd);background-color:#eee;text-shadow:1px 1px 0 #fff;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#ffffff, endColorStr=#dddddd)}.btn input, .btn button[type=submit]{border-color:#666;background:#333 -webkit-gradient(linear,0% 0%,0% 100%,from(#777),to(#777),color-stop(0.5,#333),color-stop(0.5,#000));background:#333 -moz-linear-gradient(top,#777,#000);background-color:#333;color:#ffc;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#777777, endColorStr=#333333)}.btn a{height:22px}.btn.medium *{padding:0 12px;font-size:16px;height:30px;line-height:28px}.btn.medium a{height:28px}.btn.large *{padding:0 18px;font-size:22px;height:36px;line-height:34px}.btn.large a{height:34px}/* Star Rating */.starRating, .starRating span{display:inline-block;height:14px;background:transparent url(../img/iconStarRating.gif) no-repeat;overflow:hidden}.starRating{width:79px;vertical-align:top}.starRating span{font-size:0;line-height:0;vertical-align:top;text-indent:-100px;*text-indent:0;background-position:0 -14px}/* Progress */.prgrs{white-space:nowrap;line-height:normal;vertical-align:middle}.prgrs *{vertical-align:middle}.prgrs .pBar{position:relative;display:inline-block;background:#e9e9e9;margin:0 5px 0 0}.prgrs .pAction{display:inline-block;vertical-align:top;background:#99a6b6}.prgrs .pNum{position:absolute;width:100%;left:0;top:0;text-align:center;text-shadow:1px 1px 0 #fff}.prgrs.prgrsSmall{font-size:14px;line-height:14px}.prgrs.prgrsSmall .pBar,.prgrs.prgrsSmall .pAction,.prgrs.prgrsSmall .pNum{height:16px;line-height:16px;font-size:11px}.prgrs.prgrsMedium{font-size:24px;line-height:24px}.prgrs.prgrsMedium .pBar,.prgrs.prgrsMedium .pAction,.prgrs.prgrsMedium .pNum{height:22px;line-height:22px;font-size:12px}.prgrs.prgrsLarge{font-size:38px;line-height:38px}.prgrs.prgrsLarge .pBar,.prgrs.prgrsLarge .pAction,.prgrs.prgrsLarge .pNum{height:34px;line-height:34px;font-size:14px}/* Layer */.layer{position:absolute;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;font-weight:normal;z-index:2;zoom:1;border-radius:5px;box-shadow:0 0 6px #666;-moz-box-shadow:0 0 6px #666;-webkit-box-shadow:0 0 6px #666;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.layer h2{margin-top:1em}.layer ul, .layer ol, .layer .lined, .layer .table{margin-bottom:1em}.layerClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px}.layerBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}/* Modal Window */.modal{position:fixed;*position:absolute;top:0;left:0;width:100%;_height:100%;min-height:100%;z-index:100}.modal .bg{position:absolute;background:#000;_background:none;width:100%;height:100%;opacity:.5;z-index:2;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1}.modal .fg{position:relative;width:50%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:3;zoom:1;border-radius:5px;box-shadow:0 0 6px #000;-moz-box-shadow:0 0 6px #000;-webkit-box-shadow:0 0 6px #000}.modal h2{margin-top:1em}.modal ul, .modal ol, .modal .lined, .modal .table{margin-bottom:1em}.modal .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1}.modalClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px}.modalBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}html.modalContainer,body.modalContainer{_height:100%;_width:100%} /* IE6 only */ /* Message */.message{border:1px solid #ddd;background:#f8f8f8;margin:1em 0;padding:0 1em;border-radius:5px}.message em{font-style:normal;color:#e00}.message.info,.message.error,.message.update{padding-left:55px}.message.info{border-color:#E0E8EC;background:#EDF9FF url(../img/msg.Info.png) no-repeat 1em .5em}.message.error{border-color:#EFDCDC;background:#FFECEC url(../img/msg.error.png) no-repeat 1em .5em}.message.update{border-color:#EAE9DC;background:#FFFDEF url(../img/msg.update.png) no-repeat 1em .5em}/* Text Button */input.text, button.text{border:0;overflow:visible;padding:0;margin:0;color:#33a;background:none;text-decoration:underline}/* H2 Anchor */.h2Anchor{position:absolute;right:0;border:0;background:none;color:#00f;text-decoration:underline}/* Waiting for server response */#wfsr .bg{position:absolute;background:#000;_background:none;width:100%;height:100%;opacity:.5;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1}#wfsr .fg{position:relative;width:50%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:10px solid #ddd;z-index:2;zoom:1}#wfsr .fg p{padding:0 0 0 2.5em;background:url(../img/preLoader16.gif) no-repeat 1em .4em}#wfsr .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1}.wfsrActive{position:fixed;_position:absolute;top:0;left:0;width:100%;height:100%;z-index:100}.wfsrClose{position:absolute;right:-10px;top:-10px;border:0;background:#ddd;padding:0;width:34px;height:34px;font-size:16px;font-weight:bold;cursor:pointer;color:#999}.wfsrBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}/* Skip Navigation */.skipNav{margin:0;text-align:center;overflow:hidden}.skipNav a{position:absolute;width:1px;height:1px;display:block;color:#fff;font-weight:bold;padding:10px 0;background:#333;border-top:1px solid #656565}.skipNav a:hover,.skipNav a:active,.skipNav a:focus{position:relative;width:auto;height:auto}/* Header */.header{position:relative;z-index:2;padding:30px 0 0 0;background:#4c4c4c;box-shadow:0 0 10px #aaa;-moz-box-shadow:0 0 10px #aaa;-webkit-box-shadow:0 0 10px #aaa;zoom:1}.stAdmin .header{background:#2D808A}.header:after{content:"";display:block;clear:both}.header a{text-decoration:none}.header h1{margin:0 100px 10px 1.3em;font-size:24px;line-height:32px}.header h1 *{vertical-align:middle}.header h1 a{color:#fff;text-shadow:1px 1px 0 #000;filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=1, OffY=1, Color=#000000, Positive=true);zoom:1}.header h1 img{height:32px}.header h1 .url{font-size:12px;font-weight:normal}.header .siteTool{position:absolute !important;top:42px;right:0;padding:0 2em 0 0;z-index:2}.header .siteTool .i{position:relative;z-index:2;display:inline-block;color:#fff;padding:0 6px;line-height:24px}.header .siteTool .i:first-child{border:0}.header .siteTool .tgAnchor{padding-right:16px;background:url(../img/iconArrow.gif) no-repeat right -156px}.header .siteTool .tgAnchor.active{border:1px solid #ccc;border-bottom:0;background-color:#fff;color:#333;text-decoration:none;border-radius:5px 5px 0 0}.header .siteTool .tgContent{position:absolute;top:24px;right:2em;border:1px solid #ccc;z-index:1;background-color:#fff;border-radius:5px 0 5px 5px}.header .siteTool .tgContent .btnArea{margin:0}.header #moveSiteList{padding:10px 1em 5px 1em;margin:0}.header #moveSiteList ul{list-style:none;margin:0;padding:0}.header #moveSiteList li{white-space:nowrap;margin:0;padding:4px 0;border-bottom:1px dotted #ccc}.header #siteMapList{padding:0 1em 1em 1em;margin:0}.header #siteMapList li{white-space:nowrap}.header .account{position:absolute;z-index:3;width:100%;padding:5px 2em 5px 0;top:0;right:0;white-space:nowrap;text-align:right;background:#333;border-bottom:1px solid #656565;color:#fff;font-size:12px;box-shadow:0 0 10px #333;-moz-box-shadow:0 0 10px #333;-webkit-box-shadow:0 0 10px #333}.stAdmin .header .account{background:#0e5f69}.header .account ul{margin:0 2px 0 0;padding:0;list-style:none}.header .account li{position:relative;display:inline;border-left:1px solid #666;padding:0 6px 0 10px}.header .account li:first-child{border:0}.header .account a{color:#fff;display:inline-block;height:14px}.header .account a.language{padding-right:2px}.header #language{position:absolute;top:19px;right:0;padding:6px 4px !important;border:1px solid #666;border-top:0;background:#333}.header #language li{border:0;display:block;padding:1px 8px;text-align:left;line-height:1}.header #language li.selected{background:transparent url(../img/checked.png) no-repeat left center}.header h1 a:hover,.header h1 a:active,.header h1 a:focus,.header .siteTool a:hover,.header .siteTool a:active,.header .siteTool a:focus,.header .account a:hover,.header .account a:active,.header .account a:focus{color:#6e9cf2;text-decoration:underline}/* Footer */.footer{border-top:1px solid #ddd;text-align:center;font-size:12px;padding:1.5em 0;margin:0 2em}.footer p{margin:0}.footer a{color:#6e9cf2;text-decoration:none}/* Body */.body{position:relative;z-index:1;padding:1em 2em 1em 260px;zoom:1}.body:after{content:"";display:block;clear:both}/* Content */.content{float:right;width:100%;margin-left:-230px;zoom:1}.content:after{content:"";display:block;clear:both}.content a{color:#33a}.content a:hover,.content a:active,.content a:focus{color:#a33}.content .portlet a{text-decoration:none}.content .portlet a:hover,.content .portlet a:active,.content .portlet a:focus{text-decoration:underline}/* Dashboard */.dashboard{position:relative;float:none;width:auto;margin-left:-230px}.dashboard .portlet{float:left;width:48%;margin-right:1em}.dashboard .portlet:nth-of-type(even){ float:left;width:49%;margin-right:0 }.dashboard .portlet:nth-of-type(even){ float:right;width:49%;margin-right:0}/* Local Navigation */.lnb{position:relative;float:left;width:200px;margin:1em 0 1em -230px;line-height:normal;zoom:1;display:inline}.lnb .h2{margin-top:0}.lnb ul{margin:0;padding:0;list-style:none}.lnb li{position:relative;margin:0 0 -1px 0;vertical-align:top;zoom:1}.lnb li a{display:block;position:relative;padding:8px 10px;text-decoration:none;color:#666;font-weight:bold;background:#fafafa;border:1px solid #eee;zoom:1}.lnb li a .i{position:absolute;top:50%;left:100%;margin:-4px 0 0 -16px;width:8px;height:8px;color:#ccc;background:url(../img/iconNavVr.gif) no-repeat left top}.lnb li ul{padding:5px 0;background:#fff}.lnb li li{margin:0;border-top:1px dotted #ddd}.lnb li li:first-child{border:0}.lnb li li a{font-weight:normal;background:#fff;padding:5px 10px;border:0}.lnb li li a span{color:#666}.lnb li.active{border:1px solid #ccc;z-index:2}.lnb li li.active{border:0}.lnb li.active a{color:#000;border:0}.lnb li.active .i{background-position:0 -44px}.lnb li.active li a{border:0}.lnb li.active ul{display:block;border-top:1px solid #eee}.lnb li.active li.active a span{color:#13b200;font-weight:bold;letter-spacing:-1px}/* Search */.search{zoom:1}.search:after{content:"";display:block;clear:both}.search .pagination{float:left;text-align:left}.search form{float:right;margin:1em 0}.search form *{vertical-align:middle}/* Site Map */.siteMap h2 input{font-size:12px;font-weight:bold;padding:0 .5em}.siteMap .lined ul{padding:0;margin:0;border-top:1px solid #eee;zoom:1}.siteMap .lined li{position:relative;padding:0;margin:0;cursor:all-scroll;list-style:none;zoom:1}.siteMap .lined li li{border-top:1px solid #eee}.siteMap li li{text-indent:32px}.siteMap li li li{text-indent:64px}.siteMap li li li li{text-indent:96px}.siteMap li li li li li{text-indent:128px}.siteMap li li li li li li{text-indent:160px}.siteMap li li li li li li li{text-indent:192px}.siteMap li li li li li li li li{text-indent:224px}.siteMap li li li li li li li li li{text-indent:256px}.siteMap li li li li li li li li li li{text-indent:288px}.siteMap li li li li li li li li li li li{text-indent:320px}.siteMap li li li li li li li li li li li li{text-indent:352px}.siteMap li *{vertical-align:middle}.siteMap li .moveTo+input{width:200px;border:0;padding:0 .5em}.siteMap li .moveTo+input:hover,.siteMap li .moveTo+input:active,.siteMap li .moveTo+input:focus{border:1px dotted #ccc;overflow:visible}.siteMap .moveTo{position:relative;z-index:2;width:32px;height:32px;padding:32px 0 0 0;margin:0 .5em;_margin-top:-1px;overflow:hidden;background:#fff url(../img/iconMoveTo.gif) no-repeat;border:0}.siteMap li.active li,.siteMap li.active ul{border-top-color:#fff}.siteMap li.active .moveTo{background-position:0 -32px}.siteMap .vr{display:none;position:absolute;z-index:1;left:16px;top:-16px;margin:0 .5em;height:100%;border-left:1px solid #ccc;overflow:hidden}.siteMap .hr{display:none;position:absolute;z-index:1;left:16px;top:16px;margin:0 .5em;width:16px;border-top:1px solid #ccc;overflow:hidden}.siteMap li.active .vr,.siteMap li.active li .hr{display:block}.siteMap li li .vr,.siteMap li li li .hr{left:48px}.siteMap li li li .vr,.siteMap li li li li .hr{left:80px}.siteMap li li li li .vr,.siteMap li li li li li .hr{left:112px}.siteMap li li li li li .vr,.siteMap li li li li li li .hr{left:144px}.siteMap li li li li li li .vr,.siteMap li li li li li li li .hr{left:176px}.siteMap li li li li li li li .vr,.siteMap li li li li li li li li .hr{left:208px}.siteMap li li li li li li li li .vr,.siteMap li li li li li li li li li .hr{left:240px}.siteMap li li li li li li li li li .vr,.siteMap li li li li li li li li li li .hr{left:272px}.siteMap li li li li li li li li li li .vr,.siteMap li li li li li li li li li li li .hr{left:304px}.siteMap li li li li li li li li li li li .vr,.siteMap li li li li li li li li li li li li .hr{left:336px}.siteMap .side{padding-top:0 !important;padding-bottom:0 !important;line-height:30px}.siteMap .side button{text-indent:0;line-height:1}.siteMap .tgMap{position:absolute;top:12px;right:1em;padding:0 16px 0 0;line-height:16px;background:url(../img/iconArrow.gif) no-repeat right -126px}.siteMap.fold .tgMap{background-position:right -158px}.siteMap.fold .h2{border-bottom-color:#fff;border-radius:5px}/* Button Area */.btnArea{margin:1em 0;text-align:right;zoom:1}.btnArea:after{content:"";display:block;clear:both}/* Multilingual */.langEdit{background:#fff;position:absolute;*left:0;*margin-top:28px;z-index:10;box-shadow:3px 3px 6px #999;-moz-box-shadow:3px 3px 6px #999;-webkit-box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.langEdit ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0}.langEdit li{padding:.5em 10px}.langEdit input[type=text]{width:220px;padding-right:40px}.langEdit label{left:15px !important}.langEdit .action{border:1px solid #eee;width:268px;padding:0 10px}.langEdit p, .langEdit .btnArea{white-space:normal}.langEdit li.en input, .mLangEdit li.en textarea{background:url(../img/flag.us.gif) no-repeat 99% 5px}.langEdit li.ko input, .mLangEdit li.ko textarea{background:url(../img/flag.kr.gif) no-repeat 99% 5px}.langEdit li.ja input, .mLangEdit li.ja textarea{background:url(../img/flag.jp.gif) no-repeat 99% 5px}.langEdit li.zh input, .mLangEdit li.zh textarea{background:url(../img/flag.cn.gif) no-repeat 99% 5px}.langEdit li.fr input, .mLangEdit li.fr textarea{background:url(../img/flag.fr.gif) no-repeat 99% 5px}.langEdit li.de input, .mLangEdit li.de textarea{background:url(../img/flag.de.gif) no-repeat 99% 5px}.langEdit li.ru input, .mLangEdit li.ru textarea{background:url(../img/flag.ru.gif) no-repeat 99% 5px}.langEdit li.es input, .mLangEdit li.es textarea{background:url(../img/flag.es.gif) no-repeat 99% 5px}.langEdit li.tr input, .mLangEdit li.tr textarea{background:url(../img/flag.tr.gif) no-repeat 99% 5px}.langEdit li.vi input, .mLangEdit li.vi textarea{background:url(../img/flag.vn.gif) no-repeat 99% 5px}.langEdit li.mn input, .mLangEdit li.mn textarea{background:url(../img/flag.mn.gif) no-repeat 99% 5px}.mLangEdit.en strong{background:url(../img/flag.us.gif) no-repeat 0 10px}.mLangEdit.ko strong{background:url(../img/flag.kr.gif) no-repeat 0 10px}.mLangEdit.ja strong{background:url(../img/flag.jp.gif) no-repeat 0 10px}.mLangEdit.zh strong{background:url(../img/flag.cn.gif) no-repeat 0 10px}.mLangEdit.fr strong{background:url(../img/flag.fr.gif) no-repeat 0 10px}.mLangEdit.de strong{background:url(../img/flag.de.gif) no-repeat 0 10px}.mLangEdit.ru strong{background:url(../img/flag.ru.gif) no-repeat 0 10px}.mLangEdit.es strong{background:url(../img/flag.es.gif) no-repeat 0 10px}.mLangEdit.tr strong{background:url(../img/flag.tr.gif) no-repeat 0 10px}.mLangEdit.vi strong{background:url(../img/flag.vn.gif) no-repeat 0 10px}.mLangEdit.mn strong{background:url(../img/flag.mn.gif) no-repeat 0 10px}.mLangEdit ul ul{border:0}.mLangEdit li{ position:relative;padding:0}.mLangEdit li strong{ display:inline-block;padding:6px 100px 8px 24px;font-weight:normal;line-height:1.5}.mLangEdit li .side{ position:absolute;top:8px;right:0;padding-right:18px;background:url(../img/iconArrow.gif) no-repeat right -160px}.mLangEdit li li{ border:0;padding-right:36px}.mLangEdit li textarea{ width:100%;height:16px;padding-right:30px;resize:vertical;line-height:1.4}.mLangEdit li label{ top:8px !important}.mLangEdit li.active strong{ font-weight:bold}.mLangEdit li.active .side{ background-position:right -128px}.modal .mLangEdit ul{padding-bottom:1em}.modal .mLangEdit li{border:0;padding-right:36px}/* Suggestion */.suggestion{display:none;position:absolute;background:#fff;z-index:10;_height:200px;max-height:200px;overflow:auto;*left:0;*margin-top:28px;box-shadow:3px 3px 6px #999;-moz-box-shadow:3px 3px 6px #999;-webkit-box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.suggestion ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0}.suggestion li{padding:0}.suggestion li:last-child{border-bottom:0}.suggestion li button{border:0;background:#fff;text-align:left;width:280px;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.suggestion li button:hover,.suggestion li button:active,.suggestion li button:focus{background:#eee}/* Image Mark */#imageMark{right:0}/* Easy Installer */.easyNav{position:relative;border:1px solid #e9e9e9;zoom:1}.easyNav:after{content:"";display:block;clear:both}.easyNav h2{font-size:16px}.easyNav .category{width:30%;float:left;margin:0 2em;display:inline}.easyNav .filter{position:absolute;top:0;right:0;margin:1em 2em;text-align:right}.easyList td p{margin-top:0}.easyList td p.update{background:#ffc;padding:.5em 1em;border:1px solid #fc9;border-left:0;border-right:0;text-align:center}/* Font Preview */.fontPreview{width:96%;border:1px solid #e9e9e9;zoom:1;padding:1em 2em;margin:.5em 0}/* FTP Suggestion */#ftpSuggestion{background:#fff;box-shadow:3px 3px 6px #999;-moz-box-shadow:3px 3px 6px #999;-webkit-box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}#ftpSuggestion ul{border-left:1px solid #eee;border-right:1px solid #eee}#ftpSuggestion li{padding:0}#ftpSuggestion li button{border:0;background:#fff;text-align:left;width:288px}#ftpSuggestion li button:hover,#ftpSuggestion li button:active,#ftpSuggestion li button:focus{background:#eee}/* Theme & Skin Preview */.thumbPreview li{position:relative;padding-left:10px;padding-right:10px}.thumbPreview li.active.highlight{background:#f9f9f9}.thumbPreview .prevToggle{position:absolute;top:8px;right:10px;line-height:16px;padding:0 18px 0 0;text-decoration:none;background:url(../img/iconArrow.gif) no-repeat right -32px}.thumbPreview li.active .prevToggle{background-position:right 0}.thumbPreview .a{border:0;margin:0;zoom:1}.thumbPreview .a:after{content:"";display:block;clear:both}.thumbPreview .i{float:left;vertical-align:top;margin:0 1em 1em 0;padding:0;border:0;zoom:1}.thumbPreview .i:after{content:"";display:block;clear:both}.thumbPreview .i .thumb{position:relative;width:124px;height:84px;padding:0;margin-bottom:3px;text-align:center;overflow:hidden;border:1px solid #ddd;display:block;cursor:pointer;background:#fff}.thumbPreview .i .thumb .frame{position:absolute;width:120px;height:80px;left:0;top:0;border:2px solid #fff;overflow:hidden}.thumbPreview .i .thumb img{width:120px;margin:0}.thumbPreview .i label{display:block;position:relative;top:0;left:2px;width:122px;height:1.1em;margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.thumbPreview .i input{display:none}.thumbPreview .i ul{display:none}.thumbPreview .selected .i{display:block;float:none}.thumbPreview .selected .i .thumb{float:left;width:186px;height:126px;margin:0 1em 0 0;border:2px solid #eee}.thumbPreview .selected .i .thumb .frame{width:180px;height:120px;border-width:3px}.thumbPreview li.active.highlight .selected .i .thumb{border-color:#5ea8f6}.thumbPreview .selected .i .thumb img{width:180px;position:relative}.thumbPreview li.active .selected .i .thumb img{z-index:auto}.thumbPreview .selected .i label{cursor:text}.thumbPreview .selected .i ul{display:block;list-style:none;border:0;margin:1em 0 1em 200px}.thumbPreview .selected .i li{border:0;padding:0;margin:0 0 .2em 0}.thumbPreview.jx .i label{display:inline;width:auto}.thumbPreview.jx .i.noDirection{display:none}.thumbPreview.jx .i input{display:inline}#skin .showAll{float:right;border:0;overflow:visible;padding:0 18px 0 0;cursor:pointer;color:#00f;background:url(../img/iconArrow.gif) no-repeat right -32px}#skin .showAll.hideAll{background-position:right 0}/* Sign Up Form */.signUpForm li{position:relative}.signUpForm .side{position:absolute;top:8px;right:0}/* Favorite On | Off */.fvOff,.fvOn{display:inline-block;width:16px;height:16px;overflow:hidden;text-indent:16px;background:url(../img/iconFavorite.gif) no-repeat}.fvOn{background-position:0 -16px}/* Up-Down Dragable */.uDrag .wrap{position:relative;padding-left:20px}.uDrag .dragActive{background:#FFD}.uDrag .dragActive td{background:none !important}.uDrag .dragBtn{position:absolute;width:8px;height:100%;padding:0;overflow:hidden;background:url(../img/bgDragable.gif);top:1px;left:0;text-indent:12px;border:0;cursor:n-resize}/* Favicon Preview */.faviconPreview{position:relative;padding:60px 0 0 200px;background:url(../img/bgFavicon.gif) no-repeat}.faviconPreview img{position:absolute}.faviconPreview .fn1{top:30px;left:12px}.faviconPreview .fn2{top:55px;left:68px}/* Mobile Icon Preview */.mobiconPreview{position:relative;padding:252px 0 0 200px;background:url(../img/bgMobileTop.png) no-repeat}.mobiconPreview img{position:absolute;top:20px;left:10px}.mobiconPreview span{position:absolute;width:32px;text-align:center;top:52px;left:10px;color:#fff;font-size:9px}/* Text List */.textList{border:1px solid #ddd !important;line-height:1.5em;height:18.5em;overflow:auto}.textList li{border:0;padding:.25em 1em;height:1.5em;white-space:nowrap;overflow:hidden}.textList li:nth-child(even){background:#eee}.textList li a{float:right}/* Responsive Layout */@media only all and (max-width:860px){ .header h1{margin-left:.7em} .header .account{padding-right:1em} .header .siteTool{padding-right:1em} .header .siteTool .tgContent{right:1em} .body{padding:1em} .content{float:none;margin-left:0} .lnb{float:none;width:auto;margin:1em 0} .dashboard .portlet{float:none !important;width:auto !important;margin-right:0} .modal .fg, .wfsr .fg{width:auto} .easyNav .category{float:none;display:block;width:auto} .easyNav .filter{position:static}}@media only all and (max-width:640px){ .skipNav a{position:relative;width:auto;height:auto} .modal{position:absolute}} \ No newline at end of file +@charset "utf-8";/* NHN (developers@xpressengine.com) *//* Element Reset */body,table,input,textarea,select,button{font-family:Tahoma,Geneva,sans-serif;font-size:12px;color:#333}header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{display:block}button,input[type=submit],input[type=reset],input[type=button]{cursor:pointer;overflow:visible}body{margin:0}img{border:0}p{line-height:1.5}/* Section & Heading */.section{margin:1em 0;padding:0;border:0}.h1, .h2, .h3, .h4{position:relative;border-bottom-style:solid;border-bottom-color:#ccc;zoom:1}.h1{border-bottom-width:4px;font-size:24px}.h2{border-bottom-width:3px;font-size:20px}.h3{border-bottom-width:2px;font-size:16px}.h4{border-bottom-width:1px;font-size:12px}/* Portlet */.portlet{position:relative;border:1px solid #e9e9e9;margin:1em 0;padding:0;background:#fff;zoom:1;overflow:hidden;border-radius:5px}.portlet h2, .portlet h3{margin:0;padding:.5em 1em;font-size:14px;border:1px solid #fff;border-bottom:1px solid #e9e9e9;background:#f7f7f7;border-radius:5px 5px 0 0}.portlet p{margin:1em 1.2em}.portlet li{position:relative;padding-right:8em}.portlet .lined{margin:1px;padding:0;list-style:none}.portlet .lined li{padding:.5em 8em .5em 1em;border-top:1px solid #eee;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis}.portlet .lined li:first-child{border:0}.portlet .side{position:absolute;top:0;_top:1px;right:0;color:#666;background:#fff;padding:0 1em}.portlet .lined .side{padding:.5em 1em}.portlet .more{position:absolute;top:.5em;right:1em;text-decoration:none !important;color:#666}.portlet .more span{color:#999}.portlet .action{text-align:right;top:0;right:0;padding:.5em 1em .5em 3em;background:#fff;background:-webkit-gradient(linear, 0% 0%, 100% 0%, from(rgba(255,255,255,0)), to(rgba(255,255,255,1)), color-stop(15%, #fff));background:-moz-linear-gradient(left, rgba(255,255,255,0) 0, rgba(255,255,255,1) 15%)}.portlet .action a,.portlet .action button{margin-left:1em}.portlet .btnArea{border-top:1px solid #ddd;margin:0;padding:.5em 1em;margin:0 1px 1px 1px;background:#f7f7f7;border-radius:0 0 5px 5px}/* Table */.table{margin:1em 0}.table table{width:100%;border:0;border-collapse:collapse;border-top:2px solid #ccc}.table caption{padding:8px 0;font-weight:bold;text-align:left;line-height:32px}.table caption:after{content:"";display:block;clear:both}.table caption a{font-weight:normal}.table caption em{float:right;font-style:normal;font-weight:normal;color:#e00;margin-left:1em}.table caption strong{color:#e00}.table caption .side{float:right;font-weight:normal;margin-left:1em}.table th,.table td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd;white-space:nowrap}.table th{background:#f8f8f8}.table thead th{border-bottom:1px solid #999}.table tfoot td{font-weight:bold;background:#f8f8f8}.table.even tbody tr:nth-of-type(even) td{background-color:#fafafa}.table td>input[type=text]{margin:-1px 0 -3px 0 !important;vertical-align:middle}.table img{vertical-align:middle}.table .title,.table .text{white-space:normal}.table .h1 + table,.table .h2 + table,.table .h3 + table,.table .h4 + table,.h1 + .table table,.h2 + .table table,.h3 + .table table,.h4 + .table table{border-top:0}/* Form */.form{margin:1em 0;padding:0}.form fieldset{margin:0 0 2em 0;padding:0;border:0}.form em{font-style:normal;color:#e00}.form label{margin-right:1em;line-height:1}.form input[type=checkbox]+label,.form input[type=radio]+label,.form input[type=file]{cursor:pointer}.form ul{position:relative;margin:0;padding:0;list-style:none;border-top:2px solid #ccc;border-bottom:1px solid #ccc;zoom:1}.form li{list-style:none;border:1px solid #ddd;border-left:0;border-right:0;margin:-1px 0;padding:8px 0;vertical-align:top;zoom:1}.form li:first-child{border-top:0}.form li>label:first-child{display:block;font-weight:bold}.form li label em{font-weight:normal}.form input[type=text],.form input[type=password],.form input[type=file],textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:transparent}.form input[type=text],.form input[type=password],.form input[type=file]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px}.form input[type=checkbox],.form input[type=radio]{margin:0;padding:0;width:13px;height:13px;vertical-align:middle}.form *[disabled=disabled]{background:#ddd;text-shadow:1px 1px 0 #fff}.form textarea{padding:3px 4px;vertical-align:top}.form span.desc{line-height:22px;vertical-align:middle;margin:0 10px}.form p.desc{margin:.25em 0;line-height:1.4}.form .q{font-weight:bold;margin:0 0 5px 0}.form .a{margin:0 0 5px 0}.form .tgForm{margin-right:1em}.form .h1 + ul,.form .h2 + ul,.form .h3 + ul,.form .h4 + ul{border-top:0}/* Global Navigation Bar */.gnb{position:relative;clear:both;border:1px solid #c1c1c1;border-left:0;border-right:0;background-color:#efefef;background:#efefef -webkit-gradient(linear, 0% 0%, 0% 100%, from(#efefef), to(#dcdcdc));background:#efefef -moz-linear-gradient(top, #efefef, #dcdcdc);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#efefef, endColorStr=#dcdcdc);zoom:1}.gnb ul{margin:0;padding:0 0 0 2em;list-style:none;border:1px solid #fff;border-left:0;border-right:0;zoom:1}.gnb ul ul{position:absolute;top:31px;left:0;border:1px solid #ccc;padding:0;background:#fff}.gnb ul:after{content:"";display:block;clear:both}.gnb li{position:relative;float:left;border:1px solid #fff;border-top:0;border-bottom:0;margin:0 -1px 0 0}.gnb li li{float:none;clear:both;overflow:hidden;border:0;border-top:1px dotted #ccc;margin:0;padding:2px}.gnb li li:first-child{border:0}.gnb li a{float:left;font-weight:bold;color:#333;font-size:12px;padding:8px 18px;white-space:nowrap;text-decoration:none;text-shadow:0 1px 0 #fff;zoom:1}.gnb li a:hover,.gnb li a:active,.gnb li a:focus,.gnb li.active a,.gnb li.activeOn a{background:#fff;border:1px solid #ddd;padding:7px 17px}.gnb li li a{display:block;float:none;color:#555;padding:5px 15px !important;font-weight:normal !important;border:0 !important}.gnb li li a:hover,.gnb li li a:active,.gnb li li a:focus{border:0;background:#eee}.gnb .setting{position:absolute;top:8px;right:2em;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;background:url(../img/iconSetting.gif) no-repeat center}.gnb.jx ul{display:block;position:static;padding:0}.gnb.jx li{float:none;clear:both;border-top:1px solid #ccc}.gnb.jx ul ul{border:0}.gnb.jx li li{border:0}.gnb.jx li a{float:none;display:block}.gnb.jx li a:hover,.gnb.jx li a:active,.gnb.jx li a:focus{background:none}.gnb.jx li.activeOn>a{background:#ddd}@media only all and (max-width:860px){ .gnb ul{padding-left:1em} .gnb .setting{right:1em}}@media only all and (max-width:640px){ .gnb ul{display:block;position:static;padding:0} .gnb li{float:none;clear:both;border-top:1px solid #ccc} .gnb ul ul{border:0;position:static} .gnb li li{border:0} .gnb li a{float:none;display:block} .gnb li a:hover, .gnb li a:active, .gnb li a:focus{background:none} .gnb li.activeOn>a{background:#ddd}}/* Pagination */.pagination{margin:1em 0;text-align:center;line-height:normal}.pagination *{vertical-align:middle}.pagination a,.pagination strong{position:relative;display:inline-block;padding:2px 4px;font-weight:bold;text-decoration:none;line-height:normal;color:#333 !important;vertical-align:middle}.pagination a:hover,.pagination a:active,.pagination a:focus{border:1px solid #ddd;margin:0 -1px}.pagination strong{color:#e00 !important;font-size:20px}.pagination .direction{font-weight:normal;white-space:nowrap}.pagination .direction:hover,.pagination .direction:active,.pagination .direction:focus{border:0;margin:0;text-decoration:underline}.pagination input{width:30px;text-align:center}.pagination button{overflow:visible}/* Button */.btn{position:relative;display:inline-block;margin:2px;vertical-align:top}.btn *{display:inline-block;padding:0 8px;font-size:12px;height:24px;line-height:22px;margin:0;font-weight:bold !important;color:#fff;text-decoration:none !important;border:1px solid;cursor:pointer;overflow:visible;border-radius:3px;box-shadow:inset 0 0 1px #fff;-moz-box-shadow:inset 0 0 1px #fff;-webkit-box-shadow:inset 0 0 1px #fff;background-color:#666;text-shadow:0 -1px 0 #333;zoom:1}.btn a, .btn button[type=button]{border-color:#ccc;color:#333 !important;background:#eee -webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#ddd));background:#eee -moz-linear-gradient(top,#fff,#ddd);background-color:#eee;text-shadow:1px 1px 0 #fff;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#ffffff, endColorStr=#dddddd)}.btn input, .btn button[type=submit]{border-color:#666;background:#333 -webkit-gradient(linear,0% 0%,0% 100%,from(#777),to(#777),color-stop(0.5,#333),color-stop(0.5,#000));background:#333 -moz-linear-gradient(top,#777,#000);background-color:#333;color:#ffc;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#777777, endColorStr=#333333)}.btn a{height:22px}.btn.medium *{padding:0 12px;font-size:16px;height:30px;line-height:28px}.btn.medium a{height:28px}.btn.large *{padding:0 18px;font-size:22px;height:36px;line-height:34px}.btn.large a{height:34px}/* Star Rating */.starRating, .starRating span{display:inline-block;height:14px;background:transparent url(../img/iconStarRating.gif) no-repeat;overflow:hidden}.starRating{width:79px;vertical-align:top}.starRating span{font-size:0;line-height:0;vertical-align:top;text-indent:-100px;*text-indent:0;background-position:0 -14px}/* Progress */.prgrs{white-space:nowrap;line-height:normal;vertical-align:middle}.prgrs *{vertical-align:middle}.prgrs .pBar{position:relative;display:inline-block;background:#e9e9e9;margin:0 5px 0 0}.prgrs .pAction{display:inline-block;vertical-align:top;background:#99a6b6}.prgrs .pNum{position:absolute;width:100%;left:0;top:0;text-align:center;text-shadow:1px 1px 0 #fff}.prgrs.prgrsSmall{font-size:14px;line-height:14px}.prgrs.prgrsSmall .pBar,.prgrs.prgrsSmall .pAction,.prgrs.prgrsSmall .pNum{height:16px;line-height:16px;font-size:11px}.prgrs.prgrsMedium{font-size:24px;line-height:24px}.prgrs.prgrsMedium .pBar,.prgrs.prgrsMedium .pAction,.prgrs.prgrsMedium .pNum{height:22px;line-height:22px;font-size:12px}.prgrs.prgrsLarge{font-size:38px;line-height:38px}.prgrs.prgrsLarge .pBar,.prgrs.prgrsLarge .pAction,.prgrs.prgrsLarge .pNum{height:34px;line-height:34px;font-size:14px}/* Layer */.layer{position:absolute;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;font-weight:normal;z-index:2;zoom:1;border-radius:5px;box-shadow:0 0 6px #666;-moz-box-shadow:0 0 6px #666;-webkit-box-shadow:0 0 6px #666;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.layer h2{margin-top:1em}.layer ul, .layer ol, .layer .lined, .layer .table{margin-bottom:1em}.layerClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px}.layerBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}/* Modal Window */.modal{position:fixed;*position:absolute;top:0;left:0;width:100%;_height:100%;min-height:100%;z-index:100}.modal .bg{position:absolute;background:#000;_background:none;width:100%;height:100%;opacity:.5;z-index:2;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1}.modal .fg{position:relative;width:50%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:3;zoom:1;border-radius:5px;box-shadow:0 0 6px #000;-moz-box-shadow:0 0 6px #000;-webkit-box-shadow:0 0 6px #000}.modal h2{margin-top:1em}.modal ul, .modal ol, .modal .lined, .modal .table{margin-bottom:1em}.modal .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1}.modalClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px}.modalBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}html.modalContainer,body.modalContainer{_height:100%;_width:100%} /* IE6 only */ /* Message */.message{border:1px solid #ddd;background:#f8f8f8;margin:1em 0;padding:0 1em;border-radius:5px}.message em{font-style:normal;color:#e00}.message.info,.message.error,.message.update{padding-left:55px}.message.info{border-color:#E0E8EC;background:#EDF9FF url(../img/msg.Info.png) no-repeat 1em .5em}.message.error{border-color:#EFDCDC;background:#FFECEC url(../img/msg.error.png) no-repeat 1em .5em}.message.update{border-color:#EAE9DC;background:#FFFDEF url(../img/msg.update.png) no-repeat 1em .5em}/* Text Button */input.text, button.text{border:0;overflow:visible;padding:0;margin:0;color:#33a;background:none;text-decoration:underline}/* H2 Anchor */.h2Anchor{position:absolute;right:0;border:0;background:none;color:#00f;text-decoration:underline}/* Waiting for server response */#wfsr .bg{position:absolute;background:#000;_background:none;width:100%;height:100%;opacity:.5;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1}#wfsr .fg{position:relative;width:50%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:10px solid #ddd;z-index:2;zoom:1}#wfsr .fg p{padding:0 0 0 2.5em;background:url(../img/preLoader16.gif) no-repeat 1em .4em}#wfsr .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1}.wfsrActive{position:fixed;_position:absolute;top:0;left:0;width:100%;height:100%;z-index:100}.wfsrClose{position:absolute;right:-10px;top:-10px;border:0;background:#ddd;padding:0;width:34px;height:34px;font-size:16px;font-weight:bold;cursor:pointer;color:#999}.wfsrBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}/* Skip Navigation */.skipNav{margin:0;text-align:center;overflow:hidden}.skipNav a{position:absolute;width:1px;height:1px;display:block;color:#fff;font-weight:bold;padding:10px 0;background:#333;border-top:1px solid #656565}.skipNav a:hover,.skipNav a:active,.skipNav a:focus{position:relative;width:auto;height:auto}/* Header */.header{position:relative;z-index:2;padding:30px 0 0 0;background:#4c4c4c;box-shadow:0 0 10px #aaa;-moz-box-shadow:0 0 10px #aaa;-webkit-box-shadow:0 0 10px #aaa;zoom:1}.stAdmin .header{background:#2D808A}.header:after{content:"";display:block;clear:both}.header a{text-decoration:none}.header h1{margin:0 100px 10px 1.3em;font-size:24px;line-height:32px}.header h1 *{vertical-align:middle}.header h1 a{color:#fff;text-shadow:1px 1px 0 #000;filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=1, OffY=1, Color=#000000, Positive=true);zoom:1}.header h1 img{height:32px}.header h1 .url{font-size:12px;font-weight:normal}.header .siteTool{position:absolute !important;top:42px;right:0;padding:0 2em 0 0;z-index:2}.header .siteTool .i{position:relative;z-index:2;display:inline-block;color:#fff;padding:0 6px;line-height:24px}.header .siteTool .i:first-child{border:0}.header .siteTool .tgAnchor{padding-right:16px;background:url(../img/iconArrow.gif) no-repeat right -156px}.header .siteTool .tgAnchor.active{border:1px solid #ccc;border-bottom:0;background-color:#fff;color:#333;text-decoration:none;border-radius:5px 5px 0 0}.header .siteTool .tgContent{position:absolute;top:24px;right:2em;border:1px solid #ccc;z-index:1;background-color:#fff;border-radius:5px 0 5px 5px}.header .siteTool .tgContent .btnArea{margin:0}.header #moveSiteList{padding:10px 1em 5px 1em;margin:0}.header #moveSiteList ul{list-style:none;margin:0;padding:0}.header #moveSiteList li{white-space:nowrap;margin:0;padding:4px 0;border-bottom:1px dotted #ccc}.header #siteMapList{padding:0 1em 1em 1em;margin:0}.header #siteMapList li{white-space:nowrap}.header .account{position:absolute;z-index:3;width:100%;padding:5px 2em 5px 0;top:0;right:0;white-space:nowrap;text-align:right;background:#333;border-bottom:1px solid #656565;color:#fff;font-size:12px;box-shadow:0 0 10px #333;-moz-box-shadow:0 0 10px #333;-webkit-box-shadow:0 0 10px #333}.stAdmin .header .account{background:#0e5f69}.header .account ul{margin:0 2px 0 0;padding:0;list-style:none}.header .account li{position:relative;display:inline;border-left:1px solid #666;padding:0 6px 0 10px}.header .account li:first-child{border:0}.header .account a{color:#fff;display:inline-block;height:14px}.header .account a.language{padding-right:2px}.header #language{position:absolute;top:19px;right:0;padding:6px 4px !important;border:1px solid #666;border-top:0;background:#333}.header #language li{border:0;display:block;padding:1px 8px;text-align:left;line-height:1}.header #language li.selected{background:transparent url(../img/checked.png) no-repeat left center}.header h1 a:hover,.header h1 a:active,.header h1 a:focus,.header .siteTool a:hover,.header .siteTool a:active,.header .siteTool a:focus,.header .account a:hover,.header .account a:active,.header .account a:focus{color:#6e9cf2;text-decoration:underline}/* Footer */.footer{border-top:1px solid #ddd;text-align:center;font-size:12px;padding:1.5em 0;margin:0 2em}.footer p{margin:0}.footer a{color:#6e9cf2;text-decoration:none}/* Body */.body{position:relative;z-index:1;padding:1em 2em 1em 260px;zoom:1}.body:after{content:"";display:block;clear:both}/* Content */.content{float:right;width:100%;margin-left:-230px;zoom:1}.content:after{content:"";display:block;clear:both}.content a{color:#33a}.content a:hover,.content a:active,.content a:focus{color:#a33}.content .portlet a{text-decoration:none}.content .portlet a:hover,.content .portlet a:active,.content .portlet a:focus{text-decoration:underline}/* Dashboard */.dashboard{position:relative;float:none;width:auto;margin-left:-230px}.dashboard .portlet{float:left;width:48%;margin-right:1em}.dashboard .portlet:nth-of-type(even){ float:left;width:49%;margin-right:0 }.dashboard .portlet:nth-of-type(even){ float:right;width:49%;margin-right:0}/* Local Navigation */.lnb{position:relative;float:left;width:200px;margin:1em 0 1em -230px;line-height:normal;zoom:1;display:inline}.lnb .h2{margin-top:0}.lnb ul{margin:0;padding:0;list-style:none}.lnb li{position:relative;margin:0 0 -1px 0;vertical-align:top;zoom:1}.lnb li a{display:block;position:relative;padding:8px 10px;text-decoration:none;color:#666;font-weight:bold;background:#fafafa;border:1px solid #eee;zoom:1}.lnb li a .i{position:absolute;top:50%;left:100%;margin:-4px 0 0 -16px;width:8px;height:8px;color:#ccc;background:url(../img/iconNavVr.gif) no-repeat left top}.lnb li ul{padding:5px 0;background:#fff}.lnb li li{margin:0;border-top:1px dotted #ddd}.lnb li li:first-child{border:0}.lnb li li a{font-weight:normal;background:#fff;padding:5px 10px;border:0}.lnb li li a span{color:#666}.lnb li.active{border:1px solid #ccc;z-index:2}.lnb li li.active{border:0}.lnb li.active a{color:#000;border:0}.lnb li.active .i{background-position:0 -44px}.lnb li.active li a{border:0}.lnb li.active ul{display:block;border-top:1px solid #eee}.lnb li.active li.active a span{color:#13b200;font-weight:bold;letter-spacing:-1px}/* Search */.search{zoom:1}.search:after{content:"";display:block;clear:both}.search .pagination{float:left;text-align:left}.search form{float:right;margin:1em 0}.search form *{vertical-align:middle}/* Site Map */.siteMap h2 input{font-size:12px;font-weight:bold;padding:0 .5em}.siteMap .lined ul{padding:0;margin:0;border-top:1px solid #eee;zoom:1}.siteMap .lined li{position:relative;padding:0;margin:0;cursor:all-scroll;list-style:none;zoom:1}.siteMap .lined li li{border-top:1px solid #eee}.siteMap li li{text-indent:32px}.siteMap li li li{text-indent:64px}.siteMap li li li li{text-indent:96px}.siteMap li li li li li{text-indent:128px}.siteMap li li li li li li{text-indent:160px}.siteMap li li li li li li li{text-indent:192px}.siteMap li li li li li li li li{text-indent:224px}.siteMap li li li li li li li li li{text-indent:256px}.siteMap li li li li li li li li li li{text-indent:288px}.siteMap li li li li li li li li li li li{text-indent:320px}.siteMap li li li li li li li li li li li li{text-indent:352px}.siteMap li *{vertical-align:middle}.siteMap li .moveTo+input{width:200px;border:0;padding:0 .5em}.siteMap li .moveTo+input:hover,.siteMap li .moveTo+input:active,.siteMap li .moveTo+input:focus{border:1px dotted #ccc;overflow:visible}.siteMap .moveTo{position:relative;z-index:2;width:32px;height:32px;padding:32px 0 0 0;margin:0 .5em;_margin-top:-1px;overflow:hidden;background:#fff url(../img/iconMoveTo.gif) no-repeat;border:0}.siteMap li.active li,.siteMap li.active ul{border-top-color:#fff}.siteMap li.active .moveTo{background-position:0 -32px}.siteMap .vr{display:none;position:absolute;z-index:1;left:16px;top:-16px;margin:0 .5em;height:100%;border-left:1px solid #ccc;overflow:hidden}.siteMap .hr{display:none;position:absolute;z-index:1;left:16px;top:16px;margin:0 .5em;width:16px;border-top:1px solid #ccc;overflow:hidden}.siteMap li.active .vr,.siteMap li.active li .hr{display:block}.siteMap li li .vr,.siteMap li li li .hr{left:48px}.siteMap li li li .vr,.siteMap li li li li .hr{left:80px}.siteMap li li li li .vr,.siteMap li li li li li .hr{left:112px}.siteMap li li li li li .vr,.siteMap li li li li li li .hr{left:144px}.siteMap li li li li li li .vr,.siteMap li li li li li li li .hr{left:176px}.siteMap li li li li li li li .vr,.siteMap li li li li li li li li .hr{left:208px}.siteMap li li li li li li li li .vr,.siteMap li li li li li li li li li .hr{left:240px}.siteMap li li li li li li li li li .vr,.siteMap li li li li li li li li li li .hr{left:272px}.siteMap li li li li li li li li li li .vr,.siteMap li li li li li li li li li li li .hr{left:304px}.siteMap li li li li li li li li li li li .vr,.siteMap li li li li li li li li li li li li .hr{left:336px}.siteMap .side{padding-top:0 !important;padding-bottom:0 !important;line-height:30px}.siteMap .side button{text-indent:0;line-height:1}.siteMap .tgMap{position:absolute;top:12px;right:1em;padding:0 16px 0 0;line-height:16px;background:url(../img/iconArrow.gif) no-repeat right -126px}.siteMap.fold .tgMap{background-position:right -158px}.siteMap.fold .h2{border-bottom-color:#fff;border-radius:5px}/* Button Area */.btnArea{margin:1em 0;text-align:right;zoom:1}.btnArea:after{content:"";display:block;clear:both}/* Multilingual */.langEdit{background:#fff;position:absolute;*left:0;*margin-top:28px;z-index:10;box-shadow:3px 3px 6px #999;-moz-box-shadow:3px 3px 6px #999;-webkit-box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.langEdit ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0}.langEdit li{padding:.5em 10px}.langEdit input[type=text]{width:220px;padding-right:40px}.langEdit label{left:15px !important}.langEdit .action{border:1px solid #eee;width:268px;padding:0 10px}.langEdit p, .langEdit .btnArea{white-space:normal}.langEdit li.en input, .mLangEdit li.en textarea{background:url(../img/flag.us.gif) no-repeat 99% 5px}.langEdit li.ko input, .mLangEdit li.ko textarea{background:url(../img/flag.kr.gif) no-repeat 99% 5px}.langEdit li.ja input, .mLangEdit li.ja textarea{background:url(../img/flag.jp.gif) no-repeat 99% 5px}.langEdit li.zh input, .mLangEdit li.zh textarea{background:url(../img/flag.cn.gif) no-repeat 99% 5px}.langEdit li.fr input, .mLangEdit li.fr textarea{background:url(../img/flag.fr.gif) no-repeat 99% 5px}.langEdit li.de input, .mLangEdit li.de textarea{background:url(../img/flag.de.gif) no-repeat 99% 5px}.langEdit li.ru input, .mLangEdit li.ru textarea{background:url(../img/flag.ru.gif) no-repeat 99% 5px}.langEdit li.es input, .mLangEdit li.es textarea{background:url(../img/flag.es.gif) no-repeat 99% 5px}.langEdit li.tr input, .mLangEdit li.tr textarea{background:url(../img/flag.tr.gif) no-repeat 99% 5px}.langEdit li.vi input, .mLangEdit li.vi textarea{background:url(../img/flag.vn.gif) no-repeat 99% 5px}.langEdit li.mn input, .mLangEdit li.mn textarea{background:url(../img/flag.mn.gif) no-repeat 99% 5px}.mLangEdit.en strong{background:url(../img/flag.us.gif) no-repeat 0 10px}.mLangEdit.ko strong{background:url(../img/flag.kr.gif) no-repeat 0 10px}.mLangEdit.ja strong{background:url(../img/flag.jp.gif) no-repeat 0 10px}.mLangEdit.zh strong{background:url(../img/flag.cn.gif) no-repeat 0 10px}.mLangEdit.fr strong{background:url(../img/flag.fr.gif) no-repeat 0 10px}.mLangEdit.de strong{background:url(../img/flag.de.gif) no-repeat 0 10px}.mLangEdit.ru strong{background:url(../img/flag.ru.gif) no-repeat 0 10px}.mLangEdit.es strong{background:url(../img/flag.es.gif) no-repeat 0 10px}.mLangEdit.tr strong{background:url(../img/flag.tr.gif) no-repeat 0 10px}.mLangEdit.vi strong{background:url(../img/flag.vn.gif) no-repeat 0 10px}.mLangEdit.mn strong{background:url(../img/flag.mn.gif) no-repeat 0 10px}.mLangEdit ul ul{border:0}.mLangEdit li{ position:relative;padding:0}.mLangEdit li strong{ display:inline-block;padding:6px 100px 8px 24px;font-weight:normal;line-height:1.5}.mLangEdit li .side{ position:absolute;top:8px;right:0;padding-right:18px;background:url(../img/iconArrow.gif) no-repeat right -160px}.mLangEdit li li{ border:0;padding-right:36px}.mLangEdit li textarea{ width:100%;height:16px;padding-right:30px;resize:vertical;line-height:1.4}.mLangEdit li label{ top:8px !important}.mLangEdit li.active strong{ font-weight:bold}.mLangEdit li.active .side{ background-position:right -128px}.modal .mLangEdit ul{padding-bottom:1em}.modal .mLangEdit li{border:0;padding-right:36px}/* Suggestion */.suggestion{display:none;position:absolute;background:#fff;z-index:10;_height:200px;max-height:200px;overflow:auto;*left:0;*margin-top:28px;box-shadow:3px 3px 6px #999;-moz-box-shadow:3px 3px 6px #999;-webkit-box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.suggestion ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0}.suggestion li{padding:0}.suggestion li:last-child{border-bottom:0}.suggestion li button{border:0;background:#fff;text-align:left;width:288px;padding:2px 4px;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.suggestion li button:hover,.suggestion li button:active,.suggestion li button:focus{background:#eee}/* Image Mark */#imageMark{right:0}/* Easy Installer */.easyNav{position:relative;border:1px solid #e9e9e9;zoom:1}.easyNav:after{content:"";display:block;clear:both}.easyNav h2{font-size:16px}.easyNav .category{width:30%;float:left;margin:0 2em;display:inline}.easyNav .filter{position:absolute;top:0;right:0;margin:1em 2em;text-align:right}.easyList td p{margin-top:0}.easyList td p.update{background:#ffc;padding:.5em 1em;border:1px solid #fc9;border-left:0;border-right:0;text-align:center}/* Font Preview */.fontPreview{width:96%;border:1px solid #e9e9e9;zoom:1;padding:1em 2em;margin:.5em 0}/* FTP Suggestion */#ftpSuggestion{background:#fff;box-shadow:3px 3px 6px #999;-moz-box-shadow:3px 3px 6px #999;-webkit-box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}#ftpSuggestion ul{border-left:1px solid #eee;border-right:1px solid #eee}#ftpSuggestion li{padding:0}#ftpSuggestion li button{border:0;background:#fff;text-align:left;width:288px}#ftpSuggestion li button:hover,#ftpSuggestion li button:active,#ftpSuggestion li button:focus{background:#eee}/* Theme & Skin Preview */.thumbPreview li{position:relative;padding-left:10px;padding-right:10px}.thumbPreview li.active.highlight{background:#f9f9f9}.thumbPreview .prevToggle{position:absolute;top:8px;right:10px;line-height:16px;padding:0 18px 0 0;text-decoration:none;background:url(../img/iconArrow.gif) no-repeat right -32px}.thumbPreview li.active .prevToggle{background-position:right 0}.thumbPreview .a{border:0;margin:0;zoom:1}.thumbPreview .a:after{content:"";display:block;clear:both}.thumbPreview .i{float:left;vertical-align:top;margin:0 1em 1em 0;padding:0;border:0;zoom:1}.thumbPreview .i:after{content:"";display:block;clear:both}.thumbPreview .i .thumb{position:relative;width:124px;height:84px;padding:0;margin-bottom:3px;text-align:center;overflow:hidden;border:1px solid #ddd;display:block;cursor:pointer;background:#fff}.thumbPreview .i .thumb .frame{position:absolute;width:120px;height:80px;left:0;top:0;border:2px solid #fff;overflow:hidden}.thumbPreview .i .thumb img{width:120px;margin:0}.thumbPreview .i label{display:block;position:relative;top:0;left:2px;width:122px;height:1.1em;margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.thumbPreview .i input{display:none}.thumbPreview .i ul{display:none}.thumbPreview .selected .i{display:block;float:none}.thumbPreview .selected .i .thumb{float:left;width:186px;height:126px;margin:0 1em 0 0;border:2px solid #eee}.thumbPreview .selected .i .thumb .frame{width:180px;height:120px;border-width:3px}.thumbPreview li.active.highlight .selected .i .thumb{border-color:#5ea8f6}.thumbPreview .selected .i .thumb img{width:180px;position:relative}.thumbPreview li.active .selected .i .thumb img{z-index:auto}.thumbPreview .selected .i label{cursor:text}.thumbPreview .selected .i ul{display:block;list-style:none;border:0;margin:1em 0 1em 200px}.thumbPreview .selected .i li{border:0;padding:0;margin:0 0 .2em 0}.thumbPreview.jx .i label{display:inline;width:auto}.thumbPreview.jx .i.noDirection{display:none}.thumbPreview.jx .i input{display:inline}#skin .showAll{float:right;border:0;overflow:visible;padding:0 18px 0 0;cursor:pointer;color:#00f;background:url(../img/iconArrow.gif) no-repeat right -32px}#skin .showAll.hideAll{background-position:right 0}/* Sign Up Form */.signUpForm li{position:relative}.signUpForm .side{position:absolute;top:8px;right:0}/* Favorite On | Off */.fvOff,.fvOn{display:inline-block;width:16px;height:16px;overflow:hidden;text-indent:16px;background:url(../img/iconFavorite.gif) no-repeat}.fvOn{background-position:0 -16px}/* Up-Down Dragable */.uDrag .wrap{position:relative;padding-left:20px}.uDrag .dragActive{background:#FFD}.uDrag .dragActive td{background:none !important}.uDrag .dragBtn{position:absolute;width:8px;height:100%;padding:0;overflow:hidden;background:url(../img/bgDragable.gif);top:1px;left:0;text-indent:12px;border:0;cursor:n-resize}/* Favicon Preview */.faviconPreview{position:relative;padding:60px 0 0 200px;background:url(../img/bgFavicon.gif) no-repeat}.faviconPreview img{position:absolute}.faviconPreview .fn1{top:30px;left:12px}.faviconPreview .fn2{top:55px;left:68px}/* Mobile Icon Preview */.mobiconPreview{position:relative;padding:252px 0 0 200px;background:url(../img/bgMobileTop.png) no-repeat}.mobiconPreview img{position:absolute;top:20px;left:10px}.mobiconPreview span{position:absolute;width:32px;text-align:center;top:52px;left:10px;color:#fff;font-size:9px}/* Text List */.textList{border:1px solid #ddd !important;line-height:1.5em;height:18.5em;overflow:auto}.textList li{border:0;padding:.25em 1em;height:1.5em;white-space:nowrap;overflow:hidden}.textList li:nth-child(even){background:#eee}.textList li a{float:right}/* Responsive Layout */@media only all and (max-width:860px){ .header h1{margin-left:.7em} .header .account{padding-right:1em} .header .siteTool{padding-right:1em} .header .siteTool .tgContent{right:1em} .body{padding:1em} .content{float:none;margin-left:0} .lnb{float:none;width:auto;margin:1em 0} .dashboard .portlet{float:none !important;width:auto !important;margin-right:0} .modal .fg, .wfsr .fg{width:auto} .easyNav .category{float:none;display:block;width:auto} .easyNav .filter{position:static}}@media only all and (max-width:640px){ .skipNav a{position:relative;width:auto;height:auto} .modal{position:absolute}} \ No newline at end of file From f94ab07b93ece9456d604bcbf98e66515c338526 Mon Sep 17 00:00:00 2001 From: taggon Date: Thu, 4 Aug 2011 08:31:35 +0000 Subject: [PATCH 0368/1372] Implement dragndrop to edit sitemaps (still working) git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8723 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/tpl/css/admin.css | 60 +++++++++++----------- modules/admin/tpl/img/iconMoveTo.gif | Bin 133 -> 118 bytes modules/admin/tpl/js/sitemap.js | 72 +++++++++++++++++++++++++++ 3 files changed, 104 insertions(+), 28 deletions(-) create mode 100644 modules/admin/tpl/js/sitemap.js diff --git a/modules/admin/tpl/css/admin.css b/modules/admin/tpl/css/admin.css index 632369b92..d783ee9c1 100644 --- a/modules/admin/tpl/css/admin.css +++ b/modules/admin/tpl/css/admin.css @@ -310,55 +310,59 @@ button.text{border:0;overflow:visible;padding:0;margin:0;color:#33a;background:n .siteMap .lined ul{padding:0;margin:0;border-top:1px solid #eee;zoom:1} .siteMap .lined li{position:relative;padding:0;margin:0;cursor:all-scroll;list-style:none;zoom:1} .siteMap .lined li li{border-top:1px solid #eee} -.siteMap li li{text-indent:32px} -.siteMap li li li{text-indent:64px} -.siteMap li li li li{text-indent:96px} -.siteMap li li li li li{text-indent:128px} -.siteMap li li li li li li{text-indent:160px} -.siteMap li li li li li li li{text-indent:192px} -.siteMap li li li li li li li li{text-indent:224px} -.siteMap li li li li li li li li li{text-indent:256px} -.siteMap li li li li li li li li li li{text-indent:288px} -.siteMap li li li li li li li li li li li{text-indent:320px} -.siteMap li li li li li li li li li li li li{text-indent:352px} +.siteMap li li{text-indent:18px} +.siteMap li li li{text-indent:36px} +.siteMap li li li li{text-indent:54px} +.siteMap li li li li li{text-indent:72px} +.siteMap li li li li li li{text-indent:90px} +.siteMap li li li li li li li{text-indent:108px} +.siteMap li li li li li li li li{text-indent:126px} +.siteMap li li li li li li li li li{text-indent:144px} +.siteMap li li li li li li li li li li{text-indent:162px} +.siteMap li li li li li li li li li li li{text-indent:180px} +.siteMap li li li li li li li li li li li li{text-indent:198px} .siteMap li *{vertical-align:middle} .siteMap li .moveTo+input{width:200px;border:0;padding:0 .5em} .siteMap li .moveTo+input:hover, .siteMap li .moveTo+input:active, .siteMap li .moveTo+input:focus{border:1px dotted #ccc;overflow:visible} -.siteMap .moveTo{position:relative;z-index:2;width:32px;height:32px;padding:32px 0 0 0;margin:0 .5em;_margin-top:-1px;overflow:hidden;background:#fff url(../img/iconMoveTo.gif) no-repeat;border:0} +.siteMap .moveTo{position:relative;z-index:2;width:22px;height:32px;padding:32px 0 0 0;margin:0 3px;_margin-top:-1px;overflow:hidden;background:#fff url(../img/iconMoveTo.gif) no-repeat center 0;border:0;cursor:move} +.siteMap li.active, +.siteMap li.active .moveTo{background-color:#f7f7f7} .siteMap li.active li, -.siteMap li.active ul{border-top-color:#fff} -.siteMap li.active .moveTo{background-position:0 -32px} -.siteMap .vr{display:none;position:absolute;z-index:1;left:16px;top:-16px;margin:0 .5em;height:100%;border-left:1px solid #ccc;overflow:hidden} -.siteMap .hr{display:none;position:absolute;z-index:1;left:16px;top:16px;margin:0 .5em;width:16px;border-top:1px solid #ccc;overflow:hidden} +.siteMap li.active ul{border-top-color:#f7f7f7} +.siteMap li.active .moveTo{background-position:center -32px} +.siteMap .vr, +.siteMap .hr{display:none;position:absolute;z-index:1;left:14px;border:0px solid #ccc;overflow:hidden} +.siteMap .vr{top:-16px;height:100%;border-left-width:1px} +.siteMap .hr{top:16px;width:16px;border-top-width:1px} .siteMap li.active .vr, .siteMap li.active li .hr{display:block} .siteMap li li .vr, -.siteMap li li li .hr{left:48px} +.siteMap li li li .hr{left:32px} .siteMap li li li .vr, -.siteMap li li li li .hr{left:80px} +.siteMap li li li li .hr{left:50px} .siteMap li li li li .vr, -.siteMap li li li li li .hr{left:112px} +.siteMap li li li li li .hr{left:68px} .siteMap li li li li li .vr, -.siteMap li li li li li li .hr{left:144px} +.siteMap li li li li li li .hr{left:86px} .siteMap li li li li li li .vr, -.siteMap li li li li li li li .hr{left:176px} +.siteMap li li li li li li li .hr{left:104px} .siteMap li li li li li li li .vr, -.siteMap li li li li li li li li .hr{left:208px} +.siteMap li li li li li li li li .hr{left:122px} .siteMap li li li li li li li li .vr, -.siteMap li li li li li li li li li .hr{left:240px} +.siteMap li li li li li li li li li .hr{left:140px} .siteMap li li li li li li li li li .vr, -.siteMap li li li li li li li li li li .hr{left:272px} +.siteMap li li li li li li li li li li .hr{left:158px} .siteMap li li li li li li li li li li .vr, -.siteMap li li li li li li li li li li li .hr{left:304px} +.siteMap li li li li li li li li li li li .hr{left:176px} .siteMap li li li li li li li li li li li .vr, .siteMap li li li li li li li li li li li li .hr{left:336px} -.siteMap .side{padding-top:0 !important;padding-bottom:0 !important;line-height:30px} +.siteMap .side{padding-top:0 !important;padding-bottom:0 !important;line-height:30px;background:transparent !important} .siteMap .side button{text-indent:0;line-height:1} -.siteMap .tgMap{position:absolute;top:12px;right:1em;padding:0 16px 0 0;line-height:16px;background:url(../img/iconArrow.gif) no-repeat right -126px} +.siteMap .tgMap{position:absolute; top:12px; right:1em; padding:0 16px 0 0; line-height:16px; background:url(../img/iconArrow.gif) no-repeat right -126px} .siteMap.fold .tgMap{background-position:right -158px} -.siteMap.fold .h2{border-bottom-color:#fff;border-radius:5px} +.siteMap.fold .h2{border-bottom-color:#fff; border-radius:5px} /* Button Area */ .btnArea{margin:1em 0;text-align:right;zoom:1} .btnArea:after{content:"";display:block;clear:both} diff --git a/modules/admin/tpl/img/iconMoveTo.gif b/modules/admin/tpl/img/iconMoveTo.gif index 6e01d4f853b8be73e73588fa3b7185d854de5648..45ce5b342f0a0c86c0df59310ebb5beb0c76ead8 100644 GIT binary patch literal 118 zcmV-+0Ez!cNk%w1VG;m90Du4hnVFgY|NkNR1OWg50RSuj0000I06+i$0!@sMsmtvT zqnxzbOF;&DcG!guN0y@@MxV-M*bB$f+$aD5J3B%#V*mgE literal 133 zcmV;00DAvNNk%w1VITlN0Du7inVFgY|NkNR1OWg50RSuj0000W06+i$0$hxbsmtvT zqnxzbi?iOmdkTC9K#E5Ap(;nVE_=qQ8MHJ?=lag~{tpZahs2`sh}@J!FOO^K#HFMe nDYSOEYN?Q?_X+xnD_g{MVzqY8Yp%vSWh>puy8Vv76aWA_(#kt| diff --git a/modules/admin/tpl/js/sitemap.js b/modules/admin/tpl/js/sitemap.js new file mode 100644 index 000000000..ea5c6177a --- /dev/null +++ b/modules/admin/tpl/js/sitemap.js @@ -0,0 +1,72 @@ +/* NHN (developers@xpressengine.com) */ +jQuery(function($){ + +$('form.siteMap') + .find('li') + .prepend('') + .append('') + .mouseover(function(){ + $(this).addClass('active'); + return false; + }) + .mouseout(function(){ + $(this).removeClass('active'); + return false; + }) + .mousedown(function(event){ + var $this, $clone, $target = $(event.target), $uls, $ghost, $last; + + if($target.is('a,input:text,textarea')) return; + + $this = $(this); + $clone = $this.clone(true).find('.side,input').remove().end(); + $uls = $this.parentsUntil('form.siteMap').filter('ul'); + + $ghost = $last = $('
        + + FileBox + 파일박스 + FileBox + FileBox + FileBox + FileBox + FileBox + FileBox + FileBox + FileBox + FileBox +
        diff --git a/modules/module/module.admin.view.php b/modules/module/module.admin.view.php index 0d00f6a77..f50a99990 100644 --- a/modules/module/module.admin.view.php +++ b/modules/module/module.admin.view.php @@ -210,5 +210,16 @@ // Set a template file $this->setTemplateFile('module_langcode'); } + + function dispModuleAdminFileBox(){ + $oModuleModel = &getModel('module'); + $output = $oModuleModel->getModuleFileBoxList(); + $page = Context::get('page'); + $page = $page?$page:1; + Context::set('filebox_list', $output->data); + Context::set('page_navigation', $output->page_navigation); + Context::set('page', $page); + $this->setTemplateFile('adminFileBox'); + } } ?> diff --git a/modules/module/module.controller.php b/modules/module/module.controller.php index 99cec24a4..2f9688d25 100644 --- a/modules/module/module.controller.php +++ b/modules/module/module.controller.php @@ -650,10 +650,9 @@ if (!$ajax) { - $url = getUrl('','module','module','act','dispModuleFileBox','input',Context::get('input'),'filter',$vars->filter); - $url = html_entity_decode($url); - $vars = Context::set('url',$url); - $this->setTemplateFile('move_filebox_list'); + $returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'module', 'admin', 'act', 'dispModuleAdminFileBox'); + header('location:'.$returnUrl); + return; } else { diff --git a/modules/module/tpl/adminFileBox.html b/modules/module/tpl/adminFileBox.html new file mode 100644 index 000000000..6048fb135 --- /dev/null +++ b/modules/module/tpl/adminFileBox.html @@ -0,0 +1,80 @@ + +

        File Box

        +
        +
        + + + + + +

        파일 올리기

        + 보기/숨김 +
        +

        +
        + +

        +
        + +
        +
        +
        +
        +
          +
        • +

          {$val->comment}

          +

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

          + +
        • +
        +
        +
        +
        + + + + + + + + + + « FIRST + + + 1 + ... + + + + {@$last_page = $page_no} + {$page_no} + {$page_no} + + + + ... + {$page_navigation->last_page} + + + LAST » + + + + + +
        From 0c48f083d2ac873fff536477cc6a03c42cb773d1 Mon Sep 17 00:00:00 2001 From: flyskyko Date: Mon, 5 Sep 2011 07:34:01 +0000 Subject: [PATCH 0577/1372] move lang code findsite from admin module to common git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9026 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/lang/lang.xml | 4 +++ modules/admin/lang/lang.xml | 50 ++++++++++++++++--------------------- 2 files changed, 25 insertions(+), 29 deletions(-) diff --git a/common/lang/lang.xml b/common/lang/lang.xml index b79d140bb..f74996ee6 100644 --- a/common/lang/lang.xml +++ b/common/lang/lang.xml @@ -3736,4 +3736,8 @@ Xin vui lòng kiểm tra lại thông tin Database.]]> + + + + diff --git a/modules/admin/lang/lang.xml b/modules/admin/lang/lang.xml index 896ccead4..b83741f6a 100644 --- a/modules/admin/lang/lang.xml +++ b/modules/admin/lang/lang.xml @@ -7,7 +7,7 @@ - + @@ -248,7 +248,7 @@ - + @@ -553,18 +553,18 @@ Lütfen son sürümü için indirme linkine tıklayınız.]]> - + - - + + - + - + @@ -759,7 +759,7 @@ Lütfen son sürümü için indirme linkine tıklayınız.]]> - + @@ -780,10 +780,6 @@ Lütfen son sürümü için indirme linkine tıklayınız.]]> - - - - @@ -815,7 +811,7 @@ Lütfen son sürümü için indirme linkine tıklayınız.]]> - + @@ -827,7 +823,7 @@ Lütfen son sürümü için indirme linkine tıklayınız.]]> - + @@ -847,39 +843,39 @@ Lütfen son sürümü için indirme linkine tıklayınız.]]> - + IP대역 정보는 /files/config/db.config.php 파일에 저장됩니다.
        예1) 123.45.67.* 예2) 123.76.54.32 ]]>
        -
        + IP대역 정보는 /files/config/db.config.php 파일에 저장됩니다.
        예1) 123.45.67.* 예2) 123.76.54.32 ]]>
        -
        + - + favicon.ico 파일만 업로드 가능.]]> favicon.ico 파일만 업로드 가능.]]> - + - + mobicon.png 파일만 업로드 가능.]]> mobicon.png 파일만 업로드 가능.]]> - + - + - + @@ -891,15 +887,11 @@ Lütfen son sürümü için indirme linkine tıklayınız.]]> - - - - - + - + From 3a7b0a4b64bf7fe1b1b2975f5287a8925c157a8e Mon Sep 17 00:00:00 2001 From: ovclas Date: Mon, 5 Sep 2011 07:41:43 +0000 Subject: [PATCH 0578/1372] issue 70 site map admin developement. but not yet completed. should be javascript drwaing menu git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9027 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/menu/menu.admin.controller.php | 107 ++++++++++++++----------- modules/menu/menu.admin.view.php | 12 ++- modules/menu/tpl/sitemap.html | 4 +- 3 files changed, 69 insertions(+), 54 deletions(-) diff --git a/modules/menu/menu.admin.controller.php b/modules/menu/menu.admin.controller.php index 3c07cb486..dd05f101e 100644 --- a/modules/menu/menu.admin.controller.php +++ b/modules/menu/menu.admin.controller.php @@ -6,6 +6,10 @@ **/ class menuAdminController extends menu { + var $menuSrl = null; + var $itemKeyList = array(); + var $map = array(); + var $checked = array(); /** * @brief Initialization @@ -247,70 +251,47 @@ **/ function procMenuAdminArrangeItem() { - $menuSrl = Context::get('menu_srl'); + $this->menuSrl = Context::get('menu_srl'); $args->title = Context::get('title'); $parentKeyList = Context::get('parent_key'); - $itemKeyList = Context::get('item_key'); - debugPrint($parentKeyList); - debugPrint($itemKeyList); + $this->itemKeyList = Context::get('item_key'); // menu name update - /*$args->menu_srl = $menuSrl; + /*$args->menu_srl = $this->menuSrl; $output = executeQuery('menu.updateMenu', $args); if(!$output->toBool()) return $output;*/ - if(is_array($parentKeyList)) + $this->map = array(); + foreach($parentKeyList as $no=>$srl) { - $menuList = array(); - foreach($parentKeyList AS $key=>$value) - { - if($value == 0) $menuList[$itemKeyList[$key]] = array(); + if ($srl === 0) continue; + if (!is_array($this->map[$srl]))$this->map[$srl] = array(); + $this->map[$srl][] = $no; + } + + $result = array(); + foreach($this->itemKeyList as $srl) + { + if (!$this->checked[$srl]){ + unset($target); + $this->checked[$srl] = 1; + $target->node = $srl; + $target->child= array(); + + while(count($this->map[$srl])){ + $this->_setParent($srl, array_shift($this->map[$srl]), $target); + } + $result[] = $target; } } - debugPrint($menuList); - exit; - if(is_array($itemKeyList)) + if(is_array($result)) { - foreach($itemKeyList AS $key=>$value) + foreach($result AS $key=>$node) { - if($parentKeyList[$key] != 0) - { - $menuList[$parentKeyList[$key]][$value] = true; - } + $this->_recursiveMoveMenuItem($node); } } - debugPrint($menuList); - exit; - - // menu item sorting - if(is_array($childKeyList)) - { - $menuList = array(); - foreach($childKeyList AS $key=>$value) - { - preg_match('/BEGIN_([0-9]*.)/is', $value, $m); - if($m) - { - $menuList[$m[1]] = array(); - $parentSrl = $m[1]; - } - else $menuList[$parentSrl][$value] = true; - } - - /*foreach($menuList AS $key=>$value) - { - if(count($value) > 0) - { - $sourceSrl = 0; - foreach($value AS $key2=>$value2) - { - $this->moveMenuItem($menuSrl, $key, $sourceSrl, $key2, 'move'); - $sourceSrl = $key2; - } - } - }*/ - } $this->setMessage('success_updated', 'info'); if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) { @@ -320,6 +301,34 @@ } } + function _setParent($parent_srl, $child_index, &$target) + { + $child_srl = $this->itemKeyList[$child_index]; + $this->checked[$child_srl] = 1; + + $child_node->node = $child_srl; + $child_node->parent_node = $parent_srl; + $child_node->child = array(); + $target->child[] = $child_node; + + while(count($this->map[$child_srl])){ + $this->_setParent($child_srl, array_shift($this->map[$child_srl]), $child_node); + } + //return $target; + } + + function _recursiveMoveMenuItem($result) + { + while(count($result->child)) + { + unset($node); + $node = array_shift($result->child); + + $this->moveMenuItem($this->menuSrl, $node->parent_node, 0, $node->node, 'move'); + $this->_recursiveMoveMenuItem($node); + } + } + function moveMenuItem($menu_srl,$parent_srl,$source_srl,$target_srl,$mode){ // Get the original menus $oMenuAdminModel = &getAdminModel('menu'); diff --git a/modules/menu/menu.admin.view.php b/modules/menu/menu.admin.view.php index ef37b2906..899a01b2e 100644 --- a/modules/menu/menu.admin.view.php +++ b/modules/menu/menu.admin.view.php @@ -103,6 +103,8 @@ { $oMenuAdminModel = &getAdminModel('menu'); $output = $oMenuAdminModel->getMenus(); + + $menuList = array(); if(is_array($output)) { $columnList = array('menu_item_srl', 'parent_srl', 'menu_srl', 'name'); @@ -111,12 +113,16 @@ if($value->title == '__XE_ADMIN__') unset($output[$key]); else { - $menuItems = $oMenuAdminModel->getMenuItems($value->menu_srl, null, $columnList); - $value->menuItems = $this->_arrangeMenuItem($menuItems->data); + unset($menu); + $value->xml_file = sprintf('./files/cache/menu/%s.xml.php',$value->menu_srl); + //$value->php_file = sprintf('./files/cache/menu/%s.php',$value->menu_srl); + //if(file_exists($value->php_file)) @include($value->php_file); + + array_push($menuList, $value->xml_file); } } } - Context::set('menu_list', $output); + Context::set('menu_url_list', $menuList); // get installed module list $oModuleModel = &getModel('module'); diff --git a/modules/menu/tpl/sitemap.html b/modules/menu/tpl/sitemap.html index 144f99645..3d6dba255 100644 --- a/modules/menu/tpl/sitemap.html +++ b/modules/menu/tpl/sitemap.html @@ -20,13 +20,13 @@
      • - {$value2['name']} Preview + {$value2['name']} {$key2} Preview Edit... | Delete
      • From a9cc4543fe940100d87de5c7f8d9cef659f8fbfd Mon Sep 17 00:00:00 2001 From: devjin Date: Mon, 5 Sep 2011 07:44:03 +0000 Subject: [PATCH 0579/1372] add member moduleconfig git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9028 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/member/member.admin.view.php | 83 ---------------------------- modules/member/member.class.php | 57 +++++++++++++++++++ 2 files changed, 57 insertions(+), 83 deletions(-) diff --git a/modules/member/member.admin.view.php b/modules/member/member.admin.view.php index a385a8860..200a35d45 100644 --- a/modules/member/member.admin.view.php +++ b/modules/member/member.admin.view.php @@ -90,46 +90,6 @@ // Get join form list which is additionally set $extendItems = $oMemberModel->getJoinFormList(); - // check signup form ordering info - if (!$config->signupForm || !is_array($config->signupForm)){ - $items = array('user_id', 'password', 'user_name', 'nick_name', 'email_address', 'find_account_question', 'homepage', 'blog', 'birthday', 'signature', 'profile_image', 'image_name', 'image_mark'); - $mustRequireds = array('email_address', 'password', 'find_account_question'); - $orgRequireds = array('email_address', 'password', 'find_account_question', 'user_id', 'nick_name', 'user_name'); - $orgUse = array('email_address', 'password', 'find_account_question', 'user_id', 'nick_name', 'user_name', 'homepage', 'blog', 'birthday'); - $list_order = array(); - foreach($items as $key){ - unset($signupItem); - $signupItem->isDefaultForm = true; - $signupItem->name = $key; - $signupItem->title = $lang->{$key}; - $signupItem->mustRequired = in_array($key, $mustRequireds); - $signupItem->imageType = (strpos($key, 'image') !== false); - $signupItem->required = in_array($key, $orgRequireds); - $signupItem->isUse = ($config->{$key} == 'Y') || in_array($key, $orgUse); - if ($signupItem->imageType){ - $signupItem->max_width = $config->{$key.'_max_width'}; - $signupItem->max_height = $config->{$key.'_max_height'}; - } - $list_order[] = $signupItem; - } - foreach($extendItems as $form_srl=>$item_info){ - unset($signupItem); - $signupItem->name = $item_info->column_name; - $signupItem->title = $item_info->column_title; - $signupItem->type = $item_info->column_type; - $signupItem->member_join_form_srl = $form_srl; - $signupItem->mustRequired = in_array($key, $mustRequireds); - $signupItem->required = ($item_info->required == 'Y'); - $signupItem->isUse = ($item_info->is_active == 'Y'); - $signupItem->description = $item_info->description; - if ($signupItem->imageType){ - $signupItem->max_width = $config->{$key.'_max_width'}; - $signupItem->max_height = $config->{$key.'_max_height'}; - } - $list_order[] = $signupItem; - } - $config->signupForm = $list_order; - } Context::set('config',$config); // list of skins for member module @@ -212,49 +172,6 @@ $formTags = array(); global $lang; - if (!$member_config->signupForm || !is_array($member_config->signupForm)){ - $items = array('user_id', 'password', 'user_name', 'nick_name', 'email_address', 'find_account_question', 'homepage', 'blog', 'birthday', 'signature', 'profile_image', 'image_name', 'image_mark'); - $mustRequireds = array('email_address', 'password', 'find_account_question'); - $orgRequireds = array('email_address', 'password', 'find_account_question', 'user_id', 'nick_name', 'user_name'); - $orgUse = array('email_address', 'password', 'find_account_question', 'user_id', 'nick_name', 'user_name', 'homepage', 'blog', 'birthday'); - $list_order = array(); - foreach($items as $key){ - unset($signupItem); - $signupItem->isDefaultForm = true; - $signupItem->name = $key; - $signupItem->title = $lang->{$key}; - $signupItem->mustRequired = in_array($key, $mustRequireds); - $signupItem->imageType = (strpos($key, 'image') !== false); - $signupItem->required = in_array($key, $orgRequireds); - $signupItem->isUse = ($config->{$key} == 'Y') || in_array($key, $orgUse); - if ($signupItem->imageType){ - $signupItem->max_width = $config->{$key.'_max_width'}; - $signupItem->max_height = $config->{$key.'_max_height'}; - } - $list_order[] = $signupItem; - } - - if (is_array($extendItems)){ - foreach($extendItems as $form_srl=>$item_info){ - unset($signupItem); - $signupItem->name = $item_info->column_name; - $signupItem->title = $item_info->column_title; - $signupItem->type = $item_info->column_type; - $signupItem->member_join_form_srl = $form_srl; - $signupItem->mustRequired = in_array($key, $mustRequireds); - $signupItem->required = ($item_info->required == 'Y'); - $signupItem->isUse = ($item_info->is_active == 'Y'); - $signupItem->description = $item_info->description; - if ($signupItem->imageType){ - $signupItem->max_width = $config->{$key.'_max_width'}; - $signupItem->max_height = $config->{$key.'_max_height'}; - } - $list_order[] = $signupItem; - } - } - $member_config->signupForm = $list_order; - } - foreach($member_config->signupForm as $no=>$formInfo){ if (!$formInfo->isUse)continue; if ($formInfo->name == 'email_address') continue; diff --git a/modules/member/member.class.php b/modules/member/member.class.php index bf24732c5..2232d622e 100644 --- a/modules/member/member.class.php +++ b/modules/member/member.class.php @@ -147,6 +147,11 @@ if(!$oDB->isColumnExists("member", "list_order")) return true; if(!$oDB->isIndexExists("member","idx_list_order")) return true; + $oMemberModel = &getModel('member'); + $config = $oMemberModel->getMemberConfig(); + // check signup form ordering info + if (!$config->signupForm) return true; + return false; } @@ -213,6 +218,58 @@ $oDB->addIndex("member","idx_list_order", array("list_order")); } + $oMemberModel = &getModel('member'); + $config = $oMemberModel->getMemberConfig(); + + // check signup form ordering info + if (!$config->signupForm || !is_array($config->signupForm)){ + global $lang; + $oModuleController = &getController('module'); + // Get join form list which is additionally set + $extendItems = $oMemberModel->getJoinFormList(); + + $items = array('user_id', 'password', 'user_name', 'nick_name', 'email_address', 'find_account_question', 'homepage', 'blog', 'birthday', 'signature', 'profile_image', 'image_name', 'image_mark'); + $mustRequireds = array('email_address', 'password', 'find_account_question'); + $orgRequireds = array('email_address', 'password', 'find_account_question', 'user_id', 'nick_name', 'user_name'); + $orgUse = array('email_address', 'password', 'find_account_question', 'user_id', 'nick_name', 'user_name', 'homepage', 'blog', 'birthday'); + $list_order = array(); + foreach($items as $key){ + unset($signupItem); + $signupItem->isDefaultForm = true; + $signupItem->name = $key; + $signupItem->title = $lang->{$key}; + $signupItem->mustRequired = in_array($key, $mustRequireds); + $signupItem->imageType = (strpos($key, 'image') !== false); + $signupItem->required = in_array($key, $orgRequireds); + $signupItem->isUse = ($config->{$key} == 'Y') || in_array($key, $orgUse); + if ($signupItem->imageType){ + $signupItem->max_width = $config->{$key.'_max_width'}; + $signupItem->max_height = $config->{$key.'_max_height'}; + } + $list_order[] = $signupItem; + } + if (is_array($extendItems)){ + foreach($extendItems as $form_srl=>$item_info){ + unset($signupItem); + $signupItem->name = $item_info->column_name; + $signupItem->title = $item_info->column_title; + $signupItem->type = $item_info->column_type; + $signupItem->member_join_form_srl = $form_srl; + $signupItem->mustRequired = in_array($key, $mustRequireds); + $signupItem->required = ($item_info->required == 'Y'); + $signupItem->isUse = ($item_info->is_active == 'Y'); + $signupItem->description = $item_info->description; + if ($signupItem->imageType){ + $signupItem->max_width = $config->{$key.'_max_width'}; + $signupItem->max_height = $config->{$key.'_max_height'}; + } + $list_order[] = $signupItem; + } + } + $config->signupForm = $list_order; + $output = $oModuleController->updateModuleConfig('member', $config); + } + return new Object(0, 'success_updated'); } From 425b02531f5b474f9ac7c7eff1f7b091de467545 Mon Sep 17 00:00:00 2001 From: flyskyko Date: Mon, 5 Sep 2011 07:51:52 +0000 Subject: [PATCH 0580/1372] addon module not yet complete git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9029 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/addon/addon.admin.controller.php | 104 ++++++++++++-- modules/addon/addon.admin.model.php | 50 +++++-- modules/addon/addon.admin.view.php | 18 ++- modules/addon/addon.class.php | 30 ++++- modules/addon/addon.controller.php | 18 ++- modules/addon/conf/module.xml | 9 +- modules/addon/lang/ko.lang.php | 20 +++ modules/addon/lang/lang.xml | 18 ++- modules/addon/queries/insertSiteAddon.xml | 2 + modules/addon/queries/updateAddon.xml | 1 + modules/addon/ruleset/updateAddonSetup.xml | 8 ++ modules/addon/schemas/addons.xml | 1 + modules/addon/tpl/addon_list.html | 132 +++++++++--------- modules/addon/tpl/setup_addon.html | 150 +++++++-------------- 14 files changed, 352 insertions(+), 209 deletions(-) create mode 100644 modules/addon/lang/ko.lang.php create mode 100644 modules/addon/ruleset/updateAddonSetup.xml diff --git a/modules/addon/addon.admin.controller.php b/modules/addon/addon.admin.controller.php index 8d3bad635..170d04e66 100644 --- a/modules/addon/addon.admin.controller.php +++ b/modules/addon/addon.admin.controller.php @@ -14,6 +14,88 @@ function init() { } + /** + * @brief Set addon activate + **/ + function procAddonAdminSaveActivate() + { + $pc = Context::get('pc'); + $mobile = Context::get('mobile'); + $fixed = Context::get('fixed'); + $favorite = Context::get('favorite'); + + if (!$pc) $pc = array(); + if (!$mobile) $mobile = array(); + if (!$fixed) $fixed = array(); + if (!$favorite) $favorite = array(); + + // get current addon info + $oModel = &getAdminModel('addon'); + $currentAddonList = $oModel->getAddonList(0, 'global'); + + // get need update addon list + $updateList = array(); + foreach($currentAddonList as $addon) + { + if ($addon->activated !== in_array($addon->addon_name, $pc)) + { + $updateList[] = $addon->addon_name; + continue; + } + + if ($addon->mactivated !== in_array($addon->addon_name, $mobile)) + { + $updateList[] = $addon->addon_name; + continue; + } + + if ($addon->fixed !== in_array($addon->addon_name, $fixed)) + { + $updateList[] = $addon->addon_name; + continue; + } + } + + // update + foreach($updateList as $targetAddon) + { + unset($args); + + if (in_array($targetAddon, $pc)) + $args->is_used = 'Y'; + else + $args->is_used = 'N'; + + if (in_array($targetAddon, $mobile)) + $args->is_used_m = 'Y'; + else + $args->is_used_m = 'N'; + + if (in_array($targetAddon, $fixed)) + $args->fixed = 'Y'; + else + $args->fixed = 'N'; + + $args->addon = $targetAddon; + + $output = executeQuery('addon.updateAddon', $args); + if (!$output->toBool()) return $output; + } + + if (count($updateList)) + { + $this->makeCacheFile(0, 'pc', 'global'); + $this->makeCacheFile(0, 'mobile', 'global'); + } + + // set favorite + $oAdminController = &getAdminController('admin'); + $output = $oAdminController->setFavoritesByModule(-1, 'addon', $favorite); + if (!$output->toBool()) return $output; + + $this->setRedirectUrl(getNotEncodedUrl('', 'module', 'admin', 'act', 'dispAddonAdminIndex')); + } + /** * @brief Add active/inactive change **/ @@ -45,13 +127,17 @@ unset($args->act); unset($args->addon_name); unset($args->body); + unset($args->error_return_url); $site_module_info = Context::get('site_module_info'); - $this->doSetup($addon_name, $args, $site_module_info->site_srl); + $output = $this->doSetup($addon_name, $args, $site_module_info->site_srl, 'global'); + if (!$output->toBool()) return $output; - $this->makeCacheFile($site_module_info->site_srl, "pc"); - $this->makeCacheFile($site_module_info->site_srl, "mobile"); + $this->makeCacheFile($site_module_info->site_srl, "pc", 'global'); + $this->makeCacheFile($site_module_info->site_srl, "mobile", 'global'); + + $this->setRedirectUrl(getNotEncodedUrl('', 'module', 'admin', 'act', 'dispAddonAdminSetup', 'selected_addon', $addon_name)); } @@ -60,10 +146,10 @@ * @brief Add-on * Adds Add to DB **/ - function doInsert($addon, $site_srl = 0) { + function doInsert($addon, $site_srl = 0, $gtype = 'site') { $args->addon = $addon; $args->is_used = 'N'; - if(!$site_srl) return executeQuery('addon.insertAddon', $args); + if($gtype == 'global') return executeQuery('addon.insertAddon', $args); $args->site_srl = $site_srl; return executeQuery('addon.insertSiteAddon', $args); } @@ -72,11 +158,11 @@ * @brief Add-activated * addons add-ons to the table on the activation state sikyeojum **/ - function doActivate($addon, $site_srl = 0, $type = "pc") { + function doActivate($addon, $site_srl = 0, $type = "pc", $gtype = 'site') { $args->addon = $addon; if($type == "pc") $args->is_used = 'Y'; else $args->is_used_m = "Y"; - if(!$site_srl) return executeQuery('addon.updateAddon', $args); + if($gtype == 'global') return executeQuery('addon.updateAddon', $args); $args->site_srl = $site_srl; return executeQuery('addon.updateSiteAddon', $args); } @@ -86,11 +172,11 @@ * * addons add a table to remove the name of the deactivation is sikige **/ - function doDeactivate($addon, $site_srl = 0, $type = "pc") { + function doDeactivate($addon, $site_srl = 0, $type = "pc", $gtype = 'site') { $args->addon = $addon; if($type == "pc") $args->is_used = 'N'; else $args->is_used_m = 'N'; - if(!$site_srl) return executeQuery('addon.updateAddon', $args); + if($gtype == 'global') return executeQuery('addon.updateAddon', $args); $args->site_srl = $site_srl; return executeQuery('addon.updateSiteAddon', $args); } diff --git a/modules/addon/addon.admin.model.php b/modules/addon/addon.admin.model.php index f3032b4ee..191416e06 100644 --- a/modules/addon/addon.admin.model.php +++ b/modules/addon/addon.admin.model.php @@ -22,12 +22,40 @@ return ""; } + /** + * @brief Get addon list for super admin + **/ + function getAddonListForSuperAdmin() + { + $addonList = $this->getAddonList(0, 'global'); + + $oAutoinstallModel = &getModel('autoinstall'); + foreach($addonList as $key => $addon) + { + // get easyinstall remove url + $packageSrl = $oAutoinstallModel->getPackageSrlByPath($addon->path); + $addonList[$key]->remove_url = $oAutoinstallModel->getRemoveUrlByPackageSrl($packageSrl); + + // get easyinstall need update + $package = $oAutoinstallModel->getInstalledPackages($packageSrl); + $addonList[$key]->need_update = $package[$packageSrl]->need_update; + + // get easyinstall update url + if ($addonList[$key]->need_update == 'Y') + { + $addonList[$key]->update_url = $oAutoinstallModel->getUpdateUrlByPackageSrl($packageSrl); + } + } + + return $addonList; + } + /** * @brief Wanted to add the kind of information and **/ - function getAddonList($site_srl = 0) { + function getAddonList($site_srl = 0, $gtype = 'site') { // Wanted to add a list of activated - $inserted_addons = $this->getInsertedAddons($site_srl); + $inserted_addons = $this->getInsertedAddons($site_srl, $gtype); // Downloaded and installed add-on to the list of Wanted $searched_list = FileHandler::readDir('./addons','/^([a-zA-Z0-9-_]+)$/'); $searched_count = count($searched_list); @@ -44,20 +72,22 @@ $path = $this->getAddonPath($addon_name); // Wanted information on the add-on unset($info); - $info = $this->getAddonInfoXml($addon_name, $site_srl); + $info = $this->getAddonInfoXml($addon_name, $site_srl, $gtype); $info->addon = $addon_name; $info->path = $path; $info->activated = false; $info->mactivated = false; + $info->fixed = false; // Check if a permossion is granted entered in DB if(!in_array($addon_name, array_keys($inserted_addons))) { // If not, type in the DB type (model, perhaps because of the hate doing this haneungeo .. ㅡ. ㅜ) - $oAddonAdminController->doInsert($addon_name, $site_srl); + $oAddonAdminController->doInsert($addon_name, $site_srl, $type); // Is activated } else { if($inserted_addons[$addon_name]->is_used=='Y') $info->activated = true; if($inserted_addons[$addon_name]->is_used_m=='Y') $info->mactivated = true; + if ($gtype == 'global' && $inserted_addons[$addon_name]->is_fixed == 'Y') $info->fixed = true; } $list[] = $info; @@ -68,7 +98,7 @@ /** * @brief Modules conf/info.xml wanted to read the information **/ - function getAddonInfoXml($addon, $site_srl = 0) { + function getAddonInfoXml($addon, $site_srl = 0, $gtype = 'site') { // Get a path of the requested module. Return if not exists. $addon_path = $this->getAddonPath($addon); if(!$addon_path) return; @@ -85,7 +115,7 @@ // DB is set to bring history $db_args->addon = $addon; - if(!$site_srl) $output = executeQuery('addon.getAddonInfo',$db_args); + if($gtype == 'global') $output = executeQuery('addon.getAddonInfo',$db_args); else { $db_args->site_srl = $site_srl; $output = executeQuery('addon.getSiteAddonInfo',$db_args); @@ -267,9 +297,9 @@ /** * @brief Add to the list of active guhaeom **/ - function getInsertedAddons($site_srl = 0) { + function getInsertedAddons($site_srl = 0, $gtype = 'site') { $args->list_order = 'addon'; - if(!$site_srl) $output = executeQuery('addon.getAddons', $args); + if($gtype == 'global') $output = executeQuery('addon.getAddons', $args); else { $args->site_srl = $site_srl; $output = executeQuery('addon.getSiteAddons', $args); @@ -288,9 +318,9 @@ /** * @brief Add-on is enabled, check whether **/ - function isActivatedAddon($addon, $site_srl = 0, $type = "pc") { + function isActivatedAddon($addon, $site_srl = 0, $type = "pc", $gtype = 'site') { $args->addon = $addon; - if(!$site_srl) { + if($gtype == 'global') { if($type == "pc") $output = executeQuery('addon.getAddonIsActivated', $args); else $output = executeQuery('addon.getMAddonIsActivated', $args); } diff --git a/modules/addon/addon.admin.view.php b/modules/addon/addon.admin.view.php index 19d577a3a..2ce07849e 100644 --- a/modules/addon/addon.admin.view.php +++ b/modules/addon/addon.admin.view.php @@ -18,11 +18,20 @@ * @brief Add Management main page (showing the list) **/ function dispAddonAdminIndex() { + $oAdminModel = &getAdminModel('admin'); + $siteModuleInfo = Context::get('site_module_info'); + $output = $oAdminModel->getFavoriteListByModule(-1, 'addon'); + if (!$output->toBool()) return $output; + + $favoriteList = $output->get('list'); + Context::set('favoriteList', $favoriteList); + $site_module_info = Context::get('site_module_info'); // Add to the list settings $oAddonModel = &getAdminModel('addon'); - $addon_list = $oAddonModel->getAddonList($site_module_info->site_srl); + $addon_list = $oAddonModel->getAddonListForSuperAdmin(); Context::set('addon_list', $addon_list); + Context::set('addon_count', count($addon_list)); // Template specifies the path and file $this->setTemplateFile('addon_list'); } @@ -36,7 +45,7 @@ $selected_addon = Context::get('selected_addon'); // Wanted to add the requested information $oAddonModel = &getAdminModel('addon'); - $addon_info = $oAddonModel->getAddonInfoXml($selected_addon, $site_module_info->site_srl); + $addon_info = $oAddonModel->getAddonInfoXml($selected_addon, $site_module_info->site_srl, 'global'); Context::set('addon_info', $addon_info); // Get a mid list $oModuleModel = &getModel('module'); @@ -52,7 +61,7 @@ if($mid_list) { foreach($mid_list as $module_srl => $module) { - $module_categories[$module->module_category_srl]->list[$module_srl] = $module; + $module_categories[$module->module_category_srl]->list[$module_srl] = $module; } } } else { @@ -60,8 +69,7 @@ } Context::set('mid_list',$module_categories); - // Set the layout to be pop-up - $this->setLayoutFile('popup_layout'); + // Template specifies the path and file $this->setTemplateFile('setup_addon'); } diff --git a/modules/addon/addon.class.php b/modules/addon/addon.class.php index cff25879d..1fb73b09b 100644 --- a/modules/addon/addon.class.php +++ b/modules/addon/addon.class.php @@ -42,6 +42,10 @@ $oDB = &DB::getInstance(); if(!$oDB->isColumnExists("addons", "is_used_m")) return true; if(!$oDB->isColumnExists("addons_site", "is_used_m")) return true; + + // 2011. 7. 29. add is_fixed column + if (!$oDB->isColumnExists('addons', 'is_fixed')) return true; + return false; } @@ -53,10 +57,32 @@ if(!$oDB->isColumnExists("addons", "is_used_m")) { $oDB->addColumn("addons", "is_used_m", "char", 1, "N", true); } - if(!$oDB->isColumnExists("addons_site", "is_used_m")) { + if(!$oDB->isColumnExists("addons_site", "is_used_m")) { $oDB->addColumn("addons_site", "is_used_m", "char", 1, "N", true); } - return new Object(); + + // 2011. 7. 29. add is_fixed column + if (!$oDB->isColumnExists('addons', 'is_fixed')) + { + $oDB->addColumn('addons', 'is_fixed', 'char', 1, 'N', true); + + // move addon info to addon_site table + $output = executeQueryArray('addon.getAddons'); + if ($output->data) + { + foreach($output->data as $row) + { + $args->site_srl = 0; + $args->addon = $row->addon; + $args->is_used = $row->is_used; + $args->is_used_m = $row->is_used_m; + $args->extra_vars = $row->extra_vars; + executeQuery('addon.insertSiteAddon', $args); + } + } + } + + return new Object(0, 'success_updated'); } /** diff --git a/modules/addon/addon.controller.php b/modules/addon/addon.controller.php index c5141118e..7692c17e6 100644 --- a/modules/addon/addon.controller.php +++ b/modules/addon/addon.controller.php @@ -118,15 +118,15 @@ /** * @brief Re-generate the cache file **/ - function makeCacheFile($site_srl = 0, $type = "pc") { + function makeCacheFile($site_srl = 0, $type = "pc", $gtype = 'site') { // Add-on module for use in creating the cache file $buff = ""; $oAddonModel = &getAdminModel('addon'); - $addon_list = $oAddonModel->getInsertedAddons($site_srl, $type); + $addon_list = $oAddonModel->getInsertedAddons($site_srl, $gtype); foreach($addon_list as $addon => $val) { if($val->addon == "smartphone") continue; if(!is_dir(_XE_PATH_.'addons/'.$addon)) continue; - if(($type == "pc" && $val->is_used != 'Y') || ($type == "mobile" && $val->is_used_m != 'Y')) continue; + if(($type == "pc" && $val->is_used != 'Y') || ($type == "mobile" && $val->is_used_m != 'Y') || ($gtype == 'global' && $val->is_fixed != 'Y')) continue; $extra_vars = unserialize($val->extra_vars); $mid_list = $extra_vars->mid_list; @@ -146,7 +146,7 @@ $addon_path = _XE_PATH_.'files/cache/addons/'; if(!is_dir($addon_path)) FileHandler::makeDir($addon_path); - if($site_srl) $addon_file = $addon_path.$site_srl.$type.'.acivated_addons.cache.php'; + if($gtype == 'site') $addon_file = $addon_path.$site_srl.$type.'.acivated_addons.cache.php'; else $addon_file = $addon_path.$type.'acivated_addons.cache.php'; FileHandler::writeFile($addon_file, $buff); @@ -155,11 +155,15 @@ /** * @brief Add-On Set **/ - function doSetup($addon, $extra_vars,$site_srl=0) { - if($extra_vars->mid_list) $extra_vars->mid_list = explode('|@|', $extra_vars->mid_list); + function doSetup($addon, $extra_vars,$site_srl=0, $gtype = 'site') { + if($gtype == 'site' && $extra_vars->mid_list) + $extra_vars->mid_list = explode('|@|', $extra_vars->mid_list); + else + unset($extra_vars->mid_list); + $args->addon = $addon; $args->extra_vars = serialize($extra_vars); - if(!$site_srl) return executeQuery('addon.updateAddon', $args); + if($gtype == 'global') return executeQuery('addon.updateAddon', $args); $args->site_srl = $site_srl; return executeQuery('addon.updateSiteAddon', $args); } diff --git a/modules/addon/conf/module.xml b/modules/addon/conf/module.xml index 8e9710a78..c6ad4833c 100644 --- a/modules/addon/conf/module.xml +++ b/modules/addon/conf/module.xml @@ -3,18 +3,19 @@ - + - + - + + Installed Addon - 애드온 + 설치된 애드온 Installed Addon Installed Addon Installed Addon diff --git a/modules/addon/lang/ko.lang.php b/modules/addon/lang/ko.lang.php new file mode 100644 index 000000000..06e250707 --- /dev/null +++ b/modules/addon/lang/ko.lang.php @@ -0,0 +1,20 @@ +addon = '애드온'; + $lang->addon_info = '애드온 정보'; + $lang->addon_maker = '애드온 제작자'; + $lang->addon_license = '라이선스'; + $lang->addon_history = '변경 이력'; + $lang->about_addon_mid = '애드온이 사용될 대상을 지정할 수 있습니다.
        (모두 해제 시 모든 대상에서 사용 가능합니다.)'; + $lang->about_addon = '애드온은 HTML결과물을 출력하기보다는 동작을 제어하는 역할을 합니다.
        원하시는 애드온을 ON/OFF 하시는 것만으로도 사이트 운영에 유용한 기능을 연동할 수 있습니다.'; + + $lang->installed_addon = '설치된 애드온'; + $lang->about_installed_addon = 'PC, Mobile에 체크하면 애드온을 켤 수 있습니다.'; + $lang->fixed = '고정'; + $lang->about_fixed = '체크하면 사이트 관리자가 이 설정을 변경할 수 없음.'; + $lang->msg_not_exist_option = '이 애드온은 설정이 존재하지 않습니다.'; +?> diff --git a/modules/addon/lang/lang.xml b/modules/addon/lang/lang.xml index 562ed87d1..8cfb430f6 100644 --- a/modules/addon/lang/lang.xml +++ b/modules/addon/lang/lang.xml @@ -80,4 +80,20 @@ Kullanışlı işlevleri, AÇIK/KAPALI anahtarını değiştirerek, kolayca kontrol edebilirsiniz.]]> Bạn có thể mở hoặc tắt bất cứ Addon nào bạn muốn.]]> - \ No newline at end of file + + + + + + + + + + + + + + + + + diff --git a/modules/addon/queries/insertSiteAddon.xml b/modules/addon/queries/insertSiteAddon.xml index 6aa9fc618..7a7927b1e 100644 --- a/modules/addon/queries/insertSiteAddon.xml +++ b/modules/addon/queries/insertSiteAddon.xml @@ -6,6 +6,8 @@ + + diff --git a/modules/addon/queries/updateAddon.xml b/modules/addon/queries/updateAddon.xml index 433f65d8d..b6c3143c4 100644 --- a/modules/addon/queries/updateAddon.xml +++ b/modules/addon/queries/updateAddon.xml @@ -5,6 +5,7 @@ + diff --git a/modules/addon/ruleset/updateAddonSetup.xml b/modules/addon/ruleset/updateAddonSetup.xml new file mode 100644 index 000000000..e06b6da3e --- /dev/null +++ b/modules/addon/ruleset/updateAddonSetup.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/modules/addon/schemas/addons.xml b/modules/addon/schemas/addons.xml index 60c547497..3f1a86c3b 100644 --- a/modules/addon/schemas/addons.xml +++ b/modules/addon/schemas/addons.xml @@ -2,6 +2,7 @@ + diff --git a/modules/addon/tpl/addon_list.html b/modules/addon/tpl/addon_list.html index 9e18c9b48..21870c8f9 100644 --- a/modules/addon/tpl/addon_list.html +++ b/modules/addon/tpl/addon_list.html @@ -1,70 +1,64 @@ - - +
        + + -

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

        -
        {nl2br($lang->about_addon)}
        - - - - - -
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        {$lang->addon_name}
        {$lang->version}
        {$lang->author}
        {$lang->date}
        {$lang->installed_path}
        {$lang->cmd_setup}
        PC
        Mobile
        -
        - {$val->title}
        - ({$val->addon}) -
        -
        {$val->version} - - {$author->name} - - {zdate($val->date, 'Y-m-d')}{$val->path}{$lang->cmd_setup} - - {$lang->use} - - {$lang->notuse} - - - - {$lang->use} - - {$lang->notuse} - -
        - {nl2br($val->description)}  -
        +

        {$lang->installed_addon}

        +

        {$lang->about_installed_addon}

        +
        +

        {$XE_VALIDATOR_MESSAGE}

        +
        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        All({$addon_count})
        {$lang->favorite}{$lang->addon_name}{$lang->version}{$lang->author}{$lang->installed_path}{$lang->cmd_setup}PCMobile + {$lang->fixed}[?] +
        +

        {$lang->about_fixed}

        +
        +
        {$lang->cmd_delete}
        + + +

        {$addon->title}

        +

        {cut_str($addon->description, 200)}

        +

        + {$lang->msg_avail_update} {$lang->msg_do_you_like_update} +

        +
        {$addon->version} + + {$author->name} + {$author->name} + + {$addon->path}{$lang->cmd_setup}{$lang->cmd_delete}
        +
        +
        + +
        + \ No newline at end of file diff --git a/modules/addon/tpl/setup_addon.html b/modules/addon/tpl/setup_addon.html index 3b85be19f..3742eae84 100644 --- a/modules/addon/tpl/setup_addon.html +++ b/modules/addon/tpl/setup_addon.html @@ -1,105 +1,51 @@ - - - - -
        -

        {$lang->cmd_setup}

        +

        {$lang->installed_addon}

        +

        {$addon_info->title}

        + + +
        +

        {$XE_VALIDATOR_MESSAGE}

        +
        + + + - - - -
        - - - - - - - - - - - - - - - - - - {@$group = $var->group} -
        {$addon_info->title} ver. {$addon_info->version} ({zdate($addon_info->date, 'Y-m-d')})
        {$lang->author}
        - - {$author->name} ({$author->homepage}, {$author->email_address})
        - -
        {$addon_info->homepage} 
        - -

        {$group}

        - - - - - - - - - - - - -
        {$var->title}
        - - - - - - - - - -

        {nl2br($var->description)}

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

        {$lang->about_addon_mid}

        - -
        - - - {$modules->title} - - {$lang->none_category} - -
        - -
        - -
        - mid_list))-->checked="checked" /> - -
        - -
        - -
        -
        - -
        - -
        + +
          + +
        +

        {$var->group}

        +
          + {@$group = $var->group} + + {@$not_first = true} +
        • +

          +

          + + + + {nl2br($var->description)} +

          +
        • + +
        +
        + +
        +
        +
        +

        {$lang->msg_not_exist_option}

        +
        \ No newline at end of file From 249ba8c7f5db8ee8def604d4deca89215ff4cb8d Mon Sep 17 00:00:00 2001 From: ovclas Date: Mon, 5 Sep 2011 09:34:08 +0000 Subject: [PATCH 0581/1372] issue 70 favorite interface developement git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9030 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/admin.admin.controller.php | 70 ++---------------------- modules/admin/admin.admin.model.php | 37 +------------ modules/admin/queries/getFavorite.xml | 1 - modules/admin/queries/insertFavorite.xml | 1 - modules/admin/schemas/admin_favorite.xml | 5 +- 5 files changed, 8 insertions(+), 106 deletions(-) diff --git a/modules/admin/admin.admin.controller.php b/modules/admin/admin.admin.controller.php index 2d6cd56b3..80853daa4 100644 --- a/modules/admin/admin.admin.controller.php +++ b/modules/admin/admin.admin.controller.php @@ -154,24 +154,23 @@ { $siteSrl = Context::get('site_srl'); $moduleName = Context::get('module_name'); - $key = Context::get('key'); // check favorite exists $oModel = &getAdminModel('admin'); - $output = $oModel->isExistsFavorite($siteSrl, $moduleName, $key); + $output = $oModel->isExistsFavorite($siteSrl, $moduleName); if (!$output->toBool()) return $output; // if exists, delete favorite if ($output->get('result')) { $favoriteSrl = $output->get('favoriteSrl'); - $output = $this->deleteFavorite($favoriteSrl); + $output = $this->_deleteFavorite($favoriteSrl); } // if not exists, insert favorite else { - $output = $this->insertFavorite($siteSrl, $moduleName, $key); + $output = $this->_insertFavorite($siteSrl, $moduleName); } if (!$output->toBool()) return $output; @@ -261,11 +260,10 @@ /** * @brief Insert favorite **/ - function insertFavorite($siteSrl, $module, $key) + function _insertFavorite($siteSrl, $module) { $args->site_srl = $siteSrl; $args->module = $module; - $args->key = $key; $output = executeQuery('admin.insertFavorite', $args); return $output; } @@ -273,71 +271,13 @@ /** * @brief Delete favorite **/ - function deleteFavorite($favoriteSrl) + function _deleteFavorite($favoriteSrl) { $args->admin_favorite_srl = $favoriteSrl; $output = executeQuery('admin.deleteFavorite', $args); return $output; } - /** - * @brief set favorites at one time - **/ - function setFavoritesByModule($siteSrl, $module, $keyList) - { - $oModel = &getAdminModel('admin'); - $output = $oModel->getFavoriteListByModule($siteSrl, $module); - if (!$output->toBool()) return $output; - $originList = $output->get('list'); - - // find insert key - $insertKey = array_diff($keyList, $originList); - - // find delete key - $deleteKey = array_diff($originList, $keyList); - - // start transaction - $oDB = &DB::getInstance(); - $oDB->begin(); - - // insert key - foreach($insertKey as $key) - { - $output = $this->insertFavorite($siteSrl, $module, $key); - if (!$output->toBool()) - { - $oDB->rollback(); - return $output; - } - } - - // delete key - foreach($deleteKey as $key) - { - $output = $oModel->isExistsFavorite($siteSrl, $module, $key); - if (!$output->toBool()) - { - $oDB->rollback(); - return $output; - } - $favoriteSrl = $output->get('favoriteSrl'); - - if ($favoriteSrl) - { - $output = $this->deleteFavorite($favoriteSrl); - if (!$output->toBool()) - { - $oDB->rollback(); - return $output; - } - } - } - - // commit - $oDB->commit(); - - return new Object(); - } function procAdminRemoveIcons(){ $iconname = Context::get('iconname'); $file_exist = FileHandler::readFile(_XE_PATH_.'files/attach/xeicon/'.$iconname); diff --git a/modules/admin/admin.admin.model.php b/modules/admin/admin.admin.model.php index a1d9a67c0..1c17a1aaa 100644 --- a/modules/admin/admin.admin.model.php +++ b/modules/admin/admin.admin.model.php @@ -341,17 +341,6 @@ if (!$output->toBool()) return $output; if (!$output->data) return new Object(); - foreach($output->data as $row) - { - $targetModule = $row->module; - $oTargetModuleAdminModel = &getAdminModel($targetModule); - if (!$oTargetModuleAdminModel) continue; - if (!method_exists($oTargetModuleAdminModel, 'getFavoriteInfo')) continue; - - $favoriteInfo = $oTargetModuleAdminModel->getFavoriteInfo($row->key); - $favoriteList[] = $favoriteInfo; - } - $returnObject = new Object(); $returnObject->add('favoriteList', $favoriteList); return $returnObject; @@ -360,11 +349,10 @@ /** * @brief Check available insert favorite **/ - function isExistsFavorite($siteSrl, $module, $key) + function isExistsFavorite($siteSrl, $module) { $args->site_srl = $siteSrl; $args->module = $module; - $args->key = $key; $output = executeQuery('admin.getFavorite', $args); if (!$output->toBool()) return $output; @@ -382,29 +370,6 @@ return $returnObject; } - /** - * @brief Get favorite by module, site - **/ - function getFavoriteListByModule($siteSrl, $module) - { - $args->site_srl = $siteSrl; - $args->module = $module; - $columnList = array('key'); - $output = executeQueryArray('admin.getFavoriteList', $args, $columnList); - if (!$output->toBool()) return $output; - if (!$output->data) $output->data = array(); - - $list = array(); - foreach($output->data as $row) - { - $list[$row->key] = $row->key; - } - - $returnObject = new Object(); - $returnObject->add('list', $list); - return $returnObject; - } - /** * @brief Return site list **/ diff --git a/modules/admin/queries/getFavorite.xml b/modules/admin/queries/getFavorite.xml index 0911c38b9..9d7e9f850 100644 --- a/modules/admin/queries/getFavorite.xml +++ b/modules/admin/queries/getFavorite.xml @@ -9,7 +9,6 @@ - diff --git a/modules/admin/queries/insertFavorite.xml b/modules/admin/queries/insertFavorite.xml index d6f21b41e..6a878bcdc 100644 --- a/modules/admin/queries/insertFavorite.xml +++ b/modules/admin/queries/insertFavorite.xml @@ -5,6 +5,5 @@ - diff --git a/modules/admin/schemas/admin_favorite.xml b/modules/admin/schemas/admin_favorite.xml index 987286bff..04d273008 100644 --- a/modules/admin/schemas/admin_favorite.xml +++ b/modules/admin/schemas/admin_favorite.xml @@ -1,6 +1,5 @@ - + - -
        \ No newline at end of file + From 2a8c16d4f9a17722f035ebccc1c3794ac9fedb92 Mon Sep 17 00:00:00 2001 From: flyskyko Date: Mon, 5 Sep 2011 10:01:33 +0000 Subject: [PATCH 0582/1372] widget module git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9031 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/module/module.admin.model.php | 26 +- modules/widget/tpl/add_content_widget.html | 54 ++- modules/widget/tpl/js/generate_code.js | 212 ++++++++++-- modules/widget/tpl/js/module_list.js | 20 ++ modules/widget/tpl/js/multi_order.js | 14 + modules/widget/tpl/js/widget.js | 25 +- .../tpl/widget_generate_code.filebox.html | 33 ++ modules/widget/tpl/widget_generate_code.html | 164 +-------- .../tpl/widget_generate_code.include.html | 326 +++++++----------- .../tpl/widget_generate_code_in_page.html | 55 +-- .../widget_style_generate_code_in_page.html | 172 +++++---- modules/widget/widget.admin.view.php | 3 +- modules/widget/widget.view.php | 3 +- 13 files changed, 550 insertions(+), 557 deletions(-) create mode 100644 modules/widget/tpl/widget_generate_code.filebox.html diff --git a/modules/module/module.admin.model.php b/modules/module/module.admin.model.php index 113db57ff..51faeada4 100644 --- a/modules/module/module.admin.model.php +++ b/modules/module/module.admin.model.php @@ -19,12 +19,16 @@ * Used in the ModuleSelector **/ function getModuleAdminModuleList() { + $oModuleController = &getController('module'); + $oModuleModel = &getModel('module'); $args->module_srls = Context::get('module_srls'); $output = executeQueryArray('module.getModulesInfo', $args); if(!$output->toBool() || !$output->data) return new Object(); foreach($output->data as $key => $val) { - $list[$val->module_srl] = array('module_srl'=>$val->module_srl,'mid'=>$val->mid,'browser_title'=>$val->browser_title); + $info_xml = $oModuleModel->getModuleInfoXml($val->module); + $oModuleController->replaceDefinedLangCode($val->browser_title); + $list[$val->module_srl] = array('module_srl'=>$val->module_srl,'mid'=>$val->mid,'browser_title'=>$val->browser_title, 'module_name' => $info_xml->title); } $modules = explode(',',$args->module_srls); for($i=0;$isite_srl) $args->site_srl = 0; - + $columnList = array('lang_code', 'value'); $langList = array(); - + $args->langName = preg_replace('/\$user_lang->/', '', $args->lang_name); $output = executeQueryArray('module.getLangListByName', $args, $columnList); if($output->toBool()) $langList = $output->data; @@ -202,16 +206,16 @@ } /** - * @brief Return lang list + * @brief Return lang list **/ function getModuleAdminLangListByValue() { $args = Context::getRequestVars(); if(!$args->site_srl) $args->site_srl = 0; - + $langList = array(); - + $args->value = $args->lang_name; // search value @@ -222,7 +226,7 @@ $args->langName = $output->data[0]->name; $columnList = array('lang_code', 'value'); $output = executeQueryArray('module.getLangListByName', $args, $columnList); - + if($output->toBool()) $langList = $output->data; } @@ -230,7 +234,7 @@ $this->add('lang_name', $args->langName); } /** - * @brief Return current lang list + * @brief Return current lang list **/ function getLangListByLangcode($args) { @@ -241,7 +245,7 @@ } /** - * @brief Return current lang list + * @brief Return current lang list **/ function getLangListByLangcodeForAutoComplete() { diff --git a/modules/widget/tpl/add_content_widget.html b/modules/widget/tpl/add_content_widget.html index f2f273a76..9717ae071 100644 --- a/modules/widget/tpl/add_content_widget.html +++ b/modules/widget/tpl/add_content_widget.html @@ -1,35 +1,33 @@ - - + + -
        -

        {$lang->cmd_content_insert}

        -
        +
        -
        - - - - - - - - - +

        {$lang->cmd_content_insert}

        -
        -
        + + + + + + + + + + -
        - {$editor} -
        +
        - -
        +
        + {$editor} +
        -
        - -
        + -
        +
        + +
        + +
        \ No newline at end of file diff --git a/modules/widget/tpl/js/generate_code.js b/modules/widget/tpl/js/generate_code.js index 1b49bef33..1f0f17027 100644 --- a/modules/widget/tpl/js/generate_code.js +++ b/modules/widget/tpl/js/generate_code.js @@ -1,4 +1,4 @@ -function doDisplaySkinColorset() +function doDisplaySkinColorset(colorset) { var skin = jQuery('select[name=skin]').val(); if(!skin) { @@ -6,39 +6,39 @@ function doDisplaySkinColorset() return; } + function completeGetSkinColorset(ret_obj) + { + var sel = jQuery("select[name=colorset]").get(0); + var length = sel.options.length; + var selected_colorset = colorset; + for(var i=0;i
        From 39b7615ecb26c1324ae313770782780419e6a6de Mon Sep 17 00:00:00 2001 From: flyskyko Date: Wed, 7 Sep 2011 02:54:17 +0000 Subject: [PATCH 0621/1372] remove '\' in lang.xml git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9072 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/lang/lang.xml | 69 +++++++++++++++--------- modules/admin/lang/lang.xml | 3 +- modules/importer/lang/lang.xml | 12 ++--- modules/install/lang/lang.xml | 10 ++-- modules/integration_search/lang/lang.xml | 2 +- modules/layout/lang/lang.xml | 2 +- modules/member/lang/lang.xml | 6 +-- modules/menu/lang/lang.xml | 4 +- modules/module/lang/lang.xml | 4 +- modules/opage/lang/lang.xml | 6 +-- modules/page/lang/lang.xml | 2 +- 11 files changed, 69 insertions(+), 51 deletions(-) diff --git a/common/lang/lang.xml b/common/lang/lang.xml index f96a4e9c0..259c795a6 100644 --- a/common/lang/lang.xml +++ b/common/lang/lang.xml @@ -2491,7 +2491,8 @@ Please check the DB information again]]> データベースの情報をもう一度確認して下さい。]]> - + ]]> - 1. PHP güvenli mod ayarları etkinse, XE, FTP\'yi kullanarak yüklenecektir.
        + 1. PHP güvenli mod ayarları etkinse, XE, FTP'yi kullanarak yüklenecektir.
        2. Otomatik güncellemeler, FTP bilgilerini kullanabilir.
        Hesap bilgileri files/config/ftp.config.php adresinde depolanacaktır.
        Kurulumun ardından, hesap bilgilerini yönetici sayfasından ayarlayabilir veya silebilirsiniz.
        @@ -3431,7 +3432,7 @@ Xin vui lòng kiểm tra lại thông tin Database.]]>
        - + @@ -3585,7 +3586,7 @@ Xin vui lòng kiểm tra lại thông tin Database.]]> - + @@ -3598,31 +3599,47 @@ Xin vui lòng kiểm tra lại thông tin Database.]]> - - + + - + - - - - - + + + + + - - + + - + - - - - - + + + + + @@ -3630,7 +3647,7 @@ Xin vui lòng kiểm tra lại thông tin Database.]]> - + @@ -3647,7 +3664,7 @@ Xin vui lòng kiểm tra lại thông tin Database.]]> - + @@ -3660,7 +3677,7 @@ Xin vui lòng kiểm tra lại thông tin Database.]]> - + @@ -3673,7 +3690,7 @@ Xin vui lòng kiểm tra lại thông tin Database.]]> - + @@ -3686,7 +3703,7 @@ Xin vui lòng kiểm tra lại thông tin Database.]]> - + @@ -3699,7 +3716,7 @@ Xin vui lòng kiểm tra lại thông tin Database.]]> - + diff --git a/modules/admin/lang/lang.xml b/modules/admin/lang/lang.xml index be9c09c29..fdc95f139 100644 --- a/modules/admin/lang/lang.xml +++ b/modules/admin/lang/lang.xml @@ -311,7 +311,8 @@ Please click the download link to get the latest version.]]> 請按[下載]下載最新版本。]]> - + XML Exporter生成XML文件后再上传。]]> XML Exporter 建立 XML 檔案後再上傳。]]> - Exporteur de XML pour convertir les données en fichier de XML, et puis téléchargez-le.]]> XML Экспортер (XML Exporter), чтобы конвертировать нужные данные в XML Файл и затем загрузить его.]]> @@ -517,17 +517,17 @@ If not, please input the address where Zeroboard4 is installed. ex. http://Domai 位置在同一个服务器时,请输入如 /home/id/public_html/bbs的路径,在不同服务器时,请输入如 http://域名/bbs的url地址。]]> - +Si elle ne se trouve pas dans le même serveur, entrez l'adresse où Zeroboard4 est installé comme 'http://Domain/bbs']]> - + /home/USERID/public_html/bbs Nếu khác Server, hãy nhập địa chỉ của Zeroboard4 đã cài đặt. Ví dụ: http://Domain/bbs]]> diff --git a/modules/install/lang/lang.xml b/modules/install/lang/lang.xml index ab8197f93..71aa8c751 100644 --- a/modules/install/lang/lang.xml +++ b/modules/install/lang/lang.xml @@ -162,7 +162,7 @@ - + @@ -783,7 +783,7 @@ Vérifiez encore une fois les informations sur la Base de Données, S.V.P.]]> - @@ -805,7 +805,7 @@ Le fichier de Configuration est recréé.]]> Файл конфигурации создан заново]]> - @@ -828,7 +828,7 @@ Merci pour choisir XE]]> +XE'yi seçtiğiniz için teşekkür ederiz]]> @@ -838,7 +838,7 @@ Xin cảm ơn đã sử dụng XE!]]> - + diff --git a/modules/integration_search/lang/lang.xml b/modules/integration_search/lang/lang.xml index 880aced51..fa42a72e4 100644 --- a/modules/integration_search/lang/lang.xml +++ b/modules/integration_search/lang/lang.xml @@ -18,7 +18,7 @@ - + diff --git a/modules/layout/lang/lang.xml b/modules/layout/lang/lang.xml index 492656ee0..c3ef594e1 100644 --- a/modules/layout/lang/lang.xml +++ b/modules/layout/lang/lang.xml @@ -232,7 +232,7 @@ Referente al código de planillas de XE dirijirse aXE Pamphlet(Ingles) ]]> XE Template.]]> + XE'nin şablolunu örnek alabilirsiniz : XE Template.]]> Lưu' sau khi sửa đổi. Hãy bấm 'Xem trước' trước khi bấm 'Lưu'. Bạn có thể tham khảo cách sửa giao diện tại XE Template.]]> diff --git a/modules/member/lang/lang.xml b/modules/member/lang/lang.xml index 8c3cf83ab..2bd521d7b 100644 --- a/modules/member/lang/lang.xml +++ b/modules/member/lang/lang.xml @@ -701,7 +701,7 @@ - + @@ -713,7 +713,7 @@ - + @@ -1654,7 +1654,7 @@ - + diff --git a/modules/menu/lang/lang.xml b/modules/menu/lang/lang.xml index 9fc2c7aed..9e3f2322d 100644 --- a/modules/menu/lang/lang.xml +++ b/modules/menu/lang/lang.xml @@ -381,7 +381,7 @@ If the menu is not shown normally, refresh the information by clicking the butto - diff --git a/modules/module/lang/lang.xml b/modules/module/lang/lang.xml index b1adf0e65..b562f75a6 100644 --- a/modules/module/lang/lang.xml +++ b/modules/module/lang/lang.xml @@ -682,7 +682,7 @@ - + @@ -924,7 +924,7 @@ Le module [Administration des Modules] montera tous les modules installés et vo - + diff --git a/modules/opage/lang/lang.xml b/modules/opage/lang/lang.xml index 0524f33d2..c476997f0 100644 --- a/modules/opage/lang/lang.xml +++ b/modules/opage/lang/lang.xml @@ -45,7 +45,7 @@ Il est possible d'utiliser le chemin absolu ou relatif, et si l'URL commence avec 'http://' , il est possible de représenter des pages extérieurs du serveur.]]> Требует ввода абсолютного или относительного пути. Если URL начинается с 'http://', внешняя страница с другого сервера будет показана.]]> Permite ruta absoluta o relativa, y si la URL comienza con "http://", se puede mostrar la pagina externa del servidor.]]> - Kesin ya da ilgili yola izin verir ve eğer url 'http://' ile başlıyorsa , modül sunucunun harici sayfasını gösterebilir.]]> + Kesin ya da ilgili yola izin verir ve eğer url 'http://' ile başlıyorsa , modül sunucunun harici sayfasını gösterebilir.]]> Nó cho phép đường dẫn tuyệt đối hay tương đối, nếu bắt đầu bằng 'http://' , nó sẽ hiển thị một trang từ bên ngoài Server.]]> @@ -57,7 +57,7 @@ Non seulement le chemin absolu comme '/path1/path2/sample.php' mais aussi le chemin relatif comme '../path2/sample.php' peuvent être utilisés.
        Si vous entrez le chemin comme 'http://url/sample.php', le résultat sera reçu et puis exposé
        Le chemin suivant, c'est le chemin absolu de XE.
        ]]>
        Абсолютный путь как '/path1/path2/sample.php', так и относительный как '../path2/sample.php' могут быть использованы.
        Если Вы введете путь как 'http://url/sample.php', результат будет сначала получен и затем показан.
        Это текущий абсолютный путь к XE.
        ]]>
        Ambos ruta absoluta como '/ path1/path2/sample.php' o ruta relativa como "../path2/sample.php" puede ser utilizado.
        Si la via de entrada, como "http://url/sample.php", el resultado sera recibido y, a continuacion se muestran.
        Esta es la actual XE ruta absoluta.
        ]]>
        - '/path1/path2/sample.php' gibi kesin yollar ve '../path2/sample.php' gibi ilgili yollar kullanılabilir.
        Eğer 'http://url/sample.php' gibi bir yol giriyorsanız, sonuç önce alınacak sonra gösterilecektir.
        Bu XE\'nin kesin yoludur.
        ]]>
        + '/path1/path2/sample.php' gibi kesin yollar ve '../path2/sample.php' gibi ilgili yollar kullanılabilir.
        Eğer 'http://url/sample.php' gibi bir yol giriyorsanız, sonuç önce alınacak sonra gösterilecektir.
        Bu XE'nin kesin yoludur.
        ]]>
        Có thể sử dụng đường dẫn tuyệt đối dạng '/path1/path2/sample.php' hay tương đối dạng '../path2/sample.php'.
        Nếu nhập đường dẫn dạng 'http://url/sample.php', nó sẽ nhận và hiển thị nội dung của File đó.
        Đây là đường dẫn tuyệt đối thư mục cài đặt XE.
        ]]>
        @@ -88,7 +88,7 @@ Both absolute path such as '/path1/path2/sample.php' or relative path such as '../path2/sample.php' can be used.
        If you input the path like 'http://url/sample.php' , the result will be received and then displayed.
        This is current XE's absolute path.
        ]]>
        Both absolute path such as '/path1/path2/sample.php' or relative path such as '../path2/sample.php' can be used.
        If you input the path like 'http://url/sample.php' , the result will be received and then displayed.
        This is current XE's absolute path.
        ]]>
        Both absolute path such as '/path1/path2/sample.php' or relative path such as '../path2/sample.php' can be used.
        If you input the path like 'http://url/sample.php' , the result will be received and then displayed.
        This is current XE's absolute path.
        ]]>
        - '/path1/path2/sample.php' gibi kesin yol veya '../path2/sample.php' gibi ilgili yol kullanılabilir.
        Eğer 'http://url/sample.php' gibi bir adres girdiyseniz , sonuç önce alınacak sonra görüntülenecektir.
        Bu XE\'nin kesin yoludur.
        ]]>
        + '/path1/path2/sample.php' gibi kesin yol veya '../path2/sample.php' gibi ilgili yol kullanılabilir.
        Eğer 'http://url/sample.php' gibi bir adres girdiyseniz , sonuç önce alınacak sonra görüntülenecektir.
        Bu XE'nin kesin yoludur.
        ]]>
        Both absolute path such as '/path1/path2/sample.php' or relative path such as '../path2/sample.php' can be used.
        If you input the path like 'http://url/sample.php' , the result will be received and then displayed.
        This is current XE's absolute path.
        ]]>
        \ No newline at end of file diff --git a/modules/page/lang/lang.xml b/modules/page/lang/lang.xml index a3bd049b7..2fadc5f41 100644 --- a/modules/page/lang/lang.xml +++ b/modules/page/lang/lang.xml @@ -42,7 +42,7 @@ URL de conección es el mismo que de los otros módulos como mid=Nombre del mód Si selcciona como predefinido esta página será la página principal del sitio.]]> Date: Wed, 7 Sep 2011 02:56:18 +0000 Subject: [PATCH 0622/1372] style faceoff migration info git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9073 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/layout/tpl/header.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/layout/tpl/header.html b/modules/layout/tpl/header.html index 88c63c42e..768124b35 100644 --- a/modules/layout/tpl/header.html +++ b/modules/layout/tpl/header.html @@ -1,3 +1,7 @@ + +

        {$lang->installed_layout}

        From bf4e418be6dddec0329047057a2058d5a151a56b Mon Sep 17 00:00:00 2001 From: taggon Date: Wed, 7 Sep 2011 04:47:26 +0000 Subject: [PATCH 0623/1372] Make masked fields git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9074 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/tpl/js/admin.js | 26 ++++++++++++++++++++++++++ modules/member/tpl/member_list.html | 2 +- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/modules/admin/tpl/js/admin.js b/modules/admin/tpl/js/admin.js index fb539b8be..c7e6f4cf0 100644 --- a/modules/admin/tpl/js/admin.js +++ b/modules/admin/tpl/js/admin.js @@ -99,6 +99,8 @@ jQuery(function($){ // pagination $.fn.xePagination = function(){ this + .not('.xe-pagination') + .addClass('xe-pagination') .find('span.tgContent').css('whiteSpace', 'nowrap').end() .find('a.tgAnchor') .each(function(idx){ @@ -151,6 +153,30 @@ jQuery(function($){ // Display all sections then hide this button $(this).hide().parent().prevAll('.section').show(); }); + + $.fn.xeMask = function(){ + this + .each(function(){ + var $this = $(this), text = $this.text(); + var reg_mail = /^([\w\-\.]+?)@(([\w-]+\.)+[a-z]{2,})$/ig; + $this.data('originalText', text); + + if(reg_mail.test(text)) { + $this.data('maskedText', RegExp.$1+'...'); + } + + $this.text( $this.data('maskedText') ); + }) + .mouseover(function(){ + $(this).text( $(this).data('originalText') ); + }) + .mouseout(function(){ + $(this).text( $(this).data('maskedText') ); + }) + .focus(function(){ $(this).mouseover(); }) + .blur(function(){ $(this).mouseout(); }); + }; + $('.masked').xeMask(); }); // Modal Window diff --git a/modules/member/tpl/member_list.html b/modules/member/tpl/member_list.html index 917ea9d56..64159b9c0 100644 --- a/modules/member/tpl/member_list.html +++ b/modules/member/tpl/member_list.html @@ -60,7 +60,7 @@ {@$member_info = get_object_vars($member_info)} - {getEncodeEmailAddress($member_info['email_address'])} + {getEncodeEmailAddress($member_info['email_address'])} {@ $member_info['group_list'] = implode(', ', $member_info['group_list'])} {$member_info[$name]} From 65f3af8fdc6786d061d55500a17233ac496c801c Mon Sep 17 00:00:00 2001 From: devjin Date: Wed, 7 Sep 2011 04:53:22 +0000 Subject: [PATCH 0624/1372] fixed address search and member info view git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9075 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/member/member.admin.controller.php | 26 ++- modules/member/member.admin.view.php | 39 ++-- modules/member/member.controller.php | 21 +- modules/member/member.view.php | 20 +- modules/member/skins/default/member_info.html | 73 ++++++ modules/member/skins/default/signup_form.html | 220 +++--------------- modules/member/tpl/insert_member.html | 7 + modules/member/tpl/member_info.html | 4 +- 8 files changed, 199 insertions(+), 211 deletions(-) diff --git a/modules/member/member.admin.controller.php b/modules/member/member.admin.controller.php index 3c26074a5..134bd005f 100644 --- a/modules/member/member.admin.controller.php +++ b/modules/member/member.admin.controller.php @@ -19,11 +19,33 @@ function procMemberAdminInsert() { // if(Context::getRequestMethod() == "GET") return new Object(-1, "msg_invalid_request"); // Extract the necessary information in advance - $args = Context::gets('member_srl','user_id','user_name','nick_name','homepage','blog','birthday','email_address','password','allow_mailing','allow_message','denied','is_admin','description','group_srl_list','limit_date'); + $args = Context::gets('member_srl','email_address','allow_mailing','allow_message','denied','is_admin','description','group_srl_list','limit_date'); + $oMemberModel = &getModel ('member'); + $config = $oMemberModel->getMemberConfig (); + $getVars = array(); + if ($config->signupForm){ + foreach($config->signupForm as $formInfo){ + if($formInfo->isDefaultForm && $formInfo->isUse || $formInfo->required || $formInfo->mustRequired){ + $getVars[] = $formInfo->name; + } + } + } + foreach($getVars as $val){ + $args->{$val} = Context::get($val); + } + $args->member_srl = Context::get('member_srl'); + if (Context::get('reset_password')) + $args->password = Context::get('reset_password'); + else unset($args->password); + // Remove some unnecessary variables from all the vars $all_args = Context::getRequestVars(); unset($all_args->module); unset($all_args->act); + unset($all_args->mid); + unset($all_args->error_return_url); + unset($all_args->success_return_url); + unset($all_args->ruleset); if(!isset($args->limit_date)) $args->limit_date = ""; // Add extra vars after excluding necessary information from all the requested arguments $extra_vars = delObjectVars($all_args, $args); @@ -166,7 +188,7 @@ // set extends form if (!$signupItem->isDefaultForm){ $extendItem = $extendItems[$all_args->{$key.'_member_join_form_srl'}]; - $signupItem->type = $extendItem->type; + $signupItem->type = $extendItem->column_type; $signupItem->member_join_form_srl = $extendItem->member_join_form_srl; $signupItem->title = $extendItem->column_title; $signupItem->description = $extendItem->description; diff --git a/modules/member/member.admin.view.php b/modules/member/member.admin.view.php index 06ac81144..76333ec28 100644 --- a/modules/member/member.admin.view.php +++ b/modules/member/member.admin.view.php @@ -141,7 +141,6 @@ function dispMemberAdminInsert() { // retrieve extend form $oMemberModel = &getModel('member'); - $extend_form_list = $oMemberModel->getCombineJoinForm($this->memberInfo); $memberInfo = Context::get('member_info'); $memberInfo->signature = $oMemberModel->getSignature($this->memberInfo->member_srl); @@ -162,19 +161,27 @@ Context::set('editor', $editor); } - $memberInfo = get_object_vars($memberInfo); + $formTags = $this->_getMemberInputTag($memberInfo); + Context::set('formTags', $formTags); + $this->setTemplateFile('insert_member'); + } + + function _getMemberInputTag($memberInfo){ + $oMemberModel = &getModel('member'); + $memberInfo = get_object_vars($memberInfo); $member_config = $oMemberModel->getMemberConfig(); + $extend_form_list = $oMemberModel->getCombineJoinForm($this->memberInfo); $formTags = array(); global $lang; foreach($member_config->signupForm as $no=>$formInfo){ if (!$formInfo->isUse)continue; - if ($formInfo->name == 'email_address') continue; + if ($formInfo->name == 'email_address' || $formInfo->name == 'password') continue; unset($formTag); $inputTag = ''; $formTag->title = $formInfo->title; - if ($formInfo->required || $formInfo->mustRequired && $formInfo->name != 'password') $formTag->title = $formTag->title.' *'; + if ($formInfo->required || $formInfo->mustRequired && $formInfo->name != 'password') $formTag->title = $formTag->title.' *'; $formTag->name = $formInfo->name; if($formInfo->isDefaultForm){ if($formInfo->imageType){ @@ -210,9 +217,6 @@ ,$memberInfo['birthday'] ,zdate($memberInfo['birthday'], 'Y-m-d', false) ,$lang->cmd_delete); - }elseif($formInfo->name == 'password'){ - $inputTag = sprintf('' - ,$formInfo->name); }elseif($formInfo->name == 'find_account_question'){ $inputTag = '
        '; $optionTag = array(); @@ -253,15 +257,18 @@ }elseif($extendForm->column_type == 'checkbox'){ if($extendForm->default_value){ + $__i = 0; foreach($extendForm->default_value as $v){ + $checked = ''; if(is_array($extendForm->value) && in_array($v, $extendForm->value))$checked = 'checked="checked"'; - $inputTag .= sprintf('' - ,$extendForm->column_name + $inputTag .= sprintf('' + ,$extendForm->column_name.$__i ,$extendForm->column_name ,htmlspecialchars($v) ,$checked - ,$extendForm->column_name + ,$extendForm->column_name.$__i ,$v); + $__i++; } } }elseif($extendForm->column_type == 'radio'){ @@ -294,6 +301,7 @@ } $inputTag = sprintf($inputTag, implode('', $optionTag)); }elseif($extendForm->column_type == 'kr_zip'){ + Context::loadFile(array('./modules/member/tpl/js/krzip_search.js', 'body')); $content = <<
        @@ -302,6 +310,7 @@
        @@ -310,15 +319,16 @@
        - EOD; + $hiddenDisabled = $extendForm->value[0]?'':'disabled="disabled"'; $inputTag = sprintf($content - ,$extendForm->column_name, $extendForm->value[0]?'':'style="display:none"' + ,$extendForm->column_name, '' ,$extendForm->column_name, $lang->msg_kr_address ,$extendForm->column_name, $extendForm->value[0] ,$lang->cmd_search ,$extendForm->column_name + ,$extendForm->column_name, $extendForm->value[0], $hiddenDisabled ,$extendForm->column_name, $extendForm->column_name ,$lang->cmd_search_again ,$extendForm->column_name, $lang->msg_kr_address_etc @@ -343,9 +353,8 @@ EOD; $formTag->inputTag = $inputTag; $formTags[] = $formTag; } - Context::set('formTags', $formTags); - $this->setTemplateFile('insert_member'); - } + return $formTags; + } /** * @brief display member delete form diff --git a/modules/member/member.controller.php b/modules/member/member.controller.php index 8a9631afd..a4ff4c13e 100644 --- a/modules/member/member.controller.php +++ b/modules/member/member.controller.php @@ -473,15 +473,23 @@ // call a trigger (before) $trigger_output = ModuleHandler::triggerCall ('member.procMemberInsert', 'before', $config); if (!$trigger_output->toBool ()) return $trigger_output; - // Check if an administrator allows a membership if ($config->enable_join != 'Y') return $this->stop ('msg_signup_disabled'); - // Check if the user accept the license terms (only if terms exist) if ($config->agreement && Context::get('accept_agreement')!='Y') return $this->stop('msg_accept_agreement'); // Extract the necessary information in advance - $args = Context::gets('user_id','user_name','nick_name','homepage','blog','birthday','email_address','password','password1','allow_mailing','find_account_question','find_account_answer'); + $getVars = array(); + if ($config->signupForm){ + foreach($config->signupForm as $formInfo){ + if($formInfo->isDefaultForm && $formInfo->isUse || $formInfo->required || $formInfo->mustRequired){ + $getVars[] = $formInfo->name; + } + } + } + foreach($getVars as $val){ + $args->{$val} = Context::get($val); + } $args->member_srl = getNextSequence(); $args->list_order = -1 * $args->member_srl; if($args->password1) $args->password = $args->password1; @@ -497,6 +505,9 @@ unset($all_args->accept_agreement); unset($all_args->signature); unset($all_args->password2); + unset($all_args->mid); + unset($all_args->error_return_url); + unset($all_args->ruleset); // Set the user state as "denied" when using mail authentication if ($config->enable_confirm == 'Y') $args->denied = 'Y'; @@ -504,6 +515,10 @@ $extra_vars = delObjectVars($all_args, $args); $args->extra_vars = serialize($extra_vars); // Execute insert or update depending on the value of member_srl + + if (!$args->user_id) $args->user_id = 't'.$args->member_srl; + if (!$args->user_name) $args->user_name = $args->member_srl; + if (!$args->nick_name) $args->nick_name = $args->member_srl; $output = $this->insertMember($args); if(!$output->toBool()) return $output; diff --git a/modules/member/member.view.php b/modules/member/member.view.php index ad8aef0f7..05dce46bd 100644 --- a/modules/member/member.view.php +++ b/modules/member/member.view.php @@ -45,18 +45,27 @@ return $this->dispMemberSignUpForm(); } + $oModuleModel = &getModel('module'); + $member_config = $oModuleModel->getModuleConfig('member'); + Context::set('member_config', $member_config); + + $memberInfo = get_object_vars(Context::get('member_info')); + Context::set('memberInfo', $memberInfo); $site_module_info = Context::get('site_module_info'); $columnList = array('member_srl', 'user_name', 'nick_name', 'homepage', 'blog', 'birthday', 'regdate', 'last_login'); $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl, $site_module_info->site_srl, $columnList); unset($member_info->password); unset($member_info->email_id); unset($member_info->email_host); - unset($member_info->email_address); if(!$member_info->member_srl) return $this->dispMemberSignUpForm(); - Context::set('member_info', $member_info); - Context::set('extend_form_list', $oMemberModel->getCombineJoinForm($member_info)); + Context::set('memberInfo', get_object_vars($member_info)); + + $extendForm = $oMemberModel->getCombineJoinForm($member_info); + unset($extendForm->find_member_account); + unset($extendForm->find_member_answer); + Context::set('extend_form_list', $extendForm); if ($member_info->member_srl == $logged_info->member_srl) Context::set('openids', $oMemberModel->getMemberOpenIDByMemberSrl($member_srl)); @@ -75,7 +84,10 @@ if(!$trigger_output->toBool()) return $trigger_output; // Error appears if the member is not allowed to join if($this->member_config->enable_join != 'Y') return $this->stop('msg_signup_disabled'); - Context::set('extend_form_list', $oMemberModel->getCombineJoinForm($member_info)); + + $oMemberAdminView = &getAdminView('member'); + $formTags = $oMemberAdminView->_getMemberInputTag($member_info); + Context::set('formTags', $formTags); $member_config = $oMemberModel->getMemberConfig(); Context::set('member_config', $member_config); diff --git a/modules/member/skins/default/member_info.html b/modules/member/skins/default/member_info.html index 3b8067ca3..a77f7eefe 100644 --- a/modules/member/skins/default/member_info.html +++ b/modules/member/skins/default/member_info.html @@ -1,5 +1,78 @@ +

        {$lang->member_info}

        +
        + + + + +{@$title = $formInfo->title} +{@$value = $memberInfo[$formInfo->name]} + +{@$target = $memberInfo['profile_image']} +{@$value = ''} + +{@$target = $memberInfo['image_name']} +{@$value = ''} + +{@$target = $memberInfo['image_mark']} +{@$value = ''} + + +{@$title = $extend_form_list[$formInfo->member_join_form_srl]->column_title} +{@$orgValue = $extend_form_list[$formInfo->member_join_form_srl]->value} + + {@$value = htmlspecialchars($orgValue[0])} + - + {@$value .= htmlspecialchars($orgValue[1])} + - + {@$value .= htmlspecialchars($orgValue[2])} + + {@$value = htmlspecialchars($orgValue[0])}
        {@$value .= htmlspecialchars($orgValue[1])} + + {@$value = htmlspecialchars(implode(", ",$orgValue))} + + {@$value = zdate($orgValue, "Y-m-d")} + + {@$value = nl2br(htmlspecialchars($orgValue))} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        {$title} *{$value}
        {$lang->allow_mailing}{$lang->cmd_yes}{$lang->cmd_no}
        {$lang->allow_message}{$lang->allow_message_type[$memberInfo['allow_message']]}
        {$lang->denied}{$lang->cmd_no}{$lang->cmd_yes}
        {$lang->limit_date}{zdate($memberInfo['limit_date'],"Y-m-d H:i")}
        {$lang->is_admin}{$lang->cmd_yes}
        {$lang->group}{implode(', ', $memberInfo['group_list'])}
        {$lang->description}
        {$memberInfo['description']} 
        +

        {$lang->cmd_view_member_info}

        diff --git a/modules/member/skins/default/signup_form.html b/modules/member/skins/default/signup_form.html index 3a85d4312..1f4c663bf 100644 --- a/modules/member/skins/default/signup_form.html +++ b/modules/member/skins/default/signup_form.html @@ -11,9 +11,8 @@

        {$XE_VALIDATOR_MESSAGE}

        - + -
        {$member_config->agreement} @@ -23,191 +22,42 @@
        - -
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        {$lang->member_default_info}
        {$lang->user_id} *

        {$lang->about_user_id}

        {$lang->password} *

        {$lang->about_password}

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

        {$lang->about_user_name}

        -
        {$lang->nick_name} *
        -

        {$lang->about_nick_name}

        -
        {$lang->email_address} *
        -

        {$lang->about_email_address}

        -
        {$lang->find_account_question} *
        - -
        - -
        {$lang->homepage}
        -

        {$lang->about_homepage}

        -
        {$lang->blog}
        -

        {$lang->about_blog_url}

        -
        {$lang->birthday}
        - - - -

        {$lang->about_birthday}

        -
        {$lang->allow_mailing}

        {$lang->about_allow_mailing}

        {$lang->member_extend_info}
        - {htmlspecialchars($val->column_title)} - * - - - - - - - - - - - - - - - - - - - - - - - - - - -
          - -
        • value)&&in_array($v, $val->value))-->checked="checked"/>{$v}
        • - -
        - - - - - -
          - -
        • value)&&in_array($v, $val->value))-->checked="checked"/>{$v}
        • - -
        - - - - - - - - -
        - - -
        - - -
        -
        - - - - - - - - - - - - - -

        {$val->description}

        - -
        - - -
        -
        +
          +
        • +

          {$lang->email_address} *

          +

          + +

          +
        • +
        • +

          {$lang->password} *

          +

          + +

          +
        • +
        • +

          {$formTag->title}

          +
          {$formTag->inputTag}
          +
          {$editor}
          +
        • +
        • +

          {$lang->allow_mailing}

          +

          + + +

          +
        • +
        • +

          {$lang->allow_message}

          +

          + + + +

          +
        • +
        {$lang->cmd_cancel} -
        + EOD; - $hiddenDisabled = $extendForm->value[0]?'':'disabled="disabled"'; - $inputTag = sprintf($content - ,$extendForm->column_name, '' - ,$extendForm->column_name, $lang->msg_kr_address - ,$extendForm->column_name, $extendForm->value[0] - ,$lang->cmd_search - ,$extendForm->column_name - ,$extendForm->column_name, $extendForm->value[0], $hiddenDisabled - ,$extendForm->column_name, $extendForm->column_name - ,$lang->cmd_search_again - ,$extendForm->column_name, $lang->msg_kr_address_etc - ,$extendForm->column_name, $extendForm->column_name, $extendForm->value[1] - ,$extendForm->column_name); }elseif($extendForm->column_type == 'jp_zip'){ - $inputTag = sprintf('' - ,$extendForm->column_name - ,$extendForm->value); + $template = ''; }elseif($extendForm->column_type == 'date'){ - $inputTag = sprintf('' - ,$extendForm->column_name - ,$extendForm->column_name - ,$extendForm->value - ,zdate($extendForm->value, 'Y-m-d') - ,$lang->cmd_delete); + $extentionReplace = array('date' => zdate($extendForm->value, 'Y-m-d'), + 'cmd_delete' => $lang->cmd_delete); + $template = ''; } + $replace = array_merge($extentionReplace, $replace); + $inputTag = preg_replace('@%(\w+)%@e', '$replace[$1]', $template); + if($extendForm->description) $inputTag .= '

        '.htmlspecialchars($extendForm->description).'

        '; } diff --git a/modules/member/member.controller.php b/modules/member/member.controller.php index a4ff4c13e..059fd174d 100644 --- a/modules/member/member.controller.php +++ b/modules/member/member.controller.php @@ -560,7 +560,19 @@ function procMemberModifyInfo() { if(!Context::get('is_logged')) return $this->stop('msg_not_logged'); // Extract the necessary information in advance - $args = Context::gets('user_name','nick_name','homepage','blog','birthday','email_address','allow_mailing','find_account_question','find_account_answer'); + $oMemberModel = &getModel ('member'); + $config = $oMemberModel->getMemberConfig (); + $getVars = array('find_account_answer','allow_mailing','allow_message'); + if ($config->signupForm){ + foreach($config->signupForm as $formInfo){ + if($formInfo->isDefaultForm && $formInfo->isUse || $formInfo->required || $formInfo->mustRequired){ + $getVars[] = $formInfo->name; + } + } + } + foreach($getVars as $val){ + $args->{$val} = Context::get($val); + } // Login Information $logged_info = Context::get('logged_info'); $args->member_srl = $logged_info->member_srl; @@ -575,6 +587,9 @@ unset($all_args->accept_agreement); unset($all_args->signature); unset($all_args->_filter); + unset($all_args->mid); + unset($all_args->error_return_url); + unset($all_args->ruleset); // Add extra vars after excluding necessary information from all the requested arguments $extra_vars = delObjectVars($all_args, $args); @@ -1682,26 +1697,29 @@ $oDB->rollback(); return $output; } - if(is_array($args->group_srl_list)) $group_srl_list = $args->group_srl_list; - else $group_srl_list = explode('|@|', $args->group_srl_list); - // If the group information, group information changes - if(count($group_srl_list) > 0) { - $args->site_srl = 0; - // One of its members to delete all the group - $output = executeQuery('member.deleteMemberGroupMember', $args); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - // Enter one of the loop a - for($i=0;$iaddMemberToGroup($args->member_srl,$group_srl_list[$i]); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - } - } + + if ($args->group_srl_list){ + if(is_array($args->group_srl_list)) $group_srl_list = $args->group_srl_list; + else $group_srl_list = explode('|@|', $args->group_srl_list); + // If the group information, group information changes + if(count($group_srl_list) > 0) { + $args->site_srl = 0; + // One of its members to delete all the group + $output = executeQuery('member.deleteMemberGroupMember', $args); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + // Enter one of the loop a + for($i=0;$iaddMemberToGroup($args->member_srl,$group_srl_list[$i]); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } + } + } + } // Call a trigger (after) if($output->toBool()) { $trigger_output = ModuleHandler::triggerCall('member.updateMember', 'after', $args); diff --git a/modules/member/member.view.php b/modules/member/member.view.php index 05dce46bd..9f58c957d 100644 --- a/modules/member/member.view.php +++ b/modules/member/member.view.php @@ -133,6 +133,13 @@ $editor = $oEditorModel->getEditor($member_info->member_srl, $option); Context::set('editor', $editor); } + + $oMemberAdminView = &getAdminView('member'); + $formTags = $oMemberAdminView->_getMemberInputTag($member_info); + Context::set('formTags', $formTags); + + $member_config = $oMemberModel->getMemberConfig(); + Context::set('member_config', $member_config); // Set a template file $this->setTemplateFile('modify_info'); } diff --git a/modules/member/skins/default/member_info.html b/modules/member/skins/default/member_info.html index a77f7eefe..e098fc8d8 100644 --- a/modules/member/skins/default/member_info.html +++ b/modules/member/skins/default/member_info.html @@ -4,8 +4,8 @@
        - - + + {@$title = $formInfo->title} {@$value = $memberInfo[$formInfo->name]} @@ -38,169 +38,41 @@ - - + + - - - - - - - - - - - - - - - - - - - - + - - - + + + + + + + + + + + + -
        {$title} *
        {$title} * {$value}
        {$lang->allow_mailing}{$lang->cmd_yes}{$lang->cmd_no}
        {$lang->allow_message}{$lang->allow_message_type[$memberInfo['allow_message']]}
        {$lang->denied}{$lang->cmd_no}{$lang->cmd_yes}
        {$lang->limit_date}{zdate($memberInfo['limit_date'],"Y-m-d H:i")}
        {$lang->is_admin}{$lang->cmd_yes}
        {$lang->group} {implode(', ', $memberInfo['group_list'])}
        {$lang->description}
        {$memberInfo['description']} 
        {$lang->signup_date}
        {zdate($memberInfo[regdate],"Y-m-d H:i")}
        {$lang->last_login}
        {zdate($memberInfo[last_login],"Y-m-d H:i")}
        + + {$lang->cmd_modify_member_info} + + {$lang->cmd_leave} + + {$lang->cmd_modify_member_password} + {$lang->cmd_leave} + + + {$lang->cmd_back}
        -
        -

        {$lang->cmd_view_member_info}

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {@ $dummy_chk = 0 } - - class="first-child" {@ $dummy_chk = 1; }> - - - - - - - -
        {$lang->member_default_info}
        {$lang->user_name}
        {htmlspecialchars($member_info->user_name)}
        {$lang->nick_name}
        {htmlspecialchars($member_info->nick_name)}
        {$lang->profile_image}
        profile_image
        {$lang->image_name}
        image_name
        {$lang->image_mark}
        image_mark
        {$lang->homepage}
        {htmlspecialchars($member_info->homepage)} 
        {$lang->blog}
        {htmlspecialchars($member_info->blog)} 
        {$lang->birthday}
        {zdate($member_info->birthday,"Y-m-d")} 
        {$lang->signature}
        {$member_info->signature}
        {$lang->group}
        {$val}
        {$lang->signup_date}
        {zdate($member_info->regdate,"Y-m-d H:i")}
        {$lang->last_login}
        {zdate($member_info->last_login,"Y-m-d H:i")}
        {$lang->openid}
        {$lang->openid}
        {$openid->openid}
        {$lang->member_extend_info}
        -
        - {htmlspecialchars($val->column_title)} -
        -
        - - {$lang->private} - - - {htmlspecialchars($val->value[0])} - - - {htmlspecialchars($val->value[1])} - - - {htmlspecialchars($val->value[2])} - - {htmlspecialchars($val->value[0])}
        {htmlspecialchars($val->value[1])} - - {htmlspecialchars(implode(", ",$val->value))}  - - {zdate($val->value, "Y-m-d")}  - - {nl2br(htmlspecialchars($val->value))}  - - -
        - - {$lang->cmd_modify_member_info} - - {$lang->cmd_leave} - - {$lang->cmd_modify_member_password} - {$lang->cmd_leave} - - - {$lang->cmd_back} -
        +
        + diff --git a/modules/member/skins/default/modify_info.html b/modules/member/skins/default/modify_info.html index 1f71de33e..829b14cc7 100644 --- a/modules/member/skins/default/modify_info.html +++ b/modules/member/skins/default/modify_info.html @@ -27,240 +27,42 @@

        {$XE_VALIDATOR_MESSAGE}

        -
        profile_image == 'Y' || $member_config->image_name=='Y' || $member_config->image_mark=='Y')-->enctype="multipart/form-data"> + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {@ $dummy_chk = 0 } - - class="first-child" {@ $dummy_chk = 1; }> - - - - - +
          +
        • +

          {$lang->email_address} *

          +

          + + +

          +
        • +
        • +

          {$formTag->title}

          +
          {$formTag->inputTag}
          +
          {$editor}
          +
        • +
        • +

          {$lang->allow_mailing}

          +

          + + +

          +
        • +
        • +

          {$lang->allow_message}

          +

          + + + +

          +
        • +
        From f1c0f00ccc90350dc1c5dafb501c1273d213e2ce Mon Sep 17 00:00:00 2001 From: ovclas Date: Wed, 7 Sep 2011 08:24:46 +0000 Subject: [PATCH 0630/1372] issue 70 site map admin bug fix git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9082 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/lang/lang.xml | 16 ++++++++++ modules/admin/tpl/index.html | 12 +++---- modules/menu/lang/lang.xml | 42 +++++++++++++++++++++++- modules/menu/menu.admin.controller.php | 16 ++++++++++ modules/menu/tpl/js/sitemap.js | 31 ++++++------------ modules/menu/tpl/sitemap.html | 44 +++++++++++++------------- modules/module/lang/lang.xml | 6 +++- 7 files changed, 116 insertions(+), 51 deletions(-) diff --git a/modules/admin/lang/lang.xml b/modules/admin/lang/lang.xml index fdc95f139..5c791d436 100644 --- a/modules/admin/lang/lang.xml +++ b/modules/admin/lang/lang.xml @@ -16,6 +16,22 @@ + + + + + + + + + + + + + + + + diff --git a/modules/admin/tpl/index.html b/modules/admin/tpl/index.html index d067ffe53..c87862011 100644 --- a/modules/admin/tpl/index.html +++ b/modules/admin/tpl/index.html @@ -30,7 +30,7 @@
        -

        Current State

        +

        {$lang->current_state}

        -

        Latest Document

        +

        {$lang->latest_document}

          {@$document = $value->variables} @@ -61,7 +61,7 @@
        -

        Latest Comment

        +

        {$lang->latest_comment}

        • @@ -81,7 +81,7 @@
        -

        Latest Trackback

        +

        {$lang->latest_trackback}

        • @@ -100,7 +100,7 @@
        -

        XE Team Notice

        +

        {$lang->notice}

        -

        Your Favorite

        +

        {$lang->favorite}

        • {$favorite->title} diff --git a/modules/menu/lang/lang.xml b/modules/menu/lang/lang.xml index 9e3f2322d..9b4babdb2 100644 --- a/modules/menu/lang/lang.xml +++ b/modules/menu/lang/lang.xml @@ -58,6 +58,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -140,6 +176,10 @@ + + + + @@ -510,4 +550,4 @@ Menu không phải là người quản lý, nhiệm vụ của nó chỉ là li - \ No newline at end of file + diff --git a/modules/menu/menu.admin.controller.php b/modules/menu/menu.admin.controller.php index 3f932fefa..47a0a2490 100644 --- a/modules/menu/menu.admin.controller.php +++ b/modules/menu/menu.admin.controller.php @@ -127,6 +127,22 @@ if($btnOutput['hover_btn']) $args->hover_btn = $btnOutput['hover_btn']; if($btnOutput['active_btn']) $args->active_btn = $btnOutput['active_btn']; $args->group_srls = $source_args->group_srls; + + // if cType is CREATE, create module + if($source_args->cType == 'CREATE') + { + $site_module_info = Context::get('site_module_info'); + $cmArgs->site_srl = (int)$site_module_info->site_srl; + $cmArgs->mid = $source_args->create_menu_url; + $cmArgs->browser_title = $source_args->menu_name; + //$cmArgs->layout_srl = $this->selected_layout->layout_srl; + $cmArgs->module = $source_args->module_type; + $cmArgs->menu_srl = $source_args->menu_srl; + $oModuleController = &getController('module'); + $output = $oModuleController->insertModule($cmArgs); + if(!$output->toBool()) return Object(-1, 'fail_module_regist'); + } + // Check if already exists $oMenuModel = &getAdminModel('menu'); $item_info = $oMenuModel->getMenuItemInfo($args->menu_item_srl); diff --git a/modules/menu/tpl/js/sitemap.js b/modules/menu/tpl/js/sitemap.js index bd234c986..98254f04f 100644 --- a/modules/menu/tpl/js/sitemap.js +++ b/modules/menu/tpl/js/sitemap.js @@ -92,6 +92,15 @@ $('form.siteMap') menuForm.submit(); }); + var kindModuleLayer = $('#kindModule'); + var createModuleLayer = $('#createModule'); + var selectModuleLayer = $('#selectModule'); + var insertUrlLayer = $('#insertUrl'); + kindModuleLayer.hide(); + createModuleLayer.hide(); + selectModuleLayer.hide(); + insertUrlLayer.hide(); + $('a._add').click(function() { editForm.find('.h2').html('Add Menu'); @@ -104,28 +113,8 @@ $('form.siteMap') editForm.find('input=[name=menu_url]').val(''); editForm.find('input=[name=menu_open_window]').attr('checked', false); editForm.find('input=[name=group_srls\\[\\]]').attr('checked', false); - - /*var htmlBuffer = ''; - for(x in menuItem.groupList.item) - { - var groupObj = menuItem.groupList.item[x]; - - htmlBuffer += ''+groupObj.title+'' - } - $('#groupList').html(htmlBuffer);*/ }); - var kindModuleLayer = $('#kindModule'); - var createModuleLayer = $('#createModule'); - var selectModuleLayer = $('#selectModule'); - var insertUrlLayer = $('#insertUrl'); - kindModuleLayer.hide(); - createModuleLayer.hide(); - selectModuleLayer.hide(); - insertUrlLayer.hide(); - $('input._typeCheck').click(typeCheck); function typeCheck() @@ -165,7 +154,7 @@ $('form.siteMap') } } - $('#kModule').change(getModuleList); + $('#kModule').change(getModuleList).change(); function getModuleList() { var params = new Array(); diff --git a/modules/menu/tpl/sitemap.html b/modules/menu/tpl/sitemap.html index 30f77f332..c318063ce 100644 --- a/modules/menu/tpl/sitemap.html +++ b/modules/menu/tpl/sitemap.html @@ -6,7 +6,7 @@

          {$XE_VALIDATOR_MESSAGE}

          -

          Site Map

          +

          {$lang->menu_gnb_sub['siteMap']}

          {@$menuSrl = $value->menuSrl} @@ -17,14 +17,14 @@

          - 접기/펼치기 + {$lang->collapsing}/{$lang->expanding} -

          Add Menu... {$lang->cmd_remake_cache}

          +

          {$lang->add_menu} {$lang->cmd_remake_cache}

          @@ -33,7 +33,7 @@
          - +
        {$lang->member_default_info}
        {$lang->user_id}
        {htmlspecialchars($member_info->user_id)}
        {$lang->user_name} *

        {$lang->about_user_name}

        {$lang->nick_name} *

        {$lang->about_nick_name}

        {$lang->email_address} *

        {$lang->about_email_address}

        {$lang->find_account_question} *
        - -
        - -
        {$lang->profile_image}
        - - - - -
        -
        - -
        -

        {$lang->profile_image_max_width} : {$member_config->profile_image_max_width}px, {$lang->profile_image_max_height} : {$member_config->profile_image_max_height}px

        -
        {$lang->image_name}
        - - - - -
        -
        - -
        -

        {$lang->image_name_max_width} : {$member_config->image_name_max_width}px, {$lang->image_name_max_height} : {$member_config->image_name_max_height}px

        -
        {$lang->image_mark}
        - - - - -
        -
        - -
        -

        {$lang->image_mark_max_width} : {$member_config->image_mark_max_width}px, {$lang->image_mark_max_height} : {$member_config->image_mark_max_height}px

        -
        {$lang->homepage}

        {$lang->about_homepage}

        {$lang->blog}

        {$lang->about_blog_url}

        {$lang->birthday}
        - - - - -

        {$lang->about_birthday}

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

        {$lang->about_allow_mailing}

        {$lang->signature}
        {$editor}
        {$lang->member_extend_info}
        - {htmlspecialchars($val->column_title)} - * - - - - - - - - - - - - - - - - - - - - - - - - - - -
          - -
        • value)&&in_array($v, $val->value))-->checked="checked"/>{$v}
        • - -
        - - - - - -
          - -
        • value == $v)-->checked="checked"/>{$v}
        • - -
        - - - - - - - - -
        - - -
        - - -
        -
        - - - - - - - - - - - - - - - - - -

        {$val->description}

        -
        - is_opened)-->checked="checked" value="Y" id="open_{$val->column_name}" /> - -
        -
        {$lang->openid}
        - - - - - - - - - - - - - - - - - - - - - - - - -
        {$lang->description}
        {$lang->component_author}
        {$lang->component_version}
        {$lang->component_date}
        {$xml_info->title} ({$component_name})
        {$lang->cmd_setup} - - {$lang->cmd_enable} - - {$lang->cmd_disable} - - {$lang->cmd_move_up}{$lang->cmd_move_down}
        {nl2br($xml_info->description)} - - {$author->name} - - {$xml_info->version}{$xml_info->date}
        +
        +

        Editor Option

        +
          +
        • +

          본문 에디터를 선택하세요.

          +

          + + editor_skin)-->checked="checked" /> + + +
          + +

          +
        • +
        • +

          +

          px

          +
        • +
        • +

          댓글 에디터를 선택하세요.

          +

          + + comment_editor_skin)-->checked="checked" /> + + +
          + +

          +
        • +
        • +

          +

          px

          +
        • +
        • +

          본문 서식을 선택하세요.

          +

          + + content_style||!$editor_config->content_style&&$key=='default')-->checked="checked"> + +

          +
        • +
        • +

          본문 글꼴을 선택하세요.

          + +

          + content_font)-->checked="checked" />
          + + content_font==$name)-->checked="checked" />
          + +

          +
        • +
        • +

          + +

          px

          +
        • + +
        +
        + +
        +
        + +
        + +
        +

        Editor Component

        +
        + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + All({$component_count}) +
        이동{$lang->component_name} {$lang->user_name}{$lang->version}{$lang->author}{$lang->path}{$lang->use}{$lang->cmd_delete}
        + +

        {$xml_info->title}

        +

        {nl2br($xml_info->description)}

        + +

        이 항목 업데이트가 가능합니다. 업데이트 하시겠습니까?

        + +
        {$xml_info->version} + + {$author->name} + + {$xml_info->path}enabled=='Y')--> checked="checked" /> + + Delete + +
        +
        +
        + +
        +
        +
        +
        diff --git a/modules/editor/tpl/config_preview.html b/modules/editor/tpl/config_preview.html new file mode 100644 index 000000000..9d256ea88 --- /dev/null +++ b/modules/editor/tpl/config_preview.html @@ -0,0 +1,18 @@ + + +
        +

        에디터 미리보기

        +

        본문 에디터

        +
        + + + +

        {$editor}

        +

        +

        댓글 에디터

        +
        + + +

        {$editor_comment}

        +
        +
        \ No newline at end of file diff --git a/modules/editor/tpl/js/editor_admin.js b/modules/editor/tpl/js/editor_admin.js index ccdb3ae15..1c8966f7a 100644 --- a/modules/editor/tpl/js/editor_admin.js +++ b/modules/editor/tpl/js/editor_admin.js @@ -2,34 +2,8 @@ * @author NHN (developers@xpressengine.com) * @version 0.1 * @brief 에디터 관리자 페이지용 스크립트 - **/ - -function doEnableComponent(component_name) { - var params = new Array(); - params['component_name'] = component_name; - - exec_xml('editor', 'procEditorAdminEnableComponent', params, completeUpdate); -} - -function doDisableComponent(component_name) { - var params = new Array(); - params['component_name'] = component_name; - - exec_xml('editor', 'procEditorAdminDisableComponent', params, completeUpdate); -} - -function doMoveListOrder(component_name, mode) { - var params = new Array(); - params['component_name'] = component_name; - params['mode'] = mode; - - exec_xml('editor', 'procEditorAdminMoveListOrder', params, completeUpdate); -} - -function completeUpdate(ret_obj) { - location.reload(); -} - + **/ + function doSetupComponent(component_name) { popopen(request_uri.setQuery('module','editor').setQuery('act','dispEditorAdminSetupComponent').setQuery('component_name',component_name), 'SetupComponent'); } diff --git a/modules/editor/tpl/js/editor_module_config.js b/modules/editor/tpl/js/editor_module_config.js index f4607f7f8..b3b440b18 100644 --- a/modules/editor/tpl/js/editor_module_config.js +++ b/modules/editor/tpl/js/editor_module_config.js @@ -1,37 +1,44 @@ -function getEditorSkinColorList(skin_name,selected_colorset,type){ +function getEditorSkinColorList(skin_name,selected_colorset,type,testid){ if(skin_name.length>0){ type = type || 'document'; var response_tags = new Array('error','message','colorset'); - exec_xml('editor','dispEditorSkinColorset',{skin:skin_name},resultGetEditorSkinColorList,response_tags,{'selected_colorset':selected_colorset,'type':type}); + exec_xml('editor','dispEditorSkinColorset',{skin:skin_name},resultGetEditorSkinColorList,response_tags,{'selected_colorset':selected_colorset,'type':type,'testid':testid}); } } function resultGetEditorSkinColorList(ret_obj,response_tags, params) { - var selectbox = null; - if(params.type == 'document'){ - selectbox = xGetElementById("sel_editor_colorset"); - }else{ - selectbox = xGetElementById("sel_comment_editor_colorset"); - } + jQuery(function($){ + selectbox = jQuery("#"+params.testid).next('label').next('select'); + selectbox.html(''); + + if(params.type == 'document'){ + $("select[name=sel_editor_colorset]").css('display','none'); + $("select[name=sel_editor_colorset]").removeAttr('name'); + selectbox.attr('name','sel_editor_colorset'); + }else{ + $("select[name=sel_comment_editor_colorset]").css('display','none'); + $("select[name=sel_comment_editor_colorset]").removeAttr('name'); + selectbox.attr('name','sel_comment_editor_colorset'); + } - if(ret_obj['error'] == 0 && ret_obj.colorset){ - var it = new Array(); - var items = ret_obj['colorset']['item']; - if(typeof(items[0]) == 'undefined'){ - it[0] = items; - }else{ - it = items; - } - var sel = 0; - for(var i=0,c=it.length;i'+it[i].title+'')); + } + selectbox.css('display',''); + }else{ + selectbox.css('display','none'); + selectbox.innerHTML=""; + } + }); } From d00f84fe032376c13ea5ad70227b3fd7727fe610 Mon Sep 17 00:00:00 2001 From: flyskyko Date: Wed, 7 Sep 2011 09:06:29 +0000 Subject: [PATCH 0633/1372] change pagination code git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9085 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/autoinstall/tpl/list.html | 4 +++- modules/comment/tpl/comment_list.html | 4 +++- modules/document/tpl/document_list.html | 4 +++- modules/file/tpl/file_list.html | 4 +++- modules/member/tpl/member_list.html | 20 +++++++++++--------- modules/module/tpl/adminFileBox.html | 10 ++++++---- modules/module/tpl/filebox_list_html.html | 4 +++- modules/module/tpl/module_langcode.html | 4 +++- modules/poll/tpl/poll_list.html | 4 +++- modules/trackback/tpl/trackback_list.html | 4 +++- 10 files changed, 41 insertions(+), 21 deletions(-) diff --git a/modules/autoinstall/tpl/list.html b/modules/autoinstall/tpl/list.html index 69c890987..0f16eb365 100644 --- a/modules/autoinstall/tpl/list.html +++ b/modules/autoinstall/tpl/list.html @@ -82,6 +82,7 @@ « FIRST + {@$isGoTo = true} 1 ... @@ -91,11 +92,12 @@ {$page_no} + {@$isGoTo = true} ... {$page_navigation->last_page} LAST » - + diff --git a/modules/comment/tpl/comment_list.html b/modules/comment/tpl/comment_list.html index ba4f45885..8c9b2dddb 100644 --- a/modules/comment/tpl/comment_list.html +++ b/modules/comment/tpl/comment_list.html @@ -109,6 +109,7 @@ « FIRST + {@$isGoTo = true} 1 ... @@ -118,11 +119,12 @@ {$page_no} + {@$isGoTo = true} ... {$page_navigation->last_page} LAST » - + diff --git a/modules/document/tpl/document_list.html b/modules/document/tpl/document_list.html index e707e1c0d..47b63d086 100644 --- a/modules/document/tpl/document_list.html +++ b/modules/document/tpl/document_list.html @@ -135,6 +135,7 @@ « FIRST + {@$isGoTo = true} 1 ... @@ -144,11 +145,12 @@ {$page_no} + {@$isGoTo = true} ... {$page_navigation->last_page} LAST » - + diff --git a/modules/file/tpl/file_list.html b/modules/file/tpl/file_list.html index f0baf4d38..df2e089d4 100644 --- a/modules/file/tpl/file_list.html +++ b/modules/file/tpl/file_list.html @@ -142,6 +142,7 @@ « FIRST + {@$isGoTo = true} 1 ... @@ -151,11 +152,12 @@ {$page_no} + {@$isGoTo = true} ... {$page_navigation->last_page} LAST » - + diff --git a/modules/member/tpl/member_list.html b/modules/member/tpl/member_list.html index 64159b9c0..4d3dd8bb7 100644 --- a/modules/member/tpl/member_list.html +++ b/modules/member/tpl/member_list.html @@ -14,11 +14,11 @@ {$lang->cmd_show_all_member} | {$lang->cmd_show_super_admin_member} - | + | {$lang->cmd_show_site_admin_member} - | + | {$lang->approval} - | + | {$lang->denied}
        @@ -140,8 +140,9 @@ « FIRST + {@$isGoTo = true} 1 - ... + ... @@ -151,13 +152,14 @@ - ... + {@$isGoTo = true} + ... {$page_navigation->last_page} - + LAST » - + @@ -169,7 +171,7 @@ - + {$lang->cmd_cancel} @@ -187,7 +189,7 @@ jQuery(function($){ if (clickedBTN == 'delete') return confirm(xe.lang.msg_delete_user); } }); - + var checkConfirm = new CheckConfirm(); var v = xe.getApp('Validator')[0]; v.registerPlugin(checkConfirm); diff --git a/modules/module/tpl/adminFileBox.html b/modules/module/tpl/adminFileBox.html index 6048fb135..9e9844c27 100644 --- a/modules/module/tpl/adminFileBox.html +++ b/modules/module/tpl/adminFileBox.html @@ -56,8 +56,9 @@ « FIRST + {@$isGoTo = true} 1 - ... + ... @@ -67,13 +68,14 @@ - ... + {@$isGoTo = true} + ... {$page_navigation->last_page} - + LAST » - + diff --git a/modules/module/tpl/filebox_list_html.html b/modules/module/tpl/filebox_list_html.html index 552df1f75..58c307f33 100644 --- a/modules/module/tpl/filebox_list_html.html +++ b/modules/module/tpl/filebox_list_html.html @@ -7,6 +7,7 @@
        + @@ -119,17 +125,35 @@ - + + + + + + + + + + + + + + + - - + @@ -73,13 +70,8 @@ @@ -98,30 +90,25 @@ -
        -
          -
        • -
        • -
        • -
        • -
        • -
        • -
        • -
        • -
        • -
        • -
        • -
        • -
        +
        +
          +
          +

          다국어 수정 | 추가

          +
            + {@ + /* move current language to the top */ + $a = array($lang_type=>$lang_supported[$lang_type]); + unset($lang_supported[$lang_type]); + $lang_supported = array_merge($a, $lang_supported); + } +
          • +
          +
          - -

          다국어 텍스트가 변경되었습니다. 업데이트 버튼을 클릭하면 같은 텍스트를 사용하는 다른 페이지에도 반영됩니다. 새로 저장 버튼을 클릭하면 이 페이지에만 적용됩니다.

          - - +
          - -

          다국어 텍스트 관리

          +

          다국어 텍스트 관리

          diff --git a/modules/module/module.admin.model.php b/modules/module/module.admin.model.php index 7ea4c10f0..5d704dbc3 100644 --- a/modules/module/module.admin.model.php +++ b/modules/module/module.admin.model.php @@ -186,18 +186,18 @@ } /** - * @brief Return lang list + * @brief Returns lang list by lang name **/ function getModuleAdminLangListByName() { $args = Context::getRequestVars(); if(!$args->site_srl) $args->site_srl = 0; - $columnList = array('lang_code', 'value'); + $columnList = array('lang_code', 'name', 'value'); $langList = array(); - $args->langName = preg_replace('/\$user_lang->/', '', $args->lang_name); + $args->langName = preg_replace('/^\$user_lang->/', '', $args->lang_name); $output = executeQueryArray('module.getLangListByName', $args, $columnList); if($output->toBool()) $langList = $output->data; @@ -213,26 +213,27 @@ $args = Context::getRequestVars(); if(!$args->site_srl) $args->site_srl = 0; - $langList = array(); - $args->value = $args->lang_name; - // search value $output = executeQueryArray('module.getLangNameByValue', $args); - if ($output->toBool()){ + if ($output->toBool() && is_array($output->data)){ unset($args->value); - $args->langName = $output->data[0]->name; - $columnList = array('lang_code', 'value'); - $output = executeQueryArray('module.getLangListByName', $args, $columnList); + foreach($output->data as $data) { + $args->langName = $data->name; + $columnList = array('lang_code', 'name', 'value'); + $outputByName = executeQueryArray('module.getLangListByName', $args, $columnList); - if($output->toBool()) $langList = $output->data; + if($outputByName->toBool()) { + $langList = array_merge($langList, $outputByName->data); + } + } } $this->add('lang_list', $langList); - $this->add('lang_name', $args->langName); } + /** * @brief Return current lang list **/ From c6ea0a71372204ea2e5a344be0ac6fa04be23c05 Mon Sep 17 00:00:00 2001 From: devjin Date: Thu, 8 Sep 2011 06:36:55 +0000 Subject: [PATCH 0663/1372] add install identifier git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9115 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/member/member.class.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/modules/member/member.class.php b/modules/member/member.class.php index 0e3c64cdd..fb1f01b3d 100644 --- a/modules/member/member.class.php +++ b/modules/member/member.class.php @@ -59,9 +59,10 @@ $extendItems = $oMemberModel->getJoinFormList(); + $identifier = 'email_address'; $items = array('user_id', 'password', 'user_name', 'nick_name', 'email_address', 'find_account_question', 'homepage', 'blog', 'birthday', 'signature', 'profile_image', 'image_name', 'image_mark'); - $mustRequireds = array('email_address', 'password', 'find_account_question'); - $orgRequireds = array('email_address', 'password', 'find_account_question'); + $mustRequireds = array('email_address', 'nick_name','password', 'find_account_question'); + $orgRequireds = array('email_address', 'nick_name','password', 'find_account_question'); $orgUse = array('email_address', 'password', 'find_account_question'); $list_order = array(); foreach($items as $key){ @@ -73,6 +74,7 @@ $signupItem->imageType = (strpos($key, 'image') !== false); $signupItem->required = in_array($key, $orgRequireds); $signupItem->isUse = ($config->{$key} == 'Y') || in_array($key, $orgUse); + $signupItem->isIdentifier = ($key == $identifier); if ($signupItem->imageType){ $signupItem->max_width = $config->{$key.'_max_width'}; $signupItem->max_height = $config->{$key.'_max_height'}; @@ -98,6 +100,7 @@ } } $args->signupForm = $list_order; + $args->identifier = $identifier; $oModuleController->insertModuleConfig('member',$args); // Create a member controller object @@ -274,7 +277,7 @@ $identifier = 'user_id'; $items = array('user_id', 'password', 'user_name', 'nick_name', 'email_address', 'find_account_question', 'homepage', 'blog', 'birthday', 'signature', 'profile_image', 'image_name', 'image_mark'); - $mustRequireds = array('email_address', 'password', 'find_account_question'); + $mustRequireds = array('email_address', 'nick_name','password', 'find_account_question'); $orgRequireds = array('email_address', 'password', 'find_account_question', 'user_id', 'nick_name', 'user_name'); $orgUse = array('email_address', 'password', 'find_account_question', 'user_id', 'nick_name', 'user_name', 'homepage', 'blog', 'birthday'); $list_order = array(); @@ -313,6 +316,7 @@ } } $config->signupForm = $list_order; + $config->identifier = $identifier; $output = $oModuleController->updateModuleConfig('member', $config); } From 2a3e052a9593158ade5c866834b89aa50bfe1638 Mon Sep 17 00:00:00 2001 From: taggon Date: Thu, 8 Sep 2011 07:21:39 +0000 Subject: [PATCH 0664/1372] Modify some code based on new document structure git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9116 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/tpl/css/admin.css | 4 +-- modules/admin/tpl/js/admin.js | 35 +++++++++++++----------- modules/member/tpl/group_list.html | 43 +++++++++++++++--------------- 3 files changed, 43 insertions(+), 39 deletions(-) diff --git a/modules/admin/tpl/css/admin.css b/modules/admin/tpl/css/admin.css index 8061be026..866e6bea7 100644 --- a/modules/admin/tpl/css/admin.css +++ b/modules/admin/tpl/css/admin.css @@ -390,9 +390,7 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */ .x .btnArea:after{content:"";display:block;clear:both} /* Multilingual */ .x .langEdit{background:#fff;position:absolute;*left:0;*margin-top:28px;z-index:10;box-shadow:3px 3px 6px #999;-moz-box-shadow:3px 3px 6px #999;-webkit-box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} -.x .langEdit .langList{float:left} -.x .langEdit .langEditControls{float:right} -.x .langEdit .action{clear:both;border:1px solid #eee;width:268px;padding:0 10px} +.x .langEdit .action{border:1px solid #eee;width:268px;padding:0 10px} .x .langEdit ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0} .x .langEdit li{padding:.5em 10px} .x .langEdit input[type=text]{width:220px;padding-right:40px} diff --git a/modules/admin/tpl/js/admin.js b/modules/admin/tpl/js/admin.js index 8a1af948f..8d6710b98 100644 --- a/modules/admin/tpl/js/admin.js +++ b/modules/admin/tpl/js/admin.js @@ -816,9 +816,8 @@ $('.multiLangEdit') initLayer($layer); // reset - $layer - .trigger('multilang-reset') - .find('.langEditControls li.'+xe.current_lang+' > input').val(text).prev('label').css('visibility','hidden'); + $layer.trigger('multilang-reset') + $('#langInput li.'+xe.current_lang+' > input').val(text).prev('label').css('visibility','hidden'); // hide suggestion layer $mle.find('.suggestion').hide(); @@ -918,9 +917,10 @@ function initLayer($layer) { $layer .data('multilang-current-name', '') - .find('.langEditControls li > input').val('').prev('label').css('visibility','visible'); + .find('ul.langList') + .find('#langInput li > input').val('').prev('label').css('visibility','visible'); }) - .find('h3 a') + .find('h2 a') .click(function(){ mode = !mode; setTitleText(); @@ -928,7 +928,7 @@ function initLayer($layer) { return false; }) .end() - .delegate('button[type="button"]', 'click', function(){ + .delegate('a.langItem', 'click', function(){ var $this = $(this), $controls, list, name, i, c; list = $layer.data('multilang-list'); @@ -937,10 +937,14 @@ function initLayer($layer) { if(!list || !list[name]) return; list = list[name]; - $controls = $layer.find('.langEditControls'); + $controls = $('#langInput'); - // reset - $layer.trigger('multilann-reset'); + $layer + .trigger('multilang-reset') // reset + .find('a.langItem.active').removeClass('active') + .data('multilang-current-name', name); + + $this.parent('li').addClass('active'); for(var code in list) { if(!list.hasOwnProperty(code)) continue; @@ -952,13 +956,14 @@ function initLayer($layer) { current_status = 0; $submit.val(status_texts[current_status]); - $layer.data('multilang-current-name', name); mode = MODE_UPDATE; setTitleText(); + + return false; }); - cmd_edit = $layer.find('h3 em').text(); - cmd_add = $layer.find('h3 a').text(); + cmd_edit = $layer.find('h2 strong').text(); + cmd_add = $layer.find('h2 a').text(); $input = $layer.find('input:text,textarea') .change(function(){ @@ -976,8 +981,8 @@ function initLayer($layer) { }; function setTitleText() { - $layer.find('h3') - .find('em').text(mode==MODE_SAVE?cmd_add:cmd_edit).end() + $layer.find('h2') + .find('strong').text(mode==MODE_SAVE?cmd_add:cmd_edit).end() .find('a').text(mode==MODE_SAVE?cmd_edit:cmd_add).end() }; @@ -989,7 +994,7 @@ function initLayer($layer) { function use_lang() { $layer.hide().closest('.multiLangEdit').find('.vLang') .eq(0).val('$user_lang->'+name).end() - .eq(1).val($layer.find('.langEditControls li.'+xe.current_lang+' >input').val()).end(); + .eq(1).val($('#langInput li.'+xe.current_lang+' >input').val()).end(); }; function save_lang() { diff --git a/modules/member/tpl/group_list.html b/modules/member/tpl/group_list.html index 5257081e3..059de1245 100644 --- a/modules/member/tpl/group_list.html +++ b/modules/member/tpl/group_list.html @@ -88,29 +88,30 @@
          - - -
          -
            -
            -

            다국어 수정 | 추가

            -
              - {@ - /* move current language to the top */ - $a = array($lang_type=>$lang_supported[$lang_type]); - unset($lang_supported[$lang_type]); - $lang_supported = array_merge($a, $lang_supported); - } -
            • -
            -
            -
            -
            - + + +
            +
              +
              +

              다국어 수정 | 추가

              +
                + {@ + /* move current language to the top */ + $a = array($lang_type=>$lang_supported[$lang_type]); + unset($lang_supported[$lang_type]); + $lang_supported = array_merge($a, $lang_supported); + } +
              • +
              +
              + -

              다국어 텍스트 관리

              -
              +
              @@ -90,12 +90,8 @@ -
              - +
              +

                다국어 수정 | 추가

                  @@ -107,12 +103,12 @@ }
                -
                - From 635321ca12640a3d2de41873563c7857d4ff9920 Mon Sep 17 00:00:00 2001 From: ovclas Date: Thu, 8 Sep 2011 08:26:27 +0000 Subject: [PATCH 0671/1372] issue 160 array check git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9123 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/module/module.admin.view.php | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/modules/module/module.admin.view.php b/modules/module/module.admin.view.php index cadeaff8b..53f484635 100644 --- a/modules/module/module.admin.view.php +++ b/modules/module/module.admin.view.php @@ -32,18 +32,21 @@ $oAutoinstallModel = &getModel('autoinstall'); $module_list = $oModuleModel->getModuleList(); - foreach($module_list as $key => $val) { - $module_list[$key]->delete_url = $oAutoinstallModel->getRemoveUrlByPath($val->path); + if(is_array($module_list)) + { + foreach($module_list as $key => $val) { + $module_list[$key]->delete_url = $oAutoinstallModel->getRemoveUrlByPath($val->path); - // get easyinstall need update - $packageSrl = $oAutoinstallModel->getPackageSrlByPath($val->path); - $package = $oAutoinstallModel->getInstalledPackages($packageSrl); - $module_list[$key]->need_autoinstall_update = $package[$packageSrl]->need_update; + // get easyinstall need update + $packageSrl = $oAutoinstallModel->getPackageSrlByPath($val->path); + $package = $oAutoinstallModel->getInstalledPackages($packageSrl); + $module_list[$key]->need_autoinstall_update = $package[$packageSrl]->need_update; - // get easyinstall update url - if ($module_list[$key]->need_autoinstall_update) - { - $module_list[$key]->update_url = $oAutoinstallModel->getUpdateUrlByPackageSrl($packageSrl); + // get easyinstall update url + if ($module_list[$key]->need_autoinstall_update) + { + $module_list[$key]->update_url = $oAutoinstallModel->getUpdateUrlByPackageSrl($packageSrl); + } } } From 01855743028489a9a0bd1ecb7d5b84abf06e5910 Mon Sep 17 00:00:00 2001 From: devjin Date: Thu, 8 Sep 2011 08:39:55 +0000 Subject: [PATCH 0672/1372] issue 160 fixed memberinfo in install script git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9124 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/member/member.admin.controller.php | 2 +- modules/member/member.class.php | 12 +++++++++--- modules/member/member.controller.php | 3 +++ 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/modules/member/member.admin.controller.php b/modules/member/member.admin.controller.php index 50a6668be..4fa53c70e 100644 --- a/modules/member/member.admin.controller.php +++ b/modules/member/member.admin.controller.php @@ -168,7 +168,7 @@ global $lang; $signupForm = array(); $items = array('user_id', 'password', 'user_name', 'nick_name', 'email_address', 'find_account_question', 'homepage', 'blog', 'birthday', 'signature', 'profile_image', 'image_name', 'image_mark', 'profile_image_max_width', 'profile_image_max_height', 'image_name_max_width', 'image_name_max_height', 'image_mark_max_width', 'image_mark_max_height'); - $mustRequireds = array('email_address', 'password', 'find_account_question'); + $mustRequireds = array('email_address', 'nick_name', 'password', 'find_account_question'); $extendItems = $oMemberModel->getJoinFormList(); foreach($list_order as $key){ unset($signupItem); diff --git a/modules/member/member.class.php b/modules/member/member.class.php index 48dcb9bb0..5a33f0782 100644 --- a/modules/member/member.class.php +++ b/modules/member/member.class.php @@ -63,7 +63,7 @@ $items = array('user_id', 'password', 'user_name', 'nick_name', 'email_address', 'find_account_question', 'homepage', 'blog', 'birthday', 'signature', 'profile_image', 'image_name', 'image_mark'); $mustRequireds = array('email_address', 'nick_name','password', 'find_account_question'); $orgRequireds = array('email_address', 'nick_name','password', 'find_account_question'); - $orgUse = array('email_address', 'password', 'find_account_question'); + $orgUse = array('email_address', 'nick_name', 'password', 'find_account_question'); $list_order = array(); foreach($items as $key){ unset($signupItem); @@ -79,7 +79,10 @@ $signupItem->max_width = $config->{$key.'_max_width'}; $signupItem->max_height = $config->{$key.'_max_height'}; } - $list_order[] = $signupItem; + if ($signupItem->isIdentifier) + array_unshift($list_order, $signupItem); + else + $list_order[] = $signupItem; } if (is_array($extendItems)){ foreach($extendItems as $form_srl=>$item_info){ @@ -295,7 +298,10 @@ $signupItem->max_width = $config->{$key.'_max_width'}; $signupItem->max_height = $config->{$key.'_max_height'}; } - $list_order[] = $signupItem; + if ($signupItem->isIdentifier) + array_unshift($list_order, $signupItem); + else + $list_order[] = $signupItem; } if (is_array($extendItems)){ foreach($extendItems as $form_srl=>$item_info){ diff --git a/modules/member/member.controller.php b/modules/member/member.controller.php index 6ea54e114..08363b671 100644 --- a/modules/member/member.controller.php +++ b/modules/member/member.controller.php @@ -1570,6 +1570,9 @@ if($args->password && !$password_is_hashed) $args->password = md5($args->password); elseif(!$args->password) unset($args->password); + if (!$args->user_id) $args->user_id = 't'.$args->member_srl; + if (!$args->user_name) $args->user_name = $args->member_srl + $output = executeQuery('member.insertMember', $args); if(!$output->toBool()) { $oDB->rollback(); From 40f18aa55e5a8902d5d94b1c9886af53a072039a Mon Sep 17 00:00:00 2001 From: devjin Date: Thu, 8 Sep 2011 08:42:29 +0000 Subject: [PATCH 0673/1372] issue 160 fixed syntax bug git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9125 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/member/member.controller.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/member/member.controller.php b/modules/member/member.controller.php index 08363b671..39948da97 100644 --- a/modules/member/member.controller.php +++ b/modules/member/member.controller.php @@ -1571,7 +1571,7 @@ elseif(!$args->password) unset($args->password); if (!$args->user_id) $args->user_id = 't'.$args->member_srl; - if (!$args->user_name) $args->user_name = $args->member_srl + if (!$args->user_name) $args->user_name = $args->member_srl; $output = executeQuery('member.insertMember', $args); if(!$output->toBool()) { From d1524e95b9464918402b5d8c6747d124f994e391 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Thu, 8 Sep 2011 08:47:30 +0000 Subject: [PATCH 0674/1372] Install UI fix. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9126 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/install/ruleset/install.xml | 5 ++--- modules/install/tpl/admin_form.html | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/modules/install/ruleset/install.xml b/modules/install/ruleset/install.xml index 4879e19b7..58ab39043 100644 --- a/modules/install/ruleset/install.xml +++ b/modules/install/ruleset/install.xml @@ -3,11 +3,10 @@ - + - + - diff --git a/modules/install/tpl/admin_form.html b/modules/install/tpl/admin_form.html index 4af268c7a..0675b109c 100644 --- a/modules/install/tpl/admin_form.html +++ b/modules/install/tpl/admin_form.html @@ -10,12 +10,11 @@
                  -
                • +
                • -
                • +
                • -

                {$lang->install_notandum}

                From 338b70f0b32ad0dcbbf5c02d0155f5736bd31781 Mon Sep 17 00:00:00 2001 From: taggon Date: Thu, 8 Sep 2011 09:54:05 +0000 Subject: [PATCH 0675/1372] Fixed a bug for caching invalid queries git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9127 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/install/install.controller.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/install/install.controller.php b/modules/install/install.controller.php index 267a84d10..f70ee75a7 100644 --- a/modules/install/install.controller.php +++ b/modules/install/install.controller.php @@ -166,7 +166,8 @@ Context::setDBInfo($db_info); // Create DB Instance $oDB = &DB::getInstance(); - + // Force update dbParser + XmlQueryParser::getDBParser(true); // Check if available to connect to the DB if(!$oDB->isConnected()) return $oDB->getError(); // When installing firebire DB, transaction will not be used From 662b3f09150f8f84a448acc8f72129197312860d Mon Sep 17 00:00:00 2001 From: flyskyko Date: Thu, 8 Sep 2011 10:39:07 +0000 Subject: [PATCH 0676/1372] issue 160, fixed eval lang code git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9128 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/context/Context.class.php | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/classes/context/Context.class.php b/classes/context/Context.class.php index 713294c18..6fa786330 100644 --- a/classes/context/Context.class.php +++ b/classes/context/Context.class.php @@ -466,16 +466,21 @@ class Context { if(!is_array($self->loaded_lang_files)) $self->loaded_lang_files = array(); if(in_array($filename, $self->loaded_lang_files)) return; - $self->loaded_lang_files[] = $filename; - if (is_readable($filename)) + if ($filename && is_readable($filename)){ + $self->loaded_lang_files[] = $filename; @include($filename); - else + }else{ $self->_evalxmlLang($path); + } } function _evalxmlLang($path) { global $lang; + + $_path = 'eval://'.$path; + + if(in_array($_path, $this->loaded_lang_files)) return; if(substr($path,-1)!='/') $path .= '/'; $file = $path.'lang.xml'; @@ -483,7 +488,10 @@ class Context { $oXmlLangParser = new XmlLangParser($file, $this->lang_type); $content = $oXmlLangParser->getCompileContent(); - eval($content); + if ($content){ + $this->loaded_lang_files[] = $_path; + eval($content); + } } function _loadXmlLang($path) { From 02c7587226f44a4155b4c2a34e9f8da56b5d2fb2 Mon Sep 17 00:00:00 2001 From: ucorina Date: Thu, 8 Sep 2011 14:57:31 +0000 Subject: [PATCH 0677/1372] issue 157 - Updated code so that no queries will execute when DB is not set and removed default escape char hack. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9129 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/db/DB.class.php | 10 ++++------ modules/install/install.controller.php | 2 -- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/classes/db/DB.class.php b/classes/db/DB.class.php index df03ac2ab..dda455029 100644 --- a/classes/db/DB.class.php +++ b/classes/db/DB.class.php @@ -75,6 +75,8 @@ var $cache_file = 'files/cache/queries/'; ///< location of query cache + var $db_type; ///< stores database type: 'mysql','cubrid','mssql' etc. or 'db' when database is not yet set + /** * @brief returns instance of certain db type * @param[in] $db_type type of db @@ -93,6 +95,7 @@ // get a singletone instance of the database driver class require_once($class_file); $GLOBALS['__DB__'][$db_type] = call_user_func(array($class_name, 'create')); + $GLOBALS['__DB__'][$db_type]->db_type = $db_type; } return $GLOBALS['__DB__'][$db_type]; @@ -323,6 +326,7 @@ **/ function executeQuery($query_id, $args = NULL, $arg_columns = NULL, $database_type = 'master') { if(!$query_id) return new Object(-1, 'msg_invalid_queryid'); + if(!$this->db_type) return; $this->actDBClassStart(); @@ -601,12 +605,6 @@ return "INSERT INTO $tableName \n $values"; } - // HACK This is needed because on installation, the XmlQueryParer is used without any configured database - // TODO Change this or make sure the query cache files created before db.config exists are deleted - function getParser(){ - return new DBParser('`'); - } - function _getSlaveConnectionStringIndex() { $max = count($this->slave_db); $indx = rand(0, $max - 1); diff --git a/modules/install/install.controller.php b/modules/install/install.controller.php index f70ee75a7..da20fcf5a 100644 --- a/modules/install/install.controller.php +++ b/modules/install/install.controller.php @@ -166,8 +166,6 @@ Context::setDBInfo($db_info); // Create DB Instance $oDB = &DB::getInstance(); - // Force update dbParser - XmlQueryParser::getDBParser(true); // Check if available to connect to the DB if(!$oDB->isConnected()) return $oDB->getError(); // When installing firebire DB, transaction will not be used From 479d15afac41ecae17b907b23e3144ebff11a841 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Fri, 9 Sep 2011 00:41:19 +0000 Subject: [PATCH 0678/1372] Install UI fix. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9130 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/install/lang/lang.xml | 32 ++++++++++++++-------------- modules/install/tpl/config_form.html | 2 +- modules/install/tpl/css/install.css | 3 ++- 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/modules/install/lang/lang.xml b/modules/install/lang/lang.xml index 71aa8c751..59395b6ea 100644 --- a/modules/install/lang/lang.xml +++ b/modules/install/lang/lang.xml @@ -13,11 +13,11 @@ - + - + @@ -408,16 +408,16 @@ 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.]]>
                - manual]]> - manual for more info]]> - manual]]> - manual]]> - manual]]> - manual]]> - manual]]> - manual]]> - manueli inceleyiniz]]> - CUBRID Database. Hướng dẫn]]> + Manual]]> + Manual for more info]]> + Manual]]> + Manual]]> + Manual]]> + Manual]]> + Manual]]> + Manual]]> + Manueli inceleyiniz]]> + CUBRID Database. Hướng dẫn]]> @@ -857,8 +857,8 @@ Xin cảm ơn đã sử dụng XE!]]> - 반드시 동의해야 합니다.]]> - 반드시 동의해야 합니다.]]> + 이 항목에 반드시 동의해야 합니다.]]> + 이 항목에 반드시 동의해야 합니다.]]> @@ -869,8 +869,8 @@ Xin cảm ơn đã sử dụng XE!]]> - >웹서버, 데이터베이스, PHP버전과 Extension, 사이트에 설치된 모듈과 애드온' 정보가 XE 통계 수집 서버로 전송됩니다. 수집된 정보는 더 나은 SW를 제작하기 위한 통계 수집 이외의 목적으로 활용하지 않습니다. XE는 사용자의 설치 환경 정보를 외부에 공개하지 않습니다. 이 항목에 반드시 동의하지 않아도 됩니다.]]> - >웹서버, 데이터베이스, PHP버전과 Extension, 사이트에 설치된 모듈과 애드온' 정보가 XE 통계 수집 서버로 전송됩니다. 수집된 정보는 더 나은 SW를 제작하기 위한 통계 수집 이외의 목적으로 활용하지 않습니다. XE는 사용자의 설치 환경 정보를 외부에 공개하지 않습니다. 이 항목에 반드시 동의하지 않아도 됩니다.]]> + 웹 서버, DBMS, PHP 버전 및 Extension, XE 모듈 및 애드온' 정보가 XE 통계 수집 서버로 전송됩니다. 더 나은 SW를 제작하기 위한 목적으로 활용합니다. 익명으로 수집되며 이 정보를 외부에 공개하지 않습니다. 이 항목에 동의하지 않아도 됩니다.]]> + 웹 서버, DBMS, PHP 버전 및 Extension, XE 모듈 및 애드온' 정보가 XE 통계 수집 서버로 전송됩니다. 더 나은 SW를 제작하기 위한 목적으로 활용합니다. 익명으로 수집되며 이 정보를 외부에 공개하지 않습니다. 이 항목에 동의하지 않아도 됩니다.]]> diff --git a/modules/install/tpl/config_form.html b/modules/install/tpl/config_form.html index bb3e04128..bb7548c6f 100644 --- a/modules/install/tpl/config_form.html +++ b/modules/install/tpl/config_form.html @@ -12,7 +12,7 @@
                • checked="checked" type="checkbox" class="iCheck" id="rewrite" /> - {$lang->about_rewrite} +

                  {$lang->about_rewrite}

                • diff --git a/modules/install/tpl/css/install.css b/modules/install/tpl/css/install.css index 19eb4746c..e6cc609ec 100644 --- a/modules/install/tpl/css/install.css +++ b/modules/install/tpl/css/install.css @@ -100,9 +100,10 @@ html{height:100%;background:url(../img/bgHtml.gif) repeat-x 0 0} .form.formXe label{margin:0 0 2px 0;color:#eee;font-weight:bold} .form .iText{background:#555;padding:5px 10px;width:518px} .form select{background:#555;color:#fff} -.form p{color:#ccc;margin:3px 0 15px 17px} +.form p{color:#ddd;margin:3px 0 15px 17px} .form strong{color:#f60} .form em{font-style:normal;color:#ffc} +.form a{color:#fff;text-decoration:underline} .desc{padding:10px 20px;margin:0 20px 20px 20px;background:#555;color:#eee} .desc ul{margin:0 0 0 20px;padding:0} .desc strong{color:#F60} From 6f0d7f96157703c5dd53dfcf626f825beaca157d Mon Sep 17 00:00:00 2001 From: flyskyko Date: Fri, 9 Sep 2011 01:36:36 +0000 Subject: [PATCH 0679/1372] issue 160, fixed bug for checking use index git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9131 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/document/document.model.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/document/document.model.php b/modules/document/document.model.php index 095199aa3..e595432f6 100644 --- a/modules/document/document.model.php +++ b/modules/document/document.model.php @@ -238,7 +238,7 @@ $division = (int)Context::get('division'); // order by list_order and (module_srl===0 or module_srl many count), therefore case table full scan - if($args->sort_index == 'list_order' && ($args->exclude_module_srl === 0 || count($args->module_srl) > 10)) + if($args->sort_index == 'list_order' && ((int)$args->exclude_module_srl === 0 || count($args->module_srl) > 10)) { $listSqlID = 'document.getDocumentListUseIndex'; $divisionSqlID = 'document.getDocumentDivisionUseIndex'; From 55f502c55dcd6d68976f1c63af5b4c34d58d3ada Mon Sep 17 00:00:00 2001 From: ovclas Date: Fri, 9 Sep 2011 01:57:28 +0000 Subject: [PATCH 0680/1372] issue 160 site map delete function add git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9132 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/lang/lang.xml | 1 + modules/menu/menu.admin.controller.php | 9 ++++++++- modules/menu/tpl/sitemap.html | 11 +++++++++-- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/common/lang/lang.xml b/common/lang/lang.xml index 85c586456..6a593fa18 100644 --- a/common/lang/lang.xml +++ b/common/lang/lang.xml @@ -1226,6 +1226,7 @@ + diff --git a/modules/menu/menu.admin.controller.php b/modules/menu/menu.admin.controller.php index 47a0a2490..7a1b35b57 100644 --- a/modules/menu/menu.admin.controller.php +++ b/modules/menu/menu.admin.controller.php @@ -66,7 +66,14 @@ **/ function procMenuAdminDelete() { $menu_srl = Context::get('menu_srl'); - return $this->deleteMenu($menu_srl); + $this->deleteMenu($menu_srl); + + $this->setMessage('success_deleted', 'info'); + if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) { + $returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'module', 'admin', 'act', 'dispMenuAdminSiteMap'); + $this->setRedirectUrl($returnUrl); + return; + } } function deleteMenu($menu_srl) { diff --git a/modules/menu/tpl/sitemap.html b/modules/menu/tpl/sitemap.html index c318063ce..4ad63a5d0 100644 --- a/modules/menu/tpl/sitemap.html +++ b/modules/menu/tpl/sitemap.html @@ -24,13 +24,20 @@
                -

                {$lang->add_menu} {$lang->cmd_remake_cache}

                +

                + + + + {$lang->add_menu} + {$lang->cmd_remake_cache} + +

                - +
                From 8d4ebb6d708b4d637e6c9610400499e0850dd361 Mon Sep 17 00:00:00 2001 From: taggon Date: Fri, 9 Sep 2011 04:16:17 +0000 Subject: [PATCH 0681/1372] Fixed some bugs for multilingual editor UI git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9133 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/tpl/js/admin.js | 143 +++++++++++++++-------------- modules/member/tpl/group_list.html | 2 - 2 files changed, 72 insertions(+), 73 deletions(-) diff --git a/modules/admin/tpl/js/admin.js b/modules/admin/tpl/js/admin.js index 22833e24d..14fbcab02 100644 --- a/modules/admin/tpl/js/admin.js +++ b/modules/admin/tpl/js/admin.js @@ -678,20 +678,12 @@ function getOffset(elem, offsetParent) { // Language selector jQuery(function($){ -var w_timer = null, r_timer = null, r_idx = 0, f_timer = null, skip_textchange=false; +var w_timer = null, r_timer = null, r_idx = 0, f_timer = null, skip_textchange=false, keep_showing=false, $suggest; var ESC=27, UP=38, DOWN=40, ENTER=13; $('.multiLangEdit') - .find('input.vLang,textarea.vLang') - .each(function(){ - var $this = $(this), $container; - - $this - .data('mle-container', $container=$this.closest('.multiLangEdit')) - .data('mle-langkey', $container.find('.vLang').eq(0)) - .data('mle-suggestion', $container.find('.suggestion')); - }) - .bind('textchange', function(){ + .delegate('input.vLang:text,textarea.vLang', { + textchange : function(){ var $this = $(this), val = $.trim($this.val()), $ul, $container; if(r_timer) { @@ -700,7 +692,7 @@ $('.multiLangEdit') } $container = $this.data('mle-container'); - $ul = $this.data('mle-suggestion').find('>ul'); + $ul = $suggest.find('>ul'); if(!val || skip_textchange) { skip_textchange = false; @@ -735,22 +727,21 @@ $('.multiLangEdit') $btn = $('
                @@ -71,7 +70,6 @@ -
                  {$lang->cmd_set_multilingual}
                  From a534ebce702c38eed0406478f537a6fc02a2d1cd Mon Sep 17 00:00:00 2001 From: devjin Date: Fri, 9 Sep 2011 04:30:08 +0000 Subject: [PATCH 0682/1372] fixed identifier null check git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9136 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/member/member.view.php | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/member/member.view.php b/modules/member/member.view.php index 9ec2cb4a9..8286d74d8 100644 --- a/modules/member/member.view.php +++ b/modules/member/member.view.php @@ -148,6 +148,7 @@ Context::set('member_config', $member_config); global $lang; + if(!$member_config->identifier) $member_config->identifier = 'user_id'; $identifierForm->title = $lang->{$member_config->identifier}; $identifierForm->name = $member_config->identifier; $identifierForm->value = $member_info->{$member_config->identifier}; From f990fe721132bbd958de2407d22353ca8944276f Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Fri, 9 Sep 2011 04:53:05 +0000 Subject: [PATCH 0683/1372] Sitemap UI enhancement. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9137 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/css/xe.css | 5 + common/js/xe.js | 16 +- common/js/xe.min.js | 2102 ++++++++++++++++++++++++++- common/js/xml_handler.js | 16 +- common/tpl/common_layout.html | 2 +- modules/admin/tpl/css/admin.css | 11 +- modules/admin/tpl/css/admin.min.css | 17 +- modules/admin/tpl/js/sitemap.js | 13 - modules/menu/tpl/js/sitemap.js | 4 +- modules/menu/tpl/sitemap.html | 16 +- modules/menu/tpl/sitemap.item.html | 2 +- 11 files changed, 2074 insertions(+), 130 deletions(-) diff --git a/common/css/xe.css b/common/css/xe.css index ae76f6294..a32139de8 100644 --- a/common/css/xe.css +++ b/common/css/xe.css @@ -8,3 +8,8 @@ #popup_menu_area a:hover, #popup_menu_area a:avtive, #popup_menu_area a:focus{text-decoration:underline} +/* Waiting for server response */ +.WFSR .bg{position:absolute;background:#000;_background:none;width:100%;height:100%;opacity:.5;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1} +.WFSR .fg{position:relative;width:50%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:10px solid #ddd;z-index:2;zoom:1} +.WFSR .fg p{padding:0 0 0 2.5em;background:url(../img/preLoader16.gif) no-repeat 1em .4em} +.WFSR .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1} diff --git a/common/js/xe.js b/common/js/xe.js index a65666390..7b13ea31f 100644 --- a/common/js/xe.js +++ b/common/js/xe.js @@ -1507,7 +1507,7 @@ $.exec_xml = window.exec_xml = function(module, act, params, callback_func, resp function onsuccess(data, textStatus, xhr) { var resp_xml = $(data).find('response')[0], resp_obj, txt='', ret=[], tags={}, json_str=''; - waiting_obj.css('visibility', 'hidden'); + waiting_obj.css('display', 'none'); if(!resp_xml) { alert(_xhr.responseText); @@ -1560,7 +1560,7 @@ $.exec_xml = window.exec_xml = function(module, act, params, callback_func, resp beforeSend : function(xhr){ _xhr = xhr; }, success : onsuccess, error : function(xhr, textStatus) { - waiting_obj.css('visibility', 'hidden'); + waiting_obj.css('display', 'none'); var msg = ''; if (textStatus == 'parsererror') { @@ -1584,9 +1584,7 @@ $.exec_xml = window.exec_xml = function(module, act, params, callback_func, resp if(show_waiting_message && waiting_obj.length) { var d = $(document); waiting_obj.html(waiting_message).css({ - 'top' : (d.scrollTop()+20)+'px', - 'left' : (d.scrollLeft()+20)+'px', - 'visibility' : 'visible' + 'display' : 'none' }); } } @@ -1633,7 +1631,7 @@ $.exec_json = function(action,data,func){ if(action.length == 2){ if(show_waiting_message) { - $(".wfsr").html(waiting_message).css('top',$(document).scrollTop()+20).css('left',$(document).scrollLeft()+20).css('visibility','visible'); + $(".wfsr").html(waiting_message).css('display','none'); } $.extend(data,{module:action[0],act:action[1]}); @@ -1645,7 +1643,7 @@ $.exec_json = function(action,data,func){ ,contentType:"application/json" ,data:$.param(data) ,success : function(data){ - $(".wfsr").css('visibility','hidden'); + $(".wfsr").css('display','none'); if(data.error > 0) alert(data.message); if($.isFunction(func)) func(data); } @@ -1661,7 +1659,7 @@ $.fn.exec_html = function(action,data,type,func,args){ action = action.split("."); if(action.length == 2){ if(show_waiting_message) { - $(".wfsr").html(waiting_message).css('top',$(document).scrollTop()+20).css('left',$(document).scrollLeft()+20).css('visibility','visible'); + $(".wfsr").html(waiting_message).css('display','none'); } $.extend(data,{module:action[0],act:action[1]}); @@ -1671,7 +1669,7 @@ $.fn.exec_html = function(action,data,type,func,args){ ,url:request_uri ,data:$.param(data) ,success : function(html){ - $(".wfsr").css('visibility','hidden'); + $(".wfsr").css('display','none'); self[type](html); if($.isFunction(func)) func(args); } diff --git a/common/js/xe.min.js b/common/js/xe.min.js index 6848c9c3b..8c11ca618 100644 --- a/common/js/xe.min.js +++ b/common/js/xe.min.js @@ -3,72 +3,2036 @@ * @author NHN (developers@xpressengine.com) * @brief XE Common JavaScript **/ -(function(a){function b(){return function(){var e=this;if(a.isArray(this._plugins))this._plugins=[];this._messages?this._messages={}:this._binded_fn={};a.each(this,function(c,b){if(!a.isFunction(b))return!0;if(!/^API_([A-Z0-9_]+)$/.test(c))return!0;var d=RegExp.$1,g=function(a,b){return e[c](a,b)};e._messages?e._messages[d]=[g]:e._binded_fn[d]=g});a.isFunction(this.init)&&this.init.apply(this,arguments)}}var d,c,g=[];d={_plugins:[],_messages:{},getPlugin:function(e){e=e.toLowerCase();return a.isArray(this._plugins[e])? -this._plugins[e]:[]},registerPlugin:function(e){var c=this,b=e.getName().toLowerCase();if(a.inArray(e,this._plugins)>=0)return!1;this._plugins.push(e);a.isArray(this._plugins[b])||(this._plugins[b]=[]);this._plugins[b].push(e);a.each(e._binded_fn,function(a,e){c.registerHandler(a,e)});e.oApp=this;a.isFunction(e.activate)&&e.activate();return!0},registerHandler:function(e,c){var b=this._messages,e=e.toUpperCase();a.isArray(b[e])||(b[e]=[]);b[e].push(c)},cast:function(a,c){return this._cast(this,a, -c||[])},broadcast:function(a,c,b){this.parent&&this.parent._broadcast&&this.parent._broadcast(a,c,b)},_cast:function(c,b,d){var g,m=this._messages,b=b.toUpperCase();if(!m["BEFORE_"+b]&&!this["API_BEFORE_"+b]||this._cast(c,"BEFORE_"+b,d)){var h=[];if(a.isArray(m[b]))for(g=0;g=0&&g.splice(d,1);a.isArray(g[b])&&(d=a.inArray(c,g[b]),d>=0&&g[b].splice(d,1));a.isFunction(c.deactivate)&&c.deactivate()},broadcast:function(a,c){this._broadcast(this,a,c)}, -_broadcast:function(a,c,b){for(var d=0;d"+l+" "}}this.loaded_popup_menus[c]=b}if(b){c=a("#popup_menu_area").html("
                    "+ -b+"
                  ");g={top:g.page_y,left:g.page_x};if(c.outerHeight()+g.top>a(window).height()+a(window).scrollTop())g.top=a(window).height()-c.outerHeight()+a(window).scrollTop();if(c.outerWidth()+g.left>a(window).width()+a(window).scrollLeft())g.left=a(window).width()-c.outerWidth()+a(window).scrollLeft();c.css({top:g.top,left:g.left}).show()}}}})(jQuery); -jQuery(function(a){a.browser.msie&&a("select").each(function(a,b){for(var e=!1,d=[],j=0;j-1?d[a]:j;if(e&&(b.oldonchange=b.onchange,b.onchange=function(){this.options[this.selectedIndex].disabled?this.selectedIndex=d[a]:this.oldonchange&&this.oldonchange()},b.selectedIndex>=0&&b.options[b.selectedIndex].disabled))b.onchange()});var b=a(".xe_content .fold_button");if(b.size()){var d=a("div.fold_container", -b);a("button.more",b).click(function(){a(this).hide().next("button").show().parent().next(d).show()});a("button.less",b).click(function(){a(this).hide().prev("button").show().parent().next(d).hide()})}});String.prototype.getQuery=function(a){var b=this.indexOf("?");if(b==-1)return null;var d={};this.substr(b+1,this.length).replace(/([^=]+)=([^&]*)(&|$)/g,function(a,b,e){d[b]=e});a=d[a];typeof a=="undefined"&&(a="");return a}; -String.prototype.setQuery=function(a,b){var d=this.indexOf("?"),c=this.replace(/#$/,"");if(d!=-1){var g=c.substr(d+1,this.length),e={},k=[],c=this.substr(0,d);g.replace(/([^=]+)=([^&]*)(&|$)/g,function(a,b,c){e[b]=c});e[a]=b;jQuery.each(e,function(a,b){jQuery.trim(b)&&k.push(a+"="+decodeURI(b))});g=k.join("&");c+=g?"?"+g:""}else b.toString().trim()&&(c=c+"?"+a+"="+b);d=/https:\/\/([^:\/]+)(:\d+|)/i;if(g=d.exec(c))g="http://"+g[1],typeof http_port!="undefined"&&http_port!=80&&(g+=":"+http_port),c= -c.replace(d,g);d=!1;if(typeof enforce_ssl!="undefined"&&enforce_ssl)d=!0;else if(typeof ssl_actions!="undefined"&&typeof ssl_actions.length!="undefined"&&c.getQuery("act")){g=c.getQuery("act");for(i=0;i-1&&!a.getQuery("vid")&&(a=a.setQuery("vid",xeVid));try{b!="_blank"&&winopen_list[b]&&(winopen_list[b].close(),winopen_list[b]=null)}catch(c){}typeof b=="undefined"&&(b="_blank");typeof d=="undefined"&&(d="");a=window.open(a,b,d);a.focus();b!="_blank"&&(winopen_list[b]=a)} -function popopen(a,b){typeof b=="undefined"&&(b="_blank");typeof xeVid!="undefined"&&a.indexOf(request_uri)>-1&&!a.getQuery("vid")&&(a=a.setQuery("vid",xeVid));winopen(a,b,"left=10,top=10,width=10,height=10,scrollbars=no,resizable=yes,toolbars=no")}function sendMailTo(a){location.href="mailto:"+a}function move_url(a,b){if(!a)return!1;typeof b=="undefined"&&(b="N");b=b=="N"?!1:!0;/^\./.test(a)&&(a=request_uri+a);b?winopen(a):location.href=a;return!1} -function displayMultimedia(a,b,d,c){(a=_displayMultimedia(a,b,d,c))&&document.writeln(a)} -function _displayMultimedia(a,b,d,c){a.indexOf("files")==0&&(a=request_uri+a);var c=jQuery.extend({wmode:"transparent",allowScriptAccess:"sameDomain",quality:"high",flashvars:"",autostart:!1},c||{}),g=c.autostart&&c.autostart!="false"?"true":"false";delete c.autostart;var e="",e=e="";if(/\.(gif|jpg|jpeg|bmp|png)$/i.test(a))e='';else if(/\.flv$/i.test(a)||/\.mov$/i.test(a)||/\.moov$/i.test(a)||/\.m4v$/i.test(a))e='';else if(/\.swf/i.test(a)){e='';e+='';for(var k in c)c[k]!="undefined"&&c[k]!=""&&(e+='');e+=''}else{if(jQuery.browser.mozilla||jQuery.browser.opera)g=c.autostart&&c.autostart!="false"?"1":"0";e='400&&b.css({overflow:"auto",overflowX:"hidden",height:"400px"});var d=a(window),b=a("#popup_content"),a=Math.max(b[0].offsetWidth,600),b=b[0].offsetHeight,c=d.width(),d=d.height(),g=0,e=0;a!=c&&(g=a-c);b!=d&&(e=b-d);(g||e)&&window.resizeBy(g,e);if(!arguments.callee.executed)setTimeout(setFixedPopupSize,300),arguments.callee.executed=!0} -function doCallModuleAction(a,b,d){var c=[];c.target_srl=d;c.cur_mid=current_mid;exec_xml(a,b,c,completeCallModuleAction)}function completeCallModuleAction(a){a.message!="success"&&alert(a.message);location.reload()}function completeMessage(a){alert(a.message);location.reload()}function doChangeLangType(a){typeof a=="string"?setLangType(a):setLangType(a.options[a.selectedIndex].value);location.href=location.href.setQuery("l","")} -function setLangType(a){var b=new Date;b.setTime(b.getTime()+6048E8);setCookie("lang_type",a,b,"/")} -function doDocumentPreview(a){for(;a.nodeName!="FORM";)a=a.parentNode;if(a.nodeName=="FORM"){a=a.getAttribute("editor_sequence");a=editorGetContent(a);window.open("","previewDocument","toolbars=no,width=700px;height=800px,scrollbars=yes,resizable=yes");var b=jQuery("#previewDocument");b.length||(jQuery('').appendTo(document.body),b= -jQuery("#previewDocument")[0]);if(b)b.content.value=a,b.submit()}} -function doDocumentSave(a){var b=a.form.getAttribute("editor_sequence"),d=editorRelKeys[b].content.value;if(typeof b!="undefined"&&b&&typeof editorRelKeys!="undefined"&&typeof editorGetContent=="function"){var c=editorGetContent(b);editorRelKeys[b].content.value=c}var g={},c=jQuery(a.form).serializeArray();jQuery.each(c,function(a,b){var c=jQuery.trim(b.value);if(!c)return!0;if(/\[\]$/.test(b.name))b.name=b.name.replace(/\[\]$/,"");g[b.name]?g[b.name]+="|@|"+c:g[b.name]=b.value});exec_xml("document", -"procDocumentTempSave",g,completeDocumentSave,["error","message","document_srl"],g,a.form);editorRelKeys[b].content.value=d;return!1}function completeDocumentSave(a){jQuery("input[name=document_srl]").eq(0).val(a.document_srl);alert(a.message)}var objForSavedDoc=null;function doDocumentLoad(a){objForSavedDoc=a.form;popopen(request_uri.setQuery("module","document").setQuery("act","dispTempSavedList"))} -function doDocumentSelect(a){if(opener&&opener.objForSavedDoc)opener.location.href=opener.current_url.setQuery("document_srl",a).setQuery("act","dispBoardWrite");window.close()}function viewSkinInfo(a,b){popopen("./?module=module&act=dispModuleSkinInfo&selected_module="+a+"&skin="+b,"SkinInfo")}var addedDocument=[];function doAddDocumentCart(a){addedDocument[addedDocument.length]=a.value;setTimeout(function(){callAddDocumentCart(addedDocument.length)},100)} -function callAddDocumentCart(a){if(!(addedDocument.length<1||a!=addedDocument.length))a=[],a.srls=addedDocument.join(","),exec_xml("document","procDocumentAddCart",a,null),addedDocument=[]} -function transRGB2Hex(a){if(!a)return a;if(a.indexOf("#")>-1)return a.replace(/^#/,"");if(a.toLowerCase().indexOf("rgb")<0)return a;a=a.replace(/^rgb\(/i,"").replace(/\)$/,"");value_list=a.split(",");for(var a="",b=0;b>2,d=(d&3)<<4|c>>4,k=(c&15)<<2|g>>6,j=g&63,isNaN(c)?k=j=64:isNaN(g)&&(j=64),b=b+this._keyStr.charAt(e)+this._keyStr.charAt(d)+this._keyStr.charAt(k)+this._keyStr.charAt(j);return b},decode:function(a){for(var b="",d,c,g,e,k,j=0,a=a.replace(/[^A-Za-z0-9\+\/\=]/g,"");j< -a.length;)d=this._keyStr.indexOf(a.charAt(j++)),c=this._keyStr.indexOf(a.charAt(j++)),e=this._keyStr.indexOf(a.charAt(j++)),k=this._keyStr.indexOf(a.charAt(j++)),d=d<<2|c>>4,c=(c&15)<<4|e>>2,g=(e&3)<<6|k,b+=String.fromCharCode(d),e!=64&&(b+=String.fromCharCode(c)),k!=64&&(b+=String.fromCharCode(g));return b=Base64._utf8_decode(b)},_utf8_encode:function(a){for(var a=a.replace(/\r\n/g,"\n"),b="",d=0;d127&&c<2048?b+=String.fromCharCode(c>> -6|192):(b+=String.fromCharCode(c>>12|224),b+=String.fromCharCode(c>>6&63|128)),b+=String.fromCharCode(c&63|128))}return b},_utf8_decode:function(a){for(var b="",d=0,c=c1=c2=0;d191&&c<224?(c2=a.charCodeAt(d+1),b+=String.fromCharCode((c&31)<<6|c2&63),d+=2):(c2=a.charCodeAt(d+1),c3=a.charCodeAt(d+2),b+=String.fromCharCode((c&15)<<12|(c2&63)<<6|c3&63),d+=3);return b}}; -if(typeof resizeImageContents=="undefined")var resizeImageContents=function(){};if(typeof activateOptionDisabled=="undefined")var activateOptionDisabled=function(){};objectExtend=jQuery.extend;function toggleDisplay(a){jQuery("#"+a).toggle()}function checkboxSelectAll(a,b,d){var c={};if(typeof a!="undefined")c.wrap=a;if(typeof d!="undefined")c.checked=d;XE.checkboxToggleAll(b,c)}function clickCheckBoxAll(a,b){var d={doClick:!0};if(typeof a!="undefined")d.wrap=a;XE.checkboxToggleAll(b,d)} -function svc_folder_open(a){jQuery("#_folder_open_"+a).hide();jQuery("#_folder_close_"+a).show();jQuery("#_folder_"+a).show()}function svc_folder_close(a){jQuery("#_folder_open_"+a).show();jQuery("#_folder_close_"+a).hide();jQuery("#_folder_"+a).hide()}function open_calendar(a,b,d){typeof b=="undefined"&&(b="");var c="./common/tpl/calendar.php?";a&&(c+="fo_id="+a);b&&(c+="&day_str="+b);d&&(c+="&callback_func="+d);popopen(c,"Calendar")}var loaded_popup_menus=XE.loaded_popup_menus; -function createPopupMenu(){}function chkPopupMenu(){}function displayPopupMenu(a,b,d){XE.displayPopupMenu(a,b,d)}function GetObjLeft(a){return jQuery(a).offset().left}function GetObjTop(a){return jQuery(a).offset().top}function replaceOuterHTML(a,b){jQuery(a).replaceWith(b)}function getOuterHTML(a){return jQuery(a).html().trim()}function setCookie(a,b,d,c){a=a+"="+escape(b)+(!d?"":"; expires="+d.toGMTString())+"; path="+(!c?"/":c);document.cookie=a} -function getCookie(a){if(a=document.cookie.match(RegExp(a+"=(.*?)(?:;|$)")))return unescape(a[1])}function is_def(a){return typeof a!="undefined"}function ucfirst(a){return a.charAt(0).toUpperCase()+a.slice(1)}function get_by_id(a){return document.getElementById(a)} -jQuery(function(a){a(".lang_code").each(function(){var b=a(this),d=b.attr("id");typeof d=="undefined"&&(d=b.attr("name"));typeof d!="undefined"&&b.after("find_langcode")});a(document).click(function(b){var d=a("#popup_menu_area");d.length||(d=a('
                  - All + {$lang->all} {$secret_name_list['N']} diff --git a/modules/document/tpl/document_list.html b/modules/document/tpl/document_list.html index 47b63d086..794f007b6 100644 --- a/modules/document/tpl/document_list.html +++ b/modules/document/tpl/document_list.html @@ -7,16 +7,15 @@

                  {$lang->document}

                  + diff --git a/modules/trash/conf/module.xml b/modules/trash/conf/module.xml index b7c1a6c8c..9b7e04a55 100644 --- a/modules/trash/conf/module.xml +++ b/modules/trash/conf/module.xml @@ -6,25 +6,25 @@ - + - - Document - 문서 - Document - Document - Document - Document - Document - Document - Document - Document - Document + + Trash + 휴지통 + Trash + Trash + Trash + Trash + Trash + Trash + Trash + Trash + Trash diff --git a/modules/trash/lang/lang.xml b/modules/trash/lang/lang.xml index c23f1209a..d491f3fe0 100644 --- a/modules/trash/lang/lang.xml +++ b/modules/trash/lang/lang.xml @@ -42,4 +42,8 @@ - \ No newline at end of file + + + + + diff --git a/modules/trash/tpl/js/trash_admin.js b/modules/trash/tpl/js/trash_admin.js index 25d02ca93..eb135c6bf 100644 --- a/modules/trash/tpl/js/trash_admin.js +++ b/modules/trash/tpl/js/trash_admin.js @@ -65,8 +65,12 @@ function completeGetTrashList(ret_obj, response_tags) for(var x in trash_list) { var objTrash = trash_list[x]; + var title = ''; + if(objTrash.title == '') title = no_text_comment; + else title = objTrash.title; + htmlListBuffer += '' + - '' + + '' + '' + '' + '' + diff --git a/modules/trash/tpl/trash_list.html b/modules/trash/tpl/trash_list.html index 1b9aa080c..4deeebddb 100644 --- a/modules/trash/tpl/trash_list.html +++ b/modules/trash/tpl/trash_list.html @@ -1,5 +1,6 @@
                  @@ -10,37 +11,18 @@ var confirm_restore_msg = '{$lang->confirm_restore}'; -

                  - - {$lang->document} - - {$lang->comment} - -

                  +

                  {$lang->trash}

                  - All + {$lang->all} {$status_name_list['PUBLIC']} diff --git a/modules/importer/lang/lang.xml b/modules/importer/lang/lang.xml index a247fdf15..6d7c86ea2 100644 --- a/modules/importer/lang/lang.xml +++ b/modules/importer/lang/lang.xml @@ -332,6 +332,9 @@ Hãy nhập đường dẫn cho File chứa Data trên Host dưới dạng http: + + 사이트 찾기를 클릭하면 됩니다. 도메인을 빈 칸으로 남겨두면 모든 사이트의 목록을 보여줍니다.]]> + diff --git a/modules/importer/tpl/index.html b/modules/importer/tpl/index.html index e7dfa3ea1..f10a9dd28 100644 --- a/modules/importer/tpl/index.html +++ b/modules/importer/tpl/index.html @@ -21,7 +21,7 @@

                • -

                  {$lang->data_destination}
                  가상 사이트의 도메인을 입력한 후 사이트 찾기를 클릭하면 됩니다. 도메인을 빈 칸으로 남겨두면 모든 사이트의 목록을 보여줍니다.

                  +

                  {$lang->data_destination}
                  {$lang->import_desc}

                  {$lang->find_site}
                  @@ -105,7 +105,6 @@
                  -
                • '+ objTrash.title +''+ title +''+ objTrash.nickName +''+ objTrash.ipaddress +'
                  - + @@ -50,7 +32,7 @@ var confirm_restore_msg = '{$lang->confirm_restore}'; - + @@ -61,7 +43,7 @@ var confirm_restore_msg = '{$lang->confirm_restore}'; - + @@ -73,7 +55,7 @@ var confirm_restore_msg = '{$lang->confirm_restore}';
                  {$lang->trash}({number_format($total_count)}) - 선택한 글 관리... + {$lang->document_manager}
                  {$lang->document}{$lang->document}({$lang->origin_module_type}) {$lang->trash_nick_name} {$lang->trash_date} {$lang->ipaddress}
                  {$lang->document}{$lang->document}({$lang->origin_module_type}) {$lang->trash_nick_name} {$lang->trash_date} {$lang->ipaddress}
                  {$oTrashVO->getTitle()}{$lang->no_text_comment}{$oTrashVO->getTitle()} ({$lang->document}{$lang->comment}) {htmlspecialchars($oTrashVO->getNickName())} {zdate($oTrashVO->getRegdate(), "Y-m-d H:i:s")} {$oTrashVO->getIpaddress()}
                  - 선택한 글 관리... + {$lang->document_manager}
                  @@ -83,10 +65,10 @@ var confirm_restore_msg = '{$lang->confirm_restore}'; -

                  선택한 글 관리

                  +

                  {$lang->document_manager}

                  - + @@ -132,20 +114,5 @@ var confirm_restore_msg = '{$lang->confirm_restore}'; - - - - - Cancel - diff --git a/modules/trash/trash.admin.view.php b/modules/trash/trash.admin.view.php index 1fde4eee1..249defdf7 100644 --- a/modules/trash/trash.admin.view.php +++ b/modules/trash/trash.admin.view.php @@ -20,32 +20,19 @@ class trashAdminView extends trash { * @brief trash list **/ function dispTrashAdminList() { - $origin_module = Context::get('origin_module'); $args->page = Context::get('page'); // /< Page $args->list_count = 30; // /< the number of posts to display on a single page $args->page_count = 5; // /< the number of pages that appear in the page navigation $args->search_target = Context::get('search_target'); // /< search (title, contents ...) $args->search_keyword = Context::get('search_keyword'); // /< keyword to search - $args->originModule = Context::get('origin_module'); $oTrashModel = getModel('trash'); $output = $oTrashModel->getTrashList($args); - if($origin_module == 'document') - { - // get Status name list - $oDocumentModel = &getModel('document'); - $statusNameList = $oDocumentModel->getStatusNameList(); - Context::set('status_name_list', $statusNameList); - } - else if($origin_module == 'comment') - { - // get a list by using comment->getCommentList. - $oCommentModel = &getModel('comment'); - $secretNameList = $oCommentModel->getSecretNameList(); - Context::set('secret_name_list', $secretNameList); - } + // for no text comment language and for document manange language + $oCommentModel = &getModel('comment'); + $oDocumentModel = &getModel('document'); Context::set('trash_list', $output->data); Context::set('total_count', $output->total_count); From 6cba486dfbcfd91b85bd6db585dc82bf070713ab Mon Sep 17 00:00:00 2001 From: chschy Date: Wed, 7 Sep 2011 09:58:46 +0000 Subject: [PATCH 0635/1372] Modify editor page (for add lang file) git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9087 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/editor/lang/lang.xml | 183 +++++++++++++++++++++++++++- modules/editor/tpl/admin_index.html | 167 ++++++++++++------------- 2 files changed, 262 insertions(+), 88 deletions(-) diff --git a/modules/editor/lang/lang.xml b/modules/editor/lang/lang.xml index b69a1cd18..1e2717151 100644 --- a/modules/editor/lang/lang.xml +++ b/modules/editor/lang/lang.xml @@ -1,5 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1952,4 +2132,5 @@ Bài viết tự động lưu sẽ tự động hủy sau khi bạn hoàn thành - \ No newline at end of file + + diff --git a/modules/editor/tpl/admin_index.html b/modules/editor/tpl/admin_index.html index 52b661a8f..44a9673ad 100644 --- a/modules/editor/tpl/admin_index.html +++ b/modules/editor/tpl/admin_index.html @@ -1,88 +1,5 @@ - -
                  -

                  WYSIWYG Editor

                  -

                  Editor Preview

                  - - - 미리보기 - -
                  - - -
                  -

                  Editor Option

                  -
                    -
                  • -

                    본문 에디터를 선택하세요.

                    -

                    - - editor_skin)-->checked="checked" /> - - -
                    - -

                    -
                  • -
                  • -

                    -

                    px

                    -
                  • -
                  • -

                    댓글 에디터를 선택하세요.

                    -

                    - - comment_editor_skin)-->checked="checked" /> - - -
                    - -

                    -
                  • -
                  • -

                    -

                    px

                    -
                  • -
                  • -

                    본문 서식을 선택하세요.

                    -

                    - - content_style||!$editor_config->content_style&&$key=='default')-->checked="checked"> - -

                    -
                  • -
                  • -

                    본문 글꼴을 선택하세요.

                    - -

                    - content_font)-->checked="checked" />
                    - - content_font==$name)-->checked="checked" />
                    - -

                    -
                  • -
                  • -

                    - -

                    px

                    -
                  • - + +
                    +

                    {$lang->editor}

                    +

                    {$lang->editor_preview}

                    + + + {$lang->cmd_preview} + + + + +
                    +

                    {$lang->editor_option}

                    +
                      +
                    • +

                      {$lang->guide_choose_main_editor}

                      +

                      + + editor_skin)-->checked="checked" /> + + +
                      + +

                      +
                    • +
                    • +

                      +

                      px

                      +
                    • +
                    • +

                      {$lang->guide_choose_comment_editor}

                      +

                      + + comment_editor_skin)-->checked="checked" /> + + +
                      + +

                      +
                    • +
                    • +

                      +

                      px

                      +
                    • +
                    • +

                      {$lang->guide_choose_text_formatting}

                      +

                      + + content_style||!$editor_config->content_style&&$key=='default')-->checked="checked"> + +

                      +
                    • +
                    • +

                      {$lang->guide_choose_font_body}

                      + +

                      + content_font)-->checked="checked" />
                      + + content_font==$name)-->checked="checked" />
                      + +

                      +
                    • +
                    • +

                      + +

                      px

                      +
                    @@ -123,7 +116,7 @@
                  - + @@ -141,7 +134,7 @@

                  {$xml_info->title}

                  {nl2br($xml_info->description)}

                  -

                  이 항목 업데이트가 가능합니다. 업데이트 하시겠습니까?

                  +

                  {$lang->msg_avail_easy_update}{$lang->msg_do_you_like_update}

                  From 34cd3544ba7cd611a9801feb4cbcc52a89d94149 Mon Sep 17 00:00:00 2001 From: chschy Date: Wed, 7 Sep 2011 10:09:45 +0000 Subject: [PATCH 0636/1372] modify lang.xml of editor page git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9088 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/editor/lang/lang.xml | 6 ++-- modules/editor/tpl/admin_index.html | 44 ++++++++++++++--------------- 2 files changed, 26 insertions(+), 24 deletions(-) diff --git a/modules/editor/lang/lang.xml b/modules/editor/lang/lang.xml index 1e2717151..d51ad6c15 100644 --- a/modules/editor/lang/lang.xml +++ b/modules/editor/lang/lang.xml @@ -108,8 +108,10 @@ - - + + + + diff --git a/modules/editor/tpl/admin_index.html b/modules/editor/tpl/admin_index.html index 44a9673ad..43cd939e6 100644 --- a/modules/editor/tpl/admin_index.html +++ b/modules/editor/tpl/admin_index.html @@ -1,27 +1,27 @@

                  {$lang->editor}

                  From bd67a0846e88d133b06e9712baeb594c1541978c Mon Sep 17 00:00:00 2001 From: devjin Date: Wed, 7 Sep 2011 10:56:36 +0000 Subject: [PATCH 0637/1372] fixed admin theme git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9089 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/admin.admin.model.php | 24 ++++++++++++++++-------- modules/admin/tpl/js/admin.js | 2 +- modules/admin/tpl/theme.html | 24 +++++++++++++++++------- 3 files changed, 34 insertions(+), 16 deletions(-) diff --git a/modules/admin/admin.admin.model.php b/modules/admin/admin.admin.model.php index 492f29d71..bc3a99c94 100644 --- a/modules/admin/admin.admin.model.php +++ b/modules/admin/admin.admin.model.php @@ -195,10 +195,8 @@ $theme_info->publisher[] = $publisher_obj; } - $skin_infos = $xml_obj->skininfos; - if(is_array($skin_infos->layoutinfo))$layout_path = $skin_infos->layoutinfo[0]->directory->attrs->path; - else $layout_path = $skin_infos->layoutinfo->directory->attrs->path; - + $layout = $xml_obj->layout; + $layout_path = $layout->directory->attrs->path; $layout_parse = explode('/',$layout_path); switch($layout_parse[1]){ case 'themes' : { @@ -211,7 +209,6 @@ } } $layout_info->path = $layout_path; - $theme_info->layout_info = $layout_info; $site_info = Context::get('site_module_info'); // check layout instance @@ -223,6 +220,7 @@ foreach($layout_list as $val){ if ($val->layout == $layout_info->name){ $is_new_layout = false; + $layout_info->layout_srl = $val->layout_srl; break; } } @@ -238,8 +236,12 @@ // Insert into the DB $oLayoutAdminController = &getAdminController('layout'); $output = $oLayoutAdminController->insertLayout($args); + $layout_info->layout_srl = $args->layout_srl; } + $theme_info->layout_info = $layout_info; + + $skin_infos = $xml_obj->skininfos; if(is_array($skin_infos->skininfo))$skin_list = $skin_infos->skininfo; else $skin_list = array($skin_infos->skininfo); @@ -285,13 +287,19 @@ $searched_count = count($searched_list); if(!$searched_count) return; + $exceptionModule = array('editor', 'poll', 'homepage', 'textyle'); + $oModuleModel = &getModel('module'); foreach($searched_list as $val) { $skin_list = $oModuleModel->getSkins('./modules/'.$val); - if (is_array($skin_list) && count($skin_list) > 0){ - if(!$GLOBALS['__ThemeModuleSkin__'][$val]) $GLOBALS['__ThemeModuleSkin__'][$val] = array(); - $GLOBALS['__ThemeModuleSkin__'][$val] = array_merge($GLOBALS['__ThemeModuleSkin__'][$val], $skin_list); + if (is_array($skin_list) && count($skin_list) > 0 && !in_array($val, $exceptionModule)){ + if(!$GLOBALS['__ThemeModuleSkin__'][$val]){ + $moduleInfo = $oModuleModel->getModuleInfoXml($val); + $GLOBALS['__ThemeModuleSkin__'][$val]['title'] = $moduleInfo->title; + $GLOBALS['__ThemeModuleSkin__'][$val]['skins'] = array(); + } + $GLOBALS['__ThemeModuleSkin__'][$val]['skins'] = array_merge($GLOBALS['__ThemeModuleSkin__'][$val]['skins'], $skin_list); } } $GLOBALS['__ThemeModuleSkin__']['__IS_PARSE__'] = true; diff --git a/modules/admin/tpl/js/admin.js b/modules/admin/tpl/js/admin.js index c7e6f4cf0..762f976a6 100644 --- a/modules/admin/tpl/js/admin.js +++ b/modules/admin/tpl/js/admin.js @@ -563,7 +563,7 @@ $.fn.xeSortableTable = function(){ // get offsets of all list-item elements offsets = []; - $table.find('tbody>tr:not([target])').each(function() { + $table.find('tbody>tr:not([target],.sticky)').each(function() { var $this = $(this), o; o = getOffset(this, $table.get(0)); diff --git a/modules/admin/tpl/theme.html b/modules/admin/tpl/theme.html index 3596276af..b640d876c 100644 --- a/modules/admin/tpl/theme.html +++ b/modules/admin/tpl/theme.html @@ -5,13 +5,18 @@ jQuery(function($){ var themes = {}; + // Example - default theme -themes['xe_default'] = { - 'layout': '82', - 'board' : 'xe_v3', // board module has the xe_v3 skin by default - 'poll' : 'simple' // poll module has the simple skin by default +{@$skins = array()} + + {@$skins[] = "'".$module."' : '".$skin_info->name."'";} + +themes['{$key}'] = { + 'layout': '{$val->layout_info->layout_srl}', + {implode(',',$skins)} }; + $('#theme').data('themes', themes); }); @@ -35,7 +40,12 @@ $('#theme').data('themes', themes);
                  • · 버전: {$val->version}
                  • -
                  • · 제작: {$val->publisher}
                  • +
                  • · 제작: + + {$publisher->name} + {$publisher->name} + +
                  • · 설명: {$val->description}
                  • · 경로: {$val->path}
                  @@ -79,7 +89,7 @@ $('#theme').data('themes', themes);
                • -

                  선택한 {$mkey} 스킨

                  +

                  선택한 {$mval['title']} 스킨

                  • @@ -88,7 +98,7 @@ $('#theme').data('themes', themes);
                  • 선택한 테마에는 이 항목에 대한 스킨 정보가 없습니다. 스킨을 직접 선택하세요.
                • -
                • +
                • {@ $id = $mkey.'_'.$skey } Thumbnail does not exist From 29d2b0b3a6df9f3f347b15189392f1a86837ded0 Mon Sep 17 00:00:00 2001 From: chschy Date: Wed, 7 Sep 2011 11:12:18 +0000 Subject: [PATCH 0638/1372] Modify editor page (for bug) git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9090 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/editor/editor.admin.view.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/editor/editor.admin.view.php b/modules/editor/editor.admin.view.php index a4aec5549..05d3c5d2e 100644 --- a/modules/editor/editor.admin.view.php +++ b/modules/editor/editor.admin.view.php @@ -48,7 +48,9 @@ $xml_info->package_srl = $oAutoinstallModel->getPackageSrlByPath($xml_info->path); if($xml_info->package_srl) $targetpackages[$xml_info->package_srl] = 0; } - $packages = $oAutoinstallModel->getInstalledPackages(array_keys($targetpackages)); + + if(is_array($targetpackages)) $packages = $oAutoinstallModel->getInstalledPackages(array_keys($targetpackages)); + foreach($component_list as $component_name => $xml_info) { if($packages[$xml_info->package_srl]) $xml_info->need_update = $packages[$xml_info->package_srl]->need_update; } From 574ae40bd17b0d34fadf631565afccf5bee7b7d9 Mon Sep 17 00:00:00 2001 From: chschy Date: Wed, 7 Sep 2011 11:14:55 +0000 Subject: [PATCH 0639/1372] Add favicon link git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9091 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/display/HTMLDisplayHandler.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/classes/display/HTMLDisplayHandler.php b/classes/display/HTMLDisplayHandler.php index c1d18155f..0ec492ca7 100644 --- a/classes/display/HTMLDisplayHandler.php +++ b/classes/display/HTMLDisplayHandler.php @@ -31,7 +31,8 @@ class HTMLDisplayHandler { // add .x div for adminitration pages if(Context::getResponseMethod() == 'HTML') { if(Context::get('module')!='admin' && strpos(Context::get('act'),'Admin')>0) $output = '
                  '.$output.'
                  '; - + $output = ''.$output;// + if(Context::get('layout') != 'none') { if(__DEBUG__==3) $start = getMicroTime(); From b7eb39e8e859d0f54c09459ccb5e3dd79c0e0889 Mon Sep 17 00:00:00 2001 From: ovclas Date: Wed, 7 Sep 2011 11:19:39 +0000 Subject: [PATCH 0640/1372] issue 70 theme lang apply git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9092 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/lang/lang.xml | 36 +++++++++++++++++++++++++++++ modules/admin/tpl/theme.html | 44 ++++++++++++++++++------------------ 2 files changed, 58 insertions(+), 22 deletions(-) diff --git a/modules/admin/lang/lang.xml b/modules/admin/lang/lang.xml index 5c791d436..acab728a5 100644 --- a/modules/admin/lang/lang.xml +++ b/modules/admin/lang/lang.xml @@ -929,4 +929,40 @@ Lütfen son sürümü için indirme linkine tıklayınız.]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/admin/tpl/theme.html b/modules/admin/tpl/theme.html index b640d876c..19ddcda78 100644 --- a/modules/admin/tpl/theme.html +++ b/modules/admin/tpl/theme.html @@ -28,10 +28,10 @@ $('#theme').data('themes', themes);

                  Theme Setting

                  -

                  테마는 레이아웃을 포함하여 현재 설치된 모듈의 스킨을 묶은 개념입니다. 테마를 선택하면 'Skin Setting' 항목을 알아서 선택합니다. 테마 일부가 마음에 들지 않으면 'Skin Setting'에서 테마 일부를 다시 설정 할 수 있습니다.

                  +

                  {$lang->theme_desc}

                  • -

                    선택한 테마

                    +

                    {$lang->selected_theme}

                      {@$current_theme = ($theme_info)?$theme_info->theme:'user_define'}
                    • @@ -39,15 +39,15 @@ $('#theme').data('themes', themes); checked="checked" />
                        -
                      • · 버전: {$val->version}
                      • -
                      • · 제작: +
                      • · {$lang->version}: {$val->version}
                      • +
                      • · {$lang->author}: {$publisher->name} {$publisher->name}
                      • -
                      • · 설명: {$val->description}
                      • -
                      • · 경로: {$val->path}
                      • +
                      • · {$lang->description}: {$val->description}
                      • +
                      • · {$lang->path}: {$val->path}
                    • @@ -55,7 +55,7 @@ $('#theme').data('themes', themes); checked="checked" />
                        -
                      • · 설명: 관리자가 설정한 테마입니다. 테마를 설정하지 않은 경우 디폴트로 노출됩니다.
                      • +
                      • · {$lang->description}: {$lang->no_selected_theme_desc}
                    @@ -64,38 +64,38 @@ $('#theme').data('themes', themes);

                  Skin Setting

                  -

                  테마의 일부가 마음에 들지 않으면 스킨을 직접 선택하세요. 스킨을 직접 선택하면 'Theme Setting' 설정은 'User Defined'로 설정됩니다.

                  +

                  {$lang->user_define_skin_select_desc}

                  • -

                    선택한 레이아웃

                    +

                    {$lang->selected_layout}

                    • Thumbnail does not exist layout_srl == $current_layout)-->checked="checked" />
                        -
                      • · 버전: {$val->version}
                      • -
                      • · 제작: +
                      • · {$lang->version}: {$val->version}
                      • +
                      • · {$lang->author}: {$author->name} {$author->name}
                      • -
                      • · 설명: {$val->description}
                      • -
                      • · 경로: {$val->path}
                      • -
                      • · 설정: Edit
                      • +
                      • · {$lang->description}: {$val->description}
                      • +
                      • · {$lang->path}: {$val->path}
                      • +
                      • · {$lang->cmd_setup}: Edit
                  • -

                    선택한 {$mval['title']} 스킨

                    +

                    {sprintf($lang->selected_skin, $mval['title'])}

                    • - 선택한 {$mkey} 스킨 없음 + {sprintf($lang->no_selected_skin, $mkey)}
                        -
                      • 선택한 테마에는 이 항목에 대한 스킨 정보가 없습니다. 스킨을 직접 선택하세요.
                      • +
                      • {$lang->no_selected_skin_desc}
                    • @@ -104,26 +104,26 @@ $('#theme').data('themes', themes);
                        -
                      • · 버전: {$sval->version}
                      • -
                      • · 제작: +
                      • · {$lang->version}: {$sval->version}
                      • +
                      • · {$lang->author}: {$author->name} {$author->name}
                      • -
                      • · 설명: {$sval->description}
                      • +
                      • · {$lang->description}: {$sval->description}
                    • Thumbnail does not exists - +
                  - +
                  From 882fce4284b83403d1885ffab8d876b629296844 Mon Sep 17 00:00:00 2001 From: flyskyko Date: Wed, 7 Sep 2011 11:45:48 +0000 Subject: [PATCH 0641/1372] fixed not display sub menu in general setting page git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9093 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/admin.admin.view.php | 1 - modules/admin/tpl/_spLnb.content.html | 2 +- modules/admin/tpl/config.html | 61 +++++++++++++-------------- modules/admin/tpl/layout.html | 2 +- 4 files changed, 32 insertions(+), 34 deletions(-) diff --git a/modules/admin/admin.admin.view.php b/modules/admin/admin.admin.view.php index 1d6bcb51d..798f9a963 100644 --- a/modules/admin/admin.admin.view.php +++ b/modules/admin/admin.admin.view.php @@ -387,7 +387,6 @@ Context::set('start_module', $start_module); Context::set('pwd',$pwd); - Context::set('layout','none'); $this->setTemplateFile('config'); } diff --git a/modules/admin/tpl/_spLnb.content.html b/modules/admin/tpl/_spLnb.content.html index e27572e8b..986f7427d 100644 --- a/modules/admin/tpl/_spLnb.content.html +++ b/modules/admin/tpl/_spLnb.content.html @@ -7,4 +7,4 @@ -
                • + \ No newline at end of file diff --git a/modules/admin/tpl/config.html b/modules/admin/tpl/config.html index 5c4653501..0460e7e45 100644 --- a/modules/admin/tpl/config.html +++ b/modules/admin/tpl/config.html @@ -1,14 +1,14 @@ - + -
                  +

                  {$lang->title_genaral}

                  @@ -34,19 +34,19 @@ jQuery(function($){ - +

                • {$lang->about_lang_select}

                  - - - + + + - - checked="checked" /> + + checked="checked" /> @@ -76,9 +76,9 @@ jQuery(function($){

                • {$lang->about_thumbnail_type}

                  - checked="checked" /> - - checked="checked" /> + checked="checked" /> + + checked="checked" />

                • @@ -118,32 +118,32 @@ jQuery(function($){

                  - {$lang->ftp_get_list} - + {$lang->ftp_get_list} +

                  -
                  +

                  {$lang->msg_ftp_installed_realpath} : {_XE_PATH_}

                • {$lang->about_use_favicon}

                  - favicon - favicon Image - {$lang->cmd_delete} + favicon + favicon Image + {$lang->cmd_delete}

                  {$lang->detail_about_use_favicon}

                • {$lang->about_mobilehome_icon}

                  -

                  - Mobile Home Icon +

                  + Mobile Home Icon www {$lang->cmd_delete}

                  {$lang->detail_about_mobilehome_icon}

                • - +

                  {$lang->subtitle_advanced}

                  @@ -151,7 +151,7 @@ jQuery(function($){
                • - +

                  {$lang->about_default_url}

                • @@ -163,9 +163,9 @@ jQuery(function($){
                • {$lang->use_ssl}

                  -

                  - - checked="checked" /> +

                  + + checked="checked" />

                • @@ -214,8 +214,7 @@ jQuery(function($){
                  - +
                  - -
                  - + +
                  \ No newline at end of file diff --git a/modules/admin/tpl/layout.html b/modules/admin/tpl/layout.html index 40d2b8c30..fbee8b57f 100644 --- a/modules/admin/tpl/layout.html +++ b/modules/admin/tpl/layout.html @@ -1,6 +1,6 @@
                  - {$content} + {$content}
                  From afa0bd2e6864d30ae8dfd5fc86dfbfee8c9bbc74 Mon Sep 17 00:00:00 2001 From: chschy Date: Wed, 7 Sep 2011 11:50:35 +0000 Subject: [PATCH 0642/1372] init editor config of editor page git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9094 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/editor/editor.admin.view.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/modules/editor/editor.admin.view.php b/modules/editor/editor.admin.view.php index 05d3c5d2e..8ceceb7e2 100644 --- a/modules/editor/editor.admin.view.php +++ b/modules/editor/editor.admin.view.php @@ -25,7 +25,15 @@ // Get a type of component $oEditorModel = &getModel('editor'); $oModuleModel = &getModel('module'); - $editor_config = $oModuleModel->getModuleConfig('editor'); + $editor_config = $oModuleModel->getModuleConfig('editor'); + + //editor_config init + if(!$editor_config->editor_height) $editor_config->editor_height = 500; + if(!$editor_config->comment_editor_height) $editor_config->comment_editor_height = 120; + if(!$editor_config->editor_skin) $editor_config->editor_skin = 'xpresseditor'; + if(!$editor_config->comment_editor_skin) $editor_config->comment_editor_skin = 'xpresseditor'; + if(!$editor_config->sel_editor_colorset) $editor_config->sel_editor_colorset= 'white'; + if(!$editor_config->sel_comment_editor_colorset) $editor_config->sel_comment_editor_colorset= 'white'; $component_list = $oEditorModel->getComponentList(false, $site_srl, true); $editor_skin_list = FileHandler::readDir(_XE_PATH_.'modules/editor/skins'); From f65139105121881e0ba549361e2492a4b12efb2c Mon Sep 17 00:00:00 2001 From: chschy Date: Wed, 7 Sep 2011 12:08:00 +0000 Subject: [PATCH 0643/1372] Modify add lang file (module page) git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9095 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/module/lang/lang.xml | 22 ++++- modules/module/module.admin.view.php | 2 +- modules/module/tpl/module_list.html | 110 +++++++++++++--------- modules/module/tpl/spInstalledModule.html | 66 ------------- 4 files changed, 87 insertions(+), 113 deletions(-) delete mode 100644 modules/module/tpl/spInstalledModule.html diff --git a/modules/module/lang/lang.xml b/modules/module/lang/lang.xml index b1ed2d099..4bd04019d 100644 --- a/modules/module/lang/lang.xml +++ b/modules/module/lang/lang.xml @@ -1,5 +1,25 @@ - + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/module/module.admin.view.php b/modules/module/module.admin.view.php index ad451d4ed..cadeaff8b 100644 --- a/modules/module/module.admin.view.php +++ b/modules/module/module.admin.view.php @@ -60,7 +60,7 @@ Context::set('favoriteModuleList', $favoriteModuleList); Context::set('module_list', $module_list); // Set a template file - $this->setTemplateFile('spInstalledModule'); + $this->setTemplateFile('module_list'); } diff --git a/modules/module/tpl/module_list.html b/modules/module/tpl/module_list.html index 5956650d5..4a2c2c423 100644 --- a/modules/module/tpl/module_list.html +++ b/modules/module/tpl/module_list.html @@ -1,46 +1,66 @@ - - + - -
                  - - -

                  {$lang->module}

                  -
                  선택한 글 0{$lang->selected_document} 0
                  {$lang->document}
                  이동{$lang->cmd_move} {$lang->component_name} {$lang->user_name} {$lang->version} {$lang->author} {$xml_info->version}
                  - - - - - - - - - - - - - - - - - - - - - - -
                  {$lang->module_name}
                  {$lang->version}
                  {$lang->author}
                  {$lang->table_count}
                  {$lang->path}
                  {$lang->module_action}
                  {$val->title} ({$val->module}){$val->version} - - {$author->name} - - - {$val->created_table_count}/{$val->table_count} - {$val->path} - - {$lang->cmd_install} - - {$lang->cmd_update} - - - - -
                  + + +
                  +

                  Installed Module

                  +
                  + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + All({count($module_list)}) +
                  {$lang->favorite}{$lang->module_name}{$lang->version}{$lang->author}{$lang->path}{$lang->cmd_delete}
                  + + {$lang->favorite}({$lang->on}) + + {$lang->favorite}({$lang->off}) + + +

                  {$val->title}

                  +

                  {$val->description}

                  +

                  {$lang->msg_avail_install} {$lang->msg_do_you_like_install}

                  +

                  {$lang->msg_avail_updaet} {$lang->msg_do_you_like_update}

                  +

                  {$lang->msg_avail_easy_update}{$lang->msg_do_you_like_update}

                  +
                  {$val->version} + + + + + {$author->name} + + + + + {$val->path} + + {$lang->cmd_delete} + +
                  +
                  +
                  diff --git a/modules/module/tpl/spInstalledModule.html b/modules/module/tpl/spInstalledModule.html deleted file mode 100644 index 6c7db3429..000000000 --- a/modules/module/tpl/spInstalledModule.html +++ /dev/null @@ -1,66 +0,0 @@ - - - - -
                  -

                  Installed Module

                  -
                  - - - - - - - - - - - - - - - - - - - - - - - - - -
                  - All({count($module_list)}) -
                  {$lang->favorite}{$lang->module_name}{$lang->version}{$lang->author}{$lang->path}{$lang->cmd_delete}
                  - - {$lang->favorite}({$lang->on}) - - {$lang->favorite}({$lang->off}) - - -

                  {$val->title}

                  -

                  {$val->description}

                  -

                  이 항목 설치가 가능합니다. 설치 하시겠습니까?

                  -

                  이 항목 업데이트가 가능합니다. 업데이트 하시겠습니까?

                  -

                  이 항목의 새로운 버전이 있습니다. 업데이트 하시겠습니까?

                  -
                  {$val->version} - - - - - {$author->name} - - - - - {$val->path} - - {$lang->cmd_delete} - -
                  -
                  -
                  From 0245d5553b77ef767bdc63c75a1b7b7e6e2ccde9 Mon Sep 17 00:00:00 2001 From: devjin Date: Wed, 7 Sep 2011 12:39:59 +0000 Subject: [PATCH 0644/1372] fixed identifier field git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9096 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/member/member.admin.controller.php | 6 ++- modules/member/member.admin.view.php | 10 +++- modules/member/member.class.php | 48 +++++++++++++++++++- modules/member/member.view.php | 6 +++ modules/member/tpl/insert_member.html | 6 +-- modules/member/tpl/js/member_admin_config.js | 32 +++++++++++-- modules/member/tpl/member_config.html | 31 +++++++++++-- 7 files changed, 123 insertions(+), 16 deletions(-) diff --git a/modules/member/member.admin.controller.php b/modules/member/member.admin.controller.php index 262b607bc..ede854ef3 100644 --- a/modules/member/member.admin.controller.php +++ b/modules/member/member.admin.controller.php @@ -162,6 +162,7 @@ if($args->image_name !='Y') $args->image_name = 'N'; if($args->image_mark !='Y') $args->image_mark = 'N'; if($args->signature!='Y') $args->signature = 'N'; + $args->identifier = $all_args->identifier; // signupForm global $lang; @@ -171,14 +172,15 @@ $extendItems = $oMemberModel->getJoinFormList(); foreach($list_order as $key){ unset($signupItem); + $signupItem->isIdentifier = ($key == $all_args->identifier); $signupItem->isDefaultForm = in_array($key, $items); $signupItem->name = $key; $signupItem->title = $lang->{$key}; $signupItem->mustRequired = in_array($key, $mustRequireds); $signupItem->imageType = (strpos($key, 'image') !== false); - $signupItem->required = ($all_args->{$key} == 'required'); - $signupItem->isUse = in_array($key, $usable_list); + $signupItem->required = ($all_args->{$key} == 'required') || $signupItem->mustRequired; + $signupItem->isUse = in_array($key, $usable_list) || $signupItem->required; if ($signupItem->imageType){ $signupItem->max_width = $all_args->{$key.'_max_width'}; diff --git a/modules/member/member.admin.view.php b/modules/member/member.admin.view.php index 5a89e5809..5f0e89d27 100644 --- a/modules/member/member.admin.view.php +++ b/modules/member/member.admin.view.php @@ -165,8 +165,14 @@ } $formTags = $this->_getMemberInputTag($memberInfo); - Context::set('formTags', $formTags); + + $member_config = $oMemberModel->getMemberConfig(); + global $lang; + $identifierForm->title = $lang->{$member_config->identifier}; + $identifierForm->name = $member_config->identifier; + $identifierForm->value = $memberInfo->{$member_config->identifier}; + Context::set('identifierForm', $identifierForm); $this->setTemplateFile('insert_member'); } @@ -180,7 +186,7 @@ foreach($member_config->signupForm as $no=>$formInfo){ if (!$formInfo->isUse)continue; - if ($formInfo->name == 'email_address' || $formInfo->name == 'password') continue; + if ($formInfo->name == $member_config->identifier || $formInfo->name == 'password') continue; unset($formTag); $inputTag = ''; $formTag->title = $formInfo->title; diff --git a/modules/member/member.class.php b/modules/member/member.class.php index 2232d622e..0e3c64cdd 100644 --- a/modules/member/member.class.php +++ b/modules/member/member.class.php @@ -54,9 +54,53 @@ if(!$args->profile_image_max_height) $args->profile_image_max_height = '80'; if($args->group_image_mark!='Y') $args->group_image_mark = 'N'; + global $lang; + $oMemberModel = &getModel('member'); + + $extendItems = $oMemberModel->getJoinFormList(); + + $items = array('user_id', 'password', 'user_name', 'nick_name', 'email_address', 'find_account_question', 'homepage', 'blog', 'birthday', 'signature', 'profile_image', 'image_name', 'image_mark'); + $mustRequireds = array('email_address', 'password', 'find_account_question'); + $orgRequireds = array('email_address', 'password', 'find_account_question'); + $orgUse = array('email_address', 'password', 'find_account_question'); + $list_order = array(); + foreach($items as $key){ + unset($signupItem); + $signupItem->isDefaultForm = true; + $signupItem->name = $key; + $signupItem->title = $lang->{$key}; + $signupItem->mustRequired = in_array($key, $mustRequireds); + $signupItem->imageType = (strpos($key, 'image') !== false); + $signupItem->required = in_array($key, $orgRequireds); + $signupItem->isUse = ($config->{$key} == 'Y') || in_array($key, $orgUse); + if ($signupItem->imageType){ + $signupItem->max_width = $config->{$key.'_max_width'}; + $signupItem->max_height = $config->{$key.'_max_height'}; + } + $list_order[] = $signupItem; + } + if (is_array($extendItems)){ + foreach($extendItems as $form_srl=>$item_info){ + unset($signupItem); + $signupItem->name = $item_info->column_name; + $signupItem->title = $item_info->column_title; + $signupItem->type = $item_info->column_type; + $signupItem->member_join_form_srl = $form_srl; + $signupItem->mustRequired = in_array($key, $mustRequireds); + $signupItem->required = ($item_info->required == 'Y'); + $signupItem->isUse = ($item_info->is_active == 'Y'); + $signupItem->description = $item_info->description; + if ($signupItem->imageType){ + $signupItem->max_width = $config->{$key.'_max_width'}; + $signupItem->max_height = $config->{$key.'_max_height'}; + } + $list_order[] = $signupItem; + } + } + $args->signupForm = $list_order; + $oModuleController->insertModuleConfig('member',$args); // Create a member controller object - $oMemberModel = &getModel('member'); $oMemberController = &getController('member'); $oMemberAdminController = &getAdminController('member'); @@ -228,6 +272,7 @@ // Get join form list which is additionally set $extendItems = $oMemberModel->getJoinFormList(); + $identifier = 'user_id'; $items = array('user_id', 'password', 'user_name', 'nick_name', 'email_address', 'find_account_question', 'homepage', 'blog', 'birthday', 'signature', 'profile_image', 'image_name', 'image_mark'); $mustRequireds = array('email_address', 'password', 'find_account_question'); $orgRequireds = array('email_address', 'password', 'find_account_question', 'user_id', 'nick_name', 'user_name'); @@ -242,6 +287,7 @@ $signupItem->imageType = (strpos($key, 'image') !== false); $signupItem->required = in_array($key, $orgRequireds); $signupItem->isUse = ($config->{$key} == 'Y') || in_array($key, $orgUse); + $signupItem->isIdentifier = ($key == $identifier); if ($signupItem->imageType){ $signupItem->max_width = $config->{$key.'_max_width'}; $signupItem->max_height = $config->{$key.'_max_height'}; diff --git a/modules/member/member.view.php b/modules/member/member.view.php index 9f58c957d..9afa8d3ea 100644 --- a/modules/member/member.view.php +++ b/modules/member/member.view.php @@ -140,6 +140,12 @@ $member_config = $oMemberModel->getMemberConfig(); Context::set('member_config', $member_config); + + global $lang; + $identifierForm->title = $lang->{$member_config->identifier}; + $identifierForm->name = $member_config->identifier; + $identifierForm->value = $member_info->{$member_config->identifier}; + Context::set('identifierForm', $identifierForm); // Set a template file $this->setTemplateFile('modify_info'); } diff --git a/modules/member/tpl/insert_member.html b/modules/member/tpl/insert_member.html index e3084641f..6202588e7 100644 --- a/modules/member/tpl/insert_member.html +++ b/modules/member/tpl/insert_member.html @@ -18,10 +18,10 @@

                  {$lang->msg_update_member}

                  • -

                    {$lang->email_address} *

                    +

                    {$identifierForm->title} *

                    - - + +

                  • diff --git a/modules/member/tpl/js/member_admin_config.js b/modules/member/tpl/js/member_admin_config.js index 157b765d4..a4dbd9940 100644 --- a/modules/member/tpl/js/member_admin_config.js +++ b/modules/member/tpl/js/member_admin_config.js @@ -154,11 +154,33 @@ jQuery(function($){ }); - $('a.modalAnchor._preview').bind('before-open.mw', function(){ - var $inputList = $('input[name="usable_list[]"]:checked'); - var title = ''; - for(var i=0; i<$inputList.length; i++){ - title = $($inputList[i]).closest('tr').find('.wrap ._title').html(); + $('input[name=identifier]').change(function(){ + var $checkedTR = $('input[name=identifier]:checked').closest('tr'); + var $notCheckedTR = $('input[name=identifier]:not(:checked)').closest('tr'); + var name, notName; + if (!$checkedTR.hasClass('sticky')){ + name = $checkedTR.find('input[name="list_order[]"]').val(); + if (!$checkedTR.find('input[type=hidden][name="usable_list[]"]').length) $('').insertBefore($checkedTR); + if (!$checkedTR.find('input[type=hidden][name='+name+']').length) $('').insertBefore($checkedTR); + $checkedTR.find('th').html(''+$checkedTR.find('th ._title').html()+''); + $checkedTR.find('input[type=checkbox][name="usable_list[]"]').attr('checked', 'checked').attr('disabled', 'disabled'); + $checkedTR.find('input[type=radio][name='+name+'][value=required]').attr('checked', 'checked').attr('disabled', 'disabled'); + $checkedTR.find('input[type=radio][name='+name+'][value=option]').removeAttr('checked').attr('disabled', 'disabled'); + $checkedTR.addClass('sticky'); + $checkedTR.parent().prepend($checkedTR); + + notName = $notCheckedTR.find('input[name="list_order[]"]').val(); + if (notName == 'user_id'){ + if ($notCheckedTR.find('input[type=hidden][name="usable_list[]"]').length) $notCheckedTR.find('input[type=hidden][name="usable_list[]"]').remove(); + if ($notCheckedTR.find('input[type=hidden][name='+name+']').length) $notCheckedTR.find('input[type=hidden][name='+name+']').remove(); + $notCheckedTR.find('input[type=checkbox][name="usable_list[]"]').removeAttr('disabled'); + $notCheckedTR.find('input[type=radio][name='+notName+']').removeAttr('disabled'); + } + $notCheckedTR.find('th').html('
                    '+$notCheckedTR.find('th ._title').html()+'
                    '); + $notCheckedTR.removeClass('sticky'); + + // add sticky class } }); + }); diff --git a/modules/member/tpl/member_config.html b/modules/member/tpl/member_config.html index afd7497b0..ba63c62de 100644 --- a/modules/member/tpl/member_config.html +++ b/modules/member/tpl/member_config.html @@ -112,6 +112,12 @@
                  {$lang->target}{$lang->identifier} + [?] +
                  +

                  로그인시 사용할 필드를 선택합니다.

                  +
                  +
                  {$lang->use} {$lang->cmd_required}/{$lang->cmd_optional} {$lang->description}
                  + {$item->title} + + + +   
                  {$item->title}
                  @@ -153,6 +177,7 @@ {$item->title} + From 9f94898ff01d1aad83c23f423a113eea1526d524 Mon Sep 17 00:00:00 2001 From: flyskyko Date: Wed, 7 Sep 2011 12:41:04 +0000 Subject: [PATCH 0645/1372] apply favicon, mobile icon git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9097 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/display/HTMLDisplayHandler.php | 8 ++ common/tpl/common_layout.html | 5 +- common/tpl/mobile_layout.html | 6 +- modules/admin/admin.admin.model.php | 21 +++++ modules/admin/admin.admin.view.php | 16 +--- modules/admin/tpl/js/config.js | 42 ++++++---- modules/install/install.admin.controller.php | 86 ++++++++++---------- 7 files changed, 110 insertions(+), 74 deletions(-) diff --git a/classes/display/HTMLDisplayHandler.php b/classes/display/HTMLDisplayHandler.php index 0ec492ca7..71e6f345d 100644 --- a/classes/display/HTMLDisplayHandler.php +++ b/classes/display/HTMLDisplayHandler.php @@ -121,6 +121,14 @@ class HTMLDisplayHandler { // Remove unnecessary information $output = preg_replace('/member\_\-([0-9]+)/s','member_0',$output); + // set icon + $oAdminModel = &getAdminModel('admin'); + $favicon_url = $oAdminModel->getFaviconUrl(); + $mobicon_url = $oAdminModel->getMobileIconUrl(); + Context::set('favicon_url', $favicon_url); + Context::set('mobicon_url', $mobicon_url); + debugPrint($favicon_url); + // convert the final layout Context::set('content', $output); $oTemplate = &TemplateHandler::getInstance(); diff --git a/common/tpl/common_layout.html b/common/tpl/common_layout.html index f1344f06f..8430d3d6f 100644 --- a/common/tpl/common_layout.html +++ b/common/tpl/common_layout.html @@ -48,7 +48,7 @@ - + @@ -58,6 +58,9 @@ + + + {@ $ssl_actions = Context::getSSLActions() } - + {@ $ssl_actions = Context::getSSLActions() } diff --git a/modules/admin/tpl/css/admin.css b/modules/admin/tpl/css/admin.css index b4ed8e89c..8061be026 100644 --- a/modules/admin/tpl/css/admin.css +++ b/modules/admin/tpl/css/admin.css @@ -223,6 +223,8 @@ header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{di .x .prgrs.prgrsLarge .pBar, .x .prgrs.prgrsLarge .pAction, .x .prgrs.prgrsLarge .pNum{height:34px;line-height:34px;font-size:14px} +/* Labels */ +.x label.overlap{position:absolute;color:#aaa} /* Modal Window */ .modal{position:absolute;top:0;left:0;width:100%;_height:100%;min-height:100%;z-index:100} .modal .bg{position:absolute;background:#000;_background:none;width:100%;height:100%;opacity:.5;z-index:2;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1} @@ -388,11 +390,13 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */ .x .btnArea:after{content:"";display:block;clear:both} /* Multilingual */ .x .langEdit{background:#fff;position:absolute;*left:0;*margin-top:28px;z-index:10;box-shadow:3px 3px 6px #999;-moz-box-shadow:3px 3px 6px #999;-webkit-box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} +.x .langEdit .langList{float:left} +.x .langEdit .langEditControls{float:right} +.x .langEdit .action{clear:both;border:1px solid #eee;width:268px;padding:0 10px} .x .langEdit ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0} .x .langEdit li{padding:.5em 10px} .x .langEdit input[type=text]{width:220px;padding-right:40px} .x .langEdit label{left:15px !important} -.x .langEdit .action{border:1px solid #eee;width:268px;padding:0 10px} .x .langEdit p, .x .langEdit .btnArea{white-space:normal} .x .langEdit li.en input, @@ -451,7 +455,8 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */ .x .suggestion li button{border:0;background:#fff;text-align:left;width:288px;padding:2px 4px;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap} .x .suggestion li button:hover, .x .suggestion li button:active, -.x .suggestion li button:focus{background:#eee} +.x .suggestion li button:focus, +.x .suggestion li button.active{background:#eee} /* Image Mark */ .x #imageMark{right:0} /* Easy Installer */ diff --git a/modules/admin/tpl/js/admin.js b/modules/admin/tpl/js/admin.js index 762f976a6..8a1af948f 100644 --- a/modules/admin/tpl/js/admin.js +++ b/modules/admin/tpl/js/admin.js @@ -7,7 +7,8 @@ jQuery(function($){ $('.form li').find('>input:text,>input:password,>textarea') .filter('input[value!=""],textarea:not(:empty)').prev('label').css('visibility','hidden').end().end() .prev('label') - .css({position:'absolute',top:'15px',left:'5px'}) + .addClass('overlap') + .css({top:'15px',left:'5px'}) .next() .focus(function(){ var $label = $(this).prev().stop().animate({opacity:0, left:'25px'},'fast',function(){ $label.css('visibility','hidden') }); @@ -292,12 +293,26 @@ $('a.modalAnchor').xeModalWindow(); // Content Toggler jQuery(function($){ +var dont_close_this_time = false; +var ESC = 27; + $.fn.xeContentToggler = function(){ this .not('.xe-content-toggler') .addClass('xe-content-toggler') .each(function(){ - $($(this).attr('href')).hide().focusout(focusoutContent); + var $anchor = $(this); $layer = $($anchor.attr('href')); + + $layer.hide() + .not('.xe-toggling-content') + .addClass('xe-toggling-content') + .mousedown(function(event){ dont_close_this_time = true }) + .focusout(function(event){ + setTimeout(function(){ + if(!dont_close_this_time && !$layer.find(':focus').length && $layer.data('state') == 'showing') $anchor.trigger('close.tc'); + dont_close_this_time = false; + }, 1); + }); }) .click(function(){ var $this = $(this), $layer; @@ -334,13 +349,15 @@ $.fn.xeContentToggler = function(){ // before event trigger $this.trigger('before-open.tc'); + dont_close_this_time = false; + // When mouse button is down or when ESC key is pressed close this layer $(document) .unbind('mousedown.tc keydown.tc') .bind('mousedown.tc keydown.tc', function(event){ if(event && ( - (event.type == 'keydown' && event.which != ESC_KEY) || + (event.type == 'keydown' && event.which != ESC) || (event.type == 'mousedown' && ($(event.target).is('.tgAnchor,.tgContent') || $layer.has(event.target)[0])) )) return true; @@ -418,13 +435,6 @@ $.fn.xeContentToggler = function(){ $('a.tgAnchor').xeContentToggler(); -function focusoutContent(event) { - var $this = $(this), $anchor = $this.data('anchor'); - setTimeout(function(){ - if(!$this.find(':focus').length && $this.data('state') == 'showing') $anchor.trigger('close.tc'); - }, 1); -}; - }); // Module finder @@ -668,26 +678,38 @@ function getOffset(elem, offsetParent) { // Language selector jQuery(function($){ -var w_timer = null, r_timer = null, r_idx = 0, f_timer = null; -var KEY_UP = 38, KEY_DOWN = 40; +var w_timer = null, r_timer = null, r_idx = 0, f_timer = null, skip_textchange=false; +var ESC=27, UP=38, DOWN=40, ENTER=13; $('.multiLangEdit') .find('input.vLang,textarea.vLang') + .each(function(){ + var $this = $(this), $container; + + $this + .data('mle-container', $container=$this.closest('.multiLangEdit')) + .data('mle-langkey', $container.find('.vLang').eq(0)) + .data('mle-suggestion', $container.find('.suggestion')); + }) .bind('textchange', function(){ - var $this = $(this), val = $.trim($this.val()), $ul, $mle; + var $this = $(this), val = $.trim($this.val()), $ul, $container; if(r_timer) { clearTimeout(r_timer); r_timer = null; } - if(!val) return; + $container = $this.data('mle-container'); + $ul = $this.data('mle-suggestion').find('>ul'); - $mle = $this.closest('.multiLangEdit'); - $ul = $mle.find('.suggestion > ul'); + if(!val || skip_textchange) { + skip_textchange = false; + $ul.parent().hide(); + return; + } // remove lagnauge key - $mle.find('.vLang').eq(0).val(''); + $this.data('mle-langkey').val(''); function request() { $this.addClass('loading'); @@ -713,11 +735,51 @@ $('.multiLangEdit') $btn = $('
                  - - -
                  -
                    -
                  -
                  - + +
                    {$lang->cmd_set_multilingual}
                    - - -
                    -
                      -
                    -
                    - + +
                      {$lang->cmd_set_multilingual}
                      tag $table */ function TableTag($table){ - $dbParser = XmlQueryParser::getDBParser(); + $dbParser = DB::getParser(); $this->unescaped_name = $table->attrs->name; $this->name = $dbParser->parseTableName($table->attrs->name); @@ -67,7 +67,7 @@ * @return string */ function getTableString(){ - $dbParser = XmlQueryParser::getDBParser(); + $dbParser = DB::getParser(); if($this->isJoinTable()){ return sprintf('new JoinTable(\'%s\', \'%s\', "%s", %s)' , $dbParser->escape($this->name) diff --git a/test-phpUnit/db/CubridOnlineTest.php b/test-phpUnit/db/CubridOnlineTest.php index d51353e1a..08037d02d 100644 --- a/test-phpUnit/db/CubridOnlineTest.php +++ b/test-phpUnit/db/CubridOnlineTest.php @@ -35,7 +35,7 @@ // remove cache dir FileHandler::removeDir( _XE_PATH_ . 'files/cache'); - XmlQueryParser::getDBParser(true); + DB::getParser(true); } /** diff --git a/test-phpUnit/db/CubridTest.php b/test-phpUnit/db/CubridTest.php index ee62a6dc0..7eb3a986f 100644 --- a/test-phpUnit/db/CubridTest.php +++ b/test-phpUnit/db/CubridTest.php @@ -16,7 +16,7 @@ $db_info->slave_db = array(array('db_type' => 'cubrid','db_table_prefix' => 'xe_')); $oContext->setDbInfo($db_info); - XmlQueryParser::getDBParser(true); + DB::getParser(true); } /** diff --git a/test-phpUnit/db/MssqlOnlineTest.php b/test-phpUnit/db/MssqlOnlineTest.php index 1f5084220..07f356aa0 100644 --- a/test-phpUnit/db/MssqlOnlineTest.php +++ b/test-phpUnit/db/MssqlOnlineTest.php @@ -35,7 +35,7 @@ // remove cache dir FileHandler::removeDir( _XE_PATH_ . 'files/cache'); - XmlQueryParser::getDBParser(true); + DB::getParser(true); } /** diff --git a/test-phpUnit/db/MssqlTest.php b/test-phpUnit/db/MssqlTest.php index 58f99ffa9..6e9f5392d 100644 --- a/test-phpUnit/db/MssqlTest.php +++ b/test-phpUnit/db/MssqlTest.php @@ -15,7 +15,7 @@ $oContext->setDbInfo($db_info); - XmlQueryParser::getDBParser(true); + DB::getParser(true); } protected function tearDown() { From 20d589afc0fb8640901465c414ce7d3797252e5e Mon Sep 17 00:00:00 2001 From: ucorina Date: Fri, 9 Sep 2011 15:48:10 +0000 Subject: [PATCH 0686/1372] Few more changes for last commit - "Moved call to getDBParser from XmlQueryParser.class.php to DB.class.php". git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9140 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/db/DB.class.php | 18 ++++++++++++++++++ classes/xml/XmlQueryParser.class.php | 11 ----------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/classes/db/DB.class.php b/classes/db/DB.class.php index 2ec5b8991..fa4a05de4 100644 --- a/classes/db/DB.class.php +++ b/classes/db/DB.class.php @@ -788,6 +788,24 @@ $this->elapsed_dbclass_time = $elapsed_dbclass_time; $GLOBALS['__dbclass_elapsed_time__'] += $elapsed_dbclass_time; } + + /** + * Returns a database specific parser class + * used for escaping expressions and table/column identifiers + * + * Requires an implementation of the DB class (won't work if database is not set) + * + * @remarks singleton + */ + function &getParser($force = false){ + static $dbParser = null; + if(!$dbParser || $force) { + $oDB = &DB::getInstance(); + $dbParser = $oDB->getParser(); + } + + return $dbParser; + } } ?> diff --git a/classes/xml/XmlQueryParser.class.php b/classes/xml/XmlQueryParser.class.php index 640bf5888..61bddbf2a 100644 --- a/classes/xml/XmlQueryParser.class.php +++ b/classes/xml/XmlQueryParser.class.php @@ -70,17 +70,6 @@ FileHandler::writeFile($cache_file, $parser->toString()); } - // singleton - function &getDBParser($force = false){ - static $dbParser = null; - if(!$dbParser || $force) { - $oDB = &DB::getInstance(); - $dbParser = $oDB->getParser(); - } - - return $dbParser; - } - function getXmlFileContent($xml_file){ $buff = FileHandler::readFile($xml_file); $xml_obj = parent::parse($buff); From aa1f0ceddc375a58e2ba93d706188040469fa8e4 Mon Sep 17 00:00:00 2001 From: ucorina Date: Tue, 13 Sep 2011 10:33:20 +0000 Subject: [PATCH 0687/1372] Changed db class to always run select queries on slave. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9141 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/db/DB.class.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/classes/db/DB.class.php b/classes/db/DB.class.php index fa4a05de4..c58662e3d 100644 --- a/classes/db/DB.class.php +++ b/classes/db/DB.class.php @@ -323,7 +323,7 @@ * @return result of query * @remarks this function finds xml file or cache file of $query_id, compiles it and then execute it **/ - function executeQuery($query_id, $args = NULL, $arg_columns = NULL, $database_type = 'master') { + function executeQuery($query_id, $args = NULL, $arg_columns = NULL) { if(!$query_id) return new Object(-1, 'msg_invalid_queryid'); if(!$this->db_type) return; @@ -358,7 +358,7 @@ // look for cache file $cache_file = $this->checkQueryCacheFile($query_id, $xml_file); - $result = $this->_executeQuery($cache_file, $args, $query_id, $arg_columns, $database_type); + $result = $this->_executeQuery($cache_file, $args, $query_id, $arg_columns); $this->actDBClassFinish(); // execute query @@ -398,7 +398,7 @@ * @param[in] $query_id query id * @return result of query **/ - function _executeQuery($cache_file, $source_args, $query_id, $arg_columns, $database_type) { + function _executeQuery($cache_file, $source_args, $query_id, $arg_columns) { global $lang; if(!file_exists($cache_file)) return new Object(-1, 'msg_invalid_queryid'); @@ -426,7 +426,7 @@ case 'select' : $arg_columns = is_array($arg_columns)?$arg_columns:array(); $output->setColumnList($arg_columns); - $connection = $this->_getConnection($database_type); + $connection = $this->_getConnection('slave'); $output = $this->_executeSelectAct($output, $connection); break; } @@ -788,7 +788,7 @@ $this->elapsed_dbclass_time = $elapsed_dbclass_time; $GLOBALS['__dbclass_elapsed_time__'] += $elapsed_dbclass_time; } - + /** * Returns a database specific parser class * used for escaping expressions and table/column identifiers @@ -805,7 +805,7 @@ } return $dbParser; - } + } } ?> From 054a2e7e81024c8f8b6339c965d1179887a4b427 Mon Sep 17 00:00:00 2001 From: dragan-dan Date: Tue, 13 Sep 2011 16:27:17 +0000 Subject: [PATCH 0688/1372] cache improvements 2 git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9142 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- .../document/document.admin.controller.php | 6 +- modules/document/document.controller.php | 5 + modules/document/document.item.php | 17 ++- modules/member/member.model.php | 17 ++- modules/module/module.controller.php | 65 +++++++++- modules/module/module.model.php | 116 +++++++++++++----- 6 files changed, 188 insertions(+), 38 deletions(-) diff --git a/modules/document/document.admin.controller.php b/modules/document/document.admin.controller.php index a9bf85443..280ae8079 100644 --- a/modules/document/document.admin.controller.php +++ b/modules/document/document.admin.controller.php @@ -156,7 +156,9 @@ foreach($document_srl_list as $document_srl) { $cache_key = 'object:'.$document_srl; - $oCacheHandler->delete($cache_key); + $oCacheHandler->delete($cache_key); + $cache_key_item = 'object_document_item:'.$document_srl; + $oCacheHandler->delete($cache_key_item); } $cache_object = $oCacheHandler->get('module_list_documents'); foreach ($cache_object as $object){ @@ -298,6 +300,8 @@ { $cache_key = 'object:'.$document_srl; $oCacheHandler->delete($cache_key); + $cache_key_item = 'object_document_item:'.$document_srl; + $oCacheHandler->delete($cache_key_item); } $cache_object = $oCacheHandler->get('module_list_documents'); foreach ($cache_object as $object){ diff --git a/modules/document/document.controller.php b/modules/document/document.controller.php index 7858f7611..b321c92b4 100644 --- a/modules/document/document.controller.php +++ b/modules/document/document.controller.php @@ -416,6 +416,9 @@ class documentController extends document { $oCacheHandler->delete($cache_key_object); } $oCacheHandler->delete('module_list_documents'); + //remove document item from cache + $cache_key = 'object_document_item:'.$obj->document_srl; + $oCacheHandler->delete($cache_key); } return $output; @@ -500,6 +503,8 @@ class documentController extends document { $oCacheHandler->delete($cache_key_object); } $oCacheHandler->delete('module_list_documents'); + $cache_key = 'object_document_item:'.$document_srl; + $oCacheHandler->delete($cache_key); } return $output; diff --git a/modules/document/document.item.php b/modules/document/document.item.php index 00c1767bb..d556f72eb 100644 --- a/modules/document/document.item.php +++ b/modules/document/document.item.php @@ -27,10 +27,19 @@ function _loadFromDB($load_extra_vars = true) { if(!$this->document_srl) return; - - $args->document_srl = $this->document_srl; - $output = executeQuery('document.getDocument', $args, $this->columnList); - + + // cache controll + $oCacheHandler = &CacheHandler::getInstance('object'); + if($oCacheHandler->isSupport()){ + $cache_key = 'object_document_item:'.$this->document_srl; + $output = $oCacheHandler->get($cache_key); + } + if(!$output) { + $args->document_srl = $this->document_srl; + $output = executeQuery('document.getDocument', $args, $this->columnList); + //insert in cache + if($oCacheHandler->isSupport()) $oCacheHandler->put($cache_key,$output); + } $this->setAttribute($output->data,$load_extra_vars); } diff --git a/modules/member/member.model.php b/modules/member/member.model.php index ed8f4906b..1b83e79f9 100644 --- a/modules/member/member.model.php +++ b/modules/member/member.model.php @@ -293,12 +293,23 @@ * @brief Get a list of groups which the member_srl belongs to **/ function getMemberGroups($member_srl, $site_srl = 0, $force_reload = false) { + // cache controll + $oCacheHandler = &CacheHandler::getInstance('object'); + if($oCacheHandler->isSupport()){ + $cache_key = 'object_member_groups:'.$member_srl.'_'.$site_srl; + $output = $oCacheHandler->get($cache_key); + } static $member_groups = array(); if(!$member_groups[$member_srl][$site_srl] || $force_reload) { - $args->member_srl = $member_srl; - $args->site_srl = $site_srl; - $output = executeQuery('member.getMemberGroups', $args); + if(!$output){ + $args->member_srl = $member_srl; + $args->site_srl = $site_srl; + $output = executeQuery('member.getMemberGroups', $args); + //insert in cache + if($oCacheHandler->isSupport()) $oCacheHandler->put($cache_key,$output); + } if(!$output->data) return array(); + $group_list = $output->data; if(!is_array($group_list)) $group_list = array($group_list); diff --git a/modules/module/module.controller.php b/modules/module/module.controller.php index 2f9688d25..ccbfe37a9 100644 --- a/modules/module/module.controller.php +++ b/modules/module/module.controller.php @@ -52,10 +52,20 @@ $args->called_position = $called_position; $output = executeQuery('module.insertTrigger', $args); + + //remove from cache + $oCacheHandler = &CacheHandler::getInstance('object'); + if($oCacheHandler->isSupport()) + { + $cache_key = 'object:'.$trigger_name.'_'.$called_position; + $oCacheHandler->delete($cache_key); + } + // Delete all the files which contain trigger information FileHandler::removeFilesInDir("./files/cache/triggers"); return $output; + } /** @@ -70,6 +80,15 @@ $args->called_position = $called_position; $output = executeQuery('module.deleteTrigger', $args); + + //remove from cache + $oCacheHandler = &CacheHandler::getInstance('object'); + if($oCacheHandler->isSupport()) + { + $cache_key = 'object:'.$trigger_name.'_'.$called_position; + $oCacheHandler->delete($cache_key); + } + // Remove the trigger cache FileHandler::removeFilesInDir('./files/cache/triggers'); @@ -131,6 +150,13 @@ } return $this->insertModuleConfig($module, $origin_config, $site_srl); + //remove from cache + $oCacheHandler = &CacheHandler::getInstance('object'); + if($oCacheHandler->isSupport()) + { + $cache_key = 'object:module_config:module_'.$module.'_site_srl_'.$site_srl; + $oCacheHandler->delete($cache_key); + } } /** @@ -160,8 +186,19 @@ $output = executeQuery('module.deleteModulePartConfig', $args); if(!$output->toBool()) return $output; - + + //remove from cache + $oCacheHandler = &CacheHandler::getInstance('object'); + if($oCacheHandler->isSupport()) + { + $cache_key = 'object_module_part_config:'.$module.'_'.$module_srl; + $oCacheHandler->delete($cache_key); + } + $output = executeQuery('module.insertModulePartConfig', $args); + + + return $output; } @@ -407,7 +444,15 @@ $args->skin_vars = $skin_vars; $output = executeQuery('module.updateModuleSkinVars', $args); if(!$output->toBool()) return $output; - + + //remove from cache + $oCacheHandler = &CacheHandler::getInstance('object'); + if($oCacheHandler->isSupport()) + { + $cache_key = 'object_module_skin_vars:'.$module_srl; + $oCacheHandler->delete($cache_key); + } + return $output; } @@ -524,6 +569,15 @@ **/ function deleteModuleSkinVars($module_srl) { $args->module_srl = $module_srl; + + //remove from cache + $oCacheHandler = &CacheHandler::getInstance('object'); + if($oCacheHandler->isSupport()) + { + $cache_key = 'object_module_skin_vars:'.$module_srl; + $oCacheHandler->delete($cache_key); + } + return executeQuery('module.deleteModuleSkinVars', $args); } @@ -550,6 +604,13 @@ function deleteModuleExtraVars($module_srl) { $args->module_srl = $module_srl; return executeQuery('module.deleteModuleExtraVars', $args); + //remove from cache + $oCacheHandler = &CacheHandler::getInstance('object'); + if($oCacheHandler->isSupport()) + { + $cache_key = 'object:module_extra_vars_'.$module_srl; + $oCacheHandler->delete($cache_key); + } } /** diff --git a/modules/module/module.model.php b/modules/module/module.model.php index 944eb19da..fecba260d 100644 --- a/modules/module/module.model.php +++ b/modules/module/module.model.php @@ -311,9 +311,18 @@ * @brief Get a list of all triggers on the trigger_name **/ function getTriggers($trigger_name, $called_position) { - $args->trigger_name = $trigger_name; - $args->called_position = $called_position; - $output = executeQueryArray('module.getTriggers',$args); + // cache controll + $oCacheHandler = &CacheHandler::getInstance('object'); + if($oCacheHandler->isSupport()){ + $cache_key = 'object:'.$trigger_name.'_'.$called_position; + $output = $oCacheHandler->get($cache_key); + } + if(!$output) { + $args->trigger_name = $trigger_name; + $args->called_position = $called_position; + $output = executeQueryArray('module.getTriggers',$args); + if($oCacheHandler->isSupport()) $oCacheHandler->put($cache_key,$output); + } return $output->data; } @@ -913,14 +922,28 @@ * Global configuration is used to manage board, member and others **/ function getModuleConfig($module, $site_srl = 0) { - if(!$GLOBALS['__ModuleConfig__'][$site_srl][$module]) { - $args->module = $module; - $args->site_srl = $site_srl; - $output = executeQuery('module.getModuleConfig', $args); - $config = unserialize($output->data->config); - $GLOBALS['__ModuleConfig__'][$site_srl][$module] = $config; + // cache controll + $oCacheHandler = &CacheHandler::getInstance('object'); + if($oCacheHandler->isSupport()){ + $cache_key = 'object:module_config:module_'.$module.'_site_srl_'.$site_srl; + $config = $oCacheHandler->get($cache_key); } - return $GLOBALS['__ModuleConfig__'][$site_srl][$module]; + if(!$config) { + if(!$GLOBALS['__ModuleConfig__'][$site_srl][$module]) { + $args->module = $module; + $args->site_srl = $site_srl; + $output = executeQuery('module.getModuleConfig', $args); + $config = unserialize($output->data->config); + if(!$config) $config = 'empty_module_config'; + //insert in cache + if($oCacheHandler->isSupport()) $oCacheHandler->put($cache_key,$config); + $GLOBALS['__ModuleConfig__'][$site_srl][$module] = $config; + } + return $GLOBALS['__ModuleConfig__'][$site_srl][$module]; + } elseif($config == 'empty_module_config') { + return; + } + return $config; } /** @@ -928,14 +951,29 @@ * Manage mid configurations which depend on module **/ function getModulePartConfig($module, $module_srl) { - if(!$GLOBALS['__ModulePartConfig__'][$module][$module_srl]) { - $args->module = $module; - $args->module_srl = $module_srl; - $output = executeQuery('module.getModulePartConfig', $args); - $config = unserialize($output->data->config); - $GLOBALS['__ModulePartConfig__'][$module][$module_srl] = $config; + // cache controll + $oCacheHandler = &CacheHandler::getInstance('object'); + if($oCacheHandler->isSupport()){ + $cache_key = 'object_module_part_config:'.$module.'_'.$module_srl; + $config = $oCacheHandler->get($cache_key); } + if(!$config) { + if(!$GLOBALS['__ModulePartConfig__'][$module][$module_srl]) { + $args->module = $module; + $args->module_srl = $module_srl; + $output = executeQuery('module.getModulePartConfig', $args); + $config = unserialize($output->data->config); + if(!$config) $config = 'empty_module_config'; + //insert in cache + if($oCacheHandler->isSupport()) $oCacheHandler->put($cache_key,$config); + $GLOBALS['__ModulePartConfig__'][$module][$module_srl] = $config; + } return $GLOBALS['__ModulePartConfig__'][$module][$module_srl]; + } elseif($config == 'empty_module_config') { + return; + } + return $config; + } /** @@ -1185,15 +1223,28 @@ * Extra information, not in the modules table **/ function getModuleExtraVars($module_srl) { - if(is_array($module_srl)) $module_srl = implode(',',$module_srl); - $args->module_srl = $module_srl; - $output = executeQueryArray('module.getModuleExtraVars',$args); - if(!$output->toBool() || !$output->data) return; - - $vars = array(); - foreach($output->data as $key => $val) { - if(in_array($val->name, array('mid','module')) || $val->value == 'Array') continue; - $vars[$val->module_srl]->{$val->name} = $val->value; + if(is_array($module_srl)) $module_srl = implode(',',$module_srl); + // cache controll + $oCacheHandler = &CacheHandler::getInstance('object'); + if($oCacheHandler->isSupport()){ + $cache_key = 'object:module_extra_vars_'.$module_srl; + $vars = $oCacheHandler->get($cache_key); + } + if(!$vars) { + $args->module_srl = $module_srl; + $output = executeQueryArray('module.getModuleExtraVars',$args); + if(!$output->toBool() || !$output->data) { + if($oCacheHandler->isSupport()) $oCacheHandler->put($cache_key,'empty_extra_vars'); + return; + } + $vars = array(); + foreach($output->data as $key => $val) { + if(in_array($val->name, array('mid','module')) || $val->value == 'Array') continue; + $vars[$val->module_srl]->{$val->name} = $val->value; + } + if($oCacheHandler->isSupport()) $oCacheHandler->put($cache_key,$vars); + } elseif($vars == 'empty_extra_vars') { + return; } return $vars; } @@ -1216,9 +1267,18 @@ **/ function syncSkinInfoToModuleInfo(&$module_info) { if(!$module_info->module_srl) return; - - $args->module_srl = $module_info->module_srl; - $output = executeQueryArray('module.getModuleSkinVars',$args); + // cache controll + $oCacheHandler = &CacheHandler::getInstance('object'); + if($oCacheHandler->isSupport()){ + $cache_key = 'object_module_skin_vars:'.$module_info->module_srl; + $output = $oCacheHandler->get($cache_key); + } + if(!$output) { + $args->module_srl = $module_info->module_srl; + $output = executeQueryArray('module.getModuleSkinVars',$args); + //insert in cache + if($oCacheHandler->isSupport()) $oCacheHandler->put($cache_key,$output); + } if(!$output->toBool() || !$output->data) return; foreach($output->data as $val) { From 53ccb1b84f2148800db70dfef4379a21ca0acab7 Mon Sep 17 00:00:00 2001 From: dragan-dan Date: Wed, 14 Sep 2011 12:45:30 +0000 Subject: [PATCH 0689/1372] cache improvements bug fixed git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9143 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/module/module.model.php | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/modules/module/module.model.php b/modules/module/module.model.php index fecba260d..e9c83a706 100644 --- a/modules/module/module.model.php +++ b/modules/module/module.model.php @@ -934,9 +934,11 @@ $args->site_srl = $site_srl; $output = executeQuery('module.getModuleConfig', $args); $config = unserialize($output->data->config); - if(!$config) $config = 'empty_module_config'; //insert in cache - if($oCacheHandler->isSupport()) $oCacheHandler->put($cache_key,$config); + if($oCacheHandler->isSupport()) { + if(!$config) $config = 'empty_module_config'; + $oCacheHandler->put($cache_key,$config); + } $GLOBALS['__ModuleConfig__'][$site_srl][$module] = $config; } return $GLOBALS['__ModuleConfig__'][$site_srl][$module]; @@ -963,9 +965,11 @@ $args->module_srl = $module_srl; $output = executeQuery('module.getModulePartConfig', $args); $config = unserialize($output->data->config); - if(!$config) $config = 'empty_module_config'; //insert in cache - if($oCacheHandler->isSupport()) $oCacheHandler->put($cache_key,$config); + if($oCacheHandler->isSupport()) { + if(!$config) $config = 'empty_module_config'; + $oCacheHandler->put($cache_key,$config); + } $GLOBALS['__ModulePartConfig__'][$module][$module_srl] = $config; } return $GLOBALS['__ModulePartConfig__'][$module][$module_srl]; From 92752f29fa142c69c9dd107ab6e063aaa90b2051 Mon Sep 17 00:00:00 2001 From: ovclas Date: Thu, 15 Sep 2011 02:45:15 +0000 Subject: [PATCH 0690/1372] issue 160 sitemap admin multi lang add git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9145 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/lang/lang.xml | 4 +++ modules/admin/lang/lang.xml | 4 +++ modules/menu/tpl/js/sitemap.js | 1 + modules/menu/tpl/sitemap.html | 49 +++++++++++++--------------------- 4 files changed, 27 insertions(+), 31 deletions(-) diff --git a/common/lang/lang.xml b/common/lang/lang.xml index 6a593fa18..f1bb5d7d1 100644 --- a/common/lang/lang.xml +++ b/common/lang/lang.xml @@ -2105,6 +2105,10 @@ + + + + diff --git a/modules/admin/lang/lang.xml b/modules/admin/lang/lang.xml index f954f3c1c..f4aa52cff 100644 --- a/modules/admin/lang/lang.xml +++ b/modules/admin/lang/lang.xml @@ -977,4 +977,8 @@ Lütfen son sürümü için indirme linkine tıklayınız.]]> + + + + diff --git a/modules/menu/tpl/js/sitemap.js b/modules/menu/tpl/js/sitemap.js index 3b3e9c94c..cea43949b 100644 --- a/modules/menu/tpl/js/sitemap.js +++ b/modules/menu/tpl/js/sitemap.js @@ -38,6 +38,7 @@ $('form.siteMap') function completeGetActList(obj) { var menuItem = obj.menu_item; + console.log(menuItem); menuUrl = menuItem.url; editForm.find('.h2').html('Edit Menu'); editForm.find('input[name=menu_srl]').val(menuItem.menu_srl); diff --git a/modules/menu/tpl/sitemap.html b/modules/menu/tpl/sitemap.html index 212cfd67b..6e79741e1 100644 --- a/modules/menu/tpl/sitemap.html +++ b/modules/menu/tpl/sitemap.html @@ -57,43 +57,30 @@
                      - -
                      -
                        -
                      • -
                      • -
                      -
                      -
                      -
                        -
                      • -
                      • - -
                      • -
                      • -
                      • -
                      • -
                      • -
                      • -
                      • -
                      • -
                      • -
                      -
                      - -

                      다국어 텍스트가 변경되었습니다. 업데이트 버튼을 클릭하면 같은 텍스트를 사용하는 다른 페이지에도 반영됩니다. 새로 저장 버튼을 클릭하면 이 페이지에만 적용됩니다.

                      -
                      - - +
                        +
                        +

                        {$lang->multilingual} {$lang->cmd_modify} | {$lang->cmd_insert}

                        +
                          + {@ + /* move current language to the top */ + $a = array($lang_type=>$lang_supported[$lang_type]); + unset($lang_supported[$lang_type]); + $lang_supported = array_merge($a, $lang_supported); + } +
                        • +
                        + - -

                        다국어 텍스트 관리

                        - Multilingual + {$lang->cmd_set_multilingual}
                      • From a79c17c4b845b83708420ffb91c85f41d9782a64 Mon Sep 17 00:00:00 2001 From: ovclas Date: Thu, 15 Sep 2011 02:55:11 +0000 Subject: [PATCH 0691/1372] issue 160 sitemap new menu attribute modify git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9146 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/menu/tpl/js/sitemap.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/menu/tpl/js/sitemap.js b/modules/menu/tpl/js/sitemap.js index cea43949b..a1e1f4176 100644 --- a/modules/menu/tpl/js/sitemap.js +++ b/modules/menu/tpl/js/sitemap.js @@ -112,7 +112,7 @@ $('form.siteMap') editForm.find('input=[name=create_menu_url]').val(''); editForm.find('input=[name=select_menu_url]').val(''); editForm.find('input=[name=menu_url]').val(''); - editForm.find('input=[name=menu_open_window]').attr('checked', false); + editForm.find('input=[name=menu_open_window]')[0].checked = true; editForm.find('input=[name=group_srls\\[\\]]').attr('checked', false); }); From ead9eceded3334bd653f71e89f9e72f564260335 Mon Sep 17 00:00:00 2001 From: ngleader Date: Thu, 15 Sep 2011 04:50:47 +0000 Subject: [PATCH 0692/1372] Issue 167 supporting theme in auto install module. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9147 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/autoinstall/autoinstall.admin.controller.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/autoinstall/autoinstall.admin.controller.php b/modules/autoinstall/autoinstall.admin.controller.php index 5af20aebe..203eebccf 100644 --- a/modules/autoinstall/autoinstall.admin.controller.php +++ b/modules/autoinstall/autoinstall.admin.controller.php @@ -93,6 +93,10 @@ $config_file = "/info.xml"; $type = "component"; break; + case "theme": + $config_file = "/conf/info.xml"; + $type = "theme"; + break; } if(!$config_file) continue; $xml = new XmlParser(); From 865e88c47bc4695f854788e003d5a4d6f8eddfc8 Mon Sep 17 00:00:00 2001 From: flyskyko Date: Thu, 15 Sep 2011 05:04:33 +0000 Subject: [PATCH 0693/1372] issue 160 fixed a bug for addon git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9148 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/addon/addon.admin.controller.php | 13 +++++++------ modules/addon/addon.admin.model.php | 2 +- modules/addon/addon.admin.view.php | 2 +- modules/addon/addon.controller.php | 5 ++--- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/modules/addon/addon.admin.controller.php b/modules/addon/addon.admin.controller.php index b7e92e583..dde21e740 100644 --- a/modules/addon/addon.admin.controller.php +++ b/modules/addon/addon.admin.controller.php @@ -77,15 +77,16 @@ $args->fixed = 'N'; $args->addon = $targetAddon; + $args->site_srl = 0; - $output = executeQuery('addon.updateAddon', $args); + $output = executeQuery('addon.updateSiteAddon', $args); if (!$output->toBool()) return $output; } if (count($updateList)) { - $this->makeCacheFile(0, 'pc', 'global'); - $this->makeCacheFile(0, 'mobile', 'global'); + $this->makeCacheFile(0, 'pc', 'site'); + $this->makeCacheFile(0, 'mobile', 'site'); } $this->setRedirectUrl(getNotEncodedUrl('', 'module', 'admin', 'act', 'dispAddonAdminIndex')); @@ -126,11 +127,11 @@ $site_module_info = Context::get('site_module_info'); - $output = $this->doSetup($addon_name, $args, $site_module_info->site_srl, 'global'); + $output = $this->doSetup($addon_name, $args, $site_module_info->site_srl, 'site'); if (!$output->toBool()) return $output; - $this->makeCacheFile($site_module_info->site_srl, "pc", 'global'); - $this->makeCacheFile($site_module_info->site_srl, "mobile", 'global'); + $this->makeCacheFile($site_module_info->site_srl, "pc", 'site'); + $this->makeCacheFile($site_module_info->site_srl, "mobile", 'site'); $this->setRedirectUrl(getNotEncodedUrl('', 'module', 'admin', 'act', 'dispAddonAdminSetup', 'selected_addon', $addon_name)); } diff --git a/modules/addon/addon.admin.model.php b/modules/addon/addon.admin.model.php index 191416e06..5c49258b6 100644 --- a/modules/addon/addon.admin.model.php +++ b/modules/addon/addon.admin.model.php @@ -27,7 +27,7 @@ **/ function getAddonListForSuperAdmin() { - $addonList = $this->getAddonList(0, 'global'); + $addonList = $this->getAddonList(0, 'site'); $oAutoinstallModel = &getModel('autoinstall'); foreach($addonList as $key => $addon) diff --git a/modules/addon/addon.admin.view.php b/modules/addon/addon.admin.view.php index 41a0725e8..49fc3e12d 100644 --- a/modules/addon/addon.admin.view.php +++ b/modules/addon/addon.admin.view.php @@ -47,7 +47,7 @@ $selected_addon = Context::get('selected_addon'); // Wanted to add the requested information $oAddonModel = &getAdminModel('addon'); - $addon_info = $oAddonModel->getAddonInfoXml($selected_addon, $site_module_info->site_srl, 'global'); + $addon_info = $oAddonModel->getAddonInfoXml($selected_addon, $site_module_info->site_srl, 'site'); Context::set('addon_info', $addon_info); // Get a mid list $oModuleModel = &getModel('module'); diff --git a/modules/addon/addon.controller.php b/modules/addon/addon.controller.php index 927ab195f..051f6965d 100644 --- a/modules/addon/addon.controller.php +++ b/modules/addon/addon.controller.php @@ -23,8 +23,7 @@ $addon_path = _XE_PATH_.'files/cache/addons/'; - if($site_srl) $addon_file = $addon_path.$site_srl.$type.'.acivated_addons.cache.php'; - else $addon_file = $addon_path.$type.'acivated_addons.cache.php'; + $addon_file = $addon_path.$site_srl.$type.'.acivated_addons.cache.php'; if($this->addon_file_called) return $addon_file; $this->addon_file_called = true; @@ -147,7 +146,7 @@ if(!is_dir($addon_path)) FileHandler::makeDir($addon_path); if($gtype == 'site') $addon_file = $addon_path.$site_srl.$type.'.acivated_addons.cache.php'; - else $addon_file = $addon_path.$type.'acivated_addons.cache.php'; + else $addon_file = $addon_path.$type.'.acivated_addons.cache.php'; FileHandler::writeFile($addon_file, $buff); } From 643d3d158ccf192571aa0bce638fe0afab5fc17b Mon Sep 17 00:00:00 2001 From: flyskyko Date: Thu, 15 Sep 2011 05:36:46 +0000 Subject: [PATCH 0694/1372] issue 160, added language codes for easyinstall git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9149 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/autoinstall/lang/lang.xml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/modules/autoinstall/lang/lang.xml b/modules/autoinstall/lang/lang.xml index 51f671169..6f58a808e 100644 --- a/modules/autoinstall/lang/lang.xml +++ b/modules/autoinstall/lang/lang.xml @@ -252,4 +252,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 2f2627765266c1e5a68848497dfa6ae2a9131a5d Mon Sep 17 00:00:00 2001 From: ovclas Date: Thu, 15 Sep 2011 05:39:54 +0000 Subject: [PATCH 0695/1372] issue 160 enviroment info gathering agreement bug fix git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9150 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/admin.admin.controller.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/admin/admin.admin.controller.php b/modules/admin/admin.admin.controller.php index 5e3962897..c18751ca6 100644 --- a/modules/admin/admin.admin.controller.php +++ b/modules/admin/admin.admin.controller.php @@ -200,8 +200,8 @@ function procAdminEnviromentGatheringAgreement() { $isAgree = Context::get('is_agree'); - if($isAgree == 'true') - $_SESSION['enviroment_gather'] = 'Y'; + if($isAgree == 'true') $_SESSION['enviroment_gather'] = 'Y'; + else $_SESSION['enviroment_gather'] = 'N'; $redirectUrl = getUrl('', 'module', 'admin'); $this->setRedirectUrl($redirectUrl); From 78f9868d0a5a71083e5803a27751908a600b3741 Mon Sep 17 00:00:00 2001 From: flyskyko Date: Thu, 15 Sep 2011 06:13:54 +0000 Subject: [PATCH 0696/1372] issue 160, fixed a bug for checking easyinstall update git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9151 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/module/module.admin.view.php | 2 +- modules/module/tpl/module_list.html | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/module/module.admin.view.php b/modules/module/module.admin.view.php index 53f484635..410eace80 100644 --- a/modules/module/module.admin.view.php +++ b/modules/module/module.admin.view.php @@ -43,7 +43,7 @@ $module_list[$key]->need_autoinstall_update = $package[$packageSrl]->need_update; // get easyinstall update url - if ($module_list[$key]->need_autoinstall_update) + if ($module_list[$key]->need_autoinstall_update == 'Y') { $module_list[$key]->update_url = $oAutoinstallModel->getUpdateUrlByPackageSrl($packageSrl); } diff --git a/modules/module/tpl/module_list.html b/modules/module/tpl/module_list.html index 4a2c2c423..5dae49b12 100644 --- a/modules/module/tpl/module_list.html +++ b/modules/module/tpl/module_list.html @@ -36,8 +36,8 @@

                        {$val->title}

                        {$val->description}

                        {$lang->msg_avail_install} {$lang->msg_do_you_like_install}

                        -

                        {$lang->msg_avail_updaet} {$lang->msg_do_you_like_update}

                        -

                        {$lang->msg_avail_easy_update}{$lang->msg_do_you_like_update}

                        +

                        {$lang->msg_avail_update} {$lang->msg_do_you_like_update}

                        +

                        {$lang->msg_avail_easy_update}{$lang->msg_do_you_like_update}

                      • diff --git a/modules/document/tpl/header.html b/modules/document/tpl/header.html index 5e259198f..010c7bb6b 100644 --- a/modules/document/tpl/header.html +++ b/modules/document/tpl/header.html @@ -1,4 +1,4 @@ - +

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

                        diff --git a/modules/document/tpl/preview_page.html b/modules/document/tpl/preview_page.html index fb7dc0034..bd953bb6e 100644 --- a/modules/document/tpl/preview_page.html +++ b/modules/document/tpl/preview_page.html @@ -1,5 +1,5 @@ - - + + {$content} diff --git a/modules/document/tpl/print_page.html b/modules/document/tpl/print_page.html index f79687f9a..3e2466202 100644 --- a/modules/document/tpl/print_page.html +++ b/modules/document/tpl/print_page.html @@ -1,5 +1,5 @@ - - + +
                        diff --git a/modules/document/tpl/saved_list_popup.html b/modules/document/tpl/saved_list_popup.html index e791907ed..c0f05b289 100644 --- a/modules/document/tpl/saved_list_popup.html +++ b/modules/document/tpl/saved_list_popup.html @@ -1,5 +1,4 @@ - - +
                        @@ -34,12 +33,12 @@
                        diff --git a/modules/widget/tpl/add_content_widget.html b/modules/widget/tpl/add_content_widget.html index 9717ae071..f030ec001 100644 --- a/modules/widget/tpl/add_content_widget.html +++ b/modules/widget/tpl/add_content_widget.html @@ -1,5 +1,5 @@ - - + +
                        diff --git a/modules/widget/tpl/skin_info.html b/modules/widget/tpl/skin_info.html index 05c403d4e..0cd173f32 100644 --- a/modules/widget/tpl/skin_info.html +++ b/modules/widget/tpl/skin_info.html @@ -1,4 +1,4 @@ - +

                        {$skin_info->title}

                        diff --git a/modules/widget/tpl/widget_detail_info.html b/modules/widget/tpl/widget_detail_info.html index eb1b25c94..d603a250d 100644 --- a/modules/widget/tpl/widget_detail_info.html +++ b/modules/widget/tpl/widget_detail_info.html @@ -1,5 +1,5 @@ - - + +

                        {$lang->widget}

                        diff --git a/modules/widget/tpl/widget_generate_code.html b/modules/widget/tpl/widget_generate_code.html index 76be5144c..d0beb0e99 100644 --- a/modules/widget/tpl/widget_generate_code.html +++ b/modules/widget/tpl/widget_generate_code.html @@ -1,5 +1,5 @@ - +

                        {$widget_info->title}

                        {$widget_info->description}

                        diff --git a/modules/widget/tpl/widget_generate_code.include.html b/modules/widget/tpl/widget_generate_code.include.html index dcbab5f74..493623057 100644 --- a/modules/widget/tpl/widget_generate_code.include.html +++ b/modules/widget/tpl/widget_generate_code.include.html @@ -1,5 +1,5 @@ - - + +
                          diff --git a/modules/widget/tpl/widget_generate_code_in_page.html b/modules/widget/tpl/widget_generate_code_in_page.html index 13f9aa11f..0be5e5721 100644 --- a/modules/widget/tpl/widget_generate_code_in_page.html +++ b/modules/widget/tpl/widget_generate_code_in_page.html @@ -1,7 +1,7 @@ - - - - + + + + - - + +

                          {$XE_VALIDATOR_MESSAGE}

                          -
                          - -
                          {$lang->cmd_login}
                          - - +

                          {$lang->cmd_login}

                          + - - - - -
                          - - - -
                          - -
                          {$lang->openid}
                          - -
                          - - - - - - -
                          {$lang->about_openid}
                          - -
                          - - - +
                            +
                          • +

                            +

                            +
                          • +
                          • +

                            +

                            +
                          • +
                          +

                          + + +

                          +
                          +

                          {$lang->about_keep_warning}

                          +
                          + + + + diff --git a/modules/member/skins/default/logout.html b/modules/member/skins/default/logout.html index 1c61f37fc..27e969a20 100644 --- a/modules/member/skins/default/logout.html +++ b/modules/member/skins/default/logout.html @@ -1,22 +1,9 @@ - - - -
                          - - -

                          {$lang->cmd_logout}

                          - -
                        {$val->version} From 3301e40cf571c784daad15bf6292adc58399fb73 Mon Sep 17 00:00:00 2001 From: ovclas Date: Thu, 15 Sep 2011 06:28:48 +0000 Subject: [PATCH 0697/1372] issue 160 admin setup bug fix. when menu add, can't read module list. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9152 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/menu/menu.admin.controller.php | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/modules/menu/menu.admin.controller.php b/modules/menu/menu.admin.controller.php index 7a1b35b57..2b69cef66 100644 --- a/modules/menu/menu.admin.controller.php +++ b/modules/menu/menu.admin.controller.php @@ -477,13 +477,9 @@ $menuList = array(); foreach($installed_module_list AS $key=>$value) { - $cache_file = sprintf("./files/cache/module_info/%s.%s.php", $value->module, $currentLang); - if(is_readable($cache_file)) - { - include $cache_file; - if($info->menu) $menuList[$value->module] = $info->menu; - unset($info->menu); - } + $info = $oModuleModel->getModuleActionXml($value->module); + if($info->menu) $menuList[$value->module] = $info->menu; + unset($info->menu); } } $this->add('menuList', $menuList); From 562b227f74907f5e136e4821c65cf185509a3854 Mon Sep 17 00:00:00 2001 From: flyskyko Date: Thu, 15 Sep 2011 06:30:56 +0000 Subject: [PATCH 0698/1372] issue 160, added toggle checkbox on addon setup git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9153 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/addon/tpl/setup_addon.html | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/modules/addon/tpl/setup_addon.html b/modules/addon/tpl/setup_addon.html index 73f166e4d..88780ab9b 100644 --- a/modules/addon/tpl/setup_addon.html +++ b/modules/addon/tpl/setup_addon.html @@ -48,6 +48,7 @@

                        {$lang->module}

                        {$lang->about_addon_mid}

                        +

                        {$modules->title} {$lang->none_category} @@ -61,4 +62,16 @@ - \ No newline at end of file + + \ No newline at end of file From ea20e214bac9ac7b00a2757e20f94b64d9e167a7 Mon Sep 17 00:00:00 2001 From: ovclas Date: Thu, 15 Sep 2011 07:57:00 +0000 Subject: [PATCH 0699/1372] issue 160 admin setup bug fix git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9154 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/admin.admin.view.php | 1 + modules/admin/tpl/admin_setup.html | 11 ++++++++--- modules/admin/tpl/js/menu_setup.js | 4 ++-- modules/menu/menu.admin.controller.php | 4 ++-- modules/menu/tpl/js/sitemap.js | 1 - 5 files changed, 13 insertions(+), 8 deletions(-) diff --git a/modules/admin/admin.admin.view.php b/modules/admin/admin.admin.view.php index 17a0a2c09..fd39048ed 100644 --- a/modules/admin/admin.admin.view.php +++ b/modules/admin/admin.admin.view.php @@ -403,6 +403,7 @@ $output = $oMenuAdminModel->getMenuByTitle('__XE_ADMIN__'); Context::set('menu_srl', $output->menu_srl); + Context::set('menu_title', $output->title); Context::set('config_object', $configObject); $this->setTemplateFile('admin_setup'); } diff --git a/modules/admin/tpl/admin_setup.html b/modules/admin/tpl/admin_setup.html index 9bab6691c..43653e308 100644 --- a/modules/admin/tpl/admin_setup.html +++ b/modules/admin/tpl/admin_setup.html @@ -32,6 +32,7 @@
                        +
                        @@ -39,11 +40,15 @@
                        diff --git a/modules/admin/tpl/js/menu_setup.js b/modules/admin/tpl/js/menu_setup.js index 26fef91e6..5b343e6c2 100644 --- a/modules/admin/tpl/js/menu_setup.js +++ b/modules/admin/tpl/js/menu_setup.js @@ -5,7 +5,7 @@ jQuery(function($){ var listForm = $('#listForm'); $('a._add').click(function(){ - parentSrl = $(this).parent().prevAll('._parent_key').val(); + parentSrl = $(this).parent().prevAll('._item_key').val(); editForm.find('input[name=parent_srl]').val(parentSrl); if(!menuList) { @@ -40,7 +40,7 @@ jQuery(function($){ }); $('a._child_delete').click(function() { - var menu_item_srl = $(this).parents('li').find('._child_key').val(); + var menu_item_srl = $(this).parents('li').find('._item_key').val(); listForm.find('input[name=menu_item_srl]').val(menu_item_srl); listForm.submit(); }); diff --git a/modules/menu/menu.admin.controller.php b/modules/menu/menu.admin.controller.php index 2b69cef66..d89b77a13 100644 --- a/modules/menu/menu.admin.controller.php +++ b/modules/menu/menu.admin.controller.php @@ -504,8 +504,8 @@ $groupSrlList = $oMemberModel->getMemberGroups($logged_info->member_srl); //preg_match('/\{\$lang->menu_gnb\[(.*?)\]\}/i', $parentMenuInfo->name, $m); - $cache_file = sprintf("./files/cache/module_info/%s.%s.php", $moduleName, Context::getLangType()); - include $cache_file; + $oModuleModel = &getModel('module'); + $info = $oModuleModel->getModuleInfoXml($moduleName); $args->menu_item_srl = (!$requestArgs->menu_item_srl) ? getNextSequence() : $requestArgs->menu_item_srl; $args->parent_srl = $requestArgs->parent_srl; diff --git a/modules/menu/tpl/js/sitemap.js b/modules/menu/tpl/js/sitemap.js index a1e1f4176..bbb70bbd0 100644 --- a/modules/menu/tpl/js/sitemap.js +++ b/modules/menu/tpl/js/sitemap.js @@ -38,7 +38,6 @@ $('form.siteMap') function completeGetActList(obj) { var menuItem = obj.menu_item; - console.log(menuItem); menuUrl = menuItem.url; editForm.find('.h2').html('Edit Menu'); editForm.find('input[name=menu_srl]').val(menuItem.menu_srl); From 11ef7170173d560c49fbfb02012526e537fac7ff Mon Sep 17 00:00:00 2001 From: taggon Date: Thu, 15 Sep 2011 08:11:47 +0000 Subject: [PATCH 0700/1372] Optimize dropdown global naviagtion script git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9155 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/admin.admin.view.php | 74 +++++++++++------------- modules/admin/tpl/_spHeader.html | 18 ++---- modules/admin/tpl/css/admin.css | 5 +- modules/admin/tpl/js/admin.js | 92 ++++++++++++++++-------------- 4 files changed, 89 insertions(+), 100 deletions(-) diff --git a/modules/admin/admin.admin.view.php b/modules/admin/admin.admin.view.php index fd39048ed..84bcc1253 100644 --- a/modules/admin/admin.admin.view.php +++ b/modules/admin/admin.admin.view.php @@ -103,66 +103,60 @@ function makeGnbUrl($module = 'admin') { global $lang; - $oAdminAdminModel = &getAdminModel('admin'); + + $oAdminAdminModel = &getAdminModel('admin'); $lang->menu_gnb_sub = $oAdminAdminModel->getAdminMenuLang(); $oMenuAdminModel = &getAdminModel('menu'); $menu_info = $oMenuAdminModel->getMenuByTitle('__XE_ADMIN__'); - if(is_readable($menu_info->php_file)) - include $menu_info->php_file; - else { - return; - } + if(!is_readable($menu_info->php_file)) return; + + include $menu_info->php_file; $oModuleModel = &getModel('module'); $moduleActionInfo = $oModuleModel->getModuleActionXml($module); - if(is_object($moduleActionInfo->menu)) + + $currentAct = Context::get('act'); + $subMenuTitle = ''; + foreach((array)$moduleActionInfo->menu as $key=>$value) { - $subMenuTitle = ''; - foreach($moduleActionInfo->menu AS $key=>$value) + if(isset($value->acts) && is_array($value->acts) && in_array($currentAct, $value->acts)) { - if($value->acts && in_array(Context::get('act'), $value->acts)) + $subMenuTitle = $value->title; + break; + } + } + + $parentSrl = 0; + foreach((array)$menu->list as $parentKey=>$parentMenu) + { + if(!is_array($parentMenu['list']) || !count($parentMenu['list'])) continue; + if($parentMenu['href'] == '#' && count($parentMenu['list'])) { + $firstChild = current($parentMenu['list']); + $menu->list[$parentKey]['href'] = $firstChild['href']; + } + + foreach($parentMenu['list'] as $childKey=>$childMenu) + { + if($subMenuTitle == $childMenu['text']) { - $subMenuTitle = $value->title; + $parentSrl = $childMenu['parent_srl']; break; } } } - $parentSrl = 0; - if(is_array($menu->list)) - { - foreach($menu->list AS $key=>$value) - { - $parentMenu = $value; - if(is_array($parentMenu['list']) && count($parentMenu['list']) > 0) - { - foreach($parentMenu['list'] AS $key2=>$value2) - { - $childMenu = $value2; - if($subMenuTitle == $childMenu['text']) - { - $parentSrl = $childMenu['parent_srl']; - break; - } - } - } - } - } - // Admin logo, title setup - $configObject = $oModuleModel->getModuleConfig('admin'); - $gnbTitleInfo->adminTitle = $configObject->adminTitle?$configObject->adminTitle:'XE Admin'; - $gnbTitleInfo->adminLogo = $configObject->adminLogo?$configObject->adminLogo:'modules/admin/tpl/img/xe.h1.png'; + $objConfig = $oModuleModel->getModuleConfig('admin'); + $gnbTitleInfo->adminTitle = $configObject->adminTitle ? $objConfig->adminTitle:'XE Admin'; + $gnbTitleInfo->adminLogo = $configObject->adminLogo ? $objConfig->adminLogo:'modules/admin/tpl/img/xe.h1.png'; - $browserTitle = 'Dashboard'; - if($subMenuTitle) $browserTitle = $subMenuTitle; - $browserTitle .= ' - '.$gnbTitleInfo->adminTitle; + $browserTitle = ($subMenuTitle ? $subMenuTitle : 'Dashboard').' - '.$gnbTitleInfo->adminTitle; Context::set('subMenuTitle', $subMenuTitle); - Context::set('gnbUrlList', $menu->list); - Context::set('parentSrl', $parentSrl); + Context::set('gnbUrlList', $menu->list); + Context::set('parentSrl', $parentSrl); Context::set('gnb_title_info', $gnbTitleInfo); Context::setBrowserTitle($browserTitle); } diff --git a/modules/admin/tpl/_spHeader.html b/modules/admin/tpl/_spHeader.html index f0b4083fc..14beb1a30 100644 --- a/modules/admin/tpl/_spHeader.html +++ b/modules/admin/tpl/_spHeader.html @@ -6,28 +6,20 @@
                        diff --git a/modules/admin/tpl/css/admin.css b/modules/admin/tpl/css/admin.css index d5bcaa69b..01f28ec5c 100644 --- a/modules/admin/tpl/css/admin.css +++ b/modules/admin/tpl/css/admin.css @@ -108,7 +108,7 @@ header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{di /* Global Navigation Bar */ .x .gnb{position:relative;clear:both;border:1px solid #c1c1c1;border-left:0;border-right:0;background-color:#efefef;background:#efefef -webkit-gradient(linear, 0% 0%, 0% 100%, from(#efefef), to(#dcdcdc));background:#efefef -moz-linear-gradient(top, #efefef, #dcdcdc);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#efefef, endColorStr=#dcdcdc);zoom:1} .x .gnb ul{margin:0;padding:0 0 0 2em;list-style:none;border:1px solid #fff;border-left:0;border-right:0;zoom:1} -.x .gnb ul ul{position:absolute;top:30px;left:0;border:1px solid #ccc;padding:0;background:#fff} +.x .gnb ul ul{position:absolute;top:30px;left:-2px;border:1px solid #ccc;padding:0;background:#fff;min-width:80px} .x .gnb ul:after{content:"";display:block;clear:both} .x .gnb li{position:relative;float:left;border:1px solid #fff;border-top:0;border-bottom:0;margin:0 -1px 0 0} .x .gnb li li{float:none;clear:both;overflow:hidden;border:0;border-top:1px dotted #ccc;margin:0;padding:2px} @@ -117,8 +117,7 @@ header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{di .x .gnb li a:hover, .x .gnb li a:active, .x .gnb li a:focus, -.x .gnb li.active a, -.x .gnb li.activeOn a{background:#fff;border:1px solid #ddd;padding:7px 17px} +.x .gnb li.active a{background:#fff} .x .gnb li li a{display:block;float:none;color:#555;padding:5px 15px !important;font-weight:normal !important;border:0 !important} .x .gnb li li a:hover, .x .gnb li li a:active, diff --git a/modules/admin/tpl/js/admin.js b/modules/admin/tpl/js/admin.js index 14fbcab02..d383610e8 100644 --- a/modules/admin/tpl/js/admin.js +++ b/modules/admin/tpl/js/admin.js @@ -53,50 +53,6 @@ jQuery(function($){ .trigger('update.checkbox', [name, this.checked]); }); - // Global Navigation Bar - var $menuitems = $('div.gnb') - .removeClass('jx') - .attr('role', 'navigation') // WAI-ARIA role - .find('li') - .attr('role', 'menuitem') // WAI-ARIA role - .filter(':has(>ul)') - .attr('aria-haspopup', 'true') // WAI-ARIA - .find('>ul').hide().end() - .mouseover(function(){ - var $this = $(this); - if($this.css('float') == 'left') $this.find('>ul:hidden').prev('a').click(); - }) - .mouseleave(function(){ - var $this = $(this); - if($this.css('float') == 'left') $this.find('>ul:visible').slideUp(100); - }) - .find('>a') - .focus(function(){ $(this).click() }) - .click(function(){ - $menuitems.removeClass('active'); - - $(this) - .next('ul').slideToggle(100).end() - .parent().addClass('active'); - - return false; - }) - .end() - .end() - .find('>a') - .blur(function(){ - var anchor = this; - setTimeout(function(){ - var $a = $(anchor), $ul = $a.closest('ul'), $focus = $ul.find('a:focus'); - - if(!$focus.length || $focus.closest('ul').parent('div.gnb').length) { - if($ul.parent('div.gnb').length) $ul = $a.next('ul'); - $ul.filter(':visible').slideUp(100); - } - }, 10); - }) - .end() - // pagination $.fn.xePagination = function(){ this @@ -180,6 +136,54 @@ jQuery(function($){ $('.masked').xeMask(); }); +// Global Navigation Bar +jQuery(function($){ + +$.fn.xeMenu = function(){ + this + .removeClass('jx') + .attr('role', 'navigation') // WAI-ARIA role + .find('li') + .attr('role', 'menuitem') // WAI-ARIA role + .find('>ul').hide().end() + .filter(':has(>ul)') + .attr('aria-haspopup', 'true') // WAI-ARIA + .end() + .end() + .delegate('li', { + mouseover : function(){ + $(this) + .addClass('active') + .find('>ul').show().end() + .parentsUntil('.gnb') + .filter('li').addClass('active').end() + .end() + }, + mouseleave : function(){ + $(this) + .removeClass('active') + .find('>ul').hide(); + }, + focusout : function(){ + var $this = $(this); + setTimeout(function(){ + if(!$this.find(':focus').length) { + $this.removeClass('active').find('>ul').hide(); + } + }, 1); + } + }) + .delegate('a', { + focus : function(){ + $(this).parent('li').mouseover(); + } + }); +}; + +$('div.gnb').xeMenu(); + +}); + // Modal Window jQuery(function($){ From bc1d68028b7f18ccc3f252b68cfefe9ae0ab03ee Mon Sep 17 00:00:00 2001 From: taggon Date: Thu, 15 Sep 2011 08:29:10 +0000 Subject: [PATCH 0701/1372] Lang-editor layer always be before the toggle link git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9156 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/tpl/js/admin.js | 2 +- modules/member/tpl/js/member_admin_group.js | 5 ----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/modules/admin/tpl/js/admin.js b/modules/admin/tpl/js/admin.js index d383610e8..7dfdae1f4 100644 --- a/modules/admin/tpl/js/admin.js +++ b/modules/admin/tpl/js/admin.js @@ -816,7 +816,7 @@ $('.multiLangEdit') var $this, $layer, $mle, $vlang, key, text, api, params; $this = $(this); - $layer = $($this.attr('href')); + $layer = $($this.attr('href')).insertBefore($this); $mle = $this.closest('.multiLangEdit'); $vlang = $mle.find('input.vLang,textarea.vLang'); diff --git a/modules/member/tpl/js/member_admin_group.js b/modules/member/tpl/js/member_admin_group.js index 36ca68a84..8068e6a34 100644 --- a/modules/member/tpl/js/member_admin_group.js +++ b/modules/member/tpl/js/member_admin_group.js @@ -72,11 +72,6 @@ jQuery(function ($){ return false; }); - $('a.tgAnchor.editUserLang').bind('before-open.tc', function(e){ - var $target = $(e.target).parent(); - $('#langEdit').insertBefore($target); - }); - $('.filebox').bind('filebox.selected', function (e, src){ var $targetImage = $(this).parent().find('img'); var $imageMarkHidden = $(this).parent().find('._imgMarkHidden'); From 4c2a13d0ae67a94f2d49b3781553759b25cfae2a Mon Sep 17 00:00:00 2001 From: taggon Date: Thu, 15 Sep 2011 08:36:58 +0000 Subject: [PATCH 0702/1372] Now, multilang editor supports textareas git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9157 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/tpl/js/admin.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/admin/tpl/js/admin.js b/modules/admin/tpl/js/admin.js index 7dfdae1f4..b7c0ca1d8 100644 --- a/modules/admin/tpl/js/admin.js +++ b/modules/admin/tpl/js/admin.js @@ -828,7 +828,7 @@ $('.multiLangEdit') // reset $layer.trigger('multilang-reset').removeClass('showChild').find('.langList').empty().end(); - $('#langInput li.'+xe.current_lang+' > input').val(text).prev('label').css('visibility','hidden'); + $('#langInput li.'+xe.current_lang).find('>input:text,>textarea').val(text).prev('label').css('visibility','hidden'); // hide suggestion layer $suggest.trigger('hide'); @@ -916,7 +916,7 @@ function initLayer($layer) { .bind('multilang-reset', function(){ $layer .data('multilang-current-name', '') - .find('#langInput li > input').val(' ').prev('label').css('visibility','visible'); + .find('#langInput li').find('>input:text,>textarea').val(' ').prev('label').css('visibility','visible'); mode = MODE_SAVE; setTitleText(); @@ -949,7 +949,7 @@ function initLayer($layer) { for(var code in list) { if(!list.hasOwnProperty(code)) continue; - $controls.find('li.'+code).find('> input').data('multilang-value',list[code]).val(list[code]).prev('label').css('visibility','hidden'); + $controls.find('li.'+code).find('>input:text,>textarea').data('multilang-value',list[code]).val(list[code]).prev('label').css('visibility','hidden'); } value = get_value(); @@ -999,7 +999,7 @@ function initLayer($layer) { function use_lang() { $layer.hide().closest('.multiLangEdit').find('.vLang') .eq(0).val('$user_lang->'+name).end() - .eq(1).val($('#langInput li.'+xe.current_lang+' >input').val()).end(); + .eq(1).val($('#langInput li.'+xe.current_lang).find('>input:text,>textarea').val()).end(); }; function save_lang() { From c68838cb98030224aeb117dea346288492f9ded9 Mon Sep 17 00:00:00 2001 From: devjin Date: Thu, 15 Sep 2011 08:41:19 +0000 Subject: [PATCH 0703/1372] fixed copy page module git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9158 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/document/document.admin.controller.php | 8 +++++--- modules/module/module.admin.controller.php | 11 +++++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/modules/document/document.admin.controller.php b/modules/document/document.admin.controller.php index 280ae8079..76590be7c 100644 --- a/modules/document/document.admin.controller.php +++ b/modules/document/document.admin.controller.php @@ -289,9 +289,11 @@ $document_list = $oDocumentModel->getDocumentList($args); $documents = $document_list->data; $output = executeQuery('document.deleteModuleDocument', $args); - foreach ($documents as $oDocument){ - $document_srl_list[] = $oDocument->document_srl; - } + if (is_array($documents)){ + foreach ($documents as $oDocument){ + $document_srl_list[] = $oDocument->document_srl; + } + } //remove from cache $oCacheHandler = &CacheHandler::getInstance('object'); if($oCacheHandler->isSupport()) diff --git a/modules/module/module.admin.controller.php b/modules/module/module.admin.controller.php index 15fbc8cb2..a7ce562c2 100644 --- a/modules/module/module.admin.controller.php +++ b/modules/module/module.admin.controller.php @@ -110,6 +110,15 @@ foreach($output->data as $key => $val) $grant[$val->name][] = $val->group_srl; } + // get Extra Vars + $extra_args->module_srl = $module_srl; + $extra_output = executeQueryArray('module.getModuleExtraVars', $extra_args); + if ($extra_output->toBool() && is_array($extra_output->data)){ + foreach($extra_output->data as $info){ + $extra_vars->{$info->name} = $info->value; + } + } + $oDB = &DB::getInstance(); $oDB->begin(); @@ -127,6 +136,8 @@ $module_srl = $output->get('module_srl'); // Grant module permissions if(count($grant)) $oModuleController->insertModuleGrants($module_srl, $grant); + if ($extra_vars) $oModuleController->insertModuleExtraVars($module_srl, $extra_vars); + } $oDB->commit(); From 0d530d08e05feb5df8b78d3f9db8d31351fd39e2 Mon Sep 17 00:00:00 2001 From: taggon Date: Thu, 15 Sep 2011 08:42:01 +0000 Subject: [PATCH 0704/1372] Auto hiding windows which include 'modal' in its class name git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9159 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/tpl/js/admin.js | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/admin/tpl/js/admin.js b/modules/admin/tpl/js/admin.js index b7c0ca1d8..0712f15b1 100644 --- a/modules/admin/tpl/js/admin.js +++ b/modules/admin/tpl/js/admin.js @@ -291,6 +291,7 @@ $.fn.xeModalWindow = function(){ }); }; $('a.modalAnchor').xeModalWindow(); +$('div.modal').addClass('x').hide(); }); From c776afd76e80b834936a7e4f6dcb5575c62baa0d Mon Sep 17 00:00:00 2001 From: ovclas Date: Thu, 15 Sep 2011 08:44:06 +0000 Subject: [PATCH 0705/1372] issue 160 admin menu not allow delete git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9160 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/menu/lang/lang.xml | 4 ++++ modules/menu/menu.admin.controller.php | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/modules/menu/lang/lang.xml b/modules/menu/lang/lang.xml index 9b4babdb2..3efeaac44 100644 --- a/modules/menu/lang/lang.xml +++ b/modules/menu/lang/lang.xml @@ -385,6 +385,10 @@ + + + + diff --git a/modules/menu/menu.admin.controller.php b/modules/menu/menu.admin.controller.php index d89b77a13..6bd4ca930 100644 --- a/modules/menu/menu.admin.controller.php +++ b/modules/menu/menu.admin.controller.php @@ -66,6 +66,13 @@ **/ function procMenuAdminDelete() { $menu_srl = Context::get('menu_srl'); + + $oMenuAdminModel = &getAdminModel('menu'); + $menu_info = $oMenuAdminModel->getMenu($menu_srl); + + if($menu_info->title == '__XE_ADMIN__') + return new Object(-1, 'msg_adminmenu_cannot_delete'); + $this->deleteMenu($menu_srl); $this->setMessage('success_deleted', 'info'); From db57e428ccc244f805a241c5247713981509f735 Mon Sep 17 00:00:00 2001 From: flyskyko Date: Thu, 15 Sep 2011 09:06:19 +0000 Subject: [PATCH 0706/1372] issue 160, added support multi language for widget git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9161 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/lang/lang.xml | 4 +++ modules/admin/lang/lang.xml | 4 --- modules/widget/tpl/widget_generate_code.html | 4 ++- .../tpl/widget_generate_code.include.html | 14 ++++++++-- .../tpl/widget_generate_code.multilang.html | 23 ++++++++++++++++ ...dget_generate_code.multilang.textarea.html | 27 +++++++++++++++++++ .../tpl/widget_generate_code_in_page.html | 3 ++- 7 files changed, 71 insertions(+), 8 deletions(-) create mode 100644 modules/widget/tpl/widget_generate_code.multilang.html create mode 100644 modules/widget/tpl/widget_generate_code.multilang.textarea.html diff --git a/common/lang/lang.xml b/common/lang/lang.xml index f1bb5d7d1..872ba182c 100644 --- a/common/lang/lang.xml +++ b/common/lang/lang.xml @@ -3761,6 +3761,10 @@ Xin vui lòng kiểm tra lại thông tin Database.]]> + + + + diff --git a/modules/admin/lang/lang.xml b/modules/admin/lang/lang.xml index f4aa52cff..f954f3c1c 100644 --- a/modules/admin/lang/lang.xml +++ b/modules/admin/lang/lang.xml @@ -977,8 +977,4 @@ Lütfen son sürümü için indirme linkine tıklayınız.]]> - - - - diff --git a/modules/widget/tpl/widget_generate_code.html b/modules/widget/tpl/widget_generate_code.html index a6cc1ce9d..76be5144c 100644 --- a/modules/widget/tpl/widget_generate_code.html +++ b/modules/widget/tpl/widget_generate_code.html @@ -20,4 +20,6 @@

                        {$lang->widget_code}

                        - \ No newline at end of file + + + \ No newline at end of file diff --git a/modules/widget/tpl/widget_generate_code.include.html b/modules/widget/tpl/widget_generate_code.include.html index 373f9770f..dd83eefc4 100644 --- a/modules/widget/tpl/widget_generate_code.include.html +++ b/modules/widget/tpl/widget_generate_code.include.html @@ -42,9 +42,19 @@

                      • - +
                        + {@$use_multilang = true} + + + {$lang->cmd_set_multilingual} +
                        - +
                        + {@$use_multilang_textarea = true} + + + {$lang->cmd_set_multilingual} +
                        diff --git a/modules/widget/tpl/widget_generate_code.multilang.html b/modules/widget/tpl/widget_generate_code.multilang.html new file mode 100644 index 000000000..8ee32a018 --- /dev/null +++ b/modules/widget/tpl/widget_generate_code.multilang.html @@ -0,0 +1,23 @@ + +
                        +
                          +
                          +

                          {$lang->multilingual} {$lang->cmd_modify} | {$lang->cmd_insert}

                          +
                            + {@ + /* move current language to the top */ + $a = array($lang_type=>$lang_supported[$lang_type]); + unset($lang_supported[$lang_type]); + $lang_supported = array_merge($a, $lang_supported); + } +
                          • +
                          + +
                          +
                          +
                          \ No newline at end of file diff --git a/modules/widget/tpl/widget_generate_code.multilang.textarea.html b/modules/widget/tpl/widget_generate_code.multilang.textarea.html new file mode 100644 index 000000000..266871726 --- /dev/null +++ b/modules/widget/tpl/widget_generate_code.multilang.textarea.html @@ -0,0 +1,27 @@ + + + +
                          +
                            +
                            +

                            {$lang->multilingual} {$lang->cmd_modify} | {$lang->cmd_insert}

                            +
                              + {@ + /* move current language to the top */ + $a = array($lang_type=>$lang_supported[$lang_type]); + unset($lang_supported[$lang_type]); + $lang_supported = array_merge($a, $lang_supported); + } +
                            • +
                            + +
                            +
                            +
                            \ No newline at end of file diff --git a/modules/widget/tpl/widget_generate_code_in_page.html b/modules/widget/tpl/widget_generate_code_in_page.html index c50280105..13f9aa11f 100644 --- a/modules/widget/tpl/widget_generate_code_in_page.html +++ b/modules/widget/tpl/widget_generate_code_in_page.html @@ -35,5 +35,6 @@ - + +
                            \ No newline at end of file From 85cc449e1d49f3b7277d96b7f5746fe805f73d4a Mon Sep 17 00:00:00 2001 From: taggon Date: Thu, 15 Sep 2011 09:41:23 +0000 Subject: [PATCH 0707/1372] Content layers aren't hidden while mouse is down on the scrollbar git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9162 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/tpl/js/admin.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/modules/admin/tpl/js/admin.js b/modules/admin/tpl/js/admin.js index 0712f15b1..41ea92260 100644 --- a/modules/admin/tpl/js/admin.js +++ b/modules/admin/tpl/js/admin.js @@ -361,10 +361,13 @@ $.fn.xeContentToggler = function(){ .unbind('mousedown.tc keydown.tc') .bind('mousedown.tc keydown.tc', function(event){ - if(event && ( - (event.type == 'keydown' && event.which != ESC) || - (event.type == 'mousedown' && ($(event.target).is('.tgAnchor,.tgContent') || $layer.has(event.target)[0])) - )) return true; + if(event) { + if(event.type == 'keydown' && event.which != ESC) return true; + if(event.type == 'mousedown') { + var $t = $(event.target); + if($t.is('html,.tgAnchor,.tgContent') || $layer.has($t).length) return true; + } + } $this.trigger('close.tc'); From d5626199b8ebd46d15dfb499d208d4a7da231d0c Mon Sep 17 00:00:00 2001 From: devjin Date: Thu, 15 Sep 2011 09:58:50 +0000 Subject: [PATCH 0708/1372] fixed add memeber in admin fixed remove site manager filter git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9163 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/member/member.admin.controller.php | 1 + modules/member/tpl/insert_member.html | 22 ++++++++++++++++++---- modules/member/tpl/member_list.html | 12 ++++++++---- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/modules/member/member.admin.controller.php b/modules/member/member.admin.controller.php index 4fa53c70e..38fb47161 100644 --- a/modules/member/member.admin.controller.php +++ b/modules/member/member.admin.controller.php @@ -64,6 +64,7 @@ $oMemberController = &getController('member'); // Execute insert or update depending on the value of member_srl if(!$args->member_srl) { + $args->password = Context::get('password'); $output = $oMemberController->insertMember($args); $msg_code = 'success_registed'; } else { diff --git a/modules/member/tpl/insert_member.html b/modules/member/tpl/insert_member.html index 6202588e7..44c1d9027 100644 --- a/modules/member/tpl/insert_member.html +++ b/modules/member/tpl/insert_member.html @@ -14,23 +14,37 @@ - -

                            {$lang->msg_update_member}

                            + + +

                            {$lang->msg_update_member}

                            +

                            {$lang->msg_new_member}

                              -
                            • +
                            • {$identifierForm->title} *

                            • -
                            • +
                            • +

                              {$identifierForm->title} *

                              +

                              + +

                              +
                            • +
                            • {$lang->password} *

                            • +
                            • +

                              {$lang->password} *

                              +

                              + +

                              +
                            • {$formTag->title}

                              {$formTag->inputTag}
                              diff --git a/modules/member/tpl/member_list.html b/modules/member/tpl/member_list.html index 4d3dd8bb7..e7f220f37 100644 --- a/modules/member/tpl/member_list.html +++ b/modules/member/tpl/member_list.html @@ -15,8 +15,6 @@ | {$lang->cmd_show_super_admin_member} | - {$lang->cmd_show_site_admin_member} - | {$lang->approval} | {$lang->denied} @@ -24,7 +22,10 @@ @@ -83,7 +84,10 @@
                              {$filter_type_title}({$total_count}) - {$lang->cmd_selected_user_manage}... + + {$lang->cmd_make} + {$lang->cmd_selected_user_manage}... +
                            • -
                            \ No newline at end of file + + From 8f16728df0f6d1d425e703ea2f92c200e0e6e60a Mon Sep 17 00:00:00 2001 From: lickawtl Date: Thu, 15 Sep 2011 10:02:33 +0000 Subject: [PATCH 0710/1372] fix some cache warnings git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9165 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/comment/comment.controller.php | 48 ++++++++++++++++-------- modules/document/document.controller.php | 36 ++++++++++++------ 2 files changed, 56 insertions(+), 28 deletions(-) diff --git a/modules/comment/comment.controller.php b/modules/comment/comment.controller.php index 06d74963a..7a4010b00 100644 --- a/modules/comment/comment.controller.php +++ b/modules/comment/comment.controller.php @@ -245,10 +245,14 @@ if($oCacheHandler->isSupport()) { $cache_object = $oCacheHandler->get('comment_list_document_pages'); - foreach ($cache_object as $object){ - $cache_key = $object; - $oCacheHandler->delete($cache_key); - } + if(isset($cache_object) && is_array($cache_object)){ + foreach ($cache_object as $object){ + $cache_key = $object; + $oCacheHandler->delete($cache_key); + } + }elseif(!is_array($cache_object)) { + $oCacheHandler->delete($cache_key); + } $oCacheHandler->delete('comment_list_document_pages'); } return $output; @@ -332,10 +336,14 @@ if($oCacheHandler->isSupport()) { $cache_object = $oCacheHandler->get('comment_list_document_pages'); - foreach ($cache_object as $object){ - $cache_key = $object; - $oCacheHandler->delete($cache_key); - } + if(isset($cache_object) && is_array($cache_object)){ + foreach ($cache_object as $object){ + $cache_key = $object; + $oCacheHandler->delete($cache_key); + } + }elseif(!is_array($cache_object)) { + $oCacheHandler->delete($cache_key); + } $oCacheHandler->delete('comment_list_document_pages'); } return $output; @@ -406,10 +414,14 @@ if($oCacheHandler->isSupport()) { $cache_object = $oCacheHandler->get('comment_list_document_pages'); - foreach ($cache_object as $object){ - $cache_key = $object; - $oCacheHandler->delete($cache_key); - } + if(isset($cache_object) && is_array($cache_object)){ + foreach ($cache_object as $object){ + $cache_key = $object; + $oCacheHandler->delete($cache_key); + } + }elseif(!is_array($cache_object)) { + $oCacheHandler->delete($cache_key); + } $oCacheHandler->delete('comment_list_document_pages'); } return $output; @@ -469,10 +481,14 @@ if($oCacheHandler->isSupport()) { $cache_object = $oCacheHandler->get('comment_list_document_pages'); - foreach ($cache_object as $object){ - $cache_key = $object; - $oCacheHandler->delete($cache_key); - } + if(isset($cache_object) && is_array($cache_object)){ + foreach ($cache_object as $object){ + $cache_key = $object; + $oCacheHandler->delete($cache_key); + } + }elseif(!is_array($cache_object)) { + $oCacheHandler->delete($cache_key); + } $oCacheHandler->delete('comment_list_document_pages'); } diff --git a/modules/document/document.controller.php b/modules/document/document.controller.php index b321c92b4..1516e910b 100644 --- a/modules/document/document.controller.php +++ b/modules/document/document.controller.php @@ -244,10 +244,14 @@ class documentController extends document { $cache_key = 'object:'.$obj->document_srl; $oCacheHandler->delete($cache_key); $cache_object = $oCacheHandler->get('module_list_documents'); - foreach ($cache_object as $object){ - $cache_key_object = $object; - $oCacheHandler->delete($cache_key_object); - } + if(isset($cache_object) && is_array($cache_object)){ + foreach ($cache_object as $object){ + $cache_key_object = $object; + $oCacheHandler->delete($cache_key_object); + } + }elseif(!is_array($cache_object)) { + $oCacheHandler->delete($cache_key_object); + } $oCacheHandler->delete('module_list_documents'); } @@ -411,10 +415,14 @@ class documentController extends document { $cache_key = 'object:'.$obj->document_srl; $oCacheHandler->delete($cache_key); $cache_object = $oCacheHandler->get('module_list_documents'); - foreach ($cache_object as $object){ - $cache_key_object = $object; - $oCacheHandler->delete($cache_key_object); - } + if(isset($cache_object) && is_array($cache_object)){ + foreach ($cache_object as $object){ + $cache_key_object = $object; + $oCacheHandler->delete($cache_key_object); + } + }elseif(!is_array($cache_object)) { + $oCacheHandler->delete($cache_key_object); + } $oCacheHandler->delete('module_list_documents'); //remove document item from cache $cache_key = 'object_document_item:'.$obj->document_srl; @@ -498,10 +506,14 @@ class documentController extends document { $cache_key = 'object:'.$document_srl; $oCacheHandler->delete($cache_key); $cache_object = $oCacheHandler->get('module_list_documents'); - foreach ($cache_object as $object){ - $cache_key_object = $object; - $oCacheHandler->delete($cache_key_object); - } + if(isset($cache_object) && is_array($cache_object)){ + foreach ($cache_object as $object){ + $cache_key_object = $object; + $oCacheHandler->delete($cache_key_object); + } + }elseif(!is_array($cache_object)) { + $oCacheHandler->delete($cache_key_object); + } $oCacheHandler->delete('module_list_documents'); $cache_key = 'object_document_item:'.$document_srl; $oCacheHandler->delete($cache_key); From 36190f952196c7079945bd9912a86c21b230d43e Mon Sep 17 00:00:00 2001 From: dragan-dan Date: Thu, 15 Sep 2011 13:29:12 +0000 Subject: [PATCH 0711/1372] bug fixed in cache getModuleInfoByMid git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9166 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/module/module.controller.php | 8 +++----- modules/module/module.model.php | 8 +++++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/modules/module/module.controller.php b/modules/module/module.controller.php index ccbfe37a9..a3503b8c2 100644 --- a/modules/module/module.controller.php +++ b/modules/module/module.controller.php @@ -364,9 +364,9 @@ //remove from cache $oCacheHandler = &CacheHandler::getInstance('object'); if($oCacheHandler->isSupport()){ - $cache_key = 'object:'.$args->module_srl; + $cache_key = 'object_module_info:'.$args->module_srl; $oCacheHandler->delete($cache_key); - $cache_key = 'object:'.$args->mid; + $cache_key = 'object:'.$args->mid.'_'.$args->site_srl; $oCacheHandler->delete($cache_key); } return $output; @@ -427,9 +427,7 @@ //remove from cache $oCacheHandler = &CacheHandler::getInstance('object'); if($oCacheHandler->isSupport()){ - $cache_key = 'object:'.$args->module_srl; - $oCacheHandler->delete($cache_key); - $cache_key = 'object:'.$args->mid; + $cache_key = 'object_module_info:'.$args->module_srl; $oCacheHandler->delete($cache_key); } return $output; diff --git a/modules/module/module.model.php b/modules/module/module.model.php index e9c83a706..52423f7e5 100644 --- a/modules/module/module.model.php +++ b/modules/module/module.model.php @@ -136,18 +136,20 @@ $args->site_srl = (int)$site_srl; $oCacheHandler = &CacheHandler::getInstance('object'); if($oCacheHandler->isSupport()){ - $cache_key = 'object:'.$mid; + $cache_key = 'object:'.$mid.'_'.$site_srl; $module_srl = $oCacheHandler->get($cache_key); if($module_srl){ - $cache_key = 'object:'.$module_srl; + $cache_key = 'object_module_info:'.$module_srl; $output = $oCacheHandler->get($cache_key); } } if(!$output){ $output = executeQuery('module.getMidInfo', $args); if($oCacheHandler->isSupport()) { - $cache_key = 'object:'.$mid; + $cache_key = 'object:'.$mid.'_'.$site_srl; $oCacheHandler->put($cache_key,$output->data->module_srl); + $cache_key = 'object_module_info:'.$output->data->module_srl; + $oCacheHandler->put($cache_key,$output); } } From cb8e8cbccb0b91a698464fe41cb5a5049891abe1 Mon Sep 17 00:00:00 2001 From: ucorina Date: Thu, 15 Sep 2011 16:07:25 +0000 Subject: [PATCH 0712/1372] Bug fix for compatibility of db classes with php 4. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9167 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/context/Context.class.php | 2 +- classes/db/DBMysql.class.php | 18 +++++++++--------- classes/db/queryparts/limit/Limit.class.php | 4 +++- classes/xml/xmlquery/DBParser.class.php | 6 ++++-- 4 files changed, 17 insertions(+), 13 deletions(-) diff --git a/classes/context/Context.class.php b/classes/context/Context.class.php index 6fa786330..11053af9f 100644 --- a/classes/context/Context.class.php +++ b/classes/context/Context.class.php @@ -232,7 +232,7 @@ class Context { $slave_db = $db_info->master_db; $db_info->slave_db = array($slave_db); - + $self->setDBInfo($db_info); $oInstallController = &getController('install'); diff --git a/classes/db/DBMysql.class.php b/classes/db/DBMysql.class.php index 9f67e5337..8310ba071 100644 --- a/classes/db/DBMysql.class.php +++ b/classes/db/DBMysql.class.php @@ -37,7 +37,7 @@ * @brief constructor **/ function DBMysql() { - $this->_setDBInfo(); + $this->_setDBInfo(); $this->_connect(); } @@ -79,10 +79,8 @@ $this->setError(mysql_errno(), mysql_error()); return; } + return $result; - - // Set utf8 if a database is MySQL - $this->_query("set names 'utf8'"); } function _afterConnect($connection){ @@ -442,7 +440,8 @@ } function queryError($queryObject){ - if ($queryObject->getLimit() && $queryObject->getLimit()->isPageHandler()){ + $limit = $queryObject->getLimit(); + if ($limit && $limit->isPageHandler()){ $buff = new Object (); $buff->total_count = 0; $buff->total_page = 0; @@ -455,7 +454,8 @@ } function queryPageLimit($queryObject, $result, $connection){ - if ($queryObject->getLimit() && $queryObject->getLimit()->isPageHandler()) { + $limit = $queryObject->getLimit(); + if ($limit && $limit->isPageHandler()) { // Total count $count_query = sprintf('select count(*) as "count" %s %s', 'FROM ' . $queryObject->getFromString(), ($queryObject->getWhereString() === '' ? '' : ' WHERE '. $queryObject->getWhereString())); if ($queryObject->getGroupByString() != '') { @@ -467,11 +467,11 @@ $count_output = $this->_fetch($result_count); $total_count = (int)$count_output->count; - $list_count = $queryObject->getLimit()->list_count->getValue(); + $list_count = $limit->list_count->getValue(); if (!$list_count) $list_count = 20; - $page_count = $queryObject->getLimit()->page_count->getValue(); + $page_count = $limit->page_count->getValue(); if (!$page_count) $page_count = 10; - $page = $queryObject->getLimit()->page->getValue(); + $page = $limit->page->getValue(); if (!$page) $page = 1; // total pages diff --git a/classes/db/queryparts/limit/Limit.class.php b/classes/db/queryparts/limit/Limit.class.php index e5fa18a74..4cc372434 100644 --- a/classes/db/queryparts/limit/Limit.class.php +++ b/classes/db/queryparts/limit/Limit.class.php @@ -8,7 +8,9 @@ function Limit($list_count, $page= NULL, $page_count= NULL){ $this->list_count = $list_count; if ($page){ - $this->start = ($page-1)*$list_count->getValue(); + $list_count_value = $list_count->getValue(); + $page_value = $page->getValue(); + $this->start = ($page_value - 1) * $list_count_value; $this->page_count = $page_count; $this->page = $page; } diff --git a/classes/xml/xmlquery/DBParser.class.php b/classes/xml/xmlquery/DBParser.class.php index b58e7c028..54591f3a2 100644 --- a/classes/xml/xmlquery/DBParser.class.php +++ b/classes/xml/xmlquery/DBParser.class.php @@ -61,13 +61,15 @@ function parseExpression($column_name){ $functions = preg_split('/([\+\-\*\/\ ])/', $column_name, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY); - foreach($functions as &$function){ + foreach($functions as $k => $v){ + $function = &$functions[$k]; if(strlen($function)==1) continue; // skip delimiters $pos = strrpos("(", $function); $matches = preg_split('/([a-zA-Z0-9_*]+)/', $function, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY); $total_brackets = substr_count($function, "("); $brackets = 0; - foreach($matches as &$match){ + foreach($matches as $i => $j){ + $match = &$matches[$i]; if($match == '(') {$brackets++; continue;} if(strpos($match,')') !== false) continue; if(in_array($match, array(',', '.'))) continue; From ad9e45151e0b301c160144ed1a6825e3153ebf59 Mon Sep 17 00:00:00 2001 From: ovclas Date: Fri, 16 Sep 2011 01:07:12 +0000 Subject: [PATCH 0713/1372] issue 160 if lnb not exist, lnb hide git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9168 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/tpl/layout.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/admin/tpl/layout.html b/modules/admin/tpl/layout.html index fbee8b57f..d54564993 100644 --- a/modules/admin/tpl/layout.html +++ b/modules/admin/tpl/layout.html @@ -2,5 +2,7 @@
                            {$content}
                            + + From 1132139474edc6a6aaeee65c62caa901097572e8 Mon Sep 17 00:00:00 2001 From: taggon Date: Fri, 16 Sep 2011 01:29:34 +0000 Subject: [PATCH 0714/1372] Fixed a bug for sortable table git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9169 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/tpl/js/admin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/admin/tpl/js/admin.js b/modules/admin/tpl/js/admin.js index 41ea92260..e9a0d0422 100644 --- a/modules/admin/tpl/js/admin.js +++ b/modules/admin/tpl/js/admin.js @@ -581,7 +581,7 @@ $.fn.xeSortableTable = function(){ // get offsets of all list-item elements offsets = []; - $table.find('tbody>tr:not([target],.sticky)').each(function() { + $table.find('tbody>tr:not([target],.sticky,:hidden)').each(function() { var $this = $(this), o; o = getOffset(this, $table.get(0)); From 527f73b675e473d895d5f04be7d04d71c76e0065 Mon Sep 17 00:00:00 2001 From: taggon Date: Fri, 16 Sep 2011 01:34:32 +0000 Subject: [PATCH 0715/1372] Fixed a bug for calculating table row's height git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9170 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/tpl/js/admin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/admin/tpl/js/admin.js b/modules/admin/tpl/js/admin.js index e9a0d0422..653071422 100644 --- a/modules/admin/tpl/js/admin.js +++ b/modules/admin/tpl/js/admin.js @@ -585,7 +585,7 @@ $.fn.xeSortableTable = function(){ var $this = $(this), o; o = getOffset(this, $table.get(0)); - offsets.push({top:o.top, bottom:o.top+32, $item:$(this)}); + offsets.push({top:o.top, bottom:o.top+$this.height(), $item:$this}); }); $clone From 1daff9b0f06ab5bc795e7cc9c56f7e8cae5f17d1 Mon Sep 17 00:00:00 2001 From: devjin Date: Fri, 16 Sep 2011 01:45:43 +0000 Subject: [PATCH 0716/1372] fixed delete member error git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9171 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/member/lang/lang.xml | 3 +++ modules/member/member.admin.controller.php | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/modules/member/lang/lang.xml b/modules/member/lang/lang.xml index 58bfede26..9244a9496 100644 --- a/modules/member/lang/lang.xml +++ b/modules/member/lang/lang.xml @@ -2206,6 +2206,9 @@ Bạn có thể quản lý thành viên bằng cách tạo những nhóm mới, + + + diff --git a/modules/member/member.admin.controller.php b/modules/member/member.admin.controller.php index 38fb47161..612a4ee36 100644 --- a/modules/member/member.admin.controller.php +++ b/modules/member/member.admin.controller.php @@ -489,6 +489,12 @@ break; } case 'delete':{ + $oMemberController->memberInfo = null; + $output = $oMemberController->deleteMember($member_srl); + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } } } } From f24cab114ba23e10dbeb15d2262c60e50dba65cc Mon Sep 17 00:00:00 2001 From: ovclas Date: Fri, 16 Sep 2011 01:47:00 +0000 Subject: [PATCH 0717/1372] issue 160 when add sub menu in admin setup, url always dashboard. fixed git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9172 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/menu/menu.admin.controller.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/modules/menu/menu.admin.controller.php b/modules/menu/menu.admin.controller.php index 6bd4ca930..b2c6be044 100644 --- a/modules/menu/menu.admin.controller.php +++ b/modules/menu/menu.admin.controller.php @@ -512,13 +512,18 @@ //preg_match('/\{\$lang->menu_gnb\[(.*?)\]\}/i', $parentMenuInfo->name, $m); $oModuleModel = &getModel('module'); - $info = $oModuleModel->getModuleInfoXml($moduleName); + //$info = $oModuleModel->getModuleInfoXml($moduleName); + $info = $oModuleModel->getModuleActionXml($moduleName); + + $url = getNotEncodedUrl('', 'module', 'admin', 'act', $info->menu->{$menuName}->index); + if(empty($url)) $url = getNotEncodedUrl('', 'module', 'admin', 'act', $info->admin_index_act); + if(empty($url)) $url = getNotEncodedUrl('', 'module', 'admin'); $args->menu_item_srl = (!$requestArgs->menu_item_srl) ? getNextSequence() : $requestArgs->menu_item_srl; $args->parent_srl = $requestArgs->parent_srl; $args->menu_srl = $requestArgs->menu_srl; $args->name = sprintf('{$lang->menu_gnb_sub[\'%s\']}', $menuName); - $args->url = getNotEncodedUrl('', 'module', 'admin', 'act', $info->menu->{$menuName}->index); + $args->url = $url; $args->open_window = 'N'; $args->expand = 'N'; $args->normal_btn = ''; From 57b557caacebfbac20231811d59ad32c4023d739 Mon Sep 17 00:00:00 2001 From: taggon Date: Fri, 16 Sep 2011 01:53:32 +0000 Subject: [PATCH 0718/1372] Fixed a bug for language text suggestion git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9173 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/module/module.admin.model.php | 17 ----------------- modules/module/module.model.php | 2 +- 2 files changed, 1 insertion(+), 18 deletions(-) diff --git a/modules/module/module.admin.model.php b/modules/module/module.admin.model.php index 5d704dbc3..c364e9d5f 100644 --- a/modules/module/module.admin.model.php +++ b/modules/module/module.admin.model.php @@ -245,23 +245,6 @@ return $output; } - /** - * @brief Return current lang list - **/ - function getLangListByLangcodeForAutoComplete() - { - $requestVars = Context::getRequestVars(); - - $args->site_srl = (int)$requestVars->site_srl; - $args->page = 1; // /< Page - $args->list_count = 100; // /< the number of posts to display on a single page - $args->page_count = 5; // /< the number of pages that appear in the page navigation - $args->sort_index = 'name'; - $args->order_type = 'asc'; - $args->search_keyword = Context::get('search_keyword'); // /< keyword to search*/ - - return $this->getLangListByLangcode($args); - } function getModuleAdminIPCheck() { $db_info = Context::getDBInfo(); diff --git a/modules/module/module.model.php b/modules/module/module.model.php index 52423f7e5..029731d7b 100644 --- a/modules/module/module.model.php +++ b/modules/module/module.model.php @@ -1495,7 +1495,7 @@ $list = array(); if($output->toBool()){ - foreach($output->data as $code_info){ + foreach((array)$output->data as $code_info){ unset($codeInfo); $codeInfo = array('name'=>'$user_lang->'.$code_info->name, 'value'=>$code_info->value); $list[] = $codeInfo; From 7359dbcc5311aaea1e3c239ebcd3538f9da5029f Mon Sep 17 00:00:00 2001 From: chschy Date: Fri, 16 Sep 2011 01:54:03 +0000 Subject: [PATCH 0719/1372] issue 160 add sftp support git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9174 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/lang/lang.xml | 4 ++++ modules/admin/tpl/config.html | 9 ++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/modules/admin/lang/lang.xml b/modules/admin/lang/lang.xml index f954f3c1c..b50ede234 100644 --- a/modules/admin/lang/lang.xml +++ b/modules/admin/lang/lang.xml @@ -721,6 +721,10 @@ Lütfen son sürümü için indirme linkine tıklayınız.]]> + + + + diff --git a/modules/admin/tpl/config.html b/modules/admin/tpl/config.html index 0460e7e45..1a20ca594 100644 --- a/modules/admin/tpl/config.html +++ b/modules/admin/tpl/config.html @@ -114,6 +114,13 @@ jQuery(function($){ ftp_pasv != 'Y')-->checked="checked" />

                          • +
                          • +

                            +

                            + sftp == 'Y')-->checked="checked" /> + sftp != 'Y')-->checked="checked" /> +

                            +
                          • @@ -217,4 +224,4 @@ jQuery(function($){ - \ No newline at end of file + From 9f89030ddbb2587f1321dbbcec964125fe0ce422 Mon Sep 17 00:00:00 2001 From: devjin Date: Fri, 16 Sep 2011 02:03:44 +0000 Subject: [PATCH 0720/1372] fixed update member error git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9175 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/member/member.admin.view.php | 1 + modules/member/member.controller.php | 2 +- modules/member/skins/default/modify_info.html | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/member/member.admin.view.php b/modules/member/member.admin.view.php index 5f0e89d27..f316a89ee 100644 --- a/modules/member/member.admin.view.php +++ b/modules/member/member.admin.view.php @@ -169,6 +169,7 @@ $member_config = $oMemberModel->getMemberConfig(); global $lang; + if (!$member_config->identifier) $member_config->identifier = 'user_id'; $identifierForm->title = $lang->{$member_config->identifier}; $identifierForm->name = $member_config->identifier; $identifierForm->value = $memberInfo->{$member_config->identifier}; diff --git a/modules/member/member.controller.php b/modules/member/member.controller.php index 39948da97..3a6aa3a32 100644 --- a/modules/member/member.controller.php +++ b/modules/member/member.controller.php @@ -566,7 +566,7 @@ $getVars = array('find_account_answer','allow_mailing','allow_message'); if ($config->signupForm){ foreach($config->signupForm as $formInfo){ - if($formInfo->isDefaultForm && $formInfo->isUse || $formInfo->required || $formInfo->mustRequired){ + if($formInfo->isDefaultForm && ($formInfo->isUse || $formInfo->required || $formInfo->mustRequired)){ $getVars[] = $formInfo->name; } } diff --git a/modules/member/skins/default/modify_info.html b/modules/member/skins/default/modify_info.html index 3f3a16f75..ee8b4d7fd 100644 --- a/modules/member/skins/default/modify_info.html +++ b/modules/member/skins/default/modify_info.html @@ -93,14 +93,14 @@

                            @@ -59,6 +40,27 @@ jQuery(function($){ checked="checked" />

                          • +
                          • +

                            {$lang->about_start_module}

                            +

                            + + + {$lang->cmd_find}

                            + +

                            + +

                            +

                            + + +

                            +

                            +
                          • diff --git a/modules/admin/tpl/js/config.js b/modules/admin/tpl/js/config.js index be02dfaee..9c6cb261c 100644 --- a/modules/admin/tpl/js/config.js +++ b/modules/admin/tpl/js/config.js @@ -1,3 +1,33 @@ +jQuery(function($){ + $('#favicon').change(function(){ + var re_favicon = /favicon\.ico$/ + if(re_favicon.test($(this).val()) != true){ + alert('{$lang->msg_not_correct_iconname} favicon.ico {$lang->msg_possible_only_file}'); + return false; + } + }); + $('#mobicon').change(function(){ + var re_favicon = /mobicon\.png$/ + if(re_favicon.test($(this).val()) != true){ + alert('{$lang->msg_not_correct_iconname} mobicon.png {$lang->msg_possible_only_file}'); + return false; + } + }); + $('.tgContent ul').bind('click', function(){ + $('#sitefind_addBtn').css('display',''); + }); +}); + +function setStartModule(){ + var target_module = jQuery('.moduleIdList option:selected').text(); + var index_module_srl = jQuery('.moduleIdList').val(); + jQuery('#_target_module').val(target_module); + jQuery('#index_module_srl').val(index_module_srl); + jQuery('.moduleList,.moduleIdList, .site_keyword_search, #sitefind_addBtn').css('display','none'); +} +function viewSiteSearch(){ + jQuery(".site_keyword_search").css("display",""); +} function getFTPList(pwd) { var form = jQuery("#ftp_form").get(0); From 77a186161e84f7af1e8cb597b84df221ec6d2b47 Mon Sep 17 00:00:00 2001 From: dragan-dan Date: Fri, 16 Sep 2011 15:47:50 +0000 Subject: [PATCH 0729/1372] added to cache getDefaultMid git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9185 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/module/module.controller.php | 13 ++++ modules/module/module.model.php | 110 +++++++++++++++------------ 2 files changed, 73 insertions(+), 50 deletions(-) diff --git a/modules/module/module.controller.php b/modules/module/module.controller.php index a3503b8c2..85ec4bae1 100644 --- a/modules/module/module.controller.php +++ b/modules/module/module.controller.php @@ -248,6 +248,19 @@ } $output = executeQuery('module.updateSite', $args); + //clear cache for default mid + if($args->site_srl == 0) $vid=''; + else $vid=$args->domain; + $mid = $oModuleModel->getModuleInfoByModuleSrl($args->index_module_srl)->mid; + $oCacheHandler = &CacheHandler::getInstance('object'); + if($oCacheHandler->isSupport()){ + if($args->site_srl == 0){ + $cache_key = 'object_default_mid:_'; + $oCacheHandler->delete($cache_key); + } + $cache_key = 'object_default_mid:'.$vid.'_'.$mid; + $oCacheHandler->delete($cache_key); + } return $output; } diff --git a/modules/module/module.model.php b/modules/module/module.model.php index 029731d7b..1ff2f35bd 100644 --- a/modules/module/module.model.php +++ b/modules/module/module.model.php @@ -72,56 +72,66 @@ $request_url = preg_replace('/\/$/','',Context::getRequestUri()); $vid = Context::get('vid'); $mid = Context::get('mid'); - // Check a virtual site if the default URL is already set and is is defferent from a requested URL - if($default_url && $default_url != $request_url) { - $url_info = parse_url($request_url); - $hostname = $url_info['host']; - $path = preg_replace('/\/$/','',$url_info['path']); - $sites_args->domain = sprintf('%s%s%s', $hostname, $url_info['port']&&$url_info['port']!=80?':'.$url_info['port']:'',$path); - $output = executeQuery('module.getSiteInfoByDomain', $sites_args); - } - if(!$output || !$output->data) - { - if(!$vid) $vid = $mid; - if($vid) { - $vid_args->domain = $vid; - $output = executeQuery('module.getSiteInfoByDomain', $vid_args); - if($output->toBool() && $output->data) { - Context::set('vid', $output->data->domain, true); - if($mid==$output->data->domain) Context::set('mid',$output->data->mid,true); - } - } - } - // If it is not a virtual site, get a default site information - if(!$output->data) { - $args->site_srl = 0; - $output = executeQuery('module.getSiteInfo', $args); - // Update the related informaion if there is no default site info - if(!$output->data) { - // Create a table if sites table doesn't exist - $oDB = &DB::getInstance(); - if(!$oDB->isTableExists('sites')) $oDB->createTableByXmlFile(_XE_PATH_.'modules/module/schemas/sites.xml'); - if(!$oDB->isTableExists('sites')) return; - // Get mid, language - $mid_output = $oDB->executeQuery('module.getDefaultMidInfo', $args); - $db_info = Context::getDBInfo(); - $domain = Context::getDefaultUrl(); - $url_info = parse_url($domain); - $domain = $url_info['host'].( (!empty($url_info['port'])&&$url_info['port']!=80)?':'.$url_info['port']:'').$url_info['path']; - $site_args->site_srl = 0; - $site_args->index_module_srl = $mid_output->data->module_srl; - $site_args->domain = $domain; - $site_args->default_language = $db_info->lang_type; - - if($output->data && !$output->data->index_module_srl) { - $output = executeQuery('module.updateSite', $site_args); - } else { - $output = executeQuery('module.insertSite', $site_args); - if(!$output->toBool()) return $output; - } - $output = executeQuery('module.getSiteInfo', $args); - } - } + $oCacheHandler = &CacheHandler::getInstance('object'); + if($oCacheHandler->isSupport()){ + $cache_key = 'object_default_mid:'.$vid.'_'.$mid; + $output = $oCacheHandler->get($cache_key); + } + if(!$output){ + // Check a virtual site if the default URL is already set and is is defferent from a requested URL + if($default_url && $default_url != $request_url) { + $url_info = parse_url($request_url); + $hostname = $url_info['host']; + $path = preg_replace('/\/$/','',$url_info['path']); + $sites_args->domain = sprintf('%s%s%s', $hostname, $url_info['port']&&$url_info['port']!=80?':'.$url_info['port']:'',$path); + $output = executeQuery('module.getSiteInfoByDomain', $sites_args); + if($oCacheHandler->isSupport() && $output->data) $oCacheHandler->put($cache_key,$output); + } + if(!$output || !$output->data) + { + if(!$vid) $vid = $mid; + if($vid) { + $vid_args->domain = $vid; + $output = executeQuery('module.getSiteInfoByDomain', $vid_args); + if($output->toBool() && $output->data) { + Context::set('vid', $output->data->domain, true); + if($mid==$output->data->domain) Context::set('mid',$output->data->mid,true); + } + if($oCacheHandler->isSupport() && $output->data) $oCacheHandler->put($cache_key,$output); + } + } + // If it is not a virtual site, get a default site information + if(!$output->data) { + $args->site_srl = 0; + $output = executeQuery('module.getSiteInfo', $args); + // Update the related informaion if there is no default site info + if(!$output->data) { + // Create a table if sites table doesn't exist + $oDB = &DB::getInstance(); + if(!$oDB->isTableExists('sites')) $oDB->createTableByXmlFile(_XE_PATH_.'modules/module/schemas/sites.xml'); + if(!$oDB->isTableExists('sites')) return; + // Get mid, language + $mid_output = $oDB->executeQuery('module.getDefaultMidInfo', $args); + $db_info = Context::getDBInfo(); + $domain = Context::getDefaultUrl(); + $url_info = parse_url($domain); + $domain = $url_info['host'].( (!empty($url_info['port'])&&$url_info['port']!=80)?':'.$url_info['port']:'').$url_info['path']; + $site_args->site_srl = 0; + $site_args->index_module_srl = $mid_output->data->module_srl; + $site_args->domain = $domain; + $site_args->default_language = $db_info->lang_type; + + if($output->data && !$output->data->index_module_srl) { + $output = executeQuery('module.updateSite', $site_args); + } else { + $output = executeQuery('module.insertSite', $site_args); + if(!$output->toBool()) return $output; + } + $output = executeQuery('module.getSiteInfo', $args); + } + if($oCacheHandler->isSupport()) $oCacheHandler->put($cache_key,$output); + } + } $module_info = $output->data; if(!$module_info->module_srl) return $module_info; if(is_array($module_info) && $module_info->data[0]) $module_info = $module_info[0]; From c929a055c57f4fa27c06e17927f09c35cbd77018 Mon Sep 17 00:00:00 2001 From: dragan-dan Date: Fri, 16 Sep 2011 16:33:35 +0000 Subject: [PATCH 0730/1372] added to cache getNewestCommentList git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9186 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/comment/comment.controller.php | 20 ++++++++++++-------- modules/comment/comment.model.php | 14 +++++++++++--- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/modules/comment/comment.controller.php b/modules/comment/comment.controller.php index 7a4010b00..4aef6894f 100644 --- a/modules/comment/comment.controller.php +++ b/modules/comment/comment.controller.php @@ -244,16 +244,18 @@ $oCacheHandler = &CacheHandler::getInstance('object'); if($oCacheHandler->isSupport()) { + $cache_key_newest = 'object_newest_comment_list:'.$obj->module_srl; + $oCacheHandler->delete($cache_key_newest); $cache_object = $oCacheHandler->get('comment_list_document_pages'); if(isset($cache_object) && is_array($cache_object)){ - foreach ($cache_object as $object){ - $cache_key = $object; - $oCacheHandler->delete($cache_key); - } - }elseif(!is_array($cache_object)) { - $oCacheHandler->delete($cache_key); - } - $oCacheHandler->delete('comment_list_document_pages'); + foreach ($cache_object as $object){ + $cache_key = $object; + $oCacheHandler->delete($cache_key); + } + }elseif(!is_array($cache_object)) { + $oCacheHandler->delete($cache_key); + } + $oCacheHandler->delete('comment_list_document_pages'); } return $output; } @@ -335,6 +337,8 @@ $oCacheHandler = &CacheHandler::getInstance('object'); if($oCacheHandler->isSupport()) { + $cache_key_newest = 'object_newest_comment_list:'.$obj->module_srl; + $oCacheHandler->delete($cache_key_newest); $cache_object = $oCacheHandler->get('comment_list_document_pages'); if(isset($cache_object) && is_array($cache_object)){ foreach ($cache_object as $object){ diff --git a/modules/comment/comment.model.php b/modules/comment/comment.model.php index e3f03333b..7878ff1be 100644 --- a/modules/comment/comment.model.php +++ b/modules/comment/comment.model.php @@ -186,10 +186,18 @@ if(is_array($obj->module_srl)) $args->module_srl = implode(',', $obj->module_srl); else $args->module_srl = $obj->module_srl; $args->list_count = $obj->list_count; - - $output = executeQuery('comment.getNewestCommentList', $args, $columnList); + // cache controll + $oCacheHandler = &CacheHandler::getInstance('object'); + if($oCacheHandler->isSupport()){ + $cache_key = 'object_newest_comment_list:'.$obj->module_srl; + $output = $oCacheHandler->get($cache_key); + } + if(!$output){ + $output = executeQuery('comment.getNewestCommentList', $args, $columnList); + if($oCacheHandler->isSupport()) $oCacheHandler->put($cache_key,$output); + } if(!$output->toBool()) return $output; - + $comment_list = $output->data; if($comment_list) { if(!is_array($comment_list)) $comment_list = array($comment_list); From eacdaed16f60a5abaa14935a8fa883a814b18ec5 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Mon, 19 Sep 2011 01:27:49 +0000 Subject: [PATCH 0731/1372] Waiting for server response CSS fixed. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9187 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/css/xe.css | 11 ++++++----- common/css/xe.min.css | 8 +++++++- modules/admin/tpl/css/admin.css | 16 ++++++++-------- modules/admin/tpl/css/admin.min.css | 16 ++++++++-------- 4 files changed, 29 insertions(+), 22 deletions(-) diff --git a/common/css/xe.css b/common/css/xe.css index a32139de8..ee260d286 100644 --- a/common/css/xe.css +++ b/common/css/xe.css @@ -1,7 +1,7 @@ @charset "utf-8"; /* NHN (developers@xpressengine.com) */ /* Popup Menu Area */ -#popup_menu_area{position:absolute;background:#fff;border:1px solid #e9e9e9;border-radius:5px;padding:10px;line-height:1.3;box-shadow:0 0 6px #666;-moz-box-shadow:0 0 6px #666;-webkit-box-shadow:0 0 6px #666;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} +#popup_menu_area{position:absolute;background:#fff;border:1px solid #e9e9e9;border-radius:5px;padding:10px;line-height:1.3;box-shadow:0 0 6px #666;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} #popup_menu_area ul{list-style:none;margin:0;padding:0} #popup_menu_area li{margin:0;padding:0} #popup_menu_area a{text-decoration:none;color:#333} @@ -9,7 +9,8 @@ #popup_menu_area a:avtive, #popup_menu_area a:focus{text-decoration:underline} /* Waiting for server response */ -.WFSR .bg{position:absolute;background:#000;_background:none;width:100%;height:100%;opacity:.5;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1} -.WFSR .fg{position:relative;width:50%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:10px solid #ddd;z-index:2;zoom:1} -.WFSR .fg p{padding:0 0 0 2.5em;background:url(../img/preLoader16.gif) no-repeat 1em .4em} -.WFSR .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1} +.wfsr{z-index:100;background:#FFC;position:absolute;position:fixed;top:0;left:0;text-align:center;border:3px solid #333;border-left:0;border-right:0;width:100%;padding:1em 0;box-shadow:0 0 6px #000;font-size:14px} +.wfsr .bg{position:absolute;background:#000;_background:none;width:100%;height:100%;opacity:.5;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1} +.wfsr .fg{position:relative;width:50%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:10px solid #ddd;z-index:2;zoom:1} +.wfsr .fg p{padding:0 0 0 2.5em;background:url(../img/preLoader16.gif) no-repeat 1em .4em} +.wfsr .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1} diff --git a/common/css/xe.min.css b/common/css/xe.min.css index ae76f6294..ee260d286 100644 --- a/common/css/xe.min.css +++ b/common/css/xe.min.css @@ -1,10 +1,16 @@ @charset "utf-8"; /* NHN (developers@xpressengine.com) */ /* Popup Menu Area */ -#popup_menu_area{position:absolute;background:#fff;border:1px solid #e9e9e9;border-radius:5px;padding:10px;line-height:1.3;box-shadow:0 0 6px #666;-moz-box-shadow:0 0 6px #666;-webkit-box-shadow:0 0 6px #666;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} +#popup_menu_area{position:absolute;background:#fff;border:1px solid #e9e9e9;border-radius:5px;padding:10px;line-height:1.3;box-shadow:0 0 6px #666;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} #popup_menu_area ul{list-style:none;margin:0;padding:0} #popup_menu_area li{margin:0;padding:0} #popup_menu_area a{text-decoration:none;color:#333} #popup_menu_area a:hover, #popup_menu_area a:avtive, #popup_menu_area a:focus{text-decoration:underline} +/* Waiting for server response */ +.wfsr{z-index:100;background:#FFC;position:absolute;position:fixed;top:0;left:0;text-align:center;border:3px solid #333;border-left:0;border-right:0;width:100%;padding:1em 0;box-shadow:0 0 6px #000;font-size:14px} +.wfsr .bg{position:absolute;background:#000;_background:none;width:100%;height:100%;opacity:.5;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1} +.wfsr .fg{position:relative;width:50%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:10px solid #ddd;z-index:2;zoom:1} +.wfsr .fg p{padding:0 0 0 2.5em;background:url(../img/preLoader16.gif) no-repeat 1em .4em} +.wfsr .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1} diff --git a/modules/admin/tpl/css/admin.css b/modules/admin/tpl/css/admin.css index 01f28ec5c..ef79be6a2 100644 --- a/modules/admin/tpl/css/admin.css +++ b/modules/admin/tpl/css/admin.css @@ -188,7 +188,7 @@ header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{di .x .pagination button{overflow:visible} /* Button */ .x .btn{position:relative;display:inline-block;margin:2px;vertical-align:top} -.x .btn *{display:inline-block;padding:0 8px;font-size:12px;height:24px;line-height:22px;margin:0;font-weight:bold !important;color:#fff;text-decoration:none !important;border:1px solid;cursor:pointer;overflow:visible;border-radius:3px;box-shadow:inset 0 0 1px #fff;-moz-box-shadow:inset 0 0 1px #fff;-webkit-box-shadow:inset 0 0 1px #fff;background-color:#666;text-shadow:0 -1px 0 #333;zoom:1} +.x .btn *{display:inline-block;padding:0 8px;font-size:12px;height:24px;line-height:22px;margin:0;font-weight:bold !important;color:#fff;text-decoration:none !important;border:1px solid;cursor:pointer;overflow:visible;border-radius:3px;box-shadow:inset 0 0 1px #fff;background-color:#666;text-shadow:0 -1px 0 #333;zoom:1} .x .btn *[type=submit][disabled=disabled], .x .btn *[type=button][disabled=disabled]{opacity:.5;*filter:alpha(opacity=50)} .x .btn a, @@ -226,7 +226,7 @@ header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{di /* Modal Window */ .modal{position:absolute;top:0;left:0;width:100%;_height:100%;min-height:100%;z-index:100} .modal .bg{position:absolute;background:#000;_background:none;width:100%;height:100%;opacity:.5;z-index:2;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1} -.modal .fg{position:relative;width:80%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:3;zoom:1;border-radius:5px;box-shadow:0 0 6px #000;-moz-box-shadow:0 0 6px #000;-webkit-box-shadow:0 0 6px #000} +.modal .fg{position:relative;width:80%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:3;zoom:1;border-radius:5px;box-shadow:0 0 6px #000} .modal ul, .modal ol, .modal .lined, @@ -237,7 +237,7 @@ header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{di html.modalContainer, body.modalContainer{_height:100%;_width:100%} /* IE6 only */ /* Layer */ -.x .layer{position:absolute;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:2;zoom:1;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5pxbox-shadow:0 0 6px #666;-moz-box-shadow:0 0 6px #666;-webkit-box-shadow:0 0 6px #666;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} +.x .layer{position:absolute;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:2;zoom:1;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5pxbox-shadow:0 0 6px #666;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} .x .layer h2{font-size:14px} .x .layer ul, .layer ol, .layer .lined, .layer .table{margin-bottom:1em} .x .layerClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px} @@ -263,7 +263,7 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */ .x .skipNav a:active, .x .skipNav a:focus{position:relative;width:auto;height:auto} /* Header */ -.x .header{position:relative;z-index:2;padding:30px 0 0 0;background:#4c4c4c;box-shadow:0 0 10px #aaa;-moz-box-shadow:0 0 10px #aaa;-webkit-box-shadow:0 0 10px #aaa;zoom:1} +.x .header{position:relative;z-index:2;padding:30px 0 0 0;background:#4c4c4c;box-shadow:0 0 10px #aaa;zoom:1} .x .header:after{content:"";display:block;clear:both} .x .header a{text-decoration:none} .x .header h1{margin:0 100px 10px 1.3em;font-size:24px;line-height:32px} @@ -275,7 +275,7 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */ .x .header #moveSiteList li{white-space:nowrap;margin:0;padding:4px 0;border-bottom:1px dotted #ccc} .x .header #siteMapList{padding:0 1em 1em 1em;margin:0} .x .header #siteMapList li{white-space:nowrap} -.x .header .account{position:absolute;z-index:3;width:100%;padding:5px 2em 5px 0;top:0;right:0;white-space:nowrap;text-align:right;background:#333;border-bottom:1px solid #656565;color:#fff;font-size:12px;box-shadow:0 0 10px #333;-moz-box-shadow:0 0 10px #333;-webkit-box-shadow:0 0 10px #333} +.x .header .account{position:absolute;z-index:3;width:100%;padding:5px 2em 5px 0;top:0;right:0;white-space:nowrap;text-align:right;background:#333;border-bottom:1px solid #656565;color:#fff;font-size:12px;box-shadow:0 0 10px #333} .x .header .account ul{margin:0 2px 0 0;padding:0;list-style:none} .x .header .account li{position:relative;display:inline;border-left:1px solid #666;padding:0 6px 0 10px} .x .header .account li:first-child{border:0} @@ -397,7 +397,7 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */ .x .langEdit p, .x .langEdit .btnArea{white-space:normal} .x .langEdit .langList, -.x .langEdit .langEditControls{box-shadow:3px 3px 6px #999;-moz-box-shadow:3px 3px 6px #999;-webkit-box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} +.x .langEdit .langEditControls{box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} .x .langEdit .langList{margin:0 -1px 0 0;display:none} .x .langEdit .langList li{white-space:nowrap;color:#ccc;width:270px} .x .langEdit .langList li span{display:inline-block;width:80px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:#767676} @@ -458,7 +458,7 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */ .modal .mLangEdit ul{padding-bottom:1em} .modal .mLangEdit li{border:0;padding-right:36px} /* Suggestion */ -.x .suggestion{display:none;position:absolute;background:#fff;z-index:10;_height:200px;max-height:200px;overflow:auto;*left:0;*margin-top:28px;box-shadow:3px 3px 6px #999;-moz-box-shadow:3px 3px 6px #999;-webkit-box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} +.x .suggestion{display:none;position:absolute;background:#fff;z-index:10;_height:200px;max-height:200px;overflow:auto;*left:0;*margin-top:28px;box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} .x .suggestion ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0} .x .suggestion li{padding:0} .x .suggestion li:last-child{border-bottom:0} @@ -480,7 +480,7 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */ /* Font Preview */ .x .fontPreview{width:96%;border:1px solid #e9e9e9;zoom:1;padding:1em 2em;margin:.5em 0} /* FTP Suggestion */ -.x #ftpSuggestion{background:#fff;box-shadow:3px 3px 6px #999;-moz-box-shadow:3px 3px 6px #999;-webkit-box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} +.x #ftpSuggestion{background:#fff;box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} .x #ftpSuggestion ul{border-left:1px solid #eee;border-right:1px solid #eee} .x #ftpSuggestion li{padding:0} .x #ftpSuggestion li button{border:0;background:#fff;text-align:left;width:288px} diff --git a/modules/admin/tpl/css/admin.min.css b/modules/admin/tpl/css/admin.min.css index d5bcaa69b..aa7b7b309 100644 --- a/modules/admin/tpl/css/admin.min.css +++ b/modules/admin/tpl/css/admin.min.css @@ -189,7 +189,7 @@ header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{di .x .pagination button{overflow:visible} /* Button */ .x .btn{position:relative;display:inline-block;margin:2px;vertical-align:top} -.x .btn *{display:inline-block;padding:0 8px;font-size:12px;height:24px;line-height:22px;margin:0;font-weight:bold !important;color:#fff;text-decoration:none !important;border:1px solid;cursor:pointer;overflow:visible;border-radius:3px;box-shadow:inset 0 0 1px #fff;-moz-box-shadow:inset 0 0 1px #fff;-webkit-box-shadow:inset 0 0 1px #fff;background-color:#666;text-shadow:0 -1px 0 #333;zoom:1} +.x .btn *{display:inline-block;padding:0 8px;font-size:12px;height:24px;line-height:22px;margin:0;font-weight:bold !important;color:#fff;text-decoration:none !important;border:1px solid;cursor:pointer;overflow:visible;border-radius:3px;box-shadow:inset 0 0 1px #fff;background-color:#666;text-shadow:0 -1px 0 #333;zoom:1} .x .btn *[type=submit][disabled=disabled], .x .btn *[type=button][disabled=disabled]{opacity:.5;*filter:alpha(opacity=50)} .x .btn a, @@ -227,7 +227,7 @@ header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{di /* Modal Window */ .modal{position:absolute;top:0;left:0;width:100%;_height:100%;min-height:100%;z-index:100} .modal .bg{position:absolute;background:#000;_background:none;width:100%;height:100%;opacity:.5;z-index:2;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1} -.modal .fg{position:relative;width:80%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:3;zoom:1;border-radius:5px;box-shadow:0 0 6px #000;-moz-box-shadow:0 0 6px #000;-webkit-box-shadow:0 0 6px #000} +.modal .fg{position:relative;width:80%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:3;zoom:1;border-radius:5px;box-shadow:0 0 6px #000} .modal ul, .modal ol, .modal .lined, @@ -238,7 +238,7 @@ header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{di html.modalContainer, body.modalContainer{_height:100%;_width:100%} /* IE6 only */ /* Layer */ -.x .layer{position:absolute;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:2;zoom:1;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5pxbox-shadow:0 0 6px #666;-moz-box-shadow:0 0 6px #666;-webkit-box-shadow:0 0 6px #666;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} +.x .layer{position:absolute;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:2;zoom:1;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5pxbox-shadow:0 0 6px #666;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} .x .layer h2{font-size:14px} .x .layer ul, .layer ol, .layer .lined, .layer .table{margin-bottom:1em} .x .layerClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px} @@ -264,7 +264,7 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */ .x .skipNav a:active, .x .skipNav a:focus{position:relative;width:auto;height:auto} /* Header */ -.x .header{position:relative;z-index:2;padding:30px 0 0 0;background:#4c4c4c;box-shadow:0 0 10px #aaa;-moz-box-shadow:0 0 10px #aaa;-webkit-box-shadow:0 0 10px #aaa;zoom:1} +.x .header{position:relative;z-index:2;padding:30px 0 0 0;background:#4c4c4c;box-shadow:0 0 10px #aaa;zoom:1} .x .header:after{content:"";display:block;clear:both} .x .header a{text-decoration:none} .x .header h1{margin:0 100px 10px 1.3em;font-size:24px;line-height:32px} @@ -276,7 +276,7 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */ .x .header #moveSiteList li{white-space:nowrap;margin:0;padding:4px 0;border-bottom:1px dotted #ccc} .x .header #siteMapList{padding:0 1em 1em 1em;margin:0} .x .header #siteMapList li{white-space:nowrap} -.x .header .account{position:absolute;z-index:3;width:100%;padding:5px 2em 5px 0;top:0;right:0;white-space:nowrap;text-align:right;background:#333;border-bottom:1px solid #656565;color:#fff;font-size:12px;box-shadow:0 0 10px #333;-moz-box-shadow:0 0 10px #333;-webkit-box-shadow:0 0 10px #333} +.x .header .account{position:absolute;z-index:3;width:100%;padding:5px 2em 5px 0;top:0;right:0;white-space:nowrap;text-align:right;background:#333;border-bottom:1px solid #656565;color:#fff;font-size:12px;box-shadow:0 0 10px #333} .x .header .account ul{margin:0 2px 0 0;padding:0;list-style:none} .x .header .account li{position:relative;display:inline;border-left:1px solid #666;padding:0 6px 0 10px} .x .header .account li:first-child{border:0} @@ -398,7 +398,7 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */ .x .langEdit p, .x .langEdit .btnArea{white-space:normal} .x .langEdit .langList, -.x .langEdit .langEditControls{box-shadow:3px 3px 6px #999;-moz-box-shadow:3px 3px 6px #999;-webkit-box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} +.x .langEdit .langEditControls{box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} .x .langEdit .langList{margin:0 -1px 0 0;display:none} .x .langEdit .langList li{white-space:nowrap;color:#ccc;width:270px} .x .langEdit .langList li span{display:inline-block;width:80px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:#767676} @@ -459,7 +459,7 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */ .modal .mLangEdit ul{padding-bottom:1em} .modal .mLangEdit li{border:0;padding-right:36px} /* Suggestion */ -.x .suggestion{display:none;position:absolute;background:#fff;z-index:10;_height:200px;max-height:200px;overflow:auto;*left:0;*margin-top:28px;box-shadow:3px 3px 6px #999;-moz-box-shadow:3px 3px 6px #999;-webkit-box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} +.x .suggestion{display:none;position:absolute;background:#fff;z-index:10;_height:200px;max-height:200px;overflow:auto;*left:0;*margin-top:28px;box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} .x .suggestion ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0} .x .suggestion li{padding:0} .x .suggestion li:last-child{border-bottom:0} @@ -481,7 +481,7 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */ /* Font Preview */ .x .fontPreview{width:96%;border:1px solid #e9e9e9;zoom:1;padding:1em 2em;margin:.5em 0} /* FTP Suggestion */ -.x #ftpSuggestion{background:#fff;box-shadow:3px 3px 6px #999;-moz-box-shadow:3px 3px 6px #999;-webkit-box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} +.x #ftpSuggestion{background:#fff;box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} .x #ftpSuggestion ul{border-left:1px solid #eee;border-right:1px solid #eee} .x #ftpSuggestion li{padding:0} .x #ftpSuggestion li button{border:0;background:#fff;text-align:left;width:288px} From e1dd4d6e3f9b3153b8c637f8210f724fb0288118 Mon Sep 17 00:00:00 2001 From: ovclas Date: Mon, 19 Sep 2011 01:32:00 +0000 Subject: [PATCH 0732/1372] issue 160 when admin menu add, menu group create. document count without temp status in dashbard git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9188 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/admin.admin.view.php | 5 +++-- modules/admin/tpl/js/menu_setup.js | 7 +++++-- modules/document/document.admin.model.php | 3 ++- modules/document/queries/getDocumentCountByDate.xml | 1 + 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/modules/admin/admin.admin.view.php b/modules/admin/admin.admin.view.php index 45bf46506..33aaed536 100644 --- a/modules/admin/admin.admin.view.php +++ b/modules/admin/admin.admin.view.php @@ -230,8 +230,9 @@ // Document Status $oDocumentAdminModel = &getAdminModel('document'); - $status->document->todayCount = $oDocumentAdminModel->getDocumentCountByDate($today); - $status->document->totalCount = $oDocumentAdminModel->getDocumentCountByDate(); + $statusList = array('PUBLIC', 'SECRET'); + $status->document->todayCount = $oDocumentAdminModel->getDocumentCountByDate($today, array(), $statusList); + $status->document->totalCount = $oDocumentAdminModel->getDocumentCountByDate('', array(), $statusList); // Comment Status $oCommentModel = &getModel('comment'); diff --git a/modules/admin/tpl/js/menu_setup.js b/modules/admin/tpl/js/menu_setup.js index 5b343e6c2..8a4166a11 100644 --- a/modules/admin/tpl/js/menu_setup.js +++ b/modules/admin/tpl/js/menu_setup.js @@ -17,17 +17,20 @@ jQuery(function($){ function completeGetActList(obj) { + var $optgroup; + moduleList = obj.menuList; + console.log(moduleList); if(moduleList) { var menuNameList = $('#menuNameList'); for(var x in moduleList) { var menuList = moduleList[x]; + $optgroup = $('').appendTo(menuNameList); for(var y in menuList) { - var menu = menuList[y]; - menuNameList.append(''); + $optgroup.append(''); } } } diff --git a/modules/document/document.admin.model.php b/modules/document/document.admin.model.php index 5ab6cc422..819f9cb00 100644 --- a/modules/document/document.admin.model.php +++ b/modules/document/document.admin.model.php @@ -80,9 +80,10 @@ /** * @brief Return document count with date **/ - function getDocumentCountByDate($date = '', $moduleSrlList = array()) { + function getDocumentCountByDate($date = '', $moduleSrlList = array(), $statusList = array()) { if($date) $args->regDate = date('Ymd', strtotime($date)); if(count($moduleSrlList)>0) $args->moduleSrlList = $moduleSrlList; + if(count($statusList)>0) $args->statusList = $statusList; $output = executeQuery('document.getDocumentCountByDate', $args); if(!$output->toBool()) return 0; diff --git a/modules/document/queries/getDocumentCountByDate.xml b/modules/document/queries/getDocumentCountByDate.xml index 423fb8e52..cd95b57ab 100644 --- a/modules/document/queries/getDocumentCountByDate.xml +++ b/modules/document/queries/getDocumentCountByDate.xml @@ -8,5 +8,6 @@ + From 1dd0399dca5acb65b172376105d8ad6b4229198c Mon Sep 17 00:00:00 2001 From: ovclas Date: Mon, 19 Sep 2011 02:35:09 +0000 Subject: [PATCH 0733/1372] issue 160 when new menu add after menu edit in sitemap. not create new menu, and old menu overwrite. this bug fix git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9189 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/menu/tpl/js/sitemap.js | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/menu/tpl/js/sitemap.js b/modules/menu/tpl/js/sitemap.js index bbb70bbd0..033a4dc97 100644 --- a/modules/menu/tpl/js/sitemap.js +++ b/modules/menu/tpl/js/sitemap.js @@ -105,6 +105,7 @@ $('form.siteMap') { editForm.find('.h2').html('Add Menu'); editForm.find('input[name=menu_srl]').val($(this).parents().prevAll('input[name=menu_srl]').val()); + editForm.find('input[name=menu_item_srl]').val(''); editForm.find('input[name=parent_srl]').val(0); editForm.find('input[name=menu_name]').val(''); editForm.find('input[name=cType]').attr('checked', false); From 270e4e7e74c22fcce3f1852857fdbe7d2ff2bf63 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Mon, 19 Sep 2011 05:22:46 +0000 Subject: [PATCH 0734/1372] .btn .button class UI fix. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9190 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/css/xe.css | 24 ++++++++++++++++++++++++ common/css/xe.min.css | 24 ++++++++++++++++++++++++ modules/admin/tpl/css/admin.css | 14 -------------- modules/admin/tpl/css/admin.min.css | 14 -------------- 4 files changed, 48 insertions(+), 28 deletions(-) diff --git a/common/css/xe.css b/common/css/xe.css index ee260d286..1b0c9a2cd 100644 --- a/common/css/xe.css +++ b/common/css/xe.css @@ -1,5 +1,29 @@ @charset "utf-8"; /* NHN (developers@xpressengine.com) */ +/* Button */ +.btn{position:relative;display:inline-block;vertical-align:top} +.btn *{display:inline-block;padding:0 8px;font-size:12px;height:24px;line-height:22px;margin:0;font-weight:bold !important;color:#fff;text-decoration:none !important;border:1px solid;cursor:pointer;overflow:visible;border-radius:3px;box-shadow:inset 0 0 1px #fff;background-color:#666;text-shadow:0 -1px 0 #333;zoom:1} +.btn *[type=submit][disabled=disabled], +.btn *[type=button][disabled=disabled]{opacity:.5;*filter:alpha(opacity=50)} +.btn a, +.btn button[type=button]{border-color:#ccc;color:#333 !important;background:#eee -webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#ddd));background:#eee -moz-linear-gradient(top,#fff,#ddd);background-color:#eee;text-shadow:1px 1px 0 #fff;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#ffffff, endColorStr=#dddddd)} +.btn input, +.btn button[type=submit]{border-color:#666;background:#333 -webkit-gradient(linear,0% 0%,0% 100%,from(#777),to(#777),color-stop(0.5,#333),color-stop(0.5,#000));background:#333 -moz-linear-gradient(top,#777,#000);background-color:#333;color:#ffc;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#777777, endColorStr=#333333)} +.btn a{height:22px} +.btn.medium *{padding:0 12px;font-size:16px;height:30px;line-height:28px} +.btn.medium a{height:28px} +.btn.large *{padding:0 18px;font-size:22px;height:36px;line-height:34px} +.btn.large a{height:34px} +/* Button - Regucy */ +.button{position:relative;display:inline-block;vertical-align:top} +.button *{display:inline-block;padding:0 8px;font-size:12px;height:24px;line-height:22px;margin:0;font-weight:bold !important;color:#fff;text-decoration:none !important;border:1px solid;cursor:pointer;overflow:visible;border-radius:3px;box-shadow:inset 0 0 1px #fff;background-color:#666;text-shadow:0 -1px 0 #333;zoom:1} +.button *[type=submit][disabled=disabled], +.button *[type=button][disabled=disabled]{opacity:.5;*filter:alpha(opacity=50)} +.button span, +.button button[type=button]{border-color:#ccc;color:#333 !important;background:#eee -webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#ddd));background:#eee -moz-linear-gradient(top,#fff,#ddd);background-color:#eee;text-shadow:1px 1px 0 #fff;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#ffffff, endColorStr=#dddddd)} +.button input, +.button button[type=submit]{border-color:#666;background:#333 -webkit-gradient(linear,0% 0%,0% 100%,from(#777),to(#777),color-stop(0.5,#333),color-stop(0.5,#000));background:#333 -moz-linear-gradient(top,#777,#000);background-color:#333;color:#ffc;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#777777, endColorStr=#333333)} +.button span{height:22px} /* Popup Menu Area */ #popup_menu_area{position:absolute;background:#fff;border:1px solid #e9e9e9;border-radius:5px;padding:10px;line-height:1.3;box-shadow:0 0 6px #666;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} #popup_menu_area ul{list-style:none;margin:0;padding:0} diff --git a/common/css/xe.min.css b/common/css/xe.min.css index ee260d286..1b0c9a2cd 100644 --- a/common/css/xe.min.css +++ b/common/css/xe.min.css @@ -1,5 +1,29 @@ @charset "utf-8"; /* NHN (developers@xpressengine.com) */ +/* Button */ +.btn{position:relative;display:inline-block;vertical-align:top} +.btn *{display:inline-block;padding:0 8px;font-size:12px;height:24px;line-height:22px;margin:0;font-weight:bold !important;color:#fff;text-decoration:none !important;border:1px solid;cursor:pointer;overflow:visible;border-radius:3px;box-shadow:inset 0 0 1px #fff;background-color:#666;text-shadow:0 -1px 0 #333;zoom:1} +.btn *[type=submit][disabled=disabled], +.btn *[type=button][disabled=disabled]{opacity:.5;*filter:alpha(opacity=50)} +.btn a, +.btn button[type=button]{border-color:#ccc;color:#333 !important;background:#eee -webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#ddd));background:#eee -moz-linear-gradient(top,#fff,#ddd);background-color:#eee;text-shadow:1px 1px 0 #fff;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#ffffff, endColorStr=#dddddd)} +.btn input, +.btn button[type=submit]{border-color:#666;background:#333 -webkit-gradient(linear,0% 0%,0% 100%,from(#777),to(#777),color-stop(0.5,#333),color-stop(0.5,#000));background:#333 -moz-linear-gradient(top,#777,#000);background-color:#333;color:#ffc;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#777777, endColorStr=#333333)} +.btn a{height:22px} +.btn.medium *{padding:0 12px;font-size:16px;height:30px;line-height:28px} +.btn.medium a{height:28px} +.btn.large *{padding:0 18px;font-size:22px;height:36px;line-height:34px} +.btn.large a{height:34px} +/* Button - Regucy */ +.button{position:relative;display:inline-block;vertical-align:top} +.button *{display:inline-block;padding:0 8px;font-size:12px;height:24px;line-height:22px;margin:0;font-weight:bold !important;color:#fff;text-decoration:none !important;border:1px solid;cursor:pointer;overflow:visible;border-radius:3px;box-shadow:inset 0 0 1px #fff;background-color:#666;text-shadow:0 -1px 0 #333;zoom:1} +.button *[type=submit][disabled=disabled], +.button *[type=button][disabled=disabled]{opacity:.5;*filter:alpha(opacity=50)} +.button span, +.button button[type=button]{border-color:#ccc;color:#333 !important;background:#eee -webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#ddd));background:#eee -moz-linear-gradient(top,#fff,#ddd);background-color:#eee;text-shadow:1px 1px 0 #fff;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#ffffff, endColorStr=#dddddd)} +.button input, +.button button[type=submit]{border-color:#666;background:#333 -webkit-gradient(linear,0% 0%,0% 100%,from(#777),to(#777),color-stop(0.5,#333),color-stop(0.5,#000));background:#333 -moz-linear-gradient(top,#777,#000);background-color:#333;color:#ffc;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#777777, endColorStr=#333333)} +.button span{height:22px} /* Popup Menu Area */ #popup_menu_area{position:absolute;background:#fff;border:1px solid #e9e9e9;border-radius:5px;padding:10px;line-height:1.3;box-shadow:0 0 6px #666;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} #popup_menu_area ul{list-style:none;margin:0;padding:0} diff --git a/modules/admin/tpl/css/admin.css b/modules/admin/tpl/css/admin.css index ef79be6a2..0b0f149b2 100644 --- a/modules/admin/tpl/css/admin.css +++ b/modules/admin/tpl/css/admin.css @@ -186,20 +186,6 @@ header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{di .x .pagination .direction:focus{border:0;margin:0;text-decoration:underline} .x .pagination input{width:30px;text-align:center} .x .pagination button{overflow:visible} -/* Button */ -.x .btn{position:relative;display:inline-block;margin:2px;vertical-align:top} -.x .btn *{display:inline-block;padding:0 8px;font-size:12px;height:24px;line-height:22px;margin:0;font-weight:bold !important;color:#fff;text-decoration:none !important;border:1px solid;cursor:pointer;overflow:visible;border-radius:3px;box-shadow:inset 0 0 1px #fff;background-color:#666;text-shadow:0 -1px 0 #333;zoom:1} -.x .btn *[type=submit][disabled=disabled], -.x .btn *[type=button][disabled=disabled]{opacity:.5;*filter:alpha(opacity=50)} -.x .btn a, -.x .btn button[type=button]{border-color:#ccc;color:#333 !important;background:#eee -webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#ddd));background:#eee -moz-linear-gradient(top,#fff,#ddd);background-color:#eee;text-shadow:1px 1px 0 #fff;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#ffffff, endColorStr=#dddddd)} -.x .btn input, -.x .btn button[type=submit]{border-color:#666;background:#333 -webkit-gradient(linear,0% 0%,0% 100%,from(#777),to(#777),color-stop(0.5,#333),color-stop(0.5,#000));background:#333 -moz-linear-gradient(top,#777,#000);background-color:#333;color:#ffc;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#777777, endColorStr=#333333)} -.x .btn a{height:22px} -.x .btn.medium *{padding:0 12px;font-size:16px;height:30px;line-height:28px} -.x .btn.medium a{height:28px} -.x .btn.large *{padding:0 18px;font-size:22px;height:36px;line-height:34px} -.x .btn.large a{height:34px} /* Star Rating */ .x .starRating, .x .starRating span{display:inline-block;height:14px;background:transparent url(../img/iconStarRating.gif) no-repeat;overflow:hidden} diff --git a/modules/admin/tpl/css/admin.min.css b/modules/admin/tpl/css/admin.min.css index aa7b7b309..2db3066c5 100644 --- a/modules/admin/tpl/css/admin.min.css +++ b/modules/admin/tpl/css/admin.min.css @@ -187,20 +187,6 @@ header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{di .x .pagination .direction:focus{border:0;margin:0;text-decoration:underline} .x .pagination input{width:30px;text-align:center} .x .pagination button{overflow:visible} -/* Button */ -.x .btn{position:relative;display:inline-block;margin:2px;vertical-align:top} -.x .btn *{display:inline-block;padding:0 8px;font-size:12px;height:24px;line-height:22px;margin:0;font-weight:bold !important;color:#fff;text-decoration:none !important;border:1px solid;cursor:pointer;overflow:visible;border-radius:3px;box-shadow:inset 0 0 1px #fff;background-color:#666;text-shadow:0 -1px 0 #333;zoom:1} -.x .btn *[type=submit][disabled=disabled], -.x .btn *[type=button][disabled=disabled]{opacity:.5;*filter:alpha(opacity=50)} -.x .btn a, -.x .btn button[type=button]{border-color:#ccc;color:#333 !important;background:#eee -webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#ddd));background:#eee -moz-linear-gradient(top,#fff,#ddd);background-color:#eee;text-shadow:1px 1px 0 #fff;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#ffffff, endColorStr=#dddddd)} -.x .btn input, -.x .btn button[type=submit]{border-color:#666;background:#333 -webkit-gradient(linear,0% 0%,0% 100%,from(#777),to(#777),color-stop(0.5,#333),color-stop(0.5,#000));background:#333 -moz-linear-gradient(top,#777,#000);background-color:#333;color:#ffc;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#777777, endColorStr=#333333)} -.x .btn a{height:22px} -.x .btn.medium *{padding:0 12px;font-size:16px;height:30px;line-height:28px} -.x .btn.medium a{height:28px} -.x .btn.large *{padding:0 18px;font-size:22px;height:36px;line-height:34px} -.x .btn.large a{height:34px} /* Star Rating */ .x .starRating, .x .starRating span{display:inline-block;height:14px;background:transparent url(../img/iconStarRating.gif) no-repeat;overflow:hidden} From cd7afdc5d2e1a70933a5c7ee9d9207b484b8e8f3 Mon Sep 17 00:00:00 2001 From: ovclas Date: Mon, 19 Sep 2011 05:29:34 +0000 Subject: [PATCH 0735/1372] issue 160 old document mangagement bug fix by new management system side effect git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9191 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/tpl/js/menu_setup.js | 1 - modules/document/document.controller.php | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/admin/tpl/js/menu_setup.js b/modules/admin/tpl/js/menu_setup.js index 8a4166a11..8ef062040 100644 --- a/modules/admin/tpl/js/menu_setup.js +++ b/modules/admin/tpl/js/menu_setup.js @@ -20,7 +20,6 @@ jQuery(function($){ var $optgroup; moduleList = obj.menuList; - console.log(moduleList); if(moduleList) { var menuNameList = $('#menuNameList'); diff --git a/modules/document/document.controller.php b/modules/document/document.controller.php index 1516e910b..a3ceb778e 100644 --- a/modules/document/document.controller.php +++ b/modules/document/document.controller.php @@ -1593,6 +1593,7 @@ class documentController extends document { $type = Context::get('type'); $target_module = Context::get('target_module'); $module_srl = Context::get('module_srl'); + if($target_module && !$module_srl) $module_srl = $target_module; $category_srl = Context::get('target_category'); $message_content = Context::get('message_content'); if($message_content) $message_content = nl2br($message_content); From c93323cffd615d6e3b77d79408851807bfa501f5 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Mon, 19 Sep 2011 05:29:43 +0000 Subject: [PATCH 0736/1372] .wfsr default display:none git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9192 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/css/xe.css | 2 +- common/css/xe.min.css | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/common/css/xe.css b/common/css/xe.css index 1b0c9a2cd..5a4323793 100644 --- a/common/css/xe.css +++ b/common/css/xe.css @@ -33,7 +33,7 @@ #popup_menu_area a:avtive, #popup_menu_area a:focus{text-decoration:underline} /* Waiting for server response */ -.wfsr{z-index:100;background:#FFC;position:absolute;position:fixed;top:0;left:0;text-align:center;border:3px solid #333;border-left:0;border-right:0;width:100%;padding:1em 0;box-shadow:0 0 6px #000;font-size:14px} +.wfsr{display:none;z-index:100;background:#FFC;position:absolute;position:fixed;top:0;left:0;text-align:center;border:3px solid #333;border-left:0;border-right:0;width:100%;padding:1em 0;box-shadow:0 0 6px #000;font-size:14px} .wfsr .bg{position:absolute;background:#000;_background:none;width:100%;height:100%;opacity:.5;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1} .wfsr .fg{position:relative;width:50%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:10px solid #ddd;z-index:2;zoom:1} .wfsr .fg p{padding:0 0 0 2.5em;background:url(../img/preLoader16.gif) no-repeat 1em .4em} diff --git a/common/css/xe.min.css b/common/css/xe.min.css index 1b0c9a2cd..5a4323793 100644 --- a/common/css/xe.min.css +++ b/common/css/xe.min.css @@ -33,7 +33,7 @@ #popup_menu_area a:avtive, #popup_menu_area a:focus{text-decoration:underline} /* Waiting for server response */ -.wfsr{z-index:100;background:#FFC;position:absolute;position:fixed;top:0;left:0;text-align:center;border:3px solid #333;border-left:0;border-right:0;width:100%;padding:1em 0;box-shadow:0 0 6px #000;font-size:14px} +.wfsr{display:none;z-index:100;background:#FFC;position:absolute;position:fixed;top:0;left:0;text-align:center;border:3px solid #333;border-left:0;border-right:0;width:100%;padding:1em 0;box-shadow:0 0 6px #000;font-size:14px} .wfsr .bg{position:absolute;background:#000;_background:none;width:100%;height:100%;opacity:.5;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1} .wfsr .fg{position:relative;width:50%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:10px solid #ddd;z-index:2;zoom:1} .wfsr .fg p{padding:0 0 0 2.5em;background:url(../img/preLoader16.gif) no-repeat 1em .4em} From e33723c126dd0e45e5efdee9d3f0f44a38cb1685 Mon Sep 17 00:00:00 2001 From: flyskyko Date: Mon, 19 Sep 2011 06:10:13 +0000 Subject: [PATCH 0737/1372] issue 160, add config for cdn git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9193 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- config/config.inc.php | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/config/config.inc.php b/config/config.inc.php index 4295e0aa5..842f2c65d 100644 --- a/config/config.inc.php +++ b/config/config.inc.php @@ -20,15 +20,6 @@ **/ define('_XE_PATH_', str_replace('config/config.inc.php', '', str_replace('\\', '/', __FILE__))); - /** - * @brief CDN prefix - **/ - define('__XE_CDN_PREFIX__', 'http://static.xpressengine.com/core/'); - - /** - * @brief CDN version - **/ - define('__XE_CDN_VERSION__', '1.0'); /** * @brief 쿠키 이외의 값에서도 세션을 인식할 수 있도록 함(파일업로드 등에서의 문제 수정) @@ -58,7 +49,8 @@ * define('__OB_GZHANDLER_ENABLE__', 1); * define('__ENABLE_PHPUNIT_TEST__', 0); * define('__PROXY_SERVER__', 'http://domain:port/path'); - * ?> + * define('__XE_CDN_PREFIX__', 'http://yourCdnDomain.com/path/'); + * define('__XE_CDN_VERSION__', 'yourCndVersion'); */ if(file_exists(_XE_PATH_.'config/config.user.inc.php')) { require _XE_PATH_.'config/config.user.inc.php'; @@ -132,6 +124,16 @@ **/ if(!defined('__PROXY_SERVER__')) define('__PROXY_SERVER__', null); + /** + * @brief CDN prefix + **/ + if(!defined('__XE_CDN_PREFIX__')) define('__XE_CDN_PREFIX__', 'http://static.xpressengine.com/core/'); + + /** + * @brief CDN version + **/ + if(!defined('__XE_CDN_VERSION__')) define('__XE_CDN_VERSION__', 'alpha2'); + /** * @brief Require specific files when using Firebug console output **/ From e38b406b627b78c0b6e9a81fd324d1b53f34f739 Mon Sep 17 00:00:00 2001 From: chschy Date: Mon, 19 Sep 2011 06:11:39 +0000 Subject: [PATCH 0738/1372] issue 160, apply google analytics script git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9194 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/module/ModuleHandler.class.php | 8 ++++++++ modules/admin/admin.admin.view.php | 9 +++++++-- modules/admin/lang/lang.xml | 4 ++++ modules/admin/tpl/config.html | 4 ++++ modules/install/install.admin.controller.php | 20 +++++++++++++------- 5 files changed, 36 insertions(+), 9 deletions(-) diff --git a/classes/module/ModuleHandler.class.php b/classes/module/ModuleHandler.class.php index 6f56f537c..e637407b7 100644 --- a/classes/module/ModuleHandler.class.php +++ b/classes/module/ModuleHandler.class.php @@ -351,6 +351,14 @@ Context::addHtmlFooter($footer); } + if($type == "view" && $kind != 'admin'){ + $module_config= $oModuleModel->getModuleConfig('module'); + if($module_config->htmlFooter){ + Context::addHtmlFooter($module_config->htmlFooter); + } + } + + // if failed message exists in session, set context $this->_setInputErrorToContext(); diff --git a/modules/admin/admin.admin.view.php b/modules/admin/admin.admin.view.php index 33aaed536..8f26938ce 100644 --- a/modules/admin/admin.admin.view.php +++ b/modules/admin/admin.admin.view.php @@ -373,8 +373,13 @@ Context::set('ftp_info', $ftp_info); $oDocumentModel = &getModel('document'); - $config = $oDocumentModel->getDocumentConfig(); - Context::set('thumbnail_type',$config->thumbnail_type); + $config = $oDocumentModel->getDocumentConfig(); + Context::set('thumbnail_type',$config->thumbnail_type); + + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('module'); + Context::set('htmlFooter',$config->htmlFooter); + $oModuleModel = &getModel('module'); $columnList = array('modules.mid', 'modules.browser_title', 'sites.index_module_srl'); diff --git a/modules/admin/lang/lang.xml b/modules/admin/lang/lang.xml index 33ed06eea..87d2112fe 100644 --- a/modules/admin/lang/lang.xml +++ b/modules/admin/lang/lang.xml @@ -680,6 +680,10 @@ Lütfen son sürümü için indirme linkine tıklayınız.]]> + + + + diff --git a/modules/admin/tpl/config.html b/modules/admin/tpl/config.html index ed6f60a4f..1009fb483 100644 --- a/modules/admin/tpl/config.html +++ b/modules/admin/tpl/config.html @@ -207,6 +207,10 @@ checked="checked" />

                          • +
                          • +

                            {$lang->input_footer_script}

                            +

                            +
                          • diff --git a/modules/install/install.admin.controller.php b/modules/install/install.admin.controller.php index 562ca5534..95b82077c 100644 --- a/modules/install/install.admin.controller.php +++ b/modules/install/install.admin.controller.php @@ -162,9 +162,10 @@ $selected_lang = Context::get('selected_lang'); $this->saveLangSelected($selected_lang); - //썸네일 세팅 - $config = Context::gets('thumbnail_type'); - $this->thumbnailCheck($config); + //모듈 설정 저장(썸네일, 풋터스크립트) + $config->thumbnail_type = Context::get('thumbnail_type'); + $config->htmlFooter = Context::get('htmlFooter'); + $this->setModulesConfig($config); //파비콘 $favicon = Context::get('favicon'); @@ -199,13 +200,18 @@ } /* 썸내일 보여주기 방식 변경.*/ - function thumbnailCheck($config){ + function setModulesConfig($config){ - if(!$config->thumbnail_type || $config->thumbnail_type != 'ratio' ) $args->thumbnail_type = 'crop'; + if(!$config->thumbnail_type || $config->thumbnail_type != 'ratio' ) $args->thumbnail_type = 'crop'; else $args->thumbnail_type = 'ratio'; - $oModuleController = &getController('module'); - $output = $oModuleController->insertModuleConfig('document',$args); + $oModuleController = &getController('module'); + $oModuleController->insertModuleConfig('document',$args); + + unset($args); + + $args->htmlFooter = $config->htmlFooter; + $oModuleController->insertModuleConfig('module',$args); return $output; } From 8ac23139e8340d17e5bf91e072b4a498aee9ca2e Mon Sep 17 00:00:00 2001 From: flyskyko Date: Mon, 19 Sep 2011 06:38:57 +0000 Subject: [PATCH 0739/1372] delete not used file git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9195 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/autoinstall/tpl/config.html | 37 ----------------------------- 1 file changed, 37 deletions(-) delete mode 100644 modules/autoinstall/tpl/config.html diff --git a/modules/autoinstall/tpl/config.html b/modules/autoinstall/tpl/config.html deleted file mode 100644 index 1edb85f3e..000000000 --- a/modules/autoinstall/tpl/config.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - -
                            설치된 XE의 절대경로
                            {_XE_PATH_} -
                            설치된 XE의 FTP 절대경로 설정
                            - -
                            - - - -
                            - -
                            - From ace9dd3f6eb6f41e926eae62bc27455f09282432 Mon Sep 17 00:00:00 2001 From: ovclas Date: Mon, 19 Sep 2011 06:43:41 +0000 Subject: [PATCH 0740/1372] issue 160 search input value check git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9196 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/lang/lang.xml | 6 ++++++ modules/comment/tpl/comment_list.html | 6 +++++- modules/comment/tpl/js/comment_admin.js | 14 ++++++++++++++ modules/document/tpl/document_list.html | 6 +++++- modules/document/tpl/js/document_admin.js | 14 ++++++++++++++ modules/file/tpl/file_list.html | 6 +++++- modules/file/tpl/js/file_admin.js | 14 ++++++++++++++ modules/poll/tpl/js/poll_admin.js | 14 ++++++++++++++ modules/poll/tpl/poll_list.html | 6 +++++- modules/rss/tpl/js/rss.js | 2 +- modules/trackback/tpl/js/trackback_admin.js | 14 ++++++++++++++ modules/trackback/tpl/trackback_list.html | 6 +++++- 12 files changed, 102 insertions(+), 6 deletions(-) diff --git a/common/lang/lang.xml b/common/lang/lang.xml index 872ba182c..5e4b74da5 100644 --- a/common/lang/lang.xml +++ b/common/lang/lang.xml @@ -3773,4 +3773,10 @@ Xin vui lòng kiểm tra lại thông tin Database.]]> + + + + + + diff --git a/modules/comment/tpl/comment_list.html b/modules/comment/tpl/comment_list.html index 90d97d8df..2e4f437a9 100644 --- a/modules/comment/tpl/comment_list.html +++ b/modules/comment/tpl/comment_list.html @@ -1,3 +1,7 @@ +

                            {$XE_VALIDATOR_MESSAGE}

                            @@ -129,7 +133,7 @@ -
                            + diff --git a/modules/comment/tpl/js/comment_admin.js b/modules/comment/tpl/js/comment_admin.js index 19dc9454c..b02e83a04 100644 --- a/modules/comment/tpl/js/comment_admin.js +++ b/modules/comment/tpl/js/comment_admin.js @@ -65,3 +65,17 @@ function completeGetCommentList(ret_obj, response_tags) } jQuery('#commentManageListTable>tbody').html(htmlListBuffer); } + +function checkSearch(form) +{ + if(form.search_target.value == '') + { + alert(xe.lang.msg_empty_search_target); + return false; + } + if(form.search_keyword.value == '') + { + alert(xe.lang.msg_empty_search_keyword); + return false; + } +} diff --git a/modules/document/tpl/document_list.html b/modules/document/tpl/document_list.html index 794f007b6..333782139 100644 --- a/modules/document/tpl/document_list.html +++ b/modules/document/tpl/document_list.html @@ -1,3 +1,7 @@ +

                            {$XE_VALIDATOR_MESSAGE}

                            @@ -155,7 +159,7 @@ -
                            + diff --git a/modules/document/tpl/js/document_admin.js b/modules/document/tpl/js/document_admin.js index c540c5250..3da2cfc60 100644 --- a/modules/document/tpl/js/document_admin.js +++ b/modules/document/tpl/js/document_admin.js @@ -241,3 +241,17 @@ function completeGetCategoryFromModules(ret_obj, response_tags) { obj.options[obj.options.length] = opt; } } + +function checkSearch(form) +{ + if(form.search_target.value == '') + { + alert(xe.lang.msg_empty_search_target); + return false; + } + if(form.search_keyword.value == '') + { + alert(xe.lang.msg_empty_search_keyword); + return false; + } +} diff --git a/modules/file/tpl/file_list.html b/modules/file/tpl/file_list.html index df2e089d4..98f1678ca 100644 --- a/modules/file/tpl/file_list.html +++ b/modules/file/tpl/file_list.html @@ -1,3 +1,7 @@ +

                            {$XE_VALIDATOR_MESSAGE}

                            @@ -163,7 +167,7 @@ -
                            + diff --git a/modules/file/tpl/js/file_admin.js b/modules/file/tpl/js/file_admin.js index c1b54df7c..c35ff339e 100644 --- a/modules/file/tpl/js/file_admin.js +++ b/modules/file/tpl/js/file_admin.js @@ -44,3 +44,17 @@ function completeGetFileList(ret_obj, response_tags) } jQuery('#fileManageListTable>tbody').html(htmlListBuffer); } + +function checkSearch(form) +{ + if(form.search_target.value == '') + { + alert(xe.lang.msg_empty_search_target); + return false; + } + if(form.search_keyword.value == '') + { + alert(xe.lang.msg_empty_search_keyword); + return false; + } +} diff --git a/modules/poll/tpl/js/poll_admin.js b/modules/poll/tpl/js/poll_admin.js index f1c747038..7fa7c235d 100644 --- a/modules/poll/tpl/js/poll_admin.js +++ b/modules/poll/tpl/js/poll_admin.js @@ -98,3 +98,17 @@ function completeGetPollList(ret_obj, response_tags) } jQuery('#pollManageListTable>tbody').html(htmlListBuffer); } + +function checkSearch(form) +{ + if(form.search_target.value == '') + { + alert(xe.lang.msg_empty_search_target); + return false; + } + if(form.search_keyword.value == '') + { + alert(xe.lang.msg_empty_search_keyword); + return false; + } +} diff --git a/modules/poll/tpl/poll_list.html b/modules/poll/tpl/poll_list.html index 476649606..5bca922c4 100644 --- a/modules/poll/tpl/poll_list.html +++ b/modules/poll/tpl/poll_list.html @@ -1,3 +1,7 @@ +

                            {$XE_VALIDATOR_MESSAGE}

                            @@ -105,7 +109,7 @@ -
                            + From 77eb13849b1773bde46599bd38104f3b4a9b49ce Mon Sep 17 00:00:00 2001 From: chschy Date: Mon, 19 Sep 2011 08:18:19 +0000 Subject: [PATCH 0741/1372] issue 160, code clear up git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9197 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/tpl/config.html | 25 +++++++++++++++++++++---- modules/admin/tpl/js/config.js | 15 --------------- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/modules/admin/tpl/config.html b/modules/admin/tpl/config.html index 1009fb483..26c18bad2 100644 --- a/modules/admin/tpl/config.html +++ b/modules/admin/tpl/config.html @@ -1,3 +1,21 @@ + @@ -46,12 +64,12 @@ {$lang->cmd_find}

                            - +

                            @@ -160,7 +178,6 @@
                          • -

                            {$lang->about_default_url}

                          • @@ -227,7 +244,7 @@
                          • - +
                            diff --git a/modules/admin/tpl/js/config.js b/modules/admin/tpl/js/config.js index 9c6cb261c..26cd96ac1 100644 --- a/modules/admin/tpl/js/config.js +++ b/modules/admin/tpl/js/config.js @@ -1,23 +1,8 @@ jQuery(function($){ - $('#favicon').change(function(){ - var re_favicon = /favicon\.ico$/ - if(re_favicon.test($(this).val()) != true){ - alert('{$lang->msg_not_correct_iconname} favicon.ico {$lang->msg_possible_only_file}'); - return false; - } - }); - $('#mobicon').change(function(){ - var re_favicon = /mobicon\.png$/ - if(re_favicon.test($(this).val()) != true){ - alert('{$lang->msg_not_correct_iconname} mobicon.png {$lang->msg_possible_only_file}'); - return false; - } - }); $('.tgContent ul').bind('click', function(){ $('#sitefind_addBtn').css('display',''); }); }); - function setStartModule(){ var target_module = jQuery('.moduleIdList option:selected').text(); var index_module_srl = jQuery('.moduleIdList').val(); From 1e0337e44feb2a94e1abdf57df2deaa278851cc3 Mon Sep 17 00:00:00 2001 From: flyskyko Date: Mon, 19 Sep 2011 08:38:27 +0000 Subject: [PATCH 0742/1372] issue 160, fix a bug for get DB info git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9198 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/frontendfile/FrontEndFileHandler.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/classes/frontendfile/FrontEndFileHandler.class.php b/classes/frontendfile/FrontEndFileHandler.class.php index 434c4d372..b91334e28 100644 --- a/classes/frontendfile/FrontEndFileHandler.class.php +++ b/classes/frontendfile/FrontEndFileHandler.class.php @@ -129,7 +129,7 @@ $this->_sortMap($map, $mapIndex); - $dbInfo = Context::get('db_info'); + $dbInfo = Context::getDBInfo(); $useCdn = $dbInfo->use_cdn; $result = array(); @@ -164,7 +164,7 @@ $this->_sortMap($map, $mapIndex); - $dbInfo = Context::get('db_info'); + $dbInfo = Context::getDBInfo(); $useCdn = $dbInfo->use_cdn; $result = array(); From ca245b93fd50bbfb70cc27073ee060d64db2f60d Mon Sep 17 00:00:00 2001 From: chschy Date: Mon, 19 Sep 2011 09:19:48 +0000 Subject: [PATCH 0743/1372] issue 160, Modify ip checked in admin pages git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9199 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/module/ModuleHandler.class.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/classes/module/ModuleHandler.class.php b/classes/module/ModuleHandler.class.php index e637407b7..90c3f2525 100644 --- a/classes/module/ModuleHandler.class.php +++ b/classes/module/ModuleHandler.class.php @@ -197,10 +197,13 @@ if(!$kind && $this->module == 'admin') $kind = 'admin'; if($this->module_info->use_mobile != "Y") Mobile::setMobile(false); - if($kind == 'admin'){ + $logged_info = Context::get('logged_info'); + + if($kind == 'admin' && $logged_info->is_admin == 'Y'){ $oModuleAdminModel = &getAdminModel('module'); if(!$oModuleAdminModel->getModuleAdminIPCheck()) return false; } + unset($logged_info); // if(type == view, and case for using mobilephone) if($type == "view" && Mobile::isFromMobilePhone() && Context::isInstalled()) From 604833cae863de63a9bff5d529ef3a62a7df08a6 Mon Sep 17 00:00:00 2001 From: flyskyko Date: Mon, 19 Sep 2011 10:00:48 +0000 Subject: [PATCH 0744/1372] apply cdn git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9200 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- addons/autolink/autolink.addon.php | 2 +- addons/captcha/captcha.addon.php | 32 ++++++++--------- addons/resize_image/resize_image.addon.php | 6 ++-- modules/admin/tpl/admin_setup.html | 2 +- modules/admin/tpl/config.html | 14 +++++--- modules/admin/tpl/theme.html | 4 +-- modules/comment/tpl/comment_list.html | 2 +- modules/comment/tpl/header.html | 2 +- modules/communication/tpl/index.html | 4 +-- modules/counter/tpl/index.html | 4 +-- modules/document/tpl/category_list.html | 4 +-- modules/document/tpl/checked_list.html | 4 +-- modules/document/tpl/declared_list.html | 2 +- modules/document/tpl/document_alias.html | 2 +- modules/document/tpl/document_list.html | 2 +- modules/document/tpl/extra_keys.html | 6 ++-- modules/document/tpl/header.html | 2 +- modules/document/tpl/preview_page.html | 4 +-- modules/document/tpl/print_page.html | 4 +-- modules/document/tpl/saved_list_popup.html | 9 +++-- modules/editor/editor.view.php | 28 +++++++-------- modules/editor/tpl/admin_index.html | 34 +++++++++---------- modules/editor/tpl/config_preview.html | 8 ++--- modules/editor/tpl/editor_module_config.html | 2 +- modules/editor/tpl/setup_component.html | 8 ++--- modules/editor/tpl/view_component.html | 4 +-- modules/file/tpl/adminConfig.html | 2 +- modules/file/tpl/file_list.html | 2 +- modules/file/tpl/header.html | 2 +- modules/importer/tpl/header.html | 4 +-- modules/importer/tpl/index.html | 10 +++--- modules/integration_search/tpl/header.html | 2 +- modules/integration_search/tpl/index.html | 2 +- modules/layout/layout.model.php | 6 ++-- modules/layout/tpl/layout_edit.html | 4 +-- modules/layout/tpl/layout_instance_list.html | 2 +- modules/member/member.admin.view.php | 18 +++++----- modules/member/tpl/delete_form.html | 2 +- modules/member/tpl/delete_members.html | 2 +- modules/member/tpl/group_list.html | 6 ++-- modules/member/tpl/header.html | 4 +-- modules/member/tpl/insert_member.html | 4 +-- modules/member/tpl/leave_form.html | 16 ++++----- modules/member/tpl/login_form.html | 4 +-- modules/member/tpl/manage_member_group.html | 2 +- modules/member/tpl/member_config.html | 2 +- modules/member/tpl/member_info_mobile.html | 20 +++++------ modules/member/tpl/member_list.html | 2 +- modules/member/tpl/modify_info_mobile.html | 20 +++++------ modules/member/tpl/modify_password.html | 16 ++++----- modules/member/tpl/signup_form.html | 20 +++++------ modules/menu/tpl/menu_management.html | 4 +-- modules/menu/tpl/sitemap.html | 8 ++--- modules/module/tpl/copy_module.html | 2 +- modules/module/tpl/filebox_add.html | 2 +- modules/module/tpl/header.html | 2 +- modules/module/tpl/lang.html | 2 +- modules/module/tpl/module_grant_setup.html | 4 +-- modules/module/tpl/module_grants.html | 4 +-- modules/module/tpl/module_langcode.html | 2 +- modules/module/tpl/module_list.html | 2 +- modules/module/tpl/module_selector.html | 4 +-- modules/module/tpl/module_setup.html | 2 +- modules/module/tpl/skin_info.html | 2 +- modules/page/tpl/article_content_modify.html | 2 +- modules/page/tpl/content.html | 2 +- modules/page/tpl/header.html | 2 +- modules/page/tpl/index.html | 8 ++--- modules/page/tpl/mcontent.html | 4 +-- modules/page/tpl/mobile.html | 2 +- modules/page/tpl/page_content_modify.html | 8 ++--- modules/page/tpl/page_delete.html | 2 +- .../page/tpl/page_mobile_content_modify.html | 8 ++--- modules/point/tpl/header.html | 2 +- modules/point/tpl/member_list.html | 8 ++--- modules/point/tpl/point_module_config.html | 2 +- modules/poll/tpl/config.html | 2 +- modules/poll/tpl/poll_list.html | 2 +- modules/poll/tpl/result.html | 2 +- modules/rss/tpl/rss_admin_index.html | 4 +-- modules/session/tpl/index.html | 2 +- modules/spamfilter/tpl/index.html | 10 +++--- modules/syndication/tpl/config.html | 4 +-- modules/trackback/tpl/trackback_list.html | 2 +- modules/trash/tpl/header.html | 2 +- modules/trash/tpl/trash_list.html | 4 +-- modules/widget/tpl/add_content_widget.html | 4 +-- modules/widget/tpl/skin_info.html | 2 +- modules/widget/tpl/widget_detail_info.html | 4 +-- modules/widget/tpl/widget_generate_code.html | 2 +- .../tpl/widget_generate_code.include.html | 4 +-- .../tpl/widget_generate_code_in_page.html | 8 ++--- .../widget_style_generate_code_in_page.html | 10 +++--- 93 files changed, 265 insertions(+), 262 deletions(-) diff --git a/addons/autolink/autolink.addon.php b/addons/autolink/autolink.addon.php index 56ad64f85..722151635 100644 --- a/addons/autolink/autolink.addon.php +++ b/addons/autolink/autolink.addon.php @@ -7,6 +7,6 @@ * @brief Automatic link add-on **/ if($called_position == 'after_module_proc' && Context::getResponseMethod()!="XMLRPC") { - Context::addJsFile('./addons/autolink/autolink.js', false ,'', null, 'body'); + Context::loadFile(array('./addons/autolink/autolink.js', 'body', '', null), true); } ?> diff --git a/addons/captcha/captcha.addon.php b/addons/captcha/captcha.addon.php index f516b160c..96312e4ce 100644 --- a/addons/captcha/captcha.addon.php +++ b/addons/captcha/captcha.addon.php @@ -41,10 +41,10 @@ if(Context::getRequestMethod()!='XMLRPC' && Context::getRequestMethod()!=='JSON') { Context::addHtmlHeader(''); - Context::addJsFile('./addons/captcha/captcha.js',false, '', null, 'body'); + Context::loadFile(array('./addons/captcha/captcha.js', 'body', '', null), true); } // compare session when calling actions such as writing a post or a comment on the board/issue tracker module - + if(!$_SESSION['captcha_authed'] && in_array(Context::get('act'), $target_acts)) { Context::loadLang('./addons/captcha/lang'); $ModuleHandler->error = "captcha_denied"; @@ -57,10 +57,10 @@ { if($_SESSION['captcha_authed']) return false; // Load language files - + Context::loadLang(_XE_PATH_.'addons/captcha/lang'); // Generate keywords - + $arr = range('A','Y'); shuffle($arr); $arr = array_slice($arr,0,6); @@ -107,30 +107,30 @@ $arr = array(); for($i=0,$c=strlen($string);$i<$c;$i++) $arr[] = $string{$i}; // Font site - + $w = 18; $h = 25; // Character length - + $c = count($arr); // Character image - + $im = array(); // Create an image by total size - + $im[] = imagecreate(($w+2)*count($arr), $h); $deg = range(-30,30); shuffle($deg); // Create an image for each letter - + foreach($arr as $i => $str) { $im[$i+1] = @imagecreate($w, $h); $background_color = imagecolorallocate($im[$i+1], 255, 255, 255); $text_color = imagecolorallocate($im[$i+1], 0, 0, 0); // Control font size - + $ran = range(1,20); shuffle($ran); @@ -147,16 +147,16 @@ imagestring($im[$i+1], (array_pop($ran)%3)+3, 2, (array_pop($ran)%4), $str, $text_color); } } - + // Combine images of each character - + for($i=1;$icreateCaptchaAudio($keyword); - header('Content-type: audio/mpeg'); + header('Content-type: audio/mpeg'); header("Content-Disposition: attachment; filename=\"captcha_audio.mp3\""); header('Cache-Control: no-store, no-cache, must-revalidate'); header('Expires: Sun, 1 Jan 2000 12:00:00 GMT'); diff --git a/addons/resize_image/resize_image.addon.php b/addons/resize_image/resize_image.addon.php index 758a20249..fde6e62fd 100644 --- a/addons/resize_image/resize_image.addon.php +++ b/addons/resize_image/resize_image.addon.php @@ -9,10 +9,10 @@ if($called_position == 'after_module_proc' && Context::getResponseMethod()=="HTML") { if(Mobile::isFromMobilePhone()) { - Context::addCssFile('./addons/resize_image/css/resize_image.mobile.css'); - } else { + Context::loadFile('./addons/resize_image/css/resize_image.mobile.css', true); + } else { Context::loadJavascriptPlugin('ui'); - Context::addJsFile('./addons/resize_image/js/resize_image.min.js',false, '',null, 'body'); + Context::loadFile(array('./addons/resize_image/js/resize_image.min.js', 'body', '', null), true); } } ?> diff --git a/modules/admin/tpl/admin_setup.html b/modules/admin/tpl/admin_setup.html index 43653e308..4771c6849 100644 --- a/modules/admin/tpl/admin_setup.html +++ b/modules/admin/tpl/admin_setup.html @@ -1,4 +1,4 @@ - +
                            diff --git a/modules/admin/tpl/config.html b/modules/admin/tpl/config.html index 26c18bad2..fa9ebc100 100644 --- a/modules/admin/tpl/config.html +++ b/modules/admin/tpl/config.html @@ -1,4 +1,4 @@ - - - + +
                            @@ -69,15 +69,19 @@ jQuery(function($){
                              +<<<<<<< .mine +
                              +=======

                              +>>>>>>> .r9199

                              - +

                              -

                              +

                            • diff --git a/modules/admin/tpl/theme.html b/modules/admin/tpl/theme.html index 19ddcda78..e83408e43 100644 --- a/modules/admin/tpl/theme.html +++ b/modules/admin/tpl/theme.html @@ -1,4 +1,4 @@ - + - +

                              {$XE_VALIDATOR_MESSAGE}

                              diff --git a/modules/comment/tpl/header.html b/modules/comment/tpl/header.html index 0c77ba665..40b1b9b98 100644 --- a/modules/comment/tpl/header.html +++ b/modules/comment/tpl/header.html @@ -1,4 +1,4 @@ - +

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

                              diff --git a/modules/communication/tpl/index.html b/modules/communication/tpl/index.html index 54c031595..28ad72d8e 100644 --- a/modules/communication/tpl/index.html +++ b/modules/communication/tpl/index.html @@ -1,5 +1,5 @@ - - + +

                              {$lang->communication} {$lang->cmd_management}

                              diff --git a/modules/counter/tpl/index.html b/modules/counter/tpl/index.html index 50dffb227..bb9718c25 100644 --- a/modules/counter/tpl/index.html +++ b/modules/counter/tpl/index.html @@ -1,5 +1,5 @@ - - + + diff --git a/modules/document/tpl/category_list.html b/modules/document/tpl/category_list.html index 91b7198a8..be485fcc4 100644 --- a/modules/document/tpl/category_list.html +++ b/modules/document/tpl/category_list.html @@ -4,8 +4,8 @@ - - + + - +

                              {$XE_VALIDATOR_MESSAGE}

                              diff --git a/modules/document/tpl/extra_keys.html b/modules/document/tpl/extra_keys.html index e4fccb1d8..78676207d 100644 --- a/modules/document/tpl/extra_keys.html +++ b/modules/document/tpl/extra_keys.html @@ -1,7 +1,7 @@ - + - + {@ $selected_var = $extra_keys[$selected_var_idx] } @@ -23,7 +23,7 @@
                            • {$lang->column_name}
                              - {$lang->cmd_find_langcode} + {$lang->cmd_find_langcode}
                              {$value['feed_description']} - checked="checked" /> + checked="checked" /> diff --git a/modules/session/tpl/index.html b/modules/session/tpl/index.html index 631d1f8b5..8253308ad 100644 --- a/modules/session/tpl/index.html +++ b/modules/session/tpl/index.html @@ -1,4 +1,4 @@ - +

                              {$lang->session} {$lang->cmd_management}

                              {nl2br($lang->about_session)}
                              diff --git a/modules/spamfilter/tpl/index.html b/modules/spamfilter/tpl/index.html index feaca2239..ebdd98500 100644 --- a/modules/spamfilter/tpl/index.html +++ b/modules/spamfilter/tpl/index.html @@ -1,4 +1,4 @@ - +
                              @@ -17,7 +17,7 @@
                            • {$lang->cmd_interval}

                              - limits=='Y' || $config->limits =='')-->checked="checked" /> + limits=='Y' || $config->limits =='')-->checked="checked" /> limits!='Y' && $config->limits !='')--> checked="checked" />

                              @@ -42,8 +42,8 @@
                            • - - + + {$lang->about_denied_ip}

                              @@ -57,7 +57,7 @@

                              - + {$lang->about_denied_word}

                              diff --git a/modules/syndication/tpl/config.html b/modules/syndication/tpl/config.html index 71be4a4ce..33a23f7fb 100644 --- a/modules/syndication/tpl/config.html +++ b/modules/syndication/tpl/config.html @@ -1,5 +1,5 @@ - - + +

                              {$lang->syndication} {$lang->cmd_management}

                              {$lang->about_syndication}

                              diff --git a/modules/trackback/tpl/trackback_list.html b/modules/trackback/tpl/trackback_list.html index 691607097..760f50022 100644 --- a/modules/trackback/tpl/trackback_list.html +++ b/modules/trackback/tpl/trackback_list.html @@ -2,7 +2,7 @@ xe.lang.msg_empty_search_target = '{$lang->msg_empty_search_target}'; xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}'; - +

                              {$XE_VALIDATOR_MESSAGE}

                              diff --git a/modules/trash/tpl/header.html b/modules/trash/tpl/header.html index 87a81480c..cf7e9e9de 100644 --- a/modules/trash/tpl/header.html +++ b/modules/trash/tpl/header.html @@ -1,2 +1,2 @@ - +

                              {$lang->cmd_trash} {$lang->cmd_management}

                              diff --git a/modules/trash/tpl/trash_list.html b/modules/trash/tpl/trash_list.html index 4deeebddb..0750cc810 100644 --- a/modules/trash/tpl/trash_list.html +++ b/modules/trash/tpl/trash_list.html @@ -2,7 +2,7 @@ var confirm_restore_msg = '{$lang->confirm_restore}'; var no_text_comment = '{$lang->no_text_comment}'; - +

                              {$XE_VALIDATOR_MESSAGE}

                              @@ -18,7 +18,7 @@ var no_text_comment = '{$lang->no_text_comment}'; {$lang->trash}({number_format($total_count)}) {$lang->document_manager} - +
                              - - - - - - -
                              {$lang->confirm_logout}
                              - - {$lang->cmd_back} -
                              - + + + + +

                              {$lang->cmd_logout}

                              +

                              {$lang->confirm_logout}

                              +

                              - + diff --git a/modules/member/skins/default/member_info.html b/modules/member/skins/default/member_info.html index e098fc8d8..6f3e8d5e0 100644 --- a/modules/member/skins/default/member_info.html +++ b/modules/member/skins/default/member_info.html @@ -1,5 +1,4 @@ - - +

                              {$lang->member_info}

                              @@ -39,7 +38,7 @@ - + @@ -49,30 +48,24 @@ - - + + - - + + - -
                              {$title} *{$title} * {$value}
                              {implode(', ', $memberInfo['group_list'])}
                              {$lang->signup_date}
                              {zdate($memberInfo[regdate],"Y-m-d H:i")}{$lang->signup_date}{zdate($memberInfo[regdate],"Y-m-d")}
                              {$lang->last_login}
                              {zdate($memberInfo[last_login],"Y-m-d H:i")}{$lang->last_login}{zdate($memberInfo[last_login],"Y-m-d")}
                              - - {$lang->cmd_modify_member_info} - - {$lang->cmd_leave} - - {$lang->cmd_modify_member_password} - {$lang->cmd_leave} - - - {$lang->cmd_back} -
                              - - - + + diff --git a/modules/member/skins/default/modify_info.html b/modules/member/skins/default/modify_info.html index ee8b4d7fd..5a205a609 100644 --- a/modules/member/skins/default/modify_info.html +++ b/modules/member/skins/default/modify_info.html @@ -1,95 +1,55 @@ - - - - - - - - - - - - - - - - - - - - + + + + + - -

                              {$lang->msg_update_member}

                              - -
                              -

                              {$XE_VALIDATOR_MESSAGE}

                              -
                              -
                              +

                              {$lang->msg_update_member}

                              +
                              +

                              {$XE_VALIDATOR_MESSAGE}

                              +
                              + - -
                                -
                              • -

                                {$identifierForm->title} *

                                -

                                - - -

                                -
                              • -
                              • -

                                {$formTag->title}

                                -
                                {$formTag->inputTag}
                                -
                                {$editor}
                                -
                              • -
                              • -

                                {$lang->allow_mailing}

                                -

                                - - -

                                -
                              • -
                              • -

                                {$lang->allow_message}

                                -

                                - - - -

                                -
                              • -
                              - - -
                              {$lang->openid}
                              - - - - - - - - - - - - - - {$lang->cmd_cancel} - - - +
                                +
                              • +

                                {$identifierForm->title} *

                                +

                                + + +

                                +
                              • +
                              • +

                                {$formTag->title}

                                +
                                {$formTag->inputTag}
                                +
                                {$editor}
                                +
                              • +
                              • +

                                {$lang->allow_mailing}

                                +

                                + + +

                                +
                              • +
                              • +

                                {$lang->allow_message}

                                +

                                + + + +

                                +
                              • +
                              - - + - - - - + + diff --git a/modules/member/skins/default/modify_password.html b/modules/member/skins/default/modify_password.html index 6f6e4fa11..829382307 100644 --- a/modules/member/skins/default/modify_password.html +++ b/modules/member/skins/default/modify_password.html @@ -1,39 +1,31 @@ - -

                              {$member_title = $lang->cmd_modify_member_password}

                              -
                              + +

                              {$member_title = $lang->cmd_modify_member_password}

                              + - - - - - - - - - - - - - - - - -
                              {$lang->user_id}
                              {$member_info->user_id}
                              -

                              -
                              - -
                              - -
                              -

                              {$lang->about_password}

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

                                +

                                +
                              • +
                              • +

                                +

                                +
                              • +
                              • +

                                +

                                {$lang->about_password}

                                +
                              • +
                              • +

                                +

                                +
                              • +
                              + +
                              + +
                              + diff --git a/modules/member/skins/default/openid_leave_form.html b/modules/member/skins/default/openid_leave_form.html index 53451e7ba..34546dc88 100644 --- a/modules/member/skins/default/openid_leave_form.html +++ b/modules/member/skins/default/openid_leave_form.html @@ -1,28 +1,21 @@ - - - -

                              {$member_title = $lang->msg_leave_member}

                              - -
                              - - - - - - - - - - - - -
                              {$lang->user_id}
                              - {$member_info->user_id} -

                              {$lang->about_openid_leave}

                              -
                              - - {$lang->cmd_back} -
                              - + + +

                              {$member_title = $lang->msg_leave_member}

                              + + + + +
                                +
                              • +

                                +

                                + + {$lang->about_openid_leave} +

                                +
                              • +
                              +
                              + +
                              - + diff --git a/modules/member/skins/default/resend_auth_mail.html b/modules/member/skins/default/resend_auth_mail.html index e816d4d40..c0afda8a7 100644 --- a/modules/member/skins/default/resend_auth_mail.html +++ b/modules/member/skins/default/resend_auth_mail.html @@ -1,23 +1,19 @@ - - - -
                              +

                              {$XE_VALIDATOR_MESSAGE}

                              -
                              - -

                              {$lang->cmd_resend_auth_mail}

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

                              {$lang->cmd_resend_auth_mail}

                              +

                              {$lang->about_resend_auth_mail}

                              +
                                +
                              • +

                                +

                                +
                              • +
                              +
                              + +
                              -
                              + diff --git a/modules/member/skins/default/saved_list.html b/modules/member/skins/default/saved_list.html index 6943c2adf..6f29d27e9 100644 --- a/modules/member/skins/default/saved_list.html +++ b/modules/member/skins/default/saved_list.html @@ -1,38 +1,29 @@ - - -

                              {$member_title = $lang->cmd_view_saved_document}

                              - - - - - - - - - - - - - - - - - - - - - - + +

                              {$member_title = $lang->cmd_view_saved_document}

                              +
                              +
                              Total : {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
                              {$lang->date}
                              {$lang->title}
                              {$lang->cmd_delete}
                              {$val->getRegdate("Y-m-d H:i:s")} - - - {$lang->cmd_delete}
                              - {$lang->cmd_back} -
                              + + + + + + + + + + + + + + +
                              Total: {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
                              {$lang->title}{$lang->date}{$lang->cmd_delete}
                              + {$val->getTitle()} + + {$val->getRegdate("Y-m-d")}
                              - - - + - - + diff --git a/modules/member/skins/default/saved_list_popup.html b/modules/member/skins/default/saved_list_popup.html index e791907ed..6a7c656a0 100644 --- a/modules/member/skins/default/saved_list_popup.html +++ b/modules/member/skins/default/saved_list_popup.html @@ -1,49 +1,36 @@ - - -
                              - -
                              -

                              {$lang->cmd_view_saved_document}

                              -
                              - -
                              -
                              - - - - - - - - - - - - - - - - - - - -
                              Total : {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
                              {$lang->date}
                              {$lang->title}
                              {$lang->cmd_select}
                              {$val->getRegdate("Y-m-d H:i:s")} - - - {$lang->cmd_select}
                              - - - -
                              -
                              -
                              + +

                              {$lang->cmd_view_saved_document}

                              +
                              + + + + + + + + + + + + + + + + +
                              Total: {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
                              {$lang->title}{$lang->date}{$lang->cmd_select}
                              + {$val->getTitle()} + + {$val->getRegdate("Y-m-d")}
                              + +
                              + diff --git a/modules/member/skins/default/scrapped_list.html b/modules/member/skins/default/scrapped_list.html index 447067581..ea1b41d4b 100644 --- a/modules/member/skins/default/scrapped_list.html +++ b/modules/member/skins/default/scrapped_list.html @@ -1,40 +1,30 @@ - - -

                              {$member_title = $lang->cmd_view_scrapped_document}

                              - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                              Total : {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
                              {$lang->no}
                              {$lang->title}
                              {$lang->writer}
                              {$lang->date}
                              {$lang->cmd_delete}
                              {$no}{htmlspecialchars($val->title)}
                              {$val->nick_name}
                              {zdate($val->regdate, "Y-m-d H:i")}{$lang->cmd_delete}
                              - {$lang->cmd_back} -
                              - - -
                              diff --git a/modules/widget/tpl/widget_generate_code.multilang.textarea.html b/modules/widget/tpl/widget_generate_code.multilang.textarea.html index 266871726..ea61170ac 100644 --- a/modules/widget/tpl/widget_generate_code.multilang.textarea.html +++ b/modules/widget/tpl/widget_generate_code.multilang.textarea.html @@ -20,7 +20,7 @@
                              -

                              다국어 텍스트 관리

                              +

                              {$lang->multilingual_manager}

                              From c49ffc2eda998833080d8b175e09853c653e5edc Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Tue, 20 Sep 2011 09:20:15 +0000 Subject: [PATCH 0782/1372] /common/css.backup remove. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9238 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/css.backup/button.css | 91 ----------------------------------- common/css.backup/default.css | 91 ----------------------------------- common/css.backup/minify.ini | 7 --- common/css.backup/popup.css | 2 - common/css.backup/xe.css | 91 ----------------------------------- common/css.backup/xe.min.css | 1 - 6 files changed, 283 deletions(-) delete mode 100644 common/css.backup/button.css delete mode 100644 common/css.backup/default.css delete mode 100644 common/css.backup/minify.ini delete mode 100644 common/css.backup/popup.css delete mode 100644 common/css.backup/xe.css delete mode 100644 common/css.backup/xe.min.css diff --git a/common/css.backup/button.css b/common/css.backup/button.css deleted file mode 100644 index 5177e1e4c..000000000 --- a/common/css.backup/button.css +++ /dev/null @@ -1,91 +0,0 @@ -/* NHN (developers@xpressengine.com) */ - -/* Anchor Button */ -a.button, -a.button span { position:relative; display:inline-block; text-decoration:none !important; background:url(../tpl/images/buttonWhite.gif) no-repeat; cursor:pointer; white-space:nowrap; vertical-align:middle;} -a.button { padding:0; background-position:left top; overflow:visible;} -a.button span { left:2px; padding:6px 10px 5px 8px; color:#000; font:12px/12px Sans-serif; background-position:right top; *vertical-align:top;} -/* Large Size */ -a.button.large { background-position:left -30px; } -a.button.large span { padding:7px 10px 6px 8px; font:16px/16px Sans-serif; background-position:right -30px;} -/* xLarge Size */ -a.button.xLarge { background-position:left -65px; } -a.button.xLarge span { padding:8px 10px 7px 8px; font:20px/20px Sans-serif; background-position:right -65px;} -/* Small Size */ -a.button.small { background-position:left -107px; } -a.button.small span { padding:4px 6px 3px 4px; font:11px/11px Sans-serif; background-position:right -107px;} - -/* Control Button + Submit Button */ -span.button, -span.button button, -span.button input { position:relative; margin:0; display:inline-block; border:0; font:12px Sans-serif; white-space:nowrap; background:url(../tpl/images/buttonWhite.gif) no-repeat; vertical-align:middle;} -span.button { padding:0; background-position:left top;} -span.button button, -span.button input { height:23px; left:2px; *vertical-align:top; padding:0 10px 0 8px; line-height:24px; background-position:right top; cursor:pointer; *overflow:visible;} -/* Large Size */ -span.button.large { background-position:left -30px;} -span.button.large button, -span.button.large input { height:30px; padding:0 10px 0 8px; font:16px/30px Sans-serif; background-position:right -30px;} -/* xLarge Size */ -span.button.xLarge { background-position:left -65px;} -span.button.xLarge button, -span.button.xLarge input { height:35px; padding:0 10px 0 8px; font:20px/36px Sans-serif; background-position:right -65px;} -/* Small Size */ -span.button.small { background-position:left -107px;} -span.button.small button, -span.button.small input { height:18px; padding:0 6px 0 4px; font:11px/18px Sans-serif; background-position:right -107px;} - -/* Strong Button */ -a.button.strong *, -span.button.strong * { font-weight:bold !important;} - -/* Icon Add */ -a.button .icon { position:relative; border:0; vertical-align:middle;} -span.button .icon { position:relative; left:10px; margin-right:8px; vertical-align:middle;} - -/* Color Preset */ -a.button.green, -a.button.green span, -span.button.green, -span.button.green button, -span.button.green input { background-image:url(../tpl/images/buttonGreen.gif); color:#fff;} -a.button.black, -a.button.black span, -span.button.black, -span.button.black button, -span.button.black input { background-image:url(../tpl/images/buttonBlack.gif); color:#fff;} -a.button.red, -a.button.red span, -span.button.red, -span.button.red button, -span.button.red input { background-image:url(../tpl/images/buttonRed.gif); color:#fff;} -a.button.blue, -a.button.blue span, -span.button.blue, -span.button.blue button, -span.button.blue input { background-image:url(../tpl/images/buttonBlue.gif); color:#fff;} - -/* Offset Debug */ -a.button, -span.button{ margin-right:2px;} - -/* Button Set */ -.buttonSet{ width:16px; height:16px; background-image:url(../tpl/images/buttonSet.gif); background-repeat:no-repeat; border:0; background-color:transparent; vertical-align:middle; display:inline-block; text-decoration:none;} -.buttonSet span{ z-index:-1; font-size:0; line-height:0; visibility:hidden;} -.buttonSet.buttonUp{ background-position:0 0;} -.buttonSet.buttonDown{ background-position:0 -16px;} -.buttonSet.buttonLeft{ background-position:0 -32px;} -.buttonSet.buttonRight{ background-position:0 -48px;} -.buttonSet.buttonInfo{ background-position:0 -64px;} -.buttonSet.buttonCopy{ background-position:0 -80px;} -.buttonSet.buttonSetting{ background-position:0 -96px;} -.buttonSet.buttonActive{ background-position:0 -112px;} -.buttonSet.buttonDisable{ background-position:0 -128px;} -.buttonSet.buttonDelete{ background-position:0 -144px;} -.buttonSet.buttonHomepage{ background-position:0 -160px;} -.buttonSet.buttonBlog{ background-position:0 -176px;} -.buttonSet.buttonCalendar{ background-position:0 -192px;} -.buttonSet.buttonLayoutEditor{ background-position:0 -208px;} -.buttonSet.buttonAddWidget{ background-position:0 -224px;} -.buttonSet.buttonAddContent{ background-position:0 -240px;} - diff --git a/common/css.backup/default.css b/common/css.backup/default.css deleted file mode 100644 index b9e81d058..000000000 --- a/common/css.backup/default.css +++ /dev/null @@ -1,91 +0,0 @@ -/* default.css - Type Selector Definition */ -body { margin:0;padding:0; font-size:.75em;} - -img { border:none; } -label { cursor:pointer; } -form { margin:0; padding:0; } - -/* Special Class Selector */ -.fr { float:right; } -.fl { float:left; } -.clear { clear:both; } -.fwB { font-weight:bold;} -.tCenter { text-align:center; } -.tRight { text-align:right; } -.tLeft { text-align:left; } -.gap1 { margin-top:.8em; } -.nowrap { white-space:nowrap; } - -.iePngFix { behavior:url(./common/js/iePngFix.htc); } -.zbxe_info { vertical-align:middle; behavior:url(./common/js/iePngFix.htc); } - -/* Input Style Definition */ -.inputTypeText { border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; height:1.4em; padding:.2em 0 0 .3em; background:#ffffff; font-size:1em; _font-size:9pt; } -*:first-child+html .inputTypeText { font-size:9pt; } -.inputTypeText:hover, -.inputTypeText:focus { background:#f4f4f4; } -.inputTypeTextArea { border:1px solid !important; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6 !important; background:#ffffff; font-size:1em; _font-size:9pt; height:100px;} -*:first-child+html .inputTypeTextArea { font-size:9pt; } - -.w40 { width:40px; } -.w60 { width:60px; } -.w70 { width:70px; } -.w80 { width:80px; } -.w90 { width:90px; } -.w100 { width:100px; } -.w110 { width:110px; } -.w120 { width:120px; } -.w130 { width:130px; } -.w140 { width:140px; } -.w150 { width:150px; } -.w160 { width:160px; } -.w170 { width:170px; } -.w180 { width:180px; } -.w190 { width:190px; } -.w200 { width:200px; } -.w210 { width:210px; } -.w220 { width:220px; } -.w230 { width:230px; } -.w240 { width:240px; } -.w250 { width:250px; } -.w260 { width:260px; } -.w270 { width:270px; } -.w280 { width:280px; } -.w290 { width:290px; } -.w300 { width:300px; } -.w400 { width:400px; } - -/* editor style */ -a.bold { font-weight:bold; } - -.editor_blue_text { color: #145ff9 !important; text-decoration:underline !important; } -.editor_blue_text a { color: #145ff9 !important; text-decoration:underline !important; } -.editor_red_text { color: #f42126 !important; text-decoration:underline !important; } -.editor_red_text a { color: #f42126 !important; text-decoration:underline !important; } -.editor_yellow_text { color: #c9bd00 !important; text-decoration:underline !important; } -.editor_yellow_text a { color: #c9bd00 !important; text-decoration:underline !important; } -.editor_green_text { color: #08830B !important; text-decoration:underline !important; } -.editor_green_text a { color: #08830B !important; text-decoration:underline !important; } - -.folder_opener { display: block; } -.folder_closer { display: none; } -.folder_area { display: none; } - -.xe_content { line-height:1.6; overflow:hidden; } - -.zbxe_widget_output { background:url(../tpl/images/widget_text.gif) no-repeat center bottom; display:block;} - -/* xe layer */ -#waitingforserverresponse { border:2px solid #444444; font-weight:bold; color:#444444; padding: 7px 5px 5px 25px; background:#FFFFFF url("../tpl/images/loading.gif") no-repeat 5px 5px; top:40px; left:40px; position:absolute; z-index:100; visibility:hidden; } - -#popup_menu_area{ position:absolute; background:#fff; border:2px solid #eee; -moz-border-radius:5px; -webkit-border-radius:5px; margin:0; padding:0;} -#popup_menu_area *{ margin:0; padding:0; list-style:none; font-size:12px; line-height:normal;} -#popup_menu_area ul{ border:1px solid #ddd; -moz-border-radius:5px; -webkit-border-radius:5px; padding:10px 10px 5px 10px;} -#popup_menu_area li{ padding:2px 0 2px 20px; background-repeat:no-repeat; background-position:left center; margin-bottom:3px; white-space:nowrap;} -#popup_menu_area li a{ text-decoration:none; color:#000;} -#popup_menu_area li a:hover, -#popup_menu_area li a:active, -#popup_menu_area li a:focus{ font-weight:bold; letter-spacing:-1px;} - -/* xe faceoff */ -.faceOffManager { position:fixed; _position:absolute; right:3px; top:3px; height:23px; } diff --git a/common/css.backup/minify.ini b/common/css.backup/minify.ini deleted file mode 100644 index c52670b7f..000000000 --- a/common/css.backup/minify.ini +++ /dev/null @@ -1,7 +0,0 @@ -[skip] -button.css -default.css - -[merge >> xe.css] -default.css -button.css diff --git a/common/css.backup/popup.css b/common/css.backup/popup.css deleted file mode 100644 index 6b558e507..000000000 --- a/common/css.backup/popup.css +++ /dev/null @@ -1,2 +0,0 @@ -body { overflow:hidden; } -table.colTable { margin:0; } diff --git a/common/css.backup/xe.css b/common/css.backup/xe.css deleted file mode 100644 index b9e81d058..000000000 --- a/common/css.backup/xe.css +++ /dev/null @@ -1,91 +0,0 @@ -/* default.css - Type Selector Definition */ -body { margin:0;padding:0; font-size:.75em;} - -img { border:none; } -label { cursor:pointer; } -form { margin:0; padding:0; } - -/* Special Class Selector */ -.fr { float:right; } -.fl { float:left; } -.clear { clear:both; } -.fwB { font-weight:bold;} -.tCenter { text-align:center; } -.tRight { text-align:right; } -.tLeft { text-align:left; } -.gap1 { margin-top:.8em; } -.nowrap { white-space:nowrap; } - -.iePngFix { behavior:url(./common/js/iePngFix.htc); } -.zbxe_info { vertical-align:middle; behavior:url(./common/js/iePngFix.htc); } - -/* Input Style Definition */ -.inputTypeText { border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; height:1.4em; padding:.2em 0 0 .3em; background:#ffffff; font-size:1em; _font-size:9pt; } -*:first-child+html .inputTypeText { font-size:9pt; } -.inputTypeText:hover, -.inputTypeText:focus { background:#f4f4f4; } -.inputTypeTextArea { border:1px solid !important; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6 !important; background:#ffffff; font-size:1em; _font-size:9pt; height:100px;} -*:first-child+html .inputTypeTextArea { font-size:9pt; } - -.w40 { width:40px; } -.w60 { width:60px; } -.w70 { width:70px; } -.w80 { width:80px; } -.w90 { width:90px; } -.w100 { width:100px; } -.w110 { width:110px; } -.w120 { width:120px; } -.w130 { width:130px; } -.w140 { width:140px; } -.w150 { width:150px; } -.w160 { width:160px; } -.w170 { width:170px; } -.w180 { width:180px; } -.w190 { width:190px; } -.w200 { width:200px; } -.w210 { width:210px; } -.w220 { width:220px; } -.w230 { width:230px; } -.w240 { width:240px; } -.w250 { width:250px; } -.w260 { width:260px; } -.w270 { width:270px; } -.w280 { width:280px; } -.w290 { width:290px; } -.w300 { width:300px; } -.w400 { width:400px; } - -/* editor style */ -a.bold { font-weight:bold; } - -.editor_blue_text { color: #145ff9 !important; text-decoration:underline !important; } -.editor_blue_text a { color: #145ff9 !important; text-decoration:underline !important; } -.editor_red_text { color: #f42126 !important; text-decoration:underline !important; } -.editor_red_text a { color: #f42126 !important; text-decoration:underline !important; } -.editor_yellow_text { color: #c9bd00 !important; text-decoration:underline !important; } -.editor_yellow_text a { color: #c9bd00 !important; text-decoration:underline !important; } -.editor_green_text { color: #08830B !important; text-decoration:underline !important; } -.editor_green_text a { color: #08830B !important; text-decoration:underline !important; } - -.folder_opener { display: block; } -.folder_closer { display: none; } -.folder_area { display: none; } - -.xe_content { line-height:1.6; overflow:hidden; } - -.zbxe_widget_output { background:url(../tpl/images/widget_text.gif) no-repeat center bottom; display:block;} - -/* xe layer */ -#waitingforserverresponse { border:2px solid #444444; font-weight:bold; color:#444444; padding: 7px 5px 5px 25px; background:#FFFFFF url("../tpl/images/loading.gif") no-repeat 5px 5px; top:40px; left:40px; position:absolute; z-index:100; visibility:hidden; } - -#popup_menu_area{ position:absolute; background:#fff; border:2px solid #eee; -moz-border-radius:5px; -webkit-border-radius:5px; margin:0; padding:0;} -#popup_menu_area *{ margin:0; padding:0; list-style:none; font-size:12px; line-height:normal;} -#popup_menu_area ul{ border:1px solid #ddd; -moz-border-radius:5px; -webkit-border-radius:5px; padding:10px 10px 5px 10px;} -#popup_menu_area li{ padding:2px 0 2px 20px; background-repeat:no-repeat; background-position:left center; margin-bottom:3px; white-space:nowrap;} -#popup_menu_area li a{ text-decoration:none; color:#000;} -#popup_menu_area li a:hover, -#popup_menu_area li a:active, -#popup_menu_area li a:focus{ font-weight:bold; letter-spacing:-1px;} - -/* xe faceoff */ -.faceOffManager { position:fixed; _position:absolute; right:3px; top:3px; height:23px; } diff --git a/common/css.backup/xe.min.css b/common/css.backup/xe.min.css deleted file mode 100644 index fc1bb3af2..000000000 --- a/common/css.backup/xe.min.css +++ /dev/null @@ -1 +0,0 @@ -body{margin:0;padding:0;font-size:.75em}img{border:none}label{cursor:pointer}form{margin:0;padding:0}.fr{float:right}.fl{float:left}.clear{clear:both}.fwB{font-weight:bold}.tCenter{text-align:center}.tRight{text-align:right}.tLeft{text-align:left}.gap1{margin-top:.8em}.nowrap{white-space:nowrap}.iePngFix{behavior:url(./common/js/iePngFix.htc)}.zbxe_info{vertical-align:middle;behavior:url(./common/js/iePngFix.htc)}.inputTypeText{border:1px solid;border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6;height:1.4em;padding:.2em 0 0 .3em;background:#ffffff;font-size:1em;_font-size:9pt}*:first-child+html .inputTypeText{font-size:9pt}.inputTypeText:hover,.inputTypeText:focus{background:#f4f4f4}.inputTypeTextArea{border:1px solid !important;border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6 !important;background:#ffffff;font-size:1em;_font-size:9pt;height:100px}*:first-child+html .inputTypeTextArea{font-size:9pt}.w40{width:40px}.w60{width:60px}.w70{width:70px}.w80{width:80px}.w90{width:90px}.w100{width:100px}.w110{width:110px}.w120{width:120px}.w130{width:130px}.w140{width:140px}.w150{width:150px}.w160{width:160px}.w170{width:170px}.w180{width:180px}.w190{width:190px}.w200{width:200px}.w210{width:210px}.w220{width:220px}.w230{width:230px}.w240{width:240px}.w250{width:250px}.w260{width:260px}.w270{width:270px}.w280{width:280px}.w290{width:290px}.w300{width:300px}.w400{width:400px}a.bold{font-weight:bold}.editor_blue_text{color:#145ff9 !important;text-decoration:underline !important}.editor_blue_text a{color:#145ff9 !important;text-decoration:underline !important}.editor_red_text{color:#f42126 !important;text-decoration:underline !important}.editor_red_text a{color:#f42126 !important;text-decoration:underline !important}.editor_yellow_text{color:#c9bd00 !important;text-decoration:underline !important}.editor_yellow_text a{color:#c9bd00 !important;text-decoration:underline !important}.editor_green_text{color:#08830B !important;text-decoration:underline !important}.editor_green_text a{color:#08830B !important;text-decoration:underline !important}.folder_opener{display:block}.folder_closer{display:none}.folder_area{display:none}.xe_content{line-height:1.6;overflow:hidden}.zbxe_widget_output{background:url(../tpl/images/widget_text.gif) no-repeat center bottom;display:block}#waitingforserverresponse{border:2px solid #444444;font-weight:bold;color:#444444;padding:7px 5px 5px 25px;background:#FFFFFF url("../tpl/images/loading.gif") no-repeat 5px 5px;top:40px;left:40px;position:absolute;z-index:100;visibility:hidden}#popup_menu_area{position:absolute;background:#fff;border:2px solid #eee;-moz-border-radius:5px;-webkit-border-radius:5px;margin:0;padding:0}#popup_menu_area *{margin:0;padding:0;list-style:none;font-size:12px;line-height:normal}#popup_menu_area ul{border:1px solid #ddd;-moz-border-radius:5px;-webkit-border-radius:5px;padding:10px 10px 5px 10px}#popup_menu_area li{padding:2px 0 2px 20px;background-repeat:no-repeat;background-position:left center;margin-bottom:3px;white-space:nowrap}#popup_menu_area li a{text-decoration:none;color:#000}#popup_menu_area li a:hover,#popup_menu_area li a:active,#popup_menu_area li a:focus{font-weight:bold;letter-spacing:-1px}.faceOffManager{position:fixed;_position:absolute;right:3px;top:3px;height:23px} \ No newline at end of file From 702e92b9bf95245cae653cffd9c364be595e74c7 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Tue, 20 Sep 2011 09:39:29 +0000 Subject: [PATCH 0783/1372] HTML5 xml:lang attribute removed. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9239 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/tpl/common_layout.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/common/tpl/common_layout.html b/common/tpl/common_layout.html index 85ebd2eb0..e82729648 100644 --- a/common/tpl/common_layout.html +++ b/common/tpl/common_layout.html @@ -4,10 +4,11 @@ } + - + From 41495267b98d247fe1dad8794d0c4d8a3b73dad2 Mon Sep 17 00:00:00 2001 From: flyskyko Date: Tue, 20 Sep 2011 09:59:43 +0000 Subject: [PATCH 0784/1372] issue 160, fix a bug for garbled text after copy module instance git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9240 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/communication/communication.controller.php | 12 ++++++++++++ modules/editor/editor.admin.controller.php | 3 +++ modules/install/install.view.php | 1 + modules/member/member.admin.controller.php | 3 +++ modules/module/module.admin.controller.php | 9 +++++++++ modules/trackback/trackback.controller.php | 3 +++ 6 files changed, 31 insertions(+) diff --git a/modules/communication/communication.controller.php b/modules/communication/communication.controller.php index e440cfda9..2c876b4a8 100644 --- a/modules/communication/communication.controller.php +++ b/modules/communication/communication.controller.php @@ -83,8 +83,11 @@ if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) { global $lang; + htmlHeader(); alertScript($lang->success_sended); closePopupScript(); + htmlFooter(); + Context::close(); exit; } return $output; @@ -266,8 +269,11 @@ if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) { global $lang; + htmlHeader(); alertScript($lang->success_registed); closePopupScript(); + htmlFooter(); + Context::close(); exit; } } @@ -374,8 +380,11 @@ { if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) { global $lang; + htmlHeader(); alertScript($lang->fail_to_registed); closePopupScript(); + htmlFooter(); + Context::close(); exit; } else return $output; @@ -384,9 +393,12 @@ { if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) { global $lang; + htmlHeader(); alertScript($lang->success_registed); reload(true); closePopupScript(); + htmlFooter(); + Context::close(); exit; } else $this->setMessage($msg_code); diff --git a/modules/editor/editor.admin.controller.php b/modules/editor/editor.admin.controller.php index f0f906958..3de0f68b0 100644 --- a/modules/editor/editor.admin.controller.php +++ b/modules/editor/editor.admin.controller.php @@ -106,9 +106,12 @@ $this->setMessage('success_updated'); if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) { global $lang; + htmlHeader(); alertScript($lang->success_updated); reload(true); closePopupScript(); + htmlFooter(); + Context::close(); exit; } } diff --git a/modules/install/install.view.php b/modules/install/install.view.php index 8056b6927..7393f3931 100644 --- a/modules/install/install.view.php +++ b/modules/install/install.view.php @@ -37,6 +37,7 @@ $oInstallController = &getController('install'); $oInstallController->procInstall(); header("location: ./"); + Context::close(); exit; } } diff --git a/modules/member/member.admin.controller.php b/modules/member/member.admin.controller.php index 612a4ee36..d7dd291bd 100644 --- a/modules/member/member.admin.controller.php +++ b/modules/member/member.admin.controller.php @@ -587,9 +587,12 @@ if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) { global $lang; + htmlHeader(); alertScript($lang->success_updated); reload(true); closePopupScript(); + htmlFooter(); + Context::close(); exit; } } diff --git a/modules/module/module.admin.controller.php b/modules/module/module.admin.controller.php index a7ce562c2..84e0a6f77 100644 --- a/modules/module/module.admin.controller.php +++ b/modules/module/module.admin.controller.php @@ -144,9 +144,12 @@ $this->setMessage('success_registed'); if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) { global $lang; + htmlHeader(); alertScript($lang->success_registed); reload(true); closePopupScript(); + htmlFooter(); + Context::close(); exit; } } @@ -347,8 +350,11 @@ $this->setMessage('success_registed'); if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) { global $lang; + htmlHeader(); alertScript($lang->success_registed); closePopupScript(); + htmlFooter(); + Context::close(); exit; } } @@ -417,8 +423,11 @@ $this->setMessage('success_registed'); if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) { global $lang; + htmlHeader(); alertScript($lang->success_registed); closePopupScript(); + htmlFooter(); + Context::close(); exit; } } diff --git a/modules/trackback/trackback.controller.php b/modules/trackback/trackback.controller.php index 89d5433c2..63b82d146 100644 --- a/modules/trackback/trackback.controller.php +++ b/modules/trackback/trackback.controller.php @@ -38,9 +38,12 @@ $output = $this->sendTrackback($oDocument, $trackback_url, $charset); if($output->toBool() && !in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) { global $lang; + htmlHeader(); alertScript($lang->success_registed); reload(true); closePopupScript(); + htmlFooter(); + Context::close(); exit; } return $output; From 705bc2523d86935eb5f60bf69b0cf349a15e599b Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Tue, 20 Sep 2011 10:02:10 +0000 Subject: [PATCH 0785/1372] Message module UI enhancement. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9241 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/message/skins/default/message.css | 58 +++++++++---------- .../message/skins/default/system_message.html | 39 ++----------- 2 files changed, 32 insertions(+), 65 deletions(-) diff --git a/modules/message/skins/default/message.css b/modules/message/skins/default/message.css index 31f23693c..441dd0e35 100644 --- a/modules/message/skins/default/message.css +++ b/modules/message/skins/default/message.css @@ -1,39 +1,33 @@ @charset "utf-8"; /* NHN | dece24@nhncorp.com */ -#loginAccess{ position:relative; width:384px; border:2px solid #757575; margin:30px auto; padding:20px 0 0 0; background:#fff; font-size:12px; font-family:Tahoma; line-height:normal;} -#loginAccess form{ margin:0; padding:0;} -#loginAccess fieldset{ border:0; margin:0; padding:0;} -#loginAccess h1{ margin:0 28px 20px 28px; font-size:12px; color:#e77161;} -#loginAccess ul{ margin:0; padding:0; list-style:none;} -#loginAccess .mLogin{ display:none;} -#loginAccess .idpw{ margin:0 28px 20px 28px;} -#loginAccess .oid{ margin:0 28px 20px 28px;} -#loginAccess .idpw li{ margin:0 0 5px 0;} -#loginAccess .inputText{ font-size:12px; height:22px; color:#767676; font-weight:bold; border:1px solid #b7b7b7; border-right-color:#e1e1e1; border-bottom-color:#e1e1e1;} -#loginAccess .idpw .inputText{ width:316px; padding:8px 0 0 10px;} -#loginAccess .oid .inputText{ width:291px; padding:8px 0 0 35px; background:url(./images/openid_login_bg.gif) no-repeat 10px center;} -#loginAccess .inputCheck{ width:13px; height:13px; margin:0; padding:0; vertical-align:middle;} -#loginAccess label{ vertical-align:middle;} -#loginAccess #warning{ display:none; margin:0 0 20px 0;} -#loginAccess #warning.open{ display:block;} -#loginAccess #warning p{ margin:0;} -#loginAccess .buttonArea{ position:relative; margin:0 28px; padding:0; color:#767676; *zoom:1;} -#loginAccess .buttonArea .keeping{ position:relative; margin:0 0 20px 0; height:32px; line-height:32px;} -#loginAccess #gLogin .buttonArea .buttonAccount{ position:absolute; top:0; right:0;} -#loginAccess #oLogin .buttonArea{ text-align:center; margin-bottom:20px;} +#loginAccess{position:relative;width:384px;border:2px solid #757575;margin:30px auto;padding:20px 0 0 0;background:#fff;font-size:12px;font-family:Tahoma;line-height:normal;border-radius:5px;box-shadow:0 0 10px #ccc} +#loginAccess form{margin:0;padding:0} +#loginAccess fieldset{border:0;margin:0;padding:0} +#loginAccess h1{margin:0 28px 20px 28px;font-size:12px;color:#e77161} +#loginAccess ul{margin:0;padding:0;list-style:none} +#loginAccess .idpw{margin:0 28px 20px 28px} +#loginAccess .idpw li{margin:0 0 5px 0} +#loginAccess .inputText{font-size:12px;height:22px;color:#767676;font-weight:bold;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1} +#loginAccess .idpw .inputText{width:316px;padding:8px 0 0 10px} +#loginAccess .inputCheck{width:13px;height:13px;margin:0;padding:0;vertical-align:middle} +#loginAccess label{vertical-align:middle} +#loginAccess #warning{display:none;margin:0 0 20px 0} +#loginAccess #warning.open{display:block} +#loginAccess #warning p{margin:0} +#loginAccess .buttonArea{position:relative;margin:0 28px;padding:0;color:#767676;*zoom:1} +#loginAccess .buttonArea .keeping{position:relative;margin:0 0 20px 0;height:32px;line-height:32px} +#loginAccess #gLogin .buttonArea .buttonAccount{position:absolute;top:0;right:0} #loginAccess .buttonAccount, #loginAccess .buttonAccount a, -#loginAccess .buttonAccount input{ position:relative; display:inline-block; margin:0; padding:0; overflow:visible; height:32px; line-height:32px; font-size:12px; font-weight:bold; color:#fff; vertical-align:middle; cursor:pointer; border:0; text-decoration:none !important; background:transparent url(./images/buttonAction.gif) no-repeat;} -#loginAccess .buttonAccount{ margin:0 4px 0 0; background-position:left top;} +#loginAccess .buttonAccount input{position:relative;display:inline-block;margin:0;padding:0;overflow:visible;height:32px;line-height:32px;font-size:12px;font-weight:bold;color:#fff;vertical-align:middle;cursor:pointer;border:0;text-decoration:none !important;background:transparent url(./images/buttonAction.gif) no-repeat} +#loginAccess .buttonAccount{margin:0 4px 0 0;background-position:left top} #loginAccess .buttonAccount a, -#loginAccess .buttonAccount input{ left:4px; background-position:right top; *vertical-align:top; padding:0 24px 0 36px;} -#loginAccess .help{ position:relative; padding:15px 0; background:#fafafa; border-top:1px solid #d9d9d9; text-align:center;} -#loginAccess .help li{ display:inline; border-left:1px solid #c3c3c3; padding:0 0 0 10px; margin:0 6px 0 0; line-height:1;} -#loginAccess .help li.first{ border:0; padding:0;} -#loginAccess .help a{ text-decoration:none; color:#333;} +#loginAccess .buttonAccount input{left:4px;background-position:right top;vertical-align:top;padding:0 24px 0 36px} +#loginAccess .help{position:relative;padding:15px 0;background:#fafafa;border-top:1px solid #d9d9d9;text-align:center;border-radius:0 0 5px 5px} +#loginAccess .help li{display:inline;border-left:1px solid #c3c3c3;padding:0 0 0 10px;margin:0 6px 0 0;line-height:1} +#loginAccess .help li.first{border:0;padding:0} +#loginAccess .help a{text-decoration:none;color:#333} #loginAccess .help a:hover, #loginAccess .help a:active, -#loginAccess .help a:focus{ text-decoration:underline;} -#loginAccess .logOut{ text-align:left; margin:0 28px; padding:0 0 20px 0;} -.gLogin #gLogin, -.oLogin #oLogin{ display:block;} \ No newline at end of file +#loginAccess .help a:focus{text-decoration:underline} +#loginAccess .logOut{text-align:left;margin:0 28px;padding:0 0 20px 0} diff --git a/modules/message/skins/default/system_message.html b/modules/message/skins/default/system_message.html index 602117b72..f34f6732b 100644 --- a/modules/message/skins/default/system_message.html +++ b/modules/message/skins/default/system_message.html @@ -1,14 +1,13 @@ - + + + +

                              {$XE_VALIDATOR_MESSAGE}

                              {$system_message}

                              - - - - -
                              + - - - -
                              - - - - -
                              -
                              - -
                              -
                              - -
                              -
                              - - -
                              - - - - From 0cc9b2e47035594f941e861cbef48997eab2dce1 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Tue, 20 Sep 2011 10:23:23 +0000 Subject: [PATCH 0786/1372] Page module UI enhancement. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9242 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- .../editor/skins/xpresseditor/css/default.css | 2 +- modules/install/script/ko.install.php | 2 +- .../welcome_content/welcome_content_en.html | 46 ++++++++--------- .../welcome_content/welcome_content_es.html | 46 ++++++++--------- .../welcome_content/welcome_content_fr.html | 46 ++++++++--------- .../welcome_content/welcome_content_jp.html | 50 ++++++++----------- .../welcome_content/welcome_content_ko.html | 46 ++++++++--------- .../welcome_content/welcome_content_mn.html | 46 ++++++++--------- .../welcome_content/welcome_content_ru.html | 46 ++++++++--------- .../welcome_content/welcome_content_tr.html | 46 ++++++++--------- .../welcome_content/welcome_content_vi.html | 46 ++++++++--------- .../welcome_content_zh-CN.html | 46 ++++++++--------- .../welcome_content_zh-TW.html | 46 ++++++++--------- modules/page/skins/default/content.html | 21 ++++---- modules/page/tpl/article_content_modify.html | 6 +-- 15 files changed, 236 insertions(+), 305 deletions(-) diff --git a/modules/editor/skins/xpresseditor/css/default.css b/modules/editor/skins/xpresseditor/css/default.css index 03bdeeb79..9d32426c3 100644 --- a/modules/editor/skins/xpresseditor/css/default.css +++ b/modules/editor/skins/xpresseditor/css/default.css @@ -64,7 +64,7 @@ .xpress-editor .tool ul.extra2{ width:auto; z-index:2;} .xpress-editor .tool ul.extra3{ float:right; width:auto; z-index:1; margin-right:1px;} .xpress-editor .tool ul.extra3 li{ margin-right:4px;} -.xpress-editor .tool li{ position:relative; float:left;} +.xpress-editor .tool li{ position:relative; float:left; margin:0 !important} .xpress-editor .tool li button{ width:21px; height:21px; background:url(../img/btn_set.gif) no-repeat 0 0; vertical-align:top;} .xpress-editor.black .tool li button{ width:21px; height:21px; background:url(../img/btn_set.black.gif) no-repeat 0 0; vertical-align:top;} .xpress-editor .tool li button span{ position:absolute; top:0; left:0; width:0; height:0; overflow:hidden; visibility:hidden;} diff --git a/modules/install/script/ko.install.php b/modules/install/script/ko.install.php index 4be125343..ffdc8f534 100644 --- a/modules/install/script/ko.install.php +++ b/modules/install/script/ko.install.php @@ -85,7 +85,7 @@ $obj->module_srl = $module_srl; Context::set('version', __ZBXE_VERSION__); - $obj->title = 'welcome_document'; + $obj->title = 'Welcome XE'; $obj->content = $oTemplateHandler->compile('./modules/install/script/welcome_content', 'welcome_content_'.$lang); diff --git a/modules/install/script/welcome_content/welcome_content_en.html b/modules/install/script/welcome_content/welcome_content_en.html index b88945202..1c0398c4c 100644 --- a/modules/install/script/welcome_content/welcome_content_en.html +++ b/modules/install/script/welcome_content/welcome_content_en.html @@ -1,26 +1,20 @@ -
                              -
                              -
                              -

                              XE core '{$version}' has been successfully installed!

                              -

                              We recommend you to delete this demo page before launching the site.
                              Please check the following list to verify whether the installation has been properly completed.
                              You can see all the components on the administration page.

                              -
                                -
                              1. - When the layout has been successfully installed, you can see the screen containing a header, a content body, and a footer. -
                              2. -
                              3. - When Menu module has been successfully installed, you can see both global and local navigations. -
                              4. -
                              5. - When Integrated Search module has been successfully installed, you can see the search form. -
                              6. -
                              7. - When Login widget has been successfully installed, you can see the login form. -
                              8. -
                              9. - When Page module has been successfully installed, you see this page. -
                              10. -
                              -

                              You can replace it with some other module on the Settings page.

                              -
                              -
                              -
                              +

                              XE core '{$version}' has been successfully installed!

                              +

                              We recommend you to delete this demo page before launching the site.
                              Please check the following list to verify whether the installation has been properly completed.
                              You can see all the components on the administration page.

                              +
                                +
                              1. + When the layout has been successfully installed, you can see the screen containing a header, a content body, and a footer. +
                              2. +
                              3. + When Menu module has been successfully installed, you can see both global and local navigations. +
                              4. +
                              5. + When Integrated Search module has been successfully installed, you can see the search form. +
                              6. +
                              7. + When Login widget has been successfully installed, you can see the login form. +
                              8. +
                              9. + When Page module has been successfully installed, you see this page. +
                              10. +
                              +

                              You can replace it with some other module on the Settings page.

                              diff --git a/modules/install/script/welcome_content/welcome_content_es.html b/modules/install/script/welcome_content/welcome_content_es.html index b88945202..1c0398c4c 100644 --- a/modules/install/script/welcome_content/welcome_content_es.html +++ b/modules/install/script/welcome_content/welcome_content_es.html @@ -1,26 +1,20 @@ -
                              -
                              -
                              -

                              XE core '{$version}' has been successfully installed!

                              -

                              We recommend you to delete this demo page before launching the site.
                              Please check the following list to verify whether the installation has been properly completed.
                              You can see all the components on the administration page.

                              -
                                -
                              1. - When the layout has been successfully installed, you can see the screen containing a header, a content body, and a footer. -
                              2. -
                              3. - When Menu module has been successfully installed, you can see both global and local navigations. -
                              4. -
                              5. - When Integrated Search module has been successfully installed, you can see the search form. -
                              6. -
                              7. - When Login widget has been successfully installed, you can see the login form. -
                              8. -
                              9. - When Page module has been successfully installed, you see this page. -
                              10. -
                              -

                              You can replace it with some other module on the Settings page.

                              -
                              -
                              -
                              +

                              XE core '{$version}' has been successfully installed!

                              +

                              We recommend you to delete this demo page before launching the site.
                              Please check the following list to verify whether the installation has been properly completed.
                              You can see all the components on the administration page.

                              +
                                +
                              1. + When the layout has been successfully installed, you can see the screen containing a header, a content body, and a footer. +
                              2. +
                              3. + When Menu module has been successfully installed, you can see both global and local navigations. +
                              4. +
                              5. + When Integrated Search module has been successfully installed, you can see the search form. +
                              6. +
                              7. + When Login widget has been successfully installed, you can see the login form. +
                              8. +
                              9. + When Page module has been successfully installed, you see this page. +
                              10. +
                              +

                              You can replace it with some other module on the Settings page.

                              diff --git a/modules/install/script/welcome_content/welcome_content_fr.html b/modules/install/script/welcome_content/welcome_content_fr.html index b88945202..1c0398c4c 100644 --- a/modules/install/script/welcome_content/welcome_content_fr.html +++ b/modules/install/script/welcome_content/welcome_content_fr.html @@ -1,26 +1,20 @@ -
                              -
                              -
                              -

                              XE core '{$version}' has been successfully installed!

                              -

                              We recommend you to delete this demo page before launching the site.
                              Please check the following list to verify whether the installation has been properly completed.
                              You can see all the components on the administration page.

                              -
                                -
                              1. - When the layout has been successfully installed, you can see the screen containing a header, a content body, and a footer. -
                              2. -
                              3. - When Menu module has been successfully installed, you can see both global and local navigations. -
                              4. -
                              5. - When Integrated Search module has been successfully installed, you can see the search form. -
                              6. -
                              7. - When Login widget has been successfully installed, you can see the login form. -
                              8. -
                              9. - When Page module has been successfully installed, you see this page. -
                              10. -
                              -

                              You can replace it with some other module on the Settings page.

                              -
                              -
                              -
                              +

                              XE core '{$version}' has been successfully installed!

                              +

                              We recommend you to delete this demo page before launching the site.
                              Please check the following list to verify whether the installation has been properly completed.
                              You can see all the components on the administration page.

                              +
                                +
                              1. + When the layout has been successfully installed, you can see the screen containing a header, a content body, and a footer. +
                              2. +
                              3. + When Menu module has been successfully installed, you can see both global and local navigations. +
                              4. +
                              5. + When Integrated Search module has been successfully installed, you can see the search form. +
                              6. +
                              7. + When Login widget has been successfully installed, you can see the login form. +
                              8. +
                              9. + When Page module has been successfully installed, you see this page. +
                              10. +
                              +

                              You can replace it with some other module on the Settings page.

                              diff --git a/modules/install/script/welcome_content/welcome_content_jp.html b/modules/install/script/welcome_content/welcome_content_jp.html index 26056c39c..c4ae50fe4 100644 --- a/modules/install/script/welcome_content/welcome_content_jp.html +++ b/modules/install/script/welcome_content/welcome_content_jp.html @@ -1,28 +1,22 @@ -
                              -
                              -
                              -

                              XE core '{$version}' has been successfully installed!

                              -

                              ウェブサイトを始める前にこのページを削除してください。
                              以下のリストの格項目をチェックして設置状態を確認することができます。
                              管理ページから全てのコンポネントを確認することができます。

                              -
                                -
                              1. - 画面の構成から header, body, footerが見えたら、レイアウトは正常に設置されたことです。 -
                              2. -
                              3. - 画面上端と左に位置する二つのメニューが見えたら、メニューモジュールは正常に設置されたことです -
                              4. -
                              5. - 画面右上端に検索ボックスが見えたら、統合検索モジュールは正常に設置されたことです -
                              6. -
                              7. - 画面左端にログインボックスが見えたら、ログインウィジェットは正常に設置されたことです -
                              8. -
                              9. - このページが読めたら、ページモジュールは正常に設置されたことです -
                              10. -
                              -

                              - 設定ページで他のページを初期起動モジュールにセッティングすることができます。 -

                              -
                              -
                              -
                              +

                              XE core '{$version}' has been successfully installed!

                              +

                              ウェブサイトを始める前にこのページを削除してください。
                              以下のリストの格項目をチェックして設置状態を確認することができます。
                              管理ページから全てのコンポネントを確認することができます。

                              +
                                +
                              1. + 画面の構成から header, body, footerが見えたら、レイアウトは正常に設置されたことです。 +
                              2. +
                              3. + 画面上端と左に位置する二つのメニューが見えたら、メニューモジュールは正常に設置されたことです +
                              4. +
                              5. + 画面右上端に検索ボックスが見えたら、統合検索モジュールは正常に設置されたことです +
                              6. +
                              7. + 画面左端にログインボックスが見えたら、ログインウィジェットは正常に設置されたことです +
                              8. +
                              9. + このページが読めたら、ページモジュールは正常に設置されたことです +
                              10. +
                              +

                              + 設定ページで他のページを初期起動モジュールにセッティングすることができます。 +

                              diff --git a/modules/install/script/welcome_content/welcome_content_ko.html b/modules/install/script/welcome_content/welcome_content_ko.html index 59935e56a..8f85c2201 100644 --- a/modules/install/script/welcome_content/welcome_content_ko.html +++ b/modules/install/script/welcome_content/welcome_content_ko.html @@ -1,26 +1,20 @@ -
                              -
                              -
                              -

                              XE core '{$version}' 설치를 환영합니다!

                              -

                              XE core설치가 성공적으로 완료되었습니다.
                              이 페이지는 데모 페이지 이므로 추후 사이트 운영시 삭제 가능합니다.
                              모든 설치요소는 관리자로 로그인하셔야 확인할 수 있습니다.

                              -
                                -
                              1. - 헤더, 본문, 풋터로 구성된 화면이 보인다면 레이아웃이 정상적으로 설치된 것입니다. -
                              2. -
                              3. - 글로벌 네비게이션로컬 네비게이션이 보인다면 메뉴 모듈이 설치된 것입니다. -
                              4. -
                              5. - 통합 검색 인풋이 보인다면 통합검색 모듈이 설치된 것입니다. -
                              6. -
                              7. - 로그인 인풋이 보인다면 로그인 정보 출력 위젯이 설치된 것입니다. -
                              8. -
                              9. - 이 메시지가 보인다면 페이지 모듈이 설치된 것입니다. -
                              10. -
                              -

                              페이지 모듈이 시작 모듈로 지정되어 있습니다. 관리자 설정화면에서 변경 가능합니다.

                              -
                              -
                              -
                              +

                              XE core '{$version}' 설치를 환영합니다!

                              +

                              XE core설치가 성공적으로 완료되었습니다.
                              이 페이지는 데모 페이지 이므로 추후 사이트 운영시 삭제 가능합니다.
                              모든 설치요소는 관리자로 로그인하셔야 확인할 수 있습니다.

                              +
                                +
                              1. + 헤더, 본문, 풋터로 구성된 화면이 보인다면 레이아웃이 정상적으로 설치된 것입니다. +
                              2. +
                              3. + 글로벌 네비게이션로컬 네비게이션이 보인다면 메뉴 모듈이 설치된 것입니다. +
                              4. +
                              5. + 통합 검색 인풋이 보인다면 통합검색 모듈이 설치된 것입니다. +
                              6. +
                              7. + 로그인 인풋이 보인다면 로그인 정보 출력 위젯이 설치된 것입니다. +
                              8. +
                              9. + 이 메시지가 보인다면 페이지 모듈이 설치된 것입니다. +
                              10. +
                              +

                              페이지 모듈이 시작 모듈로 지정되어 있습니다. 관리자 설정화면에서 변경 가능합니다.

                              diff --git a/modules/install/script/welcome_content/welcome_content_mn.html b/modules/install/script/welcome_content/welcome_content_mn.html index b88945202..1c0398c4c 100644 --- a/modules/install/script/welcome_content/welcome_content_mn.html +++ b/modules/install/script/welcome_content/welcome_content_mn.html @@ -1,26 +1,20 @@ -
                              -
                              -
                              -

                              XE core '{$version}' has been successfully installed!

                              -

                              We recommend you to delete this demo page before launching the site.
                              Please check the following list to verify whether the installation has been properly completed.
                              You can see all the components on the administration page.

                              -
                                -
                              1. - When the layout has been successfully installed, you can see the screen containing a header, a content body, and a footer. -
                              2. -
                              3. - When Menu module has been successfully installed, you can see both global and local navigations. -
                              4. -
                              5. - When Integrated Search module has been successfully installed, you can see the search form. -
                              6. -
                              7. - When Login widget has been successfully installed, you can see the login form. -
                              8. -
                              9. - When Page module has been successfully installed, you see this page. -
                              10. -
                              -

                              You can replace it with some other module on the Settings page.

                              -
                              -
                              -
                              +

                              XE core '{$version}' has been successfully installed!

                              +

                              We recommend you to delete this demo page before launching the site.
                              Please check the following list to verify whether the installation has been properly completed.
                              You can see all the components on the administration page.

                              +
                                +
                              1. + When the layout has been successfully installed, you can see the screen containing a header, a content body, and a footer. +
                              2. +
                              3. + When Menu module has been successfully installed, you can see both global and local navigations. +
                              4. +
                              5. + When Integrated Search module has been successfully installed, you can see the search form. +
                              6. +
                              7. + When Login widget has been successfully installed, you can see the login form. +
                              8. +
                              9. + When Page module has been successfully installed, you see this page. +
                              10. +
                              +

                              You can replace it with some other module on the Settings page.

                              diff --git a/modules/install/script/welcome_content/welcome_content_ru.html b/modules/install/script/welcome_content/welcome_content_ru.html index b88945202..1c0398c4c 100644 --- a/modules/install/script/welcome_content/welcome_content_ru.html +++ b/modules/install/script/welcome_content/welcome_content_ru.html @@ -1,26 +1,20 @@ -
                              -
                              -
                              -

                              XE core '{$version}' has been successfully installed!

                              -

                              We recommend you to delete this demo page before launching the site.
                              Please check the following list to verify whether the installation has been properly completed.
                              You can see all the components on the administration page.

                              -
                                -
                              1. - When the layout has been successfully installed, you can see the screen containing a header, a content body, and a footer. -
                              2. -
                              3. - When Menu module has been successfully installed, you can see both global and local navigations. -
                              4. -
                              5. - When Integrated Search module has been successfully installed, you can see the search form. -
                              6. -
                              7. - When Login widget has been successfully installed, you can see the login form. -
                              8. -
                              9. - When Page module has been successfully installed, you see this page. -
                              10. -
                              -

                              You can replace it with some other module on the Settings page.

                              -
                              -
                              -
                              +

                              XE core '{$version}' has been successfully installed!

                              +

                              We recommend you to delete this demo page before launching the site.
                              Please check the following list to verify whether the installation has been properly completed.
                              You can see all the components on the administration page.

                              +
                                +
                              1. + When the layout has been successfully installed, you can see the screen containing a header, a content body, and a footer. +
                              2. +
                              3. + When Menu module has been successfully installed, you can see both global and local navigations. +
                              4. +
                              5. + When Integrated Search module has been successfully installed, you can see the search form. +
                              6. +
                              7. + When Login widget has been successfully installed, you can see the login form. +
                              8. +
                              9. + When Page module has been successfully installed, you see this page. +
                              10. +
                              +

                              You can replace it with some other module on the Settings page.

                              diff --git a/modules/install/script/welcome_content/welcome_content_tr.html b/modules/install/script/welcome_content/welcome_content_tr.html index b88945202..1c0398c4c 100644 --- a/modules/install/script/welcome_content/welcome_content_tr.html +++ b/modules/install/script/welcome_content/welcome_content_tr.html @@ -1,26 +1,20 @@ -
                              -
                              -
                              -

                              XE core '{$version}' has been successfully installed!

                              -

                              We recommend you to delete this demo page before launching the site.
                              Please check the following list to verify whether the installation has been properly completed.
                              You can see all the components on the administration page.

                              -
                                -
                              1. - When the layout has been successfully installed, you can see the screen containing a header, a content body, and a footer. -
                              2. -
                              3. - When Menu module has been successfully installed, you can see both global and local navigations. -
                              4. -
                              5. - When Integrated Search module has been successfully installed, you can see the search form. -
                              6. -
                              7. - When Login widget has been successfully installed, you can see the login form. -
                              8. -
                              9. - When Page module has been successfully installed, you see this page. -
                              10. -
                              -

                              You can replace it with some other module on the Settings page.

                              -
                              -
                              -
                              +

                              XE core '{$version}' has been successfully installed!

                              +

                              We recommend you to delete this demo page before launching the site.
                              Please check the following list to verify whether the installation has been properly completed.
                              You can see all the components on the administration page.

                              +
                                +
                              1. + When the layout has been successfully installed, you can see the screen containing a header, a content body, and a footer. +
                              2. +
                              3. + When Menu module has been successfully installed, you can see both global and local navigations. +
                              4. +
                              5. + When Integrated Search module has been successfully installed, you can see the search form. +
                              6. +
                              7. + When Login widget has been successfully installed, you can see the login form. +
                              8. +
                              9. + When Page module has been successfully installed, you see this page. +
                              10. +
                              +

                              You can replace it with some other module on the Settings page.

                              diff --git a/modules/install/script/welcome_content/welcome_content_vi.html b/modules/install/script/welcome_content/welcome_content_vi.html index b88945202..1c0398c4c 100644 --- a/modules/install/script/welcome_content/welcome_content_vi.html +++ b/modules/install/script/welcome_content/welcome_content_vi.html @@ -1,26 +1,20 @@ -
                              -
                              -
                              -

                              XE core '{$version}' has been successfully installed!

                              -

                              We recommend you to delete this demo page before launching the site.
                              Please check the following list to verify whether the installation has been properly completed.
                              You can see all the components on the administration page.

                              -
                                -
                              1. - When the layout has been successfully installed, you can see the screen containing a header, a content body, and a footer. -
                              2. -
                              3. - When Menu module has been successfully installed, you can see both global and local navigations. -
                              4. -
                              5. - When Integrated Search module has been successfully installed, you can see the search form. -
                              6. -
                              7. - When Login widget has been successfully installed, you can see the login form. -
                              8. -
                              9. - When Page module has been successfully installed, you see this page. -
                              10. -
                              -

                              You can replace it with some other module on the Settings page.

                              -
                              -
                              -
                              +

                              XE core '{$version}' has been successfully installed!

                              +

                              We recommend you to delete this demo page before launching the site.
                              Please check the following list to verify whether the installation has been properly completed.
                              You can see all the components on the administration page.

                              +
                                +
                              1. + When the layout has been successfully installed, you can see the screen containing a header, a content body, and a footer. +
                              2. +
                              3. + When Menu module has been successfully installed, you can see both global and local navigations. +
                              4. +
                              5. + When Integrated Search module has been successfully installed, you can see the search form. +
                              6. +
                              7. + When Login widget has been successfully installed, you can see the login form. +
                              8. +
                              9. + When Page module has been successfully installed, you see this page. +
                              10. +
                              +

                              You can replace it with some other module on the Settings page.

                              diff --git a/modules/install/script/welcome_content/welcome_content_zh-CN.html b/modules/install/script/welcome_content/welcome_content_zh-CN.html index b88945202..1c0398c4c 100644 --- a/modules/install/script/welcome_content/welcome_content_zh-CN.html +++ b/modules/install/script/welcome_content/welcome_content_zh-CN.html @@ -1,26 +1,20 @@ -
                              -
                              -
                              -

                              XE core '{$version}' has been successfully installed!

                              -

                              We recommend you to delete this demo page before launching the site.
                              Please check the following list to verify whether the installation has been properly completed.
                              You can see all the components on the administration page.

                              -
                                -
                              1. - When the layout has been successfully installed, you can see the screen containing a header, a content body, and a footer. -
                              2. -
                              3. - When Menu module has been successfully installed, you can see both global and local navigations. -
                              4. -
                              5. - When Integrated Search module has been successfully installed, you can see the search form. -
                              6. -
                              7. - When Login widget has been successfully installed, you can see the login form. -
                              8. -
                              9. - When Page module has been successfully installed, you see this page. -
                              10. -
                              -

                              You can replace it with some other module on the Settings page.

                              -
                              -
                              -
                              +

                              XE core '{$version}' has been successfully installed!

                              +

                              We recommend you to delete this demo page before launching the site.
                              Please check the following list to verify whether the installation has been properly completed.
                              You can see all the components on the administration page.

                              +
                                +
                              1. + When the layout has been successfully installed, you can see the screen containing a header, a content body, and a footer. +
                              2. +
                              3. + When Menu module has been successfully installed, you can see both global and local navigations. +
                              4. +
                              5. + When Integrated Search module has been successfully installed, you can see the search form. +
                              6. +
                              7. + When Login widget has been successfully installed, you can see the login form. +
                              8. +
                              9. + When Page module has been successfully installed, you see this page. +
                              10. +
                              +

                              You can replace it with some other module on the Settings page.

                              diff --git a/modules/install/script/welcome_content/welcome_content_zh-TW.html b/modules/install/script/welcome_content/welcome_content_zh-TW.html index e00809f42..24ecb9e46 100644 --- a/modules/install/script/welcome_content/welcome_content_zh-TW.html +++ b/modules/install/script/welcome_content/welcome_content_zh-TW.html @@ -1,26 +1,20 @@ -
                              -
                              -
                              -

                              XE core '{$version}'

                              -

                              ءߢ
                              ?
                              ʦη̸졣

                              -
                                -
                              1. - ͪ ʦ̸ Ү ڭ -
                              2. -
                              3. - Ӥټ ʦ̸ ӤӤ -
                              4. -
                              5. - ټ ʦ̸ ? -
                              6. -
                              7. - Login widget ʦ̸ ? -
                              8. -
                              9. - ټ ʦ̸ -
                              10. -
                              -

                              ټڡ

                              -
                              -
                              -
                              +

                              XE core '{$version}'

                              +

                              ءߢ
                              ?
                              ʦη̸졣

                              +
                                +
                              1. + ͪ ʦ̸ Ү ڭ +
                              2. +
                              3. + Ӥټ ʦ̸ ӤӤ +
                              4. +
                              5. + ټ ʦ̸ ? +
                              6. +
                              7. + Login widget ʦ̸ ? +
                              8. +
                              9. + ټ ʦ̸ +
                              10. +
                              +

                              ټڡ

                              diff --git a/modules/page/skins/default/content.html b/modules/page/skins/default/content.html index 92940b223..995dd3ed3 100644 --- a/modules/page/skins/default/content.html +++ b/modules/page/skins/default/content.html @@ -1,12 +1,9 @@ -
                              제목 : {$oDocument->getTitle()}
                              -
                              내용 : {$oDocument->getContent()}
                              -
                              태그 : {implode(',', $oDocument->get('tag_list'))}
                              - - - - +

                              {$oDocument->getTitle()}

                              +{$oDocument->getContent()} + + + + diff --git a/modules/page/tpl/article_content_modify.html b/modules/page/tpl/article_content_modify.html index d42354047..6b91e765f 100644 --- a/modules/page/tpl/article_content_modify.html +++ b/modules/page/tpl/article_content_modify.html @@ -1,10 +1,10 @@ -
                              + -
                              - +
                              +
                              {$oDocument->getEditor()}
                              From de8301ccbc77474f01019bec25fe04574d24dbb8 Mon Sep 17 00:00:00 2001 From: ucorina Date: Tue, 20 Sep 2011 12:31:50 +0000 Subject: [PATCH 0787/1372] issue 173 - php4 parse error git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9243 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/db/DBCubrid.class.php | 12 +- classes/db/DBCubrid3.class.php | 1239 ---------------------------- classes/db/DBFirebird.class.php | 42 +- classes/db/DBMssql.class.php | 17 +- classes/db/DBPostgresql.class.php | 14 +- classes/db/DBSqlite3_pdo.class.php | 20 +- 6 files changed, 57 insertions(+), 1287 deletions(-) delete mode 100644 classes/db/DBCubrid3.class.php diff --git a/classes/db/DBCubrid.class.php b/classes/db/DBCubrid.class.php index 09f203caf..891b473b6 100644 --- a/classes/db/DBCubrid.class.php +++ b/classes/db/DBCubrid.class.php @@ -598,7 +598,8 @@ } function queryError($queryObject){ - if ($queryObject->getLimit() && $queryObject->getLimit()->isPageHandler()){ + $limit = $queryObject->getLimit(); + if ($limit && $limit->isPageHandler()){ $buff = new Object (); $buff->total_count = 0; $buff->total_page = 0; @@ -611,7 +612,8 @@ } function queryPageLimit($queryObject, $result, $connection){ - if ($queryObject->getLimit() && $queryObject->getLimit()->isPageHandler()) { + $limit = $queryObject->getLimit(); + if ($limit && $limit->isPageHandler()) { // Total count $count_query = sprintf('select count(*) as "count" %s %s', 'FROM ' . $queryObject->getFromString(), ($queryObject->getWhereString() === '' ? '' : ' WHERE '. $queryObject->getWhereString())); @@ -624,11 +626,11 @@ $count_output = $this->_fetch($result); $total_count = (int)$count_output->count; - $list_count = $queryObject->getLimit()->list_count->getValue(); + $list_count = $limit->list_count->getValue(); if (!$list_count) $list_count = 20; - $page_count = $queryObject->getLimit()->page_count->getValue(); + $page_count = $limit->page_count->getValue(); if (!$page_count) $page_count = 10; - $page = $queryObject->getLimit()->page->getValue(); + $page = $limit->page->getValue(); if (!$page) $page = 1; // total pages diff --git a/classes/db/DBCubrid3.class.php b/classes/db/DBCubrid3.class.php deleted file mode 100644 index 70cb1e124..000000000 --- a/classes/db/DBCubrid3.class.php +++ /dev/null @@ -1,1239 +0,0 @@ - 'numeric(20)', - 'number' => 'integer', - 'varchar' => 'character varying', - 'char' => 'character', - 'tinytext' => 'character varying(256)', - 'text' => 'character varying(1073741823)', - 'bigtext' => 'character varying(1073741823)', - 'date' => 'character varying(14)', - 'float' => 'float', - ); - - /** - * @brief constructor - **/ - function DBCubrid3() - { - $this->_setDBInfo(); - $this->_connect(); - } - - /** - * @brief create an instance of this class - */ - function create() - { - return new DBCubrid3; - } - - /** - * @brief Return if installable - **/ - function isSupported() - { - if (!function_exists('cubrid_connect')) return false; - return true; - } - - /** - * @brief DB settings and connect/close - **/ - function _setDBInfo() - { - $db_info = Context::getDBInfo(); - $this->hostname = $db_info->db_hostname; - $this->userid = $db_info->db_userid; - $this->password = $db_info->db_password; - $this->database = $db_info->db_database; - $this->port = $db_info->db_port; - $this->prefix = $db_info->db_table_prefix; - - if (!substr($this->prefix, -1) != '_') $this->prefix .= '_'; - $this->magic_quotes_enabled = (version_compare(PHP_VERSION, "5.9.0", "<") && get_magic_quotes_gpc()); - } - - /** - * @brief DB Connection - **/ - function _connect() - { - // ignore if db information not exists - if (!$this->hostname || !$this->userid || !$this->password || !$this->database || !$this->port) return; - - // attempts to connect - $this->fd = @cubrid_connect ($this->hostname, $this->port, $this->database, $this->userid, $this->password); - - // check connections - if (!$this->fd) { - $this->setError (-1, 'database connect fail'); - return $this->is_connected = false; - } - - $this->is_connected = true; - $this->password = md5 ($this->password); - } - - /** - * @brief DB disconnect - **/ - function close() - { - if (!$this->isConnected ()) return; - - @cubrid_commit ($this->fd); - @cubrid_disconnect ($this->fd); - $this->transaction_started = false; - } - - /** - * @brief handles quatation of the string variables from the query - **/ - function addQuotes($string) - { - if (!$this->fd) return $string; - - if ($this->magic_quotes_enabled) { - $string = stripslashes (str_replace ("\\","\\\\", $string)); - } - - if (!is_numeric($string)) { - $string = str_replace("'","''",$string); - } - - return $string; - } - - /** - * @brief Begin transaction - **/ - function begin() - { - if (!$this->isConnected () || $this->transaction_started) return; - $this->transaction_started = true; - } - - /** - * @brief Rollback - **/ - function rollback() - { - if (!$this->isConnected () || !$this->transaction_started) return; - @cubrid_rollback ($this->fd); - $this->transaction_started = false; - } - - /** - * @brief Commit - **/ - function commit() - { - if (!$force && (!$this->isConnected () || - !$this->transaction_started)) return; - - @cubrid_commit($this->fd); - $this->transaction_started = false; - } - - /** - * @brief : executing the query and fetching the result - * - * query: run a query and return the result\n - * fetch: NULL if no value returned \n - * array object if rows returned \n - * object if a row returned \n - * return\n - **/ - function _query($query) - { - if (!$query || !$this->isConnected ()) return; - - // Notify to start a query execution - $this->actStart ($query); - - // Execute the query - $result = @cubrid_execute ($this->fd, $query); - // error check - if (cubrid_error_code ()) { - $code = cubrid_error_code (); - $msg = cubrid_error_msg (); - - $this->setError ($code, $msg); - } - - // Notify to complete a query execution - $this->actFinish (); - - // Return the result - return $result; - } - - /** - * @brief Fetch the result - **/ - function _fetch($result) - { - if (!$this->isConnected() || $this->isError() || !$result) return; - - $col_types = cubrid_column_types ($result); - $col_names = cubrid_column_names ($result); - $max = count ($col_types); - - for ($count = 0; $count < $max; $count++) { - if (preg_match ("/^char/", $col_types[$count]) > 0) { - $char_type_fields[] = $col_names[$count]; - } - } - - while ($tmp = cubrid_fetch ($result, CUBRID_OBJECT)) { - if (is_array ($char_type_fields)) { - foreach ($char_type_fields as $val) { - $tmp->{$val} = rtrim ($tmp->{$val}); - } - } - - $output[] = $tmp; - } - - unset ($char_type_fields); - - if ($result) cubrid_close_request($result); - - if (count ($output) == 1) return $output[0]; - return $output; - } - - /** - * @brief return the sequence value incremented by 1(auto_increment column only used in the CUBRID sequence table) - **/ - function getNextSequence() - { - $this->_makeSequence(); - - $query = sprintf ("select \"%ssequence\".\"nextval\" as \"seq\" from db_root", $this->prefix); - $result = $this->_query($query); - $output = $this->_fetch($result); - - return $output->seq; - } - - /** - * @brief return if the table already exists - **/ - function _makeSequence() - { - if($_GLOBALS['XE_EXISTS_SEQUENCE']) return; - - // check cubrid serial - $query = sprintf('select count(*) as "count" from "db_serial" where name=\'%ssequence\'', $this->prefix); - $result = $this->_query($query); - $output = $this->_fetch($result); - - // if do not create serial - if ($output->count == 0) { - $query = sprintf('select max("a"."srl") as "srl" from '. - '( select max("document_srl") as "srl" from '. - '"%sdocuments" UNION '. - 'select max("comment_srl") as "srl" from '. - '"%scomments" UNION '. - 'select max("member_srl") as "srl" from '. - '"%smember"'. - ') as "a"', $this->prefix, $this->prefix, $this->prefix); - - $result = $this->_query($query); - $output = $this->_fetch($result); - $srl = $output->srl; - if ($srl < 1) { - $start = 1; - } - else { - $start = $srl + 1000000; - } - - // create sequence - $query = sprintf('create serial "%ssequence" start with %s increment by 1 nominvalue nomaxvalue nocycle cache 3;', $this->prefix, $start); - $result = $this->_query($query); - if ($result) cubrid_close_request($result); - } - - $_GLOBALS['XE_EXISTS_SEQUENCE'] = true; - } - - - /** - * brief return a table if exists - **/ - function isTableExists ($target_name) - { - if($target_name == 'sequence') { - $query = sprintf ("select \"name\" from \"db_serial\" where \"name\" = '%s%s'", $this->prefix, $target_name); - } - else { - $query = sprintf ("select \"class_name\" from \"db_class\" where \"class_name\" = '%s%s'", $this->prefix, $target_name); - } - - $result = $this->_query ($query); - if (cubrid_num_rows($result) > 0) { - $output = true; - } - else { - $output = false; - } - - if ($result) cubrid_close_request ($result); - - return $output; - } - - /** - * @brief add a column to the table - **/ - function addColumn($table_name, $column_name, $type = 'number', $size = '', $default = '', $notnull = false) - { - $type = strtoupper($this->column_type[$type]); - if ($type == 'INTEGER') $size = ''; - - $query = sprintf ("alter class \"%s%s\" add \"%s\" ", $this->prefix, $table_name, $column_name); - - if ($type == 'CHAR' || $type == 'VARCHAR') { - if ($size) $size = $size * 3; - } - - if ($size) { - $query .= sprintf ("%s(%s) ", $type, $size); - } - else { - $query .= sprintf ("%s ", $type); - } - - if ($default) { - if ($type == 'INTEGER' || $type == 'BIGINT' || $type=='INT') { - $query .= sprintf ("default %d ", $default); - } - else { - $query .= sprintf ("default '%s' ", $default); - } - } - - if ($notnull) $query .= "not null "; - - $result = $this->_query($query); - if ($result) cubrid_close_request($result); - } - - /** - * @brief drop a column from the table - **/ - function dropColumn ($table_name, $column_name) - { - $query = sprintf ("alter class \"%s%s\" drop \"%s\" ", $this->prefix, $table_name, $column_name); - - $result = $this->_query($query); - if($result) cubrid_close_request($result); - } - - /** - * @brief return column information of the table - **/ - function isColumnExists ($table_name, $column_name) - { - $query = sprintf ("select \"attr_name\" from \"db_attribute\" where ". "\"attr_name\" ='%s' and \"class_name\" = '%s%s'", $column_name, $this->prefix, $table_name); - $result = $this->_query ($query); - - if (cubrid_num_rows ($result) > 0) $output = true; - else $output = false; - - if ($result) cubrid_close_request ($result); - - return $output; - } - - /** - * @brief add an index to the table - * $target_columns = array(col1, col2) - * $is_unique? unique : none - **/ - function addIndex ($table_name, $index_name, $target_columns, $is_unique = false) - { - if (!is_array ($target_columns)) { - $target_columns = array ($target_columns); - } - - $query = sprintf ("create %s index \"%s\" on \"%s%s\" (%s);", $is_unique?'unique':'', $this->prefix .$index_name, $this->prefix, $table_name, '"'.implode('","',$target_columns).'"'); - - $result = $this->_query($query); - if($result) cubrid_close_request($result); - } - - /** - * @brief drop an index from the table - **/ - function dropIndex ($table_name, $index_name, $is_unique = false) - { - $query = sprintf ("drop %s index \"%s\" on \"%s%s\"", $is_unique?'unique':'', $this->prefix .$index_name, $this->prefix, $table_name); - - $result = $this->_query($query); - if($result) cubrid_close_request($result); - } - - /** - * @brief return index information of the table - **/ - function isIndexExists ($table_name, $index_name) - { - $query = sprintf ("select \"index_name\" from \"db_index\" where ". "\"class_name\" = '%s%s' and \"index_name\" = '%s' ", $this->prefix, $table_name, $this->prefix .$index_name); - $result = $this->_query ($query); - - if ($this->isError ()) return false; - - $output = $this->_fetch ($result); - - if (!$output) return false; - return true; - } - - /** - * @brief creates a table by using xml file - **/ - function createTableByXml ($xml_doc) - { - return $this->_createTable ($xml_doc); - } - - /** - * @brief creates a table by using xml file - **/ - function createTableByXmlFile ($file_name) - { - if (!file_exists ($file_name)) return; - // read xml file - $buff = FileHandler::readFile ($file_name); - - return $this->_createTable ($buff); - } - - /** - * @brief create table by using the schema xml - * - * type : number, varchar, tinytext, text, bigtext, char, date, \n - * opt : notnull, default, size\n - * index : primary key, index, unique\n - **/ - function _createTable ($xml_doc) - { - // xml parsing - $oXml = new XmlParser(); - $xml_obj = $oXml->parse($xml_doc); - // Create a table schema - $table_name = $xml_obj->table->attrs->name; - - // if the table already exists exit function - if ($this->isTableExists($table_name)) return; - - // If the table name is sequence, it creates a serial - if ($table_name == 'sequence') { - $query = sprintf('create serial "%ssequence" start with 1 increment by 1 nominvalue nomaxvalue nocycle cache 3;', $this->prefix); - $result = $this->_query($query); - if($result) cubrid_close_request($result); - return; - } - - - $table_name = $this->prefix.$table_name; - - $query = sprintf ('create class "%s";', $table_name); - $result = $this->_query($query); - if($result) cubrid_close_request($result); - - if (!is_array ($xml_obj->table->column)) { - $columns[] = $xml_obj->table->column; - } - else { - $columns = $xml_obj->table->column; - } - - $query = sprintf ("alter class \"%s\" add attribute ", $table_name); - - foreach ($columns as $column) { - $name = $column->attrs->name; - $type = $column->attrs->type; - $size = $column->attrs->size; - $notnull = $column->attrs->notnull; - $primary_key = $column->attrs->primary_key; - $index = $column->attrs->index; - $unique = $column->attrs->unique; - $default = $column->attrs->default; - - switch ($this->column_type[$type]) { - case 'integer' : - $size = null; - break; - case 'text' : - $size = null; - break; - } - - if (isset ($default) && ($type == 'varchar' || $type == 'char' || - $type == 'text' || $type == 'tinytext' || $type == 'bigtext')) - { - $default = sprintf ("'%s'", $default); - } - - if ($type == 'varchar' || $type == 'char') { - if($size) $size = $size * 3; - } - - $column_schema[] = sprintf ('"%s" %s%s %s %s', - $name, - $this->column_type[$type], - $size?'('.$size.')':'', - isset($default)?"default ".$default:'', - $notnull?'not null':''); - - if ($primary_key) { - $primary_list[] = $name; - } - else if ($unique) { - $unique_list[$unique][] = $name; - } - else if ($index) { - $index_list[$index][] = $name; - } - } - - $query .= implode (',', $column_schema).';'; - $result = $this->_query($query); - if($result) cubrid_close_request($result); - - if (count ($primary_list)) { - $query = sprintf ("alter class \"%s\" add attribute constraint ". "\"pkey_%s\" PRIMARY KEY(%s);", $table_name, $table_name, '"'.implode('","',$primary_list).'"'); - $result = $this->_query($query); - if($result) cubrid_close_request($result); - } - - if (count ($unique_list)) { - foreach ($unique_list as $key => $val) { - $query = sprintf ("create unique index \"%s\" on \"%s\" ". "(%s);", $this->prefix .$key, $table_name, '"'.implode('","', $val).'"'); - $result = $this->_query($query); - if($result) cubrid_close_request($result); - } - } - - if (count ($index_list)) { - foreach ($index_list as $key => $val) { - $query = sprintf ("create index \"%s\" on \"%s\" (%s);", $this->prefix .$key, $table_name, '"'.implode('","',$val).'"'); - $result = $this->_query($query); - if($result) cubrid_close_request($result); - } - } - } - - /** - * @brief return the condition - **/ - function getCondition ($output) - { - if (!$output->conditions) return; - $condition = $this->_getCondition ($output->conditions, $output->column_type, $output); - if ($condition) $condition = ' where '.$condition; - - return $condition; - } - - function _getCondition ($conditions, $column_type, &$output) - { - $condition = ''; - - foreach ($conditions as $val) { - $sub_condition = ''; - - foreach ($val['condition'] as $v) { - $value = $v['value']; - if (!isset ($value)) continue; - if ($value === '') continue; - if(!is_string($value) && !is_integer($value) && !is_float($value) && !is_array($value)) continue; - - $name = $v['column']; - $operation = $v['operation']; - $type = $this->getColumnType ($column_type, $name); - $pipe = $v['pipe']; - $value = $this->getConditionValue ($name, $value, $operation, $type, $column_type); - - if (!$value) { - $value = $v['value']; - if (strpos ($value, '(')) { - $valuetmp = $value; - } - elseif (strpos ($value, ".") === false) { - $valuetmp = $value; - } - else { - $valuetmp = '"'.str_replace('.', '"."', $value).'"'; - } - } - else { - $tmp = explode('.',$value); - - if (count($tmp)==2) { - $table = $tmp[0]; - $column = $tmp[1]; - - if ($column_type[$column] && (in_array ($table, $output->tables) || - array_key_exists($table, $output->tables))) { - $valuetmp = sprintf('"%s"."%s"', $table, $column); - } - else { - $valuetmp = $value; - } - } - else { - $valuetmp = $value; - } - } - - if (strpos ($name, '(') > 0) { - $nametmp = $name; - } - elseif (strpos ($name, ".") === false) { - $nametmp = '"'.$name.'"'; - } - else { - $nametmp = '"'.str_replace('.', '"."', $name).'"'; - } - $str = $this->getConditionPart ($nametmp, $valuetmp, $operation); - if ($sub_condition) $sub_condition .= ' '.$pipe.' '; - $sub_condition .= $str; - } - - if ($sub_condition) { - if ($condition && $val['pipe']) { - $condition .= ' '.$val['pipe'].' '; - } - $condition .= '('.$sub_condition.')'; - } - } - - return $condition; - } - - /** - * @brief handles insertAct - **/ - function _executeInsertAct ($output) - { - // tables - foreach ($output->tables as $val) { - $table_list[] = '"'.$this->prefix.$val.'"'; - } - - // columns - foreach ($output->columns as $key => $val) { - $name = $val['name']; - $value = $val['value']; - //if ($this->getColumnType ($output->column_type, $name) != 'number') - if ($output->column_type[$name] != 'number') { - if (!is_null($value)) { - $value = "'" . $this->addQuotes($value) ."'"; - } - else { - if ($val['notnull']=='notnull') { - $value = "''"; - } - else { - //$value = 'null'; - $value = "''"; - } - } - } - 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 .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; - $result = $this->_query ($query); - if ($result && !$this->transaction_started) { - @cubrid_commit ($this->fd); - } - - return $result; - } - - /** - * @brief handles updateAct - **/ - function _executeUpdateAct ($output) - { - // tables - foreach ($output->tables as $key => $val) { - $table_list[] = '"'.$this->prefix.$val.'" as "'.$key.'"'; - } - - $check_click_count = true; - - // columns - foreach ($output->columns as $key => $val) { - if (!isset ($val['value'])) continue; - $name = $val['name']; - $value = $val['value']; - - if (substr ($value, -2) != '+1' || $output->column_type[$name] != 'number') { - $check_click_count = false; - } - - for ($i = 0; $i < $key; $i++) { - // not allows to define the same property repeatedly in a single query in CUBRID - if ($output->columns[$i]['name'] == $name) break; - } - if ($i < $key) continue; // ignore the rest of properties if duplicated property found - - if (strpos ($name, '.') !== false && strpos ($value, '.') !== false) { - $column_list[] = $name.' = '.$value; - } - else { - if ($output->column_type[$name] != 'number') { - $check_column = false; - $value = "'".$this->addQuotes ($value)."'"; - } - elseif (!$value || is_numeric ($value)) { - $value = (int) $value; - } - - $column_list[] = sprintf ("\"%s\" = %s", $name, $value); - } - } - - // conditional clause - $condition = $this->getCondition ($output); - - $check_click_count_condition = false; - if ($check_click_count) { - foreach ($output->conditions as $val) { - if ($val['pipe'] == 'or') { - $check_click_count_condition = false; - break; - } - - foreach ($val['condition'] as $v) { - if ($v['operation'] == 'equal') { - $check_click_count_condition = true; - } - else { - if ($v['operation'] == 'in' && !strpos ($v['value'], ',')) { - $check_click_count_condition = true; - } - else { - $check_click_count_condition = false; - } - } - - if ($v['pipe'] == 'or') { - $check_click_count_condition = false; - break; - } - } - } - } - - if ($check_click_count&& $check_click_count_condition && count ($output->tables) == 1 && count ($output->conditions) > 0 && count ($output->groups) == 0 && count ($output->order) == 0) { - foreach ($output->columns as $v) { - $incr_columns[] = 'incr("'.$v['name'].'")'; - } - - $query = sprintf ('select %s from %s %s', join (',', $incr_columns), implode(',', $table_list), $condition); - } - else { - $query = sprintf ("update %s set %s %s", implode (',', $table_list), implode (',', $column_list), $condition); - } - - $result = $this->_query ($query); - if ($result && !$this->transaction_started) @cubrid_commit ($this->fd); - - return $result; - } - - /** - * @brief handles deleteAct - **/ - function _executeDeleteAct ($output) - { - // tables - foreach ($output->tables as $val) { - $table_list[] = '"'.$this->prefix.$val.'"'; - } - - // Conditional clauses - $condition = $this->getCondition ($output); - - $query = sprintf ("delete from %s %s", implode (',',$table_list), $condition); - $result = $this->_query ($query); - if ($result && !$this->transaction_started) @cubrid_commit ($this->fd); - - return $result; - } - - /** - * @brief Handle selectAct - * - * to get a specific page list easily in select statement,\n - * a method, navigation, is used - **/ - function _executeSelectAct ($output) - { - // tables - $table_list = array (); - foreach ($output->tables as $key => $val) { - $table_list[] = '"'.$this->prefix.$val.'" as "'.$key.'"'; - } - $left_join = array (); - // why??? - $left_tables = (array) $output->left_tables; - - foreach ($left_tables as $key => $val) { - $condition = $this->_getCondition ($output->left_conditions[$key], $output->column_type, $output); - if ($condition) { - $left_join[] = $val.' "'.$this->prefix.$output->_tables[$key]. '" "'.$key.'" on ('.$condition.')'; - } - } - - $click_count = array(); - if(!$output->columns){ - $output->columns = array(array('name'=>'*')); - } - - $column_list = array (); - foreach ($output->columns as $key => $val) { - $name = $val['name']; - - $click_count = '%s'; - if ($val['click_count'] && count ($output->conditions) > 0) { - $click_count = 'incr(%s)'; - } - - $alias = $val['alias'] ? sprintf ('"%s"', $val['alias']) : null; - $_alias = $val['alias']; - - if ($name == '*') { - $column_list[] = $name; - } - elseif (strpos ($name, '.') === false && strpos ($name, '(') === false) { - $name = sprintf ($click_count,$name); - if ($alias) { - $column_list[$alias] = sprintf('"%s" as %s', $name, $alias); - } - else { - $column_list[] = sprintf ('"%s"', $name); - } - } - else { - if (strpos ($name, '.') != false) { - list ($prefix, $name) = explode('.', $name); - if (($now_matchs = preg_match_all ("/\(/", $prefix, $xtmp)) > 0) { - if ($now_matchs == 1) { - $tmpval = explode ("(", $prefix); - $tmpval[1] = sprintf ('"%s"', $tmpval[1]); - $prefix = implode ("(", $tmpval); - $tmpval = explode (")", $name); - $tmpval[0] = sprintf ('"%s"', $tmpval[0]); - $name = implode (")", $tmpval); - } - } - else { - $prefix = sprintf ('"%s"', $prefix); - $name = ($name == '*') ? $name : sprintf('"%s"',$name); - } - $xtmp = null; - $now_matchs = null; - if($alias) $column_list[$_alias] = sprintf ($click_count, sprintf ('%s.%s', $prefix, $name)) . ($alias ? sprintf (' as %s',$alias) : ''); - else $column_list[] = sprintf ($click_count, sprintf ('%s.%s', $prefix, $name)); - } - elseif (($now_matchs = preg_match_all ("/\(/", $name, $xtmp)) > 0) { - if ($now_matchs == 1 && preg_match ("/[a-zA-Z0-9]*\(\*\)/", $name) < 1) { - $open_pos = strpos ($name, "("); - $close_pos = strpos ($name, ")"); - - if (preg_match ("/,/", $name)) { - $tmp_func_name = sprintf ('%s', substr ($name, 0, $open_pos)); - $tmp_params = sprintf ('%s', substr ($name, $open_pos + 1, $close_pos - $open_pos - 1)); - $tmpval = null; - $tmpval = explode (',', $tmp_params); - - foreach ($tmpval as $tmp_param) { - $tmp_param_list[] = (!is_numeric ($tmp_param)) ? sprintf ('"%s"', $tmp_param) : $tmp_param; - } - - $tmpval = implode (',', $tmp_param_list); - $name = sprintf ('%s(%s)', $tmp_func_name, $tmpval); - } - else { - $name = sprintf ('%s("%s")', substr ($name, 0, $open_pos), substr ($name, $open_pos + 1, $close_pos - $open_pos - 1)); - } - } - - if($alias) $column_list[$_alias] = sprintf ($click_count, $name). ($alias ? sprintf (' as %s', $alias) : ''); - else $column_list[] = sprintf ($click_count, $name); - } - else { - if($alias) $column_list[$_alias] = sprintf($click_count, $name). ($alias ? sprintf(' as %s',$alias) : ''); - else $column_list[] = sprintf($click_count, $name); - } - } - $columns = implode (',', $column_list); - } - - $condition = $this->getCondition ($output); - - $output->column_list = $column_list; - if ($output->list_count && $output->page) { - return ($this->_getNavigationData($table_list, $columns, $left_join, $condition, $output)); - } - - $condition = $this->limitResultIfOrderByIsUsed($output->order, $condition); - - // group by - $groupby_query = $this->getGroupByClause($output->groups); - - // order by - $orderby_query = $this->getOrderByClause($output->order); - - // limit - $limit_query = $this->getLimitClause(0, $output->list_count['value']); - - if(count($output->arg_columns)) - { - $columns = array(); - foreach($output->arg_columns as $col){ - unset($tmpCol); - $tmpCol = explode('.', $col); - if(isset($tmpCol[1])) $col = $tmpCol[1]; - - if(strpos($col,'"')===false && strpos($col,' ')==false) $col = '"'.$col.'"'; - if(isset($tmpCol[1])) $col = $tmpCol[0].'.'.$col; - - $columns[] = $col; - } - - $columns = join(',',$columns); - } - - $query = sprintf ("select %s from %s %s %s %s", $columns, implode (',',$table_list), implode (' ',$left_join), $condition, $groupby_query.$orderby_query.$limit_query); - $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; - $result = $this->_query ($query); - if ($this->isError ()) return; - $data = $this->_fetch ($result); - - $buff = new Object (); - $buff->data = $data; - - return $buff; - } - - /** - * @brief Retrieve text for limit clause - * - * Example: SELECT * FROM xe_modules LIMIT 20 - * - **/ - function getLimitClause($offset, $row_count){ - if(!$row_count) return ''; - if($offset === 0) - return sprintf(' limit %d', $row_count); - return sprintf(' limit %d, %d', $offset, $row_count); - } - - /** - * @brief Retrieve text for order by clause - * - * Example: SELECT * FROM xe_modules ORDER BY list_order, regdate - * - **/ - function getOrderByClause($order_list){ - if(!$order_list) return ''; - - foreach ($order_list as $val) { - // Parse column names - if (strpos ($val[0], '.')) { - $tmpval = explode ('.', $val[0]); - $tmpval[0] = sprintf ('"%s"', $tmpval[0]); - $tmpval[1] = sprintf ('"%s"', $tmpval[1]); - $val[0] = implode ('.', $tmpval); - } - elseif (strpos ($val[0], '(')) $val[0] = $val[0]; - elseif ($val[0] == 'count') $val[0] = 'count(*)'; - else $val[0] = sprintf ('"%s"', $val[0]); - - // Save name - $index_list[] = sprintf('%s %s', $val[0], $val[1]); - - // 1. This if never gets executed: column names are alias in $column_list but with real name in order clause - // 2. There is no need for the columns in the order by clause to also show up in the select statement - /* - if(count($output->arg_columns) && $column_list[$val[0]]) - $output->arg_columns[] = $column_list[$val[0]]; - */ - } - - if (count($index_list)) { - return ' order by '.implode(',', $index_list); - } - - return ''; - } - - /** - * @brief Retrieve text for group by clause - * - * Example: SELECT substr(regdate, 1, 8), count(*) FROM xe_modules GROUP BY substr(regdate, 1, 8) - * - **/ - function getGroupByClause($group_list){ - if(!$group_list) return ''; - if(!count($group_list)) return ''; - - foreach ($group_list as $key => $value) { - // If value is qualified table name - if (strpos ($value, '.')) { - $tmp = explode ('.', $value); - $tmp[0] = sprintf ('"%s"', $tmp[0]); - $tmp[1] = sprintf ('"%s"', $tmp[1]); - $value = implode ('.', $tmp); - } - // If value is an expression - elseif (strpos ($value, '(')) { - $value = $value; - } - else { - $value = sprintf ('"%s"', $value); - } - // Update - $group_list[$key] = $value; - - /* - * The same as with order by - columns in "group by" do not need to be in the select clause - if(count($output->arg_columns)) - { - if($column_list[$value]) $output->arg_columns[] = $column_list[$value]; - } - */ - } - return sprintf ('group by %s', implode(',', $group_list)); - } - - /** - * @brief Adds a where clause that retrieves only a subset of the table data if order by is used - * @remarks Only works with tables that have columns named "list_order" or "update_order" - * - * EXAMPLE: SELECT * FROM xe_documents WHERE module_srl = 10 AND list_order < 2100000000 ORDER BY list_order - * - **/ - function limitResultIfOrderByIsUsed($order_list, $condition){ - if(!$order_list) return $condition; - - foreach ($order_list as $key => $val) { - $col = $val[0]; - if(!in_array($col, array('list_order','update_order'))) continue; - - if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col); - else $condition = sprintf(' where %s < 2100000000 ', $col); - } - - return $condition; - } - - /** - * @brief displays the current stack trace. Fetch the result - **/ - function backtrace () - { - $output = "
                              \n"; - $output .= "Backtrace:
                              \n"; - $backtrace = debug_backtrace (); - - foreach ($backtrace as $bt) { - $args = ''; - foreach ($bt['args'] as $a) { - if (!empty ($args)) { - $args .= ', '; - } - switch (gettype ($a)) { - case 'integer': - case 'double': - $args .= $a; - break; - case 'string': - $a = htmlspecialchars (substr ($a, 0, 64)). - ((strlen ($a) > 64) ? '...' : ''); - $args .= "\"$a\""; - break; - case 'array': - $args .= 'Array ('. count ($a).')'; - break; - case 'object': - $args .= 'Object ('.get_class ($a).')'; - break; - case 'resource': - $args .= 'Resource ('.strstr ($a, '#').')'; - break; - case 'boolean': - $args .= $a ? 'True' : 'False'; - break; - case 'NULL': - $args .= 'Null'; - break; - default: - $args .= 'Unknown'; - } - } - $output .= "
                              \n"; - $output .= "file: ".$bt['line']." - ". $bt['file']."
                              \n"; - $output .= "call: ".$bt['class']. $bt['type'].$bt['function'].$args."
                              \n"; - } - $output .= "
                              \n"; - return $output; - } - - /** - * @brief paginates when navigation info exists in the query xml - * - * it is convenient although its structure is not good .. -_-; - **/ - function _getNavigationData ($table_list, $columns, $left_join, $condition, $output) { - require_once (_XE_PATH_.'classes/page/PageHandler.class.php'); - - $column_list = $output->column_list; - - $count_condition = count($output->groups) ? sprintf('%s group by %s', $condition, implode(', ', $output->groups)) : $condition; - $count_query = sprintf('select count(*) as "count" from %s %s %s', implode(', ', $table_list), implode(' ', $left_join), $count_condition); - if (count($output->groups)) { - $count_query = sprintf('select count(*) as "count" from (%s) xet', $count_query); - } - - $count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; - $result = $this->_query($count_query); - $count_output = $this->_fetch($result); - $total_count = (int)$count_output->count; - - $list_count = $output->list_count['value']; - if (!$list_count) $list_count = 20; - $page_count = $output->page_count['value']; - if (!$page_count) $page_count = 10; - $page = $output->page['value']; - if (!$page) $page = 1; - - // total pages - if ($total_count) { - $total_page = (int) (($total_count - 1) / $list_count) + 1; - } - else { - $total_page = 1; - } - - // check the page variables - if ($page > $total_page) $page = $total_page; - $start_count = ($page - 1) * $list_count; - - $condition = $this->limitResultIfOrderByIsUsed($output->order, $condition); - - // group by - $groupby_query = $this->getGroupByClause($output->groups); - - // order by - $orderby_query = $this->getOrderByClause($output->order); - - // limit - $limit_query = $this->getLimitClause($start_count, $list_count); - - if(count($output->arg_columns)) - { - $columns = array(); - foreach($output->arg_columns as $col){ - unset($tmpCol); - $tmpCol = explode('.', $col); - if(isset($tmpCol[1])) $col = $tmpCol[1]; - - if(strpos($col,'"')===false && strpos($col,' ')==false) $col = '"'.$col.'"'; - if(isset($tmpCol[1])) $col = $tmpCol[0].'.'.$col; - - $columns[] = $col; - } - - $columns = join(',',$columns); - } - - $query = sprintf ("select %s from %s %s %s %s", $columns, implode (',',$table_list), implode (' ',$left_join), $condition, $groupby_query.$orderby_query.$limit_query); - $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; - $result = $this->_query ($query); - - if ($this->isError ()) { - $buff = new Object (); - $buff->total_count = 0; - $buff->total_page = 0; - $buff->page = 1; - $buff->data = array (); - - $buff->page_navigation = new PageHandler ($total_count, $total_page, $page, $page_count); - - return $buff; - } - - $virtual_no = $total_count - ($page - 1) * $list_count; - while ($tmp = cubrid_fetch ($result, CUBRID_OBJECT)) { - if ($tmp) { - foreach ($tmp as $k => $v) { - $tmp->{$k} = rtrim($v); - } - } - $data[$virtual_no--] = $tmp; - } - - $buff = new Object (); - $buff->total_count = $total_count; - $buff->total_page = $total_page; - $buff->page = $page; - $buff->data = $data; - - $buff->page_navigation = new PageHandler ($total_count, $total_page, $page, $page_count); - - return $buff; - } - } - - return new DBCubrid3; -?> diff --git a/classes/db/DBFirebird.class.php b/classes/db/DBFirebird.class.php index af5f2c504..0c6121362 100644 --- a/classes/db/DBFirebird.class.php +++ b/classes/db/DBFirebird.class.php @@ -716,19 +716,21 @@ } function queryError($queryObject) { - if ($queryObject->getLimit() && $queryObject->getLimit()->isPageHandler()) { - $buff = new Object (); - $buff->total_count = 0; - $buff->total_page = 0; - $buff->page = 1; - $buff->data = array(); - $buff->page_navigation = new PageHandler(/* $total_count */0, /* $total_page */1, /* $page */1, /* $page_count */10); //default page handler values - }else - return; - } + $limit = $queryObject->getLimit(); + if ($limit && $limit->isPageHandler()) { + $buff = new Object (); + $buff->total_count = 0; + $buff->total_page = 0; + $buff->page = 1; + $buff->data = array(); + $buff->page_navigation = new PageHandler(/* $total_count */0, /* $total_page */1, /* $page */1, /* $page_count */10); //default page handler values + }else + return; + } function queryPageLimit($queryObject, $result, $connection) { - if ($queryObject->getLimit() && $queryObject->getLimit()->isPageHandler()) { + $limit = $queryObject->getLimit(); + if ($limit && $limit->isPageHandler()) { // Total count $count_query = sprintf('select count(*) as "count" %s %s', 'FROM ' . $queryObject->getFromString(), ($queryObject->getWhereString() === '' ? '' : ' WHERE ' . $queryObject->getWhereString())); if ($queryObject->getGroupByString() != '') { @@ -740,11 +742,11 @@ $count_output = $this->_fetch($result_count); $total_count = (int) $count_output->count; - $list_count = $queryObject->getLimit()->list_count->getValue(); + $list_count = $limit->list_count->getValue(); if (!$list_count) $list_count = 20; - $page_count = $queryObject->getLimit()->page_count->getValue(); + $page_count = $limit->page_count->getValue(); if (!$page_count) $page_count = 10; - $page = $queryObject->getLimit()->page->getValue(); + $page = $limit->page->getValue(); if (!$page) $page = 1; // Total pages if ($total_count) $total_page = (int) (($total_count - 1) / $list_count) + 1; @@ -789,11 +791,11 @@ } function getSelectSql($query, $with_values = true, $start_count = 0) { - - if ($query->getLimit() && $query->getLimit()->isPageHandler()) { - $list_count = $query->getLimit()->list_count->getValue(); - if(!$query->getLimit()->page) $page = 1; - else $page = $query->getLimit()->page->getValue(); + $limit = $query->getLimit(); + if ($limit && $limit->isPageHandler()) { + $list_count = $limit->list_count->getValue(); + if(!$limit->page) $page = 1; + else $page = $limit->page->getValue(); if(!$start_count) $start_count = ($page - 1) * $list_count; $limit = sprintf('SELECT FIRST %d SKIP %d ', $list_count, $start_count); @@ -804,7 +806,7 @@ if ($select == '') return new Object(-1, "Invalid query"); - if ($query->getLimit() && $query->getLimit()->isPageHandler()) + if ($limit && $limit->isPageHandler()) $select = $limit . ' ' . $select; else $select = 'SELECT ' . $select; diff --git a/classes/db/DBMssql.class.php b/classes/db/DBMssql.class.php index 643d5e72f..8d0decd71 100644 --- a/classes/db/DBMssql.class.php +++ b/classes/db/DBMssql.class.php @@ -419,8 +419,9 @@ //if($limitOffset) // TODO Implement Limit with offset with subquery $limit = '';$limitCount = ''; - if($query->getLimit()) - $limitCount = $query->getLimit()->getLimit(); + $limitQueryPart = $query->getLimit(); + if($limitQueryPart) + $limitCount = $limitQueryPart->getLimit(); if($limitCount != '') $limit = 'SELECT TOP ' . $limitCount; $select = $query->getSelectString($with_values); @@ -474,7 +475,8 @@ } function queryError($queryObject){ - if ($queryObject->getLimit() && $queryObject->getLimit()->isPageHandler()){ + $limit = $queryObject->getLimit(); + if ($limit && $limit->isPageHandler()){ $buff = new Object (); $buff->total_count = 0; $buff->total_page = 0; @@ -487,7 +489,8 @@ } function queryPageLimit($queryObject, $result, $connection){ - if ($queryObject->getLimit() && $queryObject->getLimit()->isPageHandler()) { + $limit = $queryObject->getLimit(); + if ($limit && $limit->isPageHandler()) { // Total count $count_query = sprintf('select count(*) as "count" %s %s', 'FROM ' . $queryObject->getFromString(), ($queryObject->getWhereString() === '' ? '' : ' WHERE '. $queryObject->getWhereString())); if ($queryObject->getGroupByString() != '') { @@ -499,11 +502,11 @@ $count_output = $this->_fetch($result_count); $total_count = (int)$count_output->count; - $list_count = $queryObject->getLimit()->list_count->getValue(); + $list_count = $limit->list_count->getValue(); if (!$list_count) $list_count = 20; - $page_count = $queryObject->getLimit()->page_count->getValue(); + $page_count = $limit->page_count->getValue(); if (!$page_count) $page_count = 10; - $page = $queryObject->getLimit()->page->getValue(); + $page = $limit->page->getValue(); if (!$page) $page = 1; // Total pages if ($total_count) { diff --git a/classes/db/DBPostgresql.class.php b/classes/db/DBPostgresql.class.php index 958456c71..9682995cf 100644 --- a/classes/db/DBPostgresql.class.php +++ b/classes/db/DBPostgresql.class.php @@ -518,7 +518,8 @@ class DBPostgresql extends DB if($orderBy != '') $orderBy = ' ORDER BY ' . $orderBy; $limit = $query->getLimitString(); - if($limit != '') $limit = ' LIMIT ' . $query->getLimit()->getLimit() . ' OFFSET ' . $query->getLimit()->getOffset(); + $limitObject = $query->getLimit(); + if($limit != '') $limit = ' LIMIT ' . $limitObject->getLimit() . ' OFFSET ' . $limitObject->getOffset(); return $select . ' ' . $from . ' ' . $where . ' ' . $groupBy . ' ' . $orderBy . ' ' . $limit; } @@ -554,7 +555,8 @@ class DBPostgresql extends DB return; } - if ($queryObject->getLimit() && $queryObject->getLimit()->isPageHandler()) { + $limit = $queryObject->getLimit(); + if ($limit && $limit->isPageHandler()) { // Total count $count_query = sprintf('select count(*) as "count" %s %s', 'FROM ' . $queryObject->getFromString(), ($queryObject->getWhereString() === '' ? '' : ' WHERE '. $queryObject->getWhereString())); if ($queryObject->getGroupByString() != '') { @@ -568,19 +570,19 @@ class DBPostgresql extends DB // Total pages if ($total_count) { - $total_page = (int) (($total_count - 1) / $queryObject->getLimit()->list_count) + 1; + $total_page = (int) (($total_count - 1) / $limit->list_count) + 1; } else $total_page = 1; - $virtual_no = $total_count - ($queryObject->getLimit()->page - 1) * $queryObject->getLimit()->list_count; + $virtual_no = $total_count - ($limit->page - 1) * $limit->list_count; $data = $this->_fetch($result, $virtual_no); $buff = new Object (); $buff->total_count = $total_count; $buff->total_page = $total_page; - $buff->page = $queryObject->getLimit()->page->getValue(); + $buff->page = $limit->page->getValue(); $buff->data = $data; - $buff->page_navigation = new PageHandler($total_count, $total_page, $queryObject->getLimit()->page->getValue(), $queryObject->getLimit()->page_count); + $buff->page_navigation = new PageHandler($total_count, $total_page, $limit->page->getValue(), $limit->page_count); }else{ $data = $this->_fetch($result); $buff = new Object (); diff --git a/classes/db/DBSqlite3_pdo.class.php b/classes/db/DBSqlite3_pdo.class.php index eff6bd2fb..f90ce19fd 100644 --- a/classes/db/DBSqlite3_pdo.class.php +++ b/classes/db/DBSqlite3_pdo.class.php @@ -81,19 +81,19 @@ if(!$this->database) return; // Attempt to access the database file - try { - // PDO is only supported with PHP5, - // so it is allowed to use try~catch statment in this class. - $this->handler = new PDO('sqlite:'.$this->database); - } catch (PDOException $e) { - $this->setError(-1, 'Connection failed: '.$e->getMessage()); - $this->is_connected = false; - return; - } + try { + // PDO is only supported with PHP5, + // so it is allowed to use try~catch statment in this class. + $this->handler = new PDO('sqlite:'.$this->database); + } catch (PDOException $e) { + $this->setError(-1, 'Connection failed: '.$e->getMessage()); + $this->is_connected = false; + return; + } // Check connections $this->is_connected = true; - $this->password = md5($this->password); + $this->password = md5($this->password); } /** From 2a6f6e3c04d6dd86c6ecaf780860607e95688617 Mon Sep 17 00:00:00 2001 From: flyskyko Date: Wed, 21 Sep 2011 01:11:34 +0000 Subject: [PATCH 0788/1372] issue 160, fix a bug for garbled text after copy module instance git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9244 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- config/func.inc.php | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/config/func.inc.php b/config/func.inc.php index 970af2227..0b7833813 100644 --- a/config/func.inc.php +++ b/config/func.inc.php @@ -988,6 +988,23 @@ } } + function htmlHeader() + { + echo << + + + + + +HTMLHEADER; + } + + function htmlFooter() + { + echo ''; + } + function alertScript($msg) { if(!$msg) return; From 5e4638ae9499ee3916a9b2f7f2a44dd8a8e87c2d Mon Sep 17 00:00:00 2001 From: flyskyko Date: Wed, 21 Sep 2011 03:03:06 +0000 Subject: [PATCH 0789/1372] issue 160, fix a bug for do not display user defined language when modify widget code git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9245 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/module/conf/module.xml | 2 +- modules/module/module.model.php | 15 ++++++++-- modules/widget/tpl/js/generate_code.js | 1 + modules/widget/tpl/js/multi_lang.js | 30 +++++++++++++++++++ .../tpl/widget_generate_code.include.html | 7 +++++ 5 files changed, 52 insertions(+), 3 deletions(-) create mode 100644 modules/widget/tpl/js/multi_lang.js diff --git a/modules/module/conf/module.xml b/modules/module/conf/module.xml index d5e0202fe..cf1380566 100644 --- a/modules/module/conf/module.xml +++ b/modules/module/conf/module.xml @@ -33,7 +33,7 @@ - + diff --git a/modules/module/module.model.php b/modules/module/module.model.php index 1ff2f35bd..12632a5d8 100644 --- a/modules/module/module.model.php +++ b/modules/module/module.model.php @@ -120,7 +120,7 @@ $site_args->index_module_srl = $mid_output->data->module_srl; $site_args->domain = $domain; $site_args->default_language = $db_info->lang_type; - + if($output->data && !$output->data->index_module_srl) { $output = executeQuery('module.updateSite', $site_args); } else { @@ -989,7 +989,7 @@ return; } return $config; - + } /** @@ -1513,5 +1513,16 @@ } $this->add('results', $list); } + + function getLangByLangcode() + { + $langCode = Context::get('langCode'); + if (!$langCode) return; + + $oModuleController = &getController('module'); + $oModuleController->replaceDefinedLangCode($langCode); + + $this->add('lang', $langCode); + } } ?> diff --git a/modules/widget/tpl/js/generate_code.js b/modules/widget/tpl/js/generate_code.js index 2f74b051e..405f8ba02 100644 --- a/modules/widget/tpl/js/generate_code.js +++ b/modules/widget/tpl/js/generate_code.js @@ -176,6 +176,7 @@ function doFillWidgetVars() { xe.broadcast('MULTIORDER_SYNC'); xe.broadcast('MODULELIST_SYNC'); xe.broadcast('MID_SYNC'); + xe.broadcast('MULTILANG_SYNC'); jQuery('.filebox') .each(function(){ diff --git a/modules/widget/tpl/js/multi_lang.js b/modules/widget/tpl/js/multi_lang.js new file mode 100644 index 000000000..4805407ad --- /dev/null +++ b/modules/widget/tpl/js/multi_lang.js @@ -0,0 +1,30 @@ +(function($){ + +xe.MultiLangManager = xe.createApp("MultiLangManager", { + $keyObj: null, + + init: function(key){ + var $keyObj = this.$keyObj = $('.extra_vars input[name='+key+']'); + }, + + API_MULTILANG_SYNC: function(){ + var self = this; + var regexp = /^\$user_lang\-\>/; + + var langCode = this.$keyObj.val(); + if (!regexp.test(langCode)) return; + + function on_complete(data){ + if (data.error){ + alert(data.message); + return; + } + + $('#' + self.$keyObj.attr('name')).val(data.lang); + } + + $.exec_json('module.getLangByLangcode', {'langCode': langCode}, on_complete); + } +}); + +})(jQuery); \ No newline at end of file diff --git a/modules/widget/tpl/widget_generate_code.include.html b/modules/widget/tpl/widget_generate_code.include.html index 4396c1e83..52f078ee5 100644 --- a/modules/widget/tpl/widget_generate_code.include.html +++ b/modules/widget/tpl/widget_generate_code.include.html @@ -1,6 +1,7 @@ +
                              @@ -55,6 +59,9 @@ {$lang->cmd_set_multilingual} +
                              - +

                              diff --git a/modules/module/module.model.php b/modules/module/module.model.php index 12632a5d8..963f797ae 100644 --- a/modules/module/module.model.php +++ b/modules/module/module.model.php @@ -1514,6 +1514,15 @@ $this->add('results', $list); } + /** + * @brief already instance created module list + **/ + function getModuleListByInstance($columnList = array()) + { + $output = executeQueryArray('module.getModuleListByInstance', $args, $columnList); + return $output; + } + function getLangByLangcode() { $langCode = Context::get('langCode'); From 97aea3e3ebbae21f0314122fef1df131352d2ffe Mon Sep 17 00:00:00 2001 From: chschy Date: Wed, 21 Sep 2011 04:47:07 +0000 Subject: [PATCH 0792/1372] issue 160, Modify output message for ip checking of admin page git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9248 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/module/ModuleHandler.class.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/classes/module/ModuleHandler.class.php b/classes/module/ModuleHandler.class.php index 90c3f2525..fbf592197 100644 --- a/classes/module/ModuleHandler.class.php +++ b/classes/module/ModuleHandler.class.php @@ -201,7 +201,15 @@ if($kind == 'admin' && $logged_info->is_admin == 'Y'){ $oModuleAdminModel = &getAdminModel('module'); - if(!$oModuleAdminModel->getModuleAdminIPCheck()) return false; + if(!$oModuleAdminModel->getModuleAdminIPCheck()) { + $this->error = "msg_not_permitted_act"; + $oMessageObject = &ModuleHandler::getModuleInstance('message',$type); + $oMessageObject->setError(-1); + $oMessageObject->setMessage($this->error); + $oMessageObject->dispMessage(); + return $oMessageObject; + } + } unset($logged_info); From 7828df256a273bbfed8095d6adfa53938345e11f Mon Sep 17 00:00:00 2001 From: ovclas Date: Wed, 21 Sep 2011 05:10:27 +0000 Subject: [PATCH 0793/1372] issue 160 document count with temp document in admin document list git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9249 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/document/document.model.php | 3 ++- modules/module/queries/getModuleListByInstance.xml | 11 +++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 modules/module/queries/getModuleListByInstance.xml diff --git a/modules/document/document.model.php b/modules/document/document.model.php index e595432f6..24af905bf 100644 --- a/modules/document/document.model.php +++ b/modules/document/document.model.php @@ -200,7 +200,7 @@ $args->end_date = $obj->end_date?$obj->end_date:null; $args->member_srl = $obj->member_srl; $args->statusList = $obj->statusList?$obj->statusList:array($this->getConfigStatus('secret'), $this->getConfigStatus('public')); - if($logged_info->is_admin == 'Y') $args->statusList = array($this->getConfigStatus('secret'), $this->getConfigStatus('public')); + if($logged_info->is_admin == 'Y') $args->statusList = array($this->getConfigStatus('secret'), $this->getConfigStatus('public'), $this->getConfigStatus('temp')); // Category is selected, further sub-categories until all conditions if($args->category_srl) { $category_list = $this->getCategoryList($args->module_srl); @@ -324,6 +324,7 @@ $output->page = $page_navigation->cur_page; } else { $output = executeQueryArray($query_id, $args, $columnList); + debugPrint($output->get('_query')); } } // Return if no result or an error occurs diff --git a/modules/module/queries/getModuleListByInstance.xml b/modules/module/queries/getModuleListByInstance.xml new file mode 100644 index 000000000..f668b74ea --- /dev/null +++ b/modules/module/queries/getModuleListByInstance.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + From 3c3481f377a899d08e8db0f8c4873b37d5a3bb12 Mon Sep 17 00:00:00 2001 From: chschy Date: Wed, 21 Sep 2011 06:53:02 +0000 Subject: [PATCH 0794/1372] issue 160, modify javscript in spamfilter page and language git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9250 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/spamfilter/lang/lang.xml | 15 +++------ modules/spamfilter/tpl/index.html | 29 ++++++++++------ modules/spamfilter/tpl/js/spamfilter_admin.js | 33 +++++++++++-------- 3 files changed, 43 insertions(+), 34 deletions(-) diff --git a/modules/spamfilter/lang/lang.xml b/modules/spamfilter/lang/lang.xml index e4d94b88d..ac6369dbf 100644 --- a/modules/spamfilter/lang/lang.xml +++ b/modules/spamfilter/lang/lang.xml @@ -237,15 +237,8 @@ l'article qui comporte le mot ne sera pas affichagé.]]> - - + + + - - - - - - - - - \ No newline at end of file + diff --git a/modules/spamfilter/tpl/index.html b/modules/spamfilter/tpl/index.html index ebdd98500..b6da991fc 100644 --- a/modules/spamfilter/tpl/index.html +++ b/modules/spamfilter/tpl/index.html @@ -1,13 +1,22 @@ +
                              - -
                              + @@ -18,16 +27,16 @@

                              {$lang->cmd_interval}

                              limits=='Y' || $config->limits =='')-->checked="checked" /> - - limits!='Y' && $config->limits !='')--> checked="checked" /> + + limits!='Y' && $config->limits !='')--> checked="checked" />

                            • {$lang->cmd_check_trackback}

                              check_trackback=='Y' || $config->check_trackback=='')--> checked="checked" /> - - check_trackback!='Y' && $config->check_trackback!='')--> checked="checked" / > + + check_trackback!='Y' && $config->check_trackback!='')--> checked="checked" / >

                            • @@ -36,14 +45,14 @@
                            • - + {$lang->about_denied_ip}

                              @@ -52,13 +61,13 @@

                              - + {$lang->about_denied_word}

                              diff --git a/modules/spamfilter/tpl/js/spamfilter_admin.js b/modules/spamfilter/tpl/js/spamfilter_admin.js index 85a0a63ba..a8b93f945 100644 --- a/modules/spamfilter/tpl/js/spamfilter_admin.js +++ b/modules/spamfilter/tpl/js/spamfilter_admin.js @@ -20,23 +20,30 @@ function doDeleteDeniedWord(word) { fo_obj.submit(); } -function doInsertDeniedSome(some){ +function checkSomeValid(some){ var fo_obj = get_by_id('spamfilterInsert'); - if(some == 'ipaddressList'){ - var reg = /^(\d{1,3}(?:.(\d{1,3}|\*)){3}\s*(\/\/[^\r\n]*)?[\r\n]*)*$/; - var matchStr = fo_obj.ipaddressList.value; + var reg_ipaddress = /^(\d{1,3}(?:.(\d{1,3}|\*)){3}\s*(\/\/[^\r\n]*)?[\r\n]*)*$/; + var matchStr_ipaddress = fo_obj.ipaddressList.value; + + var reg_word = /^(.{2,40}[\r\n]+)*.{0,40}$/; + var matchStr_word = fo_obj.wordList.value; + + var valid_word = true; + var valid_ip = true; + + if(!matchStr_ipaddress.match(reg_ipaddress)) valid_ip = false; + if(!matchStr_word.match(reg_word)) valid_word = false; + + if(some == 'ip'){ fo_obj.wordList.value = ''; - } - else if(some == 'wordList'){ - var reg = /^(.{2,40}[\r\n]+)*.{2,40}$/; - var matchStr = fo_obj.wordList.value; + valid_word = true; + } else if(some == 'word'){ fo_obj.ipaddressList.value = ''; + valid_ip = true; } - if(!matchStr.match(reg)){ - alert('형식에 맞게 입력하세요'); return false; - } - - fo_obj.submit(); + if(valid_ip && valid_word) return true; + else return false; } + From 867ae8f6ab50e6592c234cc6da27d9b0c0861c36 Mon Sep 17 00:00:00 2001 From: ovclas Date: Wed, 21 Sep 2011 07:45:13 +0000 Subject: [PATCH 0795/1372] issue 160 default action change to arrange menu in sitemap admin git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9251 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/document/document.model.php | 1 - modules/menu/tpl/js/sitemap.js | 16 ++++++++++------ modules/menu/tpl/sitemap.html | 6 +++--- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/modules/document/document.model.php b/modules/document/document.model.php index 24af905bf..e022a1c5d 100644 --- a/modules/document/document.model.php +++ b/modules/document/document.model.php @@ -324,7 +324,6 @@ $output->page = $page_navigation->cur_page; } else { $output = executeQueryArray($query_id, $args, $columnList); - debugPrint($output->get('_query')); } } // Return if no result or an error occurs diff --git a/modules/menu/tpl/js/sitemap.js b/modules/menu/tpl/js/sitemap.js index 7e5c0a8f2..ac426b9d9 100644 --- a/modules/menu/tpl/js/sitemap.js +++ b/modules/menu/tpl/js/sitemap.js @@ -85,12 +85,16 @@ $('form.siteMap') } $('a._delete').click(function() { - menuSrl = $(this).parents().prevAll('input[name=menu_srl]').val(); - menuForm = $('#menu_'+menuSrl); + if(confirmDelete()) + { + menuSrl = $(this).parents().prevAll('input[name=menu_srl]').val(); + menuForm = $('#menu_'+menuSrl); - var menu_item_srl = $(this).parent().prevAll('._item_key').val(); - menuForm.find('input[name=menu_item_srl]').val(menu_item_srl); - menuForm.submit(); + var menu_item_srl = $(this).parent().prevAll('._item_key').val(); + menuForm.find('input[name=menu_item_srl]').val(menu_item_srl); + menuForm.find('input[name=act]').val('procMenuAdminDeleteItem'); + menuForm.submit(); + } }); var kindModuleLayer = $('#kindModule'); @@ -190,7 +194,7 @@ $('form.siteMap') }); }); -function confirmDelete(form) +function confirmDelete() { if(confirm(xe.lang.confirm_delete)) return true; return false; diff --git a/modules/menu/tpl/sitemap.html b/modules/menu/tpl/sitemap.html index 54daad5f3..7def82f8c 100644 --- a/modules/menu/tpl/sitemap.html +++ b/modules/menu/tpl/sitemap.html @@ -13,8 +13,8 @@ xe.lang.confirm_delete = "{$lang->confirm_delete}"; {@$menuSrl = $value->menuSrl} - - + + @@ -31,7 +31,7 @@ xe.lang.confirm_delete = "{$lang->confirm_delete}"; {$lang->add_menu} - + {$lang->cmd_remake_cache}

                              From d62341b3c60ff70b14a29fcda21f6be08d9a66bf Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Wed, 21 Sep 2011 08:35:34 +0000 Subject: [PATCH 0796/1372] xpresseditor UI fix. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9252 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/editor/lang/lang.xml | 6 -- .../editor/skins/xpresseditor/css/default.css | 86 +++++------------- modules/editor/skins/xpresseditor/editor.html | 8 +- .../skins/xpresseditor/img/btn_set.black.gif | Bin 11729 -> 11141 bytes .../editor/skins/xpresseditor/img/btn_set.gif | Bin 12267 -> 11749 bytes .../xpresseditor/img/btn_set_blank.black.gif | Bin 2294 -> 2034 bytes .../skins/xpresseditor/img/btn_set_blank.gif | Bin 2244 -> 2209 bytes modules/editor/styles/default/editor.css | 28 +++--- modules/editor/styles/default/style.css | 12 ++- 9 files changed, 49 insertions(+), 91 deletions(-) diff --git a/modules/editor/lang/lang.xml b/modules/editor/lang/lang.xml index d51ad6c15..6b264f711 100644 --- a/modules/editor/lang/lang.xml +++ b/modules/editor/lang/lang.xml @@ -739,9 +739,6 @@ Bài viết tự động lưu sẽ tự động hủy sau khi bạn hoàn thành - - - @@ -751,9 +748,6 @@ Bài viết tự động lưu sẽ tự động hủy sau khi bạn hoàn thành - - - diff --git a/modules/editor/skins/xpresseditor/css/default.css b/modules/editor/skins/xpresseditor/css/default.css index 9d32426c3..f236afa51 100644 --- a/modules/editor/skins/xpresseditor/css/default.css +++ b/modules/editor/skins/xpresseditor/css/default.css @@ -11,10 +11,10 @@ .xpress-editor img, .xpress-editor fieldset, .xpress-editor button{ border:0;} -.xpress-editor button{ background:none; background-repeat:no-repeat; cursor:pointer; _cursor /**/:hand;} +.xpress-editor button{ background:none; background-repeat:no-repeat; cursor:pointer; } .xpress-editor button *{ visibility:hidden;} .xpress-editor legend{ position:absolute; width:0; height:0; font-size:0; line-height:0; overflow:hidden; visibility:hidden;} -.xpress-editor label{ cursor:pointer; _cursor /**/:hand;} +.xpress-editor label{ cursor:pointer; } .xpress-editor hr{ display:none;} .xpress-editor li{list-style:none;} @@ -59,10 +59,10 @@ .xpress-editor .tool ul.type{ width:auto; white-space:nowrap;} .xpress-editor .tool ul.style{ width:169px; z-index:6;} .xpress-editor .tool ul.paragraph{ width:169px; z-index:5;} -.xpress-editor .tool ul.extra1{ width:90px; z-index:4;} +.xpress-editor .tool ul.extra1{ width:69px; z-index:4;} .xpress-editor .tool ul.table{ width:85px; z-index:3;} .xpress-editor .tool ul.extra2{ width:auto; z-index:2;} -.xpress-editor .tool ul.extra3{ float:right; width:auto; z-index:1; margin-right:1px;} +.xpress-editor .tool ul.extra3{ float:left; width:auto; z-index:1; margin-right:1px;} .xpress-editor .tool ul.extra3 li{ margin-right:4px;} .xpress-editor .tool li{ position:relative; float:left; margin:0 !important} .xpress-editor .tool li button{ width:21px; height:21px; background:url(../img/btn_set.gif) no-repeat 0 0; vertical-align:top;} @@ -70,11 +70,10 @@ .xpress-editor .tool li button span{ position:absolute; top:0; left:0; width:0; height:0; overflow:hidden; visibility:hidden;} .xpress-editor .tool li.extensions span.exButton, -.xpress-editor .tool li.extensions span.exButton button{ float:left; position:relative; display:inline-block; width:auto; background:url(../img/btn_extension.gif) no-repeat left top;} -.xpress-editor .tool li.extensions span.exButton{ margin-right:18px;} -.xpress-editor .tool li.extensions span.exButton button{ left:18px; height:21px; background-position:right top; padding:0 4px 0 0; font:11px/21px Tahoma, Sans-serif; text-align:left; *overflow:visible; *line-height:20px;} +.xpress-editor .tool li.extensions span.exButton button{ float:left; position:relative; display:inline-block; width:auto; background:url(../img/btn_set_blank.gif) no-repeat left top;} +.xpress-editor .tool li.extensions span.exButton button{ left:2px; height:21px; background-position:right top; padding:0 4px; font:11px/21px Tahoma, Sans-serif; text-align:left; *overflow:visible; *line-height:20px;} .xpress-editor.black .tool li.extensions span.exButton, -.xpress-editor.black .tool li.extensions span.exButton button{ color:#fff; background-image:url(../img/btn_extension.black.gif); } +.xpress-editor.black .tool li.extensions span.exButton button{ color:#fff; background-image:url(../img/btn_set_blank.black.gif); } .xpress-editor .tool li.html span, .xpress-editor .tool li.html span button, @@ -116,11 +115,10 @@ .xpress-editor .tool li.blockquote button{ width:22px; background-position:-381px 0;} .xpress-editor .tool li.url button{ width:26px; background-position:-403px 0;} .xpress-editor .tool li.character button{ background-position:-429px 0;} -.xpress-editor .tool li.find button{ background-position:-450px 0;} -.xpress-editor .tool li.table button{ width:22px; background-position:-471px 0;} -.xpress-editor .tool li.merge button{ background-position:-493px 0;} -.xpress-editor .tool li.splitCol button{ background-position:-514px 0;} -.xpress-editor .tool li.splitRow button{ background-position:-535px 0;} +.xpress-editor .tool li.table button{ width:22px; background-position:-450px 0;} +.xpress-editor .tool li.merge button{ background-position:-472px 0;} +.xpress-editor .tool li.splitCol button{ background-position:-493px 0;} +.xpress-editor .tool li.splitRow button{ background-position:-514px 0;} .xpress-editor .tool li.extensions span{ background-position:0 0;} .xpress-editor .tool li.extensions span button{ background-position:right 0;} .xpress-editor .tool li.html span{ background-position:0 0;} @@ -150,11 +148,10 @@ .xpress-editor .tool li.blockquote button.hover{ width:22px; background-position:-381px -21px;} .xpress-editor .tool li.url button.hover{ width:26px; background-position:-403px -21px;} .xpress-editor .tool li.character button.hover{ background-position:-429px -21px;} -.xpress-editor .tool li.find button.hover{ background-position:-450px -21px;} -.xpress-editor .tool li.table button.hover{ width:22px; background-position:-471px -21px;} -.xpress-editor .tool li.merge button.hover{ background-position:-493px -21px;} -.xpress-editor .tool li.splitCol button.hover{ background-position:-514px -21px;} -.xpress-editor .tool li.splitRow button.hover{ background-position:-535px -21px;} +.xpress-editor .tool li.table button.hover{ width:22px; background-position:-450px -21px;} +.xpress-editor .tool li.merge button.hover{ background-position:-472px -21px;} +.xpress-editor .tool li.splitCol button.hover{ background-position:-493px -21px;} +.xpress-editor .tool li.splitRow button.hover{ background-position:-514px -21px;} .xpress-editor .tool li.extensions span.hover{ background-position:0 -21px;} .xpress-editor .tool li.extensions span.hover button{ background-position:right -21px;} .xpress-editor .tool li.html span.hover{ background-position:0 -21px;} @@ -184,11 +181,10 @@ .xpress-editor .tool li.blockquote button.active{ width:22px; background-position:-381px -42px;} .xpress-editor .tool li.url button.active{ width:26px; background-position:-403px -42px;} .xpress-editor .tool li.character button.active{ background-position:-429px -42px;} -.xpress-editor .tool li.find button.active{ background-position:-450px -42px;} -.xpress-editor .tool li.table button.active{ width:22px; background-position:-471px -42px;} -.xpress-editor .tool li.merge button.active{ background-position:-493px -42px;} -.xpress-editor .tool li.splitCol button.active{ background-position:-514px -42px;} -.xpress-editor .tool li.splitRow button.active{ background-position:-535px -42px;} +.xpress-editor .tool li.table button.active{ width:22px; background-position:-450px -42px;} +.xpress-editor .tool li.merge button.active{ background-position:-472px -42px;} +.xpress-editor .tool li.splitCol button.active{ background-position:-493px -42px;} +.xpress-editor .tool li.splitRow button.active{ background-position:-514px -42px;} .xpress-editor .tool li.extensions span.active{ background-position:0 -42px;} .xpress-editor .tool li.extensions span.active button{ background-position:right -42px;} .xpress-editor .tool li.html span.active{ background-position:0 -42px;} @@ -220,14 +216,13 @@ .xpress-editor .tool.off li.blockquote button{ width:22px; background-position:-381px -63px;} .xpress-editor .tool.off li.url button{ width:26px; background-position:-403px -63px;} .xpress-editor .tool.off li.character button{ background-position:-429px -63px;} -.xpress-editor .tool.off li.find button{ background-position:-450px -63px;} -.xpress-editor .tool.off li.table button{ width:22px; background-position:-471px -63px;} +.xpress-editor .tool.off li.table button{ width:22px; background-position:-450px -63px;} .xpress-editor .tool.off li.merge button, -.xpress-editor .tool li.merge button.off{ background-position:-493px -63px;} +.xpress-editor .tool li.merge button.off{ background-position:-472px -63px;} .xpress-editor .tool.off li.splitCol button, -.xpress-editor .tool li.splitCol button.off{ background-position:-514px -63px;} +.xpress-editor .tool li.splitCol button.off{ background-position:-493px -63px;} .xpress-editor .tool.off li.splitRow button, -.xpress-editor .tool li.splitRow button.off{ background-position:-535px -63px;} +.xpress-editor .tool li.splitRow button.off{ background-position:-514px -63px;} .xpress-editor .tool.off li.extensions span{ background-position:0 -63px;} .xpress-editor .tool.off li.extensions span button{ background-position:right -63px; color:#bcbcbc;} .xpress-editor .tool.off li button{ cursor:default;} @@ -354,37 +349,6 @@ .xpress-editor .tool li.character .layer p input{ padding:3px 0 0 4px; margin:0 4px 0 0; width:300px; _width /**/:306px; height:16px; _height /**/:20px; border:1px solid #acacac; border-right:1px solid #dadada; border-bottom:1px solid #dadada;} .xpress-editor .tool li.character .layer p button{ position:relative; *top:1px; width:38px; height:21px; background:url(../img/btn_layer_confirm.gif) no-repeat;} .xpress-editor .tool li.character .layer p button span{ position:absolute; width:0; height:0; overflow:hidden; visibility:hidden;} - -.xpress-editor .tool li.find .layer{ width:242px;} -.xpress-editor .tool li.find .layer h3{ background:#f2f2f2; color:#333; height:21px; margin:0 0 11px 0; padding:7px 0 0 5px;} -.xpress-editor .tool li.find .layer .menu_tab{ position:relative; z-index:20; width:100%; *zoom:1;} -.xpress-editor .tool li.find .layer .menu_tab:after{ content:""; display:block; clear:both;} -.xpress-editor .tool li.find .layer .layer_tab{ position:relative; left:10px; padding:0; margin:0; clear:both;} -.xpress-editor .tool li.find .layer .layer_tab li{ position:relative; z-index:1; float:left; margin-right:1px; background:url(../img/btn_layer_tab.gif) no-repeat 0 0;} -.xpress-editor .tool li.find .layer .layer_tab li a{ position:relative; display:block; float:left; left:2px; height:15px; padding:4px 9px 0 5px; color:#404040; text-decoration:none; background:url(../img/btn_layer_tab.gif) no-repeat right 0;} -.xpress-editor .tool li.find .layer.find .layer_tab li.tab1, -.xpress-editor .tool li.find .layer.replace .layer_tab li.tab2{ top:-1px; margin-bottom:-1px;} -.xpress-editor .tool li.find .layer.find .layer_tab li.tab1 a, -.xpress-editor .tool li.find .layer.replace .layer_tab li.tab2 a{ height:18px;} -.xpress-editor .tool li.find .layer .container{ position:relative; z-index:1; clear:both; top:-2px;} -.xpress-editor .tool li.find .layer .container .bx{ display:none; position:relative; width:222px; left:10px; clear:both; z-index:1; background:url(../img/bx_find.gif) no-repeat;} -.xpress-editor .tool li.find .layer.find .container #find, -.xpress-editor .tool li.find .layer.replace .container #replace{ display:block;} - -.xpress-editor .tool li.find .layer .bx fieldset{ position:relative; padding:13px 0 17px 11px;} -.xpress-editor .tool li.find .layer .bx fieldset *{ vertical-align:top;} -.xpress-editor .tool li.find .layer .bx label{ position:relative; top:4px; margin:0 7px 0 0; font-size:11px; letter-spacing:-1px; color:#333;} -.xpress-editor .tool li.find .layer .bx input{ padding:3px 0 0 4px; width:144px; _width /**/:150px; height:14px; _height /**/:19px; border:1px solid #acacac; border-right:1px solid #dadada; border-bottom:1px solid #dadada;} -.xpress-editor .tool li.find .layer .bx .cap{ position:absolute; left:0; bottom:0; display:block; width:222px; height:2px; _margin:0 0 -1px 0; overflow:hidden; background:#fff url(../img/bx_find.gif) no-repeat left bottom; font-size:0; line-height:0;} -.xpress-editor .tool li.find .layer .bx#replace fieldset{ height:45px; _height /**/:75px;} -.xpress-editor .tool li.find .layer .bx#replace fieldset #keyword2{ margin-bottom:6px;} -.xpress-editor .tool li.find .layer .btn_area button{ display:none; *margin:0 2px !important;} -.xpress-editor .tool li.find .layer.find .btn_area .find_next{ display:inline; width:62px; height:21px; background:url(../img/btn_layer_find_next_strong.gif) no-repeat;} -.xpress-editor .tool li.find .layer.replace .btn_area .find_next{ display:inline; width:55px; height:21px; background:url(../img/btn_layer_find_next.gif) no-repeat;} -.xpress-editor .tool li.find .layer.replace .btn_area .replace{ display:inline; width:48px; height:21px; background:url(../img/btn_layer_replace.gif) no-repeat;} -.xpress-editor .tool li.find .layer.replace .btn_area .replace_all{ display:inline; width:69px; height:21px; background:url(../img/btn_layer_replace_all.gif) no-repeat;} -.xpress-editor .tool li.find .layer .btn_area .cancel{ display:inline;} - .xpress-editor .tool li.extensions .layer{ width:auto; white-space:nowrap; padding:5px 10px;} .xpress-editor .tool li.extensions .layer li{ margin:2px 0;} .xpress-editor .tool li.extensions .layer li a { color:#000; text-decoration:none; } @@ -397,13 +361,13 @@ .xpress-editor .fileUploader .preview.black { background-color:#000; border:1px solid #666;} .xpress-editor .fileUploader .preview img{ display:block; width:64px; height:64px;} .xpress-editor .fileUploader .fileListArea{ float:left; width:260px; margin:0 10px 5px 0;} -.xpress-editor .fileUploader .fileListArea select{ width:100%; height:70px; overflow:auto;} +.xpress-editor .fileUploader .fileListArea select{ width:100%; height:70px; overflow:auto; margin:0; padding:0; float:none} .xpress-editor .fileUploader .fileListArea select option{ font-size:11px;} .xpress-editor .fileUploader .fileListArea.black select { background-color:#000; border:1px solid #666;} .xpress-editor .fileUploader .fileListArea.black select option { color:#aaa; } .xpress-editor .fileUploader .fileUploadControl{ clear:right;} .xpress-editor .fileUploader .fileUploadControl .button{ margin-bottom:5px;} -.xpress-editor .fileUploader .file_attach_info{ clear:right; margin:5px 0;} +.xpress-editor .fileUploader .file_attach_info{ clear:right; margin:5px 0; font-size:11px; color:#333} /* Auto Save */ .xpress-editor .autosave_message { display:none; background: #f6ffdb; padding:6px 10px; margin:0; line-height:1;} diff --git a/modules/editor/skins/xpresseditor/editor.html b/modules/editor/skins/xpresseditor/editor.html index 3867059ed..3a59961a9 100644 --- a/modules/editor/skins/xpresseditor/editor.html +++ b/modules/editor/skins/xpresseditor/editor.html @@ -406,7 +406,7 @@ @@ -466,9 +466,9 @@
                              - - - + + +
                              {$upload_status}
                              diff --git a/modules/editor/skins/xpresseditor/img/btn_set.black.gif b/modules/editor/skins/xpresseditor/img/btn_set.black.gif index 0940eca964436df30cd1bb462b070b4af0ea4e57..74e3b1d3060bbb5f2bf894a1e3299e88b161718a 100755 GIT binary patch literal 11141 zcmcKA=Tj5T7byHB7=ch#l#bYtUTkzh5v7BbUMwIT#IFhnNRU7X0YdMg*U)<)B%zlO zKx!xfq$YGx>5#|Y{Rf`==I)C#J3BkGJ9B2vocZiN(S59>{F)c^0Z@0;UcY`VBO?uCA`Gs;WAF{`|Rf=X!g4 zM@L5+8yoN4yO*7vt*57V`SN9LZEXw&)7RHmS64SUIH;_w3L{WtFNzbWo5;}!otD9!OYCeU@!px@5hycGymrh>Ho$5k;yVHK2TKs)0I>0Vtb}nM%;RO_gb@>pL55 zYk!G*e~vbPZ*K4V(${!R#x=j5a$mxIlDBR30~~x>8#0;0!fGT1{KQc?4*-1fosDlE zUN4d2dsr-m9l9Z}l!?!PF-2Uqk+16SQ6t zzE<}CEd~Y7wKyJJO;Al#u)^BlYG6X<|vtPrC&e$ZEh>p9bzkKT?Gn>0j{-d zG+8aHFPjfv-J6${b>-?T{VKaPUTM41pHjb1EvfkWWoeFgJ7Kn(Z7R~B+1I{wu-%J81m=l9L#??V{0J5F)p?^*8{IvP5JGjQB4nJq zh2Yq9Z*aKm7|Q}e7U6x><|f`-+s2mXK-)$jL@ApQp*X|$Rz>9&f9`+JCdJ>y-;oVl z3Ndw0eivtIVrrlGMsFf7@x8mQAk@Yy$syI&*+-j;CjCQ;b?eWZLx?~tfS3_@76M@Z z;0_OphF?WI%o2FmP?&?f*SnalYjLqPOex9x4U3eO^V|H?m?eqO+r9g_A!(6~uZxTV zk|bkGy!KZ^OFDf!N`xl!vdYRnH?CQ0PhMQNE<9{>M&7>Kbfv8Hp8gvaSj1s^L|+J& zTHP6-v{5xNxdJPhs59S4SaA1tt1NbQp;l$1S-!Ig;@LI}3+mu+W1I6;-*aA{Oa6|o zvJmiymg9Ea<_(@n*~o%lDiLqIcfZl8Ar5W!fx+?$tU&A(dXHf067>*jhX{mDf5;bO ze(?2em8rPqu*Sjy~nM(0_7o@9#KfK9nnZ|wGpwE?PT zuIyQTA_uMs?N2BVD-#K?-uEf6Gpnx4&#K=}E6i3L=ePx7vMakcDd>W(Ug5)tp5e`n z-TXyQPUwem%OP!4RtqqA74tGozZJb6bE@4^^)b3>OQ;)v#M>Nu+O&<^!@v23sh4fC z?n}I{MmG{<_WxZgNKpGdJcalF^^oVW8iPKwidN%Y(*G84nENFP@4p;X-pKo-{@dx% zpYg5xhrcZg@W*+i+0VI8R3};hEP1MSThqL1(+B-f4rIn^h+VLdC)7xNuJycUrYdHH z^Q;_87R!@;5Ff=jAVxJQ+QjqWawQ7JhRetiy{?V{pxBw^YOy9nhN`IrZFhTV z%~gtrXdhF5HB@M9eb@?k{O-rE6z^u*r*hvhm#p;!IPUu63U6C(+Y_`|yTYw=2nV&d z{9O$it8?WljJ3-r_zO>VT7Dqbny&4^3sppg;A{bROn8M^S~mQjhUYdt;7TCEzL|3~ z8__Z$i(L&r&38V)4Sp`-0c~Oln+%xUqa1#Mot8w>PMq>$i-f6DuUyF-TZvU3XB0O{ z-so0BpR&EIDP7O3$}901z(LBEU;jBIHnCkgUsjpeYg08O+pCs$J1R^MU$U#CMCt@7atu@u@9Jbog7z2h#%H>fzI(oAPO%x2jp>ka za0^d-t^Vmu`3cDWiT+ei*`?Yl4mYm|DSVG_cuid`@neJ_m40>{y9+Jzlvo3gJC8Tb zsBhZWYf(2oC*X>2%-f%XoMEfjYs$9%;i?@zJ&f41y;L#GA+33HXwtJv(9J5^&eOUl zNV6zoKspLxA3Gf%b5R|AO+}L?74t;=ZO5o3TG5#PX#T zEQ=2kOq=5j-D|lf`vI=1Hp`pg-B9$=1IatRaN@4m@!-B!gza<)Pq}xm?#zeSZ$eAg z6rmj&M(y#W>E+v82jsWtkN)3YubgA}45)Jc30F*8Q8HE;N)-8%{cW0lrCfRVxvXd5 zkC_-NGKKQm;Frip!XY4Bq334={BK<{4roB zBO`4^%Qp8%?9896CnqZk#=h5z(7($E{MKbOj(W#!ewTjn-wba*oSqfgZMtdC8N@j1 zzo4-X5D(l*95`N9WgHAf;r|pEpR8Ik4k-ip-THx(&9983IWEF}m+|RND&v^;E#TtV z!0B!i<77LEaJ*v7IGkdf?hg=7_XZfJNB{amzCe&t;2E>Pv)+L$NrBsmXV?b=Irjs( z_XEwj0YGl(B|fMwF_5)JLGjzh;uj0l@em31GQrbHQx{U&oR^! z9_p3^zG(vfs1xca9vWyC8l(jGEesJ+f(P>fz9ogiSm2@FA%12dh$J|I782zh`cgA2 zBq=Pi8y-&!``Qp@E(*-|MieF?3ie^e6hxs?SRM^g)s3j4AZpCQi@d`d8W3I$;aEyI zzB?Srhiv5wZ|@Eb&_Q+-BF|@r<7vny8nlmsBzhx9`H+L~@Cv1fA*G0N?}z~%#54;d z@`q03q+?`l5;!*ryiSSS+>hK858YOZ+R_R6;~ljj9<{F&b=VNKMTt61ibC?C7)q#% zo+y@N6srX4s1UGDL$T|kHYuU!%~2Qmqj_0TXC|Ve&!L1SqK^urMU+vzPEou)kyn$W zubW4&dB;fb$4E&;%Y{YdCIRpH#407nDjvX8CSsLX!|(IQ@e^Yo7R5d?kJFF{)k%(h zf{oKEii7aSvpB^X7R5p`0sMjSFN)%fbmMt^VrOFFkdCphv9VU>36{zU{DBF^`~YP- z_#IZ*p(w$HpZ}AS@W*8E2dB$E*ub4o2#POX&)t)!AP2zS10X~>1xHV*DM~HZO)E1`?@j`b zCZ`Ygz$bmuMkdm857Oqa>3O=s)SlGkqV#!I^qLQPR|(z557%|eOFO!i(72LzPloQ+;B67$W;PRY(|OfnZ0 z2XJRAWEKbRz{(nnuM`(o6c(GZiq{K>R|tq>A%Nz?n@!Fb$Xs#D;mzhl48Wv>nO~e# zjPYUtuoUI$_NI{qO0bBM^23r&l@fe!X^mcVr2wO>r?_-pQoO^WjHp*eODO|#i$_Dt zRv_i8tKgkp_$H)$x3KsQxA>8B84nzTTg3p@N++DlgS-j>#KIaqMBw=%uzV4hWswZA ztOx=~nat$Wt1N?nF6oyn_EuIxs(SPg!X{NWNX6oU*bTgNJi@G2=%)h=JPuxGrO zOSRNgl~j23T?{}0Q>{R%){qLlBb9o`vPyFb$m~<2tY7m(uk=}1&7-f?k4ZJUs;LH2 z)d7xGGeb26ng=`)$xRR!u-i+ES7T2_awRcpC0>HrnMr`!Nx&%(Qd|0ZB%{i+*NAn6Kh+7woL z5ae!I#fwQxTg}YUuNEBy7U?(msAeTg)a4cetE8GV?3n7lHr1&%32eiv!Qd! zcKL7u@~Nh}I2@*_OR9;a+SDV6BMagNEODJusg0`5%(}QCsZfFKnrF$)O{C^t3}A8% zH?P|CBOJ$Lj$aqVBPsYv)#h!frX5v+NMX}R7I5}8eoLz9po#ED3P1J(-=j)gXA5r( z2j8h63S<)5{hE2;_+I^Hl0JTFiojvT#5xE>LaF5<2o5-PrE_<`&1{Z|ZJj9^ zN4zuG1*~W{7V1dr>wHquEtm;B!2);bKWTctyv#&8l(}}_W}^!?H5mEC%5?ZwMdg+*pUeau`JGxR3!RK?AkU}uZwZmBCdg!i=v~)=$+Ur;H1IL9 z@9217K?u-dAbcz|$iNNQpavI@No@XuyL^4|IN}9ErX3;js2`coM;37F<2WIm=z{r7 z0J~0o_+wJa8WyeJ$FwoX073#WBd?KipR`T&M@Ue=>akgh^9<#8zoU zLuTZ$;lH9aVtO!a$T6bLF=A{8e7-UKRAv-{8hIrXs--^qvUJ3XV}zML{MK;9%0G8R zvh-rbD3Uf}ZaC`UHez}*Vt6w4!9QJNL&ijS%=cvYDRta69ekgIVkZpH+5lTLGsfN0 zDZ2inp>Dzf!eft{g#+B8w5)r~G=WK_6f?tdBaZRs8x&+C@BjV!Ei>ZA4TPh?N@PeV+o8`d*x8#6op@n+jI z6vOE0^w}Zd*+YNoJazVn3Ol32mnYkgisCMcs$$E|(Jv$=< zx+^*j>T}xoIW5kg%O}lrnZ^4?i|hf^4Z~S##4Pzln6H1%Ol0P1B-rwF z-qii_75AU7MV7~YEcBPo*`lc}AjaB{$AlHL7< zCS)>{b4d%mFdacFQ~@GqXpyJ1h*KEqK0T5%JT8EKL6jb0(_Cdv_kz=7%jlV#bfnU1 zlq}t#426_k%}3KS0_YGTtrEY=GqIYB2G`+N%iY&X+*d`C)*5YAkw(IqGiy2S>mBY< z#LZP;#d-mLEs7Huho=!E*OS~g5+gT;jS$>}jE$Mojk(PYTfWW3(~SzVO&TX~0loPX zzq#(d>9xN(x4F4fw)x9ui)ysBQ?|7gkiIXwxfi*0+`q|`u_>~@bs)0+*Jhj6zr7T& z$?|QRMPmy>*qRpkb#Zo!-*{WlV>_1*D0+G4s>aS02JHH`ovU2o;)I=Zc01C>JF<)& z3AxZ)8aoQMzh#VnD{<{8+WuCT`#p~ReWU!hD&x1D#~^~9Jq>|Mm}ZaXsex6Ht28~2g3`;m-&)a8R1je|JbgM@Df zNf`$zgoCu%12p3x^YUS~#$m4QVS+8TFypY8a9A>XSjIT4xO`Nlaa3b_RQK(uA>*i# zaD=>v%5Xcvj;>Y7rw2dp|6h7Sd96RLF^s+!7(z}J=IH@>Z-zxWr#Ek%r7iqN9oJ! z3+Vo)?Zvghja}N<>JGx}MZMZ!+xbYoOOQWCSv!gqKbxVQkb73OCbR8dcrP2p@s*BB z!Fc-l-`y?d(TVK9vkvFqN>%cZ(LN17U|Ud1yyh{#uKnD>*j9WmIW}y7|7jLBa_IJF zcTqx$K>3YYbB|&TTOd8_5sUHb;qdM3$lsT0Uh5Pyb>!DlxbwuhJZ+<$xp!z&4SCBU zj}EFWY!mLppS*y0yoa^HFWfXbtCR$?jpF|;V0B5~D!_o%R-{;2cEveSs|}{S70WA^ zpf0HHJ4sp|<+E+WBSyy<_D+^`>>0s?QX|RuPZ!XI2{ykz2&uP%eIUh3OBFa!M#pW> zg@k~wkkd8Gl-C_|T>4^lhAj)-_rGPklF=td(i;nesM&z~Cu2>fS-YCE*p{*59!2!c zJ?za119080u2&<^vXIAuP>eSg!T1+Lql z{{GpOTo&TodDA#0cZpDMgS5#2|G&q;xgCg=mnW#gP=4~N2lT< z=|kOY1jcv%CR|FkyGPu+L-eh+ztO`rFCGd4lRximw^%_`TfJ8K$`|`C)>Ss#6^$0U zmzHDa5F}}n5in&Y#j|zPwyY&`S2m5+_o=iNy5S(d zmewF)k2_}Rmdk>TozKubLtfSUZZ;U$a+7mbu;V7ACKltY-M5)4hsx;4isWW$!(%NC`^;&JU z|HbO6aNM}{RF(0yr2SFXCyKr0+YMlyWe|CTWb}=62lvR9{kGXrE}yX}X- zu{c-NO?23R_DC1tt4JTZ{3MG#JA?&TL5rdG2&@b8eZMwr6TlZ@uwpgX9Os99b@vrOpSYwCaBgqlJReujI1 zW0%^vV8_2>ZNELJ8_`$W-*X9M+<&4D6r+6u3yB^lDJZ=&DGWU8n#lyDXykV@2V6}W zl;h^TY`M=UQ|1UvlX(Q!*q(R@tk=8(amjk-D=abJ>(0JZEv_#4=tH>W@q^uc zQ}q=Ey6>#&<=wud&ix3kh@~m?-+r2Uw00$s{`T>1-8g>R(ImpPWHxxQq4UK2sUzwc z`cJku`;dR+LnM31wLLyUg2~RM{j7nj3%m~`9nZ)7!Wds=FzZ3WZt=Zb%)Kb^m`UJH zV0;()A=6CVN1{ej}HfLSovx>bQKy$jIG!W*F zddOivAVydLN3*i0wzmawSz*a0ULT4fYCrG3^9()x?jeT@@r=x(N$Aoan8M4) zBOvx4IWO$Q&exs+&Huc^XXv(SxTV~2F1{=rb=dNhPyqJm=g!S=X;JEtfNzynqc8Yh zQyDIP^}r~*bo&h5QsO^8`e=O2?LRAZGw-{q`p=bm=dEZ$S4|^DUL@P8OIs=wQ?Qbs zbMvPewAaEU%6FBq*r=C}cJ(F=-7h`zm36aseC-Sqavt-cre1b_sXw?*AAuNp0*reO zUrPOvhd&U?b~@?p8;1faXOA{KF6(9eOc-d$0879+SBF^-MljY^val4($wh%XsH5OD zO^I;pc^kzt0C~oGOMueu>Qe3pa~EZ9qR`a2B0Ou{wX0oV2cU7hYlqw&#ng$``=2XQ z-MHS7Rt8zkzdV%fXq7ZYfHUsx)j0eo_h-lSNpDEWGXWY!Uim@RCHa3kuwRuL}g`F%&EQW?#ZgE#r%GtMJZs@(oMQqNR`sanV%Dtb?{Os<3smHj-4om zpWnQIV6yK0SLN2{Zd(fyF6vu6Lq?tygMaUjkPO7UoSI4kHbBa~ccsV>@=fZ%m8r*uCqYeKP8+ZRs16URQ1Te0F~hJH@(F zeQ7oCy(j_O9~$zZI?RpAiM7=7E0YWhOm**yvGC2mbf(gy*~5&tZZ9Ty(3#)qyeA7L6zrwQnXRn0vd(HUc_JsCMy6hBHCYSE-2Qa8DZ+MR-op%I{CaKu z$(BUa;oN}0pPIeqU*-hA%cN|`|G(H86As7!C$@w`Hu(RA*g_ft*(v`M+g;N$*78su zGw3Bp=rd2KKp|9H6e_q6y^sVI-G^RP3KB325`#k}yo02?q2iPv>+K*J3RK<J~WOJg6a-SZh)rh zz%O}*rt82H&BAn)p#F|w9(?emZn&E_0^NHt!}H+bwcgNrr7&k2fcTGV#gWBH z;XE|J1vs*!A^egVyh0q&X9jI942xv>_e&w-qGQB3Ej*Vmf`^7I(?JAK5aE20)rGL< z@Zd9+;09DB_PdSe@^${(Xr0oLS?d*H+L&^*pklr?|gK zaXPH=oZN9l$GGRoajoL<2FggQqWG5XICEvBtx1CIT)bv-ya5*c(kK4GKdViSQ$c|~ z@F#kjCqDE^^iEFrdhl;O!kaZQ&^*x>n+OX_G@3{>D@yvz8vjD+3}*$v(k%XAGRT-U z?uI-p1)Kcb4CEmZcf&3rTOtMBllZ_q)-o_9-zUYzJVnzf*%}q6SP`c?0lvkZYVeP0 z>2VDbaqc|{ar}(9x{1_R{AmQ%xHfD;mqc2IX=pvj;1gC8BIo8GOQ*o;LPD5Eut(1T9t+H`a`YsO_(z{4K2e^|y>r_>KVs6O4a zU&^S~o>bjrrWn?^v%VSI{AsQ}=}S&=$Mhs7(d4tl%$F>w1^l2Z@?e49EWzTeJY{s2 zM9Ovflq--7ZF+K9QD!?fTS79e!UudyC8yel>9%jqtx53nL9mi<&fUozYhtQ81bJI8 zSFt!p4UzNM7p$L>qdJ+Ry$Ucv9PLa*pt^DDX+idp?*07%cFX%=zwI@SvDU z*Eh$USg468aP7^F@y(0%E$~gybqn=G+*}$~?@vVgfR1EWDQ0FS(;TqEbDCO~3VVf29b_{LMe50DpT3t4H`LLE@=P1PGVa&IV{}B5b4* zcU4j2f&@bN8Gs2^QnMvK6%1g<%}W7#G0n4V_{FbPAiFA(R10XksBEgSR0_8=MX175 zJJ4GXj+$E6TKA_264EuY{4I5p%{nCfKrj9VcPpN)+e!s6^^8AYpN&8oxd!VqaBSA7Q<(p@h`F4(N0xcN>uF{rZO3`zEE4cD;2J zcJjD1iF({O>Do`R>RVGIwW#$~S!GO=^zE$o)2#+*1_PIs2kO}Y1T}K+@c1X2eu zI}HG-15EV(*0e#fOpv)9h-sTKc#b?U-be17?rU)z!1+}%$)8cJ05I8Abx#jgBLSL4 zq#oQ53u@q|dde-U1epyot2*h1JV235T9hU!pODl~`Ynmzhw3AbtVguc`yQwN4{9G< zM?H=hF_b|Xmy(`xAoVy#wbhZ&g-2d)0CYJ<-#H~%kilkT@GG}5o0HKO>Lc&nM&12K zI7&yn498s5$1UB)oynu#h9mYeBLKT``_hO&L(o_MaTv#Vg&*aK^*Dk&9&A0LDmrr3 zlPOAg0$w^U-aI5(I>aJ6VkXm@BR!0^9>3cI&NCeMb({3E1|?D{g&UIwREmG|cy+{h ztvaR1nqucx_ST;<^>JhB;l}8D!?6z=QKnf2zG8TFA3;n~%bnT7PplG2eq;Tf#q z)bonjx`>(3X7EY+=yLBklk60883nXC8|XiWqfW7k%$-AzIHivra!g(5pJhLt;&-1C zo|zjqqzY|LzB~Cz;FxQ4o0l+}uPmLD3>cL=9aT6T5jUFBVV%0`KBXu-rCK(pE;6T4 zHub=LK~Q%5iTR>w`a+=kqDthVEqPIYbJ3V%i6FxyZM5{bZ1JV+(#!sN3-?8{fYH~d zi&p*P95VA@NA$8Ye%T2>=X$#A!a3r3f92WS@_(nxp95At%*^`sFZ;}_IG(Nq%F_Ie zXuh&5fiuf~Xd3k2!?HW=3n%?QS^7uWIb<2l(v$uvU^&r<4!aLd!P6^B=;+9mNHi^P zb43gV`Uc5^POd6hU@9VW%I~k;vRJE&T&pfytLR@V-CX+yS@)4#s|#4`a9{6|UH@FX z{;_x6b9LPVvSFgP-XXg|3RpL-Sf#jc)ZjNL?w~aO&H4MAi#D6f0h=`R=ITGKo!Q(x d-P{)0+PS~=$7X9cU~3<}b%@_u7hwUY{(rH6b1nb? literal 11729 zcmb{2_fr#0v^Vf15PDNAbkIlX&4zSPRC==@9Yhi7C@M{QZ=sU_p@dLELhpp$d+412 z0z!b$q=%C0eeb{U?(BT${Is((J9B2|Ge=eZm9)$UQP5k!nib&f+qa&cp7iwe3=9k` zEG%?%bkCkWXnL$imIxrjg5`Ey1K2c?dQ**EiEmX znVHkm({*)q_4W0&wY80mj7&^S3=9nLc>ISCAH>AOVq#*bsHm*0tir;=Zrr$W_wHRe zIl1KI4X>*eL;6B83y zELKWNDmyz{Lqmg?m$$jO`Q^)(7z}1$V1Sd8Q&3QFczC$Fx>{LT84L!4Kp+_z8Ge5L zyu3VDSJ$qtt~+<``1$!+TU)!hxM*o<>FDU#+1cgf z{Pk%YViH_jTut5(ofT0Yv}z0umD&7oU)rlnjlHild@}!ZXrg*~pxn)Lc|SN;JBtz)InnMMY&*b(LHV zw&s~aS$#`|P-|;@M}1d!OQxHdmw8xZzObK+nrkLrINF0)sPA$amVT%Ry)Gu)Uh86| z8r>}|dq^m?df{&I!u+1cHNVy<0o8ze$zVW8N^5yy3#}-9NE-Pk)t@>|0e!Pqp~BpP z-MXteT2vm2`jhDPisHMJSVNdW0&vG_>*JT?$mvPEMLO3Qcte)xNw`Z~mNA$&c}Gox3) z>-$;?ILn1@HXq?BWn-G@HQW0IsdzOU!>R;R9%hc+oJK(8Ydh~jWN?5MR8BHo3xf}? z0F+W#j((1oZ8}94mUf}nFgC}xp2x|s7=5ARkfsY$ zhj*llVulUUI;-TQl94r|ROdw>KS~)Ce;kN7Cno5ZWB#id=@R)w1Luz9P1<9UU2NDS zx$o9r%F={XT|P`L$)Mh`fG3U_F%Lf(F;UV!oO&7R_=DOInf`d}9V^~&)Y+c9aBeMGy%_(W zDE@HfBj&Pl#vG&lbL0&LOTcs(RKaaIi~?6XAF6b9vit(cU$+v^yd=#AePe$1=dF^0 z$|zFAv3k)wU$J^KHd1T@@SiS^%!s_8+4U3w~_2Vn&9irChof%e75Dbr$G9E;#D}` z%`fqZ|NF7z@+A6?gu=y0J*OKfUul1k+4qcM>6ArK=|2~KpApvSGvYd!_9`aeR#XN^ zgpfu1e9zNzFOy2Br+ zyLC8MT|3WRmiWjh9wwh9N{J|kFc}vs@y21q{bIg&o60-8mOneSHFP7}=vCM*Pqie1 z;*wM47ugG12A$9&)OZGgr|m5Pl3|bF_NHwz_v=8e5pU%2K{nF88#tG~1iBM08=0Zr z!CyGn%!?=+>JD|?uTuP3cu~Qd*L%6WC*NezZ|xTo1am@ORrB~5;d+s3l>tBqZ|7=`2en}_B=d3_6=)pW#(~5zMem6B;gw? zg;G`uQ@84nBf1MiNx{Gcia|%60csvrfJAw;mJvU4v={>{>BHrFyzy8@$ zKR?8kYSVOGd(lY$*W?j~WqaN1{-!~F^#tnVP(byzY=8^TVLk(QYaLzxRD$qE$@imm zdET(sK1|i+(VY(ZPtM<@VjpKii-?v=^v3z|li99+KI>{$8drB!X1H;Gd1<3L>3TPb zP7ToZ`e~#d^S)n}ZThpDpLzWGpg-n#?&tk}`)F+u22w@td#RXeS576)Nn_ zh~H{JLJo;ZWYHO&t5YA6;Ron^Y|EjG(ST`op ztcooBojhrp__6EB%&zV7 zxz_Y*uN4O%FU*8BYtkuu%9Cpbti?j_(0m}2!|J#e#F@(}%$Ne{+Z;aM&-EB|yfp-y z82BvC{BY3n*1^XPt##4JaIM(hztAl$fXr=0srD3>8@s5`rV$>GpvWDN_e7Lv&Ym(({V{8e%nUr<5Z*1Va?Pf(M7j@ ze#$(cKEDy-%B-?Tq2x|(I!`AADE*qDXa3n0iQl(r#{Q-)IfV;k{DoyUthF+o4h}VL z#Oitxt~H-@z2{knp8T4B;NpphX(B4wDh$4HCJjuPA7w+mM=YGrrsuBqv7xfN`bxj1 zs2A5dGrj*t?s(11`R;dz)@f%mdv0$1I%}(G`u+nD^u;stozQ91slQ(APUPbGZzUzt zM6=H^y~O1XweN)qn0ywBxY`#`I@wm@zvx~h?@;>@1^hNu{nl;#mP7p(@_pBAeCee9 zE~b31(NKzy_#K@1jRg7cKJ^FiQNj28`Pc&PN(bB%42aST5QGH?*9M4A2Z)~rNU{Zr zxCaOm08A`_Qeou4r-Fg<(}9YFz{jV7&!vNe*n(cT2R-khkt_|;nhw%A4bo!^)p7a8`lP#P6wNx1{?GQSxSdk2!?!e4>6{pi1G_@m=19|4RK)${q`kTV>-y} zOQHJcBJfOFBGLIwIOIBJVUT8y11?2``)mBpZTZrxB>0h$>h_&6kKe>4|P~SXc=vtQ8fBQH$*DiMXo=?l6q%R*UEliyZqBG3X95*#pehM$b=2&((&{ z5Tch)$3GSy_#5Hz4~!Bdj1nY05~O?MW$O~eWnvV26O`E#m1bgJ7$rXT zNW46aQ4LSjW(O*;C+cq`q@5<}$s}roC%uqKl9Nd=FiJ8IN-!2m`ly~HaF%2}lVls7 zVA`83PzQElhkld!w`0D0KwXU>?sd?ww$NW5P@glXD?2P;2Fhpz3-o~9DuqSOkYUlb zFyA_Wi%?2zIPBX-OmYe=#V93B9Tvt8L+Qh^*i(HsQnEc@X$8%(3MwU~=nU#y zms-{ft*V38ghK^VfDJQgO=oG1w2&4Vc#}**hXu^t*jI;2p_PX?j0x+#Id@LL!CW#OPAnJS5Bw`U9SOfjW68cNn|*f^K{pHMbAbz?(*-<$;-qYGV+u)GJsjh+4lto6TAfIf)c=d95mtf+aIWi>VOEgk96={i0Gy&v& z+RSA%%6m=9{X)t%#^!ydLlXV-R5|jkXY=gs^1q>>PMbNv()>^8Tq!*SttADgA5hSe z;uR_PIw@Ps5A=FATbu-J!6mwvzBmUhVgWo_mlF(HobaMo-oy6MOhoO(fbdy-yjSI1| zF%?*t(w(A8x}s>K+{o~vDBHr}zQSIO!d?=&XpvONxPe)gEv}46DURT+(WnX`-%>PC0jVcx3MKVeI8V=Y@zSa7Z#CNC0b|&{mO;y0TRk(N@WG`2v9m5NZcOtShJ$q zvrsw>BUcX=uoVWdV4eUfb3l+6oRwvCm5*pE@#@0bCc>{wgmviwZ{&pa`zz^{E8oir zzcHx-lvYI=34frkI-mhW6%@^Q=6>|5(%q_hX;N*PR`ph-Mk6vs)vLyWzQ)~N*rdM3 z08`_0UIWw!%4_p##=+tcJj%@IpY2X@8Zxd4HE=OBrb#zWaW>v9Y+Mv+0h9vYumHGR z%A{I=ZzRE_`j*x?GHB4gosXfR^&BKP+^%@hF1QDx<7y~3$$hw0pu*6|*8Ec*I;%&Rk2Rd!FIvq_r?d7|i z<-5NA>iRN|G&SvxwC(yXAHz}FG+oziM(lQI0Q_R;4l?a@E$o7M^g!f$7|(isnRdr( zbtanjruB3Z5x`Ubo;a<}wE5m-t)89z9(&V1hTz)Bc68_| zZvek51WUyNxLV3Y<-t-*z>LEFx1xx5^QZ**&bM$Z=6nFY2SQ%-zLc-$1%SpJ20lg& zP8W8Co05Bzf5mf3;#PlkK2^pMcMyf!iozW=0M80>2R%4a z1K_Fwc)~S&E;@Xvg^Oe#UTwhnarIox$8MMoZ^#d?h>jdbrL0Er0<}jt6h^3{aom@~ zCXzVN$DugXFrC6M(SMYRapWH3=uX)%@8u|`Brkmtlu!s(kwmCujTJeJ0+okO3x{5q zjqJ&fab^KSu|WS#AkX&biYVfSEMiX-w?Z5csmDt2jjosusygKIwM-DXCO>$O>oIoz zhaDF106X9(-}6yQEKPo6gnYwKO7Kzs@CH9Jn!?XadT&pD-=6gK1_usK`io7|$C9T) z6k@(9Oa~WDMd2qSHzpGpr=#%0w*9b3d~Dd|bn@Vg4;~p&GzF8HMS4%?UCx-q&i;s= zEo7VlE=>~SW{U@BQH)g8+%pc*bCpF87}T?FP>@xAB8XC*%!%Tizi}>Kph~MX^}!_iN17^Mlt5dY>67T$RxfPNxOK{ zX_3jN$S$(_*6Jbg)KheuNJ_o)J}WHIz;d(2oFsDWFdb6N(7FN2v@x$1#|Sl|tpGI^a9 zxrIKEPyGHRC?X8>(R__@5A=v>(OjXz7P82v40P66e!;VTuD!m~2)-M;?%A~dt9X5B zdfl&S{ZRop$eiG2N(g3xgy|5zG!Trl2w^)&hz=o^XCuCekYrAXmf48V$u-!7B`U^* zGy$S?HsRu%xfz@I0&w0H0VcCinn6JEY(X+MD#f=LJ+`WN!XZplHRc<{{jG}PEkwpv zM+U*OZoN{R(BMNXHQ%^vN#Vf*c;okH1VR{QB8c&UrhUlqo>!pRFwk$s9p*id2h+xH zg^JE5aF8O}cxfj_af^>->p*8iV1rnT+c{Mvobv2;?GUSrw}28vvJWwxrzdM?m&CN! zzC*}q+DyFK41(|uDH3nQY%rF9Z#VC-?($795V;rkcj9(~d5E0M8&s-)IV2=|AkmjQ zyAm<`U<<-)KJZPY1CZ}-5Dp=qiQppdd{M|&8rmb9?g$~I=n|( zN(rwmj#vRln!eo%vPTDBj`U-W%!iH`*^jlEk7#yb8qCL^e2>g5j_9)voimSNb;nlC z;P08oj=Cpyy2okmC+4#MwLN zv$);UU%v4y!)F=fv#i~-B{otH`RtJq3B?RVW|9!iq(W!X!6_+gmsDOtDzi9G*F7&U zIWLjOtCb+t#GE$_k=ip!X{YCPycbm#7pS3&TwhX;??sQ&d0+GS#Ns)e_i{@2V$S&j zzjz@a1YB0STD7=ZVTP<_Uacx6Y%X41_q*D0zS`p@Zz;tbT3j9Yl6RfSBxaiH*G+&x zlYp@Bh_IlL$e3^wfp?*?$F(+6>&@*a<9hFwbPbKeCWZ#5`e$YbLhya_OOq?z%lHui&Obft z_?_9kslOA4g{pYox1LAXljKOo$bb-ieb&=R#J3_4K0201@xgszsG~Q2?po`vu?PE$SW?-BAcEN zeW-c8tk_2(W2^pK&(f;N)O0mMgvo&S$HdvYPV0Gm!2-l-hIkQ+rVBdfnz9nLOr1v3 z!AdX29_nL8f3Q1Pf6gP3hIRkj#17jnvaUbh*~HsRFmX3JFb||x)Wj%V_#9peNLJ$9DCZ(@Cn2kp643jQUgTQRmZpkZo=mv#{eL>i;}m@Z{ffYt$A> zk71z;yXSl6m}33YJc5lkfR?H@CvxRSZ%)7$H7t{U^4@!bwMU zHGbbQ*>q`1No{Pl&<}PG?9-|i(0`KSj#E)_pSq~1*s6siwmjMc5F(}G;{C)M>gEp+ z*{i)NSqW~-MuLgO$@w{%H-Dx%X3_fCWkx;bw?jJFOhR{Deso13@(aEhm&D^+HHw`P zb{{sIb0RRC=%Tx{n3!IExJ$FKAW^cNNrd5RN3YcuXBp3ndGV0m&ljb&HzcC$;_nEE zaAI*czwFnp(1v&R8(I!`cs(~qyr7pB`OSlsI3yknDMr$_4ZpapUFonkTf<8Oe#p%k z5lglHj8VRvESFBx_%dB^qFsA^e=*cg`Yp{6W*h1 zTvTi}sek!e+ATQPtGcxQ;C0yWZeFIVb?y@Od5I6BrdgXH-e=Ie%oa*eR;WS?`P#G{E_&3_Wym_*U6xW_ue3imD51Hf7 ze>Y>B&iCu3?HtZkx9S#hmgi8EY^CH@e(zm56AaB%0cF#meez#en{0l=3)@1UvImpk zr1uXcOUcYX*;l#1MXIuN9Fjpm(ll8o6uT-N_59YTxy$Rk;9Hi;Qc@RL4!4##d9Y$q z^6SV-re!5Gw%)O%Jt`d$fA?0t$4fD* zcn>n}+$vjgMuf$^C9VDNQ+CS+##wmtIhWly$JB(P0%B|sBdzTUP4;V5pR+*ZfG%&p=ivd(%;K! z$q+u>rf@3Y%8Pi5=rd~hmLoi|s&^zO(FnQ`!Uw)P3!v9VJ-hvlV??CVGRsE$%WI)M z(2d%oBA1t~^vbDR4#$I$Lz)mBC@FwQk5#}%=3^s zkhrfX_{BogY9k7r&+D|^Y$yt5DUq(cX;9{{HM6|FT-){X$8=1=!9(5{wjS<#PR``; z)aC!E*%`DHzs7u6GYuAdiqI=A?^%7RE5-n{QQ3QlTa~jats3Gc{VEhMY9sw-D-9L^I^q$I{lALc@+1i)$Zx^i{OV9)WX{q?E_PitdDS&VvA+fFEgpP z1r@vTGw+%Q1`YiJD3(l}W+3e27$j`;xIPNjX8sEtuD2 z=c3SSls4o0=%!g~THd)enQ6NzQhV2W*A7o@aT45K_*N1rx1IbGcSSJkX}(^@IIT^ln$jVtgateZ&h+STLx6vrc;7bP^P|qnB2Cr!9Q8WwYOlzp0Yj?~C!H!2>(et` zd@px+Gxo5$in~M$@

                              u&w73H-f^?fX#ofAA?dhK$KU<`(IQ& zzPszb2U8BpZvqwG_{AFd$gBRk;pSr}@V)C!AXy;jQLWtzwm_t+F+H2V1k9I4Fld+B z3ncBA``S;{-Ho=#<7JqwB+8ST5NuZKYatD;Sr57a75xDF`f)mFhnnmhFJQtk9YF31 z!G#7rbidP3wd~ ztRnc<_xLu#e4D@cwi14|qugo)gE~=ey@qc6YHp7H5rfiUbv==9{KC3XkrQDNIO*u7 zp6Fw@=y96J0Ji9FuONs1pkYEZZk>HY5K>Ek^q?Ref-zyL5Hrh|)gDM#Sj-_R>ar(l zMlgIYESf?+It&#PkBXi%jK%lF9*4%RoW{`C#atJ%`F4j)^)5D!qb`nXCXVMUj;rn( zpG^Ecqj-Lgc)^taC$_fncW2@y*%KbhBs?}sxDy^Hm69M^5GPTWpg0rHi2yv8N&LsP zuRIdfj1r%vBx=nh>YOF&u_wKjNqTFPq*Iq@kdkCvmt;DVWUiiQc$Q=(lT62w{K+Hv ztq_$mABDwmveQ|z%USYU7U*|&=tBUdy%E%NCfT*_UqXGTz7a3U4MskP;%pw*R z+6(jdfGR5kB7~p`>M2RRP-u8c$_C88H^pZo#Zw*N-kS`iO^r@TiA+hMbOCr6rJ`(8 zf6%6VtxKhD0YiJiH!ahWdco9sX*DTn%?0GNgz&Vs0$2w-yr(X$r7o?}2p;MI@7sU} z(WbZ8!6$^${ln8z)YH3W;Jx9g7Fp@db?FQ2>5I1T$(i&f+l+y_j46+dp_GjM@N}Qv z^aI+=F{6y#-i-5^OoDo*mr%w2w6GHYZICo);L zH#2W<0=Q-oJevr|nJniGfTMc$9S+2iErJD`^<5|%7?CYu4F5N>!X%7*WSn`kG+ojz zOV}8>v^Ez^GJoK?DVQ7Hz6bQH(|xa$rnLDe^bbZ#gif5g4XeG}k7&o&&>!##E9J9m0j& z8kklR;=^#^2g^bfM`2|jxRHb@5H1?yz{tgdW>Sl$XN%CJq9u-^70~ZQ!-@%8fGxRXVG%Xlm!};HJfN5$x>5GP-99d-CP>KOA*=* zgySf?HdnfuN=CyyOJSR(%yLCHBGF*ZjN%B23J#2gG6f$e=B{RWwP$%#U&;7pIm)

                              Vv zuFSo@ta7%@Vz10d5}PAZF0G73$zd%l!4|Ptls&e14i&eF<Iw{kZ1 z(Kjq}HqDwe)oL~o(y+5~$Stp?ExD#*dcZEG38~pk5UF3%#G3eFFZ-J|=NcR3T6#2F zHaMG@TmVLrwPp6;0!>P0t%htlEdO5ZEv~vdmY`<(rX-Ov*80}pm{yMYmUFqbR{J)D zR~5LlO~e5!E?O>X3b0THS+KNA5ZfMzwhLvo$qXPwiR};M+n>z0|09@}Tpf?$?XLQ!xYrR6krxgX}=B`ElR{d$ESfdeq|5}-iOu#@$+?C&$kYG*0FB& z>Cg8S&G&@P7eI}Bgjhfdh5Zk>K=+pV^X3a;8rtrZws*{T@}N7~8U{2Odb>>lLtLF! zTm$V|9q%FrhfM)f#DN*&pa!N>)pYQML-*QzC!uh_bD(2m9w&N%+tV8SEkD#_I`kRd zZO<`u%9VGf)pHWnedW-(!7!{3A86!i*YaZkmkxKwwr~6zh$E6a$FzoIv_J}aAaH3f zEQ*54Z%_sf%5G?T5ewQGz=@c)4mFIn!&^@p21<#oA6)wXI`n~E`dOlf4x)zd@BtJr z$C&gAloZAlx$9mij3;dZR0qdY2NB9e<0_8hFSf@OwI`IsCbStRG`DM26()?$#!VH* z4e%2nz6qnkPD}ilx%Q-O`hB_L!^o_z$ru8;*$&VgQ?gDZ9%_6Ygmr z1!Mre_5~wArE$tJefpBrfDDzwLIqvryn$>Uhj@t2N0X58ZrVjT{Spsek& zPsGW0jI&*hlY`phLyUMc1-z~|Ud0igemU{62=#b=o{6P#MQdVq8_{`*x56Vj#pVON z$7k^i3zz>i6;DuD>@!;oE}C|}T-a7xPmYN znMwkrd{(3uD5RTKOqD@TnpU0`uP7@5O!YvI|M9HniaKOP;c7*?X_W%-M`~eJMf{Ka z&WhR&K%@AN7UYjy)2e~as`(CLL}bBKhy2IHY2}0BAM@fh(~MPTpOu$Bt5QB)W;?4t z#n&A()*T@0exB=cOaK+1KRSv8m4%fMMSu-@J(!2^QF#5;0^xos$V3lBA-R#nL@;4m z)8P5Tjb2x7>ZS0bRLJ_*y?V_u2u`>^Z+JGILI9}E6>Y^Wn&I^l^SSFLTUHB%r%oV> zr7dO1niLaJMTh8$1DnSZ`M zmIW6I1)6t(Lj~r51My}ef9&p)n7^kw`;-!UW5oxoLwj=M-Df3xz}>xd9o&rKfuhCX zu=&nT(~it8*nV?cN$F_x>HzGUcawL|rs1ex5ox59cirNU*7@lC>c}kS?}bknRm=fP z^Wlw>?XSMaUl$L|_fYPcCmtoocS}xu7XPZ0>=JzrhILMVIv*Oe9Ln<^g$*69%I}3+ zoWzwJB=GK=N}j1@9zsh_pIe-bFzxdBo+|I2A&1VWbxHCuq;%b5ONmnh$&)mTlPC+4 zEAv??nN&_bPA(yn@|{V=yXR-(Bza~`9rMM4&V_8uMRLi-tDy_!-HUeTi#4Xp=St@z z7ANDrdovQJbG#RL--}Z6<(kvwbBU{2-m6mGt67Q5NvEsPohu67jkl8ILkse;E;-GY zOmZf7Gts;a_%~u3Xlh^@5*Zv85fuxGjSEkRicb!Kr39tH15EGVkIBqR%FWBk&B!c- z7pH`wLi14wWX0RkYJ)m#V_glps0!2B(Oz<2=%EpAXn17UV02>iq0qqO9BzDmZeela z_wvZcK6A{}bB;!8d4A_3QWgp^_i_{)sKJKULb*s-d7lK=Xk=03i22 DIOD`C diff --git a/modules/editor/skins/xpresseditor/img/btn_set.gif b/modules/editor/skins/xpresseditor/img/btn_set.gif index 1a03919058d857301b47d888035ed40494734264..f8cc3e3ce2c7cc86ced3872b7522aab204a1007e 100644 GIT binary patch literal 11749 zcmZ{qWmpsL_y5O;AuSdS>PMtQQJP_bAfbLf3X*~%T_UMSIW}^H(bJr%vy$#(csnJyXE$l)ykg=M zJ#doJd;E)V6h1`FARhecJc6B^ob>D`zI^#|V`HPey?th8#;-zWc6JtxMh_1Uo0*w) zZbc$HKjSyz#>dBphKAP92e!7h?%%)v=HGv}x3_VW(C<}x+Isgpjv!T4Rd`B7A32pk zAoT90^paCs31xG0bH>KT-3M{S#l_0X%HxBhSZ>g_gRI~5 zcTRn>ySqDgQop&mNuf}Vj*j;B_KuH_0RRAvM*AE8f9K{2!~aW3{V)EnCjbyFfF&q6 zH)3JVL5h>VJc$Hd0P|4K+qN=`{dAk)$_Lf?2~=j7()>E&ZEZ?XzYvlYt9Dk=-B zYx2=``L&HX4J|p%zl(q8cC>Ug66<`K#(=9a#u^*B<=z1)7L>pw|iv1M&%f!l*ZV`YoJAU(`mM?$q3ZKACwr8;n? z-g|fOyWd02x6OWKy@&6g1kJVDp4>`MO_VpS{kmTHQ^2@rkq`!omJV0io$ocjuUJj3 zEnCIq$tU_d{^GDzF*fzeee(99m5Qn(XJ?V0%+6Su#Y%5V&GAfOsh=17+>KJiYz6C7 z)XPTSPeuJpMzc*1PCYkfLO-9ItABGLOxE7M0dCs!+T0{0T7bLsNU}+|<}5@zDES z$Jr1>RNaRHeg7nhxI*{i_0YmjK3t)|WDcsh*t2fK?AheCO|yJzoqfdpTlF`KiyrD) zvHpytA|r{A+L?+@f2FPRiOF}Ng%j1rTM3KK-cDs`dxx3w%(UY+4*n+A?fkrIsC8Up zu4>+8xjDO#wDR|SE-`9cj-`Sjq?9cb^m?IK-9wE!J8XQKksFQmt=)%~PJz$9^f(ch z!k_GXq0?@;q7IMV5=8Ff%DP4J?C%ko`WwoKqArg2aY{7;E#2T?wR_$CQ;g*U@?P&N zOSOPg9`v{3HY<7`rA~k8d9*_;>*B72?~kcTvQx(1MI$T6Y)qsnoiRCPo|8=RW}#CK z6E@B?*Peh4f#V6~A-k65x1Wi-tRU4*xmor5i2O{&F?M$llV$P4Nq&d4 ziWQ!*(hh;_xb5Aw2ICCk@x*IrZ8w8NPPZFRg&KCh zaJig?;VaBl*F0}p)a`vyaxy)@)X1oY559?3-S4^a_KYS#S~quHTQc~ev9=cHjHCXU z`h0P`s=K3cwmbIW$KLTqbko=MEaB5}kmk{VzNhT!<2CNp`lCn#Z|tcV!%Zdd$fwpz z&y(np{&Jym)0$py3uaioHQTsT;2>G-?D0Qda<{)~{>1yuv+_g1T90gf-(I%78qo4v zXs2}7|kFRn0c*oLzti@ruLE&Pk+{GUy^-&$Szkk0#`_~R0v zC}Q`1sWP-leqPg29dF^NMBL%bf_H1$-%BL=e3JWYr)xUsp5&})Bkhu``%WS*iRhRs zN3Yp!H8?0U_$}wbOv|%HsiCBbZ#ECIc=hdV?!#@qEqP_v>V0+2OZ}xD4fFQ zdq2Ad-Sxj97{7|XieY()(%4U*c5IO8d|QbU$49V&0> z8@koPs0ux9zgdidVt4?Tr#^s0&E>;Q*{pf*gF0lR+@P4%1@3en*}J`Ep|FqH4cqxzw+lnPr8`97YoZTD>2* zMD^BmOi~85n<{gq&zF@`CwiQi_Vb=?Eh^tv=^T^njnUm&Gu%lc{QGb*v^jY3;gCv4 zanm76eX~doqkOM{#DVv8@%b(3|~xu#*vY|LkhpF`P3G5pO{J} zSLJQNZF(2gmRa+o+9|U&Z!auqQRA4_07@f$qxsF6aQysTUr!G5I%~UWu=6EiZx5D9 zx2)&_@^%&4PobTOJ&~mn6aC$@!QW$Em-vpRlMZu^8rCBj{07D@_G?zYZ7VkW_4lPw znq^}*f6V$#fxs2dmHck8 z(#}>5nyF)b7nJ&DDkrr0Y{h^^ouXYF_cdP}_0cX)|NiTE0)R>Z3`PM=-T}->0W8=6 zw($UtoJ=UPX@Uyi{G8tP~p8j=(W@rL@ZLT-CQp<;mG@lcpHG#m>F zNPW;MJmDXjH49ET4N5QBEChP4|-5R$?NY{PGlM|2)Xv?)ba!Z zhd)n_zoQwiBOd>9B3{cb)Q~scK>3%h_%9Zp8yd#H9uoxaZ~>l(|9V^d>-tF?iTf9P zHSRNSf}JtYq4t;6Ny0mEz$0UjeXXG536l*kuQM#sbs_**+=O-YHpjDQI3` zMShA@Zc4$66ry}e)r*u0pA@NEsh-TK^{|vipA_$bzp0P-5kO{gY7sBsrfX_3FQSMS z*?r73V2td$1RH&U=ubvw6(FX4kl8N;Cz4Ya?2se^az!}}a)N9T2W%Q6yH4mo83I|! z^fs2jPh@&5Z%XFL-)lO6FN2i~B=91B=87?fA#cu!v9jE}q=U?ypc@fK5l&#Dt|%UR zU~()MBk~44AWlF2ivi`nQo^B}B zNtCj^sa~+DOiI=RzAP!etmpRGN-QwZlx&?z)O8qY_GXqYm5Em+N24oSAS~wzI)@aL z$)}xT^*+a1B1^$HXEYG?St7@7Jrg3H^|XbahcC}k0w9Xc)bh~|QZtqaqlf@z{+t`jhmR7`zc(ePvuNrzTA$5%Wp0m$Ry{qw%?4-2s4 zJ!nm(c$=@dBnUm=Ou3=iT_L+s@sz((>T#unBvg1q`WY)s zNViH@vcf2}@+}5vqFc^~FaHXtGCgH_!_WJXwc2c>>UO=LF{bj3U)5+#m85F<(-sC{ zzZxmkAX(K4>8YBB^%Z8UK%0IhU4Bm28Mh;pf$7(Q?FaJQ3p}3zuRI}eOg!4Es)<` zUxcZz*r=~{2(7Pop(EF~hu3+2sING!(+ajZk*nzBTO~+ zoHovd*Nv(+-5#$Sb_32nYMM=L+Td>_I0(*Q>i4=EE5_?yYBEs$fG73Mcu7EGef`)* z{rG9KOF-RAGCgYsFvJ(@M5dS0Y|8bkW8TQW&Q?HXh2^o9JsYIs{nk>w(JG|Yz^B&K zd0WuHd2lCZgIDr`zPF+ms`K>St}9Jij#r0FNVps;2E= z$M#2sZJw{%CD?xV`Q6ZDgUKM;WxlnGJ9elz#z>qAK8xru|JI>9-S$DP!v)?(%KXi@ z+OGeteYmw#=VgcO%g)i=c55}9SgD|aW0EwHK|iBee-200Ww4h5C=q{aAn?X7e|tp$ z@50l?MAD^PJH!xe*QWE6rs-uZJH-oY!`cY)({y4YT@g~atcYZTGuW-tu0koG(nwdS z8l;rirT(D%mRxuRQJ}D}yGW|Lh}eA#K*VfzHwyr&)rg+V-7QkY8U(S>@kS9_Pa}dz z4Eqny2J0Xaha!6F8*bsg(Ymjn^vu2_E;RJG81`1Y>|LEE0{gp$U-hm>^!_mg?QIe< zFZ;-jNkvk4YIon$(w_RW?$(B`PPP6r$36@q{Znn8O0h0t+9i5iw0$oz>3vDqTAqu$U*7IK}94` z)oD<qvT;aVdgy87py!7{-JZdx?AgX&Z#-d#Jro>Pa~hF3A5t_MdK)=1 zb} zdCZM{*u-h*UE>h=JB=YE40veABu>s#G8+^<2VO~{|Mh+13K?kYG?=#eICX1K5Dr8k zM|{*L<((#D#2L_ylZ7*r7Ab&plG)0B16RF&DYh8{pYa!P7%s!DLW zO?|q-X}UV{MtkE_=ZS*nt7%W~DZ2itk(ucsr04!aFskZ4+vDqgT2 zUyy5B_&fiL3K~FJ^F?X@MJ1U~L}lq{j2d?{$z1-_6qCGw49<#F1wzy6}&+(J5@F05%ag0vd00f`b?i_i#K+5T%t^R?7ox)T4j>$U5d7fh9D>qYt- zX#Mru-Wynr^)P+Gw5AP|{^oDzq^90=Abc|?Z6ng3E>E`{nXVbRV^|w98w@JO*`>}m{eCOz5XJ3Q7Tufdx-)6EPGYRi7r|(Q&kgqiF+>j;n8j#bI=!9syBEoyZ zV8|_tJrQuYX!;(n=AMM?p49B#U6)Wf;XPUKzNGB_!=2p+;C)rj{h{Rj+tK^Vv-{Ep z2NK{Q&654cF8j~Z_w-!$#L^G6(+?Dy57cINU%MP?lpH?mJJh1VT(~G!V9G}@#nXsl zYe0b{QyhgUpJyqyG>WSM#T|TPWpU&QhWNNp;MgOt*&}~&c;F5tVCTr&g?1DQK7w%` zh0jtV`zX=r6bJBeOv&-j<|9jklf?9+UltUk0p*EEMkbh=Z9&cbLCsI6qMNCOv(#c5 zwN&`D9DG`7aa#T36q|lp*L>PAON}@^Z4o|e1D~~9oOS*6BhHJ=e@&w6QR{le#i z;PYXN^U)vYlbHW!3B}`5t7t6925q=lzwDUjB7wfYZ+b$PmVcI;H zcF=dR^n*6%LZfmr+dDb_57YojZ;E$qzZHtrg^lVRz2<>2^F-vo{g$nx>kR!XA@5Oh64OXP!Q z(8i`RLaE1+-|NcFDC==KRA(ee)z?&v83(YJ60P39v3>oT4>si0O;P4tJud;LC~Kdg z86rYGkaX34C|%n0qsOk5Xhm2@LT$W+wMs;ulK<@HhaRfS>}cLmllyJoLQ-?8sY%#_ z&yHIUG0cMg(>G+TACzC%AZogc@2hS z$nupY|M?5AsCg*7bWSxM75IS-8I20W#Xr})_pIHsJy;7%VNhjLVMaN;m51}Y*RP3Q zcj14WBW%?1OKCcQFX2jnJ2CKZ`a4_x-K+?kDuu%#+hn<%Y@4PWkU;a8TTXRt z@?i~P6dDfH`%C7a9IV^7o(D@!1Bf5F{WF5)31>7|N`?hjUC$LY#`d1D_-bq-&(kCjBfs^KX8p)*Hibb``tRtTi7n=$(dBD| zP0YyU?1z)DN8JkYg(6SKO4U(U7Jqgrk9F23(MOFspR$QYvdLKnYBD{iEOHP0l*%3fNt~ z-)ZDlh6qEAOf52-Ph6Y*Vl|ZS*1t4d@arr8*#k2KxnsE=h@R=wfdRSx?3*BqTY}=R zztoLRz`vGAT5L+#$PZubR~58;#P#1XbeL^d_3`jrnn=h`1*ILB*wk>MJ>yL=4f%in zu_P!MX$M^kB!pYudQ_CX+X0A|kFfd{qJTZVBbO;38JrK`6F=+}N4xR0z0%^rt!i9( z&=TbqZ+&CUNK2{w5j@yqk-thT68mBR9vMG)8)u~S!aXK7sv%os@Kq?C26t@C=10X+ z=B~E$rROPEjoB1Gwesr)-{GQaGD2HI?D}IPEOkZ{fST;)d$0MLUV`p`;eTmrphYI@ zZ}wt6i8s%^>GkEeEkPzWWsU#jIw+AGc5w=WYU?q|ND_foUwKffdzz~mmqaGuB4J>D16dmlcCw^nJh z?SDcUcxvG*_K@*CKJ1n|{O8%AMt2#|pf)4JOJEM5Q&$k@PspN~6ufxFhcCj$Gce^q z;yj&by=0fJO1a^SUWs?CXOG-JEQQAheyS69Hv*Plq zl)WBiqDLZuzfBxxqv|)neUnm^?zCmEdQ0*@qkMsLsVzX-egvS+|6Htv3^K&FU3(}wTUET>s_y;B1H|>tc^OSVB~qj) z7xBT}7K?BLa;cPr&xrlCBC|$XxD|A)$W0>YlOq94M($?34wlazc9uncI)ipDD*?bH z`DoDmq6n)GPMuU1MRQ^MBUo`<*LKq_{^#`Kq*W2!J^%6u$*&*(xpIQj)wmbgtvkN? zTCwWk_O4gA>G)En58hGai`(ywC8ZL}UT>MrRCXP!L!wXZS7-UuR}G&ZBn~&)JaZahM#rQ^2%x5cPBTutN`OXVvjm?joeBmh>qp(XZ(WWfCbn@vsJzF4d42_GVP72EBB&LHL!Uf;qvFxO&7{@yy&yYcL5fnt_@8u zp`MkhTXs4=)H>9|+S09v;g1(0m+;eWg?Hrw1^TC#ALN~|J}+Ko8FF6g?5ygK{Jwz# zHI9G(8W?n=!T7V}qd(f3K!5_;gE4D#%}@)d8^#(?d{nVv3DSJV%J2F1XXA#o7u~qz zSI^Su^GzGD>d5X(f#Uk}%QD#iio=EuYw0bYnR9AR4MZKa@C%WHcBrG_^;3eg-?<_z ziWV<%p8U-6+_S>fvj(V6;=m0YiHW<56NaXTnx+TwcN>=sN&;~;LRdHL^Kl=}6oq87(`S}?_pGGwfnrP*0I*-=eXhL&3i&i@kB zSQY3gjAs%MyCY_6coQ3R|5m^yTi?6dL6>$# za9c<(?r+lC5zN4aQ6r7J~s8by7=2cK(2N}>GJ z$D`J~qd>NiGukZH$B~5m=z_a&`WNsE*XT*_(D@`d!)hek8f2b1(t#_cKPi%1nHICj z9L)-gKGllB+s2$H#atsq-9Cw0%?}m26dqI>A|W0tZ5MkR7D3Qr5zCKp(u5x+#`>

                              + zbt%rGHl6_+``j4H&zoSi_9I9n&Jq{L{31foCr+t0L~jjZatY337prdkD+ZrPIbyTt zN(xd=3NcQC_#{D-lfr6~A|{fePLklf$+61G@y5vsKFLYR$tktTh>7I1lVr#m;4iSv zHcrX)Ny$%6LD!}fPNWo{q?GcemMf=L8mCtKq+*j(>uOUQCQ_SDQd@jzDdw7>c4I`R z4+6Kwgs(+(uQC26Ao^b*x_FWO%E;kb#HbIFP=FjKAo0ma(hJbs8nTx+ty4K|8kRO$ zkTyn08(vErxRgF(m)2pNb|9X1bb>sA0s3B~?-3BR3FHwBz$^kf5C;iaW-N zundlMB$sc-B^}h|F65QEjB9Ar4K$MNea3aZOaX~Z&N|c`-*jGT2D?t?2`odbF7q~D z)}2Yz*a=EO2PrOrl2gf&3PXuXpup={ihM|AiEL0^mZnN}zj3w@U$!1Pn@Grhuudno zp8X&!`*})w`&ybLKkR{2o1}3d7l&X9`S>k^B*FGbW?rsDUWYh(fHyD49)Y$`OL>n7SHV>HB1&{HSbI!Z7^Z3+ zUEhTXMPqP;{DyT*vks^u1>MY27@>ox=_+h}k0{egFG1&w*dsLHjEpUaAsvuBx#%yg zokJIPh!-zYi~i^o;dtr$3B`kx4DMVddlDrtX!4x=B`i}V?v|y@k|n&DGU_CQ0-#*vwCo?% z5>dZ$9!xoxWJ$Ph`Cp~`Pinb@ZpGcx5~CXbBjHU7L=*5*Zrrd8dhJ$}%U zNz+Pd)2=SvnQrsWMl&h3*$vRLnA*(X*y8SsWkq2399rn5S{Tk6xgwgmrCK%}YR~Fh zuQoIbG_+njYu(>yz4fx`+PC~W0&RCpTU_By-0-%4HXCK7+P0<`4pp082mIdDZR3e( z)=+B!tF`gJq+{j+wRShnY&6Ql8(uavNORFs{eJiHS9tk6fILDX=?XN1c4U1ev4ay3kjDej9DqqSvc8<9|UhVz-m z6C#KxHQXaO12Y`(CIIjT4lso?_^}Z`3DC>+_mIwdPYyaf8~UDurmLhSvOrg&lXK^xOS(V~6<Y^9lL?Izp)-@{@A<{w8(gL7T)s~xn@wfvVS;C9 z6AtQ3+#@ADoZ2OApICPv0t@XDXf!L@u7O)5B&M-WUQj=IGw^Gn{>&w=V+B zA^xzC=N*aw|3*maM$L(6j4dMP-wl~-cMb#mZ5XFSn+IHcQ9Wr zb_QT2){D~CE75Dt<{S46>0gV`GnH;MMy&@&t-7bJxJ#_t>i00g8Q;tSnB;mq(l#uL z0lW6gU;VdO4A+OuH z{nrgwZr;CVus7_#HR`;@60rZ6_Q%upK*(TkSp{S;d$1)$FJN%^pm|r(W&f7Nj-u?L zF>P1AHtF1PT(W-o@0lkx>{bRcsi7L5_5?PjGOef*K{Wq=`b zP^1iwgl4z1QunlJ6u%#b_e&_Av_rEUvJn`>VtA79<0K*dcq8frVR4eObNtcea8HJ6 znttf2Ns+an+W+m6$!1n%%7wKB=2MM1#+|z-Rs7lVRC&eDm2z-|kR4^+e))obzHvm^`0;xKct{ z6Q*n!Tnx@$RDdrkIB6yZGzk}4Z#0cmLR;o!{_?*S+YomRcS!h8_j~ukB4VL2u?a!Y z#E2+(3M4))5{3%R%1(-Qcg7SJ6&Jd@qDv}^5EWHbW!T!1`o_BQmdd{?wjG_NZG^4{ zLJhHJ0D~uv^mPx6b(RecPmC6jriNw~7nbJ6d#Bf@?8O~6n3c>d&d_i ztYUJ)twBdzeE-_+i2PRK;NA1nmd$(|&iq*Z`mh*$5gbh~-kU1MZAF0GokubhL@%|) v-s8d}UR31vq$+(`pC(k~^`&bDvk2-`<_~0P$4QuVRTd288M-h50jmE8iQPzB literal 12267 zcmZXaWmFT6_x~5b2tiCbOr%kilu!&nN>S+&6=@WK(cR4i#;747FggbtCEeZINJnp@ zoBclD|I`0{aL0?(W{+ z9+^zu-``(cTx@A+aV~h?aS*byveMYtc)RcRz;=pvwI&LM`bYiSeGrYsVwWzOTJ}8` zE-+1d&;bf!{=Bwz-?wi!kwT$NoaTmwh0UIo_8!Hx9R&7o!|~^p)2D^Q$B2QW#O}k$ z(Gz6fUSh{#`0?>^|8DZe#)gK5Mq67O9*_5|RG*uhD=aKb@30yh8|&JDO-)Uin3#B1 zYjtczkB*L#NF-%t<<5i9t*x!~^I=IzN!|DFRW&8s4@0V}tGf=O1}UlC-Q5G*i23>X zmhSQaN~(c@LGK<+R#vv8q@=#SzI#8aqO!VYFJ^gpd2({Hj|^{WYC_by4(!6Gr>DCQ zVopv@Iy>9X&(FK|BS%L^x(>q-2n2zEFJ3~m9|m{t$Moz+`&VdVHhmmYRR+oF+uPgo z$C%B{&4Yu3!^6X!ot>kjBLDzE{eSjf@c-MbV;Ud;00oHrul2u~03cL9C}Utya7bua zcnCBgA|^I2J^}VCF)2ANDxQTUIV~d{{yRG-2a%g!kP=;3TmaS8cd4wZuBq0jt*_PB zEypxhK5l7gZNqeQ*4FjZcK28H4OI;eHR#HYj?K*CT*imy`xkqbJBcl_jTN}n1;QLb z_G;4>h17ghzx(*0rx#F{7p8aJ-v+cq3A_%td;fL7uauVMu4V>}m|v+>SGs?7Zv@_&yb2ZKdGK?7 zFuOM4QLxRM^}l&~1rrtPtfUUmNYj3i~7LJt+Z#z@}8Q61AvV#h2P|+#JBXN}qM9=l)}2Mcx^7skoIqkS6!@ z-)OQ5fyC~xvjPRbZ+t2s2W{`a_w;ptqrwK7xKy7hF0F_=CT$pX&Y4n=$DHROnJ&PJ z`$)Ib?M{NuD@aTN}6+=pAnPtN8on4#mtv(6H~zAc8|zkS3_FH*Dm zDN;zCosHgmcoiS^V>#b4Ms9P}lBePbZ5jLgWGO9f@g9dCHI8_z?sLrIIb1XT$Aj+W zUt0IOKgT^+{P-F6L)o3GT@Rd}LjBWwX zpF}|j(ur~APnL(2m2sx$O!v2JMV4W04wW|LA=bF{sjL_!bo<>H*}wcP`8i2Kz)L;@ z44{;v3dZM!a*aoYMP(g@M3mLR#PfJLR)fz>(wpjEN}EXcHe=pCpZ*%t%!{(DusfM5 zLJW~)iera93U^k^OC@F3j?kSJTUtteEV1m1INgN3tw7zW9qthR%#_9x$(KlBk(0mx`-~ z8x+smO|=9>O^5Xa@SCFsY(r0mjg&O^CSQiyy8!gF(;tt1xQ5psakS+rnk6QwmEbRn z;P<92QRh|DrYKFPwB1Nr%ceHtBhm{_foX$OGV+Qw0&l%TGKdD_8n#vGheh%#Hb?{p3 zwj~&`|9ruBK0J0Pq`+gb2WZ$E*Y#C6@U-`Bph8DrzUMraxNQXBzm7!BX2|9XsPf$<4i6`UglRMZ} zo>B6Yf{OcMYDptZWg1$17C?P)(u;>>Of8=`IL%HId(}{ML*XIR$zyH;JN^JWhH+!t* zvcAhq{rpFM!C=6T)A;lwrM|? zHq?rLbUkb1aluQKb!4FF<7}}H0-omT@8rA26t29qR(%tp>q>Z=ZVr7Op27P5T6-1p zf+qi6yvIm#k}jhPw3RhSSv$QkONEcR!>Ta;Z2-STK{Xm#%a*%WibveY;D@RhqCAEr z>mU3!4z{{(KK~X~c#Up1XGMGRSUWJG3duwJ&3v$DxL&ThG;los1D}mn2XQa`x_5IO zud;p%=UzTzgWU^0dfkAF>dFWg8!IJw!}Nj2**UodAM6Wfk}Gajdx~1Uee>9;UQsGj zZ7bhlno&EyF^fqLZlf!?p2a8exWv&9cr)2{Hu{q;)K=5pa8l0L`5jxa6VD$=O)q}y zRTgIcp8yndir@A?X1KAJLeUrkDS{2VwXf_|dun<_*NokB`Qt&x;Eyx(n&$2MTxq#Y z0ZK$;n76XeXs_wTNit?Xv6LD}-Y}!aKQ%^5zS@pS3FC!*9N-(E0Vbbpa8bcB(SH zb^U7ZoYPiBh;p&heO@fPmLpgziO6t`IG`l*^o$4&dp+pJvYX9wPJAtW0^nn=LQuKa zG_TcN!qO+;gBpPPxiL^ed~~%uK|`?8`O%TMnM7vwjyf=!X8UMoP1| zl~>Xw_6^@$UL*Ww-|nRhYuan;os6WI?tAg`d^?+RAG=^VNTaR!s*_C|JJpi@`<92| z!KZAV|52u`*Q?XPvwn6XueSBF1j(K)ZII`%1yS8#e?0~JVz#5&$SlXnHIQ@GI;1Xn zNqHABdq#ZHq{2q>+s&BcZcx1J!F}N6EG^JYe8J{12rJpkBxBcPwB@k3RGiayxz|;b zD@VY}&Lw*1{`!L_>F2 z*)7zQaIC0BZSFNE|7^-$xH7jV&+W4vS9`j2ZxD*s&e%+ec}f&7bsgx%@BV~%FTHd; z?qO;mrAnW#d>}h_R{E@Y|G^UFsVDifIR{Dt=WD(Jo;e$et0kG|>%n{{gq5?y;uVGM z*N$g}cYN0dV?Fkq=gzXU`PO=p8|J*t&gW;(4|>JDkF?1N!k>4~ihcu6CVhhg;J)W8 zdP-+YO1>wPX3(7`-;@2h!n0i}%f%nxEjJqSp)WAs7XtNV(D!AM@nxp>y^Qv`0`&pw z`<+SqUpn&r9N_=gnfBiwe*k^JE&2fNDIwl4NLpNg5IR6)DnP6&Ac_+3NG9;HexMXI zPzFv7ltTwTVgD}&-Y5%Heh~DmEASOGNHr`-5gw#56(orc(qa$R=%Sa`3H}HT)`tfh zqJ#BSgRfA6&Dldf$%K5?5BUlW`34U${}yaB6=K~L;=msI84Zr&4|RoxLgAqv=uj{E zkoVAFEBY{RnNZ`f5Mwm>(^2S${E$eQuo!3vv=LlY1~4f#*g6y@X8_|BgvlSnWRGET9KW7h!(JHtl9`TGwf?1E_e;$^ zUhDXmB1a-5CGM?YqFy-gb=@zc@L##`M8oM{?*)^zrW0RI!_1Ep&AVZryA$o#5+9}{ zIl3n~3;z0Qo&2y4=uwyKHJ$8P5aYuE_nL+U7{Ivz@Q}6SuoQUUG&MGAIyv$f9=ZnC zJ!JRbNb%tScod{0ufY@CQ|K8Wna9Z)$0_h`_@5MbZdY=?KO(oAx6lBQkb($NgJ;X8 zfSghz1XE+xQiB;F?(V6Lg78)jczXf-p#i9;F0F4mt+ya%fFr$c8a85(eh-j7v6eQK zl0G^eiG#e0bbg(5QICv=9H2*X*^dgrk3Fc_>(FdTn`}8wkU~MWLteJ5 zdiLVO?3e1CD4Sm=?++sP zp*5&zrttoda0w@BogG!oh^m@_RSEGH7otk!P$fO6`+%aNbyOWEpvnf+)>GIlRMa&S zTRy{H#8_OhUIh6n%^+1YP*~K#S=3QqJUdgwR!2nkVHd$_?k!QdPHd_qG)rSx45TtWxcdjD67+uMq#Ls&ZrbrhHC05#;TX>)R&aV z(SU{kn&u#o1Pw{3{5}O-zFuBiUs%Kle$G!LrBfkbTXByGe5JQ=>N8k(qN0isbYHo$ z7E%1fvs5aw=;1L?@wD>wZsqfh%5|A4t%9lM8)APhT%&DU9sk7OgJ-;{e6@*Zwb4eE0jfI7z4|Ar`lC^;gJ&)D zwAuqx>naR*9?9v$RO53BG`EEW&en!usI}_yRWJFgVtZ@-BCFrZS8LkVB``r=y(#C5 zD_29+DoIpjrB*3yRNh5ZpOKglE||~|reRj$ z^%6!18PmvwZMcnX70&8Hffg4q{leHbVeDWp7U+i^j>L}IHk_leY8BW9&jz6(b^=qw zESEvtcEjuj7BAm8kGi{*ie*^CfK(dUrZKx4m|@SRRih>$WK%09yw?^&#xyzcH|0NU zruH_S3uAZvo7RMz4mNm?P}sjlG@A36n^)SjwqYCaqNp0H(oV#O1#zV6ps2kV;X@<*45;pJE@ngEacu zRv*89G1Ml2jM2Q*zH_%-S0qc{3*=DK{$8Ygak$Mwq}?p4-Ey=2oWA1~8{l(VhbE5Q zD60LvU1MxZ+n2sJEACFWzIHqAPFHS(4|kXDW=DWXXOMB1Cbl!oIO1I&uYez4xJFmZ zrEb^F4$`eIGp}xc9PAyA<|Uj3e0nD=#B;yQCKK{RnRDrEqnxbpirI+bQn zyjQ&DW|rn=z6Z8V!>eA9t54Xd8|?)umA}ug+*gEc?@sIcX51H+*7YzPG-lkt`o4ck zqkkRVKQ5w;!%<;45#Di;fhp{N)qw|o12ec-T-pF|XyAeQ0HtVPyKi6|$4)WspVjD$ zDIZ`<>EBE1-_hs?nhaza^dA8S!RbRF`@yNcp^Hn9F%gM>*zn`D!JR%{Hj_c>)8Wfo zyeFGOywRZDtih`h{hAb-%rhFn^X`{A!yt))m9&A!nnQCUBM+QFVG*E!9uPBrcx*F^ z_x9M_)BdqbeGgK{o&&&FH2ak{g*5y7`Tan;-lNLVZ71BY+hya%q9Et-ar5FB^Zs$@ zlZo3yFiTNh7=u489i$*gSS-h{_2U=%@f+zN zaxs2uivZLi?BHYP&I#N0grk0ZbQYeG4pp#3A>_;r1*t%QNnKg!qpSJD4t3qD6w=; zYwmIhf$4&<8%@Iz2@3L{6I3q0M_9OPYP^|_pJ4|7`Ucj#SiS}TbC=+?&tK|_5%}Xk z284Oh#()2|{xu86C`%AOn-afj5!aza8&je}H^AY7=x{)EEQ$F+B8I$Qxum@EqvS4> zMD%D}@iJZUy&%R8ul#h#g^sfO5MrHp0j{Lgkb%`$#kIv2KwQR3*7OQOaV4Q~4XU`B zF|fwQv7Xr&4t0QJU94=zucvFRM=GwDD6U*JBswU9emHDgY9{9KZXhmJlqF~^#Q^qB zbRQ`jKS&!k7hq+l&4+443FR0mz}AQZP(p&}LBR1-)}7{w6@RG!e8x(8#uh@1}`}!zi8A`kob%&;Ded^kkm(n4R{`ola6uGnCG! z9nbKwXLHoEhbh2ivkRi{#lO;+)us#L9Bh+%!GXM>#9r(uQMcw|4}357GpXB`=|LbT zj{gDMV5fkf@R*Ruz*v}*z7ohX@Blv{v^sw%9h za=KDhi%zJoD=0={BxRhsdwTnNsZsqyy)u%W!~Zdd$)V|)J{-PhZa#HsAn@P9%Ic`3 z)#@5~YJGKaejk50b3A!EY&F)kxL+wG1Wq;0v^R*C%G9?33ggA2QI z`DF~hN(8rBMNT*Dfo{ZJenoC?vV>(%U)PVk{?wbci@1Uj%hXKeKt>+*s(hWyS1=)y zo~nY;KRVg!CJ{di$5Hx~Hh9h|p~+J7St#=xDWME0si}OE-Wt)_C-%4=d)pCxd#>6mc&s<|>#nnuJ>yXJn`9Pc zsPPP-!gg)|U+=t%YqdI5G_QAGUk*o=HYl8XEMA|v%*WrTczm?qD%qr!=1--HXz1a+ zs?H%uKN7P!(iiw!dM<$Vm9#n6#m4PWs`){};qaWgi53?e`cdc;_4Nu%Z zyC1tqn`9S$yEN-ItLyzjLviw}0qxqrN z3Tp+BE;H8rnH~gccz)P)BJ`8JUWH8djbC)@*>SuhZ~=e24)+4smqs?5=oC|r-0vbe zJh(%^Wjy#Q`N=6}!U8TiyBMI=vgt2p3)pU{M0C?3-a!_%u&(W7yF~8d_n{2x`AacmP zSAP~m-#ohUh^n003fN@wYk$Ov`&4o_Nb~vSFH^O)%t|>XD&8!u^9Qp|O${y{{A2cq zc-PSmCwr2=ME0ECk}Wp}Yb8>}@z+NjkfoK`^l0JJ-3*@V3MYR|0C1}T{9^0Fp_Uc6 zFX7qhZ)YEqPC!_OJ0RD0;K&76%;M~tR|&KzrzT$1Z*>qBPI)@&8=y& zZ}<6{)>Ywb^iD%puOd!JW1*2-`{}m68GEI^=#s-AE%MwEw}Vw<_3-G091G7k>GVQ6 zmZ3Wi27~nN7kQre+Xp;%T3BO-{2pDpMR!-`FKhFpEC8t~ucSXqBw5k02hq^!zzG0l z3Wmj%%IY*V%TIU#m7WQ53iQS389Tv*9#LLFhkQosFh#zcL>Y5vq(wOtG~PM0M&f4$O^NP2Q&97>FuRmP1F;aWA2S?`~ABnfc?cX zb9vZnjXS$u`J$Ny+EFWVh&`K5MaHfxG4CtETN<^uc7QgKAD-%+`su%T_R7ktJJ9Tm z_~mtKN*GY^)2-_lxZ67wqA(>uIGcxc7H~}_s4TuRz2drw&YRad zMmszCn7uD5{%b9l^MtbJKtQG(kI{zwh{Acqx>~B_L-Bn7RP*44mA^HZ@ZcLoxp$sL z{D$dXHP^Cpyurob3gJQ1HJAKI-!MgvPL#DjDfNhEqTNBrHYd204s%SnFRM>_uIqjY zy+PeH#~bRm(j_s&ayQL@n2)Q=-;0v>MaGriOukZ#t_nN1GcvQ{m4AA@D(gnE?YKaF z*Qbd}zmaL1XX~Sb(eJH>)rQ;Tl>Ki%z9rXDjGEGCN(ZQR)(zN;(f$@rA8|!8Y0Crv z^bF{DoGj|Xwwf>R$e9lO`0z=h%->_O*OaTdxn{_skQ{XUZ1tC`96wUor{CEOdn}Fa z-wyDryheMQ{ivBP$@b>KZF6yc_LjF@wpNnD7!2_PIIJCICMqIz=}l4@cO%7g%W#2J zT)$%IZIS!(x<#Md$1kmnv*C^?i{2WU%3sxXQ};zOZiEfc^1Rwq0nRTC0%h%_YfN3K z5jg)lF#c}i9~Ggw;3t{19PJ+_rV|}cC2v!YdN}EglIy_p=*Msx%?AMp!8qcRN_Mf~ zEYiBV_n~4LzsSOJ=EcF*f|0XKy|>YBsd`z@p5~ zGeSqMrfWr1RW{wY4yV_2eZ;^I@aJ&mWE7^9`)Bjp(A&w$XNLfYs-hc!A;g&I086oz zrj6;S++;4cy3~=`-}su*R83=bLA9jFHcoC*Jmg_Pa>K@FKCVemAfTdDb3;#C(@KoK zcB+ggdF!aJd--dt>pS~@`e6B3i#u-6cP7hD;N!{Zfr0vW_Md;U$U*j(!TDAWBG3(9&Fqgt?0*p%Dt*)`=G}DUdV{t97QfEe7 z?Hq*-lO@!V_`0Ln zy-g5&wae3fM?;v@E!biC-z|IhZciSNt1`Ml$?7L6+k4SQN~}Gy%te3-g%f}h9+bc) z(BieZRrqB|hUZ!VV#XHB+PvOVlNmL9Mfig?dq+=;=AV5k^#%Oslj-Qj07_`)**8Aw z@vxbX$1I`qAO=*NTt-tQpS89W>WluTZF4d^ckuZ&)Hm77NzZRY07|D1wP*9YwCeIh z+U;_j&CgK3=+_=5Iod~i053OJ<3m?)m`9GDpW%wXk(Headuv?%Rv z(P5&3q?rv4$a(E=s^@JQ>U~WDD8(9L`5?rC9{dLCDkZI3xITls8;x^H#*IHN&= zi=cZ}KWbn3zCi}5#nI46SVHxGv~`5~z-ipr9caqJZq$Uur~*Xu!eSoC$D+gHS3xki zY~pHIyngt905<^b-u}rkmOZ>-SH7bnEK3ytZw&*Mg(soe;9U`=s*yGNku-5(l2AL- z&hQF!WZOh!IXl~dtNma4@TM;NCSs($Q=ltrlzwNFow?&iKp-c7bbD8%QD@ZTw{U$o zdxTr)y<{4uWa#-psNbqZYHiFW+C5nn0J<*qnnI&*uAX}oS%wZ%(g|PeqLnZQ-ZTdT z1ml1VaT0McO-J6X*Bz2q&BW&8#GJw}Psd#2a1eY)4cnje)>xtOQw2B-ePXxvJ?M;& zgvRG2#iky`dp@&q7)lU3PLN`pW>5VNck z`_fHkrS{}Y0nkAi;C?r$WP-cu72xS{qEidZE5$(|1?FL$UofolXTmwD|9t1CicOv@847Ql2d%qDVl5XFF9Z;(+T%#ekscS$}vEo zx)VzbVDAc|#E)Uh1|n$;Ddh&K!UhPnf?pce)a14#SeJTb9cMr zBSf5RVrN}i2S>UQL-O~OSkXytudw8*V?<0h>``6n$TW;-owBzA?~=`+eoZ3Drh2E` zMlwV`S)=iMn<;plAox3xSeN$rI8*c{k|>L$PA433u=RJRGBUy?Qjm7aNQ^ZSGLy+- zgJ3pHzr>lNd7VBi_VwR*OzoT)-H@ob#g z;t^3CC%@%Re&00AE>X+Au+Hv(n?qE~fvnT1dmtaz=V;7ibIv5ZF#P>~2KnYB=Y~g) zDrf44^&AeyJZ?m;y-qmQAor16j)ey`&z_PQ%bp`*lPS)?CeN9!*^_5^lKG7D_qTea zw;cR!PnLW=pHy6)8Yi0$Cuc}~swXhle?32%F*ja4&kj%!CRC8@fsC*zNQ@{*S1(9f z&yQU%$U@}1mgk$!&X^77!(yGbN;x5(;POj$G-UVJWG;wyl=|+xhh!YEADQT-S@0;iK`Ik zt+?e`uIB_05-yi~Q~9K~TspE+cBA4}ZzbTVowr<$|m=!_@k4)%x1jxX#v^+M?|+Xg5!^V=6j6vX-~E z7RFTPY=n;OMW@czg}tfc5=N(?&`4Byk~}(p7M*KU{wK9ILB6&$wH9$&rzej|manhf zsH-&sVrMap8&nMQZ2e^;AoCk+3l}EQ7E^|)zb=f;io^~Y)m-HVmIybD8rAWZ)ehO# z_ZT(!d17bYpkv-(&=_oWDnM1ZQg*g_ZMIQ;qfr{w=t9Bl&0<)Dn>c$hyQgJG@|Bw# zWusipAg_kA(=xDEGiziM5Dw#U`36V-krt_{1E4EV|*XeWC;qTR<#@*~=*BOHC z^yBV|-0b}Lw9EWbw^vmAhgsSiLjdF1c3)hZ29j2-h*od2?J;YQGb`A{vnL-{{ZOY< zof{lK@eC!>rPkM)8`WBb>-o;ztNOIZf1^!ZqW!Hg!0Ty z?9>3aVVmDy8dS9#9D6#TSv0t4Jjfr_e|D++=xNtquTDr>8*OnL!&YAxcRS6mwkyTd zp)*{cb6Urb%{GW;H?3bc1M2|SdAH_fH)nruB@QIY3VBdGA{aeVerd1-_e^~LnYh9b zx~LbF-Y0`^t2c&VMIg#NV@*Xg&rHUYO(5TOAg@fuR2s%axm(}#W1fkQzlsee}Tl=!q|y6JL48eiV=Y)SS>t z@6_8G_wk-EIiK|Lo(wP<_cxh(p;YHAVXWY{{OhNCb&BqkHz5d%=i&aJkA72 z&?L+&;HOLoYsI*Q20{adFdR)7I>%FZ<`&N<_D}I!3Ug%UxlqSe8U$@QO$p20wsq96;9(ppT?kiN+fOmNyjUdwIa(PRptp%i^ryD_ZmQ zTk?|3y_zg@8UxEB4vPw2t#`G+qRn^%7Q840WMaCku({ZSr-Eh_h-X`vH6Ef(2|?U} zNIy@c@XVWw5tmGw+%Aap<}3CwE8ac>$M%Guii8`ct7qP;))@;M(W_C7xR{GoXO`6j zAL1|5dG^NUIG;6O)Y=_~H8#T9e)MW4%iOnte?#_kAIjG0k?Tc`D+Gl({|o#N#kHw( zkS;%%9=Rl4Lc`*;GNlQAR)RBB21hrp_K40pG;V%!m`y4nYV%ru zxskkRN;{R3rtj+a6gM>-~vsfrXi2Y_q| znJBhtsI#e7N_yxB=pk(CkVizwd%V~GHC+SiDv|VK_iy`>40uV)ri*7RBqlxr6CYT4 zZVODH?6K^9Ev48iksL1{o+%!Zd=3{K4i(5`Q0d=M{K1X+i2z0Nf8RV`sE5Eg%op*4 zTaF};xg#GlNSyd#n9{M0+40@X9Tw_Qv^btva-14_%rkc!HMb?*wEib^m!Np)HMhHW zaq?@BtRX>5$4bL1L94-f%0i|Bu;Pcgr2uu_Ge)Q5gt;xove`z-vv?(nk=Y@9aQ}?u zTu~J4tOJOH=gk1l{NS<67g*2pwb*k!^?a)7f)+rXn7ddK zr{c)xt7gFUQtIYqdU0pkpx_%ff-iLXXXc$WVDpEv{kh?6*qKN207<7(ms0f;nDEucu#72 za&~rHW($KZt%)u(tu8}HXDkjr7|iILvKQdY*k8?*=AachrO6*1undGgDVIs(ya^)E=Gmlo2#Ny!bkt`=!lYgO+7gIc{ohj`P*8Z&KN8 zlQz3xiYIGvgIm%}cDZh?=E+xKTS z|1ni|D*9rff7aiE)2Y|2D2J!dT55UyV)q3yeL*)>&9(LyYLRM~dpFwxd0!q)1qEB^ zr-Wd?Ke!dl?hd^brfv|H9wv~WdL<&VeDzl(kj|e!>NI8Qcf|c}_^kk`#;`k@kBQgs z2K~WWEXS+fcfafF{9x^K0*8X&KQ0Ze&5nD;Xw9AQ zQK;bZV+otJyqI@AYk3(yhSvGNU#Z&^#AZYkau@!dDa?nDI5ii-MhsEK>5B+dNomB) z#-An!59Pe*Mb09WYJElF1~Brb?M8XhbNTg(NAvN`)l*+lTQxXWlqm0nhcF4foMcO? mTg^j}>X!q0Nf=6pFd4h&u;I{fM2y^OI63GQ`mjFhz4a#Ar3PQql0(+RVu3R9gv%W#y{FYkTg#MorD!rdfT?j##F6 zU{aWxS%N4a9%z~vn&Oe%W>boJg-3#lavxstcHh77zCV0_`^>+IRH zK|w)Bj~+!J5IcA7^!N7<4Gs17_C9|6cw}TG5D2_{`7#s=1%tuP&dwnrA!p8<@$m4- z%*@=qd$*I5)2UOZf`fy1?AU>~v$I1Yk&cdzCr_RPfk1z){y+JC&Gvsd;_v=j3IMe7 z9;TuY&|*Q&9bq!EYM6N!(}-h76%(jS89j1*b2`@V**j%hhBT$~v!)|B^K!|8r7QED zdc&F(=KquDJ?61TJfy%`HLzFwVGB_OJ~#+`!E|Co7l}Q zFI(H5`9L5(9-Uopx_fxNefKy&INtAg=F6Wn-VlCnl$+2V6T`_wS$o zvY=2dE-kB8R@EA;B#Xn9W8Tw(xI>y*w-(= zh|7;9O-o+4D&A2}9dQchwk>{OUah|_&A{v4f^Bi)7vY`lD-&)0J}_PcAsb4s814g_dIL4smrvq%;o`)sG0{{l2k1M&wABMN#L^TWzJa`8Dk5@ zzn*tVwDxjU?aQm3n!zLLF2iV&`i*6wUfsQET2}V}%>Ptww}m8YdhNU#G=1O`Doww0 zC_+21CpuaC)-^u)cj}?LDlH#IK;3@HxmW!+VrhY9Q=@LN~bl%=dMG8s+lOAVaW^`#sZ-g`sUCQGqytaK=v zI?G@%`G%SY^54`9KyGhp1zzk;o#cdiQ$HN)zh(I75W8g@i)U|{CezegW;wzCt7X3I z_SZEfgZ*_~y|~qwtn3-tN(fzm;wNycs97(fWs)tHi&=+L~8Ci z6DhV{D15IyPIKQ?LIIu-^g3mvW^WIYgF;b#yDBsf;8?1CG`!cDTbvU>q=Ms7{ZP?x zj$IqoDNWGtzD~*ss(k89Kn)y(YV%Oo>RsV310G0iegv_455qFxc|}_gBdK=bFwcGW zLS7gPrn&M_gGVd0!~`r2DiaI_auOtphE))Jq z|B-=~CWaiV7?sciIYMc4F6p!!%n0J6hwfD9E0qr}Z5tI1k-;E0JP>+j_&(G?u?rut zaf-eF0BN8)7bTnvZywIY7^+>R%nRDnmvd7LG?-%@D!OI(QH7xfeq3o|A5mD!HPl)I zit4ccwy*wKVxR{}>n^6@9QJ-R>_6?uiXdPt>Ox zd)>&+a%_kNg^l$=P0e|}h->7Eu|cG%g;dmV!z=8QNH@X&2HXn?6n`4ZFtt(~8xuk& zoOUY(wujJ-iP7TmQSKkF=u%ZueAvYJxT(Fa$oFdE@8XH+brYw1#5a`?HaQDTJH-9D z;7*x%asg?6EjfP6hKQM3!kM{ads#LvqN&vkbEn*qoz4%N)>W9hl;Jzs88Y#-iEDnN MDN@_q2LMj}7bEBMEC2ui literal 2294 zcmdUs`8V5%8pgj>wL~l}7o%m2nG(b@?QNx@oiIug(W4!g9=Fr0Gd-ket1~?~#&xw+ ztgWKBsv2v8h*+bc_7aj5t*x;%) zUS1lz2BMMa=;)Z4nPIV5D=RAm0&(@~)jzSmzP_3`5D27!7#J96Iv5N#F)=YRGSawA zO-=Rn^)(zlJv~jFp`oF!uC8Wn^x+Rzw-$$CG|7`F4gI6X5v_lZ5fu()66@xgFZ_#CXS6}OynVpSVpf^{IJhT1L#<$t{ zNp1n;r}`VCEj5f{_g}}#P_4DBm$2XY3!`TpP{*~C^{mlt#K|gTfz!`pZFL_BK~?Bi z==S>QhG2c6K~{UiY*YAPmUTb}=~^S=0r6)>N8>y-R=qm*Du7B}>`IXG7a7#1&%H^L zCjd+*WqB~e)cGbefgBFX`!=8)^QL8;QF1nViTS3LJC6S`+a{3KhVA#b)^L+WYZuH? zer1#gc6Dsccm6I|Vs%kPi^TsJe0`<6b7z%a;QY+xI!?-+s0w&}m=8dTKzQhC|*T| zeLb%-=RBWRmFMTQSzQLpK~tZOvyd`m9xZI9+cyYXnD&fKEn8pbt+uI<=&km-h=#3>g*d?$ zm6Ptg-MLm2z1=x}1;0%bb_lk+#KX>_ZrMz<=&fp_LDX}g5QusYF75aCXDN^6Bf5jq;fr@muoQ zaGZ-`F8qg=gP*X3Mg=>Dx}}(p9dS`EJe<9&Tuk6LDwmSDhcWgkx~?itn#DcUa>iLn zOiqr+wrVxc-*tDbus}sRRuW0x-6)IS-sR$Pu6w-d;(L3WL;`t_Pok3dTE8E1-50ja z-rL{m1M!f>{R8nh9Dg8TdWa6B6aH?8vZ>Jfhw{0|rbER-yy#H5 z@PlALty(L-|7Dj)X!^1zq>8@mi$~nl2eR4w>O|4qW`mBnPkUfb0i_i62`s@j4##expQjs!iE(zz;caqEws)!Bl`k=>z68@e}u) z3UDNH(26ZihjrgF0q~EHsKht~xY7iN9I~_8$v|Q%PZZOK?BP3^K{=IX1ij0D%ZUZN z=#}PF`a9Reo$PRMmE{O>_)O_e4i-~oHA^2pPkWGiv~%So7dZlF?>tRlR@o>a!!Ru% zI|*EEtBa!hSY69Y)?WL@VwCO&mpuOibNjPBY7`wN$uD76+k5DHpnj963-I6?h(8J) zl-N>8#MC&2j*bP|x9CuEYM_xQMi^UC)XA)IjUQ#)+>;ddfot7yDCRF9>5E}Z?U~|H zW&~XN--#T1*XNF`s4!{i9JBU(1B!JwQTmbtCcr8_u^yC4%XkZ@S@v&=-5p4Ol5C8G+DWrq_(# z!4=JUxun}WN3@5t)>=wfqzDhjCuT^8HX`p4)<1y#p;XaE3~Y=FWw2*xigrqFV@zbg zJe#fPXgh?0Vj1&GdkSiwAvqQourOVT2!!At{Z`Ca*nlhFOyrUu5&{`}3rl5c%D>Lc%i0!EY+ zT?|LdptDzej`G-o${%*OsgKVl+~`uloGdUCsfTm+G$0E_O%|K?Q~7IgHmcbePvBYC>13w zt+R2(nG1=d;wlL$x1(D35oba|?$eQ-+3)-R@cZ)n^n33=Y*u3i4+y;Oed%YHBcXsV z06=2-)j!?`_X^XvnqHkwx4OF8-`~&U@qWWy$!NPlrBXL^gDiCcRq^}EVego@VnCiU zDtWhf(9TfhtsM@`?%~B^@rW{eNCBVFpeD8GVP)p1x_Ew{$UPuW?KKbxgyrSs#l=O9 zM$=3rc6N5cySsbV*EbXj#i$r15{YCo8Annkm&@6*Vu?f|6bhO0H%g^arBaQFDy34X zTCE2B|9z{`|DSaEi+@D{40L`kk{~YD`Skk7jE6qe$ zVrqJ3c5Z%QacS7L%hnmbzOl*UZ*2>NJG&yWL@JXjlq$7GxdPPxP6yCCeg;B9Q!|bJ z=5&Wnsu@C<+CnQJ=g%IwbLbSeKyR(1D6oQ%d_~p?Ly($rRDDRsa{e2o4f0E#33P*p~Q;FAD)i(zE5BAhD!SdL^ zfKCT60CCfgxI}R?jO?-8=f+?@H`DYwXeG-$EOzCERWx=b`|l>>x+Q>l7HBoct|WH# zC8!a*n(NZZU(NFv0j(h~PQ|VvZ45lp^?a55wR}GV$Mu3APd!+F1F^@gzlDLf)(dZ5 z-?|Tft(OwDQ5+GC+bFs7bZetDD%)|h?0(6E&3CblxJ^{-Ek|m3(ugCk;>pwlUS-NA zj#u?exy7qaH*n&kvkaiW80OgH`L#&!Hovamy3L_tFhuK-m%ys%V`^1 zUlO;C!#3i#@lBoE+XT{xlc1?%Do)T83Qt1|TKbgR0wTr0Sx6c_6)$Y1+Y^LsY_LGs z&c21Cc6<(t-+4b1P1xyNcq-T-bF-ayyVgtMcf0u|LAqZIgq?!jUh#;ts82o>FZ!U~ zB#8R=l>*TKz)7a7~*_9ZIEo7W^8^;HRFV}6FN^6?)n6XX*Rhi3UFm_zW! zv6}&|iqE0p35qWfG0lppJIOnW=_rJ&a^`-iE4cV{eY0}zA$dnRpG0$2Ej*b{P%WnL znpI2BR6DAr(0f2NoSS8ts9wo&Xi={sy>``W1p#iF^`h`Z%|_AfS;}Tb@~(!5M!0GD z^`(j0Ei9%*yWK?I)e1=DkaPMS(}}vhoi1L>-fo|2cTYqybl(>bTRz&C&>bH67VBLU z?aRgk+z;fR!yg?eW@3m3%7tXnfr^W8|3Q5O7b^G$^N4f(w zkElD`*W>>ALt`|+5JEX>ElxLrp^sY9DF!~`3{xap-vQzeFycP9VxtYb=v0$baVF5X z#wY+X_%%wL1%lNa52p`WXm0?{=hPU-K!&X6#M$2L8k1!Dkd0Q1@H4J8ML>qnTElPd$6G<^iz zBYBmCtUJSl(0t}}lGiEhIvW+8_JdZE{|sgeGz_F)v6dF(!0OLhItKWAO5YS9>+Ku@ z83E7V94lkj+j}t>A*s?rv~dF*6cEU~g_0IwVGT~<3}zT!`nCnx;1Uzaiky>{bg|EY zs8$(wwbD|Gaia$!kbTcuRz`<4dX_TS(LS_#w|!AVS&m2-_T z-n78c$0%6^ABORnemNS~CaV-9F}}ROvD7(P)sp_2o{}+^riII@0VlD3hS2fn)^fB_ zF!qWib3EHeUSpa7vU=b*ksJAEJO_K-i#hQ+RbB@?iGu_{KfOiC>p{V|KnMJ%k{)@3 z&f^sh76Y9`JuYehb8sQa%*iV4MU3|W?j{2Ixz@V4(f@n=ty1RaMw{2@lsvtz2Bt+1lQ*9_klOd$g!|)WGa972g?$;`a4zXELhCwrf)?l+^ zAd0aGYi7hp*_vPJf6wy7EHhHsR`xOTzD4=$XsWUu{nNF3SA*t0p-M={jQm~0SaVZ7 z%J-x{5{#~pa%bk0on4&f#Q2{xXSY{RQ%<%dA%YfG4anqRnH8k-Lxb!#HP>@hb+l;q*@pbI`*79+|!2_Pd4^Wzt?ogKc`2YuK?N?Wk$? QCb(C_NpkZu1pqGp7uu8XCIA2c delta 2234 zcmV;r2u1gy5yTOHM@dFFIbkdTQ~=dG0B)N@eYH*C`MbO9e*gdf;^N}IzP^F7Pv__7 zbE!hX!NI}xd&c&L<^RIj`>N6Tn#1*f@bK`?@tM~9rOEe;&iIwj@SNcNx841-+x)NL z{=3BXgX8|c%lMGL^mxudlYYw%FL%uG^cr zxw`fB_0I5`^Yin~@tE}V^zZNQ%=4A;@$u~J?8@|!_V)Jo_xI25o$~VX`1tt$|Nj60 z0000000000001HR1OWg5I{+*I0000i0aO402LHgFVn{3+kI1BQ$!t2G(5Q4uty-^G zt6{fF>Av89uy{-^o6qR9dd+UT-|)D6PLHQRC|iBc@B9CNfr5i*HXtW@go=xdjgF6t zh9EXKm6n&7nVOrNot~edp`xRtrKYE-sj8=vI;*d+v9hzYwYImOIv^lAHom{W!NSAD z#m2|T$;!*j&Cbuz(bCht5~yY-O9DA*RNp1iXBU~tXQEj(vuMa6o1RNuiw3B{|X*VxUk{Fh!ZQ0E0l)g z$B-jSo=my2<;$2eYu?Pcv**vCLyH~_x-sd~s8g$6&APSg*OoP&AOO3z?c2C>>%OfK zMF|4Hg9{%{ytwh>$dfBy&b+zv=g^}|pH98H^b#O;7}(CeyZ7(l!;2qJzP$PK=+moT z&wswX`}gqQ@7NKbzWw|7^XuQwzrX+g00t=FfCLt3;DHDxs9=Khnb5$45Jo8BgcMe2 z;e{AxsNsejcIf}%haiS1;)o=MXhMAgaG>IfEVk(4i!jD0u4s804wvo_zM{=bwNED(Iku7Ha6Bh$gD&qKr1`=%ROK zAnBx(R%+>`m}aW!rkr-_>8GHED(a}DmTKy$q~7Vks;su^>Z`EED(kGY)@tjmxPRuV z>#n@^>g%t-_Il?8#1?DpvB)N??6S-@>+G}8Ml0>K)K+Wlwb*8B?VTTV>+QGThAZy4 zTttntPicYo~h#~_C+^2j8Id}jwJr>yeIEVu0P%P_|*^UO5Y zZ1c@H=dAP2Jol{gofHHu^w2~XZS>JdC$03-OgHWH(@;k(_0&{XZS~Z5GNAR=TzBpD z*I*wdY`5+9+ic&t!Q6D$ZTH=H=dJhNeE045-+%`$_a4f!`s=XA zF8l1X*KYs&?YQTz`|Wpn;QQ~u2QU2a#20V;@yI8y{PN5<@BH)7M=$;K&~vGR0N7`* z{r22<@BR1ShcEv4BPnDB%s zOrZ)_$if!7@P#mpp$un8!y4M~hB(Zj4tIz{5-e~4H3*^*he*UC8h`PKNKB# zI`N56jG`2$NX05zaf$=@;T5;Y#V&gBi(m|+7{{o@ECK+CWK5$P*T}{;x>1d0MB^Lh zNXI(b|M8AvjH3+p$j3hV@sEHEq#y@L$U++OkcdpAA{WWXMmqA5kZhzLBT30hTJn;Z z%%mna$;m-ZvXh_;rGF?#Ny<`!GLA1ur7Bm+%2vAam9UJZEN4l}TH5lKxXh(4cgf3M z`f``3{G~95Nz7sz^O(p?rZQt0M+rFdnb3@;G^a_;YFhJ}*vzIjx5>?Jdh?s$45v89 z3C=jS;GF18r#jck&UU)2TIU_8uXwD zePp) z^rinWjj2p$O4FL!^rkq?sZMW7(w+MBr$7y=P=`v?q8hcOJw2*Ym&(+pI`yeaO)6BU zO4X`b^{PcRBNYj-%GIuV^{Zd?;SLT!*0P%QtY}S>Fb5WYD_-Y=fWG?muYe7#U;9pxj=6h~v80&8~L0%U$eJceyMGuXx8x-twCFyy#8guX@+Z-uAlpz3`2%eCJEw z`r3EC-yOky_sie@`uD#84zPd+tlkkQcLXpO@7n|hA zKn}8yhfL%k^Vr8lPO_4h%;YAUKKuF4fDW{v2TkZg8~V_QPIRJo I5Ci}LJ7^>jzW@LL diff --git a/modules/editor/styles/default/editor.css b/modules/editor/styles/default/editor.css index 796dc3383..5b7d7dc29 100644 --- a/modules/editor/styles/default/editor.css +++ b/modules/editor/styles/default/editor.css @@ -1,25 +1,19 @@ @charset "utf-8"; /* NHN (developers@xpressengine.com) */ - -html, body { height:100%; background-color:transparent; padding:0; margin:0;} -.xe_content{ color:#000; font-size:12px; line-height:1.5;} - +.xe_content{color:#000;font-size:12px;line-height:1.5} .xe_content blockquote.q1, .xe_content blockquote.q2, .xe_content blockquote.q3, .xe_content blockquote.q4, .xe_content blockquote.q5, .xe_content blockquote.q6, -.xe_content blockquote.q7{ padding:10px; margin:0 15px; } - -.xe_content blockquote.q1{ padding:0 10px; border-left:2px solid #ccc;} -.xe_content blockquote.q2{ padding:0 10px; background:url(./img/bg_qmark.gif) no-repeat left top;} -.xe_content blockquote.q3{ border:1px solid #d9d9d9;} -.xe_content blockquote.q4{ border:1px solid #d9d9d9; background:#fbfbfb;} -.xe_content blockquote.q5{ border:2px solid #707070;} -.xe_content blockquote.q6{ border:1px dashed #707070;} -.xe_content blockquote.q7{ border:1px dashed #707070; background:#fbfbfb;} - -.xe_content p { margin:0; padding:0; } - -.xe_content table .xe_selected_cell{ background-color: #d6e9ff} +.xe_content blockquote.q7{padding:10px;margin:0 15px} +.xe_content blockquote.q1{padding:0 10px;border-left:2px solid #ccc} +.xe_content blockquote.q2{padding:0 10px;background:url(./img/bg_qmark.gif) no-repeat left top} +.xe_content blockquote.q3{border:1px solid #d9d9d9} +.xe_content blockquote.q4{border:1px solid #d9d9d9;background:#fbfbfb} +.xe_content blockquote.q5{border:2px solid #707070} +.xe_content blockquote.q6{border:1px dashed #707070} +.xe_content blockquote.q7{border:1px dashed #707070;background:#fbfbfb} +.xe_content table .xe_selected_cell{background-color: #d6e9ff} +.xe_content p{margin:0} diff --git a/modules/editor/styles/default/style.css b/modules/editor/styles/default/style.css index c6c20d93d..6072cfa93 100755 --- a/modules/editor/styles/default/style.css +++ b/modules/editor/styles/default/style.css @@ -1,7 +1,13 @@ @charset "utf-8"; /* NHN (developers@xpressengine.com) */ -.xe_content{color:#000;font-size:12px} -.xe_content blockquote.q1,.xe_content blockquote.q2,.xe_content blockquote.q3,.xe_content blockquote.q4,.xe_content blockquote.q5,.xe_content blockquote.q6,.xe_content blockquote.q7{padding:10px;margin:0 15px} +.xe_content{color:#000;font-size:12px;line-height:1.5} +.xe_content blockquote.q1, +.xe_content blockquote.q2, +.xe_content blockquote.q3, +.xe_content blockquote.q4, +.xe_content blockquote.q5, +.xe_content blockquote.q6, +.xe_content blockquote.q7{padding:10px;margin:0 15px} .xe_content blockquote.q1{padding:0 10px;border-left:2px solid #ccc} .xe_content blockquote.q2{padding:0 10px;background:url(./img/bg_qmark.gif) no-repeat left top} .xe_content blockquote.q3{border:1px solid #d9d9d9} @@ -9,4 +15,4 @@ .xe_content blockquote.q5{border:2px solid #707070} .xe_content blockquote.q6{border:1px dashed #707070} .xe_content blockquote.q7{border:1px dashed #707070;background:#fbfbfb} -.xe_content p { margin:0;} +.xe_content p{margin:0} From 2c26c4bd0e22b57dd573fbab01f51e8e465d501b Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Wed, 21 Sep 2011 08:44:21 +0000 Subject: [PATCH 0797/1372] xpresseditor UI fix. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9253 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- .../xpresseditor/img/btn_extension.black.gif | Bin 2468 -> 0 bytes .../skins/xpresseditor/img/btn_extension.gif | Bin 2659 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100755 modules/editor/skins/xpresseditor/img/btn_extension.black.gif delete mode 100644 modules/editor/skins/xpresseditor/img/btn_extension.gif diff --git a/modules/editor/skins/xpresseditor/img/btn_extension.black.gif b/modules/editor/skins/xpresseditor/img/btn_extension.black.gif deleted file mode 100755 index 06e028d0921c03775aabd488c362097191c8169a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2468 zcmdUt|34E77sp3lHZ$5QE_)PLx;0-G(#_Y>bc@YKDi<$TuBWG~g}&YHlb-Iamm(vS zz9AJe%xuHVcTz)awizk5ikfe;8Mc{yF|=pT>;4tb`QiL>KA-nF=XFjPI@CYlp9qs^ zfH(wDSXg-L)~(&UcZY|E0{{R=N5|mcU>FP*5)zV|oBMa^*s)_yPEKKAVJn5XLP4|GNnQXvheGWoF&Y#^>bT z%gZmg|Df>UqsLF478REi*@x`&LY5OMh?P~BqO$P^4QAtr%tgKXRr*z}4%Jakw13sfVqKM%G)WdhV#4zdMXILx9L zRfCURPf-#Ex7|H#>w9Lv#^Ove@45fgg^9tYn&EO}CfG5&nf$I2_1OJ%=lg1q>0#n1 z0@afIfg0D8GRbM73L297?m1#wX&;+#?(U3zOW~hR-$r zrpI4yZ>LZ7<=A*6^4c3`ScSVVW!MhJ9JgdY{2PX#z*6=f$a9M5Y?i(!pDGt)D_T-Z zcP4PlBDz|aKDS?$eHrR%lYeDqT7Dn-s{JD0?~w<-?p23sexwpp9@*WgmI<3uzw*1g zv~m%3S9~NynW&?Q9 z9f+?)lnD)WoyyX8jG3C)CX=VKcU+T9Wnb)|o0|MkgqzNFC6TA^AzCHVdENuAGx3n&Hxx0jrWtSqU z$g$%bDYASbl2jIkx=X8`#H2{8OOh#4(u->g(i%dx`vRHZ$s}8lNt6W&t#x66N*{2S z(VE9oWOeOgimd*XhC;0cBb*oMZ|zbS8`*oPiwvHxY_Vx1)MKgnLrm&Y%earew{@b3 zwbUlc_E>J8ElOSPkdUa$or|rqIZ)jxlHvk|)!8Ef^Q}lq~ zG)1pEQl#jkA3`YK+Qz0S4gIilH08jK^hG7h8IM?D|4>Z3(*1qa#L}K4Y4v?n*k1LA=-3PDvAA<}>hXm1 zCAHwVpsPoS%JkKI#MRVkKBcuSX+B?O?bS~FA-JHOygpy2{gNv9-1GIf?WTHr2v&4V#*Y zbor)Mg!lSp(9ITK`nD#ik>Bjz*DU|Gu3&i?HdY0f44b<72E(@vt=#y65CXsu>ji`< zGC){@sXd!%9;mnt%_o?_Q9a;z#T^)rVD6XGbE89)=?tj=g`s-4l`67au@&H0cCTHh z;;wgo1>_v64`ym>SMHccu>#CZ0Pe61CoP*5 ztXDqBfK)jH(d;7*D}_1ODi`}fc4*+r!~EzTdmuA2JbvX-39o98-{4^6jTOUV0;JkC z49z)Ny7GjKt#&^ikb$mWc}mZ(Mw~-)<3Ftwm8I1!&CWEx2|~3%#H& z?dg?FQ(FSCX{hdEI`@|^8fI(zQr%@dW@37Ix~=U%{qM!x32|p%YZdh6)f&v?0=N>e zdnDBQBy)1d;!Kyws^K~d^FQ+asuH~hMS5=q^F-!Bx*q6#x*-dWodW-&>xJ>@*?zn!>pyjU&e`;g6HL(- zcwEoU$i{oIylJ~GUBCCWec&B;O&x^7xA1|6f^^=D)4Gm@v}P3Iv9m7Q*Vw2?#-n21 z?4F>t!NXlO__U&35x_tlY z)~K;9btV5{z$AHPTHbu{`r7c#XR4B=1Q2q&ek3QdnW%P=1bXS;72a>If)_juJ*6Kl z;Wv|(MsZ`;_3sJRE#$C>ls;aEnIC{oi5*&q>53oo^A3TgVPx^2_2cdQmiqJ|S>n20 Zz_f0q<0BT&Y+o0$L$5(iO-ukm{{mtVu^rXR8TEn%F0TAf4@K==;`TsQ0Jf8e3iG`PF4MP-8j&%db+&Vxw_Zet9;De zZJ9OTq*CepPUE0DeMpU>YhI2@-!rs%IteCBRH>pQY8)~|wT`o))JRUC;3aM1; z($W%_%N-mX)ai60k?6w^Vr^}mCd#jGY$TCL91f>pzOQ*YX6)K_`l`2&ddY=xD4?8%iyn102W5%W%KlB z&runfFS1@{=j6W1d;KQ=?Yn})q5|OMe|Uq-(G`_d)it#kY#k0ysBdT_HZ`}jHhH^v z`L%U+b@%l4^$$?7elDjegCh(ki#^I1a`F5A)AS5yc5Z%wyST(#URhmR=L>`zn}P}O z>~X17q)@8V8m&%m0K2$={Y)*bOe!ORslbEo5j0{2HN*Bq@Owy8<;Rx}XJZzCP36Et zmY+MWL7J=S`EECG5p=ufmkyo3Gj#CtJ5kJ1p9h-@^cKu$IXK<&%ivb*coihy{U^#~ z4bb#b<%B1sEourM))K=VX~WMnMpCoB3?UI_TcRg%KXtxCUcz2C;zz9eNe$f2$BIoZ zBeZcI<70aDgA(m%jh+@Gf!!8}!B_qrR&{AsDL)DTjAcR3c7G z>=L`XQzPNwPb6PFdqt}dPU8PH+S6^&ynje5zuMcgYtSl0OQXHLf97WH#zUIfNApt6 zhBA0*R_BGhblU*8|4wb+#`Pm*xu~yVrz1@ zZoMGl(Z+gVBjY)Lt2YGYNON}~ z`k8%u=u+eGbtXV!A92t=R@_88g%>w7&x^z@V*wspty8yRx7s+j z_7ebhNuu~Ciztt6@>)Ucc89PQzfBR7MBAOxArDEHvbHmRpO(M>cF&GlBK@VF>c!`9FAa zg!#u+IrH31oPy;eASl=uG-Aal*y6Nu?8@PIQ&Pb$y=(K$c)o!&fOc`TjtRqYsa~`_AT}Nz2VcEg`}By4fnC2UbFbSW=pe#q;|(! zJj2J^E@!$nXjig9+uGHQ$A5per`{Y*jks|EU6`QXz+xKon}qgl zy@)vMWe~T{Bp9~Hf-*hHLAmW0*JI(mBON@PxFe&vHtxuoAjytmEYN#bIpx~BwU2{1 za9h2QEZNoYGQ9VU+O@*OJ)IEKxThDlOZE(FiLw1V%ECb7u2#@!+}qJe{!Gvc4X}Xp znL0|5Kq%VO*nZmFN1AGzjW%=n|g+SwwA=IeEX*5Fy_{v}BWmlhc4Wb8!%ik0+t51RGba;x~ zn2)xqar@zj82}pzz(Q->L+K;8DDrp2>>5u*5F>m}UO;BncqP*rKW|>&mvach<*RegHnKP?RPVD z_9KeogY>Se@27t<<%5bcEfaH5Q_On8=amDVTZ1iv$I={?Xdn#he|TgJ<*Tf)&B0!A z4Ia-5Ppa5Ei3NL)jOV5(tDLRtAc4LU*?e%)+2eJ=p(7Io6lKlv4+5*G7;*_yS?j~9 zgC~znmg$ukur=;lM(|XnqY4Xw;jR}_ZWK@4^n(A2yNL<@gbP>U!i=oV9|iQ(hUs%= zKUw3$hJ&Y@OH_nt7(RSvWST@#)!)m(M+kyvC2ySbpP)GQ84YhKVML_akw0_# z<(Q&G02TPo>)2X=f2oO`t(~^m>;zC*9@O{7-$_4~32&{uQHcOCc;iT$*6OcdX@R%( z6GiOSS`cdk{!~ASwrRr#!Zxp$>Zh>qHr%(|=tE(?6Zy4D90Dc^pVv>5*=-H~&Ph98 zg*5L&JtPEzO(UHQ92%U|T-e7FNBJ3M$8t%n7}!?KZNnUgO(MPH#)6!lj=kMekcMH~ z_e%{6LU=o6ydH5-33fH_BbpTXOH$?yi&}PjkA@{VR@BE0f1!D9Jyw|Jw8H~lB@Y-@ z5|N0Hw)S_@Mnc*0g3g_Flq~u4 z1fsBHeuwWf`h=AjndU6i3cv>_V;OK|rPHnua+NYs$X3?+?QUFqMVZ1}R5_cO0{s35 D19YBO From a67c1740b0eb671efc70e11160a81c1215c61df7 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Wed, 21 Sep 2011 08:55:12 +0000 Subject: [PATCH 0798/1372] xpresseditor UI fix. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9254 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/css/xe.css | 3 + common/css/xe.min.css | 5 +- modules/admin/tpl/css/admin.css | 20 +- modules/admin/tpl/css/admin.min.css | 3 - modules/comment/comment.model.php | 8 +- modules/document/document.model.php | 12 +- modules/document/tpl/icons/declare.gif | Bin 98 -> 0 bytes modules/document/tpl/icons/print.gif | Bin 1017 -> 0 bytes modules/document/tpl/icons/scrap.gif | Bin 371 -> 0 bytes modules/document/tpl/icons/send_trackback.gif | Bin 118 -> 0 bytes modules/document/tpl/icons/vote_down.gif | Bin 345 -> 0 bytes modules/document/tpl/icons/vote_up.gif | Bin 343 -> 0 bytes .../editor/skins/xpresseditor/css/default.css | 637 +++++++++--------- modules/member/tpl/member_config.html | 390 ++++++----- 14 files changed, 528 insertions(+), 550 deletions(-) delete mode 100755 modules/document/tpl/icons/declare.gif delete mode 100755 modules/document/tpl/icons/print.gif delete mode 100755 modules/document/tpl/icons/scrap.gif delete mode 100755 modules/document/tpl/icons/send_trackback.gif delete mode 100755 modules/document/tpl/icons/vote_down.gif delete mode 100755 modules/document/tpl/icons/vote_up.gif diff --git a/common/css/xe.css b/common/css/xe.css index 1823a4c8d..a09ae3dee 100644 --- a/common/css/xe.css +++ b/common/css/xe.css @@ -28,6 +28,9 @@ .btnArea{margin:1em 0;text-align:right;zoom:1} .btnArea:after{content:"";display:block;clear:both} .btnArea .etc{float:left} +/* Text Button */ +input.text, +button.text{border:0;overflow:visible;padding:0;margin:0 4px 0 0;color:#33a;background:none;text-decoration:underline} /* Popup Menu Area */ #popup_menu_area{position:absolute;background:#fff;border:1px solid #e9e9e9;border-radius:5px;padding:10px;line-height:1.3;box-shadow:0 0 6px #666;font-size:12px;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} #popup_menu_area ul{list-style:none;margin:0;padding:0} diff --git a/common/css/xe.min.css b/common/css/xe.min.css index e6b2a8ec7..a09ae3dee 100644 --- a/common/css/xe.min.css +++ b/common/css/xe.min.css @@ -22,12 +22,15 @@ .button span, .button button[type=button]{border-color:#ccc;color:#333 !important;background:#eee -webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#ddd));background:#eee -moz-linear-gradient(top,#fff,#ddd);background-color:#eee;text-shadow:1px 1px 0 #fff;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#ffffff, endColorStr=#dddddd)} .button input, -.button button[type=submit]{border-color:#666;background:#333 -webkit-gradient(linear,0% 0%,0% 100%,from(#777),to(#777),color-stop(0.5,#333),color-stop(0.5,#000));background:#333 -moz-linear-gradient(top,#777,#000);background-color:#333;color:#ffc !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#777777, endColorStr=#333333)} +.button button[type=submit]{border-color:#666;background:#333 -webkit-gradient(linear,0% 0%,0% 100%,from(#777),to(#777),color-stop(0.5,#333),color-stop(0.5,#000));background:#333 -moz-linear-gradient(top,#777,#000);background-color:#333;color:#ffc;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#777777, endColorStr=#333333)} .button span{height:22px} /* Button Area */ .btnArea{margin:1em 0;text-align:right;zoom:1} .btnArea:after{content:"";display:block;clear:both} .btnArea .etc{float:left} +/* Text Button */ +input.text, +button.text{border:0;overflow:visible;padding:0;margin:0 4px 0 0;color:#33a;background:none;text-decoration:underline} /* Popup Menu Area */ #popup_menu_area{position:absolute;background:#fff;border:1px solid #e9e9e9;border-radius:5px;padding:10px;line-height:1.3;box-shadow:0 0 6px #666;font-size:12px;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} #popup_menu_area ul{list-style:none;margin:0;padding:0} diff --git a/modules/admin/tpl/css/admin.css b/modules/admin/tpl/css/admin.css index f0fff1d23..85788d88a 100644 --- a/modules/admin/tpl/css/admin.css +++ b/modules/admin/tpl/css/admin.css @@ -230,9 +230,6 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */ .x .layer ul, .layer ol, .layer .lined, .layer .table{margin-bottom:1em} .x .layerClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px} .x .layerBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden} -/* Text Button */ -.x input.text, -.x button.text{border:0;overflow:visible;padding:0;margin:0 4px 0 0;color:#33a;background:none;text-decoration:underline} /* H2 Anchor */ .x .h2Anchor{position:absolute;right:0;border:0;background:none;color:#00f;text-decoration:underline} /* Skip Navigation */ @@ -380,33 +377,44 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */ .x .langEdit .langList li.active{background:url(../img/iconArrow.gif) no-repeat right -188px} .x .langEdit.showChild .langList{display:block} .x .langEdit #langInput{background:#fff} -.x .langEdit #langInput h2{padding:5px 10px;margin:0 0 -1px 0;font-weight:normal;color:#ccc;border:1px solid #eee;border-top-color:#ccc} -.x .langEdit #langInput h2 strong{color:#000} -.x .langEdit #langInput h2 a{font-size:12px} +.x .langEdit #langInput h2{padding:5px 10px;margin:0 0 -1px 0;font-size:12px;font-weight:normal;color:#666;border:1px solid #eee;border-top-color:#ccc} +.x .langEdit #langInput h2 strong{color:#000;font-size:14px} .x .langEdit.showChild #langInput{position:absolute;left:285px;top:0} .x .langEdit li.en input, +.x .langEdit li.en textarea, .x .mLangEdit li.en textarea{background:url(../img/flag.us.gif) no-repeat 99% 5px} .x .langEdit li.ko input, +.x .langEdit li.ko textarea, .x .mLangEdit li.ko textarea{background:url(../img/flag.kr.gif) no-repeat 99% 5px} .x .langEdit li.jp input, +.x .langEdit li.jp textarea, .x .mLangEdit li.jp textarea{background:url(../img/flag.jp.gif) no-repeat 99% 5px} .x .langEdit li.fr input, +.x .langEdit li.fr textarea, .x .mLangEdit li.fr textarea{background:url(../img/flag.fr.gif) no-repeat 99% 5px} .x .langEdit li.de input, +.x .langEdit li.de textarea, .x .mLangEdit li.de textarea{background:url(../img/flag.de.gif) no-repeat 99% 5px} .x .langEdit li.ru input, +.x .langEdit li.ru textarea, .x .mLangEdit li.ru textarea{background:url(../img/flag.ru.gif) no-repeat 99% 5px} .x .langEdit li.es input, +.x .langEdit li.es textarea, .x .mLangEdit li.es textarea{background:url(../img/flag.es.gif) no-repeat 99% 5px} .x .langEdit li.tr input, +.x .langEdit li.tr textarea, .x .mLangEdit li.tr textarea{background:url(../img/flag.tr.gif) no-repeat 99% 5px} .x .langEdit li.vi input, +.x .langEdit li.vi textarea, .x .mLangEdit li.vi textarea{background:url(../img/flag.vn.gif) no-repeat 99% 5px} .x .langEdit li.mn input, +.x .langEdit li.mn textarea, .x .mLangEdit li.mn textarea{background:url(../img/flag.mn.gif) no-repeat 99% 5px} .x .langEdit li.zh-CN input, +.x .langEdit li.zh-CN textarea, .x .mLangEdit li.zh-CN textarea, .x .langEdit li.zh-TW input, +.x .langEdit li.zh-TW textarea, .x .mLangEdit li.zh-TW textarea{background:url(../img/flag.cn.gif) no-repeat 99% 5px} .x .mLangEdit.en strong{background:url(../img/flag.us.gif) no-repeat 0 10px} .x .mLangEdit.ko strong{background:url(../img/flag.kr.gif) no-repeat 0 10px} diff --git a/modules/admin/tpl/css/admin.min.css b/modules/admin/tpl/css/admin.min.css index 66fa60cc9..85788d88a 100644 --- a/modules/admin/tpl/css/admin.min.css +++ b/modules/admin/tpl/css/admin.min.css @@ -230,9 +230,6 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */ .x .layer ul, .layer ol, .layer .lined, .layer .table{margin-bottom:1em} .x .layerClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px} .x .layerBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden} -/* Text Button */ -.x input.text, -.x button.text{border:0;overflow:visible;padding:0;margin:0 4px 0 0;color:#33a;background:none;text-decoration:underline} /* H2 Anchor */ .x .h2Anchor{position:absolute;right:0;border:0;background:none;color:#00f;text-decoration:underline} /* Skip Navigation */ diff --git a/modules/comment/comment.model.php b/modules/comment/comment.model.php index 7878ff1be..15372437d 100644 --- a/modules/comment/comment.model.php +++ b/modules/comment/comment.model.php @@ -45,17 +45,17 @@ if($comment_config->use_vote_up!='N' && $member_srl!=$logged_info->member_srl){ // Add a vote-up button for positive feedback $url = sprintf("doCallModuleAction('comment','procCommentVoteUp','%s')", $comment_srl); - $oCommentController->addCommentPopupMenu($url,'cmd_vote','./modules/document/tpl/icons/vote_up.gif','javascript'); + $oCommentController->addCommentPopupMenu($url,'cmd_vote','','javascript'); } if($comment_config->use_vote_down!='N' && $member_srl!=$logged_info->member_srl){ // Add a vote-down button for negative feedback $url = sprintf("doCallModuleAction('comment','procCommentVoteDown','%s')", $comment_srl); - $oCommentController->addCommentPopupMenu($url,'cmd_vote_down','./modules/document/tpl/icons/vote_down.gif','javascript'); + $oCommentController->addCommentPopupMenu($url,'cmd_vote_down','','javascript'); } // Add the report feature against abused posts $url = sprintf("doCallModuleAction('comment','procCommentDeclare','%s')", $comment_srl); - $oCommentController->addCommentPopupMenu($url,'cmd_declare','./modules/document/tpl/icons/declare.gif','javascript'); + $oCommentController->addCommentPopupMenu($url,'cmd_declare','','javascript'); } // call a trigger (after) ModuleHandler::triggerCall('comment.getCommentMenu', 'after', $menu_list); @@ -70,7 +70,7 @@ $oCommentController->addCommentPopupMenu($url,'cmd_search_by_ipaddress',$icon_path,'TraceByIpaddress'); $url = sprintf("var params = new Array(); params['ipaddress']='%s'; exec_xml('spamfilter', 'procSpamfilterAdminInsertDeniedIP', params, completeCallModuleAction)", $oComment->getIpAddress()); - $oCommentController->addCommentPopupMenu($url,'cmd_add_ip_to_spamfilter','./modules/document/tpl/icons/declare.gif','javascript'); + $oCommentController->addCommentPopupMenu($url,'cmd_add_ip_to_spamfilter','','javascript'); } } // Changing a language of pop-up menu diff --git a/modules/document/document.model.php b/modules/document/document.model.php index e022a1c5d..d3d120665 100644 --- a/modules/document/document.model.php +++ b/modules/document/document.model.php @@ -471,26 +471,26 @@ if($document_config->use_vote_up!='N' && $member_srl!=$logged_info->member_srl){ // Add a Referral Button $url = sprintf("doCallModuleAction('document','procDocumentVoteUp','%s')", $document_srl); - $oDocumentController->addDocumentPopupMenu($url,'cmd_vote','./modules/document/tpl/icons/vote_up.gif','javascript'); + $oDocumentController->addDocumentPopupMenu($url,'cmd_vote','','javascript'); } if($document_config->use_vote_down!='N' && $member_srl!=$logged_info->member_srl){ // Add button to negative $url= sprintf("doCallModuleAction('document','procDocumentVoteDown','%s')", $document_srl); - $oDocumentController->addDocumentPopupMenu($url,'cmd_vote_down','./modules/document/tpl/icons/vote_down.gif','javascript'); + $oDocumentController->addDocumentPopupMenu($url,'cmd_vote_down','','javascript'); } // Adding Report $url = sprintf("doCallModuleAction('document','procDocumentDeclare','%s')", $document_srl); - $oDocumentController->addDocumentPopupMenu($url,'cmd_declare','./modules/document/tpl/icons/declare.gif','javascript'); + $oDocumentController->addDocumentPopupMenu($url,'cmd_declare','','javascript'); // Add Bookmark button $url = sprintf("doCallModuleAction('member','procMemberScrapDocument','%s')", $document_srl); - $oDocumentController->addDocumentPopupMenu($url,'cmd_scrap','./modules/document/tpl/icons/scrap.gif','javascript'); + $oDocumentController->addDocumentPopupMenu($url,'cmd_scrap','','javascript'); } // Add print button $url = getUrl('','module','document','act','dispDocumentPrint','document_srl',$document_srl); - $oDocumentController->addDocumentPopupMenu($url,'cmd_print','./modules/document/tpl/icons/print.gif','printDocument'); + $oDocumentController->addDocumentPopupMenu($url,'cmd_print','','printDocument'); // Call a trigger (after) ModuleHandler::triggerCall('document.getDocumentMenu', 'after', $menu_list); // If you are managing to find posts by ip @@ -504,7 +504,7 @@ $oDocumentController->addDocumentPopupMenu($url,'cmd_search_by_ipaddress',$icon_path,'TraceByIpaddress'); $url = sprintf("var params = new Array(); params['ipaddress']='%s'; exec_xml('spamfilter', 'procSpamfilterAdminInsertDeniedIP', params, completeCallModuleAction)", $oDocument->getIpAddress()); - $oDocumentController->addDocumentPopupMenu($url,'cmd_add_ip_to_spamfilter','./modules/document/tpl/icons/declare.gif','javascript'); + $oDocumentController->addDocumentPopupMenu($url,'cmd_add_ip_to_spamfilter','','javascript'); } } // Changing the language of pop-up menu diff --git a/modules/document/tpl/icons/declare.gif b/modules/document/tpl/icons/declare.gif deleted file mode 100755 index 5cb534fcbb70ff62b31b872ad3c4f4128c9dcb89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98 zcmZ?wbhEHb6krfwSj5Kg{mjw-fhPYo`2R2J-?(7Xe=uNRU{L(Y!pOkD#-Iaa162wz yFfglU?7H*M;M7S6j)Yr=8$_G~c@CKurLq*Ixa|4BEtnK5P|Oot^Zq+0gEas$qa-c> diff --git a/modules/document/tpl/icons/print.gif b/modules/document/tpl/icons/print.gif deleted file mode 100755 index e36c6b2cb44761447e13c37c58c35f6eca0452e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1017 zcmZ?wbhEHb6krfw_}<3w?)(2eC!d^t`v1<`|2yvdKY8-xrcIkVJ3EgYy>aHunSJ~A z{l0&5|Ni}Z_wGG^{`}ReS3iFIc<9ifn>TMRTehrgRaHn#O?6}6ym|B1ty|aKJ@3PZ z4|C_veem$fwr$%c%~;gX(D3~E^Q(8>&z?Q|+_`h{@$oL+5up+Bd-flF_wL=r%QsiA zUY%RgwEgh?$&)9ywJp;#bB#_ZS-f~@PfyQ+#VgNU|NZpY%MBa1Or5@I`t<2VrPUiZ zZVHP^YU}JPs_L?F@R&Yp?%~5n`~t)8KYUu)lD=!#t_>SDO_?%f>C&Zd-n@xSDth_y z<->;$A3S)ldGqEOGiM*a^ndQcRkp4nTeoh1_3G73BC%lR zlB1h9Z+rUmX>)V)ix)4xe*J3e9&O_oR8ZXT`t>LOpz!>{(%#+qY}h ztjRB}pFe+oU0q#nZtm8t`$MA3`ll@T`t{q9yFV8%U2)^ajsO4uGmHXyg@EEu7Dfh! zHU=G#g`hmaz;TU%SJJ6Lq2VAyF^g7A1#^RQdvuUa3`g71hHmC{UuNtG=xyj{Vq<)? zVggs=b$ot|Jq55^LAY zNMo3v%RW1k`QPQdpMU#o?U@B1;*vgQ52azpL{sG?C-~?|DK(CduHDMXQx*cng0L(pMgq1@h1x- z1A{t)4#+%^pBUK64ooia(2?qQZFW;Iu$+H>VbX+?Gnj5LFefC=Xu0fm*hOP1SI2Y5 z7m^k-Pfjm&(3~Q7KRDH3<_rTNA>~ZJ>?$?^0X69~K~;HGhDt9VH5pD$kruT!S2b>K kC0PZD3J*1gNr4{fDKV96)(R?aSd*f%b=%I3u8s`W0K<%q@&Et; diff --git a/modules/document/tpl/icons/vote_up.gif b/modules/document/tpl/icons/vote_up.gif deleted file mode 100755 index 60d1aa9a71055c45bb6d81b53ad765f4e4886aa8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 343 zcmZ?wbhEHb6krfwxT?nR{>R^3?z5CtrVj`4*_<^rE+C7EIgO{rmHaKQE5|dv<2w!5RNPJ^B6V z@$b*i{(gM=_rvr5PfvU}yX@_mdH7|PiN)1y^Cw6{pberAK@il^pVbaOel|c`4+$1?o0tGm{ zq`IFLGAOqQlr6lXI8j1HP9?sAnVVZxl8;ZZ)U#YoiCIFzS6rNppG_spiI Input Area */ -.xpress-editor a.skip{ position:relative; display:block; top:0; right:0; width:0; height:0; overflow:hidden; clear:both; zoom:1} +.xpress-editor a.skip{position:relative;display:block;top:0;right:0;width:0;height:0;overflow:hidden;clear:both;zoom:1} .xpress-editor a.skip:hover, .xpress-editor a.skip:active, -.xpress-editor a.skip:focus{ position:relative; display:block; padding:5px; right:0; z-index:60; width:auto; height:auto; text-align:right; white-space:nowrap; color:#000; text-decoration:none; letter-spacing:-1px; _zoom:1;} - -.xpress-editor .input_area{ position:relative; margin:10px; z-index:30; *zoom:1; height:400px;} +.xpress-editor a.skip:focus{position:relative;display:block;padding:5px;right:0;z-index:60;width:auto;height:auto;text-align:right;white-space:nowrap;color:#000;text-decoration:none;letter-spacing:-1px;_zoom:1} +.xpress-editor .input_area{position:relative;margin:10px;z-index:30;*zoom:1;height:400px} .xpress-editor .input_area iframe, -.xpress-editor .input_area textarea{ display:block; width:100%; position:relative; height:100%; border:0; overflow:auto;} +.xpress-editor .input_area textarea{display:block;width:100%;position:relative;height:100%;border:0;overflow:auto} .xpress-editor .input_area iframe{} -.xpress-editor .input_area textarea{ *margin:0 -10px; _margin-bottom:-2px;} -.xpress-editor .input_area textarea.blind{ display:none;} -.xpress-editor .input_control{ position:relative; display:block; width:100%; clear:both; text-align:center; background:#fbfbfb url(../img/btn_expand.gif) no-repeat center center; cursor:n-resize;} -.xpress-editor .input_control span{ display:block; height:10px; visibility:hidden; overflow:visible; font-size:0; line-height:200%; white-space:nowrap; color:#fff;} -.xpress-editor.black .input_control { background:#111 url(../img/btn_expand.black.gif) no-repeat center center;} -.xpress-editor.black .input_control span{ border-top:1px solid #333; color:#000;} - -.xpress-editor .tool{ position:relative; overflow:visible; padding:5px 10px 6px 10px; *padding:5px 10px 8px 10px; z-index:40; clear:both; background:#f8f8f8 url(../img/bg_tool.gif) repeat-x left bottom; border:0; *zoom:1;} -.xpress-editor .tool.disable { display:none; } -.xpress-editor.black .tool{ background:#111 url(../img/bg_tool.black.gif) repeat-x left bottom; } - -.xpress-editor .tool:after{ content:""; display:block; clear:both;} -.xpress-editor .tool ul{ position:relative; overflow:visible; float:left; margin:0 5px 2px 0; z-index:2;} -.xpress-editor .tool ul.action{ width:43px;} -.xpress-editor .tool ul.type{ width:auto; white-space:nowrap;} -.xpress-editor .tool ul.style{ width:169px; z-index:6;} -.xpress-editor .tool ul.paragraph{ width:169px; z-index:5;} -.xpress-editor .tool ul.extra1{ width:69px; z-index:4;} -.xpress-editor .tool ul.table{ width:85px; z-index:3;} -.xpress-editor .tool ul.extra2{ width:auto; z-index:2;} -.xpress-editor .tool ul.extra3{ float:left; width:auto; z-index:1; margin-right:1px;} -.xpress-editor .tool ul.extra3 li{ margin-right:4px;} -.xpress-editor .tool li{ position:relative; float:left; margin:0 !important} -.xpress-editor .tool li button{ width:21px; height:21px; background:url(../img/btn_set.gif) no-repeat 0 0; vertical-align:top;} -.xpress-editor.black .tool li button{ width:21px; height:21px; background:url(../img/btn_set.black.gif) no-repeat 0 0; vertical-align:top;} -.xpress-editor .tool li button span{ position:absolute; top:0; left:0; width:0; height:0; overflow:hidden; visibility:hidden;} - +.xpress-editor .input_area textarea{*margin:0 -10px;_margin-bottom:-2px} +.xpress-editor .input_area textarea.blind{display:none} +.xpress-editor .input_control{position:relative;display:block;width:100%;clear:both;text-align:center;background:#fbfbfb url(../img/btn_expand.gif) no-repeat center center;cursor:n-resize} +.xpress-editor .input_control span{display:block;height:10px;visibility:hidden;overflow:visible;font-size:0;line-height:200%;white-space:nowrap;color:#fff} +.xpress-editor.black .input_control {background:#111 url(../img/btn_expand.black.gif) no-repeat center center} +.xpress-editor.black .input_control span{border-top:1px solid #333; color:#000} +.xpress-editor .tool{position:relative;overflow:visible;padding:5px 10px 6px 10px;*padding:5px 10px 8px 10px;z-index:40;clear:both;background:#f8f8f8 url(../img/bg_tool.gif) repeat-x left bottom;border:0;*zoom:1} +.xpress-editor .tool.disable {display:none} +.xpress-editor.black .tool{background:#111 url(../img/bg_tool.black.gif) repeat-x left bottom} +.xpress-editor .tool:after{content:"";display:block;clear:both} +.xpress-editor .tool ul{position:relative;overflow:visible;float:left;margin:0 5px 2px 0 !important;z-index:2;border:0 !important} +.xpress-editor .tool ul.action{width:43px} +.xpress-editor .tool ul.type{width:auto;white-space:nowrap} +.xpress-editor .tool ul.style{width:169px;z-index:6} +.xpress-editor .tool ul.paragraph{width:169px;z-index:5} +.xpress-editor .tool ul.extra1{width:69px;z-index:4} +.xpress-editor .tool ul.table{width:85px;z-index:3} +.xpress-editor .tool ul.extra2{width:auto;z-index:2} +.xpress-editor .tool ul.extra3{float:left;width:auto;z-index:1;margin-right:1px} +.xpress-editor .tool ul.extra3 li{margin-right:4px} +.xpress-editor .tool li{position:relative;float:left;margin:0 !important;padding:0 !important;border:0 !important} +.xpress-editor .tool li button{width:21px;height:21px;background:url(../img/btn_set.gif) no-repeat 0 0;vertical-align:top} +.xpress-editor.black .tool li button{width:21px;height:21px;background:url(../img/btn_set.black.gif) no-repeat 0 0;vertical-align:top} +.xpress-editor .tool li button span{position:absolute;top:0;left:0;width:0;height:0;overflow:hidden;visibility:hidden} .xpress-editor .tool li.extensions span.exButton, -.xpress-editor .tool li.extensions span.exButton button{ float:left; position:relative; display:inline-block; width:auto; background:url(../img/btn_set_blank.gif) no-repeat left top;} -.xpress-editor .tool li.extensions span.exButton button{ left:2px; height:21px; background-position:right top; padding:0 4px; font:11px/21px Tahoma, Sans-serif; text-align:left; *overflow:visible; *line-height:20px;} +.xpress-editor .tool li.extensions span.exButton button{float:left;position:relative;display:inline-block;width:auto;background:url(../img/btn_set_blank.gif) no-repeat left top} +.xpress-editor .tool li.extensions span.exButton button{left:2px;height:21px;background-position:right top;padding:0 4px;font:11px/21px Tahoma, Sans-serif;text-align:left;*overflow:visible;*line-height:20px} .xpress-editor.black .tool li.extensions span.exButton, -.xpress-editor.black .tool li.extensions span.exButton button{ color:#fff; background-image:url(../img/btn_set_blank.black.gif); } - +.xpress-editor.black .tool li.extensions span.exButton button{color:#fff;background-image:url(../img/btn_set_blank.black.gif)} .xpress-editor .tool li.html span, .xpress-editor .tool li.html span button, .xpress-editor .tool li.preview span, -.xpress-editor .tool li.preview span button{ float:left; position:relative; display:inline-block; width:auto; height:auto; visibility:visible; background:url(../img/btn_set_blank.gif) no-repeat 0 0; white-space:nowrap;} +.xpress-editor .tool li.preview span button{float:left;position:relative;display:inline-block;width:auto;height:auto;visibility:visible;background:url(../img/btn_set_blank.gif) no-repeat 0 0;white-space:nowrap} .xpress-editor.black .tool li.html span, .xpress-editor.black .tool li.html span button, .xpress-editor.black .tool li.preview span, -.xpress-editor.black .tool li.preview span button{ color:#fff;background-image:url(../img/btn_set_blank.black.gif); } - +.xpress-editor.black .tool li.preview span button{color:#fff;background-image:url(../img/btn_set_blank.black.gif)} .xpress-editor .tool li.html span, -.xpress-editor .tool li.preview span{ margin-right:2px; background-position:left top;} +.xpress-editor .tool li.preview span{margin-right:2px;background-position:left top} .xpress-editor .tool li.html span button, -.xpress-editor .tool li.preview span button{ left:2px; height:21px; background-position:right top; font:11px/21px Tahoma, Sans-serif; padding:0 4px; *overflow:visible; *line-height:20px;} - -.xpress-editor .tool ul.type li{ float:none; display:inline; *top:1px;} -.xpress-editor .tool ul.type li select{ height:21px; width:62px;} -.xpress-editor.black .tool ul.type li select{ color:#fff; background-color:#000; } - +.xpress-editor .tool li.preview span button{left:2px;height:21px;background-position:right top;font:11px/21px Tahoma, Sans-serif;padding:0 4px;*overflow:visible;*line-height:20px} +.xpress-editor .tool ul.type li{float:none;display:inline;*top:1px} +.xpress-editor .tool ul.type li select{height:21px;width:62px} +.xpress-editor.black .tool ul.type li select{color:#fff;background-color:#000} /* Content > Tool > Button Default */ -.xpress-editor .tool li.undo button{ width:22px; background-position:0 0;} -.xpress-editor .tool li.redo button{ background-position:-22px 0;} -.xpress-editor .tool li.bold button{ width:22px; background-position:-43px 0;} -.xpress-editor .tool li.underline button{ background-position:-65px 0;} -.xpress-editor .tool li.italic button{ background-position:-86px 0;} -.xpress-editor .tool li.del button{ background-position:-107px 0;} -.xpress-editor .tool li.fcolor button{ background-position:-128px 0;} -.xpress-editor .tool li.bcolor button{ background-position:-149px 0;} -.xpress-editor .tool li.sup button{ background-position:-170px 0;} -.xpress-editor .tool li.sub button{ background-position:-191px 0;} -.xpress-editor .tool li.left button{ width:22px; background-position:-212px 0;} -.xpress-editor .tool li.center button{ background-position:-234px 0;} -.xpress-editor .tool li.right button{ background-position:-255px 0;} -.xpress-editor .tool li.justify button{ background-position:-276px 0;} -.xpress-editor .tool li.ol button{ background-position:-297px 0;} -.xpress-editor .tool li.ul button{ background-position:-318px 0;} -.xpress-editor .tool li.outdent button{ background-position:-339px 0;} -.xpress-editor .tool li.indent button{ background-position:-360px 0;} -.xpress-editor .tool li.blockquote button{ width:22px; background-position:-381px 0;} -.xpress-editor .tool li.url button{ width:26px; background-position:-403px 0;} -.xpress-editor .tool li.character button{ background-position:-429px 0;} -.xpress-editor .tool li.table button{ width:22px; background-position:-450px 0;} -.xpress-editor .tool li.merge button{ background-position:-472px 0;} -.xpress-editor .tool li.splitCol button{ background-position:-493px 0;} -.xpress-editor .tool li.splitRow button{ background-position:-514px 0;} -.xpress-editor .tool li.extensions span{ background-position:0 0;} -.xpress-editor .tool li.extensions span button{ background-position:right 0;} -.xpress-editor .tool li.html span{ background-position:0 0;} -.xpress-editor .tool li.html span button{ background-position:right 0;} -.xpress-editor .tool li.preview span{ background-position:0 0;} -.xpress-editor .tool li.preview span button{ background-position:right 0;} - +.xpress-editor .tool li.undo button{width:22px;background-position:0 0} +.xpress-editor .tool li.redo button{background-position:-22px 0} +.xpress-editor .tool li.bold button{width:22px;background-position:-43px 0} +.xpress-editor .tool li.underline button{background-position:-65px 0} +.xpress-editor .tool li.italic button{background-position:-86px 0} +.xpress-editor .tool li.del button{background-position:-107px 0} +.xpress-editor .tool li.fcolor button{background-position:-128px 0} +.xpress-editor .tool li.bcolor button{background-position:-149px 0} +.xpress-editor .tool li.sup button{background-position:-170px 0} +.xpress-editor .tool li.sub button{background-position:-191px 0} +.xpress-editor .tool li.left button{width:22px;background-position:-212px 0} +.xpress-editor .tool li.center button{background-position:-234px 0} +.xpress-editor .tool li.right button{background-position:-255px 0} +.xpress-editor .tool li.justify button{background-position:-276px 0} +.xpress-editor .tool li.ol button{background-position:-297px 0} +.xpress-editor .tool li.ul button{background-position:-318px 0} +.xpress-editor .tool li.outdent button{background-position:-339px 0} +.xpress-editor .tool li.indent button{background-position:-360px 0} +.xpress-editor .tool li.blockquote button{width:22px;background-position:-381px 0} +.xpress-editor .tool li.url button{width:26px;background-position:-403px 0} +.xpress-editor .tool li.character button{background-position:-429px 0} +.xpress-editor .tool li.table button{width:22px;background-position:-450px 0} +.xpress-editor .tool li.merge button{background-position:-472px 0} +.xpress-editor .tool li.splitCol button{background-position:-493px 0} +.xpress-editor .tool li.splitRow button{background-position:-514px 0} +.xpress-editor .tool li.extensions span{background-position:0 0} +.xpress-editor .tool li.extensions span button{background-position:right 0} +.xpress-editor .tool li.html span{background-position:0 0} +.xpress-editor .tool li.html span button{background-position:right 0} +.xpress-editor .tool li.preview span{background-position:0 0} +.xpress-editor .tool li.preview span button{background-position:right 0} /* Content > Tool > Button Hover */ -.xpress-editor .tool li.undo button.hover{ width:22px; background-position:0 -21px;} -.xpress-editor .tool li.redo button.hover{ background-position:-22px -21px;} -.xpress-editor .tool li.bold button.hover{ width:22px; background-position:-43px -21px;} -.xpress-editor .tool li.underline button.hover{ background-position:-65px -21px;} -.xpress-editor .tool li.italic button.hover{ background-position:-86px -21px;} -.xpress-editor .tool li.del button.hover{ background-position:-107px -21px;} -.xpress-editor .tool li.fcolor button.hover{ background-position:-128px -21px;} -.xpress-editor .tool li.bcolor button.hover{ background-position:-149px -21px;} -.xpress-editor .tool li.sup button.hover{ background-position:-170px -21px;} -.xpress-editor .tool li.sub button.hover{ background-position:-191px -21px;} -.xpress-editor .tool li.left button.hover{ width:22px; background-position:-212px -21px;} -.xpress-editor .tool li.center button.hover{ background-position:-234px -21px;} -.xpress-editor .tool li.right button.hover{ background-position:-255px -21px;} -.xpress-editor .tool li.justify button.hover{ background-position:-276px -21px;} -.xpress-editor .tool li.ol button.hover{ background-position:-297px -21px;} -.xpress-editor .tool li.ul button.hover{ background-position:-318px -21px;} -.xpress-editor .tool li.outdent button.hover{ background-position:-339px -21px;} -.xpress-editor .tool li.indent button.hover{ background-position:-360px -21px;} -.xpress-editor .tool li.blockquote button.hover{ width:22px; background-position:-381px -21px;} -.xpress-editor .tool li.url button.hover{ width:26px; background-position:-403px -21px;} -.xpress-editor .tool li.character button.hover{ background-position:-429px -21px;} -.xpress-editor .tool li.table button.hover{ width:22px; background-position:-450px -21px;} -.xpress-editor .tool li.merge button.hover{ background-position:-472px -21px;} -.xpress-editor .tool li.splitCol button.hover{ background-position:-493px -21px;} -.xpress-editor .tool li.splitRow button.hover{ background-position:-514px -21px;} -.xpress-editor .tool li.extensions span.hover{ background-position:0 -21px;} -.xpress-editor .tool li.extensions span.hover button{ background-position:right -21px;} -.xpress-editor .tool li.html span.hover{ background-position:0 -21px;} -.xpress-editor .tool li.html span.hover button{ background-position:right -21px;} -.xpress-editor .tool li.preview span.hover{ background-position:0 -21px;} -.xpress-editor .tool li.preview span.hover button{ background-position:right -21px;} - +.xpress-editor .tool li.undo button.hover{width:22px;background-position:0 -21px} +.xpress-editor .tool li.redo button.hover{background-position:-22px -21px} +.xpress-editor .tool li.bold button.hover{width:22px;background-position:-43px -21px} +.xpress-editor .tool li.underline button.hover{background-position:-65px -21px} +.xpress-editor .tool li.italic button.hover{background-position:-86px -21px} +.xpress-editor .tool li.del button.hover{background-position:-107px -21px} +.xpress-editor .tool li.fcolor button.hover{background-position:-128px -21px} +.xpress-editor .tool li.bcolor button.hover{background-position:-149px -21px} +.xpress-editor .tool li.sup button.hover{background-position:-170px -21px} +.xpress-editor .tool li.sub button.hover{background-position:-191px -21px} +.xpress-editor .tool li.left button.hover{width:22px;background-position:-212px -21px} +.xpress-editor .tool li.center button.hover{background-position:-234px -21px} +.xpress-editor .tool li.right button.hover{background-position:-255px -21px} +.xpress-editor .tool li.justify button.hover{background-position:-276px -21px} +.xpress-editor .tool li.ol button.hover{background-position:-297px -21px} +.xpress-editor .tool li.ul button.hover{background-position:-318px -21px} +.xpress-editor .tool li.outdent button.hover{background-position:-339px -21px} +.xpress-editor .tool li.indent button.hover{background-position:-360px -21px} +.xpress-editor .tool li.blockquote button.hover{width:22px;background-position:-381px -21px} +.xpress-editor .tool li.url button.hover{width:26px;background-position:-403px -21px} +.xpress-editor .tool li.character button.hover{background-position:-429px -21px} +.xpress-editor .tool li.table button.hover{width:22px;background-position:-450px -21px} +.xpress-editor .tool li.merge button.hover{background-position:-472px -21px} +.xpress-editor .tool li.splitCol button.hover{background-position:-493px -21px} +.xpress-editor .tool li.splitRow button.hover{background-position:-514px -21px} +.xpress-editor .tool li.extensions span.hover{background-position:0 -21px} +.xpress-editor .tool li.extensions span.hover button{background-position:right -21px} +.xpress-editor .tool li.html span.hover{background-position:0 -21px} +.xpress-editor .tool li.html span.hover button{background-position:right -21px} +.xpress-editor .tool li.preview span.hover{background-position:0 -21px} +.xpress-editor .tool li.preview span.hover button{background-position:right -21px} /* Content > Tool > Button Active */ -.xpress-editor .tool li.undo button.active{ width:22px; background-position:0 -42px;} -.xpress-editor .tool li.redo button.active{ background-position:-22px -42px;} -.xpress-editor .tool li.bold button.active{ width:22px; background-position:-43px -42px;} -.xpress-editor .tool li.underline button.active{ background-position:-65px -42px;} -.xpress-editor .tool li.italic button.active{ background-position:-86px -42px;} -.xpress-editor .tool li.del button.active{ background-position:-107px -42px;} -.xpress-editor .tool li.fcolor button.active{ background-position:-128px -42px;} -.xpress-editor .tool li.bcolor button.active{ background-position:-149px -42px;} -.xpress-editor .tool li.sup button.active{ background-position:-170px -42px;} -.xpress-editor .tool li.sub button.active{ background-position:-191px -42px;} -.xpress-editor .tool li.left button.active{ width:22px; background-position:-212px -42px;} -.xpress-editor .tool li.center button.active{ background-position:-234px -42px;} -.xpress-editor .tool li.right button.active{ background-position:-255px -42px;} -.xpress-editor .tool li.justify button.active{ background-position:-276px -42px;} -.xpress-editor .tool li.ol button.active{ background-position:-297px -42px;} -.xpress-editor .tool li.ul button.active{ background-position:-318px -42px;} -.xpress-editor .tool li.outdent button.active{ background-position:-339px -42px;} -.xpress-editor .tool li.indent button.active{ background-position:-360px -42px;} -.xpress-editor .tool li.blockquote button.active{ width:22px; background-position:-381px -42px;} -.xpress-editor .tool li.url button.active{ width:26px; background-position:-403px -42px;} -.xpress-editor .tool li.character button.active{ background-position:-429px -42px;} -.xpress-editor .tool li.table button.active{ width:22px; background-position:-450px -42px;} -.xpress-editor .tool li.merge button.active{ background-position:-472px -42px;} -.xpress-editor .tool li.splitCol button.active{ background-position:-493px -42px;} -.xpress-editor .tool li.splitRow button.active{ background-position:-514px -42px;} -.xpress-editor .tool li.extensions span.active{ background-position:0 -42px;} -.xpress-editor .tool li.extensions span.active button{ background-position:right -42px;} -.xpress-editor .tool li.html span.active{ background-position:0 -42px;} -.xpress-editor .tool li.html span.active button{ background-position:right -42px;} -.xpress-editor .tool li.preview span.active{ background-position:0 -42px;} -.xpress-editor .tool li.preview span.active button{ background-position:right -42px;} - +.xpress-editor .tool li.undo button.active{width:22px;background-position:0 -42px} +.xpress-editor .tool li.redo button.active{background-position:-22px -42px} +.xpress-editor .tool li.bold button.active{width:22px;background-position:-43px -42px} +.xpress-editor .tool li.underline button.active{background-position:-65px -42px} +.xpress-editor .tool li.italic button.active{background-position:-86px -42px} +.xpress-editor .tool li.del button.active{background-position:-107px -42px} +.xpress-editor .tool li.fcolor button.active{background-position:-128px -42px} +.xpress-editor .tool li.bcolor button.active{background-position:-149px -42px} +.xpress-editor .tool li.sup button.active{background-position:-170px -42px} +.xpress-editor .tool li.sub button.active{background-position:-191px -42px} +.xpress-editor .tool li.left button.active{width:22px;background-position:-212px -42px} +.xpress-editor .tool li.center button.active{background-position:-234px -42px} +.xpress-editor .tool li.right button.active{background-position:-255px -42px} +.xpress-editor .tool li.justify button.active{background-position:-276px -42px} +.xpress-editor .tool li.ol button.active{background-position:-297px -42px} +.xpress-editor .tool li.ul button.active{background-position:-318px -42px} +.xpress-editor .tool li.outdent button.active{background-position:-339px -42px} +.xpress-editor .tool li.indent button.active{background-position:-360px -42px} +.xpress-editor .tool li.blockquote button.active{width:22px;background-position:-381px -42px} +.xpress-editor .tool li.url button.active{width:26px;background-position:-403px -42px} +.xpress-editor .tool li.character button.active{background-position:-429px -42px} +.xpress-editor .tool li.table button.active{width:22px;background-position:-450px -42px} +.xpress-editor .tool li.merge button.active{background-position:-472px -42px} +.xpress-editor .tool li.splitCol button.active{background-position:-493px -42px} +.xpress-editor .tool li.splitRow button.active{background-position:-514px -42px} +.xpress-editor .tool li.extensions span.active{background-position:0 -42px} +.xpress-editor .tool li.extensions span.active button{background-position:right -42px} +.xpress-editor .tool li.html span.active{background-position:0 -42px} +.xpress-editor .tool li.html span.active button{background-position:right -42px} +.xpress-editor .tool li.preview span.active{background-position:0 -42px} +.xpress-editor .tool li.preview span.active button{background-position:right -42px} /* Content > Tool > Button Off */ .xpress-editor .tool.off li.undo button, -.xpress-editor .tool li.undo button.off{ width:22px; background-position:0 -63px;} +.xpress-editor .tool li.undo button.off{width:22px;background-position:0 -63px} .xpress-editor .tool.off li.redo button, -.xpress-editor .tool li.redo button.off{ background-position:-22px -63px;} -.xpress-editor .tool.off li.bold button{ width:22px; background-position:-43px -63px;} -.xpress-editor .tool.off li.underline button{ background-position:-65px -63px;} -.xpress-editor .tool.off li.italic button{ background-position:-86px -63px;} -.xpress-editor .tool.off li.del button{ background-position:-107px -63px;} -.xpress-editor .tool.off li.fcolor button{ background-position:-128px -63px;} -.xpress-editor .tool.off li.bcolor button{ background-position:-149px -63px;} -.xpress-editor .tool.off li.sup button{ background-position:-170px -63px;} -.xpress-editor .tool.off li.sub button{ background-position:-191px -63px;} -.xpress-editor .tool.off li.left button{ width:22px; background-position:-212px -63px;} -.xpress-editor .tool.off li.center button{ background-position:-234px -63px;} -.xpress-editor .tool.off li.right button{ background-position:-255px -63px;} -.xpress-editor .tool.off li.justify button{ background-position:-276px -63px;} -.xpress-editor .tool.off li.ol button{ background-position:-297px -63px;} -.xpress-editor .tool.off li.ul button{ background-position:-318px -63px;} -.xpress-editor .tool.off li.outdent button{ background-position:-339px -63px;} -.xpress-editor .tool.off li.indent button{ background-position:-360px -63px;} -.xpress-editor .tool.off li.blockquote button{ width:22px; background-position:-381px -63px;} -.xpress-editor .tool.off li.url button{ width:26px; background-position:-403px -63px;} -.xpress-editor .tool.off li.character button{ background-position:-429px -63px;} -.xpress-editor .tool.off li.table button{ width:22px; background-position:-450px -63px;} +.xpress-editor .tool li.redo button.off{background-position:-22px -63px} +.xpress-editor .tool.off li.bold button{width:22px;background-position:-43px -63px} +.xpress-editor .tool.off li.underline button{background-position:-65px -63px} +.xpress-editor .tool.off li.italic button{background-position:-86px -63px} +.xpress-editor .tool.off li.del button{background-position:-107px -63px} +.xpress-editor .tool.off li.fcolor button{background-position:-128px -63px} +.xpress-editor .tool.off li.bcolor button{background-position:-149px -63px} +.xpress-editor .tool.off li.sup button{background-position:-170px -63px} +.xpress-editor .tool.off li.sub button{background-position:-191px -63px} +.xpress-editor .tool.off li.left button{width:22px;background-position:-212px -63px} +.xpress-editor .tool.off li.center button{background-position:-234px -63px} +.xpress-editor .tool.off li.right button{background-position:-255px -63px} +.xpress-editor .tool.off li.justify button{background-position:-276px -63px} +.xpress-editor .tool.off li.ol button{background-position:-297px -63px} +.xpress-editor .tool.off li.ul button{background-position:-318px -63px} +.xpress-editor .tool.off li.outdent button{background-position:-339px -63px} +.xpress-editor .tool.off li.indent button{background-position:-360px -63px} +.xpress-editor .tool.off li.blockquote button{width:22px;background-position:-381px -63px} +.xpress-editor .tool.off li.url button{width:26px;background-position:-403px -63px} +.xpress-editor .tool.off li.character button{background-position:-429px -63px} +.xpress-editor .tool.off li.table button{width:22px;background-position:-450px -63px} .xpress-editor .tool.off li.merge button, -.xpress-editor .tool li.merge button.off{ background-position:-472px -63px;} +.xpress-editor .tool li.merge button.off{background-position:-472px -63px} .xpress-editor .tool.off li.splitCol button, -.xpress-editor .tool li.splitCol button.off{ background-position:-493px -63px;} +.xpress-editor .tool li.splitCol button.off{background-position:-493px -63px} .xpress-editor .tool.off li.splitRow button, -.xpress-editor .tool li.splitRow button.off{ background-position:-514px -63px;} -.xpress-editor .tool.off li.extensions span{ background-position:0 -63px;} -.xpress-editor .tool.off li.extensions span button{ background-position:right -63px; color:#bcbcbc;} -.xpress-editor .tool.off li button{ cursor:default;} -.xpress-editor .tool.off ul.extra3 li button{ cursor:pointer;} - +.xpress-editor .tool li.splitRow button.off{background-position:-514px -63px} +.xpress-editor .tool.off li.extensions span{background-position:0 -63px} +.xpress-editor .tool.off li.extensions span button{background-position:right -63px;color:#bcbcbc} +.xpress-editor .tool.off li button{cursor:default} +.xpress-editor .tool.off ul.extra3 li button{cursor:pointer} /* Content > Tool > Layer */ -.xpress-editor .tool .layer{ display:none; position:absolute; left:0; top:20px; background-color:#fbfbfb; border:1px solid #c5c5c5; border-right:1px solid #9f9f9f; border-bottom:1px solid #9f9f9f;} -.xpress-editor .tool .layer li{ float:none; left:0;} +.xpress-editor .tool .layer{display:none;position:absolute;left:0;top:20px;background-color:#fbfbfb;border:1px solid #c5c5c5;border-right:1px solid #9f9f9f;border-bottom:1px solid #9f9f9f} +.xpress-editor .tool .layer li{float:none;left:0} .xpress-editor .tool .layer button, -.xpress-editor.black .tool .layer button{ margin:0 !important; width:auto; height:auto; background:none;} -.xpress-editor .tool .layer button span{ position:absolute; width:0; height:0; font-size:0; line-height:0; overflow:hidden; visibility:hidden;} -.xpress-editor .tool .btn_area{ position:relative; clear:both; text-align:center !important; padding:7px 0 12px 0; width:100%; white-space:nowrap; *zoom:1;} -.xpress-editor .tool .btn_area *{ vertical-align:top;} -.xpress-editor .tool button.close{ position:absolute; top:4px; right:3px; width:21px; height:20px; background:url(../img/btn_layer_close.gif) no-repeat center center !important;} -.xpress-editor .tool button.close span{ position:absolute; width:0; height:0; overflow:hidden; visibility:hidden;} -.xpress-editor .tool .layer .btn_area button{ *margin:0 2px !important;} -.xpress-editor .tool .layer .btn_area button.confirm{ width:38px; height:21px; background:url(../img/btn_layer_confirm.gif) no-repeat;} -.xpress-editor .tool .layer .btn_area button.cancel{ width:38px; height:21px; background:url(../img/btn_layer_cancel.gif) no-repeat;} - -.xpress-editor .tool li.fcolor .layer{ width:218px !important; height:auto !important; background-image:none !important; overflow:hidden;} -.xpress-editor .tool .layer .palette{ width:210px; position:relative; left:7px; padding:8px 0 7px 0; margin:0;} -.xpress-editor .tool .layer .palette li{ float:left; margin:0 1px 1px 0; font-size:0; line-height:0;} -.xpress-editor .tool .layer .palette button{ position:relative; overflow:hidden; width:11px !important; height:11px !important;} - -.xpress-editor .tool li.bcolor .layer { width:218px; overflow:hidden;} -.xpress-editor .tool .layer .background{ width:210px; position:relative; left:7px; margin:0 0 -2px 0; padding:8px 0 0 0; *padding-bottom:8px; _padding-bottom:4px;} -.xpress-editor .tool .layer .background li{ float:left; margin:0 5px 2px 0;} -.xpress-editor .tool .layer .background button{ position:relative; overflow:hidden; width:65px; height:19px; text-align:left; padding:4px;} -.xpress-editor .tool .layer .background button span{ position:relative; visibility:visible; font-size:12px; line-height:normal; width:auto; height:auto;} - -.xpress-editor .tool li.style .layer{ padding:4px 2px; _overflow:hidden; filter:progid:DXImageTransform.Microsoft.Shadow(color=#dddddd,direction=135,strength=2);} -.xpress-editor .tool li.style .layer li{ position:relative; background:#fbfbfb;} -.xpress-editor .tool li.style .layer li button{ display:block; width:134px; position:relative;} -.xpress-editor .tool li.style .layer li button span{ display:block; width:130px; text-align:left; letter-spacing:normal;} -.xpress-editor .tool li.style .layer li.h3 button span{ padding:3px 0 1px 4px; height:15px; _height /**/:19px; font-size:16px; font-weight:bold;} -.xpress-editor .tool li.style .layer li.h4 button span{ padding:3px 0 2px 4px; height:13px; _height /**/:18px; font-size:14px; font-weight:bold;} -.xpress-editor .tool li.style .layer li.h5 button span{ padding:3px 0 1px 4px; height:11px; _height /**/:15px; font-size:12px; font-weight:bold;} -.xpress-editor .tool li.style .layer li.h6 button span{ padding:3px 0 1px 4px; height:11px; _height /**/:15px; font-size:12px;} -.xpress-editor .tool li.style .layer li.p button span{ padding:3px 0 1px 4px; height:11px; _height /**/:15px; font-size:12px; color:#5d5d5d;} -.xpress-editor .tool li.style .layer li button.hover{ background:#c1f471; *height:1%;} - -.xpress-editor .tool li.blockquote .layer{ padding:6px 5px 6px 7px; left:0; width:288px;} -.xpress-editor .tool li.blockquote .layer ul{ *zoom:1; margin:0;} -.xpress-editor .tool li.blockquote .layer ul:after{ content:""; display:block; clear:both;} -.xpress-editor .tool li.blockquote .layer li{ position:relative; float:left; overflow:hidden; width:32px; height:34px; margin:0 2px 0 0; border:1px solid #cdcecc; background-image:url(../img/btn_qmark.gif); background-repeat:no-repeat;} -.xpress-editor .tool li.blockquote .layer li.q1{ background-position:0 0;} -.xpress-editor .tool li.blockquote .layer li.q2{ background-position:-32px 0;} -.xpress-editor .tool li.blockquote .layer li.q3{ background-position:-64px 0;} -.xpress-editor .tool li.blockquote .layer li.q4{ background-position:-96px 0;} -.xpress-editor .tool li.blockquote .layer li.q5{ background-position:-128px 0;} -.xpress-editor .tool li.blockquote .layer li.q6{ background-position:-160px 0;} -.xpress-editor .tool li.blockquote .layer li.q7{ background-position:-192px 0;} -.xpress-editor .tool li.blockquote .layer li.q8{ background-position:-224px 0;} -.xpress-editor .tool li.blockquote .layer li button{ width:32px; height:34px;} - -.xpress-editor .tool li.url .layer{ width:231px; height:125px; background-image:url(../img/bx_url.gif); background-repeat:no-repeat; background-position:10px 14px;} -.xpress-editor .tool li.url .layer fieldset{ position:absolute; width:212px; left:10px; top:14px;} -.xpress-editor .tool li.url .layer fieldset h3{ position:absolute; top:-4px; left:15px; color:#404040; visibility:visible; font-size:12px; line-height:normal; width:auto; height:auto; background:none; margin:0; padding:0; font-weight:normal;} -.xpress-editor .tool li.url .layer fieldset input.link{ position:absolute; left:12px; top:19px; width:179px; padding:2px 0 1px 6px; *margin:-1px 0; font-size:11px; height:13px; border:1px solid #818181; border-right:1px solid #dadada; border-bottom:1px solid #dadada;} -.xpress-editor .tool li.url .layer fieldset p{ position:absolute; left:12px; top:44px;} -.xpress-editor .tool li.url .layer fieldset p input{ width:13px; height:13px; vertical-align:middle; margin-right:3px;} -.xpress-editor .tool li.url .layer .btn_area{ position:absolute; bottom:12px; padding:0;} - -.xpress-editor .tool li.table .layer{ width:242px; height:239px; background-image:url(../img/bx_table.gif); background-repeat:no-repeat; background-position:10px 14px;} -.xpress-editor .tool li.table .layer fieldset{ position:absolute; width:222px; left:10px;} -.xpress-editor .tool li.table .layer fieldset h3{ position:absolute; top:-4px; left:15px; color:#404040; visibility:visible; font-size:12px; line-height:normal; width:auto; height:auto; background:none; margin:0; padding:0; font-weight:normal;} - -.xpress-editor .tool li.table .layer fieldset dl{ position:absolute; left:10px;} -.xpress-editor .tool li.table .layer fieldset dt{ float:left; padding:3px 0 0 0; height:20px; white-space:nowrap; letter-spacing:-1px;} -.xpress-editor .tool li.table .layer fieldset dd{ float:right; position:relative;} +.xpress-editor.black .tool .layer button{margin:0 !important;width:auto;height:auto;background:none} +.xpress-editor .tool .layer button span{position:absolute;width:0;height:0;font-size:0;line-height:0;overflow:hidden;visibility:hidden} +.xpress-editor .tool .btn_area{position:relative;clear:both;text-align:center !important;padding:7px 0 12px 0;width:100%;white-space:nowrap;*zoom:1} +.xpress-editor .tool .btn_area *{vertical-align:top} +.xpress-editor .tool button.close{position:absolute;top:4px;right:3px;width:21px;height:20px;background:url(../img/btn_layer_close.gif) no-repeat center center !important} +.xpress-editor .tool button.close span{position:absolute;width:0;height:0;overflow:hidden;visibility:hidden} +.xpress-editor .tool .layer .btn_area button{*margin:0 2px !important} +.xpress-editor .tool .layer .btn_area button.confirm{width:38px;height:21px;background:url(../img/btn_layer_confirm.gif) no-repeat} +.xpress-editor .tool .layer .btn_area button.cancel{width:38px;height:21px;background:url(../img/btn_layer_cancel.gif) no-repeat} +.xpress-editor .tool li.fcolor .layer{width:218px !important;height:auto !important;background-image:none !important;overflow:hidden} +.xpress-editor .tool .layer .palette{width:210px;position:relative;left:7px;padding:8px 0 7px 0;margin:0} +.xpress-editor .tool .layer .palette li{float:left;margin:0 1px 1px 0;font-size:0;line-height:0} +.xpress-editor .tool .layer .palette button{position:relative;overflow:hidden;width:11px !important;height:11px !important} +.xpress-editor .tool li.bcolor .layer {width:218px;overflow:hidden} +.xpress-editor .tool .layer .background{width:210px;position:relative;left:7px;margin:0 0 -2px 0;padding:8px 0 0 0;*padding-bottom:8px;_padding-bottom:4px} +.xpress-editor .tool .layer .background li{float:left;margin:0 5px 2px 0} +.xpress-editor .tool .layer .background button{position:relative;overflow:hidden;width:65px;height:19px;text-align:left;padding:4px} +.xpress-editor .tool .layer .background button span{position:relative;visibility:visible;font-size:12px;line-height:normal;width:auto;height:auto} +.xpress-editor .tool li.style .layer{padding:4px 2px;_overflow:hidden;filter:progid:DXImageTransform.Microsoft.Shadow(color=#dddddd,direction=135,strength=2)} +.xpress-editor .tool li.style .layer li{position:relative;background:#fbfbfb} +.xpress-editor .tool li.style .layer li button{display:block;width:134px;position:relative} +.xpress-editor .tool li.style .layer li button span{display:block;width:130px;text-align:left;letter-spacing:normal} +.xpress-editor .tool li.style .layer li.h3 button span{padding:3px 0 1px 4px;height:15px;_height /**/:19px;font-size:16px;font-weight:bold} +.xpress-editor .tool li.style .layer li.h4 button span{padding:3px 0 2px 4px;height:13px;_height /**/:18px;font-size:14px;font-weight:bold} +.xpress-editor .tool li.style .layer li.h5 button span{padding:3px 0 1px 4px;height:11px;_height /**/:15px;font-size:12px;font-weight:bold} +.xpress-editor .tool li.style .layer li.h6 button span{padding:3px 0 1px 4px;height:11px;_height /**/:15px;font-size:12px} +.xpress-editor .tool li.style .layer li.p button span{padding:3px 0 1px 4px;height:11px;_height /**/:15px;font-size:12px;color:#5d5d5d} +.xpress-editor .tool li.style .layer li button.hover{background:#c1f471;*height:1%} +.xpress-editor .tool li.blockquote .layer{padding:6px 5px 6px 7px;left:0;width:288px} +.xpress-editor .tool li.blockquote .layer ul{*zoom:1;margin:0} +.xpress-editor .tool li.blockquote .layer ul:after{content:"";display:block;clear:both} +.xpress-editor .tool li.blockquote .layer li{position:relative;float:left;overflow:hidden;width:32px;height:34px;margin:0 2px 0 0;border:1px solid #cdcecc;background-image:url(../img/btn_qmark.gif);background-repeat:no-repeat} +.xpress-editor .tool li.blockquote .layer li.q1{background-position:0 0} +.xpress-editor .tool li.blockquote .layer li.q2{background-position:-32px 0} +.xpress-editor .tool li.blockquote .layer li.q3{background-position:-64px 0} +.xpress-editor .tool li.blockquote .layer li.q4{background-position:-96px 0} +.xpress-editor .tool li.blockquote .layer li.q5{background-position:-128px 0} +.xpress-editor .tool li.blockquote .layer li.q6{background-position:-160px 0} +.xpress-editor .tool li.blockquote .layer li.q7{background-position:-192px 0} +.xpress-editor .tool li.blockquote .layer li.q8{background-position:-224px 0} +.xpress-editor .tool li.blockquote .layer li button{width:32px;height:34px} +.xpress-editor .tool li.url .layer{width:231px;height:125px;background-image:url(../img/bx_url.gif);background-repeat:no-repeat;background-position:10px 14px} +.xpress-editor .tool li.url .layer fieldset{position:absolute;width:212px;left:10px;top:14px} +.xpress-editor .tool li.url .layer fieldset h3{position:absolute;top:-4px;left:15px;color:#404040;visibility:visible;font-size:12px;line-height:normal;width:auto;height:auto;background:none;margin:0;padding:0;font-weight:normal} +.xpress-editor .tool li.url .layer fieldset input.link{position:absolute;left:12px;top:19px;width:179px;padding:2px 0 1px 6px;*margin:-1px 0;font-size:11px;height:13px;border:1px solid #818181;border-right:1px solid #dadada;border-bottom:1px solid #dadada} +.xpress-editor .tool li.url .layer fieldset p{position:absolute;left:12px;top:44px} +.xpress-editor .tool li.url .layer fieldset p input{width:13px;height:13px;vertical-align:middle;margin-right:3px} +.xpress-editor .tool li.url .layer .btn_area{position:absolute;bottom:12px;padding:0} +.xpress-editor .tool li.table .layer{width:242px;height:239px;background-image:url(../img/bx_table.gif);background-repeat:no-repeat;background-position:10px 14px} +.xpress-editor .tool li.table .layer fieldset{position:absolute;width:222px;left:10px} +.xpress-editor .tool li.table .layer fieldset h3{position:absolute;top:-4px;left:15px;color:#404040;visibility:visible;font-size:12px;line-height:normal;width:auto;height:auto;background:none;margin:0;padding:0;font-weight:normal} +.xpress-editor .tool li.table .layer fieldset dl{position:absolute;left:10px} +.xpress-editor .tool li.table .layer fieldset dt{float:left;padding:3px 0 0 0;height:20px;white-space:nowrap;letter-spacing:-1px} +.xpress-editor .tool li.table .layer fieldset dd{float:right;position:relative} .xpress-editor .tool li.table .layer fieldset dd button.add, -.xpress-editor .tool li.table .layer fieldset dd button.del{ position:absolute; left:27px; width:15px; height:8px; background:url(../img/btn_layer_cell_adjust.gif) no-repeat;} -.xpress-editor .tool li.table .layer fieldset dd button.add{ top:1px;} -.xpress-editor .tool li.table .layer fieldset dd button.del{ top:9px; background-position:0 -8px;} -.xpress-editor .tool li.table .layer fieldset dd .preview_palette{ display:block; float:left; margin:0 3px 0 0; padding:2px; position:relative; border:1px solid #c8c9c6; width:14px; height:14px; overflow:hidden;} -.xpress-editor .tool li.table .layer fieldset dd .preview_palette button{ width:14px; height:14px; font-size:500px; line-height:0;} -.xpress-editor .tool li.table .layer fieldset dd .find_palette{ width:33px; height:20px; background:url(../img/btn_search.gif) no-repeat;} - -.xpress-editor .tool li.table .layer fieldset.num{ top:14px;} -.xpress-editor .tool li.table .layer fieldset.num dl{ top:18px; width:60px;} -.xpress-editor .tool li.table .layer fieldset.num dt{ height:20px;} -.xpress-editor .tool li.table .layer fieldset.num dd{ height:23px;} -.xpress-editor .tool li.table .layer fieldset.num dt label{ font-size:11px; color:#333;} -.xpress-editor .tool li.table .layer fieldset.num dd input{ padding:3px 0 0 6px; *margin:-1px 0; width:35px; height:13px; font-size:11px; border:1px solid #818181; border-right:1px solid #dadada; border-bottom:1px solid #dadada;} - -.xpress-editor .tool li.table .layer fieldset.color{ top:96px;} -.xpress-editor .tool li.table .layer fieldset.color dl{ top:18px; width:210px;} -.xpress-editor .tool li.table .layer fieldset.color dt{ height:23px;} -.xpress-editor .tool li.table .layer fieldset.color dd{ height:26px; width:146px;} -.xpress-editor .tool li.table .layer fieldset.color dt label{ font-size:11px; color:#333;} -.xpress-editor .tool li.table .layer fieldset.color dd input{ padding:3px 0 0 6px; *margin:-1px 0; font-size:11px; border:1px solid #818181; border-right:1px solid #dadada; border-bottom:1px solid #dadada;} -.xpress-editor .tool li.table .layer fieldset.color dd input#table_border_width{ width:35px; height:13px;} +.xpress-editor .tool li.table .layer fieldset dd button.del{position:absolute;left:27px;width:15px;height:8px;background:url(../img/btn_layer_cell_adjust.gif) no-repeat} +.xpress-editor .tool li.table .layer fieldset dd button.add{top:1px} +.xpress-editor .tool li.table .layer fieldset dd button.del{top:9px;background-position:0 -8px} +.xpress-editor .tool li.table .layer fieldset dd .preview_palette{display:block;float:left;margin:0 3px 0 0;padding:2px;position:relative;border:1px solid #c8c9c6;width:14px;height:14px;overflow:hidden} +.xpress-editor .tool li.table .layer fieldset dd .preview_palette button{width:14px;height:14px;font-size:500px;line-height:0} +.xpress-editor .tool li.table .layer fieldset dd .find_palette{width:33px;height:20px;background:url(../img/btn_search.gif) no-repeat} +.xpress-editor .tool li.table .layer fieldset.num{top:14px} +.xpress-editor .tool li.table .layer fieldset.num dl{top:18px;width:60px} +.xpress-editor .tool li.table .layer fieldset.num dt{height:20px} +.xpress-editor .tool li.table .layer fieldset.num dd{height:23px} +.xpress-editor .tool li.table .layer fieldset.num dt label{font-size:11px;color:#333} +.xpress-editor .tool li.table .layer fieldset.num dd input{padding:3px 0 0 6px;*margin:-1px 0;width:35px;height:13px;font-size:11px;border:1px solid #818181;border-right:1px solid #dadada;border-bottom:1px solid #dadada} +.xpress-editor .tool li.table .layer fieldset.color{top:96px} +.xpress-editor .tool li.table .layer fieldset.color dl{top:18px;width:210px} +.xpress-editor .tool li.table .layer fieldset.color dt{height:23px} +.xpress-editor .tool li.table .layer fieldset.color dd{height:26px;width:146px} +.xpress-editor .tool li.table .layer fieldset.color dt label{font-size:11px;color:#333} +.xpress-editor .tool li.table .layer fieldset.color dd input{padding:3px 0 0 6px;*margin:-1px 0;font-size:11px;border:1px solid #818181;border-right:1px solid #dadada;border-bottom:1px solid #dadada} +.xpress-editor .tool li.table .layer fieldset.color dd input#table_border_width{width:35px;height:13px} .xpress-editor .tool li.table .layer fieldset.color dd input#table_border_color, -.xpress-editor .tool li.table .layer fieldset.color dd input#table_bg_color{ width:70px; height:15px; *margin-right:3px;} - -.xpress-editor .tool li.table .layer table{ position:absolute; top:18px; left:75px; width:137px; height:40px; table-layout:fixed;} -.xpress-editor .tool li.table .layer table *{ font-size:0; line-height:0;} +.xpress-editor .tool li.table .layer fieldset.color dd input#table_bg_color{width:70px;height:15px;*margin-right:3px} +.xpress-editor .tool li.table .layer table{position:absolute;top:18px;left:75px;width:137px;height:40px;table-layout:fixed} +.xpress-editor .tool li.table .layer table *{font-size:0;line-height:0} .xpress-editor .tool li.table .layer table th, -.xpress-editor .tool li.table .layer table td{ text-align:center;} -.xpress-editor .tool li.table .layer .btn_area{ position:absolute; bottom:12px; padding:0; z-index:1;} - -.xpress-editor .tool li.table .layer .palette{ display:none; position:absolute; z-index:2; left:11px; width:204px; padding:8px 7px 7px 7px; _padding-right:6px; background-color:#fbfbfb; border:1px solid #c5c5c5; border-right:1px solid #9f9f9f; border-bottom:1px solid #9f9f9f;} -.xpress-editor .tool li.table .layer.p1 .palette{ display:block; top:163px;} -.xpress-editor .tool li.table .layer.p2 .palette{ display:block; top:189px;} - -.xpress-editor .tool li.character .layer{ width:433px; height:242px; overflow:hidden;} -.xpress-editor .tool li.character .layer ul{ margin:0;} -.xpress-editor .tool li.character .layer h3{position:absolute; width:0; height:0; overflow:hidden; visibility:hidden;} -.xpress-editor .tool li.character .layer .nav{ position:absolute; top:11px; left:-1px; overflow:hidden; white-space:nowrap;} -.xpress-editor .tool li.character .layer .nav li{ display:inline; margin:0 -4px 0 0; padding:0 8px; background:url(../img/vr_layer_character.gif) no-repeat 0 0;} -.xpress-editor .tool li.character .layer .nav li a{ color:#444; text-decoration:none; letter-spacing:-1px;} +.xpress-editor .tool li.table .layer table td{text-align:center} +.xpress-editor .tool li.table .layer .btn_area{position:absolute;bottom:12px;padding:0;z-index:1} +.xpress-editor .tool li.table .layer .palette{display:none;position:absolute;z-index:2;left:11px;width:204px;padding:8px 7px 7px 7px;_padding-right:6px;background-color:#fbfbfb;border:1px solid #c5c5c5;border-right:1px solid #9f9f9f;border-bottom:1px solid #9f9f9f} +.xpress-editor .tool li.table .layer.p1 .palette{display:block;top:163px} +.xpress-editor .tool li.table .layer.p2 .palette{display:block;top:189px} +.xpress-editor .tool li.character .layer{width:433px;height:242px;overflow:hidden} +.xpress-editor .tool li.character .layer ul{margin:0} +.xpress-editor .tool li.character .layer h3{position:absolute;width:0;height:0;overflow:hidden;visibility:hidden} +.xpress-editor .tool li.character .layer .nav{position:absolute;top:11px;left:-1px;overflow:hidden;white-space:nowrap} +.xpress-editor .tool li.character .layer .nav li{display:inline;margin:0 -4px 0 0;padding:0 8px;background:url(../img/vr_layer_character.gif) no-repeat 0 0} +.xpress-editor .tool li.character .layer .nav li a{color:#444;text-decoration:none;letter-spacing:-1px} .xpress-editor .tool li.character .layer .nav li a:hover, .xpress-editor .tool li.character .layer .nav li a:active, -.xpress-editor .tool li.character .layer .nav li a:focus{ text-decoration:underline;} -.xpress-editor .tool li.character .layer .nav li a.on{ font-weight:bold; color:#004790; display:inline;} -.xpress-editor .tool li.character .layer .list{ position:absolute; left:7px; top:30px; width:421px; height:172px; background:url(../img/bx_character.gif) no-repeat;} -.xpress-editor .tool li.character .layer .list li{ position:relative; top:1px; left:1px; float:left; width:20px; height:18px; margin:0 1px 1px 0;} -.xpress-editor .tool li.character .layer .list li button{ width:20px; height:18px;} -.xpress-editor .tool li.character .layer .list li button.hover{ border:2px solid #27c11a;} -.xpress-editor .tool li.character .layer .list li button span{ overflow:visible; font-size:12px; width:auto; height:auto; position:relative; visibility:visible; line-height:normal;} -.xpress-editor .tool li.character .layer p{ position:absolute; top:212px; left:7px;} -.xpress-editor .tool li.character .layer p *{ vertical-align:top;} -.xpress-editor .tool li.character .layer p label{ position:relative; top:4px; margin:0 7px 0 0; color:#333; letter-spacing:-1px;} -.xpress-editor .tool li.character .layer p input{ padding:3px 0 0 4px; margin:0 4px 0 0; width:300px; _width /**/:306px; height:16px; _height /**/:20px; border:1px solid #acacac; border-right:1px solid #dadada; border-bottom:1px solid #dadada;} -.xpress-editor .tool li.character .layer p button{ position:relative; *top:1px; width:38px; height:21px; background:url(../img/btn_layer_confirm.gif) no-repeat;} -.xpress-editor .tool li.character .layer p button span{ position:absolute; width:0; height:0; overflow:hidden; visibility:hidden;} -.xpress-editor .tool li.extensions .layer{ width:auto; white-space:nowrap; padding:5px 10px;} -.xpress-editor .tool li.extensions .layer li{ margin:2px 0;} -.xpress-editor .tool li.extensions .layer li a { color:#000; text-decoration:none; } -.xpress-editor .tool li.extensions .layer li a:hover { text-decoration:underline; } - +.xpress-editor .tool li.character .layer .nav li a:focus{text-decoration:underline} +.xpress-editor .tool li.character .layer .nav li a.on{font-weight:bold;color:#004790;display:inline} +.xpress-editor .tool li.character .layer .list{position:absolute;left:7px;top:30px;width:421px;height:172px;background:url(../img/bx_character.gif) no-repeat} +.xpress-editor .tool li.character .layer .list li{position:relative;top:1px;left:1px;float:left;width:20px;height:18px;margin:0 1px 1px 0} +.xpress-editor .tool li.character .layer .list li button{width:20px;height:18px} +.xpress-editor .tool li.character .layer .list li button.hover{border:2px solid #27c11a} +.xpress-editor .tool li.character .layer .list li button span{overflow:visible;font-size:12px;width:auto;height:auto;position:relative;visibility:visible;line-height:normal} +.xpress-editor .tool li.character .layer p{position:absolute;top:212px;left:7px} +.xpress-editor .tool li.character .layer p *{vertical-align:top} +.xpress-editor .tool li.character .layer p label{position:relative;top:4px;margin:0 7px 0 0;color:#333;letter-spacing:-1px} +.xpress-editor .tool li.character .layer p input{padding:3px 0 0 4px;margin:0 4px 0 0;width:300px;_width /**/:306px;height:16px;_height /**/:20px;border:1px solid #acacac;border-right:1px solid #dadada;border-bottom:1px solid #dadada} +.xpress-editor .tool li.character .layer p button{position:relative;*top:1px;width:38px;height:21px;background:url(../img/btn_layer_confirm.gif) no-repeat} +.xpress-editor .tool li.character .layer p button span{position:absolute;width:0;height:0;overflow:hidden;visibility:hidden} +.xpress-editor .tool li.extensions .layer{width:auto;white-space:nowrap;padding:5px 10px} +.xpress-editor .tool li.extensions .layer li{margin:2px 0} +.xpress-editor .tool li.extensions .layer li a {color:#000;text-decoration:none} +.xpress-editor .tool li.extensions .layer li a:hover {text-decoration:underline} /* File Uploader */ -.xpress-editor .fileUploader{ clear:both; padding-top:5px; margin-bottom:10px;} -.xpress-editor .fileUploader:after{ content:""; display:block; clear:both;} -.xpress-editor .fileUploader .preview{ float:left; width:64px; height:64px; border:1px solid #ccc;; padding:2px; margin:0 10px 5px 0;} -.xpress-editor .fileUploader .preview.black { background-color:#000; border:1px solid #666;} -.xpress-editor .fileUploader .preview img{ display:block; width:64px; height:64px;} -.xpress-editor .fileUploader .fileListArea{ float:left; width:260px; margin:0 10px 5px 0;} -.xpress-editor .fileUploader .fileListArea select{ width:100%; height:70px; overflow:auto; margin:0; padding:0; float:none} -.xpress-editor .fileUploader .fileListArea select option{ font-size:11px;} -.xpress-editor .fileUploader .fileListArea.black select { background-color:#000; border:1px solid #666;} -.xpress-editor .fileUploader .fileListArea.black select option { color:#aaa; } -.xpress-editor .fileUploader .fileUploadControl{ clear:right;} -.xpress-editor .fileUploader .fileUploadControl .button{ margin-bottom:5px;} -.xpress-editor .fileUploader .file_attach_info{ clear:right; margin:5px 0; font-size:11px; color:#333} - +.xpress-editor .fileUploader{clear:both;padding-top:5px;margin-bottom:10px} +.xpress-editor .fileUploader:after{content:"";display:block;clear:both} +.xpress-editor .fileUploader .preview{float:left;width:64px;height:64px;border:1px solid #ccc;;padding:2px;margin:0 10px 5px 0} +.xpress-editor .fileUploader .preview.black {background-color:#000;border:1px solid #666} +.xpress-editor .fileUploader .preview img{display:block;width:64px;height:64px} +.xpress-editor .fileUploader .fileListArea{float:left;width:260px;margin:0 10px 5px 0} +.xpress-editor .fileUploader .fileListArea select{width:100%;height:70px;overflow:auto;margin:0;padding:0;float:none} +.xpress-editor .fileUploader .fileListArea select option{font-size:11px} +.xpress-editor .fileUploader .fileListArea.black select {background-color:#000;border:1px solid #666} +.xpress-editor .fileUploader .fileListArea.black select option {color:#aaa} +.xpress-editor .fileUploader .fileUploadControl{clear:right} +.xpress-editor .fileUploader .fileUploadControl .button{margin-bottom:5px} +.xpress-editor .fileUploader .file_attach_info{clear:right;margin:5px 0;font-size:11px;color:#333} /* Auto Save */ -.xpress-editor .autosave_message { display:none; background: #f6ffdb; padding:6px 10px; margin:0; line-height:1;} -.xpress-editor.black .autosave_message { display:none; background:#222; padding:6px 10px; margin:0; line-height:1; color:#fff; } -.xpress-editor .input_syntax.black { background:transparent; color:#fff; } +.xpress-editor .autosave_message {display:none;background: #f6ffdb;padding:6px 10px;margin:0;line-height:1} +.xpress-editor.black .autosave_message {display:none;background:#222;padding:6px 10px;margin:0;line-height:1;color:#fff} +.xpress-editor .input_syntax.black {background:transparent;color:#fff} \ No newline at end of file diff --git a/modules/member/tpl/member_config.html b/modules/member/tpl/member_config.html index 61972f8b1..7f928b8a6 100644 --- a/modules/member/tpl/member_config.html +++ b/modules/member/tpl/member_config.html @@ -8,203 +8,201 @@

                              {$XE_VALIDATOR_MESSAGE}

                              -
                              - - - - -

                              Setting

                              -
                              -

                              Sign Up Setting

                              -
                                -
                              • -

                                {$lang->enable_join}

                                -

                                - - -

                                -
                              • -
                              • -

                                {$lang->enable_confirm}

                                -

                                - - -

                                -
                              • -
                              • -

                                -

                                - -

                                {$lang->about_webmaster_name}

                                -

                                -
                              • -
                              • -

                                -

                                - -

                                {$lang->about_webmaster_email}

                                -

                                -
                              • -
                              • -

                                -

                                {$lang->unit_day}({$lang->about_limit_day})

                                -
                              • -
                              • -

                                -

                                {$lang->unit_day}({$lang->about_change_password_date})

                                -
                              • -
                              • -

                                -

                                {$editor}

                                -
                              • -
                              • -

                                -

                                - -

                                {$lang->about_after_login_url}

                                -

                                -
                              • -
                              • -

                                -

                                - -

                                {$lang->about_after_logout_url}

                                -

                                -
                              • -
                              • -

                                -

                                - -

                                {$lang->about_redirect_url}

                                -

                                -
                              • -
                              • -

                                -

                                - -

                                -
                              • - -
                              • -

                                -
                                - -
                                -
                                - - - {$lang->multi_line_input} -
                                -
                              • -
                              -
                              -
                              -

                              {$lang->cmd_manage_form}

                              -
                              -
                              - - - - + + + + + + + + + + + + + + + + + + + +
                              {$lang->target}{$lang->identifier} - [?] -
                              -

                              {$lang->about_identifier}

                              + + + + +

                              Setting

                              +
                              +

                              Sign Up Setting

                              +
                                +
                              • +

                                {$lang->enable_join}

                                +

                                + + +

                                +
                              • +
                              • +

                                {$lang->enable_confirm}

                                +

                                + + +

                                +
                              • +
                              • +

                                +

                                + +

                                {$lang->about_webmaster_name}

                                +

                                +
                              • +
                              • +

                                +

                                + +

                                {$lang->about_webmaster_email}

                                +

                                +
                              • +
                              • +

                                +

                                {$lang->unit_day}({$lang->about_limit_day})

                                +
                              • +
                              • +

                                +

                                {$lang->unit_day}({$lang->about_change_password_date})

                                +
                              • +
                              • +

                                +

                                {$editor}

                                +
                              • +
                              • +

                                +

                                + +

                                {$lang->about_after_login_url}

                                +

                                +
                              • +
                              • +

                                +

                                + +

                                {$lang->about_after_logout_url}

                                +

                                +
                              • +
                              • +

                                +

                                + +

                                {$lang->about_redirect_url}

                                +

                                +
                              • +
                              • +

                                +

                                + +

                                +
                              • + +
                              • +

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

                              {$lang->cmd_manage_form}

                              +
                              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                              {$lang->target}{$lang->identifier} + [?] +
                              +

                              {$lang->about_identifier}

                              +
                              +
                              {$lang->use}{$lang->cmd_required}/{$lang->cmd_optional}{$lang->description}{$lang->cmd_edit}
                              + {$item->title} + + + +   
                              +
                              + + {$item->title}
                              {$lang->use}{$lang->cmd_required}/{$lang->cmd_optional}{$lang->description}{$lang->cmd_edit}
                              - {$item->title} - - - -   
                              -
                              - - {$item->title} -
                              -
                              - - -
                              - px - / - px -
                              -
                                
                              -
                              - - {$item->title} -
                              -
                              - - - {$item->description}{$lang->cmd_edit} | {$lang->cmd_delete}
                              -
                              -

                              - {$lang->add_extend_form}... -

                              -
                              -
                              - +
                              + + +
                              + px + / + px +
                              +
                                
                              +
                              + + {$item->title} +
                              +
                              + + + {$item->description}{$lang->cmd_edit} | {$lang->cmd_delete}
                              +
                              +

                              + {$lang->add_extend_form}... +

                              + +
                              + +
                              + + +
                              \ No newline at end of file From ad6463e9ae376c604b6e11f58b4edfeffe3f72c1 Mon Sep 17 00:00:00 2001 From: ovclas Date: Wed, 21 Sep 2011 09:19:29 +0000 Subject: [PATCH 0799/1372] issue 160 when menu add or modify in sitemap. page type can selectable git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9255 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/menu/menu.admin.controller.php | 15 +++++++++++++-- modules/menu/menu.admin.model.php | 10 ++-------- modules/menu/menu.admin.view.php | 1 + modules/menu/tpl/js/sitemap.js | 5 ++++- modules/menu/tpl/sitemap.html | 7 ++++++- modules/page/conf/module.xml | 4 ++-- 6 files changed, 28 insertions(+), 14 deletions(-) diff --git a/modules/menu/menu.admin.controller.php b/modules/menu/menu.admin.controller.php index e56bcd870..57a3060c0 100644 --- a/modules/menu/menu.admin.controller.php +++ b/modules/menu/menu.admin.controller.php @@ -149,8 +149,19 @@ $cmArgs->site_srl = (int)$site_module_info->site_srl; $cmArgs->mid = $source_args->create_menu_url; $cmArgs->browser_title = $source_args->menu_name; - //$cmArgs->layout_srl = $this->selected_layout->layout_srl; - $cmArgs->module = $source_args->module_type; + + switch ($source_args->module_type){ + case 'WIDGET' : + case 'ARTICLE' : + case 'OUTSIDE' : + $cmArgs->module = 'page'; + $cmArgs->page_type = $source_args->module_type; + break; + default: + $cmArgs->module = $source_args->module_type; + unset($cmArgs->page_type); + } + $cmArgs->menu_srl = $source_args->menu_srl; $oModuleController = &getController('module'); $output = $oModuleController->insertModule($cmArgs); diff --git a/modules/menu/menu.admin.model.php b/modules/menu/menu.admin.model.php index e9749d728..a89eaac3b 100644 --- a/modules/menu/menu.admin.model.php +++ b/modules/menu/menu.admin.model.php @@ -125,16 +125,10 @@ $moduleInfo = $oModuleModel->getModuleInfoByMid($menuItem->url); if($moduleInfo->mid == $menuItem->url) { $menuItem->moduleType = $moduleInfo->module; - //$menuItem->module_id = $moduleInfo->mid; - //$menuItem->browser_title = $moduleInfo->browser_title; - //unset($menuItem->url); + $menuItem->pageType = $moduleInfo->page_type; } } - else - { - $menuItem->moduleType = 'url'; - /*$menuItem->url = preg_replace('/^(http|https):\/\//i','',$menuItem->url);*/ - } + else $menuItem->moduleType = 'url'; // get groups $oMemberModel = &getModel('member'); diff --git a/modules/menu/menu.admin.view.php b/modules/menu/menu.admin.view.php index 0fad744e7..04cb6b586 100644 --- a/modules/menu/menu.admin.view.php +++ b/modules/menu/menu.admin.view.php @@ -139,6 +139,7 @@ Context::set('menu_list', $menuList); // get installed module list + $oPageController = &getController('page'); //for lang $resultModuleList = $oMenuAdminModel->getModuleListInSitemap(); Context::set('module_list', $resultModuleList); diff --git a/modules/menu/tpl/js/sitemap.js b/modules/menu/tpl/js/sitemap.js index ac426b9d9..06a6097e9 100644 --- a/modules/menu/tpl/js/sitemap.js +++ b/modules/menu/tpl/js/sitemap.js @@ -46,6 +46,7 @@ $('form.siteMap') editForm.find('input[name=menu_name]').val(menuItem.name); var moduleType = menuItem.moduleType; + if(menuItem.pageType) moduleType = menuItem.pageType; var inputCType = editForm.find('input[name=cType]'); if(moduleType == 'url') @@ -171,8 +172,10 @@ $('form.siteMap') function completeGetModuleList(ret_obj) { - var midList = ret_obj.module_list[$('#kModule').val()].list; + var module = $('#kModule').val(); + if(module == 'WIDGET' || module == 'ARTICLE' || module == 'OUTSIDE') module = 'page'; + var midList = ret_obj.module_list[module].list; var htmlBuffer = ""; for(x in midList) { diff --git a/modules/menu/tpl/sitemap.html b/modules/menu/tpl/sitemap.html index 7def82f8c..6d7a2489a 100644 --- a/modules/menu/tpl/sitemap.html +++ b/modules/menu/tpl/sitemap.html @@ -98,7 +98,12 @@ xe.lang.confirm_delete = "{$lang->confirm_delete}";

                              diff --git a/modules/page/conf/module.xml b/modules/page/conf/module.xml index 742d48538..f009aa82d 100644 --- a/modules/page/conf/module.xml +++ b/modules/page/conf/module.xml @@ -11,9 +11,9 @@ - + - + From 039e830b345fe671126bbc4dd1e043623ad965c6 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Wed, 21 Sep 2011 09:25:11 +0000 Subject: [PATCH 0800/1372] Editor UI, Member UI fix. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9256 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/editor/editor.admin.view.php | 6 +++--- modules/editor/editor.model.php | 4 ++-- modules/member/lang/lang.xml | 14 ++++++++++++- modules/member/tpl/member_config.html | 29 +++++++++++---------------- 4 files changed, 30 insertions(+), 23 deletions(-) diff --git a/modules/editor/editor.admin.view.php b/modules/editor/editor.admin.view.php index 8ceceb7e2..723204163 100644 --- a/modules/editor/editor.admin.view.php +++ b/modules/editor/editor.admin.view.php @@ -28,8 +28,8 @@ $editor_config = $oModuleModel->getModuleConfig('editor'); //editor_config init - if(!$editor_config->editor_height) $editor_config->editor_height = 500; - if(!$editor_config->comment_editor_height) $editor_config->comment_editor_height = 120; + if(!$editor_config->editor_height) $editor_config->editor_height = 400; + if(!$editor_config->comment_editor_height) $editor_config->comment_editor_height = 100; if(!$editor_config->editor_skin) $editor_config->editor_skin = 'xpresseditor'; if(!$editor_config->comment_editor_skin) $editor_config->comment_editor_skin = 'xpresseditor'; if(!$editor_config->sel_editor_colorset) $editor_config->sel_editor_colorset= 'white'; @@ -62,7 +62,7 @@ foreach($component_list as $component_name => $xml_info) { if($packages[$xml_info->package_srl]) $xml_info->need_update = $packages[$xml_info->package_srl]->need_update; } - $editor_config_default = array( "editor_height" => "500", "comment_editor_height" => "120","content_font_size"=>"12"); + $editor_config_default = array( "editor_height" => "400", "comment_editor_height" => "100","content_font_size"=>"12"); Context::set('editor_config', $editor_config); Context::set('editor_skin_list', $editor_skin_list); diff --git a/modules/editor/editor.model.php b/modules/editor/editor.model.php index 812b231c6..6a15b58d4 100644 --- a/modules/editor/editor.model.php +++ b/modules/editor/editor.model.php @@ -46,8 +46,8 @@ if($editor_config->enable_autosave!='N') $editor_config->enable_autosave = "Y"; - if(!$editor_config->editor_height) if($editor_default_config->editor_height? $editor_config->editor_height = $editor_default_config->editor_height : $editor_config->editor_height = 500); - if(!$editor_config->comment_editor_height) if($editor_default_config->comment_editor_height? $editor_config->comment_editor_height = $editor_default_config->comment_editor_height : $editor_config->comment_editor_height = 120); + if(!$editor_config->editor_height) if($editor_default_config->editor_height? $editor_config->editor_height = $editor_default_config->editor_height : $editor_config->editor_height = 400); + if(!$editor_config->comment_editor_height) if($editor_default_config->comment_editor_height? $editor_config->comment_editor_height = $editor_default_config->comment_editor_height : $editor_config->comment_editor_height = 100); if(!$editor_config->editor_skin) if($editor_default_config->editor_skin? $editor_config->editor_skin = $editor_default_config->editor_skin : $editor_config->editor_skin = 'xpresseditor'); if(!$editor_config->comment_editor_skin) if($editor_default_config->comment_editor_skin? $editor_config->comment_editor_skin = $editor_default_config->comment_editor_skin : $editor_config->comment_editor_skin = 'xpresseditor'); if(!$editor_config->content_style) if($editor_default_config->content_style? $editor_config->content_style = $editor_default_config->content_style : $editor_config->content_style = 'default'); diff --git a/modules/member/lang/lang.xml b/modules/member/lang/lang.xml index 9244a9496..81f53f3fc 100644 --- a/modules/member/lang/lang.xml +++ b/modules/member/lang/lang.xml @@ -931,6 +931,18 @@ + + + + + + + + + + + + @@ -980,7 +992,7 @@ - + diff --git a/modules/member/tpl/member_config.html b/modules/member/tpl/member_config.html index 7f928b8a6..9c59e9101 100644 --- a/modules/member/tpl/member_config.html +++ b/modules/member/tpl/member_config.html @@ -12,9 +12,9 @@ -

                              Setting

                              +

                              {$lang->cmd_member_config}

                              -

                              Sign Up Setting

                              +

                              {$lang->cmd_module_config}

                              • {$lang->enable_join}

                                @@ -33,16 +33,14 @@
                              • - -

                                {$lang->about_webmaster_name}

                                -

                                +

                                +

                                {$lang->about_webmaster_name}

                              • - -

                                {$lang->about_webmaster_email}

                                -

                                +

                                +

                                {$lang->about_webmaster_email}

                              • @@ -59,23 +57,20 @@
                              • - -

                                {$lang->about_after_login_url}

                                -

                                +

                                +

                                {$lang->about_after_login_url}

                              • - -

                                {$lang->about_after_logout_url}

                                -

                                +

                                +

                                {$lang->about_after_logout_url}

                              • - -

                                {$lang->about_redirect_url}

                                -

                                +

                                +

                                {$lang->about_redirect_url}

                              • From a384a2eb7791525122c03af58087b8286e4c144d Mon Sep 17 00:00:00 2001 From: taggon Date: Wed, 21 Sep 2011 11:43:10 +0000 Subject: [PATCH 0801/1372] Fixed a bug in the template file git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9257 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/layout/tpl/installed_layout_list.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/layout/tpl/installed_layout_list.html b/modules/layout/tpl/installed_layout_list.html index 7b9b24ca1..6b8b33c65 100644 --- a/modules/layout/tpl/installed_layout_list.html +++ b/modules/layout/tpl/installed_layout_list.html @@ -48,7 +48,7 @@ - - {$layout->path} - {$lang->cmd_delete} + {$lang->cmd_delete} From b37398d06729ba20d01cacdb23ee8354ba55a398 Mon Sep 17 00:00:00 2001 From: taggon Date: Wed, 21 Sep 2011 12:14:42 +0000 Subject: [PATCH 0802/1372] refatoring TemplateHandler class git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9258 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/template/TemplateHandler.class.php | 709 +++++++----------- .../template/TemplateHandlerTest.class.php | 126 ++++ tests/classes/template/css/style.css | 1 + tests/classes/template/sample.html | 1 + 4 files changed, 383 insertions(+), 454 deletions(-) create mode 100644 tests/classes/template/TemplateHandlerTest.class.php create mode 100644 tests/classes/template/css/style.css create mode 100644 tests/classes/template/sample.html diff --git a/classes/template/TemplateHandler.class.php b/classes/template/TemplateHandler.class.php index 0859e3079..9827140f8 100644 --- a/classes/template/TemplateHandler.class.php +++ b/classes/template/TemplateHandler.class.php @@ -8,7 +8,7 @@ * code, and XE caches compiled code for further uses **/ - class TemplateHandler extends Handler { + class TemplateHandler { var $compiled_path = './files/cache/template_compiled/'; ///< path of compiled caches files @@ -18,30 +18,37 @@ var $xe_path = null; ///< XpressEngine base path var $web_path = null; ///< tpl file web path var $compiled_file = null; ///< tpl file web path - var $buff = null; ///< tpl file web path var $handler_mtime = 0; + function TemplateHandler() + { + $this->xe_path = rtrim(preg_replace('/([^\.^\/]+)\.php$/i','',$_SERVER['SCRIPT_NAME']),'/'); + } + /** * @brief returns TemplateHandler's singleton object * @return TemplateHandler instance **/ - function &getInstance() { + function &getInstance() + { + static $oTemplate = null; + if(__DEBUG__==3 ) { if(!isset($GLOBALS['__TemplateHandlerCalled__'])) $GLOBALS['__TemplateHandlerCalled__']=1; else $GLOBALS['__TemplateHandlerCalled__']++; } - if(!$GLOBALS['__TemplateHandler__']) { - $GLOBALS['__TemplateHandler__'] = new TemplateHandler(); - } - return $GLOBALS['__TemplateHandler__']; + if(!$oTemplate) $oTemplate = new TemplateHandler(); + + return $oTemplate; } /** * @brief set variables for template compile **/ - function init($tpl_path, $tpl_filename, $tpl_file) { + function init($tpl_path, $tpl_filename, $tpl_file='') + { // verify arguments if(substr($tpl_path,-1)!='/') $tpl_path .= '/'; if(!file_exists($tpl_path.$tpl_filename)&&file_exists($tpl_path.$tpl_filename.'.html')) $tpl_filename .= '.html'; @@ -50,22 +57,18 @@ if(!$tpl_file) $tpl_file = $tpl_path.$tpl_filename; // set template file infos. - $info = pathinfo($tpl_file); - //$this->path = preg_replace('/^\.\//','',$info['dirname']).'/'; $this->path = $tpl_path; $this->filename = $tpl_filename; $this->file = $tpl_file; - $this->xe_path = preg_replace('/([^\.^\/]+)\.php$/i','',$_SERVER['SCRIPT_NAME']); - $this->web_path = $this->xe_path.str_replace(_XE_PATH_,'',$this->path); + $this->web_path = $this->xe_path.preg_replace('/^'.preg_quote(_XE_PATH_,'/').'/','',$this->path); // get compiled file name - $this->compiled_file = sprintf('%s%s.compiled.php',$this->compiled_path, md5($this->file . __ZBXE_VERSION__)); + $hash = md5($this->file . __ZBXE_VERSION__); + $this->compiled_file = "{$this->compiled_path}{$hash}.compiled.php"; // compare various file's modified time for check changed - $this->handler_mtime = filemtime(_XE_PATH_.'classes/template/TemplateHandler.class.php'); - - $this->buff = null; + $this->handler_mtime = filemtime(__FILE__); } /** @@ -75,7 +78,9 @@ * @param[in] $tpl_file if specified use it as template file's full path * @return Returns compiled result in case of success, NULL otherwise */ - function compile($tpl_path, $tpl_filename, $tpl_file = '') { + function compile($tpl_path, $tpl_filename, $tpl_file='') { + $buff = ''; + // store the starting time for debug information if(__DEBUG__==3 ) $start = getMicroTime(); @@ -83,31 +88,31 @@ $this->init($tpl_path, $tpl_filename, $tpl_file); // if target file does not exist exit - if(!$this->file || !file_exists($this->file)) return sprintf('Err : "%s" template file does not exists.', $this->file); + if(!$this->file || !file_exists($this->file)) return "Err : '{$this->file}' template file does not exists."; $source_template_mtime = filemtime($this->file); $latest_mtime = $source_template_mtime>$this->handler_mtime?$source_template_mtime:$this->handler_mtime; - // cache controll + // cache control $oCacheHandler = &CacheHandler::getInstance('template'); // get cached buff if($oCacheHandler->isSupport()){ $cache_key = 'template:'.$this->file; - $this->buff = $oCacheHandler->get($cache_key, $latest_mtime); + $buff = $oCacheHandler->get($cache_key, $latest_mtime); } else { - if(file_exists($this->compiled_file) && filemtime($this->compiled_file)>$latest_mtime) { - $this->buff = FileHandler::readFile($this->compiled_file); + if(is_readable($this->compiled_file) && filemtime($this->compiled_file)>$latest_mtime && filesize($this->compiled_file)) { + $buff = 'file://'.$this->compiled_file; } } - if(!$this->buff) { - $this->parse(); - if($oCacheHandler->isSupport()) $oCacheHandler->put($cache_key, $this->buff); - else FileHandler::writeFile($this->compiled_file, $this->buff); + if(!$buff) { + $buff = $this->parse(); + if($oCacheHandler->isSupport()) $oCacheHandler->put($cache_key, $buff); + else FileHandler::writeFile($this->compiled_file, $buff); } - $output = $this->_fetch(); + $output = $this->_fetch($buff); // store the ending time for debug information if(__DEBUG__==3 ) $GLOBALS['__template_elapsed__'] += getMicroTime() - $start; @@ -127,12 +132,10 @@ // if target file does not exist exit if(!$this->file || !file_exists($this->file)) { Context::close(); - printf('"%s" template file is not exists.', $this->file); - exit(); + exit("Cannot find the template file: '{$this->file}'"); } - $this->parse(); - return $this->buff; + return $this->parse(); } /** @@ -142,65 +145,33 @@ * @param[in] $compiled_tpl_file if specified, write compiled result into the file * @return compiled result in case of success or NULL in case of error **/ - function parse() { - if(!file_exists($this->file)) return; + function parse($buff=null) { + if(is_null($buff)) { + if(!is_readable($this->file)) return; - // read tpl file - $buff = FileHandler::readFile($this->file); + // read tpl file + $buff = FileHandler::readFile($this->file); + } // replace value of src in img/input/script tag $buff = preg_replace_callback('/<(img|input|script)([^>]*)src="([^"]*?)"/is', array($this, '_replacePath'), $buff); - // replace the loop template syntax - $buff = $this->_replaceLoop($buff); + // replace loop and cond template syntax + $buff = $this->_parseInline($buff); - // |replace the cond template syntax - $buff = $this->_replaceCond($buff); + // include, unload/load, import + $buff = preg_replace_callback('/<(include|(?:un)?load)( .+?)>|||{@(.+?)}|{([^@ \\\\][^\n\r\{\}]+?)}/s', array($this, '_parseResource'), $buff); - // replace the cond template syntax - $buff = preg_replace_callback("/<\/?(\w+)((\s+\w+(\s*=\s*(?:\".*?\"|'.*?'|[^'\">\s]+))?)+\s*|\s*)\/?>/i", array($this, '_replacePipeCond'), $buff); - - // replace the include tags - $buff = preg_replace_callback('!]+)>!is', array($this, '_replaceInclude'), $buff); - - // replace unload/load tags - $buff = preg_replace_callback('!<(unload|load) ([^>]+)>!is', array($this, '_replaceLoad'), $buff); - - // replace block which is a virtual tag - $buff = preg_replace('/|<\/block>/is','',$buff); - - // replace include - $buff = preg_replace_callback('!<\!--#include\(([^\)]*?)\)-->!is', array($this, '_compileIncludeToCode'), $buff); - - // replace - $buff = preg_replace_callback('!<\!--@(.*?)-->!is', array($this, '_compileFuncToCode'), $buff); - - // remove comments - $buff = preg_replace('!(\n?)( *?)<\!--//(.*?)-->!is', '', $buff); - - // import xml filter/ css/ js/ files (media is applied to only css) - $buff = preg_replace_callback('!<\!--%import\(\"([^\"]*?)\"(,optimized\=(true|false))?(,media\=\"([^\"]*)\")?(,targetie=\"([^\"]*)\")?(,index=\"([^\"]*)\")?(,type=\"([^\"]*)\")?\)-->!is', array($this, '_compileImportCode'), $buff); - - // unload css/ js (media is applied to only css) - $buff = preg_replace_callback('!<\!--%unload\(\"([^\"]*?)\"(,optimized\=(true|false))?(,media\=\"([^\"]*)\")?(,targetie=\"([^\"]*)\")?\)-->!is', array($this, '_compileUnloadCode'), $buff); - - // javascript plugin import - $buff = preg_replace_callback('!<\!--%load_js_plugin\(\"([^\"]*?)\"\)-->!is', array($this, '_compileLoadJavascriptPlugin'), $buff); + // remove block which is a virtual tag and remove comments + $buff = preg_replace('@|\s?@is','',$buff); // form auto generation $buff = preg_replace_callback('/(|[^<>]+)*?>)(.*?)(<\/form>)/is', array($this, '_compileFormAuthGeneration'), $buff); - // replace variables - $buff = preg_replace_callback('/\{[^@^ ]([^\{\}\n]+)\}/i', array($this, '_compileVarToContext'), $buff); - - // replace PHP variable types(converts characters like $ into shared context) - $buff = $this->_replaceVarInPHP($buff); - - // replace parts not displaying results - $buff = preg_replace_callback('/\{\@([^\{\}]+)\}/i', array($this, '_compileVarToSilenceExecute'), $buff); - // prevent from calling directly before writing into file - $this->buff = ''.$buff; + $buff = ''.$buff; + + return $buff; } /** @@ -263,17 +234,24 @@ * @param[in] $tpl_path set context's tpl path * @return result string **/ - function _fetch() { - if(!$this->buff) return; + function _fetch($buff) { + if(!$buff) return; $__Context = &$GLOBALS['__Context__']; $__Context->tpl_path = $this->path; - if($_SESSION['is_logged']) $__Context->logged_info = Context::get('logged_info'); + if($_SESSION['is_logged']) { + $__Context->logged_info = Context::get('logged_info'); + } ob_start(); - $eval_str = "?>".$this->buff; - eval($eval_str); + if(substr($buff, 0, 7) == 'file://') { + include substr($buff, 7); + } else { + $eval_str = "?>".$buff; + eval($eval_str); + } + return ob_get_clean(); } @@ -301,207 +279,223 @@ return $matches[0]; } - /** - * @brief replace loop syntax - **/ - function _replaceLoop($buff) + function _parseInline($buff) { - while(false !== $pos = strpos($buff, ' loop="')) - { - $pre = substr($buff,0,$pos); - $next = substr($buff,$pos); + if(preg_match_all('/<([a-zA-Z0-9]+)[^>]*?(?:[ \|]cond| loop)="/s', $buff, $matches) === false) return $buff; - $pre_pos = strrpos($pre, '<'); + $tags = array_unique($matches[1]); + $tags = implode('|',array_unique($matches[1])); + $split_regex = '@(<(?:/(?:'.$tags.')|(?:'.$tags.')(?:[^>]*(?:cond|loop)="[^"]+")*)[^>]*>)@s'; - preg_match('/^ loop="([^"]+)"/i',$next,$m); - $tag = substr($next,0,strlen($m[0])); - $next = substr($next,strlen($m[0])); - $next_pos = strpos($next, '<'); + $nodes = preg_split($split_regex, $buff, -1, PREG_SPLIT_DELIM_CAPTURE); - $tag = substr($pre, $pre_pos). $tag. substr($next, 0, $next_pos); - $pre = substr($pre, 0, $pre_pos); - $next = substr($next, $next_pos); + // list of self closing tags + $self_closing = explode(',', 'area,base,basefont,br,hr,input,img,link,meta,param,frame,col'); - $tag_name = trim(substr($tag,1,strpos($tag,' '))); - $tag_head = $tag_tail = ''; + for($idx=1,$node_len=count($nodes); $idx < $node_len; $idx+=2) { + if(!($node=$nodes[$idx])) continue; - if(!preg_match('/ loop="([^"]+)"/is',$tag)) { - print "Invalid XpressEngine Template Syntax
                                "; - print "File : ".$this->file."
                                "; - print "Code : ".htmlspecialchars($tag); - exit(); - } + if(preg_match_all('@\s(loop|cond)="([^"]+)"@', $node, $matches)) { + $closing = 0; - preg_match_all('/ loop="([^"]+)"/is',$tag,$m); - $tag = preg_replace('/ loop="([^"]+)"/is','', $tag); + // process opening tag + foreach($matches[1] as $n=>$stmt) { + $expr = $matches[2][$n]; + $expr = $this->_replaceVar($expr); + $closing++; - for($i=0,$c=count($m[0]);$i<$c;$i++) - { - $loop = $m[1][$i]; - if(false!== $fpos = strpos($loop,'=>')) - { - $target = trim(substr($loop,0,$fpos)); - $vars = trim(substr($loop,$fpos+2)); - if(false===strpos($vars,',')) - { - $tag_head .= ''; - $tag_tail .= ''; - } - else - { - $t = explode(',',$vars); - $tag_head .= ' '.trim($t[1]).') { ?>'; - $tag_tail .= ''; + switch($stmt) { + case 'cond': + $nodes[$idx-1] .= ""; + break; + case 'loop': + if(!preg_match('@^(?:(.+?)=>(.+?)(?:,(.+?))?|(.*?;.*?;.*?)|(.+?)\s*=\s*(.+?))$@', $expr, $expr_m)) break; + if($expr_m[1]) { + if($expr_m[3]) $expr_m[2] .= '=>'.$expr_m[3]; + $nodes[$idx-1] .= ""; + }elseif($expr_m[4]) { + $nodes[$idx-1] .= ""; + }elseif($expr_m[5]) { + $nodes[$idx-1] .= ""; + } + break; } } - elseif(false!==strpos($loop,';')) - { - $tag_head .= ''; - $tag_tail .= ''; - } - else - { - $t = explode('=',$loop); - if(count($t)==2) - { - $tag_head .= ''; - $tag_tail .= ''; + $node = preg_replace('@\s(loop|cond)="([^"]+)"@', '', $node); + + // this tag + $tag = substr($node, 1, strpos($node, ' ')-1); + + // find closing tag + $close_php = ''; + if($node{1} == '!' || substr($node,-2,1) == '/' || in_array($tag, $self_closing)) { // self closing tag + $nodes[$idx+1] = $close_php.$nodes[$idx+1]; + } else { + $depth = 1; + for($i=$idx+2; $i < $node_len; $i+=2) { + $nd = $nodes[$i]; + if(strpos($nd, $tag.' ') === 1) { + $depth++; + } elseif(strpos($nd, '/'.$tag) === 1) { + $depth--; + if(!$depth) { + $nodes[$i-1] .= $nodes[$i].$close_php; + $nodes[$i] = ''; + break; + } + } } } } - if(substr(trim($tag),-2)!='/>') - { - while(false !== $close_pos = strpos($next, '')); - $tag .= $tmp_buff; - $next = substr($next, strlen($tmp_buff)); - if(substr_count($tag, '<'.$tag_name) == substr_count($tag,'$1', $node); + $node = $this->_replaceVar($node); } - $buff = $pre.$tag_head.$tag.$tag_tail.$next; - } - return $buff; - } - - /** - * @brief replace pipe cond and |cond= - **/ - function _replacePipeCond($matches) - { - if(strpos($matches[0],'|cond')!==false) { - while(strpos($matches[0],'|cond="')!==false) { - if(preg_match('/ (\w+)=\"([^\"]+)\"\|cond=\"([^\"]+)\"/is', $matches[0], $m)) - $matches[0] = str_replace($m[0], sprintf(' %s="%s"', $m[3], $m[1], $m[2]), $matches[0]); - } + if($nodes[$idx] != $node) $nodes[$idx] = $node; } - return $matches[0]; - } - - /** - * @brief replace cond syntax - **/ - function _replaceCond($buff) - { - while(false !== ($pos = strpos($buff, ' cond="'))) - { - $pre = substr($buff,0,$pos); - $next = substr($buff,$pos); - - $pre_pos = strrpos($pre, '<'); - - $isClosedTagUse = true; - preg_match('/<(\/|[!DOCTYPE]|[a-z])/i',$next,$m); - // if not use closed tag, find simple closed tag - if(!$m[0]) { - $isClosedTagUse = false; - preg_match('/[^->]\/?>/',$next,$m); - } - if(!$m[0]) return $buff; - if($isClosedTagUse) $next_pos = strpos($next, $m[0]); - else $next_pos = strpos($next, $m[0])+2; - - $tag = substr($pre, $pre_pos). substr($next, 0, $next_pos); - $pre = substr($pre, 0, $pre_pos); - $next = substr($next, $next_pos); - $tag_name = trim(substr($tag,1,strpos($tag,' '))); - $tag_head = $tag_tail = ''; - - if(preg_match_all('/ cond=\"([^\"]+)"/is',$tag,$m)) - { - for($i=0,$c=count($m[0]);$i<$c;$i++) - { - $tag_head .= ''; - $tag_tail .= ''; - } - } - - if(!preg_match('/ cond="([^"]+)"/is',$tag)) { - print "Invalid XpressEngine Template Syntax
                                "; - print "File : ".$this->file."
                                "; - print "Code : ".htmlspecialchars($tag); - exit(); - } - - $tag = preg_replace('/ cond="([^"]+)"/is','', $tag); - if(substr(trim($tag),-2)=='/>') - { - $buff = $pre.$tag_head.$tag.$tag_tail.$next; - } - else - { - while(false !== $close_pos = strpos($next, '')); - $tag .= $tmp_buff; - $next = substr($next, strlen($tmp_buff)); - - if(substr_count($tag, '<'.$tag_name) == substr_count($tag,'path.substr($target,0,$pos); + return '_replaceVar($m[9]).' ?>'; } - return sprintf( - 'compile(\'%s\',\'%s\');%s'. - '?>%s', - "\n", - "\n", - $path, $filename, "\n", - "\n" - ); + // {@ ... } + if($m[8]) + { + return '_replaceVar($m[8]).' ?>'; + } + + // or or or + if($m[1]=='load'||$m[1]=='unload'||$m[3]=='%import'||$m[3]=='%unload') + { + $attr = array(); + if($m[1]) { + if(!preg_match_all('@ (\w+)="([^"]+)"@', $m[2], $mm)) return $m[0]; + foreach($mm[1] as $idx=>$name) { + $attr[$name] = $mm[2][$idx]; + } + $cmd = $m[1]; + } else { + if(preg_match_all('@,(\w+)="([^"]+)"@', $m[5], $mm)) { + foreach($mm[1] as $idx=>$name) { + $attr[$name] = $mm[2][$idx]; + } + } + $attr['target'] = $m[4]; + $cmd = substr($m[3], 1); + if($cmd == 'import') $cmd = 'load'; + } + + if(!preg_match('@^\.?/@',$attr['target'])) $attr['target'] = './'.$attr['target']; + + $isRemoteFile = !!preg_match('@^https?://@i', $attr['target']); + + $metafile = ''; + $pathinfo = pathinfo($attr['target']); + $relativeDir = $this->_getRelativeDir($pathinfo['dirname']); + + if(!$isRemoteFile) $attr['target'] = $relativeDir.'/'.$pathinfo['basename']; + + switch($pathinfo['extension']) + { + case 'xml': + if($isRemoteFile || $cmd != 'load') return ''; + // language file? + if($pathinfo['basename'] == 'lang.xml' && substr($pathinfo['dirname'],-5) == '/lang') { + $result = ""; + } else { + $result = "compile(); ?>"; + } + break; + case 'js': + if($cmd == 'unload') { + $result = ""; + } + break; + case 'css': + if($cmd == 'unload') { + $result = ""; + } + break; + } + + if($metafile) $result = "".$result; + + return $result; + } + + // or + if($m[1]=='include' || $m[3]=='#include') + { + if(!$this->file) return ''; + if($m[1]) { + if(!preg_match('@target="(.+?)"@', $m[2], $mm)) return ''; + $file = $mm[1]; + } else { + $file = $m[4]; + } + $pathinfo = pathinfo($file); + $fileDir = $this->_getRelativeDir($pathinfo['dirname']); + + if(!$fileDir) return ''; + + return "compile('{$fileDir}','{$pathinfo['basename']}') ?>"; + } + + // + if($m[3]=='%load_js_plugin') + { + $plugin = $this->_replaceVar($m[4]); + if(strpos($plugin, '$__Context') === false) $plugin = "'{$plugin}'"; + return ""; + } + + // such as , , + if($m[6]) + { + if(!preg_match('/^(?:(if|switch|for|foreach|while)|(end(?:if|switch|for|foreach|while)?)|(else(?:if)?)|(break@)?(case|default)|(break))$/', $m[6], $mm)) return ''; + if($mm[1]) { + $precheck = ''; + if($mm[1] == 'foreach') { + $var = preg_replace('/^\s*\(\s*(.+?) .*$/', '$1', $m[7]); + $precheck = "if({$var}&&count({$var}))"; + } + return '_replaceVar($precheck.$m[6].$m[7]).'{ ?>'; + } + if($mm[2]) return ""; + if($mm[3]) return "_replaceVar($m[7])."{ ?>"; + if($mm[5]) return ""; + if($mm[6]) return ""; + return ''; + } + + return $m[0]; + } + + function _getRelativeDir($path) + { + $fileDir = dirname(realpath($this->file)); + if($path{0} != '/') $path = realpath($fileDir.'/'.$path); + + $path = preg_replace('/^'.preg_quote(_XE_PATH_,'/').'/', '', $path); + $path = ltrim($path, '/'); + + return $path; } /** @@ -613,192 +607,11 @@ /** * @brief replace PHP variables of $ character **/ - function _replaceVarInPHP($buff) { - $head = $tail = ''; - while(false !== $pos = strpos($buff, ''); - $body = substr($buff,0,$pos+2); - $head .= preg_replace_callback('/(.?)\$(\w+[a-z0-9\_\-\[\]\'\"]+)/is',array($this, '_replaceVarString'), $body); - - $buff = substr($buff,$pos+2); - } - return $head.$buff; + function _replaceVar($php) { + if(!$php) return ''; + return preg_replace('@(?$1', $php); } - - /** - * @brief if class::$variable_name in php5, replace the function not to use context - **/ - function _replaceVarString($matches) - { - if($matches[1]==':') return $matches[0]; - if(substr($matches[2],0,1)=='_') return $matches[0]; - return $matches[1].'$__Context->'.$matches[2]; - } - - /** - * @brief replace with php code - * @param[in] $matches match - * @return replaced result - **/ - function _compileIncludeToCode($matches) { - // if target string to include contains variables handle them - $arg = str_replace(array('"','\''), '', $matches[1]); - if(!$arg) return; - - $tmp_arr = explode("/", $arg); - for($i=0;$ifile), $arg); - $path = substr($this->path,-1)=='/'?substr($this->path,0,-1):$this->path; - $source_filename = sprintf("%s/%s", $path, $arg); - - // step2: check path from root - if(!file_exists($source_filename)) $source_filename = './'.$arg; - if(!file_exists($source_filename)) return; - - // split into path and filename - $tmp_arr = explode('/', $source_filename); - $filename = array_pop($tmp_arr); - $path = implode('/', $tmp_arr).'/'; - - // try to include - $output = sprintf( - 'compile(\'%s\',\'%s\');%s'. - '?>%s', - "\n", - "\n", - $path, $filename, "\n", - "\n" - ); - - return $output; - } - - /** - * @brief replace $... variables in { } with Context::get(...) - * @param[in] $matches match - * @return replaced result in case of success or NULL in case of error - **/ - function _compileVarToContext($matches) { - $str = trim(substr($matches[0],1,strlen($matches[0])-2)); - if(!$str) return $matches[0]; - if(!in_array(substr($str,0,1),array('(','$','\'','"'))) { - if(preg_match('/^([^\( \.]+)(\(| \.)/i',$str,$m)) { - $func = trim($m[1]); - if(strpos($func,'::')===false) { - if(!function_exists($func)) { - return $matches[0]; - } - } else { - list($class, $method) = explode('::',$func); - // FIXME regardless of whether class/func name is case-sensitive, it is safe - // to assume names are case sensitive. We don't have compare twice. - if(!class_exists($class) || !in_array($method, get_class_methods($class))) { - // In some environment, the name of classes and methods may be case-sensitive - list($class, $method) = explode('::',strtolower($func)); - if(!class_exists($class) || !in_array($method, get_class_methods($class))) { - return $matches[0]; - } - } - } - } else { - if(!defined($str)) return $matches[0]; - } - } - return ']+)/i','$__Context->\\1', $str).');?>'; - } - - /** - * @brief replace @... function in { } into print func(..) - * @param[in] $matches match - * @return replaced result - **/ - function _compileVarToSilenceExecute($matches) { - if(strtolower(trim(str_replace(array(';',' '),'', $matches[1])))=='return') return ''; - return ']+)/i','$__Context->\\1', trim($matches[1])).';?>'; - } - - /** - * @brief replace code in with php code - * @param[in] $matches match - * @return changed result - **/ - function _compileFuncToCode($matches) { - static $idx = 0; - $code = trim($matches[1]); - if(!$code) return; - - switch(strtolower($code)) { - case 'else' : - $output = '}else{'; - break; - case 'end' : - case 'endif' : - case 'endfor' : - case 'endforeach' : - case 'endswitch' : - $output = '}'; - break; - case 'break' : - $output = 'break;'; - break; - case 'default' : - $output = 'default :'; - break; - case 'break@default' : - $output = 'break; default :'; - break; - default : - $suffix = '{'; - - if(substr($code, 0, 4) == 'else') { - $code = '}'.$code; - } elseif(substr($code, 0, 7) == 'foreach') { - $tmp_str = substr($code, 8); - $tmp_arr = explode(' ', $tmp_str); - $var_name = $tmp_arr[0]; - $prefix = '$Context->__idx['.$idx.']=0;'; - if(substr($var_name, 0, 1) == '$') { - $prefix .= sprintf('if(count($__Context->%s)) ', substr($var_name, 1)); - } else { - $prefix .= sprintf('if(count(%s)) ', $var_name); - } - $idx++; - $suffix .= '$__idx['.$idx.']=($__idx['.$idx.']+1)%2; $cycle_idx = $__idx['.$idx.']+1;'; - } elseif(substr($code, 0, 4) == 'case') { - $suffix = ':'; - } elseif(substr($code, 0, 10) == 'break@case') { - $code = 'break; case'.substr($code, 10); - $suffix = ':'; - } - $output = preg_replace('/\$([a-zA-Z0-9\_\-]+)/i', '$__Context->\\1', $code.$suffix); - break; - } - - return sprintf('', $prefix, $output); - } - - /** * @brief replace xe specific code, "" with appropriate php code * @param[in] $matches match @@ -889,18 +702,6 @@ return $output; } - /** - * @brief import javascript plugin - * @param[in] $matches match - * @return result loading the plugin - * @remarks javascript plugin works as optimized = false - **/ - function _compileLoadJavascriptPlugin($matches) { - $base_path = $this->path; - $plugin = trim($matches[1]); - return sprintf('', $plugin); - } - /** * @brief remove loading part of css/ js file * @param[in] $matches match diff --git a/tests/classes/template/TemplateHandlerTest.class.php b/tests/classes/template/TemplateHandlerTest.class.php new file mode 100644 index 000000000..48259e086 --- /dev/null +++ b/tests/classes/template/TemplateHandlerTest.class.php @@ -0,0 +1,126 @@ +'; + + static public function provider() + { + return array( + // pipe cond + array( + 'Link', + 'cond > 10){ ?> class="active">Link' + ), + // cond + array( + 'Link1say, hello', + 'Link1cond){ ?>say, hello' + ), + // cond + array( + 'Link1Link2', + 'Link1var==$__Context->key){ ?>Link2' + ), + // for loop + array( + '', + '
                                  i=0;$__Context->i<$__Context->len;$__Context->i++){ ?>
                                • Link
                                ' + ), + // foreach loop + array( + '', + '
                                  arr&&count($__Context->arr))foreach($__Context->arr as $__Context->key=>$__Context->val){ ?>
                                • Link
                                    arr2&&count($__Context->arr2))foreach($__Context->arr2 as $__Context->key2=>$__Context->val2){ ?>
                                ' + ), + // while loop + array( + '', + '
                                  item=get_loop_item()){ ?>
                                • Link
                                ' + ), + // ~ + array( + 'LinkHello, world', + 'Linkcond){ ?>Hello, world' + ), + // ~ + array( + 'LinkHello, {$world}', + 'Linkcond){ ?>Hello, world ?>' + ), + // ~ ~ + array( + 'LinkHello, worldWow', + 'Linkcond){ ?>Hello, worldWow' + ), + // ~ ~ ~ + array( + 'LinkHello, worldHaHaWow', + 'Linkcond){ ?>Hello, worldcond2){ ?>HaHaWow' + ), + // ~ + array( + '
                              • Repeat this
                              • ', + 'i=0;$__Context->i<$__Context->len;$__Context->i++){ ?>
                              • Repeat this
                              • ' + ), + // ~ + array( + '
                              • item{$key} : {$val}
                              • ', + 'arr&&count($__Context->arr))foreach($__Context->arr as $__Context->key=>$__Context->val){ ?>
                              • itemkey ?> : val ?>
                              • ' + ), + // ~ + array( + '{$v->text}', + 'item=$__Context->list->getItem()){ ?>v->text ?>' + ), + // ~ ~ ~ ~ + array( + 'ABC', + 'var){ ?>ABC' + ), + // {@ ...PHP_CODE...} + array( + '{@$list_page = $page_no}', + 'list_page = $__Context->page_no ?>' + ), + // %load_js_plugin + array( + '', + '' + ), + // #include + array( + '
                                This is another dummy
                                ', + 'compile(\'tests/classes/template\',\'sample.html\') ?>
                                This is another dummy
                                ' + ), + // + array( + '
                                This is another dummy
                                ', + 'compile(\'tests/classes\',\'sample.html\') ?>
                                This is another dummy
                                ' + ), + // + array( + '', + '' + ), + ); + } + + /** + * @dataProvider provider + */ + public function testParse($tpl, $expected) + { + $tmpl = new TemplateHandler(); + $tmpl->init(dirname(__FILE__), 'sample.html'); + $result = $tmpl->parse($tpl, $expected); + + $this->assertEquals($result, $this->prefix.$expected); + } +} diff --git a/tests/classes/template/css/style.css b/tests/classes/template/css/style.css new file mode 100644 index 000000000..af6e2a583 --- /dev/null +++ b/tests/classes/template/css/style.css @@ -0,0 +1 @@ +/* only for test */ diff --git a/tests/classes/template/sample.html b/tests/classes/template/sample.html new file mode 100644 index 000000000..3ce557d85 --- /dev/null +++ b/tests/classes/template/sample.html @@ -0,0 +1 @@ + From 543987415fa775c2015671c1314b3b3ba6367957 Mon Sep 17 00:00:00 2001 From: taggon Date: Thu, 22 Sep 2011 01:20:20 +0000 Subject: [PATCH 0803/1372] Remove unnecessary code git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9259 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/template/TemplateHandler.class.php | 262 +----------------- .../template/TemplateHandlerTest.class.php | 2 +- 2 files changed, 8 insertions(+), 256 deletions(-) diff --git a/classes/template/TemplateHandler.class.php b/classes/template/TemplateHandler.class.php index 9827140f8..c38dc0f53 100644 --- a/classes/template/TemplateHandler.class.php +++ b/classes/template/TemplateHandler.class.php @@ -412,28 +412,29 @@ if($isRemoteFile || $cmd != 'load') return ''; // language file? if($pathinfo['basename'] == 'lang.xml' && substr($pathinfo['dirname'],-5) == '/lang') { - $result = ""; + $result = "Context::loadLang('{$relativeDir}');"; } else { - $result = "compile(); ?>"; + $result = "require_once('./classes/xml/XmlJsFilter.class.php');\$__xmlFilter = new XmlJsFilter('{$relativeDir}','{$pathinfo["basename"]}');\$__xmlFilter->compile();"; } break; case 'js': if($cmd == 'unload') { - $result = ""; + $result = " \$__tmp=array('{$attr['target']}','{$attr['media']}','{$attr['targetie']}','{$attr['index']}','{$attr['usecdn']}','{$attr['cdnprefix']}','{$attr['cdnversion']}');Context::loadFile(\$__tmp);unset(\$__tmp);"; } break; case 'css': if($cmd == 'unload') { - $result = ""; + $result = "\$__tmp=array('{$attr['target']}','{$attr['type']}','{$attr['targetie']}','{$attr['index']}','{$attr['usecdn']}','{$attr['cdnprefix']}','{$attr['cdnversion']}');Context::loadFile(\$__tmp);unset(\$__tmp);"; } break; } + $result = ""; if($metafile) $result = "".$result; return $result; @@ -498,112 +499,6 @@ return $path; } - /** - * @brief replace load tags - **/ - function _replaceLoad($matches) { - $output = $matches[0]; - if(!preg_match_all('/ ([^=]+)=\"([^\"]+)\"/is',$matches[0], $m)) return $matches[0]; - - $type = $matches[1]; - for($i=0,$c=count($m[1]);$i<$c;$i++) - { - if(!trim($m[1][$i])) continue; - $attrs[trim($m[1][$i])] = trim($m[2][$i]); - } - - if(!$attrs['target']) return $matches[0]; - - $web_path = $this->web_path; - $base_path = $this->path; - - $target = $attrs['target']; - if(!preg_match('/^(http|https)/i',$target)) - { - if(substr($target,0,2)=='./') $target = substr($target,2); - //if(substr($target,0,1)!='/') $target = $web_path.$target; - } - - if(!$attrs['index']) $attrs['index'] = 'null'; - if($attrs['type']!='body') $attrs['type'] = 'head'; - - // if target ends with lang, load language pack - if(substr($target, -4)=='lang') { - if(substr($target,0,2)=='./') $target = substr($target, 2); - $lang_dir = $base_path.$target; - if(is_dir($lang_dir)) $output = sprintf('', $lang_dir); - - // otherwise try to load xml, css, js file - } else { - if(substr($target,0,1)!='/') $source_filename = $base_path.$target; - else $source_filename = $target; - $source_filename = str_replace(array('/./','//'),'/',$source_filename); - - // get filename and path - $tmp_arr = explode("/",$source_filename); - $filename = array_pop($tmp_arr); - - //$base_path = implode("/",$tmp_arr)."/"; - - // get the ext - $tmp_arr = explode(".",$filename); - $ext = strtolower(array_pop($tmp_arr)); - - $output = ' $val) - { - $output .= '$_load_attrs[\''.$key.'\'] = \'' . preg_replace('/\{([^@^ ][^\{\}\n]+)\}/i', "'.\\1.'", $val) . '\';'; - } - $output .= '?>'; - - // according to ext., import the file - switch($ext) { - // xml js filter - case 'xml' : - if(preg_match('/^(http|https)/i',$source_filename)) return; - // create an instance of XmlJSFilter class, then create js and handle Context::addJsFile - $output .= sprintf( - 'compile();%s'. - '?>%s', - "\n", - "\n", - dirname($base_path . $attrs['target']).'/', - $filename, - "\n", - "\n", - "\n" - ); - break; - // css file - case 'css' : - if($type == 'unload') { - $output = sprintf("", $source_filename, $attrs['targetie'], $attrs['media']); - } else { - $meta_file = $source_filename; - $output .= ''; - } - break; - // js file - case 'js' : - if($type == 'unload') { - $output = sprintf("", $source_filename, $attrs['targetie']); - } else { - $meta_file = $source_filename; - $output .= ''; - } - break; - } - } - - if($meta_file) $output = ''.$output; - return $output; - } - /** * @brief replace PHP variables of $ character **/ @@ -611,148 +506,5 @@ if(!$php) return ''; return preg_replace('@(?$1', $php); } - - /** - * @brief replace xe specific code, "" with appropriate php code - * @param[in] $matches match - * @return Returns modified result or NULL in case of error - **/ - function _compileImportCode($matches) { - // find xml file - $base_path = $this->path; - $given_file = trim($matches[1]); - if(!$given_file) return; - if(isset($matches[3])) $optimized = strtolower(trim($matches[3])); - if(!$optimized) $optimized = 'true'; - if(isset($matches[5])) $media = trim($matches[5]); - if(!$media) $media = 'all'; - if(isset($matches[7])) $targetie = trim($matches[7]); - if(!$targetie) $targetie = ''; - else $optimized = 'false'; - - if(isset($matches[9])) $index = intval($matches[9]); - if(!$index) $index = 'null'; - if(isset($matches[11])) $type = strtolower(trim($matches[11])); - if($type!='body') $type = 'head'; - - // if given_file ends with lang, load language pack - if(substr($given_file, -4)=='lang') { - if(substr($given_file,0,2)=='./') $given_file = substr($given_file, 2); - $lang_dir = $base_path.$given_file; - if(is_dir($lang_dir)) $output = sprintf('', $lang_dir); - - // otherwise try to load xml, css, js file - } else { - if(preg_match('/^(http|https):/i',$given_file)) $source_filename = $given_file; - elseif(substr($given_file,0,1)!='/') $source_filename = sprintf("%s%s",$base_path, $given_file); - else $source_filename = $given_file; - - // get filename and path - $tmp_arr = explode("/",$source_filename); - $filename = array_pop($tmp_arr); - - $base_path = implode("/",$tmp_arr)."/"; - - // get the ext - $tmp_arr = explode(".",$filename); - $ext = strtolower(array_pop($tmp_arr)); - - // according to ext., import the file - switch($ext) { - // xml js filter - case 'xml' : - // create an instance of XmlJSFilter class, then create js and handle Context::addJsFile - $output = sprintf( - 'compile();%s'. - '?>%s', - "\n", - "\n", - $base_path, - $filename, - "\n", - "\n", - "\n" - ); - break; - // css file - case 'css' : - if(preg_match('/^(http|\/)/i',$source_filename)) { - $output = sprintf('', $source_filename, $media, $targetie, $index); - } else { - $meta_file = $base_path.$filename; - $output = sprintf('', $base_path, $filename, $media, $targetie, $index); - } - break; - // js file - case 'js' : - if(preg_match('/^(http|\/)/i',$source_filename)) { - $output = sprintf('', $source_filename, $type, $targetie, $index); - } else { - $meta_file = $base_path.$filename; - $output = sprintf('', $base_path, $filename, $type, $targetie, $index); - } - break; - } - } - - if($meta_file) $output = ''.$output; - return $output; - } - - /** - * @brief remove loading part of css/ js file - * @param[in] $matches match - * @return removed result - **/ - function _compileUnloadCode($matches) { - // find xml file - $base_path = $this->path; - $given_file = trim($matches[1]); - if(!$given_file) return; - if(isset($matches[3])) $optimized = strtolower(trim($matches[3])); - if(!$optimized) $optimized = 'true'; - if(isset($matches[5])) $media = trim($matches[5]); - if(!$media) $media = 'all'; - if(isset($matches[7])) $targetie = trim($matches[7]); - if(!$targetie) $targetie = ''; - else $optimized = 'false'; - - if(substr($given_file,0,1)!='/') $source_filename = sprintf("%s%s",$base_path, $given_file); - else $source_filename = $given_file; - - // get path and file nam - $tmp_arr = explode("/",$source_filename); - $filename = array_pop($tmp_arr); - - $base_path = implode("/",$tmp_arr)."/"; - - // get an ext. - $tmp_arr = explode(".",$filename); - $ext = strtolower(array_pop($tmp_arr)); - - switch($ext) { - // css file - case 'css' : - if(preg_match('/^(http|https|\/)/i',$source_filename)) { - $output = sprintf('', $source_filename, $targetie, $media); - } else { - $output = sprintf('', $base_path, $filename, $targetie, $media); - } - break; - // js file - case 'js' : - if(preg_match('/^(http|https|\/)/i',$source_filename)) { - $output = sprintf('', $source_filename, $targetie); - } else { - $output = sprintf('', $base_path, $filename, $targetie); - } - break; - } - - return $output; - } } ?> diff --git a/tests/classes/template/TemplateHandlerTest.class.php b/tests/classes/template/TemplateHandlerTest.class.php index 48259e086..77e3f2407 100644 --- a/tests/classes/template/TemplateHandlerTest.class.php +++ b/tests/classes/template/TemplateHandlerTest.class.php @@ -107,7 +107,7 @@ class TemplateHandlerTest extends PHPUnit_Framework_TestCase // array( '', - '' + '' ), ); } From ab4042f721fbceab860876eb8d307dd671e50726 Mon Sep 17 00:00:00 2001 From: ngleader Date: Thu, 22 Sep 2011 01:20:52 +0000 Subject: [PATCH 0804/1372] r8581 modify getEnv for changing Context git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9260 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/admin.admin.model.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/admin/admin.admin.model.php b/modules/admin/admin.admin.model.php index 985916eeb..5cd7bf184 100644 --- a/modules/admin/admin.admin.model.php +++ b/modules/admin/admin.admin.model.php @@ -103,10 +103,11 @@ $info['package'] = _XE_PACKAGE_; $info['host'] = $db_type->default_url ? $db_type->default_url : getFullUrl(); $info['app'] = $_SERVER['SERVER_SOFTWARE']; + $info['xe_version'] = __ZBXE_VERSION__; $info['php'] = phpversion(); $db_info = Context::getDBInfo(); - $info['db_type'] = $db_info->db_type; + $info['db_type'] = Context::getDBType(); $info['use_rewrite'] = $db_info->use_rewrite; $info['use_db_session'] = $db_info->use_db_session == 'Y' ?'Y':'N'; $info['use_ssl'] = $db_info->use_ssl; From 5f66f744e108ba10d7cab53b6f3c583243925308 Mon Sep 17 00:00:00 2001 From: flyskyko Date: Thu, 22 Sep 2011 01:36:06 +0000 Subject: [PATCH 0805/1372] add error case git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9261 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- tests/classes/template/TemplateHandlerTest.class.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/classes/template/TemplateHandlerTest.class.php b/tests/classes/template/TemplateHandlerTest.class.php index 77e3f2407..9d2baa638 100644 --- a/tests/classes/template/TemplateHandlerTest.class.php +++ b/tests/classes/template/TemplateHandlerTest.class.php @@ -2,7 +2,6 @@ define('__DEBUG__', 1); define('_XE_PATH_', realpath(dirname(__FILE__).'/../../../')); -require _XE_PATH_.'/classes/file/FileHandler.class.php'; require _XE_PATH_.'/classes/template/TemplateHandler.class.php'; $_SERVER['SCRIPT_NAME'] = '/xe/index.php'; @@ -109,6 +108,11 @@ class TemplateHandlerTest extends PHPUnit_Framework_TestCase '', '' ), + // error case + array( + 'logo', + 'layout_info->logo_image){ ?>logo' + ), ); } From 1d783a6dbf638c9c827395c4079f34652da61fbb Mon Sep 17 00:00:00 2001 From: taggon Date: Thu, 22 Sep 2011 01:49:52 +0000 Subject: [PATCH 0806/1372] Fixed a bug for a regular expression git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9262 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/template/TemplateHandler.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/classes/template/TemplateHandler.class.php b/classes/template/TemplateHandler.class.php index c38dc0f53..b413b167d 100644 --- a/classes/template/TemplateHandler.class.php +++ b/classes/template/TemplateHandler.class.php @@ -281,11 +281,11 @@ function _parseInline($buff) { - if(preg_match_all('/<([a-zA-Z0-9]+)[^>]*?(?:[ \|]cond| loop)="/s', $buff, $matches) === false) return $buff; + if(preg_match_all('/<([a-zA-Z0-9]+)(?:->||[^<>-]*)*?(?:[ \|]cond| loop)="/s', $buff, $matches) === false) return $buff; $tags = array_unique($matches[1]); $tags = implode('|',array_unique($matches[1])); - $split_regex = '@(<(?:/(?:'.$tags.')|(?:'.$tags.')(?:[^>]*(?:cond|loop)="[^"]+")*)[^>]*>)@s'; + $split_regex = '@(<(?:/(?:'.$tags.')|(?:'.$tags.')(?:(?:->||[^<>])*?(?:cond|loop)="[^"]+")*)(?:->||[^<>])*>)@s'; $nodes = preg_split($split_regex, $buff, -1, PREG_SPLIT_DELIM_CAPTURE); From 586368274d2ba8fb4902262b9d29c9e79cc46eff Mon Sep 17 00:00:00 2001 From: taggon Date: Thu, 22 Sep 2011 01:52:29 +0000 Subject: [PATCH 0807/1372] FileHandler no longer inherits Handler git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9263 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/file/FileHandler.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/classes/file/FileHandler.class.php b/classes/file/FileHandler.class.php index 86342c665..e628f49ac 100644 --- a/classes/file/FileHandler.class.php +++ b/classes/file/FileHandler.class.php @@ -5,7 +5,7 @@ * @brief contains methods for accessing file system **/ - class FileHandler extends Handler { + class FileHandler { /** * @brief changes path of target file, directory into absolute path * @param[in] $source path @@ -673,4 +673,4 @@ return (is_readable($filename) && !!filesize($filename)); } } -?> \ No newline at end of file +?> From 4cd7969a96ef220c4bc0c71d6bb85bd72b53d231 Mon Sep 17 00:00:00 2001 From: flyskyko Date: Thu, 22 Sep 2011 02:15:06 +0000 Subject: [PATCH 0808/1372] fix a bug for replacing image path git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9264 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/template/TemplateHandler.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/template/TemplateHandler.class.php b/classes/template/TemplateHandler.class.php index b413b167d..53b3a2046 100644 --- a/classes/template/TemplateHandler.class.php +++ b/classes/template/TemplateHandler.class.php @@ -61,7 +61,7 @@ $this->filename = $tpl_filename; $this->file = $tpl_file; - $this->web_path = $this->xe_path.preg_replace('/^'.preg_quote(_XE_PATH_,'/').'/','',$this->path); + $this->web_path = $this->xe_path.'/'.preg_replace('@^'.preg_quote(_XE_PATH_,'@').'|\./@','',$this->path); // get compiled file name $hash = md5($this->file . __ZBXE_VERSION__); From 88e59bc26591992e0d40668f75d97a87003cbe02 Mon Sep 17 00:00:00 2001 From: taggon Date: Thu, 22 Sep 2011 02:38:29 +0000 Subject: [PATCH 0809/1372] Fixed a bug for modifying forms git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9265 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/template/TemplateHandler.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/classes/template/TemplateHandler.class.php b/classes/template/TemplateHandler.class.php index 53b3a2046..404e5d48a 100644 --- a/classes/template/TemplateHandler.class.php +++ b/classes/template/TemplateHandler.class.php @@ -214,14 +214,14 @@ $generatedHidden = ''; foreach($resultArray AS $key=>$value) { - $generatedHidden .= ''; + $generatedHidden .= ''; } $matches[2] = $generatedHidden.$matches[2]; } // return url generate preg_match('/]*name="error_return_url"[^>]*>/is', $matches[2], $m3); - if(!$m3[0]) $matches[2] = ''.$matches[2]; + if(!$m3[0]) $matches[2] = ''.$matches[2]; $matches[0] = ''; return implode($matches); From bd97f313b15d342d5f42c0e2aea9c7bcec6767d8 Mon Sep 17 00:00:00 2001 From: flyskyko Date: Thu, 22 Sep 2011 02:43:53 +0000 Subject: [PATCH 0810/1372] issue 160, prevent session close error when use db session git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9266 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/module/ModuleHandler.class.php | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/classes/module/ModuleHandler.class.php b/classes/module/ModuleHandler.class.php index fbf592197..35d7870a8 100644 --- a/classes/module/ModuleHandler.class.php +++ b/classes/module/ModuleHandler.class.php @@ -42,9 +42,18 @@ $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")); - if($this->mid && !preg_match("/^([a-z0-9\_\-]+)$/i",$this->mid)) die(Context::getLang("msg_invalid_request")); - if($this->act && !preg_match("/^([a-z0-9\_\-]+)$/i",$this->act)) die(Context::getLang("msg_invalid_request")); + $isInvalid = null; + if($this->module && !preg_match("/^([a-z0-9\_\-]+)$/i",$this->module)) $isInvalid = true; + if($this->mid && !preg_match("/^([a-z0-9\_\-]+)$/i",$this->mid)) $isInvalid = true; + if($this->act && !preg_match("/^([a-z0-9\_\-]+)$/i",$this->act)) $isInvalid = true; + if ($isInvalid) + { + htmlHeader(); + echo Context::getLang("msg_invalid_request"); + htmlFooter(); + Context::close(); + exit; + } // execute addon (before module initialization) $called_position = 'before_module_init'; From a7be5195815ed9209d6a7578022b65c0617379a2 Mon Sep 17 00:00:00 2001 From: ovclas Date: Thu, 22 Sep 2011 04:52:52 +0000 Subject: [PATCH 0811/1372] issue 160 when document copy successed. message change to 'Copyied successfully' git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9267 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/lang/lang.xml | 4 ++++ modules/document/document.controller.php | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/common/lang/lang.xml b/common/lang/lang.xml index 94c1850a9..c1bc2ba7b 100644 --- a/common/lang/lang.xml +++ b/common/lang/lang.xml @@ -2807,6 +2807,10 @@ Xin vui lòng kiểm tra lại thông tin Database.]]> + + + + diff --git a/modules/document/document.controller.php b/modules/document/document.controller.php index a3ceb778e..78e6d4418 100644 --- a/modules/document/document.controller.php +++ b/modules/document/document.controller.php @@ -1645,7 +1645,7 @@ class documentController extends document { $output = $oDocumentAdminController->copyDocumentModule($document_srl_list, $module_srl, $category_srl); if(!$output->toBool()) return new Object(-1, 'fail_to_move'); - $msg_code = 'success_registed'; + $msg_code = 'success_copy'; } elseif($type =='delete') { $oDB = &DB::getInstance(); From 2825f57457935410bcf03e351b99d06bd06bd7db Mon Sep 17 00:00:00 2001 From: taggon Date: Thu, 22 Sep 2011 05:05:42 +0000 Subject: [PATCH 0812/1372] Add a test for comments git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9268 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- tests/classes/template/TemplateHandlerTest.class.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/classes/template/TemplateHandlerTest.class.php b/tests/classes/template/TemplateHandlerTest.class.php index 9d2baa638..11fe6464f 100644 --- a/tests/classes/template/TemplateHandlerTest.class.php +++ b/tests/classes/template/TemplateHandlerTest.class.php @@ -108,6 +108,11 @@ class TemplateHandlerTest extends PHPUnit_Framework_TestCase '', '' ), + // comment + array( + '', + '' + ), // error case array( 'logo', From 4aa222aec3737da588b05e1455cbc4cb877f0ea6 Mon Sep 17 00:00:00 2001 From: taggon Date: Thu, 22 Sep 2011 07:04:06 +0000 Subject: [PATCH 0813/1372] Fixed a bug related relative path git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9270 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/template/TemplateHandler.class.php | 35 ++++++++----------- .../template/TemplateHandlerTest.class.php | 30 ++++++++++++++++ 2 files changed, 44 insertions(+), 21 deletions(-) diff --git a/classes/template/TemplateHandler.class.php b/classes/template/TemplateHandler.class.php index 404e5d48a..bc0c062c9 100644 --- a/classes/template/TemplateHandler.class.php +++ b/classes/template/TemplateHandler.class.php @@ -61,7 +61,7 @@ $this->filename = $tpl_filename; $this->file = $tpl_file; - $this->web_path = $this->xe_path.'/'.preg_replace('@^'.preg_quote(_XE_PATH_,'@').'|\./@','',$this->path); + $this->web_path = $this->xe_path.'/'.ltrim(preg_replace('@^'.preg_quote(_XE_PATH_,'@').'|\./@','',$this->path),'/'); // get compiled file name $hash = md5($this->file . __ZBXE_VERSION__); @@ -154,7 +154,7 @@ } // replace value of src in img/input/script tag - $buff = preg_replace_callback('/<(img|input|script)([^>]*)src="([^"]*?)"/is', array($this, '_replacePath'), $buff); + $buff = preg_replace_callback('/(<(?:img|input|script)(?:->||[^<>])*)\ssrc="(?!https?:\/\/|[\/\{])(.+?)"/is', array($this, '_replacePath'), $buff); // replace loop and cond template syntax $buff = $this->_parseInline($buff); @@ -263,25 +263,18 @@ **/ function _replacePath($matches) { - preg_match_all('/src="([^"]*?)"/is', $matches[0], $m); - for($i=0,$c=count($m[0]);$i<$c;$i++) { - $path = trim($m[1][$i]); - if(substr($path,0,1)=='/' || substr($path,0,1)=='{' || strpos($path,'://')!==false) continue; - if(substr($path,0,2)=='./') $path = substr($path,2); - $target = $this->web_path.$path; - while(strpos($target,'/../')!==false) - { - $target = preg_replace('/\/([^\/]+)\/\.\.\//','/',$target); - } - $target = str_replace('/./','/',$target); - $matches[0] = str_replace($m[0][$i], 'src="'.$target.'"', $matches[0]); - } - return $matches[0]; + $src = preg_replace('@^(\./)+@', '', trim($matches[2])); + $src = $this->web_path.$src; + $src = str_replace('/./', '/', $src); + + while(($tmp=preg_replace('@[^/]+/\.\./@', '', $src))!==$src) $src = $tmp; + + return "{$matches[1]} src=\"{$src}\""; } function _parseInline($buff) { - if(preg_match_all('/<([a-zA-Z0-9]+)(?:->||[^<>-]*)*?(?:[ \|]cond| loop)="/s', $buff, $matches) === false) return $buff; + if(preg_match_all('/<([a-zA-Z0-9]+)(?:->||[^<>])*?(?:[ \|]cond| loop)="/s', $buff, $matches) === false) return $buff; $tags = array_unique($matches[1]); $tags = implode('|',array_unique($matches[1])); @@ -396,10 +389,10 @@ if($cmd == 'import') $cmd = 'load'; } - if(!preg_match('@^\.?/@',$attr['target'])) $attr['target'] = './'.$attr['target']; - $isRemoteFile = !!preg_match('@^https?://@i', $attr['target']); + if(!$isRemoteFile && !preg_match('@^\.?/@',$attr['target'])) $attr['target'] = './'.$attr['target']; + $metafile = ''; $pathinfo = pathinfo($attr['target']); $relativeDir = $this->_getRelativeDir($pathinfo['dirname']); @@ -419,9 +412,9 @@ break; case 'js': if($cmd == 'unload') { - $result = " Context::unloadFile('{$attr['target']}','{$attr['targetie']}');"; + $result = "Context::unloadFile('{$attr['target']}','{$attr['targetie']}');"; } else { - $result = " \$__tmp=array('{$attr['target']}','{$attr['media']}','{$attr['targetie']}','{$attr['index']}','{$attr['usecdn']}','{$attr['cdnprefix']}','{$attr['cdnversion']}');Context::loadFile(\$__tmp);unset(\$__tmp);"; + $result = "\$__tmp=array('{$attr['target']}','{$attr['media']}','{$attr['targetie']}','{$attr['index']}','{$attr['usecdn']}','{$attr['cdnprefix']}','{$attr['cdnversion']}');Context::loadFile(\$__tmp);unset(\$__tmp);"; } break; case 'css': diff --git a/tests/classes/template/TemplateHandlerTest.class.php b/tests/classes/template/TemplateHandlerTest.class.php index 11fe6464f..7b104f335 100644 --- a/tests/classes/template/TemplateHandlerTest.class.php +++ b/tests/classes/template/TemplateHandlerTest.class.php @@ -113,11 +113,41 @@ class TemplateHandlerTest extends PHPUnit_Framework_TestCase '', '' ), + // self-closing tag + array( + '', + 'foo){ ?>' + ), + // relative path + array( + '', + '' + ), + // relative path + array( + '', + '' + ), // error case array( 'logo', 'layout_info->logo_image){ ?>logo' ), + // issue 103 + array( + '', + '' + ), + // issue 135 + array( + '

                                {$key}

                                Loop block {$val}
                                ', + '_m_list_all&&count($__Context->_m_list_all))foreach($__Context->_m_list_all as $__Context->key=>$__Context->val){ ?>

                                key ?>

                                Loop block val ?>
                                ' + ), + // issue 136 + array( + '
                                bar', + 'var==\'foo\'){ ?>
                                bar' + ), ); } From 18a01f4e35432d070b5f1fa44922cd982615fdfb Mon Sep 17 00:00:00 2001 From: ovclas Date: Thu, 22 Sep 2011 08:25:57 +0000 Subject: [PATCH 0814/1372] issue 160 when 1st menu move, then not moved. this bug fixed git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9273 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/menu/menu.admin.controller.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/menu/menu.admin.controller.php b/modules/menu/menu.admin.controller.php index 57a3060c0..76f453f33 100644 --- a/modules/menu/menu.admin.controller.php +++ b/modules/menu/menu.admin.controller.php @@ -334,9 +334,12 @@ if(is_array($result)) { + $i = 0; foreach($result AS $key=>$node) { - $this->_recursiveMoveMenuItem($node); + $this->moveMenuItem($this->menuSrl, 0, $i, $node->node, 'move'); //move parent node + $this->_recursiveMoveMenuItem($node); //move child node + $i = $node->node; } } From a9660e3fe307c1c92a6c55d6efd4df7e85e36c21 Mon Sep 17 00:00:00 2001 From: ngleader Date: Thu, 22 Sep 2011 08:36:51 +0000 Subject: [PATCH 0815/1372] Fixed some bugs in TemplateHandler class git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9274 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/template/TemplateHandler.class.php | 30 +++++++++++-------- .../template/TemplateHandlerTest.class.php | 28 ++++++++++++++--- 2 files changed, 41 insertions(+), 17 deletions(-) diff --git a/classes/template/TemplateHandler.class.php b/classes/template/TemplateHandler.class.php index bc0c062c9..88a6dbe8b 100644 --- a/classes/template/TemplateHandler.class.php +++ b/classes/template/TemplateHandler.class.php @@ -389,15 +389,18 @@ if($cmd == 'import') $cmd = 'load'; } - $isRemoteFile = !!preg_match('@^https?://@i', $attr['target']); - - if(!$isRemoteFile && !preg_match('@^\.?/@',$attr['target'])) $attr['target'] = './'.$attr['target']; - $metafile = ''; $pathinfo = pathinfo($attr['target']); - $relativeDir = $this->_getRelativeDir($pathinfo['dirname']); - if(!$isRemoteFile) $attr['target'] = $relativeDir.'/'.$pathinfo['basename']; + $isRemoteFile = !!preg_match('@^https?://@i', $attr['target']); + + if(!$isRemoteFile) { + if(!preg_match('@^\.?/@',$attr['target'])) $attr['target'] = './'.$attr['target']; + + $relativeDir = $this->_getRelativeDir($pathinfo['dirname']); + + $attr['target'] = $relativeDir.'/'.$pathinfo['basename']; + } switch($pathinfo['extension']) { @@ -411,18 +414,19 @@ } break; case 'js': - if($cmd == 'unload') { - $result = "Context::unloadFile('{$attr['target']}','{$attr['targetie']}');"; + if($cmd == 'load') { + $metafile = $attr['target']; + $result = "\$__tmp=array('{$attr['target']}','{$attr['type']}','{$attr['targetie']}','{$attr['index']}','{$attr['usecdn']}','{$attr['cdnprefix']}','{$attr['cdnversion']}');Context::loadFile(\$__tmp);unset(\$__tmp);"; } else { - $result = "\$__tmp=array('{$attr['target']}','{$attr['media']}','{$attr['targetie']}','{$attr['index']}','{$attr['usecdn']}','{$attr['cdnprefix']}','{$attr['cdnversion']}');Context::loadFile(\$__tmp);unset(\$__tmp);"; + $result = "Context::unloadFile('{$attr['target']}','{$attr['targetie']}');"; } break; case 'css': - if($cmd == 'unload') { - $result = "Context::unloadFile('{$attr['target']}','{$attr['targetie']}','{$attr['media']}');"; - } else { + if($cmd == 'load') { $metafile = $attr['target']; - $result = "\$__tmp=array('{$attr['target']}','{$attr['type']}','{$attr['targetie']}','{$attr['index']}','{$attr['usecdn']}','{$attr['cdnprefix']}','{$attr['cdnversion']}');Context::loadFile(\$__tmp);unset(\$__tmp);"; + $result = "\$__tmp=array('{$attr['target']}','{$attr['media']}','{$attr['targetie']}','{$attr['index']}','{$attr['usecdn']}','{$attr['cdnprefix']}','{$attr['cdnversion']}');Context::loadFile(\$__tmp);unset(\$__tmp);"; + } else { + $result = "Context::unloadFile('{$attr['target']}','{$attr['targetie']}','{$attr['media']}');"; } break; } diff --git a/tests/classes/template/TemplateHandlerTest.class.php b/tests/classes/template/TemplateHandlerTest.class.php index 7b104f335..42759109c 100644 --- a/tests/classes/template/TemplateHandlerTest.class.php +++ b/tests/classes/template/TemplateHandlerTest.class.php @@ -103,11 +103,31 @@ class TemplateHandlerTest extends PHPUnit_Framework_TestCase '
                                This is another dummy
                                ', 'compile(\'tests/classes\',\'sample.html\') ?>
                                This is another dummy
                                ' ), + // + array( + '', + '' + ), // array( '', '' ), + // + array( + '', + '' + ), + // + array( + '', + '' + ), + // + array( + '', + '' + ), // comment array( '', @@ -118,12 +138,12 @@ class TemplateHandlerTest extends PHPUnit_Framework_TestCase '', 'foo){ ?>' ), - // relative path + // relative path1 array( '', '' ), - // relative path + // relative path2 array( '', '' @@ -136,7 +156,7 @@ class TemplateHandlerTest extends PHPUnit_Framework_TestCase // issue 103 array( '', - '' + '' ), // issue 135 array( @@ -156,7 +176,7 @@ class TemplateHandlerTest extends PHPUnit_Framework_TestCase */ public function testParse($tpl, $expected) { - $tmpl = new TemplateHandler(); + $tmpl = TemplateHandler::getInstance(); $tmpl->init(dirname(__FILE__), 'sample.html'); $result = $tmpl->parse($tpl, $expected); From c32beaf35e9c55678db4ec8b496c9029d7ba50ad Mon Sep 17 00:00:00 2001 From: flyskyko Date: Thu, 22 Sep 2011 08:45:48 +0000 Subject: [PATCH 0816/1372] fix merge error git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9275 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/member/member.controller.php | 1982 +------------------------- 1 file changed, 20 insertions(+), 1962 deletions(-) diff --git a/modules/member/member.controller.php b/modules/member/member.controller.php index babb0683c..dafd41eef 100644 --- a/modules/member/member.controller.php +++ b/modules/member/member.controller.php @@ -1,9 +1,8 @@ -<<<<<<< .working begin($user_id); + $auth_request = $consumer->begin($user_id); $auth_request->addExtensionArg('sreg', 'required', 'email'); $auth_request->addExtensionArg('sreg', 'optional', 'dob'); if(!$auth_request) @@ -185,7 +184,7 @@ $assoc_member_info = $member_info; } } - + $user_id_candidates = $this->getLegacyUserIDsFromOpenID($openid_identity); $default_user_id = $user_id_candidates[0]; @@ -197,7 +196,7 @@ foreach($user_id_candidates as $user_id) { $args->user_id = $args->nick_name = $user_id; // Get basic information - $args->email_address = $sreg['email']; + $args->email_address = $sreg['email']; $args->user_name = $sreg['fullname']; if(!$args->user_name) list($args->user_name) = explode('@', $args->email_address); $args->birthday = str_replace('-','',$sreg['dob']); @@ -472,7 +471,7 @@ $oMemberModel = &getModel ('member'); $config = $oMemberModel->getMemberConfig (); - // call a trigger (before) + // call a trigger (before) $trigger_output = ModuleHandler::triggerCall ('member.procMemberInsert', 'before', $config); if (!$trigger_output->toBool ()) return $trigger_output; // Check if an administrator allows a membership @@ -656,7 +655,7 @@ // Verify the cuttent password if(!$oMemberModel->isValidPassword($member_info->password, $current_password)) return new Object(-1, 'invalid_password'); - // Check if a new password is as same as the previous password + // Check if a new password is as same as the previous password if ($current_password == $password) return new Object(-1, 'invalid_new_password'); // Execute insert or update depending on the value of member_srl @@ -675,7 +674,7 @@ } /** - * @brief Membership withdrawal + * @brief Membership withdrawal **/ function procMemberLeave() { if(!Context::get('is_logged')) return $this->stop('msg_not_logged'); @@ -940,7 +939,7 @@ } /** - * @brief Find ID/Password + * @brief Find ID/Password **/ function procMemberFindAccount() { $email_address = Context::get('email_address'); @@ -1030,7 +1029,7 @@ // Update to a temporary password and set change_password_date to 1 $args->member_srl = $member_srl; - list($usec, $sec) = explode(" ", microtime()); + list($usec, $sec) = explode(" ", microtime()); $temp_password = substr(md5($user_id . $member_info->find_account_answer. $usec . $sec),0,15); $args->password = $temp_password; @@ -1089,7 +1088,7 @@ $oMemberModel = &getModel('member'); // Get information of the member $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); - // Check if the member is set to allow a request to re-send an authentication mail + // Check if the member is set to allow a request to re-send an authentication mail if ($member_info->denied != 'Y') return new Object(-1, 'msg_invalid_request'); @@ -1290,7 +1289,7 @@ } /** - * @brief Add group_srl to member_srl + * @brief Add group_srl to member_srl **/ function addMemberToGroup($member_srl,$group_srl,$site_srl=0) { $args->member_srl = $member_srl; @@ -1345,7 +1344,7 @@ function doAutologin() { // Get a key value of auto log-in $args->autologin_key = $_COOKIE['xeak']; - // Get information of the key + // Get information of the key $output = executeQuery('member.getAutologin', $args); // If no information exists, delete a cookie if(!$output->toBool() || !$output->data) { @@ -1386,8 +1385,8 @@ $do_auto_login = true; } } - - + + if($do_auto_login) { $output = $this->doLogin($user_id); } else { @@ -1584,10 +1583,14 @@ // Insert data into the DB $args->member_srl = getNextSequence(); $args->list_order = -1 * $args->member_srl; + $args->nick_name = htmlspecialchars($args->nick_name); + $args->homepage = htmlspecialchars($args->homepage); + $args->blog = htmlspecialchars($args->blog); + if($args->password && !$password_is_hashed) $args->password = md5($args->password); elseif(!$args->password) unset($args->password); - if (!$args->user_id) $args->user_id = 't'.$args->member_srl; + if (!$args->user_id) $args->user_id = 't'.$args->member_srl; if (!$args->user_name) $args->user_name = $args->member_srl; $output = executeQuery('member.insertMember', $args); @@ -1877,1949 +1880,4 @@ } } } -?> -======= -doLogin($user_id, $password, $keep_signed=='Y'?true:false); - - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('member'); - if($config->after_login_url) $this->setRedirectUrl($config->after_login_url); - - // 설정된 change_password_date 확인 - $limit_date = $config->change_password_date; - - // change_password_date가 설정되어 있으면 확인 - if ($limit_date > 0) { - $oMemberModel = &getModel('member'); - $member_info = $oMemberModel->getMemberInfoByUserID($user_id); - if ($member_info->change_password_date < date ('YmdHis', strtotime ('-' . $limit_date . ' day'))) { - $this->setRedirectUrl(getNotEncodedUrl('','vid',Context::get('vid'),'mid',Context::get('mid'),'act','dispMemberModifyPassword')); - } - } - - $redirect_url = Context::get('redirect_url'); - if ($output->toBool () && Context::getRequestMethod () == "POST" && $redirect_url) { - header ("location:" . $redirect_url); - } - - return $output; - } - - /** - * @brief openid로그인 - **/ - function procMemberOpenIDLogin($validator = "procMemberOpenIDValidate") { - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('member'); - if($config->enable_openid != 'Y') $this->stop('msg_invalid_request'); - - if(!defined('Auth_OpenID_RAND_SOURCE') && !file_exists("/dev/urandom")) - { - define('Auth_OpenID_RAND_SOURCE', null); - } - - set_include_path(_XE_PATH_."modules/member/php-openid-1.2.3"); - require_once('Auth/OpenID.php'); - require_once('Auth/OpenID/Consumer.php'); - require_once('Auth/OpenID/XEStore.php'); - $store = new Auth_OpenID_XEStore(); - $consumer = new Auth_OpenID_Consumer($store); - - $user_id = Context::get('user_id'); - if (!$user_id) $user_id = Context::get('openid'); - $auth_request = $consumer->begin($user_id); - $auth_request->addExtensionArg('sreg', 'required', 'email'); - $auth_request->addExtensionArg('sreg', 'optional', 'dob'); - if(!$auth_request) - { - return new Object(-1, "association failed"); - } - - $trust_root = 'http://'.$_SERVER["HTTP_HOST"]; - $referer_url = Context::get('referer_url'); - if (!$referer_url) $referer_url = $_SERVER['HTTP_REFERER']; - if (!$referer_url) - $referer_url = htmlspecialchars_decode(getRequestUri(RELEASE_SSL)); - $goto = urlencode($referer_url); - $ApprovedURL = Context::getRequestUri(RELEASE_SSL) . "?module=member&act=" . $validator. "&goto=" . $goto; - $redirect_url = $auth_request->redirectURL($trust_root, $ApprovedURL); - $this->add("redirect_url", $redirect_url); - if (Context::getRequestMethod() == 'POST') - header("location:" . $redirect_url); - } - - function getLegacyUserIDsFromOpenID($openid_identity) { - // Issue 17515512: workaround - $result = array(); - $uri_matches = array(); - preg_match(Auth_OpenID_getURIPattern(), $openid_identity, $uri_matches); - - if (count($uri_matches) < 9) { - for ($i = count($uri_matches); $i <= 9; $i++) { - $uri_matches[] = ''; - } - } - - $scheme = $uri_matches[2]; - $authority = $uri_matches[4]; - $path = $uri_matches[5]; - $query = $uri_matches[6]; - $fragment = $uri_matches[8]; - - if ($scheme === null) $scheme = ''; - if ($authority === null) $authority = ''; - if ($path === null) $path = ''; - if ($query === null) $query = ''; - if ($fragment === null) $fragment = ''; - - if ($scheme == 'http' or $scheme == '') - $scheme_part = ''; - else - $scheme_part = $scheme."://"; - - - if ($path == '' || $path == '/') { - $result[] = $scheme_part.$authority.''.$query.$fragment; - $result[] = $scheme_part.$authority.'/'.$query.$fragment; - } - else { - $result[] = $scheme_part.$authority.$path.$query.$fragment; - } - - return $result; - } - - /** - * @brief openid 인증 체크 - **/ - function procMemberOpenIDValidate() { - set_include_path(_XE_PATH_."modules/member/php-openid-1.2.3"); - require_once('Auth/OpenID.php'); - require_once('Auth/OpenID/Consumer.php'); - require_once('Auth/OpenID/XEStore.php'); - require_once('Auth/OpenID/URINorm.php'); - - $store = new Auth_OpenID_XEStore(); - $consumer = new Auth_OpenID_Consumer($store); - $response = $consumer->complete($_GET); - switch($response->status) { - case Auth_OpenID_CANCEL : - // 사용자가 인증을 취소했을 때의 처리 - return $this->stop('authorization_canceled'); - case Auth_OpenID_FAILURE : - // 무언가의 문제로 인해 인증이 실패했을 때의 처리(인증을 요구한 openid가 없다든가..) - return $this->stop('invalid_authorization'); - case Auth_OpenID_SUCCESS : - // 인증성공!! - break; - default: - return $this->stop('invalid_authorization'); - } - - // 인증 성공 - $oMemberModel = &getModel('member'); - - // 이 오픈아이디와 연결된 (또는 연결되어 있을 가능성이 있는) 제로보드 아이디들을 받아온다. - $login_success = false; - $assoc_member_info = null; - $openid_identity = $response->signed_args["openid.identity"]; - $args->openid = $openid_identity; - $output = executeQuery('member.getMemberSrlByOpenID', $args); - - if ($output->toBool() && $output->data && !is_array($output->data)) { - $member_srl = $output->data->member_srl; - $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); - if ($member_info) { - $assoc_member_info = $member_info; - } - } - - $user_id_candidates = $this->getLegacyUserIDsFromOpenID($openid_identity); - $default_user_id = $user_id_candidates[0]; - - if ($assoc_member_info != null) { - $user_id_candidates = array_merge(array($assoc_member_info->user_id), $user_id_candidates); - } - $sreg = $response->extensionResponse('sreg'); - - foreach($user_id_candidates as $user_id) { - $args->user_id = $args->nick_name = $user_id; - // 기본 정보들을 받음 - $args->email_address = $sreg['email']; - $args->user_name = $sreg['fullname']; - if(!$args->user_name) list($args->user_name) = explode('@', $args->email_address); - $args->birthday = str_replace('-','',$sreg['dob']); - - // 자체 인증 시도 - $output = $this->doLogin($args->user_id); - - if ($output->toBool()) { - if ($assoc_member_info == null) { - $logged_info = Context::get('logged_info'); - $args->member_srl = $logged_info->member_srl; - $args->openid = $openid_identity; - executeQuery('member.addOpenIDToMember', $args); - } - $login_success = true; - break; - } - } - - // 자체 인증 실패시 회원 가입시킴 - if(!$login_success) { - $args->user_id = $args->nick_name = $default_user_id; - $args->password = md5(getmicrotime()); - - $output = $this->insertMember($args); - if(!$output->toBool()) return $this->stop($output->getMessage()); - $output = $this->doLogin($args->user_id); - if(!$output->toBool()) return $this->stop($output->getMessage()); - - $logged_info = Context::get('logged_info'); - $args->member_srl = $logged_info->member_srl; - $args->openid = $openid_identity; - executeQuery('member.addOpenIDToMember', $args); - } - - Context::close(); - - // 페이지 이동 - if(Context::get('goto')) { - $goto = Context::get('goto'); - header("location:" . $goto); - } else { - header("location:./"); - } - - exit(); - } - - /** - * @brief 오픈아이디 연결 요청 - **/ - function procMemberAddOpenIDToMember() { - return $this->procMemberOpenIDLogin("procMemberValidateAddOpenIDToMember"); - } - - /** - * @brief 오픈아이디 연결 요청 마무리 - **/ - function procMemberValidateAddOpenIDToMember() { - set_include_path(_XE_PATH_."modules/member/php-openid-1.2.3"); - require_once('Auth/OpenID.php'); - require_once('Auth/OpenID/Consumer.php'); - require_once('Auth/OpenID/XEStore.php'); - require_once('Auth/OpenID/URINorm.php'); - - $store = new Auth_OpenID_XEStore(); - $consumer = new Auth_OpenID_Consumer($store); - $response = $consumer->complete($_GET); - - switch($response->status) { - case Auth_OpenID_CANCEL : - // 사용자가 인증을 취소했을 때의 처리 - return $this->stop('authorization_canceled'); - case Auth_OpenID_FAILURE : - // 무언가의 문제로 인해 인증이 실패했을 때의 처리(인증을 요구한 openid가 없다든가..) - return $this->stop('invalid_authorization'); - case Auth_OpenID_SUCCESS : - { - $logged_info = Context::get('logged_info'); - if (!Context::get('is_logged')) return $this->stop('msg_not_logged'); - - $member_srl = $logged_info->member_srl; - - $args->member_srl = $member_srl; - $openid_identity = $response->signed_args["openid.identity"]; - $args->openid = $openid_identity; - - $output = executeQuery('member.addOpenIDToMember', $args); - if (!$output->toBool()) return $output; - - Context::close(); - - if(Context::get('goto')){ - $goto = Context::get('goto'); - header("location:" . $goto); - }else{ - header("location:./"); - } - exit(); - } - // 인증성공!! - break; - default: - return $this->stop('invalid_authorization'); - } - } - - /** - * @brief 오픈아이디 연결 해제 - **/ - function procMemberDeleteOpenIDFromMember() { - $logged_info = Context::get('logged_info'); - $openid_identity = Context::get('openid_to_delete'); - $arg->openid = $openid_identity; - $result = executeQuery('member.getMemberSrlByOpenID', $arg); - - if (!Context::get('is_logged')) { - $this->setError(-1); - $this->setMessage('msg_not_logged'); - return; - } else if (!$result->data || is_array($result->data)) { - $this->setError(-1); - $this->setMessage('msg_not_founded'); - return; - } else if ($result->data->member_srl != $logged_info->member_srl) { - $this->setError(-1); - $this->setMessage('msg_not_permitted'); - return; - } - - $arg->openid = $openid_identity; - - $output = executeQuery('member.deleteMemberOpenID', $arg); - if(!$output->toBool()) return $output; - - $this->setMessage('success_updated'); - } - - - /** - * @brief 로그아웃 - **/ - function procMemberLogout() { - // 로그아웃 이전에 trigger 호출 (before) - $logged_info = Context::get('logged_info'); - $trigger_output = ModuleHandler::triggerCall('member.doLogout', 'before', $logged_info); - if(!$trigger_output->toBool()) return $trigger_output; - - // 세션 정보 파기 - $this->destroySessionInfo(); - - // 로그아웃 이후 trigger 호출 (after) - $trigger_output = ModuleHandler::triggerCall('member.doLogout', 'after', $logged_info); - if(!$trigger_output->toBool()) return $trigger_output; - - $output = new Object(); - - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('member'); - if($config->after_logout_url) Context::set('redirect_url', $config->after_logout_url); - - return $output; - } - - /** - * @brief 스크랩 기능 - **/ - function procMemberScrapDocument() { - // 로그인 정보 체크 - if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); - $logged_info = Context::get('logged_info'); - - $document_srl = (int)Context::get('document_srl'); - if(!$document_srl) $document_srl = (int)Context::get('target_srl'); - if(!$document_srl) return new Object(-1,'msg_invalid_request'); - - // 문서 가져오기 - $oDocumentModel = &getModel('document'); - $oDocument = $oDocumentModel->getDocument($document_srl); - - // 변수 정리 - $args->document_srl = $document_srl; - $args->member_srl = $logged_info->member_srl; - $args->user_id = $oDocument->get('user_id'); - $args->user_name = $oDocument->get('user_name'); - $args->nick_name = $oDocument->get('nick_name'); - $args->target_member_srl = $oDocument->get('member_srl'); - $args->title = $oDocument->get('title'); - - // 있는지 조사 - $output = executeQuery('member.getScrapDocument', $args); - if($output->data->count) return new Object(-1, 'msg_alreay_scrapped'); - - // 입력 - $output = executeQuery('member.addScrapDocument', $args); - if(!$output->toBool()) return $output; - - $this->setError(-1); - $this->setMessage('success_registed'); - } - - /** - * @brief 스크랩 삭제 - **/ - function procMemberDeleteScrap() { - // 로그인 정보 체크 - if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); - $logged_info = Context::get('logged_info'); - - $document_srl = (int)Context::get('document_srl'); - if(!$document_srl) return new Object(-1,'msg_invalid_request'); - - // 변수 정리 - $args->member_srl = $logged_info->member_srl; - $args->document_srl = $document_srl; - return executeQuery('member.deleteScrapDocument', $args); - } - - /** - * @brief 게시글 저장 - **/ - function procMemberSaveDocument() { - // 로그인 정보 체크 - if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); - - $logged_info = Context::get('logged_info'); - - // form 정보를 모두 받음 - $obj = Context::getRequestVars(); - - // 글의 대상 모듈을 회원 정보로 변경 - $obj->module_srl = $logged_info->member_srl; - unset($obj->is_notice); - - // 제목을 사용하지 않는 방명록 등에서 내용 앞 부분을 제목 가져오기 - if(!$obj->title) { - $obj->title = cut_str(strip_tags($obj->content), 20, '...'); - } - - $oDocumentModel = &getModel('document'); - $oDocumentController = &getController('document'); - - // 이미 존재하는 글인지 체크 - $oDocument = $oDocumentModel->getDocument($obj->document_srl, $this->grant->manager); - - // 이미 존재하는 경우 수정 - if($oDocument->isExists() && $oDocument->document_srl == $obj->document_srl) { - $output = $oDocumentController->updateDocument($oDocument, $obj); - $msg_code = 'success_updated'; - - // 그렇지 않으면 신규 등록 - } else { - $output = $oDocumentController->insertDocument($obj); - $msg_code = 'success_registed'; - $obj->document_srl = $output->get('document_srl'); - $oDocument = $oDocumentModel->getDocument($obj->document_srl, $this->grant->manager); - } - - // 등록된 첨부파일의 상태를 무효로 지정 - if($oDocument->hasUploadedFiles()) { - $args->upload_target_srl = $oDocument->document_srl; - $args->isvalid = 'N'; - executeQuery('file.updateFileValid', $args); - } - - $this->setMessage('success_saved'); - $this->add('document_srl', $obj->document_srl); - } - - /** - * @brief 저장된 글 삭제 - **/ - function procMemberDeleteSavedDocument() { - // 로그인 정보 체크 - if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged'); - $logged_info = Context::get('logged_info'); - - $document_srl = (int)Context::get('document_srl'); - if(!$document_srl) return new Object(-1,'msg_invalid_request'); - - // 변수 정리 - $oDocumentController = &getController('document'); - $oDocumentController->deleteDocument($document_srl, true); - } - - /** - * @brief 회원 가입시 특정 항목들에 대한 값 체크 - **/ - function procMemberCheckValue() { - $name = Context::get('name'); - $value = Context::get('value'); - if(!$value) return; - - $oMemberModel = &getModel('member'); - - // 로그인 여부 체크 - $logged_info = Context::get('logged_info'); - - - switch($name) { - case 'user_id' : - // 금지 아이디 검사 - if($oMemberModel->isDeniedID($value)) return new Object(0,'denied_user_id'); - - // 중복 검사 - $member_srl = $oMemberModel->getMemberSrlByUserID($value); - if($member_srl && $logged_info->member_srl != $member_srl ) return new Object(0,'msg_exists_user_id'); - break; - case 'nick_name' : - // 중복 검사 - $member_srl = $oMemberModel->getMemberSrlByNickName($value); - if($member_srl && $logged_info->member_srl != $member_srl ) return new Object(0,'msg_exists_nick_name'); - - break; - case 'email_address' : - // 중복 검사 - $member_srl = $oMemberModel->getMemberSrlByEmailAddress($value); - if($member_srl && $logged_info->member_srl != $member_srl ) return new Object(0,'msg_exists_email_address'); - break; - } - } - - /** - * @brief 회원 가입 - **/ - function procMemberInsert() { - if (Context::getRequestMethod () == "GET") return new Object (-1, "msg_invalid_request"); - $oMemberModel = &getModel ('member'); - $config = $oMemberModel->getMemberConfig (); - - // before 트리거 호출 - $trigger_output = ModuleHandler::triggerCall ('member.procMemberInsert', 'before', $config); - if (!$trigger_output->toBool ()) return $trigger_output; - - // 관리자가 회원가입을 허락하였는지 검사 - if ($config->enable_join != 'Y') return $this->stop ('msg_signup_disabled'); - - // 약관에 동의하였는지 검사 (약관이 있을 경우만) - if ($config->agreement && Context::get('accept_agreement')!='Y') return $this->stop('msg_accept_agreement'); - - // 필수 정보들을 미리 추출 - $args = Context::gets('user_id','user_name','nick_name','homepage','blog','birthday','email_address','password','allow_mailing','find_account_question','find_account_answer'); - $args->member_srl = getNextSequence(); - $args->list_order = -1 * $args->member_srl; - - // 넘어온 모든 변수중에서 몇가지 불필요한 것들 삭제 - $all_args = Context::getRequestVars(); - unset($all_args->module); - unset($all_args->act); - unset($all_args->is_admin); - unset($all_args->description); - unset($all_args->group_srl_list); - unset($all_args->body); - unset($all_args->accept_agreement); - unset($all_args->signature); - unset($all_args->password2); - - // 메일 인증 기능 사용시 회원 상태를 denied로 설정 - if ($config->enable_confirm == 'Y') $args->denied = 'Y'; - - // 모든 request argument에서 필수 정보만 제외 한 후 추가 데이터로 입력 - $extra_vars = delObjectVars($all_args, $args); - $args->extra_vars = serialize($extra_vars); - - // member_srl의 값에 따라 insert/update - $output = $this->insertMember($args); - if(!$output->toBool()) return $output; - - // 가상사이트일 경우 사이트 가입 - $site_module_info = Context::get('site_module_info'); - if($site_module_info->site_srl > 0) { - $default_group = $oMemberModel->getDefaultGroup($site_module_info->site_srl); - if($default_group->group_srl) { - $this->addMemberToGroup($args->member_srl, $default_group->group_srl, $site_module_info->site_srl); - } - - } - - // 로그인 시킴 - if ($config->enable_confirm != 'Y') $this->doLogin($args->user_id); - - // 결과 정리 - $this->add('member_srl', $args->member_srl); - if($config->redirect_url) $this->add('redirect_url', $config->redirect_url); - if ($config->enable_confirm == 'Y') { - $msg = sprintf(Context::getLang('msg_confirm_mail_sent'), $args->email_address); - $this->setMessage($msg); - } - else $this->setMessage('success_registed'); - - // after 트리거 호출 - $trigger_output = ModuleHandler::triggerCall('member.procMemberInsert', 'after', $config); - if(!$trigger_output->toBool()) return $trigger_output; - } - - /** - * @brief 회원 정보 수정 - **/ - function procMemberModifyInfo() { - if(!Context::get('is_logged')) return $this->stop('msg_not_logged'); - - // 필수 정보들을 미리 추출 - $args = Context::gets('user_name','nick_name','homepage','blog','birthday','email_address','allow_mailing','find_account_question','find_account_answer'); - - // 로그인 정보 - $logged_info = Context::get('logged_info'); - $args->member_srl = $logged_info->member_srl; - - // 넘어온 모든 변수중에서 몇가지 불필요한 것들 삭제 - $all_args = Context::getRequestVars(); - unset($all_args->module); - unset($all_args->act); - unset($all_args->is_admin); - unset($all_args->description); - unset($all_args->group_srl_list); - unset($all_args->body); - unset($all_args->accept_agreement); - unset($all_args->signature); - unset($all_args->_filter); - - // 모든 request argument에서 필수 정보만 제외 한 후 추가 데이터로 입력 - $extra_vars = delObjectVars($all_args, $args); - $args->extra_vars = serialize($extra_vars); - - // 멤버 모델 객체 생성 - $oMemberModel = &getModel('member'); - - // member_srl의 값에 따라 insert/update - $output = $this->updateMember($args); - if(!$output->toBool()) return $output; - - // 서명 저장 - $signature = Context::get('signature'); - $this->putSignature($args->member_srl, $signature); - - // user_id 에 따른 정보 가져옴 - $member_info = $oMemberModel->getMemberInfoByMemberSrl($args->member_srl); - - // 로그인 성공후 trigger 호출 (after) - $trigger_output = ModuleHandler::triggerCall('member.doLogin', 'after', $member_info); - if(!$trigger_output->toBool()) return $trigger_output; - - $this->setSessionInfo($member_info); - - // 결과 리턴 - $this->add('member_srl', $args->member_srl); - $this->setMessage('success_updated'); - } - - /** - * @brief 회원 비밀번호 수정 - **/ - function procMemberModifyPassword() { - if(!Context::get('is_logged')) return $this->stop('msg_not_logged'); - - // 필수 정보들을 미리 추출 - $current_password = trim(Context::get('current_password')); - $password = trim(Context::get('password')); - - // 로그인한 유저의 정보를 가져옴 - $logged_info = Context::get('logged_info'); - $member_srl = $logged_info->member_srl; - - // member model 객체 생성 - $oMemberModel = &getModel('member'); - - // member_srl 에 따른 정보 가져옴 - $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); - - // 현재 비밀번호가 맞는지 확인 - if(!$oMemberModel->isValidPassword($member_info->password, $current_password)) return new Object(-1, 'invalid_password'); - - // 이전 비밀번호와 같은지 확인 - if ($current_password == $password) return new Object(-1, 'invalid_new_password'); - - // member_srl의 값에 따라 insert/update - $args->member_srl = $member_srl; - $args->password = $password; - $output = $this->updateMemberPassword($args); - if(!$output->toBool()) return $output; - - $this->add('member_srl', $args->member_srl); - $this->setMessage('success_updated'); - } - - /** - * @brief 탈퇴 - **/ - function procMemberLeave() { - if(!Context::get('is_logged')) return $this->stop('msg_not_logged'); - - // 필수 정보들을 미리 추출 - $password = trim(Context::get('password')); - - // 로그인한 유저의 정보를 가져옴 - $logged_info = Context::get('logged_info'); - $member_srl = $logged_info->member_srl; - - // member model 객체 생성 - $oMemberModel = &getModel('member'); - - // member_srl 에 따른 정보 가져옴 - $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); - - // 현재 비밀번호가 맞는지 확인 - if(!$oMemberModel->isValidPassword($member_info->password, $password)) return new Object(-1, 'invalid_password'); - - $output = $this->deleteMember($member_srl); - if(!$output->toBool()) return $output; - - // 모든 세션 정보 파기 - $this->destroySessionInfo(); - - // 성공 메세지 리턴 - $this->setMessage('success_leaved'); - } - - /** - * @brief 오픈아이디 탈퇴 - **/ - function procMemberOpenIDLeave() { - // 비로그인 상태이면 에러 - if(!Context::get('is_logged')) return $this->stop('msg_not_logged'); - - // 현재 ip와 세션 아이피 비교 - if($_SESSION['ipaddress']!=$_SERVER['REMOTE_ADDR']) return $this->stop('msg_not_permitted'); - - // 로그인한 유저의 정보를 가져옴 - $logged_info = Context::get('logged_info'); - $member_srl = $logged_info->member_srl; - - $output = $this->deleteMember($member_srl); - if(!$output->toBool()) return $output; - - // 모든 세션 정보 파기 - $this->destroySessionInfo(); - - // 성공 메세지 리턴 - $this->setMessage('success_leaved'); - } - - /** - * @brief 프로필 이미지 추가 - **/ - function procMemberInsertProfileImage() { - // 정상적으로 업로드 된 파일인지 검사 - $file = $_FILES['profile_image']; - if(!is_uploaded_file($file['tmp_name'])) return $this->stop('msg_not_uploaded_profile_image'); - - // 회원 정보를 검사해서 회원번호가 없거나 관리자가 아니고 회원번호가 틀리면 무시 - $member_srl = Context::get('member_srl'); - if(!$member_srl) return $this->stop('msg_not_uploaded_profile_image'); - - $logged_info = Context::get('logged_info'); - if($logged_info->is_admin != 'Y' && $logged_info->member_srl != $member_srl) return $this->stop('msg_not_uploaded_profile_image'); - - // 회원 모듈 설정에서 이미지 이름 사용 금지를 하였을 경우 관리자가 아니면 return; - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('member'); - if($logged_info->is_admin != 'Y' && $config->profile_image != 'Y') return $this->stop('msg_not_uploaded_profile_image'); - - $this->insertProfileImage($member_srl, $file['tmp_name']); - - // 페이지 리프레쉬 - $this->setRefreshPage(); - } - - function insertProfileImage($member_srl, $target_file) { - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('member'); - - // 정해진 사이즈를 구함 - $max_width = $config->profile_image_max_width; - if(!$max_width) $max_width = "90"; - $max_height = $config->profile_image_max_height; - if(!$max_height) $max_height = "20"; - - // 저장할 위치 구함 - $target_path = sprintf('files/member_extra_info/profile_image/%s', getNumberingPath($member_srl)); - FileHandler::makeDir($target_path); - - // 파일 정보 구함 - list($width, $height, $type, $attrs) = @getimagesize($target_file); - if($type == 3) $ext = 'png'; - elseif($type == 2) $ext = 'jpg'; - else $ext = 'gif'; - - $target_filename = sprintf('%s%d.%s', $target_path, $member_srl, $ext); - - // 지정된 사이즈보다 크거나 gif가 아니면 변환 - if($width > $max_width || $height > $max_height || $type!=1) FileHandler::createImageFile($target_file, $target_filename, $max_width, $max_height, $ext); - else @copy($target_file, $target_filename); - } - - /** - * @brief 이미지 이름을 추가 - **/ - function procMemberInsertImageName() { - // 정상적으로 업로드 된 파일인지 검사 - $file = $_FILES['image_name']; - if(!is_uploaded_file($file['tmp_name'])) return $this->stop('msg_not_uploaded_image_name'); - - // 회원 정보를 검사해서 회원번호가 없거나 관리자가 아니고 회원번호가 틀리면 무시 - $member_srl = Context::get('member_srl'); - if(!$member_srl) return $this->stop('msg_not_uploaded_image_name'); - - $logged_info = Context::get('logged_info'); - if($logged_info->is_admin != 'Y' && $logged_info->member_srl != $member_srl) return $this->stop('msg_not_uploaded_image_name'); - - // 회원 모듈 설정에서 이미지 이름 사용 금지를 하였을 경우 관리자가 아니면 return; - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('member'); - if($logged_info->is_admin != 'Y' && $config->image_name != 'Y') return $this->stop('msg_not_uploaded_image_name'); - - $this->insertImageName($member_srl, $file['tmp_name']); - - // 페이지 리프레쉬 - $this->setRefreshPage(); - } - - function insertImageName($member_srl, $target_file) { - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('member'); - - // 정해진 사이즈를 구함 - $max_width = $config->image_name_max_width; - if(!$max_width) $max_width = "90"; - $max_height = $config->image_name_max_height; - if(!$max_height) $max_height = "20"; - - // 저장할 위치 구함 - $target_path = sprintf('files/member_extra_info/image_name/%s/', getNumberingPath($member_srl)); - FileHandler::makeDir($target_path); - - $target_filename = sprintf('%s%d.gif', $target_path, $member_srl); - - // 파일 정보 구함 - list($width, $height, $type, $attrs) = @getimagesize($target_file); - - // 지정된 사이즈보다 크거나 gif가 아니면 변환 - if($width > $max_width || $height > $max_height || $type!=1) FileHandler::createImageFile($target_file, $target_filename, $max_width, $max_height, 'gif'); - else @copy($target_file, $target_filename); - } - - /** - * @brief 프로필 이미지를 삭제 - **/ - function procMemberDeleteProfileImage() { - $member_srl = Context::get('member_srl'); - if(!$member_srl) return new Object(0,'success'); - - $logged_info = Context::get('logged_info'); - - if($logged_info->is_admin != 'Y') { - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('member'); - if($config->profile_image == 'N') return new Object(0,'success'); - } - - if($logged_info->is_admin == 'Y' || $logged_info->member_srl == $member_srl) { - $oMemberModel = &getModel('member'); - $profile_image = $oMemberModel->getProfileImage($member_srl); - FileHandler::removeFile($profile_image->file); - } - return new Object(0,'success'); - } - - /** - * @brief 이미지 이름을 삭제 - **/ - function procMemberDeleteImageName() { - $member_srl = Context::get('member_srl'); - if(!$member_srl) return new Object(0,'success'); - - $logged_info = Context::get('logged_info'); - - if($logged_info->is_admin != 'Y') { - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('member'); - if($config->image_name == 'N') return new Object(0,'success'); - } - - if($logged_info->is_admin == 'Y' || $logged_info->member_srl == $member_srl) { - $oMemberModel = &getModel('member'); - $image_name = $oMemberModel->getImageName($member_srl); - FileHandler::removeFile($image_name->file); - } - return new Object(0,'success'); - } - - /** - * @brief 이미지 마크를 추가 - **/ - function procMemberInsertImageMark() { - // 정상적으로 업로드 된 파일인지 검사 - $file = $_FILES['image_mark']; - if(!is_uploaded_file($file['tmp_name'])) return $this->stop('msg_not_uploaded_image_mark'); - - // 회원 정보를 검사해서 회원번호가 없거나 관리자가 아니고 회원번호가 틀리면 무시 - $member_srl = Context::get('member_srl'); - if(!$member_srl) return $this->stop('msg_not_uploaded_image_mark'); - - $logged_info = Context::get('logged_info'); - if($logged_info->is_admin != 'Y' && $logged_info->member_srl != $member_srl) return $this->stop('msg_not_uploaded_image_mark'); - - // 회원 모듈 설정에서 이미지 마크 사용 금지를 하였을 경우 관리자가 아니면 return; - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('member'); - if($logged_info->is_admin != 'Y' && $config->image_mark != 'Y') return $this->stop('msg_not_uploaded_image_mark'); - - $this->insertImageMark($member_srl, $file['tmp_name']); - - // 페이지 리프레쉬 - $this->setRefreshPage(); - } - - function insertImageMark($member_srl, $target_file) { - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('member'); - - // 정해진 사이즈를 구함 - $max_width = $config->image_mark_max_width; - if(!$max_width) $max_width = "20"; - $max_height = $config->image_mark_max_height; - if(!$max_height) $max_height = "20"; - - $target_path = sprintf('files/member_extra_info/image_mark/%s/', getNumberingPath($member_srl)); - FileHandler::makeDir($target_path); - - $target_filename = sprintf('%s%d.gif', $target_path, $member_srl); - - // 파일 정보 구함 - list($width, $height, $type, $attrs) = @getimagesize($target_file); - - if($width > $max_width || $height > $max_height || $type!=1) FileHandler::createImageFile($target_file, $target_filename, $max_width, $max_height, 'gif'); - else @copy($target_file, $target_filename); - - } - - /** - * @brief 이미지 마크를 삭제 - **/ - function procMemberDeleteImageMark() { - $member_srl = Context::get('member_srl'); - if(!$member_srl) return new Object(0,'success'); - - $logged_info = Context::get('logged_info'); - if($logged_info->is_admin == 'Y' || $logged_info->member_srl == $member_srl) { - $oMemberModel = &getModel('member'); - $image_mark = $oMemberModel->getImageMark($member_srl); - FileHandler::removeFile($image_mark->file); - } - return new Object(0,'success'); - } - - /** - * @brief 아이디/ 비밀번호 찾기 - **/ - function procMemberFindAccount() { - $email_address = Context::get('email_address'); - if(!$email_address) return new Object(-1, 'msg_invalid_request'); - - $oMemberModel = &getModel('member'); - $oModuleModel = &getModel('module'); - - // 메일 주소에 해당하는 회원이 있는지 검사 - $member_srl = $oMemberModel->getMemberSrlByEmailAddress($email_address); - if(!$member_srl) return new Object(-1, 'msg_email_not_exists'); - - // 회원의 정보를 가져옴 - $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); - - // 아이디/비밀번호 찾기가 가능한 상태의 회원인지 검사 - if ($member_info->denied == 'Y') { - $chk_args->member_srl = $member_info->member_srl; - $output = executeQuery('member.chkAuthMail', $chk_args); - if ($output->toBool() && $output->data->count != '0') return new Object(-1, 'msg_user_not_confirmed'); - } - - // 인증 DB에 데이터를 넣음 - $args->user_id = $member_info->user_id; - $args->member_srl = $member_info->member_srl; - $args->new_password = rand(111111,999999); - $args->auth_key = md5( rand(0,999999 ) ); - $args->is_register = 'N'; - - $output = executeQuery('member.insertAuthMail', $args); - if(!$output->toBool()) return $output; - - // 메일 내용을 구함 - Context::set('auth_args', $args); - Context::set('member_info', $member_info); - - $member_config = $oModuleModel->getModuleConfig('member'); - if(!$member_config->skin) $member_config->skin = "default"; - if(!$member_config->colorset) $member_config->colorset = "white"; - - Context::set('member_config', $member_config); - - $tpl_path = sprintf('%sskins/%s', $this->module_path, $member_config->skin); - if(!is_dir($tpl_path)) $tpl_path = sprintf('%sskins/%s', $this->module_path, 'default'); - - $find_url = getFullUrl ('', 'module', 'member', 'act', 'procMemberAuthAccount', 'member_srl', $member_info->member_srl, 'auth_key', $args->auth_key); - Context::set('find_url', $find_url); - - $oTemplate = &TemplateHandler::getInstance(); - $content = $oTemplate->compile($tpl_path, 'find_member_account_mail'); - - // 사이트 웹마스터 정보를 구함 - $oModuleModel = &getModel('module'); - $member_config = $oModuleModel->getModuleConfig('member'); - - // 메일 발송 - $oMail = new Mail(); - $oMail->setTitle( Context::getLang('msg_find_account_title') ); - $oMail->setContent($content); - $oMail->setSender( $member_config->webmaster_name?$member_config->webmaster_name:'webmaster', $member_config->webmaster_email); - $oMail->setReceiptor( $member_info->user_name, $member_info->email_address ); - $oMail->send(); - - // 메세지 return - $msg = sprintf(Context::getLang('msg_auth_mail_sent'), $member_info->email_address); - return new Object(0,$msg); - } - - - /** - * @brief 질문/답변을 통한 임시 비밀번호 생성 - **/ - function procMemberFindAccountByQuestion() { - $email_address = Context::get('email_address'); - $user_id = Context::get('user_id'); - $find_account_question = trim(Context::get('find_account_question')); - $find_account_answer = trim(Context::get('find_account_answer')); - - if(!$user_id || !$email_address || !$find_account_question || !$find_account_answer) return new Object(-1, 'msg_invalid_request'); - - $oMemberModel = &getModel('member'); - $oModuleModel = &getModel('module'); - - // 메일 주소에 해당하는 회원이 있는지 검사 - $member_srl = $oMemberModel->getMemberSrlByEmailAddress($email_address); - if(!$member_srl) return new Object(-1, 'msg_email_not_exists'); - - // 회원의 정보를 가져옴 - $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); - - // 질문 응답이 없으면 - if (!$member_info->find_account_question || !$member_info->find_account_answer) return new Object(-1, 'msg_question_not_exists'); - - if(trim($member_info->find_account_question) != $find_account_question || trim($member_info->find_account_answer) != $find_account_answer) return new Object(-1, 'msg_answer_not_matches'); - - // 임시비밀번호로 변경 및 비밀번호 변경시간을 1로 설정 - $args->member_srl = $member_srl; - list($usec, $sec) = explode(" ", microtime()); - $temp_password = substr(md5($user_id . $member_info->find_account_answer. $usec . $sec),0,15); - - $args->password = $temp_password; - $args->change_password_date = '1'; - $output = $this->updateMemberPassword($args); - if(!$output->toBool()) return $output; - - $_SESSION['xe_temp_password_'.$user_id] = $temp_password; - - $this->add('user_id',$user_id); - } - - /** - * @brief 아이디/비밀번호 찾기 기능 실행 - * 메일에 등록된 링크를 선택시 호출되는 method로 비밀번호를 바꾸고 인증을 시켜버림 - **/ - function procMemberAuthAccount() { - // user_id, authkey 검사 - $member_srl = Context::get('member_srl'); - $auth_key = Context::get('auth_key'); - if(!$member_srl || !$auth_key) return $this->stop('msg_invalid_request'); - - // user_id, authkey로 비밀번호 찾기 로그 검사 - $args->member_srl = $member_srl; - $args->auth_key = $auth_key; - $output = executeQuery('member.getAuthMail', $args); - if(!$output->toBool() || $output->data->auth_key != $auth_key) return $this->stop('msg_invalid_auth_key'); - - // 인증 정보가 맞다면 새비밀번호로 비밀번호를 바꿈 - if ($output->data->is_register == 'Y') { - $args->password = $output->data->new_password; - $args->denied = 'N'; - } else { - $args->password = md5($output->data->new_password); - unset($args->denied); - } - - // $output->data->is_register 값을 백업해 둔다. - $is_register = $output->data->is_register; - - $output = executeQuery('member.updateMemberPassword', $args); - if(!$output->toBool()) return $this->stop($output->getMessage()); - - // 인증 테이블에서 member_srl에 해당하는 모든 값을 지움 - executeQuery('member.deleteAuthMail',$args); - - // 결과를 통보 - Context::set('is_register', $is_register); - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('msg_success_authed'); - } - - /** - * @brief 아이디/비밀번호 찾기 기능 실행 - * 메일에 등록된 링크를 선택시 호출되는 method로 비밀번호를 바꾸고 인증을 시켜버림 - **/ - function procMemberUpdateAuthMail() { - $member_srl = Context::get('member_srl'); - if(!$member_srl) return new Object(-1, 'msg_invalid_request'); - - $oMemberModel = &getModel('member'); - - // 회원의 정보를 가져옴 - $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); - - // 인증메일 재발송 요청이 가능한 상태의 회원인지 검사 - if ($member_info->denied != 'Y') - return new Object(-1, 'msg_invalid_request'); - - $chk_args->member_srl = $member_srl; - $output = executeQuery('member.chkAuthMail', $chk_args); - if ($output->toBool() && $output->data->count == '0') return new Object(-1, 'msg_invalid_request'); - - // 인증 DB에 데이터를 넣음 - $auth_args->member_srl = $member_srl; - $auth_args->auth_key = md5(rand(0, 999999)); - - $output = executeQuery('member.updateAuthMail', $auth_args); - if (!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - // 메일 내용을 구함 - Context::set('auth_args', $auth_args); - Context::set('member_info', $member_info); - - $oModuleModel = &getModel('module'); - $member_config = $oModuleModel->getModuleConfig('member'); - if(!$member_config->skin) $member_config->skin = "default"; - if(!$member_config->colorset) $member_config->colorset = "white"; - - Context::set('member_config', $member_config); - - $tpl_path = sprintf('%sskins/%s', $this->module_path, $member_config->skin); - if(!is_dir($tpl_path)) $tpl_path = sprintf('%sskins/%s', $this->module_path, 'default'); - - $auth_url = getFullUrl('','module','member','act','procMemberAuthAccount','member_srl',$member_info->member_srl, 'auth_key',$auth_args->auth_key); - Context::set('auth_url', $auth_url); - - $oTemplate = &TemplateHandler::getInstance(); - $content = $oTemplate->compile($tpl_path, 'confirm_member_account_mail'); - - // 사이트 웹마스터 정보를 구함 - $oModuleModel = &getModel('module'); - $member_config = $oModuleModel->getModuleConfig('member'); - - // 메일 발송 - $oMail = new Mail(); - $oMail->setTitle( Context::getLang('msg_confirm_account_title') ); - $oMail->setContent($content); - $oMail->setSender( $member_config->webmaster_name?$member_config->webmaster_name:'webmaster', $member_config->webmaster_email); - $oMail->setReceiptor( $member_info->user_name, $member_info->email_address ); - $oMail->send(); - - // 메세지 return - $msg = sprintf(Context::getLang('msg_auth_mail_sent'), $member_info->email_address); - return new Object(-1, $msg); - } - - /** - * @brief 인증 메일 재발송 - **/ - function procMemberResendAuthMail() { - // email_address 검사 - $email_address = Context::get('email_address'); - if(!$email_address) return $this->stop('msg_invalid_request'); - - // email_address로 비밀번호 찾기 로그 검사 - $oMemberModel = &getModel('member'); - - $args->email_address = $email_address; - $member_info = $oMemberModel->getMemberSrlByEmailAddress($email_address); - if(!$member_info) return $this->stop('msg_not_exists_member'); - - $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_info); - - // 이전에 인증 메일을 보냈는지 확인 - $chk_args->member_srl = $member_info->member_srl; - $output = executeQuery('member.chkAuthMail', $chk_args); - if($output->toBool() && $output->data->count == '0') return new Object(-1, 'msg_invalid_request'); - - $auth_args->member_srl = $member_info->member_srl; - $output = executeQueryArray('member.getAuthMailInfo', $auth_args); - if(!$output->data || !$output->data[0]->auth_key) return new Object(-1, 'msg_invalid_request'); - $auth_info = $output->data[0]; - - // 메일 내용을 구함 - Context::set('member_info', $member_info); - $oModuleModel = &getModel('module'); - $member_config = $oModuleModel->getModuleConfig('member'); - if(!$member_config->skin) $member_config->skin = "default"; - if(!$member_config->colorset) $member_config->colorset = "white"; - - Context::set('member_config', $member_config); - - $tpl_path = sprintf('%sskins/%s', $this->module_path, $member_config->skin); - if(!is_dir($tpl_path)) $tpl_path = sprintf('%sskins/%s', $this->module_path, 'default'); - - $auth_url = getFullUrl('','module','member','act','procMemberAuthAccount','member_srl',$member_info->member_srl, 'auth_key',$auth_info->auth_key); - Context::set('auth_url', $auth_url); - - $oTemplate = &TemplateHandler::getInstance(); - $content = $oTemplate->compile($tpl_path, 'confirm_member_account_mail'); - - // 사이트 웹마스터 정보를 구함 - $oModuleModel = &getModel('module'); - $member_config = $oModuleModel->getModuleConfig('member'); - - // 메일 발송 - $oMail = new Mail(); - $oMail->setTitle( Context::getLang('msg_confirm_account_title') ); - $oMail->setContent($content); - $oMail->setSender( $member_config->webmaster_name?$member_config->webmaster_name:'webmaster', $member_config->webmaster_email); - $oMail->setReceiptor( $args->user_name, $args->email_address ); - $oMail->send(); - - $msg = sprintf(Context::getLang('msg_confirm_mail_sent'), $args->email_address); - $this->setMessage($msg); - } - - /** - * @brief 가상 사이트 가입 - **/ - function procModuleSiteSignUp() { - $site_module_info = Context::get('site_module_info'); - $logged_info = Context::get('logged_info'); - if(!$site_module_info->site_srl || !Context::get('is_logged') || count($logged_info->group_srl_list) ) return new Object(-1,'msg_invalid_request'); - - $oMemberModel = &getModel('member'); - $default_group = $oMemberModel->getDefaultGroup($site_module_info->site_srl); - $this->addMemberToGroup($logged_info->member_srl, $default_group->group_srl, $site_module_info->site_srl); - $groups[$default_group->group_srl] = $default_group->title; - $logged_info->group_list = $groups; - } - - /** - * @brief 가상 사이트 탈퇴 - **/ - function procModuleSiteLeave() { - $site_module_info = Context::get('site_module_info'); - $logged_info = Context::get('logged_info'); - if(!$site_module_info->site_srl || !Context::get('is_logged') || count($logged_info->group_srl_list) ) return new Object(-1,'msg_invalid_request'); - - $args->site_srl= $site_module_info->site_srl; - $args->member_srl = $logged_info->member_srl; - $output = executeQuery('member.deleteMembersGroup', $args); - if(!$output->toBool()) return $output; - $this->setMessage('success_deleted'); - } - - /** - * @brief 회원 설정 정보를 저장 - **/ - function setMemberConfig($args) { - if(!$args->skin) $args->skin = "default"; - if(!$args->colorset) $args->colorset = "white"; - if(!$args->editor_skin) $args->editor_skin= "xpresseditor"; - if(!$args->editor_colorset) $args->editor_colorset = "white"; - if($args->enable_join!='Y') $args->enable_join = 'N'; - if($args->enable_openid!='Y') $args->enable_openid= 'N'; - if($args->profile_image !='Y') $args->profile_image = 'N'; - if($args->image_name!='Y') $args->image_name = 'N'; - if($args->image_mark!='Y') $args->image_mark = 'N'; - if($args->group_image_mark!='Y') $args->group_image_mark = 'N'; - if(!trim(strip_tags($args->agreement))) $args->agreement = null; - $args->limit_day = (int)$args->limit_day; - - $agreement = trim($args->agreement); - unset($args->agreement); - - $oModuleController = &getController('module'); - $output = $oModuleController->insertModuleConfig('member',$args); - if(!$output->toBool()) return $output; - - $agreement_file = _XE_PATH_.'files/member_extra_info/agreement.txt'; - FileHandler::writeFile($agreement_file, $agreement); - - return new Object(); - } - - /** - * @brief 서명을 파일로 저장 - **/ - function putSignature($member_srl, $signature) { - $signature = trim(removeHackTag($signature)); - $signature = preg_replace('/<(\/?)(embed|object|param)/is', '<$1$2', $signature); - - $check_signature = trim(str_replace(array(' ',"\n","\r"),'',strip_tags($signature,''))); - $path = sprintf('files/member_extra_info/signature/%s/', getNumberingPath($member_srl)); - $filename = sprintf('%s%d.signature.php', $path, $member_srl); - - if(!$check_signature) return FileHandler::removeFile($filename); - - $buff = sprintf('%s', $signature); - FileHandler::makeDir($path); - FileHandler::writeFile($filename, $buff); - } - - /** - * @brief 서명 파일 삭제 - **/ - function delSignature($member_srl) { - $filename = sprintf('files/member_extra_info/signature/%s%d.gif', getNumberingPath($member_srl), $member_srl); - FileHandler::removeFile($filename); - } - - /** - * @brief member_srl에 group_srl을 추가 - **/ - function addMemberToGroup($member_srl,$group_srl,$site_srl=0) { - $args->member_srl = $member_srl; - $args->group_srl = $group_srl; - if($site_srl) $args->site_srl = $site_srl; - - $oModel =& getModel('member'); - $groups = $oModel->getMemberGroups($member_srl, $site_srl, true); - if($groups[$group_srl]) return new Object(); - - // 추가 - $output = executeQuery('member.addMemberToGroup',$args); - $output2 = ModuleHandler::triggerCall('member.addMemberToGroup', 'after', $args); - - return $output; - } - - /** - * @brief 특정 회원들의 그룹을 일괄 변경 - * 가상 사이트와 같이 한 회원이 하나의 그룹만 가질 경우 사용할 수 있음 - **/ - function replaceMemberGroup($args) { - $obj->site_srl = $args->site_srl; - $obj->member_srl = implode(',',$args->member_srl); - - $output = executeQueryArray('member.getMembersGroup', $obj); - if($output->data) foreach($output->data as $key => $val) $date[$val->member_srl] = $val->regdate; - - $output = executeQuery('member.deleteMembersGroup', $obj); - if(!$output->toBool()) return $output; - - $inserted_members = array(); - foreach($args->member_srl as $key => $val) { - if($inserted_members[$val]) continue; - $inserted_members[$val] = true; - - unset($obj); - $obj->member_srl = $val; - $obj->group_srl = $args->group_srl; - $obj->site_srl = $args->site_srl; - $obj->regdate = $date[$obj->member_srl]; - $output = executeQuery('member.addMemberToGroup', $obj); - if(!$output->toBool()) return $output; - } - return new Object(); - } - - - /** - * @brief 자동 로그인 시킴 - **/ - function doAutologin() { - // 자동 로그인 키 값을 구함 - $args->autologin_key = $_COOKIE['xeak']; - - // 키값에 해당하는 정보 구함 - $output = executeQuery('member.getAutologin', $args); - - // 정보가 없으면 쿠키 삭제 - if(!$output->toBool() || !$output->data) { - setCookie('xeak',null,time()+60*60*24*365, '/'); - return; - } - - $user_id = $output->data->user_id; - $password = $output->data->password; - if(!$user_id || !$password) { - setCookie('xeak',null,time()+60*60*24*365, '/'); - return; - } - - $do_auto_login = false; - - // 정보를 바탕으로 키값 비교 - $key = md5($user_id.$password.$_SERVER['REMOTE_ADDR']); - - if($key == $args->autologin_key) { - - // 설정된 change_password_date 확인 - $oModuleModel = &getModel('module'); - $member_config = $oModuleModel->getModuleConfig('member'); - $limit_date = $member_config->change_password_date; - - // change_password_date가 설정되어 있으면 확인 - if($limit_date > 0) { - $oMemberModel = &getModel('member'); - $member_info = $oMemberModel->getMemberInfoByUserID($user_id); - - if($member_info->change_password_date >= date('YmdHis', strtotime('-'.$limit_date.' day')) ){ - $do_auto_login = true; - } - - } else { - $do_auto_login = true; - } - } - - - if($do_auto_login) { - $output = $this->doLogin($user_id); - } else { - executeQuery('member.deleteAutologin', $args); - setCookie('xeak',null,time()+60*60*24*365, '/'); - } - } - - /** - * @brief 로그인 시킴 - **/ - function doLogin($user_id, $password = '', $keep_signed = false) { - $user_id = strtolower($user_id); - - // 로그인 이전에 trigger 호출 (before) - $trigger_obj->user_id = $user_id; - $trigger_obj->password = $password; - $trigger_output = ModuleHandler::triggerCall('member.doLogin', 'before', $trigger_obj); - if(!$trigger_output->toBool()) return $trigger_output; - - // member model 객체 생성 - $oMemberModel = &getModel('member'); - - // user_id 에 따른 정보 가져옴 - $member_info = $oMemberModel->getMemberInfoByUserID($user_id); - - // return 값이 없으면 존재하지 않는 사용자로 지정 - if(!$user_id || strtolower($member_info->user_id) != strtolower($user_id)) return new Object(-1, 'invalid_user_id'); - - // 비밀번호 검사 - if($password && !$oMemberModel->isValidPassword($member_info->password, $password)) return new Object(-1, 'invalid_password'); - - // denied == 'Y' 이면 알림 - if($member_info->denied == 'Y') { - $args->member_srl = $member_info->member_srl; - $output = executeQuery('member.chkAuthMail', $args); - if ($output->toBool() && $output->data->count != '0') return new Object(-1,'msg_user_not_confirmed'); - return new Object(-1,'msg_user_denied'); - } - - // denied_date가 현 시간보다 적으면 알림 - if($member_info->limit_date && substr($member_info->limit_date,0,8) >= date("Ymd")) return new Object(-1,sprintf(Context::getLang('msg_user_limited'),zdate($member_info->limit_date,"Y-m-d"))); - - // 사용자 정보의 최근 로그인 시간을 기록 - $args->member_srl = $member_info->member_srl; - $output = executeQuery('member.updateLastLogin', $args); - - // 로그인 성공후 trigger 호출 (after) - $trigger_output = ModuleHandler::triggerCall('member.doLogin', 'after', $member_info); - if(!$trigger_output->toBool()) return $trigger_output; - - // 자동 로그인 사용시 정보 처리 - if($keep_signed) { - // 자동 로그인 키 생성 - $autologin_args->autologin_key = md5(strtolower($user_id).$member_info->password.$_SERVER['REMOTE_ADDR']); - $autologin_args->member_srl = $member_info->member_srl; - executeQuery('member.deleteAutologin', $autologin_args); - $autologin_output = executeQuery('member.insertAutologin', $autologin_args); - if($autologin_output->toBool()) setCookie('xeak',$autologin_args->autologin_key, time()+60*60*24*365, '/'); - } - - $this->setSessionInfo($member_info); - - return $output; - } - - /** - * @brief 세션 정보 갱싱 또는 생성 - **/ - function setSessionInfo($member_info = null) { - $oMemberModel = &getModel('member'); - - // 사용자 정보가 넘어오지 않았다면 현재 세션 정보에서 사용자 정보를 추출 - if(!$member_info && $_SESSION['member_srl'] && $oMemberModel->isLogged() ) { - $member_info = $oMemberModel->getMemberInfoByMemberSrl($_SESSION['member_srl']); - - // 회원정보가 없다면 세션 파기 - if($member_info->member_srl != $_SESSION['member_srl']) { - $this->destroySessionInfo(); - return; - } - } - - // 사용중지 아이디이면 세션 파기 - if($member_info->denied=='Y') { - $this->destroySessionInfo(); - return; - } - - // 오픈아이디인지 체크 (일단 아이디 형식으로만 결정) - if(preg_match("/^([_0-9a-zA-Z]+)$/is", $member_info->user_id)) $member_info->is_openid = false; - else $member_info->is_openid = true; - - // 로그인 처리를 위한 세션 설정 - $_SESSION['is_logged'] = true; - $_SESSION['ipaddress'] = $_SERVER['REMOTE_ADDR']; - $_SESSION['member_srl'] = $member_info->member_srl; - $_SESSION['is_admin'] = ''; - - // 비밀번호는 세션에 저장되지 않도록 지워줌;; - //unset($member_info->password); - - // 사용자 그룹 설정 - /* - if($member_info->group_list) { - $group_srl_list = array_keys($member_info->group_list); - $_SESSION['group_srls'] = $group_srl_list; - - // 관리자 그룹일 경우 관리자로 지정 - $oMemberModel = &getModel('member'); - $admin_group = $oMemberModel->getAdminGroup(); - if($admin_group->group_srl && in_array($admin_group->group_srl, $group_srl_list)) $_SESSION['is_admin'] = 'Y'; - } - */ - - // 세션에 로그인 사용자 정보 저장 - $_SESSION['logged_info'] = $member_info; - Context::set('is_logged', true); - Context::set('logged_info', $member_info); - - // 사용자의 전용 메뉴 구성 (이 메뉴는 애드온등으로 변경될 수 있음) - $this->addMemberMenu( 'dispMemberInfo', 'cmd_view_member_info'); - $this->addMemberMenu( 'dispMemberScrappedDocument', 'cmd_view_scrapped_document'); - $this->addMemberMenu( 'dispMemberSavedDocument', 'cmd_view_saved_document'); - $this->addMemberMenu( 'dispMemberOwnDocument', 'cmd_view_own_document'); - } - - /** - * @brief 로그인한 사용자의 개인화된 메뉴 제공을 위한 method - * 로그인 정보 출력 위젯 또는 개인화 페이지에서 사용됨 - **/ - function addMemberMenu($act, $str) { - $logged_info = Context::get('logged_info'); - - $logged_info->menu_list[$act] = Context::getLang($str); - - Context::set('logged_info', $logged_info); - $_SESSION['logged_info'] = $logged_info; - } - - /** - * @brief 로그인 회원의 닉네임등을 클릭할때 나타나는 팝업 메뉴를 추가하는 method - **/ - function addMemberPopupMenu($url, $str, $icon = '', $target = 'self') { - $member_popup_menu_list = Context::get('member_popup_menu_list'); - if(!is_array($member_popup_menu_list)) $member_popup_menu_list = array(); - - $obj->url = $url; - $obj->str = $str; - $obj->icon = $icon; - $obj->target = $target; - $member_popup_menu_list[] = $obj; - - Context::set('member_popup_menu_list', $member_popup_menu_list); - } - - /** - * @brief member 테이블에 사용자 추가 - **/ - function insertMember(&$args, $password_is_hashed = false) { - // trigger 호출 (before) - $output = ModuleHandler::triggerCall('member.insertMember', 'before', $args); - if(!$output->toBool()) return $output; - - // 멤버 설정 정보에서 가입약관 부분을 재확인 - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('member'); - - $logged_info = Context::get('logged_info'); - - // 임시 제한 일자가 있을 경우 제한 일자에 내용 추가 - if($config->limit_day) $args->limit_date = date("YmdHis", time()+$config->limit_day*60*60*24); - - // 입력할 사용자의 아이디를 소문자로 변경 - $args->user_id = strtolower($args->user_id); - - // 필수 변수들의 조절 - if($args->allow_mailing!='Y') $args->allow_mailing = 'N'; - if($args->denied!='Y') $args->denied = 'N'; - $args->allow_message= 'Y'; - - if($logged_info->is_admin == 'Y') { - if($args->is_admin!='Y') $args->is_admin = 'N'; - } else { - unset($args->is_admin); - } - - list($args->email_id, $args->email_host) = explode('@', $args->email_address); - - // 홈페이지, 블로그의 주소 검사 - if($args->homepage && !preg_match("/^[a-z]+:\/\//i",$args->homepage)) $args->homepage = 'http://'.$args->homepage; - if($args->blog && !preg_match("/^[a-z]+:\/\//i",$args->blog)) $args->blog = 'http://'.$args->blog; - - // 모델 객체 생성 - $oMemberModel = &getModel('member'); - // 금지 아이디인지 체크 - if($oMemberModel->isDeniedID($args->user_id)) return new Object(-1,'denied_user_id'); - - // 아이디, 닉네임, email address 의 중복 체크 - $member_srl = $oMemberModel->getMemberSrlByUserID($args->user_id); - if($member_srl) return new Object(-1,'msg_exists_user_id'); - - $member_srl = $oMemberModel->getMemberSrlByNickName($args->nick_name); - if($member_srl) return new Object(-1,'msg_exists_nick_name'); - - $member_srl = $oMemberModel->getMemberSrlByEmailAddress($args->email_address); - if($member_srl) return new Object(-1,'msg_exists_email_address'); - - $oDB = &DB::getInstance(); - $oDB->begin(); - - // DB에 입력 - $args->member_srl = getNextSequence(); - $args->list_order = -1 * $args->member_srl; - $args->nick_name = htmlspecialchars($args->nick_name); - $args->homepage = htmlspecialchars($args->homepage); - $args->blog = htmlspecialchars($args->blog); - if($args->password && !$password_is_hashed) $args->password = md5($args->password); - elseif(!$args->password) unset($args->password); - - $output = executeQuery('member.insertMember', $args); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - // 입력된 그룹 값이 없으면 기본 그룹의 값을 등록 - if(!$args->group_srl_list) { - $default_group = $oMemberModel->getDefaultGroup(0); - - // 기본 그룹에 추가 - $output = $this->addMemberToGroup($args->member_srl,$default_group->group_srl); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - // 입력된 그룹 값이 있으면 해당 그룹의 값을 등록 - } else { - $group_srl_list = explode('|@|', $args->group_srl_list); - for($i=0;$iaddMemberToGroup($args->member_srl,$group_srl_list[$i]); - - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - } - } - - // 메일 인증 모드 사용시(가입된 회원이 denied일 때) 인증 메일 발송 - if ($args->denied == 'Y') { - // 인증 DB에 데이터를 넣음 - $auth_args->user_id = $args->user_id; - $auth_args->member_srl = $args->member_srl; - $auth_args->new_password = $args->password; - $auth_args->auth_key = md5(rand(0, 999999)); - $auth_args->is_register = 'Y'; - - $output = executeQuery('member.insertAuthMail', $auth_args); - if (!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - // 메일 내용을 구함 - Context::set('auth_args', $auth_args); - Context::set('member_info', $args); - - $member_config = $oModuleModel->getModuleConfig('member'); - if(!$member_config->skin) $member_config->skin = "default"; - if(!$member_config->colorset) $member_config->colorset = "white"; - - Context::set('member_config', $member_config); - - $tpl_path = sprintf('%sskins/%s', $this->module_path, $member_config->skin); - if(!is_dir($tpl_path)) $tpl_path = sprintf('%sskins/%s', $this->module_path, 'default'); - - $auth_url = getFullUrl('','module','member','act','procMemberAuthAccount','member_srl',$args->member_srl, 'auth_key',$auth_args->auth_key); - Context::set('auth_url', $auth_url); - - $oTemplate = &TemplateHandler::getInstance(); - $content = $oTemplate->compile($tpl_path, 'confirm_member_account_mail'); - - // 사이트 웹마스터 정보를 구함 - $oModuleModel = &getModel('module'); - $member_config = $oModuleModel->getModuleConfig('member'); - - // 메일 발송 - $oMail = new Mail(); - $oMail->setTitle( Context::getLang('msg_confirm_account_title') ); - $oMail->setContent($content); - $oMail->setSender( $member_config->webmaster_name?$member_config->webmaster_name:'webmaster', $member_config->webmaster_email); - $oMail->setReceiptor( $args->user_name, $args->email_address ); - $oMail->send(); - } - - // trigger 호출 (after) - if($output->toBool()) { - $trigger_output = ModuleHandler::triggerCall('member.insertMember', 'after', $args); - if(!$trigger_output->toBool()) { - $oDB->rollback(); - return $trigger_output; - } - } - - $oDB->commit(true); - - $output->add('member_srl', $args->member_srl); - return $output; - } - - /** - * @brief member 정보 수정 - **/ - function updateMember($args) { - // trigger 호출 (before) - $output = ModuleHandler::triggerCall('member.updateMember', 'before', $args); - if(!$output->toBool()) return $output; - - // 모델 객체 생성 - $oMemberModel = &getModel('member'); - - $logged_info = Context::get('logged_info'); - - // 수정하려는 대상의 원래 정보 가져오기 - $member_info = $oMemberModel->getMemberInfoByMemberSrl($args->member_srl); - if(!$args->user_id) $args->user_id = $member_info->user_id; - - // 필수 변수들의 조절 - if($args->allow_mailing!='Y') $args->allow_mailing = 'N'; - if($args->allow_message && !in_array($args->allow_message, array('Y','N','F'))) $args->allow_message = 'Y'; - - if($logged_info->is_admin == 'Y') { - if($args->denied!='Y') $args->denied = 'N'; - if($args->is_admin!='Y' && $logged_info->member_srl != $args->member_srl) $args->is_admin = 'N'; - } else { - unset($args->is_admin); - unset($args->denied); - } - - list($args->email_id, $args->email_host) = explode('@', $args->email_address); - - // 홈페이지, 블로그의 주소 검사 - if($args->homepage && !preg_match("/^[a-z]+:\/\//is",$args->homepage)) $args->homepage = 'http://'.$args->homepage; - if($args->blog && !preg_match("/^[a-z]+:\/\//is",$args->blog)) $args->blog = 'http://'.$args->blog; - - // 아이디, 닉네임, email address 의 중복 체크 - $member_srl = $oMemberModel->getMemberSrlByUserID($args->user_id); - if($member_srl&&$args->member_srl!=$member_srl) return new Object(-1,'msg_exists_user_id'); - - $member_srl = $oMemberModel->getMemberSrlByNickName($args->nick_name); - if($member_srl&&$args->member_srl!=$member_srl) return new Object(-1,'msg_exists_nick_name'); - - $member_srl = $oMemberModel->getMemberSrlByEmailAddress($args->email_address); - if($member_srl&&$args->member_srl!=$member_srl) return new Object(-1,'msg_exists_email_address'); - - $oDB = &DB::getInstance(); - $oDB->begin(); - - // DB에 update - if($args->password) $args->password = md5($args->password); - else $args->password = $member_info->password; - if(!$args->user_name) $args->user_name = $member_info->user_name; - $args->nick_name = htmlspecialchars($args->nick_name); - $args->homepage = htmlspecialchars($args->homepage); - $args->blog = htmlspecialchars($args->blog); - - if(!$args->description) $args->description = ''; - $output = executeQuery('member.updateMember', $args); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - // 그룹 정보가 있으면 그룹 정보를 변경 - if($args->group_srl_list) { - $group_srl_list = explode('|@|', $args->group_srl_list); - $args->site_srl = 0; - - // 일단 해당 회원의 모든 그룹 정보를 삭제 - $output = executeQuery('member.deleteMemberGroupMember', $args); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - // 하나 하나 루프를 돌면서 입력 - for($i=0;$iaddMemberToGroup($args->member_srl,$group_srl_list[$i]); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - } - } - - // trigger 호출 (after) - if($output->toBool()) { - $trigger_output = ModuleHandler::triggerCall('member.updateMember', 'after', $args); - if(!$trigger_output->toBool()) { - $oDB->rollback(); - return $trigger_output; - } - } - - $oDB->commit(); - - // 세션에 저장 - $member_info = $oMemberModel->getMemberInfoByMemberSrl($args->member_srl); - - $logged_info = Context::get('logged_info'); - if($logged_info->member_srl == $member_srl) { - $_SESSION['logged_info'] = $member_info; - } - - $output->add('member_srl', $args->member_srl); - return $output; - } - - /** - * @brief member 비밀번호 수정 - **/ - function updateMemberPassword($args) { - $output = executeQuery('member.updateChangePasswordDate', $args); - $args->password = md5($args->password); - return executeQuery('member.updateMemberPassword', $args); - } - - /** - * @brief 사용자 삭제 - **/ - function deleteMember($member_srl) { - // trigger 호출 (before) - $trigger_obj->member_srl = $member_srl; - $output = ModuleHandler::triggerCall('member.deleteMember', 'before', $trigger_obj); - if(!$output->toBool()) return $output; - - // 모델 객체 생성 - $oMemberModel = &getModel('member'); - - // 해당 사용자의 정보를 가져옴 - $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); - if(!$member_info) return new Object(-1, 'msg_not_exists_member'); - - // 관리자의 경우 삭제 불가능 - if($member_info->is_admin == 'Y') return new Object(-1, 'msg_cannot_delete_admin'); - - $oDB = &DB::getInstance(); - $oDB->begin(); - - $args->member_srl = $member_srl; - // member_auth_mail에서 해당 항목들 삭제 - $output = executeQuery('member.deleteAuthMail', $args); - if (!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - // member_openid에서 해당 항목들 삭제 - $output = executeQuery('member.deleteMemberOpenIDByMemberSrl', $ags); - - // TODO: 테이블 업그레이드를 하지 않은 경우에 실패할 수 있다. - /* - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - */ - - // member_group_member에서 해당 항목들 삭제 - $output = executeQuery('member.deleteMemberGroupMember', $args); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - // member 테이블에서 삭제 - $output = executeQuery('member.deleteMember', $args); - if(!$output->toBool()) { - $oDB->rollback(); - return $output; - } - - // trigger 호출 (after) - if($output->toBool()) { - $trigger_output = ModuleHandler::triggerCall('member.deleteMember', 'after', $trigger_obj); - if(!$trigger_output->toBool()) { - $oDB->rollback(); - return $trigger_output; - } - } - - $oDB->commit(); - - // 이름이미지, 이미지마크, 서명 삭제 - $this->procMemberDeleteImageName(); - $this->procMemberDeleteImageMark(); - $this->delSignature($member_srl); - - return $output; - } - - /** - * @brief 모든 세션 정보 파기 - **/ - function destroySessionInfo() { - if(!$_SESSION || !is_array($_SESSION)) return; - foreach($_SESSION as $key => $val) { - $_SESSION[$key] = ''; - } - session_destroy(); - setcookie(session_name(), '', time()-42000, '/'); - setcookie('sso','',time()-42000, '/'); - - if($_COOKIE['xeak']) { - $args->autologin_key = $_COOKIE['xeak']; - executeQuery('member.deleteAutologin', $args); - } - } - } -?> ->>>>>>> .merge-right.r9269 +?> \ No newline at end of file From d311ccc37723436b785301481574777cd09dfcc4 Mon Sep 17 00:00:00 2001 From: flyskyko Date: Thu, 22 Sep 2011 10:19:58 +0000 Subject: [PATCH 0817/1372] fix merge error git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9276 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/js/unittest/unittest_common.html | 77 -- .../communication.admin.model.php | 43 -- modules/document/document.admin.view.php | 164 +---- modules/file/file.controller.php | 684 +----------------- modules/file/file.model.php | 216 ------ modules/member/member.admin.model.php | 146 +--- modules/menu/tpl/index.html | 54 -- modules/message/message.admin.view.php | 38 - modules/module/module.admin.controller.php | 512 +------------ modules/opage/opage.view.php | 173 +---- modules/opage/tpl/index.html | 88 --- modules/point/tpl/member_list.html | 100 +-- modules/poll/poll.admin.view.php | 150 +--- .../syndication/syndication.admin.view.php | 53 -- 14 files changed, 59 insertions(+), 2439 deletions(-) diff --git a/common/js/unittest/unittest_common.html b/common/js/unittest/unittest_common.html index 0361e7a8a..f073a9c8f 100644 --- a/common/js/unittest/unittest_common.html +++ b/common/js/unittest/unittest_common.html @@ -1,79 +1,3 @@ -<<<<<<< .working - - - - -JSSpec results - - - - - - - -

                                A

                                B

                                - -======= @@ -148,4 +72,3 @@ describe('SetQuery', {

                                A

                                B

                                ->>>>>>> .merge-right.r9269 diff --git a/modules/communication/communication.admin.model.php b/modules/communication/communication.admin.model.php index 0c6131265..87967fca5 100644 --- a/modules/communication/communication.admin.model.php +++ b/modules/communication/communication.admin.model.php @@ -1,4 +1,3 @@ -<<<<<<< .working loadSkinInfo($this->module_path, $skin); Context::set('skin_info', $skin_info); - $oModuleModel = &getModel('module'); - $communication_config = $oModuleModel->getModuleConfig('communication'); - if(!$communication_config->colorset) $communication_config->colorset = "white"; - Context::set('communication_config', $communication_config); - - $oTemplate = &TemplateHandler::getInstance(); - $tpl = $oTemplate->compile($this->module_path.'tpl', 'colorset_list'); - } - - $this->add('tpl', $tpl); - } - - } -?> -======= -loadSkinInfo($this->module_path, $skin); - Context::set('skin_info', $skin_info); - $oModuleModel = &getModel('module'); $communication_config = $oModuleModel->getModuleConfig('communication'); if(!$communication_config->colorset) $communication_config->colorset = "white"; @@ -84,4 +42,3 @@ } ?> ->>>>>>> .merge-right.r9269 diff --git a/modules/document/document.admin.view.php b/modules/document/document.admin.view.php index cbecaa317..793d50392 100644 --- a/modules/document/document.admin.view.php +++ b/modules/document/document.admin.view.php @@ -1,4 +1,3 @@ -<<<<<<< .working data; } - Context::set('aliases', $aliases); - + $this->setTemplatePath($this->module_path.'tpl'); $this->setTemplateFile('document_alias'); } @@ -170,163 +168,3 @@ } } ?> -======= -page = Context::get('page'); ///< 페이지 - $args->list_count = 30; ///< 한페이지에 보여줄 글 수 - $args->page_count = 10; ///< 페이지 네비게이션에 나타날 페이지의 수 - - $args->search_target = Context::get('search_target'); ///< 검색 대상 (title, contents...) - $args->search_keyword = Context::get('search_keyword'); ///< 검색어 - - $args->sort_index = 'list_order'; ///< 소팅 값 - - $args->module_srl = Context::get('module_srl'); - - // 목록 구함, document->getDocumentList 에서 걍 알아서 다 해버리는 구조이다... (아.. 이거 나쁜 버릇인데.. ㅡ.ㅜ 어쩔수 없다) - $oDocumentModel = &getModel('document'); - $output = $oDocumentModel->getDocumentList($args); - - // 템플릿에 쓰기 위해서 document_model::getDocumentList() 의 return object에 있는 값들을 세팅 - Context::set('total_count', $output->total_count); - Context::set('total_page', $output->total_page); - Context::set('page', $output->page); - Context::set('document_list', $output->data); - Context::set('page_navigation', $output->page_navigation); - - // 템플릿에서 사용할 검색옵션 세팅 - $count_search_option = count($this->search_option); - for($i=0;$i<$count_search_option;$i++) { - $search_option[$this->search_option[$i]] = Context::getLang($this->search_option[$i]); - } - Context::set('search_option', $search_option); - - // 템플릿 지정 - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('document_list'); - } - - /** - * @brief 문서 모듈 설정 - **/ - function dispDocumentAdminConfig() { - $oDocumentModel = &getModel('document'); - $config = $oDocumentModel->getDocumentConfig(); - Context::set('config',$config); - - // 템플릿 파일 지정 - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('document_config'); - } - - /** - * @brief 관리자 페이지의 신고 목록 보기 - **/ - function dispDocumentAdminDeclared() { - // 목록을 구하기 위한 옵션 - $args->page = Context::get('page'); ///< 페이지 - $args->list_count = 30; ///< 한페이지에 보여줄 글 수 - $args->page_count = 10; ///< 페이지 네비게이션에 나타날 페이지의 수 - - $args->sort_index = 'document_declared.declared_count'; ///< 소팅 값 - $args->order_type = 'desc'; ///< 소팅 정렬 값 - - // 목록을 구함 - $declared_output = executeQuery('document.getDeclaredList', $args); - - if($declared_output->data && count($declared_output->data)) { - $document_list = array(); - - $oDocumentModel = &getModel('document'); - foreach($declared_output->data as $key => $document) { - $document_list[$key] = new documentItem(); - $document_list[$key]->setAttribute($document); - } - $declared_output->data = $document_list; - } - - // 템플릿에 쓰기 위해서 document_model::getDocumentList() 의 return object에 있는 값들을 세팅 - Context::set('total_count', $declared_output->total_count); - Context::set('total_page', $declared_output->total_page); - Context::set('page', $declared_output->page); - Context::set('document_list', $declared_output->data); - Context::set('page_navigation', $declared_output->page_navigation); - - // 템플릿 지정 - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('declared_list'); - } - - function dispDocumentAdminAlias() { - $args->document_srl = Context::get('document_srl'); - if(!$args->document_srl) return $this->dispDocumentAdminList(); - - $oModel = &getModel('document'); - $oDocument = $oModel->getDocument($args->document_srl); - if(!$oDocument->isExists()) return $this->dispDocumentAdminList(); - Context::set('oDocument', $oDocument); - - $output = executeQueryArray('document.getAliases', $args); - if(!$output->data) - { - $aliases = array(); - } - else - { - $aliases = $output->data; - } - - Context::set('aliases', $aliases); - - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('document_alias'); - } - - function dispDocumentAdminTrashList() { - // 목록을 구하기 위한 옵션 - $args->page = Context::get('page'); ///< 페이지 - $args->list_count = 30; ///< 한페이지에 보여줄 글 수 - $args->page_count = 10; ///< 페이지 네비게이션에 나타날 페이지의 수 - - $args->sort_index = 'list_order'; ///< 소팅 값 - $args->order_type = 'desc'; ///< 소팅 정렬 값 - - $args->module_srl = Context::get('module_srl'); - - // 목록을 구함 - $oDocumentAdminModel = &getAdminModel('document'); - $output = $oDocumentAdminModel->getDocumentTrashList($args); - - // 템플릿에 쓰기 위해서 document_admin_model::getDocumentTrashList() 의 return object에 있는 값들을 세팅 - Context::set('total_count', $output->total_count); - Context::set('total_page', $output->total_page); - Context::set('page', $output->page); - Context::set('document_list', $output->data); - Context::set('page_navigation', $output->page_navigation); - - // 템플릿 지정 - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('document_trash_list'); - } - } -?> ->>>>>>> .merge-right.r9269 diff --git a/modules/file/file.controller.php b/modules/file/file.controller.php index 39fa7f4ca..86839e191 100644 --- a/modules/file/file.controller.php +++ b/modules/file/file.controller.php @@ -1,4 +1,3 @@ -<<<<<<< .working pow(1024, 10240)) { + if (filesize($uploaded_filename) > 1024 * 1024) { while(!feof($fp)) echo fread($fp, 1024); fclose($fp); } else { @@ -253,7 +252,32 @@ if(!$_SESSION['upload_info'][$editor_sequence]->enabled) exit(); $upload_target_srl = $_SESSION['upload_info'][$editor_sequence]->upload_target_srl; - if($upload_target_srl && $file_srl) $output = $this->deleteFile($file_srl); + + $logged_info = Context::get('logged_info'); + $oFileModel = &getModel('file'); + + $srls = explode(',',$file_srl); + if(!count($srls)) return; + + for($i=0;$ifile_srl = $srl; + $output = executeQuery('file.getFile', $args); + if(!$output->toBool()) continue; + + $file_info = $output->data; + if(!$file_info) continue; + + $file_grant = $oFileModel->getFileGrant($file_info, $logged_info); + + if(!$file_grant->is_deletable) continue; + + if($upload_target_srl && $file_srl) $output = $this->deleteFile($file_srl); + } + } /** @@ -487,6 +511,9 @@ $trigger_output = ModuleHandler::triggerCall('file.insertFile', 'after', $args); if(!$trigger_output->toBool()) return $trigger_output; + + $_SESSION['__XE_UPLOADING_FILES_INFO__'][$args->file_srl] = true; + $output->add('file_srl', $args->file_srl); $output->add('file_size', $args->file_size); $output->add('sid', $args->sid); @@ -617,654 +644,3 @@ } } ?> -======= -module_srl; - - // 업로드 권한이 없거나 정보가 없을시 종료 - if(!$_SESSION['upload_info'][$editor_sequence]->enabled) exit(); - - // upload_target_srl 값이 명시되지 않았을 경우 세션정보에서 추출 - if(!$upload_target_srl) $upload_target_srl = $_SESSION['upload_info'][$editor_sequence]->upload_target_srl; - - // 세션정보에도 정의되지 않았다면 새로 생성 - if(!$upload_target_srl) $_SESSION['upload_info'][$editor_sequence]->upload_target_srl = $upload_target_srl = getNextSequence(); - - - return $this->insertFile($file_info, $module_srl, $upload_target_srl); - } - - - /** - * @brief iframe 첨부파일 업로드 - **/ - function procFileIframeUpload() { - // 기본적으로 필요한 변수 설정 - $editor_sequence = Context::get('editor_sequence'); - $callback = Context::get('callback'); - $module_srl = $this->module_srl; - $upload_target_srl = intval(Context::get('uploadTargetSrl')); - if(!$upload_target_srl) $upload_target_srl = intval(Context::get('upload_target_srl')); - - // 업로드 권한이 없거나 정보가 없을시 종료 - if(!$_SESSION['upload_info'][$editor_sequence]->enabled) exit(); - - // upload_target_srl 값이 명시되지 않았을 경우 세션정보에서 추출 - if(!$upload_target_srl) $upload_target_srl = $_SESSION['upload_info'][$editor_sequence]->upload_target_srl; - - // 세션정보에도 정의되지 않았다면 새로 생성 - if(!$upload_target_srl) $_SESSION['upload_info'][$editor_sequence]->upload_target_srl = $upload_target_srl = getNextSequence(); - - // file_srl이 요청되었을 경우 삭제 후 재업로드 시도 - $file_srl = Context::get('file_srl'); - if($file_srl) $this->deleteFile($file_srl); - - $file_info = Context::get('Filedata'); - - // 정상적으로 업로드된 파일이 아니면 오류 출력 - if(is_uploaded_file($file_info['tmp_name'])) { - $output = $this->insertFile($file_info, $module_srl, $upload_target_srl); - Context::set('uploaded_fileinfo',$output); - } - - Context::set('layout','none'); - - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('iframe'); - - } - - /** - * @brief image resize - **/ - function procFileImageResize() { - $source_src = Context::get('source_src'); - $width = Context::get('width'); - $height = Context::get('height'); - $type = Context::get('type'); - $output_src = Context::get('output_src'); - - if(!$source_src || !$width) return new Object(-1,'msg_invalid_request'); - if(!$output_src){ - $output_src = $source_src . '.resized' . strrchr($source_src,'.'); - } - if(!$type) $type = 'ratio'; - if(!$height) $height = $width-1; - - if(FileHandler::createImageFile($source_src,$output_src,$width,$height,'','ratio')){ - $output->info = getimagesize($output_src); - $output->src = $output_src; - }else{ - return new Object(-1,'msg_invalid_request'); - } - - $this->add('resized_info',$output); - } - - - - /** - * @brief 첨부파일 다운로드 - * 직접 요청을 받음 - * file_srl : 파일의 sequence - * sid : db에 저장된 비교 값, 틀리면 다운로드 하지 않음 - **/ - function procFileDownload() { - $oFileModel = &getModel('file'); - - $file_srl = Context::get('file_srl'); - $sid = Context::get('sid'); - $logged_info = Context::get('logged_info'); - - // 파일의 정보를 DB에서 받아옴 - $file_obj = $oFileModel->getFile($file_srl); - - // 요청된 파일 정보가 잘못되었다면 파일을 찾을 수 없다는 오류 출력 - if($file_obj->file_srl!=$file_srl || $file_obj->sid!=$sid) return $this->stop('msg_file_not_found'); - - // 대기 상태일 경우 파일 다운로드 권한이 없음을 알림 (최고관리자는 다운 로드 허용) - if($logged_info->is_admin != 'Y' && $file_obj->isvalid!='Y') return $this->stop('msg_not_permitted_download'); - - // 파일 이름 - $filename = $file_obj->source_filename; - $file_module_config = $oFileModel->getFileModuleConfig($file_obj->module_srl); - - // 파일 외부링크 차단 - if($file_module_config->allow_outlink == 'N') { - //외부링크 허용 확장자 처리 - if($file_module_config->allow_outlink_format) { - $allow_outlink_format_array = array(); - $allow_outlink_format_array = explode(',', $file_module_config->allow_outlink_format); - if(!is_array($allow_outlink_format_array)) $allow_outlink_format_array[0] = $file_module_config->allow_outlink_format; - - foreach($allow_outlink_format_array as $val) { - $val = trim($val); - if(preg_match("/\.{$val}$/i", $filename)) { - $file_module_config->allow_outlink = 'Y'; - break; - } - } - } - //외부링크 허용 사이트 처리 - if($file_module_config->allow_outlink != 'Y') { - $referer = parse_url($_SERVER["HTTP_REFERER"]); - if($referer['host'] != $_SERVER['HTTP_HOST']) { - if($file_module_config->allow_outlink_site) { - $allow_outlink_site_array = array(); - $allow_outlink_site_array = explode("\n", $file_module_config->allow_outlink_site); - if(!is_array($allow_outlink_site_array)) $allow_outlink_site_array[0] = $file_module_config->allow_outlink_site; - - foreach($allow_outlink_site_array as $val) { - $site = parse_url(trim($val)); - if($site['host'] == $referer['host']) { - $file_module_config->allow_outlink = 'Y'; - break; - } - } - } - } - else $file_module_config->allow_outlink = 'Y'; - } - if($file_module_config->allow_outlink != 'Y') return $this->stop('msg_not_allowed_outlink'); - } - - // 파일 다운로드 권한이 있는지 확인 - if(is_array($file_module_config->download_grant) && count($file_module_config->download_grant)>0) { - if(!Context::get('is_logged')) return $this->stop('msg_not_permitted_download'); - $logged_info = Context::get('logged_info'); - if($logged_info->is_admin != 'Y') { - - $oModuleModel =& getModel('module'); - $module_info = $oModuleModel->getModuleInfoByModuleSrl($file_obj->module_srl); - - if(!$oModuleModel->isSiteAdmin($logged_info, $module_info->site_srl)) - { - $oMemberModel =& getModel('member'); - $member_groups = $oMemberModel->getMemberGroups($logged_info->member_srl, $module_info->site_srl); - - $is_permitted = false; - for($i=0;$idownload_grant);$i++) { - $group_srl = $file_module_config->download_grant[$i]; - if($member_groups[$group_srl]) { - $is_permitted = true; - break; - } - } - if(!$is_permitted) return $this->stop('msg_not_permitted_download'); - } - } - } - - // trigger 호출 (before) - $output = ModuleHandler::triggerCall('file.downloadFile', 'before', $file_obj); - if(!$output->toBool()) return $this->stop(($output->message)?$output->message:'msg_not_permitted_download'); - - // 파일 출력 - if(strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) { - $filename = rawurlencode($filename); - $filename = preg_replace('/\./', '%2e', $filename, substr_count($filename, '.') - 1); - } - - $uploaded_filename = $file_obj->uploaded_filename; - if(!file_exists($uploaded_filename)) return $this->stop('msg_file_not_found'); - - $fp = fopen($uploaded_filename, 'rb'); - if(!$fp) return $this->stop('msg_file_not_found'); - - header("Cache-Control: "); - header("Pragma: "); - header("Content-Type: application/octet-stream"); - header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); - - header("Content-Length: " .(string)($file_obj->file_size)); - header('Content-Disposition: attachment; filename="'.$filename.'"'); - header("Content-Transfer-Encoding: binary\n"); - - // if file size is lager than 10MB, use fread function (#18675748) - if (filesize($uploaded_filename) > 1024 * 1024) { - while(!feof($fp)) echo fread($fp, 1024); - fclose($fp); - } else { - fpassthru($fp); - } - - // 이상이 없으면 download_count 증가 - $args->file_srl = $file_srl; - executeQuery('file.updateFileDownloadCount', $args); - - // trigger 호출 (after) - $output = ModuleHandler::triggerCall('file.downloadFile', 'after', $file_obj); - - Context::close(); - - exit(); - } - - /** - * @brief 에디터에서 첨부 파일 삭제 - **/ - function procFileDelete() { - // 기본적으로 필요한 변수인 upload_target_srl, module_srl을 설정 - $editor_sequence = Context::get('editor_sequence'); - $file_srl = Context::get('file_srl'); - $file_srls = Context::get('file_srls'); - if($file_srls) $file_srl = $file_srls; - - // 업로드 권한이 없거나 정보가 없을시 종료 - if(!$_SESSION['upload_info'][$editor_sequence]->enabled) exit(); - - $upload_target_srl = $_SESSION['upload_info'][$editor_sequence]->upload_target_srl; - - $logged_info = Context::get('logged_info'); - $oFileModel = &getModel('file'); - - $srls = explode(',',$file_srl); - if(!count($srls)) return; - - for($i=0;$ifile_srl = $srl; - $output = executeQuery('file.getFile', $args); - if(!$output->toBool()) continue; - - $file_info = $output->data; - if(!$file_info) continue; - - $file_grant = $oFileModel->getFileGrant($file_info, $logged_info); - - if(!$file_grant->is_deletable) continue; - - if($upload_target_srl && $file_srl) $output = $this->deleteFile($file_srl); - } - - } - - /** - * @brief 특정 upload_target_srl(document_srl)에 등록된 첨부파일의 갯수를 return하는 trigger - **/ - function triggerCheckAttached(&$obj) { - $document_srl = $obj->document_srl; - if(!$document_srl) return new Object(); - - // 첨부 파일의 갯수를 구함 - $oFileModel = &getModel('file'); - $obj->uploaded_count = $oFileModel->getFilesCount($document_srl); - - return new Object(); - } - - /** - * @brief 특정 upload_target_srl(document_srl)에 등록된 첨부파일을 연결하는 trigger - **/ - function triggerAttachFiles(&$obj) { - $document_srl = $obj->document_srl; - if(!$document_srl) return new Object(); - - $output = $this->setFilesValid($document_srl); - if(!$output->toBool()) return $output; - - return new Object(); - } - - /** - * @brief 특정 upload_target_srl(document_srl)에 등록된 첨부파일을 삭제하는 trigger - **/ - function triggerDeleteAttached(&$obj) { - $document_srl = $obj->document_srl; - if(!$document_srl) return new Object(); - - $output = $this->deleteFiles($document_srl); - return $output; - } - - /** - * @brief 특정 upload_target_srl(comment_srl)에 등록된 첨부파일의 갯수를 return하는 trigger - **/ - function triggerCommentCheckAttached(&$obj) { - $comment_srl = $obj->comment_srl; - if(!$comment_srl) return new Object(); - - // 첨부 파일의 갯수를 구함 - $oFileModel = &getModel('file'); - $obj->uploaded_count = $oFileModel->getFilesCount($comment_srl); - - return new Object(); - } - - /** - * @brief 특정 upload_target_srl(comment_srl)에 등록된 첨부파일을 연결하는 trigger - **/ - function triggerCommentAttachFiles(&$obj) { - $comment_srl = $obj->comment_srl; - $uploaded_count = $obj->uploaded_count; - if(!$comment_srl || !$uploaded_count) return new Object(); - - $output = $this->setFilesValid($comment_srl); - if(!$output->toBool()) return $output; - - return new Object(); - } - - /** - * @brief 특정 upload_target_srl(comment_srl)에 등록된 첨부파일을 삭제하는 trigger - **/ - function triggerCommentDeleteAttached(&$obj) { - $comment_srl = $obj->comment_srl; - if(!$comment_srl) return new Object(); - - $output = $this->deleteFiles($comment_srl); - return $output; - } - - /** - * @brief module 삭제시 해당 첨부파일 모두 삭제하는 trigger - **/ - function triggerDeleteModuleFiles(&$obj) { - $module_srl = $obj->module_srl; - if(!$module_srl) return new Object(); - - $oFileController = &getAdminController('file'); - return $oFileController->deleteModuleFiles($module_srl); - } - - /** - * @brief 업로드 가능하다고 세팅 - **/ - function setUploadInfo($editor_sequence, $upload_target_srl=0) { - $_SESSION['upload_info'][$editor_sequence]->enabled = true; - $_SESSION['upload_info'][$editor_sequence]->upload_target_srl = $upload_target_srl; - } - - /** - * @brief 특정 upload_target_srl의 첨부파일들의 상태를 유효로 변경 - * 글이 등록될때 글에 첨부된 파일들의 상태를 유효상태로 변경함으로서 관리시 불필요 파일로 인식되지 않도록 함 - **/ - function setFilesValid($upload_target_srl) { - $args->upload_target_srl = $upload_target_srl; - return executeQuery('file.updateFileValid', $args); - } - - /** - * @brief 첨부파일 추가 - **/ - function insertFile($file_info, $module_srl, $upload_target_srl, $download_count = 0, $manual_insert = false) { - // trigger 호출 (before) - $trigger_obj->module_srl = $module_srl; - $trigger_obj->upload_target_srl = $upload_target_srl; - $output = ModuleHandler::triggerCall('file.insertFile', 'before', $trigger_obj); - if(!$output->toBool()) return $output; - - // A workaround for Firefox upload bug - if (preg_match('/^=\?UTF-8\?B\?(.+)\?=$/i', $file_info['name'], $match)) { - $file_info['name'] = base64_decode(strtr($match[1], ':', '/')); - } - - if(!$manual_insert) { - // 첨부파일 설정 가져옴 - $logged_info = Context::get('logged_info'); - if($logged_info->is_admin != 'Y') { - $oFileModel = &getModel('file'); - $config = $oFileModel->getFileConfig($module_srl); - $allowed_filesize = $config->allowed_filesize * 1024 * 1024; - $allowed_attach_size = $config->allowed_attach_size * 1024 * 1024; - - // 한 파일당 허용 용량 초과시 오류 출력 - if($allowed_filesize < filesize($file_info['tmp_name'])) return new Object(-1, 'msg_exceeds_limit_size'); - - - // 해당 문서에 첨부된 모든 파일의 용량을 가져옴 (DB에서 가져옴) - $size_args->upload_target_srl = $upload_target_srl; - $output = executeQuery('file.getAttachedFileSize', $size_args); - $attached_size = (int)$output->data->attached_size + filesize($file_info['tmp_name']); - if($attached_size > $allowed_attach_size) return new Object(-1, 'msg_exceeds_limit_size'); - } - } - - // 이미지인지 기타 파일인지 체크하여 upload path 지정 - if(preg_match("/\.(jpe?g|gif|png|wm[va]|mpe?g|avi|swf|flv|mp[1-4]|as[fx]|wav|midi?|moo?v|qt|r[am]{1,2}|m4v)$/i", $file_info['name'])) { - // direct 파일에 해킹을 의심할 수 있는 확장자가 포함되어 있으면 바로 삭제함 - $file_info['name'] = preg_replace('/\.(php|phtm|html?|cgi|pl|exe|jsp|asp|inc)/i', '$0-x',$file_info['name']); - $file_info['name'] = str_replace(array('<','>'),array('%3C','%3E'),$file_info['name']); - - $path = sprintf("./files/attach/images/%s/%s", $module_srl,getNumberingPath($upload_target_srl,3)); - - // special character to '_' - // change to md5 file name. because window php bug. window php is not recognize unicode character file name - by cherryfilter - $ext = substr(strrchr($file_info['name'],'.'),1); - //$_filename = preg_replace('/[#$&*?+%"\']/', '_', $file_info['name']); - $_filename = md5(crypt(rand(1000000,900000), rand(0,100))).'.'.$ext; - $filename = $path.$_filename; - $idx = 1; - while(file_exists($filename)) { - $filename = $path.preg_replace('/\.([a-z0-9]+)$/i','_'.$idx.'.$1',$_filename); - $idx++; - } - $direct_download = 'Y'; - } else { - $path = sprintf("./files/attach/binaries/%s/%s", $module_srl, getNumberingPath($upload_target_srl,3)); - $filename = $path.md5(crypt(rand(1000000,900000), rand(0,100))); - $direct_download = 'N'; - } - - // 디렉토리 생성 - if(!FileHandler::makeDir($path)) return new Object(-1,'msg_not_permitted_create'); - - // 파일 이동 - if($manual_insert) { - @copy($file_info['tmp_name'], $filename); - if(!file_exists($filename)) { - $filename = $path. md5(crypt(rand(1000000,900000).$file_info['name'])).'.'.$ext; - @copy($file_info['tmp_name'], $filename); - } - } else { - if(!@move_uploaded_file($file_info['tmp_name'], $filename)) { - $filename = $path. md5(crypt(rand(1000000,900000).$file_info['name'])).'.'.$ext; - if(!@move_uploaded_file($file_info['tmp_name'], $filename)) return new Object(-1,'msg_file_upload_error'); - } - } - - // 사용자 정보를 구함 - $oMemberModel = &getModel('member'); - $member_srl = $oMemberModel->getLoggedMemberSrl(); - - // 파일 정보를 정리 - $args->file_srl = getNextSequence(); - $args->upload_target_srl = $upload_target_srl; - $args->module_srl = $module_srl; - $args->direct_download = $direct_download; - $args->source_filename = $file_info['name']; - $args->uploaded_filename = $filename; - $args->download_count = $download_count; - $args->file_size = @filesize($filename); - $args->comment = NULL; - $args->member_srl = $member_srl; - $args->sid = md5(rand(rand(1111111,4444444),rand(4444445,9999999))); - - $output = executeQuery('file.insertFile', $args); - if(!$output->toBool()) return $output; - - // trigger 호출 (after) - $trigger_output = ModuleHandler::triggerCall('file.insertFile', 'after', $args); - if(!$trigger_output->toBool()) return $trigger_output; - - - $_SESSION['__XE_UPLOADING_FILES_INFO__'][$args->file_srl] = true; - - $output->add('file_srl', $args->file_srl); - $output->add('file_size', $args->file_size); - $output->add('sid', $args->sid); - $output->add('direct_download', $args->direct_download); - $output->add('source_filename', $args->source_filename); - $output->add('upload_target_srl', $upload_target_srl); - $output->add('uploaded_filename', $args->uploaded_filename); - return $output; - } - - /** - * @brief 첨부파일 삭제 - **/ - function deleteFile($file_srl) { - if(!$file_srl) return; - - $srls = explode(',',$file_srl); - if(!count($srls)) return; - - for($i=0;$ifile_srl = $srl; - $output = executeQuery('file.getFile', $args); - if(!$output->toBool()) continue; - - $file_info = $output->data; - if(!$file_info) continue; - - $source_filename = $output->data->source_filename; - $uploaded_filename = $output->data->uploaded_filename; - - // trigger 호출 (before) - $trigger_obj = $output->data; - $output = ModuleHandler::triggerCall('file.deleteFile', 'before', $trigger_obj); - if(!$output->toBool()) return $output; - - // DB에서 삭제 - $output = executeQuery('file.deleteFile', $args); - if(!$output->toBool()) return $output; - - // trigger 호출 (after) - $trigger_output = ModuleHandler::triggerCall('file.deleteFile', 'after', $trigger_obj); - if(!$trigger_output->toBool()) return $trigger_output; - - // 삭제 성공하면 파일 삭제 - FileHandler::removeFile($uploaded_filename); - } - - return $output; - } - - /** - * @brief 특정 문서의 첨부파일을 모두 삭제 - **/ - function deleteFiles($upload_target_srl) { - // 첨부파일 목록을 받음 - $oFileModel = &getModel('file'); - $file_list = $oFileModel->getFiles($upload_target_srl); - - // 첨부파일이 없으면 성공 return - if(!is_array($file_list)||!count($file_list)) return new Object(); - - // DB에서 삭제 - $args->upload_target_srl = $upload_target_srl; - $output = executeQuery('file.deleteFiles', $args); - if(!$output->toBool()) return $output; - - // 실제 파일 삭제 - $path = array(); - $file_count = count($file_list); - for($i=0;$i<$file_count;$i++) { - $uploaded_filename = $file_list[$i]->uploaded_filename; - FileHandler::removeFile($uploaded_filename); - $module_srl = $file_list[$i]->module_srl; - - $path_info = pathinfo($uploaded_filename); - if(!in_array($path_info['dirname'], $path)) $path[] = $path_info['dirname']; - } - - // 해당 글의 첨부파일 디렉토리 삭제 - for($i=0;$igetFiles($source_srl); - if(!$file_list) return; - - $file_count = count($file_list); - - for($i=0;$i<$file_count;$i++) { - - unset($file_info); - $file_info = $file_list[$i]; - $old_file = $file_info->uploaded_filename; - - // 이미지인지 기타 파일인지 체크하여 이동할 위치 정함 - if(preg_match("/\.(jpg|jpeg|gif|png|wmv|wma|mpg|mpeg|avi|swf|flv|mp1|mp2|mp3|mp4|asf|wav|asx|mid|midi|asf|mov|moov|qt|rm|ram|ra|rmm|m4v)$/i", $file_info->source_filename)) { - $path = sprintf("./files/attach/images/%s/%s/", $target_module_srl,$target_srl); - $new_file = $path.$file_info->source_filename; - } else { - $path = sprintf("./files/attach/binaries/%s/%s/", $target_module_srl, $target_srl); - $new_file = $path.md5(crypt(rand(1000000,900000), rand(0,100))); - } - - // 이전 대상이 동일하면 그냥 패스 - if($old_file == $new_file) continue; - - // 디렉토리 생성 - FileHandler::makeDir($path); - - // 파일 이동 - FileHandler::rename($old_file, $new_file); - - // DB 정보도 수정 - unset($args); - $args->file_srl = $file_info->file_srl; - $args->uploaded_filename = $new_file; - $args->module_srl = $file_info->module_srl; - $args->upload_target_srl = $target_srl; - executeQuery('file.updateFile', $args); - } - } - - /** - * @brief upload_target_srl을 키로 하는 첨부파일을 찾아서 java script 코드로 return - **/ - function printUploadedFileList($editor_sequence, $upload_target_srl) { - return; - } - } -?> ->>>>>>> .merge-right.r9269 diff --git a/modules/file/file.model.php b/modules/file/file.model.php index b7496d77e..2dfd431e4 100644 --- a/modules/file/file.model.php +++ b/modules/file/file.model.php @@ -1,4 +1,3 @@ -<<<<<<< .working getFileConfig($module_srl); - } - } -?> -======= -upload_target_srl; - - if($upload_target_srl) { - $tmp_files = $this->getFiles($upload_target_srl); - $file_count = count($tmp_files); - - for($i=0;$i<$file_count;$i++) { - $file_info = $tmp_files[$i]; - if(!$file_info->file_srl) continue; - - $obj = null; - $obj->file_srl = $file_info->file_srl; - $obj->source_filename = $file_info->source_filename; - $obj->file_size = $file_info->file_size; - $obj->disp_file_size = FileHandler::filesize($file_info->file_size); - if($file_info->direct_download=='N') $obj->download_url = $this->getDownloadUrl($file_info->file_srl, $file_info->sid); - else $obj->download_url = str_replace('./', '', $file_info->uploaded_filename); - $obj->direct_download = $file_info->direct_download; - $files[] = $obj; - $attached_size += $file_info->file_size; - } - } else { - $upload_target_srl = 0; - $attached_size = 0; - $files = array(); - } - - // 업로드 상태 표시 작성 - $upload_status = $this->getUploadStatus($attached_size); - - // 남은 용량 체크 - $config = $oModuleModel->getModuleInfoByMid($mid); - $file_config = $this->getUploadConfig(); - $left_size = $file_config->allowed_attach_size*1024*1024 - $attached_size; - - // 필요한 정보들 세팅 - $this->add("files",$files); - $this->add("editor_sequence",$editor_sequence); - $this->add("upload_target_srl",$upload_target_srl); - $this->add("upload_status",$upload_status); - $this->add("left_size",$left_size); - } - - /** - * @brief 특정 문서에 속한 첨부파일의 개수를 return - **/ - function getFilesCount($upload_target_srl) { - $args->upload_target_srl = $upload_target_srl; - $output = executeQuery('file.getFilesCount', $args); - return (int)$output->data->count; - } - - /** - * @brief 다운로드 경로를 구함 - **/ - function getDownloadUrl($file_srl, $sid) { - return sprintf('?module=%s&act=%s&file_srl=%s&sid=%s', 'file', 'procFileDownload', $file_srl, $sid); - } - - /** - * @brief 파일 설정 정보를 구함 - **/ - function getFileConfig($module_srl = null) { - // 설정 정보를 받아옴 (module model 객체를 이용) - $oModuleModel = &getModel('module'); - - $file_module_config = $oModuleModel->getModuleConfig('file'); - - if($module_srl) $file_config = $oModuleModel->getModulePartConfig('file',$module_srl); - if(!$file_config) $file_config = $file_module_config; - - if($file_config) { - $config->allowed_filesize = $file_config->allowed_filesize; - $config->allowed_attach_size = $file_config->allowed_attach_size; - $config->allowed_filetypes = $file_config->allowed_filetypes; - $config->download_grant = $file_config->download_grant; - $config->allow_outlink = $file_config->allow_outlink; - $config->allow_outlink_site = $file_config->allow_outlink_site; - $config->allow_outlink_format = $file_config->allow_outlink_format; - } - - // 전체 파일첨부 속성을 먼저 따른다 - if(!$config->allowed_filesize) $config->allowed_filesize = $file_module_config->allowed_filesize; - if(!$config->allowed_attach_size) $config->allowed_attach_size = $file_module_config->allowed_attach_size; - if(!$config->allowed_filetypes) $config->allowed_filetypes = $file_module_config->allowed_filetypes; - if(!$config->allow_outlink) $config->allow_outlink = $file_module_config->allow_outlink; - if(!$config->allow_outlink_site) $config->allow_outlink_site = $file_module_config->allow_outlink_site; - if(!$config->allow_outlink_format) $config->allow_outlink_format = $file_module_config->allow_outlink_format; - if(!$config->download_grant) $config->download_grant = $file_module_config->download_grant; - - // 그래도 없으면 default로 - if(!$config->allowed_filesize) $config->allowed_filesize = '2'; - if(!$config->allowed_attach_size) $config->allowed_attach_size = '3'; - if(!$config->allowed_filetypes) $config->allowed_filetypes = '*.*'; - if(!$config->allow_outlink) $config->allow_outlink = 'Y'; - if(!$config->download_grant) $config->download_grant = array(); - - return $config; - } - - /** - * @brief 파일 정보를 구함 - **/ - function getFile($file_srl) { - $args->file_srl = $file_srl; - $output = executeQuery('file.getFile', $args); - if(!$output->toBool()) return $output; - - $file = $output->data; - $file->download_url = $this->getDownloadUrl($file->file_srl, $file->sid); - - return $file; - } - - /** - * @brief 특정 문서에 속한 파일을 모두 return - **/ - function getFiles($upload_target_srl) { - $args->upload_target_srl = $upload_target_srl; - $args->sort_index = 'file_srl'; - $output = executeQuery('file.getFiles', $args); - if(!$output->data) return; - - $file_list = $output->data; - - if($file_list && !is_array($file_list)) $file_list = array($file_list); - - $file_count = count($file_list); - for($i=0;$i<$file_count;$i++) { - $file = $file_list[$i]; - $file->source_filename = stripslashes($file->source_filename); - $file->download_url = $this->getDownloadUrl($file->file_srl, $file->sid); - $file_list[$i] = $file; - } - - return $file_list; - } - - /** - * @brief 첨부파일에 대한 설정을 return (관리자/비관리자 자동 구분) - **/ - function getUploadConfig() { - $logged_info = Context::get('logged_info'); - if($logged_info->is_admin == 'Y') { - $file_config->allowed_filesize = preg_replace("/[a-z]/is","",ini_get('upload_max_filesize')); - $file_config->allowed_attach_size = preg_replace("/[a-z]/is","",ini_get('upload_max_filesize')); - $file_config->allowed_filetypes = '*.*'; - } else { - $module_srl = Context::get('module_srl'); - // module_srl이 없으면 현재 모듈 - if(!$module_srl) { - $current_module_info = Context::get('current_module_info'); - $module_srl = $current_module_info->module_srl; - } - $file_config = $this->getFileConfig($module_srl); - } - return $file_config; - } - - /** - * @brief 파일 업로드를 위한 관리자/비관리자에 따른 안내문구 return - **/ - function getUploadStatus($attached_size = 0) { - $file_config = $this->getUploadConfig(); - - // 업로드 상태 표시 작성 - $upload_status = sprintf( - '%s : %s/ %s
                                %s : %s (%s : %s)', - Context::getLang('allowed_attach_size'), - FileHandler::filesize($attached_size), - FileHandler::filesize($file_config->allowed_attach_size*1024*1024), - Context::getLang('allowed_filesize'), - FileHandler::filesize($file_config->allowed_filesize*1024*1024), - Context::getLang('allowed_filetypes'), - $file_config->allowed_filetypes - ); - return $upload_status; - } - - /** - * @brief 특정 모듈의 file 설정을 return - **/ - function getFileModuleConfig($module_srl) { - return $this->getFileConfig($module_srl); } function getFileGrant($file_info, $member_info){ @@ -456,4 +241,3 @@ } } ?> ->>>>>>> .merge-right.r9269 diff --git a/modules/member/member.admin.model.php b/modules/member/member.admin.model.php index 12a30764a..919e1f31f 100644 --- a/modules/member/member.admin.model.php +++ b/modules/member/member.admin.model.php @@ -1,4 +1,3 @@ -<<<<<<< .working s_nick_name = $search_keyword; + $args->html_nick_name = htmlspecialchars($search_keyword); break; case 'email_address' : if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); @@ -208,147 +208,3 @@ } } ?> -======= -is_admin = Context::get('is_admin')=='Y'?'Y':''; - $args->is_denied = Context::get('is_denied')=='Y'?'Y':''; - $args->selected_group_srl = Context::get('selected_group_srl'); - - $search_target = trim(Context::get('search_target')); - $search_keyword = trim(Context::get('search_keyword')); - - if($search_target && $search_keyword) { - switch($search_target) { - case 'user_id' : - if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); - $args->s_user_id = $search_keyword; - break; - case 'user_name' : - if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); - $args->s_user_name = $search_keyword; - break; - case 'nick_name' : - if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); - $args->s_nick_name = $search_keyword; - $args->html_nick_name = htmlspecialchars($search_keyword); - break; - case 'email_address' : - if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword); - $args->s_email_address = $search_keyword; - break; - case 'regdate' : - $args->s_regdate = preg_replace("/[^0-9]/","",$search_keyword); - break; - case 'regdate_more' : - $args->s_regdate_more = substr(preg_replace("/[^0-9]/","",$search_keyword) . '00000000000000',0,14); - break; - case 'regdate_less' : - $args->s_regdate_less = substr(preg_replace("/[^0-9]/","",$search_keyword) . '00000000000000',0,14); - break; - case 'last_login' : - $args->s_last_login = $search_keyword; - break; - case 'last_login_more' : - $args->s_last_login_more = substr(preg_replace("/[^0-9]/","",$search_keyword) . '00000000000000',0,14); - break; - case 'last_login_less' : - $args->s_last_login_less = substr(preg_replace("/[^0-9]/","",$search_keyword) . '00000000000000',0,14); - break; - case 'extra_vars' : - $args->s_extra_vars = ereg_replace("[^0-9]","",$search_keyword); - break; - } - } - - // selected_group_srl이 있으면 query id를 변경 (table join때문에) - $sort_order = Context::get('sort_order'); - $sort_index = Context::get('sort_index'); - if($sort_index != 'last_login') { - $sort_index = "list_order"; - }else{ - $sort_order = 'desc'; - } - if($args->selected_group_srl) { - $query_id = 'member.getMemberListWithinGroup'; - $args->sort_index = "member.".$sort_index; - } else { - $query_id = 'member.getMemberList'; - $args->sort_index = $sort_index; - } - if($sort_order != "desc") $sort_order = "asc"; - $args->sort_order = $sort_order; - Context::set('sort_order', $sort_order); - - // 기타 변수들 정리 - $args->page = Context::get('page'); - $args->list_count = 40; - $args->page_count = 10; - $output = executeQuery($query_id, $args); - return $output; - } - - /** - * @brief 사이트별 회원 목록을 구함 - **/ - function getSiteMemberList($site_srl, $page = 1) { - $args->site_srl = $site_srl; - $args->page = $page; - $args->list_count = 40; - $args->page_count = 10; - $query_id = 'member.getSiteMemberList'; - $output = executeQueryArray($query_id, $args); - return $output; - } - - /** - * @brief 회원 모듈의 특정 스킨에 속한 컬러셋 목록을 return - **/ - function getMemberAdminColorset() { - $skin = Context::get('skin'); - if(!$skin) $tpl = ""; - else { - $oModuleModel = &getModel('module'); - $skin_info = $oModuleModel->loadSkinInfo($this->module_path, $skin); - Context::set('skin_info', $skin_info); - - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('member'); - if(!$config->colorset) $config->colorset = "white"; - Context::set('config', $config); - - $oTemplate = &TemplateHandler::getInstance(); - $tpl = $oTemplate->compile($this->module_path.'tpl', 'colorset_list'); - } - - $this->add('tpl', $tpl); - } - - } -?> ->>>>>>> .merge-right.r9269 diff --git a/modules/menu/tpl/index.html b/modules/menu/tpl/index.html index 20bd983f5..3da4fb58f 100644 --- a/modules/menu/tpl/index.html +++ b/modules/menu/tpl/index.html @@ -1,56 +1,3 @@ -<<<<<<< .working - - - - - - -
                                - -
                                - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
                                {$lang->no}
                                {$lang->title}
                                {$lang->regdate}
                                 
                                {$no}{htmlspecialchars($val->title)}{zdate($val->regdate,"Y-m-d")}{$lang->cmd_setup}{$lang->cmd_delete}
                                - {$lang->cmd_make} -
                                - - - -======= @@ -102,4 +49,3 @@ {$lang->last_page} ->>>>>>> .merge-right.r9269 diff --git a/modules/message/message.admin.view.php b/modules/message/message.admin.view.php index dd2594445..6a3322db6 100644 --- a/modules/message/message.admin.view.php +++ b/modules/message/message.admin.view.php @@ -1,4 +1,3 @@ -<<<<<<< .working getModuleConfig('message'); Context::set('config',$config); // Set a template file - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('config'); - } - - } -?> -======= -getskins($this->module_path); - Context::set('skin_list', $skin_list); - - // 설정 정보를 받아옴 (module model 객체를 이용) - $config = $oModuleModel->getModuleConfig('message'); - Context::set('config',$config); - - // 템플릿 파일 지정 $this->setTemplatePath($this->module_path.'tpl'); //Security @@ -73,4 +36,3 @@ } ?> ->>>>>>> .merge-right.r9269 diff --git a/modules/module/module.admin.controller.php b/modules/module/module.admin.controller.php index c2fd38860..268db8b69 100644 --- a/modules/module/module.admin.controller.php +++ b/modules/module/module.admin.controller.php @@ -1,4 +1,3 @@ -<<<<<<< .working toBool()) return $output; // Permissions stored in the DB - foreach($grant as $grant_name => $group_srls) { - foreach($group_srls as $key => $val) { - $args = null; - $args->module_srl = $module_srl; - $args->name = $grant_name; - $args->group_srl = $val; - $output = executeQuery('module.insertModuleGrant', $args); - if(!$output->toBool()) return $output; - } - } + if ($grant){ + foreach($grant as $grant_name => $group_srls) { + foreach($group_srls as $key => $val) { + $args = null; + $args->module_srl = $module_srl; + $args->name = $grant_name; + $args->group_srl = $val; + $output = executeQuery('module.insertModuleGrant', $args); + if(!$output->toBool()) return $output; + } + } + } $this->setMessage('success_registed'); } @@ -593,492 +594,3 @@ } ?> -======= -title = Context::get('title'); - $output = executeQuery('module.insertModuleCategory', $args); - if(!$output->toBool()) return $output; - - $this->setMessage("success_registed"); - } - - /** - * @brief 카테고리의 내용 수정 - **/ - function procModuleAdminUpdateCategory() { - $mode = Context::get('mode'); - - switch($mode) { - case 'delete' : - $output = $this->doDeleteModuleCategory(); - $msg_code = 'success_deleted'; - break; - case 'update' : - $output = $this->doUpdateModuleCategory(); - $msg_code = 'success_updated'; - break; - } - if(!$output->toBool()) return $output; - - $this->setMessage($msg_code); - } - - /** - * @brief 모듈 카테고리의 제목 변경 - **/ - function doUpdateModuleCategory() { - $args->title = Context::get('title'); - $args->module_category_srl = Context::get('module_category_srl'); - return executeQuery('module.updateModuleCategory', $args); - } - - /** - * @brief 모듈 카테고리 삭제 - **/ - function doDeleteModuleCategory() { - $args->module_category_srl = Context::get('module_category_srl'); - return executeQuery('module.deleteModuleCategory', $args); - } - - /** - * @brief 모듈 복사 - **/ - function procModuleAdminCopyModule() { - // 복사하려는 대상 모듈의 정보를 구함 - $module_srl = Context::get('module_srl'); - if(!$module_srl) return; - - // 새로 생성하려는 모듈들의 이름/브라우저 제목을 구함 - $clones = array(); - $args = Context::getAll(); - for($i=1;$i<=10;$i++) { - $mid = trim($args->{"mid_".$i}); - if(!$mid) continue; - if(!preg_match("/^[a-zA-Z]([a-zA-Z0-9_]*)$/i", $mid)) return new Object(-1, 'msg_limit_mid'); - $browser_title = $args->{"browser_title_".$i}; - if(!$mid) continue; - if($mid && !$browser_title) $browser_title = $mid; - $clones[$mid] = $browser_title; - } - if(!count($clones)) return; - - $oModuleModel = &getModel('module'); - $oModuleController = &getController('module'); - - // 모듈 정보 가져옴 - $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); - - // 권한 정보 가져옴 - $module_args->module_srl = $module_srl; - $output = executeQueryArray('module.getModuleGrants', $module_args); - $grant = array(); - if($output->data) { - foreach($output->data as $key => $val) $grant[$val->name][] = $val->group_srl; - } - - - $oDB = &DB::getInstance(); - $oDB->begin(); - - // 모듈 복사 - foreach($clones as $mid => $browser_title) { - $clone_args = null; - $clone_args = clone($module_info); - $clone_args->module_srl = null; - $clone_args->content = null; - $clone_args->mid = $mid; - $clone_args->browser_title = $browser_title; - $clone_args->is_default = 'N'; - - // 모듈 생성 - $output = $oModuleController->insertModule($clone_args); - $module_srl = $output->get('module_srl'); - - // 권한 정보 등록 - if(count($grant)) $oModuleController->insertModuleGrants($module_srl, $grant); - } - - $oDB->commit(); - $this->setMessage('success_registed'); - } - - /** - * @brief 모듈 권한 저장 - **/ - function procModuleAdminInsertGrant() { - $oModuleController = &getController('module'); - $oModuleModel = &getModel('module'); - - // 모듈 번호 구함 - $module_srl = Context::get('module_srl'); - - // 해당 모듈의 정보를 구함 - $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); - if(!$module_info) return new Object(-1,'msg_invalid_request'); - - // 관리자 아이디 등록 - $oModuleController->deleteAdminId($module_srl); - $admin_member = Context::get('admin_member'); - if($admin_member) { - $admin_members = explode(',',$admin_member); - for($i=0;$iinsertAdminId($module_srl, $admin_id); - - } - } - - // 권한 정리 - $xml_info = $oModuleModel->getModuleActionXML($module_info->module); - - $grant_list = $xml_info->grant; - - $grant_list->access->default = 'guest'; - $grant_list->manager->default = 'manager'; - - foreach($grant_list as $grant_name => $grant_info) { - // default값을 구함 - $default = Context::get($grant_name.'_default'); - - // -1 = 로그인 사용자만, -2 = 사이트 가입자만, 0 = 모든 사용자 - if(strlen($default)){ - $grant->{$grant_name}[] = $default; - continue; - - // 특정 그룹 사용자 - } else { - $group_srls = Context::get($grant_name); - if($group_srls) { - if(strpos($group_srls,'|@|')!==false) $group_srls = explode('|@|',$group_srls); - elseif(strpos($group_srls,',')!==false) $group_srls = explode(',',$group_srls); - else $group_srls = array($group_srls); - $grant->{$grant_name} = $group_srls; - } - continue; - } - $grant->{$group_srls} = array(); - } - - // DB에 저장 - $args->module_srl = $module_srl; - $output = executeQuery('module.deleteModuleGrants', $args); - if(!$output->toBool()) return $output; - - // DB에 권한 저장 - if ($grant){ - foreach($grant as $grant_name => $group_srls) { - foreach($group_srls as $key => $val) { - $args = null; - $args->module_srl = $module_srl; - $args->name = $grant_name; - $args->group_srl = $val; - $output = executeQuery('module.insertModuleGrant', $args); - if(!$output->toBool()) return $output; - } - } - } - $this->setMessage('success_registed'); - } - - /** - * @brief 스킨 정보 업데이트 - **/ - function procModuleAdminUpdateSkinInfo() { - // module_srl에 해당하는 정보들을 가져오기 - $module_srl = Context::get('module_srl'); - - $oModuleModel = &getModel('module'); - $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); - if($module_info->module_srl) { - $skin = $module_info->skin; - - // 스킨의 정보를 구해옴 (extra_vars를 체크하기 위해서) - $module_path = './modules/'.$module_info->module; - $skin_info = $oModuleModel->loadSkinInfo($module_path, $skin); - $skin_vars = $oModuleModel->getModuleSkinVars($module_srl); - // 입력받은 변수들을 체크 (mo, act, module_srl, page등 기본적인 변수들 없앰) - $obj = Context::getRequestVars(); - unset($obj->act); - unset($obj->module_srl); - unset($obj->page); - unset($obj->mid); - unset($obj->module); - - // 원 skin_info에서 extra_vars의 type이 image일 경우 별도 처리를 해줌 - if($skin_info->extra_vars) { - foreach($skin_info->extra_vars as $vars) { - if($vars->type!='image') continue; - - $image_obj = $obj->{$vars->name}; - - // 삭제 요청에 대한 변수를 구함 - $del_var = $obj->{"del_".$vars->name}; - unset($obj->{"del_".$vars->name}); - if($del_var == 'Y') { - FileHandler::removeFile($skin_vars[$vars->name]->value); - continue; - } - - // 업로드 되지 않았다면 이전 데이터를 그대로 사용 - if(!$image_obj['tmp_name']) { - $obj->{$vars->name} = $skin_vars[$vars->name]->value; - continue; - } - - // 정상적으로 업로드된 파일이 아니면 무시 - if(!is_uploaded_file($image_obj['tmp_name'])) { - unset($obj->{$vars->name}); - continue; - } - - // 이미지 파일이 아니어도 무시 - if(!preg_match("/\.(jpg|jpeg|gif|png)$/i", $image_obj['name'])) { - unset($obj->{$vars->name}); - continue; - } - - // 경로를 정해서 업로드 - $path = sprintf("./files/attach/images/%s/", $module_srl); - - // 디렉토리 생성 - if(!FileHandler::makeDir($path)) return false; - - $filename = $path.$image_obj['name']; - - // 파일 이동 - if(!move_uploaded_file($image_obj['tmp_name'], $filename)) { - unset($obj->{$vars->name}); - continue; - } - - // 정상 파일 업로드 - FileHandler::removeFile($skin_vars[$vars->name]->value); - // 변수를 바꿈 - unset($obj->{$vars->name}); - $obj->{$vars->name} = $filename; - } - } - // 해당 모듈의 전체 스킨 불러와서 이미지는 제거 - /* - if($skin_info->extra_vars) { - foreach($skin_info->extra_vars as $vars) { - if($vars->type!='image') continue; - $value = $skin_vars[$vars->name]; - if(file_exists($value)) @unlink($value); - } - } - */ - $oModuleController = &getController('module'); - $oModuleController->deleteModuleSkinVars($module_srl); - - // 등록 - $oModuleController->insertModuleSkinVars($module_srl, $obj); - } - - $this->setLayoutPath('./common/tpl'); - $this->setLayoutFile('default_layout.html'); - $this->setTemplatePath('./modules/module/tpl'); - $this->setTemplateFile("top_refresh.html"); - } - - /** - * @brief 모듈 일괄 정리 - **/ - function procModuleAdminModuleSetup() { - $vars = Context::getRequestVars(); - - if(!$vars->module_srls) return new Object(-1,'msg_invalid_request'); - - $module_srls = explode(',',$vars->module_srls); - if(!count($module_srls)) return new Object(-1,'msg_invalid_request'); - - $oModuleModel = &getModel('module'); - $oModuleController= &getController('module'); - foreach($module_srls as $module_srl) { - $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl); - $module_info->module_category_srl = $vars->module_category_srl; - $module_info->layout_srl = $vars->layout_srl; - $module_info->skin = $vars->skin; - $module_info->description = $vars->description; - $module_info->header_text = $vars->header_text; - $module_info->footer_text = $vars->footer_text; - $oModuleController->updateModule($module_info); - } - - $this->setMessage('success_registed'); - } - - /** - * @brief 모듈 권한 일괄 정리 - **/ - function procModuleAdminModuleGrantSetup() { - $module_srls = Context::get('module_srls'); - if(!$module_srls) return new Object(-1,'msg_invalid_request'); - - $modules = explode(',',$module_srls); - if(!count($modules)) return new Object(-1,'msg_invalid_request'); - - $oModuleController = &getController('module'); - $oModuleModel = &getModel('module'); - - $module_info = $oModuleModel->getModuleInfoByModuleSrl($modules[0]); - $xml_info = $oModuleModel->getModuleActionXml($module_info->module); - $grant_list = $xml_info->grant; - - $grant_list->access->default = 'guest'; - $grant_list->manager->default = 'manager'; - - foreach($grant_list as $grant_name => $grant_info) { - // default값을 구함 - $default = Context::get($grant_name.'_default'); - - // -1 = 로그인 사용자만, 0 = 모든 사용자 - if(strlen($default)){ - $grant->{$grant_name}[] = $default; - continue; - - // 특정 그룹 사용자 - } else { - $group_srls = Context::get($grant_name); - if($group_srls) { - if(strpos($group_srls,'|@|')!==false) $group_srls = explode('|@|',$group_srls); - elseif(strpos($group_srls,',')!==false) $group_srls = explode(',',$group_srls); - else $group_srls = array($group_srls); - $grant->{$grant_name} = $group_srls; - } - continue; - } - $grant->{$group_srls} = array(); - } - - - // DB에 저장 - foreach($modules as $module_srl) { - $args = null; - $args->module_srl = $module_srl; - $output = executeQuery('module.deleteModuleGrants', $args); - if(!$output->toBool()) continue; - - // DB에 권한 저장 - foreach($grant as $grant_name => $group_srls) { - foreach($group_srls as $key => $val) { - $args = null; - $args->module_srl = $module_srl; - $args->name = $grant_name; - $args->group_srl = $val; - $output = executeQuery('module.insertModuleGrant', $args); - if(!$output->toBool()) return $output; - } - } - } - $this->setMessage('success_registed'); - } - - /** - * @brief 언어 추가/ 업데이트 - **/ - function procModuleAdminInsertLang() { - // 언어코드명 가져옴 - $site_module_info = Context::get('site_module_info'); - $args->site_srl = (int)$site_module_info->site_srl; - $args->name = str_replace(' ','_',Context::get('lang_code')); - if(!$args->name) return new Object(-1,'msg_invalid_request'); - - // 언어코드가 있는지 조사 - $output = executeQueryArray('module.getLang', $args); - if(!$output->toBool()) return $output; - - // 있으면 업데이트를 위해 기존 값들을 지움 - if($output->data) $output = executeQuery('module.deleteLang', $args); - if(!$output->toBool()) return $output; - - // 입력 - $lang_supported = Context::get('lang_supported'); - foreach($lang_supported as $key => $val) { - $args->lang_code = $key; - $args->value = trim(Context::get($key)); - if(!$args->value) { - $args->value = Context::get(strtolower($key)); - if(!$args->value) $args->value = $args->name; - } - $output = executeQuery('module.insertLang', $args); - if(!$output->toBool()) return $output; - } - $this->makeCacheDefinedLangCode($args->site_srl); - - $this->add('name', $args->name); - } - - /** - * @brief 언어 제거 - **/ - function procModuleAdminDeleteLang() { - // 언어코드명 가져옴 - $site_module_info = Context::get('site_module_info'); - $args->site_srl = (int)$site_module_info->site_srl; - $args->name = str_replace(' ','_',Context::get('name')); - if(!$args->name) return new Object(-1,'msg_invalid_request'); - - $output = executeQuery('module.deleteLang', $args); - if(!$output->toBool()) return $output; - $this->makeCacheDefinedLangCode($args->site_srl); - } - - /** - * @brief 사용자 정이 언어코드 파일 저장 - **/ - function makeCacheDefinedLangCode($site_srl = 0) { - // 현재 사이트의 언어파일 가져오기 - if(!$site_srl) { - $site_module_info = Context::get('site_module_info'); - $args->site_srl = (int)$site_module_info->site_srl; - } else { - $args->site_srl = $site_srl; - } - $output = executeQueryArray('module.getLang', $args); - if(!$output->toBool() || !$output->data) return; - - // 캐시 디렉토리 설정 - $cache_path = _XE_PATH_.'files/cache/lang_defined/'; - if(!is_dir($cache_path)) FileHandler::makeDir($cache_path); - - $lang_supported = Context::get('lang_supported'); - foreach($lang_supported as $key => $val) { - $fp[$key] = fopen( sprintf('%s/%d.%s.php', $cache_path, $args->site_srl, $key), 'w' ); - if(!$fp[$key]) return; - fwrite($fp[$key],"data as $key => $val) { - if($fp[$val->lang_code]) fwrite($fp[$val->lang_code], sprintf('$lang["%s"] = "%s";'."\r\n", $val->name, str_replace('"','\\"',$val->value))); - } - - foreach($lang_supported as $key => $val) { - if(!$fp[$key]) continue; - fwrite($fp[$key],"?>"); - fclose($fp[$key]); - } - } - - } -?> ->>>>>>> .merge-right.r9269 diff --git a/modules/opage/opage.view.php b/modules/opage/opage.view.php index 25b94c93a..57cbae46e 100644 --- a/modules/opage/opage.view.php +++ b/modules/opage/opage.view.php @@ -1,4 +1,3 @@ -<<<<<<< .working path = str_replace('\\', '/', realpath($path_info['dirname'])).'/'; - $content = preg_replace_callback('/(target=|src=|href=|url\()("|\')?([^"\'\)]+)("|\'\))?/is',array($this,'_replacePath'),$content); + $content = preg_replace_callback('/(src=|href=|url\()("|\')?([^"\'\)]+)("|\'\))?/is',array($this,'_replacePath'),$content); + $content = preg_replace_callback('/(]+target=)(")([^"]+)(")/is',array($this,'_replacePath'),$content); $content = preg_replace_callback('/( - - - - -
                                - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                Total {number_format($total_count)}, page {number_format($page)}/{number_format($total_page)}
                                {$lang->no}
                                -
                                - - - - -
                                -
                                {$lang->mid}
                                {$lang->browser_title}
                                {$lang->regdate}
                                 
                                {$no} - - {$lang->not_exists} - - {$module_category[$val->module_category_srl]->title} - - {htmlspecialchars($val->mid)}{$val->browser_title}{zdate($val->regdate,"Y-m-d")}{$lang->cmd_setup}{$lang->cmd_copy}{$lang->cmd_delete}
                                - - - - -
                                - - - -======= @@ -170,4 +83,3 @@ {$lang->last_page} ->>>>>>> .merge-right.r9269 diff --git a/modules/point/tpl/member_list.html b/modules/point/tpl/member_list.html index 1554edbf6..a038d8eda 100644 --- a/modules/point/tpl/member_list.html +++ b/modules/point/tpl/member_list.html @@ -1,4 +1,3 @@ -<<<<<<< .working @@ -22,9 +21,9 @@ {$no} - {htmlspecialchars($val->user_id)} - {htmlspecialchars($val->user_name)} - {htmlspecialchars($val->nick_name)} + {$val->user_id} + {$val->user_name} + {$val->nick_name}
                                @@ -91,96 +90,3 @@ {$lang->cmd_cancel}
                                -======= - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
                                {$lang->no}
                                {$lang->user_id}
                                {$lang->user_name}
                                {$lang->nick_name}
                                {$lang->point}
                                {$lang->level}
                                {$no}{$val->user_id}{$val->user_name}{$val->nick_name} -
                                - - - - - - -
                                -
                                {$val->level}
                                - -
                                - - - -
                                - - - - - - -
                                - - - -
                                - - - - - - - - {$lang->cmd_cancel} -
                                -
                                ->>>>>>> .merge-right.r9269 diff --git a/modules/poll/poll.admin.view.php b/modules/poll/poll.admin.view.php index a79ad5ffa..cab29a60b 100644 --- a/modules/poll/poll.admin.view.php +++ b/modules/poll/poll.admin.view.php @@ -1,4 +1,3 @@ -<<<<<<< .working page); Context::set('poll_list', $output->data); Context::set('page_navigation', $output->page_navigation); - Context::set('module_list', $module_list); + Context::set('module_list', $module_list); + + $security = new Security(); + $security->encodeHTML('poll_list..title'); // Set a template $this->setTemplatePath($this->module_path.'tpl'); $this->setTemplateFile('poll_list'); @@ -105,7 +107,12 @@ if(!$skin_list[$config->skin]) $config->skin = "default"; // Set the skin colorset once the configurations is completed Context::set('colorset_list', $skin_list[$config->skin]->colorset); - + + $security = new Security(); + $security->encodeHTML('config..'); + $security->encodeHTML('skin_list..title'); + $security->encodeHTML('colorset_list..name','colorset_list..title'); + // Set a template $this->setTemplatePath($this->module_path.'tpl'); $this->setTemplateFile('config'); @@ -151,140 +158,3 @@ } } ?> -======= -s_title= $search_keyword; - break; - case 'regdate' : - $args->s_regdate = $search_keyword; - break; - case 'ipaddress' : - $args->s_ipaddress= $search_keyword; - break; - } - } - // 목록을 구하기 위한 옵션 - $args->page = Context::get('page'); ///< 페이지 - $args->list_count = 50; ///< 한페이지에 보여줄 글 수 - $args->page_count = 10; ///< 페이지 네비게이션에 나타날 페이지의 수 - - $args->sort_index = 'list_order'; ///< 소팅 값 - - // 목록 구함 - $oPollAdminModel = &getAdminModel('poll'); - $output = $oPollAdminModel->getPollList($args); - - // 템플릿 변수 설정 - Context::set('total_count', $output->total_count); - Context::set('total_page', $output->total_page); - Context::set('page', $output->page); - Context::set('poll_list', $output->data); - Context::set('page_navigation', $output->page_navigation); - Context::set('module_list', $module_list); - - $security = new Security(); - $security->encodeHTML('poll_list..title'); - - // 템플릿 지정 - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('poll_list'); - } - - /** - * @brief 설문조사 스킨, 컬러셋 설정 - **/ - function dispPollAdminConfig() { - $oModuleModel = &getModel('module'); - - // 설정 정보 가져오기 - $config = $oModuleModel->getModuleConfig('poll'); - Context::set('config', $config); - - // 스킨 정보 가져오기 - $skin_list = $oModuleModel->getSkins($this->module_path); - Context::set('skin_list', $skin_list); - - if(!$skin_list[$config->skin]) $config->skin = "default"; - - // 설정된 스킨의 컬러셋 설정 - Context::set('colorset_list', $skin_list[$config->skin]->colorset); - - $security = new Security(); - $security->encodeHTML('config..'); - $security->encodeHTML('skin_list..title'); - $security->encodeHTML('colorset_list..name','colorset_list..title'); - - // 템플릿 지정 - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('config'); - } - - /** - * @brief 설문조사 결과 - **/ - function dispPollAdminResult() { - // 팝업 레이아웃 - $this->setLayoutFile("popup_layout"); - - // 결과 뽑기 - $args->poll_srl = Context::get('poll_srl'); - $args->poll_index_srl = Context::get('poll_index_srl'); - - $output = executeQuery('poll.getPoll', $args); - if(!$output->data) return $this->stop('msg_poll_not_exists'); - $poll->stop_date = $output->data->stop_date; - $poll->poll_count = $output->data->poll_count; - - $output = executeQuery('poll.getPollTitle', $args); - if(!$output->data) return $this->stop('msg_poll_not_exists'); - - $poll->poll[$args->poll_index_srl]->title = $output->data->title; - $poll->poll[$args->poll_index_srl]->checkcount = $output->data->checkcount; - $poll->poll[$args->poll_index_srl]->poll_count = $output->data->poll_count; - - $output = executeQuery('poll.getPollItem', $args); - foreach($output->data as $key => $val) { - $poll->poll[$val->poll_index_srl]->item[] = $val; - } - - $poll->poll_srl = $poll_srl; - - Context::set('poll',$poll); - - // 기본 설정의 스킨, 컬러셋 설정 - $oModuleModel = &getModel('module'); - $poll_config = $oModuleModel->getModuleConfig('poll'); - Context::set('poll_config', $poll_config); - - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('result'); - } - } -?> ->>>>>>> .merge-right.r9269 diff --git a/modules/syndication/syndication.admin.view.php b/modules/syndication/syndication.admin.view.php index 02bbe760b..ea34a1b8c 100644 --- a/modules/syndication/syndication.admin.view.php +++ b/modules/syndication/syndication.admin.view.php @@ -1,55 +1,3 @@ -<<<<<<< .working -getModuleConfig('syndication'); - if(!$module_config->target_services) $module_config->target_services = array(); - - foreach($this->services as $key => $val) { - unset($obj); - $obj->service = $key; - $obj->ping = $val; - $obj->selected = in_array($key, $module_config->target_services)?true:false; - $services[] = $obj; - } - Context::set('services', $services); - - if(!$module_config->site_url) { - $module_config->site_url = Context::getDefaultUrl()?Context::getDefaultUrl():getFullUrl(); - } - Context::set('site_url', preg_replace('/^(http|https):\/\//i','',$module_config->site_url)); - - if(!$module_config->year) { - $module_config->year = date("Y"); - } - Context::set('year', $module_config->year); - - $output = executeQueryArray('syndication.getExceptModules'); - $except_module_list = array(); - for($i=0,$c=count($output->data);$i<$c;$i++) { - $except_module_list[] = $output->data[$i]; - } - Context::set('except_module', $except_module_list); - - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('config'); - } - - } -?> -======= ->>>>>>> .merge-right.r9269 From 7929770dcd22e288e0dbd37ed03b7475d09f6bc0 Mon Sep 17 00:00:00 2001 From: taggon Date: Thu, 22 Sep 2011 10:35:40 +0000 Subject: [PATCH 0818/1372] Add tests for TemplateHandler git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9277 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- .../template/TemplateHandlerTest.class.php | 35 +++++++++++++++++-- tests/classes/template/sample.html | 2 +- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/tests/classes/template/TemplateHandlerTest.class.php b/tests/classes/template/TemplateHandlerTest.class.php index 42759109c..a50331085 100644 --- a/tests/classes/template/TemplateHandlerTest.class.php +++ b/tests/classes/template/TemplateHandlerTest.class.php @@ -2,6 +2,7 @@ define('__DEBUG__', 1); define('_XE_PATH_', realpath(dirname(__FILE__).'/../../../')); +require _XE_PATH_.'/classes/file/FileHandler.class.php'; require _XE_PATH_.'/classes/template/TemplateHandler.class.php'; $_SERVER['SCRIPT_NAME'] = '/xe/index.php'; @@ -25,8 +26,8 @@ class TemplateHandlerTest extends PHPUnit_Framework_TestCase ), // cond array( - 'Link1Link2', - 'Link1var==$__Context->key){ ?>Link2' + 'Link1Link2', + 'Link1v==$__Context->k){ ?>Link2' ), // for loop array( @@ -83,6 +84,11 @@ class TemplateHandlerTest extends PHPUnit_Framework_TestCase 'ABC', 'var){ ?>ABC' ), + // invalid block statement + array( + '', + '' + ), // {@ ...PHP_CODE...} array( '{@$list_page = $page_no}', @@ -118,6 +124,11 @@ class TemplateHandlerTest extends PHPUnit_Framework_TestCase '', '' ), + // + array( + '', + 'compile(); ?>' + ), // array( '', @@ -178,8 +189,26 @@ class TemplateHandlerTest extends PHPUnit_Framework_TestCase { $tmpl = TemplateHandler::getInstance(); $tmpl->init(dirname(__FILE__), 'sample.html'); - $result = $tmpl->parse($tpl, $expected); + $result = $tmpl->parse($tpl); $this->assertEquals($result, $this->prefix.$expected); } + + public function testParse2() + { + $tmpl = TemplateHandler::getInstance(); + $tmpl->init(dirname(__FILE__), 'no_file.html'); + + $result = $tmpl->parse(); + $this->assertEquals($result, ''); + } + + public function testCompileDirect() + { + $tmpl = TemplateHandler::getInstance(); + $result = $tmpl->compileDirect(dirname(__FILE__), 'sample.html'); + $result = trim($result); + + $this->assertEquals($result, $this->prefix.'has_blog){ ?>Taggon\'s blog'); + } } diff --git a/tests/classes/template/sample.html b/tests/classes/template/sample.html index 3ce557d85..949b441ba 100644 --- a/tests/classes/template/sample.html +++ b/tests/classes/template/sample.html @@ -1 +1 @@ - +Taggon's blog From 650738a250066d0ba3d59861a011210e8bf73ff6 Mon Sep 17 00:00:00 2001 From: flyskyko Date: Thu, 22 Sep 2011 10:54:39 +0000 Subject: [PATCH 0819/1372] fix invalid encoding git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9278 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/member/conf/module.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/member/conf/module.xml b/modules/member/conf/module.xml index 5068807dc..bed4279ca 100644 --- a/modules/member/conf/module.xml +++ b/modules/member/conf/module.xml @@ -88,7 +88,7 @@ Member List - ȸ + 회원 목록 Member List Member List Member List @@ -101,7 +101,7 @@ Member Group - ȸ ׷ + 회원 그룹 Member Group Member Group Member Group @@ -114,7 +114,7 @@ Member Setting - ȸ + 회원 설정 Member Setting Member Setting Member Setting From 350c429fa9adfbdda835c27a1a54a7094ca800eb Mon Sep 17 00:00:00 2001 From: devjin Date: Thu, 22 Sep 2011 11:27:53 +0000 Subject: [PATCH 0820/1372] fix merge error git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9279 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/member/member.admin.view.php | 132 ++++++++++++++++++++------- 1 file changed, 99 insertions(+), 33 deletions(-) diff --git a/modules/member/member.admin.view.php b/modules/member/member.admin.view.php index 389eea016..ef773a7cc 100644 --- a/modules/member/member.admin.view.php +++ b/modules/member/member.admin.view.php @@ -7,17 +7,21 @@ class memberAdminView extends member { - var $group_list = NULL; ///< group list var $memberInfo = NULL; ///< selected member info + var $group_list = NULL; ///< group list + var $memberInfo = NULL; ///< selected member info /** - * @brief initialization **/ + * @brief initialization + **/ function init() { $oMemberModel = &getModel('member'); - // if member_srl exists, set memberInfo $member_srl = Context::get('member_srl'); + // if member_srl exists, set memberInfo + $member_srl = Context::get('member_srl'); if($member_srl) { $this->memberInfo = $oMemberModel->getMemberInfoByMemberSrl($member_srl); if(!$this->memberInfo) Context::set('member_srl',''); else Context::set('member_info',$this->memberInfo); } - // retrieve group list $this->group_list = $oMemberModel->getGroups(); + // retrieve group list + $this->group_list = $oMemberModel->getGroups(); Context::set('group_list', $this->group_list); $security = new Security(); @@ -27,23 +31,45 @@ } /** - * @brief display member list **/ + * @brief display member list + **/ function dispMemberAdminList() { $oMemberAdminModel = &getAdminModel('member'); $oMemberModel = &getModel('member'); $output = $oMemberAdminModel->getMemberList(); - $filter = Context::get('filter_type'); global $lang; switch($filter){ case 'super_admin' : Context::set('filter_type_title', $lang->cmd_show_super_admin_member);break; case 'site_admin' : Context::set('filter_type_title', $lang->cmd_show_site_admin_member);break; case 'enable' : Context::set('filter_type_title', $lang->approval);break; case 'disable' : Context::set('filter_type_title', $lang->denied);break; default : Context::set('filter_type_title', $lang->cmd_show_all_member);break; } // retrieve list of groups for each member + $filter = Context::get('filter_type'); + global $lang; + switch($filter){ + case 'super_admin' : Context::set('filter_type_title', $lang->cmd_show_super_admin_member);break; + case 'site_admin' : Context::set('filter_type_title', $lang->cmd_show_site_admin_member);break; + case 'enable' : Context::set('filter_type_title', $lang->approval);break; + case 'disable' : Context::set('filter_type_title', $lang->denied);break; + default : Context::set('filter_type_title', $lang->cmd_show_all_member);break; + } + // retrieve list of groups for each member if($output->data) { foreach($output->data as $key => $member) { $output->data[$key]->group_list = $oMemberModel->getMemberGroups($member->member_srl,0); } } - $config = $oMemberModel->getMemberConfig(); $memberIdentifiers = array('user_id'=>'user_id', 'user_name'=>'user_name', 'nick_name'=>'nick_name'); $usedIdentifiers = array(); foreach($config->signupForm as $signupItem){ if (!count($memberIdentifiers)) break; if(in_array($signupItem->name, $memberIdentifiers) && ($signupItem->required || $signupItem->isUse)){ unset($memberIdentifiers[$signupItem->name]); $usedIdentifiers[$signupItem->name] = $lang->{$signupItem->name}; } } Context::set('total_count', $output->total_count); + $config = $oMemberModel->getMemberConfig(); + $memberIdentifiers = array('user_id'=>'user_id', 'user_name'=>'user_name', 'nick_name'=>'nick_name'); + $usedIdentifiers = array(); + foreach($config->signupForm as $signupItem){ + if (!count($memberIdentifiers)) break; + if(in_array($signupItem->name, $memberIdentifiers) && ($signupItem->required || $signupItem->isUse)){ + unset($memberIdentifiers[$signupItem->name]); + $usedIdentifiers[$signupItem->name] = $lang->{$signupItem->name}; + } + } + + Context::set('total_count', $output->total_count); Context::set('total_page', $output->total_page); Context::set('page', $output->page); Context::set('member_list', $output->data); - Context::set('usedIdentifiers', $usedIdentifiers); Context::set('page_navigation', $output->page_navigation); + Context::set('usedIdentifiers', $usedIdentifiers); + Context::set('page_navigation', $output->page_navigation); $security = new Security(); $security->encodeHTML('member_list..user_name','member_list..group_list..'); @@ -59,7 +85,10 @@ $oModuleModel = &getModel('module'); $oMemberModel = &getModel('member'); $config = $oMemberModel->getMemberConfig(); - // Get join form list which is additionally set $extendItems = $oMemberModel->getJoinFormList(); Context::set('config',$config); + // Get join form list which is additionally set + $extendItems = $oMemberModel->getJoinFormList(); + + Context::set('config',$config); // list of skins for member module $skin_list = $oModuleModel->getSkins($this->module_path); @@ -99,7 +128,14 @@ $oModuleModel = &getModel('module'); $member_config = $oModuleModel->getModuleConfig('member'); Context::set('member_config', $member_config); - $extendForm = $oMemberModel->getCombineJoinForm($this->memberInfo); Context::set('extend_form_list', $extendForm); $memberInfo = get_object_vars(Context::get('member_info')); Context::set('memberInfo', $memberInfo); $disableColumns = array('password', 'find_account_question'); Context::set('disableColumns', $disableColumns); + $extendForm = $oMemberModel->getCombineJoinForm($this->memberInfo); + Context::set('extend_form_list', $extendForm); + $memberInfo = get_object_vars(Context::get('member_info')); + Context::set('memberInfo', $memberInfo); + + $disableColumns = array('password', 'find_account_question'); + Context::set('disableColumns', $disableColumns); + $security = new Security(); $security->encodeHTML('member_config..'); $security->encodeHTML('member_info.user_name','member_info.description','member_info.group_list..'); @@ -115,9 +151,13 @@ // retrieve extend form $oMemberModel = &getModel('member'); - $memberInfo = Context::get('member_info'); $memberInfo->signature = $oMemberModel->getSignature($this->memberInfo->member_srl); Context::set('member_info', $memberInfo); - // get an editor for the signature - if($memberInfo->member_srl) { $oEditorModel = &getModel('editor'); + $memberInfo = Context::get('member_info'); + $memberInfo->signature = $oMemberModel->getSignature($this->memberInfo->member_srl); + Context::set('member_info', $memberInfo); + + // get an editor for the signature + if($memberInfo->member_srl) { + $oEditorModel = &getModel('editor'); $option->primary_key_name = 'member_srl'; $option->content_key_name = 'signature'; $option->allow_fileupload = false; @@ -126,14 +166,25 @@ $option->enable_component = false; $option->resizable = false; $option->height = 200; - $editor = $oEditorModel->getEditor($this->memberInfo->member_srl, $option); Context::set('editor', $editor); + $editor = $oEditorModel->getEditor($this->memberInfo->member_srl, $option); + Context::set('editor', $editor); } $security = new Security(); $security->encodeHTML('extend_form_list..'); $security->encodeHTML('extend_form_list..default_value.'); - $formTags = $this->_getMemberInputTag($memberInfo); Context::set('formTags', $formTags); $member_config = $oMemberModel->getMemberConfig(); global $lang; if (!$member_config->identifier) $member_config->identifier = 'user_id'; $identifierForm->title = $lang->{$member_config->identifier}; $identifierForm->name = $member_config->identifier; $identifierForm->value = $memberInfo->{$member_config->identifier}; Context::set('identifierForm', $identifierForm); $this->setTemplateFile('insert_member'); + $formTags = $this->_getMemberInputTag($memberInfo); + Context::set('formTags', $formTags); + $member_config = $oMemberModel->getMemberConfig(); + + global $lang; + if (!$member_config->identifier) $member_config->identifier = 'user_id'; + $identifierForm->title = $lang->{$member_config->identifier}; + $identifierForm->name = $member_config->identifier; + $identifierForm->value = $memberInfo->{$member_config->identifier}; + Context::set('identifierForm', $identifierForm); + $this->setTemplateFile('insert_member'); } function _getMemberInputTag($memberInfo){ @@ -314,7 +365,7 @@ EOD; $this->setTemplateFile('delete_form'); } - /** ->group_update_form + /** * @brief display group list **/ function dispMemberAdminGroupList() { @@ -331,13 +382,18 @@ EOD; } else { $this->setTemplateFile('group_list'); } - $output = $oModuleModel->getModuleFileBoxList(); Context::set('fileBoxList', $output->data); } + $output = $oModuleModel->getModuleFileBoxList(); + Context::set('fileBoxList', $output->data); + } - /** O - * @brief Display a list of member join form **/ + /** + * @brief Display a list of member join form + **/ function dispMemberAdminJoinFormList() { - // Create a member model object $oMemberModel = &getModel('member'); - // Get join form list which is additionally set $form_list = $oMemberModel->getJoinFormList(); + // Create a member model object + $oMemberModel = &getModel('member'); + // Get join form list which is additionally set + $form_list = $oMemberModel->getJoinFormList(); Context::set('form_list', $form_list); $security = new Security($form_list); $security->encodeHTML('form_list..'); @@ -345,10 +401,12 @@ EOD; $this->setTemplateFile('join_form_list'); } - /** O h, ck - * @brief Display an admin page for memebr join forms **/ + /** + * @brief Display an admin page for memebr join forms + **/ function dispMemberAdminInsertJoinForm() { - // Get the value of join_form $member_join_form_srl = Context::get('member_join_form_srl'); + // Get the value of join_form + $member_join_form_srl = Context::get('member_join_form_srl'); if($member_join_form_srl) { $oMemberModel = &getModel('member'); $join_form = $oMemberModel->getJoinForm($member_join_form_srl); @@ -364,11 +422,14 @@ EOD; $this->setTemplateFile('insert_join_form'); } - /** O - * @brief Display denied ID list **/ + /** + * @brief Display denied ID list + **/ function dispMemberAdminDeniedIDList() { - // Create a member model object $oMemberModel = &getModel('member'); - // Get a denied ID list $output = $oMemberModel->getDeniedIDList(); + // Create a member model object + $oMemberModel = &getModel('member'); + // Get a denied ID list + $output = $oMemberModel->getDeniedIDList(); Context::set('total_count', $output->total_count); Context::set('total_page', $output->total_page); @@ -382,12 +443,15 @@ EOD; } /** - * @brief Update all the member groups **/ + * @brief Update all the member groups + **/ function dispMemberAdminManageGroup() { - // Get a list of the selected member $args->member_srl = trim(Context::get('member_srls')); + // Get a list of the selected member + $args->member_srl = trim(Context::get('member_srls')); $output = executeQueryArray('member.getMembers', $args); Context::set('member_list', $output->data); - // Get a list of the selected member $oMemberModel = &getModel('member'); + // Get a list of the selected member + $oMemberModel = &getModel('member'); Context::set('member_groups', $oMemberModel->getGroups()); $security = new Security(); @@ -398,9 +462,11 @@ EOD; } /** - * @brief Delete all members **/ + * @brief Delete all members + **/ function dispMemberAdminDeleteMembers() { - // Get a list of the selected member $args->member_srl = trim(Context::get('member_srls')); + // Get a list of the selected member + $args->member_srl = trim(Context::get('member_srls')); $output = executeQueryArray('member.getMembers', $args); Context::set('member_list', $output->data); From d77795717ed95f79992879fc5127cdb329def9e1 Mon Sep 17 00:00:00 2001 From: devjin Date: Thu, 22 Sep 2011 11:28:17 +0000 Subject: [PATCH 0821/1372] fix merge error git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9280 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/page/page.admin.view.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/modules/page/page.admin.view.php b/modules/page/page.admin.view.php index e80860613..e35d79e7b 100644 --- a/modules/page/page.admin.view.php +++ b/modules/page/page.admin.view.php @@ -260,15 +260,12 @@ $oWidgetModel = &getModel('widget'); $widget_list = $oWidgetModel->getDownloadedWidgetList(); Context::set('widget_list', $widget_list); - // Set a template file - $this->setTemplateFile('page_content_modify'); - } //Security $security = new Security(); $security->encodeHTML('widget_list..title','module_info.mid'); - // 템플릿 파일 지정 + // Set a template file $this->setTemplateFile('page_content_modify'); } From bb1aca2a8b117dee19022a8b62cd5cdd29c80b75 Mon Sep 17 00:00:00 2001 From: devjin Date: Thu, 22 Sep 2011 11:57:44 +0000 Subject: [PATCH 0822/1372] fix merge error git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9281 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/module/module.admin.view.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/module/module.admin.view.php b/modules/module/module.admin.view.php index 8901126d8..df86c4b13 100644 --- a/modules/module/module.admin.view.php +++ b/modules/module/module.admin.view.php @@ -166,7 +166,7 @@ $security = new Security(); $security->encodeHTML('layout_list..title','layout_list..layout'); $security->encodeHTML('skin_list....'); - $security->encodeHTML('module_category...') + $security->encodeHTML('module_category...'); // Set the layout to be pop-up $this->setLayoutFile('popup_layout'); From 5a027fbdf5bc4aade82e55c2e0eb2032a36df49e Mon Sep 17 00:00:00 2001 From: taggon Date: Thu, 22 Sep 2011 11:59:26 +0000 Subject: [PATCH 0823/1372] Fixed a bug for compiling templates git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9282 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/template/TemplateHandler.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/template/TemplateHandler.class.php b/classes/template/TemplateHandler.class.php index 88a6dbe8b..e0f47bc55 100644 --- a/classes/template/TemplateHandler.class.php +++ b/classes/template/TemplateHandler.class.php @@ -154,7 +154,7 @@ } // replace value of src in img/input/script tag - $buff = preg_replace_callback('/(<(?:img|input|script)(?:->||[^<>])*)\ssrc="(?!https?:\/\/|[\/\{])(.+?)"/is', array($this, '_replacePath'), $buff); + $buff = preg_replace_callback('/(<(?:img|input|script)(?:->|[^<>\-])*)\ssrc="(?!https?:\/\/|[\/\{])(.+?)"/is', array($this, '_replacePath'), $buff); // replace loop and cond template syntax $buff = $this->_parseInline($buff); From c41ca3184a98908657e0b5e7a0dc1241639f50c2 Mon Sep 17 00:00:00 2001 From: taggon Date: Thu, 22 Sep 2011 13:12:19 +0000 Subject: [PATCH 0824/1372] Fixed some bugs git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9283 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/template/TemplateHandler.class.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/classes/template/TemplateHandler.class.php b/classes/template/TemplateHandler.class.php index e0f47bc55..b57bad00b 100644 --- a/classes/template/TemplateHandler.class.php +++ b/classes/template/TemplateHandler.class.php @@ -274,11 +274,11 @@ function _parseInline($buff) { - if(preg_match_all('/<([a-zA-Z0-9]+)(?:->||[^<>])*?(?:[ \|]cond| loop)="/s', $buff, $matches) === false) return $buff; + if(preg_match_all('/<([a-zA-Z0-9]+)[^<>]*?(?:\{[^\{\}]*?\}[^<>]*)*?(?:[ \|]cond| loop)="/s', $buff, $matches) === false) return $buff; $tags = array_unique($matches[1]); $tags = implode('|',array_unique($matches[1])); - $split_regex = '@(<(?:/(?:'.$tags.')|(?:'.$tags.')(?:(?:->||[^<>])*?(?:cond|loop)="[^"]+")*)(?:->||[^<>])*>)@s'; + $split_regex = '@(<(?:/?(?:'.$tags.')|(?:'.$tags.').+?[ "\'])>)@s'; $nodes = preg_split($split_regex, $buff, -1, PREG_SPLIT_DELIM_CAPTURE); @@ -327,7 +327,7 @@ $depth = 1; for($i=$idx+2; $i < $node_len; $i+=2) { $nd = $nodes[$i]; - if(strpos($nd, $tag.' ') === 1) { + if(strpos($nd, $tag) === 1) { $depth++; } elseif(strpos($nd, '/'.$tag) === 1) { $depth--; From 285a5bd45d0bc64e436e5f737b0c123113c6bff1 Mon Sep 17 00:00:00 2001 From: taggon Date: Thu, 22 Sep 2011 14:44:25 +0000 Subject: [PATCH 0825/1372] Optimize regex for template engine git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9284 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/template/TemplateHandler.class.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/classes/template/TemplateHandler.class.php b/classes/template/TemplateHandler.class.php index b57bad00b..042d999a3 100644 --- a/classes/template/TemplateHandler.class.php +++ b/classes/template/TemplateHandler.class.php @@ -274,11 +274,10 @@ function _parseInline($buff) { - if(preg_match_all('/<([a-zA-Z0-9]+)[^<>]*?(?:\{[^\{\}]*?\}[^<>]*)*?(?:[ \|]cond| loop)="/s', $buff, $matches) === false) return $buff; + if(preg_match_all('/<([a-zA-Z0-9]+)[^>]*(?:(?:|{[^}]*?})[^>]*)*?(?:[ \|]cond| loop)="/s', $buff, $matches) === false) return $buff; - $tags = array_unique($matches[1]); - $tags = implode('|',array_unique($matches[1])); - $split_regex = '@(<(?:/?(?:'.$tags.')|(?:'.$tags.').+?[ "\'])>)@s'; + $tags = '(?:'.implode('|',array_unique($matches[1])).')'; + $split_regex = '@(<(?:/?'.$tags.'|'.$tags.'.*?["\'/]\s*)>)@s'; $nodes = preg_split($split_regex, $buff, -1, PREG_SPLIT_DELIM_CAPTURE); From 415bdcb3579189bb82aad538489d3bf3ae2223fe Mon Sep 17 00:00:00 2001 From: taggon Date: Thu, 22 Sep 2011 14:48:36 +0000 Subject: [PATCH 0826/1372] Fixed template syntax bug git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9285 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/member/tpl/group_list.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/member/tpl/group_list.html b/modules/member/tpl/group_list.html index d3d943aa9..7cd3f47ad 100644 --- a/modules/member/tpl/group_list.html +++ b/modules/member/tpl/group_list.html @@ -6,10 +6,10 @@ xe.lang.delete = '{$lang->cmd_delete}';

                                {$XE_VALIDATOR_MESSAGE}

                                @@ -131,4 +131,4 @@ {$lang->link_file_box}
                                - \ No newline at end of file + From bebb46c072d6a966bd45676d58f3a5f8dc0c9a3e Mon Sep 17 00:00:00 2001 From: ucorina Date: Thu, 22 Sep 2011 16:13:45 +0000 Subject: [PATCH 0827/1372] Added connection information to _debug_message.php. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9286 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/db/DB.class.php | 8 ++++++++ classes/display/DisplayHandler.class.php | 5 +++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/classes/db/DB.class.php b/classes/db/DB.class.php index c58662e3d..cfcff5b9b 100644 --- a/classes/db/DB.class.php +++ b/classes/db/DB.class.php @@ -63,6 +63,7 @@ var $errno = 0; ///< error code (0 means no error) var $errstr = ''; ///< error message var $query = ''; ///< query string of latest executed query + var $connection = ''; var $elapsed_time = 0; ///< elapsed time of latest executed query var $elapsed_dbclass_time = 0; ///< elapsed time of latest executed query @@ -244,6 +245,7 @@ $log['query'] = $this->query; $log['elapsed_time'] = $elapsed_time; + $log['connection'] = $this->connection; // leave error log if an error occured (if __DEBUG_DB_OUTPUT__ is defined) if($this->isError()) { @@ -614,6 +616,7 @@ if($type == master){ if(!$this->master_db['is_connected']) $this->_connect($type); + $this->connection = 'Master ' . $this->master_db['db_hostname']; return $this->master_db["resource"]; } @@ -622,6 +625,8 @@ if(!$this->slave_db[$indx]['is_connected']) $this->_connect($type, $indx); + + $this->connection = 'Slave ' . $this->slave_db[$indx]['db_hostname']; return $this->slave_db[$indx]["resource"]; } @@ -765,6 +770,9 @@ $connection["resource"] = $result; $connection["is_connected"] = true; + // Save connection info for db logs + $this->connection = ucfirst($type) . ' ' . $connection["db_hostname"]; + $this->_afterConnect($result); } /** diff --git a/classes/display/DisplayHandler.class.php b/classes/display/DisplayHandler.class.php index 84d0a8c32..13b4d68aa 100644 --- a/classes/display/DisplayHandler.class.php +++ b/classes/display/DisplayHandler.class.php @@ -2,7 +2,7 @@ /** * @class DisplayHandler * @author NHN (developers@xpressengine.com) - * @brief DisplayHandler is responsible for displaying the execution result. \n + * @brief DisplayHandler is responsible for displaying the execution result. \n * Depending on the request type, it can display either HTML or XML content.\n * Xml content is simple xml presentation of variables in oModule while html content * is the combination of the variables of oModue and template files/. @@ -16,7 +16,7 @@ var $handler = null; /** - * @brief print either html or xml content given oModule object + * @brief print either html or xml content given oModule object * @remark addon execution and the trigger execution are included within this method, which * might create inflexibility for the fine grained caching * @param[in] $oModule the module object @@ -183,6 +183,7 @@ } else { $buff .= sprintf("Query $s : %d\n\t\t\t %s\n", $query['result'], $query['errno'], $query['errstr']); } + $buff .= sprintf("\t\tConnection: %s\n", $query['connection']); } } } From e4294e0dff3075c3b4f35d216384a3bfc7ffe160 Mon Sep 17 00:00:00 2001 From: devjin Date: Fri, 23 Sep 2011 01:58:54 +0000 Subject: [PATCH 0828/1372] delete syndication module git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9287 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/syndication/conf/info.xml | 18 - modules/syndication/conf/module.xml | 12 - modules/syndication/lang/lang.xml | 116 ------ .../queries/deleteExceptModules.xml | 5 - .../syndication/queries/getDeletedList.xml | 19 - .../syndication/queries/getDocumentList.xml | 31 -- .../syndication/queries/getExceptModule.xml | 11 - .../queries/getExceptModuleSrls.xml | 8 - .../syndication/queries/getExceptModules.xml | 14 - .../syndication/queries/getGrantedModule.xml | 17 - .../syndication/queries/getGrantedModules.xml | 19 - modules/syndication/queries/getLang.xml | 12 - .../syndication/queries/getModuleSiteInfo.xml | 15 - modules/syndication/queries/getModules.xml | 26 -- .../queries/getSiteUpdatedTime.xml | 14 - .../queries/insertExceptModule.xml | 9 - modules/syndication/queries/insertLog.xml | 13 - modules/syndication/ruleset/insertService.xml | 8 - .../schemas/syndication_except_modules.xml | 4 - .../syndication/schemas/syndication_logs.xml | 8 - .../syndication.admin.controller.php | 140 ------- .../syndication/syndication.admin.view.php | 56 --- modules/syndication/syndication.class.php | 74 ---- .../syndication/syndication.controller.php | 127 ------ modules/syndication/syndication.model.php | 383 ------------------ modules/syndication/tpl/channel.html | 16 - modules/syndication/tpl/channel.info.html | 5 - modules/syndication/tpl/config.html | 63 --- modules/syndication/tpl/css/syndication.css | 17 - modules/syndication/tpl/error.html | 5 - .../syndication/tpl/filter/insert_service.xml | 8 - modules/syndication/tpl/include.articles.html | 14 - modules/syndication/tpl/include.channel.html | 8 - modules/syndication/tpl/include.channels.html | 8 - modules/syndication/tpl/include.deleted.html | 8 - modules/syndication/tpl/include.site.html | 5 - modules/syndication/tpl/js/syndication.js | 55 --- modules/syndication/tpl/naver_result.html | 41 -- modules/syndication/tpl/site.html | 21 - modules/syndication/tpl/site.info.html | 4 - 40 files changed, 1437 deletions(-) delete mode 100644 modules/syndication/conf/info.xml delete mode 100644 modules/syndication/conf/module.xml delete mode 100644 modules/syndication/lang/lang.xml delete mode 100644 modules/syndication/queries/deleteExceptModules.xml delete mode 100644 modules/syndication/queries/getDeletedList.xml delete mode 100644 modules/syndication/queries/getDocumentList.xml delete mode 100644 modules/syndication/queries/getExceptModule.xml delete mode 100644 modules/syndication/queries/getExceptModuleSrls.xml delete mode 100644 modules/syndication/queries/getExceptModules.xml delete mode 100644 modules/syndication/queries/getGrantedModule.xml delete mode 100644 modules/syndication/queries/getGrantedModules.xml delete mode 100644 modules/syndication/queries/getLang.xml delete mode 100644 modules/syndication/queries/getModuleSiteInfo.xml delete mode 100644 modules/syndication/queries/getModules.xml delete mode 100644 modules/syndication/queries/getSiteUpdatedTime.xml delete mode 100644 modules/syndication/queries/insertExceptModule.xml delete mode 100644 modules/syndication/queries/insertLog.xml delete mode 100644 modules/syndication/ruleset/insertService.xml delete mode 100644 modules/syndication/schemas/syndication_except_modules.xml delete mode 100644 modules/syndication/schemas/syndication_logs.xml delete mode 100644 modules/syndication/syndication.admin.controller.php delete mode 100644 modules/syndication/syndication.admin.view.php delete mode 100644 modules/syndication/syndication.class.php delete mode 100644 modules/syndication/syndication.controller.php delete mode 100644 modules/syndication/syndication.model.php delete mode 100644 modules/syndication/tpl/channel.html delete mode 100644 modules/syndication/tpl/channel.info.html delete mode 100644 modules/syndication/tpl/config.html delete mode 100644 modules/syndication/tpl/css/syndication.css delete mode 100644 modules/syndication/tpl/error.html delete mode 100644 modules/syndication/tpl/filter/insert_service.xml delete mode 100644 modules/syndication/tpl/include.articles.html delete mode 100644 modules/syndication/tpl/include.channel.html delete mode 100644 modules/syndication/tpl/include.channels.html delete mode 100644 modules/syndication/tpl/include.deleted.html delete mode 100644 modules/syndication/tpl/include.site.html delete mode 100644 modules/syndication/tpl/js/syndication.js delete mode 100644 modules/syndication/tpl/naver_result.html delete mode 100644 modules/syndication/tpl/site.html delete mode 100644 modules/syndication/tpl/site.info.html diff --git a/modules/syndication/conf/info.xml b/modules/syndication/conf/info.xml deleted file mode 100644 index 59994825c..000000000 --- a/modules/syndication/conf/info.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - Syndication - 聯合供搞 - İçerik Paylaşımı - 검색서비스업체와 직접 통신을 통해 컨텐츠를 잘 검색되도록 하는 Syndication 규약을 따라 정보를 주고받는 모듈 - 검색서비스업체와 직접 통신을 통해 컨텐츠를 잘 검색되도록 하는 Syndication 규약을 따라 정보를 주고받는 모듈 - 검색서비스업체와 직접 통신을 통해 컨텐츠를 잘 검색되도록 하는 Syndication 규약을 따라 정보를 주고받는 모듈 - 1.0.1 - 2010-06-23 - interlock - - - NHN - NHN - NHN - - diff --git a/modules/syndication/conf/module.xml b/modules/syndication/conf/module.xml deleted file mode 100644 index 338f3eaf9..000000000 --- a/modules/syndication/conf/module.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/modules/syndication/lang/lang.xml b/modules/syndication/lang/lang.xml deleted file mode 100644 index 52ad1e92c..000000000 --- a/modules/syndication/lang/lang.xml +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - - - - 최소한의 요청만으로 효과적으로 컨텐츠를 검색 서비스 업체와 동기화합니다]]> - It will synchronize contents with search service providers with the least requests.]]> - Gerekli olan şeyleri en aza indirerek, arama hizmeti sunucusunu içeriklerle uygun hale getirir.]]> - - - - - - - - - [적용하기] 버튼을 선택하시면 선택 또는 해제된 서비스에 Ping 을 통해서 결과를 통보하게 됩니다]]> - You will get Ping result from the selected (deselected) services if you apply.]]> - [應用] 透過 Ping 的方式]]> - Tercih edilen(edilmeyen) hizmetlerin Ping sonuçlarını başvurarak alabilirsiniz.]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/modules/syndication/queries/deleteExceptModules.xml b/modules/syndication/queries/deleteExceptModules.xml deleted file mode 100644 index 981cf5149..000000000 --- a/modules/syndication/queries/deleteExceptModules.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/modules/syndication/queries/getDeletedList.xml b/modules/syndication/queries/getDeletedList.xml deleted file mode 100644 index 6dae7a09a..000000000 --- a/modules/syndication/queries/getDeletedList.xml +++ /dev/null @@ -1,19 +0,0 @@ - - -
                                - - - - - - - - - - - - - - - - diff --git a/modules/syndication/queries/getDocumentList.xml b/modules/syndication/queries/getDocumentList.xml deleted file mode 100644 index a5916f0a6..000000000 --- a/modules/syndication/queries/getDocumentList.xml +++ /dev/null @@ -1,31 +0,0 @@ - - -
                                -
                                -
                                - - - -
                                -
                                - - - - - - - - - - - - - - - - - - - - -
                                diff --git a/modules/syndication/queries/getExceptModule.xml b/modules/syndication/queries/getExceptModule.xml deleted file mode 100644 index 68aec543d..000000000 --- a/modules/syndication/queries/getExceptModule.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/modules/syndication/queries/getExceptModuleSrls.xml b/modules/syndication/queries/getExceptModuleSrls.xml deleted file mode 100644 index 8742b6894..000000000 --- a/modules/syndication/queries/getExceptModuleSrls.xml +++ /dev/null @@ -1,8 +0,0 @@ - - -
                                - - - - - diff --git a/modules/syndication/queries/getExceptModules.xml b/modules/syndication/queries/getExceptModules.xml deleted file mode 100644 index 583350185..000000000 --- a/modules/syndication/queries/getExceptModules.xml +++ /dev/null @@ -1,14 +0,0 @@ - - -
                                -
                                - - - - - - - - - - diff --git a/modules/syndication/queries/getGrantedModule.xml b/modules/syndication/queries/getGrantedModule.xml deleted file mode 100644 index 4bb67c296..000000000 --- a/modules/syndication/queries/getGrantedModule.xml +++ /dev/null @@ -1,17 +0,0 @@ - - -
                                - - - - - - - - - - - - - - diff --git a/modules/syndication/queries/getGrantedModules.xml b/modules/syndication/queries/getGrantedModules.xml deleted file mode 100644 index c72bd0a8a..000000000 --- a/modules/syndication/queries/getGrantedModules.xml +++ /dev/null @@ -1,19 +0,0 @@ - - -
                                - - - - - - - - - - - - - - - - diff --git a/modules/syndication/queries/getLang.xml b/modules/syndication/queries/getLang.xml deleted file mode 100644 index eb0c59672..000000000 --- a/modules/syndication/queries/getLang.xml +++ /dev/null @@ -1,12 +0,0 @@ - - -
                                - - - - - - - - - diff --git a/modules/syndication/queries/getModuleSiteInfo.xml b/modules/syndication/queries/getModuleSiteInfo.xml deleted file mode 100644 index 921e33431..000000000 --- a/modules/syndication/queries/getModuleSiteInfo.xml +++ /dev/null @@ -1,15 +0,0 @@ - - -
                                -
                                - - - - - - - - - - - diff --git a/modules/syndication/queries/getModules.xml b/modules/syndication/queries/getModules.xml deleted file mode 100644 index ecb397cf4..000000000 --- a/modules/syndication/queries/getModules.xml +++ /dev/null @@ -1,26 +0,0 @@ - - -
                                -
                                -
                                - - - -
                                -
                                - - - - - - - - - - - - - - - -
                                diff --git a/modules/syndication/queries/getSiteUpdatedTime.xml b/modules/syndication/queries/getSiteUpdatedTime.xml deleted file mode 100644 index e5ead1bbc..000000000 --- a/modules/syndication/queries/getSiteUpdatedTime.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/modules/syndication/queries/insertExceptModule.xml b/modules/syndication/queries/insertExceptModule.xml deleted file mode 100644 index f50e0b818..000000000 --- a/modules/syndication/queries/insertExceptModule.xml +++ /dev/null @@ -1,9 +0,0 @@ - - -
                                - - - - - - diff --git a/modules/syndication/queries/insertLog.xml b/modules/syndication/queries/insertLog.xml deleted file mode 100644 index d8bd17086..000000000 --- a/modules/syndication/queries/insertLog.xml +++ /dev/null @@ -1,13 +0,0 @@ - - -
                                - - - - - - - - - - diff --git a/modules/syndication/ruleset/insertService.xml b/modules/syndication/ruleset/insertService.xml deleted file mode 100644 index 092f8b7ab..000000000 --- a/modules/syndication/ruleset/insertService.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/modules/syndication/schemas/syndication_except_modules.xml b/modules/syndication/schemas/syndication_except_modules.xml deleted file mode 100644 index afb5c516f..000000000 --- a/modules/syndication/schemas/syndication_except_modules.xml +++ /dev/null @@ -1,4 +0,0 @@ -
                                - - -
                                diff --git a/modules/syndication/schemas/syndication_logs.xml b/modules/syndication/schemas/syndication_logs.xml deleted file mode 100644 index 666c7b09e..000000000 --- a/modules/syndication/schemas/syndication_logs.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - -
                                diff --git a/modules/syndication/syndication.admin.controller.php b/modules/syndication/syndication.admin.controller.php deleted file mode 100644 index c81870c57..000000000 --- a/modules/syndication/syndication.admin.controller.php +++ /dev/null @@ -1,140 +0,0 @@ -target_services = explode('|@|',Context::get('target_services')); - $config->site_url = preg_replace('/\/+$/is','',Context::get('site_url')); - $config->year = Context::get('year'); - if(!$config->site_url) return new Object(-1,'msg_site_url_is_null'); - - $oModuleController->insertModuleConfig('syndication',$config); - $oSyndicationController->ping($oSyndicationModel->getID('site'), 'site'); - - $except_module = Context::get('except_module'); - $output = executeQuery('syndication.deleteExceptModules'); - if(!$output->toBool()) return $output; - - if ($except_module){ - $modules = explode(',',$except_module); - for($i=0,$c=count($modules);$i<$c;$i++) { - $args->module_srl = $modules[$i]; - $output = executeQuery('syndication.insertExceptModule',$args); - if(!$output->toBool()) return $output; - } - } - - $this->setMessage('success_applied'); - if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) { - $returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'module', 'admin', 'act', 'dispSyndicationAdminConfig'); - header('location:'.$returnUrl); - return; - } - } - - function procSyndicationAdminCheckSitePingResult(){ - $site_url = trim(Context::get('site_url')); - if(!$site_url) return new Object(-1,'msg_invalid_request'); - - $oSyndicationModel = &getModel('syndication'); - - $id = $oSyndicationModel->getID('site'); - if(substr($site_url,-1)!='/') $site_url .= '/'; - $site_ping = sprintf('http://%s?module=syndication&act=getSyndicationList&id=%s&type=site', $site_url, $id); - - $headers = array(); - $headers['Connection'] = 'TE, close'; - $headers['User-Agent'] = 'Mozilla/4.0 (compatible; NaverBot/1.0; http://help.naver.com/customer_webtxt_02.jsp)'; - - $xml = FileHandler::getRemoteResource($site_ping, null, 3, 'GET', '', $headers); - if(!$xml) return new Object(-1, 'msg_ping_test_error'); - - $oXmlParser = new XmlParser(); - $oXml = $oXmlParser->parse($xml); - - if(!$oXml || !is_object($oXml) || !$oXml->entry || !$oXml->entry->id || !$oXml->entry->title) { - $this->setMessage('msg_ping_test_error'); - $this->add('ping_result',$xml); - }else{ - $this->setMessage('msg_success_ping_test'); - } - } - - function procSyndicationAdminCheckApiStatus(){ - $target_service = Context::get('target_service'); - if(!$target_service) return new Object(-1,'msg_invalid_request'); - - $status_url = trim($this->statuses[$target_service]); - if(!$status_url) return new Object(-1,'msg_syndication_status_not_support'); - - $oModuleModel = &getModel('module'); - - $config = $oModuleModel->getModuleConfig('syndication'); - $site_url = preg_replace('/^(http|https):\/\//i','',$config->site_url); - - $method = 'getSyndicationStatus' . ucfirst(strtolower($target_service)); - if(!method_exists($this, $method)) return new Object(-1,'msg_syndication_status_not_support'); - - $output = call_user_func(array(&$this,$method),$site_url); - if(!$output->toBool()) return $output; - - $this->add('result_status',$output->get('result_status')); - } - - function getSyndicationStatusNaver($site_url){ - $status_url = trim($this->statuses['Naver']); - - $xml = FileHandler::getRemoteResource(sprintf($status_url,$site_url), null, 3, 'GET', 'application/xml'); - $oXmlParser = new XmlParser(); - $oXml = $oXmlParser->parse($xml); - $oStatus = $oXml->syndication_status; - - if($oStatus->error->body != 0) return new Object(-1,$oStatus->message->body); - - $result->site_name = $oStatus->site_name->body; - $result->first_update = $oStatus->first_update->body; - $result->last_update = $oStatus->last_update->body; - $result->visit_ok_count = $oStatus->visit_ok_count->body; - $result->visit_fail_count = $oStatus->visit_fail_count->body; - $result->status = $oStatus->status->body; - - if(!$oStatus->sync || !$oStatus->sync->article){ - $oArticleList = array(); - }else{ - $oArticleList = $oStatus->sync->article; - if(!is_array($oArticleList)) $oArticleList = array($oArticleList); - } - - if(count($oArticleList)>0){ - $article_count = array(); - foreach($oArticleList as $article){ - $article_count[$article->attrs->date] = $article->body; - } - - $result->article_count = $article_count; - $result->max_article_count = max($result->article_count); - - } - - Context::set('result', $result); - $oTemplateHandler = &TemplateHandler::getInstance(); - $html = $oTemplateHandler->compile($this->module_path.'tpl', 'naver_result'); - - $output = new Object(); - $output->add('result_status', $html); - return $output; - } - } -?> diff --git a/modules/syndication/syndication.admin.view.php b/modules/syndication/syndication.admin.view.php deleted file mode 100644 index ea34a1b8c..000000000 --- a/modules/syndication/syndication.admin.view.php +++ /dev/null @@ -1,56 +0,0 @@ -getModuleConfig('syndication'); - if(!$module_config->target_services) $module_config->target_services = array(); - - foreach($this->services as $key => $val) { - unset($obj); - $obj->service = $key; - $obj->ping = $val; - $obj->selected = in_array($key, $module_config->target_services)?true:false; - $services[] = $obj; - } - Context::set('services', $services); - - if(!$module_config->site_url) { - $module_config->site_url = Context::getDefaultUrl()?Context::getDefaultUrl():getFullUrl(); - } - Context::set('site_url', preg_replace('/^(http|https):\/\//i','',$module_config->site_url)); - - if(!$module_config->year) { - $module_config->year = date("Y"); - } - Context::set('year', $module_config->year); - - $output = executeQueryArray('syndication.getExceptModules'); - $except_module_list = array(); - for($i=0,$c=count($output->data);$i<$c;$i++) { - $except_module_list[] = $output->data[$i]; - } - Context::set('except_module', $except_module_list); - - //Security - $security = new Security(); - $security->encodeHTML('services..service','except_module..ping'); - $security->encodeHTML('except_module..mid','except_module..browser_title'); - - - $this->setTemplatePath($this->module_path.'tpl'); - $this->setTemplateFile('config'); - } - - } -?> diff --git a/modules/syndication/syndication.class.php b/modules/syndication/syndication.class.php deleted file mode 100644 index d4ceb0d9b..000000000 --- a/modules/syndication/syndication.class.php +++ /dev/null @@ -1,74 +0,0 @@ - 'http://syndication.openapi.naver.com/ping/', - ); - - var $statuses = array( - 'Naver' => 'http://syndication.openapi.naver.com/status/?site=%s', - ); - - function moduleInstall() { - $oModuleController = &getController('module'); - $oModuleController->insertTrigger('document.insertDocument', 'syndication', 'controller', 'triggerInsertDocument', 'after'); - $oModuleController->insertTrigger('document.updateDocument', 'syndication', 'controller', 'triggerUpdateDocument', 'after'); - $oModuleController->insertTrigger('document.deleteDocument', 'syndication', 'controller', 'triggerDeleteDocument', 'after'); - $oModuleController->insertTrigger('module.deleteModule', 'syndication', 'controller', 'triggerDeleteModule', 'after'); - - $oModuleController->insertTrigger('document.moveDocumentToTrash', 'syndication', 'controller', 'triggerMoveDocumentToTrash', 'after'); - $oModuleController->insertTrigger('document.restoreTrash', 'syndication', 'controller', 'triggerRestoreTrash', 'after'); - - $oAddonAdminModel = &getAdminModel('addon'); - if($oAddonAdminModel->getAddonInfoXml('catpcha')){ - $oAddonAdminController = &addonAdminController::getInstance(); - $oAddonAdminController->doActivate('catpcha'); - $oAddonAdminController->makeCacheFile(); - } - } - - function checkUpdate() { - $oModuleModel = &getModel('module'); - if(!$oModuleModel->getTrigger('document.moveDocumentToTrash', 'syndication', 'controller', 'triggerMoveDocumentToTrash', 'after')) return true; - if(!$oModuleModel->getTrigger('document.restoreTrash', 'syndication', 'controller', 'triggerRestoreTrash', 'after')) return true; - - return false; - } - - function moduleUpdate() { - $oModuleModel = &getModel('module'); - $oModuleController = &getController('module'); - - if(!$oModuleModel->getTrigger('document.moveDocumentToTrash', 'syndication', 'controller', 'triggerMoveDocumentToTrash', 'after')){ - $oModuleController->insertTrigger('document.moveDocumentToTrash', 'syndication', 'controller', 'triggerMoveDocumentToTrash', 'after'); - } - if(!$oModuleModel->getTrigger('document.restoreTrash', 'syndication', 'controller', 'triggerRestoreTrash', 'after')){ - $oModuleController->insertTrigger('document.restoreTrash', 'syndication', 'controller', 'triggerRestoreTrash', 'after'); - } - - $oAddonAdminModel = &getAdminModel('addon'); - if($oAddonAdminModel->getAddonInfoXml('catpcha')){ - $oAddonAdminController = &addonAdminController::getInstance(); - $oAddonAdminController->doActivate('catpcha'); - $oAddonAdminController->makeCacheFile(); - } - - } - - function recompileCache() { - } - } -?> diff --git a/modules/syndication/syndication.controller.php b/modules/syndication/syndication.controller.php deleted file mode 100644 index f789c7359..000000000 --- a/modules/syndication/syndication.controller.php +++ /dev/null @@ -1,127 +0,0 @@ -module_srl < 1) return new Object(); - - $oSyndicationModel = &getModel('syndication'); - $oModuleModel = &getModel('module'); - - if($oSyndicationModel->isExceptedModules($obj->module_srl)) return new Object(); - - $config = $oModuleModel->getModuleConfig('syndication'); - - $id = $oSyndicationModel->getID('channel', $obj->module_srl); - $this->ping($id, 'article'); - - return new Object(); - } - - function triggerUpdateDocument(&$obj) { - if($obj->module_srl < 1) return new Object(); - - $oSyndicationModel = &getModel('syndication'); - $oModuleModel = &getModel('module'); - - if($oSyndicationModel->isExceptedModules($obj->module_srl)) return new Object(); - - $config = $oModuleModel->getModuleConfig('syndication'); - - $id = $oSyndicationModel->getID('channel', $obj->module_srl); - $this->ping($id, 'article'); - - return new Object(); - } - - function triggerDeleteDocument(&$obj) { - if($obj->module_srl < 1) return new Object(); - - $oSyndicationModel = &getModel('syndication'); - $oModuleModel = &getModel('module'); - - if($oSyndicationModel->isExceptedModules($obj->module_srl)) return new Object(); - - $this->insertLog($obj->module_srl, $obj->document_srl, $obj->title, $obj->content); - - $id = $oSyndicationModel->getID('channel', $obj->module_srl); - $this->ping($id, 'deleted'); - - return new Object(); - } - - function triggerDeleteModule(&$obj) { - $oSyndicationModel = &getModel('syndication'); - $oModuleModel = &getModel('module'); - - if($oSyndicationModel->isExceptedModules($obj->module_srl)) return new Object(); - - $this->insertLog($obj->module_srl, $obj->document_srl, $obj->title, $obj->content); - - $output = executeQuery('syndication.getExceptModule', $obj); - if($output->data->count) return new Object(); - - $id = $oSyndicationModel->getID('site', $obj->module_srl); - $this->ping($id, 'deleted'); - - return new Object(); - } - - function triggerMoveDocumentToTrash(&$obj) { - $document_srl = $obj->document_srl; - $module_srl = $obj->module_srl; - - $oSyndicationModel = &getModel('syndication'); - $oModuleModel = &getModel('module'); - - if($oSyndicationModel->isExceptedModules($module_srl)) return new Object(); - - $id = $oSyndicationModel->getID('channel', $module_srl); - $this->ping($id, 'deleted'); - - return new Object(); - } - - function triggerRestoreTrash(&$obj) { - $document_srl = $obj->document_srl; - $module_srl = $obj->module_srl; - - $oSyndicationModel = &getModel('syndication'); - $oModuleModel = &getModel('module'); - - if($oSyndicationModel->isExceptedModules($module_srl)) return new Object(); - - $id = $oSyndicationModel->getID('article', $module_srl.'-'.$document_srl); - $this->ping($id, 'article'); - - return new Object(); - } - - function insertLog($module_srl, $document_srl, $title = null, $summary = null) { - $args->module_srl = $module_srl; - $args->document_srl = $document_srl; - $args->title = $title; - $args->summary = $summary; - $output = executeQuery('syndication.insertLog', $args); - } - - function ping($id, $type) { - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('syndication'); - - if(!count($config->target_services)) return; - if(substr($config->site_url,-1)!='/') $config->site_url .= '/'; - foreach($config->target_services as $key => $val) { - $ping_url = trim($this->services[$val]); - if(!$ping_url) continue; - $ping_body = sprintf('http://%s?module=syndication&act=getSyndicationList&id=%s&type=%s', $config->site_url, $id, $type); - FileHandler::getRemoteResource($ping_url, null, 3, 'POST', 'application/x-www-form-urlencoded', array(), array(), array('link'=>$ping_body)); - } - } - } -?> diff --git a/modules/syndication/syndication.model.php b/modules/syndication/syndication.model.php deleted file mode 100644 index 891b46f20..000000000 --- a/modules/syndication/syndication.model.php +++ /dev/null @@ -1,383 +0,0 @@ -getModuleConfig('syndication'); - $this->site_url = preg_replace('/\/+$/is','',$config->site_url); - $this->target_services = $config->target_services; - $this->year = $config->year; - - $output = executeQueryArray('syndication.getGrantedModules'); - if($output->data) { - foreach($output->data as $key => $val) { - $this->granted_modules[] = $val->module_srl; - } - } - } - - function isExceptedModules($module_srl) { - $args->module_srl = $module_srl; - $output = executeQuery('syndication.getExceptModule', $args); - if($output->data->count) return true; - $output = executeQuery('syndication.getGrantedModule', $args); - if($output->data->count) return true; - return false; - - } - - function getLang($key, $site_srl) - { - if(!$this->langs[$site_srl]) - { - $this->langs[$site_srl] = array(); - $args->site_srl = $site_srl; - $args->lang_code = Context::getLangType(); - $output = executeQueryArray("syndication.getLang", $args); - if(!$output->toBool() || !$output->data) return $key; - foreach($output->data as $value) - { - $this->langs[$site_srl][$value->name] = $value->value; - } - } - if($this->langs[$site_srl][$key]) - { - return $this->langs[$site_srl][$key]; - } - else return $key; - } - - function handleLang($title, $site_srl) - { - $matches = null; - if(!preg_match("/\\\$user_lang->(.+)/",$title, $matches)) return $title; - else - { - return $this->getLang($matches[1], $site_srl); - } - } - - function getSyndicationList() { - $oModuleModel = &getModel('module'); - $config = $oModuleModel->getModuleConfig('syndication'); - if(!$config->year || !$config->site_url) return new Object(-1,'msg_check_syndication_config'); - - $id = Context::get('id'); - $type = Context::get('type'); - $page = Context::get('page'); - if(!$id || !$type) return new Object(-1,'msg_invalid_request'); - - if(!preg_match('/^tag:([^,]+),([0-9]+):(site|channel|article)(.*)$/i',$id,$matches)) return new Object(-1,'msg_invalid_request'); - - $url = $matches[1]; - $year = $matches[2]; - $target = $matches[3]; - $id = $matches[4]; - if($id && $id{0}==':') $id = substr($id, 1); - - if($id && strpos($id,'-')!==false) list($module_srl, $document_srl) = explode('-',$id); - elseif($id) $module_srl = $id; - if(!$url || !$year || !$target) return new Object(-1,'msg_invalid_request'); - - $startTime = Context::get('start-time'); - $endTime = Context::get('end-time'); - - $time_zone = substr($GLOBALS['_time_zone'],0,3).':'.substr($GLOBALS['_time_zone'],3); - Context::set('time_zone', $time_zone); - - $site_module_info = Context::get('site_module_info'); - - if($target == 'channel' && !$module_srl) $target = 'site'; - if($target == 'channel' && $module_srl) { - $args->module_srls = $module_srl; - $output = executeQuery('syndication.getModules', $args); - $module_info = $output->data; - if($module_info) { - $args->module_srl = $module_srl; - $output = executeQuery('syndication.getExceptModules', $args); - if($output->data->count) $error = 'target is not founded'; - } else $error = 'target is not founded'; - - unset($args); - } - - if(!$error) { - Context::set('target', $target); - Context::set('type', $type); - switch($target) { - case 'site' : - $site_info->id = $this->getID('site'); - $site_info->title = $this->handleLang($site_module_info->browser_title, $site_module_info->site_srl); - - $except_module_output = executeQueryArray('syndication.getExceptModuleSrls'); - if (is_array($except_module_output->data)) - { - $except_module_srls = array(); - foreach($except_module_output->data as $val) - { - $except_module_srls[] = $val->module_srl; - } - $args->except_modules = implode(',',$except_module_srls); - } - $output = executeQuery('syndication.getSiteUpdatedTime', $args); - if($output->data) $site_info->updated = date("Y-m-d\\TH:i:s", ztime($output->data->last_update)).$time_zone; - $site_info->self_href = $this->getSelfHref($site_info->id,$type); - $site_info->alternative_href =$this->getAlternativeHref(); - Context::set('site_info', $site_info); - - $this->setTemplateFile('site'); - switch($type) { - case 'channel' : - Context::set('channels', $this->getChannels()); - break; - case 'article' : - Context::set('articles', $this->getArticles(null, $page, $startTime, $endTime, 'article',$site_info->id)); - break; - case 'deleted' : - Context::set('deleted', $this->getDeleted(null, $page, $startTime, $endTime, 'deleted',$site_info->id)); - break; - default : - $this->setTemplateFile('site.info'); - break; - } - break; - case 'channel' : - $channel_info->id = $this->getID('channel', $module_info->module_srl); - $channel_info->title = $this->handleLang($module_info->browser_title, $module_info->site_srl); - $channel_info->updated = date("Y-m-d\\TH:i:s").$time_zone; - $channel_info->self_href = $this->getSelfHref($channel_info->id, $type); - $channel_info->alternative_href = $this->getAlternativeHref($module_info); - $channel_info->summary = $module_info->description; - if($module_info->module == "textyle") - { - $channel_info->type = "blog"; - $channel_info->rss_href = getFullSiteUrl($module_info->domain, '', 'mid', $module_info->mid, 'act', 'rss'); - } - else - { - $channel_info->type = "web"; - } - $except_module_output = executeQueryArray('syndication.getExceptModuleSrls'); - if (is_array($except_module_output->data)) - { - $except_module_srls = array(); - foreach($except_module_output->data as $val) - { - $except_module_srls[] = $val->module_srl; - } - $args->except_modules = implode(',',$except_module_srls); - } - $output = executeQuery('syndication.getSiteUpdatedTime', $args); - if($output->data) $channel_info->updated = date("Y-m-d\\TH:i:s", ztime($output->data->last_update)).$time_zone; - Context::set('channel_info', $channel_info); - - $this->setTemplateFile('channel'); - switch($type) { - case 'article' : - Context::set('articles', $this->getArticles($module_srl, $page, $startTime, $endTime, 'article', $channel_info->id)); - break; - case 'deleted' : - Context::set('deleted', $this->getDeleted($module_srl, $page, $startTime, $endTime, 'deleted', $channel_info->id)); - break; - default : - $this->setTemplateFile('channel.info'); - break; - } - break; - - case 'article': - Context::set('article', $this->getArticle($document_srl)); - $this->setTemplateFile('include.articles'); - break; - } - } else { - Context::set('message', $error); - $this->setTemplateFile('error'); - } - - $this->setTemplatePath($this->module_path.'tpl'); - Context::setResponseMethod('XMLRPC'); - } - - function getChannels() { - if($module_srls) $args->module_srls = $module_srls; - if(count($this->granted_modules)) $args->except_module_srls = implode(',',$this->granted_modules); - $output = executeQueryArray('syndication.getModules', $args); - if($output->data) { - foreach($output->data as $module_info) { - unset($obj); - $obj->id = $this->getID('channel', $module_info->module_srl); - $obj->title = $this->handleLang($module_info->browser_title, $module_info->site_srl); - $obj->updated = date("Y-m-d\\TH:i:s").$time_zone; - $obj->self_href = $this->getSelfHref($obj->id, 'channel'); - $obj->alternative_href = $this->getAlternativeHref($module_info); - $obj->summary = $module_info->description; - if($module_info->module == "textyle") - { - $obj->type = "blog"; - $obj->rss_href = getFullSiteUrl($module_info->domain, '', 'mid', $module_info->mid, 'act', 'rss'); - } - else - { - $obj->type = "web"; - } - - $list[] = $obj; - } - } - return $list; - } - - function getArticle($document_srl) { - if($this->site_url==null) $this->init(); - - $oDocumentModel = &getModel('document'); - $oDocument = $oDocumentModel->getDocument($document_srl,false,false); - if(!$oDocument->isExists()) return; - - $val = $oDocument->getObjectVars(); - - $val->id = $this->getID('article', $val->module_srl.'-'.$val->document_srl); - $val->updated = date("Y-m-d\\TH:i:s", ztime($val->last_update)).$GLOBALS['_time_zone']; - $val->alternative_href = getFullSiteUrl($this->site_url, '', 'document_srl', $val->document_srl); - $val->channel_alternative_href = $this->getChannelAlternativeHref($val->module_srl); - $val->channel_id = $this->getID('channel', $val->module_srl.'-'.$val->document_srl); - if(!$val->nick_name) $val->nick_name = $val->user_name; - - return $val; - } - - function getArticles($module_srl = null, $page=1, $startTime = null, $endTime = null, $type = null, $id = null) { - if($this->site_url==null) $this->init(); - - if($module_srl) $args->module_srl = $module_srl; - if($startTime) $args->start_date = $this->getDate($startTime); - if($endTime) $args->end_date = $this->getDate($endTime); - if(count($this->granted_modules)) $args->except_module_srls = implode(',',$this->granted_modules); - $args->page = $page; - $output = executeQueryArray('syndication.getDocumentList', $args); - $cur_page = $output->page_navigation->cur_page; - $total_page = $output->page_navigation->last_page; - - $result->next_url = null; - $result->list = array(); - - if($cur_page<$total_page) { - $next_url = $this->getSelfHref($id, $type); - if($startTime) $next_url .= '&startTime='.$startTime; - if($endTime) $next_url .= '&endTime='.$endTime; - $result->next_url = $next_url.'&page='.($cur_page+1); - } - - if($output->data) { - foreach($output->data as $key => $val) { - $val->id = $this->getID('article', $val->module_srl.'-'.$val->document_srl); - $val->updated = date("Y-m-d\\TH:i:s", ztime($val->last_update)).$GLOBALS['_time_zone']; - $val->alternative_href = getFullSiteUrl($this->site_url, '', 'document_srl', $val->document_srl); - $val->channel_alternative_href = $this->getChannelAlternativeHref($val->module_srl); - $val->channel_id = $this->getID('channel', $val->module_srl.'-'.$val->document_srl); - if(!$val->nick_name) $val->nick_name = $val->user_name; - $output->data[$key] = $val; - } - $result->list = $output->data; - } - return $result; - } - - function getDeleted($module_srl = null, $page = 1, $startTime = null, $endTime = null, $type = null, $id = null) { - if($this->site_url==null) $this->init(); - - if($module_srl) $args->module_srl= $module_srl; - if($startTime) $args->start_date = $this->getDate($startTime); - if($endTime) $args->end_date = $this->getDate($endTime); - $args->page = $page; - - $output = executeQueryArray('syndication.getDeletedList', $args); - - $cur_page = $output->page_navigation->cur_page; - $total_page = $output->page_navigation->last_page; - - $result->next_url = null; - $result->list = array(); - - if($cur_page<$total_page) { - $next_url = $this->getSelfHref($id, $type); - if($startTime) $next_url .= '&startTime='.$startTime; - if($endTime) $next_url .= '&endTime='.$endTime; - $result->next_url = $next_url . '&page='.($cur_page+1); - } - - if($output->data) { - foreach($output->data as $key => $val) { - $val->id = $this->getID('article', $val->module_srl.'-'.$val->document_srl); - $val->deleted = date("Y-m-d\\TH:i:s", ztime($val->regdate)).$GLOBALS['_time_zone']; - $val->alternative_href = getFullSiteUrl($this->site_url, '', 'document_srl', $val->document_srl); - $val->channel_id = $this->getID('channel', $val->module_srl.'-'.$val->document_srl); - $output->data[$key] = $val; - } - $result->list = $output->data; - } - return $result; - } - - function getID($type, $target_id = null) { - if($this->site_url==null) $this->init(); - - return sprintf('tag:%s,%d:%s', $this->site_url, $this->year, $type) . ($target_id?':'.$target_id:''); - } - - function getChannelAlternativeHref($module_srl) { - static $module_info = array(); - if(!isset($module_info[$module_srl])) { - $args->module_srl = $module_srl; - $output = executeQuery('syndication.getModuleSiteInfo', $args); - if($output->data) $module_info[$module_srl] = $output->data; - else $module_info[$module_srl] = null; - } - - if(is_null($module_info[$module_srl])) return $this->site_url; - - $domain = $module_info[$module_srl]->domain; - $url = getFullSiteUrl($domain, '', 'mid', $module_info[$module_srl]->mid); - if(substr($url,0,1)=='/') $domain = 'http://'.$this->site_url.$url; - return $url; - } - - function getSelfHref($id, $type = null) { - if($this->site_url==null) $this->init(); - - return sprintf('http://%s/?module=syndication&act=getSyndicationList&id=%s&type=%s', $this->site_url, $id, $type); - } - - function getAlternativeHref($module_info = null) { - if($this->site_url==null) $this->init(); - - if(!$module_info) return sprintf('http://%s', $this->site_url); - if(!$module_info->site_srl) return getFullUrl('', 'mid', $module_info->mid); - - $domain = $module_info->domain; - $url = getFullSiteUrl($domain, '', 'mid', $module_info->mid); - - if(substr($url,0,1)=='/') $domain = 'http://'.$this->site_url.$url; - return $url; - } - - function getDate($date) { - $time = strtotime($date); - if($time == -1) $time = ztime(str_replace(array('-','T',':'),'',$date)); - return date('YmdHis', $time); - } - } -?> diff --git a/modules/syndication/tpl/channel.html b/modules/syndication/tpl/channel.html deleted file mode 100644 index 55cf2b34d..000000000 --- a/modules/syndication/tpl/channel.html +++ /dev/null @@ -1,16 +0,0 @@ -{''} - - - - - - - - - - - - - - - diff --git a/modules/syndication/tpl/channel.info.html b/modules/syndication/tpl/channel.info.html deleted file mode 100644 index c8543d979..000000000 --- a/modules/syndication/tpl/channel.info.html +++ /dev/null @@ -1,5 +0,0 @@ -{''} - - - - diff --git a/modules/syndication/tpl/config.html b/modules/syndication/tpl/config.html deleted file mode 100644 index 33a23f7fb..000000000 --- a/modules/syndication/tpl/config.html +++ /dev/null @@ -1,63 +0,0 @@ - - - -

                                {$lang->syndication} {$lang->cmd_management}

                                -

                                {$lang->about_syndication}

                                - -
                                -

                                {$XE_VALIDATOR_MESSAGE}

                                -
                                -
                                - - - - - - - - - - - - - - - - - - -
                                {$lang->my_syndication_url}
                                - http:// - -

                                {$lang->about_my_syndication_url}

                                -

                                -
                                {$lang->syndication_service}
                                -
                                  - -
                                • - selected)-->checked="checked" /> - - -
                                • - -
                                - -

                                {$lang->about_syndication}

                                -
                                {$lang->except_module}
                                - - -

                                {$lang->about_except_module}

                                - -
                                - -
                                -
                                diff --git a/modules/syndication/tpl/css/syndication.css b/modules/syndication/tpl/css/syndication.css deleted file mode 100644 index 1a6213680..000000000 --- a/modules/syndication/tpl/css/syndication.css +++ /dev/null @@ -1,17 +0,0 @@ -@charset "utf-8"; - -input.siteUrl { width:400px; } -ul.syndiService { list-style:none; margin:0; padding:0;} -ul.syndiService li { padding:10px 0; margin:0;} -select.exceptModuleList { width:400px; } -ul.midCommand { margin:20px 0 0 0; padding:0; list-style:none; } -ul.midCommand li { display:inline; margin:0 20px 0 0; padding:0;} - -/* Vertical Bar Graph */ -.vGraph{ padding:20px 0;} -.vGraph ul{ margin:0; padding:0; height:100px; border:1px solid #ddd; border-top:0; border-right:0; font-size:11px; font-family:Tahoma, Geneva, sans-serif; list-style:none;} -.vGraph ul:after{ content:""; display:block; clear:both;} -.vGraph li{ float:left; display:inline; width:8%; height:100%; margin:0 3%; position:relative; text-align:center; white-space:nowrap;} -.vGraph .gTerm{ position:relative; display:inline-block; width:100%; height:20px; line-height:20px; margin:0 -100% -20px 0; padding:100px 0 0 0; vertical-align:bottom; color:#767676; font-weight:bold;} -.vGraph .gBar{ position:relative; display:inline-block; width:100%; margin:-1px 0 0 0; border:1px solid #ccc; border-bottom:0; background:#e9e9e9; vertical-align:bottom;} -.vGraph .gBar span{ position:absolute; width:100%; top:-20px; left:0; color:#767676;} diff --git a/modules/syndication/tpl/error.html b/modules/syndication/tpl/error.html deleted file mode 100644 index e641f1dcb..000000000 --- a/modules/syndication/tpl/error.html +++ /dev/null @@ -1,5 +0,0 @@ -{''} - - -1 - {$message} - diff --git a/modules/syndication/tpl/filter/insert_service.xml b/modules/syndication/tpl/filter/insert_service.xml deleted file mode 100644 index b81953e60..000000000 --- a/modules/syndication/tpl/filter/insert_service.xml +++ /dev/null @@ -1,8 +0,0 @@ - -
                                - - - - - - diff --git a/modules/syndication/tpl/include.articles.html b/modules/syndication/tpl/include.articles.html deleted file mode 100644 index 2d501a39f..000000000 --- a/modules/syndication/tpl/include.articles.html +++ /dev/null @@ -1,14 +0,0 @@ - - - {htmlspecialchars($article->id)} - {htmlspecialchars($article->title)} - {$article->updated} - - - - {date('Y-m-d\TH:i:s',ztime($article->regdate)).$time_zone} - - {htmlspecialchars($article->nick_name)} - - {htmlspecialchars($article->content)} - diff --git a/modules/syndication/tpl/include.channel.html b/modules/syndication/tpl/include.channel.html deleted file mode 100644 index 4ead02593..000000000 --- a/modules/syndication/tpl/include.channel.html +++ /dev/null @@ -1,8 +0,0 @@ - {htmlspecialchars($channel_info->id)} - {htmlspecialchars($channel_info->title)} - {$channel_info->updated} - - - - {$channel_info->type} - {htmlspecialchars($channel_info->summary)} diff --git a/modules/syndication/tpl/include.channels.html b/modules/syndication/tpl/include.channels.html deleted file mode 100644 index 76a6a42cb..000000000 --- a/modules/syndication/tpl/include.channels.html +++ /dev/null @@ -1,8 +0,0 @@ - - {htmlspecialchars($channel_info->id)} - {htmlspecialchars($channel_info->title)} - {$channel_info->updated} - - - {htmlspecialchars($channel_info->summary)} - diff --git a/modules/syndication/tpl/include.deleted.html b/modules/syndication/tpl/include.deleted.html deleted file mode 100644 index c3bce73a8..000000000 --- a/modules/syndication/tpl/include.deleted.html +++ /dev/null @@ -1,8 +0,0 @@ - - - {htmlspecialchars($delete->id)} - {htmlspecialchars($delete->title)} - {$delete->deleted} - - {$delete->deleted} - diff --git a/modules/syndication/tpl/include.site.html b/modules/syndication/tpl/include.site.html deleted file mode 100644 index a8499e0c5..000000000 --- a/modules/syndication/tpl/include.site.html +++ /dev/null @@ -1,5 +0,0 @@ - {htmlspecialchars($site_info->id)} - {htmlspecialchars($site_info->title)} - {$site_info->updated} - - diff --git a/modules/syndication/tpl/js/syndication.js b/modules/syndication/tpl/js/syndication.js deleted file mode 100644 index 47c202672..000000000 --- a/modules/syndication/tpl/js/syndication.js +++ /dev/null @@ -1,55 +0,0 @@ -function insertSelectedModules(id, module_srl, mid, browser_title) { - var sel_obj = get_by_id('_'+id); - for(var i=0;i8) sel_obj.size = sel_obj.options.length; - - doSyncExceptModules(id); -} - -function removeExceptModule(id) { - var sel_obj = get_by_id('_'+id); - sel_obj.remove(sel_obj.selectedIndex); - if(sel_obj.options.length) sel_obj.selectedIndex = sel_obj.options.length-1; - doSyncExceptModules(id); -} - -function doSyncExceptModules(id) { - var selected_module_srls = new Array(); - var sel_obj = get_by_id('_'+id); - for(var i=0;iNaver Syndication Status - -

                                {$lang->syndication_status_result}

                                - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                {$lang->site}{$result->site_name}
                                {$lang->syndication_status}{$result->status}
                                {$lang->syndication_synic_start_date}{$result->first_update}
                                {$lang->syndication_synic_last_date}{$result->last_update}
                                {$lang->syndication_visit_ok_count}{number_format($result->visit_ok_count)}
                                {$lang->syndication_visit_fail_count}{number_format($result->visit_fail_count)}
                                -

                                {$lang->syndication_sync_article}

                                -
                                - -
                                  - -
                                • {$date}{number_format($count)}
                                • - -
                                - -
                                diff --git a/modules/syndication/tpl/site.html b/modules/syndication/tpl/site.html deleted file mode 100644 index 04fa4e46f..000000000 --- a/modules/syndication/tpl/site.html +++ /dev/null @@ -1,21 +0,0 @@ -{''} - - - - - - - - - - - - - - - - - - - - diff --git a/modules/syndication/tpl/site.info.html b/modules/syndication/tpl/site.info.html deleted file mode 100644 index d4aff8112..000000000 --- a/modules/syndication/tpl/site.info.html +++ /dev/null @@ -1,4 +0,0 @@ -{''} - - - From 1b561de1704720511c601a9c8932c1288b70af55 Mon Sep 17 00:00:00 2001 From: taggon Date: Fri, 23 Sep 2011 02:23:51 +0000 Subject: [PATCH 0829/1372] Optimize regex for modifying image path git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9288 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/template/TemplateHandler.class.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/classes/template/TemplateHandler.class.php b/classes/template/TemplateHandler.class.php index 042d999a3..c7689c5b7 100644 --- a/classes/template/TemplateHandler.class.php +++ b/classes/template/TemplateHandler.class.php @@ -154,7 +154,7 @@ } // replace value of src in img/input/script tag - $buff = preg_replace_callback('/(<(?:img|input|script)(?:->|[^<>\-])*)\ssrc="(?!https?:\/\/|[\/\{])(.+?)"/is', array($this, '_replacePath'), $buff); + $buff = preg_replace_callback('/<(?:img|input|script)(?:(?!<[a-zA-Z]+[:a-zA-Z0-9]+[\s>]).)* src="(?!https?:\/\/|[\/\{])(.+?)"/is', array($this, '_replacePath'), $buff); // replace loop and cond template syntax $buff = $this->_parseInline($buff); @@ -263,13 +263,13 @@ **/ function _replacePath($matches) { - $src = preg_replace('@^(\./)+@', '', trim($matches[2])); + $src = preg_replace('@^(\./)+@', '', trim($matches[1])); $src = $this->web_path.$src; $src = str_replace('/./', '/', $src); while(($tmp=preg_replace('@[^/]+/\.\./@', '', $src))!==$src) $src = $tmp; - return "{$matches[1]} src=\"{$src}\""; + return substr($matches[0],0,-strlen($matches[1])-6)."src=\"{$src}\""; } function _parseInline($buff) From 60e210f5d524ff1e33139e65e713c50cf5b7218e Mon Sep 17 00:00:00 2001 From: taggon Date: Fri, 23 Sep 2011 02:34:45 +0000 Subject: [PATCH 0830/1372] Add drop event to admin menu setup script git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9289 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/tpl/js/menu_setup.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/admin/tpl/js/menu_setup.js b/modules/admin/tpl/js/menu_setup.js index 8ef062040..30454f763 100644 --- a/modules/admin/tpl/js/menu_setup.js +++ b/modules/admin/tpl/js/menu_setup.js @@ -177,6 +177,9 @@ $('div.adminMenu') $this.slideDown(100, function(){ $this.removeClass('active') }); $li.slideUp(100, function(){ var $par = $li.parent(); $li.remove(); if(!$par.children('li').length) $par.remove() }); + + // trigger 'dropped.st' event + $this.trigger('dropped.st'); }); return false; From 8952aaf023d7a09a5a4054b5fee0af4fdf16933f Mon Sep 17 00:00:00 2001 From: flyskyko Date: Fri, 23 Sep 2011 02:36:14 +0000 Subject: [PATCH 0831/1372] issue 160, fix a warning message git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9290 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/member/member.admin.view.php | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/member/member.admin.view.php b/modules/member/member.admin.view.php index ef773a7cc..590d75069 100644 --- a/modules/member/member.admin.view.php +++ b/modules/member/member.admin.view.php @@ -131,6 +131,7 @@ $extendForm = $oMemberModel->getCombineJoinForm($this->memberInfo); Context::set('extend_form_list', $extendForm); $memberInfo = get_object_vars(Context::get('member_info')); + if (!is_array($memberInfo['group_list'])) $memberInfo['group_list'] = array(); Context::set('memberInfo', $memberInfo); $disableColumns = array('password', 'find_account_question'); From 611ba925a20a25893ecae1f19d64cc531c56708a Mon Sep 17 00:00:00 2001 From: taggon Date: Fri, 23 Sep 2011 02:37:02 +0000 Subject: [PATCH 0832/1372] Removing XEED git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9291 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/editor/skins/xeed/editor.html | 367 -- modules/editor/skins/xeed/js/xe_interface.js | 145 - modules/editor/skins/xeed/js/xe_textarea.js | 41 - modules/editor/skins/xeed/js/xeed.js | 5005 ------------------ modules/editor/skins/xeed/js/xeed.stub.js | 85 - modules/editor/skins/xeed/skin.xml | 27 - modules/editor/skins/xeed/xd.css | 416 -- modules/editor/skins/xeed/xd.gif | Bin 41740 -> 0 bytes 8 files changed, 6086 deletions(-) delete mode 100644 modules/editor/skins/xeed/editor.html delete mode 100644 modules/editor/skins/xeed/js/xe_interface.js delete mode 100644 modules/editor/skins/xeed/js/xe_textarea.js delete mode 100644 modules/editor/skins/xeed/js/xeed.js delete mode 100644 modules/editor/skins/xeed/js/xeed.stub.js delete mode 100644 modules/editor/skins/xeed/skin.xml delete mode 100644 modules/editor/skins/xeed/xd.css delete mode 100644 modules/editor/skins/xeed/xd.gif diff --git a/modules/editor/skins/xeed/editor.html b/modules/editor/skins/xeed/editor.html deleted file mode 100644 index f6832bcdd..000000000 --- a/modules/editor/skins/xeed/editor.html +++ /dev/null @@ -1,367 +0,0 @@ - - - - - - - - - - - - - - - - - - - - -
                                - -
                                - - -
                                - -
                                  -
                                • -
                                • -
                                -
                                  -
                                • -
                                    - -
                                  • - -
                                  • -
                                  -
                                • -
                                • -
                                    - -
                                  • - -
                                  -
                                • -
                                • -
                                    -
                                  • -
                                  -
                                • -
                                • -
                                    -
                                  • -
                                  -
                                • -
                                -
                                  -
                                • -
                                • -
                                • -
                                • -
                                • - -
                                  -
                                  - {$lang->edit->fontcolor} -
                                    -
                                  • -
                                  -
                                  -
                                  -
                                • -
                                • - -
                                  -
                                  - {$lang->edit->fontbgcolor} -
                                    -
                                  • -
                                  -
                                    -
                                  • -
                                  -
                                  -
                                  -
                                • -
                                • -
                                • -
                                -
                                  -
                                • -
                                • -
                                • -
                                • -
                                • -
                                • -
                                • -
                                • -
                                • -
                                • -
                                -
                                  -
                                • -
                                -
                                  -
                                • -
                                  -
                                  - - - - - - - - - -
                                  -
                                  -
                                • -
                                • -
                                  -
                                  - {$lang->cmd_preview} -
                                  - - - - - - - - - - - - - - - - - -
                                  Caption
                                  TDTDTD
                                  TDTDTD
                                  TDTDTD
                                  -
                                  -
                                  -
                                  - {$lang->edit->table_caption_position} -
                                  - - -
                                    -
                                  • -
                                  • -
                                  • -
                                  • -
                                  • -
                                  • -
                                  -
                                  -
                                  -
                                  - {$lang->edit->table_header} -
                                    -
                                  • -
                                  • -
                                  • -
                                  • -
                                  -
                                  -
                                  - {$lang->edit->table_size} - - - - - - - - - - - - - -
                                  -
                                  -
                                  - - -
                                  -
                                  -
                                • - -
                                -
                                -
                                - - - -
                                -
                                -
                                - - - -
                                -

                                글을 쓰기 시작한지 1시간이 지났습니다. 마지막 저장 시간은 10분 전 입니다.

                                -
                                - - - -
                                - -
                                - - -
                                -
                                  -
                                • -
                                • -
                                -
                                - -
                                - - - -
                                - - - -
                                -
                                -

                                {$lang->edit->upload_list} [0]

                                -
                                - - -
                                -
                                -
                                -
                                -

                                {$lang->edit->image}

                                -

                                {$lang->edit->no_image}

                                -
                                  -
                                • - - -
                                  - -
                                • -
                                -

                                - - - -

                                -
                                -
                                -

                                {$lang->edit->multimedia}

                                -

                                {$lang->edit->no_multimedia}

                                -
                                  -

                                  - - - -

                                  -
                                  -
                                  -

                                  {$lang->edit->file}

                                  -

                                  {$lang->edit->no_attachment}

                                  -
                                    -

                                    - - - -

                                    -
                                    -
                                    -
                                    -

                                    {$upload_status}

                                    -
                                    - - -
                                    -
                                    -
                                    - - -
                                    - - - - - - diff --git a/modules/editor/skins/xeed/js/xe_interface.js b/modules/editor/skins/xeed/js/xe_interface.js deleted file mode 100644 index 79d87e5dd..000000000 --- a/modules/editor/skins/xeed/js/xe_interface.js +++ /dev/null @@ -1,145 +0,0 @@ -(function($){ - -if (!window.xe) xe = {}; -if (!xe.Editors) xe.Editors = []; - -function editorStart_xe(editor_seq, primary_key, content_key, editor_height, colorset, content_style, content_font, content_font_size) { - var $textarea, $form, $input, saved_str, xeed, opt = {}; - - if(typeof(colorset)=='undefined') colorset = 'white'; - if(typeof(content_style)=='undefined') content_style = 'xeStyle'; - if(typeof(content_font)=='undefined') content_font= ''; - if(typeof(content_font_size)=='undefined') content_font_size= ''; - - $textarea = $('#xeed-'+editor_seq); - $form = $($textarea[0].form).attr('editor_sequence', editor_seq); - $input = $form.find('input[name='+content_key+']'); - - if($input[0]) $textarea.val($input.remove().val()).attr('name', content_key); - $textarea.attr('name', content_key); - - // Use auto save feature? - opt.use_autosave = !!$form[0].elements['_saved_doc_title']; - - // min height - if (editor_height) opt.height = parseInt(editor_height) || 200; - - // create an editor - xe.Editors[editor_seq] = xeed = new xe.Xeed($textarea, opt); - xe.registerApp(xeed); - - // filters - xeed.cast('REGISTER_FILTER', ['r2t', plz_standard]); - xeed.cast('REGISTER_FILTER', ['r2t', remove_baseurl]); - xeed.cast('REGISTER_FILTER', ['r2t', unwrap_single_para]); - xeed.cast('REGISTER_FILTER', ['in', inline_styled['in']]); - xeed.cast('REGISTER_FILTER', ['out', inline_styled['out']]); - xeed.cast('REGISTER_FILTER', ['r2t', auto_br.br2ln]); - xeed.cast('REGISTER_FILTER', ['in', auto_br.br2ln]); - xeed.cast('REGISTER_FILTER', ['t2r', auto_br.ln2br]); - xeed.cast('REGISTER_FILTER', ['out', auto_br.ln2br]); - - // Set standard API - editorRelKeys[editor_seq] = { - primary : $form[0][primary_key], - content : $form[0][content_key], - editor : xeed, - func : function(){ return xeed.cast('GET_CONTENT'); }, - pasteHTML : function(text){ xeed.cast('PASTE_HTML', [text]); } - }; - - // Auto save - if (opt.use_autosave) xeed.registerPlugin(new xe.Xeed.AutoSave()); - - return xeed; -} - -// standard filters -function plz_standard(code) { - var single_tags = 'area br col hr img input param'.split(' '), replaces = {b:'strong',i:'em'}; - - code = code.replace(/<(\/)?([A-Za-z0-9:]+)(.*?)(\s*\/?)>/g, function(m0,is_close,tag,attrs,closing){ - tag = tag.toLowerCase(); - if (replaces[tag]) tag = replaces[tag]; - - attrs = attrs.replace(/([\w:-]\s*)=(?:([^"' \t\r\n]+)|\s*("[^"]*")|\s*('[^']*'))/g, function(m0,name,m2,m3,m4){ - var val = m2||m3||m4; - - if (m3||m4) val = val.substr(1,val.length-2); - - return $.trim(name.toLowerCase())+'='+'"'+val+'"'; - }); - - if (attrs=$.trim(attrs)) attrs = ' '+attrs; - - closing = $.trim(closing); - if (!is_close && !closing && $.inArray(tag, single_tags) != -1) closing = ' /'; - - return '<'+(is_close||'')+tag+attrs+closing+'>'; - }); - - return code; -} - -// remove base url -function remove_baseurl(code) { - var reg = new RegExp(' (href|src)\s*=\s*(["\'])?'+request_uri.replace('\\', '\\\\'), 'ig'); - - return code.replace(reg, function(m0,m1,m2){ return ' '+m1+'='+m2; }); -} - -// unwrap single paragraph -function unwrap_single_para(code) { - var match = $.trim(code).match(/]/g); - - if (match && match.length == 1) { - code = code.replace(/<\/?p(?:\s[^>]+)?>/g, ''); - } - - return code; -}; - -// inline styled box -var inline_styled = { - 'in' : function(code) { - return code.replace(/<(div|blockquote)(?:[^>]*) class="(bx|bq)"(?:[^>]*)>/ig, '<$1 class="$2">'); - }, - 'out' : function(code) { - return code.replace(/<(div|blockquote)(?:[^>]*) class="(bx|bq)"(?:[^>]*)>/ig, function(a,tag,cls){ - if (tag == 'div' && cls == 'bx') { - return '<'+tag+' class="'+cls+'" style="background:#fafafa;border:1px dotted #999;margin:1em 0;padding:0 2em">'; - } else if (tag == 'blockquote' && cls == 'bq') { - return '<'+tag+' class="'+cls+'" style="border-left:3px solid #ccc;margin:1em 0;padding-left:1em">'; - } - return a; - }); - } -}; - -// auto_br -var auto_br = { - 'br2ln' : function(code) { - return code.replace(/
                                    /ig, '\n'); - }, - 'ln2br' : function(code) { - return code.replace(/(>)?[ \t]*((?:\r?\n[ \t]*)+)[ \t]*(<)?/g, function(m0,m1,m2,m3){ - if ( !m1 || !m3 ) m2 = m2.replace(/\r?\n/g, '
                                    '); - return (m1||'')+m2+(m3||''); - }); - } -}; - -window.editorStart_xe = editorStart_xe; - -})(jQuery); - -function editorGetAutoSavedDoc(form) { - var param = new Array(); - param['mid'] = current_mid; - param['editor_sequence'] = form.getAttribute('editor_sequence') - setTimeout(function() { - var response_tags = new Array("error","message","editor_sequence","title","content","document_srl"); - exec_xml('editor',"procEditorLoadSavedDocument", param, function(a,b,c) { editorRelKeys[param['editor_sequence']]['primary'].value = a['document_srl']; if(typeof(uploadSettingObj[param['editor_sequence']]) == 'object') editorUploadInit(uploadSettingObj[param['editor_sequence']], true); }, response_tags); - }, 0); - -} diff --git a/modules/editor/skins/xeed/js/xe_textarea.js b/modules/editor/skins/xeed/js/xe_textarea.js deleted file mode 100644 index a488ce88e..000000000 --- a/modules/editor/skins/xeed/js/xe_textarea.js +++ /dev/null @@ -1,41 +0,0 @@ -function editorStartTextarea(editor_sequence, content_key, primary_key) { - var obj = xGetElementById('editor_'+editor_sequence); - var use_html = xGetElementById('htm_'+editor_sequence).value; - obj.form.setAttribute('editor_sequence', editor_sequence); - - obj.style.width = '99%'; - - editorRelKeys[editor_sequence] = new Array(); - editorRelKeys[editor_sequence]["primary"] = obj.form[primary_key]; - editorRelKeys[editor_sequence]["content"] = obj.form[content_key]; - editorRelKeys[editor_sequence]["func"] = editorGetContentTextarea; - - var content = obj.form[content_key].value; - if(use_html) { - content = content.replace(/]*)>/ig,"\n"); - if(use_html!='br') { - content = content.replace(/</g, "<"); - content = content.replace(/>/g, ">"); - content = content.replace(/"/g, '"'); - content = content.replace(/&/g, "&"); - } - } - obj.value = content; -} - -function editorGetContentTextarea(editor_sequence) { - var obj = xGetElementById('editor_'+editor_sequence); - var use_html = xGetElementById('htm_'+editor_sequence).value; - var content = obj.value.trim(); - if(use_html) { - if(use_html!='br') { - content = content.replace(/&/g, "&"); - content = content.replace(//g, ">"); - content = content.replace(/\"/g, """); - } - content = content.replace(/(\r\n|\n)/g, "
                                    "); - } - return content; -} - diff --git a/modules/editor/skins/xeed/js/xeed.js b/modules/editor/skins/xeed/js/xeed.js deleted file mode 100644 index a5bc47d16..000000000 --- a/modules/editor/skins/xeed/js/xeed.js +++ /dev/null @@ -1,5005 +0,0 @@ -/* - * XEED - XpressEngine WYSIWYG Editor - * @author nhn (developers@xpressengine.com) - */ -(function($){ - -var d = document, fn, dp, dc, - rx_command = /(?:^| )@(\w+)(?: |$)/, - rx_block = /^(H[1-6R]|P|DIV|ADDRESS|PRE|FORM|T(ABLE|BODY|HEAD|FOOT|H|R|D)|LI|OL|UL|CAPTION|BLOCKQUOTE|CENTER|DL|DT|DD|DIR|FIELDSET|NOSCRIPT|MENU|ISINDEX|SAMP)$/i, - invisibleCh = '\uFEFF', - _nt_ = 'nodeType', - _nn_ = 'nodeName', - _ps_ = 'previousSibling', - _ns_ = 'nextSibling', - _pn_ = 'parentNode', - _cn_ = 'childNodes', - _ca_ = 'commonAncestorContainer', - _sc_ = 'startContainer', - _so_ = 'startOffset', - _ec_ = 'endContainer', - _eo_ = 'endOffset', - _osc_ = 'oStartContainer', - _iso_ = 'iStartOffset', - _oec_ = 'oEndContainer', - _ieo_ = 'iEndOffset', - _ol_ = 'offsetLeft', - _xr_ = '_xeed_root', - rx_root = new RegExp('(?:^|\\s)'+_xr_+'(?:\\s|$)'), - Xeed, XHTMLT, Simple, Block, Font, Filter, EditMode, LineBreak, Resize, UndoRedo, Table, URL, AutoSave, FindReplace, Clear, DOMFix; - -Xeed = xe.createApp('Xeed', { - $textarea : null, - $richedit : null, - $toolbar : null, - $root : null, - _options : null, - last_node : null, - - /** - * @brief constructor - */ - init : function(obj, options) { - var self=this, $obj=$(obj), $text, $edit, opts, content, plugins, i, c, tmpId; - - // Options - opts = $.extend({ - height : 200, - minHeight : 400 - }, options); - this._options = opts; - - // min height - if (opts.minHeight > opts.height) opts.minHeight = opts.height; - - // - if ($obj.is('textarea')) { - $text = $obj; - } else { - $text = $obj.before('

                                    - - - -
                                    -

                                    {$lang->subtitle_etc}

                                    - -
                                    -
                                    - -
                                    - - +

                                    +
                                    +
                                    +

                                    {$lang->msg_ftp_installed_realpath} : {_XE_PATH_}

                                    + +
                                  • +

                                    {$lang->about_use_favicon}

                                    +

                                    + favicon + favicon Image + {$lang->cmd_delete} +

                                    +

                                    {$lang->detail_about_use_favicon}

                                    +
                                  • +
                                  • +

                                    {$lang->about_mobilehome_icon}

                                    +

                                    + Mobile Home Icon + www + {$lang->cmd_delete} +

                                    +

                                    {$lang->detail_about_mobilehome_icon}

                                    +
                                  • + + +
                                    +

                                    {$lang->subtitle_advanced}

                                    +
                                      +
                                    • +

                                      +

                                      +

                                      {$lang->about_default_url}

                                      +
                                    • +
                                    • +

                                      {$lang->about_use_sso}

                                      +

                                      + checked="checked" /> + checked="checked" /> +

                                      +
                                    • +
                                    • +

                                      {$lang->use_ssl}

                                      +

                                      + + checked="checked" /> + +

                                      +
                                    • +
                                    • +

                                      {$lang->about_cdn}

                                      +

                                      + checked="checked" /> + checked="checked" /> +

                                      +
                                    • +
                                    • +

                                      {$lang->server_ports}

                                      +

                                      + +    + +

                                      +
                                    • +
                                    • +

                                      {$lang->use_db_session}

                                      +

                                      + checked="checked" /> + checked="checked" /> +

                                      +
                                    • +
                                    • +

                                      {$lang->qmail_compatibility}

                                      +

                                      + checked="checked" /> + checked="checked" /> +

                                      +
                                    • +
                                    • +

                                      {$lang->input_footer_script}

                                      +

                                      +
                                    • +
                                    +
                                    +
                                    +

                                    {$lang->subtitle_etc}

                                    + +
                                    +
                                    + +
                                    + diff --git a/modules/editor/tpl/admin_index.html b/modules/editor/tpl/admin_index.html index 0ecdf11e6..800cf7953 100644 --- a/modules/editor/tpl/admin_index.html +++ b/modules/editor/tpl/admin_index.html @@ -23,141 +23,139 @@ }); }); -
                                    -

                                    {$lang->editor}

                                    -

                                    {$lang->editor_preview}

                                    +

                                    {$lang->editor}

                                    +

                                    {$lang->editor_preview}

                                    - - {$lang->cmd_preview} - -
                                    - + +{$lang->cmd_preview} + + + -
                                    -

                                    {$lang->editor_option}

                                    -
                                      -
                                    • -

                                      {$lang->guide_choose_main_editor}

                                      -

                                      - - editor_skin)-->checked="checked" /> - - editor_skin)-->checked="checked" /> + + +
                                      + +

                                      +
                                    • +
                                    • +

                                      +

                                      px

                                      +
                                    • +
                                    • +

                                      {$lang->guide_choose_comment_editor}

                                      +

                                      + + comment_editor_skin)-->checked="checked" /> + + +
                                      + +

                                      +
                                    • +
                                    • +

                                      +

                                      px

                                      +
                                    • +
                                    • +

                                      {$lang->guide_choose_text_formatting}

                                      +

                                      + + content_style||!$editor_config->content_style&&$key=='default')-->checked="checked"> + +

                                      +
                                    • +
                                    • +

                                      {$lang->guide_choose_font_body}

                                      + +

                                      + content_font)-->checked="checked" />
                                      + + content_font==$name)-->checked="checked" />
                                      + +

                                      +
                                    • +
                                    • +

                                      + +

                                      px

                                      +
                                    • +
                                    +
                                    + +
                                    +
                                    +
                                    +
                                    + +
                                    +

                                    Editor Component

                                    +
                                    + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + All({$component_count}) +
                                    {$lang->cmd_move}{$lang->component_name} {$lang->user_name}{$lang->version}{$lang->author}{$lang->path}{$lang->use}{$lang->cmd_delete}
                                    + +

                                    {$xml_info->title}

                                    +

                                    {nl2br($xml_info->description)}

                                    + +

                                    {$lang->msg_avail_easy_update}{$lang->msg_do_you_like_update}

                                    - style="display:none"> - -
                                    - -

                                    - -
                                  • -

                                    -

                                    px

                                    -
                                  • -
                                  • -

                                    {$lang->guide_choose_comment_editor}

                                    -

                                    - - comment_editor_skin)-->checked="checked" /> - -

                                  • {$xml_info->version} + + {$author->name} + + {$xml_info->path}enabled=='Y')--> checked="checked" /> + + Delete - style="display:none"> - -
                                    - -

                                    - -
                                  • -

                                    -

                                    px

                                    -
                                  • -
                                  • -

                                    {$lang->guide_choose_text_formatting}

                                    -

                                    - - content_style||!$editor_config->content_style&&$key=='default')-->checked="checked"> - -

                                    -
                                  • -
                                  • -

                                    {$lang->guide_choose_font_body}

                                    - -

                                    - content_font)-->checked="checked" />
                                    - - content_font==$name)-->checked="checked" />
                                    - -

                                    -
                                  • -
                                  • -

                                    - -

                                    px

                                    -
                                  • - -
                                    - -
                                    - - -
                                    - -
                                    -

                                    Editor Component

                                    -
                                    - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                    - All({$component_count}) -
                                    {$lang->cmd_move}{$lang->component_name} {$lang->user_name}{$lang->version}{$lang->author}{$lang->path}{$lang->use}{$lang->cmd_delete}
                                    - -

                                    {$xml_info->title}

                                    -

                                    {nl2br($xml_info->description)}

                                    - -

                                    {$lang->msg_avail_easy_update}{$lang->msg_do_you_like_update}

                                    - -
                                    {$xml_info->version} - - {$author->name} - - {$xml_info->path}enabled=='Y')--> checked="checked" /> - - Delete - -
                                    -
                                    -
                                    - -
                                    -
                                    -
                                    - +
                                    +
                                    +
                                    + +
                                    +
                                    + diff --git a/modules/file/tpl/adminConfig.html b/modules/file/tpl/adminConfig.html index a6b78ec3e..d1b6b2ff6 100644 --- a/modules/file/tpl/adminConfig.html +++ b/modules/file/tpl/adminConfig.html @@ -2,47 +2,45 @@

                                    {$XE_VALIDATOR_MESSAGE}

                                    -
                                    -
                                    + -

                                    File Upload

                                    -
                                      -
                                    • -

                                      {$lang->allow_outlink}

                                      -

                                      - - -

                                      -
                                    • - - -
                                    • -

                                      -

                                      MB

                                      -
                                    • -
                                    • -

                                      -

                                      MB

                                      -
                                    • -
                                    • -

                                      -

                                      -
                                    • -
                                    -
                                    - -
                                    -
                                    -
                                    +

                                    File Upload

                                    +
                                      +
                                    • +

                                      {$lang->allow_outlink}

                                      +

                                      + + +

                                      +
                                    • + + +
                                    • +

                                      +

                                      MB

                                      +
                                    • +
                                    • +

                                      +

                                      MB

                                      +
                                    • +
                                    • +

                                      +

                                      +
                                    • +
                                    +
                                    + +
                                    + diff --git a/modules/member/tpl/group_list.html b/modules/member/tpl/group_list.html index 7cd3f47ad..a754b7f47 100644 --- a/modules/member/tpl/group_list.html +++ b/modules/member/tpl/group_list.html @@ -14,121 +14,119 @@

                                    {$XE_VALIDATOR_MESSAGE}

                                    -
                                    -

                                    {$lang->group}

                                    -
                                    - +

                                    {$lang->group}

                                    + + {$lang->use_group_image_mark} - - -
                                    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
                                    +
                                    - {count($group_list)} groups are exist. -
                                    {$lang->group_title}{$lang->description}{$lang->is_default} - [?] -
                                    -

                                    {$lang->about_member_default}

                                    -
                                    -
                                    {$lang->group_image_mark}Action
                                        Add Group
                                    - - {$group_info->title} - {$lang->cmd_modify}
                                    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - -
                                    + {count($group_list)} groups are exist. +
                                    {$lang->group_title}{$lang->description}{$lang->is_default} + [?] +
                                    +

                                    {$lang->about_member_default}

                                    +
                                    +
                                    {$lang->group_image_mark}Action
                                        Add Group
                                    + + {$group_info->title} + {$lang->cmd_modify}
                                    -
                                    -
                                    - -
                                    + + +
                                    +
                                    + +
                                    - -
                                    -
                                      -
                                      -

                                      다국어 수정 | 추가

                                      -
                                        - {@ - /* move current language to the top */ - $a = array($lang_type=>$lang_supported[$lang_type]); - unset($lang_supported[$lang_type]); - $lang_supported = array_merge($a, $lang_supported); - } -
                                      • -
                                      -
                                      -
                                      - -
                                      -

                                      {$lang->multilingual_manager}

                                      + +
                                      +
                                        +
                                        +

                                        다국어 수정 | 추가

                                        +
                                          + {@ + /* move current language to the top */ + $a = array($lang_type=>$lang_supported[$lang_type]); + unset($lang_supported[$lang_type]); + $lang_supported = array_merge($a, $lang_supported); + } +
                                        • +
                                        +
                                        - - - + + + diff --git a/modules/member/tpl/insert_member.html b/modules/member/tpl/insert_member.html index 19e1f6ce6..cc01a64c3 100644 --- a/modules/member/tpl/insert_member.html +++ b/modules/member/tpl/insert_member.html @@ -9,108 +9,106 @@

                                        {$XE_VALIDATOR_MESSAGE}

                                        -
                                        -
                                        - - - - - -

                                        {$lang->msg_update_member}

                                        -

                                        {$lang->msg_new_member}

                                        -
                                          -
                                        • -

                                          {$identifierForm->title} *

                                          -

                                          - - -

                                          -
                                        • -
                                        • -

                                          {$identifierForm->title} *

                                          -

                                          - -

                                          -
                                        • -
                                        • -

                                          {$lang->password} *

                                          -

                                          - - -

                                          -
                                        • -
                                        • -

                                          {$lang->password} *

                                          -

                                          - -

                                          -
                                        • -
                                        • -

                                          {$formTag->title}

                                          -
                                          {$formTag->inputTag}
                                          -
                                          {$editor}
                                          -
                                        • -
                                        • -

                                          {$lang->allow_mailing}

                                          -

                                          - - -

                                          -
                                        • -
                                        • -

                                          {$lang->allow_message}

                                          -

                                          - - - -

                                          -
                                        • -
                                        • -

                                          {$lang->status}

                                          -

                                          - - -

                                          -
                                        • -
                                        • -

                                          -

                                          - - - - {$lang->about_limit_date} -

                                          -
                                        • -
                                        • -

                                          {$lang->is_admin}

                                          -

                                          - - -

                                          -
                                        • -
                                        • -

                                          -

                                          - - {$lang->about_member_description} -

                                          -
                                        • -
                                        • -

                                          {$lang->group}

                                          -

                                          - - group_list[$key])-->checked="checked" /> - - -

                                          -
                                        • -
                                        -
                                        - -
                                        - -
                                        -
                                        +
                                        + + + + + +

                                        {$lang->msg_update_member}

                                        +

                                        {$lang->msg_new_member}

                                        +
                                          +
                                        • +

                                          {$identifierForm->title} *

                                          +

                                          + + +

                                          +
                                        • +
                                        • +

                                          {$identifierForm->title} *

                                          +

                                          + +

                                          +
                                        • +
                                        • +

                                          {$lang->password} *

                                          +

                                          + + +

                                          +
                                        • +
                                        • +

                                          {$lang->password} *

                                          +

                                          + +

                                          +
                                        • +
                                        • +

                                          {$formTag->title}

                                          +
                                          {$formTag->inputTag}
                                          +
                                          {$editor}
                                          +
                                        • +
                                        • +

                                          {$lang->allow_mailing}

                                          +

                                          + + +

                                          +
                                        • +
                                        • +

                                          {$lang->allow_message}

                                          +

                                          + + + +

                                          +
                                        • +
                                        • +

                                          {$lang->status}

                                          +

                                          + + +

                                          +
                                        • +
                                        • +

                                          +

                                          + + + + {$lang->about_limit_date} +

                                          +
                                        • +
                                        • +

                                          {$lang->is_admin}

                                          +

                                          + + +

                                          +
                                        • +
                                        • +

                                          +

                                          + + {$lang->about_member_description} +

                                          +
                                        • +
                                        • +

                                          {$lang->group}

                                          +

                                          + + group_list[$key])-->checked="checked" /> + + +

                                          +
                                        • +
                                        +
                                        + +
                                        + +
                                        -
                                        -

                                        Installed Module

                                        -
                                        - - - - - - - - - - - - - - - - +
                                        - All({count($module_list)}) -
                                        {$lang->favorite}{$lang->module_name}{$lang->version}{$lang->author}{$lang->path}{$lang->cmd_delete}
                                        - - {$lang->favorite}({$lang->on}) +

                                        Installed Module

                                        +
                                        + + + + + + + + + + + + + + + + + - - - - - + + - - + {$author->name} + + + + + + + + + - -
                                        + All({count($module_list)}) +
                                        {$lang->favorite}{$lang->module_name}{$lang->version}{$lang->author}{$lang->path}{$lang->cmd_delete}
                                        + + {$lang->favorite}({$lang->on}) + + {$lang->favorite}({$lang->off}) + + +

                                        + + {$val->title} - {$lang->favorite}({$lang->off}) + {$val->title} -

                                        -

                                        - - {$val->title} - - {$val->title} - -

                                        -

                                        {$val->description}

                                        -

                                        {$lang->msg_avail_install} {$lang->msg_do_you_like_install}

                                        -

                                        {$lang->msg_avail_update} {$lang->msg_do_you_like_update}

                                        -

                                        {$lang->msg_avail_easy_update}{$lang->msg_do_you_like_update}

                                        -
                                        {$val->version} - - - - - {$author->name} - - - - - {$val->path} - - {$lang->cmd_delete} +

                                        +

                                        {$val->description}

                                        +

                                        {$lang->msg_avail_install} {$lang->msg_do_you_like_install}

                                        +

                                        {$lang->msg_avail_update} {$lang->msg_do_you_like_update}

                                        +

                                        {$lang->msg_avail_easy_update}{$lang->msg_do_you_like_update}

                                        +
                                        {$val->version} + + + -
                                        {$val->path} + + {$lang->cmd_delete} + +
                                        -
                                        +
                                        diff --git a/modules/rss/tpl/rss_admin_index.html b/modules/rss/tpl/rss_admin_index.html index 9622ce39e..2100ecc6a 100644 --- a/modules/rss/tpl/rss_admin_index.html +++ b/modules/rss/tpl/rss_admin_index.html @@ -1,94 +1,92 @@ -

                                        {$XE_VALIDATOR_MESSAGE}

                                        -

                                        RSS

                                        -
                                        +

                                        RSS

                                        + -

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

                                        -
                                          -
                                        • -

                                          {$lang->total_feed}

                                          -

                                          - use_total_feed || $total_config->use_total_feed == 'Y')-->checked="checked" /> - use_total_feed == 'N')-->checked="checked" /> -

                                          -
                                        • -
                                        • -

                                          -

                                          -
                                        • -
                                        • -

                                          -

                                          -
                                        • -
                                        • -

                                          - -

                                          - image - - -

                                          +

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

                                          +
                                            +
                                          • +

                                            {$lang->total_feed}

                                            +

                                            + use_total_feed || $total_config->use_total_feed == 'Y')-->checked="checked" /> + use_total_feed == 'N')-->checked="checked" /> +

                                            +
                                          • +
                                          • +

                                            +

                                            +
                                          • +
                                          • +

                                            +

                                            +
                                          • +
                                          • +

                                            + +

                                            + image + + +

                                            + +

                                            +
                                          • +
                                          • +

                                            +

                                            +
                                          • +
                                          • +

                                            +

                                            +
                                          • +
                                          +
                                          + +
                                          +
                                        • +
                                          +

                                          {$lang->feed} {$lang->cmd_management}

                                          +
                                          + + + + + + + + + + + + + + + + + + + + + + + + -

                                          - -
                                        • -

                                          -

                                          -
                                        • -
                                        • -

                                          -

                                          -
                                        • - -
                                          - -
                                          - - -

                                          {$lang->feed} {$lang->cmd_management}

                                          -
                                          -
                                          {$lang->mid}{$lang->description}{$lang->open_rss} + + {$lang->cmd_save}
                                          {$value['mid']}{$value['feed_description']} + + checked="checked" /> + + + checked="checked" /> + + checked="checked" /> + +
                                          - - - - - - - - - - - - - - - - - - - - - - - - - -
                                          {$lang->mid}{$lang->description}{$lang->open_rss} - - {$lang->cmd_save}
                                          {$value['mid']}{$value['feed_description']} - - checked="checked" /> - - - checked="checked" /> - - checked="checked" /> - -
                                          -
                                          - -
                                        \ No newline at end of file + + +
                                        + diff --git a/modules/spamfilter/tpl/index.html b/modules/spamfilter/tpl/index.html index b6da991fc..229f12876 100644 --- a/modules/spamfilter/tpl/index.html +++ b/modules/spamfilter/tpl/index.html @@ -9,71 +9,69 @@ function doInsertDeniedSome(some){ } -
                                        -
                                        - - - - -
                                        -
                                        - - - - -

                                        Spam Filter

                                        -
                                          -
                                        • -

                                          {$lang->cmd_interval}

                                          -

                                          - limits=='Y' || $config->limits =='')-->checked="checked" /> - - limits!='Y' && $config->limits !='')--> checked="checked" /> -

                                          -
                                        • -
                                        • -

                                          {$lang->cmd_check_trackback}

                                          -

                                          - check_trackback=='Y' || $config->check_trackback=='')--> checked="checked" /> - - check_trackback!='Y' && $config->check_trackback!='')--> checked="checked" / > -

                                          -
                                        • -
                                        • -

                                          {$lang->cmd_denied_ip}

                                          -
                                          - -
                                          -

                                          - - - {$lang->about_denied_ip} -

                                          -
                                        • -
                                        • -

                                          -
                                          - -
                                          -

                                          - - - {$lang->about_denied_word} -

                                          -
                                        • -
                                        -
                                        - -
                                        -
                                        -
                                        +
                                        + + + + +
                                        +
                                        + + + + +

                                        Spam Filter

                                        +
                                          +
                                        • +

                                          {$lang->cmd_interval}

                                          +

                                          + limits=='Y' || $config->limits =='')-->checked="checked" /> + + limits!='Y' && $config->limits !='')--> checked="checked" /> +

                                          +
                                        • +
                                        • +

                                          {$lang->cmd_check_trackback}

                                          +

                                          + check_trackback=='Y' || $config->check_trackback=='')--> checked="checked" /> + + check_trackback!='Y' && $config->check_trackback!='')--> checked="checked" / > +

                                          +
                                        • +
                                        • +

                                          {$lang->cmd_denied_ip}

                                          +
                                          + +
                                          +

                                          + + + {$lang->about_denied_ip} +

                                          +
                                        • +
                                        • +

                                          +
                                          + +
                                          +

                                          + + + {$lang->about_denied_word} +

                                          +
                                        • +
                                        +
                                        + +
                                        +
                                        diff --git a/modules/trash/tpl/trash_list.html b/modules/trash/tpl/trash_list.html index 0750cc810..962fd357c 100644 --- a/modules/trash/tpl/trash_list.html +++ b/modules/trash/tpl/trash_list.html @@ -3,14 +3,13 @@ var confirm_restore_msg = '{$lang->confirm_restore}'; var no_text_comment = '{$lang->no_text_comment}'; -

                                        {$XE_VALIDATOR_MESSAGE}

                                        - - - + + +

                                        {$lang->trash}

                                        @@ -86,33 +85,32 @@ var no_text_comment = '{$lang->no_text_comment}'; - + From adf7ffba67afda49e29311f532c8618d6d595d67 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Mon, 26 Sep 2011 07:29:49 +0000 Subject: [PATCH 0877/1372] Unvalid Markup Remove. class="content" id="content" git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9336 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/module/tpl/module_list.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/module/tpl/module_list.html b/modules/module/tpl/module_list.html index f84bc7833..0b9d5b272 100644 --- a/modules/module/tpl/module_list.html +++ b/modules/module/tpl/module_list.html @@ -5,7 +5,7 @@ xe.lang.favorite_off = '{$lang->favorite}({$lang->off})'; -

                                        Installed Module

                                        +

                                        {$lang->installed_module}

                                        + + +
                                        From 3ca0e29024da33e8e505d728379005c034d9d389 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Mon, 26 Sep 2011 07:46:25 +0000 Subject: [PATCH 0878/1372] Admin .single column layout add. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9337 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/tpl/css/admin.css | 2 ++ modules/admin/tpl/css/admin.min.css | 2 ++ modules/admin/tpl/js/admin.js | 7 +++++++ 3 files changed, 11 insertions(+) diff --git a/modules/admin/tpl/css/admin.css b/modules/admin/tpl/css/admin.css index 85788d88a..f056f7335 100644 --- a/modules/admin/tpl/css/admin.css +++ b/modules/admin/tpl/css/admin.css @@ -289,6 +289,8 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */ .x .dashboard .portlet{float:left;width:48%;margin-right:1em} .x .dashboard .portlet:nth-of-type(odd){float:left;width:49%;margin-right:0} .x .dashboard .portlet:nth-of-type(even){float:right;width:49%;margin-right:0} +/* Single Column*/ +.x .single{position:relative;float:none;width:auto;margin-left:-230px} /* Search */ .x .search{zoom:1} .x .search:after{content:"";display:block;clear:both} diff --git a/modules/admin/tpl/css/admin.min.css b/modules/admin/tpl/css/admin.min.css index 85788d88a..f056f7335 100644 --- a/modules/admin/tpl/css/admin.min.css +++ b/modules/admin/tpl/css/admin.min.css @@ -289,6 +289,8 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */ .x .dashboard .portlet{float:left;width:48%;margin-right:1em} .x .dashboard .portlet:nth-of-type(odd){float:left;width:49%;margin-right:0} .x .dashboard .portlet:nth-of-type(even){float:right;width:49%;margin-right:0} +/* Single Column*/ +.x .single{position:relative;float:none;width:auto;margin-left:-230px} /* Search */ .x .search{zoom:1} .x .search:after{content:"";display:block;clear:both} diff --git a/modules/admin/tpl/js/admin.js b/modules/admin/tpl/js/admin.js index b67dc08f1..96dda7c48 100644 --- a/modules/admin/tpl/js/admin.js +++ b/modules/admin/tpl/js/admin.js @@ -1150,3 +1150,10 @@ function completeInstallModule(ret_obj) { jQuery(document).ready(function($){ $('body').ajaxComplete(function(){ hideWaitingFogLayer() }); }); + +/* admin single column layout */ +jQuery(function($){ + if($('.x>.body>.lnb').length == 0){ // When it have no lnb + $('.x>.body>.content').addClass('single'); // Add class single + } +}); \ No newline at end of file From d2d16a8d8445e283f1ef817ddde94faacc3173ad Mon Sep 17 00:00:00 2001 From: ngleader Date: Mon, 26 Sep 2011 07:49:18 +0000 Subject: [PATCH 0879/1372] fixed the link of xe official site git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9338 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/tpl/_spFooter.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/admin/tpl/_spFooter.html b/modules/admin/tpl/_spFooter.html index b842c1af9..3c0952bf2 100644 --- a/modules/admin/tpl/_spFooter.html +++ b/modules/admin/tpl/_spFooter.html @@ -1,6 +1,6 @@ +
                                        +

                                        {$XE_VALIDATOR_MESSAGE}

                                        +
                                        -
                                        - + + - - -

                                        Spam Filter

                                        + +

                                        {$lang->spamfilter}

                                        • {$lang->cmd_interval}

                                          @@ -38,6 +32,16 @@ function doInsertDeniedSome(some){ check_trackback!='Y' && $config->check_trackback!='')--> checked="checked" / >

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

                                          @@ -51,7 +55,7 @@ function doInsertDeniedSome(some){

                                          - + {$lang->about_denied_ip}

                                        • @@ -66,12 +70,9 @@ function doInsertDeniedSome(some){

                                          - + {$lang->about_denied_word}

                                        -
                                        - -
                                        diff --git a/modules/spamfilter/tpl/js/spamfilter_admin.js b/modules/spamfilter/tpl/js/spamfilter_admin.js index a8b93f945..46a42623a 100644 --- a/modules/spamfilter/tpl/js/spamfilter_admin.js +++ b/modules/spamfilter/tpl/js/spamfilter_admin.js @@ -19,31 +19,26 @@ function doDeleteDeniedWord(word) { fo_obj.ruleset.value = 'deleteDeniedWord'; fo_obj.submit(); } - -function checkSomeValid(some){ +function doInsertDeniedIP(msg_invalid_format){ var fo_obj = get_by_id('spamfilterInsert'); - var reg_ipaddress = /^(\d{1,3}(?:.(\d{1,3}|\*)){3}\s*(\/\/[^\r\n]*)?[\r\n]*)*$/; var matchStr_ipaddress = fo_obj.ipaddressList.value; - + if(!matchStr_ipaddress.match(reg_ipaddress)) { + alert(msg_invalid_format); return false; + } + fo_obj.act.value = "procSpamfilterAdminInsertDeniedIP"; + fo_obj.ruleset.value = "insertDeniedIp"; + fo_obj.submit(); +} +function doInsertDeniedWord(msg_invalid_format){ + var fo_obj = get_by_id('spamfilterInsert'); var reg_word = /^(.{2,40}[\r\n]+)*.{0,40}$/; var matchStr_word = fo_obj.wordList.value; - - var valid_word = true; - var valid_ip = true; - - if(!matchStr_ipaddress.match(reg_ipaddress)) valid_ip = false; - if(!matchStr_word.match(reg_word)) valid_word = false; - - if(some == 'ip'){ - fo_obj.wordList.value = ''; - valid_word = true; - } else if(some == 'word'){ - fo_obj.ipaddressList.value = ''; - valid_ip = true; + if(!matchStr_word.match(reg_word)) { + alert(msg_invalid_format); return false; } - - if(valid_ip && valid_word) return true; - else return false; + fo_obj.act.value = "procSpamfilterAdminInsertDeniedWord"; + fo_obj.ruleset.value = "insertDeniedWord"; + fo_obj.submit(); } From e03f95fd7ad0666185d7b1cbd586c81cbe5deffb Mon Sep 17 00:00:00 2001 From: chschy Date: Tue, 27 Sep 2011 04:15:16 +0000 Subject: [PATCH 0895/1372] issue 160, modify language on editor git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9354 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/editor/lang/lang.xml | 20 ++++++++++++++++++++ modules/editor/tpl/config_preview.html | 8 ++++---- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/modules/editor/lang/lang.xml b/modules/editor/lang/lang.xml index 0290636e7..cf67a8109 100644 --- a/modules/editor/lang/lang.xml +++ b/modules/editor/lang/lang.xml @@ -10,6 +10,26 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/modules/editor/tpl/config_preview.html b/modules/editor/tpl/config_preview.html index 855c7598e..9369b5372 100644 --- a/modules/editor/tpl/config_preview.html +++ b/modules/editor/tpl/config_preview.html @@ -1,18 +1,18 @@
                                        -

                                        에디터 미리보기

                                        -

                                        본문 에디터

                                        +

                                        {$lang->editor_preview}

                                        +

                                        {$lang->main_editor}

                                        {$editor}


                                        -

                                        댓글 에디터

                                        +

                                        {$lang->comment_editor}

                                        {$editor_comment}

                                        -
                                        \ No newline at end of file + From 05bf4abe33718e712e1fddab2818e78f7920c2b0 Mon Sep 17 00:00:00 2001 From: flyskyko Date: Tue, 27 Sep 2011 04:24:37 +0000 Subject: [PATCH 0896/1372] issue 160, fixed a bug related beforeunload event on firefox git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9355 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/js/xml_handler.js | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/common/js/xml_handler.js b/common/js/xml_handler.js index 1dde8965f..42323efae 100644 --- a/common/js/xml_handler.js +++ b/common/js/xml_handler.js @@ -235,7 +235,7 @@ $.exec_xml = window.exec_xml = function(module, act, params, callback_func, resp function onsuccess(data, textStatus, xhr) { var resp_xml = $(data).find('response')[0], resp_obj, txt='', ret=[], tags={}, json_str=''; - waiting_obj.css('display', 'none'); + waiting_obj.css('display', 'none').trigger('cancel_confirm'); if(!resp_xml) { alert(_xhr.responseText); @@ -277,7 +277,6 @@ $.exec_xml = window.exec_xml = function(module, act, params, callback_func, resp if($.isFunction(callback_func)) callback_func(ret, response_tags, callback_func_arg, fo_obj); } - $(window).bind('beforeunload', beforeUnloadHandler); // 모든 xml데이터는 POST방식으로 전송. try-catch문으로 오류 발생시 대처 try { $.ajax({ @@ -303,9 +302,6 @@ $.exec_xml = window.exec_xml = function(module, act, params, callback_func, resp try{ console.log(msg); }catch(ee){} - }, - complete : function() { - $(window).unbind('beforeunload', beforeUnloadHandler); } }); } catch(e) { @@ -353,9 +349,6 @@ function arr2obj(arr) { return ret; } -function beforeUnloadHandler(){ - return ''; -} /** * @brief exec_json (exec_xml와 같은 용도) @@ -365,7 +358,6 @@ $.exec_json = function(action,data,func){ action = action.split("."); if(action.length == 2){ if(show_waiting_message) $(".wfsr").html(waiting_message).show(); - $(window).bind('beforeunload', beforeUnloadHandler); $.extend(data,{module:action[0],act:action[1]}); if(typeof(xeVid)!='undefined') $.extend(data,{vid:xeVid}); @@ -376,13 +368,10 @@ $.exec_json = function(action,data,func){ ,contentType:"application/json" ,data:$.param(data) ,success : function(data){ - $(".wfsr").hide(); + $(".wfsr").hide().trigger('cancel_confirm'); if(data.error > 0) alert(data.message); if($.isFunction(func)) func(data); } - ,complete : function(){ - $(window).unbind('beforeunload', beforeUnloadHandler); - } }); } }; @@ -395,7 +384,6 @@ $.fn.exec_html = function(action,data,type,func,args){ action = action.split("."); if(action.length == 2){ if(show_waiting_message) $(".wfsr").html(waiting_message).show(); - $(window).bind('beforeunload', beforeUnloadHandler); $.extend(data,{module:action[0],act:action[1]}); $.ajax({ @@ -404,14 +392,26 @@ $.fn.exec_html = function(action,data,type,func,args){ ,url:request_uri ,data:$.param(data) ,success : function(html){ - $(".wfsr").hide(); + $(".wfsr").hide().trigger('cancel_confirm'); self[type](html); if($.isFunction(func)) func(args); } - ,complete : function(){ - $(window).unbind('beforeunload', beforeUnloadHandler); - } }); } }; + +function beforeUnloadHandler(){ + return ''; +} + +$(function($){ + $('.wfsr') + .ajaxStart(function(){ + $(window).bind('beforeunload', beforeUnloadHandler); + }) + .bind('ajaxStop cancel_confirm', function(){ + $(window).unbind('beforeunload', beforeUnloadHandler); + }); +}); + })(jQuery); From f763282d5670ce4a3c81643b06b91d78a84a8036 Mon Sep 17 00:00:00 2001 From: flyskyko Date: Tue, 27 Sep 2011 04:34:17 +0000 Subject: [PATCH 0897/1372] issue 160, rollback commit mistake. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9356 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- widgets/language_select/conf/info.xml | 60 --------------------------- 1 file changed, 60 deletions(-) diff --git a/widgets/language_select/conf/info.xml b/widgets/language_select/conf/info.xml index 5ff716011..dee0e528f 100644 --- a/widgets/language_select/conf/info.xml +++ b/widgets/language_select/conf/info.xml @@ -33,64 +33,4 @@ NHN - - - text - - - color - - - textarea - - - select - - 1 - - - - 2 - - - - 3 - - - - - selectmultiorder2 - - one - 기본(제거불가) - - - two - - - - three - - - - - mid_list - - - member_group - - - module_srl_list - - - mid - - - filebox - - - menu - - - From b4f21279f0e070e14a08bee77566ae466f7fcc40 Mon Sep 17 00:00:00 2001 From: chschy Date: Tue, 27 Sep 2011 04:35:25 +0000 Subject: [PATCH 0898/1372] Remove debugPrint in layout model git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9357 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/layout/layout.model.php | 1 - modules/member/member.controller.php | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/layout/layout.model.php b/modules/layout/layout.model.php index 085139551..f69c01b59 100644 --- a/modules/layout/layout.model.php +++ b/modules/layout/layout.model.php @@ -71,7 +71,6 @@ if (!$layout_info) { $oLayoutController = &getAdminController('layout'); $oLayoutController->deleteLayout($layout_srl); - debugPrint('delete'); return; } diff --git a/modules/member/member.controller.php b/modules/member/member.controller.php index 0e4af4e4e..c894ba4bc 100644 --- a/modules/member/member.controller.php +++ b/modules/member/member.controller.php @@ -18,6 +18,7 @@ * @brief Log-in by checking user_id and password **/ function procMemberLogin($user_id = null, $password = null, $keep_signed = null) { + debugPrint('로그인합니당'); // Variables if(!$user_id) $user_id = Context::get('user_id'); $user_id = trim($user_id); From cb18ff30646a8fbcca5d22ccf8dfa5e225ed3372 Mon Sep 17 00:00:00 2001 From: ovclas Date: Tue, 27 Sep 2011 06:21:26 +0000 Subject: [PATCH 0899/1372] issue 160 when document management, do not get content in query. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9358 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/document/document.controller.php | 5 +++-- modules/document/document.model.php | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/modules/document/document.controller.php b/modules/document/document.controller.php index 80a9d499a..d9c0e314a 100644 --- a/modules/document/document.controller.php +++ b/modules/document/document.controller.php @@ -1776,7 +1776,8 @@ class documentController extends document { if(count($documentSrlList) > 0) { $oDocumentModel = &getModel('document'); - $documentList = $oDocumentModel->getDocuments($documentSrlList, $this->grant->is_admin); + $columnList = array('document_srl', 'title', 'nick_name', 'status'); + $documentList = $oDocumentModel->getDocuments($documentSrlList, $this->grant->is_admin, false, $columnList); } else { @@ -1808,4 +1809,4 @@ class documentController extends document { if(!$obj->status && $obj->is_secret != 'Y') $obj->status = $this->getConfigStatus('public'); } } -?> \ No newline at end of file +?> diff --git a/modules/document/document.model.php b/modules/document/document.model.php index 88bd1ce49..94caf7c19 100644 --- a/modules/document/document.model.php +++ b/modules/document/document.model.php @@ -104,7 +104,7 @@ /** * @brief Bringing multiple documents (or paging) **/ - function getDocuments($document_srls, $is_admin = false, $load_extra_vars=true) { + function getDocuments($document_srls, $is_admin = false, $load_extra_vars=true, $columnList = array()) { if(is_array($document_srls)) { $list_count = count($document_srls); $document_srls = implode(',',$document_srls); @@ -115,7 +115,7 @@ $args->list_count = $list_count; $args->order_type = 'asc'; - $output = executeQuery('document.getDocuments', $args); + $output = executeQuery('document.getDocuments', $args, $columnList); $document_list = $output->data; if(!$document_list) return; if(!is_array($document_list)) $document_list = array($document_list); From 17803c5a14e0853085efdc9289ad9cab8da35c68 Mon Sep 17 00:00:00 2001 From: flyskyko Date: Tue, 27 Sep 2011 07:59:17 +0000 Subject: [PATCH 0900/1372] issue 160, fixed a bug related multiple toggle contents of multi language git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9359 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/tpl/css/admin.css | 8 ++++---- modules/admin/tpl/js/admin.js | 18 +++++++++++------- modules/member/tpl/group_list.html | 2 +- modules/menu/tpl/sitemap.html | 2 +- .../tpl/widget_generate_code.multilang.html | 4 ++-- ...idget_generate_code.multilang.textarea.html | 4 ++-- 6 files changed, 21 insertions(+), 17 deletions(-) diff --git a/modules/admin/tpl/css/admin.css b/modules/admin/tpl/css/admin.css index 95ea9332f..a7c6a567d 100644 --- a/modules/admin/tpl/css/admin.css +++ b/modules/admin/tpl/css/admin.css @@ -378,10 +378,10 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */ .x .langEdit .langList li a{display:inline-block;width:80px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis} .x .langEdit .langList li.active{background:url(../img/iconArrow.gif) no-repeat right -188px} .x .langEdit.showChild .langList{display:block} -.x .langEdit #langInput{background:#fff} -.x .langEdit #langInput h2{padding:5px 10px;margin:0 0 -1px 0;font-size:12px;font-weight:normal;color:#666;border:1px solid #eee;border-top-color:#ccc} -.x .langEdit #langInput h2 strong{color:#000;font-size:14px} -.x .langEdit.showChild #langInput{position:absolute;left:285px;top:0} +.x .langEdit .langInput{background:#fff} +.x .langEdit .langInput h2{padding:5px 10px;margin:0 0 -1px 0;font-size:12px;font-weight:normal;color:#666;border:1px solid #eee;border-top-color:#ccc} +.x .langEdit .langInput h2 strong{color:#000;font-size:14px} +.x .langEdit.showChild .langInput{position:absolute;left:285px;top:0} .x .langEdit li.en input, .x .langEdit li.en textarea, .x .mLangEdit li.en textarea{background:url(../img/flag.us.gif) no-repeat 99% 5px} diff --git a/modules/admin/tpl/js/admin.js b/modules/admin/tpl/js/admin.js index 96dda7c48..19268d08f 100644 --- a/modules/admin/tpl/js/admin.js +++ b/modules/admin/tpl/js/admin.js @@ -835,7 +835,7 @@ $('.multiLangEdit') // reset $layer.trigger('multilang-reset').removeClass('showChild').find('.langList').empty().end(); - $('#langInput li.'+xe.current_lang).find('>input:text,>textarea').val(text).prev('label').css('visibility','hidden'); + $layer.find('.langInput li.'+xe.current_lang).find('>input:text,>textarea').val(text).prev('label').css('visibility','hidden'); // hide suggestion layer $suggest.trigger('hide'); @@ -863,7 +863,8 @@ $('.multiLangEdit') $.each(list, function(key){ var $li = $('
                                      • ').appendTo($langlist); - $('') + var anchor_id = $layer.data('layer_index'); + $('') .text(this[xe.current_lang]) .data('multilang-name', key) .appendTo($li); @@ -912,6 +913,7 @@ $suggest = $('
                                          ') $(this).hide(); }); +var layer_index = 0; function initLayer($layer) { var $submit, $input, value='', current_status = 0, mode, cmd_add, cmd_edit, status_texts=[]; var USE = 0, UPDATE_AND_USE = 1, MODE_SAVE = 0, MODE_UPDATE = 1; @@ -923,7 +925,7 @@ function initLayer($layer) { .bind('multilang-reset', function(){ $layer .data('multilang-current-name', '') - .find('#langInput li').find('>input:text,>textarea').val(' ').prev('label').css('visibility','visible'); + .find('.langInput li').find('>input:text,>textarea').val(' ').prev('label').css('visibility','visible'); mode = MODE_SAVE; setTitleText(); @@ -945,7 +947,7 @@ function initLayer($layer) { if(!list || !list[name]) return; list = list[name]; - $controls = $('#langInput'); + $controls = $layer.find('.langInput'); $layer .trigger('multilang-reset') // reset @@ -968,7 +970,9 @@ function initLayer($layer) { setTitleText(); return false; - }); + }) + .data('layer_index', layer_index) + .find('.langInput').attr('id', 'langInput_' + layer_index++); cmd_edit = $layer.find('h2 strong').text(); cmd_add = $layer.find('h2 a').text(); @@ -1006,7 +1010,7 @@ function initLayer($layer) { function use_lang() { $layer.hide().closest('.multiLangEdit').find('.vLang') .eq(0).val('$user_lang->'+name).end() - .eq(1).val($('#langInput li.'+xe.current_lang).find('>input:text,>textarea').val()).end(); + .eq(1).val($layer.find('.langInput li.'+xe.current_lang).find('>input:text,>textarea').val()).end(); }; function save_lang() { @@ -1156,4 +1160,4 @@ jQuery(function($){ if($('.x>.body>.lnb').length == 0){ // When it have no lnb $('.x>.body>.content').addClass('single'); // Add class single } -}); \ No newline at end of file +}); diff --git a/modules/member/tpl/group_list.html b/modules/member/tpl/group_list.html index a754b7f47..b4aec6f10 100644 --- a/modules/member/tpl/group_list.html +++ b/modules/member/tpl/group_list.html @@ -89,7 +89,7 @@
                                            -
                                            +

                                            다국어 수정 | 추가

                                              {@ diff --git a/modules/menu/tpl/sitemap.html b/modules/menu/tpl/sitemap.html index cb82fbd1f..a3e73f0ba 100644 --- a/modules/menu/tpl/sitemap.html +++ b/modules/menu/tpl/sitemap.html @@ -62,7 +62,7 @@ xe.lang.confirm_delete = "{$lang->confirm_delete}";
                                                -
                                                +

                                                {$lang->multilingual} {$lang->cmd_modify} | {$lang->cmd_insert}

                                                  {@ diff --git a/modules/widget/tpl/widget_generate_code.multilang.html b/modules/widget/tpl/widget_generate_code.multilang.html index 375d76aa9..8a45e064d 100644 --- a/modules/widget/tpl/widget_generate_code.multilang.html +++ b/modules/widget/tpl/widget_generate_code.multilang.html @@ -1,7 +1,7 @@
                                                    -
                                                    +

                                                    {$lang->multilingual} {$lang->cmd_modify} | {$lang->cmd_insert}

                                                      {@ @@ -20,4 +20,4 @@
                                                    -
                                                    \ No newline at end of file + diff --git a/modules/widget/tpl/widget_generate_code.multilang.textarea.html b/modules/widget/tpl/widget_generate_code.multilang.textarea.html index ea61170ac..5b05c0b24 100644 --- a/modules/widget/tpl/widget_generate_code.multilang.textarea.html +++ b/modules/widget/tpl/widget_generate_code.multilang.textarea.html @@ -5,7 +5,7 @@
                                                      -
                                                      +

                                                      {$lang->multilingual} {$lang->cmd_modify} | {$lang->cmd_insert}

                                                        {@ @@ -24,4 +24,4 @@
                                                      - \ No newline at end of file + From ed1a4543b522d6f27455793494deb2ac253289af Mon Sep 17 00:00:00 2001 From: flyskyko Date: Tue, 27 Sep 2011 08:19:19 +0000 Subject: [PATCH 0901/1372] issue 160, fix a bug related multi language management page git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9361 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/module/tpl/js/multilingual.js | 6 +++--- modules/module/tpl/module_langcode.html | 6 ++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/modules/module/tpl/js/multilingual.js b/modules/module/tpl/js/multilingual.js index 530f15a15..d1f273e8f 100644 --- a/modules/module/tpl/js/multilingual.js +++ b/modules/module/tpl/js/multilingual.js @@ -4,7 +4,7 @@ jQuery(function($){ $('#langList') .find('form').hide().attr('aria-hidden','true').end() // collapse all language input control .delegate('button._edit', 'click', function(){ - var $this = $(this), $form = $this.next('form'); + var $this = $(this), $form = $this.parent().next('form'); // toggle input control if($form.attr('aria-hidden') == 'false') { @@ -22,14 +22,14 @@ $('#langList') function on_complete(ret) { var name = ret['lang_name'], list = ret['lang_list']['item'], elems = $form[0].elements, item; - $form.find('label+textarea').prev('label').css('visibility','hidden'); + $form.find('label+textarea').prev('label').css('visibility','visible'); if(!$.isArray(list)) list = [list]; for(var i=0,c=list.length; i < c; i++) { item = list[i]; if(item && item.lang_code && elems[item.lang_code]) { elems[item.lang_code].value = item.value; - if(!item.value) $(elems[item.lang_code]).prev('label').css('visibility','visible'); + if(item.value) $(elems[item.lang_code]).prev('label').css('visibility','hidden'); } } } diff --git a/modules/module/tpl/module_langcode.html b/modules/module/tpl/module_langcode.html index b8d387573..1e694fae5 100644 --- a/modules/module/tpl/module_langcode.html +++ b/modules/module/tpl/module_langcode.html @@ -16,6 +16,12 @@
                                                        + {@ + /* move current language to the top */ + $a = array($lang_type=>$lang_supported[$lang_type]); + unset($lang_supported[$lang_type]); + $lang_supported = array_merge($a, $lang_supported); + }
                                                      From a418b17f5d50272a5c6ca7864f259e8a5d91466b Mon Sep 17 00:00:00 2001 From: flyskyko Date: Tue, 27 Sep 2011 08:28:59 +0000 Subject: [PATCH 0902/1372] issue 160, changed "__XE_CDN_VERSION__" to convertion character git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9362 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/frontendfile/FrontEndFileHandler.class.php | 4 ++-- config/config.inc.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/classes/frontendfile/FrontEndFileHandler.class.php b/classes/frontendfile/FrontEndFileHandler.class.php index b91334e28..03cf4b718 100644 --- a/classes/frontendfile/FrontEndFileHandler.class.php +++ b/classes/frontendfile/FrontEndFileHandler.class.php @@ -135,7 +135,7 @@ $result = array(); foreach($map as $file) { - if ($useCdn == 'Y' && $file->useCdn) + if ($useCdn == 'Y' && $file->useCdn && $file->cdnVersion != '%__XE_CDN_VERSION__%') { $fullFilePath = $file->cdnPrefix . $file->cdnVersion . '/' . substr($file->cdnPath, 2) . '/' . $file->fileName; } @@ -170,7 +170,7 @@ $result = array(); foreach($map as $file) { - if ($useCdn == 'Y' && $file->useCdn) + if ($useCdn == 'Y' && $file->useCdn && $file->cdnVersion != '%__XE_CDN_VERSION__%') { $fullFilePath = $file->cdnPrefix . $file->cdnVersion . '/' . substr($file->cdnPath, 2) . '/' . $file->fileName; } diff --git a/config/config.inc.php b/config/config.inc.php index 842f2c65d..ef6ac4748 100644 --- a/config/config.inc.php +++ b/config/config.inc.php @@ -132,7 +132,7 @@ /** * @brief CDN version **/ - if(!defined('__XE_CDN_VERSION__')) define('__XE_CDN_VERSION__', 'alpha2'); + if(!defined('__XE_CDN_VERSION__')) define('__XE_CDN_VERSION__', '%__XE_CDN_VERSION__%'); /** * @brief Require specific files when using Firebug console output From c1964e502bdd04fe917cbd076e282bc4695201df Mon Sep 17 00:00:00 2001 From: devjin Date: Tue, 27 Sep 2011 08:31:36 +0000 Subject: [PATCH 0903/1372] fixed check site_srl git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9363 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/member/member.model.php | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/member/member.model.php b/modules/member/member.model.php index 580c532bb..38afae980 100644 --- a/modules/member/member.model.php +++ b/modules/member/member.model.php @@ -372,6 +372,7 @@ **/ function getGroups($site_srl = 0) { if(!$GLOBALS['__group_info__'][$site_srl]) { + if(!isset($site_srl)) $site_srl = 0; $args->site_srl = $site_srl; $args->sort_index = 'list_order'; $args->order_type = 'asc'; From 27e5baf6f25f03f86f0a6b0249de745efd057fbc Mon Sep 17 00:00:00 2001 From: chschy Date: Tue, 27 Sep 2011 08:33:01 +0000 Subject: [PATCH 0904/1372] Remove debugPrint git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9364 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/member/member.controller.php | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/member/member.controller.php b/modules/member/member.controller.php index c894ba4bc..0e4af4e4e 100644 --- a/modules/member/member.controller.php +++ b/modules/member/member.controller.php @@ -18,7 +18,6 @@ * @brief Log-in by checking user_id and password **/ function procMemberLogin($user_id = null, $password = null, $keep_signed = null) { - debugPrint('로그인합니당'); // Variables if(!$user_id) $user_id = Context::get('user_id'); $user_id = trim($user_id); From 5b5dc625116977178d22474694abdb40b722c59f Mon Sep 17 00:00:00 2001 From: flyskyko Date: Tue, 27 Sep 2011 09:04:29 +0000 Subject: [PATCH 0905/1372] issue 160, fixed a bug for always redirect to dispBoardAdminCategoryInfo after add category on module that not "board" git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9365 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/document/document.controller.php | 2 +- modules/document/tpl/category_list.html | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/document/document.controller.php b/modules/document/document.controller.php index d9c0e314a..f783c9483 100644 --- a/modules/document/document.controller.php +++ b/modules/document/document.controller.php @@ -1169,7 +1169,7 @@ class documentController extends document { $this->add('parent_srl', $args->parent_srl); if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) { - $returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'module', 'admin', 'act', 'dispBoardAdminCategoryInfo', 'module_srl', $args->module_srl); + $returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : Context::get('error_return_url'); header('location:'.$returnUrl); return; } diff --git a/modules/document/tpl/category_list.html b/modules/document/tpl/category_list.html index be485fcc4..c152c455b 100644 --- a/modules/document/tpl/category_list.html +++ b/modules/document/tpl/category_list.html @@ -21,6 +21,7 @@ +
                                                      - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                      {$lang->title}
                                                      {$addon_info->title} ver. {$addon_info->version}
                                                      {$lang->author}
                                                      - - {$author->name} ({$author->homepage}, {$author->email_address})
                                                      - -
                                                      {$lang->homepage}
                                                      {$addon_info->homepage}
                                                      {$lang->regdate}
                                                      {zdate($addon_info->date, 'Y-m-d')}
                                                      {$lang->addon_license}
                                                      - {nl2br(trim($addon_info->license))} - -

                                                      {$addon_info->license_link}

                                                      - -
                                                      {$lang->description}
                                                      {nl2br(trim($addon_info->description))}
                                                      - +
                                                      + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                      {$lang->title}
                                                      {$addon_info->title} ver. {$addon_info->version}
                                                      {$lang->author}
                                                      + + {$author->name} ({$author->homepage}, {$author->email_address})
                                                      + +
                                                      {$lang->homepage}
                                                      {$addon_info->homepage}
                                                      {$lang->regdate}
                                                      {zdate($addon_info->date, 'Y-m-d')}
                                                      {$lang->addon_license}
                                                      + {nl2br(trim($addon_info->license))} + +

                                                      {$addon_info->license_link}

                                                      + +
                                                      {$lang->description}
                                                      {nl2br(trim($addon_info->description))}
                                                      +
                                                      @@ -50,37 +51,39 @@
                                                      - - - - - - - - - - -
                                                      - {$history->version}
                                                      - {$history->date} -
                                                      - -

                                                      {$author->name} ({$author->homepage} / {$author->email_address})

                                                      - - -

                                                      {nl2br(trim($history->description))}

                                                      - - - - -
                                                      +
                                                      + + + + + + + + + + +
                                                      + {$history->version}
                                                      + {$history->date} +
                                                      + +

                                                      {$author->name} ({$author->homepage} / {$author->email_address})

                                                      + + +

                                                      {nl2br(trim($history->description))}

                                                      + + + + +
                                                      +
                                                      diff --git a/modules/admin/tpl/css/admin.css b/modules/admin/tpl/css/admin.css index a7c6a567d..68c38d1fc 100644 --- a/modules/admin/tpl/css/admin.css +++ b/modules/admin/tpl/css/admin.css @@ -169,10 +169,15 @@ body>.popup{margin:1em} .x .lnb li.active ul{display:block;border-top:1px solid #eee} .x .lnb li.active li.active a span{color:#13b200;font-weight:bold;letter-spacing:-1px} /* Content Navigation */ -.x cnb{margin:1em 0;position:relative;zoom:1} -.x cnb:after{content:"";display:block;clear:both} -.x cnb .active{font-weight:bold;color:#333;text-decoration:none} -.x cnb .side{float:right} +.x .cnb{margin:1em 0;position:relative;zoom:1} +.x .cnb:after{content:"";display:block;clear:both} +.x .cnb ul{list-style:none;margin:0;padding:0} +.x .cnb li{display:inline} +.x .cnb li:before{content:"| ";color:#ccc} +.x .cnb li:first-child:before{content:"";} +.x .cnb .active, +.x .cnb .active a{font-weight:bold;color:#333;text-decoration:none} +.x .cnb .side{float:right} /* Pagination */ .x .pagination{margin:1em 0;text-align:center;line-height:normal} .x .pagination *{vertical-align:middle} diff --git a/modules/admin/tpl/css/admin.min.css b/modules/admin/tpl/css/admin.min.css index 95ea9332f..4f0584000 100644 --- a/modules/admin/tpl/css/admin.min.css +++ b/modules/admin/tpl/css/admin.min.css @@ -169,10 +169,15 @@ body>.popup{margin:1em} .x .lnb li.active ul{display:block;border-top:1px solid #eee} .x .lnb li.active li.active a span{color:#13b200;font-weight:bold;letter-spacing:-1px} /* Content Navigation */ -.x cnb{margin:1em 0;position:relative;zoom:1} -.x cnb:after{content:"";display:block;clear:both} -.x cnb .active{font-weight:bold;color:#333;text-decoration:none} -.x cnb .side{float:right} +.x .cnb{margin:1em 0;position:relative;zoom:1} +.x .cnb:after{content:"";display:block;clear:both} +.x .cnb ul{list-style:none;margin:0;padding:0} +.x .cnb li{display:inline} +.x .cnb li:before{content:"| ";color:#ccc} +.x .cnb li:first-child:before{content:"";} +.x .cnb .active, +.x .cnb .active a{font-weight:bold;color:#333;text-decoration:none} +.x .cnb .side{float:right} /* Pagination */ .x .pagination{margin:1em 0;text-align:center;line-height:normal} .x .pagination *{vertical-align:middle} diff --git a/modules/comment/tpl/comment_module_config.html b/modules/comment/tpl/comment_module_config.html index 23674ab64..14b233882 100644 --- a/modules/comment/tpl/comment_module_config.html +++ b/modules/comment/tpl/comment_module_config.html @@ -1,44 +1,45 @@
                                                      - - - - -

                                                      {$lang->comment}

                                                      - - - - - - - - - - - - - - - - - -
                                                      {$lang->comment_count}
                                                      -

                                                      {$lang->about_comment_count}

                                                      - - -
                                                      {$lang->cmd_vote}
                                                      - -
                                                      {$lang->cmd_vote_down}
                                                      - -
                                                      - -
                                                      + + + +

                                                      {$lang->comment}

                                                      +
                                                      + + + + + + + + + + + + + + + + + +
                                                      {$lang->comment_count}
                                                      +

                                                      {$lang->about_comment_count}

                                                      + + +
                                                      {$lang->cmd_vote}
                                                      + +
                                                      {$lang->cmd_vote_down}
                                                      + +
                                                      + +
                                                      +
                                                      diff --git a/modules/comment/tpl/declared_list.html b/modules/comment/tpl/declared_list.html index 742e58d46..cee667614 100644 --- a/modules/comment/tpl/declared_list.html +++ b/modules/comment/tpl/declared_list.html @@ -4,52 +4,53 @@

                                                      {$XE_VALIDATOR_MESSAGE}

                                                    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                    Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
                                                    {$lang->comment}
                                                    {$lang->user_name}
                                                    {$lang->date}
                                                    {$lang->cmd_declare}
                                                    {$lang->ipaddress}
                                                    {$no} {$oComment->getSummary(100)}{$oComment->getNickName()}{$oComment->getRegdate("Y-m-d")}{$oComment->get('declared_count')}{$oComment->get('ipaddress')}
                                                    - {$lang->cmd_cancel_declare} - {$lang->cmd_select_all} - {$lang->cmd_reverse_all} - - -
                                                    + + + + + + +
                                                    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                    Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
                                                    {$lang->comment}
                                                    {$lang->user_name}
                                                    {$lang->date}
                                                    {$lang->cmd_declare}
                                                    {$lang->ipaddress}
                                                    {$no} {$oComment->getSummary(100)}{$oComment->getNickName()}{$oComment->getRegdate("Y-m-d")}{$oComment->get('declared_count')}{$oComment->get('ipaddress')}
                                                    + {$lang->cmd_cancel_declare} + {$lang->cmd_select_all} + {$lang->cmd_reverse_all} + + +
                                                    +
                                                    -
                                                    -
                                                • + +
                                                  +
                                                  diff --git a/modules/member/tpl/join_form_list.html b/modules/member/tpl/join_form_list.html index 1acef3440..f7581fe8e 100644 --- a/modules/member/tpl/join_form_list.html +++ b/modules/member/tpl/join_form_list.html @@ -8,37 +8,39 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                  {$lang->column_title}
                                                  {$lang->column_name}
                                                  {$lang->column_type}
                                                  {$lang->is_active}
                                                  {$lang->is_required}
                                                  {$lang->regdate}
                                                   
                                                  {$val->column_title}{$val->column_name}{$lang->column_type_list[$val->column_type]}{$val->is_active}{$val->required}{zdate($val->regdate,"Y-m-d")}{$lang->cmd_move_up}{$lang->cmd_move_down}{$lang->cmd_modify}{$lang->cmd_delete}
                                                  - {$lang->cmd_make} -
                                                  +
                                                  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                  {$lang->column_title}
                                                  {$lang->column_name}
                                                  {$lang->column_type}
                                                  {$lang->is_active}
                                                  {$lang->is_required}
                                                  {$lang->regdate}
                                                   
                                                  {$val->column_title}{$val->column_name}{$lang->column_type_list[$val->column_type]}{$val->is_active}{$val->required}{zdate($val->regdate,"Y-m-d")}{$lang->cmd_move_up}{$lang->cmd_move_down}{$lang->cmd_modify}{$lang->cmd_delete}
                                                  + {$lang->cmd_make} +
                                                  +
                                                  diff --git a/modules/member/tpl/manage_member_group.html b/modules/member/tpl/manage_member_group.html index 8231ff7a9..c3a057981 100644 --- a/modules/member/tpl/manage_member_group.html +++ b/modules/member/tpl/manage_member_group.html @@ -12,41 +12,40 @@
                                                  - - - - - - - - - -
                                                  - - -  
                                                  - - -
                                                  - -
                                                  - - - - - - - - - - - - - - - - -
                                                  {$lang->user_id}
                                                  {$lang->nick_name}
                                                  {$lang->signup_date}
                                                  {$val->user_id}
                                                  {$val->nick_name}
                                                  {zdate($val->regdate, "Y-m-d H:i")}
                                                  +
                                                  + + + + +
                                                  + + +  
                                                  + + +
                                                  +
                                                  +
                                                  + +
                                                  +
                                                  + + + + + + + + + + + + + + + +
                                                  {$lang->user_id}{$lang->nick_name}{$lang->signup_date}
                                                  {$val->user_id}{$val->nick_name}{zdate($val->regdate, "Y-m-d H:i")}
                                                  +
                                                  diff --git a/modules/menu/tpl/index.html b/modules/menu/tpl/index.html index 3da4fb58f..25ae84f93 100644 --- a/modules/menu/tpl/index.html +++ b/modules/menu/tpl/index.html @@ -9,37 +9,39 @@ - - - - - - - - - - - - - - - - - - - - - - - - -
                                                  Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
                                                  {$lang->no}
                                                  {$lang->title}
                                                  {$lang->regdate}
                                                   
                                                  {$no}{$val->title}{zdate($val->regdate,"Y-m-d")}{$lang->cmd_setup}{$lang->cmd_delete}
                                                  - {$lang->cmd_make} -
                                                  +
                                                  + + + + + + + + + + + + + + + + + + + + +
                                                  Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
                                                  {$lang->no}{$lang->title}{$lang->regdate} 
                                                  {$no}{$val->title}{zdate($val->regdate,"Y-m-d")} + {$lang->cmd_setup} + +
                                                  +
                                                  + -
                                                  - - - - - - - - - - - - - -
                                                  {$lang->cmd_menu_insert}
                                                  {nl2br($lang->about_menu_management)}
                                                  {$lang->title}
                                                  - -

                                                  {$lang->about_title}

                                                  -
                                                  - -
                                                  - +
                                                  + + + + + + + + + +
                                                  {$lang->cmd_menu_insert}{nl2br($lang->about_menu_management)}
                                                  {$lang->title} + +

                                                  {$lang->about_title}

                                                  +
                                                  +
                                                  +
                                                  + +
                                                  diff --git a/modules/menu/tpl/menu_item_info.html b/modules/menu/tpl/menu_item_info.html index 4e3f52b1b..fc86b4e46 100644 --- a/modules/menu/tpl/menu_item_info.html +++ b/modules/menu/tpl/menu_item_info.html @@ -3,117 +3,121 @@ -
                                                  - -

                                                  {$lang->menu}

                                                  - - -
                                                  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                  {$lang->parent_menu_name}
                                                  {$item_info->parent_menu_name}
                                                  {$lang->menu_name}
                                                  - - {$lang->cmd_find_langcode} -
                                                  {$lang->menu_url}
                                                  - - {$lang->cmd_search_mid} -

                                                  {$lang->about_menu_url}

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

                                                  {$lang->about_menu_open_window}

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

                                                  {$lang->about_menu_expand}

                                                  -
                                                  {$lang->menu_img_btn}

                                                  {$lang->about_menu_img_btn}

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

                                                  {$lang->about_menu_group_srls}

                                                  -
                                                  - -
                                                  - - - -
                                                  +

                                                  {$lang->menu}

                                                  + +
                                                  +
                                                  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                  {$lang->parent_menu_name}{$item_info->parent_menu_name}
                                                  {$lang->menu_name} + + {$lang->cmd_find_langcode}
                                                  {$lang->menu_url} + + {$lang->cmd_search_mid} +

                                                  {$lang->about_menu_url}

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

                                                  {$lang->about_menu_open_window}

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

                                                  {$lang->about_menu_expand}

                                                  +
                                                  {$lang->menu_img_btn} +

                                                  {$lang->about_menu_img_btn}

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

                                                  {$lang->about_menu_group_srls}

                                                  +
                                                  +
                                                  +
                                                  + +
                                                  + +
                                                  diff --git a/modules/menu/tpl/menu_management.html b/modules/menu/tpl/menu_management.html index 47d5a909c..54ed6036a 100644 --- a/modules/menu/tpl/menu_management.html +++ b/modules/menu/tpl/menu_management.html @@ -15,67 +15,70 @@ - - -
                                                  -

                                                  {$lang->bundle_grant_setup}

                                                  -
                                                  - +

                                                  {$lang->bundle_grant_setup}

                                                  {$XE_VALIDATOR_MESSAGE}

                                                  - - - -
                                                  - -

                                                  {$lang->about_grant}

                                                  -

                                                  {$lang->about_grant_deatil}

                                                  - - - - - - - - - - - - - - - - -
                                                  {$lang->grant}
                                                  {$lang->target}
                                                  {$grant_item->title}
                                                  - - -
                                                  - -
                                                  - -
                                                  - -
                                                  - + + +

                                                  {$lang->about_grant}

                                                  +

                                                  {$lang->about_grant_deatil}

                                                  +
                                                  + + + + + + + + + + + + + + + + +
                                                  {$lang->grant}{$lang->target}
                                                  {$grant_item->title} + + +
                                                  +
                                                  +
                                                  + +
                                                  diff --git a/modules/module/tpl/module_grants.html b/modules/module/tpl/module_grants.html index ded6f157f..5ca124034 100644 --- a/modules/module/tpl/module_grants.html +++ b/modules/module/tpl/module_grants.html @@ -9,65 +9,69 @@ -

                                                  {$lang->about_admin_id}

                                                  - - - - - - - - -
                                                  {$lang->admin_id}
                                                  - -
                                                  - - - -
                                                  +

                                                  {$lang->about_admin_id}

                                                  +
                                                  + + + + + + + + +
                                                  {$lang->admin_id} + +
                                                  + + + +
                                                  +
                                                  -

                                                  {$lang->about_grant}

                                                  -

                                                  {$lang->about_grant_deatil}

                                                  - - - - - - - - - - - - - - - - - - -
                                                  {$lang->grant}
                                                  {$lang->target}
                                                  {$grant_item->title}
                                                  - - - - -
                                                  - - -
                                                  +

                                                  {$lang->about_grant}

                                                  +

                                                  {$lang->about_grant_deatil}

                                                  +
                                                  + + + + + + + + + + + + + + + + + + +
                                                  {$lang->grant}{$lang->target}
                                                  {$grant_item->title} + + + + +
                                                  + + +
                                                  +
                                                  diff --git a/modules/module/tpl/module_info.html b/modules/module/tpl/module_info.html index 2dd5975f8..edcddd969 100644 --- a/modules/module/tpl/module_info.html +++ b/modules/module/tpl/module_info.html @@ -1,16 +1,12 @@ -
                                                  -

                                                  {$lang->module_maker}

                                                  -
                                                  - -
                                                  - - +

                                                  {$lang->module_maker}

                                                  +
                                                  +
                                                  - + - + - + - + - + - +
                                                  {$lang->title}
                                                  {$lang->title} {$module_info->title} ver {$module_info->version}
                                                  {$lang->author}
                                                  {$lang->author} {$author->name} ({$author->homepage}, {$author->email_address})
                                                  @@ -19,17 +15,17 @@
                                                  {$lang->homepage}
                                                  {$lang->homepage} {$module_info->homepage}
                                                  {$lang->regdate}
                                                  {$lang->regdate} {zdate($module_info->date, 'Y-m-d')}
                                                  {$lang->module_license}
                                                  {$lang->module_license} {nl2br(trim($module_info->license))} @@ -39,21 +35,18 @@
                                                  {$lang->description}
                                                  {$lang->description} {nl2br(trim($module_info->description))}
                                                  -
                                                  -
                                                  -

                                                  {$lang->module_history}

                                                  -
                                                  +

                                                  {$lang->module_history}

                                                  -
                                                  - +
                                                  +
                                                  diff --git a/modules/module/tpl/module_setup.html b/modules/module/tpl/module_setup.html index 189e8c92a..74e5f6edc 100644 --- a/modules/module/tpl/module_setup.html +++ b/modules/module/tpl/module_setup.html @@ -1,81 +1,76 @@ - -
                                                  -

                                                  {$lang->bundle_setup}

                                                  -
                                                  - +

                                                  {$lang->bundle_setup}

                                                  {$XE_VALIDATOR_MESSAGE}

                                                  - - -
                                                  - -
                                                  - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                  {$lang->module_category}
                                                  - -

                                                  {$lang->about_module_category}

                                                  -
                                                  {$lang->layout}
                                                  - -

                                                  {$lang->about_layout}

                                                  -
                                                  {$lang->skin}
                                                  - -

                                                  {$lang->about_skin}

                                                  -
                                                  {$lang->description}
                                                  - -

                                                  {$lang->about_description}

                                                  -
                                                  {$lang->header_text}
                                                  - -

                                                  {$lang->about_header_text}

                                                  -
                                                  {$lang->footer_text}
                                                  - -

                                                  {$lang->about_footer_text}

                                                  -
                                                  -
                                                  - -
                                                  - -
                                                  - + + +
                                                  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                  {$lang->module_category} + +

                                                  {$lang->about_module_category}

                                                  +
                                                  {$lang->layout} + +

                                                  {$lang->about_layout}

                                                  +
                                                  {$lang->skin} + +

                                                  {$lang->about_skin}

                                                  +
                                                  {$lang->description} + +

                                                  {$lang->about_description}

                                                  +
                                                  {$lang->header_text} + +

                                                  {$lang->about_header_text}

                                                  +
                                                  {$lang->footer_text} + +

                                                  {$lang->about_footer_text}

                                                  +
                                                  +
                                                  + +
                                                  + +
                                                  + diff --git a/modules/module/tpl/skin_config.html b/modules/module/tpl/skin_config.html index 8506ff858..6e4f74702 100644 --- a/modules/module/tpl/skin_config.html +++ b/modules/module/tpl/skin_config.html @@ -1,150 +1,150 @@
                                                  - - - - - - + + + + + + + +

                                                  {$lang->skin_default_info}

                                                  +
                                                  + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                  {$lang->skin}{$skin_info->title}
                                                  {$lang->skin_author} + + {$author->name} ({$author->homepage}, {$author->email_address})
                                                  + +
                                                  {$lang->homepage}{$skin_info->homepage}
                                                  {$lang->date}{zdate($skin_info->date, 'Y-m-d')} 
                                                  {$lang->skin_license} + {nl2br(trim($skin_info->license))} + +

                                                  {$skin_info->license_link}

                                                  + +
                                                  {$lang->description}{nl2br(trim($skin_info->description))}
                                                  +
                                                  -

                                                  {$lang->skin_default_info}

                                                  - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                  {$lang->skin}
                                                  {$skin_info->title}
                                                  {$lang->skin_author}
                                                  - - {$author->name} ({$author->homepage}, {$author->email_address})
                                                  - -
                                                  {$lang->homepage}
                                                  {$skin_info->homepage}
                                                  {$lang->date}
                                                  {zdate($skin_info->date, 'Y-m-d')} 
                                                  {$lang->skin_license}
                                                  - {nl2br(trim($skin_info->license))} - -

                                                  {$skin_info->license_link}

                                                  - -
                                                  {$lang->description}
                                                  {nl2br(trim($skin_info->description))}
                                                  - -

                                                  {$lang->extra_vars}

                                                  - - - - - - - - - - - - {@$group = $val->group} -
                                                  {$lang->colorset}
                                                  - - - {@ $_img_info = getImageSize($val->screenshot); $_height = $_img_info[1]+40; $_width = $_img_info[0]+20; $_talign = "center"; } - - {@ $_width = 200; $_height = 20; $_talign = "left"; } - -
                                                  - value==$val->name)-->checked="checked"/> - - -
                                                  - {$val->title} - -
                                                  - -
                                                  -

                                                  {$group}

                                                  - +

                                                  {$lang->extra_vars}

                                                  +
                                                  +
                                                  + + + + + + + + + + + {@$group = $val->group} +
                                                  {$lang->colorset}
                                                  + + + {@ $_img_info = getImageSize($val->screenshot); $_height = $_img_info[1]+40; $_width = $_img_info[0]+20; $_talign = "center"; } + + {@ $_width = 200; $_height = 20; $_talign = "left"; } + +
                                                  + value==$val->name)-->checked="checked"/> + + +
                                                  + {$val->title} + +
                                                  + +
                                                  +
                                                  +

                                                  {$group}

                                                  +
                                                  + + + + + + + + + + +
                                                  {$val->title}
                                                  + + + {$lang->cmd_find_langcode} + + + + {$lang->cmd_find_langcode} + + + + + + + + value, $val->value))-->checked="checked" class="checkbox" /> + + + + + + + + value==$val->value)-->checked="checked"/> + + + + + + +
                                                  +
                                                  + + +
                                                  + + + + + + +

                                                  {nl2br(trim($val->description))}

                                                  + +
                                                  +
                                                  - - -
                                                  {$val->title}
                                                  - - - - {$lang->cmd_find_langcode} - - - - {$lang->cmd_find_langcode} - - - - - - - - value, $val->value))-->checked="checked" class="checkbox" /> - - - - - - - - value==$val->value)-->checked="checked"/> - - - - - - -
                                                  -
                                                  - - -
                                                  - - - - - - -

                                                  {nl2br(trim($val->description))}

                                                  - - - - - - - - - - - - - -
                                                  - -
                                                  - +
                                                  + +
                                                  diff --git a/modules/module/tpl/skin_info.html b/modules/module/tpl/skin_info.html index 0cd173f32..f634f96d7 100644 --- a/modules/module/tpl/skin_info.html +++ b/modules/module/tpl/skin_info.html @@ -1,10 +1,7 @@ -
                                                  -

                                                  {$skin_info->title}

                                                  -
                                                  - -
                                                  - +

                                                  {$skin_info->title}

                                                  +
                                                  +
                                                  @@ -50,12 +47,9 @@ -
                                                  -

                                                  {$lang->skin_history}

                                                  -
                                                  - -
                                                  -
                                                  +

                                                  {$lang->skin_history}

                                                  +
                                                  +
                                                  diff --git a/modules/opage/tpl/header.html b/modules/opage/tpl/header.html index bd5010862..5ca9e513a 100644 --- a/modules/opage/tpl/header.html +++ b/modules/opage/tpl/header.html @@ -1,18 +1,19 @@ -

                                                  {$lang->opage} {$lang->cmd_management}

                                                  - -
                                                  {nl2br($lang->about_opage)}
                                                  - +

                                                  {$lang->opage} {$lang->cmd_management}

                                                  +

                                                  {nl2br($lang->about_opage)}

                                                  -
                                                  - -

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

                                                  - - - + +

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

                                                  + +
                                                  +
                                                  diff --git a/modules/opage/tpl/index.html b/modules/opage/tpl/index.html index 24e5f08c6..455a85bc9 100644 --- a/modules/opage/tpl/index.html +++ b/modules/opage/tpl/index.html @@ -6,74 +6,74 @@
                                                  -
                                                  - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                  Total {number_format($total_count)}, page {number_format($page)}/{number_format($total_page)}
                                                  {$lang->no}
                                                  -
                                                  - - - - -
                                                  -
                                                  {$lang->mid}
                                                  {$lang->browser_title}
                                                  {$lang->regdate}
                                                   
                                                  {$no} - - {$lang->not_exists} - - {$module_category[$val->module_category_srl]->title} - - {$val->mid}{$val->browser_title}{zdate($val->regdate,"Y-m-d")}{$lang->cmd_setup}{$lang->cmd_copy}{$lang->cmd_delete}
                                                  +
                                                  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                  Total {number_format($total_count)}, page {number_format($page)}/{number_format($total_page)}
                                                  {$lang->no} + + + + + {$lang->mid}{$lang->browser_title}{$lang->regdate} 
                                                  {$no} + + {$lang->not_exists} + + {$module_category[$val->module_category_srl]->title} + + {$val->mid}{$val->browser_title}{zdate($val->regdate,"Y-m-d")} + {$lang->cmd_setup} + {$lang->cmd_copy} + {$lang->cmd_delete} +
                                                  +
                                                  -
                                                  - -
                                                  - {$lang->cmd_make} + - +
                                                  + + {$lang->cmd_select_all} + {$lang->cmd_reverse_all} + + +
                                                  diff --git a/modules/document/tpl/category_info.html b/modules/document/tpl/category_info.html index 46625e2d0..962394527 100644 --- a/modules/document/tpl/category_info.html +++ b/modules/document/tpl/category_info.html @@ -56,14 +56,12 @@

                                                  {$lang->about_category_group_srls}

                                                  - - - - -
                                                  -
                                                  +
                                                  + +
                                                  +
                                                  - - - - -
                                                  +
                                                  + +
                                                  diff --git a/modules/member/tpl/join_form_list.html b/modules/member/tpl/join_form_list.html index f7581fe8e..9c0c54c23 100644 --- a/modules/member/tpl/join_form_list.html +++ b/modules/member/tpl/join_form_list.html @@ -8,39 +8,39 @@ -
                                                  +
                                                  - - - - - - - + + + + + + + - + - - - - + - - -
                                                  {$lang->column_title}
                                                  {$lang->column_name}
                                                  {$lang->column_type}
                                                  {$lang->is_active}
                                                  {$lang->is_required}
                                                  {$lang->regdate}
                                                   
                                                  {$lang->column_title}{$lang->column_name}{$lang->column_type}{$lang->is_active}{$lang->is_required}{$lang->regdate} 
                                                  {$val->column_title} {$val->column_name} {$lang->column_type_list[$val->column_type]} {$val->is_active} {$val->required} {zdate($val->regdate,"Y-m-d")}{$lang->cmd_move_up}{$lang->cmd_move_down}{$lang->cmd_modify}{$lang->cmd_delete} + + + {$lang->cmd_modify} + +
                                                  - {$lang->cmd_make} -
                                                  + diff --git a/modules/member/tpl/modify_info_mobile.html b/modules/member/tpl/modify_info_mobile.html index 41ac446fb..45a7012e5 100644 --- a/modules/member/tpl/modify_info_mobile.html +++ b/modules/member/tpl/modify_info_mobile.html @@ -47,7 +47,7 @@
                                                  profile_image - {$lang->cmd_delete} +
                                                  @@ -62,7 +62,7 @@
                                                  image_name
                                                  - {$lang->cmd_delete} +
                                                  @@ -77,7 +77,7 @@
                                                  image_mark - {$lang->cmd_delete} +
                                                  diff --git a/modules/menu/tpl/menu_item_info.html b/modules/menu/tpl/menu_item_info.html index fc86b4e46..b94a8e874 100644 --- a/modules/menu/tpl/menu_item_info.html +++ b/modules/menu/tpl/menu_item_info.html @@ -51,7 +51,7 @@ {$lang->menu_normal_btn} @@ -65,7 +65,7 @@ {$lang->menu_hover_btn} @@ -79,7 +79,7 @@ {$lang->menu_active_btn} diff --git a/modules/menu/tpl/menu_management.html b/modules/menu/tpl/menu_management.html index 54ed6036a..93618ff99 100644 --- a/modules/menu/tpl/menu_management.html +++ b/modules/menu/tpl/menu_management.html @@ -27,12 +27,8 @@ {$lang->title} -
                                                  - -
                                                  -
                                                  - -
                                                  + + diff --git a/modules/module/tpl/module_grants.html b/modules/module/tpl/module_grants.html index 5ca124034..8a65db850 100644 --- a/modules/module/tpl/module_grants.html +++ b/modules/module/tpl/module_grants.html @@ -6,72 +6,68 @@
                                                  - - - -

                                                  {$lang->about_admin_id}

                                                  -
                                                  - - - - - - - - -
                                                  {$lang->admin_id} - -
                                                  - - - -
                                                  -
                                                  - -

                                                  {$lang->about_grant}

                                                  -

                                                  {$lang->about_grant_deatil}

                                                  -
                                                  - - + + + +

                                                  {$lang->about_admin_id}

                                                  +
                                                  +
                                                  - - - - - - - - + - - - -
                                                  {$lang->grant}{$lang->target}
                                                  {$grant_item->title}{$lang->admin_id} - - -
                                                  - - + + + +
                                                  -
                                                  - + +
                                                  + +

                                                  {$lang->about_grant}

                                                  +

                                                  {$lang->about_grant_deatil}

                                                  +
                                                  + + + + + + + + + + + + + + + +
                                                  {$lang->grant}{$lang->target}
                                                  {$grant_item->title} + + + + +
                                                  +
                                                  +
                                                  + +
                                                  diff --git a/modules/opage/tpl/content.html b/modules/opage/tpl/content.html index b34a8de56..fff320836 100644 --- a/modules/opage/tpl/content.html +++ b/modules/opage/tpl/content.html @@ -2,7 +2,7 @@ -
                                                  - {$lang->cmd_setup} + diff --git a/modules/page/tpl/article_content_modify.html b/modules/page/tpl/article_content_modify.html index 6b91e765f..2c51f1319 100644 --- a/modules/page/tpl/article_content_modify.html +++ b/modules/page/tpl/article_content_modify.html @@ -13,13 +13,13 @@

                                                  {$lang->about_tag}

                                                  -
                                                  +
                                                  - - + + - +
                                                  diff --git a/modules/page/tpl/page_content_modify.html b/modules/page/tpl/page_content_modify.html index 19dbc08c2..64f8c9174 100644 --- a/modules/page/tpl/page_content_modify.html +++ b/modules/page/tpl/page_content_modify.html @@ -4,41 +4,29 @@ - -
                                                  {$page_content}
                                                  -
                                                  -
                                                  -
                                                  - - - - - + + + + + + -
                                                  - -
                                                  - -
                                                  -
                                                  - - - -
                                                  -
                                                  -
                                                  - - - -
                                                  -
                                                  -
                                                  -
                                                  +
                                                  +
                                                  + + + + +
                                                  + + +
                                                  +
                                                  diff --git a/modules/page/tpl/page_info.html b/modules/page/tpl/page_info.html index 837ec3847..f733f12bc 100644 --- a/modules/page/tpl/page_info.html +++ b/modules/page/tpl/page_info.html @@ -131,8 +131,6 @@ {$lang->cmd_list} - - {$lang->cmd_back}
                                                  diff --git a/modules/page/tpl/page_insert.html b/modules/page/tpl/page_insert.html index 71f9da062..6528ab980 100644 --- a/modules/page/tpl/page_insert.html +++ b/modules/page/tpl/page_insert.html @@ -5,141 +5,140 @@

                                                  {$XE_VALIDATOR_MESSAGE}

                                                  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                  {$lang->page_type}
                                                  {$lang->page_type}
                                                  - -

                                                  {$lang->about_page_type}

                                                  -
                                                  {$lang->mid}
                                                  - -

                                                  {$lang->about_mid}

                                                  -
                                                  {$lang->module_category}
                                                  - -

                                                  {$lang->about_module_category}

                                                  -
                                                  {$lang->browser_title}
                                                  - - {$lang->cmd_find_langcode} -

                                                  {$lang->about_browser_title}

                                                  -
                                                  {$lang->layout}
                                                  - -

                                                  {$lang->about_layout}

                                                  -
                                                  {$lang->mobile_view}
                                                  - use_mobile == "Y")-->checked="checked" /> -

                                                  {$lang->about_mobile_view}

                                                  -
                                                  {$lang->mobile_layout}
                                                  - -

                                                  {$lang->about_layout}

                                                  -
                                                  {$lang->page_caching_interval}
                                                  - {$lang->unit_min} -

                                                  {$lang->about_page_caching_interval}

                                                  -
                                                  {$lang->skin}
                                                  - -

                                                  {$lang->about_skin}

                                                  -
                                                  {$lang->mobile_skin}
                                                  - -

                                                  {$lang->about_skin}

                                                  -
                                                  {$lang->opage_path}
                                                  - -

                                                  {$lang->about_opage_path}{realpath("./")}

                                                  -
                                                  {$lang->opage_mobile_path}
                                                  - -

                                                  {$lang->about_opage_mobile_path}{realpath("./")}

                                                  -
                                                  - -
                                                  - + + + +
                                                  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                  {$lang->page_type}
                                                  {$lang->page_type} + +

                                                  {$lang->about_page_type}

                                                  +
                                                  {$lang->mid} + +

                                                  {$lang->about_mid}

                                                  +
                                                  {$lang->module_category} + +

                                                  {$lang->about_module_category}

                                                  +
                                                  {$lang->browser_title} + + {$lang->cmd_find_langcode} +

                                                  {$lang->about_browser_title}

                                                  +
                                                  {$lang->layout} + +

                                                  {$lang->about_layout}

                                                  +
                                                  {$lang->mobile_view} + use_mobile == "Y")-->checked="checked" /> +

                                                  {$lang->about_mobile_view}

                                                  +
                                                  {$lang->mobile_layout} + +

                                                  {$lang->about_layout}

                                                  +
                                                  {$lang->page_caching_interval} + {$lang->unit_min} +

                                                  {$lang->about_page_caching_interval}

                                                  +
                                                  {$lang->skin} + +

                                                  {$lang->about_skin}

                                                  +
                                                  {$lang->mobile_skin} + +

                                                  {$lang->about_skin}

                                                  +
                                                  {$lang->opage_path} + +

                                                  {$lang->about_opage_path}{realpath("./")}

                                                  +
                                                  {$lang->opage_mobile_path} + +

                                                  {$lang->about_opage_mobile_path}{realpath("./")}

                                                  +
                                                  +
                                                  +
                                                  + +
                                                  diff --git a/modules/page/tpl/page_mobile_content_modify.html b/modules/page/tpl/page_mobile_content_modify.html index 5e27a3899..afe3b17d6 100644 --- a/modules/page/tpl/page_mobile_content_modify.html +++ b/modules/page/tpl/page_mobile_content_modify.html @@ -17,27 +17,19 @@ -
                                                  - -
                                                  - -
                                                  -
                                                  +
                                                  +
                                                  + + - - +
                                                  -
                                                  -
                                                  - - - -
                                                  -
                                                  + +
                                                  diff --git a/modules/point/tpl/member_list.html b/modules/point/tpl/member_list.html index 63efce546..310f392e4 100644 --- a/modules/point/tpl/member_list.html +++ b/modules/point/tpl/member_list.html @@ -87,8 +87,8 @@ - - - {$lang->cmd_cancel} + + + diff --git a/modules/point/tpl/module_config.html b/modules/point/tpl/module_config.html index 3d227cc57..464b03c7e 100644 --- a/modules/point/tpl/module_config.html +++ b/modules/point/tpl/module_config.html @@ -33,11 +33,6 @@ {$config->point_name} - - - - -
                                                  diff --git a/modules/poll/skins/default/form.html b/modules/poll/skins/default/form.html index 2215e92f5..6c455c054 100644 --- a/modules/poll/skins/default/form.html +++ b/modules/poll/skins/default/form.html @@ -76,8 +76,8 @@
                                                  - - + +
                                                  From 024a234f6a89724d71da39c18d73b7d8af643196 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Tue, 27 Sep 2011 12:53:33 +0000 Subject: [PATCH 0917/1372] Admin HTML Markup Clean. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9377 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/addon/tpl/addon_info.html | 153 ++++++++---------- modules/admin/tpl/css/admin.css | 2 +- modules/admin/tpl/css/admin.min.css | 2 +- .../comment/tpl/comment_module_config.html | 10 +- modules/comment/tpl/declared_list.html | 12 +- modules/communication/tpl/colorset_list.html | 1 - modules/counter/tpl/index.html | 34 ++-- modules/document/tpl/category_info.html | 20 +-- modules/document/tpl/category_list.html | 38 +++-- modules/document/tpl/document_alias.html | 10 +- modules/document/tpl/document_trash_list.html | 89 +++++----- modules/document/tpl/extra_keys.html | 22 +-- modules/document/tpl/print_page.html | 28 ++-- modules/document/tpl/saved_list_popup.html | 4 +- .../editor/components/emoticon/tpl/popup.html | 11 +- .../components/image_gallery/tpl/popup.html | 22 +-- .../components/multimedia_link/tpl/popup.html | 8 +- .../components/poll_maker/tpl/popup.html | 55 ++++--- modules/editor/tpl/editor_module_config.html | 34 ++-- modules/editor/tpl/setup_component.html | 8 +- modules/editor/tpl/view_component.html | 8 +- modules/file/tpl/file_config.html | 18 +-- modules/file/tpl/file_module_config.html | 10 +- modules/importer/tpl/js/importer_admin.js | 2 +- modules/importer/tpl/js/importer_admin.min.js | 2 +- modules/install/tpl/form.install.html | 12 +- .../integration_search.admin.view.php | 2 +- modules/integration_search/tpl/index.html | 8 +- modules/integration_search/tpl/skin_info.html | 18 +-- .../layout/tpl/downloaded_layout_list.html | 2 +- .../layout/tpl/downloaded_mlayout_list.html | 2 +- modules/layout/tpl/index.html | 6 +- modules/layout/tpl/insert_layout.html | 4 +- modules/layout/tpl/layout_detail_info.html | 6 +- modules/layout/tpl/layout_image_list.html | 50 +++--- modules/layout/tpl/mindex.html | 6 +- modules/member/tpl/colorset_list.html | 1 - modules/member/tpl/denied_id_list.html | 8 +- modules/member/tpl/group_update_form.html | 10 +- modules/member/tpl/manage_member_group.html | 13 +- modules/menu/tpl/index.html | 8 +- modules/menu/tpl/menu_insert.html | 4 +- modules/menu/tpl/menu_item_info.html | 12 +- modules/menu/tpl/menu_management.html | 8 +- modules/menu/tpl/mid_list.html | 101 ++++++------ modules/module/tpl/category_list.html | 6 +- modules/module/tpl/copy_module.html | 60 +++---- modules/module/tpl/filebox_add.html | 63 ++++---- modules/module/tpl/filebox_list.html | 115 +++++++------ modules/module/tpl/module_addition_setup.html | 9 +- modules/module/tpl/module_grant_setup.html | 2 +- modules/module/tpl/module_grants.html | 4 +- modules/module/tpl/module_selector.html | 150 +++++++++-------- modules/module/tpl/module_setup.html | 6 +- modules/module/tpl/skin_config.html | 10 +- modules/opage/tpl/index.html | 10 +- modules/opage/tpl/opage_delete.html | 2 +- modules/opage/tpl/opage_insert.html | 18 +-- modules/page/tpl/index.html | 14 +- modules/page/tpl/page_delete.html | 2 +- modules/page/tpl/page_info.html | 38 ++--- modules/page/tpl/page_insert.html | 24 +-- .../page/tpl/page_mobile_content_modify.html | 2 - modules/point/tpl/config.html | 36 ++--- modules/point/tpl/member_list.html | 4 +- modules/point/tpl/module_config.html | 16 +- modules/point/tpl/point_module_config.html | 14 +- modules/poll/tpl/result.html | 40 +++-- modules/rss/tpl/rss_module_config.html | 12 +- .../trackback/tpl/send_trackback_form.html | 2 +- .../tpl/trackback_module_config.html | 2 +- modules/widget/tpl/js/widget.js | 19 +-- .../widget_style_generate_code_in_page.html | 2 - modules/widget/widget.controller.php | 4 +- 74 files changed, 732 insertions(+), 838 deletions(-) diff --git a/modules/addon/tpl/addon_info.html b/modules/addon/tpl/addon_info.html index f177e34cc..164444581 100644 --- a/modules/addon/tpl/addon_info.html +++ b/modules/addon/tpl/addon_info.html @@ -1,89 +1,78 @@ -
                                                  -

                                                  {$lang->addon_maker}

                                                  -
                                                  - -
                                                  -
                                                  - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                  {$lang->title}
                                                  {$addon_info->title} ver. {$addon_info->version}
                                                  {$lang->author}
                                                  - - {$author->name} ({$author->homepage}, {$author->email_address})
                                                  - -
                                                  {$lang->homepage}
                                                  {$addon_info->homepage}
                                                  {$lang->regdate}
                                                  {zdate($addon_info->date, 'Y-m-d')}
                                                  {$lang->addon_license}
                                                  - {nl2br(trim($addon_info->license))} - -

                                                  {$addon_info->license_link}

                                                  - -
                                                  {$lang->description}
                                                  {nl2br(trim($addon_info->description))}
                                                  -
                                                  +

                                                  {$lang->addon_maker}

                                                  +
                                                  + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                  {$lang->title}{$addon_info->title} ver. {$addon_info->version}
                                                  {$lang->author} + + {$author->name} ({$author->homepage}, {$author->email_address})
                                                  + +
                                                  {$lang->homepage}{$addon_info->homepage}
                                                  {$lang->regdate}{zdate($addon_info->date, 'Y-m-d')}
                                                  {$lang->addon_license} + {nl2br(trim($addon_info->license))} + +

                                                  {$addon_info->license_link}

                                                  + +
                                                  {$lang->description}{nl2br(trim($addon_info->description))}
                                                  -
                                                  -

                                                  {$lang->addon_history}

                                                  -
                                                  +

                                                  {$lang->addon_history}

                                                  +
                                                  + + + -
                                                  -
                                                  -
                                                  - - - - - - - + + - - -
                                                  - {$history->version}
                                                  - {$history->date} -
                                                  - -

                                                  {$author->name} ({$author->homepage} / {$author->email_address})

                                                  + +
                                                  + {$history->version}
                                                  + {$history->date}
                                                  + +

                                                  {$author->name} ({$author->homepage} / {$author->email_address})

                                                  + + +

                                                  {nl2br(trim($history->description))}

                                                  + + +
                                                    + + +
                                                  • {$log->text}
                                                  • + +
                                                  • {$log->text}
                                                  • + - -

                                                    {nl2br(trim($history->description))}

                                                    - - - - -
                                                  -
                                                  + + + + + +
                                                  diff --git a/modules/admin/tpl/css/admin.css b/modules/admin/tpl/css/admin.css index fe06fbba3..68c38d1fc 100644 --- a/modules/admin/tpl/css/admin.css +++ b/modules/admin/tpl/css/admin.css @@ -53,7 +53,7 @@ body>.popup{margin:1em} .x .table caption strong{color:#e00} .x .table caption .side{float:right;font-weight:normal;margin-left:1em} .x .table th, -.x .table td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd} +.x .table td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd;white-space:nowrap} .x .table th{background:#f8f8f8} .x .table thead th{border-bottom:1px solid #999} .x .table tfoot td{font-weight:bold;background:#f8f8f8} diff --git a/modules/admin/tpl/css/admin.min.css b/modules/admin/tpl/css/admin.min.css index fe06fbba3..68c38d1fc 100644 --- a/modules/admin/tpl/css/admin.min.css +++ b/modules/admin/tpl/css/admin.min.css @@ -53,7 +53,7 @@ body>.popup{margin:1em} .x .table caption strong{color:#e00} .x .table caption .side{float:right;font-weight:normal;margin-left:1em} .x .table th, -.x .table td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd} +.x .table td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd;white-space:nowrap} .x .table th{background:#f8f8f8} .x .table thead th{border-bottom:1px solid #999} .x .table tfoot td{font-weight:bold;background:#f8f8f8} diff --git a/modules/comment/tpl/comment_module_config.html b/modules/comment/tpl/comment_module_config.html index a548671c7..fff9f7f13 100644 --- a/modules/comment/tpl/comment_module_config.html +++ b/modules/comment/tpl/comment_module_config.html @@ -6,15 +6,15 @@
                                                  - - + - + - + - - - - - - + + + + + + diff --git a/modules/communication/tpl/colorset_list.html b/modules/communication/tpl/colorset_list.html index 84223d3b7..22c8bd9fe 100644 --- a/modules/communication/tpl/colorset_list.html +++ b/modules/communication/tpl/colorset_list.html @@ -12,5 +12,4 @@ {$val->title} -
                                                  diff --git a/modules/counter/tpl/index.html b/modules/counter/tpl/index.html index 2d7063c82..ab57eaac5 100644 --- a/modules/counter/tpl/index.html +++ b/modules/counter/tpl/index.html @@ -19,10 +19,8 @@
                                                  {$lang->comment_count}
                                                  + {$lang->comment_count}

                                                  {$lang->about_comment_count}

                                                  - +
                                                  {$lang->cmd_vote}
                                                  {$lang->cmd_vote}
                                                  {$lang->cmd_vote_down}
                                                  {$lang->cmd_vote_down}
                                                  Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
                                                  {$lang->comment}
                                                  {$lang->user_name}
                                                  {$lang->date}
                                                  {$lang->cmd_declare}
                                                  {$lang->ipaddress}
                                                  {$lang->comment}{$lang->user_name}{$lang->date}{$lang->cmd_declare}{$lang->ipaddress}
                                                  - - + + - - + +
                                                  {$lang->total_counter}
                                                  -
                                                  - {zdate($selected_date, "Y-m-d")} +
                                                  {$lang->total_counter} {zdate($selected_date, "Y-m-d")} - -
                                                  Visitor {number_format($total_counter->unique_visitor)}  /  Pageview : {number_format($total_counter->pageview)}Visitor : {number_format($selected_day_counter->unique_visitor)}  /  Pageview : {number_format($selected_day_counter->pageview)}Visitor {number_format($total_counter->unique_visitor)}  /  Pageview : {number_format($total_counter->pageview)}Visitor : {number_format($selected_day_counter->unique_visitor)}  /  Pageview : {number_format($selected_day_counter->pageview)}
                                                  @@ -64,7 +60,7 @@
                                                  @@ -91,9 +87,7 @@ - -
                                                  - + {$key} @@ -102,13 +96,9 @@ {$key} {$lang->unit_day} {$key} - -
                                                  - + - -
                                                  - + {$key} {$lang->unit_year} @@ -117,12 +107,10 @@ {$key} {$lang->unit_day} {$key} {$lang->unit_hour} - -
                                                  - + {@ $img_width = (int)$percent; $img_width = $img_width?$img_width.'%':'3px'; } - +
                                                  {number_format($val)}({$percent}%) diff --git a/modules/document/tpl/category_info.html b/modules/document/tpl/category_info.html index 962394527..ce7e49275 100644 --- a/modules/document/tpl/category_info.html +++ b/modules/document/tpl/category_info.html @@ -12,19 +12,19 @@ - - + + - + - + - - + - + - + - - + diff --git a/modules/editor/components/emoticon/tpl/popup.html b/modules/editor/components/emoticon/tpl/popup.html index f54a7aa04..c866ebadd 100644 --- a/modules/editor/components/emoticon/tpl/popup.html +++ b/modules/editor/components/emoticon/tpl/popup.html @@ -1,12 +1,6 @@ - -
                                                  -

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

                                                  -
                                                  - +

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

                                                  - -
                                                  -
                                                  diff --git a/modules/editor/components/image_gallery/tpl/popup.html b/modules/editor/components/image_gallery/tpl/popup.html index 75444870f..193ca5708 100644 --- a/modules/editor/components/image_gallery/tpl/popup.html +++ b/modules/editor/components/image_gallery/tpl/popup.html @@ -9,11 +9,11 @@ - - + + - + - + - - + + - + - + - - + + - - + + @@ -58,11 +58,11 @@
                                                  {$lang->parent_category_title}
                                                  {$category_info->parent_category_title}{$lang->parent_category_title}{$category_info->parent_category_title}
                                                  {$lang->category_title}
                                                  {$lang->category_title} - + {$lang->cmd_find_langcode}
                                                  {$lang->category_color}
                                                  {$lang->category_color}

                                                  {$lang->about_category_color}

                                                  @@ -32,23 +32,23 @@
                                                  {$lang->category_description}
                                                  - + {$lang->category_description} + {$lang->cmd_find_langcode}

                                                  {$lang->about_category_description}

                                                  {$lang->expand}
                                                  {$lang->expand} expand=="Y")-->checked="checked" class="checkbox" />

                                                  {$lang->about_expand}

                                                  {$lang->category_group_srls}
                                                  {$lang->category_group_srls}
                                                  group_srls)&&in_array($key, $category_info->group_srls))-->checked="checked" class="checkbox" />
                                                  diff --git a/modules/document/tpl/category_list.html b/modules/document/tpl/category_list.html index c152c455b..45e0331b5 100644 --- a/modules/document/tpl/category_list.html +++ b/modules/document/tpl/category_list.html @@ -11,27 +11,25 @@ var category_title = "{$lang->category}"; -{$lang->cmd_remake_cache} - -
                                                  -
                                                  -

                                                  {$XE_VALIDATOR_MESSAGE}

                                                  -
                                                  -
                                                  - - - - -
                                                  -
                                                  - -
                                                  - +
                                                  +

                                                  {$XE_VALIDATOR_MESSAGE}

                                                  +
                                                  +
                                                  + + + + +
                                                  +
                                                  + +
                                                  + +
                                                  +//]]> + diff --git a/modules/document/tpl/saved_list_popup.html b/modules/document/tpl/saved_list_popup.html index b476778f0..1ac65ad5a 100644 --- a/modules/document/tpl/saved_list_popup.html +++ b/modules/document/tpl/saved_list_popup.html @@ -14,8 +14,8 @@
                                                  {$val->getRegdate("Y-m-d H:i:s")} + {$val->getRegdate("Y-m-d H:i:s")}
                                                  {$lang->width}
                                                  px{$lang->width}px
                                                  {$lang->gallery_style}
                                                  {$lang->gallery_style}
                                                  {$lang->gallery_slide_align}
                                                  {$lang->gallery_slide_align}
                                                  {$lang->gallery_border_thickness}
                                                  px{$lang->gallery_border_thickness}px
                                                  {$lang->gallery_border_color}
                                                  {$lang->gallery_border_color}
                                                  - - - - -
                                                  - - - -
                                                  -
                                                  - - - - - -
                                                  -
                                                  +

                                                  레이아웃 이미지 목록

                                                  + + {@$ext=substr(strrchr($file,'.'),1)} +
                                                  + + + + + + +
                                                  + +
                                                  + + + + + +
                                                  diff --git a/modules/layout/tpl/mindex.html b/modules/layout/tpl/mindex.html index d09753a9f..fc7319d3b 100644 --- a/modules/layout/tpl/mindex.html +++ b/modules/layout/tpl/mindex.html @@ -22,15 +22,15 @@
                                                  {$no+1}{$no+1} {$val->layout} (module) {$val->title}{zdate($val->regdate,"Y-m-d")}{$val->title}{zdate($val->regdate,"Y-m-d")} {$lang->cmd_layout_management} diff --git a/modules/member/tpl/colorset_list.html b/modules/member/tpl/colorset_list.html index 38ad56473..9aedbb55a 100644 --- a/modules/member/tpl/colorset_list.html +++ b/modules/member/tpl/colorset_list.html @@ -12,5 +12,4 @@ {$val->title} -
                                                  diff --git a/modules/member/tpl/denied_id_list.html b/modules/member/tpl/denied_id_list.html index 4824a0315..34277b35a 100644 --- a/modules/member/tpl/denied_id_list.html +++ b/modules/member/tpl/denied_id_list.html @@ -13,8 +13,8 @@
                                                  {$lang->no}{$lang->user_id}{$lang->description}{$lang->user_id}{$lang->description} {$lang->regdate}  
                                                  - + - +
                                                  {$lang->user_id}
                                                  {$lang->description}
                                                  diff --git a/modules/member/tpl/group_update_form.html b/modules/member/tpl/group_update_form.html index b770203d0..91dd5d1a4 100644 --- a/modules/member/tpl/group_update_form.html +++ b/modules/member/tpl/group_update_form.html @@ -15,21 +15,21 @@ - + - + - + - + - - + @@ -23,9 +23,9 @@ - - - + + + - + diff --git a/modules/menu/tpl/menu_item_info.html b/modules/menu/tpl/menu_item_info.html index b94a8e874..98070054c 100644 --- a/modules/menu/tpl/menu_item_info.html +++ b/modules/menu/tpl/menu_item_info.html @@ -19,15 +19,15 @@ @@ -55,7 +55,7 @@ - + @@ -69,7 +69,7 @@ - + @@ -83,7 +83,7 @@ - + diff --git a/modules/menu/tpl/menu_management.html b/modules/menu/tpl/menu_management.html index 93618ff99..0cc3e0ab3 100644 --- a/modules/menu/tpl/menu_management.html +++ b/modules/menu/tpl/menu_management.html @@ -33,7 +33,7 @@ - @@ -47,20 +47,20 @@
                                                  {$lang->group_title}
                                                  {$lang->is_default} {$lang->about_member_default} {$lang->about_member_default}
                                                  {$lang->description}
                                                  {$lang->group_image_mark} +
                                                  diff --git a/modules/member/tpl/manage_member_group.html b/modules/member/tpl/manage_member_group.html index c3a057981..3205e1bdb 100644 --- a/modules/member/tpl/manage_member_group.html +++ b/modules/member/tpl/manage_member_group.html @@ -1,17 +1,11 @@ - -
                                                  -

                                                  {$lang->cmd_member_group} ({$lang->target} : {count($member_list)})

                                                  -
                                                  - +

                                                  {$lang->cmd_member_group} ({$lang->target} : {count($member_list)})

                                                  {$XE_VALIDATOR_MESSAGE}

                                                  - - - -
                                                  + +
                                                  @@ -46,6 +40,5 @@
                                                  -
                                                  diff --git a/modules/menu/tpl/index.html b/modules/menu/tpl/index.html index 25ae84f93..ed7db4220 100644 --- a/modules/menu/tpl/index.html +++ b/modules/menu/tpl/index.html @@ -15,7 +15,7 @@
                                                  {$lang->no}{$lang->title}{$lang->title} {$lang->regdate}  
                                                  {$no}{$val->title}{zdate($val->regdate,"Y-m-d")}{$no}{$val->title}{zdate($val->regdate,"Y-m-d")} {$lang->cmd_setup} diff --git a/modules/menu/tpl/menu_insert.html b/modules/menu/tpl/menu_insert.html index 9de475c60..0438d270c 100644 --- a/modules/menu/tpl/menu_insert.html +++ b/modules/menu/tpl/menu_insert.html @@ -12,10 +12,10 @@ {$lang->cmd_menu_insert} {nl2br($lang->about_menu_management)}
                                                  {$lang->title} - +

                                                  {$lang->about_title}

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

                                                  {$lang->about_menu_url}

                                                  +

                                                  {$lang->about_menu_url}

                                                  {$lang->menu_management} + {nl2br($lang->about_menu_management)}
                                                  - - +
                                                  {$lang->title} + {$menu_info->title}
                                                  {$lang->menu_management}{nl2br($lang->about_menu_management)}{nl2br($lang->about_menu_management)}
                                                  -
                                                  + diff --git a/modules/menu/tpl/mid_list.html b/modules/menu/tpl/mid_list.html index d61b6c3b1..d965df703 100644 --- a/modules/menu/tpl/mid_list.html +++ b/modules/menu/tpl/mid_list.html @@ -1,55 +1,50 @@ - -
                                                  -

                                                  {$lang->cmd_search_mid}

                                                  -
                                                  - -
                                                  - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                  {$lang->module_category}
                                                  {$lang->module}
                                                  {$lang->mid}
                                                  {$lang->cmd_select}
                                                  - - {$lang->not_exists} - - {$module_category[$val->module_category_srl]->title} - - {$val->module}{$val->browser_title} ({$key}){$lang->cmd_select}
                                                  - - -
                                                  +

                                                  {$lang->cmd_search_mid}

                                                  +
                                                  + + + + + + +
                                                  + + + + + + + + + + + + + + + + + + + + +
                                                  {$lang->module_category}{$lang->module}{$lang->mid}{$lang->cmd_select}
                                                  + + {$lang->not_exists} + + {$module_category[$val->module_category_srl]->title} + + {$val->module}{$val->browser_title} ({$key})
                                                  +
                                                  +
                                                  diff --git a/modules/module/tpl/category_list.html b/modules/module/tpl/category_list.html index 06499896e..0177b9e73 100644 --- a/modules/module/tpl/category_list.html +++ b/modules/module/tpl/category_list.html @@ -14,7 +14,7 @@ - + @@ -27,8 +27,8 @@ - - + +
                                                  {$lang->category_title}{$lang->category_title} {$lang->regdate}  
                                                  {$val->title}{zdate($val->regdate,"Y-m-d H:i:s")}{$val->title}{zdate($val->regdate,"Y-m-d H:i:s")} {$lang->cmd_modify} diff --git a/modules/module/tpl/copy_module.html b/modules/module/tpl/copy_module.html index 12d06b255..2cbc5eb8d 100644 --- a/modules/module/tpl/copy_module.html +++ b/modules/module/tpl/copy_module.html @@ -10,7 +10,7 @@ - + @@ -28,45 +28,45 @@ - - - + + + - - - - - - + + - - - - - - + + - - - - - - + + - - - - - - + + - - + + + + + + + + + + + + + + + + + +
                                                  {$lang->module}{$module_info->module}{$module_info->module}
                                                  {$lang->mid}
                                                  {$lang->mid}
                                                  {$lang->browser_title}
                                                  diff --git a/modules/module/tpl/filebox_add.html b/modules/module/tpl/filebox_add.html index 24cc6a09a..eaab85f61 100644 --- a/modules/module/tpl/filebox_add.html +++ b/modules/module/tpl/filebox_add.html @@ -1,37 +1,32 @@ - -
                                                  -

                                                  {$lang->filebox}

                                                  -
                                                  - +

                                                  {$lang->filebox}

                                                  - - - - - - -
                                                  - - - - - - - - - - - -
                                                  {$lang->description}
                                                  {$lang->file} -

                                                  - - {@sprintf($lang->about_file_extension,join(", ",$arrfilter ))} - -

                                                  -
                                                  -
                                                  -
                                                  - -
                                                  + + + + + +
                                                  + + + + + + + + + + + +
                                                  {$lang->description}
                                                  {$lang->file} +

                                                  + + {@sprintf($lang->about_file_extension,join(", ",$arrfilter ))} + +

                                                  +
                                                  +
                                                  +
                                                  + +
                                                  diff --git a/modules/module/tpl/filebox_list.html b/modules/module/tpl/filebox_list.html index 124f68ce1..26011baed 100644 --- a/modules/module/tpl/filebox_list.html +++ b/modules/module/tpl/filebox_list.html @@ -1,65 +1,60 @@ - -
                                                  -

                                                  {$lang->filebox}

                                                  -
                                                  - -
                                                  - - - - - - - - - - +

                                                  {$lang->filebox}

                                                  +
                                                  +
                                                  {$lang->file}
                                                  {$lang->description}
                                                  {$lang->regdate}
                                                   
                                                  + + + + + + + + + - - - - - - + + + + + + - -
                                                  {$lang->file}{$lang->description}{$lang->regdate} 
                                                  -
                                                  - - - - - - - - - - - - - -
                                                  -
                                                  {$val->comment} {zdate($val->regdate,'Y-m-d H:i')} - - - - -
                                                  +
                                                  + + + + + + + + + + + + + +
                                                  +
                                                  {$val->comment} {zdate($val->regdate,'Y-m-d H:i')} + + + + +
                                                  - - + +
                                                  - -
                                                  - {$lang->cmd_registration} + + + diff --git a/modules/module/tpl/module_addition_setup.html b/modules/module/tpl/module_addition_setup.html index 10efcd3a5..5dd28a583 100644 --- a/modules/module/tpl/module_addition_setup.html +++ b/modules/module/tpl/module_addition_setup.html @@ -1,7 +1,2 @@ -
                                                  -

                                                  {$lang->bundle_addition_setup}

                                                  -
                                                  - -
                                                  - {$setup_content} -
                                                  +

                                                  {$lang->bundle_addition_setup}

                                                  +{$setup_content} diff --git a/modules/module/tpl/module_grant_setup.html b/modules/module/tpl/module_grant_setup.html index 2c15527f5..8b794b195 100644 --- a/modules/module/tpl/module_grant_setup.html +++ b/modules/module/tpl/module_grant_setup.html @@ -24,7 +24,7 @@ {$grant_item->title} - + @@ -46,7 +46,7 @@ {$grant_item->title} - + - - - - - - - - - - - - - - - - - -
                                                  {$lang->virtual_site}
                                                  - -

                                                  {$lang->about_search_virtual_site}

                                                  -
                                                  {$lang->module}
                                                  - -
                                                  - - - - - - - - - - - - - - - {@ $_idx =0; } - - - {@ $browser_title = str_replace("'", "\\'", htmlspecialchars($v->browser_title)); } - - - - - {@ $_idx ++; } - - - - - - - - - - - - - - - -
                                                  {$lang->module_category}
                                                  {$lang->mid}
                                                  {$lang->browser_title}
                                                  {$type=='single'?$lang->cmd_select:$lang->cmd_insert}
                                                  {$key} 
                                                  {$k}{$v->browser_title}{$type=='single'?$lang->cmd_select:$lang->cmd_insert}
                                                  {$k}{$v->browser_title}browser_title)}',{$type=='single'?'false':'true'}); return false;" class="button green">{$type=='single'?$lang->cmd_select:$lang->cmd_insert}
                                                  - -
                                                  \ No newline at end of file +

                                                  {$lang->module_selector}

                                                  +
                                                  + + + + + +
                                                  + + + + + + + + + + + + + +
                                                  {$lang->virtual_site} + +

                                                  {$lang->about_search_virtual_site}

                                                  +
                                                  {$lang->module} + +
                                                  +
                                                  +
                                                  + + + + + + + + + + + + + + + {@ $_idx =0; } + + + {@ $browser_title = str_replace("'", "\\'", htmlspecialchars($v->browser_title)); } + + + + + {@ $_idx ++; } + + + + + + + + + + + + + + + +
                                                  {$lang->module_category}{$lang->mid}{$lang->browser_title}{$type=='single'?$lang->cmd_select:$lang->cmd_insert}
                                                  {$key} 
                                                  {$k}{$v->browser_title}{$type=='single'?$lang->cmd_select:$lang->cmd_insert}
                                                  {$k}{$v->browser_title}browser_title)}',{$type=='single'?'false':'true'}); return false;" class="button green">{$type=='single'?$lang->cmd_select:$lang->cmd_insert}
                                                  +
                                                  +
                                                  diff --git a/modules/module/tpl/module_setup.html b/modules/module/tpl/module_setup.html index 74e5f6edc..25719298a 100644 --- a/modules/module/tpl/module_setup.html +++ b/modules/module/tpl/module_setup.html @@ -48,21 +48,21 @@ {$lang->description} - +

                                                  {$lang->about_description}

                                                  {$lang->header_text} - +

                                                  {$lang->about_header_text}

                                                  {$lang->footer_text} - +

                                                  {$lang->about_footer_text}

                                                  diff --git a/modules/module/tpl/skin_config.html b/modules/module/tpl/skin_config.html index 6e4f74702..e5f9f1d99 100644 --- a/modules/module/tpl/skin_config.html +++ b/modules/module/tpl/skin_config.html @@ -11,7 +11,7 @@ - + @@ -54,7 +54,7 @@ - - - + + @@ -37,8 +37,8 @@ - - + + - + @@ -42,7 +42,7 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}'; - + @@ -84,7 +84,7 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}'; - + diff --git a/modules/document/tpl/declared_list.html b/modules/document/tpl/declared_list.html index 1da809827..98aebff32 100644 --- a/modules/document/tpl/declared_list.html +++ b/modules/document/tpl/declared_list.html @@ -21,7 +21,7 @@ - + @@ -33,7 +33,7 @@ - + @@ -73,7 +73,7 @@ - + diff --git a/modules/document/tpl/document_list.html b/modules/document/tpl/document_list.html index 612b599ee..14cc5a804 100644 --- a/modules/document/tpl/document_list.html +++ b/modules/document/tpl/document_list.html @@ -35,7 +35,7 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}'; - + @@ -47,7 +47,7 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}'; - + @@ -88,7 +88,7 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}'; - + From 5a58ff1143f6bec5be92d49fdaa2947530831ba3 Mon Sep 17 00:00:00 2001 From: taggon Date: Wed, 12 Oct 2011 04:42:05 +0000 Subject: [PATCH 1127/1372] Improve constants support git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9599 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/template/TemplateHandler.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/template/TemplateHandler.class.php b/classes/template/TemplateHandler.class.php index 3d5073dd8..d67f6b4aa 100644 --- a/classes/template/TemplateHandler.class.php +++ b/classes/template/TemplateHandler.class.php @@ -179,7 +179,7 @@ $buff = $this->_parseInline($buff); // include, unload/load, import - $buff = preg_replace_callback('/{(@[\s\S]+?|(?=\$\w+|__[A-Z]+|[!\(+-]|\w+(?:\(|::)|\d+|[\'"].*?[\'"]).+?)}|<(!--[#%])?(include|import|(un)?load(?(4)|(?:_js_plugin)?))(?(2)\("([^"]+)")(.*?)(?(2)\)--|\/)>|/', array($this, '_parseResource'), $buff); + $buff = preg_replace_callback('/{(@[\s\S]+?|(?=\$\w+|_{1,2}[A-Z]+|[!\(+-]|\w+(?:\(|::)|\d+|[\'"].*?[\'"]).+?)}|<(!--[#%])?(include|import|(un)?load(?(4)|(?:_js_plugin)?))(?(2)\("([^"]+)")(.*?)(?(2)\)--|\/)>|/', array($this, '_parseResource'), $buff); // remove block which is a virtual tag and remove comments $buff = preg_replace('@|\s?@is','',$buff); From 21cbca397ba6afdddfed011f6980b0f41043cb24 Mon Sep 17 00:00:00 2001 From: flyskyko Date: Wed, 12 Oct 2011 05:04:04 +0000 Subject: [PATCH 1128/1372] issue 240, added menu for module category git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9600 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/module/conf/module.xml | 2 +- modules/module/tpl/header.html | 20 +++++++++++--------- modules/module/tpl/module_list.html | 8 +------- 3 files changed, 13 insertions(+), 17 deletions(-) diff --git a/modules/module/conf/module.xml b/modules/module/conf/module.xml index ab63e91af..8873951a8 100644 --- a/modules/module/conf/module.xml +++ b/modules/module/conf/module.xml @@ -10,7 +10,7 @@ - + diff --git a/modules/module/tpl/header.html b/modules/module/tpl/header.html index 646f4c610..da99d5d1a 100644 --- a/modules/module/tpl/header.html +++ b/modules/module/tpl/header.html @@ -1,12 +1,14 @@ - -

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

                                                  + - -
                                                  {nl2br($lang->about_module)}
                                                  - +

                                                  {$lang->installed_module}

                                                  - + diff --git a/modules/module/tpl/module_list.html b/modules/module/tpl/module_list.html index 0b9d5b272..0ac5b2a05 100644 --- a/modules/module/tpl/module_list.html +++ b/modules/module/tpl/module_list.html @@ -1,11 +1,5 @@ - + - - -

                                                  {$lang->installed_module}

                                                  {$lang->skin}{$skin_info->title}{$skin_info->title}
                                                  {$lang->skin_author}
                                                  {$lang->colorset}
                                                  + {@ $_img_info = getImageSize($val->screenshot); $_height = $_img_info[1]+40; $_width = $_img_info[0]+20; $_talign = "center"; } @@ -87,13 +87,13 @@
                                                  {$val->title}
                                                  + - + {$lang->cmd_find_langcode} - + {$lang->cmd_find_langcode} diff --git a/modules/opage/tpl/index.html b/modules/opage/tpl/index.html index 455a85bc9..6229aec94 100644 --- a/modules/opage/tpl/index.html +++ b/modules/opage/tpl/index.html @@ -25,10 +25,10 @@ - + - {$lang->mid}{$lang->browser_title}{$lang->mid}{$lang->browser_title} {$lang->regdate}  
                                                  {$no}{$no} {$lang->not_exists} diff --git a/modules/opage/tpl/opage_delete.html b/modules/opage/tpl/opage_delete.html index c69bd0860..d0ecd2fbc 100644 --- a/modules/opage/tpl/opage_delete.html +++ b/modules/opage/tpl/opage_delete.html @@ -10,7 +10,7 @@ - + diff --git a/modules/opage/tpl/opage_insert.html b/modules/opage/tpl/opage_insert.html index c5853b0ac..68e529749 100644 --- a/modules/opage/tpl/opage_insert.html +++ b/modules/opage/tpl/opage_insert.html @@ -9,15 +9,15 @@ - + - + - + - + diff --git a/modules/page/tpl/index.html b/modules/page/tpl/index.html index 8b5a9a09c..d58e81bd2 100644 --- a/modules/page/tpl/index.html +++ b/modules/page/tpl/index.html @@ -9,8 +9,8 @@
                                                  - {$lang->mid} - {$lang->browser_title} + {$lang->mid} + {$lang->browser_title} {$lang->cmd_cancel}
                                                  @@ -37,11 +37,11 @@ - + - - + + @@ -50,8 +50,8 @@ - - + +
                                                  {$lang->module_name}{$module_info->mid}{$module_info->mid}
                                                  {$lang->module}
                                                  {$lang->mid} - +

                                                  {$lang->about_mid}

                                                  {$lang->module_category}
                                                  {$lang->browser_title} - + {$lang->cmd_find_langcode}

                                                  {$lang->about_browser_title}

                                                  {$lang->layout}
                                                  {$lang->opage_caching_interval} - {$lang->unit_min} + {$lang->unit_min}

                                                  {$lang->about_opage_caching_interval}

                                                  {$lang->opage_path} - +

                                                  {$lang->about_opage_path}{realpath("./")}

                                                  {$lang->opage_mobile_path} - +

                                                  {$lang->about_opage_mobile_path}{realpath("./")}

                                                  {$lang->page_type}{$lang->mid}{$lang->browser_title}{$lang->mid}{$lang->browser_title} {$lang->regdate}  
                                                  {$no}{$no} diff --git a/modules/page/tpl/page_delete.html b/modules/page/tpl/page_delete.html index ef3239fa3..136ff8330 100644 --- a/modules/page/tpl/page_delete.html +++ b/modules/page/tpl/page_delete.html @@ -13,7 +13,7 @@ - + diff --git a/modules/page/tpl/page_info.html b/modules/page/tpl/page_info.html index f733f12bc..e14b4227a 100644 --- a/modules/page/tpl/page_info.html +++ b/modules/page/tpl/page_info.html @@ -10,20 +10,20 @@
                                                  {$lang->module_name}{$module_info->mid}{$module_info->mid}
                                                  {$lang->module}
                                                  - + - + - + - + - + - + - + - + - - + + - + - - + + - + From 0016c7963a7ec776123902c739377c54581850ff Mon Sep 17 00:00:00 2001 From: ucorina Date: Wed, 5 Oct 2011 08:41:30 +0000 Subject: [PATCH 1025/1372] Issue 364 - Query error related escape characters. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9494 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- .../tags/condition/ConditionTag.class.php | 15 +++++++++++---- .../db/xml_query/cubrid/CubridSelectTest.php | 7 +++++-- .../db/xml_query/mssql/MssqlSelectTest.php | 12 +++++------- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/classes/xml/xmlquery/tags/condition/ConditionTag.class.php b/classes/xml/xmlquery/tags/condition/ConditionTag.class.php index 8c2c26a2c..d93bc58fa 100644 --- a/classes/xml/xmlquery/tags/condition/ConditionTag.class.php +++ b/classes/xml/xmlquery/tags/condition/ConditionTag.class.php @@ -37,10 +37,17 @@ $this->argument_name = $this->argument->getArgumentName(); } else { - if($condition->attrs->default){ - if(!$isColumnName && !is_numeric($condition->attrs->default)) - $condition->attrs->default = "\'" . $condition->attrs->default . "\'"; - $this->default_column = "'" . $condition->attrs->default . "'" ; + $default_value = $condition->attrs->default; + if($default_value){ + if($isColumnName){ + $default_value = "'" . $default_value . "'"; + } + else if(in_array($this->operation, array('in', 'between', 'not in'))) + $default_value = "\"" . $default_value . "\""; + else if(!$isColumnName && !is_numeric($default_value) && !is_array($default_value)){ + $default_value = "\"" . $default_value . "\""; + } + $this->default_column = $default_value; } else $this->default_column = "'" . $dbParser->parseColumnName($condition->attrs->var) . "'" ; diff --git a/test-phpUnit/db/xml_query/cubrid/CubridSelectTest.php b/test-phpUnit/db/xml_query/cubrid/CubridSelectTest.php index 3300bb75c..8b9978aa6 100644 --- a/test-phpUnit/db/xml_query/cubrid/CubridSelectTest.php +++ b/test-phpUnit/db/xml_query/cubrid/CubridSelectTest.php @@ -163,7 +163,8 @@ $args->s_member_srl = 4;'; $expected = 'select * from "xe_documents" as "documents" - where "member_srl" = 4 + where ("member_srl" = 4) + and "list_order" <= 2100000000 order by "list_order" asc limit 0, 30'; $this->_test($xml_file, $argsString, $expected); @@ -205,7 +206,9 @@ $args->sort_order = \'asc\'; $args->list_count = 40; $args->page_count = 10;'; - $expected = 'select * from "xe_member" as "member" + $expected = 'select * + from "xe_member" as "member" + where "list_order" <= 2100000000 order by "list_order" asc limit 0, 40'; $this->_test($xml_file, $argsString, $expected); diff --git a/test-phpUnit/db/xml_query/mssql/MssqlSelectTest.php b/test-phpUnit/db/xml_query/mssql/MssqlSelectTest.php index ee165efae..c33e4661e 100644 --- a/test-phpUnit/db/xml_query/mssql/MssqlSelectTest.php +++ b/test-phpUnit/db/xml_query/mssql/MssqlSelectTest.php @@ -162,12 +162,10 @@ $expected = 'select count(*) as [count] from [xe_module_grants] as [module_grants] where [module_srl] = ? - and [name] in (?,?,?) - and ( - [group_srl] >= ? - or [group_srl] = ? - or [group_srl] = ? - )'; - $this->_test($xml_file, $argsString, $expected, array(67, array('\'access\'', '\'view\'', '\'list\''), 1, -1, -2)); + and [name] in (\'access\',\'view\',\'list\') + and ([group_srl] >= 1 + or [group_srl] = -1 + or [group_srl] = -2)'; + $this->_test($xml_file, $argsString, $expected, array(67)); } } \ No newline at end of file From 5afc0b7587cb44cde9ce3a33fa5782330f1ab702 Mon Sep 17 00:00:00 2001 From: ovclas Date: Wed, 5 Oct 2011 09:00:37 +0000 Subject: [PATCH 1026/1372] issue 369 when ruleset file modified, then ruleset js file must dynamic recreate this bug fixed document.controller.php file : indent changed git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9495 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/context/Context.class.php | 9 ++++++- classes/template/TemplateHandler.class.php | 10 +++----- modules/document/document.controller.php | 30 ++++++++++++---------- 3 files changed, 28 insertions(+), 21 deletions(-) diff --git a/classes/context/Context.class.php b/classes/context/Context.class.php index d4ea3bbf7..af15e1c2c 100644 --- a/classes/context/Context.class.php +++ b/classes/context/Context.class.php @@ -1121,7 +1121,14 @@ class Context { * @brief Add the js file * @deprecated **/ - function addJsFile($file, $optimized = false, $targetie = '',$index=0, $type='head') { + function addJsFile($file, $optimized = false, $targetie = '',$index=0, $type='head', $isRuleset = false) { + if($isRuleset) + { + $validator = new Validator($file); + $validator->setCacheDir('files/cache'); + $file = $validator->getJsPath(); + } + is_a($this,'Context')?$self=&$this:$self=&Context::getInstance(); $self->oFrontEndFileHandler->loadFile(array($file, $type, $targetie, $index)); } diff --git a/classes/template/TemplateHandler.class.php b/classes/template/TemplateHandler.class.php index 8e68264cf..847a7d628 100644 --- a/classes/template/TemplateHandler.class.php +++ b/classes/template/TemplateHandler.class.php @@ -222,15 +222,13 @@ if (strpos($m[1],'@') !== false){ $path = str_replace('@', '', $m[1]); - $validator = new Validator("./files/ruleset/{$path}.xml"); - $validator->setCacheDir('files/cache'); - $matches[1] = 'getJsPath().'") ?'.'>'.$matches[1]; + $path = './files/ruleset/'.$path.'.xml'; }else if(preg_match('@(?:^|\.?/)(modules/[\w-]+)@', $this->path, $mm)) { $module_path = $mm[1]; - $validator = new Validator("{$module_path}/ruleset/{$m[1]}.xml"); - $validator->setCacheDir('files/cache'); - $matches[1] = 'getJsPath().'") ?'.'>'.$matches[1]; + $path = $module_path.'/ruleset/'.$m[1].'.xml'; } + //assign to addJsFile method for js dynamic recache + $matches[1] = ''.$matches[1]; } } diff --git a/modules/document/document.controller.php b/modules/document/document.controller.php index 80e5572cc..267fa1471 100644 --- a/modules/document/document.controller.php +++ b/modules/document/document.controller.php @@ -479,6 +479,8 @@ class documentController extends document { executeQuery('document.deleteDeclared', $args); // Delete extra variable $this->deleteDocumentExtraVars($oDocument->get('module_srl'), $oDocument->document_srl); + + //this // Call a trigger (after) if($output->toBool()) { $trigger_obj = $oDocument->getObjectVars(); @@ -500,20 +502,20 @@ class documentController extends document { $oDB->commit(); //remove from cache - $oCacheHandler = &CacheHandler::getInstance('object'); - if($oCacheHandler->isSupport()) - { - $cache_key = 'object:'.$document_srl; - $oCacheHandler->delete($cache_key); - $cache_object = $oCacheHandler->get('module_list_documents'); - if(isset($cache_object) && is_array($cache_object)){ - foreach ($cache_object as $object){ - $cache_key_object = $object; - $oCacheHandler->delete($cache_key_object); - } - }elseif(!is_array($cache_object)) { - $oCacheHandler->delete($cache_key_object); - } + $oCacheHandler = &CacheHandler::getInstance('object'); + if($oCacheHandler->isSupport()) + { + $cache_key = 'object:'.$document_srl; + $oCacheHandler->delete($cache_key); + $cache_object = $oCacheHandler->get('module_list_documents'); + if(isset($cache_object) && is_array($cache_object)){ + foreach ($cache_object as $object){ + $cache_key_object = $object; + $oCacheHandler->delete($cache_key_object); + } + }elseif(!is_array($cache_object)) { + $oCacheHandler->delete($cache_key_object); + } $oCacheHandler->delete('module_list_documents'); $cache_key = 'object_document_item:'.$document_srl; $oCacheHandler->delete($cache_key); From cd7a8f2048991f10d7c689228a83dd446dbba5b5 Mon Sep 17 00:00:00 2001 From: ucorina Date: Wed, 5 Oct 2011 09:02:36 +0000 Subject: [PATCH 1027/1372] Issue 363: Query error related default value git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9496 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- .../tags/condition/ConditionTag.class.php | 9 ++-- .../db/xml_query/mysql/MysqlSelectTest.php | 46 +++++++++++++++++++ 2 files changed, 52 insertions(+), 3 deletions(-) diff --git a/classes/xml/xmlquery/tags/condition/ConditionTag.class.php b/classes/xml/xmlquery/tags/condition/ConditionTag.class.php index d93bc58fa..41474b172 100644 --- a/classes/xml/xmlquery/tags/condition/ConditionTag.class.php +++ b/classes/xml/xmlquery/tags/condition/ConditionTag.class.php @@ -38,14 +38,17 @@ } else { $default_value = $condition->attrs->default; - if($default_value){ + if(isset($default_value)){ if($isColumnName){ $default_value = "'" . $default_value . "'"; } else if(in_array($this->operation, array('in', 'between', 'not in'))) $default_value = "\"" . $default_value . "\""; else if(!$isColumnName && !is_numeric($default_value) && !is_array($default_value)){ - $default_value = "\"" . $default_value . "\""; + if(strpos($default_value, "'")) + $default_value = "\"\'" . $default_value . "\"\'"; + else + $default_value = "\"'" . $default_value . "'\""; } $this->default_column = $default_value; } @@ -76,7 +79,7 @@ , $this->pipe ? ", '" . $this->pipe . "'" : '' ); } - else if($this->default_column){ + else if(isset($this->default_column)){ return sprintf("new ConditionWithoutArgument('%s',%s,%s%s)" , $this->column_name , $this->default_column diff --git a/test-phpUnit/db/xml_query/mysql/MysqlSelectTest.php b/test-phpUnit/db/xml_query/mysql/MysqlSelectTest.php index 97fc5a4b0..0f06d8f4d 100644 --- a/test-phpUnit/db/xml_query/mysql/MysqlSelectTest.php +++ b/test-phpUnit/db/xml_query/mysql/MysqlSelectTest.php @@ -87,4 +87,50 @@ $expected = 'select * from `xe_member` as `member` where substr(`extra_vars_t1`.`value`,5,4) >= 1102'; $this->_test($xml_file, $argsString, $expected); } + + function testResource_getLatestItemList(){ + $xml_file = _XE_PATH_ . "modules/resource/queries/getLatestItemList.xml"; + $argsString = ''; + $expected = 'select `package`.`module_srl` as `module_srl` + , `package`.`status` as `status` + , `package`.`category_srl` as `category_srl` + , `package`.`member_srl` as `member_srl` + , `package`.`package_srl` as `package_srl` + , `package`.`path` as `path` + , `package`.`license` as `license` + , `package`.`title` as `title` + , `package`.`homepage` as `homepage` + , `package`.`description` as `package_description` + , `package`.`voter` as `package_voter` + , `package`.`voted` as `package_voted` + , `package`.`downloaded` as `package_downloaded` + , `package`.`regdate` as `package_regdate` + , `package`.`last_update` as `package_last_update` + , `member`.`nick_name` as `nick_name` + , `member`.`user_id` as `user_id` + , `item`.`item_srl` as `item_srl` + , `item`.`document_srl` as `item_document_srl` + , `item`.`file_srl` as `item_file_srl` + , `item`.`screenshot_url` as `item_screenshot_url` + , `item`.`version` as `item_version` + , `item`.`voter` as `item_voter` + , `item`.`voted` as `item_voted` + , `item`.`downloaded` as `item_downloaded` + , `item`.`regdate` as `item_regdate` + , `files`.`source_filename` as `source_filename` + , `files`.`sid` as `sid` + from `xe_resource_packages` as `package` + , `xe_member` as `member` + , `xe_resource_items` as `item` + , `xe_files` as `files` + where (`package`.`status` = \'accepted\' + and `package`.`member_srl` = `member`.`member_srl` + and `item`.`item_srl` = `package`.`latest_item_srl` + and `package`.`update_order` <= 0 + and `files`.`file_srl` = `item`.`file_srl`) + and `package`.`update_order` <= 2100000000 + order by `package`.`update_order` asc + limit 0, 20'; + $this->_test($xml_file, $argsString, $expected); + } } \ No newline at end of file From c0da2956cbd0f006207d6142368d9fae20d71eb3 Mon Sep 17 00:00:00 2001 From: lickawtl Date: Wed, 5 Oct 2011 12:28:05 +0000 Subject: [PATCH 1028/1372] git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9497 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/display/DisplayHandler.class.php | 1 + 1 file changed, 1 insertion(+) diff --git a/classes/display/DisplayHandler.class.php b/classes/display/DisplayHandler.class.php index 13b4d68aa..f26c57c23 100644 --- a/classes/display/DisplayHandler.class.php +++ b/classes/display/DisplayHandler.class.php @@ -159,6 +159,7 @@ $buff .= sprintf("\tTemplate compile elapsed time\t: %0.5f sec (%d called)\n", $GLOBALS['__template_elapsed__'], $GLOBALS['__TemplateHandlerCalled__']); $buff .= sprintf("\tXmlParse compile elapsed time\t: %0.5f sec\n", $GLOBALS['__xmlparse_elapsed__']); $buff .= sprintf("\tPHP elapsed time \t\t: %0.5f sec\n", $end-__StartTime__-$GLOBALS['__template_elapsed__']-$GLOBALS['__xmlparse_elapsed__']-$GLOBALS['__db_elapsed_time__']-$GLOBALS['__elapsed_class_load__']); + $buff .= sprintf("\tDB class elapsed time \t\t: %0.5f sec\n", $GLOBALS['__dbclass_elapsed_time__'] -$GLOBALS['__db_elapsed_time__']); // widget execution time $buff .= sprintf("\n\tWidgets elapsed time \t\t: %0.5f sec", $GLOBALS['__widget_excute_elapsed__']); // layout execution time From 8cf88300db1fb0dc4b86e1589f59c004cbc314d9 Mon Sep 17 00:00:00 2001 From: ucorina Date: Wed, 5 Oct 2011 13:29:37 +0000 Subject: [PATCH 1029/1372] Issue 359 - Secret documents's status changed to public. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9498 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- .../xml/xmlquery/argument/Argument.class.php | 2 +- .../argument/ConditionArgument.class.php | 13 +++++++++++- .../db/xml_query/mysql/MysqlUpdateTest.php | 20 +++++++++++++++++++ 3 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 test-phpUnit/db/xml_query/mysql/MysqlUpdateTest.php diff --git a/classes/xml/xmlquery/argument/Argument.class.php b/classes/xml/xmlquery/argument/Argument.class.php index 1fe6a7409..d5046763b 100644 --- a/classes/xml/xmlquery/argument/Argument.class.php +++ b/classes/xml/xmlquery/argument/Argument.class.php @@ -67,7 +67,7 @@ return $dbParser->parseExpression($value); } if(!isset($value)) return null; - if(in_array($this->type, array('date', 'varchar', 'char','text', 'bigtext'))){ + if(in_array($this->getType(), array('date', 'varchar', 'char','text', 'bigtext'))){ if(!is_array($value)) $value = $this->_escapeStringValue ($value); else { diff --git a/classes/xml/xmlquery/argument/ConditionArgument.class.php b/classes/xml/xmlquery/argument/ConditionArgument.class.php index 2094d9eeb..e11350aa1 100644 --- a/classes/xml/xmlquery/argument/ConditionArgument.class.php +++ b/classes/xml/xmlquery/argument/ConditionArgument.class.php @@ -40,8 +40,19 @@ } } + /** + * Since ConditionArgument is used in WHERE clause, + * where the argument value is compared to a table column, + * it is assumed that all arguments have type. There are cases though + * where the column does not have any type - if it was removed from + * the XML schema for example - see the is_secret column in xe_documents table. + * In this case, the column type is retrieved according to argument + * value type (using the PHP function is_numeric). + * + * @return type string + */ function getType(){ - return $this->type; + return $this->type ? $this->type : (!is_numeric($this->value) ? "varchar" : ""); } function setColumnType($column_type){ diff --git a/test-phpUnit/db/xml_query/mysql/MysqlUpdateTest.php b/test-phpUnit/db/xml_query/mysql/MysqlUpdateTest.php new file mode 100644 index 000000000..e4264945d --- /dev/null +++ b/test-phpUnit/db/xml_query/mysql/MysqlUpdateTest.php @@ -0,0 +1,20 @@ +_testQuery($xml_file, $argsString, $expected, 'getUpdateSql', $columnList); + } + + function test_document_updateDocumentStatus(){ + $xml_file = _XE_PATH_ . "modules/document/queries/updateDocumentStatus.xml"; + $argsString = '$args->is_secret = \'Y\'; + $args->status = \'SECRET\'; + '; + $expected = 'update `xe_documents` set `status` = \'secret\' where `is_secret` = \'y\''; + $this->_test($xml_file, $argsString, $expected); + } + + + } \ No newline at end of file From 484a2e879195a088d2474fec9aa7321cb386e2d5 Mon Sep 17 00:00:00 2001 From: ucorina Date: Wed, 5 Oct 2011 14:30:30 +0000 Subject: [PATCH 1030/1372] Issue 192 - Use of deprecated function mysql_escape_string(). git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9499 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/db/DBMysql.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/db/DBMysql.class.php b/classes/db/DBMysql.class.php index 061a35232..8d463d2e5 100644 --- a/classes/db/DBMysql.class.php +++ b/classes/db/DBMysql.class.php @@ -100,7 +100,7 @@ **/ function addQuotes($string) { if(version_compare(PHP_VERSION, "5.9.0", "<") && get_magic_quotes_gpc()) $string = stripslashes(str_replace("\\","\\\\",$string)); - if(!is_numeric($string)) $string = @mysql_escape_string($string); + if(!is_numeric($string)) $string = @mysql_real_escape_string($string); return $string; } From a69023da831a59a51b58d20881ccb62069d0d39f Mon Sep 17 00:00:00 2001 From: ucorina Date: Wed, 5 Oct 2011 15:16:52 +0000 Subject: [PATCH 1031/1372] Changed the way document search results are removed from cache - instead of delete, key incrementing is now used. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9500 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/cache/CacheHandler.class.php | 32 ++++++++++-- .../document/document.admin.controller.php | 36 +++++-------- modules/document/document.controller.php | 50 +++---------------- modules/document/document.model.php | 36 +++++-------- 4 files changed, 62 insertions(+), 92 deletions(-) diff --git a/classes/cache/CacheHandler.class.php b/classes/cache/CacheHandler.class.php index 81c3ad7be..1e3943e1a 100644 --- a/classes/cache/CacheHandler.class.php +++ b/classes/cache/CacheHandler.class.php @@ -8,7 +8,7 @@ **/ class CacheHandler extends Handler { - + var $handler = null; function &getInstance($target='object') { @@ -21,13 +21,13 @@ if($target == 'object'){ if($info->use_object_cache =='apc') $type = 'apc'; else if(substr($info->use_object_cache,0,8)=='memcache'){ - $type = 'memcache'; + $type = 'memcache'; $url = $info->use_object_cache; } }else if($target == 'template'){ if($info->use_template_cache =='apc') $type = 'apc'; else if(substr($info->use_template_cache,0,8)=='memcache'){ - $type = 'memcache'; + $type = 'memcache'; $url = $info->use_template_cache; } } @@ -69,9 +69,35 @@ if(!$this->handler) return false; return $this->handler->truncate(); } + + /** + * Function used for generating keys for similar objects. + * + * Ex: 1:document:123 + * 1:document:777 + * + * This allows easily removing all object of type "document" + * from cache by simply invalidating the group key. + * + * The new key will be 2:document:123, thus forcing the document + * to be reloaded from the database. + */ + function getGroupKey($keyGroupName, $key){ + if(!$this->keyGroupVersions[$keyGroupName]){ + $this->keyGroupVersions[$keyGroupName] = 1; + } + + return $this->keyGroupVersions[$keyGroupName] . ':' . $keyGroupName . ':' . $key; + } + + function invalidateGroupKey($keyGroupName){ + $this->keyGroupVersions[$keyGroupName]++; + } } class CacheBase{ + var $keyGroupVersions = array(); + function get($key, $modified_time = 0){ return false; } diff --git a/modules/document/document.admin.controller.php b/modules/document/document.admin.controller.php index 0efa86645..4922e9341 100644 --- a/modules/document/document.admin.controller.php +++ b/modules/document/document.admin.controller.php @@ -35,7 +35,7 @@ $this->setMessage( sprintf(Context::getLang('msg_checked_document_is_deleted'), $document_count) ); } - /** + /** * @brief change the module to move a specific article **/ function moveDocumentModule($document_srl_list, $module_srl, $category_srl) { @@ -129,7 +129,7 @@ $oDB->rollback(); return $output; } - // move the trackback + // move the trackback $output = executeQuery('trackback.updateTrackbackModule', $args); if(!$output->toBool()) { $oDB->rollback(); @@ -147,11 +147,11 @@ $oDB->rollback(); return $output; } - + $oDB->commit(); //remove from cache $oCacheHandler = &CacheHandler::getInstance('object'); - if($oCacheHandler->isSupport()) + if($oCacheHandler->isSupport()) { foreach($document_srl_list as $document_srl) { @@ -160,17 +160,12 @@ $cache_key_item = 'object_document_item:'.$document_srl; $oCacheHandler->delete($cache_key_item); } - $cache_object = $oCacheHandler->get('module_list_documents'); - foreach ($cache_object as $object){ - $cache_key_object = $object; - $oCacheHandler->delete($cache_key_object); - } - $oCacheHandler->delete('module_list_documents'); + $oCacheHandler->invalidateGroupKey('documentList'); } return new Object(); } - /** + /** * @brief Copy the post **/ function copyDocumentModule($document_srl_list, $module_srl, $category_srl) { @@ -218,7 +213,7 @@ } } } - + // Write a post $output = $oDocumentController->insertDocument($obj, true); if(!$output->toBool()) { @@ -296,7 +291,7 @@ } //remove from cache $oCacheHandler = &CacheHandler::getInstance('object'); - if($oCacheHandler->isSupport()) + if($oCacheHandler->isSupport()) { foreach($document_srl_list as $document_srl) { @@ -305,12 +300,7 @@ $cache_key_item = 'object_document_item:'.$document_srl; $oCacheHandler->delete($cache_key_item); } - $cache_object = $oCacheHandler->get('module_list_documents'); - foreach ($cache_object as $object){ - $cache_key_object = $object; - $oCacheHandler->delete($cache_key_object); - } - $oCacheHandler->delete('module_list_documents'); + $oCacheHandler->invalidateGroupKey('documentList'); } return $output; } @@ -431,7 +421,7 @@ $this->setMessage('success_deleted'); } - + /** * @brief control the order of extra variables **/ @@ -453,7 +443,7 @@ if($type == 'up') $new_idx = $var_idx-1; else $new_idx = $var_idx+1; if($new_idx<1) return new Object(-1,'msg_invalid_request'); - + $args->module_srl = $module_srl; $args->var_idx = $new_idx; $output = executeQuery('document.getDocumentExtraKeys', $args); @@ -499,12 +489,12 @@ function procDocumentAdminInsertAlias() { $args = Context::gets('module_srl','document_srl', 'alias_title'); $alias_srl = Context::get('alias_srl'); - if(!$alias_srl) + if(!$alias_srl) { $args->alias_srl = getNextSequence(); $query = "document.insertAlias"; } - else + else { $args->alias_srl = $alias_srl; $query = "document.updateAlias"; diff --git a/modules/document/document.controller.php b/modules/document/document.controller.php index 267fa1471..075fbec1c 100644 --- a/modules/document/document.controller.php +++ b/modules/document/document.controller.php @@ -243,16 +243,7 @@ class documentController extends document { { $cache_key = 'object:'.$obj->document_srl; $oCacheHandler->delete($cache_key); - $cache_object = $oCacheHandler->get('module_list_documents'); - if(isset($cache_object) && is_array($cache_object)){ - foreach ($cache_object as $object){ - $cache_key_object = $object; - $oCacheHandler->delete($cache_key_object); - } - }elseif(!is_array($cache_object)) { - $oCacheHandler->delete($cache_key_object); - } - $oCacheHandler->delete('module_list_documents'); + $oCacheHandler->invalidateGroupKey('documentList'); } return $output; @@ -414,16 +405,7 @@ class documentController extends document { { $cache_key = 'object:'.$obj->document_srl; $oCacheHandler->delete($cache_key); - $cache_object = $oCacheHandler->get('module_list_documents'); - if(isset($cache_object) && is_array($cache_object)){ - foreach ($cache_object as $object){ - $cache_key_object = $object; - $oCacheHandler->delete($cache_key_object); - } - }elseif(!is_array($cache_object)) { - $oCacheHandler->delete($cache_key_object); - } - $oCacheHandler->delete('module_list_documents'); + $oCacheHandler->invalidateGroupKey('documentList'); //remove document item from cache $cache_key = 'object_document_item:'.$obj->document_srl; $oCacheHandler->delete($cache_key); @@ -507,19 +489,10 @@ class documentController extends document { { $cache_key = 'object:'.$document_srl; $oCacheHandler->delete($cache_key); - $cache_object = $oCacheHandler->get('module_list_documents'); - if(isset($cache_object) && is_array($cache_object)){ - foreach ($cache_object as $object){ - $cache_key_object = $object; - $oCacheHandler->delete($cache_key_object); - } - }elseif(!is_array($cache_object)) { - $oCacheHandler->delete($cache_key_object); - } - $oCacheHandler->delete('module_list_documents'); - $cache_key = 'object_document_item:'.$document_srl; - $oCacheHandler->delete($cache_key); - } + $oCacheHandler->invalidateGroupKey('documentList'); + $cache_key = 'object_document_item:'.$document_srl; + $oCacheHandler->delete($cache_key); + } return $output; } @@ -901,16 +874,7 @@ class documentController extends document { { $cache_key = 'object:'.$document_srl; $oCacheHandler->delete($cache_key); - $cache_object = $oCacheHandler->get('module_list_documents'); - if(isset($cache_object) && is_array($cache_object)){ - foreach ($cache_object as $object){ - $cache_key_object = $object; - $oCacheHandler->delete($cache_key_object); - } - }elseif(!is_array($cache_object)) { - $oCacheHandler->delete($cache_key_object); - } - $oCacheHandler->delete('module_list_documents'); + $oCacheHandler->invalidateGroupKey('documentList'); //remove document item from cache $cache_key = 'object_document_item:'.$document_srl; $oCacheHandler->delete($cache_key); diff --git a/modules/document/document.model.php b/modules/document/document.model.php index 4071093b2..a9ddeaa1f 100644 --- a/modules/document/document.model.php +++ b/modules/document/document.model.php @@ -41,8 +41,8 @@ if($output->toBool() && $output->data) { foreach($output->data as $key => $val) { if(!isset($val->value)) continue; - if(!$extra_vars[$val->module_srl][$val->document_srl][$val->var_idx][0]) $extra_vars[$val->module_srl][$val->document_srl][$val->var_idx][0] = trim($val->value); - $extra_vars[$val->document_srl][$val->var_idx][$val->lang_code] = trim($val->value); + if(!$extra_vars[$val->module_srl][$val->document_srl][$val->var_idx][0]) $extra_vars[$val->module_srl][$val->document_srl][$val->var_idx][0] = trim($val->value); + $extra_vars[$val->document_srl][$val->var_idx][$val->lang_code] = trim($val->value); } } @@ -76,8 +76,8 @@ if($vars[-1][$user_lang_code]) $GLOBALS['XE_DOCUMENT_LIST'][$document_srl]->add('title',$vars[-1][$user_lang_code]); // Information processing if($vars[-2][$user_lang_code]) $GLOBALS['XE_DOCUMENT_LIST'][$document_srl]->add('content',$vars[-2][$user_lang_code]); - - if($vars[-1][$user_lang_code] || $vars[-2][$user_lang_code]){ + + if($vars[-1][$user_lang_code] || $vars[-2][$user_lang_code]){ unset($checked_documents[$document_srl]); } @@ -155,22 +155,12 @@ // cache controll $oCacheHandler = &CacheHandler::getInstance('object'); if($oCacheHandler->isSupport()){ - $cache_key = 'object:'.$obj->module_srl.'_category_srl:'.$obj->category_srl.'_list_count:'.$obj->list_count.'_search_target:'.$obj->search_target.'_search_keyword:'.$obj->search_keyword.'_page'.$obj->page; - $output = $oCacheHandler->get($cache_key); - $cache_object = $oCacheHandler->get('module_list_documents'); - if($cache_object) { - if(!in_array($cache_key, $cache_object)) { - $cache_object[]=$cache_key; - $oCacheHandler->put('module_list_documents',$cache_object); - } - } else { - $cache_object = array(); - $cache_object[] = $cache_key; - $oCacheHandler->put('module_list_documents',$cache_object); - } + $object_key = 'object:'.$obj->module_srl.'_category_srl:'.$obj->category_srl.'_list_count:'.$obj->list_count.'_search_target:'.$obj->search_target.'_search_keyword:'.$obj->search_keyword.'_page'.$obj->page; + $cache_key = $oCacheHandler->getGroupKey('documentList', $object_key); + $output = $oCacheHandler->get($cache_key); } if(!$output){ - + $logged_info = Context::get('logged_info'); $sort_check = $this->_setSortIndex($obj, $load_extra_vars); @@ -334,7 +324,7 @@ } else { $output = executeQueryArray($query_id, $args, $columnList); } - } + } // Return if no result or an error occurs if(!$output->toBool()||!count($output->data)) return $output; @@ -823,7 +813,7 @@ // Bringing existing extra_keys $extra_keys = $this->getExtraKeys($module_srl); Context::set('extra_keys', $extra_keys); - $security = new Security(); + $security = new Security(); $security->encodeHTML('extra_keys..name','extra_keys..eid'); // Get information of module_grants @@ -885,8 +875,8 @@ $category_info->title = htmlspecialchars($category_info->title); Context::set('category_info', $category_info); - - $security = new Security(); + + $security = new Security(); $security->encodeHTML('group_list..title'); // tpl template file directly compile and will return a variable and puts it on. @@ -1067,7 +1057,7 @@ { $sortIndex = $obj->sort_index; $isExtraVars = false; - if(!in_array($sortIndex, array('list_order','regdate','last_update','update_order','readed_count','voted_count','comment_count','trackback_count','uploaded_count','title','category_srl'))) + if(!in_array($sortIndex, array('list_order','regdate','last_update','update_order','readed_count','voted_count','comment_count','trackback_count','uploaded_count','title','category_srl'))) { // get module_srl extra_vars list if ($load_extra_vars) From 441ef79f1b46fe08b223895bd5c828e5d3a1313a Mon Sep 17 00:00:00 2001 From: ucorina Date: Wed, 5 Oct 2011 16:12:42 +0000 Subject: [PATCH 1032/1372] Changed the way comment lists are removed from cache - instead of delete, key incrementing is now used. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9501 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/cache/CacheHandler.class.php | 18 +++-- modules/comment/comment.admin.controller.php | 20 ++---- modules/comment/comment.controller.php | 76 ++++++-------------- modules/comment/comment.model.php | 38 ++++------ 4 files changed, 51 insertions(+), 101 deletions(-) diff --git a/classes/cache/CacheHandler.class.php b/classes/cache/CacheHandler.class.php index 1e3943e1a..8cc93e10b 100644 --- a/classes/cache/CacheHandler.class.php +++ b/classes/cache/CacheHandler.class.php @@ -10,10 +10,11 @@ class CacheHandler extends Handler { var $handler = null; + var $keyGroupVersions = null; - function &getInstance($target='object') { - return new CacheHandler($target); - } + function &getInstance($target='object') { + return new CacheHandler($target); + } function CacheHandler($target, $info=null) { if(!$info) $info = Context::getDBInfo(); @@ -36,6 +37,11 @@ $class = 'Cache' . ucfirst($type); include_once sprintf('%sclasses/cache/%s.class.php', _XE_PATH_, $class); $this->handler = call_user_func(array($class,'getInstance'), $url); + $this->keyGroupVersions = $this->handler->get('key_group_versions', 0); + if(!$this->keyGroupVersions) { + $this->keyGroupVersions = array(); + $this->handler->put('key_group_versions', $this->keyGroupVersions, 0); + } } } } @@ -69,7 +75,7 @@ if(!$this->handler) return false; return $this->handler->truncate(); } - + /** * Function used for generating keys for similar objects. * @@ -85,6 +91,7 @@ function getGroupKey($keyGroupName, $key){ if(!$this->keyGroupVersions[$keyGroupName]){ $this->keyGroupVersions[$keyGroupName] = 1; + $this->handler->put('key_group_versions', $this->keyGroupVersions, 0); } return $this->keyGroupVersions[$keyGroupName] . ':' . $keyGroupName . ':' . $key; @@ -92,12 +99,11 @@ function invalidateGroupKey($keyGroupName){ $this->keyGroupVersions[$keyGroupName]++; + $this->handler->put('key_group_versions', $this->keyGroupVersions, 0); } } class CacheBase{ - var $keyGroupVersions = array(); - function get($key, $modified_time = 0){ return false; } diff --git a/modules/comment/comment.admin.controller.php b/modules/comment/comment.admin.controller.php index 11137f98c..d65ab26db 100644 --- a/modules/comment/comment.admin.controller.php +++ b/modules/comment/comment.admin.controller.php @@ -78,17 +78,12 @@ } $oDB->commit(); - + //remove from cache $oCacheHandler = &CacheHandler::getInstance('object'); - if($oCacheHandler->isSupport()) + if($oCacheHandler->isSupport()) { - $cache_object = $oCacheHandler->get('comment_list_document_pages'); - foreach ($cache_object as $object){ - $cache_key = $object; - $oCacheHandler->delete($cache_key); - } - $oCacheHandler->delete('comment_list_document_pages'); + $oCacheHandler->invalidateGroupKey('commentList'); } $msgCode = ''; @@ -176,14 +171,9 @@ $output = executeQuery('comment.deleteModuleCommentsList', $args); //remove from cache $oCacheHandler = &CacheHandler::getInstance('object'); - if($oCacheHandler->isSupport()) + if($oCacheHandler->isSupport()) { - $cache_object = $oCacheHandler->get('comment_list_document_pages'); - foreach ($cache_object as $object){ - $cache_key = $object; - $oCacheHandler->delete($cache_key); - } - $oCacheHandler->delete('comment_list_document_pages'); + $oCacheHandler->invalidateGroupKey('commentList'); } return $output; } diff --git a/modules/comment/comment.controller.php b/modules/comment/comment.controller.php index fd0d2e5a0..e1e9a12b0 100644 --- a/modules/comment/comment.controller.php +++ b/modules/comment/comment.controller.php @@ -2,7 +2,7 @@ /** * @class commentController * @author NHN (developers@xpressengine.com) - * @brief controller class of the comment module + * @brief controller class of the comment module **/ class commentController extends comment { @@ -242,20 +242,11 @@ $output->add('comment_srl', $obj->comment_srl); //remove from cache $oCacheHandler = &CacheHandler::getInstance('object'); - if($oCacheHandler->isSupport()) + if($oCacheHandler->isSupport()) { $cache_key_newest = 'object_newest_comment_list:'.$obj->module_srl; $oCacheHandler->delete($cache_key_newest); - $cache_object = $oCacheHandler->get('comment_list_document_pages'); - if(isset($cache_object) && is_array($cache_object)){ - foreach ($cache_object as $object){ - $cache_key = $object; - $oCacheHandler->delete($cache_key); - } - }elseif(!is_array($cache_object)) { - $oCacheHandler->delete($cache_key); - } - $oCacheHandler->delete('comment_list_document_pages'); + $oCacheHandler->invalidateGroupKey('commentList'); } return $output; } @@ -335,20 +326,11 @@ $output->add('comment_srl', $obj->comment_srl); //remove from cache $oCacheHandler = &CacheHandler::getInstance('object'); - if($oCacheHandler->isSupport()) + if($oCacheHandler->isSupport()) { $cache_key_newest = 'object_newest_comment_list:'.$obj->module_srl; $oCacheHandler->delete($cache_key_newest); - $cache_object = $oCacheHandler->get('comment_list_document_pages'); - if(isset($cache_object) && is_array($cache_object)){ - foreach ($cache_object as $object){ - $cache_key = $object; - $oCacheHandler->delete($cache_key); - } - }elseif(!is_array($cache_object)) { - $oCacheHandler->delete($cache_key); - } - $oCacheHandler->delete('comment_list_document_pages'); + $oCacheHandler->invalidateGroupKey('commentList'); } return $output; } @@ -388,7 +370,7 @@ $comment_count = $oCommentModel->getCommentCount($document_srl); // create the controller object of the document $oDocumentController = &getController('document'); - // update comment count of the article posting + // update comment count of the article posting $output = $oDocumentController->updateCommentCount($document_srl, $comment_count, null, false); if(!$output->toBool()) { $oDB->rollback(); @@ -415,18 +397,9 @@ $output->add('document_srl', $document_srl); //remove from cache $oCacheHandler = &CacheHandler::getInstance('object'); - if($oCacheHandler->isSupport()) + if($oCacheHandler->isSupport()) { - $cache_object = $oCacheHandler->get('comment_list_document_pages'); - if(isset($cache_object) && is_array($cache_object)){ - foreach ($cache_object as $object){ - $cache_key = $object; - $oCacheHandler->delete($cache_key); - } - }elseif(!is_array($cache_object)) { - $oCacheHandler->delete($cache_key); - } - $oCacheHandler->delete('comment_list_document_pages'); + $oCacheHandler->invalidateGroupKey('commentList'); } return $output; } @@ -483,18 +456,9 @@ } //remove from cache $oCacheHandler = &CacheHandler::getInstance('object'); - if($oCacheHandler->isSupport()) + if($oCacheHandler->isSupport()) { - $cache_object = $oCacheHandler->get('comment_list_document_pages'); - if(isset($cache_object) && is_array($cache_object)){ - foreach ($cache_object as $object){ - $cache_key = $object; - $oCacheHandler->delete($cache_key); - } - }elseif(!is_array($cache_object)) { - $oCacheHandler->delete($cache_key); - } - $oCacheHandler->delete('comment_list_document_pages'); + $oCacheHandler->invalidateGroupKey('commentList'); } return $output; @@ -533,7 +497,7 @@ $success_message = 'success_blamed'; } - // invalid vote if vote info exists in the session info. + // invalid vote if vote info exists in the session info. if($_SESSION['voted_comment'][$comment_srl]) return new Object(-1, $failed_voted); $oCommentModel = &getModel('comment'); @@ -543,18 +507,18 @@ $_SESSION['voted_comment'][$comment_srl] = true; return new Object(-1, $failed_voted); } - // if the comment author is a member + // if the comment author is a member if($oComment->get('member_srl')) { // create the member model object $oMemberModel = &getModel('member'); $member_srl = $oMemberModel->getLoggedMemberSrl(); - // session registered if the author information matches to the current logged-in user's. + // session registered if the author information matches to the current logged-in user's. if($member_srl && $member_srl == $oComment->get('member_srl')) { $_SESSION['voted_comment'][$comment_srl] = true; return new Object(-1, $failed_voted); } } - // If logged-in, use the member_srl. otherwise use the ipaddress. + // If logged-in, use the member_srl. otherwise use the ipaddress. if($member_srl) { $args->member_srl = $member_srl; } else { @@ -562,7 +526,7 @@ } $args->comment_srl = $comment_srl; $output = executeQuery('comment.getCommentVotedLogInfo', $args); - // session registered if log info contains recommendation vote log. + // session registered if log info contains recommendation vote log. if($output->data->count) { $_SESSION['voted_comment'][$comment_srl] = true; return new Object(-1, $failed_voted); @@ -596,7 +560,7 @@ $args->comment_srl = $comment_srl; $output = executeQuery('comment.getDeclaredComment', $args); if(!$output->toBool()) return $output; - // get the original comment + // get the original comment $oCommentModel = &getModel('comment'); $oComment = $oCommentModel->getComment($comment_srl, false, false); // failed if both ip addresses between author's and the current user are same. @@ -604,9 +568,9 @@ $_SESSION['declared_comment'][$comment_srl] = true; return new Object(-1, 'failed_declared'); } - // if the comment author is a member + // if the comment author is a member if($oComment->get('member_srl')) { - // create the member model object + // create the member model object $oMemberModel = &getModel('member'); $member_srl = $oMemberModel->getLoggedMemberSrl(); // session registered if the author information matches to the current logged-in user's. @@ -628,7 +592,7 @@ $_SESSION['declared_comment'][$comment_srl] = true; return new Object(-1, 'failed_declared'); } - // execute insert + // execute insert if($output->data->declared_count > 0) $output = executeQuery('comment.updateDeclaredComment', $args); else $output = executeQuery('comment.insertDeclaredComment', $args); if(!$output->toBool()) return $output; @@ -657,7 +621,7 @@ } /** - * @brief save the comment extension form for each module + * @brief save the comment extension form for each module **/ function procCommentInsertModuleConfig() { $module_srl = Context::get('target_module_srl'); diff --git a/modules/comment/comment.model.php b/modules/comment/comment.model.php index 15372437d..37210d919 100644 --- a/modules/comment/comment.model.php +++ b/modules/comment/comment.model.php @@ -24,7 +24,7 @@ $mid = Context::get('cur_mid'); $logged_info = Context::get('logged_info'); $act = Context::get('cur_act'); - + // array values for menu_list, "comment post, target, url" $menu_list = array(); // call a trigger @@ -59,7 +59,7 @@ } // call a trigger (after) ModuleHandler::triggerCall('comment.getCommentMenu', 'after', $menu_list); - // find a comment by IP matching if an administrator. + // find a comment by IP matching if an administrator. if($logged_info->is_admin == 'Y') { $oCommentModel = &getModel('comment'); $oComment = $oCommentModel->getComment($comment_srl); @@ -168,12 +168,12 @@ $args->module_srl = $module_srl; $output = executeQuery('comment.getCommentCount', $args); $total_count = $output->data->count; - + return (int)$total_count; } - /** + /** * @brief get the comment in corresponding with mid. **/ function getNewestCommentList($obj, $columnList = array()) { @@ -182,7 +182,7 @@ $obj->module_srl = $oModuleModel->getModuleSrlByMid($obj->mid); unset($obj->mid); } - // check if module_srl is an arrary. + // check if module_srl is an arrary. if(is_array($obj->module_srl)) $args->module_srl = implode(',', $obj->module_srl); else $args->module_srl = $obj->module_srl; $args->list_count = $obj->list_count; @@ -197,7 +197,7 @@ if($oCacheHandler->isSupport()) $oCacheHandler->put($cache_key,$output); } if(!$output->toBool()) return $output; - + $comment_list = $output->data; if($comment_list) { if(!is_array($comment_list)) $comment_list = array($comment_list); @@ -215,26 +215,16 @@ return $result; } - /** + /** * @brief get a comment list of the doc in corresponding woth document_srl. **/ function getCommentList($document_srl, $page = 0, $is_admin = false, $count = 0) { // cache controll $oCacheHandler = &CacheHandler::getInstance('object'); if($oCacheHandler->isSupport()){ - $cache_key = 'object:'.$document_srl.'_'.$page; + $object_key = 'object:'.$document_srl.'_'.$page.'_'.($is_admin ? 'Y' : 'N') .'_' . $count; + $cache_key = $oCacheHandler->getGroupKey('commentList', $object_key); $output = $oCacheHandler->get($cache_key); - $cache_object = $oCacheHandler->get('comment_list_document_pages'); - if($cache_object) { - if(!in_array($cache_key, $cache_object)) { - $cache_object[]=$cache_key; - $oCacheHandler->put('comment_list_document_pages',$cache_object); - } - } else { - $cache_object = array(); - $cache_object[] = $cache_key; - $oCacheHandler->put('comment_list_document_pages',$cache_object); - } } if(!$output){ // get the number of comments on the document module @@ -247,7 +237,7 @@ if($oDocument->getCommentCount()<1) return; // get a list of comments $module_srl = $oDocument->get('module_srl'); - + if(!$count) { $comment_config = $this->getCommentConfig($module_srl); $comment_count = $comment_config->comment_count; @@ -256,7 +246,7 @@ $comment_count = $count; } // get a very last page if no page exists - if(!$page) $page = (int)( ($oDocument->getCommentCount()-1) / $comment_count) + 1; + if(!$page) $page = (int)( ($oDocument->getCommentCount()-1) / $comment_count) + 1; // get a list of comments $args->document_srl = $document_srl; $args->list_count = $comment_count; @@ -273,12 +263,12 @@ } //insert in cache if($oCacheHandler->isSupport()) $oCacheHandler->put($cache_key,$output); - + } - + return $output; } - + /** * @brief update a list of comments in corresponding with document_srl * take care of previously used data than GA version From a14fea99b06da9b143549e6eed066791a90d2c6f Mon Sep 17 00:00:00 2001 From: chschy Date: Thu, 6 Oct 2011 01:36:49 +0000 Subject: [PATCH 1033/1372] issue 349, add help language in ftp page git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9502 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/tpl/config_ftp.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/admin/tpl/config_ftp.html b/modules/admin/tpl/config_ftp.html index 53f4436a2..c6724c6c7 100644 --- a/modules/admin/tpl/config_ftp.html +++ b/modules/admin/tpl/config_ftp.html @@ -12,7 +12,7 @@

                                                  {$lang->detail_about_ftp_info}

                                                  -

                                                  +

                                                  Default : 127.0.0.1

                                                • @@ -23,7 +23,7 @@
                                                • -

                                                  +

                                                  Default : 21

                                                • From 51a84b014854f6c78fbbc155111a17e704e18997 Mon Sep 17 00:00:00 2001 From: taggon Date: Thu, 6 Oct 2011 02:23:08 +0000 Subject: [PATCH 1034/1372] issue 271: The html5shiv script is loaded only if the browser is older than IE 9 git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9503 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/tpl/common_layout.html | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/common/tpl/common_layout.html b/common/tpl/common_layout.html index e82729648..8704c2cc1 100644 --- a/common/tpl/common_layout.html +++ b/common/tpl/common_layout.html @@ -48,8 +48,10 @@ + + + From 3ff9d7af44e5651eb6cf066949fa66d69d86c798 Mon Sep 17 00:00:00 2001 From: devjin Date: Thu, 6 Oct 2011 03:00:39 +0000 Subject: [PATCH 1035/1372] fixed install message css error remove whitespace in member info error install member module (created rulset file) error null check memberInfo git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9504 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/install/tpl/css/install.css | 11 ----- modules/member/member.admin.controller.php | 33 ++++++++++----- modules/member/member.admin.view.php | 5 ++- modules/member/member.class.php | 48 +++++++++++----------- modules/member/member.controller.php | 18 ++++++++ modules/module/module.class.php | 4 ++ 6 files changed, 72 insertions(+), 47 deletions(-) diff --git a/modules/install/tpl/css/install.css b/modules/install/tpl/css/install.css index d45d4a398..985ff1eec 100644 --- a/modules/install/tpl/css/install.css +++ b/modules/install/tpl/css/install.css @@ -112,16 +112,5 @@ html{height:100%;background:url(../img/bgHtml.gif) repeat-x 0 0} .agreement a{color:#6CF;text-decoration:underline;vertical-align:middle} .agreement em{color:#f60} .agreement p{line-height:1.5} -/* Message */ -.message{border:1px solid #ddd;background:#f8f8f8;margin:1em 0;padding:0 1em;border-radius:5px;line-height:1.4;font-size:12px} -body>.message{margin:1em} -.message p{margin:1em 0 !important} -.message em{font-style:normal;color:#e00} -.message.info, -.message.error, -.message.update{padding-left:55px} -.message.info{border-color:#E0E8EC;background:#EDF9FF url(../../common/img/msg.Info.png) no-repeat 1em .5em} -.message.error{border-color:#EFDCDC;background:#FFECEC url(../../common/img/msg.error.png) no-repeat 1em .5em} -.message.update{border-color:#EAE9DC;background:#FFFDEF url(../../common/img/msg.update.png) no-repeat 1em .5em} /* Waiting for server response */ .wfsr{display:none;position:absolute;position:fixed;left:0;top:0;z-index:100; border:1px solid #EAE9DC;background:#FFFDEF url(../../common/img/msg.update.png) no-repeat 1em .5em;margin:1em;padding:1em 1em 1em 55px;border-radius:5px;line-height:1.4;font-size:12px} diff --git a/modules/member/member.admin.controller.php b/modules/member/member.admin.controller.php index 730e0a623..266d68c9c 100644 --- a/modules/member/member.admin.controller.php +++ b/modules/member/member.admin.controller.php @@ -61,6 +61,15 @@ if($member_info->member_srl != $args->member_srl) unset($args->member_srl); } + // remove whitespace + $checkInfos = array('user_id', 'nick_name', 'email_address'); + $replaceStr = array("\r\n", "\r", "\n", " ", "\t", "\xC2\xAD"); + foreach($checkInfos as $val){ + if(isset($args->{$val})){ + $args->{$val} = str_replace($replaceStr, '', $args->{$val}); + } + } + $oMemberController = &getController('member'); // Execute insert or update depending on the value of member_srl if(!$args->member_srl) { @@ -239,10 +248,14 @@ foreach($signupForm as $formInfo){ if ($formInfo->required || $formInfo->mustRequired){ if($formInfo->name == 'password') - $fields[] = ''; + $fields[] = ''; else if($formInfo->name == 'find_account_question'){ $fields[] = ''; - $fields[] = ''; + $fields[] = ''; + }else if($formInfo->name == 'email_address'){ + $fields[] = sprintf('', $formInfo->name); + }else if($formInfo->name == 'user_id'){ + $fields[] = sprintf('', $formInfo->name); }else{ $fields[] = sprintf('', $formInfo->name); } @@ -271,11 +284,11 @@ $fields[] = ''; $xml_buff = sprintf($buff, implode('', $fields)); - filehandler::writefile($xml_file, $xml_buff); + Filehandler::writeFile($xml_file, $xml_buff); - $validator = new validator($xml_file); - $validator->setcachedir('files/cache'); - $validator->getjspath(); + $validator = new Validator($xml_file); + $validator->setCacheDir('files/cache'); + $validator->getJsPath(); } function _createFindAccountByQuestion($identifier){ @@ -296,11 +309,11 @@ $fields[] = ''; $xml_buff = sprintf($buff, implode('', $fields)); - filehandler::writefile($xml_file, $xml_buff); + Filehandler::writeFile($xml_file, $xml_buff); - $validator = new validator($xml_file); - $validator->setcachedir('files/cache'); - $validator->getjspath(); + $validator = new Validator($xml_file); + $validator->setCacheDir('files/cache'); + $validator->getJsPath(); } /** diff --git a/modules/member/member.admin.view.php b/modules/member/member.admin.view.php index 701858080..86a4226f7 100644 --- a/modules/member/member.admin.view.php +++ b/modules/member/member.admin.view.php @@ -56,6 +56,7 @@ $config = $oMemberModel->getMemberConfig(); $memberIdentifiers = array('user_id'=>'user_id', 'user_name'=>'user_name', 'nick_name'=>'nick_name'); $usedIdentifiers = array(); + foreach($config->signupForm as $signupItem){ if (!count($memberIdentifiers)) break; if(in_array($signupItem->name, $memberIdentifiers) && ($signupItem->required || $signupItem->isUse)){ @@ -190,7 +191,9 @@ function _getMemberInputTag($memberInfo){ $oMemberModel = &getModel('member'); $extend_form_list = $oMemberModel->getCombineJoinForm($memberInfo); - $memberInfo = get_object_vars($memberInfo); + + if ($memberInfo) + $memberInfo = get_object_vars($memberInfo); $member_config = $oMemberModel->getMemberConfig(); $formTags = array(); global $lang; diff --git a/modules/member/member.class.php b/modules/member/member.class.php index 5a33f0782..3b6151204 100644 --- a/modules/member/member.class.php +++ b/modules/member/member.class.php @@ -56,14 +56,9 @@ global $lang; $oMemberModel = &getModel('member'); - - $extendItems = $oMemberModel->getJoinFormList(); - $identifier = 'email_address'; $items = array('user_id', 'password', 'user_name', 'nick_name', 'email_address', 'find_account_question', 'homepage', 'blog', 'birthday', 'signature', 'profile_image', 'image_name', 'image_mark'); $mustRequireds = array('email_address', 'nick_name','password', 'find_account_question'); - $orgRequireds = array('email_address', 'nick_name','password', 'find_account_question'); - $orgUse = array('email_address', 'nick_name', 'password', 'find_account_question'); $list_order = array(); foreach($items as $key){ unset($signupItem); @@ -72,8 +67,8 @@ $signupItem->title = $lang->{$key}; $signupItem->mustRequired = in_array($key, $mustRequireds); $signupItem->imageType = (strpos($key, 'image') !== false); - $signupItem->required = in_array($key, $orgRequireds); - $signupItem->isUse = ($config->{$key} == 'Y') || in_array($key, $orgUse); + $signupItem->required = $signupItem->mustRequired; + $signupItem->isUse = $signupItem->mustRequired; $signupItem->isIdentifier = ($key == $identifier); if ($signupItem->imageType){ $signupItem->max_width = $config->{$key.'_max_width'}; @@ -84,32 +79,21 @@ else $list_order[] = $signupItem; } - if (is_array($extendItems)){ - foreach($extendItems as $form_srl=>$item_info){ - unset($signupItem); - $signupItem->name = $item_info->column_name; - $signupItem->title = $item_info->column_title; - $signupItem->type = $item_info->column_type; - $signupItem->member_join_form_srl = $form_srl; - $signupItem->mustRequired = in_array($key, $mustRequireds); - $signupItem->required = ($item_info->required == 'Y'); - $signupItem->isUse = ($item_info->is_active == 'Y'); - $signupItem->description = $item_info->description; - if ($signupItem->imageType){ - $signupItem->max_width = $config->{$key.'_max_width'}; - $signupItem->max_height = $config->{$key.'_max_height'}; - } - $list_order[] = $signupItem; - } - } $args->signupForm = $list_order; $args->identifier = $identifier; $oModuleController->insertModuleConfig('member',$args); + // Create a member controller object $oMemberController = &getController('member'); $oMemberAdminController = &getAdminController('member'); + // Create Ruleset File + FileHandler::makeDir('./files/ruleset'); + $oMemberAdminController->_createSignupRuleset($args->signupForm); + $oMemberAdminController->_createLoginRuleset($args->identifier); + $oMemberAdminController->_createFindAccountByQuestion($args->identifier); + $groups = $oMemberModel->getGroups(); if(!count($groups)) { // Set an administrator, regular member(group1), and associate member(group2) @@ -202,6 +186,10 @@ // check signup form ordering info if (!$config->signupForm) return true; + if (!is_readable('./files/ruleset/insertMember.xml')) return true; + if (!is_readable('./files/ruleset/login.xml')) return true; + if (!is_readable('./files/ruleset/find_member_account_by_question.xml')) return true; + return false; } @@ -326,6 +314,16 @@ $output = $oModuleController->updateModuleConfig('member', $config); } + + FileHandler::makeDir('./files/ruleset'); + $oMemberAdminController = &getAdminController('member'); + if (!is_readable('./files/ruleset/insertMember.xml')) + $oMemberAdminController->_createSignupRuleset($config->signupForm); + if (!is_readable('./files/ruleset/login.xml')) + $oMemberAdminController->_createLoginRuleset($config->identifier); + if (!is_readable('./files/ruleset/find_member_account_by_question.xml')) + $oMemberAdminController->_createFindAccountByQuestion($config->identifier); + return new Object(0, 'success_updated'); } diff --git a/modules/member/member.controller.php b/modules/member/member.controller.php index 4cfda6023..08bb9b7a3 100644 --- a/modules/member/member.controller.php +++ b/modules/member/member.controller.php @@ -523,6 +523,15 @@ if (!$args->user_id) $args->user_id = 't'.$args->member_srl; if (!$args->user_name) $args->user_name = $args->member_srl; if (!$args->nick_name) $args->nick_name = $args->member_srl; + + // remove whitespace + $checkInfos = array('user_id', 'nick_name', 'email_address'); + $replaceStr = array("\r\n", "\r", "\n", " ", "\t", "\xC2\xAD"); + foreach($checkInfos as $val){ + if(isset($args->{$val})){ + $args->{$val} = str_replace($replaceStr, '', $args->{$val}); + } + } $output = $this->insertMember($args); if(!$output->toBool()) return $output; @@ -600,6 +609,15 @@ $args->extra_vars = serialize($extra_vars); // Create a member model object $oMemberModel = &getModel('member'); + + // remove whitespace + $checkInfos = array('user_id', 'nick_name', 'email_address'); + $replaceStr = array("\r\n", "\r", "\n", " ", "\t", "\xC2\xAD"); + foreach($checkInfos as $val){ + if(isset($args->{$val})){ + $args->{$val} = str_replace($replaceStr, '', $args->{$val}); + } + } // Execute insert or update depending on the value of member_srl $output = $this->updateMember($args); if(!$output->toBool()) return $output; diff --git a/modules/module/module.class.php b/modules/module/module.class.php index e95292470..af71a70ae 100644 --- a/modules/module/module.class.php +++ b/modules/module/module.class.php @@ -20,6 +20,7 @@ // Create a directory to use in the module module FileHandler::makeDir('./files/cache/module_info'); FileHandler::makeDir('./files/cache/triggers'); + FileHandler::makeDir('./files/ruleset'); // Insert site information into the sites table $args->site_srl = 0; $output = $oDB->executeQuery('module.getSite', $args); @@ -76,6 +77,8 @@ if(!$oDB->isColumnExists("module_config", "site_srl")) return true; + if(!is_dir('./files/ruleset')) return true; + return false; } @@ -311,6 +314,7 @@ if(!$oDB->isColumnExists("module_config", "site_srl")){ $oDB->addColumn('module_config', 'site_srl', 'number', 11, 0, true); } + FileHandler::makeDir('./files/ruleset'); return new Object(0, 'success_updated'); } From 1ada0a3c40abe86bcebfbc0798c5a52a7b5a8962 Mon Sep 17 00:00:00 2001 From: taggon Date: Thu, 6 Oct 2011 04:32:21 +0000 Subject: [PATCH 1036/1372] Add testcases for ignoring stylesheets and json git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9505 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- tests/classes/template/TemplateHandlerTest.class.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/classes/template/TemplateHandlerTest.class.php b/tests/classes/template/TemplateHandlerTest.class.php index a50331085..33db71086 100644 --- a/tests/classes/template/TemplateHandlerTest.class.php +++ b/tests/classes/template/TemplateHandlerTest.class.php @@ -164,6 +164,16 @@ class TemplateHandlerTest extends PHPUnit_Framework_TestCase 'logo', 'layout_info->logo_image){ ?>logo' ), + // error case - ignore stylesheets + array( + '', + '' + ), + // error case - ignore json + array( + '', + '' + ), // issue 103 array( '', From 3a895c23b200893b824e1a7aeeb488ab3ba21f62 Mon Sep 17 00:00:00 2001 From: flyskyko Date: Thu, 6 Oct 2011 05:13:55 +0000 Subject: [PATCH 1037/1372] issue 306, changed date format for jQuery datepicker git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9506 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/extravar/Extravar.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/extravar/Extravar.class.php b/classes/extravar/Extravar.class.php index 80a40776e..a6445cee0 100644 --- a/classes/extravar/Extravar.class.php +++ b/classes/extravar/Extravar.class.php @@ -258,7 +258,7 @@ '', '' ), + // error case - inline javascript + array( + '', + '
                                                  ' + ), // issue 103 array( '', - '' + '' ), // issue 135 array( From 98d168abc4f9b850b3275e8a35ceb1383cf5a5eb Mon Sep 17 00:00:00 2001 From: ovclas Date: Tue, 11 Oct 2011 01:06:37 +0000 Subject: [PATCH 1078/1372] issue 372 edit menu in site map, old menu info remains in edit form this bug fixed git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9548 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/menu/tpl/js/sitemap.js | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/modules/menu/tpl/js/sitemap.js b/modules/menu/tpl/js/sitemap.js index 5211aaf89..5d1a7daa3 100644 --- a/modules/menu/tpl/js/sitemap.js +++ b/modules/menu/tpl/js/sitemap.js @@ -21,6 +21,7 @@ $('form.siteMap') var menuUrl = null; $('a._edit').click(function(){ + resetEditForm(); var itemKey = $(this).parent().prevAll('._item_key').val(); menuSrl = $(this).parents().prevAll('input[name=menu_srl]').val(); menuForm = $('#menu_'+menuSrl); @@ -103,15 +104,14 @@ $('form.siteMap') var createModuleLayer = $('#createModule'); var selectModuleLayer = $('#selectModule'); var insertUrlLayer = $('#insertUrl'); - kindModuleLayer.hide(); - createModuleLayer.hide(); - selectModuleLayer.hide(); - insertUrlLayer.hide(); - $('a._add').click(function() + function resetEditForm() { - editForm.find('.h2').html('Add Menu'); - editForm.find('input[name=menu_srl]').val($(this).parents().prevAll('input[name=menu_srl]').val()); + kindModuleLayer.hide(); + createModuleLayer.hide() + selectModuleLayer.hide() + insertUrlLayer.hide() + editForm.find('input[name=menu_item_srl]').val(''); editForm.find('input[name=parent_srl]').val(0); editForm.find('input[name=menu_name]').val(''); @@ -121,6 +121,13 @@ $('form.siteMap') editForm.find('input=[name=menu_url]').val(''); editForm.find('input=[name=menu_open_window]')[0].checked = true; editForm.find('input=[name=group_srls\\[\\]]').attr('checked', false); + } + + $('a._add').click(function() + { + editForm.find('.h2').html('Add Menu'); + editForm.find('input[name=menu_srl]').val($(this).parents().prevAll('input[name=menu_srl]').val()); + resetEditForm(); }); $('input._typeCheck').click(typeCheck); From 64ca49bee0526a2fd20ade6e236275b7054d59a8 Mon Sep 17 00:00:00 2001 From: taggon Date: Tue, 11 Oct 2011 01:12:29 +0000 Subject: [PATCH 1079/1372] Fixed a template bug in PHP4 git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9549 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/template/TemplateHandler.class.php | 4 ++-- tests/classes/template/TemplateHandlerTest.class.php | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/classes/template/TemplateHandler.class.php b/classes/template/TemplateHandler.class.php index fa48f192a..e7bbcf1d9 100644 --- a/classes/template/TemplateHandler.class.php +++ b/classes/template/TemplateHandler.class.php @@ -417,7 +417,7 @@ if(!$fileDir) return ''; - return "compile('{$fileDir}','{$pathinfo['basename']}') ?>"; + return "compile('{$fileDir}','{$pathinfo['basename']}') ?>"; // case 'load_js_plugin': @@ -451,7 +451,7 @@ if($pathinfo['basename'] == 'lang.xml' && substr($pathinfo['dirname'],-5) == '/lang') { $result = "Context::loadLang('{$relativeDir}');"; } else { - $result = "require_once('./classes/xml/XmlJsFilter.class.php');\$__xmlFilter = new XmlJsFilter('{$relativeDir}','{$pathinfo['basename']}');\$__xmlFilter->compile();"; + $result = "require_once('./classes/xml/XmlJsFilter.class.php');\$__xmlFilter=new XmlJsFilter('{$relativeDir}','{$pathinfo['basename']}');\$__xmlFilter->compile();"; } break; case 'js': diff --git a/tests/classes/template/TemplateHandlerTest.class.php b/tests/classes/template/TemplateHandlerTest.class.php index 0497468cd..4a3bff8bc 100644 --- a/tests/classes/template/TemplateHandlerTest.class.php +++ b/tests/classes/template/TemplateHandlerTest.class.php @@ -102,12 +102,12 @@ class TemplateHandlerTest extends PHPUnit_Framework_TestCase // #include array( '
                                                  This is another dummy
                                                  ', - 'compile(\'tests/classes/template\',\'sample.html\') ?>
                                                  This is another dummy
                                                  ' + 'compile(\'tests/classes/template\',\'sample.html\') ?>
                                                  This is another dummy
                                                  ' ), // array( '
                                                  This is another dummy
                                                  ', - 'compile(\'tests/classes\',\'sample.html\') ?>
                                                  This is another dummy
                                                  ' + 'compile(\'tests/classes\',\'sample.html\') ?>
                                                  This is another dummy
                                                  ' ), // array( @@ -127,7 +127,7 @@ class TemplateHandlerTest extends PHPUnit_Framework_TestCase // array( '', - 'compile(); ?>' + 'compile(); ?>' ), // array( From 78613c0ce147c4819794a3dd351a1dcbbcd57840 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Tue, 11 Oct 2011 01:20:22 +0000 Subject: [PATCH 1080/1372] Admin account language UI fix. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9550 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/tpl/css/admin.css | 5 +++-- modules/admin/tpl/css/admin.min.css | 2 +- modules/admin/tpl/img/iconCheck.gif | Bin 0 -> 64 bytes 3 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 modules/admin/tpl/img/iconCheck.gif diff --git a/modules/admin/tpl/css/admin.css b/modules/admin/tpl/css/admin.css index d4d443f9a..9c3ecc653 100644 --- a/modules/admin/tpl/css/admin.css +++ b/modules/admin/tpl/css/admin.css @@ -265,9 +265,10 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */ .x .header .account li{position:relative;display:inline;border-left:1px solid #666;padding:0 6px 0 10px} .x .header .account li:first-child{border:0} .x .header .account a{color:#fff;display:inline-block;height:14px} -.x .header .account a.language{padding-right:2px} +.x .header .account a.language{padding-right:16px;background:url(/xe/modules/admin/tpl/img/iconArrow.gif) no-repeat right -160px} .x .header #language{position:absolute;top:19px;right:-2em;padding:6px 4px !important;border:1px solid #666;border-top:0;background:#333} -.x .header #language li{border:0;display:block;padding:1px 8px;text-align:left;line-height:1} +.x .header #language li{border:0;display:block;padding:1px 8px 1px 10px;text-align:left;line-height:1} +.x .header #language li.selected{background:url(/xe/modules/admin/tpl/img/iconCheck.gif) no-repeat left center} .x .header #language li.selected a{text-decoration:underline} .x .header h1 a:hover, .x .header h1 a:active, diff --git a/modules/admin/tpl/css/admin.min.css b/modules/admin/tpl/css/admin.min.css index 71c600360..df4129afb 100644 --- a/modules/admin/tpl/css/admin.min.css +++ b/modules/admin/tpl/css/admin.min.css @@ -1 +1 @@ -@charset "utf-8";/* NHN (developers@xpressengine.com) *//* Element Reset */body{margin:0}header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{display:block}body>.popup{margin:1em}.x,.x table,.x input,.x textarea,.x select,.x button{font-family:Tahoma,Geneva,sans-serif;font-size:12px;color:#333}.x button,.x input[type=submit],.x input[type=reset],.x input[type=button]{cursor:pointer;overflow:visible}.x img{border:0}.x p{line-height:1.5}/* Section & Heading */.x .section{margin:1em 0;padding:0;border:0}.x .h1, .x .h2, .x .h3, .x .h4{position:relative;border-bottom-style:solid;border-bottom-color:#ccc;zoom:1}.x .h1{border-bottom-width:4px;font-size:24px}.x .h2{border-bottom-width:3px;font-size:20px}.x .h3{border-bottom-width:2px;font-size:16px}.x .h4{border-bottom-width:1px;font-size:12px}/* Portlet */.x .portlet{position:relative;border:1px solid #e9e9e9;margin:1em 0;padding:0;background:#fff;zoom:1;overflow:hidden;border-radius:5px}.x .portlet h2, .x .portlet h3{margin:0;padding:.5em 1em;font-size:14px;border:1px solid #fff;border-bottom:1px solid #e9e9e9;background:#f7f7f7;border-radius:5px 5px 0 0}.x .portlet p{margin:1em 1.2em}.x .portlet li{position:relative;padding-right:8em}.x .portlet .lined{margin:1px;padding:0;list-style:none}.x .portlet .lined li{padding:.5em 8em .5em 1em;border-top:1px solid #eee;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis}.x .portlet .lined li:first-child{border:0}.x .portlet .side{position:absolute;top:0;_top:1px;right:0;color:#666;background:#fff;padding:0 1em}.x .portlet .lined .side{padding:.5em 1em}.x .portlet .more{position:absolute;top:.5em;right:1em;text-decoration:none !important;color:#666}.x .portlet .more span{color:#999}.x .portlet .action{text-align:right;top:0;right:0;padding:.5em 1em .5em 3em;background:#fff;background:-webkit-gradient(linear, 0% 0%, 100% 0%, from(rgba(255,255,255,0)), to(rgba(255,255,255,1)), color-stop(15%, #fff));background:-moz-linear-gradient(left, rgba(255,255,255,0) 0, rgba(255,255,255,1) 15%)}.x .portlet .action a,.x .portlet .action button{margin-left:1em}.x .portlet .btnArea{border-top:1px solid #ddd;margin:0;padding:.5em 1em;margin:0 1px 1px 1px;background:#f7f7f7;border-radius:0 0 5px 5px}/* Table */.x .table{margin:1em 0}.x .table table{width:100%;border:0;border-collapse:collapse;border-top:2px solid #ccc}.x .table caption{font-weight:bold;text-align:left;line-height:22px;padding:5px 0}.x .table caption:after{content:"";display:block;clear:both}.x .table caption a{font-weight:normal}.x .table caption em{float:right;margin-left:1em}.x .table caption strong{color:#e00}.x .table caption .side{float:right;font-weight:normal;margin-left:1em}.x .table th,.x .table td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd;white-space:nowrap}.x .table th{background:#f8f8f8}.x .table thead th{border-bottom:1px solid #999}.x .table tfoot td{font-weight:bold;background:#f8f8f8}.x .table.even tbody tr:nth-of-type(even) td{background-color:#fafafa}.x .table td>input[type=text]{margin:-1px 0 -3px 0 !important;vertical-align:middle}.x .table img{vertical-align:middle}.x .table em{font-style:normal;font-weight:normal;color:#e00}.x .table .title,.x .table .text{white-space:normal}/* Form */.x .form{margin:1em 0;padding:0}.x .form fieldset{margin:0 0 2em 0;padding:0;border:0}.x .form em{font-style:normal;color:#e00}.x .form label{margin-right:1em;line-height:1;vertical-align:middle}.x .form input[type=checkbox]+label,.x .form input[type=radio]+label,.x .form input[type=file]{cursor:pointer}.x .form ul{position:relative;margin:0;padding:0;list-style:none;border-top:2px solid #ccc;border-bottom:1px solid #ccc;zoom:1}.x .form li{list-style:none;border:1px solid #ddd;border-left:0;border-right:0;margin:-1px 0;padding:8px 0;vertical-align:top;zoom:1}.x .form li:first-child{border-top:0}.x .form li>label:first-child{display:block;font-weight:bold}.x .form li label em{font-weight:normal}.x .form label.overlap{position:absolute;color:#aaa}.x .form input[type=text],.x .form input[type=password],.x .form input[type=file],.x .form textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:transparent}.x .form input[type=text],.x .form input[type=password],.x .form input[type=file]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px}.x .form input[type=text].loading,.x .form input.loading[type=password]{padding-right:24px;width:260px;background:transparent url(../img/preLoader16.gif) no-repeat 265px center}.x .form input[type=checkbox],.x .form input[type=radio]{margin:0;padding:0;width:13px;height:13px;vertical-align:middle}.x .form input[type=text][disabled=disabled],.x .form input[type=password][disabled=disabled],.x .form input[type=checkbox][disabled=disabled],.x .form input[type=radio][disabled=disabled],.x .form input[type=file][disabled=disabled],.x .form textarea[disabled=disabled],.x .form select[disabled=disabled]{background:#ddd !important;text-shadow:1px 1px 0 #fff}.x .form textarea{padding:3px 4px;vertical-align:top}.x .form span.desc, .x .form em.desc{line-height:22px;vertical-align:middle;margin:0 10px}.x .form p.desc{margin:.25em 0;line-height:1.4}.x .form .q{font-weight:bold;margin:0 0 5px 0}.x .form .a{margin:0 0 5px 0}.x .form .tgForm{margin-right:1em}.x .form .h1 + ul,.x .form .h2 + ul,.x .form .h3 + ul,.x .form .h4 + ul{border-top:0}/* Global Navigation Bar */.x .gnb{position:relative;clear:both;border:1px solid #c1c1c1;border-left:0;border-right:0;background-color:#efefef;background:#efefef -webkit-gradient(linear, 0% 0%, 0% 100%, from(#efefef), to(#dcdcdc));background:#efefef -moz-linear-gradient(top, #efefef, #dcdcdc);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#efefef, endColorStr=#dcdcdc);zoom:1}.x .gnb ul{margin:0;padding:0 0 0 2em;list-style:none;border:1px solid #fff;border-left:0;border-right:0;zoom:1}.x .gnb ul ul{position:absolute;top:30px;left:0;border:1px solid #ccc;border-top:0;padding:1px 0 0 0;background:#fff}.x .gnb ul:after{content:"";display:block;clear:both}.x .gnb li{position:relative;float:left;border:1px solid #fff;border-top:0;border-bottom:0;margin:0 -1px 0 0}.x .gnb li li{float:none;clear:both;overflow:hidden;border:0;border-top:1px dotted #ccc;margin:0;padding:2px}.x .gnb li li:first-child{border:0}.x .gnb li a{float:left;font-weight:bold;color:#333;font-size:12px;padding:8px 18px;white-space:nowrap;text-decoration:none;text-shadow:0 1px 0 #fff;zoom:1}.x .gnb li a:hover,.x .gnb li a:active,.x .gnb li a:focus,.x .gnb li.active a{background:#f4f4f4;border:1px solid #ccc;border-bottom:0;padding:7px 17px 8px 17px}.x .gnb li.activeOn a{background:#fff;border:1px solid #ccc;border-bottom:0;padding:7px 17px 8px 17px}.x .gnb li.active li a{display:block;float:none;color:#555;background:#fff;padding:5px 15px !important;font-weight:normal !important;border:0 !important}.x .gnb li.active li a:hover,.x .gnb li.active li a:active,.x .gnb li.active li a:focus{border:0;background:#eee}.x .gnb .setting{position:absolute;top:8px;right:2em;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;background:url(../img/iconSetting.gif) no-repeat center}.x .gnb.jx ul{display:block;position:static;padding:0}.x .gnb.jx li{float:none;clear:both;border-top:1px solid #ccc}.x .gnb.jx ul ul{border:0}.x .gnb.jx li li{border:0}.x .gnb.jx li a{float:none;display:block}.x .gnb.jx li a:hover,.x .gnb.jx li a:active,.x .gnb.jx li a:focus{background:none}.x .gnb.jx li.activeOn>a{background:#ddd}@media only all and (max-width:860px){.x .gnb ul{padding-left:1em}.x .gnb .setting{right:1em}}@media only all and (max-width:640px){.x .gnb ul{display:block;position:static;padding:0}.x .gnb li{float:none;clear:both;border-top:1px solid #ccc}.x .gnb ul ul{border:0;position:static}.x .gnb li li{border:0}.x .gnb li a{float:none;display:block}.x .gnb li a:hover,.x .gnb li a:active,.x .gnb li a:focus{background:none}.x .gnb li.activeOn>a{background:#ddd}}/* Local Navigation */.x .lnb{position:relative;float:left;width:200px;margin:1em 0 1em -230px;line-height:normal;zoom:1;display:inline}.x .lnb .h2{margin-top:0}.x .lnb ul{margin:0;padding:0;list-style:none}.x .lnb li{position:relative;margin:0 0 -1px 0;vertical-align:top;zoom:1}.x .lnb li a{display:block;position:relative;padding:8px 10px;text-decoration:none;color:#666;font-weight:bold;background:#fafafa;border:1px solid #eee;zoom:1}.x .lnb li a .i{position:absolute;top:50%;left:100%;margin:-4px 0 0 -16px;width:8px;height:8px;color:#ccc;background:url(../img/iconNavVr.gif) no-repeat left top}.x .lnb li ul{padding:5px 0;background:#fff}.x .lnb li li{margin:0;border-top:1px dotted #ddd}.x .lnb li li:first-child{border:0}.x .lnb li li a{font-weight:normal;background:#fff;padding:5px 10px;border:0}.x .lnb li li a span{color:#666}.x .lnb li.active{border:1px solid #ccc;z-index:2}.x .lnb li li.active{border:0}.x .lnb li.active a{color:#000;border:0}.x .lnb li.active .i{background-position:0 -44px}.x .lnb li.active li a{border:0}.x .lnb li.active ul{display:block;border-top:1px solid #eee}.x .lnb li.active li.active a span{color:#13b200;font-weight:bold;letter-spacing:-1px}/* Content Navigation */.x .cnb{margin:1em 0;position:relative;zoom:1}.x .cnb:after{content:"";display:block;clear:both}.x .cnb ul{list-style:none;margin:0;padding:0}.x .cnb li{display:inline}.x .cnb li:before{content:"| ";color:#ccc}.x .cnb li:first-child:before{content:"";}.x .cnb .active,.x .cnb .active a{font-weight:bold;color:#333;text-decoration:none}.x .cnb .side{float:right}/* Pagination */.x .pagination{margin:1em 0;text-align:center;line-height:normal}.x .pagination *{vertical-align:middle}.x .pagination a,.x .pagination strong{position:relative;display:inline-block;padding:2px 4px;font-weight:bold;text-decoration:none;line-height:normal;color:#333 !important;vertical-align:middle}.x .pagination a:hover,.x .pagination a:active,.x .pagination a:focus{border:1px solid #ddd;margin:0 -1px}.x .pagination strong{color:#e00 !important;font-size:20px}.x .pagination .direction{font-weight:normal;white-space:nowrap}.x .pagination .direction:hover,.x .pagination .direction:active,.x .pagination .direction:focus{border:0;margin:0;text-decoration:underline}.x .pagination input{width:30px;text-align:center}.x .pagination button{overflow:visible}/* Star Rating */.x .starRating, .x .starRating span{display:inline-block;height:14px;background:transparent url(../img/iconStarRating.gif) no-repeat;overflow:hidden}.x .starRating{width:79px;vertical-align:top}.x .starRating span{font-size:0;line-height:0;vertical-align:top;text-indent:-100px;*text-indent:0;background-position:0 -14px}/* Progress */.x .prgrs{white-space:nowrap;line-height:normal;vertical-align:middle}.x .prgrs *{vertical-align:middle}.x .prgrs .pBar{position:relative;display:inline-block;background:#e9e9e9;margin:0 5px 0 0}.x .prgrs .pAction{display:inline-block;vertical-align:top;background:#99a6b6}.x .prgrs .pNum{position:absolute;width:100%;left:0;top:0;text-align:center;text-shadow:1px 1px 0 #fff}.x .prgrs.prgrsSmall{font-size:14px;line-height:14px}.x .prgrs.prgrsSmall .pBar,.x .prgrs.prgrsSmall .pAction,.x .prgrs.prgrsSmall .pNum{height:16px;line-height:16px;font-size:11px}.x .prgrs.prgrsMedium{font-size:24px;line-height:24px}.x .prgrs.prgrsMedium .pBar,.x .prgrs.prgrsMedium .pAction,.x .prgrs.prgrsMedium .pNum{height:22px;line-height:22px;font-size:12px}.x .prgrs.prgrsLarge{font-size:38px;line-height:38px}.x .prgrs.prgrsLarge .pBar,.x .prgrs.prgrsLarge .pAction,.x .prgrs.prgrsLarge .pNum{height:34px;line-height:34px;font-size:14px}/* Modal Window */.modal{position:absolute;top:0;left:0;width:100%;_height:100%;min-height:100%;z-index:100}.modal .bg{position:absolute;background:#000;_background:none;width:100%;height:100%;opacity:.5;z-index:2;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1}.modal .fg{position:relative;width:80%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:3;zoom:1;border-radius:5px;box-shadow:0 0 6px #000}.modal ul, .modal ol, .modal .lined, .modal .table{margin-bottom:1em}.modal .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1}.modalClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px}.modalBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}html.modalContainer,body.modalContainer{_height:100%;_width:100%} /* IE6 only */ /* Layer */.x .layer,.x.layer{position:absolute;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:2;zoom:1;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5pxbox-shadow:0 0 6px #666;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x .layer h2{font-size:14px}.x .layer ul, .x .layer ol, .x .layer .lined, .x .layer .table{margin-bottom:1em}.x .layerClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px}.x .layerBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}/* H2 Anchor */.x .h2Anchor{position:absolute;right:0;border:0;background:none;color:#00f;text-decoration:underline}/* Skip Navigation */.x .skipNav{margin:0;text-align:center;overflow:hidden}.x .skipNav a{position:absolute;width:1px;height:1px;display:block;color:#fff;font-weight:bold;padding:10px 0;background:#333;border-top:1px solid #656565}.x .skipNav a:hover,.x .skipNav a:active,.x .skipNav a:focus{position:relative;width:auto;height:auto}/* Header */.x .header{position:relative;z-index:2;padding:30px 0 0 0;background:#4c4c4c;box-shadow:0 0 10px #aaa;zoom:1}.x .header:after{content:"";display:block;clear:both}.x .header a{text-decoration:none}.x .header h1{margin:0 100px 10px 1.3em;font-size:24px;line-height:32px}.x .header h1 *{vertical-align:middle}.x .header h1 a{color:#fff;text-shadow:1px 1px 0 #000;filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=1, OffY=1, Color=#000000, Positive=true);zoom:1}.x .header h1 .url{font-size:12px;font-weight:normal}.x .header #moveSiteList{padding:10px 1em 5px 1em;margin:0}.x .header #moveSiteList ul{list-style:none;margin:0;padding:0}.x .header #moveSiteList li{white-space:nowrap;margin:0;padding:4px 0;border-bottom:1px dotted #ccc}.x .header #siteMapList{padding:0 1em 1em 1em;margin:0}.x .header #siteMapList li{white-space:nowrap}.x .header .account{position:absolute;z-index:3;width:100%;padding:5px 2em 5px 0;top:0;right:0;white-space:nowrap;text-align:right;background:#333;border-bottom:1px solid #656565;color:#fff;font-size:12px;box-shadow:0 0 10px #333}.x .header .account ul{margin:0 2px 0 0;padding:0;list-style:none}.x .header .account li{position:relative;display:inline;border-left:1px solid #666;padding:0 6px 0 10px}.x .header .account li:first-child{border:0}.x .header .account a{color:#fff;display:inline-block;height:14px}.x .header .account a.language{padding-right:2px}.x .header #language{position:absolute;top:19px;right:-2em;padding:6px 4px !important;border:1px solid #666;border-top:0;background:#333}.x .header #language li{border:0;display:block;padding:1px 8px;text-align:left;line-height:1}.x .header #language li.selected a{text-decoration:underline}.x .header h1 a:hover,.x .header h1 a:active,.x .header h1 a:focus,.x .header .account a:hover,.x .header .account a:active,.x .header .account a:focus{color:#6e9cf2;text-decoration:underline}/* Footer */.x .footer{border-top:1px solid #ddd;text-align:center;font-size:12px;padding:1.5em 0;margin:0 2em;zoom:1}.x .footer:after{content:"";display:block;clear:both}.x .footer p{margin:0}.x .footer .power{float:left}.x .footer .cache{float:right}/* Body */.x .body{position:relative;z-index:1;padding:1em 2em 1em 260px;zoom:1}.x .body:after{content:"";display:block;clear:both}/* Content */.x .content{float:right;width:100%;margin-left:-230px;zoom:1}.x .content:after{content:"";display:block;clear:both}.x .content a{color:#33a}.x .content a:hover,.x .content a:active,.x .content a:focus{color:#a33}.x .content .portlet a{text-decoration:none}.x .content .portlet a:hover,.x .content .portlet a:active,.x .content .portlet a:focus{text-decoration:underline}/* Dashboard */.x .dashboard{position:relative;float:none;width:auto;margin-left:-230px}.x .dashboard .portlet{float:left;width:48%;margin-right:1em}.x .dashboard .portlet:nth-of-type(odd){float:left;width:49%;margin-right:0}.x .dashboard .portlet:nth-of-type(even){float:right;width:49%;margin-right:0}/* Single Column*/.x .single{position:relative;float:none;width:auto;margin-left:-230px}/* Search */.x .search{zoom:1}.x .search:after{content:"";display:block;clear:both}.x .search .pagination{float:left;text-align:left}.x .search form{float:right;margin:1em 0}.x .search form *{vertical-align:middle}/* Site Map */.x .siteMap h2 input{font-size:14px;font-weight:bold;padding:0 .5em}.x .siteMap label{cursor:text}.x .siteMap .lined ul{padding:0;margin:0;border-top:1px solid #eee;zoom:1}.x .siteMap .lined li{position:relative;padding:0;margin:0;cursor:all-scroll;list-style:none;zoom:1}.x .siteMap .lined li li{border-top:1px solid #eee}.x .siteMap li li{text-indent:18px}.x .siteMap li li li{text-indent:36px}.x .siteMap li li li li{text-indent:54px}.x .siteMap li li li li li{text-indent:72px}.x .siteMap li li li li li li{text-indent:90px}.x .siteMap li li li li li li li{text-indent:108px}.x .siteMap li li li li li li li li{text-indent:126px}.x .siteMap li li li li li li li li li{text-indent:144px}.x .siteMap li li li li li li li li li li{text-indent:162px}.x .siteMap li li li li li li li li li li li{text-indent:180px}.x .siteMap li li li li li li li li li li li li{text-indent:198px}.x .siteMap li *{vertical-align:middle}.x .siteMap li .moveTo+input{width:200px;border:0;padding:0 .5em}.x .siteMap li .moveTo+input:hover,.x .siteMap li .moveTo+input:active,.x .siteMap li .moveTo+input:focus{border:1px dotted #ccc;overflow:visible}.x .siteMap .moveTo{position:relative;z-index:2;width:22px;height:32px;padding:32px 0 0 0;margin:0 3px;_margin-top:-1px;overflow:hidden;background:#fff url(../img/iconMoveTo.gif) no-repeat center 0;border:0;cursor:move}.x .siteMap li.active,.x .siteMap li.active .moveTo{background-color:#f7f7f7}.x .siteMap li.active li,.x .siteMap li.active ul{border-top-color:#f7f7f7}.x .siteMap li.active .moveTo{background-position:center -32px}.x .siteMap .vr,.x .siteMap .hr{display:none;position:absolute;z-index:1;left:14px;border:0px solid #ccc;overflow:hidden}.x .siteMap .vr{top:-16px;height:100%;border-left-width:1px}.x .siteMap .hr{top:16px;width:16px;border-top-width:1px}.x .siteMap li.active .vr,.x .siteMap li.active li .hr{display:block}.x .siteMap li li .vr,.x .siteMap li li li .hr{left:32px}.x .siteMap li li li .vr,.x .siteMap li li li li .hr{left:50px}.x .siteMap li li li li .vr,.x .siteMap li li li li li .hr{left:68px}.x .siteMap li li li li li .vr,.x .siteMap li li li li li li .hr{left:86px}.x .siteMap li li li li li li .vr,.x .siteMap li li li li li li li .hr{left:104px}.x .siteMap li li li li li li li .vr,.x .siteMap li li li li li li li li .hr{left:122px}.x .siteMap li li li li li li li li .vr,.x .siteMap li li li li li li li li li .hr{left:140px}.x .siteMap li li li li li li li li li .vr,.x .siteMap li li li li li li li li li li .hr{left:158px}.x .siteMap li li li li li li li li li li .vr,.x .siteMap li li li li li li li li li li li .hr{left:176px}.x .siteMap li li li li li li li li li li li .vr,.x .siteMap li li li li li li li li li li li li .hr{left:336px}.x .siteMap .side{padding-top:0 !important;padding-bottom:0 !important;line-height:30px;background:transparent !important}.x .siteMap .side button{text-indent:0;line-height:1}.x .siteMap .tgMap{position:absolute;top:12px;right:1em;padding:0 16px 0 0;line-height:16px;background:url(../img/iconArrow.gif) no-repeat right -126px}.x .siteMap.fold .tgMap{background-position:right -158px}.x .siteMap.fold .h2{border-bottom-color:#fff;border-radius:5px}.x .siteMap .placeholder{background:#bbb}.x .siteMap .draggable,.x .siteMap .draggable .moveTo{background-color:#ddd}.x .siteMap .draggable .summary{border-left:1px solid #ccc;padding-left:10px;margin-left:10px;font-size:11px;color:#999}.x .siteMap a.ms{text-decoration:underline}/* Multilingual */.x .langEdit{background:#fff;position:absolute;*left:0;*margin-top:28px;z-index:10}.x .langEdit ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0}.x .langEdit li{padding:.5em 10px}.x .langEdit input[type=text]{width:220px;padding-right:40px}.x .langEdit label{left:15px !important}.x .langEdit .action{border:1px solid #eee;width:268px;padding:0 10px}.x .langEdit p, .x .langEdit .btnArea{white-space:normal}.x .langEdit .langList,.x .langEdit .langEditControls{box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x .langEdit .langList{margin:0 -1px 0 0;display:none}.x .langEdit .langList li{white-space:nowrap;color:#ccc;width:270px} .x .langEdit .langList li span{display:inline-block;width:80px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:#767676}.x .langEdit .langList li a{display:inline-block;width:80px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.x .langEdit .langList li.active{background:url(../img/iconArrow.gif) no-repeat right -188px}.x .langEdit.showChild .langList{display:block}.x .langEdit .langInput{background:#fff}.x .langEdit .langInput h2{padding:5px 10px;margin:0 0 -1px 0;font-size:12px;font-weight:normal;color:#666;border:1px solid #eee;border-top-color:#ccc}.x .langEdit .langInput h2 strong{color:#000;font-size:14px}.x .langEdit.showChild .langInput{position:absolute;left:285px;top:0}.x .langEdit li.en input, .x .langEdit li.en textarea, .x .mLangEdit li.en textarea{background:url(../img/flag.us.gif) no-repeat 99% 5px}.x .langEdit li.ko input, .x .langEdit li.ko textarea, .x .mLangEdit li.ko textarea{background:url(../img/flag.kr.gif) no-repeat 99% 5px}.x .langEdit li.jp input, .x .langEdit li.jp textarea, .x .mLangEdit li.jp textarea{background:url(../img/flag.jp.gif) no-repeat 99% 5px}.x .langEdit li.fr input, .x .langEdit li.fr textarea, .x .mLangEdit li.fr textarea{background:url(../img/flag.fr.gif) no-repeat 99% 5px}.x .langEdit li.de input, .x .langEdit li.de textarea, .x .mLangEdit li.de textarea{background:url(../img/flag.de.gif) no-repeat 99% 5px}.x .langEdit li.ru input, .x .langEdit li.ru textarea, .x .mLangEdit li.ru textarea{background:url(../img/flag.ru.gif) no-repeat 99% 5px}.x .langEdit li.es input, .x .langEdit li.es textarea, .x .mLangEdit li.es textarea{background:url(../img/flag.es.gif) no-repeat 99% 5px}.x .langEdit li.tr input, .x .langEdit li.tr textarea, .x .mLangEdit li.tr textarea{background:url(../img/flag.tr.gif) no-repeat 99% 5px}.x .langEdit li.vi input, .x .langEdit li.vi textarea, .x .mLangEdit li.vi textarea{background:url(../img/flag.vn.gif) no-repeat 99% 5px}.x .langEdit li.mn input, .x .langEdit li.mn textarea, .x .mLangEdit li.mn textarea{background:url(../img/flag.mn.gif) no-repeat 99% 5px}.x .langEdit li.zh-CN input, .x .langEdit li.zh-CN textarea, .x .mLangEdit li.zh-CN textarea, .x .langEdit li.zh-TW input, .x .langEdit li.zh-TW textarea, .x .mLangEdit li.zh-TW textarea{background:url(../img/flag.cn.gif) no-repeat 99% 5px}.x .mLangEdit.en strong{background:url(../img/flag.us.gif) no-repeat 0 10px}.x .mLangEdit.ko strong{background:url(../img/flag.kr.gif) no-repeat 0 10px}.x .mLangEdit.jp strong{background:url(../img/flag.jp.gif) no-repeat 0 10px}.x .mLangEdit.fr strong{background:url(../img/flag.fr.gif) no-repeat 0 10px}.x .mLangEdit.de strong{background:url(../img/flag.de.gif) no-repeat 0 10px}.x .mLangEdit.ru strong{background:url(../img/flag.ru.gif) no-repeat 0 10px}.x .mLangEdit.es strong{background:url(../img/flag.es.gif) no-repeat 0 10px}.x .mLangEdit.tr strong{background:url(../img/flag.tr.gif) no-repeat 0 10px}.x .mLangEdit.vi strong{background:url(../img/flag.vn.gif) no-repeat 0 10px}.x .mLangEdit.mn strong{background:url(../img/flag.mn.gif) no-repeat 0 10px}.x .mLangEdit.zh-CN strong, .x .mLangEdit.zh-TW strong{background:url(../img/flag.cn.gif) no-repeat 0 10px}.x .mLangEdit ul ul{border:0}.x .mLangEdit li{position:relative;padding:0}.x .mLangEdit li strong{display:inline-block;padding:6px 100px 8px 24px;font-weight:normal;line-height:1.5}.x .mLangEdit li .side{position:absolute;top:8px;right:0;padding-right:18px;background:url(../img/iconArrow.gif) no-repeat right -160px}.x .mLangEdit li li{border:0;padding-right:36px}.x .mLangEdit li textarea{width:100%;height:16px;padding-right:30px;resize:vertical;line-height:1.4}.x .mLangEdit li label{top:8px !important}.x .mLangEdit li.active{background:#FFFDEF}.x .mLangEdit li.active strong{font-weight:bold}.x .mLangEdit li.active .side{background-position:right -128px}.modal .mLangEdit ul{padding-bottom:1em}.modal .mLangEdit li{border:0;padding-right:36px}/* Suggestion */.x .suggestion{display:none;position:absolute;background:#fff;z-index:10;_height:200px;max-height:200px;overflow:auto;*left:0;*margin-top:28px;box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x .suggestion ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0}.x .suggestion li{padding:0}.x .suggestion li:last-child{border-bottom:0}.x .suggestion li button{border:0;background:#fff;text-align:left;width:288px;padding:2px 4px;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.x .suggestion li button:hover,.x .suggestion li button:active,.x .suggestion li button:focus,.x .suggestion li button.active{background:#eee}/* Image Mark */.x #imageMark{right:0}/* Easy Installer */.x .easyNav{position:relative;border:1px solid #e9e9e9;zoom:1}.x .easyNav:after{content:"";display:block;clear:both}.x .easyNav h2{font-size:16px}.x .easyNav .category{width:30%;float:left;margin:0 2em;display:inline}.x .easyNav .filter{position:absolute;top:0;right:0;margin:1em 2em;text-align:right}.x .easyList td p{margin-top:0}.x .easyList td p.update{background:#ffc;padding:.5em 1em;border:1px solid #fc9;border-left:0;border-right:0;text-align:center}/* Font Preview */.x .fontPreview{width:96%;border:1px solid #e9e9e9;zoom:1;padding:1em 2em;margin:.5em 0}/* FTP Suggestion */.x #ftpSuggestion{background:#fff;box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x #ftpSuggestion ul{border-left:1px solid #eee;border-right:1px solid #eee}.x #ftpSuggestion li{padding:0}.x #ftpSuggestion li button{border:0;background:#fff;text-align:left;width:288px}.x #ftpSuggestion li button:hover,.x #ftpSuggestion li button:active,.x #ftpSuggestion li button:focus{background:#eee}/* Theme & Skin Preview */.x .thumbPreview li{position:relative;padding-left:10px;padding-right:10px}.x .thumbPreview li.active.highlight{background:#f9f9f9}.x .thumbPreview .prevToggle{position:absolute;top:8px;right:10px;line-height:16px;padding:0 18px 0 0;text-decoration:none;background:url(../img/iconArrow.gif) no-repeat right -32px}.x .thumbPreview li.active .prevToggle{background-position:right 0}.x .thumbPreview .a{border:0;margin:0;zoom:1}.x .thumbPreview .a:after{content:"";display:block;clear:both}.x .thumbPreview .i{float:left;vertical-align:top;margin:0 1em 1em 0;padding:0;border:0;zoom:1}.x .thumbPreview .i:after{content:"";display:block;clear:both}.x .thumbPreview .i .thumb{position:relative;width:124px;height:84px;padding:0;margin-bottom:3px;text-align:center;overflow:hidden;border:1px solid #ddd;display:block;cursor:pointer;background:#fff}.x .thumbPreview .i .thumb .frame{position:absolute;width:120px;height:80px;left:0;top:0;border:2px solid #fff;overflow:hidden}.x .thumbPreview .i .thumb img{width:120px;margin:0}.x .thumbPreview .i label{display:block;position:relative;top:0;left:2px;width:122px;height:1.1em;margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x .thumbPreview .i input{display:none}.x .thumbPreview .i ul{display:none}.x .thumbPreview .selected .i{display:block;float:none}.x .thumbPreview .selected .i .thumb{float:left;width:186px;height:126px;margin:0 1em 0 0;border:2px solid #eee}.x .thumbPreview .selected .i .thumb .frame{width:180px;height:120px;border-width:3px}.x .thumbPreview li.active.highlight .selected .i .thumb{border-color:#5ea8f6}.x .thumbPreview .selected .i .thumb img{width:180px;position:relative}.x .thumbPreview li.active .selected .i .thumb img{z-index:auto}.x .thumbPreview .selected .i label{cursor:text}.x .thumbPreview .selected .i ul{display:block;list-style:none;border:0;margin:1em 0 1em 200px}.x .thumbPreview .selected .i li{border:0;padding:0;margin:0 0 .2em 0}.x .thumbPreview.jx .i label{display:inline;width:auto}.x .thumbPreview.jx .i.noDirection{display:none}.x .thumbPreview.jx .i input{display:inline}.x #skin .showAll{float:right;border:0;overflow:visible;padding:0 18px 0 0;cursor:pointer;color:#00f;background:url(../img/iconArrow.gif) no-repeat right -32px}.x #skin .showAll.hideAll{background-position:right 0}/* Favorite On | Off */.x .fvOff,.x .fvOn{display:inline-block;width:16px;height:16px;overflow:hidden;text-indent:16px;background:url(../img/iconFavorite.gif) no-repeat}.x .fvOn{background-position:0 -16px}/* Up-Down Dragable */.x .uDrag .wrap{position:relative;padding-left:20px}.x .uDrag li>.wrap{margin:0 0 0 8px}.x .uDrag .dragActive{background:#FFD}.x .uDrag .dragActive th,.x .uDrag .dragActive td{background:none !important}.x .uDrag .dragBtn{position:absolute;width:8px;height:100%;padding:0;overflow:hidden;background:url(../img/bgDragable.gif);top:1px;left:0;text-indent:12px;border:0;cursor:n-resize;white-space:nowrap}/* Favicon Preview */.x .faviconPreview{position:relative;padding:60px 0 0 200px;background:url(../img/bgFavicon.gif) no-repeat}.x .faviconPreview img{position:absolute}.x .faviconPreview .fn1{top:30px;left:12px}.x .faviconPreview .fn2{top:55px;left:68px}/* Mobile Icon Preview */.x .mobiconPreview{position:relative;padding:252px 0 0 200px;background:url(../img/bgMobileTop.png) no-repeat}.x .mobiconPreview img{position:absolute;top:20px;left:10px}.x .mobiconPreview span{position:absolute;width:32px;text-align:center;top:52px;left:10px;color:#fff;font-size:9px}/* Text List */.x .textList{border:1px solid #ddd !important;line-height:1.5em;height:18.5em;overflow:auto}.x .textList li{border:0;padding:.25em 1em;height:1.5em;white-space:nowrap;overflow:hidden}.x .textList li:nth-child(even){background:#eee}.x .textList li a{float:right}/* File Box */.x .fileBox li{position:relative}.x .fileBox li img{max-width:100%}.x .fileBox .portlet ul{margin:1em;list-style:none;padding:0;border:0}.x .fileBox .portlet li{border-top:1px solid #ddd;border-bottom:0;padding:8px 0}.x .fileBox .side{position:absolute;top:8px;right:0}/* Messages */.x .desc.error{color:#f00}.x .desc.success{color:#080}/* Icon Button */.x a.iSetting{display:inline-block;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;vertical-align:middle;background:url(../img/iconSetting.gif) no-repeat}.x a.cMenu{display:inline-block;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;vertical-align:middle;background:url(../../../../common/img/icon.bubble.png) no-repeat}/* Responsive Layout */@media only all and (max-width:860px){.x .header h1{margin-left:.7em}.x .header .account{padding-right:1em}.x .body{padding:1em}.x .content{float:none;margin-left:0}.x .lnb{float:none;width:auto;margin:1em 0}.x .dashboard .portlet{float:none !important;width:auto !important;margin-right:0}.modal .fg,.wfsr .fg{width:auto}.x .easyNav .category{float:none;display:block;width:auto}.x .easyNav .filter{position:static}}@media only all and (max-width:640px){.x .skipNav a{position:relative;width:auto;height:auto}.modal{position:absolute}}/* Legacy Code (Don't use it. It will be removed as soon as possible.) */.x h3.xeAdmin,.x h4.xeAdmin{position:relative;border-bottom-style:solid;border-bottom-color:#ccc;zoom:1}.x h3.xeAdmin{border-bottom-width:4px;font-size:24px}.x h4.xeAdmin{border-bottom-width:3px;font-size:20px}.x h5.xeAdmin{border-bottom-width:2px;font-size:16px}.x h6.xeAdmin{border-bottom-width:1px;font-size:12px}.x .adminSearch{margin:1em 0}.x .adminSearch fieldset{border:1px solid #ccc}.x .localNavigation{padding:0;list-style:none}.x .localNavigation li{display:inline}.x .localNavigation li.on a{font-weight:bold;color:#333;text-decoration:none}.x .localNavigation li:before{content:"| "}.x .localNavigation li:first-child:before{content:""}.x .summary{margin:1em 0}.x .rowTable,.x .colTable,.x .crossTable{margin:1em 0;border:0;border-collapse:collapse;border-top:2px solid #ccc;width:100%}.x .rowTable caption,.x .colTable caption,.x .crossTable caption{font-weight:bold;text-align:left;line-height:22px;padding:5px 0}.x .rowTable caption:after,.x .colTable caption:after,.x .crossTable caption:after{content:"";display:block;clear:both}.x .rowTable caption a,.x .colTable caption a,.x .crossTable caption a{font-weight:normal}.x .rowTable caption em,.x .colTable caption em,.x .crossTable caption em{float:right;font-style:normal;font-weight:normal;color:#e00;margin-left:1em}.x .rowTable caption strong,.x .colTable caption strong,.x .crossTable caption strong{color:#e00}.x .rowTable caption .side,.x .colTable caption .side,.x .crossTable caption .side{float:right;font-weight:normal;margin-left:1em}.x .rowTable th,.rowTable td,.x .colTable th,.rowTable td,.x .crossTable th,.rowTable td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd;white-space:nowrap}.x .rowTable th,.x .colTable th,.x .crossTable th{background:#f8f8f8}.x .rowTable thead th,.x .colTable thead th,.x .crossTable thead th{border-bottom:1px solid #999}.x .rowTable tfoot td,.x .colTable tfoot td,.x .crossTable tfoot td{font-weight:bold;background:#f8f8f8}.x .rowTable.even tbody tr:nth-of-type(even) td,.x .colTable.even tbody tr:nth-of-type(even) td,.x .crossTable.even tbody tr:nth-of-type(even) td{background-color:#fafafa}.x .rowTable td>input[type=text],.x .colTable td>input[type=text],.x .crossTable td>input[type=text]{margin:-1px 0 -3px 0 !important;vertical-align:middle}.x .rowTable img,.x .colTable img,.x .crossTable img{vertical-align:middle}.x .rowTable .title,.x .colTable .title,.x .crossTable .title,.x .rowTable .text,.x .colTable .text,.x .crossTable .text{white-space:normal}.x .rowTable input[type=text],.x .colTable input[type=text],.x .crossTable input[type=text],.x .rowTable input[type=password],.x .colTable input[type=password],.x .crossTable input[type=password],.x .rowTable input[type=file],.x .colTable input[type=file],.x .crossTable input[type=file],.x .rowTable textarea,.x .colTable textarea,.x .crossTable textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:transparent}.x .rowTable input[type=text],.x .colTable input[type=text],.x .crossTable input[type=text],.x .rowTable input[type=password],.x .colTable input[type=password],.x .crossTable input[type=password],.x .rowTable input[type=file],.x .colTable input[type=file],.x .crossTable input[type=file]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px}.x .clear:after{content:"";display:block;clear:both} \ No newline at end of file +@charset "utf-8";/* NHN (developers@xpressengine.com) *//* Element Reset */body{margin:0}header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{display:block}body>.popup{margin:1em}.x,.x table,.x input,.x textarea,.x select,.x button{font-family:Tahoma,Geneva,sans-serif;font-size:12px;color:#333}.x button,.x input[type=submit],.x input[type=reset],.x input[type=button]{cursor:pointer;overflow:visible}.x img{border:0}.x p{line-height:1.5}/* Section & Heading */.x .section{margin:1em 0;padding:0;border:0}.x .h1, .x .h2, .x .h3, .x .h4{position:relative;border-bottom-style:solid;border-bottom-color:#ccc;zoom:1}.x .h1{border-bottom-width:4px;font-size:24px}.x .h2{border-bottom-width:3px;font-size:20px}.x .h3{border-bottom-width:2px;font-size:16px}.x .h4{border-bottom-width:1px;font-size:12px}/* Portlet */.x .portlet{position:relative;border:1px solid #e9e9e9;margin:1em 0;padding:0;background:#fff;zoom:1;overflow:hidden;border-radius:5px}.x .portlet h2, .x .portlet h3{margin:0;padding:.5em 1em;font-size:14px;border:1px solid #fff;border-bottom:1px solid #e9e9e9;background:#f7f7f7;border-radius:5px 5px 0 0}.x .portlet p{margin:1em 1.2em}.x .portlet li{position:relative;padding-right:8em}.x .portlet .lined{margin:1px;padding:0;list-style:none}.x .portlet .lined li{padding:.5em 8em .5em 1em;border-top:1px solid #eee;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis}.x .portlet .lined li:first-child{border:0}.x .portlet .side{position:absolute;top:0;_top:1px;right:0;color:#666;background:#fff;padding:0 1em}.x .portlet .lined .side{padding:.5em 1em}.x .portlet .more{position:absolute;top:.5em;right:1em;text-decoration:none !important;color:#666}.x .portlet .more span{color:#999}.x .portlet .action{text-align:right;top:0;right:0;padding:.5em 1em .5em 3em;background:#fff;background:-webkit-gradient(linear, 0% 0%, 100% 0%, from(rgba(255,255,255,0)), to(rgba(255,255,255,1)), color-stop(15%, #fff));background:-moz-linear-gradient(left, rgba(255,255,255,0) 0, rgba(255,255,255,1) 15%)}.x .portlet .action a,.x .portlet .action button{margin-left:1em}.x .portlet .btnArea{border-top:1px solid #ddd;margin:0;padding:.5em 1em;margin:0 1px 1px 1px;background:#f7f7f7;border-radius:0 0 5px 5px}/* Table */.x .table{margin:1em 0}.x .table table{width:100%;border:0;border-collapse:collapse;border-top:2px solid #ccc}.x .table caption{font-weight:bold;text-align:left;line-height:22px;padding:5px 0}.x .table caption:after{content:"";display:block;clear:both}.x .table caption a{font-weight:normal}.x .table caption em{float:right;margin-left:1em}.x .table caption strong{color:#e00}.x .table caption .side{float:right;font-weight:normal;margin-left:1em}.x .table th,.x .table td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd;white-space:nowrap}.x .table th{background:#f8f8f8}.x .table thead th{border-bottom:1px solid #999}.x .table tfoot td{font-weight:bold;background:#f8f8f8}.x .table.even tbody tr:nth-of-type(even) td{background-color:#fafafa}.x .table td>input[type=text]{margin:-1px 0 -3px 0 !important;vertical-align:middle}.x .table img{vertical-align:middle}.x .table em{font-style:normal;font-weight:normal;color:#e00}.x .table .title,.x .table .text{white-space:normal}/* Form */.x .form{margin:1em 0;padding:0}.x .form fieldset{margin:0 0 2em 0;padding:0;border:0}.x .form em{font-style:normal;color:#e00}.x .form label{margin-right:1em;line-height:1;vertical-align:middle}.x .form input[type=checkbox]+label,.x .form input[type=radio]+label,.x .form input[type=file]{cursor:pointer}.x .form ul{position:relative;margin:0;padding:0;list-style:none;border-top:2px solid #ccc;border-bottom:1px solid #ccc;zoom:1}.x .form li{list-style:none;border:1px solid #ddd;border-left:0;border-right:0;margin:-1px 0;padding:8px 0;vertical-align:top;zoom:1}.x .form li:first-child{border-top:0}.x .form li>label:first-child{display:block;font-weight:bold}.x .form li label em{font-weight:normal}.x .form label.overlap{position:absolute;color:#aaa}.x .form input[type=text],.x .form input[type=password],.x .form input[type=file],.x .form textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:transparent}.x .form input[type=text],.x .form input[type=password],.x .form input[type=file]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px}.x .form input[type=text].loading,.x .form input.loading[type=password]{padding-right:24px;width:260px;background:transparent url(../img/preLoader16.gif) no-repeat 265px center}.x .form input[type=checkbox],.x .form input[type=radio]{margin:0;padding:0;width:13px;height:13px;vertical-align:middle}.x .form input[type=text][disabled=disabled],.x .form input[type=password][disabled=disabled],.x .form input[type=checkbox][disabled=disabled],.x .form input[type=radio][disabled=disabled],.x .form input[type=file][disabled=disabled],.x .form textarea[disabled=disabled],.x .form select[disabled=disabled]{background:#ddd !important;text-shadow:1px 1px 0 #fff}.x .form textarea{padding:3px 4px;vertical-align:top}.x .form span.desc, .x .form em.desc{line-height:22px;vertical-align:middle;margin:0 10px}.x .form p.desc{margin:.25em 0;line-height:1.4}.x .form .q{font-weight:bold;margin:0 0 5px 0}.x .form .a{margin:0 0 5px 0}.x .form .tgForm{margin-right:1em}.x .form .h1 + ul,.x .form .h2 + ul,.x .form .h3 + ul,.x .form .h4 + ul{border-top:0}/* Global Navigation Bar */.x .gnb{position:relative;clear:both;border:1px solid #c1c1c1;border-left:0;border-right:0;background-color:#efefef;background:#efefef -webkit-gradient(linear, 0% 0%, 0% 100%, from(#efefef), to(#dcdcdc));background:#efefef -moz-linear-gradient(top, #efefef, #dcdcdc);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#efefef, endColorStr=#dcdcdc);zoom:1}.x .gnb ul{margin:0;padding:0 0 0 2em;list-style:none;border:1px solid #fff;border-left:0;border-right:0;zoom:1}.x .gnb ul ul{position:absolute;top:30px;left:0;border:1px solid #ccc;border-top:0;padding:1px 0 0 0;background:#fff}.x .gnb ul:after{content:"";display:block;clear:both}.x .gnb li{position:relative;float:left;border:1px solid #fff;border-top:0;border-bottom:0;margin:0 -1px 0 0}.x .gnb li li{float:none;clear:both;overflow:hidden;border:0;border-top:1px dotted #ccc;margin:0;padding:2px}.x .gnb li li:first-child{border:0}.x .gnb li a{float:left;font-weight:bold;color:#333;font-size:12px;padding:8px 18px;white-space:nowrap;text-decoration:none;text-shadow:0 1px 0 #fff;zoom:1}.x .gnb li a:hover,.x .gnb li a:active,.x .gnb li a:focus,.x .gnb li.active a{background:#f4f4f4;border:1px solid #ccc;border-bottom:0;padding:7px 17px 8px 17px}.x .gnb li.activeOn a{background:#fff;border:1px solid #ccc;border-bottom:0;padding:7px 17px 8px 17px}.x .gnb li.active li a{display:block;float:none;color:#555;background:#fff;padding:5px 15px !important;font-weight:normal !important;border:0 !important}.x .gnb li.active li a:hover,.x .gnb li.active li a:active,.x .gnb li.active li a:focus{border:0;background:#eee}.x .gnb .setting{position:absolute;top:8px;right:2em;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;background:url(../img/iconSetting.gif) no-repeat center}.x .gnb.jx ul{display:block;position:static;padding:0}.x .gnb.jx li{float:none;clear:both;border-top:1px solid #ccc}.x .gnb.jx ul ul{border:0}.x .gnb.jx li li{border:0}.x .gnb.jx li a{float:none;display:block}.x .gnb.jx li a:hover,.x .gnb.jx li a:active,.x .gnb.jx li a:focus{background:none}.x .gnb.jx li.activeOn>a{background:#ddd}@media only all and (max-width:860px){.x .gnb ul{padding-left:1em}.x .gnb .setting{right:1em}}@media only all and (max-width:640px){.x .gnb ul{display:block;position:static;padding:0}.x .gnb li{float:none;clear:both;border-top:1px solid #ccc}.x .gnb ul ul{border:0;position:static}.x .gnb li li{border:0}.x .gnb li a{float:none;display:block}.x .gnb li a:hover,.x .gnb li a:active,.x .gnb li a:focus{background:none}.x .gnb li.activeOn>a{background:#ddd}}/* Local Navigation */.x .lnb{position:relative;float:left;width:200px;margin:1em 0 1em -230px;line-height:normal;zoom:1;display:inline}.x .lnb .h2{margin-top:0}.x .lnb ul{margin:0;padding:0;list-style:none}.x .lnb li{position:relative;margin:0 0 -1px 0;vertical-align:top;zoom:1}.x .lnb li a{display:block;position:relative;padding:8px 10px;text-decoration:none;color:#666;font-weight:bold;background:#fafafa;border:1px solid #eee;zoom:1}.x .lnb li a .i{position:absolute;top:50%;left:100%;margin:-4px 0 0 -16px;width:8px;height:8px;color:#ccc;background:url(../img/iconNavVr.gif) no-repeat left top}.x .lnb li ul{padding:5px 0;background:#fff}.x .lnb li li{margin:0;border-top:1px dotted #ddd}.x .lnb li li:first-child{border:0}.x .lnb li li a{font-weight:normal;background:#fff;padding:5px 10px;border:0}.x .lnb li li a span{color:#666}.x .lnb li.active{border:1px solid #ccc;z-index:2}.x .lnb li li.active{border:0}.x .lnb li.active a{color:#000;border:0}.x .lnb li.active .i{background-position:0 -44px}.x .lnb li.active li a{border:0}.x .lnb li.active ul{display:block;border-top:1px solid #eee}.x .lnb li.active li.active a span{color:#13b200;font-weight:bold;letter-spacing:-1px}/* Content Navigation */.x .cnb{margin:1em 0;position:relative;zoom:1}.x .cnb:after{content:"";display:block;clear:both}.x .cnb ul{list-style:none;margin:0;padding:0}.x .cnb li{display:inline}.x .cnb li:before{content:"| ";color:#ccc}.x .cnb li:first-child:before{content:"";}.x .cnb .active,.x .cnb .active a{font-weight:bold;color:#333;text-decoration:none}.x .cnb .side{float:right}/* Pagination */.x .pagination{margin:1em 0;text-align:center;line-height:normal}.x .pagination *{vertical-align:middle}.x .pagination a,.x .pagination strong{position:relative;display:inline-block;padding:2px 4px;font-weight:bold;text-decoration:none;line-height:normal;color:#333 !important;vertical-align:middle}.x .pagination a:hover,.x .pagination a:active,.x .pagination a:focus{border:1px solid #ddd;margin:0 -1px}.x .pagination strong{color:#e00 !important;font-size:20px}.x .pagination .direction{font-weight:normal;white-space:nowrap}.x .pagination .direction:hover,.x .pagination .direction:active,.x .pagination .direction:focus{border:0;margin:0;text-decoration:underline}.x .pagination input{width:30px;text-align:center}.x .pagination button{overflow:visible}/* Star Rating */.x .starRating, .x .starRating span{display:inline-block;height:14px;background:transparent url(../img/iconStarRating.gif) no-repeat;overflow:hidden}.x .starRating{width:79px;vertical-align:top}.x .starRating span{font-size:0;line-height:0;vertical-align:top;text-indent:-100px;*text-indent:0;background-position:0 -14px}/* Progress */.x .prgrs{white-space:nowrap;line-height:normal;vertical-align:middle}.x .prgrs *{vertical-align:middle}.x .prgrs .pBar{position:relative;display:inline-block;background:#e9e9e9;margin:0 5px 0 0}.x .prgrs .pAction{display:inline-block;vertical-align:top;background:#99a6b6}.x .prgrs .pNum{position:absolute;width:100%;left:0;top:0;text-align:center;text-shadow:1px 1px 0 #fff}.x .prgrs.prgrsSmall{font-size:14px;line-height:14px}.x .prgrs.prgrsSmall .pBar,.x .prgrs.prgrsSmall .pAction,.x .prgrs.prgrsSmall .pNum{height:16px;line-height:16px;font-size:11px}.x .prgrs.prgrsMedium{font-size:24px;line-height:24px}.x .prgrs.prgrsMedium .pBar,.x .prgrs.prgrsMedium .pAction,.x .prgrs.prgrsMedium .pNum{height:22px;line-height:22px;font-size:12px}.x .prgrs.prgrsLarge{font-size:38px;line-height:38px}.x .prgrs.prgrsLarge .pBar,.x .prgrs.prgrsLarge .pAction,.x .prgrs.prgrsLarge .pNum{height:34px;line-height:34px;font-size:14px}/* Modal Window */.modal{position:absolute;top:0;left:0;width:100%;_height:100%;min-height:100%;z-index:100}.modal .bg{position:absolute;background:#000;_background:none;width:100%;height:100%;opacity:.5;z-index:2;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1}.modal .fg{position:relative;width:80%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:3;zoom:1;border-radius:5px;box-shadow:0 0 6px #000}.modal ul, .modal ol, .modal .lined, .modal .table{margin-bottom:1em}.modal .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1}.modalClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px}.modalBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}html.modalContainer,body.modalContainer{_height:100%;_width:100%} /* IE6 only */ /* Layer */.x .layer,.x.layer{position:absolute;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:2;zoom:1;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5pxbox-shadow:0 0 6px #666;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x .layer h2{font-size:14px}.x .layer ul, .x .layer ol, .x .layer .lined, .x .layer .table{margin-bottom:1em}.x .layerClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px}.x .layerBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}/* H2 Anchor */.x .h2Anchor{position:absolute;right:0;border:0;background:none;color:#00f;text-decoration:underline}/* Skip Navigation */.x .skipNav{margin:0;text-align:center;overflow:hidden}.x .skipNav a{position:absolute;width:1px;height:1px;display:block;color:#fff;font-weight:bold;padding:10px 0;background:#333;border-top:1px solid #656565}.x .skipNav a:hover,.x .skipNav a:active,.x .skipNav a:focus{position:relative;width:auto;height:auto}/* Header */.x .header{position:relative;z-index:2;padding:30px 0 0 0;background:#4c4c4c;box-shadow:0 0 10px #aaa;zoom:1}.x .header:after{content:"";display:block;clear:both}.x .header a{text-decoration:none}.x .header h1{margin:0 100px 10px 1.3em;font-size:24px;line-height:32px}.x .header h1 *{vertical-align:middle}.x .header h1 a{color:#fff;text-shadow:1px 1px 0 #000;filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=1, OffY=1, Color=#000000, Positive=true);zoom:1}.x .header h1 .url{font-size:12px;font-weight:normal}.x .header #moveSiteList{padding:10px 1em 5px 1em;margin:0}.x .header #moveSiteList ul{list-style:none;margin:0;padding:0}.x .header #moveSiteList li{white-space:nowrap;margin:0;padding:4px 0;border-bottom:1px dotted #ccc}.x .header #siteMapList{padding:0 1em 1em 1em;margin:0}.x .header #siteMapList li{white-space:nowrap}.x .header .account{position:absolute;z-index:3;width:100%;padding:5px 2em 5px 0;top:0;right:0;white-space:nowrap;text-align:right;background:#333;border-bottom:1px solid #656565;color:#fff;font-size:12px;box-shadow:0 0 10px #333}.x .header .account ul{margin:0 2px 0 0;padding:0;list-style:none}.x .header .account li{position:relative;display:inline;border-left:1px solid #666;padding:0 6px 0 10px}.x .header .account li:first-child{border:0}.x .header .account a{color:#fff;display:inline-block;height:14px}.x .header .account a.language{padding-right:16px;background:url(/xe/modules/admin/tpl/img/iconArrow.gif) no-repeat right -160px}.x .header #language{position:absolute;top:19px;right:-2em;padding:6px 4px !important;border:1px solid #666;border-top:0;background:#333}.x .header #language li{border:0;display:block;padding:1px 8px 1px 10px;text-align:left;line-height:1}.x .header #language li.selected{background:url(/xe/modules/admin/tpl/img/iconCheck.gif) no-repeat left center}.x .header #language li.selected a{text-decoration:underline}.x .header h1 a:hover,.x .header h1 a:active,.x .header h1 a:focus,.x .header .account a:hover,.x .header .account a:active,.x .header .account a:focus{color:#6e9cf2;text-decoration:underline}/* Footer */.x .footer{border-top:1px solid #ddd;text-align:center;font-size:12px;padding:1.5em 0;margin:0 2em;zoom:1}.x .footer:after{content:"";display:block;clear:both}.x .footer p{margin:0}.x .footer .power{float:left}.x .footer .cache{float:right}/* Body */.x .body{position:relative;z-index:1;padding:1em 2em 1em 260px;zoom:1}.x .body:after{content:"";display:block;clear:both}/* Content */.x .content{float:right;width:100%;margin-left:-230px;zoom:1}.x .content:after{content:"";display:block;clear:both}.x .content a{color:#33a}.x .content a:hover,.x .content a:active,.x .content a:focus{color:#a33}.x .content .portlet a{text-decoration:none}.x .content .portlet a:hover,.x .content .portlet a:active,.x .content .portlet a:focus{text-decoration:underline}/* Dashboard */.x .dashboard{position:relative;float:none;width:auto;margin-left:-230px}.x .dashboard .portlet{float:left;width:48%;margin-right:1em}.x .dashboard .portlet:nth-of-type(odd){float:left;width:49%;margin-right:0}.x .dashboard .portlet:nth-of-type(even){float:right;width:49%;margin-right:0}/* Single Column*/.x .single{position:relative;float:none;width:auto;margin-left:-230px}/* Search */.x .search{zoom:1}.x .search:after{content:"";display:block;clear:both}.x .search .pagination{float:left;text-align:left}.x .search form{float:right;margin:1em 0}.x .search form *{vertical-align:middle}/* Site Map */.x .siteMap h2 input{font-size:14px;font-weight:bold;padding:0 .5em}.x .siteMap label{cursor:text}.x .siteMap .lined ul{padding:0;margin:0;border-top:1px solid #eee;zoom:1}.x .siteMap .lined li{position:relative;padding:0;margin:0;cursor:all-scroll;list-style:none;zoom:1}.x .siteMap .lined li li{border-top:1px solid #eee}.x .siteMap li li{text-indent:18px}.x .siteMap li li li{text-indent:36px}.x .siteMap li li li li{text-indent:54px}.x .siteMap li li li li li{text-indent:72px}.x .siteMap li li li li li li{text-indent:90px}.x .siteMap li li li li li li li{text-indent:108px}.x .siteMap li li li li li li li li{text-indent:126px}.x .siteMap li li li li li li li li li{text-indent:144px}.x .siteMap li li li li li li li li li li{text-indent:162px}.x .siteMap li li li li li li li li li li li{text-indent:180px}.x .siteMap li li li li li li li li li li li li{text-indent:198px}.x .siteMap li *{vertical-align:middle}.x .siteMap li .moveTo+input{width:200px;border:0;padding:0 .5em}.x .siteMap li .moveTo+input:hover,.x .siteMap li .moveTo+input:active,.x .siteMap li .moveTo+input:focus{border:1px dotted #ccc;overflow:visible}.x .siteMap .moveTo{position:relative;z-index:2;width:22px;height:32px;padding:32px 0 0 0;margin:0 3px;_margin-top:-1px;overflow:hidden;background:#fff url(../img/iconMoveTo.gif) no-repeat center 0;border:0;cursor:move}.x .siteMap li.active,.x .siteMap li.active .moveTo{background-color:#f7f7f7}.x .siteMap li.active li,.x .siteMap li.active ul{border-top-color:#f7f7f7}.x .siteMap li.active .moveTo{background-position:center -32px}.x .siteMap .vr,.x .siteMap .hr{display:none;position:absolute;z-index:1;left:14px;border:0px solid #ccc;overflow:hidden}.x .siteMap .vr{top:-16px;height:100%;border-left-width:1px}.x .siteMap .hr{top:16px;width:16px;border-top-width:1px}.x .siteMap li.active .vr,.x .siteMap li.active li .hr{display:block}.x .siteMap li li .vr,.x .siteMap li li li .hr{left:32px}.x .siteMap li li li .vr,.x .siteMap li li li li .hr{left:50px}.x .siteMap li li li li .vr,.x .siteMap li li li li li .hr{left:68px}.x .siteMap li li li li li .vr,.x .siteMap li li li li li li .hr{left:86px}.x .siteMap li li li li li li .vr,.x .siteMap li li li li li li li .hr{left:104px}.x .siteMap li li li li li li li .vr,.x .siteMap li li li li li li li li .hr{left:122px}.x .siteMap li li li li li li li li .vr,.x .siteMap li li li li li li li li li .hr{left:140px}.x .siteMap li li li li li li li li li .vr,.x .siteMap li li li li li li li li li li .hr{left:158px}.x .siteMap li li li li li li li li li li .vr,.x .siteMap li li li li li li li li li li li .hr{left:176px}.x .siteMap li li li li li li li li li li li .vr,.x .siteMap li li li li li li li li li li li li .hr{left:336px}.x .siteMap .side{padding-top:0 !important;padding-bottom:0 !important;line-height:30px;background:transparent !important}.x .siteMap .side button{text-indent:0;line-height:1}.x .siteMap .tgMap{position:absolute;top:12px;right:1em;padding:0 16px 0 0;line-height:16px;background:url(../img/iconArrow.gif) no-repeat right -126px}.x .siteMap.fold .tgMap{background-position:right -158px}.x .siteMap.fold .h2{border-bottom-color:#fff;border-radius:5px}.x .siteMap .placeholder{background:#bbb}.x .siteMap .draggable,.x .siteMap .draggable .moveTo{background-color:#ddd}.x .siteMap .draggable .summary{border-left:1px solid #ccc;padding-left:10px;margin-left:10px;font-size:11px;color:#999}.x .siteMap a.ms{text-decoration:underline}/* Multilingual */.x .langEdit{background:#fff;position:absolute;*left:0;*margin-top:28px;z-index:10}.x .langEdit ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0}.x .langEdit li{padding:.5em 10px}.x .langEdit input[type=text]{width:220px;padding-right:40px}.x .langEdit label{left:15px !important}.x .langEdit .action{border:1px solid #eee;width:268px;padding:0 10px}.x .langEdit p, .x .langEdit .btnArea{white-space:normal}.x .langEdit .langList,.x .langEdit .langEditControls{box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x .langEdit .langList{margin:0 -1px 0 0;display:none}.x .langEdit .langList li{white-space:nowrap;color:#ccc;width:270px} .x .langEdit .langList li span{display:inline-block;width:80px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:#767676}.x .langEdit .langList li a{display:inline-block;width:80px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.x .langEdit .langList li.active{background:url(../img/iconArrow.gif) no-repeat right -188px}.x .langEdit.showChild .langList{display:block}.x .langEdit .langInput{background:#fff}.x .langEdit .langInput h2{padding:5px 10px;margin:0 0 -1px 0;font-size:12px;font-weight:normal;color:#666;border:1px solid #eee;border-top-color:#ccc}.x .langEdit .langInput h2 strong{color:#000;font-size:14px}.x .langEdit.showChild .langInput{position:absolute;left:285px;top:0}.x .langEdit li.en input, .x .langEdit li.en textarea, .x .mLangEdit li.en textarea{background:url(../img/flag.us.gif) no-repeat 99% 5px}.x .langEdit li.ko input, .x .langEdit li.ko textarea, .x .mLangEdit li.ko textarea{background:url(../img/flag.kr.gif) no-repeat 99% 5px}.x .langEdit li.jp input, .x .langEdit li.jp textarea, .x .mLangEdit li.jp textarea{background:url(../img/flag.jp.gif) no-repeat 99% 5px}.x .langEdit li.fr input, .x .langEdit li.fr textarea, .x .mLangEdit li.fr textarea{background:url(../img/flag.fr.gif) no-repeat 99% 5px}.x .langEdit li.de input, .x .langEdit li.de textarea, .x .mLangEdit li.de textarea{background:url(../img/flag.de.gif) no-repeat 99% 5px}.x .langEdit li.ru input, .x .langEdit li.ru textarea, .x .mLangEdit li.ru textarea{background:url(../img/flag.ru.gif) no-repeat 99% 5px}.x .langEdit li.es input, .x .langEdit li.es textarea, .x .mLangEdit li.es textarea{background:url(../img/flag.es.gif) no-repeat 99% 5px}.x .langEdit li.tr input, .x .langEdit li.tr textarea, .x .mLangEdit li.tr textarea{background:url(../img/flag.tr.gif) no-repeat 99% 5px}.x .langEdit li.vi input, .x .langEdit li.vi textarea, .x .mLangEdit li.vi textarea{background:url(../img/flag.vn.gif) no-repeat 99% 5px}.x .langEdit li.mn input, .x .langEdit li.mn textarea, .x .mLangEdit li.mn textarea{background:url(../img/flag.mn.gif) no-repeat 99% 5px}.x .langEdit li.zh-CN input, .x .langEdit li.zh-CN textarea, .x .mLangEdit li.zh-CN textarea, .x .langEdit li.zh-TW input, .x .langEdit li.zh-TW textarea, .x .mLangEdit li.zh-TW textarea{background:url(../img/flag.cn.gif) no-repeat 99% 5px}.x .mLangEdit.en strong{background:url(../img/flag.us.gif) no-repeat 0 10px}.x .mLangEdit.ko strong{background:url(../img/flag.kr.gif) no-repeat 0 10px}.x .mLangEdit.jp strong{background:url(../img/flag.jp.gif) no-repeat 0 10px}.x .mLangEdit.fr strong{background:url(../img/flag.fr.gif) no-repeat 0 10px}.x .mLangEdit.de strong{background:url(../img/flag.de.gif) no-repeat 0 10px}.x .mLangEdit.ru strong{background:url(../img/flag.ru.gif) no-repeat 0 10px}.x .mLangEdit.es strong{background:url(../img/flag.es.gif) no-repeat 0 10px}.x .mLangEdit.tr strong{background:url(../img/flag.tr.gif) no-repeat 0 10px}.x .mLangEdit.vi strong{background:url(../img/flag.vn.gif) no-repeat 0 10px}.x .mLangEdit.mn strong{background:url(../img/flag.mn.gif) no-repeat 0 10px}.x .mLangEdit.zh-CN strong, .x .mLangEdit.zh-TW strong{background:url(../img/flag.cn.gif) no-repeat 0 10px}.x .mLangEdit ul ul{border:0}.x .mLangEdit li{position:relative;padding:0}.x .mLangEdit li strong{display:inline-block;padding:6px 100px 8px 24px;font-weight:normal;line-height:1.5}.x .mLangEdit li .side{position:absolute;top:8px;right:0;padding-right:18px;background:url(../img/iconArrow.gif) no-repeat right -160px}.x .mLangEdit li li{border:0;padding-right:36px}.x .mLangEdit li textarea{width:100%;height:16px;padding-right:30px;resize:vertical;line-height:1.4}.x .mLangEdit li label{top:8px !important}.x .mLangEdit li.active{background:#FFFDEF}.x .mLangEdit li.active strong{font-weight:bold}.x .mLangEdit li.active .side{background-position:right -128px}.modal .mLangEdit ul{padding-bottom:1em}.modal .mLangEdit li{border:0;padding-right:36px}/* Suggestion */.x .suggestion{display:none;position:absolute;background:#fff;z-index:10;_height:200px;max-height:200px;overflow:auto;*left:0;*margin-top:28px;box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x .suggestion ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0}.x .suggestion li{padding:0}.x .suggestion li:last-child{border-bottom:0}.x .suggestion li button{border:0;background:#fff;text-align:left;width:288px;padding:2px 4px;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.x .suggestion li button:hover,.x .suggestion li button:active,.x .suggestion li button:focus,.x .suggestion li button.active{background:#eee}/* Image Mark */.x #imageMark{right:0}/* Easy Installer */.x .easyNav{position:relative;border:1px solid #e9e9e9;zoom:1}.x .easyNav:after{content:"";display:block;clear:both}.x .easyNav h2{font-size:16px}.x .easyNav .category{width:30%;float:left;margin:0 2em;display:inline}.x .easyNav .filter{position:absolute;top:0;right:0;margin:1em 2em;text-align:right}.x .easyList td p{margin-top:0}.x .easyList td p.update{background:#ffc;padding:.5em 1em;border:1px solid #fc9;border-left:0;border-right:0;text-align:center}/* Font Preview */.x .fontPreview{width:96%;border:1px solid #e9e9e9;zoom:1;padding:1em 2em;margin:.5em 0}/* FTP Suggestion */.x #ftpSuggestion{background:#fff;box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x #ftpSuggestion ul{border-left:1px solid #eee;border-right:1px solid #eee}.x #ftpSuggestion li{padding:0}.x #ftpSuggestion li button{border:0;background:#fff;text-align:left;width:288px}.x #ftpSuggestion li button:hover,.x #ftpSuggestion li button:active,.x #ftpSuggestion li button:focus{background:#eee}/* Theme & Skin Preview */.x .thumbPreview li{position:relative;padding-left:10px;padding-right:10px}.x .thumbPreview li.active.highlight{background:#f9f9f9}.x .thumbPreview .prevToggle{position:absolute;top:8px;right:10px;line-height:16px;padding:0 18px 0 0;text-decoration:none;background:url(../img/iconArrow.gif) no-repeat right -32px}.x .thumbPreview li.active .prevToggle{background-position:right 0}.x .thumbPreview .a{border:0;margin:0;zoom:1}.x .thumbPreview .a:after{content:"";display:block;clear:both}.x .thumbPreview .i{float:left;vertical-align:top;margin:0 1em 1em 0;padding:0;border:0;zoom:1}.x .thumbPreview .i:after{content:"";display:block;clear:both}.x .thumbPreview .i .thumb{position:relative;width:124px;height:84px;padding:0;margin-bottom:3px;text-align:center;overflow:hidden;border:1px solid #ddd;display:block;cursor:pointer;background:#fff}.x .thumbPreview .i .thumb .frame{position:absolute;width:120px;height:80px;left:0;top:0;border:2px solid #fff;overflow:hidden}.x .thumbPreview .i .thumb img{width:120px;margin:0}.x .thumbPreview .i label{display:block;position:relative;top:0;left:2px;width:122px;height:1.1em;margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x .thumbPreview .i input{display:none}.x .thumbPreview .i ul{display:none}.x .thumbPreview .selected .i{display:block;float:none}.x .thumbPreview .selected .i .thumb{float:left;width:186px;height:126px;margin:0 1em 0 0;border:2px solid #eee}.x .thumbPreview .selected .i .thumb .frame{width:180px;height:120px;border-width:3px}.x .thumbPreview li.active.highlight .selected .i .thumb{border-color:#5ea8f6}.x .thumbPreview .selected .i .thumb img{width:180px;position:relative}.x .thumbPreview li.active .selected .i .thumb img{z-index:auto}.x .thumbPreview .selected .i label{cursor:text}.x .thumbPreview .selected .i ul{display:block;list-style:none;border:0;margin:1em 0 1em 200px}.x .thumbPreview .selected .i li{border:0;padding:0;margin:0 0 .2em 0}.x .thumbPreview.jx .i label{display:inline;width:auto}.x .thumbPreview.jx .i.noDirection{display:none}.x .thumbPreview.jx .i input{display:inline}.x #skin .showAll{float:right;border:0;overflow:visible;padding:0 18px 0 0;cursor:pointer;color:#00f;background:url(../img/iconArrow.gif) no-repeat right -32px}.x #skin .showAll.hideAll{background-position:right 0}/* Favorite On | Off */.x .fvOff,.x .fvOn{display:inline-block;width:16px;height:16px;overflow:hidden;text-indent:16px;background:url(../img/iconFavorite.gif) no-repeat}.x .fvOn{background-position:0 -16px}/* Up-Down Dragable */.x .uDrag .wrap{position:relative;padding-left:20px}.x .uDrag li>.wrap{margin:0 0 0 8px}.x .uDrag .dragActive{background:#FFD}.x .uDrag .dragActive th,.x .uDrag .dragActive td{background:none !important}.x .uDrag .dragBtn{position:absolute;width:8px;height:100%;padding:0;overflow:hidden;background:url(../img/bgDragable.gif);top:1px;left:0;text-indent:12px;border:0;cursor:n-resize;white-space:nowrap}/* Favicon Preview */.x .faviconPreview{position:relative;padding:60px 0 0 200px;background:url(../img/bgFavicon.gif) no-repeat}.x .faviconPreview img{position:absolute}.x .faviconPreview .fn1{top:30px;left:12px}.x .faviconPreview .fn2{top:55px;left:68px}/* Mobile Icon Preview */.x .mobiconPreview{position:relative;padding:252px 0 0 200px;background:url(../img/bgMobileTop.png) no-repeat}.x .mobiconPreview img{position:absolute;top:20px;left:10px}.x .mobiconPreview span{position:absolute;width:32px;text-align:center;top:52px;left:10px;color:#fff;font-size:9px}/* Text List */.x .textList{border:1px solid #ddd !important;line-height:1.5em;height:18.5em;overflow:auto}.x .textList li{border:0;padding:.25em 1em;height:1.5em;white-space:nowrap;overflow:hidden}.x .textList li:nth-child(even){background:#eee}.x .textList li a{float:right}/* File Box */.x .fileBox li{position:relative}.x .fileBox li img{max-width:100%}.x .fileBox .portlet ul{margin:1em;list-style:none;padding:0;border:0}.x .fileBox .portlet li{border-top:1px solid #ddd;border-bottom:0;padding:8px 0}.x .fileBox .side{position:absolute;top:8px;right:0}/* Messages */.x .desc.error{color:#f00}.x .desc.success{color:#080}/* Icon Button */.x a.iSetting{display:inline-block;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;vertical-align:middle;background:url(../img/iconSetting.gif) no-repeat}.x a.cMenu{display:inline-block;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;vertical-align:middle;background:url(../../../../common/img/icon.bubble.png) no-repeat}/* Responsive Layout */@media only all and (max-width:860px){.x .header h1{margin-left:.7em}.x .header .account{padding-right:1em}.x .body{padding:1em}.x .content{float:none;margin-left:0}.x .lnb{float:none;width:auto;margin:1em 0}.x .dashboard .portlet{float:none !important;width:auto !important;margin-right:0}.modal .fg,.wfsr .fg{width:auto}.x .easyNav .category{float:none;display:block;width:auto}.x .easyNav .filter{position:static}}@media only all and (max-width:640px){.x .skipNav a{position:relative;width:auto;height:auto}.modal{position:absolute}}/* Legacy Code (Don't use it. It will be removed as soon as possible.) */.x h3.xeAdmin,.x h4.xeAdmin{position:relative;border-bottom-style:solid;border-bottom-color:#ccc;zoom:1}.x h3.xeAdmin{border-bottom-width:4px;font-size:24px}.x h4.xeAdmin{border-bottom-width:3px;font-size:20px}.x h5.xeAdmin{border-bottom-width:2px;font-size:16px}.x h6.xeAdmin{border-bottom-width:1px;font-size:12px}.x .adminSearch{margin:1em 0}.x .adminSearch fieldset{border:1px solid #ccc}.x .localNavigation{padding:0;list-style:none}.x .localNavigation li{display:inline}.x .localNavigation li.on a{font-weight:bold;color:#333;text-decoration:none}.x .localNavigation li:before{content:"| "}.x .localNavigation li:first-child:before{content:""}.x .summary{margin:1em 0}.x .rowTable,.x .colTable,.x .crossTable{margin:1em 0;border:0;border-collapse:collapse;border-top:2px solid #ccc;width:100%}.x .rowTable caption,.x .colTable caption,.x .crossTable caption{font-weight:bold;text-align:left;line-height:22px;padding:5px 0}.x .rowTable caption:after,.x .colTable caption:after,.x .crossTable caption:after{content:"";display:block;clear:both}.x .rowTable caption a,.x .colTable caption a,.x .crossTable caption a{font-weight:normal}.x .rowTable caption em,.x .colTable caption em,.x .crossTable caption em{float:right;font-style:normal;font-weight:normal;color:#e00;margin-left:1em}.x .rowTable caption strong,.x .colTable caption strong,.x .crossTable caption strong{color:#e00}.x .rowTable caption .side,.x .colTable caption .side,.x .crossTable caption .side{float:right;font-weight:normal;margin-left:1em}.x .rowTable th,.rowTable td,.x .colTable th,.rowTable td,.x .crossTable th,.rowTable td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd;white-space:nowrap}.x .rowTable th,.x .colTable th,.x .crossTable th{background:#f8f8f8}.x .rowTable thead th,.x .colTable thead th,.x .crossTable thead th{border-bottom:1px solid #999}.x .rowTable tfoot td,.x .colTable tfoot td,.x .crossTable tfoot td{font-weight:bold;background:#f8f8f8}.x .rowTable.even tbody tr:nth-of-type(even) td,.x .colTable.even tbody tr:nth-of-type(even) td,.x .crossTable.even tbody tr:nth-of-type(even) td{background-color:#fafafa}.x .rowTable td>input[type=text],.x .colTable td>input[type=text],.x .crossTable td>input[type=text]{margin:-1px 0 -3px 0 !important;vertical-align:middle}.x .rowTable img,.x .colTable img,.x .crossTable img{vertical-align:middle}.x .rowTable .title,.x .colTable .title,.x .crossTable .title,.x .rowTable .text,.x .colTable .text,.x .crossTable .text{white-space:normal}.x .rowTable input[type=text],.x .colTable input[type=text],.x .crossTable input[type=text],.x .rowTable input[type=password],.x .colTable input[type=password],.x .crossTable input[type=password],.x .rowTable input[type=file],.x .colTable input[type=file],.x .crossTable input[type=file],.x .rowTable textarea,.x .colTable textarea,.x .crossTable textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:transparent}.x .rowTable input[type=text],.x .colTable input[type=text],.x .crossTable input[type=text],.x .rowTable input[type=password],.x .colTable input[type=password],.x .crossTable input[type=password],.x .rowTable input[type=file],.x .colTable input[type=file],.x .crossTable input[type=file]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px}.x .clear:after{content:"";display:block;clear:both} \ No newline at end of file diff --git a/modules/admin/tpl/img/iconCheck.gif b/modules/admin/tpl/img/iconCheck.gif new file mode 100644 index 0000000000000000000000000000000000000000..099fe5c9681341a051ecf8669fc04dca89fddb67 GIT binary patch literal 64 zcmZ?wbhEHb Date: Tue, 11 Oct 2011 01:51:37 +0000 Subject: [PATCH 1081/1372] Admin dashboard portlet width. 1280px over and under. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9551 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/tpl/css/admin.css | 3 +++ modules/admin/tpl/js/admin.js | 11 ++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/modules/admin/tpl/css/admin.css b/modules/admin/tpl/css/admin.css index 9c3ecc653..b2f53f149 100644 --- a/modules/admin/tpl/css/admin.css +++ b/modules/admin/tpl/css/admin.css @@ -301,6 +301,9 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */ .x .dashboard .portlet{float:left;width:48%;margin-right:1em} .x .dashboard .portlet:nth-of-type(odd){float:left;width:49%;margin-right:0} .x .dashboard .portlet:nth-of-type(even){float:right;width:49%;margin-right:0} +@media only all and (min-width:1280px){ +.x .dashboard .portlet{float:left !important;width:32% !important;margin-right:1em !important} +} /* Single Column*/ .x .single{position:relative;float:none;width:auto;margin-left:-230px} /* Search */ diff --git a/modules/admin/tpl/js/admin.js b/modules/admin/tpl/js/admin.js index 2e8c4ccff..5e1f59e74 100644 --- a/modules/admin/tpl/js/admin.js +++ b/modules/admin/tpl/js/admin.js @@ -87,7 +87,16 @@ jQuery(function($){ }); // Display the dashboard in two column - $('.dashboard>.section>.portlet:odd').after('
                                                  '); + $(window).resize(function(){ + if($(document).width() < 1280){ + $('.dashboard>.section>br').remove(); + $('.dashboard>.section>.portlet:odd').after('
                                                  '); + } else { + $('.dashboard>.section>br').remove(); + $('.dashboard>.section>.portlet:eq(2),.dashboard>.section>.portlet:eq(5)').after('
                                                  '); + } + }); + $(window).resize(); // Popup list : 'Move to site' and 'Site map' From 52d8038e64a9642cef3e0eb6ac7e91ca3246be0f Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Tue, 11 Oct 2011 01:52:24 +0000 Subject: [PATCH 1082/1372] Admin dashboard portlet width. 1280px over and under. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9552 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/tpl/js/admin.min.js | 1215 ++++++++++++++++++++++++++++- 1 file changed, 1178 insertions(+), 37 deletions(-) diff --git a/modules/admin/tpl/js/admin.min.js b/modules/admin/tpl/js/admin.min.js index 38da27728..5e1f59e74 100644 --- a/modules/admin/tpl/js/admin.min.js +++ b/modules/admin/tpl/js/admin.min.js @@ -1,37 +1,1178 @@ -jQuery(function(a){a(".form li").find(">input:text,>input:password,>textarea").filter('input[value!=""],textarea:not(:empty)').prev("label").css("visibility","hidden").end().end().prev("label").addClass("overlap").css({top:"15px",left:"5px"}).next().focus(function(){var b=a(this).prev().stop().animate({opacity:0,left:"25px"},"fast",function(){b.css("visibility","hidden")})}).blur(function(){var b=a(this);a.trim(b.val())==""&&b.prev().stop().css("visibility","visible").animate({opacity:1,left:"5px"}, -"fast")}).end().parent().css("position","relative");var c=a("input:radio+label,input:checkbox+label").prev("input");c.change(function(){var b=a(this).attr("name");c.filter(function(){return this.name==b}).next("label").css("font-weight","normal").end().filter(":checked").next("label").css("font-weight","bold").end()}).change();a(".form th>input:checkbox").change(function(){var b=a(this),d=b.data("name");b.closest("table").find("input:checkbox").filter(function(){var b=a(this);return!b.prop("disabled")&& -(b.attr("name")==d||b.data("name")==d)}).prop("checked",b.prop("checked")).end().end().trigger("update.checkbox",[d,this.checked])});a.fn.xePagination=function(){this.not(".xe-pagination").addClass("xe-pagination").find("span.tgContent").css("whiteSpace","nowrap").end().find("a.tgAnchor").each(function(){var b=a(this);b.after(a(b.attr("href")))}).end();return this};a(".pagination").xePagination();a(".portlet .action").css({display:"none",position:"absolute"}).parent().mouseleave(function(){a(this).find(">.action").fadeOut(100)}).mouseenter(function(){a(this).find(">.action").fadeIn(100)}).focusin(function(){a(this).mouseenter()}).focusout(function(){var b= -a(this),d;clearTimeout(b.data("timer"));d=setTimeout(function(){b.find(":focus").length||b.mouseleave()},10);b.data("timer",d)});a(".dashboard>.section>.portlet:odd").after('
                                                  ');a(".header>.siteTool>a.i").bind("before-open.tc",function(){a(this).addClass("active").next("div.tgContent").find(">.section:gt(0)").hide().end().find(">.btnArea>button").show()}).bind("after-close.tc",function(){a(this).removeClass("active")}).next("#siteMapList").find(">.section:last").after('

                                                  ').find("+p>button").click(function(){a(this).hide().parent().prevAll(".section").show()}); -a.fn.xeMask=function(){this.each(function(){var b=a(this),d=b.text();b.data("originalText",d);/^([\w\-\.]+?)@(([\w-]+\.)+[a-z]{2,})$/ig.test(d)&&b.data("maskedText",RegExp.$1+"...");b.text(b.data("maskedText"))}).mouseover(function(){a(this).text(a(this).data("originalText"))}).mouseout(function(){a(this).text(a(this).data("maskedText"))}).focus(function(){a(this).mouseover()}).blur(function(){a(this).mouseout()})};a(".masked").xeMask()}); -jQuery(function(a){a.fn.xeMenu=function(){this.removeClass("jx").attr("role","navigation").find("li").attr("role","menuitem").find(">ul").hide().end().filter(":has(>ul)").attr("aria-haspopup","true").end().end().delegate("li",{mouseover:function(){a(this).addClass("active").find(">ul").show().end().parentsUntil(".gnb").filter("li").addClass("active").end().end()},mouseleave:function(){a(this).removeClass("active").find(">ul").hide()},focusout:function(){var c=a(this);setTimeout(function(){c.find(":focus").length|| -c.removeClass("active").find(">ul").hide()},1)}}).delegate("a",{focus:function(){a(this).parent("li").mouseover()}})};a("div.gnb").xeMenu()}); -jQuery(function(a){a.fn.xeModalWindow=function(){this.not(".xe-modal-window").addClass("xe-modal-window").each(function(){a(a(this).attr("href")).addClass("x").hide()}).click(function(){var c=a(this),b,d;b=a(c.attr("href"));b.parent("body").length||(d=a(''),d.click(function(){b.data("anchor").trigger("close.mw")}),b.prepend('').append('<\!--[if IE 6]>').find(">.fg").prepend(d).append(d.clone(true)).end().appendTo("body")); -b.data("anchor",c);b.data("state")=="showing"?c.trigger("close.mw"):c.trigger("open.mw");return false}).bind("open.mw",function(){var c=a(this),b,d;b=a.Event("before-open.mw");c.trigger(b);if(b.isDefaultPrevented())return false;b=a(c.attr("href"));d=c.data("duration")||"fast";b.data("state","showing");a("html,body").addClass("modalContainer");a(document).bind("keydown.mw",function(a){if(a.which==27)return c.trigger("close.mw"),false});b.fadeIn(d,function(){c.trigger("after-open.mw")}).find(">.bg").height(a(document).height()).end().find("button.modalClose:first").focus()}).bind("close.mw", -function(){var c=a(this),b,d;b=a.Event("before-close.mw");c.trigger(b);if(b.isDefaultPrevented())return false;b=a(c.attr("href"));d=c.data("duration")||"fast";b.data("state","hiding");a("html,body").removeClass("modalContainer");b.fadeOut(d,function(){c.trigger("after-close.mw")});c.focus()})};a("a.modalAnchor").xeModalWindow();a("div.modal").addClass("x").hide()}); -jQuery(function(a){var c=false;a.fn.xeContentToggler=function(){this.not(".xe-content-toggler").addClass("xe-content-toggler").each(function(){var b=a(this);$layer=a(b.attr("href"));$layer.hide().not(".xe-toggling-content").addClass("xe-toggling-content").mousedown(function(){c=true}).focusout(function(){setTimeout(function(){!c&&!$layer.find(":focus").length&&$layer.data("state")=="showing"&&b.trigger("close.tc");c=false},1)})}).click(function(){var b=a(this),d;d=a(b.attr("href"));d.data("anchor", -b);d.data("state")=="showing"?b.trigger("close.tc"):b.trigger("open.tc");return false}).bind("open.tc",function(){function b(){d.trigger("after-open.tc")}var d=a(this),g,f,e;g=a(d.attr("href"));f=d.data("effect");e=d.data("duration")||"fast";g.data("state","showing");d.trigger("before-open.tc");c=false;a(document).unbind("mousedown.tc keydown.tc").bind("mousedown.tc keydown.tc",function(b){if(b){if(b.type=="keydown"&&b.which!=27)return true;if(b.type=="mousedown"&&(b=a(b.target),b.is("html,.tgAnchor,.tgContent")|| -g.has(b).length))return true}d.trigger("close.tc");return false});switch(f){case "slide":g.slideDown(e,b);break;case "slide-h":f=g.css({"overflow-x":"",width:""}).width();g.show().css({"overflow-x":"hidden",width:"0px"}).animate({width:f},e,function(){g.css({"overflow-x":"",width:""});b()});break;case "fade":g.fadeIn(e,b);break;default:g.show(),d.trigger("after-open.tc")}}).bind("close.tc",function(){function b(){d.trigger("after-close.tc")}var d=a(this),c,f,e;a(document).unbind("mousedown.tc keydown.tc"); -c=a(d.attr("href"));f=d.data("effect");e=d.data("duration")||"fast";c.data("state","hiding");d.trigger("before-close.tc");switch(f){case "slide":c.slideUp(e,b);break;case "slide-h":c.animate({width:0},e,function(){c.hide();b()});break;case "fade":c.fadeOut(e,b);break;default:c.hide(),d.trigger("after-close.tc")}});return this};a("a.tgAnchor").xeContentToggler()}); -jQuery(function(a){a.fn.xeModuleFinder=function(){this.not(".xe-module-finder").addClass("xe-module-finder").find("a.tgAnchor.findsite").bind("before-open.tc",function(){var c,b,d;c=a(this);b=a(c.attr("href")).find(">ul");d=c.prev("input:text").val();a.exec_json("admin.getSiteAllList",{domain:d},function(d){var f=d.site_list,e,i;b.empty();c.closest(".modulefinder").find(".moduleList,.moduleIdList").attr("disabled","disabled");if(d.error||!a.isArray(f))c.trigger("close.tc");else for(e=0,i=f.length;e< -i;e++)d=a("
                                                • ").appendTo(b),a('
                                                • ');a.fn.xeSortableTable=function(){this.not(".xe-sortable-table").addClass("xe-sortable-table").delegate("button.dragBtn","mousedown.st",function(d){var g,f,e,i,k,h,j,m,l,n;if(d.which==1){f=a(this);e=f.closest("tr");i=f.closest("table");n=i.get(0).offsetParent;f=e.height();k=e.width();before_event=a.Event("before-drag.st"); -i.trigger(before_event);if(before_event.isDefaultPrevented())return false;g=d.pageY;h=c(e.get(0),n);$clone=e.attr("target",true).clone(true).appendTo(i);l=(d=i.find("thead th")).length;d.filter("[colspan]").attr("colspan",function(a,b){l+=b-1});b.find("td").attr("colspan",l);j=[];i.find("tbody>tr:not([target],.sticky,:hidden)").each(function(){var b=a(this),d;d=c(this,n);j.push({top:d.top,bottom:d.top+b.height(),$item:b})});$clone.addClass("draggable").css({position:"absolute",opacity:0.6,width:k, -height:f,left:h.left,top:h.top,zIndex:100});b.css({position:"absolute",opacity:0.6,width:k,height:"10px",left:h.left,top:h.top,backgroundColor:"#bbb",overflow:"hidden",zIndex:99}).appendTo(i);e.css("opacity",0.6);a(document).unbind("mousedown.st mouseup.st").bind("mousemove.st",function(a){var d,c,l;m=null;a=h.top-(g-a.pageY);for(d=0,c=j.length;da||da-12?(m.state="before",b.css("top",l.top-5)):(m.state="after",b.css("top",l.bottom- -5));$clone.css({top:a})}).bind("mouseup.st",function(){a(document).unbind("mousemove.st mouseup.st");e.removeAttr("target").css("opacity","");$clone.remove();b.remove();m&&(a(m.element)[m.state](e),i.trigger("after-drag.st"))})}});return this};a("table.sortable").xeSortableTable()}); -jQuery(function(a){function c(b){function d(){var a=[];f.each(function(){a.push(this.value)});return a.join("\n")}function c(){b.data("multilang-current-name")?b.find("h2").find("strong").text(i==q?h:k).end().find("a").text(i==q?k:h).show().end():b.find("h2").find("strong").text(h).end().find("a").hide()}var e,f,g="",j=0,i,h,k,o=[],q=0,s=1;b.data("init-multilang-editor")||(b.data("init-multilang-editor",true).bind("multilang-reset",function(){b.data("multilang-current-name","").find(".langInput li").find(">input:text,>textarea").val(" ").prev("label").css("visibility", -"visible");i=q;c()}).find("h2 a").click(function(){i=!i;c();return false}).end().delegate("a.langItem","click",function(){var f=a(this),r,h,k;h=b.data("multilang-list");k=f.data("multilang-name");if(h&&h[k]){h=h[k];r=b.find(".langInput");b.trigger("multilang-reset").find(".langList li.active").removeClass("active").end().data("multilang-current-name",k);f.parent("li").addClass("active");for(var p in h)h.hasOwnProperty(p)&&r.find("li."+p).find(">input:text,>textarea").data("multilang-value",h[p]).val(h[p]).prev("label").css("visibility", -"hidden");g=d();j=0;e.val(o[j]);i=s;c();return false}}).data("layer_index",m).find(".langInput").attr("id","langInput_"+m++),k=b.find("h2 strong").text(),h=b.find("h2 a").text(),f=b.find("input:text,textarea").change(function(){var a=d()==g?0:1;a!=j&&e.val(o[j=a])}),e=b.find("input[type=submit]").click(function(){function c(){b.hide().closest(".multiLangEdit").find(".vLang").eq(0).val("$user_lang->"+h).end().eq(1).val(b.find(".langInput li."+xe.current_lang).find(">input:text,>textarea").val()).end()} -function e(){var b={};if(h&&i==s)b.lang_name=h;f.each(function(){var d=a(this);b[d.parent("li").attr("class")]=d.val()});a.exec_json("module.procModuleAdminInsertLang",b,t)}function t(a){if(a&&!a.error&&a.name)h=a.name,c()}var h=b.data("multilang-current-name");d()==g?c():e();return false}),o=e.val().split("|"),e.val(o[0]))}function b(a){var b,d,c={},e;for(b=0,d=a.length;bul");!d||k?(k=false,c.parent().hide(),b.prev("input.vLang").val("")):(b.data("mle-langkey").val(""),b.prev("input.vLang").val(d),f=setTimeout(function(){b.addClass("loading");c.parent().is(":visible")&&c.parent().hide();show_waiting_message=false;a.exec_json("module.getLangListByLangcodeForAutoComplete", -{search_keyword:d},function(d){return function(f){var h=f.results,g,n;if(!f.error&&h&&e==d+1){b.removeClass("loading");c.empty();for(g=0,n=h.length;g').data("langkey",h[g].name).text(h[g].value),a("
                                                • ").append(f).appendTo(c);j.trigger("show")}}}(e++));show_waiting_message=true},100))},keydown:function(b){var d,c,e=b.which;a(this);b=j.find(">ul");if(!j.is(":visible")||a.inArray(e,[38,40,13,27])<0)return true;if(e==27)return j.trigger("hide"), -false;d=b.find("button.active");if(e==13)return d.click(),false;if(!d.length)return b.find("li>button:first").addClass("active"),false;e==38?(c=d.parent().prev("li").find(">button"),c.length||(c=b.find(">li:last>button"))):e==40&&(c=d.parent().next("li").find(">button"),c.length||(c=b.find(">li:first>button")));d.removeClass("active");c.addClass("active");return false},focus:function(){var b=a(this),d=a.trim(b.val()),c=b.closest(".multiLangEdit");b.after(j);b.data("mle-container")||b.data("mle-container", -c);b.data("mle-langkey")||b.data("mle-langkey",c.find("input.vLang:first"));(function(){var c=a.trim(b.val());c!=d&&(d=c,b.trigger("textchange"));g=setTimeout(arguments.callee,50)})()},blur:function(){clearTimeout(g);g=null;a(this).closest(".multiLangEdit").focusout()},focusout:function(){var b=a(this);clearTimeout(i);i=setTimeout(function(){h?h=false:b.find(":focus").is(".vLang,button._btnLang")||j.trigger("hide")},10)}}).delegate("a.tgAnchor.editUserLang",{"before-open.tc":function(){var e,f,g; -e=a(this);f=a(e.attr("href")).insertBefore(e);g=e.closest(".multiLangEdit").find("input.vLang,textarea.vLang");e=g.eq(0).val();g=g.eq(1).val();c(f);f.trigger("multilang-reset").removeClass("showChild").find(".langList").empty().end();f.find(".langInput li."+xe.current_lang).find(">input:text,>textarea").val(g).prev("label").css("visibility","hidden");j.trigger("hide");/^\$user_lang->(.+)$/.test(e)?(e="module.getModuleAdminLangListByName",g={lang_name:RegExp.$1}):(e="module.getModuleAdminLangListByValue", -g={value:g});show_waiting_message=false;a.exec_json(e,g,function(c){var e=c.lang_list,g;!c.error&&e&&(e=b(e),f.data("multilang-list",e),g=f.find(".langList"),a.each(e,function(b){var c=a("
                                                • ").appendTo(g),d=f.data("layer_index");a('').text(this[xe.current_lang]).data("multilang-name",b).appendTo(c)}),d(e)>1&&f.addClass("showChild"),f.find(".langList>li>a:first").click())});show_waiting_message=true}}).delegate("button._btnLang",{click:function(){var b= -a(this);k=true;j.trigger("hide");b.closest(".multiLangEdit").find("input.vLang,textarea.vLang").eq(0).val(b.data("langkey")).end().eq(1).val(b.text()).end();return false},mousedown:function(){h=true},focus:function(){a(this).mouseover()},mouseover:function(){a(this).closest("ul").find("button.active").removeClass("active")}});j=a('
                                                    ').bind("show",function(){a(this).show()}).bind("hide",function(){a(this).hide()});var m=0}); -jQuery(function(a){a(".filebox").bind("before-open.mw",function(){function c(f){d.html(f.html);d.find(".lined .select").bind("click",function(){var c=a(this).parent().find("img.filebox_item").attr("src");b.trigger("filebox.selected",[c]);b.trigger("close.mw");return false});d.find(".pagination").find("a").filter(function(){return a(this).hasClass("tgAnchor")?false:true}).bind("click",function(){var b=a(this).attr("page");a.exec_json("module.getFileBoxListHtml",{page:b},c);a(window).scrollTop(a(g).find(".modalClose").offset().top); -return false});a("#FileBoxGoTo").find("button").bind("click",function(){var b=a(this).prev("input").val();a.exec_json("module.getFileBoxListHtml",{page:b},c);a(window).scrollTop(a(g).find(".modalClose").offset().top);return false})}var b,d,g;b=a(this);g=b.attr("href");d=a(g).find(".filebox_list");a.exec_json("module.getFileBoxListHtml",{page:"1"},c)})}); -function showWaitingFogLayer(){var a=jQuery('');a.height(jQuery(window).height());jQuery(".wfsr").wrap('
                                                    ').before(a)}function hideWaitingFogLayer(){jQuery(".wfsr").prev("span").remove();jQuery(".wfsr").unwrap()}function doInstallModule(a){var c=[];c.module_name=a;exec_xml("install","procInstallAdminInstall",c,completeInstallModule);showWaitingFogLayer()} -function doUpdateModule(a){var c=[];c.module_name=a;exec_xml("install","procInstallAdminUpdate",c,completeInstallModule);showWaitingFogLayer()}function completeInstallModule(a){alert(a.message);location.reload()}jQuery(document).ready(function(a){a("body").ajaxComplete(function(){hideWaitingFogLayer()})});jQuery(function(a){a(".x>.body>.lnb").length==0&&a(".x>.body>.content").addClass("single")}); +/* NHN (developers@xpressengine.com) */ +jQuery(function($){ + // Constants + var ESC_KEY = 27; + + // Overlapping label + $('.form li').find('>input:text,>input:password,>textarea') + .filter('input[value!=""],textarea:not(:empty)').prev('label').css('visibility','hidden').end().end() + .prev('label') + .addClass('overlap') + .css({top:'15px',left:'5px'}) + .next() + .focus(function(){ + var $label = $(this).prev().stop().animate({opacity:0, left:'25px'},'fast',function(){ $label.css('visibility','hidden') }); + }) + .blur(function(){ + var $this = $(this), $label; + if($.trim($this.val()) == '') { + $label = $this.prev().stop().css('visibility','visible').animate({opacity:1, left:'5px'},'fast'); + } + }) + .end() + .parent() + .css('position', 'relative'); + + // Make selected checkbox elements bold + var $rc_label = $('input:radio+label,input:checkbox+label'), $input_rc = $rc_label.prev('input'); + $input_rc + .change(function(){ + var name = $(this).attr('name'); + $input_rc + .filter(function(){ return this.name == name }) + .next('label').css('font-weight', 'normal').end() + .filter(':checked') + .next('label').css('font-weight', 'bold').end(); + }) + .change(); + + // Toogle checkbox all + $('.form th>input:checkbox') + .change(function() { + var $this = $(this), name = $this.data('name'); + + $this.closest('table') + .find('input:checkbox') + .filter(function(){ + var $this = $(this); + return !$this.prop('disabled') && (($this.attr('name') == name) || ($this.data('name') == name)); + }) + .prop('checked', $this.prop('checked')) + .end() + .end() + .trigger('update.checkbox', [name, this.checked]); + }); + + // pagination + $.fn.xePagination = function(){ + this + .not('.xe-pagination') + .addClass('xe-pagination') + .find('span.tgContent').css('whiteSpace', 'nowrap').end() + .find('a.tgAnchor') + .each(function(idx){ + var $this = $(this); + $this.after( $($this.attr('href')) ); + }) + .end(); + + return this; + }; + $('.pagination').xePagination(); + + // Portlet Action + $('.portlet .action') + .css({display:'none',position:'absolute'}) + .parent() + .mouseleave(function(){ $(this).find('>.action').fadeOut(100); }) + .mouseenter(function(){ $(this).find('>.action').fadeIn(100); }) + .focusin(function(){ $(this).mouseenter() }) + .focusout(function(){ + var $this = $(this), timer; + + clearTimeout($this.data('timer')); + timer = setTimeout(function(){ if(!$this.find(':focus').length) $this.mouseleave() }, 10); + + $this.data('timer', timer); + }); + + // Display the dashboard in two column + $(window).resize(function(){ + if($(document).width() < 1280){ + $('.dashboard>.section>br').remove(); + $('.dashboard>.section>.portlet:odd').after('
                                                    '); + } else { + $('.dashboard>.section>br').remove(); + $('.dashboard>.section>.portlet:eq(2),.dashboard>.section>.portlet:eq(5)').after('
                                                    '); + } + }); + $(window).resize(); + + + // Popup list : 'Move to site' and 'Site map' + $('.header>.siteTool>a.i') + .bind('before-open.tc', function(){ + $(this) + .addClass('active') + .next('div.tgContent') + .find('>.section:gt(0)').hide().end() + .find('>.btnArea>button').show(); + }) + .bind('after-close.tc', function(){ + $(this).removeClass('active'); + }) + .next('#siteMapList') + .find('>.section:last') + .after('

                                                    ') + .find('+p>button') + .click(function(){ + // Display all sections then hide this button + $(this).hide().parent().prevAll('.section').show(); + }); + + $.fn.xeMask = function(){ + this + .each(function(){ + var $this = $(this), text = $this.text(); + var reg_mail = /^([\w\-\.]+?)@(([\w-]+\.)+[a-z]{2,})$/ig; + $this.data('originalText', text); + + if(reg_mail.test(text)) { + $this.data('maskedText', RegExp.$1+'...'); + } + + $this.text( $this.data('maskedText') ); + }) + .mouseover(function(){ + $(this).text( $(this).data('originalText') ); + }) + .mouseout(function(){ + $(this).text( $(this).data('maskedText') ); + }) + .focus(function(){ $(this).mouseover(); }) + .blur(function(){ $(this).mouseout(); }); + }; + $('.masked').xeMask(); +}); + +// Global Navigation Bar +jQuery(function($){ + +$.fn.xeMenu = function(){ + this + .removeClass('jx') + .attr('role', 'navigation') // WAI-ARIA role + .find('li') + .attr('role', 'menuitem') // WAI-ARIA role + .find('>ul').hide().end() + .filter(':has(>ul)') + .attr('aria-haspopup', 'true') // WAI-ARIA + .end() + .end() + .delegate('li', { + mouseover : function(){ + $(this) + .addClass('active') + .find('>ul').show().end() + .parentsUntil('.gnb') + .filter('li').addClass('active').end() + .end() + }, + mouseleave : function(){ + $(this) + .removeClass('active') + .find('>ul').hide(); + }, + focusout : function(){ + var $this = $(this); + setTimeout(function(){ + if(!$this.find(':focus').length) { + $this.removeClass('active').find('>ul').hide(); + } + }, 1); + } + }) + .delegate('a', { + focus : function(){ + $(this).parent('li').mouseover(); + } + }); +}; + +$('div.gnb').xeMenu(); + +}); + +// Modal Window +jQuery(function($){ + +var ESC = 27; + +$.fn.xeModalWindow = function(){ + this + .not('.xe-modal-window') + .addClass('xe-modal-window') + .each(function(){ + $( $(this).attr('href') ).addClass('x').hide(); + }) + .click(function(){ + var $this = $(this), $modal, $btnClose, disabled; + + // get and initialize modal window + $modal = $( $this.attr('href') ); + if(!$modal.parent('body').length) { + $btnClose = $(''); + $btnClose.click(function(){ $modal.data('anchor').trigger('close.mw') }); + + $modal + .prepend('') + .append('') + .find('>.fg') + .prepend($btnClose) + .append($btnClose.clone(true)) + .end() + .appendTo('body'); + } + + // set the related anchor + $modal.data('anchor', $this); + + if($modal.data('state') == 'showing') { + $this.trigger('close.mw'); + } else { + $this.trigger('open.mw'); + } + + return false; + }) + .bind('open.mw', function(){ + var $this = $(this), before_event, $modal, duration; + + // before event trigger + before_event = $.Event('before-open.mw'); + $this.trigger(before_event); + + // is event canceled? + if(before_event.isDefaultPrevented()) return false; + + // get modal window + $modal = $( $this.attr('href') ); + + // get duration + duration = $this.data('duration') || 'fast'; + + // set state : showing + $modal.data('state', 'showing'); + + // workaroud for IE6 + $('html,body').addClass('modalContainer'); + + // after event trigger + function after(){ $this.trigger('after-open.mw') }; + + $(document).bind('keydown.mw', function(event){ + if(event.which == ESC) { + $this.trigger('close.mw'); + return false; + } + }); + + $modal + .fadeIn(duration, after) + .find('>.bg').height($(document).height()).end() + .find('button.modalClose:first').focus(); + }) + .bind('close.mw', function(){ + var $this = $(this), before_event, $modal, duration; + + // before event trigger + before_event = $.Event('before-close.mw'); + $this.trigger(before_event); + + // is event canceled? + if(before_event.isDefaultPrevented()) return false; + + // get modal window + $modal = $( $this.attr('href') ); + + // get duration + duration = $this.data('duration') || 'fast'; + + // set state : hiding + $modal.data('state', 'hiding'); + + // workaroud for IE6 + $('html,body').removeClass('modalContainer'); + + // after event trigger + function after(){ $this.trigger('after-close.mw') }; + + $modal.fadeOut(duration, after); + $this.focus(); + }); +}; +$('a.modalAnchor').xeModalWindow(); +$('div.modal').addClass('x').hide(); + +}); + +// Content Toggler +jQuery(function($){ + +var dont_close_this_time = false; +var ESC = 27; + +$.fn.xeContentToggler = function(){ + this + .not('.xe-content-toggler') + .addClass('xe-content-toggler') + .each(function(){ + var $anchor = $(this); $layer = $($anchor.attr('href')); + + $layer.hide() + .not('.xe-toggling-content') + .addClass('xe-toggling-content') + .mousedown(function(event){ dont_close_this_time = true }) + .focusout(function(event){ + setTimeout(function(){ + if(!dont_close_this_time && !$layer.find(':focus').length && $layer.data('state') == 'showing') $anchor.trigger('close.tc'); + dont_close_this_time = false; + }, 1); + }); + }) + .click(function(){ + var $this = $(this), $layer; + + // get content container + $layer = $( $this.attr('href') ); + + // set anchor object + $layer.data('anchor', $this); + + if($layer.data('state') == 'showing') { + $this.trigger('close.tc'); + } else { + $this.trigger('open.tc'); + } + + return false; + }) + .bind('open.tc', function(){ + var $this = $(this), $layer, effect, duration; + + // get content container + $layer = $( $this.attr('href') ); + + // get effeect + effect = $this.data('effect'); + + // get duration + duration = $this.data('duration') || 'fast'; + + // set state : showing + $layer.data('state', 'showing'); + + // before event trigger + $this.trigger('before-open.tc'); + + dont_close_this_time = false; + + // When mouse button is down or when ESC key is pressed close this layer + $(document) + .unbind('mousedown.tc keydown.tc') + .bind('mousedown.tc keydown.tc', + function(event){ + if(event) { + if(event.type == 'keydown' && event.which != ESC) return true; + if(event.type == 'mousedown') { + var $t = $(event.target); + if($t.is('html,.tgAnchor,.tgContent') || $layer.has($t).length) return true; + } + } + + $this.trigger('close.tc'); + + return false; + } + ); + + // triggering after + function trigger_after(){ $this.trigger('after-open.tc') } + + switch(effect) { + case 'slide': + $layer.slideDown(duration, trigger_after); + break; + case 'slide-h': + var w = $layer.css({'overflow-x':'',width:''}).width(); + $layer + .show() + .css({'overflow-x':'hidden',width:'0px'}) + .animate({width:w}, duration, function(){ $layer.css({'overflow-x':'',width:''}); trigger_after(); }); + break; + case 'fade': + $layer.fadeIn(duration, trigger_after); + break; + default: + $layer.show(); + $this.trigger('after-open.tc'); + } + }) + .bind('close.tc', function(){ + var $this = $(this), $layer, effect, duration; + + // unbind document's event handlers + $(document).unbind('mousedown.tc keydown.tc'); + + // get content container + $layer = $( $this.attr('href') ); + + // get effeect + effect = $this.data('effect'); + + // get duration + duration = $this.data('duration') || 'fast'; + + // set state : hiding + $layer.data('state', 'hiding'); + + // before event trigger + $this.trigger('before-close.tc'); + + // triggering after + function trigger_after(){ $this.trigger('after-close.tc') }; + + // close this layer + switch(effect) { + case 'slide': + $layer.slideUp(duration, trigger_after); + break; + case 'slide-h': + $layer.animate({width:0}, duration, function(){ $layer.hide(); trigger_after(); }); + break; + case 'fade': + $layer.fadeOut(duration, trigger_after); + break; + default: + $layer.hide(); + $this.trigger('after-close.tc'); + } + }); + + return this; +}; + +$('a.tgAnchor').xeContentToggler(); + +}); + +// Module finder +jQuery(function($){ + +$.fn.xeModuleFinder = function(){ + this + .not('.xe-module-finder') + .addClass('xe-module-finder') + .find('a.tgAnchor.findsite') + .bind('before-open.tc', function(){ + var $this, $ul, val; + + $this = $(this); + $ul = $($this.attr('href')).find('>ul'); + val = $this.prev('input:text').val(); + + function on_complete(data) { + var $li, list = data.site_list, i, c; + + $ul.empty(); + $this.closest('.modulefinder').find('.moduleList,.moduleIdList').attr('disabled','disabled'); + + if(data.error || !$.isArray(list)) { + $this.trigger('close.tc'); + return; + } + + for(i=0,c=list.length; i < c; i++) { + $li = $('
                                                  • ').appendTo($ul); + $('
                                                  • '); + +$.fn.xeSortableTable = function(){ + this + .not('.xe-sortable-table') + .addClass('xe-sortable-table') + .delegate('button.dragBtn', 'mousedown.st', function(event){ + var $this, $tr, $table, $th, height, width, offset, position, offsets, i, dropzone, cols, ofspar; + + if(event.which != 1) return; + + $this = $(this); + $tr = $this.closest('tr'); + $table = $this.closest('table'); + ofspar = $table.get(0).offsetParent; + height = $tr.height(); + width = $tr.width(); + + // before event trigger + before_event = $.Event('before-drag.st'); + $table.trigger(before_event); + + // is event canceled? + if(before_event.isDefaultPrevented()) return false; + + position = {x:event.pageX, y:event.pageY}; + offset = getOffset($tr.get(0), ofspar); + + $clone = $tr.attr('target', true).clone(true).appendTo($table); + + // get colspan + cols = ($th=$table.find('thead th')).length; + $th.filter('[colspan]').attr('colspan', function(idx,attr){ cols += attr - 1; }); + $holder.find('td').attr('colspan', cols); + + // get offsets of all list-item elements + offsets = []; + $table.find('tbody>tr:not([target],.sticky,:hidden)').each(function() { + var $this = $(this), o; + + o = getOffset(this, ofspar); + offsets.push({top:o.top, bottom:o.top+$this.height(), $item:$this}); + }); + + $clone + .addClass('draggable') + .css({ + position: 'absolute', + opacity : .6, + width : width, + height : height, + left : offset.left, + top : offset.top, + zIndex : 100 + }); + + // Set a place holder + $holder + .css({ + position:'absolute', + opacity : .6, + width : width, + height : '10px', + left : offset.left, + top : offset.top, + backgroundColor : '#bbb', + overflow: 'hidden', + zIndex : 99 + }) + .appendTo($table); + + $tr.css('opacity', .6); + + $(document) + .unbind('mousedown.st mouseup.st') + .bind('mousemove.st', function(event) { + var diff, nTop, item, i, c, o; + + dropzone = null; + + diff = {x:position.x-event.pageX, y:position.y-event.pageY}; + nTop = offset.top - diff.y; + + for(i=0,c=offsets.length; i < c; i++) { + o = offsets[i]; + if( (i && o.top > nTop) || ((i < c-1) && o.bottom < nTop)) continue; + + dropzone = {element:o.$item}; + if(o.top > nTop - 12) { + dropzone.state = 'before'; + $holder.css('top', o.top-5); + } else { + dropzone.state = 'after'; + $holder.css('top', o.bottom-5); + } + } + + $clone.css({top:nTop}); + }) + .bind('mouseup.st', function(event) { + var $dropzone; + + dragging = false; + + $(document).unbind('mousemove.st mouseup.st'); + $tr.removeAttr('target').css('opacity', ''); + $clone.remove(); + $holder.remove(); + + if(!dropzone) return; + $dropzone = $(dropzone.element); + + // use the clone for animation + $dropzone[dropzone.state]($tr); + + $table.trigger('after-drag.st'); + }); + }) + + return this; +}; +$('table.sortable').xeSortableTable(); + + +function getOffset(elem, offsetParent) { + var top = 0, left = 0; + + while(elem && elem != offsetParent) { + top += elem.offsetTop; + left += elem.offsetLeft; + + elem = elem.offsetParent; + } + + return {top:top, left:left}; +} + +}); + +// Language selector +jQuery(function($){ + +var w_timer = null, r_timer = null, r_idx = 0, f_timer = null, skip_textchange=false, keep_showing=false, $suggest; +var ESC=27, UP=38, DOWN=40, ENTER=13; + +$('.multiLangEdit') + .delegate('input.vLang:text,textarea.vLang', { + textchange : function(){ + var $this = $(this), val = $.trim($this.val()), $ul, $container; + + if(r_timer) { + clearTimeout(r_timer); + r_timer = null; + } + + $container = $this.data('mle-container'); + $ul = $suggest.find('>ul'); + + if(!val || skip_textchange) { + skip_textchange = false; + $ul.parent().hide(); + $this.prev('input.vLang').val(''); + return; + } + + // remove lagnauge key + $this.data('mle-langkey').val(''); + + // copy current string to hidden input + $this.prev('input.vLang').val(val); + + function request() { + $this.addClass('loading'); + + if($ul.parent().is(':visible')) $ul.parent().hide(); + + show_waiting_message = false; + $.exec_json( + 'module.getLangListByLangcodeForAutoComplete', + {search_keyword:val}, + (function(i){ return function(data){ on_complete(data,i) } })(r_idx++) + ); + show_waiting_message = true; + }; + + function on_complete(data, idx){ + var results = data.results, $btn, i, c; + + if(data.error || !results || (r_idx != idx+1)) return; + + $this.removeClass('loading'); + + $ul.empty(); + for(i=0,c=results.length; i < c; i++) { + $btn = $('

                                                    ') - .find('+p>button') - .click(function(){ - // Display all sections then hide this button - $(this).hide().parent().prevAll('.section').show(); - }); - - $.fn.xeMask = function(){ - this - .each(function(){ - var $this = $(this), text = $this.text(); - var reg_mail = /^([\w\-\.]+?)@(([\w-]+\.)+[a-z]{2,})$/ig; - $this.data('originalText', text); - - if(reg_mail.test(text)) { - $this.data('maskedText', RegExp.$1+'...'); - } - - $this.text( $this.data('maskedText') ); - }) - .mouseover(function(){ - $(this).text( $(this).data('originalText') ); - }) - .mouseout(function(){ - $(this).text( $(this).data('maskedText') ); - }) - .focus(function(){ $(this).mouseover(); }) - .blur(function(){ $(this).mouseout(); }); - }; - $('.masked').xeMask(); -}); - -// Global Navigation Bar -jQuery(function($){ - -$.fn.xeMenu = function(){ - this - .removeClass('jx') - .attr('role', 'navigation') // WAI-ARIA role - .find('li') - .attr('role', 'menuitem') // WAI-ARIA role - .find('>ul').hide().end() - .filter(':has(>ul)') - .attr('aria-haspopup', 'true') // WAI-ARIA - .end() - .end() - .delegate('li', { - mouseover : function(){ - $(this) - .addClass('active') - .find('>ul').show().end() - .parentsUntil('.gnb') - .filter('li').addClass('active').end() - .end() - }, - mouseleave : function(){ - $(this) - .removeClass('active') - .find('>ul').hide(); - }, - focusout : function(){ - var $this = $(this); - setTimeout(function(){ - if(!$this.find(':focus').length) { - $this.removeClass('active').find('>ul').hide(); - } - }, 1); - } - }) - .delegate('a', { - focus : function(){ - $(this).parent('li').mouseover(); - } - }); -}; - -$('div.gnb').xeMenu(); - -}); - -// Modal Window -jQuery(function($){ - -var ESC = 27; - -$.fn.xeModalWindow = function(){ - this - .not('.xe-modal-window') - .addClass('xe-modal-window') - .each(function(){ - $( $(this).attr('href') ).addClass('x').hide(); - }) - .click(function(){ - var $this = $(this), $modal, $btnClose, disabled; - - // get and initialize modal window - $modal = $( $this.attr('href') ); - if(!$modal.parent('body').length) { - $btnClose = $(''); - $btnClose.click(function(){ $modal.data('anchor').trigger('close.mw') }); - - $modal - .prepend('') - .append('') - .find('>.fg') - .prepend($btnClose) - .append($btnClose.clone(true)) - .end() - .appendTo('body'); - } - - // set the related anchor - $modal.data('anchor', $this); - - if($modal.data('state') == 'showing') { - $this.trigger('close.mw'); - } else { - $this.trigger('open.mw'); - } - - return false; - }) - .bind('open.mw', function(){ - var $this = $(this), before_event, $modal, duration; - - // before event trigger - before_event = $.Event('before-open.mw'); - $this.trigger(before_event); - - // is event canceled? - if(before_event.isDefaultPrevented()) return false; - - // get modal window - $modal = $( $this.attr('href') ); - - // get duration - duration = $this.data('duration') || 'fast'; - - // set state : showing - $modal.data('state', 'showing'); - - // workaroud for IE6 - $('html,body').addClass('modalContainer'); - - // after event trigger - function after(){ $this.trigger('after-open.mw') }; - - $(document).bind('keydown.mw', function(event){ - if(event.which == ESC) { - $this.trigger('close.mw'); - return false; - } - }); - - $modal - .fadeIn(duration, after) - .find('>.bg').height($(document).height()).end() - .find('button.modalClose:first').focus(); - }) - .bind('close.mw', function(){ - var $this = $(this), before_event, $modal, duration; - - // before event trigger - before_event = $.Event('before-close.mw'); - $this.trigger(before_event); - - // is event canceled? - if(before_event.isDefaultPrevented()) return false; - - // get modal window - $modal = $( $this.attr('href') ); - - // get duration - duration = $this.data('duration') || 'fast'; - - // set state : hiding - $modal.data('state', 'hiding'); - - // workaroud for IE6 - $('html,body').removeClass('modalContainer'); - - // after event trigger - function after(){ $this.trigger('after-close.mw') }; - - $modal.fadeOut(duration, after); - $this.focus(); - }); -}; -$('a.modalAnchor').xeModalWindow(); -$('div.modal').addClass('x').hide(); - -}); - -// Content Toggler -jQuery(function($){ - -var dont_close_this_time = false; -var ESC = 27; - -$.fn.xeContentToggler = function(){ - this - .not('.xe-content-toggler') - .addClass('xe-content-toggler') - .each(function(){ - var $anchor = $(this); $layer = $($anchor.attr('href')); - - $layer.hide() - .not('.xe-toggling-content') - .addClass('xe-toggling-content') - .mousedown(function(event){ dont_close_this_time = true }) - .focusout(function(event){ - setTimeout(function(){ - if(!dont_close_this_time && !$layer.find(':focus').length && $layer.data('state') == 'showing') $anchor.trigger('close.tc'); - dont_close_this_time = false; - }, 1); - }); - }) - .click(function(){ - var $this = $(this), $layer; - - // get content container - $layer = $( $this.attr('href') ); - - // set anchor object - $layer.data('anchor', $this); - - if($layer.data('state') == 'showing') { - $this.trigger('close.tc'); - } else { - $this.trigger('open.tc'); - } - - return false; - }) - .bind('open.tc', function(){ - var $this = $(this), $layer, effect, duration; - - // get content container - $layer = $( $this.attr('href') ); - - // get effeect - effect = $this.data('effect'); - - // get duration - duration = $this.data('duration') || 'fast'; - - // set state : showing - $layer.data('state', 'showing'); - - // before event trigger - $this.trigger('before-open.tc'); - - dont_close_this_time = false; - - // When mouse button is down or when ESC key is pressed close this layer - $(document) - .unbind('mousedown.tc keydown.tc') - .bind('mousedown.tc keydown.tc', - function(event){ - if(event) { - if(event.type == 'keydown' && event.which != ESC) return true; - if(event.type == 'mousedown') { - var $t = $(event.target); - if($t.is('html,.tgAnchor,.tgContent') || $layer.has($t).length) return true; - } - } - - $this.trigger('close.tc'); - - return false; - } - ); - - // triggering after - function trigger_after(){ $this.trigger('after-open.tc') } - - switch(effect) { - case 'slide': - $layer.slideDown(duration, trigger_after); - break; - case 'slide-h': - var w = $layer.css({'overflow-x':'',width:''}).width(); - $layer - .show() - .css({'overflow-x':'hidden',width:'0px'}) - .animate({width:w}, duration, function(){ $layer.css({'overflow-x':'',width:''}); trigger_after(); }); - break; - case 'fade': - $layer.fadeIn(duration, trigger_after); - break; - default: - $layer.show(); - $this.trigger('after-open.tc'); - } - }) - .bind('close.tc', function(){ - var $this = $(this), $layer, effect, duration; - - // unbind document's event handlers - $(document).unbind('mousedown.tc keydown.tc'); - - // get content container - $layer = $( $this.attr('href') ); - - // get effeect - effect = $this.data('effect'); - - // get duration - duration = $this.data('duration') || 'fast'; - - // set state : hiding - $layer.data('state', 'hiding'); - - // before event trigger - $this.trigger('before-close.tc'); - - // triggering after - function trigger_after(){ $this.trigger('after-close.tc') }; - - // close this layer - switch(effect) { - case 'slide': - $layer.slideUp(duration, trigger_after); - break; - case 'slide-h': - $layer.animate({width:0}, duration, function(){ $layer.hide(); trigger_after(); }); - break; - case 'fade': - $layer.fadeOut(duration, trigger_after); - break; - default: - $layer.hide(); - $this.trigger('after-close.tc'); - } - }); - - return this; -}; - -$('a.tgAnchor').xeContentToggler(); - -}); - -// Module finder -jQuery(function($){ - -$.fn.xeModuleFinder = function(){ - this - .not('.xe-module-finder') - .addClass('xe-module-finder') - .find('a.tgAnchor.findsite') - .bind('before-open.tc', function(){ - var $this, $ul, val; - - $this = $(this); - $ul = $($this.attr('href')).find('>ul'); - val = $this.prev('input:text').val(); - - function on_complete(data) { - var $li, list = data.site_list, i, c; - - $ul.empty(); - $this.closest('.modulefinder').find('.moduleList,.moduleIdList').attr('disabled','disabled'); - - if(data.error || !$.isArray(list)) { - $this.trigger('close.tc'); - return; - } - - for(i=0,c=list.length; i < c; i++) { - $li = $('
                                                  • ').appendTo($ul); - $('
                                                  • '); - -$.fn.xeSortableTable = function(){ - this - .not('.xe-sortable-table') - .addClass('xe-sortable-table') - .delegate('button.dragBtn', 'mousedown.st', function(event){ - var $this, $tr, $table, $th, height, width, offset, position, offsets, i, dropzone, cols, ofspar; - - if(event.which != 1) return; - - $this = $(this); - $tr = $this.closest('tr'); - $table = $this.closest('table'); - ofspar = $table.get(0).offsetParent; - height = $tr.height(); - width = $tr.width(); - - // before event trigger - before_event = $.Event('before-drag.st'); - $table.trigger(before_event); - - // is event canceled? - if(before_event.isDefaultPrevented()) return false; - - position = {x:event.pageX, y:event.pageY}; - offset = getOffset($tr.get(0), ofspar); - - $clone = $tr.attr('target', true).clone(true).appendTo($table); - - // get colspan - cols = ($th=$table.find('thead th')).length; - $th.filter('[colspan]').attr('colspan', function(idx,attr){ cols += attr - 1; }); - $holder.find('td').attr('colspan', cols); - - // get offsets of all list-item elements - offsets = []; - $table.find('tbody>tr:not([target],.sticky,:hidden)').each(function() { - var $this = $(this), o; - - o = getOffset(this, ofspar); - offsets.push({top:o.top, bottom:o.top+$this.height(), $item:$this}); - }); - - $clone - .addClass('draggable') - .css({ - position: 'absolute', - opacity : .6, - width : width, - height : height, - left : offset.left, - top : offset.top, - zIndex : 100 - }); - - // Set a place holder - $holder - .css({ - position:'absolute', - opacity : .6, - width : width, - height : '10px', - left : offset.left, - top : offset.top, - backgroundColor : '#bbb', - overflow: 'hidden', - zIndex : 99 - }) - .appendTo($table); - - $tr.css('opacity', .6); - - $(document) - .unbind('mousedown.st mouseup.st') - .bind('mousemove.st', function(event) { - var diff, nTop, item, i, c, o; - - dropzone = null; - - diff = {x:position.x-event.pageX, y:position.y-event.pageY}; - nTop = offset.top - diff.y; - - for(i=0,c=offsets.length; i < c; i++) { - o = offsets[i]; - if( (i && o.top > nTop) || ((i < c-1) && o.bottom < nTop)) continue; - - dropzone = {element:o.$item}; - if(o.top > nTop - 12) { - dropzone.state = 'before'; - $holder.css('top', o.top-5); - } else { - dropzone.state = 'after'; - $holder.css('top', o.bottom-5); - } - } - - $clone.css({top:nTop}); - }) - .bind('mouseup.st', function(event) { - var $dropzone; - - dragging = false; - - $(document).unbind('mousemove.st mouseup.st'); - $tr.removeAttr('target').css('opacity', ''); - $clone.remove(); - $holder.remove(); - - if(!dropzone) return; - $dropzone = $(dropzone.element); - - // use the clone for animation - $dropzone[dropzone.state]($tr); - - $table.trigger('after-drag.st'); - }); - }) - - return this; -}; -$('table.sortable').xeSortableTable(); - - -function getOffset(elem, offsetParent) { - var top = 0, left = 0; - - while(elem && elem != offsetParent) { - top += elem.offsetTop; - left += elem.offsetLeft; - - elem = elem.offsetParent; - } - - return {top:top, left:left}; -} - -}); - -// Language selector -jQuery(function($){ - -var w_timer = null, r_timer = null, r_idx = 0, f_timer = null, skip_textchange=false, keep_showing=false, $suggest; -var ESC=27, UP=38, DOWN=40, ENTER=13; - -$('.multiLangEdit') - .delegate('input.vLang:text,textarea.vLang', { - textchange : function(){ - var $this = $(this), val = $.trim($this.val()), $ul, $container; - - if(r_timer) { - clearTimeout(r_timer); - r_timer = null; - } - - $container = $this.data('mle-container'); - $ul = $suggest.find('>ul'); - - if(!val || skip_textchange) { - skip_textchange = false; - $ul.parent().hide(); - $this.prev('input.vLang').val(''); - return; - } - - // remove lagnauge key - $this.data('mle-langkey').val(''); - - // copy current string to hidden input - $this.prev('input.vLang').val(val); - - function request() { - $this.addClass('loading'); - - if($ul.parent().is(':visible')) $ul.parent().hide(); - - show_waiting_message = false; - $.exec_json( - 'module.getLangListByLangcodeForAutoComplete', - {search_keyword:val}, - (function(i){ return function(data){ on_complete(data,i) } })(r_idx++) - ); - show_waiting_message = true; - }; - - function on_complete(data, idx){ - var results = data.results, $btn, i, c; - - if(data.error || !results || (r_idx != idx+1)) return; - - $this.removeClass('loading'); - - $ul.empty(); - for(i=0,c=results.length; i < c; i++) { - $btn = $('

                                                    ').find("+p>button").click(function(){a(this).hide().parent().prevAll(".section").show()});a.fn.xeMask=function(){this.each(function(){var b=a(this),d=b.text();b.data("originalText",d);/^([\w\-\.]+?)@(([\w-]+\.)+[a-z]{2,})$/ig.test(d)&& +b.data("maskedText",RegExp.$1+"...");b.text(b.data("maskedText"))}).mouseover(function(){a(this).text(a(this).data("originalText"))}).mouseout(function(){a(this).text(a(this).data("maskedText"))}).focus(function(){a(this).mouseover()}).blur(function(){a(this).mouseout()})};a(".masked").xeMask()}); +jQuery(function(a){a.fn.xeMenu=function(){this.removeClass("jx").attr("role","navigation").find("li").attr("role","menuitem").find(">ul").hide().end().filter(":has(>ul)").attr("aria-haspopup","true").end().end().delegate("li",{mouseover:function(){a(this).addClass("active").find(">ul").show().end().parentsUntil(".gnb").filter("li").addClass("active").end().end()},mouseleave:function(){a(this).removeClass("active").find(">ul").hide()},focusout:function(){var c=a(this);setTimeout(function(){c.find(":focus").length|| +c.removeClass("active").find(">ul").hide()},1)}}).delegate("a",{focus:function(){a(this).parent("li").mouseover()}})};a("div.gnb").xeMenu()}); +jQuery(function(a){a.fn.xeModalWindow=function(){this.not(".xe-modal-window").addClass("xe-modal-window").each(function(){a(a(this).attr("href")).addClass("x").hide()}).click(function(){var c=a(this),b,d;b=a(c.attr("href"));b.parent("body").length||(d=a(''),d.click(function(){b.data("anchor").trigger("close.mw")}),b.prepend('').append('<\!--[if IE 6]>').find(">.fg").prepend(d).append(d.clone(true)).end().appendTo("body")); +b.data("anchor",c);b.data("state")=="showing"?c.trigger("close.mw"):c.trigger("open.mw");return false}).bind("open.mw",function(){var c=a(this),b,d;b=a.Event("before-open.mw");c.trigger(b);if(b.isDefaultPrevented())return false;b=a(c.attr("href"));d=c.data("duration")||"fast";b.data("state","showing");a("html,body").addClass("modalContainer");a(document).bind("keydown.mw",function(a){if(a.which==27)return c.trigger("close.mw"),false});b.fadeIn(d,function(){c.trigger("after-open.mw")}).find(">.bg").height(a(document).height()).end().find("button.modalClose:first").focus()}).bind("close.mw", +function(){var c=a(this),b,d;b=a.Event("before-close.mw");c.trigger(b);if(b.isDefaultPrevented())return false;b=a(c.attr("href"));d=c.data("duration")||"fast";b.data("state","hiding");a("html,body").removeClass("modalContainer");b.fadeOut(d,function(){c.trigger("after-close.mw")});c.focus()})};a("a.modalAnchor").xeModalWindow();a("div.modal").addClass("x").hide()}); +jQuery(function(a){var c=false;a.fn.xeContentToggler=function(){this.not(".xe-content-toggler").addClass("xe-content-toggler").each(function(){var b=a(this);$layer=a(b.attr("href"));$layer.hide().not(".xe-toggling-content").addClass("xe-toggling-content").mousedown(function(){c=true}).focusout(function(){setTimeout(function(){!c&&!$layer.find(":focus").length&&$layer.data("state")=="showing"&&b.trigger("close.tc");c=false},1)})}).click(function(){var b=a(this),d;d=a(b.attr("href"));d.data("anchor", +b);d.data("state")=="showing"?b.trigger("close.tc"):b.trigger("open.tc");return false}).bind("open.tc",function(){function b(){d.trigger("after-open.tc")}var d=a(this),g,f,e;g=a(d.attr("href"));f=d.data("effect");e=d.data("duration")||"fast";g.data("state","showing");d.trigger("before-open.tc");c=false;a(document).unbind("mousedown.tc keydown.tc").bind("mousedown.tc keydown.tc",function(b){if(b){if(b.type=="keydown"&&b.which!=27)return true;if(b.type=="mousedown"&&(b=a(b.target),b.is("html,.tgAnchor,.tgContent")|| +g.has(b).length))return true}d.trigger("close.tc");return false});switch(f){case "slide":g.slideDown(e,b);break;case "slide-h":f=g.css({"overflow-x":"",width:""}).width();g.show().css({"overflow-x":"hidden",width:"0px"}).animate({width:f},e,function(){g.css({"overflow-x":"",width:""});b()});break;case "fade":g.fadeIn(e,b);break;default:g.show(),d.trigger("after-open.tc")}}).bind("close.tc",function(){function b(){d.trigger("after-close.tc")}var d=a(this),c,f,e;a(document).unbind("mousedown.tc keydown.tc"); +c=a(d.attr("href"));f=d.data("effect");e=d.data("duration")||"fast";c.data("state","hiding");d.trigger("before-close.tc");switch(f){case "slide":c.slideUp(e,b);break;case "slide-h":c.animate({width:0},e,function(){c.hide();b()});break;case "fade":c.fadeOut(e,b);break;default:c.hide(),d.trigger("after-close.tc")}});return this};a("a.tgAnchor").xeContentToggler()}); +jQuery(function(a){a.fn.xeModuleFinder=function(){this.not(".xe-module-finder").addClass("xe-module-finder").find("a.tgAnchor.findsite").bind("before-open.tc",function(){var c,b,d;c=a(this);b=a(c.attr("href")).find(">ul");d=c.prev("input:text").val();a.exec_json("admin.getSiteAllList",{domain:d},function(d){var f=d.site_list,e,i;b.empty();c.closest(".modulefinder").find(".moduleList,.moduleIdList").attr("disabled","disabled");if(d.error||!a.isArray(f))c.trigger("close.tc");else for(e=0,i=f.length;e< +i;e++)d=a("
                                                  • ").appendTo(b),a('
                                                  • ');a.fn.xeSortableTable=function(){this.not(".xe-sortable-table").addClass("xe-sortable-table").delegate("button.dragBtn","mousedown.st",function(d){var g,f,e,i,k,h,j,m,l,n;if(d.which==1){f=a(this);e=f.closest("tr");i=f.closest("table");n=i.get(0).offsetParent;f=e.height();k=e.width();before_event=a.Event("before-drag.st"); +i.trigger(before_event);if(before_event.isDefaultPrevented())return false;g=d.pageY;h=c(e.get(0),n);$clone=e.attr("target",true).clone(true).appendTo(i);l=(d=i.find("thead th")).length;d.filter("[colspan]").attr("colspan",function(a,b){l+=b-1});b.find("td").attr("colspan",l);j=[];i.find("tbody>tr:not([target],.sticky,:hidden)").each(function(){var b=a(this),d;d=c(this,n);j.push({top:d.top,bottom:d.top+b.height(),$item:b})});$clone.addClass("draggable").css({position:"absolute",opacity:0.6,width:k, +height:f,left:h.left,top:h.top,zIndex:100});b.css({position:"absolute",opacity:0.6,width:k,height:"10px",left:h.left,top:h.top,backgroundColor:"#bbb",overflow:"hidden",zIndex:99}).appendTo(i);e.css("opacity",0.6);a(document).unbind("mousedown.st mouseup.st").bind("mousemove.st",function(a){var d,c,l;m=null;a=h.top-(g-a.pageY);for(d=0,c=j.length;da||da-12?(m.state="before",b.css("top",l.top-5)):(m.state="after",b.css("top",l.bottom- +5));$clone.css({top:a})}).bind("mouseup.st",function(){a(document).unbind("mousemove.st mouseup.st");e.removeAttr("target").css("opacity","");$clone.remove();b.remove();m&&(a(m.element)[m.state](e),i.trigger("after-drag.st"))})}});return this};a("table.sortable").xeSortableTable()}); +jQuery(function(a){function c(b){function d(){var a=[];f.each(function(){a.push(this.value)});return a.join("\n")}function c(){b.data("multilang-current-name")?b.find("h2").find("strong").text(i==q?h:k).end().find("a").text(i==q?k:h).show().end():b.find("h2").find("strong").text(h).end().find("a").hide()}var e,f,g="",j=0,i,h,k,o=[],q=0,s=1;b.data("init-multilang-editor")||(b.data("init-multilang-editor",true).bind("multilang-reset",function(){b.data("multilang-current-name","").find(".langInput li").find(">input:text,>textarea").val(" ").prev("label").css("visibility", +"visible");i=q;c()}).find("h2 a").click(function(){i=!i;c();return false}).end().delegate("a.langItem","click",function(){var f=a(this),r,h,k;h=b.data("multilang-list");k=f.data("multilang-name");if(h&&h[k]){h=h[k];r=b.find(".langInput");b.trigger("multilang-reset").find(".langList li.active").removeClass("active").end().data("multilang-current-name",k);f.parent("li").addClass("active");for(var p in h)h.hasOwnProperty(p)&&r.find("li."+p).find(">input:text,>textarea").data("multilang-value",h[p]).val(h[p]).prev("label").css("visibility", +"hidden");g=d();j=0;e.val(o[j]);i=s;c();return false}}).data("layer_index",m).find(".langInput").attr("id","langInput_"+m++),k=b.find("h2 strong").text(),h=b.find("h2 a").text(),f=b.find("input:text,textarea").change(function(){var a=d()==g?0:1;a!=j&&e.val(o[j=a])}),e=b.find("input[type=submit]").click(function(){function c(){b.hide().closest(".multiLangEdit").find(".vLang").eq(0).val("$user_lang->"+h).end().eq(1).val(b.find(".langInput li."+xe.current_lang).find(">input:text,>textarea").val()).end()} +function e(){var b={};if(h&&i==s)b.lang_name=h;f.each(function(){var d=a(this);b[d.parent("li").attr("class")]=d.val()});a.exec_json("module.procModuleAdminInsertLang",b,t)}function t(a){if(a&&!a.error&&a.name)h=a.name,c()}var h=b.data("multilang-current-name");d()==g?c():e();return false}),o=e.val().split("|"),e.val(o[0]))}function b(a){var b,d,c={},e;for(b=0,d=a.length;bul");!d||k?(k=false,c.parent().hide(),b.prev("input.vLang").val("")):(b.data("mle-langkey").val(""),b.prev("input.vLang").val(d),f=setTimeout(function(){b.addClass("loading");c.parent().is(":visible")&&c.parent().hide();show_waiting_message=false;a.exec_json("module.getLangListByLangcodeForAutoComplete", +{search_keyword:d},function(d){return function(f){var h=f.results,g,n;if(!f.error&&h&&e==d+1){b.removeClass("loading");c.empty();for(g=0,n=h.length;g').data("langkey",h[g].name).text(h[g].value),a("
                                                  • ").append(f).appendTo(c);j.trigger("show")}}}(e++));show_waiting_message=true},100))},keydown:function(b){var d,c,e=b.which;a(this);b=j.find(">ul");if(!j.is(":visible")||a.inArray(e,[38,40,13,27])<0)return true;if(e==27)return j.trigger("hide"), +false;d=b.find("button.active");if(e==13)return d.click(),false;if(!d.length)return b.find("li>button:first").addClass("active"),false;e==38?(c=d.parent().prev("li").find(">button"),c.length||(c=b.find(">li:last>button"))):e==40&&(c=d.parent().next("li").find(">button"),c.length||(c=b.find(">li:first>button")));d.removeClass("active");c.addClass("active");return false},focus:function(){var b=a(this),d=a.trim(b.val()),c=b.closest(".multiLangEdit");b.after(j);b.data("mle-container")||b.data("mle-container", +c);b.data("mle-langkey")||b.data("mle-langkey",c.find("input.vLang:first"));(function(){var c=a.trim(b.val());c!=d&&(d=c,b.trigger("textchange"));g=setTimeout(arguments.callee,50)})()},blur:function(){clearTimeout(g);g=null;a(this).closest(".multiLangEdit").focusout()},focusout:function(){var b=a(this);clearTimeout(i);i=setTimeout(function(){h?h=false:b.find(":focus").is(".vLang,button._btnLang")||j.trigger("hide")},10)}}).delegate("a.tgAnchor.editUserLang",{"before-open.tc":function(){var e,f,g; +e=a(this);f=a(e.attr("href")).insertBefore(e);g=e.closest(".multiLangEdit").find("input.vLang,textarea.vLang");e=g.eq(0).val();g=g.eq(1).val();c(f);f.trigger("multilang-reset").removeClass("showChild").find(".langList").empty().end();f.find(".langInput li."+xe.current_lang).find(">input:text,>textarea").val(g).prev("label").css("visibility","hidden");j.trigger("hide");/^\$user_lang->(.+)$/.test(e)?(e="module.getModuleAdminLangListByName",g={lang_name:RegExp.$1}):(e="module.getModuleAdminLangListByValue", +g={value:g});show_waiting_message=false;a.exec_json(e,g,function(c){var e=c.lang_list,g;!c.error&&e&&(e=b(e),f.data("multilang-list",e),g=f.find(".langList"),a.each(e,function(b){var c=a("
                                                  • ").appendTo(g),d=f.data("layer_index");a('').text(this[xe.current_lang]).data("multilang-name",b).appendTo(c)}),d(e)>1&&f.addClass("showChild"),f.find(".langList>li>a:first").click())});show_waiting_message=true}}).delegate("button._btnLang",{click:function(){var b= +a(this);k=true;j.trigger("hide");b.closest(".multiLangEdit").find("input.vLang,textarea.vLang").eq(0).val(b.data("langkey")).end().eq(1).val(b.text()).end();return false},mousedown:function(){h=true},focus:function(){a(this).mouseover()},mouseover:function(){a(this).closest("ul").find("button.active").removeClass("active")}});j=a('
                                                      ').bind("show",function(){a(this).show()}).bind("hide",function(){a(this).hide()});var m=0}); +jQuery(function(a){a(".filebox").bind("before-open.mw",function(){function c(f){d.html(f.html);d.find(".lined .select").bind("click",function(){var c=a(this).parent().find("img.filebox_item").attr("src");b.trigger("filebox.selected",[c]);b.trigger("close.mw");return false});d.find(".pagination").find("a").filter(function(){return a(this).hasClass("tgAnchor")?false:true}).bind("click",function(){var b=a(this).attr("page");a.exec_json("module.getFileBoxListHtml",{page:b},c);a(window).scrollTop(a(g).find(".modalClose").offset().top); +return false});a("#FileBoxGoTo").find("button").bind("click",function(){var b=a(this).prev("input").val();a.exec_json("module.getFileBoxListHtml",{page:b},c);a(window).scrollTop(a(g).find(".modalClose").offset().top);return false})}var b,d,g;b=a(this);g=b.attr("href");d=a(g).find(".filebox_list");a.exec_json("module.getFileBoxListHtml",{page:"1"},c)})}); +function showWaitingFogLayer(){var a=jQuery('');a.height(jQuery(window).height());jQuery(".wfsr").wrap('
                                                      ').before(a)}function hideWaitingFogLayer(){jQuery(".wfsr").prev("span").remove();jQuery(".wfsr").unwrap()}function doInstallModule(a){var c=[];c.module_name=a;exec_xml("install","procInstallAdminInstall",c,completeInstallModule);showWaitingFogLayer()} +function doUpdateModule(a){var c=[];c.module_name=a;exec_xml("install","procInstallAdminUpdate",c,completeInstallModule);showWaitingFogLayer()}function completeInstallModule(a){alert(a.message);location.reload()}jQuery(document).ready(function(a){a("body").ajaxComplete(function(){hideWaitingFogLayer()})});jQuery(function(a){a(".x>.body>.lnb").length==0&&a(".x>.body>.content").addClass("single")}); From 8ead9f76515600f1a91a960f1a6c56f4c7c23eeb Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Tue, 11 Oct 2011 02:24:08 +0000 Subject: [PATCH 1086/1372] respond.min.js removed. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9556 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/js/respond.min.js | 2 -- common/tpl/common_layout.html | 1 - common/tpl/mobile_layout.html | 4 ++-- 3 files changed, 2 insertions(+), 5 deletions(-) delete mode 100644 common/js/respond.min.js diff --git a/common/js/respond.min.js b/common/js/respond.min.js deleted file mode 100644 index d12b7b347..000000000 --- a/common/js/respond.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! Respond.js: min/max-width media query polyfill. (c) Scott Jehl. MIT Lic. j.mp/respondjs */ -(function(e,h){e.respond={};respond.update=function(){};respond.mediaQueriesSupported=h;if(h){return}var u=e.document,r=u.documentElement,i=[],k=[],p=[],o={},g=30,f=u.getElementsByTagName("head")[0]||r,b=f.getElementsByTagName("link"),d=[],a=function(){var B=b,w=B.length,z=0,y,x,A,v;for(;z=F.minw)&&(!F.maxw||F.maxw&&D<=F.maxw)){if(!z[F.media]){z[F.media]=[]}z[F.media].push(k[F.rules])}}for(var y in p){if(p[y]&&p[y].parentNode===f){f.removeChild(p[y])}}for(var y in z){var G=u.createElement("style"),A=z[y].join("\n");G.type="text/css";G.media=y;if(G.styleSheet){G.styleSheet.cssText=A}else{G.appendChild(u.createTextNode(A))}C.appendChild(G);p.push(G)}f.insertBefore(C,B.nextSibling)},n=function(v,x){var w=c();if(!w){return}w.open("GET",v,true);w.onreadystatechange=function(){if(w.readyState!=4||w.status!=200&&w.status!=304){return}x(w.responseText)};if(w.readyState==4){return}w.send(null)},c=(function(){var v=false,w=[function(){return new ActiveXObject("Microsoft.XMLHTTP")},function(){return new XMLHttpRequest()}],y=w.length;while(y--){try{v=w[y]()}catch(x){continue}break}return function(){return v}})();a();respond.update=a;function s(){j(true)}if(e.addEventListener){e.addEventListener("resize",s,false)}else{if(e.attachEvent){e.attachEvent("onresize",s)}}})(this,(function(f){if(f.matchMedia){return true}var e,i=document,c=i.documentElement,g=c.firstElementChild||c.firstChild,h=!i.body,d=i.body||i.createElement("body"),b=i.createElement("div"),a="only all";b.id="mq-test-1";b.style.cssText="position:absolute;top:-99em";d.appendChild(b);b.innerHTML='_';if(h){c.insertBefore(d,g)}b.removeChild(b.firstChild);e=b.offsetWidth==9;if(h){c.removeChild(d)}else{d.removeChild(b)}return e})(this)); \ No newline at end of file diff --git a/common/tpl/common_layout.html b/common/tpl/common_layout.html index 8704c2cc1..7980238e9 100644 --- a/common/tpl/common_layout.html +++ b/common/tpl/common_layout.html @@ -50,7 +50,6 @@ diff --git a/common/tpl/mobile_layout.html b/common/tpl/mobile_layout.html index 9eb9c1763..6eb8c5181 100644 --- a/common/tpl/mobile_layout.html +++ b/common/tpl/mobile_layout.html @@ -39,9 +39,9 @@ - + + {@ $ssl_actions = Context::getSSLActions() } - - - - - - - - -

                                                      {$val->description}

                                                      - -
                                                    • - - - -
                                                      + From abb261b1981a1baa1624598179261c8c1a56b33c Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Tue, 11 Oct 2011 07:26:11 +0000 Subject: [PATCH 1111/1372] Install page select UI click disable bug fix. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9581 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/install/tpl/js/install.js | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/install/tpl/js/install.js b/modules/install/tpl/js/install.js index 88825a8b4..1bcd27462 100644 --- a/modules/install/tpl/js/install.js +++ b/modules/install/tpl/js/install.js @@ -90,7 +90,6 @@ jQuery(function($){ select_value.click(show_option); select_root.removeClass('open'); - select_root.mouseleave(function(){$(this).removeClass('open');}); select_a.click(set_anchor).click(hide_option).focus(i_hover).hover(i_hover); select_input.change(set_label).focus(set_label); select_label.hover(i_hover).click(hide_option); From 5334a8b726da0febd8be1a1fc43a6587de341beb Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Tue, 11 Oct 2011 07:33:51 +0000 Subject: [PATCH 1112/1372] IE8 legend element line display bug fix. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9582 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- widgets/login_info/skins/xe_official/css/black.css | 1 - widgets/login_info/skins/xe_official/css/default.css | 1 - widgets/login_info/skins/xe_official/css/white.css | 1 - widgets/login_info/skins/xe_official/login_form.html | 1 - 4 files changed, 4 deletions(-) diff --git a/widgets/login_info/skins/xe_official/css/black.css b/widgets/login_info/skins/xe_official/css/black.css index 4417d5b10..87cb8ffdf 100644 --- a/widgets/login_info/skins/xe_official/css/black.css +++ b/widgets/login_info/skins/xe_official/css/black.css @@ -1,5 +1,4 @@ .login_black{margin:0;padding:0;border:2px solid #515151;width:196px;position:relative;_padding-top:2px;display:block;font-size:12px } -.login_black legend{position:absolute;width:1px;height:1px;overflow:hidden} .login_black fieldset{position:relative;border:1px solid #6b6b6b;padding:11px 11px 7px 11px;width:172px;margin:0} .login_black fieldset .idpwWrap{overflow:hidden;clear:both;width:172px} .login_black fieldset .idpw{float:left;width:110px} diff --git a/widgets/login_info/skins/xe_official/css/default.css b/widgets/login_info/skins/xe_official/css/default.css index 0d7b12334..fe843df25 100644 --- a/widgets/login_info/skins/xe_official/css/default.css +++ b/widgets/login_info/skins/xe_official/css/default.css @@ -1,5 +1,4 @@ .login_default{margin:0;padding:0;border:2px solid #d9d9d9;width:196px;position:relative;_padding-top:2px;display:block;font-size:12px} -.login_default legend{position:absolute;width:1px;height:1px;overflow:hidden} .login_default fieldset{position:relative;border:1px solid #cacaca;padding:11px 11px 7px 11px;width:172px;margin:0} .login_default fieldset .idpwWrap{overflow:hidden;clear:both;width:172px} .login_default fieldset .idpw{float:left;width:110px} diff --git a/widgets/login_info/skins/xe_official/css/white.css b/widgets/login_info/skins/xe_official/css/white.css index d56c0798e..e7539c898 100644 --- a/widgets/login_info/skins/xe_official/css/white.css +++ b/widgets/login_info/skins/xe_official/css/white.css @@ -1,5 +1,4 @@ .login_white{margin:0;padding:0;border:2px solid #d9d9d9;width:196px;position:relative;_padding-top:2px;display:block;font-size:12px} -.login_white legend{position:absolute;width:1px;height:1px;overflow:hidden} .login_white fieldset{position:relative;border:1px solid #cacaca;padding:11px 11px 7px 11px;width:172px;overflow:hidden;margin:0} .login_white fieldset .idpwWrap{overflow:hidden;clear:both;width:172px} .login_white fieldset .idpw{float:left;width:110px} diff --git a/widgets/login_info/skins/xe_official/login_form.html b/widgets/login_info/skins/xe_official/login_form.html index 54eb4a6c8..fb7a34eb0 100644 --- a/widgets/login_info/skins/xe_official/login_form.html +++ b/widgets/login_info/skins/xe_official/login_form.html @@ -16,7 +16,6 @@
                                                      - {$lang->cmd_login}
                                                      From fb15daa8288d2373efe4e53b707fb5a4a7415966 Mon Sep 17 00:00:00 2001 From: taggon Date: Tue, 11 Oct 2011 08:12:41 +0000 Subject: [PATCH 1113/1372] Trimming loop variables git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9583 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/template/TemplateHandler.class.php | 4 +++- tests/classes/template/TemplateHandlerTest.class.php | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/classes/template/TemplateHandler.class.php b/classes/template/TemplateHandler.class.php index fcecc0901..24f751c4b 100644 --- a/classes/template/TemplateHandler.class.php +++ b/classes/template/TemplateHandler.class.php @@ -324,7 +324,9 @@ case 'loop': if(!preg_match('@^(?:(.+?)=>(.+?)(?:,(.+?))?|(.*?;.*?;.*?)|(.+?)\s*=\s*(.+?))$@', $expr, $expr_m)) break; if($expr_m[1]) { - if($expr_m[3]) $expr_m[2] .= '=>'.$expr_m[3]; + $expr_m[1] = trim($expr_m[1]); + $expr_m[2] = trim($expr_m[2]); + if($expr_m[3]) $expr_m[2] .= '=>'.trim($expr_m[3]); $nodes[$idx-1] .= ""; }elseif($expr_m[4]) { $nodes[$idx-1] .= ""; diff --git a/tests/classes/template/TemplateHandlerTest.class.php b/tests/classes/template/TemplateHandlerTest.class.php index e9be901d2..cfe289846 100644 --- a/tests/classes/template/TemplateHandlerTest.class.php +++ b/tests/classes/template/TemplateHandlerTest.class.php @@ -194,6 +194,11 @@ class TemplateHandlerTest extends PHPUnit_Framework_TestCase '
                                                      bar', 'var==\'foo\'){ ?>
                                                      bar' ), + // issue 188 + array( + '
                                                      Hello, world!
                                                      ', + 'ii < $__Context->nn){ ?>dummy&&count($__Context->dummy))foreach($__Context->dummy as $__Context->k=>$__Context->v){ ?>
                                                      Hello, world!
                                                      ' + ), ); } From 7900dc32fcdf77db419837b610d6f99b4818c8d5 Mon Sep 17 00:00:00 2001 From: taggon Date: Tue, 11 Oct 2011 08:36:07 +0000 Subject: [PATCH 1114/1372] Fixed a bug for faceout layout git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9584 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/template/TemplateHandler.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/template/TemplateHandler.class.php b/classes/template/TemplateHandler.class.php index 24f751c4b..3d5073dd8 100644 --- a/classes/template/TemplateHandler.class.php +++ b/classes/template/TemplateHandler.class.php @@ -514,7 +514,7 @@ { $_path = $path; - $fileDir = strtr(realpath(dirname($this->file)),'\\','/'); + $fileDir = strtr(realpath($this->path),'\\','/'); if($path{0} != '/') $path = strtr(realpath($fileDir.'/'.$path),'\\','/'); // for backward compatibility From 2762b7dd08538ceba638a183ccf8eecfdac99e81 Mon Sep 17 00:00:00 2001 From: devjin Date: Tue, 11 Oct 2011 09:03:35 +0000 Subject: [PATCH 1115/1372] version update 1.5.0.5_beta git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9585 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- config/config.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/config.inc.php b/config/config.inc.php index c8c9da586..734da242e 100644 --- a/config/config.inc.php +++ b/config/config.inc.php @@ -13,7 +13,7 @@ * @brief display XE's full version * Even The file should be revised when releasing altough no change is made **/ - define('__ZBXE_VERSION__', '1.5.0.4_beta'); + define('__ZBXE_VERSION__', '1.5.0.5_beta'); /** * @brief The base path to where you installed zbXE Wanted From 5683b3093454d4bfd9d21bdd65f221266125f8b6 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Tue, 11 Oct 2011 09:29:09 +0000 Subject: [PATCH 1116/1372] Admin header. Site URL added. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9586 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/tpl/css/admin.min.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/admin/tpl/css/admin.min.css b/modules/admin/tpl/css/admin.min.css index c0b322d85..e2958b051 100644 --- a/modules/admin/tpl/css/admin.min.css +++ b/modules/admin/tpl/css/admin.min.css @@ -1 +1 @@ -@charset "utf-8";/* NHN (developers@xpressengine.com) *//* Element Reset */body{margin:0}header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{display:block}body>.popup{margin:1em}.x,.x table,.x input,.x textarea,.x select,.x button{font-family:Tahoma,Geneva,sans-serif;font-size:12px;color:#333}.x button,.x input[type=submit],.x input[type=reset],.x input[type=button]{cursor:pointer;overflow:visible}.x img{border:0}.x p{line-height:1.5}/* Section & Heading */.x .section{margin:1em 0;padding:0;border:0}.x .h1, .x .h2, .x .h3, .x .h4{position:relative;border-bottom-style:solid;border-bottom-color:#ccc;zoom:1}.x .h1{border-bottom-width:4px;font-size:24px}.x .h2{border-bottom-width:3px;font-size:20px}.x .h3{border-bottom-width:2px;font-size:16px}.x .h4{border-bottom-width:1px;font-size:12px}/* Portlet */.x .portlet{position:relative;border:1px solid #e9e9e9;margin:1em 0;padding:0;background:#fff;zoom:1;overflow:hidden;border-radius:5px}.x .portlet h2, .x .portlet h3{margin:0;padding:.5em 1em;font-size:14px;border:1px solid #fff;border-bottom:1px solid #e9e9e9;background:#f7f7f7;border-radius:5px 5px 0 0}.x .portlet p{margin:1em 1.2em}.x .portlet li{position:relative;padding-right:8em}.x .portlet .lined{margin:1px;padding:0;list-style:none}.x .portlet .lined li{padding:.5em 8em .5em 1em;border-top:1px solid #eee;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis}.x .portlet .lined li:first-child{border:0}.x .portlet .side{position:absolute;top:0;_top:1px;right:0;color:#666;background:#fff;padding:0 1em}.x .portlet .lined .side{padding:.5em 1em}.x .portlet .more{position:absolute;top:.5em;right:1em;text-decoration:none !important;color:#666}.x .portlet .more span{color:#999}.x .portlet .action{text-align:right;top:0;right:0;padding:.5em 1em .5em 3em;background:#fff;background:-webkit-gradient(linear, 0% 0%, 100% 0%, from(rgba(255,255,255,0)), to(rgba(255,255,255,1)), color-stop(15%, #fff));background:-moz-linear-gradient(left, rgba(255,255,255,0) 0, rgba(255,255,255,1) 15%)}.x .portlet .action a,.x .portlet .action button{margin-left:1em}.x .portlet .btnArea{border-top:1px solid #ddd;margin:0;padding:.5em 1em;margin:0 1px 1px 1px;background:#f7f7f7;border-radius:0 0 5px 5px}/* Table */.x .table{margin:1em 0}.x .table table{width:100%;border:0;border-collapse:collapse;border-top:2px solid #ccc}.x .table caption{font-weight:bold;text-align:left;line-height:22px;padding:5px 0}.x .table caption:after{content:"";display:block;clear:both}.x .table caption a{font-weight:normal}.x .table caption em{float:right;margin-left:1em}.x .table caption strong{color:#e00}.x .table caption .side{float:right;font-weight:normal;margin-left:1em}.x .table th,.x .table td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd;white-space:nowrap}.x .table th{background:#f8f8f8}.x .table thead th{border-bottom:1px solid #999}.x .table tfoot td{font-weight:bold;background:#f8f8f8}.x .table.even tbody tr:nth-of-type(even) td{background-color:#fafafa}.x .table td>input[type=text]{margin:-1px 0 -3px 0 !important;vertical-align:middle}.x .table img{vertical-align:middle}.x .table em{font-style:normal;font-weight:normal;color:#e00}.x .table .title,.x .table .text{white-space:normal}/* Form */.x .form{margin:1em 0;padding:0}.x .form fieldset{margin:0 0 2em 0;padding:0;border:0}.x .form em{font-style:normal;color:#e00}.x .form label{margin-right:1em;line-height:1;vertical-align:middle}.x .form input[type=checkbox]+label,.x .form input[type=radio]+label,.x .form input[type=file]{cursor:pointer}.x .form ul{position:relative;margin:0;padding:0;list-style:none;border-top:2px solid #ccc;border-bottom:1px solid #ccc;zoom:1}.x .form li{list-style:none;border:1px solid #ddd;border-left:0;border-right:0;margin:-1px 0;padding:8px 0;vertical-align:top;zoom:1}.x .form li:first-child{border-top:0}.x .form li>label:first-child{display:block;font-weight:bold}.x .form li label em{font-weight:normal}.x .form label.overlap{position:absolute;color:#aaa}.x .form input[type=text],.x .form input[type=password],.x .form input[type=file],.x .form textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:transparent}.x .form input[type=text],.x .form input[type=password],.x .form input[type=file]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px}.x .form input[type=text].loading,.x .form input.loading[type=password]{padding-right:24px;width:260px;background:transparent url(../img/preLoader16.gif) no-repeat 265px center}.x .form input[type=checkbox],.x .form input[type=radio]{margin:0;padding:0;width:13px;height:13px;vertical-align:middle}.x .form input[type=text][disabled=disabled],.x .form input[type=password][disabled=disabled],.x .form input[type=checkbox][disabled=disabled],.x .form input[type=radio][disabled=disabled],.x .form input[type=file][disabled=disabled],.x .form textarea[disabled=disabled],.x .form select[disabled=disabled]{background:#ddd !important;text-shadow:1px 1px 0 #fff}.x .form textarea{padding:3px 4px;vertical-align:top}.x .form span.desc, .x .form em.desc{line-height:22px;vertical-align:middle;margin:0 10px}.x .form p.desc{margin:.25em 0;line-height:1.4}.x .form .q{font-weight:bold;margin:0 0 5px 0}.x .form .a{margin:0 0 5px 0}.x .form .tgForm{margin-right:1em}.x .form .h1 + ul,.x .form .h2 + ul,.x .form .h3 + ul,.x .form .h4 + ul{border-top:0}/* Global Navigation Bar */.x .gnb{position:relative;clear:both;border:1px solid #c1c1c1;border-left:0;border-right:0;background-color:#efefef;background:#efefef -webkit-gradient(linear, 0% 0%, 0% 100%, from(#efefef), to(#dcdcdc));background:#efefef -moz-linear-gradient(top, #efefef, #dcdcdc);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#efefef, endColorStr=#dcdcdc);zoom:1}.x .gnb ul{margin:0;padding:0 0 0 2em;list-style:none;border:1px solid #fff;border-left:0;border-right:0;zoom:1}.x .gnb ul ul{position:absolute;top:30px;left:0;border:1px solid #ccc;border-top:0;padding:1px 0 0 0;background:#fff}.x .gnb ul:after{content:"";display:block;clear:both}.x .gnb li{position:relative;float:left;border:1px solid #fff;border-top:0;border-bottom:0;margin:0 -1px 0 0}.x .gnb li li{float:none;clear:both;overflow:hidden;border:0;border-top:1px dotted #ccc;margin:0;padding:2px}.x .gnb li li:first-child{border:0}.x .gnb li a{float:left;font-weight:bold;color:#333;font-size:12px;padding:8px 18px;white-space:nowrap;text-decoration:none;text-shadow:0 1px 0 #fff;zoom:1}.x .gnb li a:hover,.x .gnb li a:active,.x .gnb li a:focus,.x .gnb li.active a{background:#f4f4f4;border:1px solid #ccc;border-bottom:0;padding:7px 17px 8px 17px}.x .gnb li.activeOn a{background:#fff;border:1px solid #ccc;border-bottom:0;padding:7px 17px 8px 17px}.x .gnb li.active li a{display:block;float:none;color:#555;background:#fff;padding:5px 15px !important;font-weight:normal !important;border:0 !important}.x .gnb li.active li a:hover,.x .gnb li.active li a:active,.x .gnb li.active li a:focus{border:0;background:#eee}.x .gnb .setting{position:absolute;top:8px;right:2em;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;background:url(../img/iconSetting.gif) no-repeat center}.x .gnb.jx ul{display:block;position:static;padding:0}.x .gnb.jx li{float:none;clear:both;border-top:1px solid #ccc}.x .gnb.jx ul ul{border:0}.x .gnb.jx li li{border:0}.x .gnb.jx li a{float:none;display:block}.x .gnb.jx li a:hover,.x .gnb.jx li a:active,.x .gnb.jx li a:focus{background:none}.x .gnb.jx li.activeOn>a{background:#ddd}@media only all and (max-width:860px){.x .gnb ul{padding-left:1em}.x .gnb .setting{right:1em}}@media only all and (max-width:640px){.x .gnb ul{display:block;position:static;padding:0}.x .gnb li{float:none;clear:both;border-top:1px solid #ccc}.x .gnb ul ul{border:0;position:static}.x .gnb li li{border:0}.x .gnb li a{float:none;display:block}.x .gnb li a:hover,.x .gnb li a:active,.x .gnb li a:focus{background:none}.x .gnb li.activeOn>a{background:#ddd}}/* Favorite */.x .bmk{position:absolute;right:2em;bottom:10px;padding:0 0 0 20px;background:url(../img/iconFavorite.gif) no-repeat 0 -16px}.x .bmk ul{position:absolute;top:140%;right:0;list-style:none;margin:0;padding:5px 10px;border:1px solid #aaa;border-radius:5px;background:#fff;box-shadow:1px 1px 3px #aaa}.x .bmk li{position:relative;padding:3px 30px 3px 0;white-space:nowrap}.x .bmk li .action{position:absolute;top:0;right:0}.x .bmk li .action .text{text-decoration:none;width:16px;text-align:center;margin:0}@media only all and (max-width:640px){.x .bmk{position:static;background-color:#fff;padding:10px 20px;background:#fff}.x .bmk .tgAnchor{display:block}.x .bmk ul{position:relative;border:0;border-top:1px solid #ccc;border-radius:0;box-shadow:none;padding:0;margin:5px 0 0 0}.x .bmk li{position:relative;top:-1px;border-top:1px dotted #ccc}}/* Local Navigation */.x .lnb{position:relative;float:left;width:200px;margin:1em 0 1em -230px;line-height:normal;zoom:1;display:inline}.x .lnb .h2{margin-top:0}.x .lnb ul{margin:0;padding:0;list-style:none}.x .lnb li{position:relative;margin:0 0 -1px 0;vertical-align:top;zoom:1}.x .lnb li a{display:block;position:relative;padding:8px 10px;text-decoration:none;color:#666;font-weight:bold;background:#fafafa;border:1px solid #eee;zoom:1}.x .lnb li a .i{position:absolute;top:50%;left:100%;margin:-4px 0 0 -16px;width:8px;height:8px;color:#ccc;background:url(../img/iconNavVr.gif) no-repeat left top}.x .lnb li ul{padding:5px 0;background:#fff}.x .lnb li li{margin:0;border-top:1px dotted #ddd}.x .lnb li li:first-child{border:0}.x .lnb li li a{font-weight:normal;background:#fff;padding:5px 10px;border:0}.x .lnb li li a span{color:#666}.x .lnb li.active{border:1px solid #ccc;z-index:2}.x .lnb li li.active{border:0}.x .lnb li.active a{color:#000;border:0}.x .lnb li.active .i{background-position:0 -44px}.x .lnb li.active li a{border:0}.x .lnb li.active ul{display:block;border-top:1px solid #eee}.x .lnb li.active li.active a span{color:#13b200;font-weight:bold;letter-spacing:-1px}/* Content Navigation */.x .cnb{margin:1em 0;position:relative;zoom:1}.x .cnb:after{content:"";display:block;clear:both}.x .cnb ul{list-style:none;margin:0;padding:0}.x .cnb li{display:inline}.x .cnb li:before{content:"| ";color:#ccc}.x .cnb li:first-child:before{content:""}.x .cnb .active,.x .cnb .active a{font-weight:bold;color:#333;text-decoration:none}.x .cnb .side{float:right}/* Pagination */.x .pagination{margin:1em 0;text-align:center;line-height:normal}.x .pagination *{vertical-align:middle}.x .pagination a,.x .pagination strong{position:relative;display:inline-block;padding:2px 4px;font-weight:bold;text-decoration:none;line-height:normal;color:#333 !important;vertical-align:middle}.x .pagination a:hover,.x .pagination a:active,.x .pagination a:focus{border:1px solid #ddd;margin:0 -1px}.x .pagination strong{color:#e00 !important;font-size:20px}.x .pagination .direction{font-weight:normal;white-space:nowrap}.x .pagination .direction:hover,.x .pagination .direction:active,.x .pagination .direction:focus{border:0;margin:0;text-decoration:underline}.x .pagination input{width:30px;text-align:center}.x .pagination button{overflow:visible}/* Star Rating */.x .starRating, .x .starRating span{display:inline-block;height:14px;background:transparent url(../img/iconStarRating.gif) no-repeat;overflow:hidden}.x .starRating{width:79px;vertical-align:top}.x .starRating span{font-size:0;line-height:0;vertical-align:top;text-indent:-100px;*text-indent:0;background-position:0 -14px}/* Progress */.x .prgrs{white-space:nowrap;line-height:normal;vertical-align:middle}.x .prgrs *{vertical-align:middle}.x .prgrs .pBar{position:relative;display:inline-block;background:#e9e9e9;margin:0 5px 0 0}.x .prgrs .pAction{display:inline-block;vertical-align:top;background:#99a6b6}.x .prgrs .pNum{position:absolute;width:100%;left:0;top:0;text-align:center;text-shadow:1px 1px 0 #fff}.x .prgrs.prgrsSmall{font-size:14px;line-height:14px}.x .prgrs.prgrsSmall .pBar,.x .prgrs.prgrsSmall .pAction,.x .prgrs.prgrsSmall .pNum{height:16px;line-height:16px;font-size:11px}.x .prgrs.prgrsMedium{font-size:24px;line-height:24px}.x .prgrs.prgrsMedium .pBar,.x .prgrs.prgrsMedium .pAction,.x .prgrs.prgrsMedium .pNum{height:22px;line-height:22px;font-size:12px}.x .prgrs.prgrsLarge{font-size:38px;line-height:38px}.x .prgrs.prgrsLarge .pBar,.x .prgrs.prgrsLarge .pAction,.x .prgrs.prgrsLarge .pNum{height:34px;line-height:34px;font-size:14px}/* Modal Window */.modal{position:absolute;top:0;left:0;width:100%;_height:100%;min-height:100%;z-index:100}.modal .bg{position:absolute;background:#000;_background:none;width:100%;height:100%;opacity:.5;z-index:2;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1}.modal .fg{position:relative;width:80%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:3;zoom:1;border-radius:5px;box-shadow:0 0 6px #000}.modal ul, .modal ol, .modal .lined, .modal .table{margin-bottom:1em}.modal .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1}.modalClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px}.modalBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}html.modalContainer,body.modalContainer{_height:100%;_width:100%} /* IE6 only */ /* Layer */.x .layer,.x.layer{position:absolute;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:2;zoom:1;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5pxbox-shadow:0 0 6px #666;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x .layer h2{font-size:14px}.x .layer ul, .x .layer ol, .x .layer .lined, .x .layer .table{margin-bottom:1em}.x .layerClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px}.x .layerBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}/* H2 Anchor */.x .h2Anchor{position:absolute;right:0;border:0;background:none;color:#00f;text-decoration:underline}/* Skip Navigation */.x .skipNav{margin:0;text-align:center;overflow:hidden}.x .skipNav a{position:absolute;width:1px;height:1px;display:block;color:#fff;font-weight:bold;padding:10px 0;background:#333;border-top:1px solid #656565}.x .skipNav a:hover,.x .skipNav a:active,.x .skipNav a:focus{position:relative;width:auto;height:auto}/* Header */.x .header{position:relative;z-index:2;padding:30px 0 0 0;background:#4c4c4c;box-shadow:0 0 10px #aaa;zoom:1}.x .header:after{content:"";display:block;clear:both}.x .header a{text-decoration:none}.x .header h1{margin:0 100px 10px 1.3em;font-size:24px;line-height:32px}.x .header h1 *{vertical-align:middle}.x .header h1 a{color:#fff;text-shadow:1px 1px 0 #000;filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=1, OffY=1, Color=#000000, Positive=true);zoom:1}.x .header h1 .url{font-size:12px;font-weight:normal}.x .header #moveSiteList{padding:10px 1em 5px 1em;margin:0}.x .header #moveSiteList ul{list-style:none;margin:0;padding:0}.x .header #moveSiteList li{white-space:nowrap;margin:0;padding:4px 0;border-bottom:1px dotted #ccc}.x .header #siteMapList{padding:0 1em 1em 1em;margin:0}.x .header #siteMapList li{white-space:nowrap}.x .header .account{position:absolute;z-index:3;width:100%;padding:5px 2em 5px 0;top:0;right:0;white-space:nowrap;text-align:right;background:#333;border-bottom:1px solid #656565;color:#fff;font-size:12px;box-shadow:0 0 10px #333}.x .header .account ul{margin:0 2px 0 0;padding:0;list-style:none}.x .header .account li{position:relative;display:inline;border-left:1px solid #666;padding:0 6px 0 10px}.x .header .account li:first-child{border:0}.x .header .account a{color:#fff;display:inline-block;height:14px}.x .header .account a.language{padding-right:16px;background:url(/xe/modules/admin/tpl/img/iconArrow.gif) no-repeat right -160px}.x .header #language{position:absolute;top:19px;right:-2em;padding:6px 4px !important;border:1px solid #666;border-top:0;background:#333}.x .header #language li{border:0;display:block;padding:1px 8px 1px 10px;text-align:left;line-height:1}.x .header #language li.selected{background:url(/xe/modules/admin/tpl/img/iconCheck.gif) no-repeat left center}.x .header #language li.selected a{text-decoration:underline}.x .header h1 a:hover,.x .header h1 a:active,.x .header h1 a:focus,.x .header .account a:hover,.x .header .account a:active,.x .header .account a:focus{color:#6e9cf2;text-decoration:underline}/* Footer */.x .footer{border-top:1px solid #ddd;text-align:center;font-size:12px;padding:1.5em 0;margin:0 2em;zoom:1}.x .footer:after{content:"";display:block;clear:both}.x .footer p{margin:0}.x .footer .power{float:left}.x .footer .cache{float:right}/* Body */.x .body{position:relative;z-index:1;padding:1em 2em 1em 260px;zoom:1}.x .body:after{content:"";display:block;clear:both}/* Content */.x .content{float:right;width:100%;margin-left:-230px;zoom:1}.x .content:after{content:"";display:block;clear:both}.x .content a{color:#33a}.x .content a:hover,.x .content a:active,.x .content a:focus{color:#a33}.x .content .portlet a{text-decoration:none}.x .content .portlet a:hover,.x .content .portlet a:active,.x .content .portlet a:focus{text-decoration:underline}/* Dashboard */.x .dashboard{position:relative;float:none;width:auto;margin-left:-230px}.x .dashboard .portlet{float:left;width:48%;margin-right:1em}.x .dashboard .portlet:nth-of-type(odd){float:left;width:49%;margin-right:0}.x .dashboard .portlet:nth-of-type(even){float:right;width:49%;margin-right:0}@media only all and (min-width:1300px){.x .dashboard .portlet{float:left !important;width:32% !important;margin-right:1em !important}}/* Single Column*/.x .single{position:relative;float:none;width:auto;margin-left:-230px}/* Search */.x .search{zoom:1}.x .search:after{content:"";display:block;clear:both}.x .search .pagination{float:left;text-align:left}.x .search form{float:right;margin:1em 0}.x .search form *{vertical-align:middle}/* Site Map */.x .siteMap h2 input{font-size:14px;font-weight:bold;padding:0 .5em}.x .siteMap label{cursor:text}.x .siteMap .lined ul{padding:0;margin:0;border-top:1px solid #eee;zoom:1}.x .siteMap .lined li{position:relative;padding:0;margin:0;cursor:all-scroll;list-style:none;zoom:1}.x .siteMap .lined li li{border-top:1px solid #eee}.x .siteMap li li{text-indent:18px}.x .siteMap li li li{text-indent:36px}.x .siteMap li li li li{text-indent:54px}.x .siteMap li li li li li{text-indent:72px}.x .siteMap li li li li li li{text-indent:90px}.x .siteMap li li li li li li li{text-indent:108px}.x .siteMap li li li li li li li li{text-indent:126px}.x .siteMap li li li li li li li li li{text-indent:144px}.x .siteMap li li li li li li li li li li{text-indent:162px}.x .siteMap li li li li li li li li li li li{text-indent:180px}.x .siteMap li li li li li li li li li li li li{text-indent:198px}.x .siteMap li *{vertical-align:middle}.x .siteMap li .moveTo+input{width:200px;border:0;padding:0 .5em}.x .siteMap li .moveTo+input:hover,.x .siteMap li .moveTo+input:active,.x .siteMap li .moveTo+input:focus{border:1px dotted #ccc;overflow:visible}.x .siteMap .moveTo{position:relative;z-index:2;width:22px;height:32px;padding:32px 0 0 0;margin:0 3px;_margin-top:-1px;overflow:hidden;background:#fff url(../img/iconMoveTo.gif) no-repeat center 0;border:0;cursor:move}.x .siteMap li.active,.x .siteMap li.active .moveTo{background-color:#f7f7f7}.x .siteMap li.active li,.x .siteMap li.active ul{border-top-color:#f7f7f7}.x .siteMap li.active .moveTo{background-position:center -32px}.x .siteMap .vr,.x .siteMap .hr{display:none;position:absolute;z-index:1;left:14px;border:0px solid #ccc;overflow:hidden}.x .siteMap .vr{top:-16px;height:100%;border-left-width:1px}.x .siteMap .hr{top:16px;width:16px;border-top-width:1px}.x .siteMap li.active .vr,.x .siteMap li.active li .hr{display:block}.x .siteMap li li .vr,.x .siteMap li li li .hr{left:32px}.x .siteMap li li li .vr,.x .siteMap li li li li .hr{left:50px}.x .siteMap li li li li .vr,.x .siteMap li li li li li .hr{left:68px}.x .siteMap li li li li li .vr,.x .siteMap li li li li li li .hr{left:86px}.x .siteMap li li li li li li .vr,.x .siteMap li li li li li li li .hr{left:104px}.x .siteMap li li li li li li li .vr,.x .siteMap li li li li li li li li .hr{left:122px}.x .siteMap li li li li li li li li .vr,.x .siteMap li li li li li li li li li .hr{left:140px}.x .siteMap li li li li li li li li li .vr,.x .siteMap li li li li li li li li li li .hr{left:158px}.x .siteMap li li li li li li li li li li .vr,.x .siteMap li li li li li li li li li li li .hr{left:176px}.x .siteMap li li li li li li li li li li li .vr,.x .siteMap li li li li li li li li li li li li .hr{left:336px}.x .siteMap .side{padding-top:0 !important;padding-bottom:0 !important;line-height:30px;background:transparent !important}.x .siteMap .side button{text-indent:0;line-height:1}.x .siteMap .tgMap{position:absolute;top:12px;right:1em;padding:0 16px 0 0;line-height:16px;background:url(../img/iconArrow.gif) no-repeat right -126px}.x .siteMap.fold .tgMap{background-position:right -158px}.x .siteMap.fold .h2{border-bottom-color:#fff;border-radius:5px}.x .siteMap .placeholder{background:#bbb}.x .siteMap .draggable,.x .siteMap .draggable .moveTo{background-color:#ddd}.x .siteMap .draggable .summary{border-left:1px solid #ccc;padding-left:10px;margin-left:10px;font-size:11px;color:#999}.x .siteMap a.ms{text-decoration:underline}/* Multilingual */.x .langEdit{background:#fff;position:absolute;*left:0;*margin-top:28px;z-index:10}.x .langEdit ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0}.x .langEdit li{padding:.5em 10px}.x .langEdit input[type=text]{width:220px;padding-right:40px}.x .langEdit label{left:15px !important}.x .langEdit .action{border:1px solid #eee;width:268px;padding:0 10px}.x .langEdit p, .x .langEdit .btnArea{white-space:normal}.x .langEdit .langList,.x .langEdit .langEditControls{box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x .langEdit .langList{margin:0 -1px 0 0;display:none}.x .langEdit .langList li{white-space:nowrap;color:#ccc;width:270px} .x .langEdit .langList li span{display:inline-block;width:80px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:#767676}.x .langEdit .langList li a{display:inline-block;width:80px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.x .langEdit .langList li.active{background:url(../img/iconArrow.gif) no-repeat right -188px}.x .langEdit.showChild .langList{display:block}.x .langEdit .langInput{background:#fff}.x .langEdit .langInput h2{padding:5px 10px;margin:0 0 -1px 0;font-size:12px;font-weight:normal;color:#666;border:1px solid #eee;border-top-color:#ccc}.x .langEdit .langInput h2 strong{color:#000;font-size:14px}.x .langEdit.showChild .langInput{position:absolute;left:285px;top:0}.x .langEdit li.en input, .x .langEdit li.en textarea, .x .mLangEdit li.en textarea{background:url(../img/flag.us.gif) no-repeat 99% 5px}.x .langEdit li.ko input, .x .langEdit li.ko textarea, .x .mLangEdit li.ko textarea{background:url(../img/flag.kr.gif) no-repeat 99% 5px}.x .langEdit li.jp input, .x .langEdit li.jp textarea, .x .mLangEdit li.jp textarea{background:url(../img/flag.jp.gif) no-repeat 99% 5px}.x .langEdit li.fr input, .x .langEdit li.fr textarea, .x .mLangEdit li.fr textarea{background:url(../img/flag.fr.gif) no-repeat 99% 5px}.x .langEdit li.de input, .x .langEdit li.de textarea, .x .mLangEdit li.de textarea{background:url(../img/flag.de.gif) no-repeat 99% 5px}.x .langEdit li.ru input, .x .langEdit li.ru textarea, .x .mLangEdit li.ru textarea{background:url(../img/flag.ru.gif) no-repeat 99% 5px}.x .langEdit li.es input, .x .langEdit li.es textarea, .x .mLangEdit li.es textarea{background:url(../img/flag.es.gif) no-repeat 99% 5px}.x .langEdit li.tr input, .x .langEdit li.tr textarea, .x .mLangEdit li.tr textarea{background:url(../img/flag.tr.gif) no-repeat 99% 5px}.x .langEdit li.vi input, .x .langEdit li.vi textarea, .x .mLangEdit li.vi textarea{background:url(../img/flag.vn.gif) no-repeat 99% 5px}.x .langEdit li.mn input, .x .langEdit li.mn textarea, .x .mLangEdit li.mn textarea{background:url(../img/flag.mn.gif) no-repeat 99% 5px}.x .langEdit li.zh-CN input, .x .langEdit li.zh-CN textarea, .x .mLangEdit li.zh-CN textarea, .x .langEdit li.zh-TW input, .x .langEdit li.zh-TW textarea, .x .mLangEdit li.zh-TW textarea{background:url(../img/flag.cn.gif) no-repeat 99% 5px}.x .mLangEdit.en strong{background:url(../img/flag.us.gif) no-repeat 0 10px}.x .mLangEdit.ko strong{background:url(../img/flag.kr.gif) no-repeat 0 10px}.x .mLangEdit.jp strong{background:url(../img/flag.jp.gif) no-repeat 0 10px}.x .mLangEdit.fr strong{background:url(../img/flag.fr.gif) no-repeat 0 10px}.x .mLangEdit.de strong{background:url(../img/flag.de.gif) no-repeat 0 10px}.x .mLangEdit.ru strong{background:url(../img/flag.ru.gif) no-repeat 0 10px}.x .mLangEdit.es strong{background:url(../img/flag.es.gif) no-repeat 0 10px}.x .mLangEdit.tr strong{background:url(../img/flag.tr.gif) no-repeat 0 10px}.x .mLangEdit.vi strong{background:url(../img/flag.vn.gif) no-repeat 0 10px}.x .mLangEdit.mn strong{background:url(../img/flag.mn.gif) no-repeat 0 10px}.x .mLangEdit.zh-CN strong, .x .mLangEdit.zh-TW strong{background:url(../img/flag.cn.gif) no-repeat 0 10px}.x .mLangEdit ul ul{border:0}.x .mLangEdit li{position:relative;padding:0}.x .mLangEdit li strong{display:inline-block;padding:6px 100px 8px 24px;font-weight:normal;line-height:1.5}.x .mLangEdit li .side{position:absolute;top:8px;right:0;padding-right:18px;background:url(../img/iconArrow.gif) no-repeat right -160px}.x .mLangEdit li li{border:0;padding-right:36px}.x .mLangEdit li textarea{width:100%;height:16px;padding-right:30px;resize:vertical;line-height:1.4}.x .mLangEdit li label{top:8px !important}.x .mLangEdit li.active{background:#FFFDEF}.x .mLangEdit li.active strong{font-weight:bold}.x .mLangEdit li.active .side{background-position:right -128px}.modal .mLangEdit ul{padding-bottom:1em}.modal .mLangEdit li{border:0;padding-right:36px}/* Suggestion */.x .suggestion{display:none;position:absolute;background:#fff;z-index:10;_height:200px;max-height:200px;overflow:auto;*left:0;*margin-top:28px;box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x .suggestion ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0}.x .suggestion li{padding:0}.x .suggestion li:last-child{border-bottom:0}.x .suggestion li button{border:0;background:#fff;text-align:left;width:288px;padding:2px 4px;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.x .suggestion li button:hover,.x .suggestion li button:active,.x .suggestion li button:focus,.x .suggestion li button.active{background:#eee}/* Image Mark */.x #imageMark{right:0}/* Easy Installer */.x .easyNav{position:relative;border:1px solid #e9e9e9;zoom:1}.x .easyNav:after{content:"";display:block;clear:both}.x .easyNav h2{font-size:16px}.x .easyNav .category{width:30%;float:left;margin:0 2em;display:inline}.x .easyNav .filter{position:absolute;top:0;right:0;margin:1em 2em;text-align:right}.x .easyList td p{margin-top:0}.x .easyList td p.update{background:#ffc;padding:.5em 1em;border:1px solid #fc9;border-left:0;border-right:0;text-align:center}/* Font Preview */.x .fontPreview{width:96%;border:1px solid #e9e9e9;zoom:1;padding:1em 2em;margin:.5em 0}/* FTP Suggestion */.x #ftpSuggestion{background:#fff;box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x #ftpSuggestion ul{border-left:1px solid #eee;border-right:1px solid #eee}.x #ftpSuggestion li{padding:0}.x #ftpSuggestion li button{border:0;background:#fff;text-align:left;width:288px}.x #ftpSuggestion li button:hover,.x #ftpSuggestion li button:active,.x #ftpSuggestion li button:focus{background:#eee}/* Theme & Skin Preview */.x .thumbPreview li{position:relative;padding-left:10px;padding-right:10px}.x .thumbPreview li.active.highlight{background:#f9f9f9}.x .thumbPreview .prevToggle{position:absolute;top:8px;right:10px;line-height:16px;padding:0 18px 0 0;text-decoration:none;background:url(../img/iconArrow.gif) no-repeat right -32px}.x .thumbPreview li.active .prevToggle{background-position:right 0}.x .thumbPreview .a{border:0;margin:0;zoom:1}.x .thumbPreview .a:after{content:"";display:block;clear:both}.x .thumbPreview .i{float:left;vertical-align:top;margin:0 1em 1em 0;padding:0;border:0;zoom:1}.x .thumbPreview .i:after{content:"";display:block;clear:both}.x .thumbPreview .i .thumb{position:relative;width:124px;height:84px;padding:0;margin-bottom:3px;text-align:center;overflow:hidden;border:1px solid #ddd;display:block;cursor:pointer;background:#fff}.x .thumbPreview .i .thumb .frame{position:absolute;width:120px;height:80px;left:0;top:0;border:2px solid #fff;overflow:hidden}.x .thumbPreview .i .thumb img{width:120px;margin:0}.x .thumbPreview .i label{display:block;position:relative;top:0;left:2px;width:122px;height:1.1em;margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x .thumbPreview .i input{display:none}.x .thumbPreview .i ul{display:none}.x .thumbPreview .selected .i{display:block;float:none}.x .thumbPreview .selected .i .thumb{float:left;width:186px;height:126px;margin:0 1em 0 0;border:2px solid #eee}.x .thumbPreview .selected .i .thumb .frame{width:180px;height:120px;border-width:3px}.x .thumbPreview li.active.highlight .selected .i .thumb{border-color:#5ea8f6}.x .thumbPreview .selected .i .thumb img{width:180px;position:relative}.x .thumbPreview li.active .selected .i .thumb img{z-index:auto}.x .thumbPreview .selected .i label{cursor:text}.x .thumbPreview .selected .i ul{display:block;list-style:none;border:0;margin:1em 0 1em 200px}.x .thumbPreview .selected .i li{border:0;padding:0;margin:0 0 .2em 0}.x .thumbPreview.jx .i label{display:inline;width:auto}.x .thumbPreview.jx .i.noDirection{display:none}.x .thumbPreview.jx .i input{display:inline}.x #skin .showAll{float:right;border:0;overflow:visible;padding:0 18px 0 0;cursor:pointer;color:#00f;background:url(../img/iconArrow.gif) no-repeat right -32px}.x #skin .showAll.hideAll{background-position:right 0}/* Favorite On | Off */.x .fvOff,.x .fvOn{display:inline-block;width:16px;height:16px;overflow:hidden;text-indent:16px;background:url(../img/iconFavorite.gif) no-repeat}.x .fvOn{background-position:0 -16px}/* Up-Down Dragable */.x .uDrag .wrap{position:relative;padding-left:20px}.x .uDrag li>.wrap{margin:0 0 0 8px}.x .uDrag .dragActive{background:#FFD}.x .uDrag .dragActive th,.x .uDrag .dragActive td{background:none !important}.x .uDrag .dragBtn{position:absolute;width:8px;height:100%;padding:0;overflow:hidden;background:url(../img/bgDragable.gif);top:1px;left:0;text-indent:12px;border:0;cursor:n-resize;white-space:nowrap}/* Favicon Preview */.x .faviconPreview{position:relative;padding:60px 0 0 200px;background:url(../img/bgFavicon.gif) no-repeat}.x .faviconPreview img{position:absolute}.x .faviconPreview .fn1{top:30px;left:12px}.x .faviconPreview .fn2{top:55px;left:68px}/* Mobile Icon Preview */.x .mobiconPreview{position:relative;padding:252px 0 0 200px;background:url(../img/bgMobileTop.png) no-repeat}.x .mobiconPreview img{position:absolute;top:20px;left:10px}.x .mobiconPreview span{position:absolute;width:32px;text-align:center;top:52px;left:10px;color:#fff;font-size:9px}/* Text List */.x .textList{border:1px solid #ddd !important;line-height:1.5em;height:18.5em;overflow:auto}.x .textList li{border:0;padding:.25em 1em;height:1.5em;white-space:nowrap;overflow:hidden}.x .textList li:nth-child(even){background:#eee}.x .textList li a{float:right}/* File Box */.x .fileBox li{position:relative}.x .fileBox li img{max-width:100%}.x .fileBox .portlet ul{margin:1em;list-style:none;padding:0;border:0}.x .fileBox .portlet li{border-top:1px solid #ddd;border-bottom:0;padding:8px 0}.x .fileBox .side{position:absolute;top:8px;right:0}/* Messages */.x .desc.error{color:#f00}.x .desc.success{color:#080}/* Icon Button */.x a.iSetting{display:inline-block;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;vertical-align:middle;background:url(../img/iconSetting.gif) no-repeat}.x a.cMenu{display:inline-block;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;vertical-align:middle;background:url(../../../../common/img/icon.bubble.png) no-repeat}/* Responsive Layout */@media only all and (max-width:860px){.x .header h1{margin-left:.7em}.x .header .account{padding-right:1em}.x .body{padding:1em}.x .content{float:none;margin-left:0}.x .lnb{float:none;width:auto;margin:1em 0}.x .dashboard .portlet{float:none !important;width:auto !important;margin-right:0}.modal .fg,.wfsr .fg{width:auto}.x .easyNav .category{float:none;display:block;width:auto}.x .easyNav .filter{position:static}}@media only all and (max-width:640px){.x .skipNav a{position:relative;width:auto;height:auto}.modal{position:absolute}}/* Legacy Code (Don't use it. It will be removed as soon as possible.) */.x h3.xeAdmin,.x h4.xeAdmin{position:relative;border-bottom-style:solid;border-bottom-color:#ccc;zoom:1}.x h3.xeAdmin{border-bottom-width:4px;font-size:24px}.x h4.xeAdmin{border-bottom-width:3px;font-size:20px}.x h5.xeAdmin{border-bottom-width:2px;font-size:16px}.x h6.xeAdmin{border-bottom-width:1px;font-size:12px}.x .adminSearch{margin:1em 0}.x .adminSearch fieldset{border:1px solid #ccc}.x .localNavigation{padding:0;list-style:none}.x .localNavigation li{display:inline}.x .localNavigation li.on a{font-weight:bold;color:#333;text-decoration:none}.x .localNavigation li:before{content:"| "}.x .localNavigation li:first-child:before{content:""}.x .summary{margin:1em 0}.x .rowTable,.x .colTable,.x .crossTable{margin:1em 0;border:0;border-collapse:collapse;border-top:2px solid #ccc;width:100%}.x .rowTable caption,.x .colTable caption,.x .crossTable caption{font-weight:bold;text-align:left;line-height:22px;padding:5px 0}.x .rowTable caption:after,.x .colTable caption:after,.x .crossTable caption:after{content:"";display:block;clear:both}.x .rowTable caption a,.x .colTable caption a,.x .crossTable caption a{font-weight:normal}.x .rowTable caption em,.x .colTable caption em,.x .crossTable caption em{float:right;font-style:normal;font-weight:normal;color:#e00;margin-left:1em}.x .rowTable caption strong,.x .colTable caption strong,.x .crossTable caption strong{color:#e00}.x .rowTable caption .side,.x .colTable caption .side,.x .crossTable caption .side{float:right;font-weight:normal;margin-left:1em}.x .rowTable th,.rowTable td,.x .colTable th,.rowTable td,.x .crossTable th,.rowTable td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd;white-space:nowrap}.x .rowTable th,.x .colTable th,.x .crossTable th{background:#f8f8f8}.x .rowTable thead th,.x .colTable thead th,.x .crossTable thead th{border-bottom:1px solid #999}.x .rowTable tfoot td,.x .colTable tfoot td,.x .crossTable tfoot td{font-weight:bold;background:#f8f8f8}.x .rowTable.even tbody tr:nth-of-type(even) td,.x .colTable.even tbody tr:nth-of-type(even) td,.x .crossTable.even tbody tr:nth-of-type(even) td{background-color:#fafafa}.x .rowTable td>input[type=text],.x .colTable td>input[type=text],.x .crossTable td>input[type=text]{margin:-1px 0 -3px 0 !important;vertical-align:middle}.x .rowTable img,.x .colTable img,.x .crossTable img{vertical-align:middle}.x .rowTable .title,.x .colTable .title,.x .crossTable .title,.x .rowTable .text,.x .colTable .text,.x .crossTable .text{white-space:normal}.x .rowTable input[type=text],.x .colTable input[type=text],.x .crossTable input[type=text],.x .rowTable input[type=password],.x .colTable input[type=password],.x .crossTable input[type=password],.x .rowTable input[type=file],.x .colTable input[type=file],.x .crossTable input[type=file],.x .rowTable textarea,.x .colTable textarea,.x .crossTable textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:transparent}.x .rowTable input[type=text],.x .colTable input[type=text],.x .crossTable input[type=text],.x .rowTable input[type=password],.x .colTable input[type=password],.x .crossTable input[type=password],.x .rowTable input[type=file],.x .colTable input[type=file],.x .crossTable input[type=file]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px}.x .clear:after{content:"";display:block;clear:both} \ No newline at end of file +@charset "utf-8";/* NHN (developers@xpressengine.com) *//* Element Reset */body{margin:0}header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{display:block}body>.popup{margin:1em}.x,.x table,.x input,.x textarea,.x select,.x button{font-family:Tahoma,Geneva,sans-serif;font-size:12px;color:#333}.x button,.x input[type=submit],.x input[type=reset],.x input[type=button]{cursor:pointer;overflow:visible}.x img{border:0}.x p{line-height:1.5}/* Section & Heading */.x .section{margin:1em 0;padding:0;border:0}.x .h1, .x .h2, .x .h3, .x .h4{position:relative;border-bottom-style:solid;border-bottom-color:#ccc;zoom:1}.x .h1{border-bottom-width:4px;font-size:24px}.x .h2{border-bottom-width:3px;font-size:20px}.x .h3{border-bottom-width:2px;font-size:16px}.x .h4{border-bottom-width:1px;font-size:12px}/* Portlet */.x .portlet{position:relative;border:1px solid #e9e9e9;margin:1em 0;padding:0;background:#fff;zoom:1;overflow:hidden;border-radius:5px}.x .portlet h2, .x .portlet h3{margin:0;padding:.5em 1em;font-size:14px;border:1px solid #fff;border-bottom:1px solid #e9e9e9;background:#f7f7f7;border-radius:5px 5px 0 0}.x .portlet p{margin:1em 1.2em}.x .portlet li{position:relative;padding-right:8em}.x .portlet .lined{margin:1px;padding:0;list-style:none}.x .portlet .lined li{padding:.5em 8em .5em 1em;border-top:1px solid #eee;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis}.x .portlet .lined li:first-child{border:0}.x .portlet .side{position:absolute;top:0;_top:1px;right:0;color:#666;background:#fff;padding:0 1em}.x .portlet .lined .side{padding:.5em 1em}.x .portlet .more{position:absolute;top:.5em;right:1em;text-decoration:none !important;color:#666}.x .portlet .more span{color:#999}.x .portlet .action{text-align:right;top:0;right:0;padding:.5em 1em .5em 3em;background:#fff;background:-webkit-gradient(linear, 0% 0%, 100% 0%, from(rgba(255,255,255,0)), to(rgba(255,255,255,1)), color-stop(15%, #fff));background:-moz-linear-gradient(left, rgba(255,255,255,0) 0, rgba(255,255,255,1) 15%)}.x .portlet .action a,.x .portlet .action button{margin-left:1em}.x .portlet .btnArea{border-top:1px solid #ddd;margin:0;padding:.5em 1em;margin:0 1px 1px 1px;background:#f7f7f7;border-radius:0 0 5px 5px}/* Table */.x .table{margin:1em 0}.x .table table{width:100%;border:0;border-collapse:collapse;border-top:2px solid #ccc}.x .table caption{font-weight:bold;text-align:left;line-height:22px;padding:5px 0}.x .table caption:after{content:"";display:block;clear:both}.x .table caption a{font-weight:normal}.x .table caption em{float:right;margin-left:1em}.x .table caption strong{color:#e00}.x .table caption .side{float:right;font-weight:normal;margin-left:1em}.x .table th,.x .table td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd;white-space:nowrap}.x .table th{background:#f8f8f8}.x .table thead th{border-bottom:1px solid #999}.x .table tfoot td{font-weight:bold;background:#f8f8f8}.x .table.even tbody tr:nth-of-type(even) td{background-color:#fafafa}.x .table td>input[type=text]{margin:-1px 0 -3px 0 !important;vertical-align:middle}.x .table img{vertical-align:middle}.x .table em{font-style:normal;font-weight:normal;color:#e00}.x .table .title,.x .table .text{white-space:normal}/* Form */.x .form{margin:1em 0;padding:0}.x .form fieldset{margin:0 0 2em 0;padding:0;border:0}.x .form em{font-style:normal;color:#e00}.x .form label{margin-right:1em;line-height:1;vertical-align:middle}.x .form input[type=checkbox]+label,.x .form input[type=radio]+label,.x .form input[type=file]{cursor:pointer}.x .form ul{position:relative;margin:0;padding:0;list-style:none;border-top:2px solid #ccc;border-bottom:1px solid #ccc;zoom:1}.x .form li{list-style:none;border:1px solid #ddd;border-left:0;border-right:0;margin:-1px 0;padding:8px 0;vertical-align:top;zoom:1}.x .form li:first-child{border-top:0}.x .form li>label:first-child{display:block;font-weight:bold}.x .form li label em{font-weight:normal}.x .form label.overlap{position:absolute;color:#aaa}.x .form input[type=text],.x .form input[type=password],.x .form input[type=file],.x .form textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:transparent}.x .form input[type=text],.x .form input[type=password],.x .form input[type=file]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px}.x .form input[type=text].loading,.x .form input.loading[type=password]{padding-right:24px;width:260px;background:transparent url(../img/preLoader16.gif) no-repeat 265px center}.x .form input[type=checkbox],.x .form input[type=radio]{margin:0;padding:0;width:13px;height:13px;vertical-align:middle}.x .form input[type=text][disabled=disabled],.x .form input[type=password][disabled=disabled],.x .form input[type=checkbox][disabled=disabled],.x .form input[type=radio][disabled=disabled],.x .form input[type=file][disabled=disabled],.x .form textarea[disabled=disabled],.x .form select[disabled=disabled]{background:#ddd !important;text-shadow:1px 1px 0 #fff}.x .form textarea{padding:3px 4px;vertical-align:top}.x .form span.desc, .x .form em.desc{line-height:22px;vertical-align:middle;margin:0 10px}.x .form p.desc{margin:.25em 0;line-height:1.4}.x .form .q{font-weight:bold;margin:0 0 5px 0}.x .form .a{margin:0 0 5px 0}.x .form .tgForm{margin-right:1em}.x .form .h1 + ul,.x .form .h2 + ul,.x .form .h3 + ul,.x .form .h4 + ul{border-top:0}/* Global Navigation Bar */.x .gnb{position:relative;clear:both;border:1px solid #c1c1c1;border-left:0;border-right:0;background-color:#efefef;background:#efefef -webkit-gradient(linear, 0% 0%, 0% 100%, from(#efefef), to(#dcdcdc));background:#efefef -moz-linear-gradient(top, #efefef, #dcdcdc);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#efefef, endColorStr=#dcdcdc);zoom:1}.x .gnb ul{margin:0;padding:0 0 0 2em;list-style:none;border:1px solid #fff;border-left:0;border-right:0;zoom:1}.x .gnb ul ul{position:absolute;top:30px;left:0;border:1px solid #ccc;border-top:0;padding:1px 0 0 0;background:#fff}.x .gnb ul:after{content:"";display:block;clear:both}.x .gnb li{position:relative;float:left;border:1px solid #fff;border-top:0;border-bottom:0;margin:0 -1px 0 0}.x .gnb li li{float:none;clear:both;overflow:hidden;border:0;border-top:1px dotted #ccc;margin:0;padding:2px}.x .gnb li li:first-child{border:0}.x .gnb li a{float:left;font-weight:bold;color:#333;font-size:12px;padding:8px 18px;white-space:nowrap;text-decoration:none;text-shadow:0 1px 0 #fff;zoom:1}.x .gnb li a:hover,.x .gnb li a:active,.x .gnb li a:focus,.x .gnb li.active a{background:#f4f4f4;border:1px solid #ccc;border-bottom:0;padding:7px 17px 8px 17px}.x .gnb li.activeOn a{background:#fff;border:1px solid #ccc;border-bottom:0;padding:7px 17px 8px 17px}.x .gnb li.active li a{display:block;float:none;color:#555;background:#fff;padding:5px 15px !important;font-weight:normal !important;border:0 !important}.x .gnb li.active li a:hover,.x .gnb li.active li a:active,.x .gnb li.active li a:focus{border:0;background:#eee}.x .gnb .setting{position:absolute;top:8px;right:2em;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;background:url(../img/iconSetting.gif) no-repeat center}.x .gnb.jx ul{display:block;position:static;padding:0}.x .gnb.jx li{float:none;clear:both;border-top:1px solid #ccc}.x .gnb.jx ul ul{border:0}.x .gnb.jx li li{border:0}.x .gnb.jx li a{float:none;display:block}.x .gnb.jx li a:hover,.x .gnb.jx li a:active,.x .gnb.jx li a:focus{background:none}.x .gnb.jx li.activeOn>a{background:#ddd}@media only all and (max-width:860px){.x .gnb ul{padding-left:1em}.x .gnb .setting{right:1em}}@media only all and (max-width:640px){.x .gnb ul{display:block;position:static;padding:0}.x .gnb li{float:none;clear:both;border-top:1px solid #ccc}.x .gnb ul ul{border:0;position:static}.x .gnb li li{border:0}.x .gnb li a{float:none;display:block}.x .gnb li a:hover,.x .gnb li a:active,.x .gnb li a:focus{background:none}.x .gnb li.activeOn>a{background:#ddd}}/* Favorite */.x .bmk{position:absolute;right:2em;bottom:10px;padding:0 0 0 20px;background:url(../img/iconFavorite.gif) no-repeat 0 -16px}.x .bmk ul{position:absolute;top:140%;right:0;list-style:none;margin:0;padding:5px 10px;border:1px solid #aaa;border-radius:5px;background:#fff;box-shadow:1px 1px 3px #aaa}.x .bmk li{position:relative;padding:3px 30px 3px 0;white-space:nowrap}.x .bmk li .action{position:absolute;top:0;right:0}.x .bmk li .action .text{text-decoration:none;width:16px;text-align:center;margin:0}@media only all and (max-width:640px){.x .bmk{position:static;background-color:#fff;padding:10px 20px;background:#fff}.x .bmk .tgAnchor{display:block}.x .bmk ul{position:relative;border:0;border-top:1px solid #ccc;border-radius:0;box-shadow:none;padding:0;margin:5px 0 0 0}.x .bmk li{position:relative;top:-1px;border-top:1px dotted #ccc}}/* Local Navigation */.x .lnb{position:relative;float:left;width:200px;margin:1em 0 1em -230px;line-height:normal;zoom:1;display:inline}.x .lnb .h2{margin-top:0}.x .lnb ul{margin:0;padding:0;list-style:none}.x .lnb li{position:relative;margin:0 0 -1px 0;vertical-align:top;zoom:1}.x .lnb li a{display:block;position:relative;padding:8px 10px;text-decoration:none;color:#666;font-weight:bold;background:#fafafa;border:1px solid #eee;zoom:1}.x .lnb li a .i{position:absolute;top:50%;left:100%;margin:-4px 0 0 -16px;width:8px;height:8px;color:#ccc;background:url(../img/iconNavVr.gif) no-repeat left top}.x .lnb li ul{padding:5px 0;background:#fff}.x .lnb li li{margin:0;border-top:1px dotted #ddd}.x .lnb li li:first-child{border:0}.x .lnb li li a{font-weight:normal;background:#fff;padding:5px 10px;border:0}.x .lnb li li a span{color:#666}.x .lnb li.active{border:1px solid #ccc;z-index:2}.x .lnb li li.active{border:0}.x .lnb li.active a{color:#000;border:0}.x .lnb li.active .i{background-position:0 -44px}.x .lnb li.active li a{border:0}.x .lnb li.active ul{display:block;border-top:1px solid #eee}.x .lnb li.active li.active a span{color:#13b200;font-weight:bold;letter-spacing:-1px}/* Content Navigation */.x .cnb{margin:1em 0;position:relative;zoom:1}.x .cnb:after{content:"";display:block;clear:both}.x .cnb ul{list-style:none;margin:0;padding:0}.x .cnb li{display:inline}.x .cnb li:before{content:"| ";color:#ccc}.x .cnb li:first-child:before{content:""}.x .cnb .active,.x .cnb .active a{font-weight:bold;color:#333;text-decoration:none}.x .cnb .side{float:right}/* Pagination */.x .pagination{margin:1em 0;text-align:center;line-height:normal}.x .pagination *{vertical-align:middle}.x .pagination a,.x .pagination strong{position:relative;display:inline-block;padding:2px 4px;font-weight:bold;text-decoration:none;line-height:normal;color:#333 !important;vertical-align:middle}.x .pagination a:hover,.x .pagination a:active,.x .pagination a:focus{border:1px solid #ddd;margin:0 -1px}.x .pagination strong{color:#e00 !important;font-size:20px}.x .pagination .direction{font-weight:normal;white-space:nowrap}.x .pagination .direction:hover,.x .pagination .direction:active,.x .pagination .direction:focus{border:0;margin:0;text-decoration:underline}.x .pagination input{width:30px;text-align:center}.x .pagination button{overflow:visible}/* Star Rating */.x .starRating, .x .starRating span{display:inline-block;height:14px;background:transparent url(../img/iconStarRating.gif) no-repeat;overflow:hidden}.x .starRating{width:79px;vertical-align:top}.x .starRating span{font-size:0;line-height:0;vertical-align:top;text-indent:-100px;*text-indent:0;background-position:0 -14px}/* Progress */.x .prgrs{white-space:nowrap;line-height:normal;vertical-align:middle}.x .prgrs *{vertical-align:middle}.x .prgrs .pBar{position:relative;display:inline-block;background:#e9e9e9;margin:0 5px 0 0}.x .prgrs .pAction{display:inline-block;vertical-align:top;background:#99a6b6}.x .prgrs .pNum{position:absolute;width:100%;left:0;top:0;text-align:center;text-shadow:1px 1px 0 #fff}.x .prgrs.prgrsSmall{font-size:14px;line-height:14px}.x .prgrs.prgrsSmall .pBar,.x .prgrs.prgrsSmall .pAction,.x .prgrs.prgrsSmall .pNum{height:16px;line-height:16px;font-size:11px}.x .prgrs.prgrsMedium{font-size:24px;line-height:24px}.x .prgrs.prgrsMedium .pBar,.x .prgrs.prgrsMedium .pAction,.x .prgrs.prgrsMedium .pNum{height:22px;line-height:22px;font-size:12px}.x .prgrs.prgrsLarge{font-size:38px;line-height:38px}.x .prgrs.prgrsLarge .pBar,.x .prgrs.prgrsLarge .pAction,.x .prgrs.prgrsLarge .pNum{height:34px;line-height:34px;font-size:14px}/* Modal Window */.modal{position:absolute;top:0;left:0;width:100%;_height:100%;min-height:100%;z-index:100}.modal .bg{position:absolute;background:#000;_background:none;width:100%;height:100%;opacity:.5;z-index:2;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1}.modal .fg{position:relative;width:80%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:3;zoom:1;border-radius:5px;box-shadow:0 0 6px #000}.modal ul, .modal ol, .modal .lined, .modal .table{margin-bottom:1em}.modal .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1}.modalClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px}.modalBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}html.modalContainer,body.modalContainer{_height:100%;_width:100%} /* IE6 only */ /* Layer */.x .layer,.x.layer{position:absolute;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:2;zoom:1;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5pxbox-shadow:0 0 6px #666;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x .layer h2{font-size:14px}.x .layer ul, .x .layer ol, .x .layer .lined, .x .layer .table{margin-bottom:1em}.x .layerClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px}.x .layerBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}/* H2 Anchor */.x .h2Anchor{position:absolute;right:0;border:0;background:none;color:#00f;text-decoration:underline}/* Skip Navigation */.x .skipNav{margin:0;text-align:center;overflow:hidden}.x .skipNav a{position:absolute;width:1px;height:1px;display:block;color:#fff;font-weight:bold;padding:10px 0;background:#333;border-top:1px solid #656565}.x .skipNav a:hover,.x .skipNav a:active,.x .skipNav a:focus{position:relative;width:auto;height:auto}/* Header */.x .header{position:relative;z-index:2;padding:30px 0 0 0;background:#4c4c4c;box-shadow:0 0 10px #aaa;zoom:1}.x .header:after{content:"";display:block;clear:both}.x .header a{text-decoration:none}.x .header h1{margin:0 15px 10px 1.3em;font-size:24px;line-height:32px;display:inline-block;zoom:1}.x .header h1 *{vertical-align:middle}.x .header h1 a{color:#fff;text-shadow:1px 1px 0 #000;filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=1, OffY=1, Color=#000000, Positive=true);zoom:1}.x .header h1 .url{font-size:12px;font-weight:normal}.x .header .site{margin:0;display:inline-block;zoom:1}.x .header .site a{color:#fff;text-decoration:underline}.x .header #moveSiteList{padding:10px 1em 5px 1em;margin:0}.x .header #moveSiteList ul{list-style:none;margin:0;padding:0}.x .header #moveSiteList li{white-space:nowrap;margin:0;padding:4px 0;border-bottom:1px dotted #ccc}.x .header #siteMapList{padding:0 1em 1em 1em;margin:0}.x .header #siteMapList li{white-space:nowrap}.x .header .account{position:absolute;z-index:3;width:100%;padding:5px 2em 5px 0;top:0;right:0;white-space:nowrap;text-align:right;background:#333;border-bottom:1px solid #656565;color:#fff;font-size:12px;box-shadow:0 0 10px #333}.x .header .account ul{margin:0 2px 0 0;padding:0;list-style:none}.x .header .account li{position:relative;display:inline;border-left:1px solid #666;padding:0 6px 0 10px}.x .header .account li:first-child{border:0}.x .header .account a{color:#fff;display:inline-block;height:14px}.x .header .account a.language{padding-right:16px;background:url(/xe/modules/admin/tpl/img/iconArrow.gif) no-repeat right -160px}.x .header #language{position:absolute;top:19px;right:-2em;padding:6px 4px !important;border:1px solid #666;border-top:0;background:#333}.x .header #language li{border:0;display:block;padding:1px 8px 1px 10px;text-align:left;line-height:1}.x .header #language li.selected{background:url(/xe/modules/admin/tpl/img/iconCheck.gif) no-repeat left center}.x .header #language li.selected a{text-decoration:underline}.x .header h1 a:hover,.x .header h1 a:active,.x .header h1 a:focus,.x .header .account a:hover,.x .header .account a:active,.x .header .account a:focus{color:#6e9cf2;text-decoration:underline}/* Footer */.x .footer{border-top:1px solid #ddd;text-align:center;font-size:12px;padding:1.5em 0;margin:0 2em;zoom:1}.x .footer:after{content:"";display:block;clear:both}.x .footer p{margin:0}.x .footer .power{float:left}.x .footer .cache{float:right}/* Body */.x .body{position:relative;z-index:1;padding:1em 2em 1em 260px;zoom:1}.x .body:after{content:"";display:block;clear:both}/* Content */.x .content{float:right;width:100%;margin-left:-230px;zoom:1}.x .content:after{content:"";display:block;clear:both}.x .content a{color:#33a}.x .content a:hover,.x .content a:active,.x .content a:focus{color:#a33}.x .content .portlet a{text-decoration:none}.x .content .portlet a:hover,.x .content .portlet a:active,.x .content .portlet a:focus{text-decoration:underline}/* Dashboard */.x .dashboard{position:relative;float:none;width:auto;margin-left:-230px}.x .dashboard .portlet{float:left;width:48%;margin-right:1em}.x .dashboard .portlet:nth-of-type(odd){float:left;width:49%;margin-right:0}.x .dashboard .portlet:nth-of-type(even){float:right;width:49%;margin-right:0}@media only all and (min-width:1300px){.x .dashboard .portlet{float:left !important;width:32% !important;margin-right:1em !important}}/* Single Column*/.x .single{position:relative;float:none;width:auto;margin-left:-230px}/* Search */.x .search{zoom:1}.x .search:after{content:"";display:block;clear:both}.x .search .pagination{float:left;text-align:left}.x .search form{float:right;margin:1em 0}.x .search form *{vertical-align:middle}/* Site Map */.x .siteMap h2 input{font-size:14px;font-weight:bold;padding:0 .5em}.x .siteMap label{cursor:text}.x .siteMap .lined ul{padding:0;margin:0;border-top:1px solid #eee;zoom:1}.x .siteMap .lined li{position:relative;padding:0;margin:0;cursor:all-scroll;list-style:none;zoom:1}.x .siteMap .lined li li{border-top:1px solid #eee}.x .siteMap li li{text-indent:18px}.x .siteMap li li li{text-indent:36px}.x .siteMap li li li li{text-indent:54px}.x .siteMap li li li li li{text-indent:72px}.x .siteMap li li li li li li{text-indent:90px}.x .siteMap li li li li li li li{text-indent:108px}.x .siteMap li li li li li li li li{text-indent:126px}.x .siteMap li li li li li li li li li{text-indent:144px}.x .siteMap li li li li li li li li li li{text-indent:162px}.x .siteMap li li li li li li li li li li li{text-indent:180px}.x .siteMap li li li li li li li li li li li li{text-indent:198px}.x .siteMap li *{vertical-align:middle}.x .siteMap li .moveTo+input{width:200px;border:0;padding:0 .5em}.x .siteMap li .moveTo+input:hover,.x .siteMap li .moveTo+input:active,.x .siteMap li .moveTo+input:focus{border:1px dotted #ccc;overflow:visible}.x .siteMap .moveTo{position:relative;z-index:2;width:22px;height:32px;padding:32px 0 0 0;margin:0 3px;_margin-top:-1px;overflow:hidden;background:#fff url(../img/iconMoveTo.gif) no-repeat center 0;border:0;cursor:move}.x .siteMap li.active,.x .siteMap li.active .moveTo{background-color:#f7f7f7}.x .siteMap li.active li,.x .siteMap li.active ul{border-top-color:#f7f7f7}.x .siteMap li.active .moveTo{background-position:center -32px}.x .siteMap .vr,.x .siteMap .hr{display:none;position:absolute;z-index:1;left:14px;border:0px solid #ccc;overflow:hidden}.x .siteMap .vr{top:-16px;height:100%;border-left-width:1px}.x .siteMap .hr{top:16px;width:16px;border-top-width:1px}.x .siteMap li.active .vr,.x .siteMap li.active li .hr{display:block}.x .siteMap li li .vr,.x .siteMap li li li .hr{left:32px}.x .siteMap li li li .vr,.x .siteMap li li li li .hr{left:50px}.x .siteMap li li li li .vr,.x .siteMap li li li li li .hr{left:68px}.x .siteMap li li li li li .vr,.x .siteMap li li li li li li .hr{left:86px}.x .siteMap li li li li li li .vr,.x .siteMap li li li li li li li .hr{left:104px}.x .siteMap li li li li li li li .vr,.x .siteMap li li li li li li li li .hr{left:122px}.x .siteMap li li li li li li li li .vr,.x .siteMap li li li li li li li li li .hr{left:140px}.x .siteMap li li li li li li li li li .vr,.x .siteMap li li li li li li li li li li .hr{left:158px}.x .siteMap li li li li li li li li li li .vr,.x .siteMap li li li li li li li li li li li .hr{left:176px}.x .siteMap li li li li li li li li li li li .vr,.x .siteMap li li li li li li li li li li li li .hr{left:336px}.x .siteMap .side{padding-top:0 !important;padding-bottom:0 !important;line-height:30px;background:transparent !important}.x .siteMap .side button{text-indent:0;line-height:1}.x .siteMap .tgMap{position:absolute;top:12px;right:1em;padding:0 16px 0 0;line-height:16px;background:url(../img/iconArrow.gif) no-repeat right -126px}.x .siteMap.fold .tgMap{background-position:right -158px}.x .siteMap.fold .h2{border-bottom-color:#fff;border-radius:5px}.x .siteMap .placeholder{background:#bbb}.x .siteMap .draggable,.x .siteMap .draggable .moveTo{background-color:#ddd}.x .siteMap .draggable .summary{border-left:1px solid #ccc;padding-left:10px;margin-left:10px;font-size:11px;color:#999}.x .siteMap a.ms{text-decoration:underline}/* Multilingual */.x .langEdit{background:#fff;position:absolute;*left:0;*margin-top:28px;z-index:10}.x .langEdit ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0}.x .langEdit li{padding:.5em 10px}.x .langEdit input[type=text]{width:220px;padding-right:40px}.x .langEdit label{left:15px !important}.x .langEdit .action{border:1px solid #eee;width:268px;padding:0 10px}.x .langEdit p, .x .langEdit .btnArea{white-space:normal}.x .langEdit .langList,.x .langEdit .langEditControls{box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x .langEdit .langList{margin:0 -1px 0 0;display:none}.x .langEdit .langList li{white-space:nowrap;color:#ccc;width:270px} .x .langEdit .langList li span{display:inline-block;width:80px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:#767676}.x .langEdit .langList li a{display:inline-block;width:80px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.x .langEdit .langList li.active{background:url(../img/iconArrow.gif) no-repeat right -188px}.x .langEdit.showChild .langList{display:block}.x .langEdit .langInput{background:#fff}.x .langEdit .langInput h2{padding:5px 10px;margin:0 0 -1px 0;font-size:12px;font-weight:normal;color:#666;border:1px solid #eee;border-top-color:#ccc}.x .langEdit .langInput h2 strong{color:#000;font-size:14px}.x .langEdit.showChild .langInput{position:absolute;left:285px;top:0}.x .langEdit li.en input, .x .langEdit li.en textarea, .x .mLangEdit li.en textarea{background:url(../img/flag.us.gif) no-repeat 99% 5px}.x .langEdit li.ko input, .x .langEdit li.ko textarea, .x .mLangEdit li.ko textarea{background:url(../img/flag.kr.gif) no-repeat 99% 5px}.x .langEdit li.jp input, .x .langEdit li.jp textarea, .x .mLangEdit li.jp textarea{background:url(../img/flag.jp.gif) no-repeat 99% 5px}.x .langEdit li.fr input, .x .langEdit li.fr textarea, .x .mLangEdit li.fr textarea{background:url(../img/flag.fr.gif) no-repeat 99% 5px}.x .langEdit li.de input, .x .langEdit li.de textarea, .x .mLangEdit li.de textarea{background:url(../img/flag.de.gif) no-repeat 99% 5px}.x .langEdit li.ru input, .x .langEdit li.ru textarea, .x .mLangEdit li.ru textarea{background:url(../img/flag.ru.gif) no-repeat 99% 5px}.x .langEdit li.es input, .x .langEdit li.es textarea, .x .mLangEdit li.es textarea{background:url(../img/flag.es.gif) no-repeat 99% 5px}.x .langEdit li.tr input, .x .langEdit li.tr textarea, .x .mLangEdit li.tr textarea{background:url(../img/flag.tr.gif) no-repeat 99% 5px}.x .langEdit li.vi input, .x .langEdit li.vi textarea, .x .mLangEdit li.vi textarea{background:url(../img/flag.vn.gif) no-repeat 99% 5px}.x .langEdit li.mn input, .x .langEdit li.mn textarea, .x .mLangEdit li.mn textarea{background:url(../img/flag.mn.gif) no-repeat 99% 5px}.x .langEdit li.zh-CN input, .x .langEdit li.zh-CN textarea, .x .mLangEdit li.zh-CN textarea, .x .langEdit li.zh-TW input, .x .langEdit li.zh-TW textarea, .x .mLangEdit li.zh-TW textarea{background:url(../img/flag.cn.gif) no-repeat 99% 5px}.x .mLangEdit.en strong{background:url(../img/flag.us.gif) no-repeat 0 10px}.x .mLangEdit.ko strong{background:url(../img/flag.kr.gif) no-repeat 0 10px}.x .mLangEdit.jp strong{background:url(../img/flag.jp.gif) no-repeat 0 10px}.x .mLangEdit.fr strong{background:url(../img/flag.fr.gif) no-repeat 0 10px}.x .mLangEdit.de strong{background:url(../img/flag.de.gif) no-repeat 0 10px}.x .mLangEdit.ru strong{background:url(../img/flag.ru.gif) no-repeat 0 10px}.x .mLangEdit.es strong{background:url(../img/flag.es.gif) no-repeat 0 10px}.x .mLangEdit.tr strong{background:url(../img/flag.tr.gif) no-repeat 0 10px}.x .mLangEdit.vi strong{background:url(../img/flag.vn.gif) no-repeat 0 10px}.x .mLangEdit.mn strong{background:url(../img/flag.mn.gif) no-repeat 0 10px}.x .mLangEdit.zh-CN strong, .x .mLangEdit.zh-TW strong{background:url(../img/flag.cn.gif) no-repeat 0 10px}.x .mLangEdit ul ul{border:0}.x .mLangEdit li{position:relative;padding:0}.x .mLangEdit li strong{display:inline-block;padding:6px 100px 8px 24px;font-weight:normal;line-height:1.5}.x .mLangEdit li .side{position:absolute;top:8px;right:0;padding-right:18px;background:url(../img/iconArrow.gif) no-repeat right -160px}.x .mLangEdit li li{border:0;padding-right:36px}.x .mLangEdit li textarea{width:100%;height:16px;padding-right:30px;resize:vertical;line-height:1.4}.x .mLangEdit li label{top:8px !important}.x .mLangEdit li.active{background:#FFFDEF}.x .mLangEdit li.active strong{font-weight:bold}.x .mLangEdit li.active .side{background-position:right -128px}.modal .mLangEdit ul{padding-bottom:1em}.modal .mLangEdit li{border:0;padding-right:36px}/* Suggestion */.x .suggestion{display:none;position:absolute;background:#fff;z-index:10;_height:200px;max-height:200px;overflow:auto;*left:0;*margin-top:28px;box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x .suggestion ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0}.x .suggestion li{padding:0}.x .suggestion li:last-child{border-bottom:0}.x .suggestion li button{border:0;background:#fff;text-align:left;width:288px;padding:2px 4px;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.x .suggestion li button:hover,.x .suggestion li button:active,.x .suggestion li button:focus,.x .suggestion li button.active{background:#eee}/* Image Mark */.x #imageMark{right:0}/* Easy Installer */.x .easyNav{position:relative;border:1px solid #e9e9e9;zoom:1}.x .easyNav:after{content:"";display:block;clear:both}.x .easyNav h2{font-size:16px}.x .easyNav .category{width:30%;float:left;margin:0 2em;display:inline}.x .easyNav .filter{position:absolute;top:0;right:0;margin:1em 2em;text-align:right}.x .easyList td p{margin-top:0}.x .easyList td p.update{background:#ffc;padding:.5em 1em;border:1px solid #fc9;border-left:0;border-right:0;text-align:center}/* Font Preview */.x .fontPreview{width:96%;border:1px solid #e9e9e9;zoom:1;padding:1em 2em;margin:.5em 0}/* FTP Suggestion */.x #ftpSuggestion{background:#fff;box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x #ftpSuggestion ul{border-left:1px solid #eee;border-right:1px solid #eee}.x #ftpSuggestion li{padding:0}.x #ftpSuggestion li button{border:0;background:#fff;text-align:left;width:288px}.x #ftpSuggestion li button:hover,.x #ftpSuggestion li button:active,.x #ftpSuggestion li button:focus{background:#eee}/* Theme & Skin Preview */.x .thumbPreview li{position:relative;padding-left:10px;padding-right:10px}.x .thumbPreview li.active.highlight{background:#f9f9f9}.x .thumbPreview .prevToggle{position:absolute;top:8px;right:10px;line-height:16px;padding:0 18px 0 0;text-decoration:none;background:url(../img/iconArrow.gif) no-repeat right -32px}.x .thumbPreview li.active .prevToggle{background-position:right 0}.x .thumbPreview .a{border:0;margin:0;zoom:1}.x .thumbPreview .a:after{content:"";display:block;clear:both}.x .thumbPreview .i{float:left;vertical-align:top;margin:0 1em 1em 0;padding:0;border:0;zoom:1}.x .thumbPreview .i:after{content:"";display:block;clear:both}.x .thumbPreview .i .thumb{position:relative;width:124px;height:84px;padding:0;margin-bottom:3px;text-align:center;overflow:hidden;border:1px solid #ddd;display:block;cursor:pointer;background:#fff}.x .thumbPreview .i .thumb .frame{position:absolute;width:120px;height:80px;left:0;top:0;border:2px solid #fff;overflow:hidden}.x .thumbPreview .i .thumb img{width:120px;margin:0}.x .thumbPreview .i label{display:block;position:relative;top:0;left:2px;width:122px;height:1.1em;margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x .thumbPreview .i input{display:none}.x .thumbPreview .i ul{display:none}.x .thumbPreview .selected .i{display:block;float:none}.x .thumbPreview .selected .i .thumb{float:left;width:186px;height:126px;margin:0 1em 0 0;border:2px solid #eee}.x .thumbPreview .selected .i .thumb .frame{width:180px;height:120px;border-width:3px}.x .thumbPreview li.active.highlight .selected .i .thumb{border-color:#5ea8f6}.x .thumbPreview .selected .i .thumb img{width:180px;position:relative}.x .thumbPreview li.active .selected .i .thumb img{z-index:auto}.x .thumbPreview .selected .i label{cursor:text}.x .thumbPreview .selected .i ul{display:block;list-style:none;border:0;margin:1em 0 1em 200px}.x .thumbPreview .selected .i li{border:0;padding:0;margin:0 0 .2em 0}.x .thumbPreview.jx .i label{display:inline;width:auto}.x .thumbPreview.jx .i.noDirection{display:none}.x .thumbPreview.jx .i input{display:inline}.x #skin .showAll{float:right;border:0;overflow:visible;padding:0 18px 0 0;cursor:pointer;color:#00f;background:url(../img/iconArrow.gif) no-repeat right -32px}.x #skin .showAll.hideAll{background-position:right 0}/* Favorite On | Off */.x .fvOff,.x .fvOn{display:inline-block;width:16px;height:16px;overflow:hidden;text-indent:16px;background:url(../img/iconFavorite.gif) no-repeat}.x .fvOn{background-position:0 -16px}/* Up-Down Dragable */.x .uDrag .wrap{position:relative;padding-left:20px}.x .uDrag li>.wrap{margin:0 0 0 8px}.x .uDrag .dragActive{background:#FFD}.x .uDrag .dragActive th,.x .uDrag .dragActive td{background:none !important}.x .uDrag .dragBtn{position:absolute;width:8px;height:100%;padding:0;overflow:hidden;background:url(../img/bgDragable.gif);top:1px;left:0;text-indent:12px;border:0;cursor:n-resize;white-space:nowrap}/* Favicon Preview */.x .faviconPreview{position:relative;padding:60px 0 0 200px;background:url(../img/bgFavicon.gif) no-repeat}.x .faviconPreview img{position:absolute}.x .faviconPreview .fn1{top:30px;left:12px}.x .faviconPreview .fn2{top:55px;left:68px}/* Mobile Icon Preview */.x .mobiconPreview{position:relative;padding:252px 0 0 200px;background:url(../img/bgMobileTop.png) no-repeat}.x .mobiconPreview img{position:absolute;top:20px;left:10px}.x .mobiconPreview span{position:absolute;width:32px;text-align:center;top:52px;left:10px;color:#fff;font-size:9px}/* Text List */.x .textList{border:1px solid #ddd !important;line-height:1.5em;height:18.5em;overflow:auto}.x .textList li{border:0;padding:.25em 1em;height:1.5em;white-space:nowrap;overflow:hidden}.x .textList li:nth-child(even){background:#eee}.x .textList li a{float:right}/* File Box */.x .fileBox li{position:relative}.x .fileBox li img{max-width:100%}.x .fileBox .portlet ul{margin:1em;list-style:none;padding:0;border:0}.x .fileBox .portlet li{border-top:1px solid #ddd;border-bottom:0;padding:8px 0}.x .fileBox .side{position:absolute;top:8px;right:0}/* Messages */.x .desc.error{color:#f00}.x .desc.success{color:#080}/* Icon Button */.x a.iSetting{display:inline-block;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;vertical-align:middle;background:url(../img/iconSetting.gif) no-repeat}.x a.cMenu{display:inline-block;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;vertical-align:middle;background:url(../../../../common/img/icon.bubble.png) no-repeat}/* Responsive Layout */@media only all and (max-width:860px){.x .header h1{margin-left:.7em}.x .header .account{padding-right:1em}.x .body{padding:1em}.x .content{float:none;margin-left:0}.x .lnb{float:none;width:auto;margin:1em 0}.x .dashboard .portlet{float:none !important;width:auto !important;margin-right:0}.modal .fg,.wfsr .fg{width:auto}.x .easyNav .category{float:none;display:block;width:auto}.x .easyNav .filter{position:static}}@media only all and (max-width:640px){.x .skipNav a{position:relative;width:auto;height:auto}.modal{position:absolute}}/* Legacy Code (Don't use it. It will be removed as soon as possible.) */.x h3.xeAdmin,.x h4.xeAdmin{position:relative;border-bottom-style:solid;border-bottom-color:#ccc;zoom:1}.x h3.xeAdmin{border-bottom-width:4px;font-size:24px}.x h4.xeAdmin{border-bottom-width:3px;font-size:20px}.x h5.xeAdmin{border-bottom-width:2px;font-size:16px}.x h6.xeAdmin{border-bottom-width:1px;font-size:12px}.x .adminSearch{margin:1em 0}.x .adminSearch fieldset{border:1px solid #ccc}.x .localNavigation{padding:0;list-style:none}.x .localNavigation li{display:inline}.x .localNavigation li.on a{font-weight:bold;color:#333;text-decoration:none}.x .localNavigation li:before{content:"| "}.x .localNavigation li:first-child:before{content:""}.x .summary{margin:1em 0}.x .rowTable,.x .colTable,.x .crossTable{margin:1em 0;border:0;border-collapse:collapse;border-top:2px solid #ccc;width:100%}.x .rowTable caption,.x .colTable caption,.x .crossTable caption{font-weight:bold;text-align:left;line-height:22px;padding:5px 0}.x .rowTable caption:after,.x .colTable caption:after,.x .crossTable caption:after{content:"";display:block;clear:both}.x .rowTable caption a,.x .colTable caption a,.x .crossTable caption a{font-weight:normal}.x .rowTable caption em,.x .colTable caption em,.x .crossTable caption em{float:right;font-style:normal;font-weight:normal;color:#e00;margin-left:1em}.x .rowTable caption strong,.x .colTable caption strong,.x .crossTable caption strong{color:#e00}.x .rowTable caption .side,.x .colTable caption .side,.x .crossTable caption .side{float:right;font-weight:normal;margin-left:1em}.x .rowTable th,.rowTable td,.x .colTable th,.rowTable td,.x .crossTable th,.rowTable td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd;white-space:nowrap}.x .rowTable th,.x .colTable th,.x .crossTable th{background:#f8f8f8}.x .rowTable thead th,.x .colTable thead th,.x .crossTable thead th{border-bottom:1px solid #999}.x .rowTable tfoot td,.x .colTable tfoot td,.x .crossTable tfoot td{font-weight:bold;background:#f8f8f8}.x .rowTable.even tbody tr:nth-of-type(even) td,.x .colTable.even tbody tr:nth-of-type(even) td,.x .crossTable.even tbody tr:nth-of-type(even) td{background-color:#fafafa}.x .rowTable td>input[type=text],.x .colTable td>input[type=text],.x .crossTable td>input[type=text]{margin:-1px 0 -3px 0 !important;vertical-align:middle}.x .rowTable img,.x .colTable img,.x .crossTable img{vertical-align:middle}.x .rowTable .title,.x .colTable .title,.x .crossTable .title,.x .rowTable .text,.x .colTable .text,.x .crossTable .text{white-space:normal}.x .rowTable input[type=text],.x .colTable input[type=text],.x .crossTable input[type=text],.x .rowTable input[type=password],.x .colTable input[type=password],.x .crossTable input[type=password],.x .rowTable input[type=file],.x .colTable input[type=file],.x .crossTable input[type=file],.x .rowTable textarea,.x .colTable textarea,.x .crossTable textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:transparent}.x .rowTable input[type=text],.x .colTable input[type=text],.x .crossTable input[type=text],.x .rowTable input[type=password],.x .colTable input[type=password],.x .crossTable input[type=password],.x .rowTable input[type=file],.x .colTable input[type=file],.x .crossTable input[type=file]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px}.x .clear:after{content:"";display:block;clear:both} \ No newline at end of file From e57028ceaa921e379c37a1e07beb388c7f0b8748 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Tue, 11 Oct 2011 09:35:56 +0000 Subject: [PATCH 1117/1372] Dashboard language update 'There is no data' git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9587 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/tpl/_spHeader.html | 1 + modules/admin/tpl/index.html | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/modules/admin/tpl/_spHeader.html b/modules/admin/tpl/_spHeader.html index 1448cf554..3d7408441 100644 --- a/modules/admin/tpl/_spHeader.html +++ b/modules/admin/tpl/_spHeader.html @@ -38,6 +38,7 @@ +
                                                    • {$lang->no_data}
                                                    • diff --git a/modules/admin/tpl/index.html b/modules/admin/tpl/index.html index 0df1ca770..0403f7702 100644 --- a/modules/admin/tpl/index.html +++ b/modules/admin/tpl/index.html @@ -58,6 +58,7 @@ +
                                                    • {$lang->no_data}
                                                    • @@ -78,6 +79,7 @@ +
                                                    • {$lang->no_data}
                                                    • @@ -97,6 +99,7 @@ +
                                                    • {$lang->no_data}
                                                    • @@ -105,6 +108,7 @@
                                                    • {$value->title} {zdate($value->date, 'Y-m-d')}
                                                    • +
                                                    • {$lang->no_data}
                                                    • @@ -121,6 +125,7 @@ +
                                                    • {$lang->no_data}
                                                    • From 43fe125696dd447c16cce698664805a5e066bc46 Mon Sep 17 00:00:00 2001 From: taggon Date: Tue, 11 Oct 2011 10:03:28 +0000 Subject: [PATCH 1118/1372] issue 165: Preserve queries in URL git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9588 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- .htaccess | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.htaccess b/.htaccess index d8e6e4a78..596c92996 100644 --- a/.htaccess +++ b/.htaccess @@ -24,22 +24,22 @@ RewriteRule ^([a-zA-Z0-9_]+)/([0-9]+)/(.+)/trackback$ ./index.php?vid=$1&documen RewriteRule ^admin/?$ ./index.php?module=admin [L] # document permanent link -RewriteRule ^([0-9]+)$ ./index.php?document_srl=$1 [L] +RewriteRule ^([0-9]+)$ ./index.php?document_srl=$1 [L,QSA] # mid link RewriteCond %{SCRIPT_FILENAME} !-d -RewriteRule ^([a-zA-Z0-9_]+)/?$ ./index.php?mid=$1 [L] +RewriteRule ^([a-zA-Z0-9_]+)/?$ ./index.php?mid=$1 [L,QSA] # mid + document link -RewriteRule ^([a-zA-Z0-9_]+)/([0-9]+)$ ./index.php?mid=$1&document_srl=$2 [L] +RewriteRule ^([a-zA-Z0-9_]+)/([0-9]+)$ ./index.php?mid=$1&document_srl=$2 [L,QSA] # vid + mid link RewriteCond %{SCRIPT_FILENAME} !-d -RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/?$ ./index.php?vid=$1&mid=$2 [L] +RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/?$ ./index.php?vid=$1&mid=$2 [L,QSA] # vid + mid + document link -RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/([0-9]+)$ ./index.php?vid=$1&mid=$2&document_srl=$3 [L] +RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/([0-9]+)$ ./index.php?vid=$1&mid=$2&document_srl=$3 [L,QSA] # mid + entry title -RewriteRule ^([a-zA-Z0-9_]+)/entry/(.+)$ ./index.php?mid=$1&entry=$2 [L] +RewriteRule ^([a-zA-Z0-9_]+)/entry/(.+)$ ./index.php?mid=$1&entry=$2 [L,QSA] # vid + mid + entry title -RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/entry/(.+)$ ./index.php?vid=$1&mid=$2&entry=$3 [L] +RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/entry/(.+)$ ./index.php?vid=$1&mid=$2&entry=$3 [L,QSA] From 31eb3c76e7ce8a0cedcbd29bb3c4aa7f8ffcf279 Mon Sep 17 00:00:00 2001 From: taggon Date: Tue, 11 Oct 2011 10:05:20 +0000 Subject: [PATCH 1119/1372] issue 190 : add a test case for cond syntax issue 183 : add a test case for loop syntax git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9589 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- tests/classes/template/TemplateHandlerTest.class.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/classes/template/TemplateHandlerTest.class.php b/tests/classes/template/TemplateHandlerTest.class.php index cfe289846..0887ce3c8 100644 --- a/tests/classes/template/TemplateHandlerTest.class.php +++ b/tests/classes/template/TemplateHandlerTest.class.php @@ -199,6 +199,16 @@ class TemplateHandlerTest extends PHPUnit_Framework_TestCase '
                                                      Hello, world!
                                                      ', 'ii < $__Context->nn){ ?>dummy&&count($__Context->dummy))foreach($__Context->dummy as $__Context->k=>$__Context->v){ ?>
                                                      Hello, world!
                                                      ' ), + // issue 190 + array( + '
                                                      Hello, world!
                                                      ', + 'i >= $__Context->n)){ ?>dummy&&count($__Context->dummy))foreach($__Context->dummy as $__Context->k=>$__Context->v){ ?>
                                                      Hello, world!
                                                      ' + ), + // issue 183 + array( + '
                                                      {$lang->page_type}
                                                      {$lang->page_type} {$lang->page_type_name[$module_info->page_type]}
                                                      {$lang->mid}
                                                      {$lang->mid} - +

                                                      {$lang->about_mid}

                                                      {$lang->module_category}
                                                      {$lang->module_category}
                                                      {$lang->browser_title}
                                                      {$lang->browser_title} - + {$lang->cmd_find_langcode}

                                                      {$lang->about_browser_title}

                                                      {$lang->layout}
                                                      {$lang->layout}
                                                      {$lang->mobile_view}
                                                      {$lang->mobile_view} use_mobile == "Y")-->checked="checked" />

                                                      {$lang->about_mobile_view}

                                                      {$lang->mobile_layout}
                                                      {$lang->mobile_layout}
                                                      {$lang->page_caching_interval}
                                                      {$lang->page_caching_interval} - {$lang->unit_min} + {$lang->unit_min}

                                                      {$lang->about_page_caching_interval}

                                                      {$lang->opage_path}
                                                      {$lang->opage_path} - +

                                                      {$lang->about_opage_path}{realpath("./")}

                                                      {$lang->opage_mobile_path}
                                                      {$lang->opage_mobile_path} - +

                                                      {$lang->about_opage_mobile_path}{realpath("./")}

                                                      {$lang->skin}
                                                      {$lang->skin}
                                                      {$lang->mobile_skin}
                                                      {$lang->mobile_skin} - + - + + - + - + - + - + diff --git a/modules/page/tpl/page_mobile_content_modify.html b/modules/page/tpl/page_mobile_content_modify.html index afe3b17d6..c3b95d248 100644 --- a/modules/page/tpl/page_mobile_content_modify.html +++ b/modules/page/tpl/page_mobile_content_modify.html @@ -5,9 +5,7 @@ -
                                                      {$page_content}
                                                      -
                                                      diff --git a/modules/point/tpl/config.html b/modules/point/tpl/config.html index c60ae055e..d156586ad 100644 --- a/modules/point/tpl/config.html +++ b/modules/point/tpl/config.html @@ -33,44 +33,44 @@

                                                      {$lang->is_default}

                                                      {$lang->page_type}
                                                      {$lang->page_type} -
                                                      {$lang->mid} - +

                                                      {$lang->about_mid}

                                                      {$lang->module_category}
                                                      {$lang->browser_title} - + {$lang->cmd_find_langcode}

                                                      {$lang->about_browser_title}

                                                      {$lang->layout}
                                                      {$lang->page_caching_interval} - {$lang->unit_min} + {$lang->unit_min}

                                                      {$lang->about_page_caching_interval}

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

                                                      {$lang->about_opage_path}{realpath("./")}

                                                      {$lang->opage_mobile_path} - +

                                                      {$lang->about_opage_mobile_path}{realpath("./")}

                                                      - + - + - + - + - + - + - + - + - + - + - + - + - +
                                                      {$lang->point_signup} - {$config->point_name} + {$config->point_name}

                                                      {$lang->about_point_signup}

                                                      {$lang->cmd_login} {$config->point_name} {$config->point_name}
                                                      {$lang->point_insert_document} {$config->point_name} {$config->point_name}
                                                      {$lang->point_insert_comment} {$config->point_name} {$config->point_name}
                                                      {$lang->point_upload_file} {$config->point_name} {$config->point_name}
                                                      {$lang->point_download_file} {$config->point_name} {$config->point_name}
                                                      {$lang->point_read_document} {$config->point_name} {$config->point_name}
                                                      {$lang->point_voted} {$config->point_name} {$config->point_name}
                                                      {$lang->point_blamed} {$config->point_name} {$config->point_name}
                                                      @@ -122,15 +122,15 @@ - - + + - - + + diff --git a/modules/point/tpl/member_list.html b/modules/point/tpl/member_list.html index 310f392e4..4e9522889 100644 --- a/modules/point/tpl/member_list.html +++ b/modules/point/tpl/member_list.html @@ -28,8 +28,8 @@ diff --git a/modules/point/tpl/module_config.html b/modules/point/tpl/module_config.html index 464b03c7e..544e00f81 100644 --- a/modules/point/tpl/module_config.html +++ b/modules/point/tpl/module_config.html @@ -20,17 +20,17 @@ - + - - - - - - - + + + + + + + diff --git a/modules/point/tpl/point_module_config.html b/modules/point/tpl/point_module_config.html index 287818837..1ee8f7b0c 100644 --- a/modules/point/tpl/point_module_config.html +++ b/modules/point/tpl/point_module_config.html @@ -9,31 +9,31 @@
                                                      {$lang->group}
                                                      {$lang->level}
                                                      {$lang->group}{$lang->level}
                                                      {$val->title}{$val->title}
                                                      - - + +
                                                      {$val->browser_title} ({$val->mid})
                                                      {$config->point_name} {$config->point_name} {$config->point_name} {$config->point_name} {$config->point_name} {$config->point_name} {$config->point_name} {$config->point_name} {$config->point_name} {$config->point_name} {$config->point_name} {$config->point_name} {$config->point_name} {$config->point_name}
                                                      - + - + - + - + - + - + - +
                                                      {$lang->point_insert_document} {$module_config['point_name']} {$module_config['point_name']}
                                                      {$lang->point_insert_comment} {$module_config['point_name']} {$module_config['point_name']}
                                                      {$lang->point_upload_file} {$module_config['point_name']} {$module_config['point_name']}
                                                      {$lang->point_download_file} {$module_config['point_name']} {$module_config['point_name']}
                                                      {$lang->point_read_document} {$module_config['point_name']} {$module_config['point_name']}
                                                      {$lang->point_voted} {$module_config['point_name']} {$module_config['point_name']}
                                                      {$lang->point_blamed} {$module_config['point_name']} {$module_config['point_name']}
                                                      diff --git a/modules/poll/tpl/result.html b/modules/poll/tpl/result.html index 89967aed5..3684b5f8f 100644 --- a/modules/poll/tpl/result.html +++ b/modules/poll/tpl/result.html @@ -1,26 +1,22 @@ -
                                                      -

                                                      {$lang->poll_stop_date} : {zdate($poll->stop_date, "Y-m-d H:i")} {$lang->poll_join_count} : {number_format($poll->poll_count)}

                                                      -
                                                      -
                                                      - -
                                                      -
                                                      {$val->title} ({$val->poll_count})
                                                      - - {@$per = (int)(( $item->poll_count / $val->poll_count)*100) } +

                                                      {$lang->poll_stop_date} : {zdate($poll->stop_date, "Y-m-d H:i")} {$lang->poll_join_count} : {number_format($poll->poll_count)}

                                                      + +
                                                      +
                                                      {$val->title} ({$val->poll_count})
                                                      + + {@$per = (int)(( $item->poll_count / $val->poll_count)*100) } -
                                                      - {$item_srl+1}. {$item->title} : {$item->poll_count} ({$per}%) -
                                                      -
                                                      - -
                                                      bar
                                                      - -
                                                      bar
                                                      - -
                                                      - +
                                                      + {$item_srl+1}. {$item->title} : {$item->poll_count} ({$per}%) +
                                                      +
                                                      + +
                                                      bar
                                                      + +
                                                      bar
                                                      + +
                                                      + -
                                                      -
                                                      + diff --git a/modules/rss/tpl/rss_module_config.html b/modules/rss/tpl/rss_module_config.html index df59a2b27..2013952d1 100644 --- a/modules/rss/tpl/rss_module_config.html +++ b/modules/rss/tpl/rss_module_config.html @@ -9,7 +9,7 @@ - - - - diff --git a/modules/trackback/tpl/send_trackback_form.html b/modules/trackback/tpl/send_trackback_form.html index ecf3ecb6b..1aabcec25 100644 --- a/modules/trackback/tpl/send_trackback_form.html +++ b/modules/trackback/tpl/send_trackback_form.html @@ -18,7 +18,7 @@
                                                      {$lang->open_rss} +
                                                      {$lang->open_feed_to_total} +
                                                      {$lang->description} - + +

                                                      {$lang->about_feed_description}

                                                      {$lang->feed_copyright} - + +

                                                      {$lang->about_feed_copyright}
                                                      {$lang->about_part_feed_copyright}

                                                      - + - +
                                                      enable_trackback == "Y")-->checked="checked" />enable_trackback == "Y")-->checked="checked" />
                                                      diff --git a/modules/widget/tpl/js/widget.js b/modules/widget/tpl/js/widget.js index 0e1624c16..b9ba21b6c 100644 --- a/modules/widget/tpl/js/widget.js +++ b/modules/widget/tpl/js/widget.js @@ -168,24 +168,8 @@ function getWidgetBoxCode(childObj, widget) { } var body = getWidgetContent(o); - return '
                                                      '+body+'
                                                      '; + return '
                                                      '+body+'
                                                      '; -/* - var cobj = childObj.firstChild; - while(cobj) { - if(cobj.className == "widgetBorder" || cobj.className == "widgetBoxBorder") { - var c2obj = cobj.firstChild; - while(c2obj) { - if(c2obj.className == "nullWidget") { - var body = getWidgetContent(c2obj); - return '
                                                      '+body+'
                                                      '; - } - c2obj = c2obj.nextSibling; - } - } - cobj = cobj.nextSibling; - } -*/ } @@ -316,7 +300,6 @@ function doAddWidgetBox() { '
                                                      '+ '
                                                      '+ '
                                                      '+ - '
                                                      '+ '
                                                      '+ ''; xInnerHtml(zonePageObj, xInnerHtml(zonePageObj)+tpl); diff --git a/modules/widget/tpl/widget_style_generate_code_in_page.html b/modules/widget/tpl/widget_style_generate_code_in_page.html index 0378d93fe..45b727348 100644 --- a/modules/widget/tpl/widget_style_generate_code_in_page.html +++ b/modules/widget/tpl/widget_style_generate_code_in_page.html @@ -29,8 +29,6 @@ {$widgetStyle->title} -
                                                      -

                                                      {$widgetstyle_info->title} ver {$widgetstyle_info->version}

                                                      diff --git a/modules/widget/widget.controller.php b/modules/widget/widget.controller.php index 5cfa5b479..e2cade4af 100644 --- a/modules/widget/widget.controller.php +++ b/modules/widget/widget.controller.php @@ -489,7 +489,7 @@ $inner_style); $widget_content_body = $body; - $widget_content_footer = sprintf('
                                                      '. + $widget_content_footer = sprintf(''. ''. ''. '',base64_encode($body)); @@ -538,7 +538,7 @@ $widget_padding_top, $widget_padding_right, $widget_padding_bottom, $widget_padding_left, $widget, implode(' ',$attribute)); - $widget_content_body = sprintf('
                                                      %s
                                                      ',$inner_style, $widget_content); + $widget_content_body = sprintf('
                                                      %s
                                                      ',$inner_style, $widget_content); $widget_content_footer = ''; From 6b10611d1b5efd2bce1cf94fbc832b4d4dd95f88 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Tue, 27 Sep 2011 14:42:01 +0000 Subject: [PATCH 0918/1372] Admin HTML Markup Clean. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9378 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/tpl/css/admin.css | 8 +- modules/admin/tpl/css/admin.min.css | 8 +- modules/document/lang/lang.xml | 4 + modules/document/tpl/category_info.html | 115 +++++++++--------- modules/document/tpl/category_list.html | 2 +- modules/document/tpl/css/document.css | 20 --- modules/document/tpl/header.html | 15 +-- modules/document/tpl/preview_page.html | 2 +- modules/document/tpl/print_page.html | 21 ++-- modules/document/tpl/saved_list_popup.html | 9 +- modules/page/tpl/content.html | 14 +-- modules/page/tpl/mcontent.html | 15 ++- modules/widget/tpl/css/widget.css | 110 ++++++++--------- modules/widget/tpl/js/widget.js | 12 +- modules/widget/tpl/widget_layer.html | 65 +++++----- .../widget_style_generate_code_in_page.html | 4 +- 16 files changed, 194 insertions(+), 230 deletions(-) delete mode 100644 modules/document/tpl/css/document.css diff --git a/modules/admin/tpl/css/admin.css b/modules/admin/tpl/css/admin.css index 68c38d1fc..9399acb18 100644 --- a/modules/admin/tpl/css/admin.css +++ b/modules/admin/tpl/css/admin.css @@ -230,9 +230,13 @@ body>.popup{margin:1em} html.modalContainer, body.modalContainer{_height:100%;_width:100%} /* IE6 only */ /* Layer */ -.x .layer{position:absolute;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:2;zoom:1;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5pxbox-shadow:0 0 6px #666;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} +.x .layer, +.x.layer{position:absolute;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:2;zoom:1;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5pxbox-shadow:0 0 6px #666;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} .x .layer h2{font-size:14px} -.x .layer ul, .layer ol, .layer .lined, .layer .table{margin-bottom:1em} +.x .layer ul, +.x .layer ol, +.x .layer .lined, +.x .layer .table{margin-bottom:1em} .x .layerClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px} .x .layerBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden} /* H2 Anchor */ diff --git a/modules/admin/tpl/css/admin.min.css b/modules/admin/tpl/css/admin.min.css index 68c38d1fc..9399acb18 100644 --- a/modules/admin/tpl/css/admin.min.css +++ b/modules/admin/tpl/css/admin.min.css @@ -230,9 +230,13 @@ body>.popup{margin:1em} html.modalContainer, body.modalContainer{_height:100%;_width:100%} /* IE6 only */ /* Layer */ -.x .layer{position:absolute;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:2;zoom:1;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5pxbox-shadow:0 0 6px #666;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} +.x .layer, +.x.layer{position:absolute;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:2;zoom:1;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5pxbox-shadow:0 0 6px #666;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} .x .layer h2{font-size:14px} -.x .layer ul, .layer ol, .layer .lined, .layer .table{margin-bottom:1em} +.x .layer ul, +.x .layer ol, +.x .layer .lined, +.x .layer .table{margin-bottom:1em} .x .layerClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px} .x .layerBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden} /* H2 Anchor */ diff --git a/modules/document/lang/lang.xml b/modules/document/lang/lang.xml index 31d5eaaab..e17f77fcf 100644 --- a/modules/document/lang/lang.xml +++ b/modules/document/lang/lang.xml @@ -850,4 +850,8 @@ + + + + \ No newline at end of file diff --git a/modules/document/tpl/category_info.html b/modules/document/tpl/category_info.html index ce7e49275..26d094672 100644 --- a/modules/document/tpl/category_info.html +++ b/modules/document/tpl/category_info.html @@ -1,66 +1,61 @@ - -
                                                      - -

                                                      {$lang->category}

                                                      - - -
                                                      -
                                                      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                      {$lang->parent_category_title}{$category_info->parent_category_title}
                                                      {$lang->category_title} - - {$lang->cmd_find_langcode} -
                                                      {$lang->category_color} - -

                                                      {$lang->about_category_color}

                                                      -
                                                      {$lang->category_description} - - {$lang->cmd_find_langcode} -

                                                      {$lang->about_category_description}

                                                      -
                                                      {$lang->expand} - expand=="Y")-->checked="checked" class="checkbox" /> -

                                                      {$lang->about_expand}

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

                                                      {$lang->about_category_group_srls}

                                                      -
                                                      -
                                                      -
                                                      - -
                                                      +
                                                      + +

                                                      {$lang->category}

                                                      +
                                                      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                      {$lang->parent_category_title}{$category_info->parent_category_title}
                                                      {$lang->category_title} + + {$lang->cmd_find_langcode} +
                                                      {$lang->category_color} + +

                                                      {$lang->about_category_color}

                                                      +
                                                      {$lang->category_description} + + {$lang->cmd_find_langcode} +

                                                      {$lang->about_category_description}

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

                                                      {$lang->about_expand}

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

                                                      {$lang->about_category_group_srls}

                                                      +
                                                      +
                                                      +
                                                      +
                                                      -

                                                      {$lang->widgetstyle}

                                                      +

                                                      {$lang->widgetstyle}

                                                      @@ -31,7 +31,7 @@ {$widgetStyle->title} -

                                                      {$widgetstyle_info->title} ver {$widgetstyle_info->version}

                                                      +

                                                      {$widgetstyle_info->title} ver {$widgetstyle_info->version}

                                                      • {$lang->description}

                                                        From c22801ac7903749e5ea79f9081614c6c5db97e48 Mon Sep 17 00:00:00 2001 From: ucorina Date: Tue, 27 Sep 2011 17:32:53 +0000 Subject: [PATCH 0919/1372] Removed cache from getDefaultMid to fix temporarily the homepage bug. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9379 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/module/module.model.php | 116 +++++++++++++++----------------- 1 file changed, 54 insertions(+), 62 deletions(-) diff --git a/modules/module/module.model.php b/modules/module/module.model.php index 963f797ae..1cb446c57 100644 --- a/modules/module/module.model.php +++ b/modules/module/module.model.php @@ -68,70 +68,62 @@ * @brief Get the defaul mid according to the domain **/ function getDefaultMid() { - $default_url = preg_replace('/\/$/','',Context::getDefaultUrl()); - $request_url = preg_replace('/\/$/','',Context::getRequestUri()); - $vid = Context::get('vid'); - $mid = Context::get('mid'); - $oCacheHandler = &CacheHandler::getInstance('object'); - if($oCacheHandler->isSupport()){ - $cache_key = 'object_default_mid:'.$vid.'_'.$mid; - $output = $oCacheHandler->get($cache_key); + $default_url = preg_replace('/\/$/','',Context::getDefaultUrl()); + $request_url = preg_replace('/\/$/','',Context::getRequestUri()); + $vid = Context::get('vid'); + $mid = Context::get('mid'); + + // Check a virtual site if the default URL is already set and is is defferent from a requested URL + if($default_url && $default_url != $request_url) { + $url_info = parse_url($request_url); + $hostname = $url_info['host']; + $path = preg_replace('/\/$/','',$url_info['path']); + $sites_args->domain = sprintf('%s%s%s', $hostname, $url_info['port']&&$url_info['port']!=80?':'.$url_info['port']:'',$path); + $output = executeQuery('module.getSiteInfoByDomain', $sites_args); + } + if(!$output || !$output->data) + { + if(!$vid) $vid = $mid; + if($vid) { + $vid_args->domain = $vid; + $output = executeQuery('module.getSiteInfoByDomain', $vid_args); + if($output->toBool() && $output->data) { + Context::set('vid', $output->data->domain, true); + if($mid==$output->data->domain) Context::set('mid',$output->data->mid,true); } - if(!$output){ - // Check a virtual site if the default URL is already set and is is defferent from a requested URL - if($default_url && $default_url != $request_url) { - $url_info = parse_url($request_url); - $hostname = $url_info['host']; - $path = preg_replace('/\/$/','',$url_info['path']); - $sites_args->domain = sprintf('%s%s%s', $hostname, $url_info['port']&&$url_info['port']!=80?':'.$url_info['port']:'',$path); - $output = executeQuery('module.getSiteInfoByDomain', $sites_args); - if($oCacheHandler->isSupport() && $output->data) $oCacheHandler->put($cache_key,$output); - } - if(!$output || !$output->data) - { - if(!$vid) $vid = $mid; - if($vid) { - $vid_args->domain = $vid; - $output = executeQuery('module.getSiteInfoByDomain', $vid_args); - if($output->toBool() && $output->data) { - Context::set('vid', $output->data->domain, true); - if($mid==$output->data->domain) Context::set('mid',$output->data->mid,true); - } - if($oCacheHandler->isSupport() && $output->data) $oCacheHandler->put($cache_key,$output); - } - } - // If it is not a virtual site, get a default site information - if(!$output->data) { - $args->site_srl = 0; - $output = executeQuery('module.getSiteInfo', $args); - // Update the related informaion if there is no default site info - if(!$output->data) { - // Create a table if sites table doesn't exist - $oDB = &DB::getInstance(); - if(!$oDB->isTableExists('sites')) $oDB->createTableByXmlFile(_XE_PATH_.'modules/module/schemas/sites.xml'); - if(!$oDB->isTableExists('sites')) return; - // Get mid, language - $mid_output = $oDB->executeQuery('module.getDefaultMidInfo', $args); - $db_info = Context::getDBInfo(); - $domain = Context::getDefaultUrl(); - $url_info = parse_url($domain); - $domain = $url_info['host'].( (!empty($url_info['port'])&&$url_info['port']!=80)?':'.$url_info['port']:'').$url_info['path']; - $site_args->site_srl = 0; - $site_args->index_module_srl = $mid_output->data->module_srl; - $site_args->domain = $domain; - $site_args->default_language = $db_info->lang_type; - - if($output->data && !$output->data->index_module_srl) { - $output = executeQuery('module.updateSite', $site_args); - } else { - $output = executeQuery('module.insertSite', $site_args); - if(!$output->toBool()) return $output; - } - $output = executeQuery('module.getSiteInfo', $args); - } - if($oCacheHandler->isSupport()) $oCacheHandler->put($cache_key,$output); - } } + } + // If it is not a virtual site, get a default site information + if(!$output->data) { + $args->site_srl = 0; + $output = executeQuery('module.getSiteInfo', $args); + // Update the related informaion if there is no default site info + if(!$output->data) { + // Create a table if sites table doesn't exist + $oDB = &DB::getInstance(); + if(!$oDB->isTableExists('sites')) $oDB->createTableByXmlFile(_XE_PATH_.'modules/module/schemas/sites.xml'); + if(!$oDB->isTableExists('sites')) return; + // Get mid, language + $mid_output = $oDB->executeQuery('module.getDefaultMidInfo', $args); + $db_info = Context::getDBInfo(); + $domain = Context::getDefaultUrl(); + $url_info = parse_url($domain); + $domain = $url_info['host'].( (!empty($url_info['port'])&&$url_info['port']!=80)?':'.$url_info['port']:'').$url_info['path']; + $site_args->site_srl = 0; + $site_args->index_module_srl = $mid_output->data->module_srl; + $site_args->domain = $domain; + $site_args->default_language = $db_info->lang_type; + + if($output->data && !$output->data->index_module_srl) { + $output = executeQuery('module.updateSite', $site_args); + } else { + $output = executeQuery('module.insertSite', $site_args); + if(!$output->toBool()) return $output; + } + $output = executeQuery('module.getSiteInfo', $args); + } + } + $module_info = $output->data; if(!$module_info->module_srl) return $module_info; if(is_array($module_info) && $module_info->data[0]) $module_info = $module_info[0]; From d80731ca4e62104a58b4ee0e0c379042fd8fa1da Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Wed, 28 Sep 2011 01:18:30 +0000 Subject: [PATCH 0920/1372] CSS minify & clean. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9380 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/css/xe.css | 1 + common/css/xe.min.css | 59 +-- modules/admin/tpl/css/admin.min.css | 652 +--------------------------- 3 files changed, 3 insertions(+), 709 deletions(-) diff --git a/common/css/xe.css b/common/css/xe.css index 108293f54..a20606a17 100644 --- a/common/css/xe.css +++ b/common/css/xe.css @@ -1,5 +1,6 @@ @charset "utf-8"; /* NHN (developers@xpressengine.com) */ +body,table,input,textarea,select,button{font-family:Tahoma,Geneva,sans-serif;font-size:12px} /* Button */ .btn{position:relative;display:inline-block;vertical-align:top} .btn *{display:inline-block;padding:0 8px;font-size:12px;height:24px;line-height:22px;margin:0;font-weight:bold !important;color:#fff;text-decoration:none !important;border:1px solid;cursor:pointer;overflow:visible;border-radius:3px;box-shadow:inset 0 0 1px #fff;background-color:#666;text-shadow:0 -1px 0 #333;zoom:1} diff --git a/common/css/xe.min.css b/common/css/xe.min.css index 108293f54..8808faa98 100644 --- a/common/css/xe.min.css +++ b/common/css/xe.min.css @@ -1,58 +1 @@ -@charset "utf-8"; -/* NHN (developers@xpressengine.com) */ -/* Button */ -.btn{position:relative;display:inline-block;vertical-align:top} -.btn *{display:inline-block;padding:0 8px;font-size:12px;height:24px;line-height:22px;margin:0;font-weight:bold !important;color:#fff;text-decoration:none !important;border:1px solid;cursor:pointer;overflow:visible;border-radius:3px;box-shadow:inset 0 0 1px #fff;background-color:#666;text-shadow:0 -1px 0 #333;zoom:1} -.btn *[type=submit][disabled=disabled], -.btn *[type=button][disabled=disabled]{opacity:.5;*filter:alpha(opacity=50)} -.btn a, -.btn button[type=button]{border-color:#ccc;color:#333 !important;background:#eee -webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#ddd));background:#eee -moz-linear-gradient(top,#fff,#ddd);background-color:#eee;text-shadow:1px 1px 0 #fff;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#ffffff, endColorStr=#dddddd)} -.btn input, -.btn button[type=submit]{border-color:#666;background:#333 -webkit-gradient(linear,0% 0%,0% 100%,from(#777),to(#777),color-stop(0.5,#333),color-stop(0.5,#000));background:#333 -moz-linear-gradient(top,#777,#000);background-color:#333;color:#ffc !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#777777, endColorStr=#333333)} -.btn a{height:22px} -.btn.medium *{padding:0 12px;font-size:16px;height:30px;line-height:28px} -.btn.medium a{height:28px} -.btn.large *{padding:0 18px;font-size:22px;height:36px;line-height:34px} -.btn.large a{height:34px} -/* Button - Regucy */ -.button{position:relative;display:inline-block;vertical-align:top} -.button *{display:inline-block;padding:0 8px;font-size:12px;height:24px;line-height:22px;margin:0;font-weight:bold !important;color:#fff;text-decoration:none !important;border:1px solid;cursor:pointer;overflow:visible;border-radius:3px;box-shadow:inset 0 0 1px #fff;background-color:#666;text-shadow:0 -1px 0 #333;zoom:1} -.button *[type=submit][disabled=disabled], -.button *[type=button][disabled=disabled]{opacity:.5;*filter:alpha(opacity=50)} -.button span, -.button button[type=button]{border-color:#ccc;color:#333 !important;background:#eee -webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#ddd));background:#eee -moz-linear-gradient(top,#fff,#ddd);background-color:#eee;text-shadow:1px 1px 0 #fff;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#ffffff, endColorStr=#dddddd)} -.button input, -.button button[type=submit]{border-color:#666;background:#333 -webkit-gradient(linear,0% 0%,0% 100%,from(#777),to(#777),color-stop(0.5,#333),color-stop(0.5,#000));background:#333 -moz-linear-gradient(top,#777,#000);background-color:#333;color:#ffc !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#777777, endColorStr=#333333)} -.button span{height:22px} -/* Button Area */ -.btnArea{margin:1em 0;text-align:right;zoom:1} -.btnArea:after{content:"";display:block;clear:both} -.btnArea .etc{float:left} -/* Text Button */ -input.text, -button.text{border:0;overflow:visible;padding:0;margin:0 4px 0 0;color:#33a !important;background:none;text-decoration:underline} -/* Popup Menu Area */ -#popup_menu_area{position:absolute;background:#fff;border:1px solid #e9e9e9;border-radius:5px;padding:10px;line-height:1.3;box-shadow:0 0 6px #666;font-size:12px;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} -#popup_menu_area ul{list-style:none;margin:0;padding:0} -#popup_menu_area li{margin:0;padding:0} -#popup_menu_area a{text-decoration:none;color:#333} -#popup_menu_area a:hover, -#popup_menu_area a:avtive, -#popup_menu_area a:focus{text-decoration:underline} -/* Message */ -.message{border:1px solid #ddd;background:#f8f8f8;margin:1em 0;padding:0 1em;border-radius:5px;line-height:1.4;font-size:12px} -body>.message{margin:1em} -.message p{margin:1em 0 !important} -.message em{font-style:normal;color:#e00} -.message.info, -.message.error, -.message.update{padding-left:55px} -.message.info{border-color:#E0E8EC;background:#EDF9FF url(../../common/img/msg.Info.png) no-repeat 1em .5em} -.message.error{border-color:#EFDCDC;background:#FFECEC url(../../common/img/msg.error.png) no-repeat 1em .5em} -.message.update{border-color:#EAE9DC;background:#FFFDEF url(../../common/img/msg.update.png) no-repeat 1em .5em} -/* Waiting for server response */ -.wfsr{display:none;position:absolute;position:fixed;left:0;top:0;z-index:100; border:1px solid #EAE9DC;background:#FFFDEF url(../../common/img/msg.loading.gif) no-repeat 1em .5em;margin:1em;padding:1em 1em 1em 55px;border-radius:5px;line-height:1.4;font-size:12px;font-weight:bold} -/* Waiting for server response - Modal Window */ -.wfsr_fog{position:absolute;top:0;left:0;width:100%;_height:100%;min-height:100%;z-index:100} -.wfsr_fog .bg{position:absolute;background:#000;_background:none;width:100%;height:100%;opacity:.5;z-index:2;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1} -.wfsr_fog .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1} +@charset "utf-8"; /* NHN (developers@xpressengine.com) */ body,table,input,textarea,select,button{font-family:Tahoma,Geneva,sans-serif;font-size:12px} /* Button */ .btn{position:relative;display:inline-block;vertical-align:top} .btn *{display:inline-block;padding:0 8px;font-size:12px;height:24px;line-height:22px;margin:0;font-weight:bold !important;color:#fff;text-decoration:none !important;border:1px solid;cursor:pointer;overflow:visible;border-radius:3px;box-shadow:inset 0 0 1px #fff;background-color:#666;text-shadow:0 -1px 0 #333;zoom:1} .btn *[type=submit][disabled=disabled], .btn *[type=button][disabled=disabled]{opacity:.5;*filter:alpha(opacity=50)} .btn a, .btn button[type=button]{border-color:#ccc;color:#333 !important;background:#eee -webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#ddd));background:#eee -moz-linear-gradient(top,#fff,#ddd);background-color:#eee;text-shadow:1px 1px 0 #fff;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#ffffff, endColorStr=#dddddd)} .btn input, .btn button[type=submit]{border-color:#666;background:#333 -webkit-gradient(linear,0% 0%,0% 100%,from(#777),to(#777),color-stop(0.5,#333),color-stop(0.5,#000));background:#333 -moz-linear-gradient(top,#777,#000);background-color:#333;color:#ffc !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#777777, endColorStr=#333333)} .btn a{height:22px} .btn.medium *{padding:0 12px;font-size:16px;height:30px;line-height:28px} .btn.medium a{height:28px} .btn.large *{padding:0 18px;font-size:22px;height:36px;line-height:34px} .btn.large a{height:34px} /* Button - Regucy */ .button{position:relative;display:inline-block;vertical-align:top} .button *{display:inline-block;padding:0 8px;font-size:12px;height:24px;line-height:22px;margin:0;font-weight:bold !important;color:#fff;text-decoration:none !important;border:1px solid;cursor:pointer;overflow:visible;border-radius:3px;box-shadow:inset 0 0 1px #fff;background-color:#666;text-shadow:0 -1px 0 #333;zoom:1} .button *[type=submit][disabled=disabled], .button *[type=button][disabled=disabled]{opacity:.5;*filter:alpha(opacity=50)} .button span, .button button[type=button]{border-color:#ccc;color:#333 !important;background:#eee -webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#ddd));background:#eee -moz-linear-gradient(top,#fff,#ddd);background-color:#eee;text-shadow:1px 1px 0 #fff;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#ffffff, endColorStr=#dddddd)} .button input, .button button[type=submit]{border-color:#666;background:#333 -webkit-gradient(linear,0% 0%,0% 100%,from(#777),to(#777),color-stop(0.5,#333),color-stop(0.5,#000));background:#333 -moz-linear-gradient(top,#777,#000);background-color:#333;color:#ffc !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#777777, endColorStr=#333333)} .button span{height:22px} /* Button Area */ .btnArea{margin:1em 0;text-align:right;zoom:1} .btnArea:after{content:"";display:block;clear:both} .btnArea .etc{float:left} /* Text Button */ input.text, button.text{border:0;overflow:visible;padding:0;margin:0 4px 0 0;color:#33a !important;background:none;text-decoration:underline} /* Popup Menu Area */ #popup_menu_area{position:absolute;background:#fff;border:1px solid #e9e9e9;border-radius:5px;padding:10px;line-height:1.3;box-shadow:0 0 6px #666;font-size:12px;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} #popup_menu_area ul{list-style:none;margin:0;padding:0} #popup_menu_area li{margin:0;padding:0} #popup_menu_area a{text-decoration:none;color:#333} #popup_menu_area a:hover, #popup_menu_area a:avtive, #popup_menu_area a:focus{text-decoration:underline} /* Message */ .message{border:1px solid #ddd;background:#f8f8f8;margin:1em 0;padding:0 1em;border-radius:5px;line-height:1.4;font-size:12px} body>.message{margin:1em} .message p{margin:1em 0 !important} .message em{font-style:normal;color:#e00} .message.info, .message.error, .message.update{padding-left:55px} .message.info{border-color:#E0E8EC;background:#EDF9FF url(../../common/img/msg.Info.png) no-repeat 1em .5em} .message.error{border-color:#EFDCDC;background:#FFECEC url(../../common/img/msg.error.png) no-repeat 1em .5em} .message.update{border-color:#EAE9DC;background:#FFFDEF url(../../common/img/msg.update.png) no-repeat 1em .5em} /* Waiting for server response */ .wfsr{display:none;position:absolute;position:fixed;left:0;top:0;z-index:100; border:1px solid #EAE9DC;background:#FFFDEF url(../../common/img/msg.loading.gif) no-repeat 1em .5em;margin:1em;padding:1em 1em 1em 55px;border-radius:5px;line-height:1.4;font-size:12px;font-weight:bold} /* Waiting for server response - Modal Window */ .wfsr_fog{position:absolute;top:0;left:0;width:100%;_height:100%;min-height:100%;z-index:100} .wfsr_fog .bg{position:absolute;background:#000;_background:none;width:100%;height:100%;opacity:.5;z-index:2;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1} .wfsr_fog .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1} \ No newline at end of file diff --git a/modules/admin/tpl/css/admin.min.css b/modules/admin/tpl/css/admin.min.css index 9399acb18..b0d381653 100644 --- a/modules/admin/tpl/css/admin.min.css +++ b/modules/admin/tpl/css/admin.min.css @@ -1,651 +1 @@ -@charset "utf-8"; -/* NHN (developers@xpressengine.com) */ -/* Element Reset */ -body{margin:0} -header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{display:block} -body>.popup{margin:1em} -.x, -.x table, -.x input, -.x textarea, -.x select, -.x button{font-family:Tahoma,Geneva,sans-serif;font-size:12px;color:#333} -.x button, -.x input[type=submit], -.x input[type=reset], -.x input[type=button]{cursor:pointer;overflow:visible} -.x img{border:0} -.x p{line-height:1.5} -/* Section & Heading */ -.x .section{margin:1em 0;padding:0;border:0} -.x .h1, -.x .h2, -.x .h3, -.x .h4{position:relative;border-bottom-style:solid;border-bottom-color:#ccc;zoom:1} -.x .h1{border-bottom-width:4px;font-size:24px} -.x .h2{border-bottom-width:3px;font-size:20px} -.x .h3{border-bottom-width:2px;font-size:16px} -.x .h4{border-bottom-width:1px;font-size:12px} -/* Portlet */ -.x .portlet{position:relative;border:1px solid #e9e9e9;margin:1em 0;padding:0;background:#fff;zoom:1;overflow:hidden;border-radius:5px} -.x .portlet h2, -.x .portlet h3{margin:0;padding:.5em 1em;font-size:14px;border:1px solid #fff;border-bottom:1px solid #e9e9e9;background:#f7f7f7;border-radius:5px 5px 0 0} -.x .portlet p{margin:1em 1.2em} -.x .portlet li{position:relative;padding-right:8em} -.x .portlet .lined{margin:1px;padding:0;list-style:none} -.x .portlet .lined li{padding:.5em 8em .5em 1em;border-top:1px solid #eee;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis} -.x .portlet .lined li:first-child{border:0} -.x .portlet .side{position:absolute;top:0;_top:1px;right:0;color:#666;background:#fff;padding:0 1em} -.x .portlet .lined .side{padding:.5em 1em} -.x .portlet .more{position:absolute;top:.5em;right:1em;text-decoration:none !important;color:#666} -.x .portlet .more span{color:#999} -.x .portlet .action{text-align:right;top:0;right:0;padding:.5em 1em .5em 3em;background:#fff;background:-webkit-gradient(linear, 0% 0%, 100% 0%, from(rgba(255,255,255,0)), to(rgba(255,255,255,1)), color-stop(15%, #fff));background:-moz-linear-gradient(left, rgba(255,255,255,0) 0, rgba(255,255,255,1) 15%)} -.x .portlet .action a, -.x .portlet .action button{margin-left:1em} -.x .portlet .btnArea{border-top:1px solid #ddd;margin:0;padding:.5em 1em;margin:0 1px 1px 1px;background:#f7f7f7;border-radius:0 0 5px 5px} -/* Table */ -.x .table{margin:1em 0} -.x .table table{width:100%;border:0;border-collapse:collapse;border-top:2px solid #ccc} -.x .table caption{font-weight:bold;text-align:left;line-height:22px;padding:5px 0} -.x .table caption:after{content:"";display:block;clear:both} -.x .table caption a{font-weight:normal} -.x .table caption em{float:right;margin-left:1em} -.x .table caption strong{color:#e00} -.x .table caption .side{float:right;font-weight:normal;margin-left:1em} -.x .table th, -.x .table td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd;white-space:nowrap} -.x .table th{background:#f8f8f8} -.x .table thead th{border-bottom:1px solid #999} -.x .table tfoot td{font-weight:bold;background:#f8f8f8} -.x .table.even tbody tr:nth-of-type(even) td{background-color:#fafafa} -.x .table td>input[type=text]{margin:-1px 0 -3px 0 !important;vertical-align:middle} -.x .table img{vertical-align:middle} -.x .table em{font-style:normal;font-weight:normal;color:#e00} -.x .table .title, -.x .table .text{white-space:normal} -/* Form */ -.x .form{margin:1em 0;padding:0} -.x .form fieldset{margin:0 0 2em 0;padding:0;border:0} -.x .form em{font-style:normal;color:#e00} -.x .form label{margin-right:1em;line-height:1;vertical-align:middle} -.x .form input[type=checkbox]+label, -.x .form input[type=radio]+label, -.x .form input[type=file]{cursor:pointer} -.x .form ul{position:relative;margin:0;padding:0;list-style:none;border-top:2px solid #ccc;border-bottom:1px solid #ccc;zoom:1} -.x .form li{list-style:none;border:1px solid #ddd;border-left:0;border-right:0;margin:-1px 0;padding:8px 0;vertical-align:top;zoom:1} -.x .form li:first-child{border-top:0} -.x .form li>label:first-child{display:block;font-weight:bold} -.x .form li label em{font-weight:normal} -.x .form label.overlap{position:absolute;color:#aaa} -.x .form input[type=text], -.x .form input[type=password], -.x .form input[type=file], -.x .form textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:transparent} -.x .form input[type=text], -.x .form input[type=password], -.x .form input[type=file]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px} -.x .form input[type=text].loading, -.x .form input.loading[type=password]{padding-right:24px;width:260px;background:transparent url(../img/preLoader16.gif) no-repeat 265px center} -.x .form input[type=checkbox], -.x .form input[type=radio]{margin:0;padding:0;width:13px;height:13px;vertical-align:middle} -.x .form input[type=text][disabled=disabled], -.x .form input[type=password][disabled=disabled], -.x .form input[type=checkbox][disabled=disabled], -.x .form input[type=radio][disabled=disabled], -.x .form input[type=file][disabled=disabled], -.x .form textarea[disabled=disabled], -.x .form select[disabled=disabled]{background:#ddd !important;text-shadow:1px 1px 0 #fff} -.x .form textarea{padding:3px 4px;vertical-align:top} -.x .form span.desc, -.x .form em.desc{line-height:22px;vertical-align:middle;margin:0 10px} -.x .form p.desc{margin:.25em 0;line-height:1.4} -.x .form .q{font-weight:bold;margin:0 0 5px 0} -.x .form .a{margin:0 0 5px 0} -.x .form .tgForm{margin-right:1em} -.x .form .h1 + ul, -.x .form .h2 + ul, -.x .form .h3 + ul, -.x .form .h4 + ul{border-top:0} -/* Global Navigation Bar */ -.x .gnb{position:relative;clear:both;border:1px solid #c1c1c1;border-left:0;border-right:0;background-color:#efefef;background:#efefef -webkit-gradient(linear, 0% 0%, 0% 100%, from(#efefef), to(#dcdcdc));background:#efefef -moz-linear-gradient(top, #efefef, #dcdcdc);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#efefef, endColorStr=#dcdcdc);zoom:1} -.x .gnb ul{margin:0;padding:0 0 0 2em;list-style:none;border:1px solid #fff;border-left:0;border-right:0;zoom:1} -.x .gnb ul ul{position:absolute;top:30px;left:0;border:1px solid #ccc;border-top:0;padding:1px 0 0 0;background:#fff} -.x .gnb ul:after{content:"";display:block;clear:both} -.x .gnb li{position:relative;float:left;border:1px solid #fff;border-top:0;border-bottom:0;margin:0 -1px 0 0} -.x .gnb li li{float:none;clear:both;overflow:hidden;border:0;border-top:1px dotted #ccc;margin:0;padding:2px} -.x .gnb li li:first-child{border:0} -.x .gnb li a{float:left;font-weight:bold;color:#333;font-size:12px;padding:8px 18px;white-space:nowrap;text-decoration:none;text-shadow:0 1px 0 #fff;zoom:1} -.x .gnb li a:hover, -.x .gnb li a:active, -.x .gnb li a:focus, -.x .gnb li.active a{background:#f4f4f4;border:1px solid #ccc;border-bottom:0;padding:7px 17px 8px 17px} -.x .gnb li.activeOn a{background:#fff;border:1px solid #ccc;border-bottom:0;padding:7px 17px 8px 17px} -.x .gnb li.active li a{display:block;float:none;color:#555;background:#fff;padding:5px 15px !important;font-weight:normal !important;border:0 !important} -.x .gnb li.active li a:hover, -.x .gnb li.active li a:active, -.x .gnb li.active li a:focus{border:0;background:#eee} -.x .gnb .setting{position:absolute;top:8px;right:2em;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;background:url(../img/iconSetting.gif) no-repeat center} -.x .gnb.jx ul{display:block;position:static;padding:0} -.x .gnb.jx li{float:none;clear:both;border-top:1px solid #ccc} -.x .gnb.jx ul ul{border:0} -.x .gnb.jx li li{border:0} -.x .gnb.jx li a{float:none;display:block} -.x .gnb.jx li a:hover, -.x .gnb.jx li a:active, -.x .gnb.jx li a:focus{background:none} -.x .gnb.jx li.activeOn>a{background:#ddd} -@media only all and (max-width:860px){ -.x .gnb ul{padding-left:1em} -.x .gnb .setting{right:1em} -} -@media only all and (max-width:640px){ -.x .gnb ul{display:block;position:static;padding:0} -.x .gnb li{float:none;clear:both;border-top:1px solid #ccc} -.x .gnb ul ul{border:0;position:static} -.x .gnb li li{border:0} -.x .gnb li a{float:none;display:block} -.x .gnb li a:hover, -.x .gnb li a:active, -.x .gnb li a:focus{background:none} -.x .gnb li.activeOn>a{background:#ddd} -} -/* Local Navigation */ -.x .lnb{position:relative;float:left;width:200px;margin:1em 0 1em -230px;line-height:normal;zoom:1;display:inline} -.x .lnb .h2{margin-top:0} -.x .lnb ul{margin:0;padding:0;list-style:none} -.x .lnb li{position:relative;margin:0 0 -1px 0;vertical-align:top;zoom:1} -.x .lnb li a{display:block;position:relative;padding:8px 10px;text-decoration:none;color:#666;font-weight:bold;background:#fafafa;border:1px solid #eee;zoom:1} -.x .lnb li a .i{position:absolute;top:50%;left:100%;margin:-4px 0 0 -16px;width:8px;height:8px;color:#ccc;background:url(../img/iconNavVr.gif) no-repeat left top} -.x .lnb li ul{padding:5px 0;background:#fff} -.x .lnb li li{margin:0;border-top:1px dotted #ddd} -.x .lnb li li:first-child{border:0} -.x .lnb li li a{font-weight:normal;background:#fff;padding:5px 10px;border:0} -.x .lnb li li a span{color:#666} -.x .lnb li.active{border:1px solid #ccc;z-index:2} -.x .lnb li li.active{border:0} -.x .lnb li.active a{color:#000;border:0} -.x .lnb li.active .i{background-position:0 -44px} -.x .lnb li.active li a{border:0} -.x .lnb li.active ul{display:block;border-top:1px solid #eee} -.x .lnb li.active li.active a span{color:#13b200;font-weight:bold;letter-spacing:-1px} -/* Content Navigation */ -.x .cnb{margin:1em 0;position:relative;zoom:1} -.x .cnb:after{content:"";display:block;clear:both} -.x .cnb ul{list-style:none;margin:0;padding:0} -.x .cnb li{display:inline} -.x .cnb li:before{content:"| ";color:#ccc} -.x .cnb li:first-child:before{content:"";} -.x .cnb .active, -.x .cnb .active a{font-weight:bold;color:#333;text-decoration:none} -.x .cnb .side{float:right} -/* Pagination */ -.x .pagination{margin:1em 0;text-align:center;line-height:normal} -.x .pagination *{vertical-align:middle} -.x .pagination a, -.x .pagination strong{position:relative;display:inline-block;padding:2px 4px;font-weight:bold;text-decoration:none;line-height:normal;color:#333 !important;vertical-align:middle} -.x .pagination a:hover, -.x .pagination a:active, -.x .pagination a:focus{border:1px solid #ddd;margin:0 -1px} -.x .pagination strong{color:#e00 !important;font-size:20px} -.x .pagination .direction{font-weight:normal;white-space:nowrap} -.x .pagination .direction:hover, -.x .pagination .direction:active, -.x .pagination .direction:focus{border:0;margin:0;text-decoration:underline} -.x .pagination input{width:30px;text-align:center} -.x .pagination button{overflow:visible} -/* Star Rating */ -.x .starRating, -.x .starRating span{display:inline-block;height:14px;background:transparent url(../img/iconStarRating.gif) no-repeat;overflow:hidden} -.x .starRating{width:79px;vertical-align:top} -.x .starRating span{font-size:0;line-height:0;vertical-align:top;text-indent:-100px;*text-indent:0;background-position:0 -14px} -/* Progress */ -.x .prgrs{white-space:nowrap;line-height:normal;vertical-align:middle} -.x .prgrs *{vertical-align:middle} -.x .prgrs .pBar{position:relative;display:inline-block;background:#e9e9e9;margin:0 5px 0 0} -.x .prgrs .pAction{display:inline-block;vertical-align:top;background:#99a6b6} -.x .prgrs .pNum{position:absolute;width:100%;left:0;top:0;text-align:center;text-shadow:1px 1px 0 #fff} -.x .prgrs.prgrsSmall{font-size:14px;line-height:14px} -.x .prgrs.prgrsSmall .pBar, -.x .prgrs.prgrsSmall .pAction, -.x .prgrs.prgrsSmall .pNum{height:16px;line-height:16px;font-size:11px} -.x .prgrs.prgrsMedium{font-size:24px;line-height:24px} -.x .prgrs.prgrsMedium .pBar, -.x .prgrs.prgrsMedium .pAction, -.x .prgrs.prgrsMedium .pNum{height:22px;line-height:22px;font-size:12px} -.x .prgrs.prgrsLarge{font-size:38px;line-height:38px} -.x .prgrs.prgrsLarge .pBar, -.x .prgrs.prgrsLarge .pAction, -.x .prgrs.prgrsLarge .pNum{height:34px;line-height:34px;font-size:14px} -/* Modal Window */ -.modal{position:absolute;top:0;left:0;width:100%;_height:100%;min-height:100%;z-index:100} -.modal .bg{position:absolute;background:#000;_background:none;width:100%;height:100%;opacity:.5;z-index:2;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1} -.modal .fg{position:relative;width:80%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:3;zoom:1;border-radius:5px;box-shadow:0 0 6px #000} -.modal ul, -.modal ol, -.modal .lined, -.modal .table{margin-bottom:1em} -.modal .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1} -.modalClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px} -.modalBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden} -html.modalContainer, -body.modalContainer{_height:100%;_width:100%} /* IE6 only */ -/* Layer */ -.x .layer, -.x.layer{position:absolute;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:2;zoom:1;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5pxbox-shadow:0 0 6px #666;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} -.x .layer h2{font-size:14px} -.x .layer ul, -.x .layer ol, -.x .layer .lined, -.x .layer .table{margin-bottom:1em} -.x .layerClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px} -.x .layerBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden} -/* H2 Anchor */ -.x .h2Anchor{position:absolute;right:0;border:0;background:none;color:#00f;text-decoration:underline} -/* Skip Navigation */ -.x .skipNav{margin:0;text-align:center;overflow:hidden} -.x .skipNav a{position:absolute;width:1px;height:1px;display:block;color:#fff;font-weight:bold;padding:10px 0;background:#333;border-top:1px solid #656565} -.x .skipNav a:hover, -.x .skipNav a:active, -.x .skipNav a:focus{position:relative;width:auto;height:auto} -/* Header */ -.x .header{position:relative;z-index:2;padding:30px 0 0 0;background:#4c4c4c;box-shadow:0 0 10px #aaa;zoom:1} -.x .header:after{content:"";display:block;clear:both} -.x .header a{text-decoration:none} -.x .header h1{margin:0 100px 10px 1.3em;font-size:24px;line-height:32px} -.x .header h1 *{vertical-align:middle} -.x .header h1 a{color:#fff;text-shadow:1px 1px 0 #000;filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=1, OffY=1, Color=#000000, Positive=true);zoom:1} -.x .header h1 .url{font-size:12px;font-weight:normal} -.x .header #moveSiteList{padding:10px 1em 5px 1em;margin:0} -.x .header #moveSiteList ul{list-style:none;margin:0;padding:0} -.x .header #moveSiteList li{white-space:nowrap;margin:0;padding:4px 0;border-bottom:1px dotted #ccc} -.x .header #siteMapList{padding:0 1em 1em 1em;margin:0} -.x .header #siteMapList li{white-space:nowrap} -.x .header .account{position:absolute;z-index:3;width:100%;padding:5px 2em 5px 0;top:0;right:0;white-space:nowrap;text-align:right;background:#333;border-bottom:1px solid #656565;color:#fff;font-size:12px;box-shadow:0 0 10px #333} -.x .header .account ul{margin:0 2px 0 0;padding:0;list-style:none} -.x .header .account li{position:relative;display:inline;border-left:1px solid #666;padding:0 6px 0 10px} -.x .header .account li:first-child{border:0} -.x .header .account a{color:#fff;display:inline-block;height:14px} -.x .header .account a.language{padding-right:2px} -.x .header #language{position:absolute;top:19px;right:-2em;padding:6px 4px !important;border:1px solid #666;border-top:0;background:#333} -.x .header #language li{border:0;display:block;padding:1px 8px;text-align:left;line-height:1} -.x .header #language li.selected a{text-decoration:underline} -.x .header h1 a:hover, -.x .header h1 a:active, -.x .header h1 a:focus, -.x .header .account a:hover, -.x .header .account a:active, -.x .header .account a:focus{color:#6e9cf2;text-decoration:underline} -/* Footer */ -.x .footer{border-top:1px solid #ddd;text-align:center;font-size:12px;padding:1.5em 0;margin:0 2em} -.x .footer p{margin:0} -.x .footer a{color:#6e9cf2;text-decoration:none} -/* Body */ -.x .body{position:relative;z-index:1;padding:1em 2em 1em 260px;zoom:1} -.x .body:after{content:"";display:block;clear:both} -/* Content */ -.x .content{float:right;width:100%;margin-left:-230px;zoom:1} -.x .content:after{content:"";display:block;clear:both} -.x .content a{color:#33a} -.x .content a:hover, -.x .content a:active, -.x .content a:focus{color:#a33} -.x .content .portlet a{text-decoration:none} -.x .content .portlet a:hover, -.x .content .portlet a:active, -.x .content .portlet a:focus{text-decoration:underline} -/* Dashboard */ -.x .dashboard{position:relative;float:none;width:auto;margin-left:-230px} -.x .dashboard .portlet{float:left;width:48%;margin-right:1em} -.x .dashboard .portlet:nth-of-type(odd){float:left;width:49%;margin-right:0} -.x .dashboard .portlet:nth-of-type(even){float:right;width:49%;margin-right:0} -/* Single Column*/ -.x .single{position:relative;float:none;width:auto;margin-left:-230px} -/* Search */ -.x .search{zoom:1} -.x .search:after{content:"";display:block;clear:both} -.x .search .pagination{float:left;text-align:left} -.x .search form{float:right;margin:1em 0} -.x .search form *{vertical-align:middle} -/* Site Map */ -.x .siteMap h2 input{font-size:14px;font-weight:bold;padding:0 .5em} -.x .siteMap label{cursor:text} -.x .siteMap .lined ul{padding:0;margin:0;border-top:1px solid #eee;zoom:1} -.x .siteMap .lined li{position:relative;padding:0;margin:0;cursor:all-scroll;list-style:none;zoom:1} -.x .siteMap .lined li li{border-top:1px solid #eee} -.x .siteMap li li{text-indent:18px} -.x .siteMap li li li{text-indent:36px} -.x .siteMap li li li li{text-indent:54px} -.x .siteMap li li li li li{text-indent:72px} -.x .siteMap li li li li li li{text-indent:90px} -.x .siteMap li li li li li li li{text-indent:108px} -.x .siteMap li li li li li li li li{text-indent:126px} -.x .siteMap li li li li li li li li li{text-indent:144px} -.x .siteMap li li li li li li li li li li{text-indent:162px} -.x .siteMap li li li li li li li li li li li{text-indent:180px} -.x .siteMap li li li li li li li li li li li li{text-indent:198px} -.x .siteMap li *{vertical-align:middle} -.x .siteMap li .moveTo+input{width:200px;border:0;padding:0 .5em} -.x .siteMap li .moveTo+input:hover, -.x .siteMap li .moveTo+input:active, -.x .siteMap li .moveTo+input:focus{border:1px dotted #ccc;overflow:visible} -.x .siteMap .moveTo{position:relative;z-index:2;width:22px;height:32px;padding:32px 0 0 0;margin:0 3px;_margin-top:-1px;overflow:hidden;background:#fff url(../img/iconMoveTo.gif) no-repeat center 0;border:0;cursor:move} -.x .siteMap li.active, -.x .siteMap li.active .moveTo{background-color:#f7f7f7} -.x .siteMap li.active li, -.x .siteMap li.active ul{border-top-color:#f7f7f7} -.x .siteMap li.active .moveTo{background-position:center -32px} -.x .siteMap .vr, -.x .siteMap .hr{display:none;position:absolute;z-index:1;left:14px;border:0px solid #ccc;overflow:hidden} -.x .siteMap .vr{top:-16px;height:100%;border-left-width:1px} -.x .siteMap .hr{top:16px;width:16px;border-top-width:1px} -.x .siteMap li.active .vr, -.x .siteMap li.active li .hr{display:block} -.x .siteMap li li .vr, -.x .siteMap li li li .hr{left:32px} -.x .siteMap li li li .vr, -.x .siteMap li li li li .hr{left:50px} -.x .siteMap li li li li .vr, -.x .siteMap li li li li li .hr{left:68px} -.x .siteMap li li li li li .vr, -.x .siteMap li li li li li li .hr{left:86px} -.x .siteMap li li li li li li .vr, -.x .siteMap li li li li li li li .hr{left:104px} -.x .siteMap li li li li li li li .vr, -.x .siteMap li li li li li li li li .hr{left:122px} -.x .siteMap li li li li li li li li .vr, -.x .siteMap li li li li li li li li li .hr{left:140px} -.x .siteMap li li li li li li li li li .vr, -.x .siteMap li li li li li li li li li li .hr{left:158px} -.x .siteMap li li li li li li li li li li .vr, -.x .siteMap li li li li li li li li li li li .hr{left:176px} -.x .siteMap li li li li li li li li li li li .vr, -.x .siteMap li li li li li li li li li li li li .hr{left:336px} -.x .siteMap .side{padding-top:0 !important;padding-bottom:0 !important;line-height:30px;background:transparent !important} -.x .siteMap .side button{text-indent:0;line-height:1} -.x .siteMap .tgMap{position:absolute;top:12px;right:1em;padding:0 16px 0 0;line-height:16px;background:url(../img/iconArrow.gif) no-repeat right -126px} -.x .siteMap.fold .tgMap{background-position:right -158px} -.x .siteMap.fold .h2{border-bottom-color:#fff;border-radius:5px} -.x .siteMap .placeholder{background:#bbb} -.x .siteMap .draggable, -.x .siteMap .draggable .moveTo{background-color:#ddd} -.x .siteMap .draggable .summary{border-left:1px solid #ccc;padding-left:10px;margin-left:10px;font-size:11px;color:#999} -.x .siteMap a.ms{text-decoration:underline} -/* Multilingual */ -.x .langEdit{background:#fff;position:absolute;*left:0;*margin-top:28px;z-index:10} -.x .langEdit ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0} -.x .langEdit li{padding:.5em 10px} -.x .langEdit input[type=text]{width:220px;padding-right:40px} -.x .langEdit label{left:15px !important} -.x .langEdit .action{border:1px solid #eee;width:268px;padding:0 10px} -.x .langEdit p, -.x .langEdit .btnArea{white-space:normal} -.x .langEdit .langList, -.x .langEdit .langEditControls{box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} -.x .langEdit .langList{margin:0 -1px 0 0;display:none} -.x .langEdit .langList li{white-space:nowrap;color:#ccc;width:270px} -.x .langEdit .langList li span{display:inline-block;width:80px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:#767676} -.x .langEdit .langList li a{display:inline-block;width:80px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis} -.x .langEdit .langList li.active{background:url(../img/iconArrow.gif) no-repeat right -188px} -.x .langEdit.showChild .langList{display:block} -.x .langEdit .langInput{background:#fff} -.x .langEdit .langInput h2{padding:5px 10px;margin:0 0 -1px 0;font-size:12px;font-weight:normal;color:#666;border:1px solid #eee;border-top-color:#ccc} -.x .langEdit .langInput h2 strong{color:#000;font-size:14px} -.x .langEdit.showChild .langInput{position:absolute;left:285px;top:0} -.x .langEdit li.en input, -.x .langEdit li.en textarea, -.x .mLangEdit li.en textarea{background:url(../img/flag.us.gif) no-repeat 99% 5px} -.x .langEdit li.ko input, -.x .langEdit li.ko textarea, -.x .mLangEdit li.ko textarea{background:url(../img/flag.kr.gif) no-repeat 99% 5px} -.x .langEdit li.jp input, -.x .langEdit li.jp textarea, -.x .mLangEdit li.jp textarea{background:url(../img/flag.jp.gif) no-repeat 99% 5px} -.x .langEdit li.fr input, -.x .langEdit li.fr textarea, -.x .mLangEdit li.fr textarea{background:url(../img/flag.fr.gif) no-repeat 99% 5px} -.x .langEdit li.de input, -.x .langEdit li.de textarea, -.x .mLangEdit li.de textarea{background:url(../img/flag.de.gif) no-repeat 99% 5px} -.x .langEdit li.ru input, -.x .langEdit li.ru textarea, -.x .mLangEdit li.ru textarea{background:url(../img/flag.ru.gif) no-repeat 99% 5px} -.x .langEdit li.es input, -.x .langEdit li.es textarea, -.x .mLangEdit li.es textarea{background:url(../img/flag.es.gif) no-repeat 99% 5px} -.x .langEdit li.tr input, -.x .langEdit li.tr textarea, -.x .mLangEdit li.tr textarea{background:url(../img/flag.tr.gif) no-repeat 99% 5px} -.x .langEdit li.vi input, -.x .langEdit li.vi textarea, -.x .mLangEdit li.vi textarea{background:url(../img/flag.vn.gif) no-repeat 99% 5px} -.x .langEdit li.mn input, -.x .langEdit li.mn textarea, -.x .mLangEdit li.mn textarea{background:url(../img/flag.mn.gif) no-repeat 99% 5px} -.x .langEdit li.zh-CN input, -.x .langEdit li.zh-CN textarea, -.x .mLangEdit li.zh-CN textarea, -.x .langEdit li.zh-TW input, -.x .langEdit li.zh-TW textarea, -.x .mLangEdit li.zh-TW textarea{background:url(../img/flag.cn.gif) no-repeat 99% 5px} -.x .mLangEdit.en strong{background:url(../img/flag.us.gif) no-repeat 0 10px} -.x .mLangEdit.ko strong{background:url(../img/flag.kr.gif) no-repeat 0 10px} -.x .mLangEdit.jp strong{background:url(../img/flag.jp.gif) no-repeat 0 10px} -.x .mLangEdit.fr strong{background:url(../img/flag.fr.gif) no-repeat 0 10px} -.x .mLangEdit.de strong{background:url(../img/flag.de.gif) no-repeat 0 10px} -.x .mLangEdit.ru strong{background:url(../img/flag.ru.gif) no-repeat 0 10px} -.x .mLangEdit.es strong{background:url(../img/flag.es.gif) no-repeat 0 10px} -.x .mLangEdit.tr strong{background:url(../img/flag.tr.gif) no-repeat 0 10px} -.x .mLangEdit.vi strong{background:url(../img/flag.vn.gif) no-repeat 0 10px} -.x .mLangEdit.mn strong{background:url(../img/flag.mn.gif) no-repeat 0 10px} -.x .mLangEdit.zh-CN strong, -.x .mLangEdit.zh-TW strong{background:url(../img/flag.cn.gif) no-repeat 0 10px} -.x .mLangEdit ul ul{border:0} -.x .mLangEdit li{position:relative;padding:0} -.x .mLangEdit li strong{display:inline-block;padding:6px 100px 8px 24px;font-weight:normal;line-height:1.5} -.x .mLangEdit li .side{position:absolute;top:8px;right:0;padding-right:18px;background:url(../img/iconArrow.gif) no-repeat right -160px} -.x .mLangEdit li li{border:0;padding-right:36px} -.x .mLangEdit li textarea{width:100%;height:16px;padding-right:30px;resize:vertical;line-height:1.4} -.x .mLangEdit li label{top:8px !important} -.x .mLangEdit li.active{background:#FFFDEF} -.x .mLangEdit li.active strong{font-weight:bold} -.x .mLangEdit li.active .side{background-position:right -128px} -.modal .mLangEdit ul{padding-bottom:1em} -.modal .mLangEdit li{border:0;padding-right:36px} -/* Suggestion */ -.x .suggestion{display:none;position:absolute;background:#fff;z-index:10;_height:200px;max-height:200px;overflow:auto;*left:0;*margin-top:28px;box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} -.x .suggestion ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0} -.x .suggestion li{padding:0} -.x .suggestion li:last-child{border-bottom:0} -.x .suggestion li button{border:0;background:#fff;text-align:left;width:288px;padding:2px 4px;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap} -.x .suggestion li button:hover, -.x .suggestion li button:active, -.x .suggestion li button:focus, -.x .suggestion li button.active{background:#eee} -/* Image Mark */ -.x #imageMark{right:0} -/* Easy Installer */ -.x .easyNav{position:relative;border:1px solid #e9e9e9;zoom:1} -.x .easyNav:after{content:"";display:block;clear:both} -.x .easyNav h2{font-size:16px} -.x .easyNav .category{width:30%;float:left;margin:0 2em;display:inline} -.x .easyNav .filter{position:absolute;top:0;right:0;margin:1em 2em;text-align:right} -.x .easyList td p{margin-top:0} -.x .easyList td p.update{background:#ffc;padding:.5em 1em;border:1px solid #fc9;border-left:0;border-right:0;text-align:center} -/* Font Preview */ -.x .fontPreview{width:96%;border:1px solid #e9e9e9;zoom:1;padding:1em 2em;margin:.5em 0} -/* FTP Suggestion */ -.x #ftpSuggestion{background:#fff;box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} -.x #ftpSuggestion ul{border-left:1px solid #eee;border-right:1px solid #eee} -.x #ftpSuggestion li{padding:0} -.x #ftpSuggestion li button{border:0;background:#fff;text-align:left;width:288px} -.x #ftpSuggestion li button:hover, -.x #ftpSuggestion li button:active, -.x #ftpSuggestion li button:focus{background:#eee} -/* Theme & Skin Preview */ -.x .thumbPreview li{position:relative;padding-left:10px;padding-right:10px} -.x .thumbPreview li.active.highlight{background:#f9f9f9} -.x .thumbPreview .prevToggle{position:absolute;top:8px;right:10px;line-height:16px;padding:0 18px 0 0;text-decoration:none;background:url(../img/iconArrow.gif) no-repeat right -32px} -.x .thumbPreview li.active .prevToggle{background-position:right 0} -.x .thumbPreview .a{border:0;margin:0;zoom:1} -.x .thumbPreview .a:after{content:"";display:block;clear:both} -.x .thumbPreview .i{float:left;vertical-align:top;margin:0 1em 1em 0;padding:0;border:0;zoom:1} -.x .thumbPreview .i:after{content:"";display:block;clear:both} -.x .thumbPreview .i .thumb{position:relative;width:124px;height:84px;padding:0;margin-bottom:3px;text-align:center;overflow:hidden;border:1px solid #ddd;display:block;cursor:pointer;background:#fff} -.x .thumbPreview .i .thumb .frame{position:absolute;width:120px;height:80px;left:0;top:0;border:2px solid #fff;overflow:hidden} -.x .thumbPreview .i .thumb img{width:120px;margin:0} -.x .thumbPreview .i label{display:block;position:relative;top:0;left:2px;width:122px;height:1.1em;margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} -.x .thumbPreview .i input{display:none} -.x .thumbPreview .i ul{display:none} -.x .thumbPreview .selected .i{display:block;float:none} -.x .thumbPreview .selected .i .thumb{float:left;width:186px;height:126px;margin:0 1em 0 0;border:2px solid #eee} -.x .thumbPreview .selected .i .thumb .frame{width:180px;height:120px;border-width:3px} -.x .thumbPreview li.active.highlight .selected .i .thumb{border-color:#5ea8f6} -.x .thumbPreview .selected .i .thumb img{width:180px;position:relative} -.x .thumbPreview li.active .selected .i .thumb img{z-index:auto} -.x .thumbPreview .selected .i label{cursor:text} -.x .thumbPreview .selected .i ul{display:block;list-style:none;border:0;margin:1em 0 1em 200px} -.x .thumbPreview .selected .i li{border:0;padding:0;margin:0 0 .2em 0} -.x .thumbPreview.jx .i label{display:inline;width:auto} -.x .thumbPreview.jx .i.noDirection{display:none} -.x .thumbPreview.jx .i input{display:inline} -.x #skin .showAll{float:right;border:0;overflow:visible;padding:0 18px 0 0;cursor:pointer;color:#00f;background:url(../img/iconArrow.gif) no-repeat right -32px} -.x #skin .showAll.hideAll{background-position:right 0} -/* Favorite On | Off */ -.x .fvOff, -.x .fvOn{display:inline-block;width:16px;height:16px;overflow:hidden;text-indent:16px;background:url(../img/iconFavorite.gif) no-repeat} -.x .fvOn{background-position:0 -16px} -/* Up-Down Dragable */ -.x .uDrag .wrap{position:relative;padding-left:20px} -.x .uDrag li>.wrap{margin:0 0 0 8px} -.x .uDrag .dragActive{background:#FFD} -.x .uDrag .dragActive th, -.x .uDrag .dragActive td{background:none !important} -.x .uDrag .dragBtn{position:absolute;width:8px;height:100%;padding:0;overflow:hidden;background:url(../img/bgDragable.gif);top:1px;left:0;text-indent:12px;border:0;cursor:n-resize;white-space:nowrap} -/* Favicon Preview */ -.x .faviconPreview{position:relative;padding:60px 0 0 200px;background:url(../img/bgFavicon.gif) no-repeat} -.x .faviconPreview img{position:absolute} -.x .faviconPreview .fn1{top:30px;left:12px} -.x .faviconPreview .fn2{top:55px;left:68px} -/* Mobile Icon Preview */ -.x .mobiconPreview{position:relative;padding:252px 0 0 200px;background:url(../img/bgMobileTop.png) no-repeat} -.x .mobiconPreview img{position:absolute;top:20px;left:10px} -.x .mobiconPreview span{position:absolute;width:32px;text-align:center;top:52px;left:10px;color:#fff;font-size:9px} -/* Text List */ -.x .textList{border:1px solid #ddd !important;line-height:1.5em;height:18.5em;overflow:auto} -.x .textList li{border:0;padding:.25em 1em;height:1.5em;white-space:nowrap;overflow:hidden} -.x .textList li:nth-child(even){background:#eee} -.x .textList li a{float:right} -/* File Box */ -.x .fileBox li{position:relative} -.x .fileBox li img{max-width:100%} -.x .fileBox .portlet ul{margin:1em;list-style:none;padding:0;border:0} -.x .fileBox .portlet li{border-top:1px solid #ddd;border-bottom:0;padding:8px 0} -.x .fileBox .side{position:absolute;top:8px;right:0} -/* Messages */ -.x .desc.error{color:#f00} -.x .desc.success{color:#080} -/* Icon Button */ -.x a.iSetting{display:inline-block;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;vertical-align:middle;background:url(../img/iconSetting.gif) no-repeat} -.x a.cMenu{display:inline-block;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;vertical-align:middle;background:url(../../../../common/img/icon.bubble.png) no-repeat} -/* Responsive Layout */ -@media only all and (max-width:860px){ -.x .header h1{margin-left:.7em} -.x .header .account{padding-right:1em} -.x .body{padding:1em} -.x .content{float:none;margin-left:0} -.x .lnb{float:none;width:auto;margin:1em 0} -.x .dashboard .portlet{float:none !important;width:auto !important;margin-right:0} -.modal .fg, -.wfsr .fg{width:auto} -.x .easyNav .category{float:none;display:block;width:auto} -.x .easyNav .filter{position:static} -} -@media only all and (max-width:640px){ -.x .skipNav a{position:relative;width:auto;height:auto} -.modal{position:absolute} -} -/* Legacy Code (Don't use it. It will be removed as soon as possible.) */ -.x h3.xeAdmin, -.x h4.xeAdmin{position:relative;border-bottom-style:solid;border-bottom-color:#ccc;zoom:1} -.x h3.xeAdmin{border-bottom-width:4px;font-size:24px} -.x h4.xeAdmin{border-bottom-width:3px;font-size:20px} -.x h5.xeAdmin{border-bottom-width:2px;font-size:16px} -.x h6.xeAdmin{border-bottom-width:1px;font-size:12px} -.x .adminSearch{margin:1em 0} -.x .adminSearch fieldset{border:1px solid #ccc} -.x .localNavigation{padding:0;list-style:none} -.x .localNavigation li{display:inline} -.x .localNavigation li.on a{font-weight:bold;color:#333;text-decoration:none} -.x .localNavigation li:before{content:"| "} -.x .localNavigation li:first-child:before{content:""} -.x .summary{margin:1em 0} -.x .rowTable, -.x .colTable, -.x .crossTable{margin:1em 0;border:0;border-collapse:collapse;border-top:2px solid #ccc;width:100%} -.x .rowTable caption, -.x .colTable caption, -.x .crossTable caption{font-weight:bold;text-align:left;line-height:22px;padding:5px 0} -.x .rowTable caption:after, -.x .colTable caption:after, -.x .crossTable caption:after{content:"";display:block;clear:both} -.x .rowTable caption a, -.x .colTable caption a, -.x .crossTable caption a{font-weight:normal} -.x .rowTable caption em, -.x .colTable caption em, -.x .crossTable caption em{float:right;font-style:normal;font-weight:normal;color:#e00;margin-left:1em} -.x .rowTable caption strong, -.x .colTable caption strong, -.x .crossTable caption strong{color:#e00} -.x .rowTable caption .side, -.x .colTable caption .side, -.x .crossTable caption .side{float:right;font-weight:normal;margin-left:1em} -.x .rowTable th,.rowTable td, -.x .colTable th,.rowTable td, -.x .crossTable th,.rowTable td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd;white-space:nowrap} -.x .rowTable th, -.x .colTable th, -.x .crossTable th{background:#f8f8f8} -.x .rowTable thead th, -.x .colTable thead th, -.x .crossTable thead th{border-bottom:1px solid #999} -.x .rowTable tfoot td, -.x .colTable tfoot td, -.x .crossTable tfoot td{font-weight:bold;background:#f8f8f8} -.x .rowTable.even tbody tr:nth-of-type(even) td, -.x .colTable.even tbody tr:nth-of-type(even) td, -.x .crossTable.even tbody tr:nth-of-type(even) td{background-color:#fafafa} -.x .rowTable td>input[type=text], -.x .colTable td>input[type=text], -.x .crossTable td>input[type=text]{margin:-1px 0 -3px 0 !important;vertical-align:middle} -.x .rowTable img, -.x .colTable img, -.x .crossTable img{vertical-align:middle} -.x .rowTable .title, -.x .colTable .title, -.x .crossTable .title, -.x .rowTable .text, -.x .colTable .text, -.x .crossTable .text{white-space:normal} -.x .rowTable input[type=text], -.x .colTable input[type=text], -.x .crossTable input[type=text], -.x .rowTable input[type=password], -.x .colTable input[type=password], -.x .crossTable input[type=password], -.x .rowTable input[type=file], -.x .colTable input[type=file], -.x .crossTable input[type=file], -.x .rowTable textarea, -.x .colTable textarea, -.x .crossTable textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:transparent} -.x .rowTable input[type=text], -.x .colTable input[type=text], -.x .crossTable input[type=text], -.x .rowTable input[type=password], -.x .colTable input[type=password], -.x .crossTable input[type=password], -.x .rowTable input[type=file], -.x .colTable input[type=file], -.x .crossTable input[type=file]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px} -.x .clear:after{content:"";display:block;clear:both} +@charset "utf-8"; /* NHN (developers@xpressengine.com) */ /* Element Reset */ body{margin:0} header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{display:block} body>.popup{margin:1em} .x, .x table, .x input, .x textarea, .x select, .x button{font-family:Tahoma,Geneva,sans-serif;font-size:12px;color:#333} .x button, .x input[type=submit], .x input[type=reset], .x input[type=button]{cursor:pointer;overflow:visible} .x img{border:0} .x p{line-height:1.5} /* Section & Heading */ .x .section{margin:1em 0;padding:0;border:0} .x .h1, .x .h2, .x .h3, .x .h4{position:relative;border-bottom-style:solid;border-bottom-color:#ccc;zoom:1} .x .h1{border-bottom-width:4px;font-size:24px} .x .h2{border-bottom-width:3px;font-size:20px} .x .h3{border-bottom-width:2px;font-size:16px} .x .h4{border-bottom-width:1px;font-size:12px} /* Portlet */ .x .portlet{position:relative;border:1px solid #e9e9e9;margin:1em 0;padding:0;background:#fff;zoom:1;overflow:hidden;border-radius:5px} .x .portlet h2, .x .portlet h3{margin:0;padding:.5em 1em;font-size:14px;border:1px solid #fff;border-bottom:1px solid #e9e9e9;background:#f7f7f7;border-radius:5px 5px 0 0} .x .portlet p{margin:1em 1.2em} .x .portlet li{position:relative;padding-right:8em} .x .portlet .lined{margin:1px;padding:0;list-style:none} .x .portlet .lined li{padding:.5em 8em .5em 1em;border-top:1px solid #eee;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis} .x .portlet .lined li:first-child{border:0} .x .portlet .side{position:absolute;top:0;_top:1px;right:0;color:#666;background:#fff;padding:0 1em} .x .portlet .lined .side{padding:.5em 1em} .x .portlet .more{position:absolute;top:.5em;right:1em;text-decoration:none !important;color:#666} .x .portlet .more span{color:#999} .x .portlet .action{text-align:right;top:0;right:0;padding:.5em 1em .5em 3em;background:#fff;background:-webkit-gradient(linear, 0% 0%, 100% 0%, from(rgba(255,255,255,0)), to(rgba(255,255,255,1)), color-stop(15%, #fff));background:-moz-linear-gradient(left, rgba(255,255,255,0) 0, rgba(255,255,255,1) 15%)} .x .portlet .action a, .x .portlet .action button{margin-left:1em} .x .portlet .btnArea{border-top:1px solid #ddd;margin:0;padding:.5em 1em;margin:0 1px 1px 1px;background:#f7f7f7;border-radius:0 0 5px 5px} /* Table */ .x .table{margin:1em 0} .x .table table{width:100%;border:0;border-collapse:collapse;border-top:2px solid #ccc} .x .table caption{font-weight:bold;text-align:left;line-height:22px;padding:5px 0} .x .table caption:after{content:"";display:block;clear:both} .x .table caption a{font-weight:normal} .x .table caption em{float:right;margin-left:1em} .x .table caption strong{color:#e00} .x .table caption .side{float:right;font-weight:normal;margin-left:1em} .x .table th, .x .table td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd;white-space:nowrap} .x .table th{background:#f8f8f8} .x .table thead th{border-bottom:1px solid #999} .x .table tfoot td{font-weight:bold;background:#f8f8f8} .x .table.even tbody tr:nth-of-type(even) td{background-color:#fafafa} .x .table td>input[type=text]{margin:-1px 0 -3px 0 !important;vertical-align:middle} .x .table img{vertical-align:middle} .x .table em{font-style:normal;font-weight:normal;color:#e00} .x .table .title, .x .table .text{white-space:normal} /* Form */ .x .form{margin:1em 0;padding:0} .x .form fieldset{margin:0 0 2em 0;padding:0;border:0} .x .form em{font-style:normal;color:#e00} .x .form label{margin-right:1em;line-height:1;vertical-align:middle} .x .form input[type=checkbox]+label, .x .form input[type=radio]+label, .x .form input[type=file]{cursor:pointer} .x .form ul{position:relative;margin:0;padding:0;list-style:none;border-top:2px solid #ccc;border-bottom:1px solid #ccc;zoom:1} .x .form li{list-style:none;border:1px solid #ddd;border-left:0;border-right:0;margin:-1px 0;padding:8px 0;vertical-align:top;zoom:1} .x .form li:first-child{border-top:0} .x .form li>label:first-child{display:block;font-weight:bold} .x .form li label em{font-weight:normal} .x .form label.overlap{position:absolute;color:#aaa} .x .form input[type=text], .x .form input[type=password], .x .form input[type=file], .x .form textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:transparent} .x .form input[type=text], .x .form input[type=password], .x .form input[type=file]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px} .x .form input[type=text].loading, .x .form input.loading[type=password]{padding-right:24px;width:260px;background:transparent url(../img/preLoader16.gif) no-repeat 265px center} .x .form input[type=checkbox], .x .form input[type=radio]{margin:0;padding:0;width:13px;height:13px;vertical-align:middle} .x .form input[type=text][disabled=disabled], .x .form input[type=password][disabled=disabled], .x .form input[type=checkbox][disabled=disabled], .x .form input[type=radio][disabled=disabled], .x .form input[type=file][disabled=disabled], .x .form textarea[disabled=disabled], .x .form select[disabled=disabled]{background:#ddd !important;text-shadow:1px 1px 0 #fff} .x .form textarea{padding:3px 4px;vertical-align:top} .x .form span.desc, .x .form em.desc{line-height:22px;vertical-align:middle;margin:0 10px} .x .form p.desc{margin:.25em 0;line-height:1.4} .x .form .q{font-weight:bold;margin:0 0 5px 0} .x .form .a{margin:0 0 5px 0} .x .form .tgForm{margin-right:1em} .x .form .h1 + ul, .x .form .h2 + ul, .x .form .h3 + ul, .x .form .h4 + ul{border-top:0} /* Global Navigation Bar */ .x .gnb{position:relative;clear:both;border:1px solid #c1c1c1;border-left:0;border-right:0;background-color:#efefef;background:#efefef -webkit-gradient(linear, 0% 0%, 0% 100%, from(#efefef), to(#dcdcdc));background:#efefef -moz-linear-gradient(top, #efefef, #dcdcdc);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#efefef, endColorStr=#dcdcdc);zoom:1} .x .gnb ul{margin:0;padding:0 0 0 2em;list-style:none;border:1px solid #fff;border-left:0;border-right:0;zoom:1} .x .gnb ul ul{position:absolute;top:30px;left:0;border:1px solid #ccc;border-top:0;padding:1px 0 0 0;background:#fff} .x .gnb ul:after{content:"";display:block;clear:both} .x .gnb li{position:relative;float:left;border:1px solid #fff;border-top:0;border-bottom:0;margin:0 -1px 0 0} .x .gnb li li{float:none;clear:both;overflow:hidden;border:0;border-top:1px dotted #ccc;margin:0;padding:2px} .x .gnb li li:first-child{border:0} .x .gnb li a{float:left;font-weight:bold;color:#333;font-size:12px;padding:8px 18px;white-space:nowrap;text-decoration:none;text-shadow:0 1px 0 #fff;zoom:1} .x .gnb li a:hover, .x .gnb li a:active, .x .gnb li a:focus, .x .gnb li.active a{background:#f4f4f4;border:1px solid #ccc;border-bottom:0;padding:7px 17px 8px 17px} .x .gnb li.activeOn a{background:#fff;border:1px solid #ccc;border-bottom:0;padding:7px 17px 8px 17px} .x .gnb li.active li a{display:block;float:none;color:#555;background:#fff;padding:5px 15px !important;font-weight:normal !important;border:0 !important} .x .gnb li.active li a:hover, .x .gnb li.active li a:active, .x .gnb li.active li a:focus{border:0;background:#eee} .x .gnb .setting{position:absolute;top:8px;right:2em;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;background:url(../img/iconSetting.gif) no-repeat center} .x .gnb.jx ul{display:block;position:static;padding:0} .x .gnb.jx li{float:none;clear:both;border-top:1px solid #ccc} .x .gnb.jx ul ul{border:0} .x .gnb.jx li li{border:0} .x .gnb.jx li a{float:none;display:block} .x .gnb.jx li a:hover, .x .gnb.jx li a:active, .x .gnb.jx li a:focus{background:none} .x .gnb.jx li.activeOn>a{background:#ddd} @media only all and (max-width:860px){ .x .gnb ul{padding-left:1em} .x .gnb .setting{right:1em} } @media only all and (max-width:640px){ .x .gnb ul{display:block;position:static;padding:0} .x .gnb li{float:none;clear:both;border-top:1px solid #ccc} .x .gnb ul ul{border:0;position:static} .x .gnb li li{border:0} .x .gnb li a{float:none;display:block} .x .gnb li a:hover, .x .gnb li a:active, .x .gnb li a:focus{background:none} .x .gnb li.activeOn>a{background:#ddd} } /* Local Navigation */ .x .lnb{position:relative;float:left;width:200px;margin:1em 0 1em -230px;line-height:normal;zoom:1;display:inline} .x .lnb .h2{margin-top:0} .x .lnb ul{margin:0;padding:0;list-style:none} .x .lnb li{position:relative;margin:0 0 -1px 0;vertical-align:top;zoom:1} .x .lnb li a{display:block;position:relative;padding:8px 10px;text-decoration:none;color:#666;font-weight:bold;background:#fafafa;border:1px solid #eee;zoom:1} .x .lnb li a .i{position:absolute;top:50%;left:100%;margin:-4px 0 0 -16px;width:8px;height:8px;color:#ccc;background:url(../img/iconNavVr.gif) no-repeat left top} .x .lnb li ul{padding:5px 0;background:#fff} .x .lnb li li{margin:0;border-top:1px dotted #ddd} .x .lnb li li:first-child{border:0} .x .lnb li li a{font-weight:normal;background:#fff;padding:5px 10px;border:0} .x .lnb li li a span{color:#666} .x .lnb li.active{border:1px solid #ccc;z-index:2} .x .lnb li li.active{border:0} .x .lnb li.active a{color:#000;border:0} .x .lnb li.active .i{background-position:0 -44px} .x .lnb li.active li a{border:0} .x .lnb li.active ul{display:block;border-top:1px solid #eee} .x .lnb li.active li.active a span{color:#13b200;font-weight:bold;letter-spacing:-1px} /* Content Navigation */ .x .cnb{margin:1em 0;position:relative;zoom:1} .x .cnb:after{content:"";display:block;clear:both} .x .cnb ul{list-style:none;margin:0;padding:0} .x .cnb li{display:inline} .x .cnb li:before{content:"| ";color:#ccc} .x .cnb li:first-child:before{content:"";} .x .cnb .active, .x .cnb .active a{font-weight:bold;color:#333;text-decoration:none} .x .cnb .side{float:right} /* Pagination */ .x .pagination{margin:1em 0;text-align:center;line-height:normal} .x .pagination *{vertical-align:middle} .x .pagination a, .x .pagination strong{position:relative;display:inline-block;padding:2px 4px;font-weight:bold;text-decoration:none;line-height:normal;color:#333 !important;vertical-align:middle} .x .pagination a:hover, .x .pagination a:active, .x .pagination a:focus{border:1px solid #ddd;margin:0 -1px} .x .pagination strong{color:#e00 !important;font-size:20px} .x .pagination .direction{font-weight:normal;white-space:nowrap} .x .pagination .direction:hover, .x .pagination .direction:active, .x .pagination .direction:focus{border:0;margin:0;text-decoration:underline} .x .pagination input{width:30px;text-align:center} .x .pagination button{overflow:visible} /* Star Rating */ .x .starRating, .x .starRating span{display:inline-block;height:14px;background:transparent url(../img/iconStarRating.gif) no-repeat;overflow:hidden} .x .starRating{width:79px;vertical-align:top} .x .starRating span{font-size:0;line-height:0;vertical-align:top;text-indent:-100px;*text-indent:0;background-position:0 -14px} /* Progress */ .x .prgrs{white-space:nowrap;line-height:normal;vertical-align:middle} .x .prgrs *{vertical-align:middle} .x .prgrs .pBar{position:relative;display:inline-block;background:#e9e9e9;margin:0 5px 0 0} .x .prgrs .pAction{display:inline-block;vertical-align:top;background:#99a6b6} .x .prgrs .pNum{position:absolute;width:100%;left:0;top:0;text-align:center;text-shadow:1px 1px 0 #fff} .x .prgrs.prgrsSmall{font-size:14px;line-height:14px} .x .prgrs.prgrsSmall .pBar, .x .prgrs.prgrsSmall .pAction, .x .prgrs.prgrsSmall .pNum{height:16px;line-height:16px;font-size:11px} .x .prgrs.prgrsMedium{font-size:24px;line-height:24px} .x .prgrs.prgrsMedium .pBar, .x .prgrs.prgrsMedium .pAction, .x .prgrs.prgrsMedium .pNum{height:22px;line-height:22px;font-size:12px} .x .prgrs.prgrsLarge{font-size:38px;line-height:38px} .x .prgrs.prgrsLarge .pBar, .x .prgrs.prgrsLarge .pAction, .x .prgrs.prgrsLarge .pNum{height:34px;line-height:34px;font-size:14px} /* Modal Window */ .modal{position:absolute;top:0;left:0;width:100%;_height:100%;min-height:100%;z-index:100} .modal .bg{position:absolute;background:#000;_background:none;width:100%;height:100%;opacity:.5;z-index:2;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1} .modal .fg{position:relative;width:80%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:3;zoom:1;border-radius:5px;box-shadow:0 0 6px #000} .modal ul, .modal ol, .modal .lined, .modal .table{margin-bottom:1em} .modal .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1} .modalClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px} .modalBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden} html.modalContainer, body.modalContainer{_height:100%;_width:100%} /* IE6 only */ /* Layer */ .x .layer, .x.layer{position:absolute;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:2;zoom:1;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5pxbox-shadow:0 0 6px #666;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} .x .layer h2{font-size:14px} .x .layer ul, .x .layer ol, .x .layer .lined, .x .layer .table{margin-bottom:1em} .x .layerClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px} .x .layerBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden} /* H2 Anchor */ .x .h2Anchor{position:absolute;right:0;border:0;background:none;color:#00f;text-decoration:underline} /* Skip Navigation */ .x .skipNav{margin:0;text-align:center;overflow:hidden} .x .skipNav a{position:absolute;width:1px;height:1px;display:block;color:#fff;font-weight:bold;padding:10px 0;background:#333;border-top:1px solid #656565} .x .skipNav a:hover, .x .skipNav a:active, .x .skipNav a:focus{position:relative;width:auto;height:auto} /* Header */ .x .header{position:relative;z-index:2;padding:30px 0 0 0;background:#4c4c4c;box-shadow:0 0 10px #aaa;zoom:1} .x .header:after{content:"";display:block;clear:both} .x .header a{text-decoration:none} .x .header h1{margin:0 100px 10px 1.3em;font-size:24px;line-height:32px} .x .header h1 *{vertical-align:middle} .x .header h1 a{color:#fff;text-shadow:1px 1px 0 #000;filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=1, OffY=1, Color=#000000, Positive=true);zoom:1} .x .header h1 .url{font-size:12px;font-weight:normal} .x .header #moveSiteList{padding:10px 1em 5px 1em;margin:0} .x .header #moveSiteList ul{list-style:none;margin:0;padding:0} .x .header #moveSiteList li{white-space:nowrap;margin:0;padding:4px 0;border-bottom:1px dotted #ccc} .x .header #siteMapList{padding:0 1em 1em 1em;margin:0} .x .header #siteMapList li{white-space:nowrap} .x .header .account{position:absolute;z-index:3;width:100%;padding:5px 2em 5px 0;top:0;right:0;white-space:nowrap;text-align:right;background:#333;border-bottom:1px solid #656565;color:#fff;font-size:12px;box-shadow:0 0 10px #333} .x .header .account ul{margin:0 2px 0 0;padding:0;list-style:none} .x .header .account li{position:relative;display:inline;border-left:1px solid #666;padding:0 6px 0 10px} .x .header .account li:first-child{border:0} .x .header .account a{color:#fff;display:inline-block;height:14px} .x .header .account a.language{padding-right:2px} .x .header #language{position:absolute;top:19px;right:-2em;padding:6px 4px !important;border:1px solid #666;border-top:0;background:#333} .x .header #language li{border:0;display:block;padding:1px 8px;text-align:left;line-height:1} .x .header #language li.selected a{text-decoration:underline} .x .header h1 a:hover, .x .header h1 a:active, .x .header h1 a:focus, .x .header .account a:hover, .x .header .account a:active, .x .header .account a:focus{color:#6e9cf2;text-decoration:underline} /* Footer */ .x .footer{border-top:1px solid #ddd;text-align:center;font-size:12px;padding:1.5em 0;margin:0 2em} .x .footer p{margin:0} .x .footer a{color:#6e9cf2;text-decoration:none} /* Body */ .x .body{position:relative;z-index:1;padding:1em 2em 1em 260px;zoom:1} .x .body:after{content:"";display:block;clear:both} /* Content */ .x .content{float:right;width:100%;margin-left:-230px;zoom:1} .x .content:after{content:"";display:block;clear:both} .x .content a{color:#33a} .x .content a:hover, .x .content a:active, .x .content a:focus{color:#a33} .x .content .portlet a{text-decoration:none} .x .content .portlet a:hover, .x .content .portlet a:active, .x .content .portlet a:focus{text-decoration:underline} /* Dashboard */ .x .dashboard{position:relative;float:none;width:auto;margin-left:-230px} .x .dashboard .portlet{float:left;width:48%;margin-right:1em} .x .dashboard .portlet:nth-of-type(odd){float:left;width:49%;margin-right:0} .x .dashboard .portlet:nth-of-type(even){float:right;width:49%;margin-right:0} /* Single Column*/ .x .single{position:relative;float:none;width:auto;margin-left:-230px} /* Search */ .x .search{zoom:1} .x .search:after{content:"";display:block;clear:both} .x .search .pagination{float:left;text-align:left} .x .search form{float:right;margin:1em 0} .x .search form *{vertical-align:middle} /* Site Map */ .x .siteMap h2 input{font-size:14px;font-weight:bold;padding:0 .5em} .x .siteMap label{cursor:text} .x .siteMap .lined ul{padding:0;margin:0;border-top:1px solid #eee;zoom:1} .x .siteMap .lined li{position:relative;padding:0;margin:0;cursor:all-scroll;list-style:none;zoom:1} .x .siteMap .lined li li{border-top:1px solid #eee} .x .siteMap li li{text-indent:18px} .x .siteMap li li li{text-indent:36px} .x .siteMap li li li li{text-indent:54px} .x .siteMap li li li li li{text-indent:72px} .x .siteMap li li li li li li{text-indent:90px} .x .siteMap li li li li li li li{text-indent:108px} .x .siteMap li li li li li li li li{text-indent:126px} .x .siteMap li li li li li li li li li{text-indent:144px} .x .siteMap li li li li li li li li li li{text-indent:162px} .x .siteMap li li li li li li li li li li li{text-indent:180px} .x .siteMap li li li li li li li li li li li li{text-indent:198px} .x .siteMap li *{vertical-align:middle} .x .siteMap li .moveTo+input{width:200px;border:0;padding:0 .5em} .x .siteMap li .moveTo+input:hover, .x .siteMap li .moveTo+input:active, .x .siteMap li .moveTo+input:focus{border:1px dotted #ccc;overflow:visible} .x .siteMap .moveTo{position:relative;z-index:2;width:22px;height:32px;padding:32px 0 0 0;margin:0 3px;_margin-top:-1px;overflow:hidden;background:#fff url(../img/iconMoveTo.gif) no-repeat center 0;border:0;cursor:move} .x .siteMap li.active, .x .siteMap li.active .moveTo{background-color:#f7f7f7} .x .siteMap li.active li, .x .siteMap li.active ul{border-top-color:#f7f7f7} .x .siteMap li.active .moveTo{background-position:center -32px} .x .siteMap .vr, .x .siteMap .hr{display:none;position:absolute;z-index:1;left:14px;border:0px solid #ccc;overflow:hidden} .x .siteMap .vr{top:-16px;height:100%;border-left-width:1px} .x .siteMap .hr{top:16px;width:16px;border-top-width:1px} .x .siteMap li.active .vr, .x .siteMap li.active li .hr{display:block} .x .siteMap li li .vr, .x .siteMap li li li .hr{left:32px} .x .siteMap li li li .vr, .x .siteMap li li li li .hr{left:50px} .x .siteMap li li li li .vr, .x .siteMap li li li li li .hr{left:68px} .x .siteMap li li li li li .vr, .x .siteMap li li li li li li .hr{left:86px} .x .siteMap li li li li li li .vr, .x .siteMap li li li li li li li .hr{left:104px} .x .siteMap li li li li li li li .vr, .x .siteMap li li li li li li li li .hr{left:122px} .x .siteMap li li li li li li li li .vr, .x .siteMap li li li li li li li li li .hr{left:140px} .x .siteMap li li li li li li li li li .vr, .x .siteMap li li li li li li li li li li .hr{left:158px} .x .siteMap li li li li li li li li li li .vr, .x .siteMap li li li li li li li li li li li .hr{left:176px} .x .siteMap li li li li li li li li li li li .vr, .x .siteMap li li li li li li li li li li li li .hr{left:336px} .x .siteMap .side{padding-top:0 !important;padding-bottom:0 !important;line-height:30px;background:transparent !important} .x .siteMap .side button{text-indent:0;line-height:1} .x .siteMap .tgMap{position:absolute;top:12px;right:1em;padding:0 16px 0 0;line-height:16px;background:url(../img/iconArrow.gif) no-repeat right -126px} .x .siteMap.fold .tgMap{background-position:right -158px} .x .siteMap.fold .h2{border-bottom-color:#fff;border-radius:5px} .x .siteMap .placeholder{background:#bbb} .x .siteMap .draggable, .x .siteMap .draggable .moveTo{background-color:#ddd} .x .siteMap .draggable .summary{border-left:1px solid #ccc;padding-left:10px;margin-left:10px;font-size:11px;color:#999} .x .siteMap a.ms{text-decoration:underline} /* Multilingual */ .x .langEdit{background:#fff;position:absolute;*left:0;*margin-top:28px;z-index:10} .x .langEdit ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0} .x .langEdit li{padding:.5em 10px} .x .langEdit input[type=text]{width:220px;padding-right:40px} .x .langEdit label{left:15px !important} .x .langEdit .action{border:1px solid #eee;width:268px;padding:0 10px} .x .langEdit p, .x .langEdit .btnArea{white-space:normal} .x .langEdit .langList, .x .langEdit .langEditControls{box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} .x .langEdit .langList{margin:0 -1px 0 0;display:none} .x .langEdit .langList li{white-space:nowrap;color:#ccc;width:270px} .x .langEdit .langList li span{display:inline-block;width:80px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:#767676} .x .langEdit .langList li a{display:inline-block;width:80px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis} .x .langEdit .langList li.active{background:url(../img/iconArrow.gif) no-repeat right -188px} .x .langEdit.showChild .langList{display:block} .x .langEdit .langInput{background:#fff} .x .langEdit .langInput h2{padding:5px 10px;margin:0 0 -1px 0;font-size:12px;font-weight:normal;color:#666;border:1px solid #eee;border-top-color:#ccc} .x .langEdit .langInput h2 strong{color:#000;font-size:14px} .x .langEdit.showChild .langInput{position:absolute;left:285px;top:0} .x .langEdit li.en input, .x .langEdit li.en textarea, .x .mLangEdit li.en textarea{background:url(../img/flag.us.gif) no-repeat 99% 5px} .x .langEdit li.ko input, .x .langEdit li.ko textarea, .x .mLangEdit li.ko textarea{background:url(../img/flag.kr.gif) no-repeat 99% 5px} .x .langEdit li.jp input, .x .langEdit li.jp textarea, .x .mLangEdit li.jp textarea{background:url(../img/flag.jp.gif) no-repeat 99% 5px} .x .langEdit li.fr input, .x .langEdit li.fr textarea, .x .mLangEdit li.fr textarea{background:url(../img/flag.fr.gif) no-repeat 99% 5px} .x .langEdit li.de input, .x .langEdit li.de textarea, .x .mLangEdit li.de textarea{background:url(../img/flag.de.gif) no-repeat 99% 5px} .x .langEdit li.ru input, .x .langEdit li.ru textarea, .x .mLangEdit li.ru textarea{background:url(../img/flag.ru.gif) no-repeat 99% 5px} .x .langEdit li.es input, .x .langEdit li.es textarea, .x .mLangEdit li.es textarea{background:url(../img/flag.es.gif) no-repeat 99% 5px} .x .langEdit li.tr input, .x .langEdit li.tr textarea, .x .mLangEdit li.tr textarea{background:url(../img/flag.tr.gif) no-repeat 99% 5px} .x .langEdit li.vi input, .x .langEdit li.vi textarea, .x .mLangEdit li.vi textarea{background:url(../img/flag.vn.gif) no-repeat 99% 5px} .x .langEdit li.mn input, .x .langEdit li.mn textarea, .x .mLangEdit li.mn textarea{background:url(../img/flag.mn.gif) no-repeat 99% 5px} .x .langEdit li.zh-CN input, .x .langEdit li.zh-CN textarea, .x .mLangEdit li.zh-CN textarea, .x .langEdit li.zh-TW input, .x .langEdit li.zh-TW textarea, .x .mLangEdit li.zh-TW textarea{background:url(../img/flag.cn.gif) no-repeat 99% 5px} .x .mLangEdit.en strong{background:url(../img/flag.us.gif) no-repeat 0 10px} .x .mLangEdit.ko strong{background:url(../img/flag.kr.gif) no-repeat 0 10px} .x .mLangEdit.jp strong{background:url(../img/flag.jp.gif) no-repeat 0 10px} .x .mLangEdit.fr strong{background:url(../img/flag.fr.gif) no-repeat 0 10px} .x .mLangEdit.de strong{background:url(../img/flag.de.gif) no-repeat 0 10px} .x .mLangEdit.ru strong{background:url(../img/flag.ru.gif) no-repeat 0 10px} .x .mLangEdit.es strong{background:url(../img/flag.es.gif) no-repeat 0 10px} .x .mLangEdit.tr strong{background:url(../img/flag.tr.gif) no-repeat 0 10px} .x .mLangEdit.vi strong{background:url(../img/flag.vn.gif) no-repeat 0 10px} .x .mLangEdit.mn strong{background:url(../img/flag.mn.gif) no-repeat 0 10px} .x .mLangEdit.zh-CN strong, .x .mLangEdit.zh-TW strong{background:url(../img/flag.cn.gif) no-repeat 0 10px} .x .mLangEdit ul ul{border:0} .x .mLangEdit li{position:relative;padding:0} .x .mLangEdit li strong{display:inline-block;padding:6px 100px 8px 24px;font-weight:normal;line-height:1.5} .x .mLangEdit li .side{position:absolute;top:8px;right:0;padding-right:18px;background:url(../img/iconArrow.gif) no-repeat right -160px} .x .mLangEdit li li{border:0;padding-right:36px} .x .mLangEdit li textarea{width:100%;height:16px;padding-right:30px;resize:vertical;line-height:1.4} .x .mLangEdit li label{top:8px !important} .x .mLangEdit li.active{background:#FFFDEF} .x .mLangEdit li.active strong{font-weight:bold} .x .mLangEdit li.active .side{background-position:right -128px} .modal .mLangEdit ul{padding-bottom:1em} .modal .mLangEdit li{border:0;padding-right:36px} /* Suggestion */ .x .suggestion{display:none;position:absolute;background:#fff;z-index:10;_height:200px;max-height:200px;overflow:auto;*left:0;*margin-top:28px;box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} .x .suggestion ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0} .x .suggestion li{padding:0} .x .suggestion li:last-child{border-bottom:0} .x .suggestion li button{border:0;background:#fff;text-align:left;width:288px;padding:2px 4px;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap} .x .suggestion li button:hover, .x .suggestion li button:active, .x .suggestion li button:focus, .x .suggestion li button.active{background:#eee} /* Image Mark */ .x #imageMark{right:0} /* Easy Installer */ .x .easyNav{position:relative;border:1px solid #e9e9e9;zoom:1} .x .easyNav:after{content:"";display:block;clear:both} .x .easyNav h2{font-size:16px} .x .easyNav .category{width:30%;float:left;margin:0 2em;display:inline} .x .easyNav .filter{position:absolute;top:0;right:0;margin:1em 2em;text-align:right} .x .easyList td p{margin-top:0} .x .easyList td p.update{background:#ffc;padding:.5em 1em;border:1px solid #fc9;border-left:0;border-right:0;text-align:center} /* Font Preview */ .x .fontPreview{width:96%;border:1px solid #e9e9e9;zoom:1;padding:1em 2em;margin:.5em 0} /* FTP Suggestion */ .x #ftpSuggestion{background:#fff;box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} .x #ftpSuggestion ul{border-left:1px solid #eee;border-right:1px solid #eee} .x #ftpSuggestion li{padding:0} .x #ftpSuggestion li button{border:0;background:#fff;text-align:left;width:288px} .x #ftpSuggestion li button:hover, .x #ftpSuggestion li button:active, .x #ftpSuggestion li button:focus{background:#eee} /* Theme & Skin Preview */ .x .thumbPreview li{position:relative;padding-left:10px;padding-right:10px} .x .thumbPreview li.active.highlight{background:#f9f9f9} .x .thumbPreview .prevToggle{position:absolute;top:8px;right:10px;line-height:16px;padding:0 18px 0 0;text-decoration:none;background:url(../img/iconArrow.gif) no-repeat right -32px} .x .thumbPreview li.active .prevToggle{background-position:right 0} .x .thumbPreview .a{border:0;margin:0;zoom:1} .x .thumbPreview .a:after{content:"";display:block;clear:both} .x .thumbPreview .i{float:left;vertical-align:top;margin:0 1em 1em 0;padding:0;border:0;zoom:1} .x .thumbPreview .i:after{content:"";display:block;clear:both} .x .thumbPreview .i .thumb{position:relative;width:124px;height:84px;padding:0;margin-bottom:3px;text-align:center;overflow:hidden;border:1px solid #ddd;display:block;cursor:pointer;background:#fff} .x .thumbPreview .i .thumb .frame{position:absolute;width:120px;height:80px;left:0;top:0;border:2px solid #fff;overflow:hidden} .x .thumbPreview .i .thumb img{width:120px;margin:0} .x .thumbPreview .i label{display:block;position:relative;top:0;left:2px;width:122px;height:1.1em;margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .x .thumbPreview .i input{display:none} .x .thumbPreview .i ul{display:none} .x .thumbPreview .selected .i{display:block;float:none} .x .thumbPreview .selected .i .thumb{float:left;width:186px;height:126px;margin:0 1em 0 0;border:2px solid #eee} .x .thumbPreview .selected .i .thumb .frame{width:180px;height:120px;border-width:3px} .x .thumbPreview li.active.highlight .selected .i .thumb{border-color:#5ea8f6} .x .thumbPreview .selected .i .thumb img{width:180px;position:relative} .x .thumbPreview li.active .selected .i .thumb img{z-index:auto} .x .thumbPreview .selected .i label{cursor:text} .x .thumbPreview .selected .i ul{display:block;list-style:none;border:0;margin:1em 0 1em 200px} .x .thumbPreview .selected .i li{border:0;padding:0;margin:0 0 .2em 0} .x .thumbPreview.jx .i label{display:inline;width:auto} .x .thumbPreview.jx .i.noDirection{display:none} .x .thumbPreview.jx .i input{display:inline} .x #skin .showAll{float:right;border:0;overflow:visible;padding:0 18px 0 0;cursor:pointer;color:#00f;background:url(../img/iconArrow.gif) no-repeat right -32px} .x #skin .showAll.hideAll{background-position:right 0} /* Favorite On | Off */ .x .fvOff, .x .fvOn{display:inline-block;width:16px;height:16px;overflow:hidden;text-indent:16px;background:url(../img/iconFavorite.gif) no-repeat} .x .fvOn{background-position:0 -16px} /* Up-Down Dragable */ .x .uDrag .wrap{position:relative;padding-left:20px} .x .uDrag li>.wrap{margin:0 0 0 8px} .x .uDrag .dragActive{background:#FFD} .x .uDrag .dragActive th, .x .uDrag .dragActive td{background:none !important} .x .uDrag .dragBtn{position:absolute;width:8px;height:100%;padding:0;overflow:hidden;background:url(../img/bgDragable.gif);top:1px;left:0;text-indent:12px;border:0;cursor:n-resize;white-space:nowrap} /* Favicon Preview */ .x .faviconPreview{position:relative;padding:60px 0 0 200px;background:url(../img/bgFavicon.gif) no-repeat} .x .faviconPreview img{position:absolute} .x .faviconPreview .fn1{top:30px;left:12px} .x .faviconPreview .fn2{top:55px;left:68px} /* Mobile Icon Preview */ .x .mobiconPreview{position:relative;padding:252px 0 0 200px;background:url(../img/bgMobileTop.png) no-repeat} .x .mobiconPreview img{position:absolute;top:20px;left:10px} .x .mobiconPreview span{position:absolute;width:32px;text-align:center;top:52px;left:10px;color:#fff;font-size:9px} /* Text List */ .x .textList{border:1px solid #ddd !important;line-height:1.5em;height:18.5em;overflow:auto} .x .textList li{border:0;padding:.25em 1em;height:1.5em;white-space:nowrap;overflow:hidden} .x .textList li:nth-child(even){background:#eee} .x .textList li a{float:right} /* File Box */ .x .fileBox li{position:relative} .x .fileBox li img{max-width:100%} .x .fileBox .portlet ul{margin:1em;list-style:none;padding:0;border:0} .x .fileBox .portlet li{border-top:1px solid #ddd;border-bottom:0;padding:8px 0} .x .fileBox .side{position:absolute;top:8px;right:0} /* Messages */ .x .desc.error{color:#f00} .x .desc.success{color:#080} /* Icon Button */ .x a.iSetting{display:inline-block;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;vertical-align:middle;background:url(../img/iconSetting.gif) no-repeat} .x a.cMenu{display:inline-block;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;vertical-align:middle;background:url(../../../../common/img/icon.bubble.png) no-repeat} /* Responsive Layout */ @media only all and (max-width:860px){ .x .header h1{margin-left:.7em} .x .header .account{padding-right:1em} .x .body{padding:1em} .x .content{float:none;margin-left:0} .x .lnb{float:none;width:auto;margin:1em 0} .x .dashboard .portlet{float:none !important;width:auto !important;margin-right:0} .modal .fg, .wfsr .fg{width:auto} .x .easyNav .category{float:none;display:block;width:auto} .x .easyNav .filter{position:static} } @media only all and (max-width:640px){ .x .skipNav a{position:relative;width:auto;height:auto} .modal{position:absolute} } /* Legacy Code (Don't use it. It will be removed as soon as possible.) */ .x h3.xeAdmin, .x h4.xeAdmin{position:relative;border-bottom-style:solid;border-bottom-color:#ccc;zoom:1} .x h3.xeAdmin{border-bottom-width:4px;font-size:24px} .x h4.xeAdmin{border-bottom-width:3px;font-size:20px} .x h5.xeAdmin{border-bottom-width:2px;font-size:16px} .x h6.xeAdmin{border-bottom-width:1px;font-size:12px} .x .adminSearch{margin:1em 0} .x .adminSearch fieldset{border:1px solid #ccc} .x .localNavigation{padding:0;list-style:none} .x .localNavigation li{display:inline} .x .localNavigation li.on a{font-weight:bold;color:#333;text-decoration:none} .x .localNavigation li:before{content:"| "} .x .localNavigation li:first-child:before{content:""} .x .summary{margin:1em 0} .x .rowTable, .x .colTable, .x .crossTable{margin:1em 0;border:0;border-collapse:collapse;border-top:2px solid #ccc;width:100%} .x .rowTable caption, .x .colTable caption, .x .crossTable caption{font-weight:bold;text-align:left;line-height:22px;padding:5px 0} .x .rowTable caption:after, .x .colTable caption:after, .x .crossTable caption:after{content:"";display:block;clear:both} .x .rowTable caption a, .x .colTable caption a, .x .crossTable caption a{font-weight:normal} .x .rowTable caption em, .x .colTable caption em, .x .crossTable caption em{float:right;font-style:normal;font-weight:normal;color:#e00;margin-left:1em} .x .rowTable caption strong, .x .colTable caption strong, .x .crossTable caption strong{color:#e00} .x .rowTable caption .side, .x .colTable caption .side, .x .crossTable caption .side{float:right;font-weight:normal;margin-left:1em} .x .rowTable th,.rowTable td, .x .colTable th,.rowTable td, .x .crossTable th,.rowTable td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd;white-space:nowrap} .x .rowTable th, .x .colTable th, .x .crossTable th{background:#f8f8f8} .x .rowTable thead th, .x .colTable thead th, .x .crossTable thead th{border-bottom:1px solid #999} .x .rowTable tfoot td, .x .colTable tfoot td, .x .crossTable tfoot td{font-weight:bold;background:#f8f8f8} .x .rowTable.even tbody tr:nth-of-type(even) td, .x .colTable.even tbody tr:nth-of-type(even) td, .x .crossTable.even tbody tr:nth-of-type(even) td{background-color:#fafafa} .x .rowTable td>input[type=text], .x .colTable td>input[type=text], .x .crossTable td>input[type=text]{margin:-1px 0 -3px 0 !important;vertical-align:middle} .x .rowTable img, .x .colTable img, .x .crossTable img{vertical-align:middle} .x .rowTable .title, .x .colTable .title, .x .crossTable .title, .x .rowTable .text, .x .colTable .text, .x .crossTable .text{white-space:normal} .x .rowTable input[type=text], .x .colTable input[type=text], .x .crossTable input[type=text], .x .rowTable input[type=password], .x .colTable input[type=password], .x .crossTable input[type=password], .x .rowTable input[type=file], .x .colTable input[type=file], .x .crossTable input[type=file], .x .rowTable textarea, .x .colTable textarea, .x .crossTable textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:transparent} .x .rowTable input[type=text], .x .colTable input[type=text], .x .crossTable input[type=text], .x .rowTable input[type=password], .x .colTable input[type=password], .x .crossTable input[type=password], .x .rowTable input[type=file], .x .colTable input[type=file], .x .crossTable input[type=file]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px} .x .clear:after{content:"";display:block;clear:both} \ No newline at end of file From f128c5e41f96f2427eaea7890960c6da7a26990a Mon Sep 17 00:00:00 2001 From: chschy Date: Wed, 28 Sep 2011 01:53:52 +0000 Subject: [PATCH 0921/1372] modify submit on config git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9381 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/tpl/config.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/admin/tpl/config.html b/modules/admin/tpl/config.html index cb027dfd6..8126ff076 100644 --- a/modules/admin/tpl/config.html +++ b/modules/admin/tpl/config.html @@ -19,7 +19,7 @@ jQuery(function($){ - +

                                                        {$lang->title_genaral}

                                                        From 97dc164d9e96aca0c5b5a4daa1927bdf5109022e Mon Sep 17 00:00:00 2001 From: chschy Date: Wed, 28 Sep 2011 01:57:39 +0000 Subject: [PATCH 0922/1372] Add language on config git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9382 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/lang/lang.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/admin/lang/lang.xml b/modules/admin/lang/lang.xml index 98808a7d7..a7161d4cc 100644 --- a/modules/admin/lang/lang.xml +++ b/modules/admin/lang/lang.xml @@ -721,6 +721,10 @@ Lütfen son sürümü için indirme linkine tıklayınız.]]> + + + + From 4491ac2509615a00a3a37fdf60b2a1c1b8335bd5 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Wed, 28 Sep 2011 05:15:06 +0000 Subject: [PATCH 0923/1372] /member/tpl/images removed. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9383 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/member/tpl/images/icon_blog.gif | Bin 370 -> 0 bytes modules/member/tpl/images/icon_homepage.gif | Bin 170 -> 0 bytes modules/member/tpl/images/icon_management.gif | Bin 243 -> 0 bytes modules/member/tpl/images/icon_on.gif | Bin 1022 -> 0 bytes modules/member/tpl/images/icon_sendmail.gif | Bin 368 -> 0 bytes modules/member/tpl/images/icon_trace_comment.gif | Bin 169 -> 0 bytes .../member/tpl/images/icon_trace_document.gif | Bin 363 -> 0 bytes modules/member/tpl/images/icon_view_info.gif | Bin 408 -> 0 bytes modules/member/tpl/images/icon_view_written.gif | Bin 367 -> 0 bytes 9 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 modules/member/tpl/images/icon_blog.gif delete mode 100644 modules/member/tpl/images/icon_homepage.gif delete mode 100755 modules/member/tpl/images/icon_management.gif delete mode 100644 modules/member/tpl/images/icon_on.gif delete mode 100644 modules/member/tpl/images/icon_sendmail.gif delete mode 100755 modules/member/tpl/images/icon_trace_comment.gif delete mode 100755 modules/member/tpl/images/icon_trace_document.gif delete mode 100644 modules/member/tpl/images/icon_view_info.gif delete mode 100644 modules/member/tpl/images/icon_view_written.gif diff --git a/modules/member/tpl/images/icon_blog.gif b/modules/member/tpl/images/icon_blog.gif deleted file mode 100644 index 80f892e39d1a327a19b467fe0195ddf1ed3d9f3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 370 zcmZ?wbhEHb6krfwxT?YMcXdf_e#pEjTnX_i8P0eE#&snrs zjk8&US(atenl&sO%U3R0%()?tS5{Vdr!3PxCdn=hZV53y))S1U7=`$`^E6a1UA}U~ Hk--`Ofdh~l diff --git a/modules/member/tpl/images/icon_homepage.gif b/modules/member/tpl/images/icon_homepage.gif deleted file mode 100644 index 30df5113448ee95915ab2cce85c25a412c80868b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170 zcmZ?wbhEHb6krfw*v!rFe}-FrLCEUW)Bhit^!DwGzpG2~^TXf1eZ5kK;qTwS|G|I( z2`K(#VPs(7X3znNfy`iF2`@P5xq7dK|53|d@y7$X7V*4D=$hOqw&9eXUXFNCJI{9B zKiU%tID&LoI+qm9G>}m_;m|Ns!DRmN76*qHRcrk+zG}aXJLYvrg^MTu{r~m<-~Wr3k6yTR^x~Dn|NsB`_wUdD z|9{`UeSPZm?zeAW{Qv(yzaRuiG7t?Ef3h$#FbFc}fOLTDWMC~wQ0epD+4Dl!hWp8` zr&e}4PZ)MEPd)#~fo<;T#D)uQE%D5YGMuJ09q{>(Vl}rTWv5nTG7Yf+X!dSX%@1Z;hfnMUlit~pKLoDSKEN!ds6;xfbiVh}PUgz^HwF)iV61ykH+^CCzVBILjR3jP{uX@i9^2 z>A2r_d@0Sv!NDO@cjdCO6mbSfkC#4{v${T0YpN3gFei0?tk_s*j{< zjGAq97z$JqeR{ot(X_ET1z7&cXa}sL4Yjq6-0~OBsz+eynfwA`h{g8w%PD7nJqZKm zDLdY09(EThO;ypyYlrF zyD0n`a?H?kcOdoC>2zZM`DX!tme0emYHa6U>+cho+cXyG4t(ZUSGndVH|cg~Z1Gr| zJt)?1Q9P{_Zs=UoL*()Oyie@k(PR-QYuAVKN#5}^VVNJ_jo&H#Q7n&jsqc`CM7zJh zcnt#Oy|g$tS;+Q?*HTI0Cigv{g&hfeC~!R$nDrrmELiCgRW`M@-_!xE8M1h{8!yS=n=Us#^)8k(A&Eb;9d!M ug&?R17thtl&dbt5Z1MhEzw2Zt#WONOK9VlG{yb6I-7~zXa&dLR!v6rXxzQ>B diff --git a/modules/member/tpl/images/icon_sendmail.gif b/modules/member/tpl/images/icon_sendmail.gif deleted file mode 100644 index 370f8f2c096026126dcb5922a1c41d0bd7252751..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 368 zcmZ?wbhEHb6krfwxN6MMmZkCHX3y+qr~m){ccyEunCLgL!u;X+rZ>+PwWn!xoC+Ax_($(j+yLIR2{QLXs_rE_&dOT;f+CRV9 z|K!2rMLix}*}4zTHFOmjuAUmQxXZgEMfJsv{`NHWX?1qbZuWH-==BsD{QLj^_4E19 zZuGWgs(t@*YDtgB)2GkBem?Ub3>b(2ia%Kx85oQibUa{F%ugRf9OP~Jo;cGu}_-dDF!sga47duuaX*2D#2Ja9V{U%)<{fUMQQ;lX;PntV%p|P6LtVzq}F~}IR>1%J> lzC)k0z*tj5Oh8UoSA<1bmBnC>@u{=t&U#$Dmp(@R4mRR!#o&@x%Xr|DJ8$ z{Nu;hgE%O&FYXAD+ z!Na9X-@bjFUl8{5$M?yGhX28Ufo4GQCkrD3gCc_t$Oe#~7}z=vOepZs5i_3KQ)Kx- zgna>D2G^$wt8)(-1XwE=Cuf^YSy(2((NiTTS$;3SF~;Ge!!h;?sr$dz{EKj|6whLl zkeA|=l27L0XPr>T)h)#(@5~|^7A7w(UpH?Cqnt!r{qp)nv*o)Kq}Fvii7_(rG0Lx7 eF11jRS%^1(uJqv})172a$gDW+cGks_!5RR$&Vx7r diff --git a/modules/member/tpl/images/icon_view_info.gif b/modules/member/tpl/images/icon_view_info.gif deleted file mode 100644 index bce3adda2ae2f3bbd09798f6e88cd8dae9f7cb08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 408 zcmV;J0cZY4Nk%w1VGsZi0M$PL_4M-f_4NI%a%*c*#z_FRwWO;X0P*tfaB)}s{QQ=f zdhzk_|H6{_`TCHOcJJ@({;YHR`uX_v_iS)h`~3HyqKE(g{r>&^tE-mz`T1{fR{s9| z|Nj4#mUnM(RQ~?|{{R1Maaf$4gZcRPw6vd^orC`W{r>*`?(ONGpN9X{-T(ai{{Q;> z{rdd-_o%9qsjQcupNRgwi~p;1{rvv^mPY#d`J0`G{r~>^!ISv-^{gBK`1knj?d$*l z|NsC0A^8LW002J#EC2ui01yBW000KHz@KnPEDABNSgOLTh(x8*O$cj&PQI-6!i^w) zn9b+HE0-mbv!@qUbQC}mM#~5 Ce$=x7 diff --git a/modules/member/tpl/images/icon_view_written.gif b/modules/member/tpl/images/icon_view_written.gif deleted file mode 100644 index 540ed6b95655ad74550eefb84056923e5169613e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 367 zcmZ?wbhEHb6krfwxT?zV{=?f(AK$N8Gxh(GNd<-BKfZsRI<5Tw47X1oKde|a`S6i# zPoF;T>dO81?_YLyV19o1pFh8T{P_Cs-~Z(+Cl?e%OrBQ#_RY&LpFeKdGXM9V@87?E zUa+V=zaV6#48y6@yMO-p?(6H3Ul8{8?dzZ4fBy#q2C4$ZpDc_F45|z|AX7npVqohz zFsVTJmP9|(!~#u)R*!&7&xM1G82uW=5*9{z&(7dzJTODKKR;tH-wx*K{Lg1AWWFmG zNRN-bW}3#Opxh!?>@Cd8+TGmJD&x&26fED{*EUg7UZSb5f98~F%5pQDL?tB!Rwyi4 vA|os7#KglV!m?dqr-CfA%0^YCgNF{wvhUsRebR~hDD#O^C(mqjWUvMR4>*iC From 56fd1836f8c5f7ef9fa2fe01c34bfb0af6316f59 Mon Sep 17 00:00:00 2001 From: flyskyko Date: Wed, 28 Sep 2011 05:24:38 +0000 Subject: [PATCH 0924/1372] issue 160, fixed a bug related popup layout git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9384 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/module/module.admin.view.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/module/module.admin.view.php b/modules/module/module.admin.view.php index df86c4b13..e0fc47aa9 100644 --- a/modules/module/module.admin.view.php +++ b/modules/module/module.admin.view.php @@ -84,6 +84,7 @@ $security->encodeHTML('module_info...'); // Set the layout to be pop-up + $this->setLayoutPath('./common/tpl'); $this->setLayoutFile('popup_layout'); // Set a template file $this->setTemplateFile('module_info'); @@ -135,6 +136,7 @@ $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl, $columnList); Context::set('module_info', $module_info); // Set the layout to be pop-up + $this->setLayoutPath('./common/tpl'); $this->setLayoutFile('popup_layout'); // Set a template file $this->setTemplateFile('copy_module'); @@ -169,6 +171,7 @@ $security->encodeHTML('module_category...'); // Set the layout to be pop-up + $this->setLayoutPath('./common/tpl'); $this->setLayoutFile('popup_layout'); // Set a template file $this->setTemplateFile('module_setup'); @@ -190,6 +193,7 @@ $output = ModuleHandler::triggerCall('module.dispAdditionSetup', 'after', $content); Context::set('setup_content', $content); // Set the layout to be pop-up + $this->setLayoutPath('./common/tpl'); $this->setLayoutFile('popup_layout'); // Set a template file $this->setTemplateFile('module_addition_setup'); @@ -230,6 +234,7 @@ $security->encodeHTML('group_list..title'); // Set the layout to be pop-up + $this->setLayoutPath('./common/tpl'); $this->setLayoutFile('popup_layout'); // Set a template file $this->setTemplateFile('module_grant_setup'); From 44369f5bdbf93de764c57800d6422eb77c06d4df Mon Sep 17 00:00:00 2001 From: ovclas Date: Wed, 28 Sep 2011 05:41:49 +0000 Subject: [PATCH 0925/1372] issue 160 admin pagination bug fix in trash module git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9385 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/trash/tpl/trash_list.html | 52 ++++++++++++++++--------------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/modules/trash/tpl/trash_list.html b/modules/trash/tpl/trash_list.html index 962fd357c..01116c618 100644 --- a/modules/trash/tpl/trash_list.html +++ b/modules/trash/tpl/trash_list.html @@ -87,30 +87,32 @@ var no_text_comment = '{$lang->no_text_comment}';
                                                      From 3820d07df8004c94474ede60906bcfa41414d0ef Mon Sep 17 00:00:00 2001 From: ovclas Date: Wed, 28 Sep 2011 05:54:51 +0000 Subject: [PATCH 0926/1372] issue 160, fix a bug related integration comments search - by sinsy200 git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9386 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- .../integration_search/integration_search.model.php | 10 ++++++++-- modules/integration_search/integration_search.view.php | 7 ++++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/modules/integration_search/integration_search.model.php b/modules/integration_search/integration_search.model.php index 50539b82f..382e8a1d8 100644 --- a/modules/integration_search/integration_search.model.php +++ b/modules/integration_search/integration_search.model.php @@ -45,10 +45,16 @@ * @brief Comment Search **/ function getComments($target, $module_srls_list, $search_keyword, $page=1, $list_count = 20) { - if(is_array($module_srls_list)) $module_srls = implode(',',$module_srls_list); - else $module_srls = $module_srls_list; + if(is_array($module_srls_list)){ + if (count($module_srls_list) > 0) $module_srls = implode(',',$module_srls_list); + else $module_srls = 0; + } + else { + $module_srls = ($module_srls_list)?$module_srls_list:0; + } if($target == 'exclude') $args->exclude_module_srl = $module_srls; else $args->module_srl = $module_srls; + $args->page = $page; $args->list_count = $list_count; $args->page_count = 10; diff --git a/modules/integration_search/integration_search.view.php b/modules/integration_search/integration_search.view.php index bc53ac871..8b459d8d5 100644 --- a/modules/integration_search/integration_search.view.php +++ b/modules/integration_search/integration_search.view.php @@ -35,7 +35,12 @@ $target = $config->target; if(!$target) $target = 'include'; - $module_srl_list = explode(',',$config->target_module_srl); + + if (empty($config->target_module_srl)) + $module_srl_list = array(); + else + $module_srl_list = explode(',',$config->target_module_srl); + // Set a variable for search keyword $is_keyword = Context::get('is_keyword'); // Set page variables From ac83ac9d4ac6060cd759f644b4bf70e15607dad1 Mon Sep 17 00:00:00 2001 From: ovclas Date: Wed, 28 Sep 2011 06:04:30 +0000 Subject: [PATCH 0927/1372] add lang code git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9387 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/member/lang/lang.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/member/lang/lang.xml b/modules/member/lang/lang.xml index 25204e1fa..b74308e6e 100644 --- a/modules/member/lang/lang.xml +++ b/modules/member/lang/lang.xml @@ -2216,6 +2216,10 @@ Bạn có thể quản lý thành viên bằng cách tạo những nhóm mới, + + + + From 12212756c4dd4ee5ac9937ce48d731ec1dc9a7f1 Mon Sep 17 00:00:00 2001 From: flyskyko Date: Wed, 28 Sep 2011 06:44:07 +0000 Subject: [PATCH 0928/1372] issue 160, move "delete cache", "clean up session" from general settings to bottom of all admin pages git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9388 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/lang/lang.xml | 4 ++++ modules/admin/tpl/_spFooter.html | 17 +++++++++++++++++ modules/admin/tpl/config.html | 13 ------------- modules/admin/tpl/js/config.js | 2 ++ modules/session/tpl/js/session.js | 2 ++ 5 files changed, 25 insertions(+), 13 deletions(-) diff --git a/modules/admin/lang/lang.xml b/modules/admin/lang/lang.xml index a7161d4cc..0ec3e6f0c 100644 --- a/modules/admin/lang/lang.xml +++ b/modules/admin/lang/lang.xml @@ -579,6 +579,10 @@ Lütfen son sürümü için indirme linkine tıklayınız.]]> + + + + diff --git a/modules/admin/tpl/_spFooter.html b/modules/admin/tpl/_spFooter.html index 3c0952bf2..b2172d852 100644 --- a/modules/admin/tpl/_spFooter.html +++ b/modules/admin/tpl/_spFooter.html @@ -1,3 +1,16 @@ +
                                                      +

                                                      {$lang->subtitle_etc}

                                                      + +
                                                      + + + diff --git a/modules/admin/tpl/config.html b/modules/admin/tpl/config.html index 8126ff076..257a26c1b 100644 --- a/modules/admin/tpl/config.html +++ b/modules/admin/tpl/config.html @@ -237,19 +237,6 @@ jQuery(function($){ -
                                                      -

                                                      {$lang->subtitle_etc}

                                                      - -
                                                      diff --git a/modules/admin/tpl/js/config.js b/modules/admin/tpl/js/config.js index 26cd96ac1..1b4e7c397 100644 --- a/modules/admin/tpl/js/config.js +++ b/modules/admin/tpl/js/config.js @@ -116,8 +116,10 @@ function iconDeleteMessage(ret_obj){ } } function doRecompileCacheFile() { + if (!confirm(xe.lang.confirm_run)) return; var params = new Array(); exec_xml("admin","procAdminRecompileCacheFile", params, completeCacheMessage); + showWaitingFogLayer(); } function completeCacheMessage(ret_obj) { alert(ret_obj['message']); diff --git a/modules/session/tpl/js/session.js b/modules/session/tpl/js/session.js index 53c740e6a..a555502a4 100644 --- a/modules/session/tpl/js/session.js +++ b/modules/session/tpl/js/session.js @@ -1,7 +1,9 @@ function doClearSession() { + if (!confirm(xe.lang.confirm_run)) return; var response_tags = new Array('error','message','result'); var params = new Array(); exec_xml('session','procSessionAdminClear', params, completeClearSession, response_tags); + showWaitingFogLayer(); } function completeClearSession(ret_obj, response_tags) { From d986c7bf14946a26628741fbadbc4d538cd327e7 Mon Sep 17 00:00:00 2001 From: ovclas Date: Wed, 28 Sep 2011 07:08:31 +0000 Subject: [PATCH 0929/1372] fixed change "password1" to "password" rulset target name git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9389 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/member/ruleset/modifyPassword.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/member/ruleset/modifyPassword.xml b/modules/member/ruleset/modifyPassword.xml index ec847a6f1..e6af09b4c 100644 --- a/modules/member/ruleset/modifyPassword.xml +++ b/modules/member/ruleset/modifyPassword.xml @@ -4,7 +4,7 @@ - - + + From 8188720245b9a520c3164c12c2e89e592f4ae973 Mon Sep 17 00:00:00 2001 From: flyskyko Date: Wed, 28 Sep 2011 07:19:21 +0000 Subject: [PATCH 0930/1372] issue 160, changed error reporting level git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9390 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- config/config.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/config.inc.php b/config/config.inc.php index ef6ac4748..7c111d7ca 100644 --- a/config/config.inc.php +++ b/config/config.inc.php @@ -5,7 +5,7 @@ * @brief set the include of the class file and other environment configurations **/ - @error_reporting(E_ALL ^ E_NOTICE); + @error_reporting(E_ALL ^ E_NOTICE ^ E_DEPRECATED); if(!defined('__ZBXE__')) exit(); From cf73487272905e6ef60a5fcac7a3e9cf02df0b13 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Wed, 28 Sep 2011 07:23:28 +0000 Subject: [PATCH 0931/1372] cache & session refresh UI changed. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9391 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/tpl/_spFooter.html | 19 +++++-------------- modules/admin/tpl/css/admin.css | 5 ++++- modules/admin/tpl/css/admin.min.css | 2 +- 3 files changed, 10 insertions(+), 16 deletions(-) diff --git a/modules/admin/tpl/_spFooter.html b/modules/admin/tpl/_spFooter.html index b2172d852..b96b2f058 100644 --- a/modules/admin/tpl/_spFooter.html +++ b/modules/admin/tpl/_spFooter.html @@ -1,19 +1,10 @@ -
                                                      -

                                                      {$lang->subtitle_etc}

                                                      - -
                                                      +
                                                      @@ -25,7 +26,6 @@ jQuery(function($){

                                                      {$lang->subtitle_primary}

                                                        -
                                                      • {$lang->about_start_module}

                                                        @@ -62,6 +62,16 @@ jQuery(function($){

                                                      • +
                                                      • +

                                                        +

                                                        + +

                                                        +
                                                      • @@ -173,12 +183,17 @@ jQuery(function($){ {$lang->local_ip_address} : {$IP}

                                                      • -

                                                        +

                                                        [?]

                                                        +
                                                        +

                                                        {$lang->about_default_url}

                                                        +

                                                        -

                                                        {$lang->about_default_url}

                                                      • -

                                                        {$lang->use_ssl}

                                                        +

                                                        [?]

                                                        +
                                                        +

                                                        {$lang->about_use_ssl}

                                                        +

                                                        checked="checked" /> @@ -208,21 +223,30 @@ jQuery(function($){

                                                      • -

                                                        {$lang->about_use_sso}

                                                        +

                                                        [?]

                                                        +
                                                        +

                                                        {$lang->about_sso}

                                                        +

                                                        checked="checked" /> checked="checked" />

                                                      • -

                                                        {$lang->use_db_session}

                                                        +

                                                        [?]

                                                        +
                                                        +

                                                        {$lang->about_db_session}

                                                        +

                                                        checked="checked" /> checked="checked" />

                                                      • -

                                                        {$lang->qmail_compatibility}

                                                        +

                                                        [?]

                                                        +
                                                        +

                                                        {$lang->about_qmail_compatibility}

                                                        +

                                                        checked="checked" /> checked="checked" /> diff --git a/modules/install/lang/lang.xml b/modules/install/lang/lang.xml index cdb6e6c55..531603eb3 100644 --- a/modules/install/lang/lang.xml +++ b/modules/install/lang/lang.xml @@ -730,6 +730,18 @@ Veri dosyası 707 yetki kapsamı içinde olmalıdır.]]> Hãy CHMOD thành 707.]]> + + 가상 사이트를 사용할 때만 필요합니다.]]> + You will need this only if you are using virtual sites.]]> + 仮想サイトの機能を使用してない場合、設定する必要がありません。]]> + You will need this only if you are using virtual sites.]]> + 使用虛擬網站,這將會是很重要的功能。]]> + You will need this only if you are using virtual sites.]]> + You will need this only if you are using virtual sites.]]> + You will need this only if you are using virtual sites.]]> + Bu, size sadece sanal websiteler kullandığınız durumda lazım olacaktır.]]> + You will need this only if you are using virtual sites.]]> + @@ -877,4 +889,4 @@ Xin cảm ơn đã sử dụng XE!]]> - \ No newline at end of file + From 485b163319fd14bda99113c3d3e8702601b87781 Mon Sep 17 00:00:00 2001 From: devjin Date: Fri, 30 Sep 2011 05:51:00 +0000 Subject: [PATCH 0980/1372] issue 232 set lang code at "save" button git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9445 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/member/tpl/member_config.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/member/tpl/member_config.html b/modules/member/tpl/member_config.html index 9c59e9101..e342d6144 100644 --- a/modules/member/tpl/member_config.html +++ b/modules/member/tpl/member_config.html @@ -190,7 +190,7 @@

                                                      - +
                                                      \ No newline at end of file + From 05550891b254bb8d28d864c2dc64f42cfeb6e957 Mon Sep 17 00:00:00 2001 From: chschy Date: Fri, 30 Sep 2011 05:59:01 +0000 Subject: [PATCH 0981/1372] modify auto changed to favicon.ico or mobicon.png git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9446 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/lang/lang.xml | 20 ++++++++------------ modules/admin/tpl/config.html | 16 ++++++++-------- modules/install/install.admin.controller.php | 8 +++----- 3 files changed, 19 insertions(+), 25 deletions(-) diff --git a/modules/admin/lang/lang.xml b/modules/admin/lang/lang.xml index 2aa12dc13..887958f26 100644 --- a/modules/admin/lang/lang.xml +++ b/modules/admin/lang/lang.xml @@ -900,21 +900,21 @@ Lütfen son sürümü için indirme linkine tıklayınız.]]> If you are unable to easy install, PHP's 'safe_mode' must be changed 'On' ]]> - + - - favicon.ico 파일만 업로드 가능.]]> - favicon.ico file only.]]> + + *.ico 파일만 업로드 가능.]]> + *.ico file only.]]> - + - - mobicon.png 파일만 업로드 가능.]]> - mobicon.png file only.]]> + + *.png 파일만 업로드 가능.]]> + *.png file only.]]> @@ -932,10 +932,6 @@ Lütfen son sürümü için indirme linkine tıklayınız.]]> - - - - diff --git a/modules/admin/tpl/config.html b/modules/admin/tpl/config.html index 0250192f6..87e14ff9d 100644 --- a/modules/admin/tpl/config.html +++ b/modules/admin/tpl/config.html @@ -1,16 +1,16 @@ -

                                                      Theme

                                                      +

                                                      {$lang->menu_gnb_sub['theme']}

                                                      {$XE_VALIDATOR_ERROR}

                                                      -

                                                      Theme Setting

                                                      +

                                                      {$lang->theme_setting}

                                                      {$lang->theme_desc}

                                                      • @@ -34,7 +34,7 @@ $('#theme').data('themes', themes);
                                                          {@$current_theme = ($theme_info)?$theme_info->theme:'user_define'}
                                                        • - Thumbnail does not exist + {$lang->msg_thumbnail_not_exist} checked="checked" />
                                                            @@ -50,9 +50,9 @@ $('#theme').data('themes', themes);
                                                        • - By You + {$lang->by_you} checked="checked" /> - +
                                                          • · {$lang->description}: {$lang->no_selected_theme_desc}
                                                          @@ -62,14 +62,13 @@ $('#theme').data('themes', themes);
                                                      -

                                                      Skin Setting

                                                      {$lang->user_define_skin_select_desc}

                                                      • {$lang->selected_layout}

                                                        • - Thumbnail does not exist + {$lang->msg_thumbnail_not_exist} layout_srl == $current_layout)-->checked="checked" />
                                                            diff --git a/modules/editor/tpl/admin_index.html b/modules/editor/tpl/admin_index.html index 800cf7953..4a1c36510 100644 --- a/modules/editor/tpl/admin_index.html +++ b/modules/editor/tpl/admin_index.html @@ -100,7 +100,7 @@
                                                          - +
                                                      @@ -155,7 +155,7 @@
                                                      - +
                                                      diff --git a/modules/file/tpl/adminConfig.html b/modules/file/tpl/adminConfig.html index d1b6b2ff6..cb3974e12 100644 --- a/modules/file/tpl/adminConfig.html +++ b/modules/file/tpl/adminConfig.html @@ -41,6 +41,6 @@
                                                      - +
                                                      diff --git a/modules/module/tpl/module_langcode.html b/modules/module/tpl/module_langcode.html index 1e694fae5..cad69c167 100644 --- a/modules/module/tpl/module_langcode.html +++ b/modules/module/tpl/module_langcode.html @@ -83,6 +83,6 @@ - + diff --git a/modules/spamfilter/tpl/index.html b/modules/spamfilter/tpl/index.html index dfe4b71c8..4c57e9324 100644 --- a/modules/spamfilter/tpl/index.html +++ b/modules/spamfilter/tpl/index.html @@ -34,7 +34,7 @@
                                                      - +
                                                      From e3c8b1e81c60a3af2b44ed394f16101daf6f7db8 Mon Sep 17 00:00:00 2001 From: chschy Date: Wed, 5 Oct 2011 06:30:50 +0000 Subject: [PATCH 1023/1372] issue 341, Modify language in admin setup git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9491 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/lang/lang.xml | 4 ++++ modules/admin/tpl/admin_setup.html | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/modules/admin/lang/lang.xml b/modules/admin/lang/lang.xml index 3b35a8142..9d20fd85d 100644 --- a/modules/admin/lang/lang.xml +++ b/modules/admin/lang/lang.xml @@ -1028,4 +1028,8 @@ Lütfen son sürümü için indirme linkine tıklayınız.]]> + + + + diff --git a/modules/admin/tpl/admin_setup.html b/modules/admin/tpl/admin_setup.html index 4771c6849..48e7f21b3 100644 --- a/modules/admin/tpl/admin_setup.html +++ b/modules/admin/tpl/admin_setup.html @@ -36,7 +36,7 @@
                                                      -

                                                      {$lang->menu_gnb_sub['adminMenuSetup']}

                                                      +

                                                      {$lang->admin_menu_setup}

                                                      • From f0a9bfa02fb3d4964069a204568c026e525f1992 Mon Sep 17 00:00:00 2001 From: flyskyko Date: Wed, 5 Oct 2011 07:42:31 +0000 Subject: [PATCH 1024/1372] issue 332, fixed a bug related extra variable ordering git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9492 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/document/document.admin.controller.php | 8 ++++++++ modules/document/tpl/extra_keys.html | 5 ++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/modules/document/document.admin.controller.php b/modules/document/document.admin.controller.php index d17d9e30b..0efa86645 100644 --- a/modules/document/document.admin.controller.php +++ b/modules/document/document.admin.controller.php @@ -453,6 +453,14 @@ if($type == 'up') $new_idx = $var_idx-1; else $new_idx = $var_idx+1; if($new_idx<1) return new Object(-1,'msg_invalid_request'); + + $args->module_srl = $module_srl; + $args->var_idx = $new_idx; + $output = executeQuery('document.getDocumentExtraKeys', $args); + if (!$output->toBool()) return $output; + if (!$output->data) return new Object(-1, 'msg_invalid_request'); + unset($args); + // update immediately if there is no idx to change if(!$extra_keys[$new_idx]) { $args->module_srl = $module_srl; diff --git a/modules/document/tpl/extra_keys.html b/modules/document/tpl/extra_keys.html index f2b86a361..55c6aafe0 100644 --- a/modules/document/tpl/extra_keys.html +++ b/modules/document/tpl/extra_keys.html @@ -1,7 +1,6 @@ - {@ $selected_var = $extra_keys[$selected_var_idx] } @@ -97,8 +96,8 @@
                                                      {$lang->is_required}N {$lang->search_target}N - {$lang->cmd_modify} - {$lang->cmd_modify} + {$lang->cmd_move_up} + {$lang->cmd_move_down} {$lang->cmd_modify} {$lang->cmd_delete}
                                                       
                                                       
                                                       
                                                       
                                                      '."\n".'
                                                      {$vvv}
                                                      CD
                                                      ', + 'vvvls&&count($__Context->vvvls))foreach($__Context->vvvls as $__Context->vvv){ ?>'."\n".'
                                                      vvv ?>
                                                      CD
                                                      ' + ), ); } From fb4b591579bcac1627f191f1ba07e187521afec7 Mon Sep 17 00:00:00 2001 From: taggon Date: Tue, 11 Oct 2011 10:13:26 +0000 Subject: [PATCH 1120/1372] issue 456 : Fixed a bug for selecting date git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9590 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/counter/tpl/index.html | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/modules/counter/tpl/index.html b/modules/counter/tpl/index.html index ab57eaac5..25ae29d7e 100644 --- a/modules/counter/tpl/index.html +++ b/modules/counter/tpl/index.html @@ -26,9 +26,10 @@ (function($){ $(function(){ var option = { - changeMonth: true, - changeYear: true, - gotoCurrent: false + changeMonth: true + ,changeYear: true + ,gotoCurrent: false + ,dateFormat:'yy-mm-dd' ,yearRange:'-100:+10' ,showOn:"button" ,buttonImage:"./modules/counter/tpl/images/buttonCalendar.gif" @@ -120,4 +121,4 @@
                                                      - \ No newline at end of file + From af872e66ec3755b6757d673807a206591619ca77 Mon Sep 17 00:00:00 2001 From: ucorina Date: Tue, 11 Oct 2011 14:49:44 +0000 Subject: [PATCH 1121/1372] Issue 366 - Issue about update from 1.4.5.x to 1.5.0.x using easyinstall git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9591 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/db/DB.class.php | 4 +- classes/xml/XmlQueryParser.150.class.php | 82 ++++ classes/xml/XmlQueryParser.class.php | 586 ++++++++++++++++++++--- 3 files changed, 607 insertions(+), 65 deletions(-) create mode 100644 classes/xml/XmlQueryParser.150.class.php diff --git a/classes/db/DB.class.php b/classes/db/DB.class.php index 590ff04b7..26b05952b 100644 --- a/classes/db/DB.class.php +++ b/classes/db/DB.class.php @@ -388,8 +388,8 @@ else $cache_time = -1; // if there is no cache file or is not new, find original xml query file and parse it - if($cache_time < filemtime($xml_file) || $cache_time < filemtime(_XE_PATH_.'classes/db/DB.class.php') || $cache_time < filemtime(_XE_PATH_.'classes/xml/XmlQueryParser.class.php')) { - require_once(_XE_PATH_.'classes/xml/XmlQueryParser.class.php'); + if($cache_time < filemtime($xml_file) || $cache_time < filemtime(_XE_PATH_.'classes/db/DB.class.php') || $cache_time < filemtime(_XE_PATH_.'classes/xml/XmlQueryParser.150.class.php')) { + require_once(_XE_PATH_.'classes/xml/XmlQueryParser.150.class.php'); $oParser = new XmlQueryParser(); $oParser->parse($query_id, $xml_file, $cache_file); } diff --git a/classes/xml/XmlQueryParser.150.class.php b/classes/xml/XmlQueryParser.150.class.php new file mode 100644 index 000000000..f42920447 --- /dev/null +++ b/classes/xml/XmlQueryParser.150.class.php @@ -0,0 +1,82 @@ +getXmlFileContent($xml_file); + + // insert, update, delete, select action + $action = strtolower($xml_obj->query->attrs->action); + if(!$action) return; + + $parser = new QueryParser($xml_obj->query); + + FileHandler::writeFile($cache_file, $parser->toString()); + } + + function getXmlFileContent($xml_file){ + $buff = FileHandler::readFile($xml_file); + $xml_obj = parent::parse($buff); + if(!$xml_obj) return; + unset($buff); + return $xml_obj; + } + } +?> diff --git a/classes/xml/XmlQueryParser.class.php b/classes/xml/XmlQueryParser.class.php index f42920447..cd474162e 100644 --- a/classes/xml/XmlQueryParser.class.php +++ b/classes/xml/XmlQueryParser.class.php @@ -1,82 +1,542 @@ getXmlFileContent($xml_file); - - // insert, update, delete, select action - $action = strtolower($xml_obj->query->attrs->action); - if(!$action) return; - - $parser = new QueryParser($xml_obj->query); - - FileHandler::writeFile($cache_file, $parser->toString()); - } - - function getXmlFileContent($xml_file){ + // query xml 파일을 찾아서 파싱, 결과가 없으면 return $buff = FileHandler::readFile($xml_file); $xml_obj = parent::parse($buff); if(!$xml_obj) return; unset($buff); - return $xml_obj; + + $id_args = explode('.', $query_id); + if(count($id_args)==2) { + $target = 'modules'; + $module = $id_args[0]; + $id = $id_args[1]; + } elseif(count($id_args)==3) { + $target = $id_args[0]; + if(!in_array($target, array('modules','addons','widgets'))) return; + $module = $id_args[1]; + $id = $id_args[2]; + } + + // insert, update, delete, select등의 action + $action = strtolower($xml_obj->query->attrs->action); + if(!$action) return; + + // 테이블 정리 (배열코드로 변환) + $tables = $xml_obj->query->tables->table; + $output->left_tables = array(); + + $left_conditions = array(); + + if(!$tables) return; + if(!is_array($tables)) $tables = array($tables); + foreach($tables as $key => $val) { + + // 테이블과 alias의 이름을 구함 + $table_name = $val->attrs->name; + $alias = $val->attrs->alias; + if(!$alias) $alias = $table_name; + + $output->tables[$alias] = $table_name; + + if(in_array($val->attrs->type,array('left join','left outer join','right join','right outer join')) && count($val->conditions)){ + $output->left_tables[$alias] = $val->attrs->type; + $left_conditions[$alias] = $val->conditions; + } + + // 테이블을 찾아서 컬럼의 속성을 구함 + $table_file = sprintf('%s%s/%s/schemas/%s.xml', _XE_PATH_, 'modules', $module, $table_name); + if(!file_exists($table_file)) { + $searched_list = FileHandler::readDir(_XE_PATH_.'modules'); + $searched_count = count($searched_list); + for($i=0;$i<$searched_count;$i++) { + $table_file = sprintf('%s%s/%s/schemas/%s.xml', _XE_PATH_, 'modules', $searched_list[$i], $table_name); + if(file_exists($table_file)) break; + } + } + + if(file_exists($table_file)) { + $table_xml = FileHandler::readFile($table_file); + $table_obj = parent::parse($table_xml); + if($table_obj->table) { + if(isset($table_obj->table->column) && !is_array($table_obj->table->column)) + { + $table_obj->table->column = array($table_obj->table->column); + } + + foreach($table_obj->table->column as $k => $v) { + $buff .= sprintf('$output->column_type["%s"] = "%s";%s', $v->attrs->name, $v->attrs->type, "\n"); + } + } + } + } + + + // 컬럼 정리 + $columns = $xml_obj->query->columns->column; + $out = $this->_setColumn($columns); + $output->columns = $out->columns; + + $conditions = $xml_obj->query->conditions; + $out = $this->_setConditions($conditions); + $output->conditions = $out->conditions; + + foreach($output->left_tables as $key => $val){ + if($left_conditions[$key]){ + $out = $this->_setConditions($left_conditions[$key]); + $output->left_conditions[$key] = $out->conditions; + } + } + + $group_list = $xml_obj->query->groups->group; + $out = $this->_setGroup($group_list); + $output->groups = $out->groups; + + // 네비게이션 정리 + $out = $this->_setNavigation($xml_obj); + $output->order = $out->order; + $output->list_count = $out->list_count; + $output->page_count = $out->page_count; + $output->page = $out->page; + + $column_count = count($output->columns); + $condition_count = count($output->conditions); + + $buff .= '$output->tables = array( '; + foreach($output->tables as $key => $val) { + if(!array_key_exists($key,$output->left_tables)){ + $buff .= sprintf('"%s"=>"%s",', $key, $val); + } + } + $buff .= ' );'."\n"; + + // php script 생성 + $buff .= '$output->_tables = array( '; + foreach($output->tables as $key => $val) { + $buff .= sprintf('"%s"=>"%s",', $key, $val); + } + $buff .= ' );'."\n"; + + if(count($output->left_tables)){ + $buff .= '$output->left_tables = array( '; + foreach($output->left_tables as $key => $val) { + $buff .= sprintf('"%s"=>"%s",', $key, $val); + } + $buff .= ' );'."\n"; + } + + // column 정리 + if($column_count) { + $buff .= '$output->columns = array ( '; + $buff .= $this->_getColumn($output->columns); + $buff .= ' );'."\n"; + } + + // conditions 정리 + if($condition_count) { + $buff .= '$output->conditions = array ( '; + $buff .= $this->_getConditions($output->conditions); + $buff .= ' );'."\n"; + } + + // conditions 정리 + if(count($output->left_conditions)) { + $buff .= '$output->left_conditions = array ( '; + foreach($output->left_conditions as $key => $val){ + $buff .= "'{$key}' => array ( "; + $buff .= $this->_getConditions($val); + $buff .= "),\n"; + } + $buff .= ' );'."\n"; + } + + // args 변수 확인 + $arg_list = $this->getArguments(); + if($arg_list) + { + foreach($arg_list as $arg) + { + $pre_buff .= 'if(is_object($args->'.$arg.')){ $args->'.$arg.' = array_values(get_method_vars($args->'.$arg.')); }'. "\n"; + $pre_buff .= 'if(is_array($args->'.$arg.') && count($args->'.$arg.')==0){ unset($args->'.$arg.'); };'."\n"; + } + } + + // order 정리 + if($output->order) { + $buff .= '$output->order = array('; + foreach($output->order as $key => $val) { + $buff .= sprintf('array($args->%s?$args->%s:"%s",in_array($args->%s,array("asc","desc"))?$args->%s:("%s"?"%s":"asc")),', $val->var, $val->var, $val->default, $val->order, $val->order, $val->order, $val->order); + } + $buff .= ');'."\n"; + } + + // list_count 정리 + if($output->list_count) { + $buff .= sprintf('$output->list_count = array("var"=>"%s", "value"=>$args->%s?$args->%s:"%s");%s', $output->list_count->var, $output->list_count->var, $output->list_count->var, $output->list_count->default,"\n"); + } + + // page_count 정리 + if($output->page_count) { + $buff .= sprintf('$output->page_count = array("var"=>"%s", "value"=>$args->%s?$args->%s:"%s");%s', $output->page_count->var, $output->page_count->var, $output->page_count->var, $output->list_count->default,"\n"); + } + + // page 정리 + if($output->page) { + $buff .= sprintf('$output->page = array("var"=>"%s", "value"=>$args->%s?$args->%s:"%s");%s', $output->page->var, $output->page->var, $output->page->var, $output->list->default,"\n"); + } + + // group by 정리 + if($output->groups) { + $buff .= sprintf('$output->groups = array("%s");%s', implode('","',$output->groups),"\n"); + } + + // minlength check + if(count($minlength_list)) { + foreach($minlength_list as $key => $val) { + $pre_buff .= 'if($args->'.$key.'&&strlen($args->'.$key.')<'.$val.') return new Object(-1, sprintf($lang->filter->outofrange, $lang->'.$key.'?$lang->'.$key.':\''.$key.'\'));'."\n"; + } + } + + // maxlength check + if(count($maxlength_list)) { + foreach($maxlength_list as $key => $val) { + $pre_buff .= 'if($args->'.$key.'&&strlen($args->'.$key.')>'.$val.') return new Object(-1, sprintf($lang->filter->outofrange, $lang->'.$key.'?$lang->'.$key.':\''.$key.'\'));'."\n"; + } + } + + // filter check + if(count($this->filter_list)) { + foreach($this->filter_list as $key => $val) { + $pre_buff .= sprintf('if(isset($args->%s)) { unset($_output); $_output = $this->checkFilter("%s",$args->%s,"%s"); if(!$_output->toBool()) return $_output; } %s',$val->var, $val->var,$val->var,$val->filter,"\n"); + } + } + + // default check + if(count($this->default_list)) { + foreach($this->default_list as $key => $val) { + $pre_buff .= 'if(!isset($args->'.$key.')) $args->'.$key.' = '.$val.';'."\n"; + } + } + + // not null check + if(count($this->notnull_list)) { + foreach($this->notnull_list as $key => $val) { + $pre_buff .= 'if(!isset($args->'.$val.')) return new Object(-1, sprintf($lang->filter->isnull, $lang->'.$val.'?$lang->'.$val.':\''.$val.'\'));'."\n"; + } + } + + $buff = "query_id = "%s";%s', $query_id, "\n") + . sprintf('$output->action = "%s";%s', $action, "\n") + . $pre_buff + . $buff + . 'return $output; ?>'; + + // 저장 + FileHandler::writeFile($cache_file, $buff); + } + + /** + * @brief transfer given column information to object->columns + * @param[in] column information + * @result Returns $object + */ + + function _setColumn($columns){ + if(!$columns) { + $output->column[] = array("*" => "*"); + } else { + if(!is_array($columns)) $columns = array($columns); + foreach($columns as $key => $val) { + $name = $val->attrs->name; + /* + if(strpos('.',$name)===false && count($output->tables)==1) { + $tmp = array_values($output->tables); + $name = sprintf('%s.%s', $tmp[0], $val->attrs->name); + } + */ + + $output->columns[] = array( + "name" => $name, + "var" => $val->attrs->var, + "default" => $val->attrs->default, + "notnull" => $val->attrs->notnull, + "filter" => $val->attrs->filter, + "minlength" => $val->attrs->minlength, + "maxlength" => $val->attrs->maxlength, + "alias" => $val->attrs->alias, + "click_count" => $val->attrs->click_count, + ); + } + } + return $output; + } + + /** + * @brief transfer condition information to $object->conditions + * @param[in] SQL condition information + * @result Returns $output + */ + function _setConditions($conditions){ + // 조건절 정리 + + $condition = $conditions->condition; + if($condition) { + $obj->condition = $condition; + unset($condition); + $condition = array($obj); + } + $condition_group = $conditions->group; + if($condition_group && !is_array($condition_group)) $condition_group = array($condition_group); + + if($condition && $condition_group) $cond = array_merge($condition, $condition_group); + elseif($condition_group) $cond = $condition_group; + else $cond = $condition; + + if($cond) { + foreach($cond as $key => $val) { + unset($cond_output); + + if($val->attrs->pipe) $cond_output->pipe = $val->attrs->pipe; + else $cond_output->pipe = null; + + if(!$val->condition) continue; + if(!is_array($val->condition)) $val->condition = array($val->condition); + + foreach($val->condition as $k => $v) { + $obj = $v->attrs; + if(!$obj->alias) $obj->alias = $obj->column; + $cond_output->condition[] = $obj; + } + + $output->conditions[] = $cond_output; + } + } + return $output; + } + + /** + * @brief transfer condition information to $object->groups + * @param[in] SQL group information + * @result Returns $output + */ + function _setGroup($group_list){ + // group 정리 + + if($group_list) { + if(!is_array($group_list)) $group_list = array($group_list); + for($i=0;$iattrs->column); + if(!$column) continue; + $group_column_list[] = $column; + } + if(count($group_column_list)) $output->groups = $group_column_list; + } + return $output; + } + + + /** + * @brief transfer pagnation information to $output + * @param[in] $xml_obj xml object containing Navigation information + * @result Returns $output + */ + function _setNavigation($xml_obj){ + $navigation = $xml_obj->query->navigation; + if($navigation) { + $order = $navigation->index; + if($order) { + if(!is_array($order)) $order = array($order); + foreach($order as $order_info) { + $output->order[] = $order_info->attrs; + } + } + + $list_count = $navigation->list_count->attrs; + $output->list_count = $list_count; + + $page_count = $navigation->page_count->attrs; + $output->page_count = $page_count; + + $page = $navigation->page->attrs; + $output->page = $page ; + } + return $output; + } + + /** + * @brief retrieve column information from $output->colums to generate corresponding php code + * @param[in] $column + * @remarks the name of this method is misleading. + * @result Returns string buffer containing php code + */ + function _getColumn($columns){ + $buff = ''; + $str = ''; + $print_vars = array(); + + foreach($columns as $key => $val) { + $str = 'array("name"=>"%s","alias"=>"%s"'; + $print_vars = array(); + $print_vars[] = $val['name']; + $print_vars[] = $val['alias']; + + $val['default'] = $this->getDefault($val['name'], $val['default']); + if($val['var'] && strpos($val['var'],'.')===false) { + + if($val['default']){ + $str .= ',"value"=>$args->%s?$args->%s:%s'; + $print_vars[] = $val['var']; + $print_vars[] = $val['var']; + $print_vars[] = $val['default']; + }else{ + $str .= ',"value"=>$args->%s'; + $print_vars[] = $val['var']; + } + + } else { + if($val['default']){ + $str .= ',"value"=>%s'; + $print_vars[] = $val['default']; + } + } + + if($val['click_count']){ + $str .= ',"click_count"=>$args->%s'; + $print_vars[] = $val['click_count']; + } + + $str .= '),%s'; + $print_vars[] = "\n"; + + $buff .= vsprintf($str, $print_vars); + } + return $buff; + } + + /** + * @brief retrieve condition information from $output->condition to generate corresponding php code + * @param[in] $conditions array containing Query conditions + * @remarks the name of this method is misleading. + * @return Returns string buffer containing php code + */ + function _getConditions($conditions){ + $buff = ''; + foreach($conditions as $key => $val) { + $buff .= sprintf('array("pipe"=>"%s",%s"condition"=>array(', $val->pipe,"\n"); + foreach($val->condition as $k => $v) { + $v->default = $this->getDefault($v->column, $v->default); + if($v->var) { + if(strpos($v->var,".")===false) { + if($v->default) $this->default_list[$v->var] = $v->default; + if($v->filter) $this->filter_list[] = $v; + if($v->notnull) $this->notnull_list[] = $v->var; + if($v->default) $buff .= sprintf('array("column"=>"%s", "value"=>$args->%s?$args->%s:%s,"pipe"=>"%s","operation"=>"%s",),%s', $v->column, $v->var, $v->var, $v->default, $v->pipe, $v->operation, "\n"); + else $buff .= sprintf('array("column"=>"%s", "value"=>$args->%s,"pipe"=>"%s","operation"=>"%s",),%s', $v->column, $v->var, $v->pipe, $v->operation, "\n"); + + $this->addArguments($v->var); + } else { + $buff .= sprintf('array("column"=>"%s", "value"=>"%s","pipe"=>"%s","operation"=>"%s",),%s', $v->column, $v->var, $v->pipe, $v->operation, "\n"); + } + } else { + if($v->default) $buff .= sprintf('array("column"=>"%s", "value"=>%s,"pipe"=>"%s","operation"=>"%s",),%s', $v->column, $v->default ,$v->pipe, $v->operation,"\n"); + else $buff .= sprintf('array("column"=>"%s", "pipe"=>"%s","operation"=>"%s",),%s', $v->column, $v->pipe, $v->operation,"\n"); + } + } + $buff .= ')),'."\n"; + } + return $buff; + } + + function addArguments($args_name) + { + $this->args[] = $args_name; + } + + function getArguments() + { + return $this->args; + } + + /** + * @brief returns predefined default values correspoding to given parameters + * @param[in] $name + * @param[in] $value + * @return Returns a default value for specified field + */ + function getDefault($name, $value) { + $db_info = Context::getDBInfo (); + if(!isset($value)) return; + $str_pos = strpos($value, '('); + if($str_pos===false) return '"'.$value.'"'; + + $func_name = substr($value, 0, $str_pos); + $args = substr($value, $str_pos+1, strlen($value)-1); + + switch($func_name) { + case 'ipaddress' : + $val = '$_SERVER[\'REMOTE_ADDR\']'; + break; + case 'unixtime' : + $val = 'time()'; + break; + case 'curdate' : + $val = 'date("YmdHis")'; + break; + case 'sequence' : + $val = '$this->getNextSequence()'; + break; + case 'plus' : + $args = abs($args); + if ($db_info->db_type == 'cubrid') { + $val = sprintf ('"\\"%s\\"+%d"', $name, $args); + } else { + $val = sprintf('"%s+%d"', $name, $args); + } + break; + case 'minus' : + $args = abs($args); + if ($db_info->db_type == 'cubrid') { + $val = sprintf ('"\\"%s\\"-%d"', $name, $args); + } else { + $val = sprintf('"%s-%d"', $name, $args); + } + break; + case 'multiply' : + $args = intval($args); + if ($db_info->db_type == 'cubrid') { + $val = sprintf ('"\\"%s\\"*%d"', $name, $args); + } else { + $val = sprintf('"%s*%d"', $name, $args); + } + break; + } + + return $val; } } ?> From 2393eb6d0024b9b78ed00a7058ad4ec1e96348bb Mon Sep 17 00:00:00 2001 From: ucorina Date: Tue, 11 Oct 2011 16:16:58 +0000 Subject: [PATCH 1122/1372] Fixed cache bug - newest comment list was not updated after deleting a comment. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9592 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/comment/comment.controller.php | 4 ---- modules/comment/comment.model.php | 3 ++- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/modules/comment/comment.controller.php b/modules/comment/comment.controller.php index e1e9a12b0..6fea08053 100644 --- a/modules/comment/comment.controller.php +++ b/modules/comment/comment.controller.php @@ -244,8 +244,6 @@ $oCacheHandler = &CacheHandler::getInstance('object'); if($oCacheHandler->isSupport()) { - $cache_key_newest = 'object_newest_comment_list:'.$obj->module_srl; - $oCacheHandler->delete($cache_key_newest); $oCacheHandler->invalidateGroupKey('commentList'); } return $output; @@ -328,8 +326,6 @@ $oCacheHandler = &CacheHandler::getInstance('object'); if($oCacheHandler->isSupport()) { - $cache_key_newest = 'object_newest_comment_list:'.$obj->module_srl; - $oCacheHandler->delete($cache_key_newest); $oCacheHandler->invalidateGroupKey('commentList'); } return $output; diff --git a/modules/comment/comment.model.php b/modules/comment/comment.model.php index 37210d919..940d9cd5d 100644 --- a/modules/comment/comment.model.php +++ b/modules/comment/comment.model.php @@ -189,7 +189,8 @@ // cache controll $oCacheHandler = &CacheHandler::getInstance('object'); if($oCacheHandler->isSupport()){ - $cache_key = 'object_newest_comment_list:'.$obj->module_srl; + $object_key = 'object_newest_comment_list:'.$obj->module_srl; + $cache_key = $oCacheHandler->getGroupKey('commentList', $object_key); $output = $oCacheHandler->get($cache_key); } if(!$output){ From d1c31a6134e204620cd3ebbb373ae41e39287f44 Mon Sep 17 00:00:00 2001 From: ovclas Date: Wed, 12 Oct 2011 01:45:44 +0000 Subject: [PATCH 1123/1372] issue 389 when secret document modified, document status change to PUBLIC this bug fixed git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9594 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/document/document.controller.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/document/document.controller.php b/modules/document/document.controller.php index 075fbec1c..a82d89e1c 100644 --- a/modules/document/document.controller.php +++ b/modules/document/document.controller.php @@ -254,8 +254,10 @@ class documentController extends document { **/ function updateDocument($source_obj, $obj) { if(!$source_obj->document_srl || !$obj->document_srl) return new Object(-1,'msg_invalied_request'); + if(!$obj->status && $obj->is_secret == 'Y') $obj->status = 'SECRET'; + if(!$obj->status) $obj->status = 'PUBLIC'; + // Call a trigger (before) - if(!$obj->status) $obj->status = $source_obj->status; $output = ModuleHandler::triggerCall('document.updateDocument', 'before', $obj); if(!$output->toBool()) return $output; From 7260b45c1a167166504fc3125b1ab311f12f21af Mon Sep 17 00:00:00 2001 From: devjin Date: Wed, 12 Oct 2011 02:39:10 +0000 Subject: [PATCH 1124/1372] issue 464 fixed comment editor error git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9595 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/document/document.item.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/document/document.item.php b/modules/document/document.item.php index 7b8cdef96..92b3608aa 100644 --- a/modules/document/document.item.php +++ b/modules/document/document.item.php @@ -703,10 +703,10 @@ **/ function isEnableComment() { // Return false if not authorized, if a secret document, if the document is set not to allow any comment - // old version allowed admin(isGranted() method use), but admin not allow comment below condition - if( $this->isGranted() && $this->allowComment() ) return true; + if (!$this->allowComment()) return false; + if(!$this->isGranted() && $this->isSecret()) return false; - return false; + return true; } /** From 462d782b38d1e79e0cd2ba11663ec5a6e0630fb4 Mon Sep 17 00:00:00 2001 From: devjin Date: Wed, 12 Oct 2011 04:28:08 +0000 Subject: [PATCH 1125/1372] issue 453 remove signature field in signup form git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9596 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/member/skins/default/signup_form.html | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/member/skins/default/signup_form.html b/modules/member/skins/default/signup_form.html index d781ce2cb..3b69f20c8 100644 --- a/modules/member/skins/default/signup_form.html +++ b/modules/member/skins/default/signup_form.html @@ -39,10 +39,9 @@

                                                      -
                                                    • +
                                                    • {$formTag->title}

                                                      -
                                                      {$formTag->inputTag}
                                                      -
                                                      {$editor}
                                                      +
                                                      {$formTag->inputTag}
                                                    • {$lang->allow_mailing}

                                                      From 9993c2ff3ac88d67b5cd862f674596069974c394 Mon Sep 17 00:00:00 2001 From: taggon Date: Wed, 12 Oct 2011 04:38:49 +0000 Subject: [PATCH 1126/1372] Modify language variables git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9597 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/lang/lang.xml | 14 -------------- modules/comment/tpl/comment_list.html | 6 +++--- modules/document/tpl/declared_list.html | 6 +++--- modules/document/tpl/document_list.html | 6 +++--- 4 files changed, 9 insertions(+), 23 deletions(-) diff --git a/modules/admin/lang/lang.xml b/modules/admin/lang/lang.xml index 9d823d0ce..15b8da74c 100644 --- a/modules/admin/lang/lang.xml +++ b/modules/admin/lang/lang.xml @@ -430,20 +430,6 @@ Lütfen son sürümü için indirme linkine tıklayınız.]]> - - - - - - - - - - - - - - diff --git a/modules/comment/tpl/comment_list.html b/modules/comment/tpl/comment_list.html index 90259fbeb..3e18130a1 100644 --- a/modules/comment/tpl/comment_list.html +++ b/modules/comment/tpl/comment_list.html @@ -31,7 +31,7 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}';
                                                    • {$lang->comment}{$lang->author}{$lang->writer} {$lang->cmd_vote}(+/-) {$lang->date} {$lang->ipaddress}
                                                      {$lang->comment}{$lang->author}{$lang->writer} {$lang->cmd_vote}(+/-) {$lang->date} {$lang->ipaddress}
                                                      {$lang->comment}{$lang->author}{$lang->writer} {$lang->status}
                                                      {$lang->title}{$lang->author}{$lang->writer} {$lang->readed_count} {$lang->cmd_vote}(+/-) {$lang->date}
                                                      {$lang->title}{$lang->author}{$lang->writer} {$lang->readed_count} {$lang->cmd_vote}(+/-) {$lang->date}
                                                      {$lang->title}{$lang->author}{$lang->writer} {$lang->status}
                                                      {$lang->title}{$lang->author}{$lang->writer} {$lang->readed_count} {$lang->cmd_vote}(+/-) {$lang->date}
                                                      {$lang->title}{$lang->author}{$lang->writer} {$lang->readed_count} {$lang->cmd_vote}(+/-) {$lang->date}
                                                      {$lang->title}{$lang->author}{$lang->writer} {$lang->status}
                                                      {@$member_info = get_object_vars($member_info)} {@ $member_info['group_list'] = implode(', ', $member_info['group_list'])} From eb34f3c566dccadaf26818c5b9e28a116321fe68 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Mon, 17 Oct 2011 08:53:22 +0000 Subject: [PATCH 1191/1372] .wfsr_fog layer height display bug fix. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9665 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/css/xe.css | 2 +- common/css/xe.min.css | 2 +- common/js/xe.js | 2 ++ common/js/xe.min.js | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/common/css/xe.css b/common/css/xe.css index 2796fae98..023d9acdf 100644 --- a/common/css/xe.css +++ b/common/css/xe.css @@ -58,5 +58,5 @@ body>.message{margin:1em} .wfsr{display:none;position:absolute;position:fixed;left:0;top:0;z-index:100; border:1px solid #EAE9DC;background:#FFFDEF url(../../common/img/msg.loading.gif) no-repeat 1em .5em;margin:1em;padding:1em 1em 1em 55px;border-radius:5px;line-height:1.4;font-size:12px;font-weight:bold} /* Waiting for server response - Modal Window */ .wfsr_fog{position:absolute;top:0;left:0;width:100%;_height:100%;min-height:100%;z-index:100} -.wfsr_fog .bg{position:absolute;background:#000;_background:none;width:100%;height:100%;opacity:.5;z-index:2;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1} +.wfsr_fog .bg{position:absolute;position:fixed;background:#000;_background:none;width:100%;height:100%;opacity:.5;z-index:2;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1} .wfsr_fog .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1} diff --git a/common/css/xe.min.css b/common/css/xe.min.css index 0babd4197..e4fddb922 100644 --- a/common/css/xe.min.css +++ b/common/css/xe.min.css @@ -1 +1 @@ -@charset "utf-8"; /* NHN (developers@xpressengine.com) */ body,table,input,textarea,select,button{font-family:Tahoma,Geneva,sans-serif;font-size:12px} img{border:0} /* Button */ .btn{position:relative;display:inline-block;vertical-align:top} .btn *{display:inline-block;padding:0 8px;font-size:12px;height:24px;line-height:22px;margin:0;font-weight:bold !important;color:#fff;text-decoration:none !important;border:1px solid;cursor:pointer;overflow:visible;border-radius:3px;box-shadow:inset 0 0 1px #fff;background-color:#666;text-shadow:0 -1px 0 #333;zoom:1} .btn *[type=submit][disabled=disabled], .btn *[type=button][disabled=disabled]{opacity:.5;*filter:alpha(opacity=50)} .btn a, .btn button[type=button]{border-color:#ccc;color:#333 !important;background:#eee -webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#ddd));background:#eee -moz-linear-gradient(top,#fff,#ddd);background-color:#eee;text-shadow:1px 1px 0 #fff;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#ffffff, endColorStr=#dddddd)} .btn input, .btn button[type=submit]{border-color:#666;background:#333 -webkit-gradient(linear,0% 0%,0% 100%,from(#777),to(#777),color-stop(0.5,#333),color-stop(0.5,#000));background:#333 -moz-linear-gradient(top,#777,#000);background-color:#333;color:#ffc !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#777777, endColorStr=#333333)} .btn a{height:22px} .btn.medium *{padding:0 12px;font-size:16px;height:30px;line-height:28px} .btn.medium a{height:28px} .btn.large *{padding:0 18px;font-size:22px;height:36px;line-height:34px} .btn.large a{height:34px} /* Button - Regucy */ .button{position:relative;display:inline-block;vertical-align:top} .button *{display:inline-block;padding:0 8px;font-size:12px;height:24px;line-height:22px;margin:0;font-weight:bold !important;color:#fff;text-decoration:none !important;border:1px solid;cursor:pointer;overflow:visible;border-radius:3px;box-shadow:inset 0 0 1px #fff;background-color:#666;text-shadow:0 -1px 0 #333;zoom:1} .button *[type=submit][disabled=disabled], .button *[type=button][disabled=disabled]{opacity:.5;*filter:alpha(opacity=50)} .button span, .button button[type=button]{border-color:#ccc;color:#333 !important;background:#eee -webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#ddd));background:#eee -moz-linear-gradient(top,#fff,#ddd);background-color:#eee;text-shadow:1px 1px 0 #fff;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#ffffff, endColorStr=#dddddd)} .button input, .button button[type=submit]{border-color:#666;background:#333 -webkit-gradient(linear,0% 0%,0% 100%,from(#777),to(#777),color-stop(0.5,#333),color-stop(0.5,#000));background:#333 -moz-linear-gradient(top,#777,#000);background-color:#333;color:#ffc !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#777777, endColorStr=#333333)} .button span{height:22px} /* Button Area */ .btnArea{margin:1em 0;text-align:right;zoom:1} .btnArea:after{content:"";display:block;clear:both} .btnArea .etc{float:left} /* Text Button */ input[type=submit].text, input[type=button].text, button[type=submit].text, button[type=button].text{border:0;overflow:visible;padding:0;margin:0 4px 0 0;color:#33a !important;background:none;text-decoration:underline;cursor:pointer} /* Popup Menu Area */ #popup_menu_area{position:absolute;background:#fff;border:1px solid #e9e9e9;border-radius:5px;padding:10px;line-height:1.3;box-shadow:0 0 6px #666;font-size:12px;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)} #popup_menu_area ul{list-style:none;margin:0;padding:0} #popup_menu_area li{margin:0;padding:0} #popup_menu_area a{text-decoration:none;color:#333} #popup_menu_area a:hover, #popup_menu_area a:avtive, #popup_menu_area a:focus{text-decoration:underline} /* Message */ .message{border:1px solid #ddd;background:#f8f8f8;margin:1em 0;padding:0 1em;border-radius:5px;line-height:1.4;font-size:12px} body>.message{margin:1em} .message p{margin:1em 0 !important} .message em{font-style:normal;color:#e00} .message.info, .message.error, .message.update{padding-left:55px} .message.info{border-color:#E0E8EC;background:#EDF9FF url(../../common/img/msg.Info.png) no-repeat 1em .5em} .message.error{border-color:#EFDCDC;background:#FFECEC url(../../common/img/msg.error.png) no-repeat 1em .5em} .message.update{border-color:#EAE9DC;background:#FFFDEF url(../../common/img/msg.update.png) no-repeat 1em .5em} /* Waiting for server response */ .wfsr{display:none;position:absolute;position:fixed;left:0;top:0;z-index:100; border:1px solid #EAE9DC;background:#FFFDEF url(../../common/img/msg.loading.gif) no-repeat 1em .5em;margin:1em;padding:1em 1em 1em 55px;border-radius:5px;line-height:1.4;font-size:12px;font-weight:bold} /* Waiting for server response - Modal Window */ .wfsr_fog{position:absolute;top:0;left:0;width:100%;_height:100%;min-height:100%;z-index:100} .wfsr_fog .bg{position:absolute;background:#000;_background:none;width:100%;height:100%;opacity:.5;z-index:2;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1} .wfsr_fog .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1} \ No newline at end of file +@charset "utf-8";/* NHN (developers@xpressengine.com) */body,table,input,textarea,select,button{font-family:Tahoma,Geneva,sans-serif;font-size:12px}img{border:0}/* Button */.btn{position:relative;display:inline-block;vertical-align:top}.btn *{display:inline-block;padding:0 8px;font-size:12px;height:24px;line-height:22px;margin:0;font-weight:bold !important;color:#fff;text-decoration:none !important;border:1px solid;cursor:pointer;overflow:visible;border-radius:3px;box-shadow:inset 0 0 1px #fff;background-color:#666;text-shadow:0 -1px 0 #333;zoom:1}.btn *[type=submit][disabled=disabled],.btn *[type=button][disabled=disabled]{opacity:.5;*filter:alpha(opacity=50)}.btn a, .btn button[type=button]{border-color:#ccc;color:#333 !important;background:#eee -webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#ddd));background:#eee -moz-linear-gradient(top,#fff,#ddd);background-color:#eee;text-shadow:1px 1px 0 #fff;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#ffffff, endColorStr=#dddddd)}.btn input, .btn button[type=submit]{border-color:#666;background:#333 -webkit-gradient(linear,0% 0%,0% 100%,from(#777),to(#777),color-stop(0.5,#333),color-stop(0.5,#000));background:#333 -moz-linear-gradient(top,#777,#000);background-color:#333;color:#ffc !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#777777, endColorStr=#333333)}.btn a{height:22px}.btn.medium *{padding:0 12px;font-size:16px;height:30px;line-height:28px}.btn.medium a{height:28px}.btn.large *{padding:0 18px;font-size:22px;height:36px;line-height:34px}.btn.large a{height:34px}/* Button - Regucy */.button{position:relative;display:inline-block;vertical-align:top}.button *{display:inline-block;padding:0 8px;font-size:12px;height:24px;line-height:22px;margin:0;font-weight:bold !important;color:#fff;text-decoration:none !important;border:1px solid;cursor:pointer;overflow:visible;border-radius:3px;box-shadow:inset 0 0 1px #fff;background-color:#666;text-shadow:0 -1px 0 #333;zoom:1}.button *[type=submit][disabled=disabled],.button *[type=button][disabled=disabled]{opacity:.5;*filter:alpha(opacity=50)}.button span, .button button[type=button]{border-color:#ccc;color:#333 !important;background:#eee -webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#ddd));background:#eee -moz-linear-gradient(top,#fff,#ddd);background-color:#eee;text-shadow:1px 1px 0 #fff;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#ffffff, endColorStr=#dddddd)}.button input, .button button[type=submit]{border-color:#666;background:#333 -webkit-gradient(linear,0% 0%,0% 100%,from(#777),to(#777),color-stop(0.5,#333),color-stop(0.5,#000));background:#333 -moz-linear-gradient(top,#777,#000);background-color:#333;color:#ffc !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#777777, endColorStr=#333333)}.button span{height:22px}/* Button Area */.btnArea{margin:1em 0;text-align:right;zoom:1}.btnArea:after{content:"";display:block;clear:both}.btnArea .etc{float:left}/* Text Button */input[type=submit].text,input[type=button].text, button[type=submit].text,button[type=button].text{border:0;overflow:visible;padding:0;margin:0 4px 0 0;color:#33a !important;background:none;text-decoration:underline;cursor:pointer}/* Popup Menu Area */#popup_menu_area{position:absolute;background:#fff;border:1px solid #e9e9e9;border-radius:5px;padding:10px;line-height:1.3;box-shadow:0 0 6px #666;font-size:12px;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}#popup_menu_area ul{list-style:none;margin:0;padding:0}#popup_menu_area li{margin:0;padding:0}#popup_menu_area a{text-decoration:none;color:#333}#popup_menu_area a:hover,#popup_menu_area a:avtive,#popup_menu_area a:focus{text-decoration:underline}/* Message */.message{border:1px solid #ddd;background:#f8f8f8;margin:1em 0;padding:0 1em;border-radius:5px;line-height:1.4;font-size:12px}body>.message{margin:1em}.message p{margin:1em 0 !important}.message em{font-style:normal;color:#e00}.message.info,.message.error,.message.update{padding-left:55px}.message.info{border-color:#E0E8EC;background:#EDF9FF url(../../common/img/msg.Info.png) no-repeat 1em .5em}.message.error{border-color:#EFDCDC;background:#FFECEC url(../../common/img/msg.error.png) no-repeat 1em .5em}.message.update{border-color:#EAE9DC;background:#FFFDEF url(../../common/img/msg.update.png) no-repeat 1em .5em}/* Waiting for server response */.wfsr{display:none;position:absolute;position:fixed;left:0;top:0;z-index:100; border:1px solid #EAE9DC;background:#FFFDEF url(../../common/img/msg.loading.gif) no-repeat 1em .5em;margin:1em;padding:1em 1em 1em 55px;border-radius:5px;line-height:1.4;font-size:12px;font-weight:bold}/* Waiting for server response - Modal Window */.wfsr_fog{position:absolute;top:0;left:0;width:100%;_height:100%;min-height:100%;z-index:100}.wfsr_fog .bg{position:absolute;position:fixed;background:#000;_background:none;width:100%;height:100%;opacity:.5;z-index:2;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1}.wfsr_fog .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1} \ No newline at end of file diff --git a/common/js/xe.js b/common/js/xe.js index 75fb3e6ec..ffb48ebab 100644 --- a/common/js/xe.js +++ b/common/js/xe.js @@ -2086,3 +2086,5 @@ function legacy_filter(filter_name, form, module, act, callback, responses, conf return false; } +/* Modal Fog Layer */ +jQuery(function($){$('.wfsr_fog>.bg').height($(document).height());}); \ No newline at end of file diff --git a/common/js/xe.min.js b/common/js/xe.min.js index 9ac416674..515837413 100644 --- a/common/js/xe.min.js +++ b/common/js/xe.min.js @@ -71,4 +71,4 @@ b[0].toLowerCase();delete l[c]},API_APPLY_RULE:function(b,c){var d=c[0],g=c[1];r b){alert(b[0])},API_ADD_MESSAGE:function(a,b){c[b[0]]=b[1]},API_GET_MESSAGE:function(a,b){var d=b[0];return c[d]||d},API_ADD_CALLBACK:function(a,b){j[b[0]]=b[1]},API_REMOVE_CALLBACK:function(a,b){delete j[b[0]]}}));xe.registerApp(m);var k=xe.createPlugin("editor_stub",{API_BEFORE_VALIDATE:function(a,b){var c=b[0].getAttribute("editor_sequence");if(c&&typeof c=="object")c=c.value;if(c)try{editorRelKeys[c].content.value=editorRelKeys[c].func(c)||""}catch(d){}}});m.registerPlugin(new k)})(jQuery); function filterAlertMessage(a){var b=a.message,d=a.act,a=a.redirect_url,c=location.href;typeof b!="undefined"&&b&&b!="success"&&alert(b);typeof d!="undefined"&&d?c=current_url.setQuery("act",d):typeof a!="undefined"&&a&&(c=a);c==location.href&&(c=c.replace(/#(.*)$/,""));location.href=c}function procFilter(a,b){b(a);return false} function legacy_filter(a,b,d,c,e,g,j,l){var m=xe.getApp("Validator")[0],k=jQuery,h=[];if(!m)return false;b.elements._filter||k(b).prepend('');b.elements._filter.value=a;h[0]=a;h[1]=function(a){var h={},a=k(a).serializeArray();k.each(a,function(a,b){var c=k.trim(b.value),d=b.name;if(!c||!d)return true;l[d]&&(d=l[d]);/\[\]$/.test(d)&&(d=d.replace(/\[\]$/,""));h[d]?h[d]+="|@|"+c:h[d]=b.value});if(j&&!confirm(j))return false;exec_xml(d,c,h,e,g,h,b)};m.cast("ADD_CALLBACK", -h);m.cast("VALIDATE",[b,a]);return false}; +h);m.cast("VALIDATE",[b,a]);return false};jQuery(function($){$('.wfsr_fog>.bg').height($(document).height());}); From ed08306923b5df049e841b613a5ca19db652a883 Mon Sep 17 00:00:00 2001 From: taggon Date: Mon, 17 Oct 2011 09:05:49 +0000 Subject: [PATCH 1192/1372] issue 530 : Improved inconvenient UI of member list. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9666 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/tpl/js/admin.js | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/modules/admin/tpl/js/admin.js b/modules/admin/tpl/js/admin.js index 15982cb55..684c50eab 100644 --- a/modules/admin/tpl/js/admin.js +++ b/modules/admin/tpl/js/admin.js @@ -125,22 +125,26 @@ jQuery(function($){ .each(function(){ var $this = $(this), text = $this.text(); var reg_mail = /^([\w\-\.]+?)@(([\w-]+\.)+[a-z]{2,})$/ig; - $this.data('originalText', text); if(reg_mail.test(text)) { - $this.data('maskedText', RegExp.$1+'...'); + $this + .html(text.replace(/(@.+)$/, '...$1')) + .find('>.ellipsis') + .css({position:'absolute',zIndex:1}) + .hover( + function(){ $(this).next('.cover').mouseover() }, + function(){ $(this).next('.cover').mouseout() } + ) + .end() + .find('>.cover') + .css({zIndex:2,opacity:0}) + .hover( + function(){ $(this).css('opacity',1).prev('span').css('visibility','hidden') }, + function(){ $(this).css('opacity',0).prev('span').css('visibility','visible') } + ) + .end(); } - - $this.text( $this.data('maskedText') ); }) - .mouseover(function(){ - $(this).text( $(this).data('originalText') ); - }) - .mouseout(function(){ - $(this).text( $(this).data('maskedText') ); - }) - .focus(function(){ $(this).mouseover(); }) - .blur(function(){ $(this).mouseout(); }); }; $('.masked').xeMask(); }); From 1b641c644c584e9fe915630de72b0617414fffce Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Mon, 17 Oct 2011 09:10:54 +0000 Subject: [PATCH 1193/1372] Counter Widget CSS load bug fix. Color variation setting was removed. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9667 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- .../skins/default/counter_status.html | 11 +++---- .../skins/default/css/widget.css | 22 +++---------- widgets/counter_status/skins/default/skin.xml | 33 +------------------ 3 files changed, 10 insertions(+), 56 deletions(-) diff --git a/widgets/counter_status/skins/default/counter_status.html b/widgets/counter_status/skins/default/counter_status.html index 38dd4844b..0a5a48044 100644 --- a/widgets/counter_status/skins/default/counter_status.html +++ b/widgets/counter_status/skins/default/counter_status.html @@ -1,14 +1,11 @@ - - - - +
                                                      black">
                                                      -
                                                      {$lang->today} :
                                                      +
                                                      {$lang->today}:
                                                      {number_format($today_counter->unique_visitor)}
                                                      -
                                                      {$lang->yesterday} :
                                                      +
                                                      {$lang->yesterday}:
                                                      {number_format($yesterday_counter->unique_visitor)}
                                                      -
                                                      {$lang->total} :
                                                      +
                                                      {$lang->total}:
                                                      {number_format($total_counter->unique_visitor)}
                                                      diff --git a/widgets/counter_status/skins/default/css/widget.css b/widgets/counter_status/skins/default/css/widget.css index b3dcaf6ba..0a8865301 100644 --- a/widgets/counter_status/skins/default/css/widget.css +++ b/widgets/counter_status/skins/default/css/widget.css @@ -1,18 +1,6 @@ @charset "utf-8"; - -/* widgetCounter */ -.widgetCounter{ font-size:12px; margin:0;} -.widgetCounter dt, -.widgetCounter dd{ height:18px;} -.widgetCounter dt{ float:left; clear:left;} -.widgetCounter dd{ font-size:11px; font-family:Tahoma;} -.widgetCounter dt{ color:#333;} -.widgetCounter dd{ color:#888;} - -.widgetContainer.black .widgetCounter{ font-size:12px; margin:0;} -.widgetContainer.black .widgetCounter dt, -.widgetContainer.black .widgetCounter dd{ height:18px;} -.widgetContainer.black .widgetCounter dt{ float:left; clear:left;} -.widgetContainer.black .widgetCounter dd{ font-size:11px; font-family:Tahoma;} -.widgetContainer.black .widgetCounter dt{ color:#999;} -.widgetContainer.black .widgetCounter dd{ color:#888;} +/* Widget Counter */ +.widgetCounter{font-size:12px;margin:0;line-height:1.4;color:#333} +.widgetCounter:after{content:"";display:block;clear:both} +.widgetCounter dt{float:left;clear:left;margin:0 4px 0 0} +.widgetCounter dd{margin:0} diff --git a/widgets/counter_status/skins/default/skin.xml b/widgets/counter_status/skins/default/skin.xml index f843aa93a..e542baabf 100644 --- a/widgets/counter_status/skins/default/skin.xml +++ b/widgets/counter_status/skins/default/skin.xml @@ -1,6 +1,6 @@ - 접속자 현황 출력 기본 스킨 + 기본 카운터 스킨 接続統計表示のデフォルトスキン 计数器默认皮肤 Default Counter Skin @@ -17,7 +17,6 @@ 0.1 2007-02-28 http://xpressengine.com/ - NHN NHN @@ -27,34 +26,4 @@ NHN NHN - - - - 레이아웃에 맞춤 - レイアウトに合わせる - 随布局 - 레이아웃에 맞춤 - Tùy chỉnh giao diện - 隨版面 - Yerleşim Düzeni - - - 하얀색(기본) - 白(デフォルト) - 白色(默认) - White (default) - White (Mặc định) - 白色(預設) - Beyaz (varsayılan) - - - 검은색 - - Black - Black - 黑色 - 黑色 - Siyah - - From 1db039c0757361ddc8c2b87831b7b97207fc17ea Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Mon, 17 Oct 2011 09:27:46 +0000 Subject: [PATCH 1194/1372] zh-TW flag image replacement. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9668 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/tpl/css/admin.css | 8 ++++---- modules/admin/tpl/css/admin.min.css | 2 +- modules/admin/tpl/img/flag.tw.gif | Bin 0 -> 367 bytes 3 files changed, 5 insertions(+), 5 deletions(-) create mode 100644 modules/admin/tpl/img/flag.tw.gif diff --git a/modules/admin/tpl/css/admin.css b/modules/admin/tpl/css/admin.css index d29177c03..558322129 100644 --- a/modules/admin/tpl/css/admin.css +++ b/modules/admin/tpl/css/admin.css @@ -441,10 +441,10 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */ .x .mLangEdit li.mn textarea{background:url(../img/flag.mn.gif) no-repeat 99% 5px} .x .langEdit li.zh-CN input, .x .langEdit li.zh-CN textarea, -.x .mLangEdit li.zh-CN textarea, +.x .mLangEdit li.zh-CN textarea{background:url(../img/flag.cn.gif) no-repeat 99% 5px} .x .langEdit li.zh-TW input, .x .langEdit li.zh-TW textarea, -.x .mLangEdit li.zh-TW textarea{background:url(../img/flag.cn.gif) no-repeat 99% 5px} +.x .mLangEdit li.zh-TW textarea{background:url(../img/flag.tw.gif) no-repeat 99% 5px} .x .mLangEdit.en strong{background:url(../img/flag.us.gif) no-repeat 0 10px} .x .mLangEdit.ko strong{background:url(../img/flag.kr.gif) no-repeat 0 10px} .x .mLangEdit.jp strong{background:url(../img/flag.jp.gif) no-repeat 0 10px} @@ -455,8 +455,8 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */ .x .mLangEdit.tr strong{background:url(../img/flag.tr.gif) no-repeat 0 10px} .x .mLangEdit.vi strong{background:url(../img/flag.vn.gif) no-repeat 0 10px} .x .mLangEdit.mn strong{background:url(../img/flag.mn.gif) no-repeat 0 10px} -.x .mLangEdit.zh-CN strong, -.x .mLangEdit.zh-TW strong{background:url(../img/flag.cn.gif) no-repeat 0 10px} +.x .mLangEdit.zh-CN strong{background:url(../img/flag.cn.gif) no-repeat 0 10px} +.x .mLangEdit.zh-TW strong{background:url(../img/flag.tw.gif) no-repeat 0 10px} .x .mLangEdit ul ul{border:0} .x .mLangEdit li{position:relative;padding:0} .x .mLangEdit li strong{display:inline-block;padding:6px 100px 8px 24px;font-weight:normal;line-height:1.5} diff --git a/modules/admin/tpl/css/admin.min.css b/modules/admin/tpl/css/admin.min.css index 0fabbf385..97e3b8fcc 100644 --- a/modules/admin/tpl/css/admin.min.css +++ b/modules/admin/tpl/css/admin.min.css @@ -1 +1 @@ -@charset "utf-8";/* NHN (developers@xpressengine.com) *//* Element Reset */body{margin:0}header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{display:block}body>.popup{margin:1em}.x,.x table,.x input,.x textarea,.x select,.x button{font-family:Tahoma,Geneva,sans-serif;font-size:12px;color:#333}.x button,.x input[type=submit],.x input[type=reset],.x input[type=button]{cursor:pointer;overflow:visible}.x img{border:0}.x p{line-height:1.5}/* Section & Heading */.x .section{margin:1em 0;padding:0;border:0}.x .h1, .x .h2, .x .h3, .x .h4{position:relative;border-bottom-style:solid;border-bottom-color:#ccc;zoom:1}.x .h1{border-bottom-width:4px;font-size:24px}.x .h2{border-bottom-width:3px;font-size:20px}.x .h3{border-bottom-width:2px;font-size:16px}.x .h4{border-bottom-width:1px;font-size:12px}/* Portlet */.x .portlet{position:relative;border:1px solid #e9e9e9;margin:1em 0;padding:0;background:#fff;zoom:1;overflow:hidden;border-radius:5px}.x .portlet h2, .x .portlet h3{margin:0;padding:.5em 1em;font-size:14px;border:1px solid #fff;border-bottom:1px solid #e9e9e9;background:#f7f7f7;border-radius:5px 5px 0 0}.x .portlet p{margin:1em 1.2em}.x .portlet li{position:relative;padding-right:8em}.x .portlet .lined{margin:1px;padding:0;list-style:none}.x .portlet .lined li{padding:.5em 8em .5em 1em;border-top:1px solid #eee;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis}.x .portlet .lined li:first-child{border:0}.x .portlet .side{position:absolute;top:0;_top:1px;right:0;color:#666;background:#fff;padding:0 1em}.x .portlet .lined .side{padding:.5em 1em}.x .portlet .more{position:absolute;top:.5em;right:1em;text-decoration:none !important;color:#666}.x .portlet .more span{color:#999}.x .portlet .action{text-align:right;top:0;right:0;padding:.5em 1em .5em 3em;background:#fff;background:-webkit-gradient(linear, 0% 0%, 100% 0%, from(rgba(255,255,255,0)), to(rgba(255,255,255,1)), color-stop(15%, #fff));background:-moz-linear-gradient(left, rgba(255,255,255,0) 0, rgba(255,255,255,1) 15%)}.x .portlet .action a,.x .portlet .action button{margin-left:1em}.x .portlet .btnArea{border-top:1px solid #ddd;margin:0;padding:.5em 1em;margin:0 1px 1px 1px;background:#f7f7f7;border-radius:0 0 5px 5px}/* Table */.x .table{margin:1em 0}.x .table table{width:100%;border:0;border-collapse:collapse;border-top:2px solid #ccc}.x .table caption{font-weight:bold;text-align:left;line-height:22px;padding:5px 0}.x .table caption:after{content:"";display:block;clear:both}.x .table caption a{font-weight:normal}.x .table caption em{float:right;margin-left:1em}.x .table caption strong{color:#e00}.x .table caption .side{float:right;font-weight:normal;margin-left:1em}.x .table th,.x .table td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd;white-space:nowrap}.x .table th{background:#f8f8f8}.x .table thead th{border-bottom:1px solid #999}.x .table tfoot td{font-weight:bold;background:#f8f8f8}.x .table.even tbody tr:nth-of-type(even) td{background-color:#fafafa}.x .table td>input[type=text]{margin:-1px 0 -3px 0 !important;vertical-align:middle}.x .table img{vertical-align:middle}.x .table em{font-style:normal;font-weight:normal;color:#e00}.x .table .title,.x .table .text{white-space:normal}/* Form */.x .form{margin:1em 0;padding:0}.x .form fieldset{margin:0 0 2em 0;padding:0;border:0}.x .form em{font-style:normal;color:#e00}.x .form label{margin-right:1em;line-height:1;vertical-align:middle}.x .form input[type=checkbox]+label,.x .form input[type=radio]+label,.x .form input[type=file]{cursor:pointer}.x .form ul{position:relative;margin:0;padding:0;list-style:none;border-top:2px solid #ccc;border-bottom:1px solid #ccc;zoom:1}.x .form li{list-style:none;border:1px solid #ddd;border-left:0;border-right:0;margin:-1px 0;padding:8px 0;vertical-align:top;zoom:1}.x .form li:first-child{border-top:0}.x .form li>label:first-child{display:block;font-weight:bold}.x .form li label em{font-weight:normal}.x .form label.overlap{position:absolute;color:#aaa}.x .form input[type=text],.x .form input[type=password],.x .form input[type=file],.x .form textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:transparent}.x .form input[type=text],.x .form input[type=password],.x .form input[type=file]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px}.x .form input[type=text].loading,.x .form input.loading[type=password]{padding-right:24px;width:260px;background:transparent url(../img/preLoader16.gif) no-repeat 265px center}.x .form input[type=checkbox],.x .form input[type=radio]{margin:0;padding:0;width:13px;height:13px;vertical-align:middle}.x .form *[disabled=disabled]{background:#ddd !important;text-shadow:1px 1px 0 #fff}.x .form textarea{padding:3px 4px;vertical-align:top}.x .form span.desc, .x .form em.desc{line-height:22px;vertical-align:middle;margin:0 10px}.x .form p.desc{margin:.25em 0;line-height:1.4}.x .form .q{font-weight:bold;margin:0 0 5px 0}.x .form .a{margin:0 0 5px 0}.x .form .tgForm{margin-right:1em}.x .form .h1 + ul,.x .form .h2 + ul,.x .form .h3 + ul,.x .form .h4 + ul,.x .form .h1 + .table table, .x .form .h2 + .table table, .x .form .h3 + .table table, .x .form .h4 + .table table{border-top:0}/* Global Navigation Bar */.x .gnb{position:relative;clear:both;border:1px solid #c1c1c1;border-left:0;border-right:0;background-color:#efefef;background:#efefef -webkit-gradient(linear, 0% 0%, 0% 100%, from(#efefef), to(#dcdcdc));background:#efefef -moz-linear-gradient(top, #efefef, #dcdcdc);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#efefef, endColorStr=#dcdcdc);zoom:1}.x .gnb ul{margin:0;padding:0 0 0 2em;list-style:none;border:1px solid #fff;border-left:0;border-right:0;zoom:1}.x .gnb ul ul{position:absolute;top:30px;left:0;border:1px solid #ccc;border-top:0;padding:1px 0 0 0;background:#fff}.x .gnb ul:after{content:"";display:block;clear:both}.x .gnb li{position:relative;float:left;border:1px solid #fff;border-top:0;border-bottom:0;margin:0 -1px 0 0}.x .gnb li li{float:none;clear:both;overflow:hidden;border:0;border-top:1px dotted #ccc;margin:0;padding:2px}.x .gnb li li:first-child{border:0}.x .gnb li a{float:left;font-weight:bold;color:#333;font-size:12px;padding:8px 18px;white-space:nowrap;text-decoration:none;text-shadow:0 1px 0 #fff;zoom:1}.x .gnb li a:hover,.x .gnb li a:active,.x .gnb li a:focus,.x .gnb li.active a{background:#f4f4f4;border:1px solid #ccc;border-bottom:0;padding:7px 17px 8px 17px}.x .gnb li.activeOn a{background:#fff;border:1px solid #ccc;border-bottom:0;padding:7px 17px 8px 17px}.x .gnb li.active li a{display:block;float:none;color:#555;background:#fff;padding:5px 15px !important;font-weight:normal !important;border:0 !important}.x .gnb li.active li a:hover,.x .gnb li.active li a:active,.x .gnb li.active li a:focus{border:0;background:#eee}.x .gnb .setting{position:absolute;top:8px;right:2em;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;background:url(../img/iconSetting.gif) no-repeat center}.x .gnb.jx ul{display:block;position:static;padding:0}.x .gnb.jx li{float:none;clear:both;border-top:1px solid #ccc}.x .gnb.jx ul ul{border:0}.x .gnb.jx li li{border:0}.x .gnb.jx li a{float:none;display:block}.x .gnb.jx li a:hover,.x .gnb.jx li a:active,.x .gnb.jx li a:focus{background:none}.x .gnb.jx li.activeOn>a{background:#ddd}@media only all and (max-width:860px){.x .gnb ul{padding-left:1em}.x .gnb .setting{right:1em}}@media only all and (max-width:640px){.x .gnb ul{display:block;position:static;padding:0}.x .gnb li{float:none;clear:both;border-top:1px solid #ccc}.x .gnb ul ul{border:0;position:static}.x .gnb li li{border:0}.x .gnb li a{float:none;display:block}.x .gnb li a:hover,.x .gnb li a:active,.x .gnb li a:focus{background:none}.x .gnb li.activeOn>a{background:#ddd}}/* Favorite */.x .bmk{position:absolute;right:2em;bottom:10px;padding:0 0 0 20px;background:url(../img/iconFavorite.gif) no-repeat 0 -16px}.x .bmk ul{position:absolute;top:140%;right:0;list-style:none;margin:0;padding:5px 10px;border:1px solid #aaa;border-radius:5px;background:#fff;box-shadow:1px 1px 3px #aaa}.x .bmk li{position:relative;padding:3px 30px 3px 0;white-space:nowrap}.x .bmk li .action{position:absolute;top:0;right:0}.x .bmk li .action .text{text-decoration:none;width:16px;text-align:center;margin:0}@media only all and (max-width:640px){.x .bmk{position:static;background-color:#fff;padding:10px 20px;background:#fff}.x .bmk .tgAnchor{display:block}.x .bmk ul{position:relative;border:0;border-top:1px solid #ccc;border-radius:0;box-shadow:none;padding:0;margin:5px 0 0 0}.x .bmk li{position:relative;top:-1px;border-top:1px dotted #ccc}}/* Local Navigation */.x .lnb{position:relative;float:left;width:200px;margin:1em 0 1em -230px;line-height:normal;zoom:1;display:inline}.x .lnb .h2{margin-top:0}.x .lnb ul{margin:0;padding:0;list-style:none}.x .lnb li{position:relative;margin:0 0 -1px 0;vertical-align:top;zoom:1}.x .lnb li a{display:block;position:relative;padding:8px 10px;text-decoration:none;color:#666;font-weight:bold;background:#fafafa;border:1px solid #eee;zoom:1}.x .lnb li a .i{position:absolute;top:50%;left:100%;margin:-4px 0 0 -16px;width:8px;height:8px;color:#ccc;background:url(../img/iconNavVr.gif) no-repeat left top}.x .lnb li ul{padding:5px 0;background:#fff}.x .lnb li li{margin:0;border-top:1px dotted #ddd}.x .lnb li li:first-child{border:0}.x .lnb li li a{font-weight:normal;background:#fff;padding:5px 10px;border:0}.x .lnb li li a span{color:#666}.x .lnb li.active{border:1px solid #ccc;z-index:2}.x .lnb li li.active{border:0}.x .lnb li.active a{color:#000;border:0}.x .lnb li.active .i{background-position:0 -44px}.x .lnb li.active li a{border:0}.x .lnb li.active ul{display:block;border-top:1px solid #eee}.x .lnb li.active li.active a span{color:#13b200;font-weight:bold;letter-spacing:-1px}/* Content Navigation */.x .cnb{margin:1em 0;position:relative;zoom:1}.x .cnb:after{content:"";display:block;clear:both}.x .cnb ul{list-style:none;margin:0;padding:0}.x .cnb li{display:inline}.x .cnb li:before{content:"| ";color:#ccc}.x .cnb li:first-child:before{content:""}.x .cnb .active,.x .cnb .active a{font-weight:bold;color:#333;text-decoration:none}.x .cnb .side{float:right}/* Pagination */.x .pagination{margin:1em 0;text-align:center;line-height:normal}.x .pagination *{vertical-align:middle}.x .pagination a,.x .pagination strong{position:relative;display:inline-block;padding:2px 4px;font-weight:bold;text-decoration:none;line-height:normal;color:#333 !important;vertical-align:middle}.x .pagination a:hover,.x .pagination a:active,.x .pagination a:focus{border:1px solid #ddd;margin:0 -1px}.x .pagination strong{color:#e00 !important;font-size:20px}.x .pagination .direction{font-weight:normal;white-space:nowrap}.x .pagination .direction:hover,.x .pagination .direction:active,.x .pagination .direction:focus{border:0;margin:0;text-decoration:underline}.x .pagination input{width:30px;text-align:center}.x .pagination button{overflow:visible}/* Star Rating */.x .starRating, .x .starRating span{display:inline-block;height:14px;background:transparent url(../img/iconStarRating.gif) no-repeat;overflow:hidden}.x .starRating{width:79px;vertical-align:top}.x .starRating span{font-size:0;line-height:0;vertical-align:top;text-indent:-100px;*text-indent:0;background-position:0 -14px}/* Progress */.x .prgrs{white-space:nowrap;line-height:normal;vertical-align:middle}.x .prgrs *{vertical-align:middle}.x .prgrs .pBar{position:relative;display:inline-block;background:#e9e9e9;margin:0 5px 0 0}.x .prgrs .pAction{display:inline-block;vertical-align:top;background:#99a6b6}.x .prgrs .pNum{position:absolute;width:100%;left:0;top:0;text-align:center;text-shadow:1px 1px 0 #fff}.x .prgrs.prgrsSmall{font-size:14px;line-height:14px}.x .prgrs.prgrsSmall .pBar,.x .prgrs.prgrsSmall .pAction,.x .prgrs.prgrsSmall .pNum{height:16px;line-height:16px;font-size:11px}.x .prgrs.prgrsMedium{font-size:24px;line-height:24px}.x .prgrs.prgrsMedium .pBar,.x .prgrs.prgrsMedium .pAction,.x .prgrs.prgrsMedium .pNum{height:22px;line-height:22px;font-size:12px}.x .prgrs.prgrsLarge{font-size:38px;line-height:38px}.x .prgrs.prgrsLarge .pBar,.x .prgrs.prgrsLarge .pAction,.x .prgrs.prgrsLarge .pNum{height:34px;line-height:34px;font-size:14px}/* Modal Window */.modal{position:absolute;top:0;left:0;width:100%;_height:100%;min-height:100%;z-index:100}.modal .bg{position:absolute;background:#000;_background:none;width:100%;height:100%;opacity:.5;z-index:2;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1}.modal .fg{position:relative;width:80%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:3;zoom:1;border-radius:5px;box-shadow:0 0 6px #000}.modal ul, .modal ol, .modal .lined, .modal .table{margin-bottom:1em}.modal .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1}.modalClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px}.modalBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}html.modalContainer,body.modalContainer{_height:100%;_width:100%} /* IE6 only */ /* Layer */.x .layer,.x.layer{position:absolute;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:2;zoom:1;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;box-shadow:0 0 6px #666;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x .layer h2{font-size:14px}.x .layer ul, .x .layer ol, .x .layer .lined, .x .layer .table{margin-bottom:1em}.x .layerClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px}.x .layerBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}/* H2 Anchor */.x .h2Anchor{position:absolute;right:0;border:0;background:none;color:#00f;text-decoration:underline}/* Skip Navigation */.x .skipNav{margin:0;text-align:center;overflow:hidden}.x .skipNav a{position:absolute;width:1px;height:1px;display:block;color:#fff;font-weight:bold;padding:10px 0;background:#333;border-top:1px solid #656565}.x .skipNav a:hover,.x .skipNav a:active,.x .skipNav a:focus{position:relative;width:auto;height:auto}/* Header */.x .header{position:relative;z-index:2;padding:30px 0 0 0;background:#4c4c4c;box-shadow:0 0 10px #aaa;zoom:1}.x .header:after{content:"";display:block;clear:both}.x .header a{text-decoration:none}.x .header h1{margin:0 15px 10px 1.3em;font-size:24px;line-height:32px;display:inline-block;zoom:1}.x .header h1 *{vertical-align:middle}.x .header h1 a{color:#fff;text-shadow:1px 1px 0 #000;filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=1, OffY=1, Color=#000000, Positive=true);zoom:1}.x .header h1 .url{font-size:12px;font-weight:normal}.x .header .site{margin:0;display:inline-block;zoom:1}.x .header .site a{color:#fff;text-decoration:underline}.x .header #moveSiteList{padding:10px 1em 5px 1em;margin:0}.x .header #moveSiteList ul{list-style:none;margin:0;padding:0}.x .header #moveSiteList li{white-space:nowrap;margin:0;padding:4px 0;border-bottom:1px dotted #ccc}.x .header #siteMapList{padding:0 1em 1em 1em;margin:0}.x .header #siteMapList li{white-space:nowrap}.x .header .account{position:absolute;z-index:3;width:100%;padding:5px 2em 5px 0;top:0;right:0;white-space:nowrap;text-align:right;background:#333;border-bottom:1px solid #656565;color:#fff;font-size:12px;box-shadow:0 0 10px #333}.x .header .account ul{margin:0 2px 0 0;padding:0;list-style:none}.x .header .account li{position:relative;display:inline;border-left:1px solid #666;padding:0 6px 0 10px}.x .header .account li:first-child{border:0}.x .header .account a{color:#fff;display:inline-block;height:14px}.x .header .account a.language{padding-right:16px;background:url(../img/iconArrow.gif) no-repeat right -160px}.x .header #language{position:absolute;top:19px;right:-2em;padding:6px 4px !important;border:1px solid #666;border-top:0;background:#333}.x .header #language li{border:0;display:block;padding:1px 8px 1px 10px;text-align:left;line-height:1}.x .header #language li.selected{background:url(../img/iconCheck.gif) no-repeat left center}.x .header #language li.selected a{text-decoration:underline}.x .header h1 a:hover,.x .header h1 a:active,.x .header h1 a:focus,.x .header .account a:hover,.x .header .account a:active,.x .header .account a:focus{color:#6e9cf2;text-decoration:underline}/* Footer */.x .footer{border-top:1px solid #ddd;text-align:center;font-size:12px;padding:1.5em 0;margin:0 2em;zoom:1}.x .footer:after{content:"";display:block;clear:both}.x .footer p{margin:0}.x .footer .power{float:left}.x .footer .cache{float:right}/* Body */.x .body{position:relative;z-index:1;padding:1em 2em 1em 260px;zoom:1}.x .body:after{content:"";display:block;clear:both}/* Content */.x .content{float:right;width:100%;margin-left:-230px;zoom:1}.x .content:after{content:"";display:block;clear:both}.x .content a{color:#33a}.x .content a:hover,.x .content a:active,.x .content a:focus{color:#a33}.x .content .portlet a{text-decoration:none}.x .content .portlet a:hover,.x .content .portlet a:active,.x .content .portlet a:focus{text-decoration:underline}/* Dashboard */.x .dashboard{position:relative;float:none;width:auto;margin-left:-230px}.x .dashboard .portlet{float:left;width:48%;margin-right:1em}.x .dashboard .portlet:nth-of-type(odd){float:left;width:49%;margin-right:0}.x .dashboard .portlet:nth-of-type(even){float:right;width:49%;margin-right:0}@media only all and (min-width:1300px){.x .dashboard .portlet{float:left !important;width:32% !important;margin-right:1em !important}}/* Single Column*/.x .single{position:relative;float:none;width:auto;margin-left:-230px}/* Search */.x .search{zoom:1}.x .search:after{content:"";display:block;clear:both}.x .search .pagination{float:left;text-align:left}.x .search form{float:right;margin:1em 0}.x .search form *{vertical-align:middle}/* Site Map */.x .siteMap h2 input{font-size:14px;font-weight:bold;padding:0 .5em}.x .siteMap label{cursor:text}.x .siteMap .lined ul{padding:0;margin:0;border-top:1px solid #eee;zoom:1}.x .siteMap .lined li{position:relative;padding:0;margin:0;cursor:all-scroll;list-style:none;zoom:1}.x .siteMap .lined li li{border-top:1px solid #eee}.x .siteMap li li{text-indent:18px}.x .siteMap li li li{text-indent:36px}.x .siteMap li li li li{text-indent:54px}.x .siteMap li li li li li{text-indent:72px}.x .siteMap li li li li li li{text-indent:90px}.x .siteMap li li li li li li li{text-indent:108px}.x .siteMap li li li li li li li li{text-indent:126px}.x .siteMap li li li li li li li li li{text-indent:144px}.x .siteMap li li li li li li li li li li{text-indent:162px}.x .siteMap li li li li li li li li li li li{text-indent:180px}.x .siteMap li li li li li li li li li li li li{text-indent:198px}.x .siteMap li *{vertical-align:middle}.x .siteMap li .moveTo+input{width:200px;border:0;padding:0 .5em}.x .siteMap li .moveTo+input:hover,.x .siteMap li .moveTo+input:active,.x .siteMap li .moveTo+input:focus{border:1px dotted #ccc;overflow:visible}.x .siteMap .moveTo{position:relative;z-index:2;width:22px;height:32px;padding:32px 0 0 0;margin:0 3px;_margin-top:-1px;overflow:hidden;background:#fff url(../img/iconMoveTo.gif) no-repeat center 0;border:0;cursor:move}.x .siteMap li.active,.x .siteMap li.active .moveTo{background-color:#f7f7f7}.x .siteMap li.active li,.x .siteMap li.active ul{border-top-color:#f7f7f7}.x .siteMap li.active .moveTo{background-position:center -32px}.x .siteMap .vr,.x .siteMap .hr{display:none;position:absolute;z-index:1;left:14px;border:0px solid #ccc;overflow:hidden}.x .siteMap .vr{top:-16px;height:100%;border-left-width:1px}.x .siteMap .hr{top:16px;width:16px;border-top-width:1px}.x .siteMap li.active .vr,.x .siteMap li.active li .hr{display:block}.x .siteMap li li .vr,.x .siteMap li li li .hr{left:32px}.x .siteMap li li li .vr,.x .siteMap li li li li .hr{left:50px}.x .siteMap li li li li .vr,.x .siteMap li li li li li .hr{left:68px}.x .siteMap li li li li li .vr,.x .siteMap li li li li li li .hr{left:86px}.x .siteMap li li li li li li .vr,.x .siteMap li li li li li li li .hr{left:104px}.x .siteMap li li li li li li li .vr,.x .siteMap li li li li li li li li .hr{left:122px}.x .siteMap li li li li li li li li .vr,.x .siteMap li li li li li li li li li .hr{left:140px}.x .siteMap li li li li li li li li li .vr,.x .siteMap li li li li li li li li li li .hr{left:158px}.x .siteMap li li li li li li li li li li .vr,.x .siteMap li li li li li li li li li li li .hr{left:176px}.x .siteMap li li li li li li li li li li li .vr,.x .siteMap li li li li li li li li li li li li .hr{left:336px}.x .siteMap .side{padding-top:0 !important;padding-bottom:0 !important;line-height:30px;background:transparent !important}.x .siteMap .side button{text-indent:0;line-height:1}.x .siteMap .tgMap{position:absolute;top:12px;right:1em;padding:0 16px 0 0;line-height:16px;background:url(../img/iconArrow.gif) no-repeat right -126px}.x .siteMap.fold .tgMap{background-position:right -158px}.x .siteMap.fold .h2{border-bottom-color:#fff;border-radius:5px}.x .siteMap .placeholder{background:#bbb}.x .siteMap .draggable,.x .siteMap .draggable .moveTo{background-color:#ddd}.x .siteMap .draggable .summary{border-left:1px solid #ccc;padding-left:10px;margin-left:10px;font-size:11px;color:#999}.x .siteMap a.ms{text-decoration:underline}/* Multilingual */.x .langEdit{background:#fff;position:absolute;*left:0;*margin-top:28px;z-index:10}.x .langEdit ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0}.x .langEdit li{padding:.5em 10px}.x .langEdit input[type=text]{width:220px;padding-right:40px}.x .langEdit label{left:15px !important}.x .langEdit .action{border:1px solid #eee;width:268px;padding:0 10px}.x .langEdit p, .x .langEdit .btnArea{white-space:normal}.x .langEdit .langList,.x .langEdit .langEditControls{box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x .langEdit .langList{margin:0 -1px 0 0;display:none}.x .langEdit .langList li{white-space:nowrap;color:#ccc;width:270px} .x .langEdit .langList li span{display:inline-block;width:80px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:#767676}.x .langEdit .langList li a{display:inline-block;width:80px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.x .langEdit .langList li.active{background:url(../img/iconArrow.gif) no-repeat right -188px}.x .langEdit.showChild .langList{display:block}.x .langEdit .langInput{background:#fff}.x .langEdit .langInput h2{padding:5px 10px;margin:0 0 -1px 0;font-size:12px;font-weight:normal;color:#666;border:1px solid #eee;border-top-color:#ccc}.x .langEdit .langInput h2 strong{color:#000;font-size:14px}.x .langEdit.showChild .langInput{position:absolute;left:285px;top:0}.x .langEdit li.en input, .x .langEdit li.en textarea, .x .mLangEdit li.en textarea{background:url(../img/flag.us.gif) no-repeat 99% 5px}.x .langEdit li.ko input, .x .langEdit li.ko textarea, .x .mLangEdit li.ko textarea{background:url(../img/flag.kr.gif) no-repeat 99% 5px}.x .langEdit li.jp input, .x .langEdit li.jp textarea, .x .mLangEdit li.jp textarea{background:url(../img/flag.jp.gif) no-repeat 99% 5px}.x .langEdit li.fr input, .x .langEdit li.fr textarea, .x .mLangEdit li.fr textarea{background:url(../img/flag.fr.gif) no-repeat 99% 5px}.x .langEdit li.de input, .x .langEdit li.de textarea, .x .mLangEdit li.de textarea{background:url(../img/flag.de.gif) no-repeat 99% 5px}.x .langEdit li.ru input, .x .langEdit li.ru textarea, .x .mLangEdit li.ru textarea{background:url(../img/flag.ru.gif) no-repeat 99% 5px}.x .langEdit li.es input, .x .langEdit li.es textarea, .x .mLangEdit li.es textarea{background:url(../img/flag.es.gif) no-repeat 99% 5px}.x .langEdit li.tr input, .x .langEdit li.tr textarea, .x .mLangEdit li.tr textarea{background:url(../img/flag.tr.gif) no-repeat 99% 5px}.x .langEdit li.vi input, .x .langEdit li.vi textarea, .x .mLangEdit li.vi textarea{background:url(../img/flag.vn.gif) no-repeat 99% 5px}.x .langEdit li.mn input, .x .langEdit li.mn textarea, .x .mLangEdit li.mn textarea{background:url(../img/flag.mn.gif) no-repeat 99% 5px}.x .langEdit li.zh-CN input, .x .langEdit li.zh-CN textarea, .x .mLangEdit li.zh-CN textarea, .x .langEdit li.zh-TW input, .x .langEdit li.zh-TW textarea, .x .mLangEdit li.zh-TW textarea{background:url(../img/flag.cn.gif) no-repeat 99% 5px}.x .mLangEdit.en strong{background:url(../img/flag.us.gif) no-repeat 0 10px}.x .mLangEdit.ko strong{background:url(../img/flag.kr.gif) no-repeat 0 10px}.x .mLangEdit.jp strong{background:url(../img/flag.jp.gif) no-repeat 0 10px}.x .mLangEdit.fr strong{background:url(../img/flag.fr.gif) no-repeat 0 10px}.x .mLangEdit.de strong{background:url(../img/flag.de.gif) no-repeat 0 10px}.x .mLangEdit.ru strong{background:url(../img/flag.ru.gif) no-repeat 0 10px}.x .mLangEdit.es strong{background:url(../img/flag.es.gif) no-repeat 0 10px}.x .mLangEdit.tr strong{background:url(../img/flag.tr.gif) no-repeat 0 10px}.x .mLangEdit.vi strong{background:url(../img/flag.vn.gif) no-repeat 0 10px}.x .mLangEdit.mn strong{background:url(../img/flag.mn.gif) no-repeat 0 10px}.x .mLangEdit.zh-CN strong, .x .mLangEdit.zh-TW strong{background:url(../img/flag.cn.gif) no-repeat 0 10px}.x .mLangEdit ul ul{border:0}.x .mLangEdit li{position:relative;padding:0}.x .mLangEdit li strong{display:inline-block;padding:6px 100px 8px 24px;font-weight:normal;line-height:1.5}.x .mLangEdit li .side{position:absolute;top:8px;right:0;padding-right:18px;background:url(../img/iconArrow.gif) no-repeat right -160px}.x .mLangEdit li li{border:0;padding-right:36px}.x .mLangEdit li textarea{width:100%;height:16px;padding-right:30px;resize:vertical;line-height:1.4}.x .mLangEdit li label{top:8px !important}.x .mLangEdit li.active{background:#FFFDEF}.x .mLangEdit li.active strong{font-weight:bold}.x .mLangEdit li.active .side{background-position:right -128px}.modal .mLangEdit ul{padding-bottom:1em}.modal .mLangEdit li{border:0;padding-right:36px}/* Suggestion */.x .suggestion{display:none;position:absolute;background:#fff;z-index:10;_height:200px;max-height:200px;overflow:auto;*left:0;*margin-top:28px;box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x .suggestion ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0}.x .suggestion li{padding:0}.x .suggestion li:last-child{border-bottom:0}.x .suggestion li button{border:0;background:#fff;text-align:left;width:288px;padding:2px 4px;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.x .suggestion li button:hover,.x .suggestion li button:active,.x .suggestion li button:focus,.x .suggestion li button.active{background:#eee}/* Image Mark */.x #imageMark{right:0}/* Easy Installer */.x .easyNav{position:relative;border:1px solid #e9e9e9;zoom:1}.x .easyNav:after{content:"";display:block;clear:both}.x .easyNav h2{font-size:16px}.x .easyNav .category{width:30%;float:left;margin:0 2em;display:inline}.x .easyNav .filter{position:absolute;top:0;right:0;margin:1em 2em;text-align:right}.x .easyList td p{margin-top:0}.x .easyList td p.update{background:#ffc;padding:.5em 1em;border:1px solid #fc9;border-left:0;border-right:0;text-align:center}/* Font Preview */.x .fontPreview{width:96%;border:1px solid #e9e9e9;zoom:1;padding:1em 2em;margin:.5em 0}/* FTP Suggestion */.x #ftpSuggestion{background:#fff;box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x #ftpSuggestion ul{border-left:1px solid #eee;border-right:1px solid #eee}.x #ftpSuggestion li{padding:0}.x #ftpSuggestion li button{border:0;background:#fff;text-align:left;width:288px}.x #ftpSuggestion li button:hover,.x #ftpSuggestion li button:active,.x #ftpSuggestion li button:focus{background:#eee}/* Theme & Skin Preview */.x .thumbPreview li{position:relative;padding-left:10px;padding-right:10px}.x .thumbPreview li.active.highlight{background:#f9f9f9}.x .thumbPreview .prevToggle{position:absolute;top:8px;right:10px;line-height:16px;padding:0 18px 0 0;text-decoration:none;background:url(../img/iconArrow.gif) no-repeat right -32px}.x .thumbPreview li.active .prevToggle{background-position:right 0}.x .thumbPreview .a{border:0;margin:0;zoom:1}.x .thumbPreview .a:after{content:"";display:block;clear:both}.x .thumbPreview .i{float:left;vertical-align:top;margin:0 1em 1em 0;padding:0;border:0;zoom:1}.x .thumbPreview .i:after{content:"";display:block;clear:both}.x .thumbPreview .i .thumb{position:relative;width:124px;height:84px;padding:0;margin-bottom:3px;text-align:center;overflow:hidden;border:1px solid #ddd;display:block;cursor:pointer;background:#fff}.x .thumbPreview .i .thumb .frame{position:absolute;width:120px;height:80px;left:0;top:0;border:2px solid #fff;overflow:hidden}.x .thumbPreview .i .thumb img{width:120px;margin:0}.x .thumbPreview .i label{display:block;position:relative;top:0;left:2px;width:122px;height:1.1em;margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x .thumbPreview .i input{display:none}.x .thumbPreview .i ul{display:none}.x .thumbPreview .selected .i{display:block;float:none}.x .thumbPreview .selected .i .thumb{float:left;width:186px;height:126px;margin:0 1em 0 0;border:2px solid #eee}.x .thumbPreview .selected .i .thumb .frame{width:180px;height:120px;border-width:3px}.x .thumbPreview li.active.highlight .selected .i .thumb{border-color:#5ea8f6}.x .thumbPreview .selected .i .thumb img{width:180px;position:relative}.x .thumbPreview li.active .selected .i .thumb img{z-index:auto}.x .thumbPreview .selected .i label{cursor:text}.x .thumbPreview .selected .i ul{display:block;list-style:none;border:0;margin:1em 0 1em 200px}.x .thumbPreview .selected .i li{border:0;padding:0;margin:0 0 .2em 0}.x .thumbPreview.jx .i label{display:inline;width:auto}.x .thumbPreview.jx .i.noDirection{display:none}.x .thumbPreview.jx .i input{display:inline}.x #skin .showAll{float:right;border:0;overflow:visible;padding:0 18px 0 0;cursor:pointer;color:#00f;background:url(../img/iconArrow.gif) no-repeat right -32px}.x #skin .showAll.hideAll{background-position:right 0}/* Favorite On | Off */.x .fvOff,.x .fvOn{display:inline-block;width:16px;height:16px;overflow:hidden;text-indent:16px;background:url(../img/iconFavorite.gif) no-repeat}.x .fvOn{background-position:0 -16px}/* Up-Down Dragable */.x .uDrag .wrap{position:relative;padding-left:20px}.x .uDrag li>.wrap{margin:0 0 0 8px}.x .uDrag .dragActive{background:#FFD}.x .uDrag .dragActive th,.x .uDrag .dragActive td{background:none !important}.x .uDrag .dragBtn{position:absolute;width:8px;height:100%;padding:0;overflow:hidden;background:url(../img/bgDragable.gif);top:1px;left:0;text-indent:12px;border:0;cursor:n-resize;white-space:nowrap}/* Favicon Preview */.x .faviconPreview{position:relative;padding:60px 0 0 200px;background:url(../img/bgFavicon.gif) no-repeat}.x .faviconPreview img{position:absolute}.x .faviconPreview .fn1{top:30px;left:12px}.x .faviconPreview .fn2{top:55px;left:68px}/* Mobile Icon Preview */.x .mobiconPreview{position:relative;padding:252px 0 0 200px;background:url(../img/bgMobileTop.png) no-repeat}.x .mobiconPreview img{position:absolute;top:20px;left:10px}.x .mobiconPreview span{position:absolute;width:32px;text-align:center;top:52px;left:10px;color:#fff;font-size:9px}/* Text List */.x .textList{border:1px solid #ddd !important;line-height:1.5em;height:18.5em;overflow:auto}.x .textList li{border:0;padding:.25em 1em;height:1.5em;white-space:nowrap;overflow:hidden}.x .textList li:nth-child(even){background:#eee}.x .textList li a{float:right}/* File Box */.x .fileBox li{position:relative}.x .fileBox li img{max-width:100%}.x .fileBox .portlet ul{margin:1em;list-style:none;padding:0;border:0}.x .fileBox .portlet li{border-top:1px solid #ddd;border-bottom:0;padding:8px 0}.x .fileBox .side{position:absolute;top:8px;right:0}/* Messages */.x .desc.error{color:#f00}.x .desc.success{color:#080}/* Icon Button */.x a.iSetting{display:inline-block;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;vertical-align:middle;background:url(../img/iconSetting.gif) no-repeat}.x a.cMenu{display:inline-block;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;vertical-align:middle;background:url(../../../../common/img/icon.bubble.png) no-repeat}/* Responsive Layout */@media only all and (max-width:860px){.x .header h1{margin-left:.7em}.x .header .account{padding-right:1em}.x .body{padding:1em}.x .content{float:none;margin-left:0}.x .lnb{float:none;width:auto;margin:1em 0}.x .dashboard .portlet{float:none !important;width:auto !important;margin-right:0}.modal .fg,.wfsr .fg{width:auto}.x .easyNav .category{float:none;display:block;width:auto}.x .easyNav .filter{position:static}}@media only all and (max-width:640px){.x .skipNav a{position:relative;width:auto;height:auto}.modal{position:absolute}}/* Legacy Code (Don't use it. It will be removed as soon as possible.) */.x h3.xeAdmin,.x h4.xeAdmin{position:relative;border-bottom-style:solid;border-bottom-color:#ccc;zoom:1}.x h3.xeAdmin{border-bottom-width:4px;font-size:24px}.x h4.xeAdmin{border-bottom-width:3px;font-size:20px}.x h5.xeAdmin{border-bottom-width:2px;font-size:16px}.x h6.xeAdmin{border-bottom-width:1px;font-size:12px}.x .adminSearch{margin:1em 0}.x .adminSearch fieldset{border:1px solid #ccc;margin:0;padding:.5em 1em}.x .localNavigation{padding:0;list-style:none}.x .localNavigation li{display:inline}.x .localNavigation li.on a{font-weight:bold;color:#333;text-decoration:none}.x .localNavigation li:before{content:"| "}.x .localNavigation li:first-child:before{content:""}.x .summary{margin:1em 0}.x .rowTable,.x .colTable,.x .crossTable{margin:1em 0;border:0;border-collapse:collapse;border-top:2px solid #ccc;width:100%}.x .rowTable caption,.x .colTable caption,.x .crossTable caption{font-weight:bold;text-align:left;line-height:22px;padding:5px 0}.x .rowTable caption:after,.x .colTable caption:after,.x .crossTable caption:after{content:"";display:block;clear:both}.x .rowTable caption a,.x .colTable caption a,.x .crossTable caption a{font-weight:normal}.x .rowTable caption em,.x .colTable caption em,.x .crossTable caption em{float:right;font-style:normal;font-weight:normal;color:#e00;margin-left:1em}.x .rowTable caption strong,.x .colTable caption strong,.x .crossTable caption strong{color:#e00}.x .rowTable caption .side,.x .colTable caption .side,.x .crossTable caption .side{float:right;font-weight:normal;margin-left:1em}.x .rowTable th,.rowTable td,.x .colTable th,.rowTable td,.x .crossTable th,.rowTable td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd;white-space:nowrap}.x .rowTable th,.x .colTable th,.x .crossTable th{background:#f8f8f8}.x .rowTable thead th,.x .colTable thead th,.x .crossTable thead th{border-bottom:1px solid #999}.x .rowTable tfoot td,.x .colTable tfoot td,.x .crossTable tfoot td{font-weight:bold;background:#f8f8f8}.x .rowTable.even tbody tr:nth-of-type(even) td,.x .colTable.even tbody tr:nth-of-type(even) td,.x .crossTable.even tbody tr:nth-of-type(even) td{background-color:#fafafa}.x .rowTable td>input[type=text],.x .colTable td>input[type=text],.x .crossTable td>input[type=text]{margin:-1px 0 -3px 0 !important;vertical-align:middle}.x .rowTable img,.x .colTable img,.x .crossTable img{vertical-align:middle}.x .rowTable .title,.x .colTable .title,.x .crossTable .title,.x .rowTable .text,.x .colTable .text,.x .crossTable .text{white-space:normal}.x .rowTable input[type=text],.x .colTable input[type=text],.x .crossTable input[type=text],.x .rowTable input[type=password],.x .colTable input[type=password],.x .crossTable input[type=password],.x .rowTable input[type=file],.x .colTable input[type=file],.x .crossTable input[type=file],.x .rowTable textarea,.x .colTable textarea,.x .crossTable textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:transparent}.x .rowTable input[type=text],.x .colTable input[type=text],.x .crossTable input[type=text],.x .rowTable input[type=password],.x .colTable input[type=password],.x .crossTable input[type=password],.x .rowTable input[type=file],.x .colTable input[type=file],.x .crossTable input[type=file]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px}.x .clear:after{content:"";display:block;clear:both} \ No newline at end of file +@charset "utf-8";/* NHN (developers@xpressengine.com) *//* Element Reset */body{margin:0}header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{display:block}body>.popup{margin:1em}.x,.x table,.x input,.x textarea,.x select,.x button{font-family:Tahoma,Geneva,sans-serif;font-size:12px;color:#333}.x button,.x input[type=submit],.x input[type=reset],.x input[type=button]{cursor:pointer;overflow:visible}.x img{border:0}.x p{line-height:1.5}/* Section & Heading */.x .section{margin:1em 0;padding:0;border:0}.x .h1, .x .h2, .x .h3, .x .h4{position:relative;border-bottom-style:solid;border-bottom-color:#ccc;zoom:1}.x .h1{border-bottom-width:4px;font-size:24px}.x .h2{border-bottom-width:3px;font-size:20px}.x .h3{border-bottom-width:2px;font-size:16px}.x .h4{border-bottom-width:1px;font-size:12px}/* Portlet */.x .portlet{position:relative;border:1px solid #e9e9e9;margin:1em 0;padding:0;background:#fff;zoom:1;overflow:hidden;border-radius:5px}.x .portlet h2, .x .portlet h3{margin:0;padding:.5em 1em;font-size:14px;border:1px solid #fff;border-bottom:1px solid #e9e9e9;background:#f7f7f7;border-radius:5px 5px 0 0}.x .portlet p{margin:1em 1.2em}.x .portlet li{position:relative;padding-right:8em}.x .portlet .lined{margin:1px;padding:0;list-style:none}.x .portlet .lined li{padding:.5em 8em .5em 1em;border-top:1px solid #eee;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis}.x .portlet .lined li:first-child{border:0}.x .portlet .side{position:absolute;top:0;_top:1px;right:0;color:#666;background:#fff;padding:0 1em}.x .portlet .lined .side{padding:.5em 1em}.x .portlet .more{position:absolute;top:.5em;right:1em;text-decoration:none !important;color:#666}.x .portlet .more span{color:#999}.x .portlet .action{text-align:right;top:0;right:0;padding:.5em 1em .5em 3em;background:#fff;background:-webkit-gradient(linear, 0% 0%, 100% 0%, from(rgba(255,255,255,0)), to(rgba(255,255,255,1)), color-stop(15%, #fff));background:-moz-linear-gradient(left, rgba(255,255,255,0) 0, rgba(255,255,255,1) 15%)}.x .portlet .action a,.x .portlet .action button{margin-left:1em}.x .portlet .btnArea{border-top:1px solid #ddd;margin:0;padding:.5em 1em;margin:0 1px 1px 1px;background:#f7f7f7;border-radius:0 0 5px 5px}/* Table */.x .table{margin:1em 0}.x .table table{width:100%;border:0;border-collapse:collapse;border-top:2px solid #ccc}.x .table caption{font-weight:bold;text-align:left;line-height:22px;padding:5px 0}.x .table caption:after{content:"";display:block;clear:both}.x .table caption a{font-weight:normal}.x .table caption em{float:right;margin-left:1em}.x .table caption strong{color:#e00}.x .table caption .side{float:right;font-weight:normal;margin-left:1em}.x .table th,.x .table td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd;white-space:nowrap}.x .table th{background:#f8f8f8}.x .table thead th{border-bottom:1px solid #999}.x .table tfoot td{font-weight:bold;background:#f8f8f8}.x .table.even tbody tr:nth-of-type(even) td{background-color:#fafafa}.x .table td>input[type=text]{margin:-1px 0 -3px 0 !important;vertical-align:middle}.x .table img{vertical-align:middle}.x .table em{font-style:normal;font-weight:normal;color:#e00}.x .table .title,.x .table .text{white-space:normal}/* Form */.x .form{margin:1em 0;padding:0}.x .form fieldset{margin:0 0 2em 0;padding:0;border:0}.x .form em{font-style:normal;color:#e00}.x .form label{margin-right:1em;line-height:1;vertical-align:middle}.x .form input[type=checkbox]+label,.x .form input[type=radio]+label,.x .form input[type=file]{cursor:pointer}.x .form ul{position:relative;margin:0;padding:0;list-style:none;border-top:2px solid #ccc;border-bottom:1px solid #ccc;zoom:1}.x .form li{list-style:none;border:1px solid #ddd;border-left:0;border-right:0;margin:-1px 0;padding:8px 0;vertical-align:top;zoom:1}.x .form li:first-child{border-top:0}.x .form li>label:first-child{display:block;font-weight:bold}.x .form li label em{font-weight:normal}.x .form label.overlap{position:absolute;color:#aaa}.x .form input[type=text],.x .form input[type=password],.x .form input[type=file],.x .form textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:transparent}.x .form input[type=text],.x .form input[type=password],.x .form input[type=file]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px}.x .form input[type=text].loading,.x .form input.loading[type=password]{padding-right:24px;width:260px;background:transparent url(../img/preLoader16.gif) no-repeat 265px center}.x .form input[type=checkbox],.x .form input[type=radio]{margin:0;padding:0;width:13px;height:13px;vertical-align:middle}.x .form *[disabled=disabled]{background:#ddd !important;text-shadow:1px 1px 0 #fff}.x .form textarea{padding:3px 4px;vertical-align:top}.x .form span.desc, .x .form em.desc{line-height:22px;vertical-align:middle;margin:0 10px}.x .form p.desc{margin:.25em 0;line-height:1.4}.x .form .q{font-weight:bold;margin:0 0 5px 0}.x .form .a{margin:0 0 5px 0}.x .form .tgForm{margin-right:1em}.x .form .h1 + ul,.x .form .h2 + ul,.x .form .h3 + ul,.x .form .h4 + ul,.x .form .h1 + .table table, .x .form .h2 + .table table, .x .form .h3 + .table table, .x .form .h4 + .table table{border-top:0}/* Global Navigation Bar */.x .gnb{position:relative;clear:both;border:1px solid #c1c1c1;border-left:0;border-right:0;background-color:#efefef;background:#efefef -webkit-gradient(linear, 0% 0%, 0% 100%, from(#efefef), to(#dcdcdc));background:#efefef -moz-linear-gradient(top, #efefef, #dcdcdc);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#efefef, endColorStr=#dcdcdc);zoom:1}.x .gnb ul{margin:0;padding:0 0 0 2em;list-style:none;border:1px solid #fff;border-left:0;border-right:0;zoom:1}.x .gnb ul ul{position:absolute;top:30px;left:0;border:1px solid #ccc;border-top:0;padding:1px 0 0 0;background:#fff}.x .gnb ul:after{content:"";display:block;clear:both}.x .gnb li{position:relative;float:left;border:1px solid #fff;border-top:0;border-bottom:0;margin:0 -1px 0 0}.x .gnb li li{float:none;clear:both;overflow:hidden;border:0;border-top:1px dotted #ccc;margin:0;padding:2px}.x .gnb li li:first-child{border:0}.x .gnb li a{float:left;font-weight:bold;color:#333;font-size:12px;padding:8px 18px;white-space:nowrap;text-decoration:none;text-shadow:0 1px 0 #fff;zoom:1}.x .gnb li a:hover,.x .gnb li a:active,.x .gnb li a:focus,.x .gnb li.active a{background:#f4f4f4;border:1px solid #ccc;border-bottom:0;padding:7px 17px 8px 17px}.x .gnb li.activeOn a{background:#fff;border:1px solid #ccc;border-bottom:0;padding:7px 17px 8px 17px}.x .gnb li.active li a{display:block;float:none;color:#555;background:#fff;padding:5px 15px !important;font-weight:normal !important;border:0 !important}.x .gnb li.active li a:hover,.x .gnb li.active li a:active,.x .gnb li.active li a:focus{border:0;background:#eee}.x .gnb .setting{position:absolute;top:8px;right:2em;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;background:url(../img/iconSetting.gif) no-repeat center}.x .gnb.jx ul{display:block;position:static;padding:0}.x .gnb.jx li{float:none;clear:both;border-top:1px solid #ccc}.x .gnb.jx ul ul{border:0}.x .gnb.jx li li{border:0}.x .gnb.jx li a{float:none;display:block}.x .gnb.jx li a:hover,.x .gnb.jx li a:active,.x .gnb.jx li a:focus{background:none}.x .gnb.jx li.activeOn>a{background:#ddd}@media only all and (max-width:860px){.x .gnb ul{padding-left:1em}.x .gnb .setting{right:1em}}@media only all and (max-width:640px){.x .gnb ul{display:block;position:static;padding:0}.x .gnb li{float:none;clear:both;border-top:1px solid #ccc}.x .gnb ul ul{border:0;position:static}.x .gnb li li{border:0}.x .gnb li a{float:none;display:block}.x .gnb li a:hover,.x .gnb li a:active,.x .gnb li a:focus{background:none}.x .gnb li.activeOn>a{background:#ddd}}/* Favorite */.x .bmk{position:absolute;right:2em;bottom:10px;padding:0 0 0 20px;background:url(../img/iconFavorite.gif) no-repeat 0 -16px}.x .bmk ul{position:absolute;top:140%;right:0;list-style:none;margin:0;padding:5px 10px;border:1px solid #aaa;border-radius:5px;background:#fff;box-shadow:1px 1px 3px #aaa}.x .bmk li{position:relative;padding:3px 30px 3px 0;white-space:nowrap}.x .bmk li .action{position:absolute;top:0;right:0}.x .bmk li .action .text{text-decoration:none;width:16px;text-align:center;margin:0}@media only all and (max-width:640px){.x .bmk{position:static;background-color:#fff;padding:10px 20px;background:#fff}.x .bmk .tgAnchor{display:block}.x .bmk ul{position:relative;border:0;border-top:1px solid #ccc;border-radius:0;box-shadow:none;padding:0;margin:5px 0 0 0}.x .bmk li{position:relative;top:-1px;border-top:1px dotted #ccc}}/* Local Navigation */.x .lnb{position:relative;float:left;width:200px;margin:1em 0 1em -230px;line-height:normal;zoom:1;display:inline}.x .lnb .h2{margin-top:0}.x .lnb ul{margin:0;padding:0;list-style:none}.x .lnb li{position:relative;margin:0 0 -1px 0;vertical-align:top;zoom:1}.x .lnb li a{display:block;position:relative;padding:8px 10px;text-decoration:none;color:#666;font-weight:bold;background:#fafafa;border:1px solid #eee;zoom:1}.x .lnb li a .i{position:absolute;top:50%;left:100%;margin:-4px 0 0 -16px;width:8px;height:8px;color:#ccc;background:url(../img/iconNavVr.gif) no-repeat left top}.x .lnb li ul{padding:5px 0;background:#fff}.x .lnb li li{margin:0;border-top:1px dotted #ddd}.x .lnb li li:first-child{border:0}.x .lnb li li a{font-weight:normal;background:#fff;padding:5px 10px;border:0}.x .lnb li li a span{color:#666}.x .lnb li.active{border:1px solid #ccc;z-index:2}.x .lnb li li.active{border:0}.x .lnb li.active a{color:#000;border:0}.x .lnb li.active .i{background-position:0 -44px}.x .lnb li.active li a{border:0}.x .lnb li.active ul{display:block;border-top:1px solid #eee}.x .lnb li.active li.active a span{color:#13b200;font-weight:bold;letter-spacing:-1px}/* Content Navigation */.x .cnb{margin:1em 0;position:relative;zoom:1}.x .cnb:after{content:"";display:block;clear:both}.x .cnb ul{list-style:none;margin:0;padding:0}.x .cnb li{display:inline}.x .cnb li:before{content:"| ";color:#ccc}.x .cnb li:first-child:before{content:""}.x .cnb .active,.x .cnb .active a{font-weight:bold;color:#333;text-decoration:none}.x .cnb .side{float:right}/* Pagination */.x .pagination{margin:1em 0;text-align:center;line-height:normal}.x .pagination *{vertical-align:middle}.x .pagination a,.x .pagination strong{position:relative;display:inline-block;padding:2px 4px;font-weight:bold;text-decoration:none;line-height:normal;color:#333 !important;vertical-align:middle}.x .pagination a:hover,.x .pagination a:active,.x .pagination a:focus{border:1px solid #ddd;margin:0 -1px}.x .pagination strong{color:#e00 !important;font-size:20px}.x .pagination .direction{font-weight:normal;white-space:nowrap}.x .pagination .direction:hover,.x .pagination .direction:active,.x .pagination .direction:focus{border:0;margin:0;text-decoration:underline}.x .pagination input{width:30px;text-align:center}.x .pagination button{overflow:visible}/* Star Rating */.x .starRating, .x .starRating span{display:inline-block;height:14px;background:transparent url(../img/iconStarRating.gif) no-repeat;overflow:hidden}.x .starRating{width:79px;vertical-align:top}.x .starRating span{font-size:0;line-height:0;vertical-align:top;text-indent:-100px;*text-indent:0;background-position:0 -14px}/* Progress */.x .prgrs{white-space:nowrap;line-height:normal;vertical-align:middle}.x .prgrs *{vertical-align:middle}.x .prgrs .pBar{position:relative;display:inline-block;background:#e9e9e9;margin:0 5px 0 0}.x .prgrs .pAction{display:inline-block;vertical-align:top;background:#99a6b6}.x .prgrs .pNum{position:absolute;width:100%;left:0;top:0;text-align:center;text-shadow:1px 1px 0 #fff}.x .prgrs.prgrsSmall{font-size:14px;line-height:14px}.x .prgrs.prgrsSmall .pBar,.x .prgrs.prgrsSmall .pAction,.x .prgrs.prgrsSmall .pNum{height:16px;line-height:16px;font-size:11px}.x .prgrs.prgrsMedium{font-size:24px;line-height:24px}.x .prgrs.prgrsMedium .pBar,.x .prgrs.prgrsMedium .pAction,.x .prgrs.prgrsMedium .pNum{height:22px;line-height:22px;font-size:12px}.x .prgrs.prgrsLarge{font-size:38px;line-height:38px}.x .prgrs.prgrsLarge .pBar,.x .prgrs.prgrsLarge .pAction,.x .prgrs.prgrsLarge .pNum{height:34px;line-height:34px;font-size:14px}/* Modal Window */.modal{position:absolute;top:0;left:0;width:100%;_height:100%;min-height:100%;z-index:100}.modal .bg{position:absolute;background:#000;_background:none;width:100%;height:100%;opacity:.5;z-index:2;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1}.modal .fg{position:relative;width:80%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:3;zoom:1;border-radius:5px;box-shadow:0 0 6px #000}.modal ul, .modal ol, .modal .lined, .modal .table{margin-bottom:1em}.modal .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1}.modalClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px}.modalBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}html.modalContainer,body.modalContainer{_height:100%;_width:100%} /* IE6 only */ /* Layer */.x .layer,.x.layer{position:absolute;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:2;zoom:1;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;box-shadow:0 0 6px #666;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x .layer h2{font-size:14px}.x .layer ul, .x .layer ol, .x .layer .lined, .x .layer .table{margin-bottom:1em}.x .layerClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px}.x .layerBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}/* H2 Anchor */.x .h2Anchor{position:absolute;right:0;border:0;background:none;color:#00f;text-decoration:underline}/* Skip Navigation */.x .skipNav{margin:0;text-align:center;overflow:hidden}.x .skipNav a{position:absolute;width:1px;height:1px;display:block;color:#fff;font-weight:bold;padding:10px 0;background:#333;border-top:1px solid #656565}.x .skipNav a:hover,.x .skipNav a:active,.x .skipNav a:focus{position:relative;width:auto;height:auto}/* Header */.x .header{position:relative;z-index:2;padding:30px 0 0 0;background:#4c4c4c;box-shadow:0 0 10px #aaa;zoom:1}.x .header:after{content:"";display:block;clear:both}.x .header a{text-decoration:none}.x .header h1{margin:0 15px 10px 1.3em;font-size:24px;line-height:32px;display:inline-block;zoom:1}.x .header h1 *{vertical-align:middle}.x .header h1 a{color:#fff;text-shadow:1px 1px 0 #000;filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=1, OffY=1, Color=#000000, Positive=true);zoom:1}.x .header h1 .url{font-size:12px;font-weight:normal}.x .header .site{margin:0;display:inline-block;zoom:1}.x .header .site a{color:#fff;text-decoration:underline}.x .header #moveSiteList{padding:10px 1em 5px 1em;margin:0}.x .header #moveSiteList ul{list-style:none;margin:0;padding:0}.x .header #moveSiteList li{white-space:nowrap;margin:0;padding:4px 0;border-bottom:1px dotted #ccc}.x .header #siteMapList{padding:0 1em 1em 1em;margin:0}.x .header #siteMapList li{white-space:nowrap}.x .header .account{position:absolute;z-index:3;width:100%;padding:5px 2em 5px 0;top:0;right:0;white-space:nowrap;text-align:right;background:#333;border-bottom:1px solid #656565;color:#fff;font-size:12px;box-shadow:0 0 10px #333}.x .header .account ul{margin:0 2px 0 0;padding:0;list-style:none}.x .header .account li{position:relative;display:inline;border-left:1px solid #666;padding:0 6px 0 10px}.x .header .account li:first-child{border:0}.x .header .account a{color:#fff;display:inline-block;height:14px}.x .header .account a.language{padding-right:16px;background:url(../img/iconArrow.gif) no-repeat right -160px}.x .header #language{position:absolute;top:19px;right:-2em;padding:6px 4px !important;border:1px solid #666;border-top:0;background:#333}.x .header #language li{border:0;display:block;padding:1px 8px 1px 10px;text-align:left;line-height:1}.x .header #language li.selected{background:url(../img/iconCheck.gif) no-repeat left center}.x .header #language li.selected a{text-decoration:underline}.x .header h1 a:hover,.x .header h1 a:active,.x .header h1 a:focus,.x .header .account a:hover,.x .header .account a:active,.x .header .account a:focus{color:#6e9cf2;text-decoration:underline}/* Footer */.x .footer{border-top:1px solid #ddd;text-align:center;font-size:12px;padding:1.5em 0;margin:0 2em;zoom:1}.x .footer:after{content:"";display:block;clear:both}.x .footer p{margin:0}.x .footer .power{float:left}.x .footer .cache{float:right}/* Body */.x .body{position:relative;z-index:1;padding:1em 2em 1em 260px;zoom:1}.x .body:after{content:"";display:block;clear:both}/* Content */.x .content{float:right;width:100%;margin-left:-230px;zoom:1}.x .content:after{content:"";display:block;clear:both}.x .content a{color:#33a}.x .content a:hover,.x .content a:active,.x .content a:focus{color:#a33}.x .content .portlet a{text-decoration:none}.x .content .portlet a:hover,.x .content .portlet a:active,.x .content .portlet a:focus{text-decoration:underline}/* Dashboard */.x .dashboard{position:relative;float:none;width:auto;margin-left:-230px}.x .dashboard .portlet{float:left;width:48%;margin-right:1em}.x .dashboard .portlet:nth-of-type(odd){float:left;width:49%;margin-right:0}.x .dashboard .portlet:nth-of-type(even){float:right;width:49%;margin-right:0}@media only all and (min-width:1300px){.x .dashboard .portlet{float:left !important;width:32% !important;margin-right:1em !important}}/* Single Column*/.x .single{position:relative;float:none;width:auto;margin-left:-230px}/* Search */.x .search{zoom:1}.x .search:after{content:"";display:block;clear:both}.x .search .pagination{float:left;text-align:left}.x .search form{float:right;margin:1em 0}.x .search form *{vertical-align:middle}/* Site Map */.x .siteMap h2 input{font-size:14px;font-weight:bold;padding:0 .5em}.x .siteMap label{cursor:text}.x .siteMap .lined ul{padding:0;margin:0;border-top:1px solid #eee;zoom:1}.x .siteMap .lined li{position:relative;padding:0;margin:0;cursor:all-scroll;list-style:none;zoom:1}.x .siteMap .lined li li{border-top:1px solid #eee}.x .siteMap li li{text-indent:18px}.x .siteMap li li li{text-indent:36px}.x .siteMap li li li li{text-indent:54px}.x .siteMap li li li li li{text-indent:72px}.x .siteMap li li li li li li{text-indent:90px}.x .siteMap li li li li li li li{text-indent:108px}.x .siteMap li li li li li li li li{text-indent:126px}.x .siteMap li li li li li li li li li{text-indent:144px}.x .siteMap li li li li li li li li li li{text-indent:162px}.x .siteMap li li li li li li li li li li li{text-indent:180px}.x .siteMap li li li li li li li li li li li li{text-indent:198px}.x .siteMap li *{vertical-align:middle}.x .siteMap li .moveTo+input{width:200px;border:0;padding:0 .5em}.x .siteMap li .moveTo+input:hover,.x .siteMap li .moveTo+input:active,.x .siteMap li .moveTo+input:focus{border:1px dotted #ccc;overflow:visible}.x .siteMap .moveTo{position:relative;z-index:2;width:22px;height:32px;padding:32px 0 0 0;margin:0 3px;_margin-top:-1px;overflow:hidden;background:#fff url(../img/iconMoveTo.gif) no-repeat center 0;border:0;cursor:move}.x .siteMap li.active,.x .siteMap li.active .moveTo{background-color:#f7f7f7}.x .siteMap li.active li,.x .siteMap li.active ul{border-top-color:#f7f7f7}.x .siteMap li.active .moveTo{background-position:center -32px}.x .siteMap .vr,.x .siteMap .hr{display:none;position:absolute;z-index:1;left:14px;border:0px solid #ccc;overflow:hidden}.x .siteMap .vr{top:-16px;height:100%;border-left-width:1px}.x .siteMap .hr{top:16px;width:16px;border-top-width:1px}.x .siteMap li.active .vr,.x .siteMap li.active li .hr{display:block}.x .siteMap li li .vr,.x .siteMap li li li .hr{left:32px}.x .siteMap li li li .vr,.x .siteMap li li li li .hr{left:50px}.x .siteMap li li li li .vr,.x .siteMap li li li li li .hr{left:68px}.x .siteMap li li li li li .vr,.x .siteMap li li li li li li .hr{left:86px}.x .siteMap li li li li li li .vr,.x .siteMap li li li li li li li .hr{left:104px}.x .siteMap li li li li li li li .vr,.x .siteMap li li li li li li li li .hr{left:122px}.x .siteMap li li li li li li li li .vr,.x .siteMap li li li li li li li li li .hr{left:140px}.x .siteMap li li li li li li li li li .vr,.x .siteMap li li li li li li li li li li .hr{left:158px}.x .siteMap li li li li li li li li li li .vr,.x .siteMap li li li li li li li li li li li .hr{left:176px}.x .siteMap li li li li li li li li li li li .vr,.x .siteMap li li li li li li li li li li li li .hr{left:336px}.x .siteMap .side{padding-top:0 !important;padding-bottom:0 !important;line-height:30px;background:transparent !important}.x .siteMap .side button{text-indent:0;line-height:1}.x .siteMap .tgMap{position:absolute;top:12px;right:1em;padding:0 16px 0 0;line-height:16px;background:url(../img/iconArrow.gif) no-repeat right -126px}.x .siteMap.fold .tgMap{background-position:right -158px}.x .siteMap.fold .h2{border-bottom-color:#fff;border-radius:5px}.x .siteMap .placeholder{background:#bbb}.x .siteMap .draggable,.x .siteMap .draggable .moveTo{background-color:#ddd}.x .siteMap .draggable .summary{border-left:1px solid #ccc;padding-left:10px;margin-left:10px;font-size:11px;color:#999}.x .siteMap a.ms{text-decoration:underline}/* Multilingual */.x .langEdit{background:#fff;position:absolute;*left:0;*margin-top:28px;z-index:10}.x .langEdit ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0}.x .langEdit li{padding:.5em 10px}.x .langEdit input[type=text]{width:220px;padding-right:40px}.x .langEdit label{left:15px !important}.x .langEdit .action{border:1px solid #eee;width:268px;padding:0 10px}.x .langEdit p, .x .langEdit .btnArea{white-space:normal}.x .langEdit .langList,.x .langEdit .langEditControls{box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x .langEdit .langList{margin:0 -1px 0 0;display:none}.x .langEdit .langList li{white-space:nowrap;color:#ccc;width:270px} .x .langEdit .langList li span{display:inline-block;width:80px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:#767676}.x .langEdit .langList li a{display:inline-block;width:80px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.x .langEdit .langList li.active{background:url(../img/iconArrow.gif) no-repeat right -188px}.x .langEdit.showChild .langList{display:block}.x .langEdit .langInput{background:#fff}.x .langEdit .langInput h2{padding:5px 10px;margin:0 0 -1px 0;font-size:12px;font-weight:normal;color:#666;border:1px solid #eee;border-top-color:#ccc}.x .langEdit .langInput h2 strong{color:#000;font-size:14px}.x .langEdit.showChild .langInput{position:absolute;left:285px;top:0}.x .langEdit li.en input, .x .langEdit li.en textarea, .x .mLangEdit li.en textarea{background:url(../img/flag.us.gif) no-repeat 99% 5px}.x .langEdit li.ko input, .x .langEdit li.ko textarea, .x .mLangEdit li.ko textarea{background:url(../img/flag.kr.gif) no-repeat 99% 5px}.x .langEdit li.jp input, .x .langEdit li.jp textarea, .x .mLangEdit li.jp textarea{background:url(../img/flag.jp.gif) no-repeat 99% 5px}.x .langEdit li.fr input, .x .langEdit li.fr textarea, .x .mLangEdit li.fr textarea{background:url(../img/flag.fr.gif) no-repeat 99% 5px}.x .langEdit li.de input, .x .langEdit li.de textarea, .x .mLangEdit li.de textarea{background:url(../img/flag.de.gif) no-repeat 99% 5px}.x .langEdit li.ru input, .x .langEdit li.ru textarea, .x .mLangEdit li.ru textarea{background:url(../img/flag.ru.gif) no-repeat 99% 5px}.x .langEdit li.es input, .x .langEdit li.es textarea, .x .mLangEdit li.es textarea{background:url(../img/flag.es.gif) no-repeat 99% 5px}.x .langEdit li.tr input, .x .langEdit li.tr textarea, .x .mLangEdit li.tr textarea{background:url(../img/flag.tr.gif) no-repeat 99% 5px}.x .langEdit li.vi input, .x .langEdit li.vi textarea, .x .mLangEdit li.vi textarea{background:url(../img/flag.vn.gif) no-repeat 99% 5px}.x .langEdit li.mn input, .x .langEdit li.mn textarea, .x .mLangEdit li.mn textarea{background:url(../img/flag.mn.gif) no-repeat 99% 5px}.x .langEdit li.zh-CN input, .x .langEdit li.zh-CN textarea, .x .mLangEdit li.zh-CN textarea{background:url(../img/flag.cn.gif) no-repeat 99% 5px}.x .langEdit li.zh-TW input, .x .langEdit li.zh-TW textarea, .x .mLangEdit li.zh-TW textarea{background:url(../img/flag.tw.gif) no-repeat 99% 5px}.x .mLangEdit.en strong{background:url(../img/flag.us.gif) no-repeat 0 10px}.x .mLangEdit.ko strong{background:url(../img/flag.kr.gif) no-repeat 0 10px}.x .mLangEdit.jp strong{background:url(../img/flag.jp.gif) no-repeat 0 10px}.x .mLangEdit.fr strong{background:url(../img/flag.fr.gif) no-repeat 0 10px}.x .mLangEdit.de strong{background:url(../img/flag.de.gif) no-repeat 0 10px}.x .mLangEdit.ru strong{background:url(../img/flag.ru.gif) no-repeat 0 10px}.x .mLangEdit.es strong{background:url(../img/flag.es.gif) no-repeat 0 10px}.x .mLangEdit.tr strong{background:url(../img/flag.tr.gif) no-repeat 0 10px}.x .mLangEdit.vi strong{background:url(../img/flag.vn.gif) no-repeat 0 10px}.x .mLangEdit.mn strong{background:url(../img/flag.mn.gif) no-repeat 0 10px}.x .mLangEdit.zh-CN strong{background:url(../img/flag.cn.gif) no-repeat 0 10px}.x .mLangEdit.zh-TW strong{background:url(../img/flag.tw.gif) no-repeat 0 10px}.x .mLangEdit ul ul{border:0}.x .mLangEdit li{position:relative;padding:0}.x .mLangEdit li strong{display:inline-block;padding:6px 100px 8px 24px;font-weight:normal;line-height:1.5}.x .mLangEdit li .side{position:absolute;top:8px;right:0;padding-right:18px;background:url(../img/iconArrow.gif) no-repeat right -160px}.x .mLangEdit li li{border:0;padding-right:36px}.x .mLangEdit li textarea{width:100%;height:16px;padding-right:30px;resize:vertical;line-height:1.4}.x .mLangEdit li label{top:8px !important}.x .mLangEdit li.active{background:#FFFDEF}.x .mLangEdit li.active strong{font-weight:bold}.x .mLangEdit li.active .side{background-position:right -128px}.modal .mLangEdit ul{padding-bottom:1em}.modal .mLangEdit li{border:0;padding-right:36px}/* Suggestion */.x .suggestion{display:none;position:absolute;background:#fff;z-index:10;_height:200px;max-height:200px;overflow:auto;*left:0;*margin-top:28px;box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x .suggestion ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0}.x .suggestion li{padding:0}.x .suggestion li:last-child{border-bottom:0}.x .suggestion li button{border:0;background:#fff;text-align:left;width:288px;padding:2px 4px;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.x .suggestion li button:hover,.x .suggestion li button:active,.x .suggestion li button:focus,.x .suggestion li button.active{background:#eee}/* Image Mark */.x #imageMark{right:0}/* Easy Installer */.x .easyNav{position:relative;border:1px solid #e9e9e9;zoom:1}.x .easyNav:after{content:"";display:block;clear:both}.x .easyNav h2{font-size:16px}.x .easyNav .category{width:30%;float:left;margin:0 2em;display:inline}.x .easyNav .filter{position:absolute;top:0;right:0;margin:1em 2em;text-align:right}.x .easyList td p{margin-top:0}.x .easyList td p.update{background:#ffc;padding:.5em 1em;border:1px solid #fc9;border-left:0;border-right:0;text-align:center}/* Font Preview */.x .fontPreview{width:96%;border:1px solid #e9e9e9;zoom:1;padding:1em 2em;margin:.5em 0}/* FTP Suggestion */.x #ftpSuggestion{background:#fff;box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x #ftpSuggestion ul{border-left:1px solid #eee;border-right:1px solid #eee}.x #ftpSuggestion li{padding:0}.x #ftpSuggestion li button{border:0;background:#fff;text-align:left;width:288px}.x #ftpSuggestion li button:hover,.x #ftpSuggestion li button:active,.x #ftpSuggestion li button:focus{background:#eee}/* Theme & Skin Preview */.x .thumbPreview li{position:relative;padding-left:10px;padding-right:10px}.x .thumbPreview li.active.highlight{background:#f9f9f9}.x .thumbPreview .prevToggle{position:absolute;top:8px;right:10px;line-height:16px;padding:0 18px 0 0;text-decoration:none;background:url(../img/iconArrow.gif) no-repeat right -32px}.x .thumbPreview li.active .prevToggle{background-position:right 0}.x .thumbPreview .a{border:0;margin:0;zoom:1}.x .thumbPreview .a:after{content:"";display:block;clear:both}.x .thumbPreview .i{float:left;vertical-align:top;margin:0 1em 1em 0;padding:0;border:0;zoom:1}.x .thumbPreview .i:after{content:"";display:block;clear:both}.x .thumbPreview .i .thumb{position:relative;width:124px;height:84px;padding:0;margin-bottom:3px;text-align:center;overflow:hidden;border:1px solid #ddd;display:block;cursor:pointer;background:#fff}.x .thumbPreview .i .thumb .frame{position:absolute;width:120px;height:80px;left:0;top:0;border:2px solid #fff;overflow:hidden}.x .thumbPreview .i .thumb img{width:120px;margin:0}.x .thumbPreview .i label{display:block;position:relative;top:0;left:2px;width:122px;height:1.1em;margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x .thumbPreview .i input{display:none}.x .thumbPreview .i ul{display:none}.x .thumbPreview .selected .i{display:block;float:none}.x .thumbPreview .selected .i .thumb{float:left;width:186px;height:126px;margin:0 1em 0 0;border:2px solid #eee}.x .thumbPreview .selected .i .thumb .frame{width:180px;height:120px;border-width:3px}.x .thumbPreview li.active.highlight .selected .i .thumb{border-color:#5ea8f6}.x .thumbPreview .selected .i .thumb img{width:180px;position:relative}.x .thumbPreview li.active .selected .i .thumb img{z-index:auto}.x .thumbPreview .selected .i label{cursor:text}.x .thumbPreview .selected .i ul{display:block;list-style:none;border:0;margin:1em 0 1em 200px}.x .thumbPreview .selected .i li{border:0;padding:0;margin:0 0 .2em 0}.x .thumbPreview.jx .i label{display:inline;width:auto}.x .thumbPreview.jx .i.noDirection{display:none}.x .thumbPreview.jx .i input{display:inline}.x #skin .showAll{float:right;border:0;overflow:visible;padding:0 18px 0 0;cursor:pointer;color:#00f;background:url(../img/iconArrow.gif) no-repeat right -32px}.x #skin .showAll.hideAll{background-position:right 0}/* Favorite On | Off */.x .fvOff,.x .fvOn{display:inline-block;width:16px;height:16px;overflow:hidden;text-indent:16px;background:url(../img/iconFavorite.gif) no-repeat}.x .fvOn{background-position:0 -16px}/* Up-Down Dragable */.x .uDrag .wrap{position:relative;padding-left:20px}.x .uDrag li>.wrap{margin:0 0 0 8px}.x .uDrag .dragActive{background:#FFD}.x .uDrag .dragActive th,.x .uDrag .dragActive td{background:none !important}.x .uDrag .dragBtn{position:absolute;width:8px;height:100%;padding:0;overflow:hidden;background:url(../img/bgDragable.gif);top:1px;left:0;text-indent:12px;border:0;cursor:n-resize;white-space:nowrap}/* Favicon Preview */.x .faviconPreview{position:relative;padding:60px 0 0 200px;background:url(../img/bgFavicon.gif) no-repeat}.x .faviconPreview img{position:absolute}.x .faviconPreview .fn1{top:30px;left:12px}.x .faviconPreview .fn2{top:55px;left:68px}/* Mobile Icon Preview */.x .mobiconPreview{position:relative;padding:252px 0 0 200px;background:url(../img/bgMobileTop.png) no-repeat}.x .mobiconPreview img{position:absolute;top:20px;left:10px}.x .mobiconPreview span{position:absolute;width:32px;text-align:center;top:52px;left:10px;color:#fff;font-size:9px}/* Text List */.x .textList{border:1px solid #ddd !important;line-height:1.5em;height:18.5em;overflow:auto}.x .textList li{border:0;padding:.25em 1em;height:1.5em;white-space:nowrap;overflow:hidden}.x .textList li:nth-child(even){background:#eee}.x .textList li a{float:right}/* File Box */.x .fileBox li{position:relative}.x .fileBox li img{max-width:100%}.x .fileBox .portlet ul{margin:1em;list-style:none;padding:0;border:0}.x .fileBox .portlet li{border-top:1px solid #ddd;border-bottom:0;padding:8px 0}.x .fileBox .side{position:absolute;top:8px;right:0}/* Messages */.x .desc.error{color:#f00}.x .desc.success{color:#080}/* Icon Button */.x a.iSetting{display:inline-block;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;vertical-align:middle;background:url(../img/iconSetting.gif) no-repeat}.x a.cMenu{display:inline-block;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;vertical-align:middle;background:url(../../../../common/img/icon.bubble.png) no-repeat}/* Responsive Layout */@media only all and (max-width:860px){.x .header h1{margin-left:.7em}.x .header .account{padding-right:1em}.x .body{padding:1em}.x .content{float:none;margin-left:0}.x .lnb{float:none;width:auto;margin:1em 0}.x .dashboard .portlet{float:none !important;width:auto !important;margin-right:0}.modal .fg,.wfsr .fg{width:auto}.x .easyNav .category{float:none;display:block;width:auto}.x .easyNav .filter{position:static}}@media only all and (max-width:640px){.x .skipNav a{position:relative;width:auto;height:auto}.modal{position:absolute}}/* Legacy Code (Don't use it. It will be removed as soon as possible.) */.x h3.xeAdmin,.x h4.xeAdmin{position:relative;border-bottom-style:solid;border-bottom-color:#ccc;zoom:1}.x h3.xeAdmin{border-bottom-width:4px;font-size:24px}.x h4.xeAdmin{border-bottom-width:3px;font-size:20px}.x h5.xeAdmin{border-bottom-width:2px;font-size:16px}.x h6.xeAdmin{border-bottom-width:1px;font-size:12px}.x .adminSearch{margin:1em 0}.x .adminSearch fieldset{border:1px solid #ccc;margin:0;padding:.5em 1em}.x .localNavigation{padding:0;list-style:none}.x .localNavigation li{display:inline}.x .localNavigation li.on a{font-weight:bold;color:#333;text-decoration:none}.x .localNavigation li:before{content:"| "}.x .localNavigation li:first-child:before{content:""}.x .summary{margin:1em 0}.x .rowTable,.x .colTable,.x .crossTable{margin:1em 0;border:0;border-collapse:collapse;border-top:2px solid #ccc;width:100%}.x .rowTable caption,.x .colTable caption,.x .crossTable caption{font-weight:bold;text-align:left;line-height:22px;padding:5px 0}.x .rowTable caption:after,.x .colTable caption:after,.x .crossTable caption:after{content:"";display:block;clear:both}.x .rowTable caption a,.x .colTable caption a,.x .crossTable caption a{font-weight:normal}.x .rowTable caption em,.x .colTable caption em,.x .crossTable caption em{float:right;font-style:normal;font-weight:normal;color:#e00;margin-left:1em}.x .rowTable caption strong,.x .colTable caption strong,.x .crossTable caption strong{color:#e00}.x .rowTable caption .side,.x .colTable caption .side,.x .crossTable caption .side{float:right;font-weight:normal;margin-left:1em}.x .rowTable th,.rowTable td,.x .colTable th,.rowTable td,.x .crossTable th,.rowTable td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd;white-space:nowrap}.x .rowTable th,.x .colTable th,.x .crossTable th{background:#f8f8f8}.x .rowTable thead th,.x .colTable thead th,.x .crossTable thead th{border-bottom:1px solid #999}.x .rowTable tfoot td,.x .colTable tfoot td,.x .crossTable tfoot td{font-weight:bold;background:#f8f8f8}.x .rowTable.even tbody tr:nth-of-type(even) td,.x .colTable.even tbody tr:nth-of-type(even) td,.x .crossTable.even tbody tr:nth-of-type(even) td{background-color:#fafafa}.x .rowTable td>input[type=text],.x .colTable td>input[type=text],.x .crossTable td>input[type=text]{margin:-1px 0 -3px 0 !important;vertical-align:middle}.x .rowTable img,.x .colTable img,.x .crossTable img{vertical-align:middle}.x .rowTable .title,.x .colTable .title,.x .crossTable .title,.x .rowTable .text,.x .colTable .text,.x .crossTable .text{white-space:normal}.x .rowTable input[type=text],.x .colTable input[type=text],.x .crossTable input[type=text],.x .rowTable input[type=password],.x .colTable input[type=password],.x .crossTable input[type=password],.x .rowTable input[type=file],.x .colTable input[type=file],.x .crossTable input[type=file],.x .rowTable textarea,.x .colTable textarea,.x .crossTable textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:transparent}.x .rowTable input[type=text],.x .colTable input[type=text],.x .crossTable input[type=text],.x .rowTable input[type=password],.x .colTable input[type=password],.x .crossTable input[type=password],.x .rowTable input[type=file],.x .colTable input[type=file],.x .crossTable input[type=file]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px}.x .clear:after{content:"";display:block;clear:both} \ No newline at end of file diff --git a/modules/admin/tpl/img/flag.tw.gif b/modules/admin/tpl/img/flag.tw.gif new file mode 100644 index 0000000000000000000000000000000000000000..cacfd9b7aacab39f8975b3567d65ab0ac0e62813 GIT binary patch literal 367 zcmV-#0g(PjNk%w1VGsZd0M!5hT!hm2HZ}K4OZjVVgrwg97pwU^Jz|N}_C!RuxaX3R z+42(;bClWlEiLvcD)KHa_)=2!B_;a+0Qpu|03onbeb4kDAby|S@eK`4c+2`gK<)ql z^*%o4008@8Ve~pW_b@Q~MMd@i0P+9;>Hq-Z008;<{h68F^dBGd85#U$X8K)S`8qmR zfzkU)N%Jx?-v9u8o!jg|OYt^3?MF~|nc4IrvLjctHMir)KbL%AFn40IVgYk3wN9R)E505}yH88dhhC@CKu z5(7LgAsQ@&lqm}~Ndugopp^>?FEA1+ou3VPsu&m#Fd|zMT>=OQ93M9?4-Y;}PERBx N9UUblFh0^j06S#9jNSkM literal 0 HcmV?d00001 From e2786ca15d4f0c12f91d3c599bc20879a5cdb348 Mon Sep 17 00:00:00 2001 From: ovclas Date: Mon, 17 Oct 2011 09:33:00 +0000 Subject: [PATCH 1195/1372] issue 526 when header menu click in member module, should not be remembered message type, message serial number git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9669 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/member/skins/default/common_header.html | 2 +- widgets/login_info/skins/xe_official/login_info.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/member/skins/default/common_header.html b/modules/member/skins/default/common_header.html index edf88a142..6d0bee14a 100644 --- a/modules/member/skins/default/common_header.html +++ b/modules/member/skins/default/common_header.html @@ -4,7 +4,7 @@ diff --git a/widgets/login_info/skins/xe_official/login_info.html b/widgets/login_info/skins/xe_official/login_info.html index da7464161..63e9ba7a1 100644 --- a/widgets/login_info/skins/xe_official/login_info.html +++ b/widgets/login_info/skins/xe_official/login_info.html @@ -10,7 +10,7 @@

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

                                                      From ee0fa34f5f961efbd7a65b313cf93cad560d8e08 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Mon, 17 Oct 2011 09:58:02 +0000 Subject: [PATCH 1196/1372] heading+table, heading+ul CSS fix. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9670 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/tpl/css/admin.css | 16 ++++++++-------- modules/admin/tpl/css/admin.min.css | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/modules/admin/tpl/css/admin.css b/modules/admin/tpl/css/admin.css index 558322129..b748d6802 100644 --- a/modules/admin/tpl/css/admin.css +++ b/modules/admin/tpl/css/admin.css @@ -26,6 +26,14 @@ body>.popup{margin:1em} .x .h2{border-bottom-width:3px;font-size:20px} .x .h3{border-bottom-width:2px;font-size:16px} .x .h4{border-bottom-width:1px;font-size:12px} +.x .h1 + ul, +.x .h2 + ul, +.x .h3 + ul, +.x .h4 + ul, +.x .h1 + .table table, +.x .h2 + .table table, +.x .h3 + .table table, +.x .h4 + .table table{border-top:0} /* Portlet */ .x .portlet{position:relative;border:1px solid #e9e9e9;margin:1em 0;padding:0;background:#fff;zoom:1;overflow:hidden;border-radius:5px} .x .portlet h2, @@ -96,14 +104,6 @@ body>.popup{margin:1em} .x .form .q{font-weight:bold;margin:0 0 5px 0} .x .form .a{margin:0 0 5px 0} .x .form .tgForm{margin-right:1em} -.x .form .h1 + ul, -.x .form .h2 + ul, -.x .form .h3 + ul, -.x .form .h4 + ul, -.x .form .h1 + .table table, -.x .form .h2 + .table table, -.x .form .h3 + .table table, -.x .form .h4 + .table table{border-top:0} /* Global Navigation Bar */ .x .gnb{position:relative;clear:both;border:1px solid #c1c1c1;border-left:0;border-right:0;background-color:#efefef;background:#efefef -webkit-gradient(linear, 0% 0%, 0% 100%, from(#efefef), to(#dcdcdc));background:#efefef -moz-linear-gradient(top, #efefef, #dcdcdc);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#efefef, endColorStr=#dcdcdc);zoom:1} .x .gnb ul{margin:0;padding:0 0 0 2em;list-style:none;border:1px solid #fff;border-left:0;border-right:0;zoom:1} diff --git a/modules/admin/tpl/css/admin.min.css b/modules/admin/tpl/css/admin.min.css index 97e3b8fcc..cc5803b85 100644 --- a/modules/admin/tpl/css/admin.min.css +++ b/modules/admin/tpl/css/admin.min.css @@ -1 +1 @@ -@charset "utf-8";/* NHN (developers@xpressengine.com) *//* Element Reset */body{margin:0}header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{display:block}body>.popup{margin:1em}.x,.x table,.x input,.x textarea,.x select,.x button{font-family:Tahoma,Geneva,sans-serif;font-size:12px;color:#333}.x button,.x input[type=submit],.x input[type=reset],.x input[type=button]{cursor:pointer;overflow:visible}.x img{border:0}.x p{line-height:1.5}/* Section & Heading */.x .section{margin:1em 0;padding:0;border:0}.x .h1, .x .h2, .x .h3, .x .h4{position:relative;border-bottom-style:solid;border-bottom-color:#ccc;zoom:1}.x .h1{border-bottom-width:4px;font-size:24px}.x .h2{border-bottom-width:3px;font-size:20px}.x .h3{border-bottom-width:2px;font-size:16px}.x .h4{border-bottom-width:1px;font-size:12px}/* Portlet */.x .portlet{position:relative;border:1px solid #e9e9e9;margin:1em 0;padding:0;background:#fff;zoom:1;overflow:hidden;border-radius:5px}.x .portlet h2, .x .portlet h3{margin:0;padding:.5em 1em;font-size:14px;border:1px solid #fff;border-bottom:1px solid #e9e9e9;background:#f7f7f7;border-radius:5px 5px 0 0}.x .portlet p{margin:1em 1.2em}.x .portlet li{position:relative;padding-right:8em}.x .portlet .lined{margin:1px;padding:0;list-style:none}.x .portlet .lined li{padding:.5em 8em .5em 1em;border-top:1px solid #eee;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis}.x .portlet .lined li:first-child{border:0}.x .portlet .side{position:absolute;top:0;_top:1px;right:0;color:#666;background:#fff;padding:0 1em}.x .portlet .lined .side{padding:.5em 1em}.x .portlet .more{position:absolute;top:.5em;right:1em;text-decoration:none !important;color:#666}.x .portlet .more span{color:#999}.x .portlet .action{text-align:right;top:0;right:0;padding:.5em 1em .5em 3em;background:#fff;background:-webkit-gradient(linear, 0% 0%, 100% 0%, from(rgba(255,255,255,0)), to(rgba(255,255,255,1)), color-stop(15%, #fff));background:-moz-linear-gradient(left, rgba(255,255,255,0) 0, rgba(255,255,255,1) 15%)}.x .portlet .action a,.x .portlet .action button{margin-left:1em}.x .portlet .btnArea{border-top:1px solid #ddd;margin:0;padding:.5em 1em;margin:0 1px 1px 1px;background:#f7f7f7;border-radius:0 0 5px 5px}/* Table */.x .table{margin:1em 0}.x .table table{width:100%;border:0;border-collapse:collapse;border-top:2px solid #ccc}.x .table caption{font-weight:bold;text-align:left;line-height:22px;padding:5px 0}.x .table caption:after{content:"";display:block;clear:both}.x .table caption a{font-weight:normal}.x .table caption em{float:right;margin-left:1em}.x .table caption strong{color:#e00}.x .table caption .side{float:right;font-weight:normal;margin-left:1em}.x .table th,.x .table td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd;white-space:nowrap}.x .table th{background:#f8f8f8}.x .table thead th{border-bottom:1px solid #999}.x .table tfoot td{font-weight:bold;background:#f8f8f8}.x .table.even tbody tr:nth-of-type(even) td{background-color:#fafafa}.x .table td>input[type=text]{margin:-1px 0 -3px 0 !important;vertical-align:middle}.x .table img{vertical-align:middle}.x .table em{font-style:normal;font-weight:normal;color:#e00}.x .table .title,.x .table .text{white-space:normal}/* Form */.x .form{margin:1em 0;padding:0}.x .form fieldset{margin:0 0 2em 0;padding:0;border:0}.x .form em{font-style:normal;color:#e00}.x .form label{margin-right:1em;line-height:1;vertical-align:middle}.x .form input[type=checkbox]+label,.x .form input[type=radio]+label,.x .form input[type=file]{cursor:pointer}.x .form ul{position:relative;margin:0;padding:0;list-style:none;border-top:2px solid #ccc;border-bottom:1px solid #ccc;zoom:1}.x .form li{list-style:none;border:1px solid #ddd;border-left:0;border-right:0;margin:-1px 0;padding:8px 0;vertical-align:top;zoom:1}.x .form li:first-child{border-top:0}.x .form li>label:first-child{display:block;font-weight:bold}.x .form li label em{font-weight:normal}.x .form label.overlap{position:absolute;color:#aaa}.x .form input[type=text],.x .form input[type=password],.x .form input[type=file],.x .form textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:transparent}.x .form input[type=text],.x .form input[type=password],.x .form input[type=file]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px}.x .form input[type=text].loading,.x .form input.loading[type=password]{padding-right:24px;width:260px;background:transparent url(../img/preLoader16.gif) no-repeat 265px center}.x .form input[type=checkbox],.x .form input[type=radio]{margin:0;padding:0;width:13px;height:13px;vertical-align:middle}.x .form *[disabled=disabled]{background:#ddd !important;text-shadow:1px 1px 0 #fff}.x .form textarea{padding:3px 4px;vertical-align:top}.x .form span.desc, .x .form em.desc{line-height:22px;vertical-align:middle;margin:0 10px}.x .form p.desc{margin:.25em 0;line-height:1.4}.x .form .q{font-weight:bold;margin:0 0 5px 0}.x .form .a{margin:0 0 5px 0}.x .form .tgForm{margin-right:1em}.x .form .h1 + ul,.x .form .h2 + ul,.x .form .h3 + ul,.x .form .h4 + ul,.x .form .h1 + .table table, .x .form .h2 + .table table, .x .form .h3 + .table table, .x .form .h4 + .table table{border-top:0}/* Global Navigation Bar */.x .gnb{position:relative;clear:both;border:1px solid #c1c1c1;border-left:0;border-right:0;background-color:#efefef;background:#efefef -webkit-gradient(linear, 0% 0%, 0% 100%, from(#efefef), to(#dcdcdc));background:#efefef -moz-linear-gradient(top, #efefef, #dcdcdc);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#efefef, endColorStr=#dcdcdc);zoom:1}.x .gnb ul{margin:0;padding:0 0 0 2em;list-style:none;border:1px solid #fff;border-left:0;border-right:0;zoom:1}.x .gnb ul ul{position:absolute;top:30px;left:0;border:1px solid #ccc;border-top:0;padding:1px 0 0 0;background:#fff}.x .gnb ul:after{content:"";display:block;clear:both}.x .gnb li{position:relative;float:left;border:1px solid #fff;border-top:0;border-bottom:0;margin:0 -1px 0 0}.x .gnb li li{float:none;clear:both;overflow:hidden;border:0;border-top:1px dotted #ccc;margin:0;padding:2px}.x .gnb li li:first-child{border:0}.x .gnb li a{float:left;font-weight:bold;color:#333;font-size:12px;padding:8px 18px;white-space:nowrap;text-decoration:none;text-shadow:0 1px 0 #fff;zoom:1}.x .gnb li a:hover,.x .gnb li a:active,.x .gnb li a:focus,.x .gnb li.active a{background:#f4f4f4;border:1px solid #ccc;border-bottom:0;padding:7px 17px 8px 17px}.x .gnb li.activeOn a{background:#fff;border:1px solid #ccc;border-bottom:0;padding:7px 17px 8px 17px}.x .gnb li.active li a{display:block;float:none;color:#555;background:#fff;padding:5px 15px !important;font-weight:normal !important;border:0 !important}.x .gnb li.active li a:hover,.x .gnb li.active li a:active,.x .gnb li.active li a:focus{border:0;background:#eee}.x .gnb .setting{position:absolute;top:8px;right:2em;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;background:url(../img/iconSetting.gif) no-repeat center}.x .gnb.jx ul{display:block;position:static;padding:0}.x .gnb.jx li{float:none;clear:both;border-top:1px solid #ccc}.x .gnb.jx ul ul{border:0}.x .gnb.jx li li{border:0}.x .gnb.jx li a{float:none;display:block}.x .gnb.jx li a:hover,.x .gnb.jx li a:active,.x .gnb.jx li a:focus{background:none}.x .gnb.jx li.activeOn>a{background:#ddd}@media only all and (max-width:860px){.x .gnb ul{padding-left:1em}.x .gnb .setting{right:1em}}@media only all and (max-width:640px){.x .gnb ul{display:block;position:static;padding:0}.x .gnb li{float:none;clear:both;border-top:1px solid #ccc}.x .gnb ul ul{border:0;position:static}.x .gnb li li{border:0}.x .gnb li a{float:none;display:block}.x .gnb li a:hover,.x .gnb li a:active,.x .gnb li a:focus{background:none}.x .gnb li.activeOn>a{background:#ddd}}/* Favorite */.x .bmk{position:absolute;right:2em;bottom:10px;padding:0 0 0 20px;background:url(../img/iconFavorite.gif) no-repeat 0 -16px}.x .bmk ul{position:absolute;top:140%;right:0;list-style:none;margin:0;padding:5px 10px;border:1px solid #aaa;border-radius:5px;background:#fff;box-shadow:1px 1px 3px #aaa}.x .bmk li{position:relative;padding:3px 30px 3px 0;white-space:nowrap}.x .bmk li .action{position:absolute;top:0;right:0}.x .bmk li .action .text{text-decoration:none;width:16px;text-align:center;margin:0}@media only all and (max-width:640px){.x .bmk{position:static;background-color:#fff;padding:10px 20px;background:#fff}.x .bmk .tgAnchor{display:block}.x .bmk ul{position:relative;border:0;border-top:1px solid #ccc;border-radius:0;box-shadow:none;padding:0;margin:5px 0 0 0}.x .bmk li{position:relative;top:-1px;border-top:1px dotted #ccc}}/* Local Navigation */.x .lnb{position:relative;float:left;width:200px;margin:1em 0 1em -230px;line-height:normal;zoom:1;display:inline}.x .lnb .h2{margin-top:0}.x .lnb ul{margin:0;padding:0;list-style:none}.x .lnb li{position:relative;margin:0 0 -1px 0;vertical-align:top;zoom:1}.x .lnb li a{display:block;position:relative;padding:8px 10px;text-decoration:none;color:#666;font-weight:bold;background:#fafafa;border:1px solid #eee;zoom:1}.x .lnb li a .i{position:absolute;top:50%;left:100%;margin:-4px 0 0 -16px;width:8px;height:8px;color:#ccc;background:url(../img/iconNavVr.gif) no-repeat left top}.x .lnb li ul{padding:5px 0;background:#fff}.x .lnb li li{margin:0;border-top:1px dotted #ddd}.x .lnb li li:first-child{border:0}.x .lnb li li a{font-weight:normal;background:#fff;padding:5px 10px;border:0}.x .lnb li li a span{color:#666}.x .lnb li.active{border:1px solid #ccc;z-index:2}.x .lnb li li.active{border:0}.x .lnb li.active a{color:#000;border:0}.x .lnb li.active .i{background-position:0 -44px}.x .lnb li.active li a{border:0}.x .lnb li.active ul{display:block;border-top:1px solid #eee}.x .lnb li.active li.active a span{color:#13b200;font-weight:bold;letter-spacing:-1px}/* Content Navigation */.x .cnb{margin:1em 0;position:relative;zoom:1}.x .cnb:after{content:"";display:block;clear:both}.x .cnb ul{list-style:none;margin:0;padding:0}.x .cnb li{display:inline}.x .cnb li:before{content:"| ";color:#ccc}.x .cnb li:first-child:before{content:""}.x .cnb .active,.x .cnb .active a{font-weight:bold;color:#333;text-decoration:none}.x .cnb .side{float:right}/* Pagination */.x .pagination{margin:1em 0;text-align:center;line-height:normal}.x .pagination *{vertical-align:middle}.x .pagination a,.x .pagination strong{position:relative;display:inline-block;padding:2px 4px;font-weight:bold;text-decoration:none;line-height:normal;color:#333 !important;vertical-align:middle}.x .pagination a:hover,.x .pagination a:active,.x .pagination a:focus{border:1px solid #ddd;margin:0 -1px}.x .pagination strong{color:#e00 !important;font-size:20px}.x .pagination .direction{font-weight:normal;white-space:nowrap}.x .pagination .direction:hover,.x .pagination .direction:active,.x .pagination .direction:focus{border:0;margin:0;text-decoration:underline}.x .pagination input{width:30px;text-align:center}.x .pagination button{overflow:visible}/* Star Rating */.x .starRating, .x .starRating span{display:inline-block;height:14px;background:transparent url(../img/iconStarRating.gif) no-repeat;overflow:hidden}.x .starRating{width:79px;vertical-align:top}.x .starRating span{font-size:0;line-height:0;vertical-align:top;text-indent:-100px;*text-indent:0;background-position:0 -14px}/* Progress */.x .prgrs{white-space:nowrap;line-height:normal;vertical-align:middle}.x .prgrs *{vertical-align:middle}.x .prgrs .pBar{position:relative;display:inline-block;background:#e9e9e9;margin:0 5px 0 0}.x .prgrs .pAction{display:inline-block;vertical-align:top;background:#99a6b6}.x .prgrs .pNum{position:absolute;width:100%;left:0;top:0;text-align:center;text-shadow:1px 1px 0 #fff}.x .prgrs.prgrsSmall{font-size:14px;line-height:14px}.x .prgrs.prgrsSmall .pBar,.x .prgrs.prgrsSmall .pAction,.x .prgrs.prgrsSmall .pNum{height:16px;line-height:16px;font-size:11px}.x .prgrs.prgrsMedium{font-size:24px;line-height:24px}.x .prgrs.prgrsMedium .pBar,.x .prgrs.prgrsMedium .pAction,.x .prgrs.prgrsMedium .pNum{height:22px;line-height:22px;font-size:12px}.x .prgrs.prgrsLarge{font-size:38px;line-height:38px}.x .prgrs.prgrsLarge .pBar,.x .prgrs.prgrsLarge .pAction,.x .prgrs.prgrsLarge .pNum{height:34px;line-height:34px;font-size:14px}/* Modal Window */.modal{position:absolute;top:0;left:0;width:100%;_height:100%;min-height:100%;z-index:100}.modal .bg{position:absolute;background:#000;_background:none;width:100%;height:100%;opacity:.5;z-index:2;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1}.modal .fg{position:relative;width:80%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:3;zoom:1;border-radius:5px;box-shadow:0 0 6px #000}.modal ul, .modal ol, .modal .lined, .modal .table{margin-bottom:1em}.modal .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1}.modalClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px}.modalBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}html.modalContainer,body.modalContainer{_height:100%;_width:100%} /* IE6 only */ /* Layer */.x .layer,.x.layer{position:absolute;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:2;zoom:1;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;box-shadow:0 0 6px #666;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x .layer h2{font-size:14px}.x .layer ul, .x .layer ol, .x .layer .lined, .x .layer .table{margin-bottom:1em}.x .layerClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px}.x .layerBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}/* H2 Anchor */.x .h2Anchor{position:absolute;right:0;border:0;background:none;color:#00f;text-decoration:underline}/* Skip Navigation */.x .skipNav{margin:0;text-align:center;overflow:hidden}.x .skipNav a{position:absolute;width:1px;height:1px;display:block;color:#fff;font-weight:bold;padding:10px 0;background:#333;border-top:1px solid #656565}.x .skipNav a:hover,.x .skipNav a:active,.x .skipNav a:focus{position:relative;width:auto;height:auto}/* Header */.x .header{position:relative;z-index:2;padding:30px 0 0 0;background:#4c4c4c;box-shadow:0 0 10px #aaa;zoom:1}.x .header:after{content:"";display:block;clear:both}.x .header a{text-decoration:none}.x .header h1{margin:0 15px 10px 1.3em;font-size:24px;line-height:32px;display:inline-block;zoom:1}.x .header h1 *{vertical-align:middle}.x .header h1 a{color:#fff;text-shadow:1px 1px 0 #000;filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=1, OffY=1, Color=#000000, Positive=true);zoom:1}.x .header h1 .url{font-size:12px;font-weight:normal}.x .header .site{margin:0;display:inline-block;zoom:1}.x .header .site a{color:#fff;text-decoration:underline}.x .header #moveSiteList{padding:10px 1em 5px 1em;margin:0}.x .header #moveSiteList ul{list-style:none;margin:0;padding:0}.x .header #moveSiteList li{white-space:nowrap;margin:0;padding:4px 0;border-bottom:1px dotted #ccc}.x .header #siteMapList{padding:0 1em 1em 1em;margin:0}.x .header #siteMapList li{white-space:nowrap}.x .header .account{position:absolute;z-index:3;width:100%;padding:5px 2em 5px 0;top:0;right:0;white-space:nowrap;text-align:right;background:#333;border-bottom:1px solid #656565;color:#fff;font-size:12px;box-shadow:0 0 10px #333}.x .header .account ul{margin:0 2px 0 0;padding:0;list-style:none}.x .header .account li{position:relative;display:inline;border-left:1px solid #666;padding:0 6px 0 10px}.x .header .account li:first-child{border:0}.x .header .account a{color:#fff;display:inline-block;height:14px}.x .header .account a.language{padding-right:16px;background:url(../img/iconArrow.gif) no-repeat right -160px}.x .header #language{position:absolute;top:19px;right:-2em;padding:6px 4px !important;border:1px solid #666;border-top:0;background:#333}.x .header #language li{border:0;display:block;padding:1px 8px 1px 10px;text-align:left;line-height:1}.x .header #language li.selected{background:url(../img/iconCheck.gif) no-repeat left center}.x .header #language li.selected a{text-decoration:underline}.x .header h1 a:hover,.x .header h1 a:active,.x .header h1 a:focus,.x .header .account a:hover,.x .header .account a:active,.x .header .account a:focus{color:#6e9cf2;text-decoration:underline}/* Footer */.x .footer{border-top:1px solid #ddd;text-align:center;font-size:12px;padding:1.5em 0;margin:0 2em;zoom:1}.x .footer:after{content:"";display:block;clear:both}.x .footer p{margin:0}.x .footer .power{float:left}.x .footer .cache{float:right}/* Body */.x .body{position:relative;z-index:1;padding:1em 2em 1em 260px;zoom:1}.x .body:after{content:"";display:block;clear:both}/* Content */.x .content{float:right;width:100%;margin-left:-230px;zoom:1}.x .content:after{content:"";display:block;clear:both}.x .content a{color:#33a}.x .content a:hover,.x .content a:active,.x .content a:focus{color:#a33}.x .content .portlet a{text-decoration:none}.x .content .portlet a:hover,.x .content .portlet a:active,.x .content .portlet a:focus{text-decoration:underline}/* Dashboard */.x .dashboard{position:relative;float:none;width:auto;margin-left:-230px}.x .dashboard .portlet{float:left;width:48%;margin-right:1em}.x .dashboard .portlet:nth-of-type(odd){float:left;width:49%;margin-right:0}.x .dashboard .portlet:nth-of-type(even){float:right;width:49%;margin-right:0}@media only all and (min-width:1300px){.x .dashboard .portlet{float:left !important;width:32% !important;margin-right:1em !important}}/* Single Column*/.x .single{position:relative;float:none;width:auto;margin-left:-230px}/* Search */.x .search{zoom:1}.x .search:after{content:"";display:block;clear:both}.x .search .pagination{float:left;text-align:left}.x .search form{float:right;margin:1em 0}.x .search form *{vertical-align:middle}/* Site Map */.x .siteMap h2 input{font-size:14px;font-weight:bold;padding:0 .5em}.x .siteMap label{cursor:text}.x .siteMap .lined ul{padding:0;margin:0;border-top:1px solid #eee;zoom:1}.x .siteMap .lined li{position:relative;padding:0;margin:0;cursor:all-scroll;list-style:none;zoom:1}.x .siteMap .lined li li{border-top:1px solid #eee}.x .siteMap li li{text-indent:18px}.x .siteMap li li li{text-indent:36px}.x .siteMap li li li li{text-indent:54px}.x .siteMap li li li li li{text-indent:72px}.x .siteMap li li li li li li{text-indent:90px}.x .siteMap li li li li li li li{text-indent:108px}.x .siteMap li li li li li li li li{text-indent:126px}.x .siteMap li li li li li li li li li{text-indent:144px}.x .siteMap li li li li li li li li li li{text-indent:162px}.x .siteMap li li li li li li li li li li li{text-indent:180px}.x .siteMap li li li li li li li li li li li li{text-indent:198px}.x .siteMap li *{vertical-align:middle}.x .siteMap li .moveTo+input{width:200px;border:0;padding:0 .5em}.x .siteMap li .moveTo+input:hover,.x .siteMap li .moveTo+input:active,.x .siteMap li .moveTo+input:focus{border:1px dotted #ccc;overflow:visible}.x .siteMap .moveTo{position:relative;z-index:2;width:22px;height:32px;padding:32px 0 0 0;margin:0 3px;_margin-top:-1px;overflow:hidden;background:#fff url(../img/iconMoveTo.gif) no-repeat center 0;border:0;cursor:move}.x .siteMap li.active,.x .siteMap li.active .moveTo{background-color:#f7f7f7}.x .siteMap li.active li,.x .siteMap li.active ul{border-top-color:#f7f7f7}.x .siteMap li.active .moveTo{background-position:center -32px}.x .siteMap .vr,.x .siteMap .hr{display:none;position:absolute;z-index:1;left:14px;border:0px solid #ccc;overflow:hidden}.x .siteMap .vr{top:-16px;height:100%;border-left-width:1px}.x .siteMap .hr{top:16px;width:16px;border-top-width:1px}.x .siteMap li.active .vr,.x .siteMap li.active li .hr{display:block}.x .siteMap li li .vr,.x .siteMap li li li .hr{left:32px}.x .siteMap li li li .vr,.x .siteMap li li li li .hr{left:50px}.x .siteMap li li li li .vr,.x .siteMap li li li li li .hr{left:68px}.x .siteMap li li li li li .vr,.x .siteMap li li li li li li .hr{left:86px}.x .siteMap li li li li li li .vr,.x .siteMap li li li li li li li .hr{left:104px}.x .siteMap li li li li li li li .vr,.x .siteMap li li li li li li li li .hr{left:122px}.x .siteMap li li li li li li li li .vr,.x .siteMap li li li li li li li li li .hr{left:140px}.x .siteMap li li li li li li li li li .vr,.x .siteMap li li li li li li li li li li .hr{left:158px}.x .siteMap li li li li li li li li li li .vr,.x .siteMap li li li li li li li li li li li .hr{left:176px}.x .siteMap li li li li li li li li li li li .vr,.x .siteMap li li li li li li li li li li li li .hr{left:336px}.x .siteMap .side{padding-top:0 !important;padding-bottom:0 !important;line-height:30px;background:transparent !important}.x .siteMap .side button{text-indent:0;line-height:1}.x .siteMap .tgMap{position:absolute;top:12px;right:1em;padding:0 16px 0 0;line-height:16px;background:url(../img/iconArrow.gif) no-repeat right -126px}.x .siteMap.fold .tgMap{background-position:right -158px}.x .siteMap.fold .h2{border-bottom-color:#fff;border-radius:5px}.x .siteMap .placeholder{background:#bbb}.x .siteMap .draggable,.x .siteMap .draggable .moveTo{background-color:#ddd}.x .siteMap .draggable .summary{border-left:1px solid #ccc;padding-left:10px;margin-left:10px;font-size:11px;color:#999}.x .siteMap a.ms{text-decoration:underline}/* Multilingual */.x .langEdit{background:#fff;position:absolute;*left:0;*margin-top:28px;z-index:10}.x .langEdit ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0}.x .langEdit li{padding:.5em 10px}.x .langEdit input[type=text]{width:220px;padding-right:40px}.x .langEdit label{left:15px !important}.x .langEdit .action{border:1px solid #eee;width:268px;padding:0 10px}.x .langEdit p, .x .langEdit .btnArea{white-space:normal}.x .langEdit .langList,.x .langEdit .langEditControls{box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x .langEdit .langList{margin:0 -1px 0 0;display:none}.x .langEdit .langList li{white-space:nowrap;color:#ccc;width:270px} .x .langEdit .langList li span{display:inline-block;width:80px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:#767676}.x .langEdit .langList li a{display:inline-block;width:80px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.x .langEdit .langList li.active{background:url(../img/iconArrow.gif) no-repeat right -188px}.x .langEdit.showChild .langList{display:block}.x .langEdit .langInput{background:#fff}.x .langEdit .langInput h2{padding:5px 10px;margin:0 0 -1px 0;font-size:12px;font-weight:normal;color:#666;border:1px solid #eee;border-top-color:#ccc}.x .langEdit .langInput h2 strong{color:#000;font-size:14px}.x .langEdit.showChild .langInput{position:absolute;left:285px;top:0}.x .langEdit li.en input, .x .langEdit li.en textarea, .x .mLangEdit li.en textarea{background:url(../img/flag.us.gif) no-repeat 99% 5px}.x .langEdit li.ko input, .x .langEdit li.ko textarea, .x .mLangEdit li.ko textarea{background:url(../img/flag.kr.gif) no-repeat 99% 5px}.x .langEdit li.jp input, .x .langEdit li.jp textarea, .x .mLangEdit li.jp textarea{background:url(../img/flag.jp.gif) no-repeat 99% 5px}.x .langEdit li.fr input, .x .langEdit li.fr textarea, .x .mLangEdit li.fr textarea{background:url(../img/flag.fr.gif) no-repeat 99% 5px}.x .langEdit li.de input, .x .langEdit li.de textarea, .x .mLangEdit li.de textarea{background:url(../img/flag.de.gif) no-repeat 99% 5px}.x .langEdit li.ru input, .x .langEdit li.ru textarea, .x .mLangEdit li.ru textarea{background:url(../img/flag.ru.gif) no-repeat 99% 5px}.x .langEdit li.es input, .x .langEdit li.es textarea, .x .mLangEdit li.es textarea{background:url(../img/flag.es.gif) no-repeat 99% 5px}.x .langEdit li.tr input, .x .langEdit li.tr textarea, .x .mLangEdit li.tr textarea{background:url(../img/flag.tr.gif) no-repeat 99% 5px}.x .langEdit li.vi input, .x .langEdit li.vi textarea, .x .mLangEdit li.vi textarea{background:url(../img/flag.vn.gif) no-repeat 99% 5px}.x .langEdit li.mn input, .x .langEdit li.mn textarea, .x .mLangEdit li.mn textarea{background:url(../img/flag.mn.gif) no-repeat 99% 5px}.x .langEdit li.zh-CN input, .x .langEdit li.zh-CN textarea, .x .mLangEdit li.zh-CN textarea{background:url(../img/flag.cn.gif) no-repeat 99% 5px}.x .langEdit li.zh-TW input, .x .langEdit li.zh-TW textarea, .x .mLangEdit li.zh-TW textarea{background:url(../img/flag.tw.gif) no-repeat 99% 5px}.x .mLangEdit.en strong{background:url(../img/flag.us.gif) no-repeat 0 10px}.x .mLangEdit.ko strong{background:url(../img/flag.kr.gif) no-repeat 0 10px}.x .mLangEdit.jp strong{background:url(../img/flag.jp.gif) no-repeat 0 10px}.x .mLangEdit.fr strong{background:url(../img/flag.fr.gif) no-repeat 0 10px}.x .mLangEdit.de strong{background:url(../img/flag.de.gif) no-repeat 0 10px}.x .mLangEdit.ru strong{background:url(../img/flag.ru.gif) no-repeat 0 10px}.x .mLangEdit.es strong{background:url(../img/flag.es.gif) no-repeat 0 10px}.x .mLangEdit.tr strong{background:url(../img/flag.tr.gif) no-repeat 0 10px}.x .mLangEdit.vi strong{background:url(../img/flag.vn.gif) no-repeat 0 10px}.x .mLangEdit.mn strong{background:url(../img/flag.mn.gif) no-repeat 0 10px}.x .mLangEdit.zh-CN strong{background:url(../img/flag.cn.gif) no-repeat 0 10px}.x .mLangEdit.zh-TW strong{background:url(../img/flag.tw.gif) no-repeat 0 10px}.x .mLangEdit ul ul{border:0}.x .mLangEdit li{position:relative;padding:0}.x .mLangEdit li strong{display:inline-block;padding:6px 100px 8px 24px;font-weight:normal;line-height:1.5}.x .mLangEdit li .side{position:absolute;top:8px;right:0;padding-right:18px;background:url(../img/iconArrow.gif) no-repeat right -160px}.x .mLangEdit li li{border:0;padding-right:36px}.x .mLangEdit li textarea{width:100%;height:16px;padding-right:30px;resize:vertical;line-height:1.4}.x .mLangEdit li label{top:8px !important}.x .mLangEdit li.active{background:#FFFDEF}.x .mLangEdit li.active strong{font-weight:bold}.x .mLangEdit li.active .side{background-position:right -128px}.modal .mLangEdit ul{padding-bottom:1em}.modal .mLangEdit li{border:0;padding-right:36px}/* Suggestion */.x .suggestion{display:none;position:absolute;background:#fff;z-index:10;_height:200px;max-height:200px;overflow:auto;*left:0;*margin-top:28px;box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x .suggestion ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0}.x .suggestion li{padding:0}.x .suggestion li:last-child{border-bottom:0}.x .suggestion li button{border:0;background:#fff;text-align:left;width:288px;padding:2px 4px;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.x .suggestion li button:hover,.x .suggestion li button:active,.x .suggestion li button:focus,.x .suggestion li button.active{background:#eee}/* Image Mark */.x #imageMark{right:0}/* Easy Installer */.x .easyNav{position:relative;border:1px solid #e9e9e9;zoom:1}.x .easyNav:after{content:"";display:block;clear:both}.x .easyNav h2{font-size:16px}.x .easyNav .category{width:30%;float:left;margin:0 2em;display:inline}.x .easyNav .filter{position:absolute;top:0;right:0;margin:1em 2em;text-align:right}.x .easyList td p{margin-top:0}.x .easyList td p.update{background:#ffc;padding:.5em 1em;border:1px solid #fc9;border-left:0;border-right:0;text-align:center}/* Font Preview */.x .fontPreview{width:96%;border:1px solid #e9e9e9;zoom:1;padding:1em 2em;margin:.5em 0}/* FTP Suggestion */.x #ftpSuggestion{background:#fff;box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x #ftpSuggestion ul{border-left:1px solid #eee;border-right:1px solid #eee}.x #ftpSuggestion li{padding:0}.x #ftpSuggestion li button{border:0;background:#fff;text-align:left;width:288px}.x #ftpSuggestion li button:hover,.x #ftpSuggestion li button:active,.x #ftpSuggestion li button:focus{background:#eee}/* Theme & Skin Preview */.x .thumbPreview li{position:relative;padding-left:10px;padding-right:10px}.x .thumbPreview li.active.highlight{background:#f9f9f9}.x .thumbPreview .prevToggle{position:absolute;top:8px;right:10px;line-height:16px;padding:0 18px 0 0;text-decoration:none;background:url(../img/iconArrow.gif) no-repeat right -32px}.x .thumbPreview li.active .prevToggle{background-position:right 0}.x .thumbPreview .a{border:0;margin:0;zoom:1}.x .thumbPreview .a:after{content:"";display:block;clear:both}.x .thumbPreview .i{float:left;vertical-align:top;margin:0 1em 1em 0;padding:0;border:0;zoom:1}.x .thumbPreview .i:after{content:"";display:block;clear:both}.x .thumbPreview .i .thumb{position:relative;width:124px;height:84px;padding:0;margin-bottom:3px;text-align:center;overflow:hidden;border:1px solid #ddd;display:block;cursor:pointer;background:#fff}.x .thumbPreview .i .thumb .frame{position:absolute;width:120px;height:80px;left:0;top:0;border:2px solid #fff;overflow:hidden}.x .thumbPreview .i .thumb img{width:120px;margin:0}.x .thumbPreview .i label{display:block;position:relative;top:0;left:2px;width:122px;height:1.1em;margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x .thumbPreview .i input{display:none}.x .thumbPreview .i ul{display:none}.x .thumbPreview .selected .i{display:block;float:none}.x .thumbPreview .selected .i .thumb{float:left;width:186px;height:126px;margin:0 1em 0 0;border:2px solid #eee}.x .thumbPreview .selected .i .thumb .frame{width:180px;height:120px;border-width:3px}.x .thumbPreview li.active.highlight .selected .i .thumb{border-color:#5ea8f6}.x .thumbPreview .selected .i .thumb img{width:180px;position:relative}.x .thumbPreview li.active .selected .i .thumb img{z-index:auto}.x .thumbPreview .selected .i label{cursor:text}.x .thumbPreview .selected .i ul{display:block;list-style:none;border:0;margin:1em 0 1em 200px}.x .thumbPreview .selected .i li{border:0;padding:0;margin:0 0 .2em 0}.x .thumbPreview.jx .i label{display:inline;width:auto}.x .thumbPreview.jx .i.noDirection{display:none}.x .thumbPreview.jx .i input{display:inline}.x #skin .showAll{float:right;border:0;overflow:visible;padding:0 18px 0 0;cursor:pointer;color:#00f;background:url(../img/iconArrow.gif) no-repeat right -32px}.x #skin .showAll.hideAll{background-position:right 0}/* Favorite On | Off */.x .fvOff,.x .fvOn{display:inline-block;width:16px;height:16px;overflow:hidden;text-indent:16px;background:url(../img/iconFavorite.gif) no-repeat}.x .fvOn{background-position:0 -16px}/* Up-Down Dragable */.x .uDrag .wrap{position:relative;padding-left:20px}.x .uDrag li>.wrap{margin:0 0 0 8px}.x .uDrag .dragActive{background:#FFD}.x .uDrag .dragActive th,.x .uDrag .dragActive td{background:none !important}.x .uDrag .dragBtn{position:absolute;width:8px;height:100%;padding:0;overflow:hidden;background:url(../img/bgDragable.gif);top:1px;left:0;text-indent:12px;border:0;cursor:n-resize;white-space:nowrap}/* Favicon Preview */.x .faviconPreview{position:relative;padding:60px 0 0 200px;background:url(../img/bgFavicon.gif) no-repeat}.x .faviconPreview img{position:absolute}.x .faviconPreview .fn1{top:30px;left:12px}.x .faviconPreview .fn2{top:55px;left:68px}/* Mobile Icon Preview */.x .mobiconPreview{position:relative;padding:252px 0 0 200px;background:url(../img/bgMobileTop.png) no-repeat}.x .mobiconPreview img{position:absolute;top:20px;left:10px}.x .mobiconPreview span{position:absolute;width:32px;text-align:center;top:52px;left:10px;color:#fff;font-size:9px}/* Text List */.x .textList{border:1px solid #ddd !important;line-height:1.5em;height:18.5em;overflow:auto}.x .textList li{border:0;padding:.25em 1em;height:1.5em;white-space:nowrap;overflow:hidden}.x .textList li:nth-child(even){background:#eee}.x .textList li a{float:right}/* File Box */.x .fileBox li{position:relative}.x .fileBox li img{max-width:100%}.x .fileBox .portlet ul{margin:1em;list-style:none;padding:0;border:0}.x .fileBox .portlet li{border-top:1px solid #ddd;border-bottom:0;padding:8px 0}.x .fileBox .side{position:absolute;top:8px;right:0}/* Messages */.x .desc.error{color:#f00}.x .desc.success{color:#080}/* Icon Button */.x a.iSetting{display:inline-block;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;vertical-align:middle;background:url(../img/iconSetting.gif) no-repeat}.x a.cMenu{display:inline-block;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;vertical-align:middle;background:url(../../../../common/img/icon.bubble.png) no-repeat}/* Responsive Layout */@media only all and (max-width:860px){.x .header h1{margin-left:.7em}.x .header .account{padding-right:1em}.x .body{padding:1em}.x .content{float:none;margin-left:0}.x .lnb{float:none;width:auto;margin:1em 0}.x .dashboard .portlet{float:none !important;width:auto !important;margin-right:0}.modal .fg,.wfsr .fg{width:auto}.x .easyNav .category{float:none;display:block;width:auto}.x .easyNav .filter{position:static}}@media only all and (max-width:640px){.x .skipNav a{position:relative;width:auto;height:auto}.modal{position:absolute}}/* Legacy Code (Don't use it. It will be removed as soon as possible.) */.x h3.xeAdmin,.x h4.xeAdmin{position:relative;border-bottom-style:solid;border-bottom-color:#ccc;zoom:1}.x h3.xeAdmin{border-bottom-width:4px;font-size:24px}.x h4.xeAdmin{border-bottom-width:3px;font-size:20px}.x h5.xeAdmin{border-bottom-width:2px;font-size:16px}.x h6.xeAdmin{border-bottom-width:1px;font-size:12px}.x .adminSearch{margin:1em 0}.x .adminSearch fieldset{border:1px solid #ccc;margin:0;padding:.5em 1em}.x .localNavigation{padding:0;list-style:none}.x .localNavigation li{display:inline}.x .localNavigation li.on a{font-weight:bold;color:#333;text-decoration:none}.x .localNavigation li:before{content:"| "}.x .localNavigation li:first-child:before{content:""}.x .summary{margin:1em 0}.x .rowTable,.x .colTable,.x .crossTable{margin:1em 0;border:0;border-collapse:collapse;border-top:2px solid #ccc;width:100%}.x .rowTable caption,.x .colTable caption,.x .crossTable caption{font-weight:bold;text-align:left;line-height:22px;padding:5px 0}.x .rowTable caption:after,.x .colTable caption:after,.x .crossTable caption:after{content:"";display:block;clear:both}.x .rowTable caption a,.x .colTable caption a,.x .crossTable caption a{font-weight:normal}.x .rowTable caption em,.x .colTable caption em,.x .crossTable caption em{float:right;font-style:normal;font-weight:normal;color:#e00;margin-left:1em}.x .rowTable caption strong,.x .colTable caption strong,.x .crossTable caption strong{color:#e00}.x .rowTable caption .side,.x .colTable caption .side,.x .crossTable caption .side{float:right;font-weight:normal;margin-left:1em}.x .rowTable th,.rowTable td,.x .colTable th,.rowTable td,.x .crossTable th,.rowTable td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd;white-space:nowrap}.x .rowTable th,.x .colTable th,.x .crossTable th{background:#f8f8f8}.x .rowTable thead th,.x .colTable thead th,.x .crossTable thead th{border-bottom:1px solid #999}.x .rowTable tfoot td,.x .colTable tfoot td,.x .crossTable tfoot td{font-weight:bold;background:#f8f8f8}.x .rowTable.even tbody tr:nth-of-type(even) td,.x .colTable.even tbody tr:nth-of-type(even) td,.x .crossTable.even tbody tr:nth-of-type(even) td{background-color:#fafafa}.x .rowTable td>input[type=text],.x .colTable td>input[type=text],.x .crossTable td>input[type=text]{margin:-1px 0 -3px 0 !important;vertical-align:middle}.x .rowTable img,.x .colTable img,.x .crossTable img{vertical-align:middle}.x .rowTable .title,.x .colTable .title,.x .crossTable .title,.x .rowTable .text,.x .colTable .text,.x .crossTable .text{white-space:normal}.x .rowTable input[type=text],.x .colTable input[type=text],.x .crossTable input[type=text],.x .rowTable input[type=password],.x .colTable input[type=password],.x .crossTable input[type=password],.x .rowTable input[type=file],.x .colTable input[type=file],.x .crossTable input[type=file],.x .rowTable textarea,.x .colTable textarea,.x .crossTable textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:transparent}.x .rowTable input[type=text],.x .colTable input[type=text],.x .crossTable input[type=text],.x .rowTable input[type=password],.x .colTable input[type=password],.x .crossTable input[type=password],.x .rowTable input[type=file],.x .colTable input[type=file],.x .crossTable input[type=file]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px}.x .clear:after{content:"";display:block;clear:both} \ No newline at end of file +@charset "utf-8";/* NHN (developers@xpressengine.com) *//* Element Reset */body{margin:0}header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{display:block}body>.popup{margin:1em}.x,.x table,.x input,.x textarea,.x select,.x button{font-family:Tahoma,Geneva,sans-serif;font-size:12px;color:#333}.x button,.x input[type=submit],.x input[type=reset],.x input[type=button]{cursor:pointer;overflow:visible}.x img{border:0}.x p{line-height:1.5}/* Section & Heading */.x .section{margin:1em 0;padding:0;border:0}.x .h1, .x .h2, .x .h3, .x .h4{position:relative;border-bottom-style:solid;border-bottom-color:#ccc;zoom:1}.x .h1{border-bottom-width:4px;font-size:24px}.x .h2{border-bottom-width:3px;font-size:20px}.x .h3{border-bottom-width:2px;font-size:16px}.x .h4{border-bottom-width:1px;font-size:12px}.x .h1 + ul,.x .h2 + ul,.x .h3 + ul,.x .h4 + ul,.x .h1 + .table table, .x .h2 + .table table, .x .h3 + .table table, .x .h4 + .table table{border-top:0}/* Portlet */.x .portlet{position:relative;border:1px solid #e9e9e9;margin:1em 0;padding:0;background:#fff;zoom:1;overflow:hidden;border-radius:5px}.x .portlet h2, .x .portlet h3{margin:0;padding:.5em 1em;font-size:14px;border:1px solid #fff;border-bottom:1px solid #e9e9e9;background:#f7f7f7;border-radius:5px 5px 0 0}.x .portlet p{margin:1em 1.2em}.x .portlet li{position:relative;padding-right:8em}.x .portlet .lined{margin:1px;padding:0;list-style:none}.x .portlet .lined li{padding:.5em 8em .5em 1em;border-top:1px solid #eee;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis}.x .portlet .lined li:first-child{border:0}.x .portlet .side{position:absolute;top:0;_top:1px;right:0;color:#666;background:#fff;padding:0 1em}.x .portlet .lined .side{padding:.5em 1em}.x .portlet .more{position:absolute;top:.5em;right:1em;text-decoration:none !important;color:#666}.x .portlet .more span{color:#999}.x .portlet .action{text-align:right;top:0;right:0;padding:.5em 1em .5em 3em;background:#fff;background:-webkit-gradient(linear, 0% 0%, 100% 0%, from(rgba(255,255,255,0)), to(rgba(255,255,255,1)), color-stop(15%, #fff));background:-moz-linear-gradient(left, rgba(255,255,255,0) 0, rgba(255,255,255,1) 15%)}.x .portlet .action a,.x .portlet .action button{margin-left:1em}.x .portlet .btnArea{border-top:1px solid #ddd;margin:0;padding:.5em 1em;margin:0 1px 1px 1px;background:#f7f7f7;border-radius:0 0 5px 5px}/* Table */.x .table{margin:1em 0}.x .table table{width:100%;border:0;border-collapse:collapse;border-top:2px solid #ccc}.x .table caption{font-weight:bold;text-align:left;line-height:22px;padding:5px 0}.x .table caption:after{content:"";display:block;clear:both}.x .table caption a{font-weight:normal}.x .table caption em{float:right;margin-left:1em}.x .table caption strong{color:#e00}.x .table caption .side{float:right;font-weight:normal;margin-left:1em}.x .table th,.x .table td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd;white-space:nowrap}.x .table th{background:#f8f8f8}.x .table thead th{border-bottom:1px solid #999}.x .table tfoot td{font-weight:bold;background:#f8f8f8}.x .table.even tbody tr:nth-of-type(even) td{background-color:#fafafa}.x .table td>input[type=text]{margin:-1px 0 -3px 0 !important;vertical-align:middle}.x .table img{vertical-align:middle}.x .table em{font-style:normal;font-weight:normal;color:#e00}.x .table .title,.x .table .text{white-space:normal}/* Form */.x .form{margin:1em 0;padding:0}.x .form fieldset{margin:0 0 2em 0;padding:0;border:0}.x .form em{font-style:normal;color:#e00}.x .form label{margin-right:1em;line-height:1;vertical-align:middle}.x .form input[type=checkbox]+label,.x .form input[type=radio]+label,.x .form input[type=file]{cursor:pointer}.x .form ul{position:relative;margin:0;padding:0;list-style:none;border-top:2px solid #ccc;border-bottom:1px solid #ccc;zoom:1}.x .form li{list-style:none;border:1px solid #ddd;border-left:0;border-right:0;margin:-1px 0;padding:8px 0;vertical-align:top;zoom:1}.x .form li:first-child{border-top:0}.x .form li>label:first-child{display:block;font-weight:bold}.x .form li label em{font-weight:normal}.x .form label.overlap{position:absolute;color:#aaa}.x .form input[type=text],.x .form input[type=password],.x .form input[type=file],.x .form textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:transparent}.x .form input[type=text],.x .form input[type=password],.x .form input[type=file]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px}.x .form input[type=text].loading,.x .form input.loading[type=password]{padding-right:24px;width:260px;background:transparent url(../img/preLoader16.gif) no-repeat 265px center}.x .form input[type=checkbox],.x .form input[type=radio]{margin:0;padding:0;width:13px;height:13px;vertical-align:middle}.x .form *[disabled=disabled]{background:#ddd !important;text-shadow:1px 1px 0 #fff}.x .form textarea{padding:3px 4px;vertical-align:top}.x .form span.desc, .x .form em.desc{line-height:22px;vertical-align:middle;margin:0 10px}.x .form p.desc{margin:.25em 0;line-height:1.4}.x .form .q{font-weight:bold;margin:0 0 5px 0}.x .form .a{margin:0 0 5px 0}.x .form .tgForm{margin-right:1em}/* Global Navigation Bar */.x .gnb{position:relative;clear:both;border:1px solid #c1c1c1;border-left:0;border-right:0;background-color:#efefef;background:#efefef -webkit-gradient(linear, 0% 0%, 0% 100%, from(#efefef), to(#dcdcdc));background:#efefef -moz-linear-gradient(top, #efefef, #dcdcdc);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#efefef, endColorStr=#dcdcdc);zoom:1}.x .gnb ul{margin:0;padding:0 0 0 2em;list-style:none;border:1px solid #fff;border-left:0;border-right:0;zoom:1}.x .gnb ul ul{position:absolute;top:30px;left:0;border:1px solid #ccc;border-top:0;padding:1px 0 0 0;background:#fff}.x .gnb ul:after{content:"";display:block;clear:both}.x .gnb li{position:relative;float:left;border:1px solid #fff;border-top:0;border-bottom:0;margin:0 -1px 0 0}.x .gnb li li{float:none;clear:both;overflow:hidden;border:0;border-top:1px dotted #ccc;margin:0;padding:2px}.x .gnb li li:first-child{border:0}.x .gnb li a{float:left;font-weight:bold;color:#333;font-size:12px;padding:8px 18px;white-space:nowrap;text-decoration:none;text-shadow:0 1px 0 #fff;zoom:1}.x .gnb li a:hover,.x .gnb li a:active,.x .gnb li a:focus,.x .gnb li.active a{background:#f4f4f4;border:1px solid #ccc;border-bottom:0;padding:7px 17px 8px 17px}.x .gnb li.activeOn a{background:#fff;border:1px solid #ccc;border-bottom:0;padding:7px 17px 8px 17px}.x .gnb li.active li a{display:block;float:none;color:#555;background:#fff;padding:5px 15px !important;font-weight:normal !important;border:0 !important}.x .gnb li.active li a:hover,.x .gnb li.active li a:active,.x .gnb li.active li a:focus{border:0;background:#eee}.x .gnb .setting{position:absolute;top:8px;right:2em;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;background:url(../img/iconSetting.gif) no-repeat center}.x .gnb.jx ul{display:block;position:static;padding:0}.x .gnb.jx li{float:none;clear:both;border-top:1px solid #ccc}.x .gnb.jx ul ul{border:0}.x .gnb.jx li li{border:0}.x .gnb.jx li a{float:none;display:block}.x .gnb.jx li a:hover,.x .gnb.jx li a:active,.x .gnb.jx li a:focus{background:none}.x .gnb.jx li.activeOn>a{background:#ddd}@media only all and (max-width:860px){.x .gnb ul{padding-left:1em}.x .gnb .setting{right:1em}}@media only all and (max-width:640px){.x .gnb ul{display:block;position:static;padding:0}.x .gnb li{float:none;clear:both;border-top:1px solid #ccc}.x .gnb ul ul{border:0;position:static}.x .gnb li li{border:0}.x .gnb li a{float:none;display:block}.x .gnb li a:hover,.x .gnb li a:active,.x .gnb li a:focus{background:none}.x .gnb li.activeOn>a{background:#ddd}}/* Favorite */.x .bmk{position:absolute;right:2em;bottom:10px;padding:0 0 0 20px;background:url(../img/iconFavorite.gif) no-repeat 0 -16px}.x .bmk ul{position:absolute;top:140%;right:0;list-style:none;margin:0;padding:5px 10px;border:1px solid #aaa;border-radius:5px;background:#fff;box-shadow:1px 1px 3px #aaa}.x .bmk li{position:relative;padding:3px 30px 3px 0;white-space:nowrap}.x .bmk li .action{position:absolute;top:0;right:0}.x .bmk li .action .text{text-decoration:none;width:16px;text-align:center;margin:0}@media only all and (max-width:640px){.x .bmk{position:static;background-color:#fff;padding:10px 20px;background:#fff}.x .bmk .tgAnchor{display:block}.x .bmk ul{position:relative;border:0;border-top:1px solid #ccc;border-radius:0;box-shadow:none;padding:0;margin:5px 0 0 0}.x .bmk li{position:relative;top:-1px;border-top:1px dotted #ccc}}/* Local Navigation */.x .lnb{position:relative;float:left;width:200px;margin:1em 0 1em -230px;line-height:normal;zoom:1;display:inline}.x .lnb .h2{margin-top:0}.x .lnb ul{margin:0;padding:0;list-style:none}.x .lnb li{position:relative;margin:0 0 -1px 0;vertical-align:top;zoom:1}.x .lnb li a{display:block;position:relative;padding:8px 10px;text-decoration:none;color:#666;font-weight:bold;background:#fafafa;border:1px solid #eee;zoom:1}.x .lnb li a .i{position:absolute;top:50%;left:100%;margin:-4px 0 0 -16px;width:8px;height:8px;color:#ccc;background:url(../img/iconNavVr.gif) no-repeat left top}.x .lnb li ul{padding:5px 0;background:#fff}.x .lnb li li{margin:0;border-top:1px dotted #ddd}.x .lnb li li:first-child{border:0}.x .lnb li li a{font-weight:normal;background:#fff;padding:5px 10px;border:0}.x .lnb li li a span{color:#666}.x .lnb li.active{border:1px solid #ccc;z-index:2}.x .lnb li li.active{border:0}.x .lnb li.active a{color:#000;border:0}.x .lnb li.active .i{background-position:0 -44px}.x .lnb li.active li a{border:0}.x .lnb li.active ul{display:block;border-top:1px solid #eee}.x .lnb li.active li.active a span{color:#13b200;font-weight:bold;letter-spacing:-1px}/* Content Navigation */.x .cnb{margin:1em 0;position:relative;zoom:1}.x .cnb:after{content:"";display:block;clear:both}.x .cnb ul{list-style:none;margin:0;padding:0}.x .cnb li{display:inline}.x .cnb li:before{content:"| ";color:#ccc}.x .cnb li:first-child:before{content:""}.x .cnb .active,.x .cnb .active a{font-weight:bold;color:#333;text-decoration:none}.x .cnb .side{float:right}/* Pagination */.x .pagination{margin:1em 0;text-align:center;line-height:normal}.x .pagination *{vertical-align:middle}.x .pagination a,.x .pagination strong{position:relative;display:inline-block;padding:2px 4px;font-weight:bold;text-decoration:none;line-height:normal;color:#333 !important;vertical-align:middle}.x .pagination a:hover,.x .pagination a:active,.x .pagination a:focus{border:1px solid #ddd;margin:0 -1px}.x .pagination strong{color:#e00 !important;font-size:20px}.x .pagination .direction{font-weight:normal;white-space:nowrap}.x .pagination .direction:hover,.x .pagination .direction:active,.x .pagination .direction:focus{border:0;margin:0;text-decoration:underline}.x .pagination input{width:30px;text-align:center}.x .pagination button{overflow:visible}/* Star Rating */.x .starRating, .x .starRating span{display:inline-block;height:14px;background:transparent url(../img/iconStarRating.gif) no-repeat;overflow:hidden}.x .starRating{width:79px;vertical-align:top}.x .starRating span{font-size:0;line-height:0;vertical-align:top;text-indent:-100px;*text-indent:0;background-position:0 -14px}/* Progress */.x .prgrs{white-space:nowrap;line-height:normal;vertical-align:middle}.x .prgrs *{vertical-align:middle}.x .prgrs .pBar{position:relative;display:inline-block;background:#e9e9e9;margin:0 5px 0 0}.x .prgrs .pAction{display:inline-block;vertical-align:top;background:#99a6b6}.x .prgrs .pNum{position:absolute;width:100%;left:0;top:0;text-align:center;text-shadow:1px 1px 0 #fff}.x .prgrs.prgrsSmall{font-size:14px;line-height:14px}.x .prgrs.prgrsSmall .pBar,.x .prgrs.prgrsSmall .pAction,.x .prgrs.prgrsSmall .pNum{height:16px;line-height:16px;font-size:11px}.x .prgrs.prgrsMedium{font-size:24px;line-height:24px}.x .prgrs.prgrsMedium .pBar,.x .prgrs.prgrsMedium .pAction,.x .prgrs.prgrsMedium .pNum{height:22px;line-height:22px;font-size:12px}.x .prgrs.prgrsLarge{font-size:38px;line-height:38px}.x .prgrs.prgrsLarge .pBar,.x .prgrs.prgrsLarge .pAction,.x .prgrs.prgrsLarge .pNum{height:34px;line-height:34px;font-size:14px}/* Modal Window */.modal{position:absolute;top:0;left:0;width:100%;_height:100%;min-height:100%;z-index:100}.modal .bg{position:absolute;background:#000;_background:none;width:100%;height:100%;opacity:.5;z-index:2;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1}.modal .fg{position:relative;width:80%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:3;zoom:1;border-radius:5px;box-shadow:0 0 6px #000}.modal ul, .modal ol, .modal .lined, .modal .table{margin-bottom:1em}.modal .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1}.modalClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px}.modalBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}html.modalContainer,body.modalContainer{_height:100%;_width:100%} /* IE6 only */ /* Layer */.x .layer,.x.layer{position:absolute;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:2;zoom:1;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;box-shadow:0 0 6px #666;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x .layer h2{font-size:14px}.x .layer ul, .x .layer ol, .x .layer .lined, .x .layer .table{margin-bottom:1em}.x .layerClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px}.x .layerBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}/* H2 Anchor */.x .h2Anchor{position:absolute;right:0;border:0;background:none;color:#00f;text-decoration:underline}/* Skip Navigation */.x .skipNav{margin:0;text-align:center;overflow:hidden}.x .skipNav a{position:absolute;width:1px;height:1px;display:block;color:#fff;font-weight:bold;padding:10px 0;background:#333;border-top:1px solid #656565}.x .skipNav a:hover,.x .skipNav a:active,.x .skipNav a:focus{position:relative;width:auto;height:auto}/* Header */.x .header{position:relative;z-index:2;padding:30px 0 0 0;background:#4c4c4c;box-shadow:0 0 10px #aaa;zoom:1}.x .header:after{content:"";display:block;clear:both}.x .header a{text-decoration:none}.x .header h1{margin:0 15px 10px 1.3em;font-size:24px;line-height:32px;display:inline-block;zoom:1}.x .header h1 *{vertical-align:middle}.x .header h1 a{color:#fff;text-shadow:1px 1px 0 #000;filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=1, OffY=1, Color=#000000, Positive=true);zoom:1}.x .header h1 .url{font-size:12px;font-weight:normal}.x .header .site{margin:0;display:inline-block;zoom:1}.x .header .site a{color:#fff;text-decoration:underline}.x .header #moveSiteList{padding:10px 1em 5px 1em;margin:0}.x .header #moveSiteList ul{list-style:none;margin:0;padding:0}.x .header #moveSiteList li{white-space:nowrap;margin:0;padding:4px 0;border-bottom:1px dotted #ccc}.x .header #siteMapList{padding:0 1em 1em 1em;margin:0}.x .header #siteMapList li{white-space:nowrap}.x .header .account{position:absolute;z-index:3;width:100%;padding:5px 2em 5px 0;top:0;right:0;white-space:nowrap;text-align:right;background:#333;border-bottom:1px solid #656565;color:#fff;font-size:12px;box-shadow:0 0 10px #333}.x .header .account ul{margin:0 2px 0 0;padding:0;list-style:none}.x .header .account li{position:relative;display:inline;border-left:1px solid #666;padding:0 6px 0 10px}.x .header .account li:first-child{border:0}.x .header .account a{color:#fff;display:inline-block;height:14px}.x .header .account a.language{padding-right:16px;background:url(../img/iconArrow.gif) no-repeat right -160px}.x .header #language{position:absolute;top:19px;right:-2em;padding:6px 4px !important;border:1px solid #666;border-top:0;background:#333}.x .header #language li{border:0;display:block;padding:1px 8px 1px 10px;text-align:left;line-height:1}.x .header #language li.selected{background:url(../img/iconCheck.gif) no-repeat left center}.x .header #language li.selected a{text-decoration:underline}.x .header h1 a:hover,.x .header h1 a:active,.x .header h1 a:focus,.x .header .account a:hover,.x .header .account a:active,.x .header .account a:focus{color:#6e9cf2;text-decoration:underline}/* Footer */.x .footer{border-top:1px solid #ddd;text-align:center;font-size:12px;padding:1.5em 0;margin:0 2em;zoom:1}.x .footer:after{content:"";display:block;clear:both}.x .footer p{margin:0}.x .footer .power{float:left}.x .footer .cache{float:right}/* Body */.x .body{position:relative;z-index:1;padding:1em 2em 1em 260px;zoom:1}.x .body:after{content:"";display:block;clear:both}/* Content */.x .content{float:right;width:100%;margin-left:-230px;zoom:1}.x .content:after{content:"";display:block;clear:both}.x .content a{color:#33a}.x .content a:hover,.x .content a:active,.x .content a:focus{color:#a33}.x .content .portlet a{text-decoration:none}.x .content .portlet a:hover,.x .content .portlet a:active,.x .content .portlet a:focus{text-decoration:underline}/* Dashboard */.x .dashboard{position:relative;float:none;width:auto;margin-left:-230px}.x .dashboard .portlet{float:left;width:48%;margin-right:1em}.x .dashboard .portlet:nth-of-type(odd){float:left;width:49%;margin-right:0}.x .dashboard .portlet:nth-of-type(even){float:right;width:49%;margin-right:0}@media only all and (min-width:1300px){.x .dashboard .portlet{float:left !important;width:32% !important;margin-right:1em !important}}/* Single Column*/.x .single{position:relative;float:none;width:auto;margin-left:-230px}/* Search */.x .search{zoom:1}.x .search:after{content:"";display:block;clear:both}.x .search .pagination{float:left;text-align:left}.x .search form{float:right;margin:1em 0}.x .search form *{vertical-align:middle}/* Site Map */.x .siteMap h2 input{font-size:14px;font-weight:bold;padding:0 .5em}.x .siteMap label{cursor:text}.x .siteMap .lined ul{padding:0;margin:0;border-top:1px solid #eee;zoom:1}.x .siteMap .lined li{position:relative;padding:0;margin:0;cursor:all-scroll;list-style:none;zoom:1}.x .siteMap .lined li li{border-top:1px solid #eee}.x .siteMap li li{text-indent:18px}.x .siteMap li li li{text-indent:36px}.x .siteMap li li li li{text-indent:54px}.x .siteMap li li li li li{text-indent:72px}.x .siteMap li li li li li li{text-indent:90px}.x .siteMap li li li li li li li{text-indent:108px}.x .siteMap li li li li li li li li{text-indent:126px}.x .siteMap li li li li li li li li li{text-indent:144px}.x .siteMap li li li li li li li li li li{text-indent:162px}.x .siteMap li li li li li li li li li li li{text-indent:180px}.x .siteMap li li li li li li li li li li li li{text-indent:198px}.x .siteMap li *{vertical-align:middle}.x .siteMap li .moveTo+input{width:200px;border:0;padding:0 .5em}.x .siteMap li .moveTo+input:hover,.x .siteMap li .moveTo+input:active,.x .siteMap li .moveTo+input:focus{border:1px dotted #ccc;overflow:visible}.x .siteMap .moveTo{position:relative;z-index:2;width:22px;height:32px;padding:32px 0 0 0;margin:0 3px;_margin-top:-1px;overflow:hidden;background:#fff url(../img/iconMoveTo.gif) no-repeat center 0;border:0;cursor:move}.x .siteMap li.active,.x .siteMap li.active .moveTo{background-color:#f7f7f7}.x .siteMap li.active li,.x .siteMap li.active ul{border-top-color:#f7f7f7}.x .siteMap li.active .moveTo{background-position:center -32px}.x .siteMap .vr,.x .siteMap .hr{display:none;position:absolute;z-index:1;left:14px;border:0px solid #ccc;overflow:hidden}.x .siteMap .vr{top:-16px;height:100%;border-left-width:1px}.x .siteMap .hr{top:16px;width:16px;border-top-width:1px}.x .siteMap li.active .vr,.x .siteMap li.active li .hr{display:block}.x .siteMap li li .vr,.x .siteMap li li li .hr{left:32px}.x .siteMap li li li .vr,.x .siteMap li li li li .hr{left:50px}.x .siteMap li li li li .vr,.x .siteMap li li li li li .hr{left:68px}.x .siteMap li li li li li .vr,.x .siteMap li li li li li li .hr{left:86px}.x .siteMap li li li li li li .vr,.x .siteMap li li li li li li li .hr{left:104px}.x .siteMap li li li li li li li .vr,.x .siteMap li li li li li li li li .hr{left:122px}.x .siteMap li li li li li li li li .vr,.x .siteMap li li li li li li li li li .hr{left:140px}.x .siteMap li li li li li li li li li .vr,.x .siteMap li li li li li li li li li li .hr{left:158px}.x .siteMap li li li li li li li li li li .vr,.x .siteMap li li li li li li li li li li li .hr{left:176px}.x .siteMap li li li li li li li li li li li .vr,.x .siteMap li li li li li li li li li li li li .hr{left:336px}.x .siteMap .side{padding-top:0 !important;padding-bottom:0 !important;line-height:30px;background:transparent !important}.x .siteMap .side button{text-indent:0;line-height:1}.x .siteMap .tgMap{position:absolute;top:12px;right:1em;padding:0 16px 0 0;line-height:16px;background:url(../img/iconArrow.gif) no-repeat right -126px}.x .siteMap.fold .tgMap{background-position:right -158px}.x .siteMap.fold .h2{border-bottom-color:#fff;border-radius:5px}.x .siteMap .placeholder{background:#bbb}.x .siteMap .draggable,.x .siteMap .draggable .moveTo{background-color:#ddd}.x .siteMap .draggable .summary{border-left:1px solid #ccc;padding-left:10px;margin-left:10px;font-size:11px;color:#999}.x .siteMap a.ms{text-decoration:underline}/* Multilingual */.x .langEdit{background:#fff;position:absolute;*left:0;*margin-top:28px;z-index:10}.x .langEdit ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0}.x .langEdit li{padding:.5em 10px}.x .langEdit input[type=text]{width:220px;padding-right:40px}.x .langEdit label{left:15px !important}.x .langEdit .action{border:1px solid #eee;width:268px;padding:0 10px}.x .langEdit p, .x .langEdit .btnArea{white-space:normal}.x .langEdit .langList,.x .langEdit .langEditControls{box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x .langEdit .langList{margin:0 -1px 0 0;display:none}.x .langEdit .langList li{white-space:nowrap;color:#ccc;width:270px} .x .langEdit .langList li span{display:inline-block;width:80px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:#767676}.x .langEdit .langList li a{display:inline-block;width:80px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.x .langEdit .langList li.active{background:url(../img/iconArrow.gif) no-repeat right -188px}.x .langEdit.showChild .langList{display:block}.x .langEdit .langInput{background:#fff}.x .langEdit .langInput h2{padding:5px 10px;margin:0 0 -1px 0;font-size:12px;font-weight:normal;color:#666;border:1px solid #eee;border-top-color:#ccc}.x .langEdit .langInput h2 strong{color:#000;font-size:14px}.x .langEdit.showChild .langInput{position:absolute;left:285px;top:0}.x .langEdit li.en input, .x .langEdit li.en textarea, .x .mLangEdit li.en textarea{background:url(../img/flag.us.gif) no-repeat 99% 5px}.x .langEdit li.ko input, .x .langEdit li.ko textarea, .x .mLangEdit li.ko textarea{background:url(../img/flag.kr.gif) no-repeat 99% 5px}.x .langEdit li.jp input, .x .langEdit li.jp textarea, .x .mLangEdit li.jp textarea{background:url(../img/flag.jp.gif) no-repeat 99% 5px}.x .langEdit li.fr input, .x .langEdit li.fr textarea, .x .mLangEdit li.fr textarea{background:url(../img/flag.fr.gif) no-repeat 99% 5px}.x .langEdit li.de input, .x .langEdit li.de textarea, .x .mLangEdit li.de textarea{background:url(../img/flag.de.gif) no-repeat 99% 5px}.x .langEdit li.ru input, .x .langEdit li.ru textarea, .x .mLangEdit li.ru textarea{background:url(../img/flag.ru.gif) no-repeat 99% 5px}.x .langEdit li.es input, .x .langEdit li.es textarea, .x .mLangEdit li.es textarea{background:url(../img/flag.es.gif) no-repeat 99% 5px}.x .langEdit li.tr input, .x .langEdit li.tr textarea, .x .mLangEdit li.tr textarea{background:url(../img/flag.tr.gif) no-repeat 99% 5px}.x .langEdit li.vi input, .x .langEdit li.vi textarea, .x .mLangEdit li.vi textarea{background:url(../img/flag.vn.gif) no-repeat 99% 5px}.x .langEdit li.mn input, .x .langEdit li.mn textarea, .x .mLangEdit li.mn textarea{background:url(../img/flag.mn.gif) no-repeat 99% 5px}.x .langEdit li.zh-CN input, .x .langEdit li.zh-CN textarea, .x .mLangEdit li.zh-CN textarea{background:url(../img/flag.cn.gif) no-repeat 99% 5px}.x .langEdit li.zh-TW input, .x .langEdit li.zh-TW textarea, .x .mLangEdit li.zh-TW textarea{background:url(../img/flag.tw.gif) no-repeat 99% 5px}.x .mLangEdit.en strong{background:url(../img/flag.us.gif) no-repeat 0 10px}.x .mLangEdit.ko strong{background:url(../img/flag.kr.gif) no-repeat 0 10px}.x .mLangEdit.jp strong{background:url(../img/flag.jp.gif) no-repeat 0 10px}.x .mLangEdit.fr strong{background:url(../img/flag.fr.gif) no-repeat 0 10px}.x .mLangEdit.de strong{background:url(../img/flag.de.gif) no-repeat 0 10px}.x .mLangEdit.ru strong{background:url(../img/flag.ru.gif) no-repeat 0 10px}.x .mLangEdit.es strong{background:url(../img/flag.es.gif) no-repeat 0 10px}.x .mLangEdit.tr strong{background:url(../img/flag.tr.gif) no-repeat 0 10px}.x .mLangEdit.vi strong{background:url(../img/flag.vn.gif) no-repeat 0 10px}.x .mLangEdit.mn strong{background:url(../img/flag.mn.gif) no-repeat 0 10px}.x .mLangEdit.zh-CN strong{background:url(../img/flag.cn.gif) no-repeat 0 10px}.x .mLangEdit.zh-TW strong{background:url(../img/flag.tw.gif) no-repeat 0 10px}.x .mLangEdit ul ul{border:0}.x .mLangEdit li{position:relative;padding:0}.x .mLangEdit li strong{display:inline-block;padding:6px 100px 8px 24px;font-weight:normal;line-height:1.5}.x .mLangEdit li .side{position:absolute;top:8px;right:0;padding-right:18px;background:url(../img/iconArrow.gif) no-repeat right -160px}.x .mLangEdit li li{border:0;padding-right:36px}.x .mLangEdit li textarea{width:100%;height:16px;padding-right:30px;resize:vertical;line-height:1.4}.x .mLangEdit li label{top:8px !important}.x .mLangEdit li.active{background:#FFFDEF}.x .mLangEdit li.active strong{font-weight:bold}.x .mLangEdit li.active .side{background-position:right -128px}.modal .mLangEdit ul{padding-bottom:1em}.modal .mLangEdit li{border:0;padding-right:36px}/* Suggestion */.x .suggestion{display:none;position:absolute;background:#fff;z-index:10;_height:200px;max-height:200px;overflow:auto;*left:0;*margin-top:28px;box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x .suggestion ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0}.x .suggestion li{padding:0}.x .suggestion li:last-child{border-bottom:0}.x .suggestion li button{border:0;background:#fff;text-align:left;width:288px;padding:2px 4px;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.x .suggestion li button:hover,.x .suggestion li button:active,.x .suggestion li button:focus,.x .suggestion li button.active{background:#eee}/* Image Mark */.x #imageMark{right:0}/* Easy Installer */.x .easyNav{position:relative;border:1px solid #e9e9e9;zoom:1}.x .easyNav:after{content:"";display:block;clear:both}.x .easyNav h2{font-size:16px}.x .easyNav .category{width:30%;float:left;margin:0 2em;display:inline}.x .easyNav .filter{position:absolute;top:0;right:0;margin:1em 2em;text-align:right}.x .easyList td p{margin-top:0}.x .easyList td p.update{background:#ffc;padding:.5em 1em;border:1px solid #fc9;border-left:0;border-right:0;text-align:center}/* Font Preview */.x .fontPreview{width:96%;border:1px solid #e9e9e9;zoom:1;padding:1em 2em;margin:.5em 0}/* FTP Suggestion */.x #ftpSuggestion{background:#fff;box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x #ftpSuggestion ul{border-left:1px solid #eee;border-right:1px solid #eee}.x #ftpSuggestion li{padding:0}.x #ftpSuggestion li button{border:0;background:#fff;text-align:left;width:288px}.x #ftpSuggestion li button:hover,.x #ftpSuggestion li button:active,.x #ftpSuggestion li button:focus{background:#eee}/* Theme & Skin Preview */.x .thumbPreview li{position:relative;padding-left:10px;padding-right:10px}.x .thumbPreview li.active.highlight{background:#f9f9f9}.x .thumbPreview .prevToggle{position:absolute;top:8px;right:10px;line-height:16px;padding:0 18px 0 0;text-decoration:none;background:url(../img/iconArrow.gif) no-repeat right -32px}.x .thumbPreview li.active .prevToggle{background-position:right 0}.x .thumbPreview .a{border:0;margin:0;zoom:1}.x .thumbPreview .a:after{content:"";display:block;clear:both}.x .thumbPreview .i{float:left;vertical-align:top;margin:0 1em 1em 0;padding:0;border:0;zoom:1}.x .thumbPreview .i:after{content:"";display:block;clear:both}.x .thumbPreview .i .thumb{position:relative;width:124px;height:84px;padding:0;margin-bottom:3px;text-align:center;overflow:hidden;border:1px solid #ddd;display:block;cursor:pointer;background:#fff}.x .thumbPreview .i .thumb .frame{position:absolute;width:120px;height:80px;left:0;top:0;border:2px solid #fff;overflow:hidden}.x .thumbPreview .i .thumb img{width:120px;margin:0}.x .thumbPreview .i label{display:block;position:relative;top:0;left:2px;width:122px;height:1.1em;margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x .thumbPreview .i input{display:none}.x .thumbPreview .i ul{display:none}.x .thumbPreview .selected .i{display:block;float:none}.x .thumbPreview .selected .i .thumb{float:left;width:186px;height:126px;margin:0 1em 0 0;border:2px solid #eee}.x .thumbPreview .selected .i .thumb .frame{width:180px;height:120px;border-width:3px}.x .thumbPreview li.active.highlight .selected .i .thumb{border-color:#5ea8f6}.x .thumbPreview .selected .i .thumb img{width:180px;position:relative}.x .thumbPreview li.active .selected .i .thumb img{z-index:auto}.x .thumbPreview .selected .i label{cursor:text}.x .thumbPreview .selected .i ul{display:block;list-style:none;border:0;margin:1em 0 1em 200px}.x .thumbPreview .selected .i li{border:0;padding:0;margin:0 0 .2em 0}.x .thumbPreview.jx .i label{display:inline;width:auto}.x .thumbPreview.jx .i.noDirection{display:none}.x .thumbPreview.jx .i input{display:inline}.x #skin .showAll{float:right;border:0;overflow:visible;padding:0 18px 0 0;cursor:pointer;color:#00f;background:url(../img/iconArrow.gif) no-repeat right -32px}.x #skin .showAll.hideAll{background-position:right 0}/* Favorite On | Off */.x .fvOff,.x .fvOn{display:inline-block;width:16px;height:16px;overflow:hidden;text-indent:16px;background:url(../img/iconFavorite.gif) no-repeat}.x .fvOn{background-position:0 -16px}/* Up-Down Dragable */.x .uDrag .wrap{position:relative;padding-left:20px}.x .uDrag li>.wrap{margin:0 0 0 8px}.x .uDrag .dragActive{background:#FFD}.x .uDrag .dragActive th,.x .uDrag .dragActive td{background:none !important}.x .uDrag .dragBtn{position:absolute;width:8px;height:100%;padding:0;overflow:hidden;background:url(../img/bgDragable.gif);top:1px;left:0;text-indent:12px;border:0;cursor:n-resize;white-space:nowrap}/* Favicon Preview */.x .faviconPreview{position:relative;padding:60px 0 0 200px;background:url(../img/bgFavicon.gif) no-repeat}.x .faviconPreview img{position:absolute}.x .faviconPreview .fn1{top:30px;left:12px}.x .faviconPreview .fn2{top:55px;left:68px}/* Mobile Icon Preview */.x .mobiconPreview{position:relative;padding:252px 0 0 200px;background:url(../img/bgMobileTop.png) no-repeat}.x .mobiconPreview img{position:absolute;top:20px;left:10px}.x .mobiconPreview span{position:absolute;width:32px;text-align:center;top:52px;left:10px;color:#fff;font-size:9px}/* Text List */.x .textList{border:1px solid #ddd !important;line-height:1.5em;height:18.5em;overflow:auto}.x .textList li{border:0;padding:.25em 1em;height:1.5em;white-space:nowrap;overflow:hidden}.x .textList li:nth-child(even){background:#eee}.x .textList li a{float:right}/* File Box */.x .fileBox li{position:relative}.x .fileBox li img{max-width:100%}.x .fileBox .portlet ul{margin:1em;list-style:none;padding:0;border:0}.x .fileBox .portlet li{border-top:1px solid #ddd;border-bottom:0;padding:8px 0}.x .fileBox .side{position:absolute;top:8px;right:0}/* Messages */.x .desc.error{color:#f00}.x .desc.success{color:#080}/* Icon Button */.x a.iSetting{display:inline-block;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;vertical-align:middle;background:url(../img/iconSetting.gif) no-repeat}.x a.cMenu{display:inline-block;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;vertical-align:middle;background:url(../../../../common/img/icon.bubble.png) no-repeat}/* Responsive Layout */@media only all and (max-width:860px){.x .header h1{margin-left:.7em}.x .header .account{padding-right:1em}.x .body{padding:1em}.x .content{float:none;margin-left:0}.x .lnb{float:none;width:auto;margin:1em 0}.x .dashboard .portlet{float:none !important;width:auto !important;margin-right:0}.modal .fg,.wfsr .fg{width:auto}.x .easyNav .category{float:none;display:block;width:auto}.x .easyNav .filter{position:static}}@media only all and (max-width:640px){.x .skipNav a{position:relative;width:auto;height:auto}.modal{position:absolute}}/* Legacy Code (Don't use it. It will be removed as soon as possible.) */.x h3.xeAdmin,.x h4.xeAdmin{position:relative;border-bottom-style:solid;border-bottom-color:#ccc;zoom:1}.x h3.xeAdmin{border-bottom-width:4px;font-size:24px}.x h4.xeAdmin{border-bottom-width:3px;font-size:20px}.x h5.xeAdmin{border-bottom-width:2px;font-size:16px}.x h6.xeAdmin{border-bottom-width:1px;font-size:12px}.x .adminSearch{margin:1em 0}.x .adminSearch fieldset{border:1px solid #ccc;margin:0;padding:.5em 1em}.x .localNavigation{padding:0;list-style:none}.x .localNavigation li{display:inline}.x .localNavigation li.on a{font-weight:bold;color:#333;text-decoration:none}.x .localNavigation li:before{content:"| "}.x .localNavigation li:first-child:before{content:""}.x .summary{margin:1em 0}.x .rowTable,.x .colTable,.x .crossTable{margin:1em 0;border:0;border-collapse:collapse;border-top:2px solid #ccc;width:100%}.x .rowTable caption,.x .colTable caption,.x .crossTable caption{font-weight:bold;text-align:left;line-height:22px;padding:5px 0}.x .rowTable caption:after,.x .colTable caption:after,.x .crossTable caption:after{content:"";display:block;clear:both}.x .rowTable caption a,.x .colTable caption a,.x .crossTable caption a{font-weight:normal}.x .rowTable caption em,.x .colTable caption em,.x .crossTable caption em{float:right;font-style:normal;font-weight:normal;color:#e00;margin-left:1em}.x .rowTable caption strong,.x .colTable caption strong,.x .crossTable caption strong{color:#e00}.x .rowTable caption .side,.x .colTable caption .side,.x .crossTable caption .side{float:right;font-weight:normal;margin-left:1em}.x .rowTable th,.rowTable td,.x .colTable th,.rowTable td,.x .crossTable th,.rowTable td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd;white-space:nowrap}.x .rowTable th,.x .colTable th,.x .crossTable th{background:#f8f8f8}.x .rowTable thead th,.x .colTable thead th,.x .crossTable thead th{border-bottom:1px solid #999}.x .rowTable tfoot td,.x .colTable tfoot td,.x .crossTable tfoot td{font-weight:bold;background:#f8f8f8}.x .rowTable.even tbody tr:nth-of-type(even) td,.x .colTable.even tbody tr:nth-of-type(even) td,.x .crossTable.even tbody tr:nth-of-type(even) td{background-color:#fafafa}.x .rowTable td>input[type=text],.x .colTable td>input[type=text],.x .crossTable td>input[type=text]{margin:-1px 0 -3px 0 !important;vertical-align:middle}.x .rowTable img,.x .colTable img,.x .crossTable img{vertical-align:middle}.x .rowTable .title,.x .colTable .title,.x .crossTable .title,.x .rowTable .text,.x .colTable .text,.x .crossTable .text{white-space:normal}.x .rowTable input[type=text],.x .colTable input[type=text],.x .crossTable input[type=text],.x .rowTable input[type=password],.x .colTable input[type=password],.x .crossTable input[type=password],.x .rowTable input[type=file],.x .colTable input[type=file],.x .crossTable input[type=file],.x .rowTable textarea,.x .colTable textarea,.x .crossTable textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:transparent}.x .rowTable input[type=text],.x .colTable input[type=text],.x .crossTable input[type=text],.x .rowTable input[type=password],.x .colTable input[type=password],.x .crossTable input[type=password],.x .rowTable input[type=file],.x .colTable input[type=file],.x .crossTable input[type=file]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px}.x .clear:after{content:"";display:block;clear:both} \ No newline at end of file From 6e3f1b1aa0acde1996ee560975b7d4faffc7cbe1 Mon Sep 17 00:00:00 2001 From: ovclas Date: Tue, 18 Oct 2011 01:12:32 +0000 Subject: [PATCH 1197/1372] issue 449 rollback git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9671 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/module/module.model.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/module/module.model.php b/modules/module/module.model.php index 11698d636..c8b27955b 100644 --- a/modules/module/module.model.php +++ b/modules/module/module.model.php @@ -148,7 +148,7 @@ /** * @brief Get module information by mid **/ - function getModuleInfoByMid($mid, $site_srl, $columnList = array()) { + function getModuleInfoByMid($mid, $site_srl = 0, $columnList = array()) { $args->mid = $mid; $args->site_srl = (int)$site_srl; $oCacheHandler = &CacheHandler::getInstance('object'); From ca72163edd65a071a3d662e6ef4a78f1272ab4b2 Mon Sep 17 00:00:00 2001 From: ovclas Date: Tue, 18 Oct 2011 01:39:25 +0000 Subject: [PATCH 1198/1372] issue 522 memory collapsing stat in cookie git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9672 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/menu/tpl/js/sitemap.js | 3 +++ modules/menu/tpl/sitemap.html | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/menu/tpl/js/sitemap.js b/modules/menu/tpl/js/sitemap.js index 2d2810f37..e05bf0b37 100644 --- a/modules/menu/tpl/js/sitemap.js +++ b/modules/menu/tpl/js/sitemap.js @@ -201,9 +201,12 @@ $('form.siteMap') $('a.tgMap').click(function() { var $this = $(this); + var curToggleStatus = getCookie('sitemap_toggle_'+$this.attr('href')); + var toggleStatus = curToggleStatus == 1 ? '0' : 1; $($this.attr('href')).slideToggle('fast'); $this.closest('.siteMap').toggleClass('fold'); + setCookie('sitemap_toggle_'+$this.attr('href'), toggleStatus); return false; }); diff --git a/modules/menu/tpl/sitemap.html b/modules/menu/tpl/sitemap.html index 331d737a4..6f376e48a 100644 --- a/modules/menu/tpl/sitemap.html +++ b/modules/menu/tpl/sitemap.html @@ -20,7 +20,7 @@ xe.lang.confirm_delete = "{$lang->confirm_delete}";

                                                      {$lang->collapsing}/{$lang->expanding} -
                                                      From aa193579d21423e550243814f78f299240d944b8 Mon Sep 17 00:00:00 2001 From: chschy Date: Wed, 12 Oct 2011 05:10:25 +0000 Subject: [PATCH 1129/1372] Modify korean language properly git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9601 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/comment/lang/lang.xml | 4 +-- modules/document/lang/lang.xml | 2 +- modules/editor/lang/lang.xml | 46 +++++++++++++++++----------------- modules/module/lang/lang.xml | 30 +++++++++++----------- 4 files changed, 41 insertions(+), 41 deletions(-) diff --git a/modules/comment/lang/lang.xml b/modules/comment/lang/lang.xml index ae148b551..5c3d2d856 100644 --- a/modules/comment/lang/lang.xml +++ b/modules/comment/lang/lang.xml @@ -69,7 +69,7 @@ - + @@ -225,7 +225,7 @@ - + diff --git a/modules/document/lang/lang.xml b/modules/document/lang/lang.xml index dc60ef4f5..f1316609a 100644 --- a/modules/document/lang/lang.xml +++ b/modules/document/lang/lang.xml @@ -563,7 +563,7 @@ - + diff --git a/modules/editor/lang/lang.xml b/modules/editor/lang/lang.xml index c7660f7b3..03e5089d1 100644 --- a/modules/editor/lang/lang.xml +++ b/modules/editor/lang/lang.xml @@ -240,7 +240,7 @@ - + @@ -596,7 +596,7 @@ Bài viết tự động lưu sẽ tự động hủy sau khi bạn hoàn thành - + @@ -608,7 +608,7 @@ Bài viết tự động lưu sẽ tự động hủy sau khi bạn hoàn thành - + @@ -620,27 +620,27 @@ Bài viết tự động lưu sẽ tự động hủy sau khi bạn hoàn thành - 지정하지 않으면 사용자 설정에 따르게 됩니다
                                                      ,(콤마)로 여러 폰트를 지정할 수 있습니다.]]>
                                                      - The default font is your own font.
                                                      Please use comma for multiple input.]]>
                                                      - 指定してない場合、ユーザーの設定を従います。
                                                      半角コンマ(,)区切りで複数フォントの登録が出来ます。]]>
                                                      - 多个字体可以用逗号(,)区分输入。]]> - 如果沒有指定的話,以系統預設為主。
                                                      以逗號(,)區分多個字體。]]>
                                                      - 지정하지 않으면 사용자 설정에 따르게 됩니다
                                                      ,(콤마)로 여러 폰트를 지정할 수 있습니다.]]>
                                                      - Используйте запятую(,) если выбрали несколько шрифтов.]]> - 지정하지 않으면 사용자 설정에 따르게 됩니다
                                                      ,(콤마)로 여러 폰트를 지정할 수 있습니다.]]>
                                                      - Varsayılan yazı tipi sizin kendi yazı tipinizdir
                                                      Lütfen çoklu giriş için virgül(,) kullanınız.]]>
                                                      - Để đặt mặc định chỉ Font chữ bạn hay sử dụng, hãy đặt dấu (,) vào giữa các Font.]]> + 지정하지 않으면 사용자 설정에 따르게 됩니다
                                                      ,(콤마)로 여러 폰트를 지정할 수 있습니다.]]>
                                                      + The default font is your own font.
                                                      Please use comma for multiple input.]]>
                                                      + 指定してない場合、ユーザーの設定を従います。
                                                      半角コンマ(,)区切りで複数フォントの登録が出来ます。]]>
                                                      + 多个字体可以用逗号(,)区分输入。]]> + 如果沒有指定的話,以系統預設為主。
                                                      以逗號(,)區分多個字體。]]>
                                                      + 지정하지 않으면 사용자 설정에 따르게 됩니다
                                                      ,(콤마)로 여러 폰트를 지정할 수 있습니다.]]>
                                                      + Используйте запятую(,) если выбрали несколько шрифтов.]]> + 지정하지 않으면 사용자 설정에 따르게 됩니다
                                                      ,(콤마)로 여러 폰트를 지정할 수 있습니다.]]>
                                                      + Varsayılan yazı tipi sizin kendi yazı tipinizdir
                                                      Lütfen çoklu giriş için virgül(,) kullanınız.]]>
                                                      + Để đặt mặc định chỉ Font chữ bạn hay sử dụng, hãy đặt dấu (,) vào giữa các Font.]]>
                                                      - 12px, 1em등 단위까지 포함해서 입력해주세요.]]> - Please input units such as px or em.]]> - 12px、1emなどサイズ単位まで入力してください。]]> - 指定时请包含字体单位(如12px, 1em)。]]> - 請輸入單位,像是12px, 1em等。]]> - 12px, 1em등 단위까지 포함해서 입력해주세요.]]> - Пожалуйста, выберите единицы такие как px или em.]]> - 12px, 1em등 단위까지 포함해서 입력해주세요.]]> - Lütfen px veya em gibi birimler kullanınız.]]> + 12px, 1em등 단위까지 포함해서 입력해주세요.]]> + Please input units such as px or em.]]> + 12px、1emなどサイズ単位まで入力してください。]]> + 指定时请包含字体单位(如12px, 1em)。]]> + 請輸入單位,像是12px, 1em等。]]> + 12px, 1em등 단위까지 포함해서 입력해주세요.]]> + Пожалуйста, выберите единицы такие как px или em.]]> + 12px, 1em등 단위까지 포함해서 입력해주세요.]]> + Lütfen px veya em gibi birimler kullanınız.]]> @@ -692,7 +692,7 @@ Bài viết tự động lưu sẽ tự động hủy sau khi bạn hoàn thành - + diff --git a/modules/module/lang/lang.xml b/modules/module/lang/lang.xml index 95dcfc9ec..b8f17c958 100644 --- a/modules/module/lang/lang.xml +++ b/modules/module/lang/lang.xml @@ -358,24 +358,24 @@ - 독립 도메인이나 서브 도메인이 있으면 되고 XE가 설치된 경로까지 같이 넣어주세요.
                                                      예) www.xpressengine.com/xe]]>
                                                      + 독립 도메인이나 서브 도메인이 있으면 되고 XE가 설치된 경로까지 같이 넣어주세요.
                                                      예) www.xpressengine.com/xe]]>
                                                      A sub-domain (e.g., aaa.bbb.com of bbb.com) also can be used. Input the address including the path where XE is installed.
                                                      ex) www.xpressengine.com/xe]]>
                                                      また、 XEのインストールパスも一緒に記入してください。
                                                      ex) www.xpressengine.com/xe]]>
                                                      - 一级域名或二级域名皆可。输入的时候请把XE安装路径也一起输入。
                                                      ex) www.xpressengine.com/xe]]>
                                                      - 頂級域名或次級域名都可以。輸入時,請將 XE 安裝路徑也一起輸入。
                                                      例) www.xpressengine.com/xe]]>
                                                      - Independiente de dominio o subdominio, y XE está instalado, el camino que en su conjunto.
                                                      Ej.) www.xpressengine.com / zbxe]]>
                                                      + 一级域名或二级域名皆可。输入的时候请把XE安装路径也一起输入。
                                                      ex) www.xpressengine.com/xe]]>
                                                      + 頂級域名或次級域名都可以。輸入時,請將 XE 安裝路徑也一起輸入。
                                                      例) www.xpressengine.com/xe]]>
                                                      + Independiente de dominio o subdominio, y XE está instalado, el camino que en su conjunto.
                                                      Ej.) www.xpressengine.com / zbxe]]>
                                                      Alt-alanadı (örn., aaa.bbb.com of bbb.com) da kullanılabilir. XE'nin de içinde kurulu olduğu yolun adresini giriniz.
                                                      örn.) www.xpressengine.com/xe]]>
                                                      Có thể sử dụng những Subdomain dạng aaa.bbb.com của bbb.com. Hãy nhập địa chỉ bao gồm cả Domain cài đặt XE.
                                                      Ví dụ: www.vietxe.net/xe]]>
                                                      - 첫 글자는 영문으로 시작해야 하고 영문과 숫자 그리고 _ 만 사용할 수 있습니다]]> + 첫 글자는 영문으로 시작해야 하고 영문과 숫자 그리고 _ 만 사용할 수 있습니다]]> Site id should start with an alphabet character. Alphabet characters, numbers and underscore can be used for the site id.]]> - 必ず、頭文字は半角英文字にし、「(すべて半角の)英数字・_ 」 だけの組み合わせで入力してください。]]> - 模块名(mid)不能重复。
                                                      模块名要以英文字母开头,且只允许使用英文字母,数字及"_"。]]>
                                                      - 必須要以英文字母開頭,只允許使用底線、英文及數字。]]> - 첫글자는 영문으로 시작해야 하고 영문과 숫자 그리고 _ 만 사용할 수 있습니다]]> - 첫글자는 영문으로 시작해야 하고 영문과 숫자 그리고 _ 만 사용할 수 있습니다]]> - 첫글자는 영문으로 시작해야 하고 영문과 숫자 그리고 _ 만 사용할 수 있습니다]]> + 必ず、頭文字は半角英文字にし、「(すべて半角の)英数字・_ 」 だけの組み合わせで入力してください。]]> + 模块名(mid)不能重复。
                                                      模块名要以英文字母开头,且只允许使用英文字母,数字及"_"。]]>
                                                      + 必須要以英文字母開頭,只允許使用底線、英文及數字。]]> + 첫글자는 영문으로 시작해야 하고 영문과 숫자 그리고 _ 만 사용할 수 있습니다]]> + 첫글자는 영문으로 시작해야 하고 영문과 숫자 그리고 _ 만 사용할 수 있습니다]]> + 첫글자는 영문으로 시작해야 하고 영문과 숫자 그리고 _ 만 사용할 수 있습니다]]> Site kimliği bir harfle başlamaladır . Alfabetik karakterler, sayılar ve _ işareti site kimliği için kullanılabilir.]]> Teen ID có dạng là các chữ cái, số và dấu gạch dưới (_).]]>
                                                      @@ -392,12 +392,12 @@ - + - + @@ -411,7 +411,7 @@ - <script, <style 또는 <meta 태그 등을 이용하실 수 있습니다]]> + <script, <style 또는 <meta 태그 등을 이용하실 수 있습니다.]]> You can use <script, <style or <meta tags.]]> <script、<styleまたは<metaタグなどを利用できます。]]> 可使用<script, <style 或 <meta 等标签。]]> @@ -655,7 +655,7 @@ - + From e6d1710f0b686e1460c8e82181d9ebe9e8546fc9 Mon Sep 17 00:00:00 2001 From: chschy Date: Wed, 12 Oct 2011 05:18:26 +0000 Subject: [PATCH 1130/1372] issue 459, wrong output in admin side menu when selected english git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9602 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/conf/module.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/admin/conf/module.xml b/modules/admin/conf/module.xml index e33d0c1de..3d0e14120 100644 --- a/modules/admin/conf/module.xml +++ b/modules/admin/conf/module.xml @@ -50,7 +50,7 @@ Admin Setup - General + FTP Configuration FTP 설정 FTP Configuration FTP Configuration From 93cf422708a4fe14a34e6fe743000a6082f60908 Mon Sep 17 00:00:00 2001 From: chschy Date: Wed, 12 Oct 2011 05:39:40 +0000 Subject: [PATCH 1131/1372] Modify ftp configuration template because of worng code git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9603 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/tpl/config_ftp.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/admin/tpl/config_ftp.html b/modules/admin/tpl/config_ftp.html index c6724c6c7..62f425a81 100644 --- a/modules/admin/tpl/config_ftp.html +++ b/modules/admin/tpl/config_ftp.html @@ -23,7 +23,7 @@
                                                    • -

                                                      Default : 21

                                                      +

                                                      Default : 21

                                                    • From 830cf41e8bbe583dd0a4b127b6a3ea4fc6a19cb7 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Wed, 12 Oct 2011 05:42:33 +0000 Subject: [PATCH 1132/1372] widget xe_official skin legend element removed. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9604 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/lang/lang.xml | 10 +++++----- widgets/login_info/skins/xe_official/login_info.html | 1 - 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/common/lang/lang.xml b/common/lang/lang.xml index 2e6772442..a82f39e97 100644 --- a/common/lang/lang.xml +++ b/common/lang/lang.xml @@ -2500,7 +2500,7 @@ - + @@ -2514,7 +2514,7 @@ - + @@ -2528,7 +2528,7 @@ - + @@ -2542,7 +2542,7 @@ - + @@ -2556,7 +2556,7 @@ - diff --git a/widgets/login_info/skins/xe_official/login_info.html b/widgets/login_info/skins/xe_official/login_info.html index e5126fc54..da7464161 100644 --- a/widgets/login_info/skins/xe_official/login_info.html +++ b/widgets/login_info/skins/xe_official/login_info.html @@ -4,7 +4,6 @@
                                                    • - {getEncodeEmailAddress($member_info['email_address'])} Info + {getEncodeEmailAddress($member_info['email_address'])} {$member_info[$name]}
                                                      - - - - - - - - - - - - - + + + + + + + + + + + +
                                                      {$lang->comment_count} -

                                                      {$lang->about_comment_count}

                                                      - - -
                                                      {$lang->cmd_vote} - -
                                                      {$lang->cmd_vote_down} - -
                                                      + + {$lang->about_comment_count} +
                                                      + +
                                                      + +
                                                      diff --git a/modules/document/lang/lang.xml b/modules/document/lang/lang.xml index c66727670..bfcc98109 100644 --- a/modules/document/lang/lang.xml +++ b/modules/document/lang/lang.xml @@ -799,12 +799,6 @@ - - - - - - diff --git a/modules/document/tpl/document_module_config.html b/modules/document/tpl/document_module_config.html index abffb8931..cdff7212a 100644 --- a/modules/document/tpl/document_module_config.html +++ b/modules/document/tpl/document_module_config.html @@ -1,40 +1,40 @@ - +

                                                      {$lang->document}

                                                      - - - - - - - - - - - - + + + + + + + + + + + +
                                                      {$lang->history} -

                                                      {$lang->about_use_history}

                                                      - -
                                                      {$lang->cmd_vote} - -
                                                      {$lang->cmd_vote_down} - -
                                                      + + {$lang->about_use_history} +
                                                      + +
                                                      + +
                                                      diff --git a/modules/editor/lang/lang.xml b/modules/editor/lang/lang.xml index 03e5089d1..2c1d9c1ef 100644 --- a/modules/editor/lang/lang.xml +++ b/modules/editor/lang/lang.xml @@ -121,89 +121,19 @@ - - - - - - - - - - - - - - - - - - - - - - - + + + - - - - - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + @@ -371,28 +301,28 @@ - (모두 해제 시 아무나 사용 가능합니다)]]> - (Leave them blank if you want all groups to have permissions.)]]> - (選択なしの場合、誰でも利用可能)]]> - (全部解除时任何用户都可以使用)。]]> - (全部解除時,任何用戶都可使用)。]]> - (Tout le monde aura la Permission si vous ne cochez rien)]]> - (Каждый может использовать его, если режим выключен)]]> - (Todo el mundo tendría permiso si no comprobado)]]> - (Eğer tüm grupların bu yetkiye sahip olmasını istiyorsanız, boş bırakınız)]]> - (Để trống nếu bạn muốn tất cả các nhóm đều được phép sử dụng.)]]> + + + + + + + + + + - (모두 해제 시 모든 대상에서 사용 가능합니다)]]> - (All targets will be selected when nothing is selected.)]]> - (選択なしの場合、全ての対象で利用可能)]]> - (全部解除时任何用户都可以使用)。]]> - (全部解除時,任何用戶都可使用)。]]> - (Tous les objectifs auront la Permission quand rien n'est choisi.)]]> - (Каждый может использовать его, если режим выключен)]]> - (모두 해제시 모든 대상에서 사용 가능합니다)]]> - (Hiçbir şey seçilmediğinde, tüm hedefler seçilecektir)]]> - (Nếu để trống là tất cả các khu vực đều có thể sử dụng.)]]> + + + + + + + + + + @@ -620,27 +550,27 @@ Bài viết tự động lưu sẽ tự động hủy sau khi bạn hoàn thành - 지정하지 않으면 사용자 설정에 따르게 됩니다
                                                      ,(콤마)로 여러 폰트를 지정할 수 있습니다.]]>
                                                      - The default font is your own font.
                                                      Please use comma for multiple input.]]>
                                                      - 指定してない場合、ユーザーの設定を従います。
                                                      半角コンマ(,)区切りで複数フォントの登録が出来ます。]]>
                                                      - 多个字体可以用逗号(,)区分输入。]]> - 如果沒有指定的話,以系統預設為主。
                                                      以逗號(,)區分多個字體。]]>
                                                      - 지정하지 않으면 사용자 설정에 따르게 됩니다
                                                      ,(콤마)로 여러 폰트를 지정할 수 있습니다.]]>
                                                      - Используйте запятую(,) если выбрали несколько шрифтов.]]> - 지정하지 않으면 사용자 설정에 따르게 됩니다
                                                      ,(콤마)로 여러 폰트를 지정할 수 있습니다.]]>
                                                      - Varsayılan yazı tipi sizin kendi yazı tipinizdir
                                                      Lütfen çoklu giriş için virgül(,) kullanınız.]]>
                                                      - Để đặt mặc định chỉ Font chữ bạn hay sử dụng, hãy đặt dấu (,) vào giữa các Font.]]> + + + + + + + + + +
                                                      - 12px, 1em등 단위까지 포함해서 입력해주세요.]]> - Please input units such as px or em.]]> - 12px、1emなどサイズ単位まで入力してください。]]> - 指定时请包含字体单位(如12px, 1em)。]]> - 請輸入單位,像是12px, 1em等。]]> - 12px, 1em등 단위까지 포함해서 입력해주세요.]]> - Пожалуйста, выберите единицы такие как px или em.]]> - 12px, 1em등 단위까지 포함해서 입력해주세요.]]> - Lütfen px veya em gibi birimler kullanınız.]]> + + + + + + + + + diff --git a/modules/editor/skins/dreditor/skin.xml b/modules/editor/skins/dreditor/skin.xml index a785c6438..d00137ecb 100644 --- a/modules/editor/skins/dreditor/skin.xml +++ b/modules/editor/skins/dreditor/skin.xml @@ -41,87 +41,87 @@ - 하얀색(기본) - 白(デフォルト) - 白色(基本) - White (default) - White (Mặc định) - Blanco (por defecto) - 白色(預設) - Beyaz (varsayılan) + 하얀색 위지윅(기본) + 白 WYSIWYG(デフォルト) + 白色 WYSIWYG(基本) + White WYSIWYG(default) + White WYSIWYG (Mặc định) + Blanco WYSIWYG(por defecto) + 白色 WYSIWYG(預設) + Beyaz WYSIWYG(varsayılan) - 검은색 - - Black - Black - Черного - Negro - 黑色 - 黑色 - Siyah + 검은색 위지윅 + 黒 WYSIWYG + Black WYSIWYG + Black WYSIWYG + Черного WYSIWYG + Negro WYSIWYG + 黑色 WYSIWYG + 黑色 WYSIWYG + Siyah WYSIWYG - 하얀색 텍스트편집기(자동 줄 바꿈) - 白色テキストエディター(自動に改行を入れる) - White Text Editor (Auto Line Break) - White Text Editor(Tự động giãn dòng) - White Text Editor(Auto Line Break) + 하얀색 Text(자동 줄 바꿈) + 白色テキスト(自動に改行を入れる) + White Text(Auto Line Break) + White Text(Tự động giãn dòng) + White Text(Auto Line Break) Editor de texto en blanco (Auto de línea) 白色文本编辑器(自动换行) 白色文字編輯器(自動換行) Beyaz Metin Editörü(Otomatik Satır Arası) - 검은색 텍스트편집기(자동 줄 바꿈) + 검은색 텍스트(자동 줄 바꿈) 黒色テキストエディター(自動に改行を入れる) - Black Text Editor (Auto Line Break) - Black Text Editor(Tự động giãn dòng) - Black Text Editor(Auto Line Break) + Black Text(Auto Line Break) + Black Text(Tự động giãn dòng) + Black Text(Auto Line Break) Editor de texto negro (salto de línea automático) 黑色文本编辑器(自动换行) 黑色文字編輯器(自動換行) Siyah Metin Alanı(Otomatik Satır Arası) - 하얀색 텍스트편집기(HTML 사용) - 白色テキストエディター(HTMLタグを使う) - White Text Editor (Use HTML) - White Text Editor(Sử dụng HTML) - White Text Editor(Use HTML) + 하얀색 텍스트(HTML 사용) + 白色テキスト(HTMLタグを使う) + White Text(Use HTML) + White Text(Sử dụng HTML) + White Text(Use HTML) Editor de texto en blanco (Uso de HTML) 白色文本编辑器(使用HTML) 白色文字編輯器(使用HTML) Beyaz Metin Editörü(HTML kullan) - 검은색 텍스트편집기(HTML 사용) - 黒色テキストエディター(HTMLタグを使う) - Black Text Editor (Use HTML) - Black Text Editor(Sử dụng HTML) - Black Text Editor(Use HTML) + 검은색 텍스트(HTML 사용) + 黒色テキスト(HTMLタグを使う) + Black Text(Use HTML) + Black Text(Sử dụng HTML) + Black Text(Use HTML) Editor de texto negro (Uso de HTML) 黑色文本编辑器(使用HTML) 黑色文字編輯器(使用HTML) Siyah Metin Alanı(HTML kullan) - 하얀색 텍스트편집기(HTML 사용 안함) - 白色テキストエディター(HTMLタグを使わない) - White Text Editor (No HTML) - White Text Editor(Không sử dụng HTML) - White Text Editor(No HTML) + 하얀색 텍스트(HTML 사용 안함) + 白色テキスト(HTMLタグを使わない) + White Text(No HTML) + White Text(Không sử dụng HTML) + White Text(No HTML) Editor de texto en blanco (no HTML) 白色文本编辑器(不使用HTML) 白色文字編輯器(不使用HTML) Beyaz Metin Editörü(HTML yok) - 검은색 텍스트편집기(HTML 사용 안함) - 黒色テキストエディター(HTMLタグを使わない) - Black Text Editor (No HTML) - Black Text Editor(Không sử dụng HTML) - Black Text Editor(No HTML) + 검은색 텍스트(HTML 사용 안함) + 黒色テキスト(HTMLタグを使わない) + Black Text(No HTML) + Black Text(Không sử dụng HTML) + Black Text(No HTML) Editor de texto negro (no HTML) 黑色文本编辑器(不使用HTML) 黑色文字編輯器(不使用HTML) diff --git a/modules/editor/skins/xpresseditor/skin.xml b/modules/editor/skins/xpresseditor/skin.xml index 4e6f0ca4f..2371d33ce 100644 --- a/modules/editor/skins/xpresseditor/skin.xml +++ b/modules/editor/skins/xpresseditor/skin.xml @@ -46,87 +46,87 @@ - 하얀색(기본) - 白(デフォルト) - 白色(默认) - White (default) - White (Mặc định) - Blanco (por defecto) - 白色(預設) - Beyaz (varsayılan) + 하얀색 위지윅(기본) + 白 WYSIWYG(デフォルト) + 白色 WYSIWYG(默认) + White WYSIWYG(default) + White WYSIWYG(Mặc định) + Blanco WYSIWYG(por defecto) + 白色 WYSIWYG(預設) + Beyaz WYSIWYG(varsayılan) - 검은색 - - Black - Black - Черного - Negro - 黑色 - 黑色 - Siyah + 검은색 위지윅 + 黒 WYSIWYG + Black WYSIWYG + Black WYSIWYG + Черного WYSIWYG + Negro WYSIWYG + 黑色 WYSIWYG + 黑色 WYSIWYG + Siyah WYSIWYG - 하얀색 텍스트편집기(HTML 사용, 자동 줄 바꿈) - 白色テキストエディター(自動に改行を入れる) - White Text Editor (Auto Line Break) - White Text Editor(Dòng tự động mở) - White Text Editor (Auto Line Break) + 하얀색 텍스트(HTML 사용, 자동 줄 바꿈) + 白色テキスト(自動に改行を入れる) + White Text(Auto Line Break) + White Text(Dòng tự động mở) + White Text(Auto Line Break) Editor de texto en blanco (Auto de línea) 白色文本编辑器(使用HTML,自动换行) 白色文字編輯器(使用HTML,自動換行) Beyaz Metin Editörü(Auto Line Break) - 검은색 텍스트편집기(HTML 사용, 자동 줄 바꿈) - 黒色テキストエディター(自動に改行を入れる) - Black Text Editor (Auto Line Break) - Black Text Editor(Dòng tự động mở) - Black Text Editor (Auto Line Break) + 검은색 텍스트(HTML 사용, 자동 줄 바꿈) + 黒色テキスト(自動に改行を入れる) + Black Text(Auto Line Break) + Black Text(Dòng tự động mở) + Black Text(Auto Line Break) Editor de texto negro (salto de línea automático) 黑色文本编辑器(使用HTML,自动换行) 黑色文字編輯器(使用HTML,自動換行) Siyah Metin Editörü(Auto Line Break) - 하얀색 텍스트편집기(HTML 사용, 자동 줄 바꿈 안함) - 白色テキストエディター(HTMLタグを使う) - White Text Editor (Use HTML) - White Text Editor(Sử dụng HTML) - White Text Editor (Use HTML) + 하얀색 텍스트(HTML 사용, 자동 줄 바꿈 안함) + 白色テキスト(HTMLタグを使う) + White Text(Use HTML) + White Text(Sử dụng HTML) + White Text(Use HTML) Editor de texto en blanco (Uso de HTML) 白色文本编辑器(使用HTML,不自动换行) 白色文字編輯器(使用HTML,不自動換行) Beyaz Metin Editörü(HTML Kullan) - 검은색 텍스트편집기(HTML 사용, 자동 줄 바꿈 안함) - 黒色テキストエディター(HTMLタグを使う) - Black Text Editor (Use HTML) - Black Text Editor(Sử dụng HTML) - Black Text Editor (Use HTML) + 검은색 텍스트(HTML 사용, 자동 줄 바꿈 안함) + 黒色テキスト(HTMLタグを使う) + Black Text(Use HTML) + Black Text(Sử dụng HTML) + Black Text(Use HTML) Editor de texto negro (Uso de HTML) 黑色文本编辑器(使用HTML,不自动换行) 黑色文字編輯器(使用HTML,不自動換行) Siyah Metin Editörü(HTML kullan) - 하얀색 텍스트편집기(HTML 사용 안함, 자동 줄 바꿈) - 白色テキストエディター(HTMLタグを使わない) - White Text Editor (No HTML) - White Text Editor(Không có HTML) - White Text Editor (No HTML) + 하얀색 텍스트(HTML 사용 안함, 자동 줄 바꿈) + 白色テキスト(HTMLタグを使わない) + White Text(No HTML) + White Text(Không có HTML) + White Text(No HTML) Editor de texto en blanco (no HTML) 白色文本编辑器(不使用HTML,自动换行) 白色文字編輯器(不使用HTML,自動換行) Beyaz Metin Editörü(HTML yok) - 검은색 텍스트편집기(HTML 사용 안함, 자동 줄 바꿈) - 黒色テキストエディター(HTMLタグを使わない) - Black Text Editor (No HTML) - Black Text Editor(Không có HTML) - Black Text Editor (No HTML) + 검은색 텍스트(HTML 사용 안함, 자동 줄 바꿈) + 黒色テキスト(HTMLタグを使わない) + Black Text(No HTML) + Black Text(Không có HTML) + Black Text(No HTML) Editor de texto negro (no HTML) 黑色文本编辑器(不使用HTML,自动换行) 黑色文字編輯器(不使用HTML,自動換行) diff --git a/modules/editor/tpl/editor_module_config.html b/modules/editor/tpl/editor_module_config.html index 5baf493a7..fd54a8057 100644 --- a/modules/editor/tpl/editor_module_config.html +++ b/modules/editor/tpl/editor_module_config.html @@ -1,6 +1,6 @@ - +

                                                      {$lang->editor}

                                                      @@ -14,11 +14,11 @@ - {$lang->editor_skin} -

                                                      {$lang->about_editor_skin}

                                                      + {$lang->editor_skin} + {$lang->about_editor_skin} - + - + - + + + + + + {$lang->about_content_font} + + + + content_font)}" /> - {$lang->content_font} -

                                                      {$lang->about_content_font}

                                                      + + {$lang->about_content_font_size} - - content_font)}" /> + + - {$lang->content_font_size} -

                                                      {$lang->about_content_font_size}

                                                      + {$lang->editor_height} + {$lang->about_editor_height} - - + + px + + + px - {$lang->editor_height} -

                                                      {$lang->about_editor_height}

                                                      + {$lang->enable_autosave} + {$lang->about_enable_autosave} - - px - - - px - + enable_autosave=='Y')-->checked="checked"/> - {$lang->enable_autosave} -

                                                      {$lang->about_enable_autosave}

                                                      + {$lang->enable_html_grant} + {$lang->about_enable_html_grant} - enable_autosave=='Y')-->checked="checked"/> - - - {$lang->enable_html_grant} -

                                                      {$lang->about_enable_html_grant}

                                                      - - - + enable_html_grant))-->checked="checked"/> -
                                                      - - - + enable_comment_html_grant))-->checked="checked"/> -
                                                      - - - {$lang->upload_file_grant} -

                                                      {$lang->about_upload_file_grant}

                                                      + {$lang->upload_file_grant} + {$lang->about_upload_file_grant} - + upload_file_grant))-->checked="checked"/> -
                                                      - - - - - + comment_upload_file_grant))-->checked="checked"/> -
                                                      - - - - - {$lang->enable_default_component_grant} -

                                                      {$lang->about_default_component_grant}

                                                      + {$lang->enable_default_component_grant} + {$lang->about_default_component_grant} - + enable_default_component_grant))-->checked="checked"/> -
                                                      - - - + enable_comment_default_component_grant))-->checked="checked"/> -
                                                      - - - - - {$lang->enable_component_grant} -

                                                      {$lang->about_component_grant}

                                                      + {$lang->enable_component_grant} + {$lang->about_component_grant} - + enable_component_grant))-->checked="checked"/> -
                                                      - - - - - + enable_comment_component_grant))-->checked="checked"/> -
                                                      - - - - diff --git a/modules/file/lang/lang.xml b/modules/file/lang/lang.xml index 92a85be6c..dc0ca3e72 100644 --- a/modules/file/lang/lang.xml +++ b/modules/file/lang/lang.xml @@ -188,24 +188,24 @@ - 예)hwp,doc,zip,pdf]]> - eg)hwp,doc,zip,pdf]]> - eg)txt,doc,zip,pdf]]> - 例) hwp, doc, zip, pdf]]> - örn.)hwp,doc,zip,pdf]]> - Ví dụ: .hwp, .doc, .zip, .pdf]]> + + + + + + - 예)http://www.xpressengine.com]]> - ex)http://xpressengine.com/]]> - ex)http://xpressengine.com/]]> - ex)http://xpressengine.com/]]> - 例) http://xpressengine.com/]]> - ex)http://xpressengine.com/]]> - ex)http://www.hotmail.com]]> - Ej.) http://xpressengine.com/]]> - örn.)http://xpressengine.com/]]> - Ví dụ: http://xpressengine.com/]]> + + + + + + + + + + @@ -232,16 +232,16 @@ - 예) *.* or *.jpg;*.gif;
                                                      (관리자는 제외)]]>
                                                      - ex) *.* or *.jpg;*.gif;
                                                      (Exclude Administrators)]]>
                                                      - ex) *.* or *.jpg;*.gif;
                                                      ]]>
                                                      - 例) *.* or *.jpg;*.gif;
                                                      (管理员不受此限制)]]>
                                                      - 例) *.* or *.jpg; *.gif;
                                                      (管理員不受此限制)]]>
                                                      - ex) *.* ou *.jpg;*.gif;
                                                      (Exclure Administrateurs)]]>
                                                      - например: *.* или *.jpg;*.gif;
                                                      (Исключая администраторов)]]>
                                                      - ej) *.* o *.jpg;*.gif;etc.
                                                      (exceptuando el administrador)]]>
                                                      - örn.) *.* veya *.jpg;*.gif;
                                                      (Yöneticilerin tercihleri sınırlandırılmaz)]]>
                                                      - Để thêm những dạng File được phép đính kèm, bạn sử dụng "*.[đuôi]".
                                                      Để cho phép nhiều dạng đuôi File hãy đặt dấu ";" vào giữa các dạng đuôi.
                                                      Ví dụ: *.* (Cho phép tất cả) hay *.jpg;*.gif;
                                                      (Ngoại trừ Administrators)]]>
                                                      + + + + + + + + + +
                                                      diff --git a/modules/file/tpl/file_config.html b/modules/file/tpl/file_config.html index 0fca4b8b6..d138d29af 100644 --- a/modules/file/tpl/file_config.html +++ b/modules/file/tpl/file_config.html @@ -4,59 +4,59 @@

                                                      {$XE_VALIDATOR_MESSAGE}

                                                      - - -
                                                      - + + +
                                                      +
                                                      + + + + - - - - - - - - - - - - - - - - - - - - - - - -
                                                      {$lang->allow_outlink} + +

                                                      {$lang->about_allow_outlink}

                                                      +
                                                      {$lang->allow_outlink}
                                                      - -

                                                      {$lang->about_allow_outlink}

                                                      -
                                                      {$lang->allow_outlink_format}
                                                      - -

                                                      {$lang->about_allow_outlink_format}

                                                      -
                                                      {$lang->allow_outlink_site}
                                                      - -

                                                      {$lang->about_allow_outlink_site}

                                                      -
                                                      {$lang->allowed_filesize}
                                                      - MB -

                                                      {$lang->about_allowed_filesize}

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

                                                      {$lang->about_allowed_attach_size}

                                                      -
                                                      {$lang->allowed_filetypes}
                                                      - -

                                                      {$lang->about_allowed_filetypes}

                                                      -
                                                      -
                                                      -
                                                      - -
                                                      + {$lang->allow_outlink_format} + + +

                                                      {$lang->about_allow_outlink_format}

                                                      + + + + {$lang->allow_outlink_site} + + +

                                                      {$lang->about_allow_outlink_site}

                                                      + + + + {$lang->allowed_filesize} + + MB +

                                                      {$lang->about_allowed_filesize}

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

                                                      {$lang->about_allowed_attach_size}

                                                      + + + + {$lang->allowed_filetypes} + + +

                                                      {$lang->about_allowed_filetypes}

                                                      + + + +
                                                      +
                                                      + +
                                                      diff --git a/modules/file/tpl/file_module_config.html b/modules/file/tpl/file_module_config.html index a8056e220..c0e960e7a 100644 --- a/modules/file/tpl/file_module_config.html +++ b/modules/file/tpl/file_module_config.html @@ -1,4 +1,4 @@ -
                                                      + @@ -6,30 +6,30 @@
                                                      - - + - - + - - + - - + - + @@ -43,7 +43,7 @@ {@ $target_url = $original_site."?mid=download&package_srl=".$item->package_srl; } - +
                                                      {$lang->allowed_filesize}
                                                      - MB -

                                                      {$lang->about_allowed_filesize}

                                                      +
                                                      + MB +

                                                      {$lang->about_allowed_filesize}

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

                                                      {$lang->about_allowed_attach_size}

                                                      +

                                                      {$lang->about_allowed_attach_size}

                                                      {$lang->allowed_filetypes}
                                                      - -

                                                      {$lang->about_allowed_filetypes}

                                                      +
                                                      + +

                                                      {$lang->about_allowed_filetypes}

                                                      {$lang->enable_download_group}
                                                      + {$lang->enable_download_group} group_srl, $file_config->download_grant))-->checked="checked"/> diff --git a/modules/file/tpl/header.html b/modules/file/tpl/header.html index 07644531d..b608bc5db 100644 --- a/modules/file/tpl/header.html +++ b/modules/file/tpl/header.html @@ -1,10 +1,8 @@ - -

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

                                                      - -
                                                      -
                                                        -
                                                      • class="on">{$lang->file_list}
                                                      • -
                                                      • class="on">{$lang->cmd_module_config}
                                                      • +

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

                                                        +
                                                        +
                                                        diff --git a/modules/integration_search/tpl/index.html b/modules/integration_search/tpl/index.html index 97092f862..614171a49 100644 --- a/modules/integration_search/tpl/index.html +++ b/modules/integration_search/tpl/index.html @@ -36,7 +36,7 @@ - + {$lang->cmd_insert} {$lang->cmd_delete} diff --git a/modules/member/tpl/modify_info_mobile.html b/modules/member/tpl/modify_info_mobile.html index 45a7012e5..a0871382e 100644 --- a/modules/member/tpl/modify_info_mobile.html +++ b/modules/member/tpl/modify_info_mobile.html @@ -153,7 +153,7 @@ {$lang->cmd_cancel}
                                                      diff --git a/modules/module/lang/lang.xml b/modules/module/lang/lang.xml index b8f17c958..ec15d503b 100644 --- a/modules/module/lang/lang.xml +++ b/modules/module/lang/lang.xml @@ -870,18 +870,6 @@ URL для менеджера модулей - - - - - - - - - - - - @@ -993,4 +981,12 @@ Le module [Administration des Modules] montera tous les modules installés et vo + + + + + + + + diff --git a/modules/module/tpl/module_grant_setup.html b/modules/module/tpl/module_grant_setup.html index 8b794b195..4f7dbcf23 100644 --- a/modules/module/tpl/module_grant_setup.html +++ b/modules/module/tpl/module_grant_setup.html @@ -9,7 +9,7 @@ -

                                                      {$lang->about_grant}

                                                      +

                                                      {$lang->permission_setting}

                                                      {$lang->about_grant_deatil}

                                                      diff --git a/modules/module/tpl/module_grants.html b/modules/module/tpl/module_grants.html index 275faf1e4..870697371 100644 --- a/modules/module/tpl/module_grants.html +++ b/modules/module/tpl/module_grants.html @@ -5,40 +5,35 @@ jQuery( function() { jQuery('.grant_default').change( function(event) { doShowGrantZone(); } ); doShowGrantZone() } ); - + -

                                                      {$lang->about_admin_id}

                                                      -
                                                      -
                                                      - - - - - - - -
                                                      - - {$lang->admin_email_address} - - {$lang->admin_id} +

                                                      {$lang->module_admin}

                                                      +

                                                      {$lang->about_admin_id}

                                                      +
                                                        +
                                                      • +

                                                        + + {$lang->admin_email_address} + + {$lang->admin_id} + +

                                                        +

                                                        +

                                                      - -
                                                      - - - -
                                                      -
                                                      - -

                                                      {$lang->about_grant}

                                                      + +
                                                      + + + +

                                                      + + +

                                                      {$lang->permission_setting}

                                                      {$lang->about_grant_deatil}

                                                      @@ -46,11 +41,11 @@ - - + + - + diff --git a/modules/point/tpl/point_module_config.html b/modules/point/tpl/point_module_config.html index f626d098e..78377ca9d 100644 --- a/modules/point/tpl/point_module_config.html +++ b/modules/point/tpl/point_module_config.html @@ -1,44 +1,44 @@ - +

                                                      {$lang->point}

                                                      {$lang->grant} {$lang->target}
                                                      {$grant_item->title} - + +
                                                      - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + +
                                                      {$lang->point_insert_document} {$module_config['point_name']}
                                                      {$module_config['point_name']}
                                                      {$lang->point_insert_comment} {$module_config['point_name']}
                                                      {$module_config['point_name']}
                                                      {$lang->point_upload_file} {$module_config['point_name']}
                                                      {$module_config['point_name']}
                                                      {$lang->point_download_file} {$module_config['point_name']}
                                                      {$module_config['point_name']}
                                                      {$lang->point_read_document} {$module_config['point_name']}
                                                      {$module_config['point_name']}
                                                      {$lang->point_voted} {$module_config['point_name']}
                                                      {$module_config['point_name']}
                                                      {$lang->point_blamed} {$module_config['point_name']}
                                                      {$module_config['point_name']}
                                                      - +
                                                      diff --git a/modules/rss/lang/lang.xml b/modules/rss/lang/lang.xml index e4af8e598..3038e93bc 100644 --- a/modules/rss/lang/lang.xml +++ b/modules/rss/lang/lang.xml @@ -166,18 +166,11 @@ - - - - - - - - - - - - + + + + + diff --git a/modules/rss/tpl/rss_module_config.html b/modules/rss/tpl/rss_module_config.html index 2013952d1..72dfbe09d 100644 --- a/modules/rss/tpl/rss_module_config.html +++ b/modules/rss/tpl/rss_module_config.html @@ -1,4 +1,4 @@ - + @@ -8,9 +8,9 @@
                                                      - - + - - + - - + - - +
                                                      {$lang->open_rss} - +
                                                      {$lang->open_feed_to_total} - +
                                                      {$lang->description} - -

                                                      {$lang->about_feed_description}

                                                      +
                                                      + +

                                                      {$lang->about_feed_description}

                                                      {$lang->feed_copyright} - -

                                                      {$lang->about_feed_copyright}
                                                      {$lang->about_part_feed_copyright}

                                                      +
                                                      + +

                                                      {$lang->about_feed_copyright}

                                                      diff --git a/modules/trackback/lang/lang.xml b/modules/trackback/lang/lang.xml index e34c3ba79..95b296f6e 100644 --- a/modules/trackback/lang/lang.xml +++ b/modules/trackback/lang/lang.xml @@ -153,8 +153,8 @@ - - + + diff --git a/modules/trackback/tpl/trackback_module_config.html b/modules/trackback/tpl/trackback_module_config.html index aaaabbbe7..530494b64 100644 --- a/modules/trackback/tpl/trackback_module_config.html +++ b/modules/trackback/tpl/trackback_module_config.html @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@
                                                      - - + +
                                                      enable_trackback == "Y")-->checked="checked" />enable_trackback == "Y")-->checked="checked" />
                                                      From 15ddf80ad3c6ba2c97734a3216f718ca9249f11c Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Wed, 19 Oct 2011 05:38:01 +0000 Subject: [PATCH 1202/1372] HTML, CSS, Web Accessibility... git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9676 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/css/xe.css | 4 +- common/css/xe.min.css | 2 +- modules/admin/tpl/css/admin.css | 60 +++++++++++++++------------ modules/admin/tpl/css/admin.min.css | 2 +- modules/autoinstall/tpl/index.html | 28 ++++++------- modules/autoinstall/tpl/list.html | 4 +- modules/menu/tpl/sitemap.html | 4 +- modules/module/tpl/module_grants.html | 4 +- modules/page/lang/lang.xml | 18 ++++---- 9 files changed, 65 insertions(+), 61 deletions(-) diff --git a/common/css/xe.css b/common/css/xe.css index 3533749de..23750d16c 100644 --- a/common/css/xe.css +++ b/common/css/xe.css @@ -1,5 +1,5 @@ @charset "utf-8"; -/* NHN (developers@xpressengine.com) */ +/* Element Reset */ body,table,input,textarea,select,button{font-family:Tahoma,Geneva,sans-serif;font-size:12px} img{border:0} /* Button */ @@ -10,7 +10,7 @@ img{border:0} .btn a, .btn button[type=button]{border-color:#ccc;color:#333 !important;background:#eee -webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#ddd));background:#eee -moz-linear-gradient(top,#fff,#ddd);background-color:#eee;text-shadow:1px 1px 0 #fff;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#ffffff, endColorStr=#dddddd)} .btn input, -.btn button[type=submit]{border-color:#666;background:#333 -webkit-gradient(linear,0% 0%,0% 100%,from(#777),to(#777),color-stop(0.5,#333),color-stop(0.5,#000));background:#333 -moz-linear-gradient(top,#777,#000);background-color:#333;color:#ffc !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#777777, endColorStr=#333333)} +.btn button[type=submit]{border-color:#666;background:#333 -webkit-gradient(linear,0% 0%,0% 100%,from(#777),to(#777),color-stop(0.5,#333),color-stop(0.5,#000)) !important;background:#333 -moz-linear-gradient(top,#777,#000) !important;background-color:#333 !important;color:#ffc !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#777777, endColorStr=#333333)} .btn a{height:22px} .btn.medium *{padding:0 12px;font-size:16px;height:30px;line-height:28px} .btn.medium a{height:28px} diff --git a/common/css/xe.min.css b/common/css/xe.min.css index dfeb7559d..3c044ca21 100644 --- a/common/css/xe.min.css +++ b/common/css/xe.min.css @@ -1 +1 @@ -@charset "utf-8";/* NHN (developers@xpressengine.com) */body,table,input,textarea,select,button{font-family:Tahoma,Geneva,sans-serif;font-size:12px}img{border:0}/* Button */.btn{position:relative;display:inline-block;vertical-align:middle}.btn *{display:inline-block;padding:0 8px;font-size:12px;height:24px;line-height:22px;margin:0;font-weight:bold !important;color:#fff;text-decoration:none !important;border:1px solid;cursor:pointer;overflow:visible;border-radius:3px;box-shadow:inset 0 0 1px #fff;background-color:#666;text-shadow:0 -1px 0 #333;zoom:1}.btn *[type=submit][disabled=disabled],.btn *[type=button][disabled=disabled]{opacity:.5;*filter:alpha(opacity=50)}.btn a, .btn button[type=button]{border-color:#ccc;color:#333 !important;background:#eee -webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#ddd));background:#eee -moz-linear-gradient(top,#fff,#ddd);background-color:#eee;text-shadow:1px 1px 0 #fff;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#ffffff, endColorStr=#dddddd)}.btn input, .btn button[type=submit]{border-color:#666;background:#333 -webkit-gradient(linear,0% 0%,0% 100%,from(#777),to(#777),color-stop(0.5,#333),color-stop(0.5,#000));background:#333 -moz-linear-gradient(top,#777,#000);background-color:#333;color:#ffc !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#777777, endColorStr=#333333)}.btn a{height:22px}.btn.medium *{padding:0 12px;font-size:16px;height:30px;line-height:28px}.btn.medium a{height:28px}.btn.large *{padding:0 18px;font-size:22px;height:36px;line-height:34px}.btn.large a{height:34px}/* Button - Regucy */.button{position:relative;display:inline-block;vertical-align:top}.button *{display:inline-block;padding:0 8px;font-size:12px;height:24px;line-height:22px;margin:0;font-weight:bold !important;color:#fff;text-decoration:none !important;border:1px solid;cursor:pointer;overflow:visible;border-radius:3px;box-shadow:inset 0 0 1px #fff;background-color:#666;text-shadow:0 -1px 0 #333;zoom:1}.button *[type=submit][disabled=disabled],.button *[type=button][disabled=disabled]{opacity:.5;*filter:alpha(opacity=50)}.button span, .button button[type=button]{border-color:#ccc;color:#333 !important;background:#eee -webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#ddd));background:#eee -moz-linear-gradient(top,#fff,#ddd);background-color:#eee;text-shadow:1px 1px 0 #fff;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#ffffff, endColorStr=#dddddd)}.button input, .button button[type=submit]{border-color:#666;background:#333 -webkit-gradient(linear,0% 0%,0% 100%,from(#777),to(#777),color-stop(0.5,#333),color-stop(0.5,#000));background:#333 -moz-linear-gradient(top,#777,#000);background-color:#333;color:#ffc !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#777777, endColorStr=#333333)}.button span{height:22px}/* Button Area */.btnArea{margin:1em 0;text-align:right;zoom:1}.btnArea:after{content:"";display:block;clear:both}.btnArea .etc{float:left}/* Text Button */input[type=submit].text,input[type=button].text, button[type=submit].text,button[type=button].text{border:0;overflow:visible;padding:0;margin:0 4px 0 0;color:#33a !important;background:none;text-decoration:underline;cursor:pointer}/* Popup Menu Area */#popup_menu_area{position:absolute;background:#fff;border:1px solid #e9e9e9;border-radius:5px;padding:10px;line-height:1.3;box-shadow:0 0 6px #666;font-size:12px;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}#popup_menu_area ul{list-style:none;margin:0;padding:0}#popup_menu_area li{margin:0;padding:0}#popup_menu_area a{text-decoration:none;color:#333}#popup_menu_area a:hover,#popup_menu_area a:avtive,#popup_menu_area a:focus{text-decoration:underline}/* Message */.message{border:1px solid #ddd;background:#f8f8f8;margin:1em 0;padding:0 1em;border-radius:5px;line-height:1.4;font-size:12px}body>.message{margin:1em}.message p{margin:1em 0 !important}.message em{font-style:normal;color:#e00}.message.info,.message.error,.message.update{padding-left:55px}.message.info{border-color:#E0E8EC;background:#EDF9FF url(../../common/img/msg.Info.png) no-repeat 1em .5em}.message.error{border-color:#EFDCDC;background:#FFECEC url(../../common/img/msg.error.png) no-repeat 1em .5em}.message.update{border-color:#EAE9DC;background:#FFFDEF url(../../common/img/msg.update.png) no-repeat 1em .5em}/* Waiting for server response */.wfsr{display:none;position:absolute;position:fixed;left:0;top:0;z-index:100; border:1px solid #EAE9DC;background:#FFFDEF url(../../common/img/msg.loading.gif) no-repeat 1em .5em;margin:1em;padding:1em 1em 1em 55px;border-radius:5px;line-height:1.4;font-size:12px;font-weight:bold}/* Waiting for server response - Modal Window */.wfsr_fog{position:absolute;top:0;left:0;width:100%;_height:100%;min-height:100%;z-index:100}.wfsr_fog .bg{position:absolute;position:fixed;background:#000;_background:none;width:100%;height:100%;opacity:.5;z-index:2;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1}.wfsr_fog .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1} \ No newline at end of file +@charset "utf-8";/* Element Reset */body,table,input,textarea,select,button{font-family:Tahoma,Geneva,sans-serif;font-size:12px}img{border:0}/* Button */.btn{position:relative;display:inline-block;vertical-align:middle}.btn *{display:inline-block;padding:0 8px;font-size:12px;height:24px;line-height:22px;margin:0;font-weight:bold !important;color:#fff;text-decoration:none !important;border:1px solid;cursor:pointer;overflow:visible;border-radius:3px;box-shadow:inset 0 0 1px #fff;background-color:#666;text-shadow:0 -1px 0 #333;zoom:1}.btn *[type=submit][disabled=disabled],.btn *[type=button][disabled=disabled]{opacity:.5;*filter:alpha(opacity=50)}.btn a, .btn button[type=button]{border-color:#ccc;color:#333 !important;background:#eee -webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#ddd));background:#eee -moz-linear-gradient(top,#fff,#ddd);background-color:#eee;text-shadow:1px 1px 0 #fff;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#ffffff, endColorStr=#dddddd)}.btn input, .btn button[type=submit]{border-color:#666;background:#333 -webkit-gradient(linear,0% 0%,0% 100%,from(#777),to(#777),color-stop(0.5,#333),color-stop(0.5,#000)) !important;background:#333 -moz-linear-gradient(top,#777,#000) !important;background-color:#333 !important;color:#ffc !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#777777, endColorStr=#333333)}.btn a{height:22px}.btn.medium *{padding:0 12px;font-size:16px;height:30px;line-height:28px}.btn.medium a{height:28px}.btn.large *{padding:0 18px;font-size:22px;height:36px;line-height:34px}.btn.large a{height:34px}/* Button - Regucy */.button{position:relative;display:inline-block;vertical-align:top}.button *{display:inline-block;padding:0 8px;font-size:12px;height:24px;line-height:22px;margin:0;font-weight:bold !important;color:#fff;text-decoration:none !important;border:1px solid;cursor:pointer;overflow:visible;border-radius:3px;box-shadow:inset 0 0 1px #fff;background-color:#666;text-shadow:0 -1px 0 #333;zoom:1}.button *[type=submit][disabled=disabled],.button *[type=button][disabled=disabled]{opacity:.5;*filter:alpha(opacity=50)}.button span, .button button[type=button]{border-color:#ccc;color:#333 !important;background:#eee -webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#ddd));background:#eee -moz-linear-gradient(top,#fff,#ddd);background-color:#eee;text-shadow:1px 1px 0 #fff;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#ffffff, endColorStr=#dddddd)}.button input, .button button[type=submit]{border-color:#666;background:#333 -webkit-gradient(linear,0% 0%,0% 100%,from(#777),to(#777),color-stop(0.5,#333),color-stop(0.5,#000));background:#333 -moz-linear-gradient(top,#777,#000);background-color:#333;color:#ffc !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#777777, endColorStr=#333333)}.button span{height:22px}/* Button Area */.btnArea{margin:1em 0;text-align:right;zoom:1}.btnArea:after{content:"";display:block;clear:both}.btnArea .etc{float:left}/* Text Button */input[type=submit].text,input[type=button].text, button[type=submit].text,button[type=button].text{border:0;overflow:visible;padding:0;margin:0 4px 0 0;color:#33a !important;background:none;text-decoration:underline;cursor:pointer}/* Popup Menu Area */#popup_menu_area{position:absolute;background:#fff;border:1px solid #e9e9e9;border-radius:5px;padding:10px;line-height:1.3;box-shadow:0 0 6px #666;font-size:12px;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}#popup_menu_area ul{list-style:none;margin:0;padding:0}#popup_menu_area li{margin:0;padding:0}#popup_menu_area a{text-decoration:none;color:#333}#popup_menu_area a:hover,#popup_menu_area a:avtive,#popup_menu_area a:focus{text-decoration:underline}/* Message */.message{border:1px solid #ddd;background:#f8f8f8;margin:1em 0;padding:0 1em;border-radius:5px;line-height:1.4;font-size:12px}body>.message{margin:1em}.message p{margin:1em 0 !important}.message em{font-style:normal;color:#e00}.message.info,.message.error,.message.update{padding-left:55px}.message.info{border-color:#E0E8EC;background:#EDF9FF url(../../common/img/msg.Info.png) no-repeat 1em .5em}.message.error{border-color:#EFDCDC;background:#FFECEC url(../../common/img/msg.error.png) no-repeat 1em .5em}.message.update{border-color:#EAE9DC;background:#FFFDEF url(../../common/img/msg.update.png) no-repeat 1em .5em}/* Waiting for server response */.wfsr{display:none;position:absolute;position:fixed;left:0;top:0;z-index:100; border:1px solid #EAE9DC;background:#FFFDEF url(../../common/img/msg.loading.gif) no-repeat 1em .5em;margin:1em;padding:1em 1em 1em 55px;border-radius:5px;line-height:1.4;font-size:12px;font-weight:bold}/* Waiting for server response - Modal Window */.wfsr_fog{position:absolute;top:0;left:0;width:100%;_height:100%;min-height:100%;z-index:100}.wfsr_fog .bg{position:absolute;position:fixed;background:#000;_background:none;width:100%;height:100%;opacity:.5;z-index:2;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1}.wfsr_fog .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1} \ No newline at end of file diff --git a/modules/admin/tpl/css/admin.css b/modules/admin/tpl/css/admin.css index eab62bac2..cff38621b 100644 --- a/modules/admin/tpl/css/admin.css +++ b/modules/admin/tpl/css/admin.css @@ -1,7 +1,5 @@ @charset "utf-8"; -/* NHN (developers@xpressengine.com) */ /* Element Reset */ -body{margin:0} header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{display:block} body>.popup{margin:1em} .x, @@ -21,11 +19,11 @@ body>.popup{margin:1em} .x .h1, .x .h2, .x .h3, -.x .h4{position:relative;border-bottom-style:solid;border-bottom-color:#ccc;zoom:1} -.x .h1{border-bottom-width:4px;font-size:24px} -.x .h2{border-bottom-width:3px;font-size:20px} -.x .h3{border-bottom-width:2px;font-size:16px} -.x .h4{border-bottom-width:1px;font-size:12px} +.x .h4{position:relative;border-bottom-style:solid;zoom:1} +.x .h1{border-bottom-width:4px;font-size:24px;border-bottom-color:#666} +.x .h2{border-bottom-width:3px;font-size:20px;border-bottom-color:#888} +.x .h3{border-bottom-width:2px;font-size:16px;border-bottom-color:#aaa} +.x .h4{border-bottom-width:1px;font-size:12px;border-bottom-color:#ccc} .x .h1 + ul, .x .h2 + ul, .x .h3 + ul, @@ -33,14 +31,14 @@ body>.popup{margin:1em} .x .h1 + .table table, .x .h2 + .table table, .x .h3 + .table table, -.x .h4 + .table table{border-top:0;margin-top:-1em} +.x .h4 + .table table{border-top:0 !important;margin-top:-1em !important} /* Portlet */ .x .portlet{position:relative;border:1px solid #e9e9e9;margin:1em 0;padding:0;background:#fff;zoom:1;overflow:hidden;border-radius:5px} .x .portlet h2, .x .portlet h3{margin:0;padding:.5em 1em;font-size:14px;border:1px solid #fff;border-bottom:1px solid #e9e9e9;background:#f7f7f7;border-radius:5px 5px 0 0} .x .portlet p{margin:1em 1.2em} .x .portlet li{position:relative;padding-right:8em} -.x .portlet .lined{margin:1px;padding:0;list-style:none} +.x .portlet .lined{margin:1px !important;padding:0;list-style:none} .x .portlet .lined li{padding:.5em 8em .5em 1em;border-top:1px solid #eee;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis} .x .portlet .lined li:first-child{border:0} .x .portlet .side{position:absolute;top:0;_top:1px;right:0;color:#666;background:#fff;padding:0 1em} @@ -96,7 +94,12 @@ body>.popup{margin:1em} .x .form input.loading[type=password]{padding-right:24px;width:260px;background:transparent url(../img/preLoader16.gif) no-repeat 265px center} .x .form input[type=checkbox], .x .form input[type=radio]{margin:0;padding:0;width:13px;height:13px;vertical-align:middle} -.x .form *[disabled=disabled]{background:#ddd !important;text-shadow:1px 1px 0 #fff} +.x .form input[type=text][disabled=disabled], +.x .form input[type=password][disabled=disabled], +.x .form input[type=radio][disabled=disabled], +.x .form input[type=checkbox][disabled=disabled], +.x .form select[disabled=disabled], +.x .form textarea[disabled=disabled]{background:#ddd;text-shadow:1px 1px 0 #fff} .x .form textarea{padding:3px 4px;vertical-align:top} .x .form span.desc, .x .form em.desc{line-height:22px;vertical-align:middle;margin:0 10px} @@ -106,7 +109,7 @@ body>.popup{margin:1em} .x .form .tgForm{margin-right:1em} /* Global Navigation Bar */ .x .gnb{position:relative;clear:both;border:1px solid #c1c1c1;border-left:0;border-right:0;background-color:#efefef;background:#efefef -webkit-gradient(linear, 0% 0%, 0% 100%, from(#efefef), to(#dcdcdc));background:#efefef -moz-linear-gradient(top, #efefef, #dcdcdc);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#efefef, endColorStr=#dcdcdc);zoom:1} -.x .gnb ul{margin:0;padding:0 0 0 2em;list-style:none;border:1px solid #fff;border-left:0;border-right:0;zoom:1} +.x .gnb ul{margin:0;padding:0 0 0 20px;list-style:none;border:1px solid #fff;border-left:0;border-right:0;zoom:1} .x .gnb ul ul{position:absolute;top:30px;left:0;border:1px solid #ccc;border-top:0;padding:1px 0 0 0;background:#fff} .x .gnb ul:after{content:"";display:block;clear:both} .x .gnb li{position:relative;float:left;border:1px solid #fff;border-top:0;border-bottom:0;margin:0 -1px 0 0} @@ -148,7 +151,8 @@ body>.popup{margin:1em} .x .gnb li.activeOn>a{background:#ddd} } /* Favorite */ -.x .bmk{position:absolute;right:2em;bottom:10px;padding:0 0 0 20px;background:url(../img/iconFavorite.gif) no-repeat 0 -16px} +.x .bmk{position:absolute;right:20px;bottom:10px;padding:0 0 0 20px;background:url(../img/iconFavorite.gif) no-repeat 0 -16px} +.x .bmk>a{text-shadow:0 1px 0 #fff} .x .bmk ul{position:absolute;top:140%;right:0;list-style:none;margin:0;padding:5px 10px;border:1px solid #aaa;border-radius:5px;background:#fff;box-shadow:1px 1px 3px #aaa} .x .bmk li{position:relative;padding:3px 30px 3px 0;white-space:nowrap} .x .bmk li .action{position:absolute;top:0;right:0} @@ -160,9 +164,9 @@ body>.popup{margin:1em} .x .bmk li{position:relative;top:-1px;border-top:1px dotted #ccc} } /* Local Navigation */ -.x .lnb{position:relative;float:left;width:200px;margin:1em 0 1em -230px;line-height:normal;zoom:1;display:inline} +.x .lnb{position:relative;float:left;width:210px;margin:1em 0 1em -240px;line-height:normal;zoom:1;display:inline} .x .lnb .h2{margin-top:0} -.x .lnb ul{margin:0;padding:0;list-style:none} +.x .lnb ul{margin:0 !important;padding:0;list-style:none} .x .lnb li{position:relative;margin:0 0 -1px 0;vertical-align:top;zoom:1} .x .lnb li a{display:block;position:relative;padding:8px 10px;text-decoration:none;color:#666;font-weight:bold;background:#fafafa;border:1px solid #eee;zoom:1} .x .lnb li a .i{position:absolute;top:50%;left:100%;margin:-4px 0 0 -16px;width:8px;height:8px;color:#ccc;background:url(../img/iconNavVr.gif) no-repeat left top} @@ -252,16 +256,16 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */ /* H2 Anchor */ .x .h2Anchor{position:absolute;right:0;border:0;background:none;color:#00f;text-decoration:underline} /* Skip Navigation */ -.x .skipNav{margin:0;text-align:center;overflow:hidden} -.x .skipNav a{position:absolute;width:1px;height:1px;display:block;color:#fff;font-weight:bold;padding:10px 0;background:#333;border-top:1px solid #656565} +.x .skipNav{margin:0;text-align:center} +.x .skipNav a{position:absolute;width:1px;height:1px;display:block;font-weight:bold;padding:10px 0} .x .skipNav a:hover, .x .skipNav a:active, .x .skipNav a:focus{position:relative;width:auto;height:auto} /* Header */ -.x .header{position:relative;z-index:2;padding:30px 0 0 0;background:#4c4c4c;box-shadow:0 0 10px #aaa;zoom:1} +.x .header{position:relative;z-index:2;padding:30px 0 0 0;background:#4c4c4c;box-shadow:0 0 10px #aaa;zoom:1;border-radius:5px 5px 0 0} .x .header:after{content:"";display:block;clear:both} .x .header a{text-decoration:none} -.x .header h1{margin:0 15px 10px 1.3em;font-size:24px;line-height:32px;display:inline-block;zoom:1} +.x .header h1{margin:0 15px 10px 20px;font-size:24px;line-height:32px;display:inline-block;zoom:1} .x .header h1 *{vertical-align:middle} .x .header h1 a{color:#fff;text-shadow:1px 1px 0 #000;filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=1, OffY=1, Color=#000000, Positive=true);zoom:1} .x .header h1 .url{font-size:12px;font-weight:normal} @@ -272,8 +276,8 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */ .x .header #moveSiteList li{white-space:nowrap;margin:0;padding:4px 0;border-bottom:1px dotted #ccc} .x .header #siteMapList{padding:0 1em 1em 1em;margin:0} .x .header #siteMapList li{white-space:nowrap} -.x .header .account{position:absolute;z-index:3;width:100%;padding:5px 2em 5px 0;top:0;right:0;white-space:nowrap;text-align:right;background:#333;border-bottom:1px solid #656565;color:#fff;font-size:12px;box-shadow:0 0 10px #333} -.x .header .account ul{margin:0 2px 0 0;padding:0;list-style:none} +.x .header .account{position:absolute;z-index:3;width:100%;top:0;right:0;white-space:nowrap;text-align:right;background:#333;border-bottom:1px solid #656565;color:#fff;font-size:12px;border-radius:5px 5px 0 0} +.x .header .account ul{margin:0 2px 0 0;padding:5px 20px 5px 0;list-style:none} .x .header .account li{position:relative;display:inline;border-left:1px solid #666;padding:0 6px 0 10px} .x .header .account li:first-child{border:0} .x .header .account a{color:#fff;display:inline-block;height:14px} @@ -289,13 +293,13 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */ .x .header .account a:active, .x .header .account a:focus{color:#6e9cf2;text-decoration:underline} /* Footer */ -.x .footer{border-top:1px solid #ddd;text-align:center;font-size:12px;padding:1.5em 0;margin:0 2em;zoom:1} +.x .footer{border-top:1px solid #ddd;text-align:center;font-size:12px;padding:1.5em 0;zoom:1} .x .footer:after{content:"";display:block;clear:both} .x .footer p{margin:0} .x .footer .power{float:left} .x .footer .cache{float:right} /* Body */ -.x .body{position:relative;z-index:1;padding:1em 2em 1em 260px;zoom:1} +.x .body{position:relative;z-index:1;padding:1em 20px 1em 260px;zoom:1} .x .body:after{content:"";display:block;clear:both} /* Content */ .x .content{float:right;width:100%;margin-left:-230px;zoom:1} @@ -317,7 +321,7 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */ .x .dashboard .portlet{float:left !important;width:32% !important;margin-right:1em !important} } /* Single Column*/ -.x .single{position:relative;float:none;width:auto;margin-left:-230px} +.x .single{position:relative;float:none;width:auto;margin-left:-240px} /* Search */ .x .search{zoom:1} .x .search:after{content:"";display:block;clear:both} @@ -566,9 +570,10 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */ .x a.iSetting{display:inline-block;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;vertical-align:middle;background:url(../img/iconSetting.gif) no-repeat} .x a.cMenu{display:inline-block;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;vertical-align:middle;background:url(../../../../common/img/icon.bubble.png) no-repeat} /* Responsive Layout */ -@media only all and (max-width:860px){.x .header h1{margin-left:.7em} -.x .header .account{padding-right:1em} -.x .body{padding:1em} +@media only all and (max-width:860px){ +.x .header h1{margin-left:.7em} +.x .header .account ul{padding-right:10px} +.x .body{padding:0} .x .content{float:none;margin-left:0} .x .lnb{float:none;width:auto;margin:1em 0} .x .dashboard .portlet{float:none !important;width:auto !important;margin-right:0} @@ -577,7 +582,8 @@ body.modalContainer{_height:100%;_width:100%} /* IE6 only */ .x .easyNav .category{float:none;display:block;width:auto} .x .easyNav .filter{position:static} } -@media only all and (max-width:640px){.x .skipNav a{position:relative;width:auto;height:auto} +@media only all and (max-width:640px){ +.x .skipNav a{position:relative;width:auto;height:auto} .modal{position:absolute} } /* Legacy Code (Don't use it. It will be removed as soon as possible.) */ diff --git a/modules/admin/tpl/css/admin.min.css b/modules/admin/tpl/css/admin.min.css index 5d93575f5..4d538728f 100644 --- a/modules/admin/tpl/css/admin.min.css +++ b/modules/admin/tpl/css/admin.min.css @@ -1 +1 @@ -@charset "utf-8";/* NHN (developers@xpressengine.com) *//* Element Reset */body{margin:0}header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{display:block}body>.popup{margin:1em}.x,.x table,.x input,.x textarea,.x select,.x button{font-family:Tahoma,Geneva,sans-serif;font-size:12px;color:#333}.x button,.x input[type=submit],.x input[type=reset],.x input[type=button]{cursor:pointer;overflow:visible}.x img{border:0}.x p{line-height:1.5}/* Section & Heading */.x .section{margin:1em 0;padding:0;border:0}.x .h1, .x .h2, .x .h3, .x .h4{position:relative;border-bottom-style:solid;border-bottom-color:#ccc;zoom:1}.x .h1{border-bottom-width:4px;font-size:24px}.x .h2{border-bottom-width:3px;font-size:20px}.x .h3{border-bottom-width:2px;font-size:16px}.x .h4{border-bottom-width:1px;font-size:12px}.x .h1 + ul,.x .h2 + ul,.x .h3 + ul,.x .h4 + ul,.x .h1 + .table table, .x .h2 + .table table, .x .h3 + .table table, .x .h4 + .table table{border-top:0;margin-top:-1em}/* Portlet */.x .portlet{position:relative;border:1px solid #e9e9e9;margin:1em 0;padding:0;background:#fff;zoom:1;overflow:hidden;border-radius:5px}.x .portlet h2, .x .portlet h3{margin:0;padding:.5em 1em;font-size:14px;border:1px solid #fff;border-bottom:1px solid #e9e9e9;background:#f7f7f7;border-radius:5px 5px 0 0}.x .portlet p{margin:1em 1.2em}.x .portlet li{position:relative;padding-right:8em}.x .portlet .lined{margin:1px;padding:0;list-style:none}.x .portlet .lined li{padding:.5em 8em .5em 1em;border-top:1px solid #eee;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis}.x .portlet .lined li:first-child{border:0}.x .portlet .side{position:absolute;top:0;_top:1px;right:0;color:#666;background:#fff;padding:0 1em}.x .portlet .lined .side{padding:.5em 1em}.x .portlet .more{position:absolute;top:.5em;right:1em;text-decoration:none !important;color:#666}.x .portlet .more span{color:#999}.x .portlet .action{text-align:right;top:0;right:0;padding:.5em 1em .5em 3em;background:#fff;background:-webkit-gradient(linear, 0% 0%, 100% 0%, from(rgba(255,255,255,0)), to(rgba(255,255,255,1)), color-stop(15%, #fff));background:-moz-linear-gradient(left, rgba(255,255,255,0) 0, rgba(255,255,255,1) 15%)}.x .portlet .action a,.x .portlet .action button{margin-left:1em}.x .portlet .btnArea{border-top:1px solid #ddd;margin:0;padding:.5em 1em;margin:0 1px 1px 1px;background:#f7f7f7;border-radius:0 0 5px 5px}/* Table */.x .table{margin:1em 0}.x .table table{width:100%;border:0;border-collapse:collapse;border-top:2px solid #ccc}.x .table caption{font-weight:bold;text-align:left;line-height:22px;padding:5px 0}.x .table caption:after{content:"";display:block;clear:both}.x .table caption a{font-weight:normal}.x .table caption em{float:right;margin-left:1em}.x .table caption strong{color:#e00}.x .table caption .side{float:right;font-weight:normal;margin-left:1em}.x .table th,.x .table td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd;white-space:nowrap}.x .table th{background:#f8f8f8}.x .table thead th{border-bottom:1px solid #999}.x .table tfoot td{font-weight:bold;background:#f8f8f8}.x .table.even tbody tr:nth-of-type(even) td{background-color:#fafafa}.x .table td>input[type=text]{margin:-1px 0 !important;vertical-align:middle}.x .table img{vertical-align:middle}.x .table em{font-style:normal;font-weight:normal;color:#e00}.x .table .title,.x .table .text{white-space:normal;width:100%}/* Form */.x .form{margin:1em 0;padding:0}.x .form fieldset{margin:0 0 2em 0;padding:0;border:0}.x .form em{font-style:normal;color:#e00}.x .form label{margin-right:1em;line-height:1;vertical-align:middle}.x .form input[type=checkbox]+label,.x .form input[type=radio]+label,.x .form input[type=file]{cursor:pointer}.x .form ul{position:relative;margin:1em 0;padding:0;list-style:none;border-top:2px solid #ccc;border-bottom:1px solid #ccc;zoom:1}.x .form li{list-style:none;border:1px solid #ddd;border-left:0;border-right:0;margin:-1px 0;padding:8px 0;vertical-align:top;zoom:1}.x .form li:first-child{border-top:0}.x .form li>label:first-child{display:block;font-weight:bold}.x .form li label em{font-weight:normal}.x .form label.overlap{position:absolute;color:#aaa}.x .form input[type=text],.x .form input[type=password],.x .form input[type=file],.x .form textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:transparent}.x .form input[type=text],.x .form input[type=password],.x .form input[type=file]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px}.x .form input[type=text].loading,.x .form input.loading[type=password]{padding-right:24px;width:260px;background:transparent url(../img/preLoader16.gif) no-repeat 265px center}.x .form input[type=checkbox],.x .form input[type=radio]{margin:0;padding:0;width:13px;height:13px;vertical-align:middle}.x .form *[disabled=disabled]{background:#ddd !important;text-shadow:1px 1px 0 #fff}.x .form textarea{padding:3px 4px;vertical-align:top}.x .form span.desc, .x .form em.desc{line-height:22px;vertical-align:middle;margin:0 10px}.x .form p.desc{margin:.25em 0;line-height:1.4}.x .form .q{font-weight:bold;margin:0 0 5px 0}.x .form .a{margin:0 0 5px 0}.x .form .tgForm{margin-right:1em}/* Global Navigation Bar */.x .gnb{position:relative;clear:both;border:1px solid #c1c1c1;border-left:0;border-right:0;background-color:#efefef;background:#efefef -webkit-gradient(linear, 0% 0%, 0% 100%, from(#efefef), to(#dcdcdc));background:#efefef -moz-linear-gradient(top, #efefef, #dcdcdc);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#efefef, endColorStr=#dcdcdc);zoom:1}.x .gnb ul{margin:0;padding:0 0 0 2em;list-style:none;border:1px solid #fff;border-left:0;border-right:0;zoom:1}.x .gnb ul ul{position:absolute;top:30px;left:0;border:1px solid #ccc;border-top:0;padding:1px 0 0 0;background:#fff}.x .gnb ul:after{content:"";display:block;clear:both}.x .gnb li{position:relative;float:left;border:1px solid #fff;border-top:0;border-bottom:0;margin:0 -1px 0 0}.x .gnb li li{float:none;clear:both;overflow:hidden;border:0;border-top:1px dotted #ccc;margin:0;padding:2px}.x .gnb li li:first-child{border:0}.x .gnb li a{float:left;font-weight:bold;color:#333;font-size:12px;padding:8px 18px;white-space:nowrap;text-decoration:none;text-shadow:0 1px 0 #fff;zoom:1}.x .gnb li a:hover,.x .gnb li a:active,.x .gnb li a:focus,.x .gnb li.active a{background:#f4f4f4;border:1px solid #ccc;border-bottom:0;padding:7px 17px 8px 17px}.x .gnb li.activeOn a{background:#fff;border:1px solid #ccc;border-bottom:0;padding:7px 17px 8px 17px}.x .gnb li.active li a{display:block;float:none;color:#555;background:#fff;padding:5px 15px !important;font-weight:normal !important;border:0 !important}.x .gnb li.active li a:hover,.x .gnb li.active li a:active,.x .gnb li.active li a:focus{border:0;background:#eee}.x .gnb .setting{position:absolute;top:8px;right:2em;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;background:url(../img/iconSetting.gif) no-repeat center}.x .gnb.jx ul{display:block;position:static;padding:0}.x .gnb.jx li{float:none;clear:both;border-top:1px solid #ccc}.x .gnb.jx ul ul{border:0}.x .gnb.jx li li{border:0}.x .gnb.jx li a{float:none;display:block}.x .gnb.jx li a:hover,.x .gnb.jx li a:active,.x .gnb.jx li a:focus{background:none}.x .gnb.jx li.activeOn>a{background:#ddd}@media only all and (max-width:860px){.x .gnb ul{padding-left:1em}.x .gnb .setting{right:1em}}@media only all and (max-width:640px){.x .gnb ul{display:block;position:static;padding:0}.x .gnb li{float:none;clear:both;border-top:1px solid #ccc}.x .gnb ul ul{border:0;position:static}.x .gnb li li{border:0}.x .gnb li a{float:none;display:block}.x .gnb li a:hover,.x .gnb li a:active,.x .gnb li a:focus{background:none}.x .gnb li.activeOn>a{background:#ddd}}/* Favorite */.x .bmk{position:absolute;right:2em;bottom:10px;padding:0 0 0 20px;background:url(../img/iconFavorite.gif) no-repeat 0 -16px}.x .bmk ul{position:absolute;top:140%;right:0;list-style:none;margin:0;padding:5px 10px;border:1px solid #aaa;border-radius:5px;background:#fff;box-shadow:1px 1px 3px #aaa}.x .bmk li{position:relative;padding:3px 30px 3px 0;white-space:nowrap}.x .bmk li .action{position:absolute;top:0;right:0}.x .bmk li .action .text{text-decoration:none;width:16px;text-align:center;margin:0}@media only all and (max-width:640px){.x .bmk{position:static;background-color:#fff;padding:10px 20px;background:#fff}.x .bmk .tgAnchor{display:block}.x .bmk ul{position:relative;border:0;border-top:1px solid #ccc;border-radius:0;box-shadow:none;padding:0;margin:5px 0 0 0}.x .bmk li{position:relative;top:-1px;border-top:1px dotted #ccc}}/* Local Navigation */.x .lnb{position:relative;float:left;width:200px;margin:1em 0 1em -230px;line-height:normal;zoom:1;display:inline}.x .lnb .h2{margin-top:0}.x .lnb ul{margin:0;padding:0;list-style:none}.x .lnb li{position:relative;margin:0 0 -1px 0;vertical-align:top;zoom:1}.x .lnb li a{display:block;position:relative;padding:8px 10px;text-decoration:none;color:#666;font-weight:bold;background:#fafafa;border:1px solid #eee;zoom:1}.x .lnb li a .i{position:absolute;top:50%;left:100%;margin:-4px 0 0 -16px;width:8px;height:8px;color:#ccc;background:url(../img/iconNavVr.gif) no-repeat left top}.x .lnb li ul{padding:5px 0;background:#fff}.x .lnb li li{margin:0;border-top:1px dotted #ddd}.x .lnb li li:first-child{border:0}.x .lnb li li a{font-weight:normal;background:#fff;padding:5px 10px;border:0}.x .lnb li li a span{color:#666}.x .lnb li.active{border:1px solid #ccc;z-index:2}.x .lnb li li.active{border:0}.x .lnb li.active a{color:#000;border:0}.x .lnb li.active .i{background-position:0 -44px}.x .lnb li.active li a{border:0}.x .lnb li.active ul{display:block;border-top:1px solid #eee}.x .lnb li.active li.active a span{color:#13b200;font-weight:bold;letter-spacing:-1px}/* Content Navigation */.x .cnb{margin:1em 0;position:relative;zoom:1}.x .cnb:after{content:"";display:block;clear:both}.x .cnb ul{list-style:none;margin:0;padding:0}.x .cnb li{display:inline}.x .cnb li:before{content:"| ";color:#ccc}.x .cnb li:first-child:before{content:""}.x .cnb .active,.x .cnb .active a{font-weight:bold;color:#333;text-decoration:none}.x .cnb .side{float:right}/* Pagination */.x .pagination{margin:1em 0;text-align:center;line-height:normal}.x .pagination *{vertical-align:middle}.x .pagination a,.x .pagination strong{position:relative;display:inline-block;padding:2px 4px;font-weight:bold;text-decoration:none;line-height:normal;color:#333 !important;vertical-align:middle}.x .pagination a:hover,.x .pagination a:active,.x .pagination a:focus{border:1px solid #ddd;margin:0 -1px}.x .pagination strong{color:#e00 !important;font-size:20px}.x .pagination .direction{font-weight:normal;white-space:nowrap}.x .pagination .direction:hover,.x .pagination .direction:active,.x .pagination .direction:focus{border:0;margin:0;text-decoration:underline}.x .pagination input{width:30px;text-align:center}.x .pagination button{overflow:visible}/* Star Rating */.x .starRating, .x .starRating span{display:inline-block;height:14px;background:transparent url(../img/iconStarRating.gif) no-repeat;overflow:hidden}.x .starRating{width:79px;vertical-align:top}.x .starRating span{font-size:0;line-height:0;vertical-align:top;text-indent:-100px;*text-indent:0;background-position:0 -14px}/* Progress */.x .prgrs{white-space:nowrap;line-height:normal;vertical-align:middle}.x .prgrs *{vertical-align:middle}.x .prgrs .pBar{position:relative;display:inline-block;background:#e9e9e9;margin:0 5px 0 0}.x .prgrs .pAction{display:inline-block;vertical-align:top;background:#99a6b6}.x .prgrs .pNum{position:absolute;width:100%;left:0;top:0;text-align:center;text-shadow:1px 1px 0 #fff}.x .prgrs.prgrsSmall{font-size:14px;line-height:14px}.x .prgrs.prgrsSmall .pBar,.x .prgrs.prgrsSmall .pAction,.x .prgrs.prgrsSmall .pNum{height:16px;line-height:16px;font-size:11px}.x .prgrs.prgrsMedium{font-size:24px;line-height:24px}.x .prgrs.prgrsMedium .pBar,.x .prgrs.prgrsMedium .pAction,.x .prgrs.prgrsMedium .pNum{height:22px;line-height:22px;font-size:12px}.x .prgrs.prgrsLarge{font-size:38px;line-height:38px}.x .prgrs.prgrsLarge .pBar,.x .prgrs.prgrsLarge .pAction,.x .prgrs.prgrsLarge .pNum{height:34px;line-height:34px;font-size:14px}/* Modal Window */.modal{position:absolute;top:0;left:0;width:100%;_height:100%;min-height:100%;z-index:100}.modal .bg{position:absolute;background:#000;_background:none;width:100%;height:100%;opacity:.5;z-index:2;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1}.modal .fg{position:relative;width:80%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:3;zoom:1;border-radius:5px;box-shadow:0 0 6px #000}.modal ul, .modal ol, .modal .lined, .modal .table{margin-bottom:1em}.modal .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1}.modalClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px}.modalBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}html.modalContainer,body.modalContainer{_height:100%;_width:100%} /* IE6 only */ /* Layer */.x .layer,.x.layer{position:absolute;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:2;zoom:1;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;box-shadow:0 0 6px #666;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x .layer h2{font-size:14px}.x .layer ul, .x .layer ol, .x .layer .lined, .x .layer .table{margin-bottom:1em}.x .layerClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px}.x .layerBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}/* H2 Anchor */.x .h2Anchor{position:absolute;right:0;border:0;background:none;color:#00f;text-decoration:underline}/* Skip Navigation */.x .skipNav{margin:0;text-align:center;overflow:hidden}.x .skipNav a{position:absolute;width:1px;height:1px;display:block;color:#fff;font-weight:bold;padding:10px 0;background:#333;border-top:1px solid #656565}.x .skipNav a:hover,.x .skipNav a:active,.x .skipNav a:focus{position:relative;width:auto;height:auto}/* Header */.x .header{position:relative;z-index:2;padding:30px 0 0 0;background:#4c4c4c;box-shadow:0 0 10px #aaa;zoom:1}.x .header:after{content:"";display:block;clear:both}.x .header a{text-decoration:none}.x .header h1{margin:0 15px 10px 1.3em;font-size:24px;line-height:32px;display:inline-block;zoom:1}.x .header h1 *{vertical-align:middle}.x .header h1 a{color:#fff;text-shadow:1px 1px 0 #000;filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=1, OffY=1, Color=#000000, Positive=true);zoom:1}.x .header h1 .url{font-size:12px;font-weight:normal}.x .header .site{margin:0;display:inline-block;zoom:1}.x .header .site a{color:#fff;text-decoration:underline}.x .header #moveSiteList{padding:10px 1em 5px 1em;margin:0}.x .header #moveSiteList ul{list-style:none;margin:0;padding:0}.x .header #moveSiteList li{white-space:nowrap;margin:0;padding:4px 0;border-bottom:1px dotted #ccc}.x .header #siteMapList{padding:0 1em 1em 1em;margin:0}.x .header #siteMapList li{white-space:nowrap}.x .header .account{position:absolute;z-index:3;width:100%;padding:5px 2em 5px 0;top:0;right:0;white-space:nowrap;text-align:right;background:#333;border-bottom:1px solid #656565;color:#fff;font-size:12px;box-shadow:0 0 10px #333}.x .header .account ul{margin:0 2px 0 0;padding:0;list-style:none}.x .header .account li{position:relative;display:inline;border-left:1px solid #666;padding:0 6px 0 10px}.x .header .account li:first-child{border:0}.x .header .account a{color:#fff;display:inline-block;height:14px}.x .header .account a.language{padding-right:16px;background:url(../img/iconArrow.gif) no-repeat right -160px}.x .header #language{position:absolute;top:19px;right:-2em;padding:6px 4px !important;border:1px solid #666;border-top:0;background:#333}.x .header #language li{border:0;display:block;padding:1px 8px 1px 10px;text-align:left;line-height:1}.x .header #language li.selected{background:url(../img/iconCheck.gif) no-repeat left center}.x .header #language li.selected a{text-decoration:underline}.x .header h1 a:hover,.x .header h1 a:active,.x .header h1 a:focus,.x .header .account a:hover,.x .header .account a:active,.x .header .account a:focus{color:#6e9cf2;text-decoration:underline}/* Footer */.x .footer{border-top:1px solid #ddd;text-align:center;font-size:12px;padding:1.5em 0;margin:0 2em;zoom:1}.x .footer:after{content:"";display:block;clear:both}.x .footer p{margin:0}.x .footer .power{float:left}.x .footer .cache{float:right}/* Body */.x .body{position:relative;z-index:1;padding:1em 2em 1em 260px;zoom:1}.x .body:after{content:"";display:block;clear:both}/* Content */.x .content{float:right;width:100%;margin-left:-230px;zoom:1}.x .content:after{content:"";display:block;clear:both}.x .content a{color:#33a}.x .content a:hover,.x .content a:active,.x .content a:focus{color:#a33}.x .content .portlet a{text-decoration:none}.x .content .portlet a:hover,.x .content .portlet a:active,.x .content .portlet a:focus{text-decoration:underline}/* Dashboard */.x .dashboard{position:relative;float:none;width:auto;margin-left:-230px}.x .dashboard .portlet{float:left;width:48%;margin-right:1em}.x .dashboard .portlet:nth-of-type(odd){float:left;width:49%;margin-right:0}.x .dashboard .portlet:nth-of-type(even){float:right;width:49%;margin-right:0}@media only all and (min-width:1300px){.x .dashboard .portlet{float:left !important;width:32% !important;margin-right:1em !important}}/* Single Column*/.x .single{position:relative;float:none;width:auto;margin-left:-230px}/* Search */.x .search{zoom:1}.x .search:after{content:"";display:block;clear:both}.x .search .pagination{float:left;text-align:left}.x .search form{float:right;margin:1em 0}.x .search form *{vertical-align:middle}/* Site Map */.x .siteMap h2 input{font-size:14px;font-weight:bold;padding:0 .5em}.x .siteMap label{cursor:text}.x .siteMap .lined ul{padding:0;margin:0;border-top:1px solid #eee;zoom:1}.x .siteMap .lined li{position:relative;padding:0;margin:0;cursor:all-scroll;list-style:none;zoom:1}.x .siteMap .lined li li{border-top:1px solid #eee}.x .siteMap li li{text-indent:18px}.x .siteMap li li li{text-indent:36px}.x .siteMap li li li li{text-indent:54px}.x .siteMap li li li li li{text-indent:72px}.x .siteMap li li li li li li{text-indent:90px}.x .siteMap li li li li li li li{text-indent:108px}.x .siteMap li li li li li li li li{text-indent:126px}.x .siteMap li li li li li li li li li{text-indent:144px}.x .siteMap li li li li li li li li li li{text-indent:162px}.x .siteMap li li li li li li li li li li li{text-indent:180px}.x .siteMap li li li li li li li li li li li li{text-indent:198px}.x .siteMap li *{vertical-align:middle}.x .siteMap li .moveTo+input{width:200px;border:0;padding:0 .5em}.x .siteMap li .moveTo+input:hover,.x .siteMap li .moveTo+input:active,.x .siteMap li .moveTo+input:focus{border:1px dotted #ccc;overflow:visible}.x .siteMap .moveTo{position:relative;z-index:2;width:22px;height:32px;padding:32px 0 0 0;margin:0 3px;_margin-top:-1px;overflow:hidden;background:#fff url(../img/iconMoveTo.gif) no-repeat center 0;border:0;cursor:move}.x .siteMap li.active,.x .siteMap li.active .moveTo{background-color:#f7f7f7}.x .siteMap li.active li,.x .siteMap li.active ul{border-top-color:#f7f7f7}.x .siteMap li.active .moveTo{background-position:center -32px}.x .siteMap .vr,.x .siteMap .hr{display:none;position:absolute;z-index:1;left:14px;border:0px solid #ccc;overflow:hidden}.x .siteMap .vr{top:-16px;height:100%;border-left-width:1px}.x .siteMap .hr{top:16px;width:16px;border-top-width:1px}.x .siteMap li.active .vr,.x .siteMap li.active li .hr{display:block}.x .siteMap li li .vr,.x .siteMap li li li .hr{left:32px}.x .siteMap li li li .vr,.x .siteMap li li li li .hr{left:50px}.x .siteMap li li li li .vr,.x .siteMap li li li li li .hr{left:68px}.x .siteMap li li li li li .vr,.x .siteMap li li li li li li .hr{left:86px}.x .siteMap li li li li li li .vr,.x .siteMap li li li li li li li .hr{left:104px}.x .siteMap li li li li li li li .vr,.x .siteMap li li li li li li li li .hr{left:122px}.x .siteMap li li li li li li li li .vr,.x .siteMap li li li li li li li li li .hr{left:140px}.x .siteMap li li li li li li li li li .vr,.x .siteMap li li li li li li li li li li .hr{left:158px}.x .siteMap li li li li li li li li li li .vr,.x .siteMap li li li li li li li li li li li .hr{left:176px}.x .siteMap li li li li li li li li li li li .vr,.x .siteMap li li li li li li li li li li li li .hr{left:336px}.x .siteMap .side{padding-top:0 !important;padding-bottom:0 !important;line-height:30px;background:transparent !important}.x .siteMap .side button{text-indent:0;line-height:1}.x .siteMap .tgMap{position:absolute;top:12px;right:1em;padding:0 16px 0 0;line-height:16px;background:url(../img/iconArrow.gif) no-repeat right -126px}.x .siteMap.fold .tgMap{background-position:right -158px}.x .siteMap.fold .h2{border-bottom-color:#fff;border-radius:5px}.x .siteMap .placeholder{background:#bbb}.x .siteMap .draggable,.x .siteMap .draggable .moveTo{background-color:#ddd}.x .siteMap .draggable .summary{border-left:1px solid #ccc;padding-left:10px;margin-left:10px;font-size:11px;color:#999}.x .siteMap a.ms{text-decoration:underline}/* Multilingual */.x .langEdit{background:#fff;position:absolute;*left:0;*margin-top:28px;z-index:10}.x .langEdit ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0}.x .langEdit li{padding:.5em 10px}.x .langEdit input[type=text]{width:220px;padding-right:40px}.x .langEdit label{left:15px !important}.x .langEdit .action{border:1px solid #eee;width:268px;padding:0 10px}.x .langEdit p, .x .langEdit .btnArea{white-space:normal}.x .langEdit .langList,.x .langEdit .langEditControls{box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x .langEdit .langList{margin:0 -1px 0 0;display:none}.x .langEdit .langList li{white-space:nowrap;color:#ccc;width:270px} .x .langEdit .langList li span{display:inline-block;width:80px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:#767676}.x .langEdit .langList li a{display:inline-block;width:80px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.x .langEdit .langList li.active{background:url(../img/iconArrow.gif) no-repeat right -188px}.x .langEdit.showChild .langList{display:block}.x .langEdit .langInput{background:#fff}.x .langEdit .langInput h2{padding:5px 10px;margin:0 0 -1px 0;font-size:12px;font-weight:normal;color:#666;border:1px solid #eee;border-top-color:#ccc}.x .langEdit .langInput h2 strong{color:#000;font-size:14px}.x .langEdit.showChild .langInput{position:absolute;left:285px;top:0}.x .langEdit li.en input, .x .langEdit li.en textarea, .x .mLangEdit li.en textarea{background:url(../img/flag.us.gif) no-repeat 99% 5px}.x .langEdit li.ko input, .x .langEdit li.ko textarea, .x .mLangEdit li.ko textarea{background:url(../img/flag.kr.gif) no-repeat 99% 5px}.x .langEdit li.jp input, .x .langEdit li.jp textarea, .x .mLangEdit li.jp textarea{background:url(../img/flag.jp.gif) no-repeat 99% 5px}.x .langEdit li.fr input, .x .langEdit li.fr textarea, .x .mLangEdit li.fr textarea{background:url(../img/flag.fr.gif) no-repeat 99% 5px}.x .langEdit li.de input, .x .langEdit li.de textarea, .x .mLangEdit li.de textarea{background:url(../img/flag.de.gif) no-repeat 99% 5px}.x .langEdit li.ru input, .x .langEdit li.ru textarea, .x .mLangEdit li.ru textarea{background:url(../img/flag.ru.gif) no-repeat 99% 5px}.x .langEdit li.es input, .x .langEdit li.es textarea, .x .mLangEdit li.es textarea{background:url(../img/flag.es.gif) no-repeat 99% 5px}.x .langEdit li.tr input, .x .langEdit li.tr textarea, .x .mLangEdit li.tr textarea{background:url(../img/flag.tr.gif) no-repeat 99% 5px}.x .langEdit li.vi input, .x .langEdit li.vi textarea, .x .mLangEdit li.vi textarea{background:url(../img/flag.vn.gif) no-repeat 99% 5px}.x .langEdit li.mn input, .x .langEdit li.mn textarea, .x .mLangEdit li.mn textarea{background:url(../img/flag.mn.gif) no-repeat 99% 5px}.x .langEdit li.zh-CN input, .x .langEdit li.zh-CN textarea, .x .mLangEdit li.zh-CN textarea{background:url(../img/flag.cn.gif) no-repeat 99% 5px}.x .langEdit li.zh-TW input, .x .langEdit li.zh-TW textarea, .x .mLangEdit li.zh-TW textarea{background:url(../img/flag.tw.gif) no-repeat 99% 5px}.x .mLangEdit.en strong{background:url(../img/flag.us.gif) no-repeat 0 10px}.x .mLangEdit.ko strong{background:url(../img/flag.kr.gif) no-repeat 0 10px}.x .mLangEdit.jp strong{background:url(../img/flag.jp.gif) no-repeat 0 10px}.x .mLangEdit.fr strong{background:url(../img/flag.fr.gif) no-repeat 0 10px}.x .mLangEdit.de strong{background:url(../img/flag.de.gif) no-repeat 0 10px}.x .mLangEdit.ru strong{background:url(../img/flag.ru.gif) no-repeat 0 10px}.x .mLangEdit.es strong{background:url(../img/flag.es.gif) no-repeat 0 10px}.x .mLangEdit.tr strong{background:url(../img/flag.tr.gif) no-repeat 0 10px}.x .mLangEdit.vi strong{background:url(../img/flag.vn.gif) no-repeat 0 10px}.x .mLangEdit.mn strong{background:url(../img/flag.mn.gif) no-repeat 0 10px}.x .mLangEdit.zh-CN strong{background:url(../img/flag.cn.gif) no-repeat 0 10px}.x .mLangEdit.zh-TW strong{background:url(../img/flag.tw.gif) no-repeat 0 10px}.x .mLangEdit ul ul{border:0}.x .mLangEdit li{position:relative;padding:0}.x .mLangEdit li strong{display:inline-block;padding:6px 100px 8px 24px;font-weight:normal;line-height:1.5}.x .mLangEdit li .side{position:absolute;top:8px;right:0;padding-right:18px;background:url(../img/iconArrow.gif) no-repeat right -160px}.x .mLangEdit li li{border:0;padding-right:36px}.x .mLangEdit li textarea{width:100%;height:16px;padding-right:30px;resize:vertical;line-height:1.4}.x .mLangEdit li label{top:8px !important}.x .mLangEdit li.active{background:#FFFDEF}.x .mLangEdit li.active strong{font-weight:bold}.x .mLangEdit li.active .side{background-position:right -128px}.modal .mLangEdit ul{padding-bottom:1em}.modal .mLangEdit li{border:0;padding-right:36px}/* Suggestion */.x .suggestion{display:none;position:absolute;background:#fff;z-index:10;_height:200px;max-height:200px;overflow:auto;*left:0;*margin-top:28px;box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x .suggestion ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0}.x .suggestion li{padding:0}.x .suggestion li:last-child{border-bottom:0}.x .suggestion li button{border:0;background:#fff;text-align:left;width:288px;padding:2px 4px;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.x .suggestion li button:hover,.x .suggestion li button:active,.x .suggestion li button:focus,.x .suggestion li button.active{background:#eee}/* Image Mark */.x #imageMark{right:0}/* Easy Installer */.x .easyNav{position:relative;border:1px solid #e9e9e9;zoom:1}.x .easyNav:after{content:"";display:block;clear:both}.x .easyNav h2{font-size:16px}.x .easyNav .category{width:30%;float:left;margin:0 2em;display:inline}.x .easyNav .filter{position:absolute;top:0;right:0;margin:1em 2em;text-align:right}.x .easyList td p{margin-top:0}.x .easyList td p.update{background:#ffc;padding:.5em 1em;border:1px solid #fc9;border-left:0;border-right:0;text-align:center}/* Font Preview */.x .fontPreview{width:96%;border:1px solid #e9e9e9;zoom:1;padding:1em 2em;margin:.5em 0}/* FTP Suggestion */.x #ftpSuggestion{background:#fff;box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x #ftpSuggestion ul{border-left:1px solid #eee;border-right:1px solid #eee}.x #ftpSuggestion li{padding:0}.x #ftpSuggestion li button{border:0;background:#fff;text-align:left;width:288px}.x #ftpSuggestion li button:hover,.x #ftpSuggestion li button:active,.x #ftpSuggestion li button:focus{background:#eee}/* Theme & Skin Preview */.x .thumbPreview li{position:relative;padding-left:10px;padding-right:10px}.x .thumbPreview li.active.highlight{background:#f9f9f9}.x .thumbPreview .prevToggle{position:absolute;top:8px;right:10px;line-height:16px;padding:0 18px 0 0;text-decoration:none;background:url(../img/iconArrow.gif) no-repeat right -32px}.x .thumbPreview li.active .prevToggle{background-position:right 0}.x .thumbPreview .a{border:0;margin:0;zoom:1}.x .thumbPreview .a:after{content:"";display:block;clear:both}.x .thumbPreview .i{float:left;vertical-align:top;margin:0 1em 1em 0;padding:0;border:0;zoom:1}.x .thumbPreview .i:after{content:"";display:block;clear:both}.x .thumbPreview .i .thumb{position:relative;width:124px;height:84px;padding:0;margin-bottom:3px;text-align:center;overflow:hidden;border:1px solid #ddd;display:block;cursor:pointer;background:#fff}.x .thumbPreview .i .thumb .frame{position:absolute;width:120px;height:80px;left:0;top:0;border:2px solid #fff;overflow:hidden}.x .thumbPreview .i .thumb img{width:120px;margin:0}.x .thumbPreview .i label{display:block;position:relative;top:0;left:2px;width:122px;height:1.1em;margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x .thumbPreview .i input{display:none}.x .thumbPreview .i ul{display:none}.x .thumbPreview .selected .i{display:block;float:none}.x .thumbPreview .selected .i .thumb{float:left;width:186px;height:126px;margin:0 1em 0 0;border:2px solid #eee}.x .thumbPreview .selected .i .thumb .frame{width:180px;height:120px;border-width:3px}.x .thumbPreview li.active.highlight .selected .i .thumb{border-color:#5ea8f6}.x .thumbPreview .selected .i .thumb img{width:180px;position:relative}.x .thumbPreview li.active .selected .i .thumb img{z-index:auto}.x .thumbPreview .selected .i label{cursor:text}.x .thumbPreview .selected .i ul{display:block;list-style:none;border:0;margin:1em 0 1em 200px}.x .thumbPreview .selected .i li{border:0;padding:0;margin:0 0 .2em 0}.x .thumbPreview.jx .i label{display:inline;width:auto}.x .thumbPreview.jx .i.noDirection{display:none}.x .thumbPreview.jx .i input{display:inline}.x #skin .showAll{float:right;border:0;overflow:visible;padding:0 18px 0 0;cursor:pointer;color:#00f;background:url(../img/iconArrow.gif) no-repeat right -32px}.x #skin .showAll.hideAll{background-position:right 0}/* Favorite On | Off */.x .fvOff,.x .fvOn{display:inline-block;width:16px;height:16px;overflow:hidden;text-indent:16px;background:url(../img/iconFavorite.gif) no-repeat}.x .fvOn{background-position:0 -16px}/* Up-Down Dragable */.x .uDrag .wrap{position:relative;padding-left:20px}.x .uDrag li>.wrap{margin:0 0 0 8px}.x .uDrag .dragActive{background:#FFD}.x .uDrag .dragActive th,.x .uDrag .dragActive td{background:none !important}.x .uDrag .dragBtn{position:absolute;width:8px;height:100%;padding:0;overflow:hidden;background:url(../img/bgDragable.gif);top:1px;left:0;text-indent:12px;border:0;cursor:n-resize;white-space:nowrap}/* Favicon Preview */.x .faviconPreview{position:relative;padding:60px 0 0 200px;background:url(../img/bgFavicon.gif) no-repeat}.x .faviconPreview img{position:absolute}.x .faviconPreview .fn1{top:30px;left:12px}.x .faviconPreview .fn2{top:55px;left:68px}/* Mobile Icon Preview */.x .mobiconPreview{position:relative;padding:252px 0 0 200px;background:url(../img/bgMobileTop.png) no-repeat}.x .mobiconPreview img{position:absolute;top:20px;left:10px}.x .mobiconPreview span{position:absolute;width:32px;text-align:center;top:52px;left:10px;color:#fff;font-size:9px}/* Text List */.x .textList{border:1px solid #ddd !important;line-height:1.5em;height:18.5em;overflow:auto}.x .textList li{border:0;padding:.25em 1em;height:1.5em;white-space:nowrap;overflow:hidden}.x .textList li:nth-child(even){background:#eee}.x .textList li a{float:right}/* File Box */.x .fileBox li{position:relative}.x .fileBox li img{max-width:100%}.x .fileBox .portlet ul{margin:1em;list-style:none;padding:0;border:0}.x .fileBox .portlet li{border-top:1px solid #ddd;border-bottom:0;padding:8px 0}.x .fileBox .side{position:absolute;top:8px;right:0}/* Messages */.x .desc.error{color:#f00}.x .desc.success{color:#080}/* Icon Button */.x a.iSetting{display:inline-block;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;vertical-align:middle;background:url(../img/iconSetting.gif) no-repeat}.x a.cMenu{display:inline-block;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;vertical-align:middle;background:url(../../../../common/img/icon.bubble.png) no-repeat}/* Responsive Layout */@media only all and (max-width:860px){.x .header h1{margin-left:.7em}.x .header .account{padding-right:1em}.x .body{padding:1em}.x .content{float:none;margin-left:0}.x .lnb{float:none;width:auto;margin:1em 0}.x .dashboard .portlet{float:none !important;width:auto !important;margin-right:0}.modal .fg,.wfsr .fg{width:auto}.x .easyNav .category{float:none;display:block;width:auto}.x .easyNav .filter{position:static}}@media only all and (max-width:640px){.x .skipNav a{position:relative;width:auto;height:auto}.modal{position:absolute}}/* Legacy Code (Don't use it. It will be removed as soon as possible.) */.x h3.xeAdmin,.x h4.xeAdmin{position:relative;border-bottom-style:solid;border-bottom-color:#ccc;zoom:1}.x h3.xeAdmin{border-bottom-width:4px;font-size:24px}.x h4.xeAdmin{border-bottom-width:3px;font-size:20px}.x h5.xeAdmin{border-bottom-width:2px;font-size:16px}.x h6.xeAdmin{border-bottom-width:1px;font-size:12px}.x .adminSearch{margin:1em 0}.x .adminSearch fieldset{border:1px solid #ccc;margin:0;padding:.5em 1em}.x .localNavigation{padding:0;list-style:none}.x .localNavigation li{display:inline}.x .localNavigation li.on a{font-weight:bold;color:#333;text-decoration:none}.x .localNavigation li:before{content:"| "}.x .localNavigation li:first-child:before{content:""}.x .summary{margin:1em 0}.x .rowTable,.x .colTable,.x .crossTable{margin:1em 0;border:0;border-collapse:collapse;border-top:2px solid #ccc;width:100%}.x .rowTable caption,.x .colTable caption,.x .crossTable caption{font-weight:bold;text-align:left;line-height:22px;padding:5px 0}.x .rowTable caption:after,.x .colTable caption:after,.x .crossTable caption:after{content:"";display:block;clear:both}.x .rowTable caption a,.x .colTable caption a,.x .crossTable caption a{font-weight:normal}.x .rowTable caption em,.x .colTable caption em,.x .crossTable caption em{float:right;font-style:normal;font-weight:normal;color:#e00;margin-left:1em}.x .rowTable caption strong,.x .colTable caption strong,.x .crossTable caption strong{color:#e00}.x .rowTable caption .side,.x .colTable caption .side,.x .crossTable caption .side{float:right;font-weight:normal;margin-left:1em}.x .rowTable th,.rowTable td,.x .colTable th,.rowTable td,.x .crossTable th,.rowTable td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd;white-space:nowrap}.x .rowTable th,.x .colTable th,.x .crossTable th{background:#f8f8f8}.x .rowTable thead th,.x .colTable thead th,.x .crossTable thead th{border-bottom:1px solid #999}.x .rowTable tfoot td,.x .colTable tfoot td,.x .crossTable tfoot td{font-weight:bold;background:#f8f8f8}.x .rowTable.even tbody tr:nth-of-type(even) td,.x .colTable.even tbody tr:nth-of-type(even) td,.x .crossTable.even tbody tr:nth-of-type(even) td{background-color:#fafafa}.x .rowTable td>input[type=text],.x .colTable td>input[type=text],.x .crossTable td>input[type=text]{margin:-1px 0 -3px 0 !important;vertical-align:middle}.x .rowTable img,.x .colTable img,.x .crossTable img{vertical-align:middle}.x .rowTable .title,.x .colTable .title,.x .crossTable .title,.x .rowTable .text,.x .colTable .text,.x .crossTable .text{white-space:normal}.x .rowTable input[type=text],.x .colTable input[type=text],.x .crossTable input[type=text],.x .rowTable input[type=password],.x .colTable input[type=password],.x .crossTable input[type=password],.x .rowTable input[type=file],.x .colTable input[type=file],.x .crossTable input[type=file],.x .rowTable textarea,.x .colTable textarea,.x .crossTable textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:transparent}.x .rowTable input[type=text],.x .colTable input[type=text],.x .crossTable input[type=text],.x .rowTable input[type=password],.x .colTable input[type=password],.x .crossTable input[type=password],.x .rowTable input[type=file],.x .colTable input[type=file],.x .crossTable input[type=file]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px}.x .clear:after{content:"";display:block;clear:both} \ No newline at end of file +@charset "utf-8";/* Element Reset */header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{display:block}body>.popup{margin:1em}.x,.x table,.x input,.x textarea,.x select,.x button{font-family:Tahoma,Geneva,sans-serif;font-size:12px;color:#333}.x button,.x input[type=submit],.x input[type=reset],.x input[type=button]{cursor:pointer;overflow:visible}.x img{border:0}.x p{line-height:1.5}/* Section & Heading */.x .section{margin:1em 0;padding:0;border:0}.x .h1, .x .h2, .x .h3, .x .h4{position:relative;border-bottom-style:solid;zoom:1}.x .h1{border-bottom-width:4px;font-size:24px;border-bottom-color:#666}.x .h2{border-bottom-width:3px;font-size:20px;border-bottom-color:#888}.x .h3{border-bottom-width:2px;font-size:16px;border-bottom-color:#aaa}.x .h4{border-bottom-width:1px;font-size:12px;border-bottom-color:#ccc}.x .h1 + ul,.x .h2 + ul,.x .h3 + ul,.x .h4 + ul,.x .h1 + .table table, .x .h2 + .table table, .x .h3 + .table table, .x .h4 + .table table{border-top:0 !important;margin-top:-1em !important}/* Portlet */.x .portlet{position:relative;border:1px solid #e9e9e9;margin:1em 0;padding:0;background:#fff;zoom:1;overflow:hidden;border-radius:5px}.x .portlet h2, .x .portlet h3{margin:0;padding:.5em 1em;font-size:14px;border:1px solid #fff;border-bottom:1px solid #e9e9e9;background:#f7f7f7;border-radius:5px 5px 0 0}.x .portlet p{margin:1em 1.2em}.x .portlet li{position:relative;padding-right:8em}.x .portlet .lined{margin:1px !important;padding:0;list-style:none}.x .portlet .lined li{padding:.5em 8em .5em 1em;border-top:1px solid #eee;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis}.x .portlet .lined li:first-child{border:0}.x .portlet .side{position:absolute;top:0;_top:1px;right:0;color:#666;background:#fff;padding:0 1em}.x .portlet .lined .side{padding:.5em 1em}.x .portlet .more{position:absolute;top:.5em;right:1em;text-decoration:none !important;color:#666}.x .portlet .more span{color:#999}.x .portlet .action{text-align:right;top:0;right:0;padding:.5em 1em .5em 3em;background:#fff;background:-webkit-gradient(linear, 0% 0%, 100% 0%, from(rgba(255,255,255,0)), to(rgba(255,255,255,1)), color-stop(15%, #fff));background:-moz-linear-gradient(left, rgba(255,255,255,0) 0, rgba(255,255,255,1) 15%)}.x .portlet .action a,.x .portlet .action button{margin-left:1em}.x .portlet .btnArea{border-top:1px solid #ddd;margin:0;padding:.5em 1em;margin:0 1px 1px 1px;background:#f7f7f7;border-radius:0 0 5px 5px}/* Table */.x .table{margin:1em 0}.x .table table{width:100%;border:0;border-collapse:collapse;border-top:2px solid #ccc}.x .table caption{font-weight:bold;text-align:left;line-height:22px;padding:5px 0}.x .table caption:after{content:"";display:block;clear:both}.x .table caption a{font-weight:normal}.x .table caption em{float:right;margin-left:1em}.x .table caption strong{color:#e00}.x .table caption .side{float:right;font-weight:normal;margin-left:1em}.x .table th,.x .table td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd;white-space:nowrap}.x .table th{background:#f8f8f8}.x .table thead th{border-bottom:1px solid #999}.x .table tfoot td{font-weight:bold;background:#f8f8f8}.x .table.even tbody tr:nth-of-type(even) td{background-color:#fafafa}.x .table td>input[type=text]{margin:-1px 0 !important;vertical-align:middle}.x .table img{vertical-align:middle}.x .table em{font-style:normal;font-weight:normal;color:#e00}.x .table .title,.x .table .text{white-space:normal;width:100%}/* Form */.x .form{margin:1em 0;padding:0}.x .form fieldset{margin:0 0 2em 0;padding:0;border:0}.x .form em{font-style:normal;color:#e00}.x .form label{margin-right:1em;line-height:1;vertical-align:middle}.x .form input[type=checkbox]+label,.x .form input[type=radio]+label,.x .form input[type=file]{cursor:pointer}.x .form ul{position:relative;margin:1em 0;padding:0;list-style:none;border-top:2px solid #ccc;border-bottom:1px solid #ccc;zoom:1}.x .form li{list-style:none;border:1px solid #ddd;border-left:0;border-right:0;margin:-1px 0;padding:8px 0;vertical-align:top;zoom:1}.x .form li:first-child{border-top:0}.x .form li>label:first-child{display:block;font-weight:bold}.x .form li label em{font-weight:normal}.x .form label.overlap{position:absolute;color:#aaa}.x .form input[type=text],.x .form input[type=password],.x .form input[type=file],.x .form textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:transparent}.x .form input[type=text],.x .form input[type=password],.x .form input[type=file]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px}.x .form input[type=text].loading,.x .form input.loading[type=password]{padding-right:24px;width:260px;background:transparent url(../img/preLoader16.gif) no-repeat 265px center}.x .form input[type=checkbox],.x .form input[type=radio]{margin:0;padding:0;width:13px;height:13px;vertical-align:middle}.x .form input[type=text][disabled=disabled],.x .form input[type=password][disabled=disabled],.x .form input[type=radio][disabled=disabled],.x .form input[type=checkbox][disabled=disabled],.x .form select[disabled=disabled],.x .form textarea[disabled=disabled]{background:#ddd;text-shadow:1px 1px 0 #fff}.x .form textarea{padding:3px 4px;vertical-align:top}.x .form span.desc, .x .form em.desc{line-height:22px;vertical-align:middle;margin:0 10px}.x .form p.desc{margin:.25em 0;line-height:1.4}.x .form .q{font-weight:bold;margin:0 0 5px 0}.x .form .a{margin:0 0 5px 0}.x .form .tgForm{margin-right:1em}/* Global Navigation Bar */.x .gnb{position:relative;clear:both;border:1px solid #c1c1c1;border-left:0;border-right:0;background-color:#efefef;background:#efefef -webkit-gradient(linear, 0% 0%, 0% 100%, from(#efefef), to(#dcdcdc));background:#efefef -moz-linear-gradient(top, #efefef, #dcdcdc);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#efefef, endColorStr=#dcdcdc);zoom:1}.x .gnb ul{margin:0;padding:0 0 0 20px;list-style:none;border:1px solid #fff;border-left:0;border-right:0;zoom:1}.x .gnb ul ul{position:absolute;top:30px;left:0;border:1px solid #ccc;border-top:0;padding:1px 0 0 0;background:#fff}.x .gnb ul:after{content:"";display:block;clear:both}.x .gnb li{position:relative;float:left;border:1px solid #fff;border-top:0;border-bottom:0;margin:0 -1px 0 0}.x .gnb li li{float:none;clear:both;overflow:hidden;border:0;border-top:1px dotted #ccc;margin:0;padding:2px}.x .gnb li li:first-child{border:0}.x .gnb li a{float:left;font-weight:bold;color:#333;font-size:12px;padding:8px 18px;white-space:nowrap;text-decoration:none;text-shadow:0 1px 0 #fff;zoom:1}.x .gnb li a:hover,.x .gnb li a:active,.x .gnb li a:focus,.x .gnb li.active a{background:#f4f4f4;border:1px solid #ccc;border-bottom:0;padding:7px 17px 8px 17px}.x .gnb li.activeOn a{background:#fff;border:1px solid #ccc;border-bottom:0;padding:7px 17px 8px 17px}.x .gnb li.active li a{display:block;float:none;color:#555;background:#fff;padding:5px 15px !important;font-weight:normal !important;border:0 !important}.x .gnb li.active li a:hover,.x .gnb li.active li a:active,.x .gnb li.active li a:focus{border:0;background:#eee}.x .gnb .setting{position:absolute;top:8px;right:2em;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;background:url(../img/iconSetting.gif) no-repeat center}.x .gnb.jx ul{display:block;position:static;padding:0}.x .gnb.jx li{float:none;clear:both;border-top:1px solid #ccc}.x .gnb.jx ul ul{border:0}.x .gnb.jx li li{border:0}.x .gnb.jx li a{float:none;display:block}.x .gnb.jx li a:hover,.x .gnb.jx li a:active,.x .gnb.jx li a:focus{background:none}.x .gnb.jx li.activeOn>a{background:#ddd}@media only all and (max-width:860px){.x .gnb ul{padding-left:1em}.x .gnb .setting{right:1em}}@media only all and (max-width:640px){.x .gnb ul{display:block;position:static;padding:0}.x .gnb li{float:none;clear:both;border-top:1px solid #ccc}.x .gnb ul ul{border:0;position:static}.x .gnb li li{border:0}.x .gnb li a{float:none;display:block}.x .gnb li a:hover,.x .gnb li a:active,.x .gnb li a:focus{background:none}.x .gnb li.activeOn>a{background:#ddd}}/* Favorite */.x .bmk{position:absolute;right:20px;bottom:10px;padding:0 0 0 20px;background:url(../img/iconFavorite.gif) no-repeat 0 -16px}.x .bmk>a{text-shadow:0 1px 0 #fff}.x .bmk ul{position:absolute;top:140%;right:0;list-style:none;margin:0;padding:5px 10px;border:1px solid #aaa;border-radius:5px;background:#fff;box-shadow:1px 1px 3px #aaa}.x .bmk li{position:relative;padding:3px 30px 3px 0;white-space:nowrap}.x .bmk li .action{position:absolute;top:0;right:0}.x .bmk li .action .text{text-decoration:none;width:16px;text-align:center;margin:0}@media only all and (max-width:640px){.x .bmk{position:static;background-color:#fff;padding:10px 20px;background:#fff}.x .bmk .tgAnchor{display:block}.x .bmk ul{position:relative;border:0;border-top:1px solid #ccc;border-radius:0;box-shadow:none;padding:0;margin:5px 0 0 0}.x .bmk li{position:relative;top:-1px;border-top:1px dotted #ccc}}/* Local Navigation */.x .lnb{position:relative;float:left;width:210px;margin:1em 0 1em -240px;line-height:normal;zoom:1;display:inline}.x .lnb .h2{margin-top:0}.x .lnb ul{margin:0 !important;padding:0;list-style:none}.x .lnb li{position:relative;margin:0 0 -1px 0;vertical-align:top;zoom:1}.x .lnb li a{display:block;position:relative;padding:8px 10px;text-decoration:none;color:#666;font-weight:bold;background:#fafafa;border:1px solid #eee;zoom:1}.x .lnb li a .i{position:absolute;top:50%;left:100%;margin:-4px 0 0 -16px;width:8px;height:8px;color:#ccc;background:url(../img/iconNavVr.gif) no-repeat left top}.x .lnb li ul{padding:5px 0;background:#fff}.x .lnb li li{margin:0;border-top:1px dotted #ddd}.x .lnb li li:first-child{border:0}.x .lnb li li a{font-weight:normal;background:#fff;padding:5px 10px;border:0}.x .lnb li li a span{color:#666}.x .lnb li.active{border:1px solid #ccc;z-index:2}.x .lnb li li.active{border:0}.x .lnb li.active a{color:#000;border:0}.x .lnb li.active .i{background-position:0 -44px}.x .lnb li.active li a{border:0}.x .lnb li.active ul{display:block;border-top:1px solid #eee}.x .lnb li.active li.active a span{color:#13b200;font-weight:bold;letter-spacing:-1px}/* Content Navigation */.x .cnb{margin:1em 0;position:relative;zoom:1}.x .cnb:after{content:"";display:block;clear:both}.x .cnb ul{list-style:none;margin:0;padding:0}.x .cnb li{display:inline}.x .cnb li:before{content:"| ";color:#ccc}.x .cnb li:first-child:before{content:""}.x .cnb .active,.x .cnb .active a{font-weight:bold;color:#333;text-decoration:none}.x .cnb .side{float:right}/* Pagination */.x .pagination{margin:1em 0;text-align:center;line-height:normal}.x .pagination *{vertical-align:middle}.x .pagination a,.x .pagination strong{position:relative;display:inline-block;padding:2px 4px;font-weight:bold;text-decoration:none;line-height:normal;color:#333 !important;vertical-align:middle}.x .pagination a:hover,.x .pagination a:active,.x .pagination a:focus{border:1px solid #ddd;margin:0 -1px}.x .pagination strong{color:#e00 !important;font-size:20px}.x .pagination .direction{font-weight:normal;white-space:nowrap}.x .pagination .direction:hover,.x .pagination .direction:active,.x .pagination .direction:focus{border:0;margin:0;text-decoration:underline}.x .pagination input{width:30px;text-align:center}.x .pagination button{overflow:visible}/* Star Rating */.x .starRating, .x .starRating span{display:inline-block;height:14px;background:transparent url(../img/iconStarRating.gif) no-repeat;overflow:hidden}.x .starRating{width:79px;vertical-align:top}.x .starRating span{font-size:0;line-height:0;vertical-align:top;text-indent:-100px;*text-indent:0;background-position:0 -14px}/* Progress */.x .prgrs{white-space:nowrap;line-height:normal;vertical-align:middle}.x .prgrs *{vertical-align:middle}.x .prgrs .pBar{position:relative;display:inline-block;background:#e9e9e9;margin:0 5px 0 0}.x .prgrs .pAction{display:inline-block;vertical-align:top;background:#99a6b6}.x .prgrs .pNum{position:absolute;width:100%;left:0;top:0;text-align:center;text-shadow:1px 1px 0 #fff}.x .prgrs.prgrsSmall{font-size:14px;line-height:14px}.x .prgrs.prgrsSmall .pBar,.x .prgrs.prgrsSmall .pAction,.x .prgrs.prgrsSmall .pNum{height:16px;line-height:16px;font-size:11px}.x .prgrs.prgrsMedium{font-size:24px;line-height:24px}.x .prgrs.prgrsMedium .pBar,.x .prgrs.prgrsMedium .pAction,.x .prgrs.prgrsMedium .pNum{height:22px;line-height:22px;font-size:12px}.x .prgrs.prgrsLarge{font-size:38px;line-height:38px}.x .prgrs.prgrsLarge .pBar,.x .prgrs.prgrsLarge .pAction,.x .prgrs.prgrsLarge .pNum{height:34px;line-height:34px;font-size:14px}/* Modal Window */.modal{position:absolute;top:0;left:0;width:100%;_height:100%;min-height:100%;z-index:100}.modal .bg{position:absolute;background:#000;_background:none;width:100%;height:100%;opacity:.5;z-index:2;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1}.modal .fg{position:relative;width:80%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:3;zoom:1;border-radius:5px;box-shadow:0 0 6px #000}.modal ul, .modal ol, .modal .lined, .modal .table{margin-bottom:1em}.modal .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1}.modalClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px}.modalBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}html.modalContainer,body.modalContainer{_height:100%;_width:100%} /* IE6 only */ /* Layer */.x .layer,.x.layer{position:absolute;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:2;zoom:1;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;box-shadow:0 0 6px #666;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x .layer h2{font-size:14px}.x .layer ul, .x .layer ol, .x .layer .lined, .x .layer .table{margin-bottom:1em}.x .layerClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px}.x .layerBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}/* H2 Anchor */.x .h2Anchor{position:absolute;right:0;border:0;background:none;color:#00f;text-decoration:underline}/* Skip Navigation */.x .skipNav{margin:0;text-align:center}.x .skipNav a{position:absolute;width:1px;height:1px;display:block;font-weight:bold;padding:10px 0}.x .skipNav a:hover,.x .skipNav a:active,.x .skipNav a:focus{position:relative;width:auto;height:auto}/* Header */.x .header{position:relative;z-index:2;padding:30px 0 0 0;background:#4c4c4c;box-shadow:0 0 10px #aaa;zoom:1;border-radius:5px 5px 0 0}.x .header:after{content:"";display:block;clear:both}.x .header a{text-decoration:none}.x .header h1{margin:0 15px 10px 20px;font-size:24px;line-height:32px;display:inline-block;zoom:1}.x .header h1 *{vertical-align:middle}.x .header h1 a{color:#fff;text-shadow:1px 1px 0 #000;filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=1, OffY=1, Color=#000000, Positive=true);zoom:1}.x .header h1 .url{font-size:12px;font-weight:normal}.x .header .site{margin:0;display:inline-block;zoom:1}.x .header .site a{color:#fff;text-decoration:underline}.x .header #moveSiteList{padding:10px 1em 5px 1em;margin:0}.x .header #moveSiteList ul{list-style:none;margin:0;padding:0}.x .header #moveSiteList li{white-space:nowrap;margin:0;padding:4px 0;border-bottom:1px dotted #ccc}.x .header #siteMapList{padding:0 1em 1em 1em;margin:0}.x .header #siteMapList li{white-space:nowrap}.x .header .account{position:absolute;z-index:3;width:100%;top:0;right:0;white-space:nowrap;text-align:right;background:#333;border-bottom:1px solid #656565;color:#fff;font-size:12px;border-radius:5px 5px 0 0}.x .header .account ul{margin:0 2px 0 0;padding:5px 20px 5px 0;list-style:none}.x .header .account li{position:relative;display:inline;border-left:1px solid #666;padding:0 6px 0 10px}.x .header .account li:first-child{border:0}.x .header .account a{color:#fff;display:inline-block;height:14px}.x .header .account a.language{padding-right:16px;background:url(../img/iconArrow.gif) no-repeat right -160px}.x .header #language{position:absolute;top:19px;right:-2em;padding:6px 4px !important;border:1px solid #666;border-top:0;background:#333}.x .header #language li{border:0;display:block;padding:1px 8px 1px 10px;text-align:left;line-height:1}.x .header #language li.selected{background:url(../img/iconCheck.gif) no-repeat left center}.x .header #language li.selected a{text-decoration:underline}.x .header h1 a:hover,.x .header h1 a:active,.x .header h1 a:focus,.x .header .account a:hover,.x .header .account a:active,.x .header .account a:focus{color:#6e9cf2;text-decoration:underline}/* Footer */.x .footer{border-top:1px solid #ddd;text-align:center;font-size:12px;padding:1.5em 0;zoom:1}.x .footer:after{content:"";display:block;clear:both}.x .footer p{margin:0}.x .footer .power{float:left}.x .footer .cache{float:right}/* Body */.x .body{position:relative;z-index:1;padding:1em 20px 1em 260px;zoom:1}.x .body:after{content:"";display:block;clear:both}/* Content */.x .content{float:right;width:100%;margin-left:-230px;zoom:1}.x .content:after{content:"";display:block;clear:both}.x .content a{color:#33a}.x .content a:hover,.x .content a:active,.x .content a:focus{color:#a33}.x .content .portlet a{text-decoration:none}.x .content .portlet a:hover,.x .content .portlet a:active,.x .content .portlet a:focus{text-decoration:underline}/* Dashboard */.x .dashboard{position:relative;float:none;width:auto;margin-left:-230px}.x .dashboard .portlet{float:left;width:48%;margin-right:1em}.x .dashboard .portlet:nth-of-type(odd){float:left;width:49%;margin-right:0}.x .dashboard .portlet:nth-of-type(even){float:right;width:49%;margin-right:0}@media only all and (min-width:1300px){.x .dashboard .portlet{float:left !important;width:32% !important;margin-right:1em !important}}/* Single Column*/.x .single{position:relative;float:none;width:auto;margin-left:-240px}/* Search */.x .search{zoom:1}.x .search:after{content:"";display:block;clear:both}.x .search .pagination{float:left;text-align:left}.x .search form{float:right;margin:1em 0}.x .search form *{vertical-align:middle}/* Site Map */.x .siteMap h2 input{font-size:14px;font-weight:bold;padding:0 .5em}.x .siteMap label{cursor:text}.x .siteMap .lined ul{padding:0;margin:0;border-top:1px solid #eee;zoom:1}.x .siteMap .lined li{position:relative;padding:0;margin:0;cursor:all-scroll;list-style:none;zoom:1}.x .siteMap .lined li li{border-top:1px solid #eee}.x .siteMap li li{text-indent:18px}.x .siteMap li li li{text-indent:36px}.x .siteMap li li li li{text-indent:54px}.x .siteMap li li li li li{text-indent:72px}.x .siteMap li li li li li li{text-indent:90px}.x .siteMap li li li li li li li{text-indent:108px}.x .siteMap li li li li li li li li{text-indent:126px}.x .siteMap li li li li li li li li li{text-indent:144px}.x .siteMap li li li li li li li li li li{text-indent:162px}.x .siteMap li li li li li li li li li li li{text-indent:180px}.x .siteMap li li li li li li li li li li li li{text-indent:198px}.x .siteMap li *{vertical-align:middle}.x .siteMap li .moveTo+input{width:200px;border:0;padding:0 .5em}.x .siteMap li .moveTo+input:hover,.x .siteMap li .moveTo+input:active,.x .siteMap li .moveTo+input:focus{border:1px dotted #ccc;overflow:visible}.x .siteMap .moveTo{position:relative;z-index:2;width:22px;height:32px;padding:32px 0 0 0;margin:0 3px;_margin-top:-1px;overflow:hidden;background:#fff url(../img/iconMoveTo.gif) no-repeat center 0;border:0;cursor:move}.x .siteMap li.active,.x .siteMap li.active .moveTo{background-color:#f7f7f7}.x .siteMap li.active li,.x .siteMap li.active ul{border-top-color:#f7f7f7}.x .siteMap li.active .moveTo{background-position:center -32px}.x .siteMap .vr,.x .siteMap .hr{display:none;position:absolute;z-index:1;left:14px;border:0px solid #ccc;overflow:hidden}.x .siteMap .vr{top:-16px;height:100%;border-left-width:1px}.x .siteMap .hr{top:16px;width:16px;border-top-width:1px}.x .siteMap li.active .vr,.x .siteMap li.active li .hr{display:block}.x .siteMap li li .vr,.x .siteMap li li li .hr{left:32px}.x .siteMap li li li .vr,.x .siteMap li li li li .hr{left:50px}.x .siteMap li li li li .vr,.x .siteMap li li li li li .hr{left:68px}.x .siteMap li li li li li .vr,.x .siteMap li li li li li li .hr{left:86px}.x .siteMap li li li li li li .vr,.x .siteMap li li li li li li li .hr{left:104px}.x .siteMap li li li li li li li .vr,.x .siteMap li li li li li li li li .hr{left:122px}.x .siteMap li li li li li li li li .vr,.x .siteMap li li li li li li li li li .hr{left:140px}.x .siteMap li li li li li li li li li .vr,.x .siteMap li li li li li li li li li li .hr{left:158px}.x .siteMap li li li li li li li li li li .vr,.x .siteMap li li li li li li li li li li li .hr{left:176px}.x .siteMap li li li li li li li li li li li .vr,.x .siteMap li li li li li li li li li li li li .hr{left:336px}.x .siteMap .side{padding-top:0 !important;padding-bottom:0 !important;line-height:30px;background:transparent !important}.x .siteMap .side button{text-indent:0;line-height:1}.x .siteMap .tgMap{position:absolute;top:12px;right:1em;padding:0 16px 0 0;line-height:16px;background:url(../img/iconArrow.gif) no-repeat right -126px}.x .siteMap.fold .tgMap{background-position:right -158px}.x .siteMap.fold .h2{border-bottom-color:#fff;border-radius:5px}.x .siteMap .placeholder{background:#bbb}.x .siteMap .draggable,.x .siteMap .draggable .moveTo{background-color:#ddd}.x .siteMap .draggable .summary{border-left:1px solid #ccc;padding-left:10px;margin-left:10px;font-size:11px;color:#999}.x .siteMap a.ms{text-decoration:underline}/* Multilingual */.x .langEdit{background:#fff;position:absolute;*left:0;*margin-top:28px;z-index:10}.x .langEdit ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0}.x .langEdit li{padding:.5em 10px}.x .langEdit input[type=text]{width:220px;padding-right:40px}.x .langEdit label{left:15px !important}.x .langEdit .action{border:1px solid #eee;width:268px;padding:0 10px}.x .langEdit p, .x .langEdit .btnArea{white-space:normal}.x .langEdit .langList,.x .langEdit .langEditControls{box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x .langEdit .langList{margin:0 -1px 0 0;display:none}.x .langEdit .langList li{white-space:nowrap;color:#ccc;width:270px} .x .langEdit .langList li span{display:inline-block;width:80px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:#767676}.x .langEdit .langList li a{display:inline-block;width:80px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.x .langEdit .langList li.active{background:url(../img/iconArrow.gif) no-repeat right -188px}.x .langEdit.showChild .langList{display:block}.x .langEdit .langInput{background:#fff}.x .langEdit .langInput h2{padding:5px 10px;margin:0 0 -1px 0;font-size:12px;font-weight:normal;color:#666;border:1px solid #eee;border-top-color:#ccc}.x .langEdit .langInput h2 strong{color:#000;font-size:14px}.x .langEdit.showChild .langInput{position:absolute;left:285px;top:0}.x .langEdit li.en input, .x .langEdit li.en textarea, .x .mLangEdit li.en textarea{background:url(../img/flag.us.gif) no-repeat 99% 5px}.x .langEdit li.ko input, .x .langEdit li.ko textarea, .x .mLangEdit li.ko textarea{background:url(../img/flag.kr.gif) no-repeat 99% 5px}.x .langEdit li.jp input, .x .langEdit li.jp textarea, .x .mLangEdit li.jp textarea{background:url(../img/flag.jp.gif) no-repeat 99% 5px}.x .langEdit li.fr input, .x .langEdit li.fr textarea, .x .mLangEdit li.fr textarea{background:url(../img/flag.fr.gif) no-repeat 99% 5px}.x .langEdit li.de input, .x .langEdit li.de textarea, .x .mLangEdit li.de textarea{background:url(../img/flag.de.gif) no-repeat 99% 5px}.x .langEdit li.ru input, .x .langEdit li.ru textarea, .x .mLangEdit li.ru textarea{background:url(../img/flag.ru.gif) no-repeat 99% 5px}.x .langEdit li.es input, .x .langEdit li.es textarea, .x .mLangEdit li.es textarea{background:url(../img/flag.es.gif) no-repeat 99% 5px}.x .langEdit li.tr input, .x .langEdit li.tr textarea, .x .mLangEdit li.tr textarea{background:url(../img/flag.tr.gif) no-repeat 99% 5px}.x .langEdit li.vi input, .x .langEdit li.vi textarea, .x .mLangEdit li.vi textarea{background:url(../img/flag.vn.gif) no-repeat 99% 5px}.x .langEdit li.mn input, .x .langEdit li.mn textarea, .x .mLangEdit li.mn textarea{background:url(../img/flag.mn.gif) no-repeat 99% 5px}.x .langEdit li.zh-CN input, .x .langEdit li.zh-CN textarea, .x .mLangEdit li.zh-CN textarea{background:url(../img/flag.cn.gif) no-repeat 99% 5px}.x .langEdit li.zh-TW input, .x .langEdit li.zh-TW textarea, .x .mLangEdit li.zh-TW textarea{background:url(../img/flag.tw.gif) no-repeat 99% 5px}.x .mLangEdit.en strong{background:url(../img/flag.us.gif) no-repeat 0 10px}.x .mLangEdit.ko strong{background:url(../img/flag.kr.gif) no-repeat 0 10px}.x .mLangEdit.jp strong{background:url(../img/flag.jp.gif) no-repeat 0 10px}.x .mLangEdit.fr strong{background:url(../img/flag.fr.gif) no-repeat 0 10px}.x .mLangEdit.de strong{background:url(../img/flag.de.gif) no-repeat 0 10px}.x .mLangEdit.ru strong{background:url(../img/flag.ru.gif) no-repeat 0 10px}.x .mLangEdit.es strong{background:url(../img/flag.es.gif) no-repeat 0 10px}.x .mLangEdit.tr strong{background:url(../img/flag.tr.gif) no-repeat 0 10px}.x .mLangEdit.vi strong{background:url(../img/flag.vn.gif) no-repeat 0 10px}.x .mLangEdit.mn strong{background:url(../img/flag.mn.gif) no-repeat 0 10px}.x .mLangEdit.zh-CN strong{background:url(../img/flag.cn.gif) no-repeat 0 10px}.x .mLangEdit.zh-TW strong{background:url(../img/flag.tw.gif) no-repeat 0 10px}.x .mLangEdit ul ul{border:0}.x .mLangEdit li{position:relative;padding:0}.x .mLangEdit li strong{display:inline-block;padding:6px 100px 8px 24px;font-weight:normal;line-height:1.5}.x .mLangEdit li .side{position:absolute;top:8px;right:0;padding-right:18px;background:url(../img/iconArrow.gif) no-repeat right -160px}.x .mLangEdit li li{border:0;padding-right:36px}.x .mLangEdit li textarea{width:100%;height:16px;padding-right:30px;resize:vertical;line-height:1.4}.x .mLangEdit li label{top:8px !important}.x .mLangEdit li.active{background:#FFFDEF}.x .mLangEdit li.active strong{font-weight:bold}.x .mLangEdit li.active .side{background-position:right -128px}.modal .mLangEdit ul{padding-bottom:1em}.modal .mLangEdit li{border:0;padding-right:36px}/* Suggestion */.x .suggestion{display:none;position:absolute;background:#fff;z-index:10;_height:200px;max-height:200px;overflow:auto;*left:0;*margin-top:28px;box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x .suggestion ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0}.x .suggestion li{padding:0}.x .suggestion li:last-child{border-bottom:0}.x .suggestion li button{border:0;background:#fff;text-align:left;width:288px;padding:2px 4px;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.x .suggestion li button:hover,.x .suggestion li button:active,.x .suggestion li button:focus,.x .suggestion li button.active{background:#eee}/* Image Mark */.x #imageMark{right:0}/* Easy Installer */.x .easyNav{position:relative;border:1px solid #e9e9e9;zoom:1}.x .easyNav:after{content:"";display:block;clear:both}.x .easyNav h2{font-size:16px}.x .easyNav .category{width:30%;float:left;margin:0 2em;display:inline}.x .easyNav .filter{position:absolute;top:0;right:0;margin:1em 2em;text-align:right}.x .easyList td p{margin-top:0}.x .easyList td p.update{background:#ffc;padding:.5em 1em;border:1px solid #fc9;border-left:0;border-right:0;text-align:center}/* Font Preview */.x .fontPreview{width:96%;border:1px solid #e9e9e9;zoom:1;padding:1em 2em;margin:.5em 0}/* FTP Suggestion */.x #ftpSuggestion{background:#fff;box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x #ftpSuggestion ul{border-left:1px solid #eee;border-right:1px solid #eee}.x #ftpSuggestion li{padding:0}.x #ftpSuggestion li button{border:0;background:#fff;text-align:left;width:288px}.x #ftpSuggestion li button:hover,.x #ftpSuggestion li button:active,.x #ftpSuggestion li button:focus{background:#eee}/* Theme & Skin Preview */.x .thumbPreview li{position:relative;padding-left:10px;padding-right:10px}.x .thumbPreview li.active.highlight{background:#f9f9f9}.x .thumbPreview .prevToggle{position:absolute;top:8px;right:10px;line-height:16px;padding:0 18px 0 0;text-decoration:none;background:url(../img/iconArrow.gif) no-repeat right -32px}.x .thumbPreview li.active .prevToggle{background-position:right 0}.x .thumbPreview .a{border:0;margin:0;zoom:1}.x .thumbPreview .a:after{content:"";display:block;clear:both}.x .thumbPreview .i{float:left;vertical-align:top;margin:0 1em 1em 0;padding:0;border:0;zoom:1}.x .thumbPreview .i:after{content:"";display:block;clear:both}.x .thumbPreview .i .thumb{position:relative;width:124px;height:84px;padding:0;margin-bottom:3px;text-align:center;overflow:hidden;border:1px solid #ddd;display:block;cursor:pointer;background:#fff}.x .thumbPreview .i .thumb .frame{position:absolute;width:120px;height:80px;left:0;top:0;border:2px solid #fff;overflow:hidden}.x .thumbPreview .i .thumb img{width:120px;margin:0}.x .thumbPreview .i label{display:block;position:relative;top:0;left:2px;width:122px;height:1.1em;margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x .thumbPreview .i input{display:none}.x .thumbPreview .i ul{display:none}.x .thumbPreview .selected .i{display:block;float:none}.x .thumbPreview .selected .i .thumb{float:left;width:186px;height:126px;margin:0 1em 0 0;border:2px solid #eee}.x .thumbPreview .selected .i .thumb .frame{width:180px;height:120px;border-width:3px}.x .thumbPreview li.active.highlight .selected .i .thumb{border-color:#5ea8f6}.x .thumbPreview .selected .i .thumb img{width:180px;position:relative}.x .thumbPreview li.active .selected .i .thumb img{z-index:auto}.x .thumbPreview .selected .i label{cursor:text}.x .thumbPreview .selected .i ul{display:block;list-style:none;border:0;margin:1em 0 1em 200px}.x .thumbPreview .selected .i li{border:0;padding:0;margin:0 0 .2em 0}.x .thumbPreview.jx .i label{display:inline;width:auto}.x .thumbPreview.jx .i.noDirection{display:none}.x .thumbPreview.jx .i input{display:inline}.x #skin .showAll{float:right;border:0;overflow:visible;padding:0 18px 0 0;cursor:pointer;color:#00f;background:url(../img/iconArrow.gif) no-repeat right -32px}.x #skin .showAll.hideAll{background-position:right 0}/* Favorite On | Off */.x .fvOff,.x .fvOn{display:inline-block;width:16px;height:16px;overflow:hidden;text-indent:16px;background:url(../img/iconFavorite.gif) no-repeat}.x .fvOn{background-position:0 -16px}/* Up-Down Dragable */.x .uDrag .wrap{position:relative;padding-left:20px}.x .uDrag li>.wrap{margin:0 0 0 8px}.x .uDrag .dragActive{background:#FFD}.x .uDrag .dragActive th,.x .uDrag .dragActive td{background:none !important}.x .uDrag .dragBtn{position:absolute;width:8px;height:100%;padding:0;overflow:hidden;background:url(../img/bgDragable.gif);top:1px;left:0;text-indent:12px;border:0;cursor:n-resize;white-space:nowrap}/* Favicon Preview */.x .faviconPreview{position:relative;padding:60px 0 0 200px;background:url(../img/bgFavicon.gif) no-repeat}.x .faviconPreview img{position:absolute}.x .faviconPreview .fn1{top:30px;left:12px}.x .faviconPreview .fn2{top:55px;left:68px}/* Mobile Icon Preview */.x .mobiconPreview{position:relative;padding:252px 0 0 200px;background:url(../img/bgMobileTop.png) no-repeat}.x .mobiconPreview img{position:absolute;top:20px;left:10px}.x .mobiconPreview span{position:absolute;width:32px;text-align:center;top:52px;left:10px;color:#fff;font-size:9px}/* Text List */.x .textList{border:1px solid #ddd !important;line-height:1.5em;height:18.5em;overflow:auto}.x .textList li{border:0;padding:.25em 1em;height:1.5em;white-space:nowrap;overflow:hidden}.x .textList li:nth-child(even){background:#eee}.x .textList li a{float:right}/* File Box */.x .fileBox li{position:relative}.x .fileBox li img{max-width:100%}.x .fileBox .portlet ul{margin:1em;list-style:none;padding:0;border:0}.x .fileBox .portlet li{border-top:1px solid #ddd;border-bottom:0;padding:8px 0}.x .fileBox .side{position:absolute;top:8px;right:0}/* Messages */.x .desc.error{color:#f00}.x .desc.success{color:#080}/* Icon Button */.x a.iSetting{display:inline-block;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;vertical-align:middle;background:url(../img/iconSetting.gif) no-repeat}.x a.cMenu{display:inline-block;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;vertical-align:middle;background:url(../../../../common/img/icon.bubble.png) no-repeat}/* Responsive Layout */@media only all and (max-width:860px){.x .header h1{margin-left:.7em}.x .header .account ul{padding-right:10px}.x .body{padding:0}.x .content{float:none;margin-left:0}.x .lnb{float:none;width:auto;margin:1em 0}.x .dashboard .portlet{float:none !important;width:auto !important;margin-right:0}.modal .fg,.wfsr .fg{width:auto}.x .easyNav .category{float:none;display:block;width:auto}.x .easyNav .filter{position:static}}@media only all and (max-width:640px){.x .skipNav a{position:relative;width:auto;height:auto}.modal{position:absolute}}/* Legacy Code (Don't use it. It will be removed as soon as possible.) */.x h3.xeAdmin,.x h4.xeAdmin{position:relative;border-bottom-style:solid;border-bottom-color:#ccc;zoom:1}.x h3.xeAdmin{border-bottom-width:4px;font-size:24px}.x h4.xeAdmin{border-bottom-width:3px;font-size:20px}.x h5.xeAdmin{border-bottom-width:2px;font-size:16px}.x h6.xeAdmin{border-bottom-width:1px;font-size:12px}.x .adminSearch{margin:1em 0}.x .adminSearch fieldset{border:1px solid #ccc;margin:0;padding:.5em 1em}.x .localNavigation{padding:0;list-style:none}.x .localNavigation li{display:inline}.x .localNavigation li.on a{font-weight:bold;color:#333;text-decoration:none}.x .localNavigation li:before{content:"| "}.x .localNavigation li:first-child:before{content:""}.x .summary{margin:1em 0}.x .rowTable,.x .colTable,.x .crossTable{margin:1em 0;border:0;border-collapse:collapse;border-top:2px solid #ccc;width:100%}.x .rowTable caption,.x .colTable caption,.x .crossTable caption{font-weight:bold;text-align:left;line-height:22px;padding:5px 0}.x .rowTable caption:after,.x .colTable caption:after,.x .crossTable caption:after{content:"";display:block;clear:both}.x .rowTable caption a,.x .colTable caption a,.x .crossTable caption a{font-weight:normal}.x .rowTable caption em,.x .colTable caption em,.x .crossTable caption em{float:right;font-style:normal;font-weight:normal;color:#e00;margin-left:1em}.x .rowTable caption strong,.x .colTable caption strong,.x .crossTable caption strong{color:#e00}.x .rowTable caption .side,.x .colTable caption .side,.x .crossTable caption .side{float:right;font-weight:normal;margin-left:1em}.x .rowTable th,.rowTable td,.x .colTable th,.rowTable td,.x .crossTable th,.rowTable td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd;white-space:nowrap}.x .rowTable th,.x .colTable th,.x .crossTable th{background:#f8f8f8}.x .rowTable thead th,.x .colTable thead th,.x .crossTable thead th{border-bottom:1px solid #999}.x .rowTable tfoot td,.x .colTable tfoot td,.x .crossTable tfoot td{font-weight:bold;background:#f8f8f8}.x .rowTable.even tbody tr:nth-of-type(even) td,.x .colTable.even tbody tr:nth-of-type(even) td,.x .crossTable.even tbody tr:nth-of-type(even) td{background-color:#fafafa}.x .rowTable td>input[type=text],.x .colTable td>input[type=text],.x .crossTable td>input[type=text]{margin:-1px 0 -3px 0 !important;vertical-align:middle}.x .rowTable img,.x .colTable img,.x .crossTable img{vertical-align:middle}.x .rowTable .title,.x .colTable .title,.x .crossTable .title,.x .rowTable .text,.x .colTable .text,.x .crossTable .text{white-space:normal}.x .rowTable input[type=text],.x .colTable input[type=text],.x .crossTable input[type=text],.x .rowTable input[type=password],.x .colTable input[type=password],.x .crossTable input[type=password],.x .rowTable input[type=file],.x .colTable input[type=file],.x .crossTable input[type=file],.x .rowTable textarea,.x .colTable textarea,.x .crossTable textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:transparent}.x .rowTable input[type=text],.x .colTable input[type=text],.x .crossTable input[type=text],.x .rowTable input[type=password],.x .colTable input[type=password],.x .crossTable input[type=password],.x .rowTable input[type=file],.x .colTable input[type=file],.x .crossTable input[type=file]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px}.x .clear:after{content:"";display:block;clear:both} \ No newline at end of file diff --git a/modules/autoinstall/tpl/index.html b/modules/autoinstall/tpl/index.html index 5874661f9..018d00ccb 100644 --- a/modules/autoinstall/tpl/index.html +++ b/modules/autoinstall/tpl/index.html @@ -1,19 +1,17 @@ - -

                                                      - - {@$ftp_link = sprintf('%s', getUrl('', 'module', 'admin', 'act', 'dispAdminConfig'), $lang->ftp_setup)} - {sprintf($lang->description_ftp_note, $ftp_link)} - -

                                                      -

                                                      {$XE_VALIDATOR_MESSAGE}

                                                      -
                                                      - - - +
                                                      +

                                                      {$XE_VALIDATOR_MESSAGE}

                                                      +
                                                      + + + +

                                                      + + {@$ftp_link = sprintf('%s', getUrl('', 'module', 'admin', 'act', 'dispAdminConfig'), $lang->ftp_setup)} + {sprintf($lang->description_ftp_note, $ftp_link)} + {@$btnUpdate = sprintf('', $lang->status_update)} {sprintf($lang->description_update, $btnUpdate)} - -

                                                      - +

                                                      + diff --git a/modules/autoinstall/tpl/list.html b/modules/autoinstall/tpl/list.html index 0c9ac4323..e6e04d3b4 100644 --- a/modules/autoinstall/tpl/list.html +++ b/modules/autoinstall/tpl/list.html @@ -32,7 +32,7 @@
                                                      {$lang->category}{$lang->thumbnail}{$lang->thumbnail} {$lang->name} {$lang->distribute_version} {$lang->current_version}
                                                      {$item->category}

                                                      {htmlspecialchars($item->title)}

                                                      {cut_str(htmlspecialchars($item->package_description),200)}

                                                      diff --git a/modules/menu/tpl/sitemap.html b/modules/menu/tpl/sitemap.html index 416b512f0..a1b2f3a8e 100644 --- a/modules/menu/tpl/sitemap.html +++ b/modules/menu/tpl/sitemap.html @@ -99,9 +99,9 @@ xe.lang.confirm_delete = "{$lang->confirm_delete}";

                                                      -

                                                      {$lang->module_admin}

                                                      +

                                                      {$lang->module_admin}

                                                      {$lang->about_admin_id}

                                                      • @@ -33,7 +33,7 @@

                                                      -

                                                      {$lang->permission_setting}

                                                      +

                                                      {$lang->permission_setting}

                                                      {$lang->about_grant_deatil}

                                                      diff --git a/modules/page/lang/lang.xml b/modules/page/lang/lang.xml index 6c0776906..580342cb3 100644 --- a/modules/page/lang/lang.xml +++ b/modules/page/lang/lang.xml @@ -120,18 +120,18 @@ Nếu chọn là mặc định, nó sẽ là trang chủ của Website.]]> - - - - - - - - + + + + + + + + - + From 9a8a4541c85141593c61537ee45ad248bb69e2d2 Mon Sep 17 00:00:00 2001 From: chschy Date: Wed, 19 Oct 2011 06:32:05 +0000 Subject: [PATCH 1203/1372] Change expresseion of deutsch git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9677 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/lang/lang.info | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/lang/lang.info b/common/lang/lang.info index 88be48c21..b2fba7d77 100644 --- a/common/lang/lang.info +++ b/common/lang/lang.info @@ -4,7 +4,7 @@ jp,日本語 zh-CN,中文(中国) zh-TW,中文(臺灣) fr,Français -de,Deutsche Sprache +de,Deutsch ru,Русский es,Español tr,Turkey From 0ee4a0396e3ce19bad9d363cc9bf4853cf9c72c0 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Wed, 19 Oct 2011 06:57:01 +0000 Subject: [PATCH 1204/1372] HTML, CSS, UX, Web Accessibility... git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9678 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/tpl/css/admin.css | 12 ++- modules/admin/tpl/css/admin.min.css | 2 +- modules/editor/skins/dreditor/skin.xml | 22 ----- modules/editor/skins/xpresseditor/skin.xml | 30 +----- modules/layout/lang/lang.xml | 24 ++--- modules/module/tpl/category_list.html | 16 ++-- modules/module/tpl/module_setup.html | 105 ++++++++++----------- 7 files changed, 81 insertions(+), 130 deletions(-) diff --git a/modules/admin/tpl/css/admin.css b/modules/admin/tpl/css/admin.css index cff38621b..9a8fe7b33 100644 --- a/modules/admin/tpl/css/admin.css +++ b/modules/admin/tpl/css/admin.css @@ -1,7 +1,6 @@ @charset "utf-8"; /* Element Reset */ header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{display:block} -body>.popup{margin:1em} .x, .x table, .x input, @@ -67,13 +66,18 @@ body>.popup{margin:1em} .x .table td>input[type=text]{margin:-1px 0 !important;vertical-align:middle} .x .table img{vertical-align:middle} .x .table em{font-style:normal;font-weight:normal;color:#e00} -.x .table .title, -.x .table .text{white-space:normal;width:100%} +.x .table th.title, +.x .table td.title, +.x .table th.text, +.x .table td.text{white-space:normal;width:100%} /* Form */ .x .form{margin:1em 0;padding:0} .x .form fieldset{margin:0 0 2em 0;padding:0;border:0} +.x .form.search fieldset{border:1px solid #ccc;padding:5px 15px;border-radius:3px} .x .form em{font-style:normal;color:#e00} -.x .form label{margin-right:1em;line-height:1;vertical-align:middle} +.x .form label{line-height:1;vertical-align:middle} +.x .form input[type=radio]+label, +.x .form input[type=checkbox]+label{margin-right:1em} .x .form input[type=checkbox]+label, .x .form input[type=radio]+label, .x .form input[type=file]{cursor:pointer} diff --git a/modules/admin/tpl/css/admin.min.css b/modules/admin/tpl/css/admin.min.css index 4d538728f..fa6f56599 100644 --- a/modules/admin/tpl/css/admin.min.css +++ b/modules/admin/tpl/css/admin.min.css @@ -1 +1 @@ -@charset "utf-8";/* Element Reset */header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{display:block}body>.popup{margin:1em}.x,.x table,.x input,.x textarea,.x select,.x button{font-family:Tahoma,Geneva,sans-serif;font-size:12px;color:#333}.x button,.x input[type=submit],.x input[type=reset],.x input[type=button]{cursor:pointer;overflow:visible}.x img{border:0}.x p{line-height:1.5}/* Section & Heading */.x .section{margin:1em 0;padding:0;border:0}.x .h1, .x .h2, .x .h3, .x .h4{position:relative;border-bottom-style:solid;zoom:1}.x .h1{border-bottom-width:4px;font-size:24px;border-bottom-color:#666}.x .h2{border-bottom-width:3px;font-size:20px;border-bottom-color:#888}.x .h3{border-bottom-width:2px;font-size:16px;border-bottom-color:#aaa}.x .h4{border-bottom-width:1px;font-size:12px;border-bottom-color:#ccc}.x .h1 + ul,.x .h2 + ul,.x .h3 + ul,.x .h4 + ul,.x .h1 + .table table, .x .h2 + .table table, .x .h3 + .table table, .x .h4 + .table table{border-top:0 !important;margin-top:-1em !important}/* Portlet */.x .portlet{position:relative;border:1px solid #e9e9e9;margin:1em 0;padding:0;background:#fff;zoom:1;overflow:hidden;border-radius:5px}.x .portlet h2, .x .portlet h3{margin:0;padding:.5em 1em;font-size:14px;border:1px solid #fff;border-bottom:1px solid #e9e9e9;background:#f7f7f7;border-radius:5px 5px 0 0}.x .portlet p{margin:1em 1.2em}.x .portlet li{position:relative;padding-right:8em}.x .portlet .lined{margin:1px !important;padding:0;list-style:none}.x .portlet .lined li{padding:.5em 8em .5em 1em;border-top:1px solid #eee;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis}.x .portlet .lined li:first-child{border:0}.x .portlet .side{position:absolute;top:0;_top:1px;right:0;color:#666;background:#fff;padding:0 1em}.x .portlet .lined .side{padding:.5em 1em}.x .portlet .more{position:absolute;top:.5em;right:1em;text-decoration:none !important;color:#666}.x .portlet .more span{color:#999}.x .portlet .action{text-align:right;top:0;right:0;padding:.5em 1em .5em 3em;background:#fff;background:-webkit-gradient(linear, 0% 0%, 100% 0%, from(rgba(255,255,255,0)), to(rgba(255,255,255,1)), color-stop(15%, #fff));background:-moz-linear-gradient(left, rgba(255,255,255,0) 0, rgba(255,255,255,1) 15%)}.x .portlet .action a,.x .portlet .action button{margin-left:1em}.x .portlet .btnArea{border-top:1px solid #ddd;margin:0;padding:.5em 1em;margin:0 1px 1px 1px;background:#f7f7f7;border-radius:0 0 5px 5px}/* Table */.x .table{margin:1em 0}.x .table table{width:100%;border:0;border-collapse:collapse;border-top:2px solid #ccc}.x .table caption{font-weight:bold;text-align:left;line-height:22px;padding:5px 0}.x .table caption:after{content:"";display:block;clear:both}.x .table caption a{font-weight:normal}.x .table caption em{float:right;margin-left:1em}.x .table caption strong{color:#e00}.x .table caption .side{float:right;font-weight:normal;margin-left:1em}.x .table th,.x .table td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd;white-space:nowrap}.x .table th{background:#f8f8f8}.x .table thead th{border-bottom:1px solid #999}.x .table tfoot td{font-weight:bold;background:#f8f8f8}.x .table.even tbody tr:nth-of-type(even) td{background-color:#fafafa}.x .table td>input[type=text]{margin:-1px 0 !important;vertical-align:middle}.x .table img{vertical-align:middle}.x .table em{font-style:normal;font-weight:normal;color:#e00}.x .table .title,.x .table .text{white-space:normal;width:100%}/* Form */.x .form{margin:1em 0;padding:0}.x .form fieldset{margin:0 0 2em 0;padding:0;border:0}.x .form em{font-style:normal;color:#e00}.x .form label{margin-right:1em;line-height:1;vertical-align:middle}.x .form input[type=checkbox]+label,.x .form input[type=radio]+label,.x .form input[type=file]{cursor:pointer}.x .form ul{position:relative;margin:1em 0;padding:0;list-style:none;border-top:2px solid #ccc;border-bottom:1px solid #ccc;zoom:1}.x .form li{list-style:none;border:1px solid #ddd;border-left:0;border-right:0;margin:-1px 0;padding:8px 0;vertical-align:top;zoom:1}.x .form li:first-child{border-top:0}.x .form li>label:first-child{display:block;font-weight:bold}.x .form li label em{font-weight:normal}.x .form label.overlap{position:absolute;color:#aaa}.x .form input[type=text],.x .form input[type=password],.x .form input[type=file],.x .form textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:transparent}.x .form input[type=text],.x .form input[type=password],.x .form input[type=file]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px}.x .form input[type=text].loading,.x .form input.loading[type=password]{padding-right:24px;width:260px;background:transparent url(../img/preLoader16.gif) no-repeat 265px center}.x .form input[type=checkbox],.x .form input[type=radio]{margin:0;padding:0;width:13px;height:13px;vertical-align:middle}.x .form input[type=text][disabled=disabled],.x .form input[type=password][disabled=disabled],.x .form input[type=radio][disabled=disabled],.x .form input[type=checkbox][disabled=disabled],.x .form select[disabled=disabled],.x .form textarea[disabled=disabled]{background:#ddd;text-shadow:1px 1px 0 #fff}.x .form textarea{padding:3px 4px;vertical-align:top}.x .form span.desc, .x .form em.desc{line-height:22px;vertical-align:middle;margin:0 10px}.x .form p.desc{margin:.25em 0;line-height:1.4}.x .form .q{font-weight:bold;margin:0 0 5px 0}.x .form .a{margin:0 0 5px 0}.x .form .tgForm{margin-right:1em}/* Global Navigation Bar */.x .gnb{position:relative;clear:both;border:1px solid #c1c1c1;border-left:0;border-right:0;background-color:#efefef;background:#efefef -webkit-gradient(linear, 0% 0%, 0% 100%, from(#efefef), to(#dcdcdc));background:#efefef -moz-linear-gradient(top, #efefef, #dcdcdc);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#efefef, endColorStr=#dcdcdc);zoom:1}.x .gnb ul{margin:0;padding:0 0 0 20px;list-style:none;border:1px solid #fff;border-left:0;border-right:0;zoom:1}.x .gnb ul ul{position:absolute;top:30px;left:0;border:1px solid #ccc;border-top:0;padding:1px 0 0 0;background:#fff}.x .gnb ul:after{content:"";display:block;clear:both}.x .gnb li{position:relative;float:left;border:1px solid #fff;border-top:0;border-bottom:0;margin:0 -1px 0 0}.x .gnb li li{float:none;clear:both;overflow:hidden;border:0;border-top:1px dotted #ccc;margin:0;padding:2px}.x .gnb li li:first-child{border:0}.x .gnb li a{float:left;font-weight:bold;color:#333;font-size:12px;padding:8px 18px;white-space:nowrap;text-decoration:none;text-shadow:0 1px 0 #fff;zoom:1}.x .gnb li a:hover,.x .gnb li a:active,.x .gnb li a:focus,.x .gnb li.active a{background:#f4f4f4;border:1px solid #ccc;border-bottom:0;padding:7px 17px 8px 17px}.x .gnb li.activeOn a{background:#fff;border:1px solid #ccc;border-bottom:0;padding:7px 17px 8px 17px}.x .gnb li.active li a{display:block;float:none;color:#555;background:#fff;padding:5px 15px !important;font-weight:normal !important;border:0 !important}.x .gnb li.active li a:hover,.x .gnb li.active li a:active,.x .gnb li.active li a:focus{border:0;background:#eee}.x .gnb .setting{position:absolute;top:8px;right:2em;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;background:url(../img/iconSetting.gif) no-repeat center}.x .gnb.jx ul{display:block;position:static;padding:0}.x .gnb.jx li{float:none;clear:both;border-top:1px solid #ccc}.x .gnb.jx ul ul{border:0}.x .gnb.jx li li{border:0}.x .gnb.jx li a{float:none;display:block}.x .gnb.jx li a:hover,.x .gnb.jx li a:active,.x .gnb.jx li a:focus{background:none}.x .gnb.jx li.activeOn>a{background:#ddd}@media only all and (max-width:860px){.x .gnb ul{padding-left:1em}.x .gnb .setting{right:1em}}@media only all and (max-width:640px){.x .gnb ul{display:block;position:static;padding:0}.x .gnb li{float:none;clear:both;border-top:1px solid #ccc}.x .gnb ul ul{border:0;position:static}.x .gnb li li{border:0}.x .gnb li a{float:none;display:block}.x .gnb li a:hover,.x .gnb li a:active,.x .gnb li a:focus{background:none}.x .gnb li.activeOn>a{background:#ddd}}/* Favorite */.x .bmk{position:absolute;right:20px;bottom:10px;padding:0 0 0 20px;background:url(../img/iconFavorite.gif) no-repeat 0 -16px}.x .bmk>a{text-shadow:0 1px 0 #fff}.x .bmk ul{position:absolute;top:140%;right:0;list-style:none;margin:0;padding:5px 10px;border:1px solid #aaa;border-radius:5px;background:#fff;box-shadow:1px 1px 3px #aaa}.x .bmk li{position:relative;padding:3px 30px 3px 0;white-space:nowrap}.x .bmk li .action{position:absolute;top:0;right:0}.x .bmk li .action .text{text-decoration:none;width:16px;text-align:center;margin:0}@media only all and (max-width:640px){.x .bmk{position:static;background-color:#fff;padding:10px 20px;background:#fff}.x .bmk .tgAnchor{display:block}.x .bmk ul{position:relative;border:0;border-top:1px solid #ccc;border-radius:0;box-shadow:none;padding:0;margin:5px 0 0 0}.x .bmk li{position:relative;top:-1px;border-top:1px dotted #ccc}}/* Local Navigation */.x .lnb{position:relative;float:left;width:210px;margin:1em 0 1em -240px;line-height:normal;zoom:1;display:inline}.x .lnb .h2{margin-top:0}.x .lnb ul{margin:0 !important;padding:0;list-style:none}.x .lnb li{position:relative;margin:0 0 -1px 0;vertical-align:top;zoom:1}.x .lnb li a{display:block;position:relative;padding:8px 10px;text-decoration:none;color:#666;font-weight:bold;background:#fafafa;border:1px solid #eee;zoom:1}.x .lnb li a .i{position:absolute;top:50%;left:100%;margin:-4px 0 0 -16px;width:8px;height:8px;color:#ccc;background:url(../img/iconNavVr.gif) no-repeat left top}.x .lnb li ul{padding:5px 0;background:#fff}.x .lnb li li{margin:0;border-top:1px dotted #ddd}.x .lnb li li:first-child{border:0}.x .lnb li li a{font-weight:normal;background:#fff;padding:5px 10px;border:0}.x .lnb li li a span{color:#666}.x .lnb li.active{border:1px solid #ccc;z-index:2}.x .lnb li li.active{border:0}.x .lnb li.active a{color:#000;border:0}.x .lnb li.active .i{background-position:0 -44px}.x .lnb li.active li a{border:0}.x .lnb li.active ul{display:block;border-top:1px solid #eee}.x .lnb li.active li.active a span{color:#13b200;font-weight:bold;letter-spacing:-1px}/* Content Navigation */.x .cnb{margin:1em 0;position:relative;zoom:1}.x .cnb:after{content:"";display:block;clear:both}.x .cnb ul{list-style:none;margin:0;padding:0}.x .cnb li{display:inline}.x .cnb li:before{content:"| ";color:#ccc}.x .cnb li:first-child:before{content:""}.x .cnb .active,.x .cnb .active a{font-weight:bold;color:#333;text-decoration:none}.x .cnb .side{float:right}/* Pagination */.x .pagination{margin:1em 0;text-align:center;line-height:normal}.x .pagination *{vertical-align:middle}.x .pagination a,.x .pagination strong{position:relative;display:inline-block;padding:2px 4px;font-weight:bold;text-decoration:none;line-height:normal;color:#333 !important;vertical-align:middle}.x .pagination a:hover,.x .pagination a:active,.x .pagination a:focus{border:1px solid #ddd;margin:0 -1px}.x .pagination strong{color:#e00 !important;font-size:20px}.x .pagination .direction{font-weight:normal;white-space:nowrap}.x .pagination .direction:hover,.x .pagination .direction:active,.x .pagination .direction:focus{border:0;margin:0;text-decoration:underline}.x .pagination input{width:30px;text-align:center}.x .pagination button{overflow:visible}/* Star Rating */.x .starRating, .x .starRating span{display:inline-block;height:14px;background:transparent url(../img/iconStarRating.gif) no-repeat;overflow:hidden}.x .starRating{width:79px;vertical-align:top}.x .starRating span{font-size:0;line-height:0;vertical-align:top;text-indent:-100px;*text-indent:0;background-position:0 -14px}/* Progress */.x .prgrs{white-space:nowrap;line-height:normal;vertical-align:middle}.x .prgrs *{vertical-align:middle}.x .prgrs .pBar{position:relative;display:inline-block;background:#e9e9e9;margin:0 5px 0 0}.x .prgrs .pAction{display:inline-block;vertical-align:top;background:#99a6b6}.x .prgrs .pNum{position:absolute;width:100%;left:0;top:0;text-align:center;text-shadow:1px 1px 0 #fff}.x .prgrs.prgrsSmall{font-size:14px;line-height:14px}.x .prgrs.prgrsSmall .pBar,.x .prgrs.prgrsSmall .pAction,.x .prgrs.prgrsSmall .pNum{height:16px;line-height:16px;font-size:11px}.x .prgrs.prgrsMedium{font-size:24px;line-height:24px}.x .prgrs.prgrsMedium .pBar,.x .prgrs.prgrsMedium .pAction,.x .prgrs.prgrsMedium .pNum{height:22px;line-height:22px;font-size:12px}.x .prgrs.prgrsLarge{font-size:38px;line-height:38px}.x .prgrs.prgrsLarge .pBar,.x .prgrs.prgrsLarge .pAction,.x .prgrs.prgrsLarge .pNum{height:34px;line-height:34px;font-size:14px}/* Modal Window */.modal{position:absolute;top:0;left:0;width:100%;_height:100%;min-height:100%;z-index:100}.modal .bg{position:absolute;background:#000;_background:none;width:100%;height:100%;opacity:.5;z-index:2;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1}.modal .fg{position:relative;width:80%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:3;zoom:1;border-radius:5px;box-shadow:0 0 6px #000}.modal ul, .modal ol, .modal .lined, .modal .table{margin-bottom:1em}.modal .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1}.modalClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px}.modalBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}html.modalContainer,body.modalContainer{_height:100%;_width:100%} /* IE6 only */ /* Layer */.x .layer,.x.layer{position:absolute;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:2;zoom:1;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;box-shadow:0 0 6px #666;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x .layer h2{font-size:14px}.x .layer ul, .x .layer ol, .x .layer .lined, .x .layer .table{margin-bottom:1em}.x .layerClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px}.x .layerBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}/* H2 Anchor */.x .h2Anchor{position:absolute;right:0;border:0;background:none;color:#00f;text-decoration:underline}/* Skip Navigation */.x .skipNav{margin:0;text-align:center}.x .skipNav a{position:absolute;width:1px;height:1px;display:block;font-weight:bold;padding:10px 0}.x .skipNav a:hover,.x .skipNav a:active,.x .skipNav a:focus{position:relative;width:auto;height:auto}/* Header */.x .header{position:relative;z-index:2;padding:30px 0 0 0;background:#4c4c4c;box-shadow:0 0 10px #aaa;zoom:1;border-radius:5px 5px 0 0}.x .header:after{content:"";display:block;clear:both}.x .header a{text-decoration:none}.x .header h1{margin:0 15px 10px 20px;font-size:24px;line-height:32px;display:inline-block;zoom:1}.x .header h1 *{vertical-align:middle}.x .header h1 a{color:#fff;text-shadow:1px 1px 0 #000;filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=1, OffY=1, Color=#000000, Positive=true);zoom:1}.x .header h1 .url{font-size:12px;font-weight:normal}.x .header .site{margin:0;display:inline-block;zoom:1}.x .header .site a{color:#fff;text-decoration:underline}.x .header #moveSiteList{padding:10px 1em 5px 1em;margin:0}.x .header #moveSiteList ul{list-style:none;margin:0;padding:0}.x .header #moveSiteList li{white-space:nowrap;margin:0;padding:4px 0;border-bottom:1px dotted #ccc}.x .header #siteMapList{padding:0 1em 1em 1em;margin:0}.x .header #siteMapList li{white-space:nowrap}.x .header .account{position:absolute;z-index:3;width:100%;top:0;right:0;white-space:nowrap;text-align:right;background:#333;border-bottom:1px solid #656565;color:#fff;font-size:12px;border-radius:5px 5px 0 0}.x .header .account ul{margin:0 2px 0 0;padding:5px 20px 5px 0;list-style:none}.x .header .account li{position:relative;display:inline;border-left:1px solid #666;padding:0 6px 0 10px}.x .header .account li:first-child{border:0}.x .header .account a{color:#fff;display:inline-block;height:14px}.x .header .account a.language{padding-right:16px;background:url(../img/iconArrow.gif) no-repeat right -160px}.x .header #language{position:absolute;top:19px;right:-2em;padding:6px 4px !important;border:1px solid #666;border-top:0;background:#333}.x .header #language li{border:0;display:block;padding:1px 8px 1px 10px;text-align:left;line-height:1}.x .header #language li.selected{background:url(../img/iconCheck.gif) no-repeat left center}.x .header #language li.selected a{text-decoration:underline}.x .header h1 a:hover,.x .header h1 a:active,.x .header h1 a:focus,.x .header .account a:hover,.x .header .account a:active,.x .header .account a:focus{color:#6e9cf2;text-decoration:underline}/* Footer */.x .footer{border-top:1px solid #ddd;text-align:center;font-size:12px;padding:1.5em 0;zoom:1}.x .footer:after{content:"";display:block;clear:both}.x .footer p{margin:0}.x .footer .power{float:left}.x .footer .cache{float:right}/* Body */.x .body{position:relative;z-index:1;padding:1em 20px 1em 260px;zoom:1}.x .body:after{content:"";display:block;clear:both}/* Content */.x .content{float:right;width:100%;margin-left:-230px;zoom:1}.x .content:after{content:"";display:block;clear:both}.x .content a{color:#33a}.x .content a:hover,.x .content a:active,.x .content a:focus{color:#a33}.x .content .portlet a{text-decoration:none}.x .content .portlet a:hover,.x .content .portlet a:active,.x .content .portlet a:focus{text-decoration:underline}/* Dashboard */.x .dashboard{position:relative;float:none;width:auto;margin-left:-230px}.x .dashboard .portlet{float:left;width:48%;margin-right:1em}.x .dashboard .portlet:nth-of-type(odd){float:left;width:49%;margin-right:0}.x .dashboard .portlet:nth-of-type(even){float:right;width:49%;margin-right:0}@media only all and (min-width:1300px){.x .dashboard .portlet{float:left !important;width:32% !important;margin-right:1em !important}}/* Single Column*/.x .single{position:relative;float:none;width:auto;margin-left:-240px}/* Search */.x .search{zoom:1}.x .search:after{content:"";display:block;clear:both}.x .search .pagination{float:left;text-align:left}.x .search form{float:right;margin:1em 0}.x .search form *{vertical-align:middle}/* Site Map */.x .siteMap h2 input{font-size:14px;font-weight:bold;padding:0 .5em}.x .siteMap label{cursor:text}.x .siteMap .lined ul{padding:0;margin:0;border-top:1px solid #eee;zoom:1}.x .siteMap .lined li{position:relative;padding:0;margin:0;cursor:all-scroll;list-style:none;zoom:1}.x .siteMap .lined li li{border-top:1px solid #eee}.x .siteMap li li{text-indent:18px}.x .siteMap li li li{text-indent:36px}.x .siteMap li li li li{text-indent:54px}.x .siteMap li li li li li{text-indent:72px}.x .siteMap li li li li li li{text-indent:90px}.x .siteMap li li li li li li li{text-indent:108px}.x .siteMap li li li li li li li li{text-indent:126px}.x .siteMap li li li li li li li li li{text-indent:144px}.x .siteMap li li li li li li li li li li{text-indent:162px}.x .siteMap li li li li li li li li li li li{text-indent:180px}.x .siteMap li li li li li li li li li li li li{text-indent:198px}.x .siteMap li *{vertical-align:middle}.x .siteMap li .moveTo+input{width:200px;border:0;padding:0 .5em}.x .siteMap li .moveTo+input:hover,.x .siteMap li .moveTo+input:active,.x .siteMap li .moveTo+input:focus{border:1px dotted #ccc;overflow:visible}.x .siteMap .moveTo{position:relative;z-index:2;width:22px;height:32px;padding:32px 0 0 0;margin:0 3px;_margin-top:-1px;overflow:hidden;background:#fff url(../img/iconMoveTo.gif) no-repeat center 0;border:0;cursor:move}.x .siteMap li.active,.x .siteMap li.active .moveTo{background-color:#f7f7f7}.x .siteMap li.active li,.x .siteMap li.active ul{border-top-color:#f7f7f7}.x .siteMap li.active .moveTo{background-position:center -32px}.x .siteMap .vr,.x .siteMap .hr{display:none;position:absolute;z-index:1;left:14px;border:0px solid #ccc;overflow:hidden}.x .siteMap .vr{top:-16px;height:100%;border-left-width:1px}.x .siteMap .hr{top:16px;width:16px;border-top-width:1px}.x .siteMap li.active .vr,.x .siteMap li.active li .hr{display:block}.x .siteMap li li .vr,.x .siteMap li li li .hr{left:32px}.x .siteMap li li li .vr,.x .siteMap li li li li .hr{left:50px}.x .siteMap li li li li .vr,.x .siteMap li li li li li .hr{left:68px}.x .siteMap li li li li li .vr,.x .siteMap li li li li li li .hr{left:86px}.x .siteMap li li li li li li .vr,.x .siteMap li li li li li li li .hr{left:104px}.x .siteMap li li li li li li li .vr,.x .siteMap li li li li li li li li .hr{left:122px}.x .siteMap li li li li li li li li .vr,.x .siteMap li li li li li li li li li .hr{left:140px}.x .siteMap li li li li li li li li li .vr,.x .siteMap li li li li li li li li li li .hr{left:158px}.x .siteMap li li li li li li li li li li .vr,.x .siteMap li li li li li li li li li li li .hr{left:176px}.x .siteMap li li li li li li li li li li li .vr,.x .siteMap li li li li li li li li li li li li .hr{left:336px}.x .siteMap .side{padding-top:0 !important;padding-bottom:0 !important;line-height:30px;background:transparent !important}.x .siteMap .side button{text-indent:0;line-height:1}.x .siteMap .tgMap{position:absolute;top:12px;right:1em;padding:0 16px 0 0;line-height:16px;background:url(../img/iconArrow.gif) no-repeat right -126px}.x .siteMap.fold .tgMap{background-position:right -158px}.x .siteMap.fold .h2{border-bottom-color:#fff;border-radius:5px}.x .siteMap .placeholder{background:#bbb}.x .siteMap .draggable,.x .siteMap .draggable .moveTo{background-color:#ddd}.x .siteMap .draggable .summary{border-left:1px solid #ccc;padding-left:10px;margin-left:10px;font-size:11px;color:#999}.x .siteMap a.ms{text-decoration:underline}/* Multilingual */.x .langEdit{background:#fff;position:absolute;*left:0;*margin-top:28px;z-index:10}.x .langEdit ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0}.x .langEdit li{padding:.5em 10px}.x .langEdit input[type=text]{width:220px;padding-right:40px}.x .langEdit label{left:15px !important}.x .langEdit .action{border:1px solid #eee;width:268px;padding:0 10px}.x .langEdit p, .x .langEdit .btnArea{white-space:normal}.x .langEdit .langList,.x .langEdit .langEditControls{box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x .langEdit .langList{margin:0 -1px 0 0;display:none}.x .langEdit .langList li{white-space:nowrap;color:#ccc;width:270px} .x .langEdit .langList li span{display:inline-block;width:80px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:#767676}.x .langEdit .langList li a{display:inline-block;width:80px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.x .langEdit .langList li.active{background:url(../img/iconArrow.gif) no-repeat right -188px}.x .langEdit.showChild .langList{display:block}.x .langEdit .langInput{background:#fff}.x .langEdit .langInput h2{padding:5px 10px;margin:0 0 -1px 0;font-size:12px;font-weight:normal;color:#666;border:1px solid #eee;border-top-color:#ccc}.x .langEdit .langInput h2 strong{color:#000;font-size:14px}.x .langEdit.showChild .langInput{position:absolute;left:285px;top:0}.x .langEdit li.en input, .x .langEdit li.en textarea, .x .mLangEdit li.en textarea{background:url(../img/flag.us.gif) no-repeat 99% 5px}.x .langEdit li.ko input, .x .langEdit li.ko textarea, .x .mLangEdit li.ko textarea{background:url(../img/flag.kr.gif) no-repeat 99% 5px}.x .langEdit li.jp input, .x .langEdit li.jp textarea, .x .mLangEdit li.jp textarea{background:url(../img/flag.jp.gif) no-repeat 99% 5px}.x .langEdit li.fr input, .x .langEdit li.fr textarea, .x .mLangEdit li.fr textarea{background:url(../img/flag.fr.gif) no-repeat 99% 5px}.x .langEdit li.de input, .x .langEdit li.de textarea, .x .mLangEdit li.de textarea{background:url(../img/flag.de.gif) no-repeat 99% 5px}.x .langEdit li.ru input, .x .langEdit li.ru textarea, .x .mLangEdit li.ru textarea{background:url(../img/flag.ru.gif) no-repeat 99% 5px}.x .langEdit li.es input, .x .langEdit li.es textarea, .x .mLangEdit li.es textarea{background:url(../img/flag.es.gif) no-repeat 99% 5px}.x .langEdit li.tr input, .x .langEdit li.tr textarea, .x .mLangEdit li.tr textarea{background:url(../img/flag.tr.gif) no-repeat 99% 5px}.x .langEdit li.vi input, .x .langEdit li.vi textarea, .x .mLangEdit li.vi textarea{background:url(../img/flag.vn.gif) no-repeat 99% 5px}.x .langEdit li.mn input, .x .langEdit li.mn textarea, .x .mLangEdit li.mn textarea{background:url(../img/flag.mn.gif) no-repeat 99% 5px}.x .langEdit li.zh-CN input, .x .langEdit li.zh-CN textarea, .x .mLangEdit li.zh-CN textarea{background:url(../img/flag.cn.gif) no-repeat 99% 5px}.x .langEdit li.zh-TW input, .x .langEdit li.zh-TW textarea, .x .mLangEdit li.zh-TW textarea{background:url(../img/flag.tw.gif) no-repeat 99% 5px}.x .mLangEdit.en strong{background:url(../img/flag.us.gif) no-repeat 0 10px}.x .mLangEdit.ko strong{background:url(../img/flag.kr.gif) no-repeat 0 10px}.x .mLangEdit.jp strong{background:url(../img/flag.jp.gif) no-repeat 0 10px}.x .mLangEdit.fr strong{background:url(../img/flag.fr.gif) no-repeat 0 10px}.x .mLangEdit.de strong{background:url(../img/flag.de.gif) no-repeat 0 10px}.x .mLangEdit.ru strong{background:url(../img/flag.ru.gif) no-repeat 0 10px}.x .mLangEdit.es strong{background:url(../img/flag.es.gif) no-repeat 0 10px}.x .mLangEdit.tr strong{background:url(../img/flag.tr.gif) no-repeat 0 10px}.x .mLangEdit.vi strong{background:url(../img/flag.vn.gif) no-repeat 0 10px}.x .mLangEdit.mn strong{background:url(../img/flag.mn.gif) no-repeat 0 10px}.x .mLangEdit.zh-CN strong{background:url(../img/flag.cn.gif) no-repeat 0 10px}.x .mLangEdit.zh-TW strong{background:url(../img/flag.tw.gif) no-repeat 0 10px}.x .mLangEdit ul ul{border:0}.x .mLangEdit li{position:relative;padding:0}.x .mLangEdit li strong{display:inline-block;padding:6px 100px 8px 24px;font-weight:normal;line-height:1.5}.x .mLangEdit li .side{position:absolute;top:8px;right:0;padding-right:18px;background:url(../img/iconArrow.gif) no-repeat right -160px}.x .mLangEdit li li{border:0;padding-right:36px}.x .mLangEdit li textarea{width:100%;height:16px;padding-right:30px;resize:vertical;line-height:1.4}.x .mLangEdit li label{top:8px !important}.x .mLangEdit li.active{background:#FFFDEF}.x .mLangEdit li.active strong{font-weight:bold}.x .mLangEdit li.active .side{background-position:right -128px}.modal .mLangEdit ul{padding-bottom:1em}.modal .mLangEdit li{border:0;padding-right:36px}/* Suggestion */.x .suggestion{display:none;position:absolute;background:#fff;z-index:10;_height:200px;max-height:200px;overflow:auto;*left:0;*margin-top:28px;box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x .suggestion ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0}.x .suggestion li{padding:0}.x .suggestion li:last-child{border-bottom:0}.x .suggestion li button{border:0;background:#fff;text-align:left;width:288px;padding:2px 4px;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.x .suggestion li button:hover,.x .suggestion li button:active,.x .suggestion li button:focus,.x .suggestion li button.active{background:#eee}/* Image Mark */.x #imageMark{right:0}/* Easy Installer */.x .easyNav{position:relative;border:1px solid #e9e9e9;zoom:1}.x .easyNav:after{content:"";display:block;clear:both}.x .easyNav h2{font-size:16px}.x .easyNav .category{width:30%;float:left;margin:0 2em;display:inline}.x .easyNav .filter{position:absolute;top:0;right:0;margin:1em 2em;text-align:right}.x .easyList td p{margin-top:0}.x .easyList td p.update{background:#ffc;padding:.5em 1em;border:1px solid #fc9;border-left:0;border-right:0;text-align:center}/* Font Preview */.x .fontPreview{width:96%;border:1px solid #e9e9e9;zoom:1;padding:1em 2em;margin:.5em 0}/* FTP Suggestion */.x #ftpSuggestion{background:#fff;box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x #ftpSuggestion ul{border-left:1px solid #eee;border-right:1px solid #eee}.x #ftpSuggestion li{padding:0}.x #ftpSuggestion li button{border:0;background:#fff;text-align:left;width:288px}.x #ftpSuggestion li button:hover,.x #ftpSuggestion li button:active,.x #ftpSuggestion li button:focus{background:#eee}/* Theme & Skin Preview */.x .thumbPreview li{position:relative;padding-left:10px;padding-right:10px}.x .thumbPreview li.active.highlight{background:#f9f9f9}.x .thumbPreview .prevToggle{position:absolute;top:8px;right:10px;line-height:16px;padding:0 18px 0 0;text-decoration:none;background:url(../img/iconArrow.gif) no-repeat right -32px}.x .thumbPreview li.active .prevToggle{background-position:right 0}.x .thumbPreview .a{border:0;margin:0;zoom:1}.x .thumbPreview .a:after{content:"";display:block;clear:both}.x .thumbPreview .i{float:left;vertical-align:top;margin:0 1em 1em 0;padding:0;border:0;zoom:1}.x .thumbPreview .i:after{content:"";display:block;clear:both}.x .thumbPreview .i .thumb{position:relative;width:124px;height:84px;padding:0;margin-bottom:3px;text-align:center;overflow:hidden;border:1px solid #ddd;display:block;cursor:pointer;background:#fff}.x .thumbPreview .i .thumb .frame{position:absolute;width:120px;height:80px;left:0;top:0;border:2px solid #fff;overflow:hidden}.x .thumbPreview .i .thumb img{width:120px;margin:0}.x .thumbPreview .i label{display:block;position:relative;top:0;left:2px;width:122px;height:1.1em;margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x .thumbPreview .i input{display:none}.x .thumbPreview .i ul{display:none}.x .thumbPreview .selected .i{display:block;float:none}.x .thumbPreview .selected .i .thumb{float:left;width:186px;height:126px;margin:0 1em 0 0;border:2px solid #eee}.x .thumbPreview .selected .i .thumb .frame{width:180px;height:120px;border-width:3px}.x .thumbPreview li.active.highlight .selected .i .thumb{border-color:#5ea8f6}.x .thumbPreview .selected .i .thumb img{width:180px;position:relative}.x .thumbPreview li.active .selected .i .thumb img{z-index:auto}.x .thumbPreview .selected .i label{cursor:text}.x .thumbPreview .selected .i ul{display:block;list-style:none;border:0;margin:1em 0 1em 200px}.x .thumbPreview .selected .i li{border:0;padding:0;margin:0 0 .2em 0}.x .thumbPreview.jx .i label{display:inline;width:auto}.x .thumbPreview.jx .i.noDirection{display:none}.x .thumbPreview.jx .i input{display:inline}.x #skin .showAll{float:right;border:0;overflow:visible;padding:0 18px 0 0;cursor:pointer;color:#00f;background:url(../img/iconArrow.gif) no-repeat right -32px}.x #skin .showAll.hideAll{background-position:right 0}/* Favorite On | Off */.x .fvOff,.x .fvOn{display:inline-block;width:16px;height:16px;overflow:hidden;text-indent:16px;background:url(../img/iconFavorite.gif) no-repeat}.x .fvOn{background-position:0 -16px}/* Up-Down Dragable */.x .uDrag .wrap{position:relative;padding-left:20px}.x .uDrag li>.wrap{margin:0 0 0 8px}.x .uDrag .dragActive{background:#FFD}.x .uDrag .dragActive th,.x .uDrag .dragActive td{background:none !important}.x .uDrag .dragBtn{position:absolute;width:8px;height:100%;padding:0;overflow:hidden;background:url(../img/bgDragable.gif);top:1px;left:0;text-indent:12px;border:0;cursor:n-resize;white-space:nowrap}/* Favicon Preview */.x .faviconPreview{position:relative;padding:60px 0 0 200px;background:url(../img/bgFavicon.gif) no-repeat}.x .faviconPreview img{position:absolute}.x .faviconPreview .fn1{top:30px;left:12px}.x .faviconPreview .fn2{top:55px;left:68px}/* Mobile Icon Preview */.x .mobiconPreview{position:relative;padding:252px 0 0 200px;background:url(../img/bgMobileTop.png) no-repeat}.x .mobiconPreview img{position:absolute;top:20px;left:10px}.x .mobiconPreview span{position:absolute;width:32px;text-align:center;top:52px;left:10px;color:#fff;font-size:9px}/* Text List */.x .textList{border:1px solid #ddd !important;line-height:1.5em;height:18.5em;overflow:auto}.x .textList li{border:0;padding:.25em 1em;height:1.5em;white-space:nowrap;overflow:hidden}.x .textList li:nth-child(even){background:#eee}.x .textList li a{float:right}/* File Box */.x .fileBox li{position:relative}.x .fileBox li img{max-width:100%}.x .fileBox .portlet ul{margin:1em;list-style:none;padding:0;border:0}.x .fileBox .portlet li{border-top:1px solid #ddd;border-bottom:0;padding:8px 0}.x .fileBox .side{position:absolute;top:8px;right:0}/* Messages */.x .desc.error{color:#f00}.x .desc.success{color:#080}/* Icon Button */.x a.iSetting{display:inline-block;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;vertical-align:middle;background:url(../img/iconSetting.gif) no-repeat}.x a.cMenu{display:inline-block;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;vertical-align:middle;background:url(../../../../common/img/icon.bubble.png) no-repeat}/* Responsive Layout */@media only all and (max-width:860px){.x .header h1{margin-left:.7em}.x .header .account ul{padding-right:10px}.x .body{padding:0}.x .content{float:none;margin-left:0}.x .lnb{float:none;width:auto;margin:1em 0}.x .dashboard .portlet{float:none !important;width:auto !important;margin-right:0}.modal .fg,.wfsr .fg{width:auto}.x .easyNav .category{float:none;display:block;width:auto}.x .easyNav .filter{position:static}}@media only all and (max-width:640px){.x .skipNav a{position:relative;width:auto;height:auto}.modal{position:absolute}}/* Legacy Code (Don't use it. It will be removed as soon as possible.) */.x h3.xeAdmin,.x h4.xeAdmin{position:relative;border-bottom-style:solid;border-bottom-color:#ccc;zoom:1}.x h3.xeAdmin{border-bottom-width:4px;font-size:24px}.x h4.xeAdmin{border-bottom-width:3px;font-size:20px}.x h5.xeAdmin{border-bottom-width:2px;font-size:16px}.x h6.xeAdmin{border-bottom-width:1px;font-size:12px}.x .adminSearch{margin:1em 0}.x .adminSearch fieldset{border:1px solid #ccc;margin:0;padding:.5em 1em}.x .localNavigation{padding:0;list-style:none}.x .localNavigation li{display:inline}.x .localNavigation li.on a{font-weight:bold;color:#333;text-decoration:none}.x .localNavigation li:before{content:"| "}.x .localNavigation li:first-child:before{content:""}.x .summary{margin:1em 0}.x .rowTable,.x .colTable,.x .crossTable{margin:1em 0;border:0;border-collapse:collapse;border-top:2px solid #ccc;width:100%}.x .rowTable caption,.x .colTable caption,.x .crossTable caption{font-weight:bold;text-align:left;line-height:22px;padding:5px 0}.x .rowTable caption:after,.x .colTable caption:after,.x .crossTable caption:after{content:"";display:block;clear:both}.x .rowTable caption a,.x .colTable caption a,.x .crossTable caption a{font-weight:normal}.x .rowTable caption em,.x .colTable caption em,.x .crossTable caption em{float:right;font-style:normal;font-weight:normal;color:#e00;margin-left:1em}.x .rowTable caption strong,.x .colTable caption strong,.x .crossTable caption strong{color:#e00}.x .rowTable caption .side,.x .colTable caption .side,.x .crossTable caption .side{float:right;font-weight:normal;margin-left:1em}.x .rowTable th,.rowTable td,.x .colTable th,.rowTable td,.x .crossTable th,.rowTable td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd;white-space:nowrap}.x .rowTable th,.x .colTable th,.x .crossTable th{background:#f8f8f8}.x .rowTable thead th,.x .colTable thead th,.x .crossTable thead th{border-bottom:1px solid #999}.x .rowTable tfoot td,.x .colTable tfoot td,.x .crossTable tfoot td{font-weight:bold;background:#f8f8f8}.x .rowTable.even tbody tr:nth-of-type(even) td,.x .colTable.even tbody tr:nth-of-type(even) td,.x .crossTable.even tbody tr:nth-of-type(even) td{background-color:#fafafa}.x .rowTable td>input[type=text],.x .colTable td>input[type=text],.x .crossTable td>input[type=text]{margin:-1px 0 -3px 0 !important;vertical-align:middle}.x .rowTable img,.x .colTable img,.x .crossTable img{vertical-align:middle}.x .rowTable .title,.x .colTable .title,.x .crossTable .title,.x .rowTable .text,.x .colTable .text,.x .crossTable .text{white-space:normal}.x .rowTable input[type=text],.x .colTable input[type=text],.x .crossTable input[type=text],.x .rowTable input[type=password],.x .colTable input[type=password],.x .crossTable input[type=password],.x .rowTable input[type=file],.x .colTable input[type=file],.x .crossTable input[type=file],.x .rowTable textarea,.x .colTable textarea,.x .crossTable textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:transparent}.x .rowTable input[type=text],.x .colTable input[type=text],.x .crossTable input[type=text],.x .rowTable input[type=password],.x .colTable input[type=password],.x .crossTable input[type=password],.x .rowTable input[type=file],.x .colTable input[type=file],.x .crossTable input[type=file]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px}.x .clear:after{content:"";display:block;clear:both} \ No newline at end of file +@charset "utf-8";/* Element Reset */header,footer,section,article,aside,nav,hgroup,details,menu,figure,figcaption{display:block}.x,.x table,.x input,.x textarea,.x select,.x button{font-family:Tahoma,Geneva,sans-serif;font-size:12px;color:#333}.x button,.x input[type=submit],.x input[type=reset],.x input[type=button]{cursor:pointer;overflow:visible}.x img{border:0}.x p{line-height:1.5}/* Section & Heading */.x .section{margin:1em 0;padding:0;border:0}.x .h1, .x .h2, .x .h3, .x .h4{position:relative;border-bottom-style:solid;zoom:1}.x .h1{border-bottom-width:4px;font-size:24px;border-bottom-color:#666}.x .h2{border-bottom-width:3px;font-size:20px;border-bottom-color:#888}.x .h3{border-bottom-width:2px;font-size:16px;border-bottom-color:#aaa}.x .h4{border-bottom-width:1px;font-size:12px;border-bottom-color:#ccc}.x .h1 + ul,.x .h2 + ul,.x .h3 + ul,.x .h4 + ul,.x .h1 + .table table, .x .h2 + .table table, .x .h3 + .table table, .x .h4 + .table table{border-top:0 !important;margin-top:-1em !important}/* Portlet */.x .portlet{position:relative;border:1px solid #e9e9e9;margin:1em 0;padding:0;background:#fff;zoom:1;overflow:hidden;border-radius:5px}.x .portlet h2, .x .portlet h3{margin:0;padding:.5em 1em;font-size:14px;border:1px solid #fff;border-bottom:1px solid #e9e9e9;background:#f7f7f7;border-radius:5px 5px 0 0}.x .portlet p{margin:1em 1.2em}.x .portlet li{position:relative;padding-right:8em}.x .portlet .lined{margin:1px !important;padding:0;list-style:none}.x .portlet .lined li{padding:.5em 8em .5em 1em;border-top:1px solid #eee;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis}.x .portlet .lined li:first-child{border:0}.x .portlet .side{position:absolute;top:0;_top:1px;right:0;color:#666;background:#fff;padding:0 1em}.x .portlet .lined .side{padding:.5em 1em}.x .portlet .more{position:absolute;top:.5em;right:1em;text-decoration:none !important;color:#666}.x .portlet .more span{color:#999}.x .portlet .action{text-align:right;top:0;right:0;padding:.5em 1em .5em 3em;background:#fff;background:-webkit-gradient(linear, 0% 0%, 100% 0%, from(rgba(255,255,255,0)), to(rgba(255,255,255,1)), color-stop(15%, #fff));background:-moz-linear-gradient(left, rgba(255,255,255,0) 0, rgba(255,255,255,1) 15%)}.x .portlet .action a,.x .portlet .action button{margin-left:1em}.x .portlet .btnArea{border-top:1px solid #ddd;margin:0;padding:.5em 1em;margin:0 1px 1px 1px;background:#f7f7f7;border-radius:0 0 5px 5px}/* Table */.x .table{margin:1em 0}.x .table table{width:100%;border:0;border-collapse:collapse;border-top:2px solid #ccc}.x .table caption{font-weight:bold;text-align:left;line-height:22px;padding:5px 0}.x .table caption:after{content:"";display:block;clear:both}.x .table caption a{font-weight:normal}.x .table caption em{float:right;margin-left:1em}.x .table caption strong{color:#e00}.x .table caption .side{float:right;font-weight:normal;margin-left:1em}.x .table th,.x .table td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd;white-space:nowrap}.x .table th{background:#f8f8f8}.x .table thead th{border-bottom:1px solid #999}.x .table tfoot td{font-weight:bold;background:#f8f8f8}.x .table.even tbody tr:nth-of-type(even) td{background-color:#fafafa}.x .table td>input[type=text]{margin:-1px 0 !important;vertical-align:middle}.x .table img{vertical-align:middle}.x .table em{font-style:normal;font-weight:normal;color:#e00}.x .table th.title,.x .table td.title,.x .table th.text,.x .table td.text{white-space:normal;width:100%}/* Form */.x .form{margin:1em 0;padding:0}.x .form fieldset{margin:0 0 2em 0;padding:0;border:0}.x .form.search fieldset{border:1px solid #ccc;padding:5px 15px;border-radius:3px}.x .form em{font-style:normal;color:#e00}.x .form label{line-height:1;vertical-align:middle}.x .form input[type=radio]+label,.x .form input[type=checkbox]+label{margin-right:1em}.x .form input[type=checkbox]+label,.x .form input[type=radio]+label,.x .form input[type=file]{cursor:pointer}.x .form ul{position:relative;margin:1em 0;padding:0;list-style:none;border-top:2px solid #ccc;border-bottom:1px solid #ccc;zoom:1}.x .form li{list-style:none;border:1px solid #ddd;border-left:0;border-right:0;margin:-1px 0;padding:8px 0;vertical-align:top;zoom:1}.x .form li:first-child{border-top:0}.x .form li>label:first-child{display:block;font-weight:bold}.x .form li label em{font-weight:normal}.x .form label.overlap{position:absolute;color:#aaa}.x .form input[type=text],.x .form input[type=password],.x .form input[type=file],.x .form textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:transparent}.x .form input[type=text],.x .form input[type=password],.x .form input[type=file]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px}.x .form input[type=text].loading,.x .form input.loading[type=password]{padding-right:24px;width:260px;background:transparent url(../img/preLoader16.gif) no-repeat 265px center}.x .form input[type=checkbox],.x .form input[type=radio]{margin:0;padding:0;width:13px;height:13px;vertical-align:middle}.x .form input[type=text][disabled=disabled],.x .form input[type=password][disabled=disabled],.x .form input[type=radio][disabled=disabled],.x .form input[type=checkbox][disabled=disabled],.x .form select[disabled=disabled],.x .form textarea[disabled=disabled]{background:#ddd;text-shadow:1px 1px 0 #fff}.x .form textarea{padding:3px 4px;vertical-align:top}.x .form span.desc, .x .form em.desc{line-height:22px;vertical-align:middle;margin:0 10px}.x .form p.desc{margin:.25em 0;line-height:1.4}.x .form .q{font-weight:bold;margin:0 0 5px 0}.x .form .a{margin:0 0 5px 0}.x .form .tgForm{margin-right:1em}/* Global Navigation Bar */.x .gnb{position:relative;clear:both;border:1px solid #c1c1c1;border-left:0;border-right:0;background-color:#efefef;background:#efefef -webkit-gradient(linear, 0% 0%, 0% 100%, from(#efefef), to(#dcdcdc));background:#efefef -moz-linear-gradient(top, #efefef, #dcdcdc);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#efefef, endColorStr=#dcdcdc);zoom:1}.x .gnb ul{margin:0;padding:0 0 0 20px;list-style:none;border:1px solid #fff;border-left:0;border-right:0;zoom:1}.x .gnb ul ul{position:absolute;top:30px;left:0;border:1px solid #ccc;border-top:0;padding:1px 0 0 0;background:#fff}.x .gnb ul:after{content:"";display:block;clear:both}.x .gnb li{position:relative;float:left;border:1px solid #fff;border-top:0;border-bottom:0;margin:0 -1px 0 0}.x .gnb li li{float:none;clear:both;overflow:hidden;border:0;border-top:1px dotted #ccc;margin:0;padding:2px}.x .gnb li li:first-child{border:0}.x .gnb li a{float:left;font-weight:bold;color:#333;font-size:12px;padding:8px 18px;white-space:nowrap;text-decoration:none;text-shadow:0 1px 0 #fff;zoom:1}.x .gnb li a:hover,.x .gnb li a:active,.x .gnb li a:focus,.x .gnb li.active a{background:#f4f4f4;border:1px solid #ccc;border-bottom:0;padding:7px 17px 8px 17px}.x .gnb li.activeOn a{background:#fff;border:1px solid #ccc;border-bottom:0;padding:7px 17px 8px 17px}.x .gnb li.active li a{display:block;float:none;color:#555;background:#fff;padding:5px 15px !important;font-weight:normal !important;border:0 !important}.x .gnb li.active li a:hover,.x .gnb li.active li a:active,.x .gnb li.active li a:focus{border:0;background:#eee}.x .gnb .setting{position:absolute;top:8px;right:2em;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;background:url(../img/iconSetting.gif) no-repeat center}.x .gnb.jx ul{display:block;position:static;padding:0}.x .gnb.jx li{float:none;clear:both;border-top:1px solid #ccc}.x .gnb.jx ul ul{border:0}.x .gnb.jx li li{border:0}.x .gnb.jx li a{float:none;display:block}.x .gnb.jx li a:hover,.x .gnb.jx li a:active,.x .gnb.jx li a:focus{background:none}.x .gnb.jx li.activeOn>a{background:#ddd}@media only all and (max-width:860px){.x .gnb ul{padding-left:1em}.x .gnb .setting{right:1em}}@media only all and (max-width:640px){.x .gnb ul{display:block;position:static;padding:0}.x .gnb li{float:none;clear:both;border-top:1px solid #ccc}.x .gnb ul ul{border:0;position:static}.x .gnb li li{border:0}.x .gnb li a{float:none;display:block}.x .gnb li a:hover,.x .gnb li a:active,.x .gnb li a:focus{background:none}.x .gnb li.activeOn>a{background:#ddd}}/* Favorite */.x .bmk{position:absolute;right:20px;bottom:10px;padding:0 0 0 20px;background:url(../img/iconFavorite.gif) no-repeat 0 -16px}.x .bmk>a{text-shadow:0 1px 0 #fff}.x .bmk ul{position:absolute;top:140%;right:0;list-style:none;margin:0;padding:5px 10px;border:1px solid #aaa;border-radius:5px;background:#fff;box-shadow:1px 1px 3px #aaa}.x .bmk li{position:relative;padding:3px 30px 3px 0;white-space:nowrap}.x .bmk li .action{position:absolute;top:0;right:0}.x .bmk li .action .text{text-decoration:none;width:16px;text-align:center;margin:0}@media only all and (max-width:640px){.x .bmk{position:static;background-color:#fff;padding:10px 20px;background:#fff}.x .bmk .tgAnchor{display:block}.x .bmk ul{position:relative;border:0;border-top:1px solid #ccc;border-radius:0;box-shadow:none;padding:0;margin:5px 0 0 0}.x .bmk li{position:relative;top:-1px;border-top:1px dotted #ccc}}/* Local Navigation */.x .lnb{position:relative;float:left;width:210px;margin:1em 0 1em -240px;line-height:normal;zoom:1;display:inline}.x .lnb .h2{margin-top:0}.x .lnb ul{margin:0 !important;padding:0;list-style:none}.x .lnb li{position:relative;margin:0 0 -1px 0;vertical-align:top;zoom:1}.x .lnb li a{display:block;position:relative;padding:8px 10px;text-decoration:none;color:#666;font-weight:bold;background:#fafafa;border:1px solid #eee;zoom:1}.x .lnb li a .i{position:absolute;top:50%;left:100%;margin:-4px 0 0 -16px;width:8px;height:8px;color:#ccc;background:url(../img/iconNavVr.gif) no-repeat left top}.x .lnb li ul{padding:5px 0;background:#fff}.x .lnb li li{margin:0;border-top:1px dotted #ddd}.x .lnb li li:first-child{border:0}.x .lnb li li a{font-weight:normal;background:#fff;padding:5px 10px;border:0}.x .lnb li li a span{color:#666}.x .lnb li.active{border:1px solid #ccc;z-index:2}.x .lnb li li.active{border:0}.x .lnb li.active a{color:#000;border:0}.x .lnb li.active .i{background-position:0 -44px}.x .lnb li.active li a{border:0}.x .lnb li.active ul{display:block;border-top:1px solid #eee}.x .lnb li.active li.active a span{color:#13b200;font-weight:bold;letter-spacing:-1px}/* Content Navigation */.x .cnb{margin:1em 0;position:relative;zoom:1}.x .cnb:after{content:"";display:block;clear:both}.x .cnb ul{list-style:none;margin:0;padding:0}.x .cnb li{display:inline}.x .cnb li:before{content:"| ";color:#ccc}.x .cnb li:first-child:before{content:""}.x .cnb .active,.x .cnb .active a{font-weight:bold;color:#333;text-decoration:none}.x .cnb .side{float:right}/* Pagination */.x .pagination{margin:1em 0;text-align:center;line-height:normal}.x .pagination *{vertical-align:middle}.x .pagination a,.x .pagination strong{position:relative;display:inline-block;padding:2px 4px;font-weight:bold;text-decoration:none;line-height:normal;color:#333 !important;vertical-align:middle}.x .pagination a:hover,.x .pagination a:active,.x .pagination a:focus{border:1px solid #ddd;margin:0 -1px}.x .pagination strong{color:#e00 !important;font-size:20px}.x .pagination .direction{font-weight:normal;white-space:nowrap}.x .pagination .direction:hover,.x .pagination .direction:active,.x .pagination .direction:focus{border:0;margin:0;text-decoration:underline}.x .pagination input{width:30px;text-align:center}.x .pagination button{overflow:visible}/* Star Rating */.x .starRating, .x .starRating span{display:inline-block;height:14px;background:transparent url(../img/iconStarRating.gif) no-repeat;overflow:hidden}.x .starRating{width:79px;vertical-align:top}.x .starRating span{font-size:0;line-height:0;vertical-align:top;text-indent:-100px;*text-indent:0;background-position:0 -14px}/* Progress */.x .prgrs{white-space:nowrap;line-height:normal;vertical-align:middle}.x .prgrs *{vertical-align:middle}.x .prgrs .pBar{position:relative;display:inline-block;background:#e9e9e9;margin:0 5px 0 0}.x .prgrs .pAction{display:inline-block;vertical-align:top;background:#99a6b6}.x .prgrs .pNum{position:absolute;width:100%;left:0;top:0;text-align:center;text-shadow:1px 1px 0 #fff}.x .prgrs.prgrsSmall{font-size:14px;line-height:14px}.x .prgrs.prgrsSmall .pBar,.x .prgrs.prgrsSmall .pAction,.x .prgrs.prgrsSmall .pNum{height:16px;line-height:16px;font-size:11px}.x .prgrs.prgrsMedium{font-size:24px;line-height:24px}.x .prgrs.prgrsMedium .pBar,.x .prgrs.prgrsMedium .pAction,.x .prgrs.prgrsMedium .pNum{height:22px;line-height:22px;font-size:12px}.x .prgrs.prgrsLarge{font-size:38px;line-height:38px}.x .prgrs.prgrsLarge .pBar,.x .prgrs.prgrsLarge .pAction,.x .prgrs.prgrsLarge .pNum{height:34px;line-height:34px;font-size:14px}/* Modal Window */.modal{position:absolute;top:0;left:0;width:100%;_height:100%;min-height:100%;z-index:100}.modal .bg{position:absolute;background:#000;_background:none;width:100%;height:100%;opacity:.5;z-index:2;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1}.modal .fg{position:relative;width:80%;margin:5em auto;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:3;zoom:1;border-radius:5px;box-shadow:0 0 6px #000}.modal ul, .modal ol, .modal .lined, .modal .table{margin-bottom:1em}.modal .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1}.modalClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px}.modalBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}html.modalContainer,body.modalContainer{_height:100%;_width:100%} /* IE6 only */ /* Layer */.x .layer,.x.layer{position:absolute;background:#fff;padding:0 1em;*padding:1em;border:8px solid #ddd;z-index:2;zoom:1;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;box-shadow:0 0 6px #666;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x .layer h2{font-size:14px}.x .layer ul, .x .layer ol, .x .layer .lined, .x .layer .table{margin-bottom:1em}.x .layerClose{position:absolute;right:-8px;top:-8px;border:0;background:#ddd;padding:0;width:28px;height:28px;font-size:14px;font-weight:bold;cursor:pointer;color:#999;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px}.x .layerBlur{position:absolute;top:0;right:0;border:0;background:none;padding:0;width:1px;height:1px;overflow:hidden}/* H2 Anchor */.x .h2Anchor{position:absolute;right:0;border:0;background:none;color:#00f;text-decoration:underline}/* Skip Navigation */.x .skipNav{margin:0;text-align:center}.x .skipNav a{position:absolute;width:1px;height:1px;display:block;font-weight:bold;padding:10px 0}.x .skipNav a:hover,.x .skipNav a:active,.x .skipNav a:focus{position:relative;width:auto;height:auto}/* Header */.x .header{position:relative;z-index:2;padding:30px 0 0 0;background:#4c4c4c;box-shadow:0 0 10px #aaa;zoom:1;border-radius:5px 5px 0 0}.x .header:after{content:"";display:block;clear:both}.x .header a{text-decoration:none}.x .header h1{margin:0 15px 10px 20px;font-size:24px;line-height:32px;display:inline-block;zoom:1}.x .header h1 *{vertical-align:middle}.x .header h1 a{color:#fff;text-shadow:1px 1px 0 #000;filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=1, OffY=1, Color=#000000, Positive=true);zoom:1}.x .header h1 .url{font-size:12px;font-weight:normal}.x .header .site{margin:0;display:inline-block;zoom:1}.x .header .site a{color:#fff;text-decoration:underline}.x .header #moveSiteList{padding:10px 1em 5px 1em;margin:0}.x .header #moveSiteList ul{list-style:none;margin:0;padding:0}.x .header #moveSiteList li{white-space:nowrap;margin:0;padding:4px 0;border-bottom:1px dotted #ccc}.x .header #siteMapList{padding:0 1em 1em 1em;margin:0}.x .header #siteMapList li{white-space:nowrap}.x .header .account{position:absolute;z-index:3;width:100%;top:0;right:0;white-space:nowrap;text-align:right;background:#333;border-bottom:1px solid #656565;color:#fff;font-size:12px;border-radius:5px 5px 0 0}.x .header .account ul{margin:0 2px 0 0;padding:5px 20px 5px 0;list-style:none}.x .header .account li{position:relative;display:inline;border-left:1px solid #666;padding:0 6px 0 10px}.x .header .account li:first-child{border:0}.x .header .account a{color:#fff;display:inline-block;height:14px}.x .header .account a.language{padding-right:16px;background:url(../img/iconArrow.gif) no-repeat right -160px}.x .header #language{position:absolute;top:19px;right:-2em;padding:6px 4px !important;border:1px solid #666;border-top:0;background:#333}.x .header #language li{border:0;display:block;padding:1px 8px 1px 10px;text-align:left;line-height:1}.x .header #language li.selected{background:url(../img/iconCheck.gif) no-repeat left center}.x .header #language li.selected a{text-decoration:underline}.x .header h1 a:hover,.x .header h1 a:active,.x .header h1 a:focus,.x .header .account a:hover,.x .header .account a:active,.x .header .account a:focus{color:#6e9cf2;text-decoration:underline}/* Footer */.x .footer{border-top:1px solid #ddd;text-align:center;font-size:12px;padding:1.5em 0;zoom:1}.x .footer:after{content:"";display:block;clear:both}.x .footer p{margin:0}.x .footer .power{float:left}.x .footer .cache{float:right}/* Body */.x .body{position:relative;z-index:1;padding:1em 20px 1em 260px;zoom:1}.x .body:after{content:"";display:block;clear:both}/* Content */.x .content{float:right;width:100%;margin-left:-230px;zoom:1}.x .content:after{content:"";display:block;clear:both}.x .content a{color:#33a}.x .content a:hover,.x .content a:active,.x .content a:focus{color:#a33}.x .content .portlet a{text-decoration:none}.x .content .portlet a:hover,.x .content .portlet a:active,.x .content .portlet a:focus{text-decoration:underline}/* Dashboard */.x .dashboard{position:relative;float:none;width:auto;margin-left:-230px}.x .dashboard .portlet{float:left;width:48%;margin-right:1em}.x .dashboard .portlet:nth-of-type(odd){float:left;width:49%;margin-right:0}.x .dashboard .portlet:nth-of-type(even){float:right;width:49%;margin-right:0}@media only all and (min-width:1300px){.x .dashboard .portlet{float:left !important;width:32% !important;margin-right:1em !important}}/* Single Column*/.x .single{position:relative;float:none;width:auto;margin-left:-240px}/* Search */.x .search{zoom:1}.x .search:after{content:"";display:block;clear:both}.x .search .pagination{float:left;text-align:left}.x .search form{float:right;margin:1em 0}.x .search form *{vertical-align:middle}/* Site Map */.x .siteMap h2 input{font-size:14px;font-weight:bold;padding:0 .5em}.x .siteMap label{cursor:text}.x .siteMap .lined ul{padding:0;margin:0;border-top:1px solid #eee;zoom:1}.x .siteMap .lined li{position:relative;padding:0;margin:0;cursor:all-scroll;list-style:none;zoom:1}.x .siteMap .lined li li{border-top:1px solid #eee}.x .siteMap li li{text-indent:18px}.x .siteMap li li li{text-indent:36px}.x .siteMap li li li li{text-indent:54px}.x .siteMap li li li li li{text-indent:72px}.x .siteMap li li li li li li{text-indent:90px}.x .siteMap li li li li li li li{text-indent:108px}.x .siteMap li li li li li li li li{text-indent:126px}.x .siteMap li li li li li li li li li{text-indent:144px}.x .siteMap li li li li li li li li li li{text-indent:162px}.x .siteMap li li li li li li li li li li li{text-indent:180px}.x .siteMap li li li li li li li li li li li li{text-indent:198px}.x .siteMap li *{vertical-align:middle}.x .siteMap li .moveTo+input{width:200px;border:0;padding:0 .5em}.x .siteMap li .moveTo+input:hover,.x .siteMap li .moveTo+input:active,.x .siteMap li .moveTo+input:focus{border:1px dotted #ccc;overflow:visible}.x .siteMap .moveTo{position:relative;z-index:2;width:22px;height:32px;padding:32px 0 0 0;margin:0 3px;_margin-top:-1px;overflow:hidden;background:#fff url(../img/iconMoveTo.gif) no-repeat center 0;border:0;cursor:move}.x .siteMap li.active,.x .siteMap li.active .moveTo{background-color:#f7f7f7}.x .siteMap li.active li,.x .siteMap li.active ul{border-top-color:#f7f7f7}.x .siteMap li.active .moveTo{background-position:center -32px}.x .siteMap .vr,.x .siteMap .hr{display:none;position:absolute;z-index:1;left:14px;border:0px solid #ccc;overflow:hidden}.x .siteMap .vr{top:-16px;height:100%;border-left-width:1px}.x .siteMap .hr{top:16px;width:16px;border-top-width:1px}.x .siteMap li.active .vr,.x .siteMap li.active li .hr{display:block}.x .siteMap li li .vr,.x .siteMap li li li .hr{left:32px}.x .siteMap li li li .vr,.x .siteMap li li li li .hr{left:50px}.x .siteMap li li li li .vr,.x .siteMap li li li li li .hr{left:68px}.x .siteMap li li li li li .vr,.x .siteMap li li li li li li .hr{left:86px}.x .siteMap li li li li li li .vr,.x .siteMap li li li li li li li .hr{left:104px}.x .siteMap li li li li li li li .vr,.x .siteMap li li li li li li li li .hr{left:122px}.x .siteMap li li li li li li li li .vr,.x .siteMap li li li li li li li li li .hr{left:140px}.x .siteMap li li li li li li li li li .vr,.x .siteMap li li li li li li li li li li .hr{left:158px}.x .siteMap li li li li li li li li li li .vr,.x .siteMap li li li li li li li li li li li .hr{left:176px}.x .siteMap li li li li li li li li li li li .vr,.x .siteMap li li li li li li li li li li li li .hr{left:336px}.x .siteMap .side{padding-top:0 !important;padding-bottom:0 !important;line-height:30px;background:transparent !important}.x .siteMap .side button{text-indent:0;line-height:1}.x .siteMap .tgMap{position:absolute;top:12px;right:1em;padding:0 16px 0 0;line-height:16px;background:url(../img/iconArrow.gif) no-repeat right -126px}.x .siteMap.fold .tgMap{background-position:right -158px}.x .siteMap.fold .h2{border-bottom-color:#fff;border-radius:5px}.x .siteMap .placeholder{background:#bbb}.x .siteMap .draggable,.x .siteMap .draggable .moveTo{background-color:#ddd}.x .siteMap .draggable .summary{border-left:1px solid #ccc;padding-left:10px;margin-left:10px;font-size:11px;color:#999}.x .siteMap a.ms{text-decoration:underline}/* Multilingual */.x .langEdit{background:#fff;position:absolute;*left:0;*margin-top:28px;z-index:10}.x .langEdit ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0}.x .langEdit li{padding:.5em 10px}.x .langEdit input[type=text]{width:220px;padding-right:40px}.x .langEdit label{left:15px !important}.x .langEdit .action{border:1px solid #eee;width:268px;padding:0 10px}.x .langEdit p, .x .langEdit .btnArea{white-space:normal}.x .langEdit .langList,.x .langEdit .langEditControls{box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x .langEdit .langList{margin:0 -1px 0 0;display:none}.x .langEdit .langList li{white-space:nowrap;color:#ccc;width:270px} .x .langEdit .langList li span{display:inline-block;width:80px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:#767676}.x .langEdit .langList li a{display:inline-block;width:80px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.x .langEdit .langList li.active{background:url(../img/iconArrow.gif) no-repeat right -188px}.x .langEdit.showChild .langList{display:block}.x .langEdit .langInput{background:#fff}.x .langEdit .langInput h2{padding:5px 10px;margin:0 0 -1px 0;font-size:12px;font-weight:normal;color:#666;border:1px solid #eee;border-top-color:#ccc}.x .langEdit .langInput h2 strong{color:#000;font-size:14px}.x .langEdit.showChild .langInput{position:absolute;left:285px;top:0}.x .langEdit li.en input, .x .langEdit li.en textarea, .x .mLangEdit li.en textarea{background:url(../img/flag.us.gif) no-repeat 99% 5px}.x .langEdit li.ko input, .x .langEdit li.ko textarea, .x .mLangEdit li.ko textarea{background:url(../img/flag.kr.gif) no-repeat 99% 5px}.x .langEdit li.jp input, .x .langEdit li.jp textarea, .x .mLangEdit li.jp textarea{background:url(../img/flag.jp.gif) no-repeat 99% 5px}.x .langEdit li.fr input, .x .langEdit li.fr textarea, .x .mLangEdit li.fr textarea{background:url(../img/flag.fr.gif) no-repeat 99% 5px}.x .langEdit li.de input, .x .langEdit li.de textarea, .x .mLangEdit li.de textarea{background:url(../img/flag.de.gif) no-repeat 99% 5px}.x .langEdit li.ru input, .x .langEdit li.ru textarea, .x .mLangEdit li.ru textarea{background:url(../img/flag.ru.gif) no-repeat 99% 5px}.x .langEdit li.es input, .x .langEdit li.es textarea, .x .mLangEdit li.es textarea{background:url(../img/flag.es.gif) no-repeat 99% 5px}.x .langEdit li.tr input, .x .langEdit li.tr textarea, .x .mLangEdit li.tr textarea{background:url(../img/flag.tr.gif) no-repeat 99% 5px}.x .langEdit li.vi input, .x .langEdit li.vi textarea, .x .mLangEdit li.vi textarea{background:url(../img/flag.vn.gif) no-repeat 99% 5px}.x .langEdit li.mn input, .x .langEdit li.mn textarea, .x .mLangEdit li.mn textarea{background:url(../img/flag.mn.gif) no-repeat 99% 5px}.x .langEdit li.zh-CN input, .x .langEdit li.zh-CN textarea, .x .mLangEdit li.zh-CN textarea{background:url(../img/flag.cn.gif) no-repeat 99% 5px}.x .langEdit li.zh-TW input, .x .langEdit li.zh-TW textarea, .x .mLangEdit li.zh-TW textarea{background:url(../img/flag.tw.gif) no-repeat 99% 5px}.x .mLangEdit.en strong{background:url(../img/flag.us.gif) no-repeat 0 10px}.x .mLangEdit.ko strong{background:url(../img/flag.kr.gif) no-repeat 0 10px}.x .mLangEdit.jp strong{background:url(../img/flag.jp.gif) no-repeat 0 10px}.x .mLangEdit.fr strong{background:url(../img/flag.fr.gif) no-repeat 0 10px}.x .mLangEdit.de strong{background:url(../img/flag.de.gif) no-repeat 0 10px}.x .mLangEdit.ru strong{background:url(../img/flag.ru.gif) no-repeat 0 10px}.x .mLangEdit.es strong{background:url(../img/flag.es.gif) no-repeat 0 10px}.x .mLangEdit.tr strong{background:url(../img/flag.tr.gif) no-repeat 0 10px}.x .mLangEdit.vi strong{background:url(../img/flag.vn.gif) no-repeat 0 10px}.x .mLangEdit.mn strong{background:url(../img/flag.mn.gif) no-repeat 0 10px}.x .mLangEdit.zh-CN strong{background:url(../img/flag.cn.gif) no-repeat 0 10px}.x .mLangEdit.zh-TW strong{background:url(../img/flag.tw.gif) no-repeat 0 10px}.x .mLangEdit ul ul{border:0}.x .mLangEdit li{position:relative;padding:0}.x .mLangEdit li strong{display:inline-block;padding:6px 100px 8px 24px;font-weight:normal;line-height:1.5}.x .mLangEdit li .side{position:absolute;top:8px;right:0;padding-right:18px;background:url(../img/iconArrow.gif) no-repeat right -160px}.x .mLangEdit li li{border:0;padding-right:36px}.x .mLangEdit li textarea{width:100%;height:16px;padding-right:30px;resize:vertical;line-height:1.4}.x .mLangEdit li label{top:8px !important}.x .mLangEdit li.active{background:#FFFDEF}.x .mLangEdit li.active strong{font-weight:bold}.x .mLangEdit li.active .side{background-position:right -128px}.modal .mLangEdit ul{padding-bottom:1em}.modal .mLangEdit li{border:0;padding-right:36px}/* Suggestion */.x .suggestion{display:none;position:absolute;background:#fff;z-index:10;_height:200px;max-height:200px;overflow:auto;*left:0;*margin-top:28px;box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x .suggestion ul{border-top:1px solid #ccc;border-left:1px solid #eee;border-right:1px solid #eee;margin:0}.x .suggestion li{padding:0}.x .suggestion li:last-child{border-bottom:0}.x .suggestion li button{border:0;background:#fff;text-align:left;width:288px;padding:2px 4px;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.x .suggestion li button:hover,.x .suggestion li button:active,.x .suggestion li button:focus,.x .suggestion li button.active{background:#eee}/* Image Mark */.x #imageMark{right:0}/* Easy Installer */.x .easyNav{position:relative;border:1px solid #e9e9e9;zoom:1}.x .easyNav:after{content:"";display:block;clear:both}.x .easyNav h2{font-size:16px}.x .easyNav .category{width:30%;float:left;margin:0 2em;display:inline}.x .easyNav .filter{position:absolute;top:0;right:0;margin:1em 2em;text-align:right}.x .easyList td p{margin-top:0}.x .easyList td p.update{background:#ffc;padding:.5em 1em;border:1px solid #fc9;border-left:0;border-right:0;text-align:center}/* Font Preview */.x .fontPreview{width:96%;border:1px solid #e9e9e9;zoom:1;padding:1em 2em;margin:.5em 0}/* FTP Suggestion */.x #ftpSuggestion{background:#fff;box-shadow:3px 3px 6px #999;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}.x #ftpSuggestion ul{border-left:1px solid #eee;border-right:1px solid #eee}.x #ftpSuggestion li{padding:0}.x #ftpSuggestion li button{border:0;background:#fff;text-align:left;width:288px}.x #ftpSuggestion li button:hover,.x #ftpSuggestion li button:active,.x #ftpSuggestion li button:focus{background:#eee}/* Theme & Skin Preview */.x .thumbPreview li{position:relative;padding-left:10px;padding-right:10px}.x .thumbPreview li.active.highlight{background:#f9f9f9}.x .thumbPreview .prevToggle{position:absolute;top:8px;right:10px;line-height:16px;padding:0 18px 0 0;text-decoration:none;background:url(../img/iconArrow.gif) no-repeat right -32px}.x .thumbPreview li.active .prevToggle{background-position:right 0}.x .thumbPreview .a{border:0;margin:0;zoom:1}.x .thumbPreview .a:after{content:"";display:block;clear:both}.x .thumbPreview .i{float:left;vertical-align:top;margin:0 1em 1em 0;padding:0;border:0;zoom:1}.x .thumbPreview .i:after{content:"";display:block;clear:both}.x .thumbPreview .i .thumb{position:relative;width:124px;height:84px;padding:0;margin-bottom:3px;text-align:center;overflow:hidden;border:1px solid #ddd;display:block;cursor:pointer;background:#fff}.x .thumbPreview .i .thumb .frame{position:absolute;width:120px;height:80px;left:0;top:0;border:2px solid #fff;overflow:hidden}.x .thumbPreview .i .thumb img{width:120px;margin:0}.x .thumbPreview .i label{display:block;position:relative;top:0;left:2px;width:122px;height:1.1em;margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x .thumbPreview .i input{display:none}.x .thumbPreview .i ul{display:none}.x .thumbPreview .selected .i{display:block;float:none}.x .thumbPreview .selected .i .thumb{float:left;width:186px;height:126px;margin:0 1em 0 0;border:2px solid #eee}.x .thumbPreview .selected .i .thumb .frame{width:180px;height:120px;border-width:3px}.x .thumbPreview li.active.highlight .selected .i .thumb{border-color:#5ea8f6}.x .thumbPreview .selected .i .thumb img{width:180px;position:relative}.x .thumbPreview li.active .selected .i .thumb img{z-index:auto}.x .thumbPreview .selected .i label{cursor:text}.x .thumbPreview .selected .i ul{display:block;list-style:none;border:0;margin:1em 0 1em 200px}.x .thumbPreview .selected .i li{border:0;padding:0;margin:0 0 .2em 0}.x .thumbPreview.jx .i label{display:inline;width:auto}.x .thumbPreview.jx .i.noDirection{display:none}.x .thumbPreview.jx .i input{display:inline}.x #skin .showAll{float:right;border:0;overflow:visible;padding:0 18px 0 0;cursor:pointer;color:#00f;background:url(../img/iconArrow.gif) no-repeat right -32px}.x #skin .showAll.hideAll{background-position:right 0}/* Favorite On | Off */.x .fvOff,.x .fvOn{display:inline-block;width:16px;height:16px;overflow:hidden;text-indent:16px;background:url(../img/iconFavorite.gif) no-repeat}.x .fvOn{background-position:0 -16px}/* Up-Down Dragable */.x .uDrag .wrap{position:relative;padding-left:20px}.x .uDrag li>.wrap{margin:0 0 0 8px}.x .uDrag .dragActive{background:#FFD}.x .uDrag .dragActive th,.x .uDrag .dragActive td{background:none !important}.x .uDrag .dragBtn{position:absolute;width:8px;height:100%;padding:0;overflow:hidden;background:url(../img/bgDragable.gif);top:1px;left:0;text-indent:12px;border:0;cursor:n-resize;white-space:nowrap}/* Favicon Preview */.x .faviconPreview{position:relative;padding:60px 0 0 200px;background:url(../img/bgFavicon.gif) no-repeat}.x .faviconPreview img{position:absolute}.x .faviconPreview .fn1{top:30px;left:12px}.x .faviconPreview .fn2{top:55px;left:68px}/* Mobile Icon Preview */.x .mobiconPreview{position:relative;padding:252px 0 0 200px;background:url(../img/bgMobileTop.png) no-repeat}.x .mobiconPreview img{position:absolute;top:20px;left:10px}.x .mobiconPreview span{position:absolute;width:32px;text-align:center;top:52px;left:10px;color:#fff;font-size:9px}/* Text List */.x .textList{border:1px solid #ddd !important;line-height:1.5em;height:18.5em;overflow:auto}.x .textList li{border:0;padding:.25em 1em;height:1.5em;white-space:nowrap;overflow:hidden}.x .textList li:nth-child(even){background:#eee}.x .textList li a{float:right}/* File Box */.x .fileBox li{position:relative}.x .fileBox li img{max-width:100%}.x .fileBox .portlet ul{margin:1em;list-style:none;padding:0;border:0}.x .fileBox .portlet li{border-top:1px solid #ddd;border-bottom:0;padding:8px 0}.x .fileBox .side{position:absolute;top:8px;right:0}/* Messages */.x .desc.error{color:#f00}.x .desc.success{color:#080}/* Icon Button */.x a.iSetting{display:inline-block;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;vertical-align:middle;background:url(../img/iconSetting.gif) no-repeat}.x a.cMenu{display:inline-block;width:16px;height:0;padding:16px 0 0 0;overflow:hidden;vertical-align:middle;background:url(../../../../common/img/icon.bubble.png) no-repeat}/* Responsive Layout */@media only all and (max-width:860px){.x .header h1{margin-left:.7em}.x .header .account ul{padding-right:10px}.x .body{padding:0}.x .content{float:none;margin-left:0}.x .lnb{float:none;width:auto;margin:1em 0}.x .dashboard .portlet{float:none !important;width:auto !important;margin-right:0}.modal .fg,.wfsr .fg{width:auto}.x .easyNav .category{float:none;display:block;width:auto}.x .easyNav .filter{position:static}}@media only all and (max-width:640px){.x .skipNav a{position:relative;width:auto;height:auto}.modal{position:absolute}}/* Legacy Code (Don't use it. It will be removed as soon as possible.) */.x h3.xeAdmin,.x h4.xeAdmin{position:relative;border-bottom-style:solid;border-bottom-color:#ccc;zoom:1}.x h3.xeAdmin{border-bottom-width:4px;font-size:24px}.x h4.xeAdmin{border-bottom-width:3px;font-size:20px}.x h5.xeAdmin{border-bottom-width:2px;font-size:16px}.x h6.xeAdmin{border-bottom-width:1px;font-size:12px}.x .adminSearch{margin:1em 0}.x .adminSearch fieldset{border:1px solid #ccc;margin:0;padding:.5em 1em}.x .localNavigation{padding:0;list-style:none}.x .localNavigation li{display:inline}.x .localNavigation li.on a{font-weight:bold;color:#333;text-decoration:none}.x .localNavigation li:before{content:"| "}.x .localNavigation li:first-child:before{content:""}.x .summary{margin:1em 0}.x .rowTable,.x .colTable,.x .crossTable{margin:1em 0;border:0;border-collapse:collapse;border-top:2px solid #ccc;width:100%}.x .rowTable caption,.x .colTable caption,.x .crossTable caption{font-weight:bold;text-align:left;line-height:22px;padding:5px 0}.x .rowTable caption:after,.x .colTable caption:after,.x .crossTable caption:after{content:"";display:block;clear:both}.x .rowTable caption a,.x .colTable caption a,.x .crossTable caption a{font-weight:normal}.x .rowTable caption em,.x .colTable caption em,.x .crossTable caption em{float:right;font-style:normal;font-weight:normal;color:#e00;margin-left:1em}.x .rowTable caption strong,.x .colTable caption strong,.x .crossTable caption strong{color:#e00}.x .rowTable caption .side,.x .colTable caption .side,.x .crossTable caption .side{float:right;font-weight:normal;margin-left:1em}.x .rowTable th,.rowTable td,.x .colTable th,.rowTable td,.x .crossTable th,.rowTable td{border:0;padding:8px;vertical-align:top;text-align:left;border-bottom:1px solid #ddd;white-space:nowrap}.x .rowTable th,.x .colTable th,.x .crossTable th{background:#f8f8f8}.x .rowTable thead th,.x .colTable thead th,.x .crossTable thead th{border-bottom:1px solid #999}.x .rowTable tfoot td,.x .colTable tfoot td,.x .crossTable tfoot td{font-weight:bold;background:#f8f8f8}.x .rowTable.even tbody tr:nth-of-type(even) td,.x .colTable.even tbody tr:nth-of-type(even) td,.x .crossTable.even tbody tr:nth-of-type(even) td{background-color:#fafafa}.x .rowTable td>input[type=text],.x .colTable td>input[type=text],.x .crossTable td>input[type=text]{margin:-1px 0 -3px 0 !important;vertical-align:middle}.x .rowTable img,.x .colTable img,.x .crossTable img{vertical-align:middle}.x .rowTable .title,.x .colTable .title,.x .crossTable .title,.x .rowTable .text,.x .colTable .text,.x .crossTable .text{white-space:normal}.x .rowTable input[type=text],.x .colTable input[type=text],.x .crossTable input[type=text],.x .rowTable input[type=password],.x .colTable input[type=password],.x .crossTable input[type=password],.x .rowTable input[type=file],.x .colTable input[type=file],.x .crossTable input[type=file],.x .rowTable textarea,.x .colTable textarea,.x .crossTable textarea{position:relative;width:280px;margin:2px 0;border:1px solid #b7b7b7;border-right-color:#e1e1e1;border-bottom-color:#e1e1e1;background:transparent}.x .rowTable input[type=text],.x .colTable input[type=text],.x .crossTable input[type=text],.x .rowTable input[type=password],.x .colTable input[type=password],.x .crossTable input[type=password],.x .rowTable input[type=file],.x .colTable input[type=file],.x .crossTable input[type=file]{height:22px;line-height:22px;vertical-align:middle;padding:0 4px}.x .clear:after{content:"";display:block;clear:both} \ No newline at end of file diff --git a/modules/editor/skins/dreditor/skin.xml b/modules/editor/skins/dreditor/skin.xml index d00137ecb..5274367fd 100644 --- a/modules/editor/skins/dreditor/skin.xml +++ b/modules/editor/skins/dreditor/skin.xml @@ -61,28 +61,6 @@ 黑色 WYSIWYG Siyah WYSIWYG - - 하얀색 Text(자동 줄 바꿈) - 白色テキスト(自動に改行を入れる) - White Text(Auto Line Break) - White Text(Tự động giãn dòng) - White Text(Auto Line Break) - Editor de texto en blanco (Auto de línea) - 白色文本编辑器(自动换行) - 白色文字編輯器(自動換行) - Beyaz Metin Editörü(Otomatik Satır Arası) - - - 검은색 텍스트(자동 줄 바꿈) - 黒色テキストエディター(自動に改行を入れる) - Black Text(Auto Line Break) - Black Text(Tự động giãn dòng) - Black Text(Auto Line Break) - Editor de texto negro (salto de línea automático) - 黑色文本编辑器(自动换行) - 黑色文字編輯器(自動換行) - Siyah Metin Alanı(Otomatik Satır Arası) - 하얀색 텍스트(HTML 사용) 白色テキスト(HTMLタグを使う) diff --git a/modules/editor/skins/xpresseditor/skin.xml b/modules/editor/skins/xpresseditor/skin.xml index 2371d33ce..30a4017ed 100644 --- a/modules/editor/skins/xpresseditor/skin.xml +++ b/modules/editor/skins/xpresseditor/skin.xml @@ -66,30 +66,8 @@ 黑色 WYSIWYG Siyah WYSIWYG - - 하얀색 텍스트(HTML 사용, 자동 줄 바꿈) - 白色テキスト(自動に改行を入れる) - White Text(Auto Line Break) - White Text(Dòng tự động mở) - White Text(Auto Line Break) - Editor de texto en blanco (Auto de línea) - 白色文本编辑器(使用HTML,自动换行) - 白色文字編輯器(使用HTML,自動換行) - Beyaz Metin Editörü(Auto Line Break) - - - 검은색 텍스트(HTML 사용, 자동 줄 바꿈) - 黒色テキスト(自動に改行を入れる) - Black Text(Auto Line Break) - Black Text(Dòng tự động mở) - Black Text(Auto Line Break) - Editor de texto negro (salto de línea automático) - 黑色文本编辑器(使用HTML,自动换行) - 黑色文字編輯器(使用HTML,自動換行) - Siyah Metin Editörü(Auto Line Break) - - 하얀색 텍스트(HTML 사용, 자동 줄 바꿈 안함) + 하얀색 텍스트(HTML 사용) 白色テキスト(HTMLタグを使う) White Text(Use HTML) White Text(Sử dụng HTML) @@ -100,7 +78,7 @@ Beyaz Metin Editörü(HTML Kullan) - 검은색 텍스트(HTML 사용, 자동 줄 바꿈 안함) + 검은색 텍스트(HTML 사용) 黒色テキスト(HTMLタグを使う) Black Text(Use HTML) Black Text(Sử dụng HTML) @@ -111,7 +89,7 @@ Siyah Metin Editörü(HTML kullan) - 하얀색 텍스트(HTML 사용 안함, 자동 줄 바꿈) + 하얀색 텍스트(HTML 사용 안함) 白色テキスト(HTMLタグを使わない) White Text(No HTML) White Text(Không có HTML) @@ -122,7 +100,7 @@ Beyaz Metin Editörü(HTML yok) - 검은색 텍스트(HTML 사용 안함, 자동 줄 바꿈) + 검은색 텍스트(HTML 사용 안함) 黒色テキスト(HTMLタグを使わない) Black Text(No HTML) Black Text(Không có HTML) diff --git a/modules/layout/lang/lang.xml b/modules/layout/lang/lang.xml index 17fc89aba..8f571cfb6 100644 --- a/modules/layout/lang/lang.xml +++ b/modules/layout/lang/lang.xml @@ -192,17 +192,17 @@ - 레이아웃 설정과 메뉴의 연결을 통해서 다양한 모듈이 완성된 사이트의 모습으로 보여줄 수 있도록 합니다.
                                                      * 삭제나 수정이 불가능한 레이아웃은 블로그나 기타 모듈의 자체 레이아웃이므로 해당 모듈로 가서 설정하셔야 합니다.]]>
                                                      - By using layout setting and menu connection, website's completed shape will be displayed with various modules.
                                                      * Layouts which you cannot delete are the default layouts of blogs or other moduels, thus you have to delete them from their setting pages.]]>
                                                      - レイアウトの設定とメニューのリンクで様々なモジュールで完成されたサイト構築ができます。
                                                      ※ ブログまたは他のモジュールのレイアウトなどの削除・修正ができないレイアウトは、該当モジュールにて設定を行ってください。]]>
                                                      - 通过布局设置及菜单的链接,可以轻松制作以多种模块组成的完整网站。
                                                      - 无法删除和修改的布局可能是博客或其他模块自带的模板,因此应到相关模块进行设置。]]>
                                                      - 透過版面設置及選單的連結,利用多種模組可以輕鬆製作組合出完整的網站。
                                                      - 無法刪除和修改的版面,可能是部落格或其他模組的原始樣板,因此應到相關模組進行設置。]]>
                                                      - Vous pouvez présentez la forme du site Web complété par les modules divers en utilisant la configuration du Mise en Page et la connexion sur le menu.
                                                      * Les Mises en Page qui ne sont pas possibles à supprimer ou à modifier sont propres à ceux des blogues ou d'autres Mises en Page. Essayez à modifier/supprimer en dedans elles-mêmes]]>
                                                      + + + + + + - Используя настройки лейаута и подключение меню, полная форма сайта будет отображена множеством модулей.
                                                      * Теми лейаутами, которые невозможно удалить или изменить, являются лейауты блога и лейауты других модулей.]]>
                                                      - Por usar la configuración del diseño y el menú de conección, completa con varios módulos la forma de la página web que a ser mostrados
                                                      * Esos diseños que no pueden ser modificados ni eliminados son propios de blog y de otros módulos, por lo cual para la configuración de ellos debe hacerse en los modulos correspondientes.]]>
                                                      - Yerleşim düzeni ayarını ve menü bağlantısını kullandığınzda, websitelerin çeşitli modüllerle tamamlanmış şekilleri gösterilecektir.
                                                      * Blogların veya diğer modüllerin varsayılan yerleşim düzenlerini silemezseniz; onları, kendi ayar sayfalarından silmeniz gerekmektedir. ]]>
                                                      - Bằng cách sử dụng thiết lập giao diện và kết nối Menu, hình dạng hoàn thành của Website sẽ được trình bày bổ xung với nhiều Module.
                                                      Giao diện nào xuất hiện (*) là những giao diện không thể xóa hay điều chỉnh được Module. ]]>
                                                      + + + +
                                                      @@ -912,7 +912,7 @@ 아래 그림을 보시고 구성요소와 기능을 이용하여 원하시는 레이아웃을 만드세요.]]> Please design your own layout with components and functions as shown below.]]> - 下の図を参照しながら構成要素と機能を理解し、自由にレイアウトをカスタマイズしてみてください。]]> + 请仔细查看下面的布局示意图和功能简介后,尽情发挥吧!
                                                      FaceOff的布局示意图如下:]]>
                                                      下圖為版面架構示意圖和功能簡介,瞭解後發揮創意製作出自己想要的版面吧!]]> 아래 그림을 보시고 구성요소와 기능을 이용하여 원하시는 레이아웃을 만드세요]]> @@ -923,7 +923,7 @@ 이 구조에서 CSS를 이용하여 형태/배열/정렬을 할 수 있고 또 Style을 이용하여 꾸밀 수 있습니다.
                                                      위젯 추가는 Extension(e1, e2)과 Neck, Knee에서 가능합니다.
                                                      이 외 Body, Layout, Header, Body, Footer는 Style을 꾸밀 수 있고 Content는 모듈의 내용이 출력됩니다.]]>
                                                      You can arrange/align with CSS, or use Style to design.
                                                      You can add widget from Extension(e1, e2), Neck and Knee.
                                                      Also Body, Layout, Header, Body, Footer can designed by Style, and Content will display content.]]>
                                                      - この構造にてCSSを用いた「レイアウト/配列/整列」の調整が可能になり、さらにStyleを使った自由なカスタマイズができます。
                                                      ウィジェットの追加はExtension(e1、e2)と Neck、 Kneeにて可能です。
                                                      その他にもBody、Layout、Header、Body、FooterはStyleをカスタマイズができ、Contentではモジュールの内容が出力されます。]]>
                                                      + 控件插入区为Extension(e1, e2)区和Neck, Knee区。
                                                      另外的Body, Layout, Header, Body, Footer区可以使用Style来进行渲染,Content区是内容显示区。]]>
                                                      可以使用 CSS 或樣式設計。
                                                      可新增 Widget 到 Extension(e1, e2), Neck, Knee 等區域。
                                                      另外 Body, Layout, Header, Body, Footer 可以使用樣式設計,而 Content 區域會顯示內容。]]>
                                                      이 구조에서 CSS를 이용하여 형태/배열/정렬을 할 수 있고 또 Style을 이용하여 꾸밀 수 있습니다.
                                                      위젯 추가는 Extension(e1, e2)와 Neck, Knee에서 가능합니다.
                                                      이 외 Body, Layout, Header, Body, Footer는 Style을 꾸밀 수 있고 Content는 모듈의 내용이 출력됩니다.]]>
                                                      diff --git a/modules/module/tpl/category_list.html b/modules/module/tpl/category_list.html index 0177b9e73..66576b305 100644 --- a/modules/module/tpl/category_list.html +++ b/modules/module/tpl/category_list.html @@ -14,9 +14,9 @@
                                                      - + - + @@ -27,7 +27,7 @@ - + '; + $selectedBody.append(row); + module_srls.push($this.val()); + }); + + $('#manageSelectedModuleSetup input[name=module_srls]').val(module_srls); + $('#manageSelectedModuleAddition input[name=target_module_srl]').val(module_srls); + $('#manageSelectedModuleGrant input[name=module_srls]').val(module_srls); + }); + +}); \ No newline at end of file diff --git a/modules/module/tpl/js/multi_order.js b/modules/module/tpl/js/multi_order.js new file mode 100644 index 000000000..d37f51d2c --- /dev/null +++ b/modules/module/tpl/js/multi_order.js @@ -0,0 +1,75 @@ +(function($){ + +xe.MultiOrderManager = xe.createApp("MultiOrderManager", { + $keyObj: null, + $showObj: null, + $selectedObj: null, + + init: function(key){ + var self = this; + var $keyObj = this.$keyObj = jQuery('input[name='+key+']'); + this.$showObj = $keyObj.parent().find('.multiorder_show'); + this.$selectedObj = $keyObj.parent().find('.multiorder_selected'); + + this.$showObj + .nextAll('button') + .filter('.multiorder_add').bind('click', function(){ self.cast('MULTIORDER_ADD'); return false; }).end() + .filter('.multiorder_del').bind('click', function(){ self.cast('MULTIORDER_DEL'); return false; }).end() + .filter('.multiorder_up').bind('click', function(){ self.cast('MULTIORDER_UP'); return false; }).end() + .filter('.multiorder_down').bind('click', function(){ self.cast('MULTIORDER_DOWN'); return false; }).end() + + this.cast('MULTIORDER_SYNC'); + }, + + API_MULTIORDER_ADD: function(){ + this.$showObj + .find('>option:selected') + .appendTo(this.$selectedObj); + + this.refreshValue(); + }, + + API_MULTIORDER_DEL: function(){ + this.$selectedObj + .find('>option:selected[default!="true"]') + .appendTo(this.$showObj); + + this.refreshValue(); + }, + + API_MULTIORDER_UP: function(){ + var $selected = this.$selectedObj.find('>option:selected'); + $selected.eq(0).prev('option').before($selected); + this.refreshValue(); + }, + + API_MULTIORDER_DOWN: function(){ + var $selected = this.$selectedObj.find('>option:selected'); + $selected.eq(-1).next('option').after($selected); + this.refreshValue(); + }, + + API_MULTIORDER_SYNC: function(){ + var values = this.$keyObj.val().split(','); + this.$selectedObj.find('>option').appendTo(this.$showObj); + + var targets = []; + for(var i in values){ + var target = this.$showObj.find('>option[value='+values[i]+']').get(0); + if (target != undefined) targets.push(target); + } + $(targets).appendTo(this.$selectedObj); + }, + + refreshValue : function() { + var values = []; + + this.$selectedObj.find('>option').each(function(){ + values.push(this.value); + }); + + this.$keyObj.val(values.join(',')); + } +}); + +})(jQuery); \ No newline at end of file From 477db7ed4f212bc181e6b154fd4b138d3f600775 Mon Sep 17 00:00:00 2001 From: taggon Date: Tue, 25 Oct 2011 02:06:53 +0000 Subject: [PATCH 1245/1372] Add zh-TW translation (Thanks to Royallin) git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9721 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/lang/lang.xml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/common/lang/lang.xml b/common/lang/lang.xml index d317e9580..a82c5f49b 100644 --- a/common/lang/lang.xml +++ b/common/lang/lang.xml @@ -880,7 +880,7 @@ - + @@ -3478,12 +3478,12 @@ Xin vui lòng kiểm tra lại thông tin Database.]]> - + files/config/ftp.config.php 파일에 저장 됩니다. 설치 후 환경설정 페이지에서도 등록, 변경, 제거 할 수 있습니다.]]> files/config/ftp.config.php. You can add, change or delete this on the Settings page after the installation.]]> - files/config/ftp.config.php. You can add, change or delete this on the Settings page after the installation.]]> + files/config/ftp.config.php 檔案中。 安裝後可在設定頁面中新增、更改或刪除此資訊。]]> files/config/ftp.config.php gespeichert. Nach der Installation ist es auch möglich, dass die Angabe von Administrator modifiziert oder gelöscht werden kann.]]> @@ -3763,6 +3763,7 @@ Xin vui lòng kiểm tra lại thông tin Database.]]> + From 29f0d4a503dee5d872d8ab573e2ac8f58b3e766d Mon Sep 17 00:00:00 2001 From: taggon Date: Tue, 25 Oct 2011 06:00:57 +0000 Subject: [PATCH 1246/1372] 1. Use __XE__ instead of __ZBXE__ 2. Reformat indentations git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9722 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- addons/adminlogging/adminlogging.addon.php | 26 +- addons/autolink/autolink.addon.php | 18 +- addons/blogapi/blogapi.addon.php | 789 +++++++++--------- addons/blogapi/blogapi.func.php | 2 +- addons/counter/counter.addon.php | 22 +- .../member_communication.addon.php | 129 ++- .../member_extra_info.addon.php | 34 +- addons/mobile/mobile.addon.php | 92 +- .../openid_delegation_id.addon.php | 44 +- .../point_level_icon.addon.php | 26 +- .../point_level_icon/point_level_icon.lib.php | 88 +- addons/resize_image/resize_image.addon.php | 28 +- 12 files changed, 648 insertions(+), 650 deletions(-) diff --git a/addons/adminlogging/adminlogging.addon.php b/addons/adminlogging/adminlogging.addon.php index ecb358492..a3eb4981a 100644 --- a/addons/adminlogging/adminlogging.addon.php +++ b/addons/adminlogging/adminlogging.addon.php @@ -1,17 +1,17 @@ is_admin == 'Y') { - $oAdminloggingController = &getController('adminlogging'); - $oAdminloggingController->insertLog($this->module, $this->act); - } +if($called_position == 'before_module_proc' && $kind == 'admin' && $logged_info->is_admin == 'Y') { + $oAdminloggingController = &getController('adminlogging'); + $oAdminloggingController->insertLog($this->module, $this->act); +} ?> diff --git a/addons/autolink/autolink.addon.php b/addons/autolink/autolink.addon.php index 722151635..b5910a76a 100644 --- a/addons/autolink/autolink.addon.php +++ b/addons/autolink/autolink.addon.php @@ -1,12 +1,12 @@ diff --git a/addons/blogapi/blogapi.addon.php b/addons/blogapi/blogapi.addon.php index 5dfd4c6a2..e3e241d6f 100644 --- a/addons/blogapi/blogapi.addon.php +++ b/addons/blogapi/blogapi.addon.php @@ -1,422 +1,421 @@ domain, '', 'mid',$site_module_info->mid, 'act','api'); - // Insert rsd tag into the header - Context::addHtmlHeader(" ".''); - } - // If act isnot api, just return - if($_REQUEST['act']!='api') return; - // Read func file - require_once('./addons/blogapi/blogapi.func.php'); - // xmlprc parsing - // Parse the requested xmlrpc - $oXmlParser = new XmlParser(); - $xmlDoc = $oXmlParser->parse(); +/** + * @file blogapicounter.addon.php + * @author NHN (developers@xpressengine.com) + * @brief Add blogAPI + * + * It enables to write a post by using an external tool such as ms live writer, firefox performancing, zoundry and so on. + * It should be called before executing the module(before_module_proc). If not, it is forced to shut down. + **/ +// Insert a rsd tag when called_position is after_module_proc +if($called_position == 'after_module_proc') { + // Create rsd address of the current module + $site_module_info = Context::get('site_module_info'); + $rsd_url = getFullSiteUrl($site_module_info->domain, '', 'mid',$site_module_info->mid, 'act','api'); + // Insert rsd tag into the header + Context::addHtmlHeader(" ".''); +} +// If act isnot api, just return +if($_REQUEST['act']!='api') return; +// Read func file +require_once('./addons/blogapi/blogapi.func.php'); +// xmlprc parsing +// Parse the requested xmlrpc +$oXmlParser = new XmlParser(); +$xmlDoc = $oXmlParser->parse(); - $method_name = $xmlDoc->methodcall->methodname->body; - $params = $xmlDoc->methodcall->params->param; - if($params && !is_array($params)) $params = array($params); - // Compatible with some of methodname - if(in_array($method_name, array('metaWeblog.deletePost', 'metaWeblog.getUsersBlogs', 'metaWeblog.getUserInfo'))) { - $method_name = str_replace('metaWeblog.', 'blogger.', $method_name); - } - // Delete the first argument if it is blogger.deletePost - if($method_name == 'blogger.deletePost') array_shift($params); - // Get user_id, password and attempt log-in - $user_id = trim($params[1]->value->string->body); - $password = trim($params[2]->value->string->body); - // Before executing the module, authentication is processed. - if($called_position == 'before_module_init') { - // Attempt log-in by using member controller - if($user_id && $password) { - $oMemberController = &getController('member'); - $output = $oMemberController->doLogin($user_id, $password); - // If login fails, an error message appears - if(!$output->toBool()) { - $content = getXmlRpcFailure(1, $output->getMessage()); - printContent($content); - } - } else { - $content = getXmlRpcFailure(1, 'not logged'); - printContent($content); - } - } - // Before module processing, handle requests from blogapi tool and then terminate. - if($called_position == 'before_module_proc') { - // Check writing permission - if(!$this->grant->write_document) { - printContent( getXmlRpcFailure(1, 'no permission') ); - } - // Get information of the categories - $oDocumentModel = &getModel('document'); - $category_list = $oDocumentModel->getCategoryList($this->module_srl); - // Specifies a temporary file storage - $tmp_uploaded_path = sprintf('./files/cache/blogapi/%s/%s/', $this->mid, $user_id); - $uploaded_target_path = sprintf('/files/cache/blogapi/%s/%s/', $this->mid, $user_id); +$method_name = $xmlDoc->methodcall->methodname->body; +$params = $xmlDoc->methodcall->params->param; +if($params && !is_array($params)) $params = array($params); +// Compatible with some of methodname +if(in_array($method_name, array('metaWeblog.deletePost', 'metaWeblog.getUsersBlogs', 'metaWeblog.getUserInfo'))) { + $method_name = str_replace('metaWeblog.', 'blogger.', $method_name); +} +// Delete the first argument if it is blogger.deletePost +if($method_name == 'blogger.deletePost') array_shift($params); +// Get user_id, password and attempt log-in +$user_id = trim($params[1]->value->string->body); +$password = trim($params[2]->value->string->body); +// Before executing the module, authentication is processed. +if($called_position == 'before_module_init') { + // Attempt log-in by using member controller + if($user_id && $password) { + $oMemberController = &getController('member'); + $output = $oMemberController->doLogin($user_id, $password); + // If login fails, an error message appears + if(!$output->toBool()) { + $content = getXmlRpcFailure(1, $output->getMessage()); + printContent($content); + } + } else { + $content = getXmlRpcFailure(1, 'not logged'); + printContent($content); + } +} +// Before module processing, handle requests from blogapi tool and then terminate. +if($called_position == 'before_module_proc') { + // Check writing permission + if(!$this->grant->write_document) { + printContent( getXmlRpcFailure(1, 'no permission') ); + } + // Get information of the categories + $oDocumentModel = &getModel('document'); + $category_list = $oDocumentModel->getCategoryList($this->module_srl); + // Specifies a temporary file storage + $tmp_uploaded_path = sprintf('./files/cache/blogapi/%s/%s/', $this->mid, $user_id); + $uploaded_target_path = sprintf('/files/cache/blogapi/%s/%s/', $this->mid, $user_id); - switch($method_name) { - // Blog information - case 'blogger.getUsersBlogs' : - $obj->url = getFullSiteUrl(''); - $obj->blogid = $this->mid; - $obj->blogName = $this->module_info->browser_title; - $blog_list = array($obj); + switch($method_name) { + // Blog information + case 'blogger.getUsersBlogs' : + $obj->url = getFullSiteUrl(''); + $obj->blogid = $this->mid; + $obj->blogName = $this->module_info->browser_title; + $blog_list = array($obj); - $content = getXmlRpcResponse($blog_list); - printContent($content); - break; - // Return a list of categories - case 'metaWeblog.getCategories' : - $category_obj_list = array(); - if($category_list) { - foreach($category_list as $category_srl => $category_info) { - unset($obj); - $obj->description = $category_info->title; - //$obj->htmlUrl = Context::getRequestUri().$this->mid.'/1'; - //$obj->rssUrl= Context::getRequestUri().'rss/'.$this->mid.'/1'; - $obj->title = $category_info->title; - $obj->categoryid = $category_srl; - $category_obj_list[] = $obj; - } - } + $content = getXmlRpcResponse($blog_list); + printContent($content); + break; + // Return a list of categories + case 'metaWeblog.getCategories' : + $category_obj_list = array(); + if($category_list) { + foreach($category_list as $category_srl => $category_info) { + unset($obj); + $obj->description = $category_info->title; + //$obj->htmlUrl = Context::getRequestUri().$this->mid.'/1'; + //$obj->rssUrl= Context::getRequestUri().'rss/'.$this->mid.'/1'; + $obj->title = $category_info->title; + $obj->categoryid = $category_srl; + $category_obj_list[] = $obj; + } + } - $content = getXmlRpcResponse($category_obj_list); - printContent($content); - break; - // Upload file - case 'metaWeblog.newMediaObject' : - // Check a file upload permission - $oFileModel = &getModel('file'); - $file_module_config = $oFileModel->getFileModuleConfig($this->module_srl); - if(is_array($file_module_config->download_grant) && count($file_module_config->download_grant)>0) { - $logged_info = Context::get('logged_info'); - if($logged_info->is_admin != 'Y') { - $is_permitted = false; - for($i=0;$idownload_grant);$i++) { - $group_srl = $file_module_config->download_grant[$i]; - if($logged_info->group_list[$group_srl]) { - $is_permitted = true; - break; - } - } - if(!$is_permitted) printContent( getXmlRpcFailure(1, 'no permission') ); - } - } + $content = getXmlRpcResponse($category_obj_list); + printContent($content); + break; + // Upload file + case 'metaWeblog.newMediaObject' : + // Check a file upload permission + $oFileModel = &getModel('file'); + $file_module_config = $oFileModel->getFileModuleConfig($this->module_srl); + if(is_array($file_module_config->download_grant) && count($file_module_config->download_grant)>0) { + $logged_info = Context::get('logged_info'); + if($logged_info->is_admin != 'Y') { + $is_permitted = false; + for($i=0;$idownload_grant);$i++) { + $group_srl = $file_module_config->download_grant[$i]; + if($logged_info->group_list[$group_srl]) { + $is_permitted = true; + break; + } + } + if(!$is_permitted) printContent( getXmlRpcFailure(1, 'no permission') ); + } + } - $fileinfo = $params[3]->value->struct->member; - foreach($fileinfo as $key => $val) { - $nodename = $val->name->body; - if($nodename == 'bits') $filedata = base64_decode($val->value->base64->body); - elseif($nodename == 'name') $filename = $val->value->string->body; - } + $fileinfo = $params[3]->value->struct->member; + foreach($fileinfo as $key => $val) { + $nodename = $val->name->body; + if($nodename == 'bits') $filedata = base64_decode($val->value->base64->body); + elseif($nodename == 'name') $filename = $val->value->string->body; + } - $tmp_arr = explode('/',$filename); - $filename = array_pop($tmp_arr); + $tmp_arr = explode('/',$filename); + $filename = array_pop($tmp_arr); - if(!is_dir($tmp_uploaded_path)) FileHandler::makeDir($tmp_uploaded_path); + if(!is_dir($tmp_uploaded_path)) FileHandler::makeDir($tmp_uploaded_path); - $target_filename = sprintf('%s%s', $tmp_uploaded_path, $filename); - FileHandler::writeFile($target_filename, $filedata); - $obj->url = Context::getRequestUri().$target_filename; + $target_filename = sprintf('%s%s', $tmp_uploaded_path, $filename); + FileHandler::writeFile($target_filename, $filedata); + $obj->url = Context::getRequestUri().$target_filename; - $content = getXmlRpcResponse($obj); - printContent($content); - break; - // Get posts - case 'metaWeblog.getPost' : - $document_srl = $params[0]->value->string->body; - if(!$document_srl) { - printContent( getXmlRpcFailure(1, 'no permission') ); - } else { - $oDocumentModel = &getModel('document'); - $oDocument = $oDocumentModel->getDocument($document_srl); - if(!$oDocument->isExists() || !$oDocument->isGranted()) { - printContent( getXmlRpcFailure(1, 'no permission') ); - } else { - // Get a list of categories and set Context - $category = ""; - if($oDocument->get('category_srl')) { - $oDocumentModel = &getModel('document'); - $category_list = $oDocumentModel->getCategoryList($oDocument->get('module_srl')); - if($category_list[$oDocument->get('category_srl')]) { - $category = $category_list[$oDocument->get('category_srl')]->title; - } - } - - $content = sprintf( - ''. - ''. - ''. - ''. - ''. - ''. - 'categories'. - 'dateCreated%s'. - 'description'. - 'link%s'. - 'postid%s'. - 'title'. - 'publish1'. - ''. - ''. - ''. - ''. - '', - $category, - date("Ymd", $oDocument->getRegdateTime()).'T'.date("H:i:s", $oDocument->getRegdateTime()), - $oDocument->getContent(false, false, true,false), - getFullUrl('','document_srl', $oDocument->document_srl), - $oDocument->document_srl, - $oDocument->getTitleText() - ); - printContent($content); - } - } - break; - // Write a new post - case 'metaWeblog.newPost' : - unset($obj); - $info = $params[3]; - // Get information of post, title, and category - for($i=0;$ivalue->struct->member);$i++) { - $val = $info->value->struct->member[$i]; - switch($val->name->body) { - case 'title' : - $obj->title = $val->value->string->body; - break; - case 'description' : - $obj->content = $val->value->string->body; - break; - case 'categories' : - $categories = $val->value->array->data->value; - if(!is_array($categories)) $categories = array($categories); - $category = $categories[0]->string->body; - if($category && $category_list) { - foreach($category_list as $category_srl => $category_info) { - if($category_info->title == $category) $obj->category_srl = $category_srl; - } - } - break; - case 'tagwords' : - $tags = $val->value->array->data->value; - if(!is_array($tags)) $tags = array($tags); - for($j=0;$jstring->body; - } - if(count($tag_list)) $obj->tags = implode(',',$tag_list); - break; - } + $content = getXmlRpcResponse($obj); + printContent($content); + break; + // Get posts + case 'metaWeblog.getPost' : + $document_srl = $params[0]->value->string->body; + if(!$document_srl) { + printContent( getXmlRpcFailure(1, 'no permission') ); + } else { + $oDocumentModel = &getModel('document'); + $oDocument = $oDocumentModel->getDocument($document_srl); + if(!$oDocument->isExists() || !$oDocument->isGranted()) { + printContent( getXmlRpcFailure(1, 'no permission') ); + } else { + // Get a list of categories and set Context + $category = ""; + if($oDocument->get('category_srl')) { + $oDocumentModel = &getModel('document'); + $category_list = $oDocumentModel->getCategoryList($oDocument->get('module_srl')); + if($category_list[$oDocument->get('category_srl')]) { + $category = $category_list[$oDocument->get('category_srl')]->title; + } + } + + $content = sprintf( + ''. + ''. + ''. + ''. + ''. + ''. + 'categories'. + 'dateCreated%s'. + 'description'. + 'link%s'. + 'postid%s'. + 'title'. + 'publish1'. + ''. + ''. + ''. + ''. + '', + $category, + date("Ymd", $oDocument->getRegdateTime()).'T'.date("H:i:s", $oDocument->getRegdateTime()), + $oDocument->getContent(false, false, true,false), + getFullUrl('','document_srl', $oDocument->document_srl), + $oDocument->document_srl, + $oDocument->getTitleText() + ); + printContent($content); + } + } + break; + // Write a new post + case 'metaWeblog.newPost' : + unset($obj); + $info = $params[3]; + // Get information of post, title, and category + for($i=0;$ivalue->struct->member);$i++) { + $val = $info->value->struct->member[$i]; + switch($val->name->body) { + case 'title' : + $obj->title = $val->value->string->body; + break; + case 'description' : + $obj->content = $val->value->string->body; + break; + case 'categories' : + $categories = $val->value->array->data->value; + if(!is_array($categories)) $categories = array($categories); + $category = $categories[0]->string->body; + if($category && $category_list) { + foreach($category_list as $category_srl => $category_info) { + if($category_info->title == $category) $obj->category_srl = $category_srl; + } + } + break; + case 'tagwords' : + $tags = $val->value->array->data->value; + if(!is_array($tags)) $tags = array($tags); + for($j=0;$jstring->body; + } + if(count($tag_list)) $obj->tags = implode(',',$tag_list); + break; + } - } - // Set document srl - $document_srl = getNextSequence(); - $obj->document_srl = $document_srl; - $obj->module_srl = $this->module_srl; - // Attachment - if(is_dir($tmp_uploaded_path)) { - $file_list = FileHandler::readDir($tmp_uploaded_path); - $file_count = count($file_list); - if($file_count) { - $oFileController = &getController('file'); - for($i=0;$i<$file_count;$i++) { - $file_info['tmp_name'] = sprintf('%s%s', $tmp_uploaded_path, $file_list[$i]); - $file_info['name'] = $file_list[$i]; - $oFileController->insertFile($file_info, $this->module_srl, $document_srl, 0, true); - } - $obj->uploaded_count = $file_count; - } - } + } + // Set document srl + $document_srl = getNextSequence(); + $obj->document_srl = $document_srl; + $obj->module_srl = $this->module_srl; + // Attachment + if(is_dir($tmp_uploaded_path)) { + $file_list = FileHandler::readDir($tmp_uploaded_path); + $file_count = count($file_list); + if($file_count) { + $oFileController = &getController('file'); + for($i=0;$i<$file_count;$i++) { + $file_info['tmp_name'] = sprintf('%s%s', $tmp_uploaded_path, $file_list[$i]); + $file_info['name'] = $file_list[$i]; + $oFileController->insertFile($file_info, $this->module_srl, $document_srl, 0, true); + } + $obj->uploaded_count = $file_count; + } + } - $obj->content = str_replace($uploaded_target_path,sprintf('/files/attach/images/%s/%s%s', $this->module_srl, getNumberingPath($document_srl,3), $filename), $obj->content); + $obj->content = str_replace($uploaded_target_path,sprintf('/files/attach/images/%s/%s%s', $this->module_srl, getNumberingPath($document_srl,3), $filename), $obj->content); - $oDocumentController = &getController('document'); - $obj->commentStatus = 'ALLOW'; - $obj->allow_trackback = 'Y'; - $output = $oDocumentController->insertDocument($obj); + $oDocumentController = &getController('document'); + $obj->commentStatus = 'ALLOW'; + $obj->allow_trackback = 'Y'; + $output = $oDocumentController->insertDocument($obj); - if(!$output->toBool()) { - $content = getXmlRpcFailure(1, $output->getMessage()); - } else { - $content = getXmlRpcResponse(strval($document_srl)); - } - FileHandler::removeDir($tmp_uploaded_path); + if(!$output->toBool()) { + $content = getXmlRpcFailure(1, $output->getMessage()); + } else { + $content = getXmlRpcResponse(strval($document_srl)); + } + FileHandler::removeDir($tmp_uploaded_path); - printContent($content); - break; - // Edit post - case 'metaWeblog.editPost' : - $tmp_val = $params[0]->value->string->body; - if(!$tmp_val) $tmp_val = $params[0]->value->i4->body; - if(!$tmp_val) { - $content = getXmlRpcFailure(1, 'no permission'); - break; - } - $tmp_arr = explode('/', $tmp_val); - $document_srl = array_pop($tmp_arr); - if(!$document_srl) { - $content = getXmlRpcFailure(1, 'no permission'); - break; - } + printContent($content); + break; + // Edit post + case 'metaWeblog.editPost' : + $tmp_val = $params[0]->value->string->body; + if(!$tmp_val) $tmp_val = $params[0]->value->i4->body; + if(!$tmp_val) { + $content = getXmlRpcFailure(1, 'no permission'); + break; + } + $tmp_arr = explode('/', $tmp_val); + $document_srl = array_pop($tmp_arr); + if(!$document_srl) { + $content = getXmlRpcFailure(1, 'no permission'); + break; + } - $oDocumentModel = &getModel('document'); - $oDocument = $oDocumentModel->getDocument($document_srl); - // Check if a permission to modify a document is granted - if(!$oDocument->isGranted()) { - $content = getXmlRpcFailure(1, 'no permission'); - break; - } + $oDocumentModel = &getModel('document'); + $oDocument = $oDocumentModel->getDocument($document_srl); + // Check if a permission to modify a document is granted + if(!$oDocument->isGranted()) { + $content = getXmlRpcFailure(1, 'no permission'); + break; + } - $obj = $oDocument->getObjectVars(); + $obj = $oDocument->getObjectVars(); - $info = $params[3]; - // Get information of post, title, and category - for($i=0;$ivalue->struct->member);$i++) { - $val = $info->value->struct->member[$i]; - switch($val->name->body) { - case 'title' : - $obj->title = $val->value->string->body; - break; - case 'description' : - $obj->content = $val->value->string->body; - break; - case 'categories' : - $categories = $val->value->array->data->value; - if(!is_array($categories)) $categories = array($categories); - $category = $categories[0]->string->body; - if($category && $category_list) { - foreach($category_list as $category_srl => $category_info) { - if($category_info->title == $category) $obj->category_srl = $category_srl; - } - } - break; - case 'tagwords' : - $tags = $val->value->array->data->value; - if(!is_array($tags)) $tags = array($tags); - for($j=0;$jstring->body; - } - if(count($tag_list)) $obj->tags = implode(',',$tag_list); - break; - } + $info = $params[3]; + // Get information of post, title, and category + for($i=0;$ivalue->struct->member);$i++) { + $val = $info->value->struct->member[$i]; + switch($val->name->body) { + case 'title' : + $obj->title = $val->value->string->body; + break; + case 'description' : + $obj->content = $val->value->string->body; + break; + case 'categories' : + $categories = $val->value->array->data->value; + if(!is_array($categories)) $categories = array($categories); + $category = $categories[0]->string->body; + if($category && $category_list) { + foreach($category_list as $category_srl => $category_info) { + if($category_info->title == $category) $obj->category_srl = $category_srl; + } + } + break; + case 'tagwords' : + $tags = $val->value->array->data->value; + if(!is_array($tags)) $tags = array($tags); + for($j=0;$jstring->body; + } + if(count($tag_list)) $obj->tags = implode(',',$tag_list); + break; + } - } - // Document srl - $obj->document_srl = $document_srl; - $obj->module_srl = $this->module_srl; - // Attachment - if(is_dir($tmp_uploaded_path)) { - $file_list = FileHandler::readDir($tmp_uploaded_path); - $file_count = count($file_list); - if($file_count) { - $oFileController = &getController('file'); - for($i=0;$i<$file_count;$i++) { - $file_info['tmp_name'] = sprintf('%s%s', $tmp_uploaded_path, $file_list[$i]); - $file_info['name'] = $file_list[$i]; + } + // Document srl + $obj->document_srl = $document_srl; + $obj->module_srl = $this->module_srl; + // Attachment + if(is_dir($tmp_uploaded_path)) { + $file_list = FileHandler::readDir($tmp_uploaded_path); + $file_count = count($file_list); + if($file_count) { + $oFileController = &getController('file'); + for($i=0;$i<$file_count;$i++) { + $file_info['tmp_name'] = sprintf('%s%s', $tmp_uploaded_path, $file_list[$i]); + $file_info['name'] = $file_list[$i]; - $moved_filename = sprintf('./files/attach/images/%s/%s/%s', $this->module_srl, $document_srl, $file_info['name']); - if(file_exists($moved_filename)) continue; + $moved_filename = sprintf('./files/attach/images/%s/%s/%s', $this->module_srl, $document_srl, $file_info['name']); + if(file_exists($moved_filename)) continue; - $oFileController->insertFile($file_info, $this->module_srl, $document_srl, 0, true); - } - $obj->uploaded_count += $file_count; - } - } + $oFileController->insertFile($file_info, $this->module_srl, $document_srl, 0, true); + } + $obj->uploaded_count += $file_count; + } + } - $obj->content = str_replace($uploaded_target_path,sprintf('/files/attach/images/%s/%s%s', $this->module_srl, getNumberingPath($document_srl,3), $filename), $obj->content); + $obj->content = str_replace($uploaded_target_path,sprintf('/files/attach/images/%s/%s%s', $this->module_srl, getNumberingPath($document_srl,3), $filename), $obj->content); - $oDocumentController = &getController('document'); - $output = $oDocumentController->updateDocument($oDocument,$obj); + $oDocumentController = &getController('document'); + $output = $oDocumentController->updateDocument($oDocument,$obj); - if(!$output->toBool()) { - $content = getXmlRpcFailure(1, $output->getMessage()); - } else { - $content = getXmlRpcResponse(true); - FileHandler::removeDir($tmp_uploaded_path); - } + if(!$output->toBool()) { + $content = getXmlRpcFailure(1, $output->getMessage()); + } else { + $content = getXmlRpcResponse(true); + FileHandler::removeDir($tmp_uploaded_path); + } - printContent($content); - break; - // Delete the post - case 'blogger.deletePost' : - $tmp_val = $params[0]->value->string->body; - $tmp_arr = explode('/', $tmp_val); - $document_srl = array_pop($tmp_arr); - // Get a document - $oDocumentModel = &getModel('document'); - $oDocument = $oDocumentModel->getDocument($document_srl); - // If the document exists - if(!$oDocument->isExists()) { - $content = getXmlRpcFailure(1, 'not exists'); - // Check if a permission to delete a document is granted - } elseif(!$oDocument->isGranted()) { - $content = getXmlRpcFailure(1, 'no permission'); - break; - // Delete - } else { - $oDocumentController = &getController('document'); - $output = $oDocumentController->deleteDocument($document_srl); - if(!$output->toBool()) $content = getXmlRpcFailure(1, $output->getMessage()); - else $content = getXmlRpcResponse(true); - } + printContent($content); + break; + // Delete the post + case 'blogger.deletePost' : + $tmp_val = $params[0]->value->string->body; + $tmp_arr = explode('/', $tmp_val); + $document_srl = array_pop($tmp_arr); + // Get a document + $oDocumentModel = &getModel('document'); + $oDocument = $oDocumentModel->getDocument($document_srl); + // If the document exists + if(!$oDocument->isExists()) { + $content = getXmlRpcFailure(1, 'not exists'); + // Check if a permission to delete a document is granted + } elseif(!$oDocument->isGranted()) { + $content = getXmlRpcFailure(1, 'no permission'); + break; + // Delete + } else { + $oDocumentController = &getController('document'); + $output = $oDocumentController->deleteDocument($document_srl); + if(!$output->toBool()) $content = getXmlRpcFailure(1, $output->getMessage()); + else $content = getXmlRpcResponse(true); + } - printContent($content); - break; - // Get recent posts - case 'metaWeblog.getRecentPosts' : - // Options to get a list - $args->module_srl = $this->module_srl; // /< module_srl of the current module - $args->page = 1; - $args->list_count = 20; - $args->sort_index = 'list_order'; // /< Sorting values - $logged_info = Context::get('logged_info'); - $args->search_target = 'member_srl'; - $args->search_keyword = $logged_info->member_srl; - $output = $oDocumentModel->getDocumentList($args); - if(!$output->toBool() || !$output->data) { - $content = getXmlRpcFailure(1, 'post not founded'); - printContent($content); - } else { - $oEditorController = &getController('editor'); + printContent($content); + break; + // Get recent posts + case 'metaWeblog.getRecentPosts' : + // Options to get a list + $args->module_srl = $this->module_srl; // /< module_srl of the current module + $args->page = 1; + $args->list_count = 20; + $args->sort_index = 'list_order'; // /< Sorting values + $logged_info = Context::get('logged_info'); + $args->search_target = 'member_srl'; + $args->search_keyword = $logged_info->member_srl; + $output = $oDocumentModel->getDocumentList($args); + if(!$output->toBool() || !$output->data) { + $content = getXmlRpcFailure(1, 'post not founded'); + printContent($content); + } else { + $oEditorController = &getController('editor'); - $posts = array(); - foreach($output->data as $key => $oDocument) { - $post = null; - $post->categories = array(); - $post->dateCreated = date("Ymd", $oDocument->getRegdateTime()).'T'.date("H:i:s", $oDocument->getRegdateTime()); - $post->description = htmlspecialchars($oEditorController->transComponent($oDocument->getContent(false,false,true,false))); - $post->link = $post->permaLink = getFullUrl('','document_srl',$oDocument->document_srl); - $post->postid = $oDocument->document_srl; - $post->title = htmlspecialchars($oDocument->get('title')); - $post->publish = 1; - $post->userid = $oDocument->get('user_id'); - $post->mt_allow_pings = 0; - $post->mt_allow_comments = $oDocument->allowComment()?1:0; - $posts[] = $post; - } - $content = getXmlRpcResponse($posts); - printContent($content); - } - break; - // Display RSD if there is no request - default : - - $homepagelink = getUrl('','mid',$this->mid); - $site_module_info = Context::get('site_module_info'); - $api_url = getFullSiteUrl($site_module_info->domain, '', 'mid',$site_module_info->mid, 'act','api'); - $content = <<data as $key => $oDocument) { + $post = null; + $post->categories = array(); + $post->dateCreated = date("Ymd", $oDocument->getRegdateTime()).'T'.date("H:i:s", $oDocument->getRegdateTime()); + $post->description = htmlspecialchars($oEditorController->transComponent($oDocument->getContent(false,false,true,false))); + $post->link = $post->permaLink = getFullUrl('','document_srl',$oDocument->document_srl); + $post->postid = $oDocument->document_srl; + $post->title = htmlspecialchars($oDocument->get('title')); + $post->publish = 1; + $post->userid = $oDocument->get('user_id'); + $post->mt_allow_pings = 0; + $post->mt_allow_comments = $oDocument->allowComment()?1:0; + $posts[] = $post; + } + $content = getXmlRpcResponse($posts); + printContent($content); + } + break; + // Display RSD if there is no request + default : + $homepagelink = getUrl('','mid',$this->mid); + $site_module_info = Context::get('site_module_info'); + $api_url = getFullSiteUrl($site_module_info->domain, '', 'mid',$site_module_info->mid, 'act','api'); + $content = << @@ -429,8 +428,8 @@ RSDContent; - printContent($content); - break; - } - } + printContent($content); + break; + } +} ?> diff --git a/addons/blogapi/blogapi.func.php b/addons/blogapi/blogapi.func.php index 8d779a0c9..2d289bf40 100644 --- a/addons/blogapi/blogapi.func.php +++ b/addons/blogapi/blogapi.func.php @@ -1,5 +1,5 @@ counterExecute(); - } +/** + * @file counter.addon.php + * @author NHN (developers@xpressengine.com) + * @brief Counter add-on + **/ +// Execute if called_position is before_display_content +if(Context::isInstalled() && $called_position == 'before_module_init' && Context::get('module')!='admin' && Context::getResponseMethod() == 'HTML') { + $oCounterController = &getController('counter'); + $oCounterController->counterExecute(); +} ?> diff --git a/addons/member_communication/member_communication.addon.php b/addons/member_communication/member_communication.addon.php index f91c1b16c..519c7db47 100644 --- a/addons/member_communication/member_communication.addon.php +++ b/addons/member_communication/member_communication.addon.php @@ -1,72 +1,71 @@ module != 'member') { - // Load a language file from the communication module - Context::loadLang('./modules/communication/lang'); - // Add menus on the member login information - $oMemberController = &getController('member'); - $oMemberController->addMemberMenu('dispCommunicationFriend', 'cmd_view_friend'); - $oMemberController->addMemberMenu('dispCommunicationMessages', 'cmd_view_message_box'); - // Pop-up to display messages if a flag on new message is set - $flag_path = './files/member_extra_info/new_message_flags/'.getNumberingPath($logged_info->member_srl); - $flag_file = $flag_path.$logged_info->member_srl; +/** + * Message/Friend munus are added on the pop-up window and member profile. Check if a new message is received + **/ +if($called_position == 'before_module_init' && $this->module != 'member') { + // Load a language file from the communication module + Context::loadLang('./modules/communication/lang'); + // Add menus on the member login information + $oMemberController = &getController('member'); + $oMemberController->addMemberMenu('dispCommunicationFriend', 'cmd_view_friend'); + $oMemberController->addMemberMenu('dispCommunicationMessages', 'cmd_view_message_box'); + // Pop-up to display messages if a flag on new message is set + $flag_path = './files/member_extra_info/new_message_flags/'.getNumberingPath($logged_info->member_srl); + $flag_file = $flag_path.$logged_info->member_srl; - if(file_exists($flag_file)) { - $new_message_count = trim(FileHandler::readFile($flag_file)); - FileHandler::removeFile($flag_file); - Context::loadLang('./addons/member_communication/lang'); - Context::loadFile(array('./addons/member_communication/tpl/member_communication.js'), true); + if(file_exists($flag_file)) { + $new_message_count = trim(FileHandler::readFile($flag_file)); + FileHandler::removeFile($flag_file); + Context::loadLang('./addons/member_communication/lang'); + Context::loadFile(array('./addons/member_communication/tpl/member_communication.js'), true); - $text = preg_replace('@\r?\n@', '\\n', addslashes(Context::getLang('alert_new_message_arrived'))); - $link = Context::getRequestUri().'?module=communication&act=dispCommunicationNewMessage'; - $script = ""; + $text = preg_replace('@\r?\n@', '\\n', addslashes(Context::getLang('alert_new_message_arrived'))); + $link = Context::getRequestUri().'?module=communication&act=dispCommunicationNewMessage'; + $script = ""; - Context::addHtmlFooter($script); - } - } elseif($called_position == 'before_module_proc' && $this->act == 'getMemberMenu') { - - $oMemberController = &getController('member'); - $member_srl = Context::get('target_srl'); - $mid = Context::get('cur_mid'); - // Creates communication model object - $oCommunicationModel = &getModel('communication'); - // Add a feature to display own message box. - if($logged_info->member_srl == $member_srl) { - // Add your own viewing Note Template - $oMemberController->addMemberPopupMenu(getUrl('','mid',$mid,'act','dispCommunicationMessages'), 'cmd_view_message_box', '', 'self'); - // Display a list of friends - $oMemberController->addMemberPopupMenu(getUrl('','mid',$mid,'act','dispCommunicationFriend'), 'cmd_view_friend', '', 'self'); - // If not, Add menus to send message and to add friends - } else { - // Get member information - $oMemberModel = &getModel('member'); - $target_member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); - if(!$target_member_info->member_srl) return; - // Get logged-in user information - $logged_info = Context::get('logged_info'); - // Add a menu for sending message - if( $logged_info->is_admin == 'Y' || $target_member_info->allow_message =='Y' || ($target_member_info->allow_message == 'F' && $oCommunicationModel->isFriend($member_srl))) - $oMemberController->addMemberPopupMenu(getUrl('','module','communication','act','dispCommunicationSendMessage','receiver_srl',$member_srl), 'cmd_send_message', '', 'popup'); - // Add a menu for listing friends (if a friend is new) - if(!$oCommunicationModel->isAddedFriend($member_srl)) - $oMemberController->addMemberPopupMenu(getUrl('','module','communication','act','dispCommunicationAddFriend','target_srl',$member_srl), 'cmd_add_friend', '', 'popup'); - } - } + Context::addHtmlFooter($script); + } +} elseif($called_position == 'before_module_proc' && $this->act == 'getMemberMenu') { + $oMemberController = &getController('member'); + $member_srl = Context::get('target_srl'); + $mid = Context::get('cur_mid'); + // Creates communication model object + $oCommunicationModel = &getModel('communication'); + // Add a feature to display own message box. + if($logged_info->member_srl == $member_srl) { + // Add your own viewing Note Template + $oMemberController->addMemberPopupMenu(getUrl('','mid',$mid,'act','dispCommunicationMessages'), 'cmd_view_message_box', '', 'self'); + // Display a list of friends + $oMemberController->addMemberPopupMenu(getUrl('','mid',$mid,'act','dispCommunicationFriend'), 'cmd_view_friend', '', 'self'); + // If not, Add menus to send message and to add friends + } else { + // Get member information + $oMemberModel = &getModel('member'); + $target_member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl); + if(!$target_member_info->member_srl) return; + // Get logged-in user information + $logged_info = Context::get('logged_info'); + // Add a menu for sending message + if( $logged_info->is_admin == 'Y' || $target_member_info->allow_message =='Y' || ($target_member_info->allow_message == 'F' && $oCommunicationModel->isFriend($member_srl))) + $oMemberController->addMemberPopupMenu(getUrl('','module','communication','act','dispCommunicationSendMessage','receiver_srl',$member_srl), 'cmd_send_message', '', 'popup'); + // Add a menu for listing friends (if a friend is new) + if(!$oCommunicationModel->isAddedFriend($member_srl)) + $oMemberController->addMemberPopupMenu(getUrl('','module','communication','act','dispCommunicationAddFriend','target_srl',$member_srl), 'cmd_add_friend', '', 'popup'); + } +} ?> diff --git a/addons/member_extra_info/member_extra_info.addon.php b/addons/member_extra_info/member_extra_info.addon.php index df80261d1..a107faaa4 100644 --- a/addons/member_extra_info/member_extra_info.addon.php +++ b/addons/member_extra_info/member_extra_info.addon.php @@ -1,21 +1,21 @@ .... - * Check if ther is image name and image mark. Then change it. - **/ +/** + * @file image_name.addon.php + * @author NHN (developers@xpressengine.com) + * @brief Display user image name/image mark + * + * Find member_srl in the part with
                                                      ....
                                                      + * Check if ther is image name and image mark. Then change it. + **/ - /** - * Just before displaying, change image name/ image mark - **/ - if($called_position != "before_display_content" || Context::get('act')=='dispPageAdminContentModify') return; - // Include a file having functions to replace member image name/mark - require_once('./addons/member_extra_info/member_extra_info.lib.php'); - // 1. Find a part
                                                      content
                                                      in the output document, change it to image name/mark by using MemberController::transImageName() - $output = preg_replace_callback('!<(div|span|a)([^\>]*)member_([0-9]+)([^\>]*)>(.*?)\<\/(div|span|a)\>!is', 'memberTransImageName', $output); +/** + * Just before displaying, change image name/ image mark + **/ +if($called_position != "before_display_content" || Context::get('act')=='dispPageAdminContentModify') return; +// Include a file having functions to replace member image name/mark +require_once('./addons/member_extra_info/member_extra_info.lib.php'); +// 1. Find a part
                                                      content
                                                      in the output document, change it to image name/mark by using MemberController::transImageName() +$output = preg_replace_callback('!<(div|span|a)([^\>]*)member_([0-9]+)([^\>]*)>(.*?)\<\/(div|span|a)\>!is', 'memberTransImageName', $output); ?> diff --git a/addons/mobile/mobile.addon.php b/addons/mobile/mobile.addon.php index 79d50e7c0..15bde8a8a 100644 --- a/addons/mobile/mobile.addon.php +++ b/addons/mobile/mobile.addon.php @@ -1,50 +1,50 @@ call when changing general settings for mobile - * - * after_module_proc > display mobile content - * Condition - **/ - // Ignore admin page - if(Context::get('module')=='admin') return; - // Manage when to call it - if($called_position != 'before_module_proc' && $called_position != 'after_module_proc' ) return; - // Ignore if not mobile browser - require_once(_XE_PATH_.'addons/mobile/classes/mobile.class.php'); - if(!mobileXE::getBrowserType()) return; - // Generate mobile instance - $oMobile = &mobileXE::getInstance(); - if(!$oMobile) return; - // Specify charset on the add-on settings - $oMobile->setCharSet($addon_info->charset); - // Set module information - $oMobile->setModuleInfo($this->module_info); - // Register the current module object - $oMobile->setModuleInstance($this); - // Extract content and display/exit if navigate mode is or if WAP class exists - if($called_position == 'before_module_proc') { +/** + * @file mobile.addon.php + * @author NHN (developers@xpressengine.com) + * @brief Mobile XE add-on + * + * If a mobile connection is made (see the header information), display contents with WAP tags + * + * Time to call + * + * before_module_proc > call when changing general settings for mobile + * + * after_module_proc > display mobile content + * Condition + **/ +// Ignore admin page +if(Context::get('module')=='admin') return; +// Manage when to call it +if($called_position != 'before_module_proc' && $called_position != 'after_module_proc' ) return; +// Ignore if not mobile browser +require_once(_XE_PATH_.'addons/mobile/classes/mobile.class.php'); +if(!mobileXE::getBrowserType()) return; +// Generate mobile instance +$oMobile = &mobileXE::getInstance(); +if(!$oMobile) return; +// Specify charset on the add-on settings +$oMobile->setCharSet($addon_info->charset); +// Set module information +$oMobile->setModuleInfo($this->module_info); +// Register the current module object +$oMobile->setModuleInstance($this); +// Extract content and display/exit if navigate mode is or if WAP class exists +if($called_position == 'before_module_proc') { - if($oMobile->isLangChange()) { - $oMobile->setLangType(); - $oMobile->displayLangSelect(); - } - // On navigation mode, display navigation content - if($oMobile->isNavigationMode()) $oMobile->displayNavigationContent(); - // If you have a WAP class content output via WAP class - else $oMobile->displayModuleContent(); - // If neither navigation mode nor WAP class is, display the module's result - } else if($called_position == 'after_module_proc') { - // Display - $oMobile->displayContent(); - } + if($oMobile->isLangChange()) { + $oMobile->setLangType(); + $oMobile->displayLangSelect(); + } + // On navigation mode, display navigation content + if($oMobile->isNavigationMode()) $oMobile->displayNavigationContent(); + // If you have a WAP class content output via WAP class + else $oMobile->displayModuleContent(); +// If neither navigation mode nor WAP class is, display the module's result +} else if($called_position == 'after_module_proc') { + // Display + $oMobile->displayContent(); +} ?> diff --git a/addons/openid_delegation_id/openid_delegation_id.addon.php b/addons/openid_delegation_id/openid_delegation_id.addon.php index 4207ef43f..db1e90c88 100644 --- a/addons/openid_delegation_id/openid_delegation_id.addon.php +++ b/addons/openid_delegation_id/openid_delegation_id.addon.php @@ -1,27 +1,27 @@ server||!$addon_info->delegate||!$addon_info->xrds) return; +/** + * @file openid_delegation_id.addon.php + * @author NHN (developers@xpressengine.com) + * @brief OpenID Delegation ID Add-on + * + * This enables to use openID as user's homepage or blog url. + * Enter your open ID service information on the configuration. + **/ +// Execute only wen called_position is before_module_init +if($called_position != 'before_module_init') return; +// Get add-on settings(openid_delegation_id) +if(!$addon_info->server||!$addon_info->delegate||!$addon_info->xrds) return; - $header_script = sprintf( - ''."\n". - ''."\n". - '', - $addon_info->server, - $addon_info->delegate, - $addon_info->xrds - ); +$header_script = sprintf( + ''."\n". + ''."\n". + '', + $addon_info->server, + $addon_info->delegate, + $addon_info->xrds +); - Context::addHtmlHeader($header_script); +Context::addHtmlHeader($header_script); ?> diff --git a/addons/point_level_icon/point_level_icon.addon.php b/addons/point_level_icon/point_level_icon.addon.php index 77fa75fb4..28cedf744 100644 --- a/addons/point_level_icon/point_level_icon.addon.php +++ b/addons/point_level_icon/point_level_icon.addon.php @@ -1,18 +1,18 @@ ]*)member_([0-9\-]+)([^\>]*)>(.*?)\<\/(div|span|a)\>!is', 'pointLevelIconTrans', $output); +$oPointController = &getController('point'); +$output = preg_replace_callback('!<(div|span|a)([^\>]*)member_([0-9\-]+)([^\>]*)>(.*?)\<\/(div|span|a)\>!is', 'pointLevelIconTrans', $output); ?> diff --git a/addons/point_level_icon/point_level_icon.lib.php b/addons/point_level_icon/point_level_icon.lib.php index 159c7ee21..23daedd7c 100644 --- a/addons/point_level_icon/point_level_icon.lib.php +++ b/addons/point_level_icon/point_level_icon.lib.php @@ -1,52 +1,52 @@ $/', '', $matches[0]); + $orig_text = preg_replace('/'.preg_quote($matches[5],'/').'<\/'.$matches[6].'>$/', '', $matches[0]); - // Check Group Image Mark - $oMemberModel = &getModel('member'); - if($oMemberModel->getGroupImageMark($member_srl)) return $orig_text.$matches[5].''; + // Check Group Image Mark + $oMemberModel = &getModel('member'); + if($oMemberModel->getGroupImageMark($member_srl)) return $orig_text.$matches[5].''; - if(!isset($GLOBALS['_pointLevelIcon'][$member_srl])) { - // Get point configuration - if(!$GLOBALS['_pointConfig']) { - $oModuleModel = &getModel('module'); - $GLOBALS['_pointConfig'] = $oModuleModel->getModuleConfig('point'); - } - $config = $GLOBALS['_pointConfig']; - // Get point model - if(!$GLOBALS['_pointModel']) $GLOBALS['_pointModel'] = getModel('point'); - $oPointModel = &$GLOBALS['_pointModel']; - // Get points - if(!$oPointModel->isExistsPoint($member_srl)) return $matches[0]; - $point = $oPointModel->getPoint($member_srl); - // Get level - $level = $oPointModel->getLevel($point, $config->level_step); - $text = $matches[5]; - // Get a path where level icon is - $level_icon = sprintf('%smodules/point/icons/%s/%d.gif', Context::getRequestUri(), $config->level_icon, $level); - // Get per to go to the next level if not a top level - if($level < $config->max_level) { - $next_point = $config->level_step[$level+1]; - $present_point = $config->level_step[$level]; - if($next_point > 0) { - $per = (int)(($point - $present_point) / ($next_point - $present_point)*100); - $per = $per.'%'; - } - } + if(!isset($GLOBALS['_pointLevelIcon'][$member_srl])) { + // Get point configuration + if(!$GLOBALS['_pointConfig']) { + $oModuleModel = &getModel('module'); + $GLOBALS['_pointConfig'] = $oModuleModel->getModuleConfig('point'); + } + $config = $GLOBALS['_pointConfig']; + // Get point model + if(!$GLOBALS['_pointModel']) $GLOBALS['_pointModel'] = getModel('point'); + $oPointModel = &$GLOBALS['_pointModel']; + // Get points + if(!$oPointModel->isExistsPoint($member_srl)) return $matches[0]; + $point = $oPointModel->getPoint($member_srl); + // Get level + $level = $oPointModel->getLevel($point, $config->level_step); + $text = $matches[5]; + // Get a path where level icon is + $level_icon = sprintf('%smodules/point/icons/%s/%d.gif', Context::getRequestUri(), $config->level_icon, $level); + // Get per to go to the next level if not a top level + if($level < $config->max_level) { + $next_point = $config->level_step[$level+1]; + $present_point = $config->level_step[$level]; + if($next_point > 0) { + $per = (int)(($point - $present_point) / ($next_point - $present_point)*100); + $per = $per.'%'; + } + } - $title = sprintf('%s:%s%s%s, %s:%s/%s', Context::getLang('point'), $point, $config->point_name, $per?' ('.$per.')':'', Context::getLang('level'), $level, $config->max_level); - $alt = sprintf('[%s:%s]', Context::getLang('level'), $level); + $title = sprintf('%s:%s%s%s, %s:%s/%s', Context::getLang('point'), $point, $config->point_name, $per?' ('.$per.')':'', Context::getLang('level'), $level, $config->max_level); + $alt = sprintf('[%s:%s]', Context::getLang('level'), $level); - $GLOBALS['_pointLevelIcon'][$member_srl] = sprintf('%s', $level_icon, $alt, $title); - } - $text = $GLOBALS['_pointLevelIcon'][$member_srl]; + $GLOBALS['_pointLevelIcon'][$member_srl] = sprintf('%s', $level_icon, $alt, $title); + } + $text = $GLOBALS['_pointLevelIcon'][$member_srl]; - return $orig_text.$text.$matches[5].''; - } + return $orig_text.$text.$matches[5].''; +} ?> diff --git a/addons/resize_image/resize_image.addon.php b/addons/resize_image/resize_image.addon.php index fde6e62fd..5b10d33ec 100644 --- a/addons/resize_image/resize_image.addon.php +++ b/addons/resize_image/resize_image.addon.php @@ -1,18 +1,18 @@ From afa40dc8ad72247c6077a64cc1e10a9b729a8ff2 Mon Sep 17 00:00:00 2001 From: chschy Date: Tue, 25 Oct 2011 06:40:56 +0000 Subject: [PATCH 1247/1372] add git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9723 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/tpl/admin_setup.html | 3 +++ modules/admin/tpl/config_ftp.html | 1 + modules/admin/tpl/config_general.html | 3 ++- modules/admin/tpl/index.html | 1 + modules/admin/tpl/theme.html | 1 + modules/comment/tpl/comment_list.html | 1 + modules/comment/tpl/comment_module_config.html | 1 + modules/comment/tpl/declared_list.html | 1 + .../communication/skins/default/add_friend.html | 1 + .../skins/default/add_friend_group.html | 1 + modules/communication/skins/default/friends.html | 1 + modules/communication/skins/default/messages.html | 2 ++ .../communication/skins/default/send_message.html | 1 + modules/communication/tpl/index.html | 1 + modules/document/tpl/category_list.html | 1 + modules/document/tpl/checked_list.html | 1 + modules/document/tpl/declared_list.html | 2 ++ modules/document/tpl/document_alias.html | 2 ++ modules/document/tpl/document_config.html | 1 + modules/document/tpl/document_list.html | 2 ++ modules/document/tpl/extra_keys.html | 1 + modules/editor/tpl/admin_index.html | 2 ++ modules/editor/tpl/config_preview.html | 2 +- modules/editor/tpl/editor_module_config.html | 1 + modules/editor/tpl/setup_component.html | 1 + modules/file/tpl/adminConfig.html | 1 + modules/file/tpl/file_config.html | 1 + modules/file/tpl/file_list.html | 2 ++ modules/file/tpl/file_module_config.html | 1 + modules/install/tpl/introduce.html | 1 + modules/layout/tpl/insert_layout.html | 1 + modules/layout/tpl/layout_edit.html | 1 + .../member/skins/default/find_member_account.html | 3 ++- modules/member/skins/default/leave_form.html | 1 + modules/member/skins/default/modify_password.html | 1 + .../member/skins/default/resend_auth_mail.html | 1 + modules/member/skins/default/signup_form.html | 1 + modules/member/tpl/denied_id_list.html | 1 + modules/member/tpl/group_list.html | 1 + modules/member/tpl/group_update_form.html | 1 + modules/member/tpl/insert_member.html | 1 + modules/member/tpl/manage_member_group.html | 1 + modules/member/tpl/member_config.html | 2 ++ modules/member/tpl/member_list.html | 2 ++ modules/member/tpl/signup_form.html | 1 + modules/menu/tpl/menu_insert.html | 1 + modules/menu/tpl/menu_management.html | 2 ++ modules/menu/tpl/sitemap.html | 2 ++ .../message/m.skins/default/system_message.html | 1 + modules/message/skins/default/system_message.html | 1 + modules/message/tpl/config.html | 1 + modules/module/tpl/category_list.html | 2 ++ modules/module/tpl/category_update_form.html | 1 + modules/module/tpl/copy_module.html | 1 + modules/module/tpl/module_grant_setup.html | 1 + modules/module/tpl/module_langcode.html | 1 + modules/module/tpl/module_setup.html | 1 + modules/page/tpl/page_delete.html | 1 + modules/page/tpl/page_info.html | 1 + modules/point/tpl/config.html | 1 + modules/point/tpl/member_list.html | 4 +++- modules/point/tpl/module_config.html | 1 + modules/poll/skins/default/form.html | 1 + modules/poll/skins/simple/form.html | 1 + modules/poll/tpl/config.html | 1 + modules/poll/tpl/poll_list.html | 4 +++- modules/rss/tpl/rss_module_config.html | 1 + modules/spamfilter/tpl/index.html | 15 ++++++++------- modules/trackback/tpl/send_trackback_form.html | 1 + modules/trackback/tpl/trackback_list.html | 1 + .../trackback/tpl/trackback_module_config.html | 1 + modules/trash/tpl/trash_list.html | 2 ++ .../widget/tpl/widget_generate_code_in_page.html | 1 + 73 files changed, 100 insertions(+), 12 deletions(-) diff --git a/modules/admin/tpl/admin_setup.html b/modules/admin/tpl/admin_setup.html index 48e7f21b3..f1313c16b 100644 --- a/modules/admin/tpl/admin_setup.html +++ b/modules/admin/tpl/admin_setup.html @@ -5,6 +5,7 @@

                                                      {$XE_VALIDATOR_MESSAGE}

                                                      +

                                                      {$lang->title}

                                                      @@ -30,6 +31,7 @@
                                                      + @@ -63,6 +65,7 @@ +

                                                      {$lang->install_env_agreement}

                                                      {$lang->install_env_agreement_desc}

                                                      diff --git a/modules/admin/tpl/theme.html b/modules/admin/tpl/theme.html index 5532424c2..ddd142866 100644 --- a/modules/admin/tpl/theme.html +++ b/modules/admin/tpl/theme.html @@ -24,6 +24,7 @@ $('#theme').data('themes', themes);

                                                      {$lang->menu_gnb_sub['theme']}

                                                      {$XE_VALIDATOR_ERROR}

                                                      +

                                                      {$lang->theme_setting}

                                                      diff --git a/modules/comment/tpl/comment_list.html b/modules/comment/tpl/comment_list.html index 3e18130a1..b7628f2f2 100644 --- a/modules/comment/tpl/comment_list.html +++ b/modules/comment/tpl/comment_list.html @@ -72,6 +72,7 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}'; + diff --git a/modules/communication/skins/default/add_friend.html b/modules/communication/skins/default/add_friend.html index f0bfb2f50..d8721862b 100644 --- a/modules/communication/skins/default/add_friend.html +++ b/modules/communication/skins/default/add_friend.html @@ -6,6 +6,7 @@

                                                      {$XE_VALIDATOR_MESSAGE}

                                                      +
                                                      diff --git a/modules/communication/skins/default/add_friend_group.html b/modules/communication/skins/default/add_friend_group.html index df92f293e..b558cfd73 100644 --- a/modules/communication/skins/default/add_friend_group.html +++ b/modules/communication/skins/default/add_friend_group.html @@ -11,6 +11,7 @@

                                                      {$XE_VALIDATOR_MESSAGE}

                                                      +
                                                        diff --git a/modules/communication/skins/default/friends.html b/modules/communication/skins/default/friends.html index e2c685861..9ac3c1877 100644 --- a/modules/communication/skins/default/friends.html +++ b/modules/communication/skins/default/friends.html @@ -6,6 +6,7 @@

                                                        {$XE_VALIDATOR_MESSAGE}

                                                        +
                                                        diff --git a/modules/communication/skins/default/messages.html b/modules/communication/skins/default/messages.html index bfd549c14..63f22eb37 100644 --- a/modules/communication/skins/default/messages.html +++ b/modules/communication/skins/default/messages.html @@ -9,6 +9,7 @@
                                                        +
                                                        diff --git a/modules/communication/skins/default/send_message.html b/modules/communication/skins/default/send_message.html index 9469546ad..07cb65fd2 100644 --- a/modules/communication/skins/default/send_message.html +++ b/modules/communication/skins/default/send_message.html @@ -4,6 +4,7 @@

                                                        {$XE_VALIDATOR_MESSAGE}

                                                        + diff --git a/modules/communication/tpl/index.html b/modules/communication/tpl/index.html index 703713da8..372764b57 100644 --- a/modules/communication/tpl/index.html +++ b/modules/communication/tpl/index.html @@ -6,6 +6,7 @@

                                                        {$XE_VALIDATOR_MESSAGE}

                                                        +
                                                      {$lang->category_title}{$lang->category_title} {$lang->regdate}  
                                                      {$val->title}{$val->title} {zdate($val->regdate,"Y-m-d H:i:s")} {$lang->cmd_modify} @@ -45,13 +45,9 @@ -
                                                        -
                                                      • -

                                                        -

                                                        -
                                                      • -
                                                      - + + +
                                                      diff --git a/modules/module/tpl/module_setup.html b/modules/module/tpl/module_setup.html index 25719298a..ae524b3f2 100644 --- a/modules/module/tpl/module_setup.html +++ b/modules/module/tpl/module_setup.html @@ -1,74 +1,69 @@ -

                                                      {$lang->bundle_setup}

                                                      {$XE_VALIDATOR_MESSAGE}

                                                      -
                                                      + -
                                                      - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                      {$lang->module_category} - -

                                                      {$lang->about_module_category}

                                                      -
                                                      {$lang->layout} - + + + + -

                                                      {$lang->about_layout}

                                                      -
                                                      {$lang->skin} - -

                                                      {$lang->about_skin}

                                                      -
                                                      {$lang->description} - -

                                                      {$lang->about_description}

                                                      -
                                                      {$lang->header_text} - -

                                                      {$lang->about_header_text}

                                                      -
                                                      {$lang->footer_text} - -

                                                      {$lang->about_footer_text}

                                                      -
                                                      -
                                                      - +

                                                      +

                                                      {$lang->about_skin}

                                                      + +
                                                    • +

                                                      +

                                                      + +

                                                      +

                                                      {$lang->about_description}

                                                      +
                                                    • +
                                                    • +

                                                      +

                                                      + +

                                                      +

                                                      {$lang->about_header_text}

                                                      +
                                                    • +
                                                    • +

                                                      +

                                                      + +

                                                      +

                                                      {$lang->about_footer_text}

                                                      +
                                                    • +
                                                      From 2773e107a9f0ea3e48a27ec0e5d17c3c6c700df8 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Wed, 19 Oct 2011 07:02:19 +0000 Subject: [PATCH 1205/1372] Issue 541 resolved. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9679 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/trackback/trackback.controller.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/trackback/trackback.controller.php b/modules/trackback/trackback.controller.php index 63b82d146..c42dac186 100644 --- a/modules/trackback/trackback.controller.php +++ b/modules/trackback/trackback.controller.php @@ -97,7 +97,7 @@ // Add a link sent yeokingeul $oDocumentController = &getController('document'); $url = getUrl('','module','trackback','act','dispTrackbackSend','document_srl', $document_srl); - $oDocumentController->addDocumentPopupMenu($url,'cmd_send_trackback','./modules/document/tpl/icons/send_trackback.gif','popup'); + $oDocumentController->addDocumentPopupMenu($url,'cmd_send_trackback','','popup'); return new Object(); } From 255fdc321b1c5404c148beb253f35baedd2f9926 Mon Sep 17 00:00:00 2001 From: ovclas Date: Wed, 19 Oct 2011 08:11:36 +0000 Subject: [PATCH 1206/1372] issue 56 point cache improve performance by using memory git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9680 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/point/point.model.php | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/modules/point/point.model.php b/modules/point/point.model.php index fa7f82820..b6759fbea 100644 --- a/modules/point/point.model.php +++ b/modules/point/point.model.php @@ -6,6 +6,7 @@ **/ class pointModel extends point { + var $pointList = array(); /** * @brief Initialization @@ -18,6 +19,9 @@ **/ function isExistsPoint($member_srl) { $member_srl = abs($member_srl); + + if($this->pointList[$member_srl]) return true; + $args->member_srl = $member_srl; $output = executeQuery('point.getPoint', $args); if($output->data->member_srl == $member_srl) return true; @@ -29,16 +33,25 @@ **/ function getPoint($member_srl, $from_db = false) { $member_srl = abs($member_srl); + + // Get from instance memory + if(!$from_db && $this->pointList[$member_srl]) + return $this->pointList[$member_srl]; + + // Get from file cache $path = sprintf('./files/member_extra_info/point/%s',getNumberingPath($member_srl)); if(!is_dir($path)) FileHandler::makeDir($path); $cache_filename = sprintf('%s%d.cache.txt', $path, $member_srl); - if(!$from_db && file_exists($cache_filename)) return trim(FileHandler::readFile($cache_filename)); + if(!$from_db && file_exists($cache_filename)) + return $this->pointList[$member_srl] = trim(FileHandler::readFile($cache_filename)); + // Get from the DB $args->member_srl = $member_srl; $output = executeQuery('point.getPoint', $args); $point = (int)$output->data->point; + $this->pointList[$member_srl] = $point; FileHandler::writeFile($cache_filename, $point); return $point; From 342489432234a0881572bcd86a4b4c2b43880f4b Mon Sep 17 00:00:00 2001 From: flyskyko Date: Wed, 19 Oct 2011 08:50:52 +0000 Subject: [PATCH 1207/1372] make js/css min git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9681 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/js/xe.js | 2 -- common/js/xe.min.js | 2 +- modules/admin/tpl/js/admin.min.js | 4 ++-- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/common/js/xe.js b/common/js/xe.js index ffb48ebab..75fb3e6ec 100644 --- a/common/js/xe.js +++ b/common/js/xe.js @@ -2086,5 +2086,3 @@ function legacy_filter(filter_name, form, module, act, callback, responses, conf return false; } -/* Modal Fog Layer */ -jQuery(function($){$('.wfsr_fog>.bg').height($(document).height());}); \ No newline at end of file diff --git a/common/js/xe.min.js b/common/js/xe.min.js index 515837413..9ac416674 100644 --- a/common/js/xe.min.js +++ b/common/js/xe.min.js @@ -71,4 +71,4 @@ b[0].toLowerCase();delete l[c]},API_APPLY_RULE:function(b,c){var d=c[0],g=c[1];r b){alert(b[0])},API_ADD_MESSAGE:function(a,b){c[b[0]]=b[1]},API_GET_MESSAGE:function(a,b){var d=b[0];return c[d]||d},API_ADD_CALLBACK:function(a,b){j[b[0]]=b[1]},API_REMOVE_CALLBACK:function(a,b){delete j[b[0]]}}));xe.registerApp(m);var k=xe.createPlugin("editor_stub",{API_BEFORE_VALIDATE:function(a,b){var c=b[0].getAttribute("editor_sequence");if(c&&typeof c=="object")c=c.value;if(c)try{editorRelKeys[c].content.value=editorRelKeys[c].func(c)||""}catch(d){}}});m.registerPlugin(new k)})(jQuery); function filterAlertMessage(a){var b=a.message,d=a.act,a=a.redirect_url,c=location.href;typeof b!="undefined"&&b&&b!="success"&&alert(b);typeof d!="undefined"&&d?c=current_url.setQuery("act",d):typeof a!="undefined"&&a&&(c=a);c==location.href&&(c=c.replace(/#(.*)$/,""));location.href=c}function procFilter(a,b){b(a);return false} function legacy_filter(a,b,d,c,e,g,j,l){var m=xe.getApp("Validator")[0],k=jQuery,h=[];if(!m)return false;b.elements._filter||k(b).prepend('');b.elements._filter.value=a;h[0]=a;h[1]=function(a){var h={},a=k(a).serializeArray();k.each(a,function(a,b){var c=k.trim(b.value),d=b.name;if(!c||!d)return true;l[d]&&(d=l[d]);/\[\]$/.test(d)&&(d=d.replace(/\[\]$/,""));h[d]?h[d]+="|@|"+c:h[d]=b.value});if(j&&!confirm(j))return false;exec_xml(d,c,h,e,g,h,b)};m.cast("ADD_CALLBACK", -h);m.cast("VALIDATE",[b,a]);return false};jQuery(function($){$('.wfsr_fog>.bg').height($(document).height());}); +h);m.cast("VALIDATE",[b,a]);return false}; diff --git a/modules/admin/tpl/js/admin.min.js b/modules/admin/tpl/js/admin.min.js index 5cc074d59..ce047bad5 100644 --- a/modules/admin/tpl/js/admin.min.js +++ b/modules/admin/tpl/js/admin.min.js @@ -2,8 +2,8 @@ jQuery(function(a){a(".form li").find(">input:text,>input:password,>textarea").f "fast")}).end().parent().css("position","relative");var c=a("input:radio+label,input:checkbox+label").prev("input");c.change(function(){var b=a(this).attr("name");c.filter(function(){return this.name==b}).next("label").css("font-weight","normal").end().filter(":checked").next("label").css("font-weight","bold").end()}).change();a(".form th>input:checkbox").change(function(){var b=a(this),d=b.data("name");b.closest("table").find("input:checkbox").filter(function(){var b=a(this);return!b.prop("disabled")&& (b.attr("name")==d||b.data("name")==d)}).prop("checked",b.prop("checked")).end().end().trigger("update.checkbox",[d,this.checked])});a.fn.xePagination=function(){this.not(".xe-pagination").addClass("xe-pagination").find("span.tgContent").css("whiteSpace","nowrap").end().find("a.tgAnchor").each(function(){var b=a(this);b.after(a(b.attr("href")))}).end();return this};a(".pagination").xePagination();a(".portlet .action").css({display:"none",position:"absolute"}).parent().mouseleave(function(){a(this).find(">.action").fadeOut(100)}).mouseenter(function(){a(this).find(">.action").fadeIn(100)}).focusin(function(){a(this).mouseenter()}).focusout(function(){var b= a(this),d;clearTimeout(b.data("timer"));d=setTimeout(function(){b.find(":focus").length||b.mouseleave()},10);b.data("timer",d)});a(window).resize(function(){a(document).width()<1300?(a(".dashboard>.section>br").remove(),a(".dashboard>.section>.portlet:odd").after('
                                                      ')):(a(".dashboard>.section>br").remove(),a(".dashboard>.section>.portlet:eq(2),.dashboard>.section>.portlet:eq(5)").after('
                                                      '))});a(window).resize();a(".header>.siteTool>a.i").bind("before-open.tc", -function(){a(this).addClass("active").next("div.tgContent").find(">.section:gt(0)").hide().end().find(">.btnArea>button").show()}).bind("after-close.tc",function(){a(this).removeClass("active")}).next("#siteMapList").find(">.section:last").after('

                                                      ').find("+p>button").click(function(){a(this).hide().parent().prevAll(".section").show()});a.fn.xeMask=function(){this.each(function(){var b=a(this),d=b.text();b.data("originalText",d);/^([\w\-\.]+?)@(([\w-]+\.)+[a-z]{2,})$/ig.test(d)&& -b.data("maskedText",RegExp.$1+"...");b.text(b.data("maskedText"))}).mouseover(function(){a(this).text(a(this).data("originalText"))}).mouseout(function(){a(this).text(a(this).data("maskedText"))}).focus(function(){a(this).mouseover()}).blur(function(){a(this).mouseout()})};a(".masked").xeMask()}); +function(){a(this).addClass("active").next("div.tgContent").find(">.section:gt(0)").hide().end().find(">.btnArea>button").show()}).bind("after-close.tc",function(){a(this).removeClass("active")}).next("#siteMapList").find(">.section:last").after('

                                                      ').find("+p>button").click(function(){a(this).hide().parent().prevAll(".section").show()});a.fn.xeMask=function(){this.each(function(){var b=a(this),d=b.text();/^([\w\-\.]+?)@(([\w-]+\.)+[a-z]{2,})$/ig.test(d)&& +b.html(d.replace(/(@.+)$/,'...$1')).find(">.ellipsis").css({position:"absolute",zIndex:1}).hover(function(){a(this).next(".cover").mouseover()},function(){a(this).next(".cover").mouseout()}).end().find(">.cover").css({zIndex:2,opacity:0}).hover(function(){a(this).css("opacity",1).prev("span").css("visibility","hidden")},function(){a(this).css("opacity",0).prev("span").css("visibility","visible")}).end()})};a(".masked").xeMask()}); jQuery(function(a){a.fn.xeMenu=function(){this.removeClass("jx").attr("role","navigation").find("li").attr("role","menuitem").find(">ul").hide().end().filter(":has(>ul)").attr("aria-haspopup","true").end().end().delegate("li",{mouseover:function(){a(this).addClass("active").find(">ul").show().end().parentsUntil(".gnb").filter("li").addClass("active").end().end()},mouseleave:function(){a(this).removeClass("active").find(">ul").hide()},focusout:function(){var c=a(this);setTimeout(function(){c.find(":focus").length|| c.removeClass("active").find(">ul").hide()},1)}}).delegate("a",{focus:function(){a(this).parent("li").mouseover()}})};a("div.gnb").xeMenu()}); jQuery(function(a){a.fn.xeModalWindow=function(){this.not(".xe-modal-window").addClass("xe-modal-window").each(function(){a(a(this).attr("href")).addClass("x").hide()}).click(function(){var c=a(this),b,d;b=a(c.attr("href"));b.parent("body").length||(d=a(''),d.click(function(){b.data("anchor").trigger("close.mw")}),b.prepend('').append('<\!--[if IE 6]>').find(">.fg").prepend(d).append(d.clone(true)).end().appendTo("body")); From edab0b35ca0df6b9691484890e6fd5955d572935 Mon Sep 17 00:00:00 2001 From: flyskyko Date: Wed, 19 Oct 2011 08:55:49 +0000 Subject: [PATCH 1208/1372] Version up to 1.5.0.6_beta git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9682 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- config/config.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/config.inc.php b/config/config.inc.php index 734da242e..912944e07 100644 --- a/config/config.inc.php +++ b/config/config.inc.php @@ -13,7 +13,7 @@ * @brief display XE's full version * Even The file should be revised when releasing altough no change is made **/ - define('__ZBXE_VERSION__', '1.5.0.5_beta'); + define('__ZBXE_VERSION__', '1.5.0.6_beta'); /** * @brief The base path to where you installed zbXE Wanted From 6eed0f10f26d57ad9499c910b9a52cc34242ab7e Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Wed, 19 Oct 2011 10:18:08 +0000 Subject: [PATCH 1209/1372] th.button td.button UI bug fix. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9684 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/css/xe.css | 20 +++++++++++--------- common/css/xe.min.css | 2 +- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/common/css/xe.css b/common/css/xe.css index 23750d16c..f668cac6e 100644 --- a/common/css/xe.css +++ b/common/css/xe.css @@ -17,15 +17,17 @@ img{border:0} .btn.large *{padding:0 18px;font-size:22px;height:36px;line-height:34px} .btn.large a{height:34px} /* Button - Regucy */ -.button{position:relative;display:inline-block;vertical-align:top} -.button *{display:inline-block;padding:0 8px;font-size:12px;height:24px;line-height:22px;margin:0;font-weight:bold !important;color:#fff;text-decoration:none !important;border:1px solid;cursor:pointer;overflow:visible;border-radius:3px;box-shadow:inset 0 0 1px #fff;background-color:#666;text-shadow:0 -1px 0 #333;zoom:1} -.button *[type=submit][disabled=disabled], -.button *[type=button][disabled=disabled]{opacity:.5;*filter:alpha(opacity=50)} -.button span, -.button button[type=button]{border-color:#ccc;color:#333 !important;background:#eee -webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#ddd));background:#eee -moz-linear-gradient(top,#fff,#ddd);background-color:#eee;text-shadow:1px 1px 0 #fff;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#ffffff, endColorStr=#dddddd)} -.button input, -.button button[type=submit]{border-color:#666;background:#333 -webkit-gradient(linear,0% 0%,0% 100%,from(#777),to(#777),color-stop(0.5,#333),color-stop(0.5,#000));background:#333 -moz-linear-gradient(top,#777,#000);background-color:#333;color:#ffc !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#777777, endColorStr=#333333)} -.button span{height:22px} +span.button, +a.button{position:relative;display:inline-block;vertical-align:top} +span.button *, +a.button *{display:inline-block;padding:0 8px;font-size:12px;height:24px;line-height:22px;margin:0;font-weight:bold !important;color:#fff;text-decoration:none !important;border:1px solid;cursor:pointer;overflow:visible;border-radius:3px;box-shadow:inset 0 0 1px #fff;background-color:#666;text-shadow:0 -1px 0 #333;zoom:1} +span.button *[type=submit][disabled=disabled], +span.button *[type=button][disabled=disabled]{opacity:.5;*filter:alpha(opacity=50)} +a.button span, +span.button button[type=button]{border-color:#ccc;color:#333 !important;background:#eee -webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#ddd));background:#eee -moz-linear-gradient(top,#fff,#ddd);background-color:#eee;text-shadow:1px 1px 0 #fff;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#ffffff, endColorStr=#dddddd)} +span.button input, +span.button button[type=submit]{border-color:#666;background:#333 -webkit-gradient(linear,0% 0%,0% 100%,from(#777),to(#777),color-stop(0.5,#333),color-stop(0.5,#000));background:#333 -moz-linear-gradient(top,#777,#000);background-color:#333;color:#ffc !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#777777, endColorStr=#333333)} +a.button span{height:22px} /* Button Area */ .btnArea{margin:1em 0;text-align:right;zoom:1} .btnArea:after{content:"";display:block;clear:both} diff --git a/common/css/xe.min.css b/common/css/xe.min.css index 3c044ca21..896e7492c 100644 --- a/common/css/xe.min.css +++ b/common/css/xe.min.css @@ -1 +1 @@ -@charset "utf-8";/* Element Reset */body,table,input,textarea,select,button{font-family:Tahoma,Geneva,sans-serif;font-size:12px}img{border:0}/* Button */.btn{position:relative;display:inline-block;vertical-align:middle}.btn *{display:inline-block;padding:0 8px;font-size:12px;height:24px;line-height:22px;margin:0;font-weight:bold !important;color:#fff;text-decoration:none !important;border:1px solid;cursor:pointer;overflow:visible;border-radius:3px;box-shadow:inset 0 0 1px #fff;background-color:#666;text-shadow:0 -1px 0 #333;zoom:1}.btn *[type=submit][disabled=disabled],.btn *[type=button][disabled=disabled]{opacity:.5;*filter:alpha(opacity=50)}.btn a, .btn button[type=button]{border-color:#ccc;color:#333 !important;background:#eee -webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#ddd));background:#eee -moz-linear-gradient(top,#fff,#ddd);background-color:#eee;text-shadow:1px 1px 0 #fff;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#ffffff, endColorStr=#dddddd)}.btn input, .btn button[type=submit]{border-color:#666;background:#333 -webkit-gradient(linear,0% 0%,0% 100%,from(#777),to(#777),color-stop(0.5,#333),color-stop(0.5,#000)) !important;background:#333 -moz-linear-gradient(top,#777,#000) !important;background-color:#333 !important;color:#ffc !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#777777, endColorStr=#333333)}.btn a{height:22px}.btn.medium *{padding:0 12px;font-size:16px;height:30px;line-height:28px}.btn.medium a{height:28px}.btn.large *{padding:0 18px;font-size:22px;height:36px;line-height:34px}.btn.large a{height:34px}/* Button - Regucy */.button{position:relative;display:inline-block;vertical-align:top}.button *{display:inline-block;padding:0 8px;font-size:12px;height:24px;line-height:22px;margin:0;font-weight:bold !important;color:#fff;text-decoration:none !important;border:1px solid;cursor:pointer;overflow:visible;border-radius:3px;box-shadow:inset 0 0 1px #fff;background-color:#666;text-shadow:0 -1px 0 #333;zoom:1}.button *[type=submit][disabled=disabled],.button *[type=button][disabled=disabled]{opacity:.5;*filter:alpha(opacity=50)}.button span, .button button[type=button]{border-color:#ccc;color:#333 !important;background:#eee -webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#ddd));background:#eee -moz-linear-gradient(top,#fff,#ddd);background-color:#eee;text-shadow:1px 1px 0 #fff;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#ffffff, endColorStr=#dddddd)}.button input, .button button[type=submit]{border-color:#666;background:#333 -webkit-gradient(linear,0% 0%,0% 100%,from(#777),to(#777),color-stop(0.5,#333),color-stop(0.5,#000));background:#333 -moz-linear-gradient(top,#777,#000);background-color:#333;color:#ffc !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#777777, endColorStr=#333333)}.button span{height:22px}/* Button Area */.btnArea{margin:1em 0;text-align:right;zoom:1}.btnArea:after{content:"";display:block;clear:both}.btnArea .etc{float:left}/* Text Button */input[type=submit].text,input[type=button].text, button[type=submit].text,button[type=button].text{border:0;overflow:visible;padding:0;margin:0 4px 0 0;color:#33a !important;background:none;text-decoration:underline;cursor:pointer}/* Popup Menu Area */#popup_menu_area{position:absolute;background:#fff;border:1px solid #e9e9e9;border-radius:5px;padding:10px;line-height:1.3;box-shadow:0 0 6px #666;font-size:12px;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}#popup_menu_area ul{list-style:none;margin:0;padding:0}#popup_menu_area li{margin:0;padding:0}#popup_menu_area a{text-decoration:none;color:#333}#popup_menu_area a:hover,#popup_menu_area a:avtive,#popup_menu_area a:focus{text-decoration:underline}/* Message */.message{border:1px solid #ddd;background:#f8f8f8;margin:1em 0;padding:0 1em;border-radius:5px;line-height:1.4;font-size:12px}body>.message{margin:1em}.message p{margin:1em 0 !important}.message em{font-style:normal;color:#e00}.message.info,.message.error,.message.update{padding-left:55px}.message.info{border-color:#E0E8EC;background:#EDF9FF url(../../common/img/msg.Info.png) no-repeat 1em .5em}.message.error{border-color:#EFDCDC;background:#FFECEC url(../../common/img/msg.error.png) no-repeat 1em .5em}.message.update{border-color:#EAE9DC;background:#FFFDEF url(../../common/img/msg.update.png) no-repeat 1em .5em}/* Waiting for server response */.wfsr{display:none;position:absolute;position:fixed;left:0;top:0;z-index:100; border:1px solid #EAE9DC;background:#FFFDEF url(../../common/img/msg.loading.gif) no-repeat 1em .5em;margin:1em;padding:1em 1em 1em 55px;border-radius:5px;line-height:1.4;font-size:12px;font-weight:bold}/* Waiting for server response - Modal Window */.wfsr_fog{position:absolute;top:0;left:0;width:100%;_height:100%;min-height:100%;z-index:100}.wfsr_fog .bg{position:absolute;position:fixed;background:#000;_background:none;width:100%;height:100%;opacity:.5;z-index:2;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1}.wfsr_fog .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1} \ No newline at end of file +@charset "utf-8";/* Element Reset */body,table,input,textarea,select,button{font-family:Tahoma,Geneva,sans-serif;font-size:12px}img{border:0}/* Button */.btn{position:relative;display:inline-block;vertical-align:middle}.btn *{display:inline-block;padding:0 8px;font-size:12px;height:24px;line-height:22px;margin:0;font-weight:bold !important;color:#fff;text-decoration:none !important;border:1px solid;cursor:pointer;overflow:visible;border-radius:3px;box-shadow:inset 0 0 1px #fff;background-color:#666;text-shadow:0 -1px 0 #333;zoom:1}.btn *[type=submit][disabled=disabled],.btn *[type=button][disabled=disabled]{opacity:.5;*filter:alpha(opacity=50)}.btn a, .btn button[type=button]{border-color:#ccc;color:#333 !important;background:#eee -webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#ddd));background:#eee -moz-linear-gradient(top,#fff,#ddd);background-color:#eee;text-shadow:1px 1px 0 #fff;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#ffffff, endColorStr=#dddddd)}.btn input, .btn button[type=submit]{border-color:#666;background:#333 -webkit-gradient(linear,0% 0%,0% 100%,from(#777),to(#777),color-stop(0.5,#333),color-stop(0.5,#000)) !important;background:#333 -moz-linear-gradient(top,#777,#000) !important;background-color:#333 !important;color:#ffc !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#777777, endColorStr=#333333)}.btn a{height:22px}.btn.medium *{padding:0 12px;font-size:16px;height:30px;line-height:28px}.btn.medium a{height:28px}.btn.large *{padding:0 18px;font-size:22px;height:36px;line-height:34px}.btn.large a{height:34px}/* Button - Regucy */span.button,a.button{position:relative;display:inline-block;vertical-align:top}span.button *,a.button *{display:inline-block;padding:0 8px;font-size:12px;height:24px;line-height:22px;margin:0;font-weight:bold !important;color:#fff;text-decoration:none !important;border:1px solid;cursor:pointer;overflow:visible;border-radius:3px;box-shadow:inset 0 0 1px #fff;background-color:#666;text-shadow:0 -1px 0 #333;zoom:1}span.button *[type=submit][disabled=disabled],span.button *[type=button][disabled=disabled]{opacity:.5;*filter:alpha(opacity=50)}a.button span, span.button button[type=button]{border-color:#ccc;color:#333 !important;background:#eee -webkit-gradient(linear,0% 0%,0% 100%,from(#fff),to(#ddd));background:#eee -moz-linear-gradient(top,#fff,#ddd);background-color:#eee;text-shadow:1px 1px 0 #fff;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#ffffff, endColorStr=#dddddd)}span.button input, span.button button[type=submit]{border-color:#666;background:#333 -webkit-gradient(linear,0% 0%,0% 100%,from(#777),to(#777),color-stop(0.5,#333),color-stop(0.5,#000));background:#333 -moz-linear-gradient(top,#777,#000);background-color:#333;color:#ffc !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#777777, endColorStr=#333333)}a.button span{height:22px}/* Button Area */.btnArea{margin:1em 0;text-align:right;zoom:1}.btnArea:after{content:"";display:block;clear:both}.btnArea .etc{float:left}/* Text Button */input[type=submit].text,input[type=button].text, button[type=submit].text,button[type=button].text{border:0;overflow:visible;padding:0;margin:0 4px 0 0;color:#33a !important;background:none;text-decoration:underline;cursor:pointer}/* Popup Menu Area */#popup_menu_area{position:absolute;background:#fff;border:1px solid #e9e9e9;border-radius:5px;padding:10px;line-height:1.3;box-shadow:0 0 6px #666;font-size:12px;filter:progid:DXImageTransform.Microsoft.Shadow(color=#999999,direction=135, strength=5)}#popup_menu_area ul{list-style:none;margin:0;padding:0}#popup_menu_area li{margin:0;padding:0}#popup_menu_area a{text-decoration:none;color:#333}#popup_menu_area a:hover,#popup_menu_area a:avtive,#popup_menu_area a:focus{text-decoration:underline}/* Message */.message{border:1px solid #ddd;background:#f8f8f8;margin:1em 0;padding:0 1em;border-radius:5px;line-height:1.4;font-size:12px}body>.message{margin:1em}.message p{margin:1em 0 !important}.message em{font-style:normal;color:#e00}.message.info,.message.error,.message.update{padding-left:55px}.message.info{border-color:#E0E8EC;background:#EDF9FF url(../../common/img/msg.Info.png) no-repeat 1em .5em}.message.error{border-color:#EFDCDC;background:#FFECEC url(../../common/img/msg.error.png) no-repeat 1em .5em}.message.update{border-color:#EAE9DC;background:#FFFDEF url(../../common/img/msg.update.png) no-repeat 1em .5em}/* Waiting for server response */.wfsr{display:none;position:absolute;position:fixed;left:0;top:0;z-index:100; border:1px solid #EAE9DC;background:#FFFDEF url(../../common/img/msg.loading.gif) no-repeat 1em .5em;margin:1em;padding:1em 1em 1em 55px;border-radius:5px;line-height:1.4;font-size:12px;font-weight:bold}/* Waiting for server response - Modal Window */.wfsr_fog{position:absolute;top:0;left:0;width:100%;_height:100%;min-height:100%;z-index:100}.wfsr_fog .bg{position:absolute;position:fixed;background:#000;_background:none;width:100%;height:100%;opacity:.5;z-index:2;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);zoom:1}.wfsr_fog .ie6{position:absolute;left:0;top:0;width:100%;height:100%;border:0;opacity:0;filter:alpha(opacity=0);z-index:1} \ No newline at end of file From 8de6d4338d5c5e5c00b622dc80cf0e11500ac27d Mon Sep 17 00:00:00 2001 From: ucorina Date: Wed, 19 Oct 2011 10:32:04 +0000 Subject: [PATCH 1210/1372] Issue 524 - Query error. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9685 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- .../tags/column/UpdateColumnTag.class.php | 20 +++++++++++++++---- .../db/xml_query/mysql/MysqlUpdateTest.php | 10 ++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/classes/xml/xmlquery/tags/column/UpdateColumnTag.class.php b/classes/xml/xmlquery/tags/column/UpdateColumnTag.class.php index ba2d05227..610aa9036 100644 --- a/classes/xml/xmlquery/tags/column/UpdateColumnTag.class.php +++ b/classes/xml/xmlquery/tags/column/UpdateColumnTag.class.php @@ -20,10 +20,22 @@ if($column->attrs->var) $this->argument = new QueryArgument($column); else { - $default_value = new DefaultValue($this->name, $column->attrs->default); - if($default_value->isOperation()) + if(strpos($column->attrs->default, '.') !== false) + $this->default_value = "'" . $dbParser->parseColumnName($column->attrs->default) . "'"; + else { + $default_value = new DefaultValue($this->name, $column->attrs->default); + if($default_value->isOperation()) $this->argument = new QueryArgument($column, true); - else $this->default_value = $dbParser->parseColumnName($column->attrs->default); + //else $this->default_value = $dbParser->parseColumnName($column->attrs->default); + else { + $this->default_value = $default_value->toString(); + if($default_value->isString()){ + $this->default_value = '"' . $this->default_value . '"'; + } + } + + + } } } @@ -33,7 +45,7 @@ , $this->name , $this->argument->argument_name); else { - return sprintf('new UpdateExpressionWithoutArgument(\'%s\', \'%s\')' + return sprintf('new UpdateExpressionWithoutArgument(\'%s\', %s)' , $this->name , $this->default_value); } diff --git a/test-phpUnit/db/xml_query/mysql/MysqlUpdateTest.php b/test-phpUnit/db/xml_query/mysql/MysqlUpdateTest.php index 9b40b17da..db329e182 100644 --- a/test-phpUnit/db/xml_query/mysql/MysqlUpdateTest.php +++ b/test-phpUnit/db/xml_query/mysql/MysqlUpdateTest.php @@ -52,4 +52,14 @@ and `listorder` <= 12'; $this->_test($xml_file, $argsString, $expected); } + + function test_communication_setMessageReaded(){ + $xml_file = _XE_PATH_ . "modules/communication/queries/setMessageReaded.xml"; + $argsString = '$args->message_srl = 339321; $args->related_srl = 339321;'; + $expected = 'update `xe_member_message` as `member_message` + set `readed` = \'y\' + , `readed_date` = ' . date("YmdHis") . ' + where `message_srl` = 339321 or `related_srl` = 339321'; + $this->_test($xml_file, $argsString, $expected); + } } \ No newline at end of file From 3830e90733184f5826b7437b34d9020a7b27e6fd Mon Sep 17 00:00:00 2001 From: ucorina Date: Wed, 19 Oct 2011 10:46:41 +0000 Subject: [PATCH 1211/1372] =?UTF-8?q?Issue=20546:=20Memcache=20=ED=95=B8?= =?UTF-8?q?=EB=93=A4=EB=9F=AC=20=EA=B0=9C=EC=84=A0=20=EC=A0=9C=EC=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9686 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/cache/CacheMemcache.class.php | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/classes/cache/CacheMemcache.class.php b/classes/cache/CacheMemcache.class.php index 3a3bf555a..523535802 100644 --- a/classes/cache/CacheMemcache.class.php +++ b/classes/cache/CacheMemcache.class.php @@ -29,9 +29,15 @@ $this->Memcache->addServer($info['host'], $info['port']); } } - + function isSupport(){ - return $this->Memcache->set('xe', 'xe', MEMCACHE_COMPRESSED, 1); + if($GLOBALS['XE_MEMCACHE_SUPPORT']) return true; + if($this->Memcache->set('xe', 'xe', MEMCACHE_COMPRESSED, 1)) { + $GLOBALS['XE_MEMCACHE_SUPPORT'] = true; + } else { + $GLOBALS['XE_MEMCACHE_SUPPORT'] = false; + } + return $GLOBALS['XE_MEMCACHE_SUPPORT']; } function getKey($key){ @@ -55,7 +61,7 @@ $this->_delete($_key); return false; } - + return true; } From e41941ccd268363bfe4b793a149623428019f912 Mon Sep 17 00:00:00 2001 From: ucorina Date: Wed, 19 Oct 2011 12:43:18 +0000 Subject: [PATCH 1212/1372] Issue 524 - Query error - fix for ipaddess. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9687 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- .../xmlquery/queryargument/DefaultValue.class.php | 14 ++++++++++---- .../db/xml_query/mysql/MysqlUpdateTest.php | 10 ++++++++++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/classes/xml/xmlquery/queryargument/DefaultValue.class.php b/classes/xml/xmlquery/queryargument/DefaultValue.class.php index 1954030e4..607af32e4 100644 --- a/classes/xml/xmlquery/queryargument/DefaultValue.class.php +++ b/classes/xml/xmlquery/queryargument/DefaultValue.class.php @@ -7,6 +7,8 @@ var $is_operation = false; var $operation = ''; + var $_is_string = false; + function DefaultValue($column_name, $value){ $dbParser = &DB::getParser(); $this->column_name = $dbParser->parseColumnName($column_name); @@ -15,9 +17,10 @@ } function isString(){ - $str_pos = strpos($this->value, '('); - if($str_pos===false) return true; - return false; + return $this->_is_string; + $str_pos = strpos($this->value, '('); + if($str_pos===false) return true; + return false; } function isSequence(){ @@ -43,7 +46,10 @@ $str_pos = strpos($this->value, '('); // // TODO Replace this with parseExpression - if($str_pos===false) return '\''.$this->value.'\''; + if($str_pos===false) { + $this->_is_string = true; + return '\''.$this->value.'\''; + } //if($str_pos===false) return $this->value; $func_name = substr($this->value, 0, $str_pos); diff --git a/test-phpUnit/db/xml_query/mysql/MysqlUpdateTest.php b/test-phpUnit/db/xml_query/mysql/MysqlUpdateTest.php index db329e182..5401dff42 100644 --- a/test-phpUnit/db/xml_query/mysql/MysqlUpdateTest.php +++ b/test-phpUnit/db/xml_query/mysql/MysqlUpdateTest.php @@ -62,4 +62,14 @@ where `message_srl` = 339321 or `related_srl` = 339321'; $this->_test($xml_file, $argsString, $expected); } + + function test_session_updateSession(){ + $xml_file = _XE_PATH_ . "modules/session/queries/updateSession.xml"; + $argsString = '$args->session_key = 339321; $args->val = "yuhuu";'; + $expected = 'update `xe_session` as `session` + set `member_srl` = 0, `val` = \'yuhuu\' + , `last_update` = ' . date("YmdHis") . ' + where `session_key` = \'339321\''; + $this->_test($xml_file, $argsString, $expected); + } } \ No newline at end of file From cfb4f08e4f6891da74e9d89b37df331e30fc8cdb Mon Sep 17 00:00:00 2001 From: ovclas Date: Thu, 20 Oct 2011 01:33:32 +0000 Subject: [PATCH 1213/1372] issue 57 if no member, no show level icon git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9689 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- .../point_level_icon/point_level_icon.lib.php | 1 + modules/point/point.model.php | 36 ++++++++++++++----- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/addons/point_level_icon/point_level_icon.lib.php b/addons/point_level_icon/point_level_icon.lib.php index a81829bc4..159c7ee21 100644 --- a/addons/point_level_icon/point_level_icon.lib.php +++ b/addons/point_level_icon/point_level_icon.lib.php @@ -23,6 +23,7 @@ if(!$GLOBALS['_pointModel']) $GLOBALS['_pointModel'] = getModel('point'); $oPointModel = &$GLOBALS['_pointModel']; // Get points + if(!$oPointModel->isExistsPoint($member_srl)) return $matches[0]; $point = $oPointModel->getPoint($member_srl); // Get level $level = $oPointModel->getLevel($point, $config->level_step); diff --git a/modules/point/point.model.php b/modules/point/point.model.php index b6759fbea..21f7dd51a 100644 --- a/modules/point/point.model.php +++ b/modules/point/point.model.php @@ -20,11 +20,27 @@ function isExistsPoint($member_srl) { $member_srl = abs($member_srl); + // Get from instance memory if($this->pointList[$member_srl]) return true; + // Get from file cache + $path = sprintf('./files/member_extra_info/point/%s',getNumberingPath($member_srl)); + $cache_filename = sprintf('%s%d.cache.txt', $path, $member_srl); + if(file_exists($cache_filename)) + { + if(!$this->pointList[$member_srl]) + $this->pointList[$member_srl] = trim(FileHandler::readFile($cache_filename)); + return true; + } + $args->member_srl = $member_srl; $output = executeQuery('point.getPoint', $args); - if($output->data->member_srl == $member_srl) return true; + if($output->data->member_srl == $member_srl) + { + if(!$this->pointList[$member_srl]) + $this->pointList[$member_srl] = (int)$output->data->point; + return true; + } return false; } @@ -35,12 +51,10 @@ $member_srl = abs($member_srl); // Get from instance memory - if(!$from_db && $this->pointList[$member_srl]) - return $this->pointList[$member_srl]; + if(!$from_db && $this->pointList[$member_srl]) return $this->pointList[$member_srl]; // Get from file cache $path = sprintf('./files/member_extra_info/point/%s',getNumberingPath($member_srl)); - if(!is_dir($path)) FileHandler::makeDir($path); $cache_filename = sprintf('%s%d.cache.txt', $path, $member_srl); if(!$from_db && file_exists($cache_filename)) @@ -49,12 +63,16 @@ // Get from the DB $args->member_srl = $member_srl; $output = executeQuery('point.getPoint', $args); - $point = (int)$output->data->point; - $this->pointList[$member_srl] = $point; - FileHandler::writeFile($cache_filename, $point); - - return $point; + if(isset($output->data->member_srl)) + { + $point = (int)$output->data->point; + $this->pointList[$member_srl] = $point; + if(!is_dir($path)) FileHandler::makeDir($path); + FileHandler::writeFile($cache_filename, $point); + return $point; + } + return 0; } /** From 8ef97b76188e75cb03170e15aa1fa1a4f5e15bb5 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Thu, 20 Oct 2011 01:33:55 +0000 Subject: [PATCH 1214/1372] classes/db/DBSqlite2.class.php classes/db/DBSqlite3_pdo.class.php 'VARHAR' => 'VARHAR' (X) 'VARHAR' => 'VARCHAR' (O) git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9690 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/db/DBSqlite2.class.php | 2 +- classes/db/DBSqlite3_pdo.class.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/classes/db/DBSqlite2.class.php b/classes/db/DBSqlite2.class.php index 93f05c941..01e607f25 100644 --- a/classes/db/DBSqlite2.class.php +++ b/classes/db/DBSqlite2.class.php @@ -26,7 +26,7 @@ var $column_type = array( 'bignumber' => 'INTEGER', 'number' => 'INTEGER', - 'varchar' => 'VARHAR', + 'varchar' => 'VARCHAR', 'char' => 'CHAR', 'text' => 'TEXT', 'bigtext' => 'TEXT', diff --git a/classes/db/DBSqlite3_pdo.class.php b/classes/db/DBSqlite3_pdo.class.php index e76f4311b..e8e7e1d0f 100644 --- a/classes/db/DBSqlite3_pdo.class.php +++ b/classes/db/DBSqlite3_pdo.class.php @@ -32,7 +32,7 @@ var $column_type = array( 'bignumber' => 'INTEGER', 'number' => 'INTEGER', - 'varchar' => 'VARHAR', + 'varchar' => 'VARCHAR', 'char' => 'CHAR', 'text' => 'TEXT', 'bigtext' => 'TEXT', From 59b7ce4d961bc4f88b356baf991883cbbc6a3a5e Mon Sep 17 00:00:00 2001 From: taggon Date: Thu, 20 Oct 2011 03:07:39 +0000 Subject: [PATCH 1215/1372] issue 512 : Template engine does not handle from now. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9691 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/template/TemplateHandler.class.php | 21 +++++++++++++++---- .../classes/template/TemplateHandlerTest.php | 5 +++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/classes/template/TemplateHandler.class.php b/classes/template/TemplateHandler.class.php index d67f6b4aa..59e6fb1ff 100644 --- a/classes/template/TemplateHandler.class.php +++ b/classes/template/TemplateHandler.class.php @@ -18,6 +18,7 @@ var $xe_path = null; ///< XpressEngine base path var $web_path = null; ///< tpl file web path var $compiled_file = null; ///< tpl file web path + var $skipTags = null; var $handler_mtime = 0; @@ -74,6 +75,8 @@ // compare various file's modified time for check changed $this->handler_mtime = filemtime(__FILE__); + + $skip = array(''); } /** @@ -169,6 +172,11 @@ $buff = FileHandler::readFile($this->file); } + // HTML tags to skip + if(is_null($this->skipTags)) { + $this->skipTags = array('marquee'); + } + // replace comments $buff = preg_replace('@@s', '', $buff); @@ -297,7 +305,11 @@ { if(preg_match_all('/<([a-zA-Z]+\d?)(?>(?!<[a-z]+\d?[\s>]).)*?(?:[ \|]cond| loop)="/s', $buff, $match) === false) return $buff; - $tags = '(?:'.implode('|',array_unique($match[1])).')'; + $tags = array_diff(array_unique($match[1]), $this->skipTags); + + if(!count($tags)) return $buff; + + $tags = '(?:'.implode('|',$tags).')'; $split_regex = "@(<(?>/?{$tags})(?>[^<>\{\}\"']+||{[^}]+}|\".*?\"|'.*?'|.)*?>)@s"; $nodes = preg_split($split_regex, $buff, -1, PREG_SPLIT_DELIM_CAPTURE); @@ -309,6 +321,10 @@ if(!($node=$nodes[$idx])) continue; if(preg_match_all('@\s(loop|cond)="([^"]+)"@', $node, $matches)) { + // this tag + $tag = substr($node, 1, strpos($node, ' ')-1); + + // if the vale of $closing is 0, it means 'skipping' $closing = 0; // process opening tag @@ -338,9 +354,6 @@ } $node = preg_replace('@\s(loop|cond)="([^"]+)"@', '', $node); - // this tag - $tag = substr($node, 1, strpos($node, ' ')-1); - // find closing tag $close_php = ''; if($node{1} == '!' || substr($node,-2,1) == '/' || in_array($tag, $self_closing)) { // self closing tag diff --git a/tests/classes/template/TemplateHandlerTest.php b/tests/classes/template/TemplateHandlerTest.php index af939c8ea..2ccdf34fb 100644 --- a/tests/classes/template/TemplateHandlerTest.php +++ b/tests/classes/template/TemplateHandlerTest.php @@ -209,6 +209,11 @@ class TemplateHandlerTest extends PHPUnit_Framework_TestCase ''."\n".'
                                                      {$vvv}
                                                      CD
                                                      ', 'vvvls&&count($__Context->vvvls))foreach($__Context->vvvls as $__Context->vvv){ ?>'."\n".'
                                                      vvv ?>
                                                      CD
                                                      ' ), + // issue 512 - ignores + array( + '
                                                      {$lang->sl_show_topimgtext}
                                                      ', + '
                                                      lang->sl_show_topimgtext ?>
                                                      ' + ), ); } From ff22c783050b82f9436a3bb24bc13ccc862b64e3 Mon Sep 17 00:00:00 2001 From: flyskyko Date: Thu, 20 Oct 2011 05:17:39 +0000 Subject: [PATCH 1216/1372] issue 566, fix problem about install using install config git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9692 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/install/install.controller.php | 34 +++++++++++++++++++++++--- modules/install/install.view.php | 4 ++- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/modules/install/install.controller.php b/modules/install/install.controller.php index 94f48ae70..599866aff 100644 --- a/modules/install/install.controller.php +++ b/modules/install/install.controller.php @@ -159,8 +159,17 @@ $logged_info->is_admin = 'Y'; Context::set('logged_info', $logged_info); - include $this->db_tmp_config_file; - include $this->etc_tmp_config_file; + // check install config + if (Context::get('install_config')) + { + $db_info = $this->_makeDbInfoByInstallConfig(); + } + + // install by default XE UI + else{ + include $this->db_tmp_config_file; + include $this->etc_tmp_config_file; + } // Set DB type and information Context::setDBInfo($db_info); @@ -196,6 +205,26 @@ } } + /** + * @brief Make DB Information by Install Config + **/ + function _makeDbInfoByInstallConfig() + { + $db_info->master_db['db_type'] = Context::get('db_type'); + $db_info->master_db['db_port'] = Context::get('db_port'); + $db_info->master_db['db_hostname'] = Context::get('db_hostname'); + $db_info->master_db['db_userid'] = Context::get('db_userid'); + $db_info->master_db['db_password'] = Context::get('db_password'); + $db_info->master_db['db_database'] = Context::get('db_database'); + $db_info->master_db['db_table_prefix'] = Context::get('db_table_prefix'); + $db_info->slave_db = array($db_info->master_db); + $db_info->default_url = Context::getRequestUri(); + $db_info->lang_type = Context::getLangType(); + $db_info->use_rewrite = Context::get('use_rewrite'); + $db_info->time_zone = Context::get('time_zone'); + return $db_info; + } + /** * @brief Set FTP Information **/ @@ -422,7 +451,6 @@ unset($oModule); $oModule = &getClass($module); if(method_exists($oModule, 'moduleInstall')) $oModule->moduleInstall(); - return new Object(); } diff --git a/modules/install/install.view.php b/modules/install/install.view.php index 7393f3931..f8a7b43e6 100644 --- a/modules/install/install.view.php +++ b/modules/install/install.view.php @@ -34,8 +34,10 @@ if(is_array($install_config)){ foreach($install_config as $k => $v) Context::set($k,$v,true); unset($GLOBALS['__DB__']); + Context::set('install_config', true, true); $oInstallController = &getController('install'); - $oInstallController->procInstall(); + $output = $oInstallController->procInstall(); + if (!$output->toBool()) return $output; header("location: ./"); Context::close(); exit; From be842304abda5a6d8af2468d8491dba09775941d Mon Sep 17 00:00:00 2001 From: ovclas Date: Thu, 20 Oct 2011 05:20:31 +0000 Subject: [PATCH 1217/1372] issue 79 import patch apply git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9693 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- .../importer/importer.admin.controller.php | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/modules/importer/importer.admin.controller.php b/modules/importer/importer.admin.controller.php index e69132ec4..55e0b4bf3 100644 --- a/modules/importer/importer.admin.controller.php +++ b/modules/importer/importer.admin.controller.php @@ -850,11 +850,27 @@ if(file_exists($file_obj->file)) { // Set upload path by checking if the attachement is an image or other kind of file - if(preg_match("/\.(jpg|jpeg|gif|png|wmv|wma|mpg|mpeg|avi|swf|flv|mp1|mp2|mp3|mp4|asf|wav|asx|mid|midi|asf|mov|moov|qt|rm|ram|ra|rmm|m4v)$/i", $file_obj->source_filename)) { - $path = sprintf("./files/attach/images/%s/%s", $module_srl,getNumberingPath($upload_target_srl,3)); - $filename = $path.$file_obj->source_filename; - $file_obj->direct_download = 'Y'; - } else { + if(preg_match("/\.(jpe?g|gif|png|wm[va]|mpe?g|avi|swf|flv|mp[1-4]|as[fx]|wav|midi?|moo?v|qt|r[am]{1,2}|m4v)$/i", $file_obj->source_filename)) + { + // Immediately remove the direct file if it has any kind of extensions for hacking + $file_obj->source_filename = preg_replace('/\.(php|phtm|html?|cgi|pl|exe|jsp|asp|inc)/i', '$0-x', $file_obj->source_filename); + $file_obj->source_filename = str_replace(array('<', '>'), array('%3C', '%3E'), $file_obj->source_filename); + + $path = sprintf("./files/attach/images/%s/%s", $module_srl, getNumberingPath($upload_target_srl, 3)); + + $ext = substr(strrchr($file_info['name'],'.'),1); + $_filename = md5(crypt(rand(1000000, 900000), rand(0, 100))).'.'.$ext; + $filename = $path.$_filename; + + $idx = 1; + while(file_exists($filename)) { + $filename = $path.preg_replace('/\.([a-z0-9]+)$/i','_'.$idx.'.$1', $_filename); + $idx++; + } + + $file_obj->direct_download = 'Y'; + } + else { $path = sprintf("./files/attach/binaries/%s/%s", $module_srl, getNumberingPath($upload_target_srl,3)); $filename = $path.md5(crypt(rand(1000000,900000), rand(0,100))); $file_obj->direct_download = 'N'; From 9c87933d2b626a48b658f61182ab3d8dc386f92b Mon Sep 17 00:00:00 2001 From: ovclas Date: Thu, 20 Oct 2011 06:33:56 +0000 Subject: [PATCH 1218/1372] issue 144 mid custom ruleset apply in page git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9694 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- common/lang/lang.xml | 4 ++++ modules/page/ruleset/insertPage.xml | 3 ++- modules/page/ruleset/updatePage.xml | 3 ++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/common/lang/lang.xml b/common/lang/lang.xml index 94950f131..e0f26b50d 100644 --- a/common/lang/lang.xml +++ b/common/lang/lang.xml @@ -3734,6 +3734,10 @@ Bitte melden Sie sich dem Administrator des Moduls!]]> + + + + diff --git a/modules/page/ruleset/insertPage.xml b/modules/page/ruleset/insertPage.xml index 254c03298..fbdaf7125 100644 --- a/modules/page/ruleset/insertPage.xml +++ b/modules/page/ruleset/insertPage.xml @@ -1,10 +1,11 @@ + - + diff --git a/modules/page/ruleset/updatePage.xml b/modules/page/ruleset/updatePage.xml index 5240d0f4f..0d62d8782 100644 --- a/modules/page/ruleset/updatePage.xml +++ b/modules/page/ruleset/updatePage.xml @@ -1,9 +1,10 @@ + - + From 3794f7c718cb78a88f92d9fa36f4601a06fc89f8 Mon Sep 17 00:00:00 2001 From: ovclas Date: Thu, 20 Oct 2011 07:36:30 +0000 Subject: [PATCH 1219/1372] issue 545 not apply module category in addon configuration. this bug fixed git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9695 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/addon/addon.admin.view.php | 4 ++-- modules/addon/tpl/setup_addon.html | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/addon/addon.admin.view.php b/modules/addon/addon.admin.view.php index c08ee2252..c95b49439 100644 --- a/modules/addon/addon.admin.view.php +++ b/modules/addon/addon.admin.view.php @@ -54,14 +54,14 @@ $oModuleAdminModel = &getAdminModel('module'); if($site_module_info->site_srl) $args->site_srl = $site_module_info->site_srl; - $columnList = array('module_srl', 'mid', 'browser_title'); + $columnList = array('module_srl', 'module_category_srl', 'mid', 'browser_title'); $mid_list = $oModuleModel->getMidList($args, $columnList); // module_category and module combination if(!$site_module_info->site_srl) { // Get a list of module categories $module_categories = $oModuleModel->getModuleCategories(); - if($mid_list) { + if(is_array($mid_list)) { foreach($mid_list as $module_srl => $module) { $module_categories[$module->module_category_srl]->list[$module_srl] = $module; } diff --git a/modules/addon/tpl/setup_addon.html b/modules/addon/tpl/setup_addon.html index 88780ab9b..28789051e 100644 --- a/modules/addon/tpl/setup_addon.html +++ b/modules/addon/tpl/setup_addon.html @@ -74,4 +74,4 @@ } }); })(jQuery); - \ No newline at end of file + From c3a0dce5f703b4ae25d6f7acee91acbc397858ff Mon Sep 17 00:00:00 2001 From: ovclas Date: Thu, 20 Oct 2011 07:47:52 +0000 Subject: [PATCH 1220/1372] issue 554 called by counter addon method change to other method. because old method enable connect with url type git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9696 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- addons/counter/counter.addon.php | 2 +- modules/counter/counter.controller.php | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/addons/counter/counter.addon.php b/addons/counter/counter.addon.php index 92fd46ee0..b373d4aed 100644 --- a/addons/counter/counter.addon.php +++ b/addons/counter/counter.addon.php @@ -9,6 +9,6 @@ // Execute if called_position is before_display_content if(Context::isInstalled() && $called_position == 'before_module_init' && Context::get('module')!='admin' && Context::getResponseMethod() == 'HTML') { $oCounterController = &getController('counter'); - $oCounterController->procCounterExecute(); + $oCounterController->counterExecute(); } ?> diff --git a/modules/counter/counter.controller.php b/modules/counter/counter.controller.php index 3fab1ed1c..c4b6b3c21 100644 --- a/modules/counter/counter.controller.php +++ b/modules/counter/counter.controller.php @@ -15,8 +15,15 @@ /** * @brief Counter logs + * @deprecated, if want use below function, you can use 'counterExecute' function instead this function **/ function procCounterExecute() { + } + + /** + * @brief Counter logs + **/ + function counterExecute() { $oDB = &DB::getInstance(); $oDB->begin(); From 2d74cfb0a59f6a644ce0ccff42e724aff6549bcc Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Thu, 20 Oct 2011 08:03:54 +0000 Subject: [PATCH 1221/1372] classes/extravar/Extravar.class.php date input element readonly property was removed. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9697 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/extravar/Extravar.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/extravar/Extravar.class.php b/classes/extravar/Extravar.class.php index a6445cee0..db16ac8ba 100644 --- a/classes/extravar/Extravar.class.php +++ b/classes/extravar/Extravar.class.php @@ -254,7 +254,7 @@ $buff .= ''. - ''."\n". + ''."\n". ' + + + + + + +

                                                      {$lang->permission_setting}

                                                      +

                                                      {$lang->about_grant_deatil}

                                                      +
                                                      + + + + + + + + + + + + + + + + +
                                                      {$lang->grant}{$lang->target}
                                                      {$grant_item->title} + + +
                                                      +
                                                      +
                                                      + +
                                                      + + diff --git a/modules/module/tpl/include.module_setup.html b/modules/module/tpl/include.module_setup.html new file mode 100644 index 000000000..87090c7c1 --- /dev/null +++ b/modules/module/tpl/include.module_setup.html @@ -0,0 +1,76 @@ +
                                                      +

                                                      {$lang->bundle_setup}

                                                      +
                                                      + + + + +
                                                        +
                                                      • +

                                                        +

                                                        + +

                                                        +

                                                        {$lang->about_module_category}

                                                        +
                                                      • +
                                                      • +

                                                        +

                                                        + +

                                                        +

                                                        {$lang->about_layout}

                                                        +
                                                      • +
                                                      • +

                                                        +

                                                        + +

                                                        +

                                                        {$lang->about_skin}

                                                        +
                                                      • +
                                                      • +

                                                        +

                                                        + +

                                                        +

                                                        {$lang->about_description}

                                                        +
                                                      • +
                                                      • +

                                                        +

                                                        + {@$use_multilang_textarea=true} + + + {$lang->cmd_set_multilingual} +

                                                        +

                                                        {$lang->about_header_text}

                                                        +
                                                      • +
                                                      • +

                                                        +

                                                        + + + {$lang->cmd_set_multilingual} +

                                                        +

                                                        {$lang->about_footer_text}

                                                        +
                                                      • +
                                                      +
                                                      + +
                                                      + +
                                                      +
                                                      \ No newline at end of file diff --git a/modules/module/tpl/include.multilang.html b/modules/module/tpl/include.multilang.html new file mode 100644 index 000000000..8a45e064d --- /dev/null +++ b/modules/module/tpl/include.multilang.html @@ -0,0 +1,23 @@ + +
                                                      +
                                                        +
                                                        +

                                                        {$lang->multilingual} {$lang->cmd_modify} | {$lang->cmd_insert}

                                                        +
                                                          + {@ + /* move current language to the top */ + $a = array($lang_type=>$lang_supported[$lang_type]); + unset($lang_supported[$lang_type]); + $lang_supported = array_merge($a, $lang_supported); + } +
                                                        • +
                                                        + +
                                                        +
                                                        +
                                                        diff --git a/modules/module/tpl/include.multilang.textarea.html b/modules/module/tpl/include.multilang.textarea.html new file mode 100644 index 000000000..5b05c0b24 --- /dev/null +++ b/modules/module/tpl/include.multilang.textarea.html @@ -0,0 +1,27 @@ + + + +
                                                        +
                                                          +
                                                          +

                                                          {$lang->multilingual} {$lang->cmd_modify} | {$lang->cmd_insert}

                                                          +
                                                            + {@ + /* move current language to the top */ + $a = array($lang_type=>$lang_supported[$lang_type]); + unset($lang_supported[$lang_type]); + $lang_supported = array_merge($a, $lang_supported); + } +
                                                          • +
                                                          + +
                                                          +
                                                          +
                                                          diff --git a/modules/module/tpl/js/manage_selected_module.js b/modules/module/tpl/js/manage_selected_module.js new file mode 100644 index 000000000..1ca2eb56d --- /dev/null +++ b/modules/module/tpl/js/manage_selected_module.js @@ -0,0 +1,37 @@ +// manage selected module +jQuery(function($){ + +$('#manageSelectedModule .cnb a.tgAnchor') + .bind('before-open.tc', function(){ + var self = this; + $('#manageSelectedModule a.tgAnchor') + .filter(function(){ + if (this == self) return false; + return true; + }) + .trigger('close.tc'); + }); + +$('a.modalAnchor[href=#manageSelectedModule]') + .bind('before-open.mw', function(){ + var $selectedModule = $('input[type=checkbox].selectedModule:checked'); + var $selectedBody = $('#manageSelectedModuleBody'); + + if (!$selectedModule.length) return false; + + $selectedBody.empty(); + + var module_srls = new Array(); + $selectedModule.each(function(){ + var $this = $(this); + var row = '
                                                          ' + $this.data('mid') + '' + $this.data('browser_title') + '
                                                          diff --git a/modules/document/tpl/category_list.html b/modules/document/tpl/category_list.html index d957a7df8..e5dafaceb 100644 --- a/modules/document/tpl/category_list.html +++ b/modules/document/tpl/category_list.html @@ -16,6 +16,7 @@

                                                          {$XE_VALIDATOR_MESSAGE}

                                                          + diff --git a/modules/document/tpl/checked_list.html b/modules/document/tpl/checked_list.html index 7cc797387..db9140823 100644 --- a/modules/document/tpl/checked_list.html +++ b/modules/document/tpl/checked_list.html @@ -3,6 +3,7 @@

                                                          {$lang->cmd_manage_document}

                                                          + diff --git a/modules/document/tpl/declared_list.html b/modules/document/tpl/declared_list.html index a4ac7359b..3ff53c143 100644 --- a/modules/document/tpl/declared_list.html +++ b/modules/document/tpl/declared_list.html @@ -7,6 +7,7 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}';

                                                          {$XE_VALIDATOR_MESSAGE}

                                                          +

                                                          {$lang->cmd_declared_list}

                                                          @@ -67,6 +68,7 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}'; + diff --git a/modules/document/tpl/document_config.html b/modules/document/tpl/document_config.html index fac4e5032..b102c9d73 100644 --- a/modules/document/tpl/document_config.html +++ b/modules/document/tpl/document_config.html @@ -1,6 +1,7 @@ +
                                                          diff --git a/modules/document/tpl/document_list.html b/modules/document/tpl/document_list.html index d0a2d19ab..27c72bf07 100644 --- a/modules/document/tpl/document_list.html +++ b/modules/document/tpl/document_list.html @@ -7,6 +7,7 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}';

                                                          {$XE_VALIDATOR_MESSAGE}

                                                          +

                                                          {$lang->document}

                                                          @@ -79,6 +80,7 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}';
                                                          diff --git a/modules/file/tpl/file_list.html b/modules/file/tpl/file_list.html index eb04706a8..d02b2e6e0 100644 --- a/modules/file/tpl/file_list.html +++ b/modules/file/tpl/file_list.html @@ -7,6 +7,7 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}';

                                                          {$XE_VALIDATOR_MESSAGE}

                                                          +

                                                          {$lang->file}

                                                          @@ -113,6 +114,7 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}'; +
                                                          diff --git a/modules/member/tpl/denied_id_list.html b/modules/member/tpl/denied_id_list.html index 34277b35a..223c459b1 100644 --- a/modules/member/tpl/denied_id_list.html +++ b/modules/member/tpl/denied_id_list.html @@ -51,6 +51,7 @@

                                                          {$XE_VALIDATOR_MESSAGE}

                                                          + diff --git a/modules/member/tpl/group_list.html b/modules/member/tpl/group_list.html index a6d83b5c6..97cb5bceb 100644 --- a/modules/member/tpl/group_list.html +++ b/modules/member/tpl/group_list.html @@ -16,6 +16,7 @@

                                                          {$lang->member_group}

                                                          +
                                                          diff --git a/modules/member/tpl/group_update_form.html b/modules/member/tpl/group_update_form.html index 91dd5d1a4..7458bd634 100644 --- a/modules/member/tpl/group_update_form.html +++ b/modules/member/tpl/group_update_form.html @@ -7,6 +7,7 @@

                                                          {$XE_VALIDATOR_MESSAGE}

                                                          + diff --git a/modules/member/tpl/insert_member.html b/modules/member/tpl/insert_member.html index b728d479a..48ac1573e 100644 --- a/modules/member/tpl/insert_member.html +++ b/modules/member/tpl/insert_member.html @@ -10,6 +10,7 @@

                                                          {$XE_VALIDATOR_MESSAGE}

                                                          + diff --git a/modules/member/tpl/manage_member_group.html b/modules/member/tpl/manage_member_group.html index 3205e1bdb..ed467641a 100644 --- a/modules/member/tpl/manage_member_group.html +++ b/modules/member/tpl/manage_member_group.html @@ -4,6 +4,7 @@

                                                          {$XE_VALIDATOR_MESSAGE}

                                                          +
                                                          diff --git a/modules/member/tpl/member_config.html b/modules/member/tpl/member_config.html index 488a860d2..21d7af964 100644 --- a/modules/member/tpl/member_config.html +++ b/modules/member/tpl/member_config.html @@ -9,6 +9,7 @@

                                                          {$XE_VALIDATOR_MESSAGE}

                                                          + @@ -195,6 +196,7 @@
                                                          diff --git a/modules/menu/tpl/menu_management.html b/modules/menu/tpl/menu_management.html index 0cc3e0ab3..2305e8255 100644 --- a/modules/menu/tpl/menu_management.html +++ b/modules/menu/tpl/menu_management.html @@ -19,6 +19,7 @@

                                                          {$XE_VALIDATOR_MESSAGE}

                                                          +

                                                          {$lang->menu_management}

                                                          @@ -61,6 +62,7 @@ + diff --git a/modules/menu/tpl/sitemap.html b/modules/menu/tpl/sitemap.html index a1b2f3a8e..c771cc58c 100644 --- a/modules/menu/tpl/sitemap.html +++ b/modules/menu/tpl/sitemap.html @@ -13,6 +13,7 @@ xe.lang.confirm_delete = "{$lang->confirm_delete}"; {@$menuSrl = $value->menuSrl} + @@ -49,6 +50,7 @@ xe.lang.confirm_delete = "{$lang->confirm_delete}"; +
                                                          diff --git a/modules/module/tpl/module_grant_setup.html b/modules/module/tpl/module_grant_setup.html index 4f7dbcf23..6159eb6e4 100644 --- a/modules/module/tpl/module_grant_setup.html +++ b/modules/module/tpl/module_grant_setup.html @@ -7,6 +7,7 @@

                                                          {$XE_VALIDATOR_MESSAGE}

                                                          +

                                                          {$lang->permission_setting}

                                                          diff --git a/modules/module/tpl/module_langcode.html b/modules/module/tpl/module_langcode.html index 3907bfb3d..69daae539 100644 --- a/modules/module/tpl/module_langcode.html +++ b/modules/module/tpl/module_langcode.html @@ -16,6 +16,7 @@ {@$langName = $value->name} {$value->value} +
                                                            diff --git a/modules/module/tpl/module_setup.html b/modules/module/tpl/module_setup.html index ae524b3f2..4fef3d9bb 100644 --- a/modules/module/tpl/module_setup.html +++ b/modules/module/tpl/module_setup.html @@ -3,6 +3,7 @@

                                                            {$XE_VALIDATOR_MESSAGE}

                                                            +

                                                            {$lang->bundle_setup}

                                                            diff --git a/modules/page/tpl/page_delete.html b/modules/page/tpl/page_delete.html index 136ff8330..265f765de 100644 --- a/modules/page/tpl/page_delete.html +++ b/modules/page/tpl/page_delete.html @@ -5,6 +5,7 @@

                                                            {$XE_VALIDATOR_MESSAGE}

                                                            + diff --git a/modules/page/tpl/page_info.html b/modules/page/tpl/page_info.html index 477b762f7..59edb3c04 100644 --- a/modules/page/tpl/page_info.html +++ b/modules/page/tpl/page_info.html @@ -4,6 +4,7 @@

                                                            {$XE_VALIDATOR_MESSAGE}

                                                            + diff --git a/modules/point/tpl/config.html b/modules/point/tpl/config.html index 1fa93c919..e01a2bcdc 100644 --- a/modules/point/tpl/config.html +++ b/modules/point/tpl/config.html @@ -4,6 +4,7 @@

                                                            {$XE_VALIDATOR_MESSAGE}

                                                            +

                                                            {$lang->is_default}

                                                            diff --git a/modules/point/tpl/member_list.html b/modules/point/tpl/member_list.html index 413c77e51..8eff21c58 100644 --- a/modules/point/tpl/member_list.html +++ b/modules/point/tpl/member_list.html @@ -4,7 +4,7 @@

                                                            {$XE_VALIDATOR_MESSAGE}

                                                            -
                                                            +
                                                          @@ -26,6 +26,7 @@ - + - - - + - - + - + - - + - - + - - - + - + - + - - - + - - - + - - - + - -
                                                          Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
                                                          {$val->nick_name} + @@ -40,6 +41,7 @@ + diff --git a/modules/point/tpl/module_config.html b/modules/point/tpl/module_config.html index b55d858c9..09088b0c1 100644 --- a/modules/point/tpl/module_config.html +++ b/modules/point/tpl/module_config.html @@ -4,6 +4,7 @@

                                                          {$XE_VALIDATOR_MESSAGE}

                                                          +
                                                          diff --git a/modules/poll/skins/default/form.html b/modules/poll/skins/default/form.html index 6c455c054..b4581871f 100644 --- a/modules/poll/skins/default/form.html +++ b/modules/poll/skins/default/form.html @@ -16,6 +16,7 @@

                                                          {$XE_VALIDATOR_MESSAGE}

                                                          + diff --git a/modules/poll/skins/simple/form.html b/modules/poll/skins/simple/form.html index c036eda0a..6c67026a6 100644 --- a/modules/poll/skins/simple/form.html +++ b/modules/poll/skins/simple/form.html @@ -16,6 +16,7 @@

                                                          {$XE_VALIDATOR_MESSAGE}

                                                          + diff --git a/modules/poll/tpl/config.html b/modules/poll/tpl/config.html index 1de5dd0db..f7102cc0d 100644 --- a/modules/poll/tpl/config.html +++ b/modules/poll/tpl/config.html @@ -5,6 +5,7 @@

                                                          {$XE_VALIDATOR_MESSAGE}

                                                          +
                                                          diff --git a/modules/poll/tpl/poll_list.html b/modules/poll/tpl/poll_list.html index 83f5ed214..afde8f0b6 100644 --- a/modules/poll/tpl/poll_list.html +++ b/modules/poll/tpl/poll_list.html @@ -7,6 +7,7 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}';

                                                          {$XE_VALIDATOR_MESSAGE}

                                                          +

                                                          {$lang->poll}

                                                          @@ -56,6 +57,7 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}'; + - - - - + + + +

                                                          {$lang->spamfilter}

                                                          • @@ -38,9 +39,9 @@
                                                            - - - + + +
                                                            • {$lang->cmd_denied_ip}

                                                              diff --git a/modules/trackback/tpl/send_trackback_form.html b/modules/trackback/tpl/send_trackback_form.html index 1aabcec25..000da0fc1 100644 --- a/modules/trackback/tpl/send_trackback_form.html +++ b/modules/trackback/tpl/send_trackback_form.html @@ -3,6 +3,7 @@

                                                              {$XE_VALIDATOR_MESSAGE}

                                                              +
                                                              diff --git a/modules/trackback/tpl/trackback_list.html b/modules/trackback/tpl/trackback_list.html index 760f50022..ea5f06175 100644 --- a/modules/trackback/tpl/trackback_list.html +++ b/modules/trackback/tpl/trackback_list.html @@ -54,6 +54,7 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}'; + @@ -60,6 +61,7 @@ var no_text_comment = '{$lang->no_text_comment}'; \ No newline at end of file + From ecd528672b51b9a0df1db8ef742e6eebc6b7fa7f Mon Sep 17 00:00:00 2001 From: ovclas Date: Tue, 25 Oct 2011 10:02:36 +0000 Subject: [PATCH 1253/1372] issue 668 if admin modify member info, find account question, answer change to not required git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9729 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/member/conf/module.xml | 2 +- modules/member/member.admin.controller.php | 18 ++++++++++++++++-- modules/member/member.controller.php | 1 - modules/member/queries/updateMember.xml | 2 +- modules/member/tpl/insert_member.html | 2 +- 5 files changed, 19 insertions(+), 6 deletions(-) diff --git a/modules/member/conf/module.xml b/modules/member/conf/module.xml index 3e6b5e6c1..0ab755562 100644 --- a/modules/member/conf/module.xml +++ b/modules/member/conf/module.xml @@ -68,7 +68,7 @@ - + diff --git a/modules/member/member.admin.controller.php b/modules/member/member.admin.controller.php index c41eec23a..7b68bc90d 100644 --- a/modules/member/member.admin.controller.php +++ b/modules/member/member.admin.controller.php @@ -238,6 +238,7 @@ function _createSignupRuleset($signupForm){ $xml_file = './files/ruleset/insertMember.xml'; + $admin_xml_file = './files/ruleset/insertAdmintMember.xml'; $buff = '' .'' .'' @@ -254,8 +255,8 @@ $fields[] = ''; $fields[] = ''; }else if($formInfo->name == 'find_account_question'){ - $fields[] = ''; - $fields[] = ''; + $fields[100] = ''; + $fields[101] = ''; }else if($formInfo->name == 'email_address'){ $fields[] = sprintf('', $formInfo->name); }else if($formInfo->name == 'user_id'){ @@ -268,10 +269,23 @@ $xml_buff = sprintf($buff, implode('', $fields)); FileHandler::writeFile($xml_file, $xml_buff); + unset($xml_buff); + + $adminFields = $fields; + $adminFields[100] = ''; + $adminFields[101] = ''; + + $xml_buff = sprintf($buff, implode('', $adminFields)); + FileHandler::writeFile($admin_xml_file, $xml_buff); + unset($xml_buff); $validator = new Validator($xml_file); $validator->setCacheDir('files/cache'); $validator->getJsPath(); + + $adminValidator = new Validator($admin_xml_file); + $adminValidator->setCacheDir('files/cache'); + $adminValidator->getJsPath(); } function _createLoginRuleset($identifier){ diff --git a/modules/member/member.controller.php b/modules/member/member.controller.php index 09e7de413..f36334fc6 100644 --- a/modules/member/member.controller.php +++ b/modules/member/member.controller.php @@ -1819,7 +1819,6 @@ if(!$args->description) $args->description = ''; - $output = executeQuery('member.updateMember', $args); if(!$output->toBool()) { $oDB->rollback(); diff --git a/modules/member/queries/updateMember.xml b/modules/member/queries/updateMember.xml index 3b41389e4..8989b4588 100644 --- a/modules/member/queries/updateMember.xml +++ b/modules/member/queries/updateMember.xml @@ -9,7 +9,7 @@ - + diff --git a/modules/member/tpl/insert_member.html b/modules/member/tpl/insert_member.html index 48ac1573e..53a161ecc 100644 --- a/modules/member/tpl/insert_member.html +++ b/modules/member/tpl/insert_member.html @@ -9,7 +9,7 @@

                                                              {$XE_VALIDATOR_MESSAGE}

                                                              -
                                                              + From 3208e90f5cfca2606f8ab40916ad4ba796a29ec8 Mon Sep 17 00:00:00 2001 From: ovclas Date: Tue, 25 Oct 2011 10:23:30 +0000 Subject: [PATCH 1254/1372] issue 666 add index in document table (idx_module_status) git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9730 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/document/document.class.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/document/document.class.php b/modules/document/document.class.php index 8b14faeec..4274eed3d 100644 --- a/modules/document/document.class.php +++ b/modules/document/document.class.php @@ -109,6 +109,9 @@ //2011. 06. 07 check comment status update if($oDB->isColumnExists('documents', 'allow_comment') || $oDB->isColumnExists('documents', 'lock_comment')) return true; + // 2011. 10. 25 status index check + if(!$oDB->isIndexExists("documents", "idx_module_status")) return true; + return false; } @@ -287,6 +290,9 @@ if($oDB->isColumnExists('documents', 'lock_comment') && $oDB->isColumnExists('documents', 'comment_status')) $oDB->dropColumn('documents', 'lock_comment'); + if(!$oDB->isIndexExists("documents", "idx_module_status")) + $oDB->addIndex("documents", "idx_module_status", array("module_srl","status")); + return new Object(0,'success_updated'); } From 565a2f12cdd5d0c3245c96a2fcf45cb009d0495a Mon Sep 17 00:00:00 2001 From: ovclas Date: Tue, 25 Oct 2011 10:30:47 +0000 Subject: [PATCH 1255/1372] issue 636 admin menu defense code add git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9731 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/menu/menu.admin.model.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/menu/menu.admin.model.php b/modules/menu/menu.admin.model.php index dae05f5f0..d0e72089a 100644 --- a/modules/menu/menu.admin.model.php +++ b/modules/menu/menu.admin.model.php @@ -78,7 +78,9 @@ $output = executeQuery('menu.getMenuByTitle', $args); if(!$output->data) return; - $menu_info = $output->data; + if(is_array($output->data)) $menu_info = $output->data[0]; + else $menu_info = $output->data; + $menu_info->xml_file = sprintf('./files/cache/menu/%s.xml.php',$menu_info->menu_srl); $menu_info->php_file = sprintf('./files/cache/menu/%s.php',$menu_info->menu_srl); return $menu_info; From 929f05617bc341de98b6e5f94cf1f14d0788a0ae Mon Sep 17 00:00:00 2001 From: chschy Date: Tue, 25 Oct 2011 12:52:58 +0000 Subject: [PATCH 1256/1372] add proc MemverSiteLeave, MemberSiteSignUp git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9732 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/member/conf/module.xml | 2 ++ modules/member/member.controller.php | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/member/conf/module.xml b/modules/member/conf/module.xml index 0ab755562..cac92b386 100644 --- a/modules/member/conf/module.xml +++ b/modules/member/conf/module.xml @@ -56,6 +56,8 @@ + + diff --git a/modules/member/member.controller.php b/modules/member/member.controller.php index f36334fc6..90d4dfe19 100644 --- a/modules/member/member.controller.php +++ b/modules/member/member.controller.php @@ -1258,7 +1258,7 @@ /** * @brief Join a virtual site **/ - function procModuleSiteSignUp() { + function procMemberSiteSignUp() { $site_module_info = Context::get('site_module_info'); $logged_info = Context::get('logged_info'); if(!$site_module_info->site_srl || !Context::get('is_logged') || count($logged_info->group_srl_list) ) return new Object(-1,'msg_invalid_request'); @@ -1274,7 +1274,7 @@ /** * @brief Leave the virtual site **/ - function procModuleSiteLeave() { + function procMemberSiteLeave() { $site_module_info = Context::get('site_module_info'); $logged_info = Context::get('logged_info'); if(!$site_module_info->site_srl || !Context::get('is_logged') || count($logged_info->group_srl_list) ) return new Object(-1,'msg_invalid_request'); From 99b93bd0672b96ec28aee35cfce126de5c514a24 Mon Sep 17 00:00:00 2001 From: flyskyko Date: Tue, 25 Oct 2011 14:05:01 +0000 Subject: [PATCH 1257/1372] issue 670, added reset admin menu link and XE version info. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9733 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/admin.admin.view.php | 1 + modules/admin/lang/lang.xml | 8 ++++++++ modules/admin/tpl/_spFooter.html | 5 ++++- modules/admin/tpl/js/config.js | 10 ++++++++++ 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/modules/admin/admin.admin.view.php b/modules/admin/admin.admin.view.php index 809ed2f85..634659c4b 100644 --- a/modules/admin/admin.admin.view.php +++ b/modules/admin/admin.admin.view.php @@ -93,6 +93,7 @@ $oMenuAdminModel = &getAdminModel('menu'); $menu_info = $oMenuAdminModel->getMenuByTitle('__XE_ADMIN__'); + Context::set('admin_menu_srl', $menu_info->menu_srl); if(!is_readable($menu_info->php_file)) return; diff --git a/modules/admin/lang/lang.xml b/modules/admin/lang/lang.xml index 15b8da74c..b7a9c63f9 100644 --- a/modules/admin/lang/lang.xml +++ b/modules/admin/lang/lang.xml @@ -1090,4 +1090,12 @@ Lütfen son sürümü için indirme linkine tıklayınız.]]> + + + + + + + + diff --git a/modules/admin/tpl/_spFooter.html b/modules/admin/tpl/_spFooter.html index e0edea7e5..62283c078 100644 --- a/modules/admin/tpl/_spFooter.html +++ b/modules/admin/tpl/_spFooter.html @@ -1,7 +1,8 @@
                                                          "; + }else{ + if($.browser.firefox){ + sTD = ""; + }else{ + sTD = ""; + } + } + + var sTable = '


                                                           

                                                          '; + var sRow = ''; + var iColumns = this.oColumnInput.value; + for(var i=0; i/ig, + regex_meanless_css2 = /(?:(?:margin|padding)\s*:\s*0(?:px)?|\-(?:moz|ms|webkit|opera)\-[\w-]+\s*:\s*.*?|[\w-]+\s*:\s*\-(?:moz|ms|webkit|opera)\-[\w-]+|(?:line-height|font-variant|font-stretch|font-size-adjust|font-size)\s*:\s*[a-z_-]+)\s*;?\s*|font-(?:weight|style)\s*:\s*normal;?/ig, + regex_class = /<(.*?)\s+class\s*=(?:\s*"(.*?)"|\s*'(.*?)'|([^\s>]+))(.*?)>/ig, + regex_class2 = /xe_selected_cell/g; + regex_handler = /<(.*?)\s+on[a-z]+\s*=(?:\s*".*?"|\s*'.*?'|[^\s>]+)(.*?)>/ig, + //regex_id = /<(.*?)\s+id\s*=(?:[^\s>]+|\s*".*?"|\s*'.*?')(.*?)>/ig, + //regex_script = //ig, + regex_font_color = /color\s*=(?:\s*"(.*?)"|\s*'(.*?)'|([^\s>]+))/i, + regex_font_face = /face\s*=(?:\s*"(.*?)"|\s*'(.*?)'|([^\s>]+))/i, + regex_font_size = /size\s*=(?:\s*"(\d+)"|\s*'(\d+)'|(\d+))/i, + regex_style = /style\s*=\s*(?:\s*"(.*?)"|\s*'(.*?)'|([^\s>]+))/i, + regex_font_weight = /font-weight\s*:\s*([a-z]+);?/i, + regex_font_style = /font-style\s*:\s*italic;?/i, + regex_font_decoration = /text-decoration\s*:\s*([a-z -]+);?/i, + regex_jquery = /jQuery\d+\s*=(\s*"\d+"|\d+)/ig, + regex_quote_attr = /([\w-]+\s*=(?:\s*"[^"]+"|\s*'[^']+'))|([\w-]+)=([^\s]+)/g; //" + +var + allow_tags = 'a,abbr,acronym,address,area,blockquote,br,caption,center,cite,code,col,colgroup,dd,del,dfn,div,dl,dt,em,embed,h1,h2,h3,h4,h5,h6,hr,img,ins,kbd,li,map,object,ol,p,param,pre,q,samp,span,strong,sub,sup,table,tbody,td,tfoot,th,thead,tr,tt,u,ul,var,iframe,object,param,style'.split(','), + lonely_tags = 'area,br,col,embed,hr,img,input,param'.split(','); + +var + replace_tags = { + 'b' : 'strong', + 'i' : 'em', + 's' : 'del', + 'strike' : 'del' + }; + +xe.XE_XHTMLFormatter = $.Class({ + name : "XE_XHTMLFormatter", + + $ON_MSG_APP_READY : function() { + this.oApp.addConverter("WYSIWYG_TO_IR", this.TO_IR); + this.oApp.addConverter("HTMLSrc_TO_IR", this.TO_IR); + this.oApp.addConverter("IR_TO_HTMLSrc", this.IR_TO); + this.oApp.addConverter("IR_TO_WYSIWYG", this.IR_TO); + }, + + TO_IR : function(sContent) { + var stack = []; + + // remove xeHandled attrs + /* + sContent = sContent.replace(/xeHandled="YES"/ig,''); + */ + + + // remove all useless styles + /* + sContent = sContent.replace(regex_meanless_css1, function(m0,m1,m2,m3){ + m2 = m2.replace(regex_meanless_css2, ''); + + return '<'+m1+(m2?' style="'+m2+'"':'')+m3+'>'; + }); + */ + + // remove all useless classes + /* + sContent = sContent.replace(regex_class, function(m0,m1,m2,m3,m4,m5){ + var cls = $.trim((m2 || m3 || m4 || "").replace(regex_class2, '')); + + return '<'+(m1||"")+(cls?' class="'+cls+'"':'')+(m5||"")+'>'; + }); + */ + + // remove all event handler + //sContent = sContent.replace(regex_handler, '<$1$2>'); + + // remove all id + //sContent = sContent.replace(regex_id, '<$1$2>'); + + // remove all scripts + //sContent = sContent.replace(regex_script, ''); + + if ($.browser.msie) { + // remove $ attributes + sContent = sContent.replace(regex_jquery, ''); + + // quote all attrs + sContent = sContent.replace(/<(\w+) ([^>]+)>/g, function(m0,m1,m2){ + return '<'+m1+' '+ + m2.replace(regex_quote_attr, function(s0,s1,s2,s3){ + if(s1) return s1; + if(/^"/.test(s3)||/"$/.test(s3)) return s2+'='+s3; + return s2+'="'+(s3||s2)+'"'; + }) + '>'; + }); + } + + // remove all useless tag and enclose tags + regex = /<(\/)?([:\w\/-]+)(.*?)>/ig; + sContent = sContent.replace(regex, function(m0,closing,tag,attrs){ + var m3s = []; + var state = ''; + + closing = closing || ''; + tag = tag.toLowerCase(); + attrs = $.trim(attrs || ''); + + if (!closing) { + if ($.inArray(tag,lonely_tags) >= 0) { + var len = attrs.length; + if (tag == 'br') attrs = ''; + if (!attrs || attrs.substring(len-1,len) != '/') attrs += '/'; + + return '<'+tag+' '+$.trim(attrs)+'>'; + } else { + stack[stack.length] = {tag:tag, state:state}; + } + } else { + var tags = [], t = ''; + + // remove unnecessary closing tag + if (!stack.length) return ''; + + do { + t = stack.pop(); + if (t.tag != tag) continue; + if (t.state != 'deleted') tags.push(''); + } while(stack.length && t.tag != tag); + + return tags.join(''); + } + + return '<'+closing+tag+(attrs?' '+attrs:'')+'>'; + }); + /* + if (stack.length) { + var t = ''; + + do { + t = stack.pop(); + if (t.state != 'deleted') sContent += ''; + } while(stack.length); + } + */ + + return sContent; + }, + + IR_TO : function(sContent) { + return sContent; + } +}); +// center, font, b, i, s, strike + +/** + * Support XE extensions + * @author NHN (developer@xpressengine.com) + */ +xe.XE_Extension = $.Class({ + name : "XE_Extension", + seq : '', + last_doc : '', + + $init : function(elAppContainer, editor_sequence) { + this.seq = editor_sequence; + this._assignHTMLObjects(elAppContainer); + }, + + _assignHTMLObjects : function(elAppContainer) { + this.elDropdownLayer = $('DIV.xpress_xeditor_extension_layer', elAppContainer).get(0); + }, + + _removeAttrs : function(sContent) { + return sContent; + }, + + _addEvent : function() { + if (this.oApp.getEditingMode() != 'WYSIWYG') return; + + var doc = this.oApp.getWYSIWYGDocument(); + var seq = this.seq; + var fn = function(){ + var obj = $(this); + var comp = obj.attr('editor_component'); + if (comp && $.isFunction(openComponent)) { + editorPrevNode = obj.get(0); + openComponent(comp, seq); + } + }; + + $('img,div[editor_component]', doc).each(function(){ + var obj = $(this); + if(this.nodeName == 'IMG' && !obj.attr('editor_component')) { + obj.attr('editor_component','image_link'); + } + if(this.last_doc != doc) { + obj.dblclick(fn); + this.last_doc = doc; + } + }); + }, + + $ON_MSG_APP_READY : function() { + var oApp = this.oApp; + oApp.exec('REGISTER_UI_EVENT', ['extension', 'click', 'TOGGLE_EXTENSION_LAYER']); + var functn = function(){ + oApp.exec("HIDE_ACTIVE_LAYER", []); + }; + $('a', this.elDropdownLayer).each(function(){ + var obj = $(this); + if(!obj.attr('component_onclick_event_added')) { + obj.click(functn); + obj.attr('component_onclick_event_added','Y'); + } + }); + }, + + $ON_TOGGLE_EXTENSION_LAYER : function() { + this.oApp.exec('TOGGLE_TOOLBAR_ACTIVE_LAYER', [this.elDropdownLayer]); + }, + + $ON_CHANGE_EDITING_MODE : function(mode) { + var self = this; + setTimeout(function(){ self._addEvent(); }, 100); + }, + + $ON_PASTE_HTML : function() { + var self = this; + setTimeout(function(){ self._addEvent(); }, 100); + }, + + $ON_LOAD_IR_FIELD : function() { + var self = this; + setTimeout(function(){ self._addEvent(); }, 100); + }, + + $ON_SET_IR : function() { + var self = this; + setTimeout(function(){ self._addEvent(); }, 100); + } +}); +/** + * Auto saving + * @author NHN (developer@xpressengine.com) + */ +xe.XE_AutoSave = $.Class({ + name : "XE_AutoSave", + form : null, + textarea : null, + + $init : function(oIRTextarea, elAppContainer) { + this.form = oIRTextarea.form; + this.textarea = oIRTextarea; + + this._assignHTMLObjects(elAppContainer); + }, + + _assignHTMLObjects : function(elAppContainer) { + this.welMessageBox = $('autosave_message'); + }, + + $ON_MSG_APP_READY : function() { + var elTitle = $(this.form._saved_doc_title); + var elContent = $(this.form._saved_doc_content); + + var title = $.trim(elTitle.val()); + var content = $.trim(elContent.val()); + + if (title || content) { + if (confirm(this.form._saved_doc_message.value)) { + $(this.form.title).val(title); + this.oApp.setIR(content); + if(typeof(editorGetAutoSavedDoc) == 'function') editorGetAutoSavedDoc(this.form); + } else { + editorRemoveSavedDoc(); + } + } + + editorEnableAutoSave(this.form, $(this.form).attr("editor_sequence")); + + // register hotkey + this.oApp.exec('REGISTER_HOTKEY', ['ctrl+shift+s','AUTO_SAVE']); + }, + + $ON_AUTO_SAVE : function() { + _editorAutoSave(); + } +}); +/** + * Format Block plugin + * @author NHN (developer@xpressengine.com) + */ +xe.XE_FormatWithSelectUI = $.Class({ + name : "XE_FormatWithSelectUI", + + $init : function(elAppContainer){ + this._assignHTMLObjects(elAppContainer); + }, + + _assignHTMLObjects : function(elAppContainer){ + this.elFormatSelect = $("SELECT.xpress_xeditor_ui_format_select", elAppContainer).get(0); + }, + + $ON_MSG_APP_READY : function(){ + this.oApp.registerBrowserEvent(this.elFormatSelect, "change", "SET_FORMAT_FROM_SELECT_UI"); + this.elFormatSelect.selectedIndex = 0; + }, + + $ON_MSG_STYLE_CHANGED : function(sAttributeName, sAttributeValue){ + var blockName = this.oApp.getWYSIWYGDocument().queryCommandValue("FormatBlock"); + + if (!blockName) return (this.elFormatSelect.selectedIndex = 0); + if ($.browser.msie && /([0-9])/.test(blockName)) blockName = 'h'+(RegExp.$1); + + this.elFormatSelect.value = blockName.toLowerCase(); + if(this.elFormatSelect.selectedIndex < 0) this.elFormatSelect.selectedIndex = 0; + if(this.elFormatSelect.value != blockName.toLowerCase()) this.elFormatSelect.selectedIndex = 0; + }, + + $ON_SET_FORMAT_FROM_SELECT_UI : function(){ + var sFormat = this.elFormatSelect.value; + if(!sFormat) return; + if($.browser.msie) sFormat = '<'+sFormat+'>'; + + this.oApp.exec("EXECCOMMAND", ["FormatBlock", false, sFormat]); + this.oApp.exec("CHECK_STYLE_CHANGE", []); + } +}); +/** + * Enhanced Table Fetures + * @author NHN (developer@xpressengine.com) + */ + +// 표 편집 확장 기능 +xe.XE_Table = $.Class({ + _startSel : null, + _endSel : null, + + $ON_MSG_APP_READY : function() { + this._doc = $(this.oApp.getWYSIWYGDocument()); + + this.$FnMouseDown = $.fnBind(this._mousedown, this); + this.$FnMouseUp = $.fnBind(this._mouseup, this); + this.$FnMouseMove = $.fnBind(this._mousemove, this); + + this._doc.mousedown(this.$FnMouseDown); + + // initialize + this._startSel = null; + this._endSel = null; + + // register buttons + this.oApp.exec('REGISTER_UI_EVENT', ['merge_cells', 'click', 'MERGE_CELLS']); + this.oApp.exec('REGISTER_UI_EVENT', ['split_col', 'click', 'CELL_SPLIT_BY_COL']); + this.oApp.exec('REGISTER_UI_EVENT', ['split_row', 'click', 'CELL_SPLIT_BY_ROW']); + + // register hotkeys + this.oApp.exec('REGISTER_HOTKEY', ['ctrl+alt+m', 'MERGE_CELLS']); + + // perform default ready action + this.$super.$ON_MSG_APP_READY(); + }, + + $ON_MERGE_CELLS : function() { + var html = ""; + var cell = $('.xe_selected_cell', this.oApp.getWYSIWYGDocument()).filter('td,th'); + var self = this; + + // 선택된 셀이 없으면 종료 + if (!cell.length) return; + + // UNDO 지점 기록 + this.oApp.exec("RECORD_UNDO_ACTION", ["Cell:Merge"]); + + // 선택한 모든 셀의 데이터를 첫번째 셀로 복사 + cell.each(function(){ html += $(this).html() }).eq(0).html(html); + + // 첫번째 셀 가로 확장 + var colspan = 0; + cell.eq(0).nextAll('td,th').andSelf().filter('.xe_selected_cell').each(function(idx){ + colspan += self._getSpan(this, 'col'); + }); + + // 마지막 셀까지 줄의 갯수 계산 + var rect = this._getRect(cell.eq(0)); + var start_tr = cell.eq(0).parent('tr'); + var end_tr = cell.eq(cell.length-1).parent('tr'); + var all_rows = cell.parents('table').eq(0).find('tr'); + var rowspan = all_rows.index(end_tr.get(0)) - all_rows.index(start_tr.get(0)) + this._getSpan(cell.eq(cell.length-1), 'row'); + + // 첫번째 셀 colspan, rowspan 속성 지정 + cell.eq(0).attr('colSpan', colspan).attr('rowSpan', rowspan); + + // 첫번째 셀을 제외한 다른 모든 셀 제거 + cell.slice(1).remove(); + }, + + $ON_CELL_SPLIT_BY_ROW : function(many) { + var cell = $('.xe_selected_cell', this.oApp.getWYSIWYGDocument()).filter('td,th'); + var table = cell.parents('table').eq(0); + var self = this; + + // 선택된 셀이 없으면 종료 + if (!cell.length) return; + + // UNDO 지점 기록 + this.oApp.exec("RECORD_UNDO_ACTION", ["Cell:Split By Row"]); + + // 선택 영역의 상하 좌표 구함 + var _top = this._getRect(cell.eq(0)).top; + var _bottom = this._getRect(cell.eq(cell.length-1)).bottom; + + // 테이블의 모든 셀에서 선택영역에 해당하는 셀을 구한다(상하 기준). + (cell = table.find('td,th').filter(function(){ + var rect = self._getRect($(this)); + + return !(rect.bottom <= _top || rect.top >= _bottom); + })).filter('.xe_selected_cell').each(function(){ + var t = $(this); + var row = t.parent('tr'); + var rowspan = self._getSpan(t, 'row'); + var rect = self._getRect(t); + var queue = []; + var clone = t.clone().html('
                                                          '); + var topspan = 1, botspan = 1; + + // rowspan > 1이면 현재 셀의 rowspan을 절반으로 분할한다. + if (rowspan > 1) { + + topspan = Math.ceil(rowspan/2); + botspan = rowspan - topspan; + + queue.push(function(){ + t.attr('rowSpan', topspan); + }); + + clone.attr('rowSpan', botspan); + } else { + // rowspan이 없으면 현재 셀과 영역이 겹치는 모든 셀에 rowspan을 추가 + cell.filter(function(){ + if (t.get(0) == this) return false; + + var tt = $(this); + var rc = self._getRect(tt); + + // 범위를 넘은 부분은 제외 + if (rc.bottom <= rect.top || rc.top >= rect.bottom) return false; + + return true; + }).each(function(){ + var tt = $(this); + var sp = self._getSpan(tt, 'row')+1; + + // rowspan 1 추가 + queue.push(function(){ + tt.attr('rowSpan', sp); + }); + }); + + // 새 줄을 추가한다. + if ($.browser.msie) { + // Fix bug for IE + row.after(row.clone().empty().get(0).outerHTML); + } else { + row.after(row.clone().empty()); + } + } + + var rows = row.nextAll('tr'); + + // 현재 셀이 마지막 줄에 있다면 한 줄 추가 후 새로운 셀 추가 + if (!rows.length) { + row.after(row.clone().empty().append(clone)); + } else { + var next_sib = rows.eq(topspan - 1).children('td,th').filter(function(){ + return ( self._getRect($(this)).left > rect.left ); + }); + + if ($.browser.msie) { + next_sib.length? + next_sib.eq(0).before(clone.get(0).outerHTML): + rows.eq(topspan-1).append(clone.get(0).outerHTML); + } else { + next_sib.length? + next_sib.slice(0,1).before(clone): + rows.slice(topspan-1,1).append(clone); + } + } + + // 함수를 바로 실행하면 좌표가 틀어지므로, 큐에 넣은 후 실행 + $.each(queue, function(){ this(); }); + + }); + }, + + $ON_CELL_SPLIT_BY_COL : function(many) { + var cell = $('.xe_selected_cell', this.oApp.getWYSIWYGDocument()).filter('td,th'); + var table = cell.parents('table').slice(0,1); + var self = this; + var ie_bug = [], tmpId = (new Date).getTime(), tmpStr = ''; + + // 선택된 셀이 없으면 종료 + if (!cell.length) return; + + // UNDO 지점 기록 + this.oApp.exec("RECORD_UNDO_ACTION", ["Cell:Split By Column"]); + + // 선택 영역의 좌우 좌표 구함 + var first_row = cell.eq(0).parent('tr'); + var _left = this._getRect(first_row.find('.xe_selected_cell:first')).left; + var _right = this._getRect(first_row.find('.xe_selected_cell:last')).right; + + // 테이블의 모든 셀에서 선택영역에 해당하는 셀을 구한다(좌우 기준). + (cell = table.find('td,th').filter(function(){ + var rect = self._getRect($(this)); + + return !(rect.right <= _left || rect.left >= _right); + })).filter('.xe_selected_cell').each(function(idx){ + var t = $(this); + var colspan = self._getSpan(t, 'col'); + var clone = t.clone().html('
                                                          '); + + // colspan > 1 이면 colspan을 절반으로 분할한다. + if (colspan > 1) { + var leftspan = Math.ceil(colspan/2); + var rightspan = colspan - leftspan; + + t.attr('colSpan', leftspan); + clone.attr('colSpan', rightspan); + } else { + // colspan이 없으면 현재 셀과 영역이 겹치는 모든 셀에 colspan을 추가 + var rect = self._getRect(t); + + cell.filter(function(){ + if (t.get(0) == this) return false; + + var tt = $(this); + var rc = self._getRect(tt); + + // 범위를 넘은 부분은 제외 + if (rc.right <= rect.left || rc.left >= rect.right) return false; + + return true; + }).each(function(){ + var tt = $(this); + + // colspan 1 추가 + tt.attr('colSpan', self._getSpan(tt, 'col')+1); + }); + + clone.attr('colSpan', 1); + } + + if ($.browser.msie) { + // Fix for IE bug + t.after(clone.get(0).outerHTML); + } else { + t.after(clone); + } + }); + }, + + $ON_CHECK_STYLE_CHANGE : function(){ + var ui = ['merge_cells', 'split_col', 'split_row']; + var app = this.oApp; + var command = (this._startSel && this._startSel.is('.xe_selected_cell'))?'ENABLE_UI':'DISABLE_UI'; + + $.each(ui, function(){ app.exec(command, [this]); }); + }, + + _mousedown : function(event) { + var cur = $(event.target); + var sel = cur.parents().andSelf().filter('td,th,table'); + var app = this.oApp; + var self = this; + + // 모든 선택영역 해제 + $('td.xe_selected_cell', this.oApp.getWYSIWYGDocument()).removeClass('xe_selected_cell'); + + this._startSel = null; + this._endSel = null; + + if (!sel.length || !this._isLeftClicked(event.button)) return; + + function delayed(){ + sel = app.getSelection().cloneRange(); + sel.collapseToStart(); + sel = $(sel.startContainer).parents().andSelf().filter('td,th').eq(0); + + if (!sel.length) return self._removeAllListener()||true; + + // 좌표를 구한다 + self._getRect(self._startSel = sel); + + // 이벤트 바인딩 + self._doc.bind('mousemove', self.$FnMouseMove); + self._doc.bind('mouseup', self.$FnMouseUp); + } + + // mousedown이 일어난 후에 선택 영역이 설정되므로 실행을 지연시킨다. + setTimeout(delayed, 0); + }, + + _mouseup : function(event) { + // 선택된 셀 확인 + this._removeAllListener(); + + // 시작셀과 종료셀 제거 + this._startSel = this._endSel = null; + }, + + _mousemove : function(event) { + var cur = $(event.target); + var cell = cur.parents().andSelf().filter('td,th').eq(0); + var self = this; + + // 마우스 왼쪽 버튼이 눌리지 않았으면 종료 + if (!cell.length || !this._isLeftClicked(event.button)) return; + if (!this._endSel && cell.get(0) == this._startSel.get(0)) return; + if (this._endSel && cell.get(0) == this._endSel.get(0)) return; + + // 종료셀 && 종료셀의 좌표 + this._getRect(this._endSel = cell); + + // 선택 범위를 구한다 + var _top = Math.min(this._startSel.rect.top, this._endSel.rect.top); + var _left = Math.min(this._startSel.rect.left, this._endSel.rect.left); + var _bottom = Math.max(this._startSel.rect.bottom, this._endSel.rect.bottom); + var _right = Math.max(this._startSel.rect.right, this._endSel.rect.right); + + var table = cell.parents('table'); + var cells = table.find('td,th').removeClass('xe_selected_cell'); + var i = 0; + + // 복잡한 모양의 테이블을 위한 반복 처리 + var selected = $(); + do { + // 선택한 셀로 최대 영역 재계산 + selected.each(function(){ + var rect = self._getRect($(this)); + + // 영역 재계산 + if (rect.right > _right) _right = rect.right; + if (rect.left < _left) _left = rect.left; + if (rect.top < _top) _top = rect.top; + if (rect.bottom > _bottom) _bottom = rect.bottom; + }); + + // 좌표 범위 안에 있는 선택할 셀을 추린다. + cells = cells.filter(':not(.xe_selected_cell)'); + selected = cells.filter(function(){ + var rect = self._getRect($(this)); + + if (rect.right <= _left || rect.left >= _right || rect.bottom <= _top || rect.top >= _bottom) return false; + + return true; + }).addClass('xe_selected_cell'); + } while(selected.length); + + // 브라우저의 기본 선택영역 해제 : FF 제외 - 기본 기능이 충분히 좋아서 + 이 부분을 실행하면 오류가 발생해서 + if (!$.browser.mozilla) { + function delayed() { + var sel = self.oApp.getSelection(); + + if (!self._startSel) return; + if (!self._startSel.get(0).firstChild) self._startSel.text(" "); + + sel.selectNode(self._startSel.get(0).firstChild); + sel.collapseToStart(); + sel.select(); + } + + setTimeout(delayed, 0); + } + + return false; + }, + + _removeAllListener : function() { + // 이벤트 해제 + this._doc.unbind("mousemove", this.$FnMouseMove); + this._doc.unbind("mouseup", this.$FnMouseUp); + }, + + _isLeftClicked : function(value) { + return $.browser.msie?!!(value & 1):(value == 0); + }, + + _getRect : function(obj) { + var el = obj.get(0); + + obj.rect = {}; + obj.rect.top = el.offsetTop; + obj.rect.left = el.offsetLeft; + obj.rect.bottom = obj.rect.top + el.offsetHeight; + obj.rect.right = obj.rect.left + el.offsetWidth; + + return obj.rect; + }, + + _getSpan : function(obj, type) { + var span = parseInt($(obj).attr(type+'span')); + + return isNaN(span)?1:span; + } +}).extend(xe.XE_Table); + +})(jQuery); +if (!window.xe) xe = {}; + +xe.Editors = []; + +function editorStart_xe(editor_sequence, primary_key, content_key, editor_height, colorset, content_style, content_font, content_font_size) { + if(typeof(colorset)=='undefined') colorset = 'white'; + if(typeof(content_style)=='undefined') content_style = 'xeStyle'; + if(typeof(content_font)=='undefined') content_font= ''; + if(typeof(content_font_size)=='undefined') content_font_size= ''; + + var target_src = request_uri+'modules/editor/styles/'+content_style+'/editor.html'; + + var textarea = jQuery("#xpress-editor-"+editor_sequence); + var iframe = jQuery(' + + diff --git a/themes/xe_solid_enterprise/modules/member/modify_password.html b/themes/xe_solid_enterprise/modules/member/modify_password.html new file mode 100644 index 000000000..3b4f7cdad --- /dev/null +++ b/themes/xe_solid_enterprise/modules/member/modify_password.html @@ -0,0 +1,39 @@ + + +

                                                          {$member_title = $lang->cmd_modify_member_password}

                                                          + + + + + +
                                                          + + + + + + + + + + + + + + + +
                                                          {$lang->user_id}
                                                          {$member_info->user_id}
                                                          +


                                                          +
                                                          + +

                                                          + +
                                                          +

                                                          {$lang->about_password}

                                                          +
                                                          + + {$lang->cmd_back} +
                                                          + + + diff --git a/themes/xe_solid_enterprise/modules/member/openid_leave_form.html b/themes/xe_solid_enterprise/modules/member/openid_leave_form.html new file mode 100644 index 000000000..9743eddcc --- /dev/null +++ b/themes/xe_solid_enterprise/modules/member/openid_leave_form.html @@ -0,0 +1,28 @@ + + + +

                                                          {$member_title = $lang->msg_leave_member}

                                                          + +
                                                          + + + + + + + + + + + + +
                                                          {$lang->user_id}
                                                          + {$member_info->user_id} +

                                                          {$lang->about_openid_leave}

                                                          +
                                                          + + {$lang->cmd_back} +
                                                          + +
                                                          + diff --git a/themes/xe_solid_enterprise/modules/member/resend_auth_mail.html b/themes/xe_solid_enterprise/modules/member/resend_auth_mail.html new file mode 100644 index 000000000..8f3b44676 --- /dev/null +++ b/themes/xe_solid_enterprise/modules/member/resend_auth_mail.html @@ -0,0 +1,24 @@ + + + + +
                                                          +
                                                          +

                                                          {$lang->cmd_resend_auth_mail}

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

                                                          {$lang->about_resend_auth_mail}

                                                          +
                                                          + +
                                                          +
                                                          diff --git a/themes/xe_solid_enterprise/modules/member/saved_list.html b/themes/xe_solid_enterprise/modules/member/saved_list.html new file mode 100644 index 000000000..f90001b89 --- /dev/null +++ b/themes/xe_solid_enterprise/modules/member/saved_list.html @@ -0,0 +1,49 @@ + + +

                                                          {$member_title = $lang->cmd_view_saved_document}

                                                          + + + ++ + + + + + + + + + + + + + + + + + + + + + +
                                                          Total : {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
                                                          {$lang->date}{$lang->title}{$lang->cmd_delete}
                                                          {$val->getRegdate("Y-m-d H:i:s")} + {$lang->cmd_delete}
                                                          + {$lang->cmd_back} +
                                                          + + + + + + diff --git a/themes/xe_solid_enterprise/modules/member/saved_list_popup.html b/themes/xe_solid_enterprise/modules/member/saved_list_popup.html new file mode 100644 index 000000000..e791907ed --- /dev/null +++ b/themes/xe_solid_enterprise/modules/member/saved_list_popup.html @@ -0,0 +1,49 @@ + + +
                                                          + +
                                                          +

                                                          {$lang->cmd_view_saved_document}

                                                          +
                                                          + +
                                                          +
                                                          + + + + + + + + + + + + + + + + + + + +
                                                          Total : {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
                                                          {$lang->date}
                                                          {$lang->title}
                                                          {$lang->cmd_select}
                                                          {$val->getRegdate("Y-m-d H:i:s")} + + + {$lang->cmd_select}
                                                          + + + +
                                                          +
                                                          +
                                                          diff --git a/themes/xe_solid_enterprise/modules/member/scrapped_list.html b/themes/xe_solid_enterprise/modules/member/scrapped_list.html new file mode 100644 index 000000000..5bfc9e3ac --- /dev/null +++ b/themes/xe_solid_enterprise/modules/member/scrapped_list.html @@ -0,0 +1,56 @@ + + +

                                                          {$member_title = $lang->cmd_view_scrapped_document}

                                                          + + + + ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                          Total : {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)}
                                                          {$lang->no}
                                                          {$lang->title}
                                                          {$lang->writer}{$lang->date}{$lang->cmd_delete}
                                                          {$no}{htmlspecialchars($val->title)}
                                                          {$val->nick_name}
                                                          {zdate($val->regdate, "Y-m-d H:i")}{$lang->cmd_delete}
                                                          + {$lang->cmd_back} +
                                                          + + + + + + diff --git a/themes/xe_solid_enterprise/modules/member/signup_form.html b/themes/xe_solid_enterprise/modules/member/signup_form.html new file mode 100644 index 000000000..f853a81fa --- /dev/null +++ b/themes/xe_solid_enterprise/modules/member/signup_form.html @@ -0,0 +1,93 @@ + + + + + + + + + +

                                                          {$lang->cmd_signup}

                                                          + +
                                                          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                                          Sign Up
                                                          {$lang->member_default_info}
                                                          + {$member_config->agreement} +
                                                          + + +
                                                          +
                                                          {$identifierForm->title}*
                                                          +

                                                          {$lang->about_user_id}

                                                          {$lang->password}*

                                                          {$lang->about_password}

                                                          {$lang->password2}*
                                                          {$formTag->title}
                                                          {$formTag->inputTag}{$editor}
                                                          {$lang->allow_mailing}
                                                          + + +
                                                          {$lang->allow_message}
                                                          + + + +
                                                          {$lang->captcha}
                                                          + {$oCaptcha->inlineDisplay()} +
                                                          + + {$lang->cmd_cancel} +
                                                          +
                                                          + + + diff --git a/themes/xe_solid_enterprise/modules/member/skin.xml b/themes/xe_solid_enterprise/modules/member/skin.xml new file mode 100644 index 000000000..81d2c76fb --- /dev/null +++ b/themes/xe_solid_enterprise/modules/member/skin.xml @@ -0,0 +1,70 @@ + + + XE 기업용 회원정보 모듈 스킨 + XE标准企业会员信息皮肤 + XE Solid Enterprise Member Skin + XE Solid Enterprise Member Skin + XE Solid Enterprise Member Skin + XE Solid Enterprise Member Skin + XE Solid Enterprise Member Skin + XE Solid Enterprise Member Skin + XE Solid Enterprise Member Skin + + XE 기업용 레이아웃과 조합하여 쓰이도록 되어있으며 회원 및 기타정보 조회를 쉽게 할수 있습니다. + NHN (developers@xpressengine.com) + + + 皮肤继承了XE标准企业布局的风格,使用户更加方便地查看会员或其它相关信息。 + NHN (developers@xpressengine.com) + + + The Skin inherits the style from the XE Solid Enterprise layout, the users are able to view the relevant information conveniently. + NHN (developers@xpressengine.com) + + + The Skin inherits the style from the XE Solid Enterprise layout, the users are able to view the relevant information conveniently. + NHN (developers@xpressengine.com) + + + The Skin inherits the style from the XE Solid Enterprise layout, the users are able to view the relevant information conveniently. + NHN (developers@xpressengine.com) + + + The Skin inherits the style from the XE Solid Enterprise layout, the users are able to view the relevant information conveniently. + NHN (developers@xpressengine.com) + + + The Skin inherits the style from the XE Solid Enterprise layout, the users are able to view the relevant information conveniently. + NHN (developers@xpressengine.com) + + + The Skin inherits the style from the XE Solid Enterprise layout, the users are able to view the relevant information conveniently. + NHN (developers@xpressengine.com) + + + The Skin inherits the style from the XE Solid Enterprise layout, the users are able to view the relevant information conveniently. + NHN (developers@xpressengine.com) + + 0.1 + 2007-02-28 + + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + + + + 기본 + White + 白色 + + + diff --git a/themes/xe_solid_enterprise/modules/member/thumbnail.png b/themes/xe_solid_enterprise/modules/member/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..a32dff0e4a800158320c8aaf87888b2a7239d572 GIT binary patch literal 9096 zcmaKS1yq#X_BSFDN=Zuyf^-cXN)901!w?b!3=K031EU}zEhQi!B}ht2cc*kpH_|OI zATfNr|9jv2e*d+;`#ozt&xy77@9cBV-skMI&+|cB^A*uU+J{(JSVSty3c7b`<=q>G zkA3%zSURu0OP(MV4Uu{<8zc&XfMUs6!z`gpD$WpFs4f&@{noV?`VtH4KC`{PA<|Go zUD68X%m?|4hVP9t{Eiz7>!r*aIK;{kie$2c+S2E>}jsHKXv-5wb-H^J_f8_mt0=wzIg+uvup>8mDgw@@|*|7Z86kHOBfI^Tk zggy-B^!F%g+rf}9H#-=d38*K+C%^=@cd>?{-2R7NLqk%<#SIB@v4W~7NHO0b@Y&m2 zONuEf3JA*qMHIz>Kmh?ofSkCTgg8(FC@&{3A}FDt_&2Wt%*x#v>Vo{6*ZLn`(f`W( zmnt~J?^;%XBJ4e&)=CJNGt>WcS zSj0?Nc%**!@mufVEMs~8Sk~4D>HQ3;tOqzHvteDfAk5P!S;CfL1iV z5!|$ft5x(u)U0~F#>L*f=u&5o$VK7^j1u4-FQG#ej@CQu?CpQ|u}kDOC=}n%fDd4* zMYGY(U@n+Qbv}uoxB57sXg4hmVwbE$8t4veVaolgQm#Ixi4CNEAR1-s>;6{U@vMSy zp_0UyyIp!e#4eok%*fsg?cg!*}b3{QBZmJ-y=+DfNyp9ac zqPT0SGShU^)mS~Q4UfTcZ7vd;hm89E2<^{0`Lt#-h4_u%zKKW|al@xlT7-}zO7%woZ^3|YD*Zu0I)R-5ZDMOP9=xiMGsrY&+ zF)A({1_{$QOHYa1jMsM4^Yu+MX_*Q}oOxpca-s}s>TC`L*y zi?>mhcRd`AmoOTA-A3b*&$Am-Coh?zk*n%_|Nj0U#OtL!9!uOqHYLw@K6sh@y!?Im zb21~Q^CqTqDgui?WPQV>Ch9tHzGtnJrYn%Pqkj}g`4r5pWvMg@OcIIHdbHJJ4=%Lp zWMQ=#<^cnQsdtN#ao119pA>O%)I$NntYPK(y;Le8Kus0i5Pvfx?UxXKbB+~aYT&BJ zoV#f}r8uqQ5Ca=`>|?^Kf^|XpiqFriAC>p-LOFsn2#n&I+OQHuXJiezX45z`IS^Uv zwYaZ}rRsAXsMgLeQzurs5rQ#Y_L+u7Xd*Pls#jx}1gDU>4$BIFCsCJj?V@+|;Ip~j zgd=?7#kz4J#1QO07&w!$q(T0tvu$!V*?LrCU!#&0=Ca2eCqzTE##KYkUx~aDHdV=q z4JxlL6Hl3$+n~f}{h7u)KDMr^SoLA~VoaBB^EAj_U(33$3CMCkjn{)keK$G3dKhbM z=Nl7luw`tMiB4$>U&2Yer4EQFq(i6Awhv0MFxSiI@`SW)1jqbGa^>x>{PEAge(Nz@ zR$le>iVr}!vQ(~edk_ee|GOaaaiR=QLLi){0Nz!OO_cU>l3Q#noKJHiyy^H|qxz%pWk!?svUy z^K&@@qAkqQN+&|75FyO9MH{PL5BIicXwX*erw*bt$lPj?5<}NY(X-R4-a7in_+_dE zx>N%;Eg+$5_bg||p7Ih{l@W>(V<*I^FSL!bd&10NqwG)>tM%*coM>S}jy}%xilhgR zbxk67;=`cKBIXbR7W&<7IP-CUKBqZhwMPUR&toHRO+qd~gz>|RG(H%p1kvd5c{(2Z zd%XAh_uOrL-qi%cPK3Cf9LIP`24fk4AVt>{qZKHIJMKZOoO_pp%dUaDUKw|ua^u1w zNU_t@dEph0X`fAal2bm+E;Oie|Ljb^%;`!bf{9@zBlQR9fr=QDb>CCqS z@OI0Ilyh|5%PM(5+NnhiQ^u@BbLS4m3rsWxHj+|&APT}q{;-Ix;$6*CB~o_K!-iu7 zfY$k>VlMoXYaTxZu`1MTV$foue{=j;AKkeHc%BU+&&1F47@L&O<7Rj1C^fI3{}xFE zR%Sg>6{c<1P#hV63oqNGMRYJCjp^oQ480nRXU&a2oHITVL}tN$skinFL}>v%w)|#9 zx|3&HzyaUS(eq1!eLmCDlx z)3KC+ox(pUa=6xiD{!_~0w&krF^F^z-sY0eu>CFB1vL;)+V<2w9KujwST!u4!tjN&j742 zSSeO@PYF&@=74Wpby4yZ3!rJdx(jceDoS=f&m6V0wN1?A0H;`7FQ7}A{s_sweX zrua0)ijA*x?2{D2j)GXEmEx<6)g#-g?Q45=XYXxC>Iq$aE-j%uqnZhtWdJ`qacG_? znTgM+r@EeOtYV;?l z%B)jppI54kA^K`r$`( zqLqtKW!|t-ty<4_OX9-FL9*9hh~=s@U+Lg9H}~+&{ZeX=DLFXUUB2+!mUJL@26t7u zpdNn}bpp$ueq7t>E@mGiX{Mdh!li@HGjA}d#4;%xCB&HgoNhc={j`{o_q6}Bm}#6K z-|+HaA$uFWcf)KX;8VNio0AZ7Yw;x#*=xok!0I^ zvkzN3z}>iCA=^43^%_1ctFEc(kX&6`YnZQJ;_YJB^=`D1={@&4;sNOUIw~3bJ9)Q` zp(?SSi&f7aGS|k ztTm`8K^p7`s_cj5`RicJjqk;GjfI8VLm0-Gkl`#j=!WoBX7}u@QnNN!0>ZND_wU;q z8L}tnx+K+03-%b)$i>EGz0KF?RLqK+?ZQ`WG$3i1&HUQ@HcMGaiZs3W+f%Xd*5!>o zZwe1Fn=IqvJ4bR%_$F!i-NyBwldP;P!j6dn;x;r&!G@h(zi+d=uLZNt{kqw%4Oc}n zP1Dj*Xl8tA5_NeJfJ008Hhf#0+=c&8{d&u?yBZ+=-UjDK0Dk2QCFW>F!TjRw!=@Wr zo0i~WS9TLlM_&xJd5^wk$uFPZzxyAz@SAdIN3n&@dEGQBFek|QRLOMvJ-eQs58J13 z0{@PLy<1CJy0&@sD&z(oL~V9~IdAcu*~{1}Td@*4Y(8*eBpxH}iD!KjE>iO`;uKa~ zj6%PviEaPDm!54`G?k{zYRJ#+N-0;BoNTF?ytl5!)%_O|gPS43! z_S*Opo!5@HvOb!9!RrXkt2&?fFq(B^S`Q5U5=vEVV9f@%%>JHQQhg>WrU;_&=g>Mm z?s>`rp<#L4w@)pE_uv7;6Ui@y#(bS2f@Wgg^{@L588&YB=x&ogerJq}!z`lZRm#IN zrkC^eY?VV^kRE-JemkaE%e)^`^}&_db8qxL)16Q!k|Fzg35kj4Xf&K24EniyCVkvV zo-uW&`&d!u9S}JZXKc=q9>Q0kZ^^l%7ZMU9?1>R37z5G7{_T3)<%?`BkjtNO9402x zXzYKP%>TBe%fL2>eSwW3sUlg;HJaFQa#3cXlC;v@S)`!m0F@o}}fGC6c&TUMQjl>-~dJFad0pc_t6ExeFvCm#>Zs-_i+unZie^;^3n zpO|kr8mqxv{h`MEPOo!yMfikU+fj%HYxx?h@o2a}qmUxJLj%0*zgjRKm*RB8mo5ui z{>-;rqlVLVu0uxwl^3(CzkV-Hf6}7M52}!1B8_{Nw0*yg8_`_^~l87ZN8p(|PH@ zmm?;UwGd!>T-@|_amBrWU;?<$|J*{J;!)@v%j?ux=;L;VGs#HikiMCwzysA1{=7AW zBlqOY(vzjx^vx$9=Ry|Yl^G;AT0K1&7(>>~6>8`igrH#(v@7=`j8%vwNub#GHyoANpDv&SDq z4bAoyatMe|d*9NRf93Xa?BCs9U2etVqvRVpOs9Eb#Sx*v%g|lvP*okwgRN5pER6ev zm(ud(^(l_gKw!g1;;#8qV?npd780t5pVW?HRz7Kt5rZH<<<(UtB4&kf?SjW}?&UJz z_oMiCC_#L=wB+S*Ntxz+ zRfv-LIo7t)&ftw&s{PB>$Hh`Anqo-cPb4ABkJ+0;Nf zV?-K4>exLB&6dnnA<*4|#+s($XK?`-QZaFmhGb|DfxmiJP0dsdiJ%dv2iwfn!O`2n zr1R%)?*>BT*(pJ&^{3Z_Fz71XeT` zDo0IikfiNDQ@6iOZeRRT^ucUo6FjRm@Y!sC?$61O8Eye_vJc`i(AL1f^*!Tii2b?{a z6Mj;NSFYW3x)G6A)3tw!V~4!{Y0j5Dfi~bT3SFaKoKah!T1rb@;?L4Wtd;s3&);$6 zBOScNqLw=^PcIH!bYgy{oy{y1QCP=>Z!Ss}$!e65K0K;r?}xZ<@Bd6I`g#+*ehxe+_X%b)x{qAi}{4P{%*U-Kigzf3p5 zx5rL*Fm2s^F?nBzB=AwS`3+SIhwk&WoY%0ir#cV%n2Y})^Xlhz z9d&x>6@hSpRLOQIfu6ye0Iv4+uUG2Sb>g%o63c09yetLGN$=k~Trqf=F7b;Ut-QhvCc&jqx{4yyLY0u(_DK>^*%JW7UlErOMMDZX2(BkJS0<81 zyN+E&XP-vm*iVe`enyI?*wrizZc!rbICjR|8cHpaN@Xl=A5|%uFva#cCusN+b|ov% zKM9v82wTrBI*qcfo3`VbrzdPsu@F1pWvVK2;Ed-1K5g`j{`9)pBHF;*du`!;*(-VB zedtPBgijHFb#?jZ1li2AIR2ZjT{#QYXz5VdYnNAwW1RiS5P6ev>aXz4X^ZowuB`Ib z9KqMGz;k2mubp}43&`wUync0-O`v}VB~ec9AM8tQSkm-ITWe4%J_*S#@_V|!{lm86 z)AtsLJ6ihWbj_GetCRxF#VXhknB{EER9^-#>AIiQbA^SI-kDz{)vKcri6FE1eD7`> z|0@zW(t(fH`e3UXK9N9&_YOvj3AZz6EC(ko&DqCpgk5g%{xd1z)54X`aW1NZu=q7EsIpt>5B zVrYhx=A|@9hpNy~t-tLHi-C!LZh$sB5L8R1DoKws2s?<*HB#_ZDjhphA7imz^DlAA>t;v)A8#ppz?WsZO2)Vt;`|h zpr7^uGx+VvtMABn4{F#J^=D;r6uIf1++4`c&EKuEXFrs+`Y*l@*Uf%JDVBZs@OF|q z$9*8P%bIIkT6ioqb9o4k5eX)t~o^3Hx39n4WY*Xwd$kg5`G_!m)fO)|M7j zsa~Lt8OJRcA3%lHMPmn+TDX^4Dmy==mgN>~%okyDa0R0{q(pXXTC*Zt> zNn_OY;eB<#-M{VczW@DYY@~^}Y&i)ja?_e|7Mm4ha-Hjcvncs0smb3+wv44!J zdnw6e;j3M)VL`2tU|R1pni6iyq(WU`9TT=5VSUhA9Rd_W6U)Ia=8Hb5(alfoplf}m zs4uLyVgvSIjschtWC;iO{CG`k3OWaGP)(f|($XI_6heugaq1OQh0(9WW$Qgk>qKix zZB{D#@@zM!X6(Z6zalhM+jAZo;&B8N#FbZ^&_!u$^F61gKKCBA@I+ZT3yn|EW51O` zjo{7O3KE_r%3L;3cnNRV+ES6!OTKRKx}sT=(=ntz({{UCI(%Lm&#O#K>Sm@5dt>VQ z(5ESDj^;i*=#Ip&^d0x+ipm%B`?m+-)R_I2%Zi-*B-z6c!&2TmK&e#4_yRTZPXrSt zJZhQ>sdeI0!tb#8dr)KTM=V+%!P}NeLL!jWLG$QuG2hz1F2-1d_m7-C>~TyMcRwJ4 zF=alPobP(T7~{3R=P`G@xZaBz=4WBoVwAgweeNV-L9Y8})upj>WMtyv;(BAz0=%`J zXg0e!K*Msol_#@Cq$`=~wH^7$IzwYFNhdQ;a`adA*6roykUwAH(F`*`|aGBb|^YP5~0)8r62`@Xe7aDP3LX9Y1Ylw7;4Y$@|c0dv_tMHEJJ z2U`u+DpgiqKE~;S(~Lc*K+$rHPt6$^YCQF|?&MNy!!-MS5)sdFt|XaHYeDrx=-jJ| zo1ku2W3!M~uiH{X z?F#R>r@Om-lx-F;Um_b6jTaIkz1P9QJ6?I)V4uACc9zjGW@J)1oODTtr?#T0ccM`5 z`z=xwD1BQcb0it9KC0iPDqwh8Wb$*}f!aNyS{LRHLZ+_MJUhY}3#Mqr2uY6*V>ton{;)Li@ zo7EeB=~d1i7RyIgrmfYVh}o)(euVC+AAX4tBttUDoLLu!Y)MFxS;)NR5)8J?&S5W~ zZ=EL3>&7*rC$4el>Z)8nPXBYtQQ!aqohexs1-L}vhNpV$O;{W-tw-WO6SGL)6NmrQm5sv61cB@()QCNM*lZ@ z7qpZ6{uxs$)|A9w@ggkZj1W3vzegj^D_DQ%Wk(ody=AAc-di*Nb3P_fW*lsKkk9q4 z9+F)119!~*hK19gJMnC;c-kuIWsis%sBkLQ+d)M(UX^9$6-CZJX1)x0`Oao@zSBm_ zwgPJR=iR+FPWmduOe#TJikc8>8bNLE#pT{EOe>j`?-Bhvno8HTOMz5vcrzTmbaC)> z#iH*IcA#FTl$4N~-mm>XYHB8~W`Y6FzH4)2Qdn`kV>3aNYU=5sz*IJyVn_;b?ZoMP zGWXaj6Dd&dTnub$lR!zHpt`MA;iwMautDe9R^R81>6~qEcc?Fx!jAPm$hg~+Yl>76 zH|rJL=~qqT@_c_j@;4I(T@E27%_PKbF7m#-y9v21Ua#{VpW2&E@!9P8UW5r(-rSie z^73L&pDrw*-Su#cjf(lqmwdXzWByIjU*qHdIe<(%oGQ)ZuI>M3hIiySxsIGXP-&{^ZLsZz(zLTTU0`i zI*)_)F1sBNR#M(8*Ga=KYdkTB#3IAC>7Ks_6U`#3Q~j6q9fyC+eaBq%n|q?4PGaQn z=a-gjLHeOb~LbC1|k#U4vSy*KiRwd18$nx^h_XONa zH(Y@?n&^K;SN|9qFzXTO$dW40T=NEgOsLbC8!yFr?-d-7y-?X5sinEeog?e01_(sb z)6ouDQzq}wZ3SC@wJ}#NZ)kx!K%1JXUeFNfhjWG!ei26?k#<{fx3(1mFR5l0AWN9G z=pnC7FwcabE4~5G`1r(R!P9C5lRr&o1rDcYmC4EQZLmyAf3&$b=8?;ovJH`5BBD2S zN^7v?sym42n0wf_%(GNbqCs5Tqr12CY0IM?KsO!y?I)(BHL>L4EnTSRb!^~hlN4`A zLrNtJ)rZ>ZY7%3wOBGf(!}gGm)wXN9k5cL|ECHd+JF44WOSktP(_v;AeP#y%LGP%# zo)C)IcXxqn(L+&QD&>Gkc}tWl_fG-91nu)FDk=gkC*R*q4osJ)hf+#?KYw;5Wh#j% zc08jpS@>~Eat1|_yuh0kqqZfZ{FcK>|6AKJrFZ3(lB*(b;v3tMk9LCK0?#a;=+oon z-12%ui2>I|_<+X3k_#9bncQjxjq zNklv%mHtND&*UDqz&{u4{|XrU^q<~7pux%pYO7zI6CVBbZ;Xnfrb3Clh5!EnX$D&5 literal 0 HcmV?d00001 diff --git a/themes/xe_solid_enterprise/modules/message/filter/login.xml b/themes/xe_solid_enterprise/modules/message/filter/login.xml new file mode 100644 index 000000000..c0c7e870c --- /dev/null +++ b/themes/xe_solid_enterprise/modules/message/filter/login.xml @@ -0,0 +1,8 @@ + +
                                                          + + + + + +
                                                          diff --git a/themes/xe_solid_enterprise/modules/message/filter/logout.xml b/themes/xe_solid_enterprise/modules/message/filter/logout.xml new file mode 100644 index 000000000..8005776d3 --- /dev/null +++ b/themes/xe_solid_enterprise/modules/message/filter/logout.xml @@ -0,0 +1,7 @@ + +
                                                          + + + + + diff --git a/themes/xe_solid_enterprise/modules/message/filter/openid_login.xml b/themes/xe_solid_enterprise/modules/message/filter/openid_login.xml new file mode 100644 index 000000000..a924c15d8 --- /dev/null +++ b/themes/xe_solid_enterprise/modules/message/filter/openid_login.xml @@ -0,0 +1,10 @@ + + + + + + + + + +
                                                          diff --git a/themes/xe_solid_enterprise/modules/message/images/Thumbs.db b/themes/xe_solid_enterprise/modules/message/images/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..4e71ed533999377f7811b557954d20568e7b213d GIT binary patch literal 46592 zcmeI52_V#4)WHAtJv&8=q!dYuy)sm`He@Lx$xcEPLW81EDbgMyNogTVt0hHB$x>O$ z8dAy5*k-=wzWToR^ttt$J7(^^=fB*0{^y>%%#%XSn$t-Fwb*At8Kc2SWG0OM zqtB_}Jz_X;U>G&Lp#w-{GI``f41>4hVGLb?AvjhBxOrRvEr9MPy623*1b_)(23P=A zfDK>=CIL_dFiwCQ5C?bwUVsna2POgnfCwN6Oa_DiVE_kA0VDuXU@9O6OarC^Gk}G_ zOh6Kt2h0MbfZ2dFFb9|m%m1SP7^B z>VO8I31|V!faSmnU=?5h=m4nR>q5L5&;#@VLjZlg2I94V(dgg*)he+XbAo?vaF5im z%@A+FJmH9cJn%t{p`074AKwZ!(Q%tQybGvkAd$*}k(B8E{Ysz(Eku!z;vX%G9~}e) zRIh#|fP5+{C;+vcAC-^Vkm9KPC73x}b#rVJ+y$F|a3CE2;QUdWJc}AQ1a$03kE6r+ zxcwuYfRcRP{!!gVdI9MGO8ZB;1L=S-wSS~1P#)C&QTzM2{fofgQ-CkEf0PI50M!1G zjzBu#YwaJUMLOVX?H}m|qyvyXL1`)NzY6|V1yK860w5jmwf2wlq4tk-1kwRWk02fJ zdHYAYfuaK_?cW$aTL+i`roei@4A=me0~-Mgz!E@mtRY5q!4|Ls>;VU06W|DJ2AlwA zzy;U>xB_m#R$v?84tM~lHE##J0B^tt*Z~j#UjVgPR0mj~0+7qdH5kV-buD#_3M%ym zbb#baxHL4>)aXA1TKG@LNJmFYOUKN>K+nj^%*x8b%)-Jpfs2D}0_Ox477jiRPHrAv zUS3vq{)v1%6S;VJc~Bu#G?0guj){(riHD7ajpwHWISb=tggVDTLnVq)b5hZ8QjzbX z=Li)Y94$KF(LhBF$4Jk>$i&P72~wejP|?s()6$@$hSWarJx0q($2DcHDm}NZIfJMR z&pf|_rx~X%PRiz8UDPHvf8!Q^CT2eViIW7TO&6arQ$j{oPF_J#X~|MGbq!6eWqSGs zhHKUu8CzIdS=-p!*}J-J-RAD$xqauZfWX~*f`Y@s4@De4a`f2onAkIMXXDQ$oKL=* zlA4x&?fQ*7Id|{n=H1VKP+U^_^x5;W@`~EJ`d1B&O|P5Zw0CrNb@%iV`})y&QDHPA zr}g2?K07Z?I4^2iS{hmgbY4`{?f?xZE!~v4^jxaC4CXG}qVxP1c@`f$os`Wqb^hu$ z-i=#|nEAwHYNxfMQyV_BA3HJse{^OaPVBGqs=!!jsNm+&aKZz4NUXg#bYolQ?(XY} z**8kxB{rP0&^*3WU4NQ)fd!3-O=JYl_m9tNQd8dgMi%T{?6TEq9 z-eW-*<;U`(bhEC%+A@E=&jp`t{R7HoM`X#^0^x|)K8q{7RuQ74r5jwy<&?Vg-I&sT zq{c}5p~E(ex1V9XFy`A&yWOC!Xa$Q|a!#XI;-jsdlf>Rp<%>||*RVE)InP}~;$q6Y zhF6*qO*8rqUn_EAU}tAcFgE%w_CpeOCo&co)0Q{Hsm-`!3mMyoYb#wpk&MO6tYv>} z);^r&+^xA}Y^mNI+{w&(jX_!dK>X`qk0qT)25n<}*@^bjtb`(-w%twA#8Uq1l=R)Q zf|4PcJJ>x|=i1fVhP~mQO*9Imxx7eK5w~ncH2a4Z#(^;m_Z>DsOGBV%^{^&C)Zh6W zY(*z{%2~k^&kmlBW}{Y;9sF$uPfZ)>3E03l=y^Hv^hcHqHkxxIJPY06pA)23h3Bgq zq(tvO&ZF?*`4svq{FD9<8cTaK+W$dX>Q@4ikH#rjfFJGups_j4VYNLnKKQHh zDSf{mm2U+C@1X$}2y=!GUf@UN2SD1E(d$3%zy7Lc{(JuG{;1q) z9&ZitknVGJ&o;M+q~DILnBjP)EcoF4`wBu@m0{W!d7CoiGRo^ixo2;;e;!N5rV9sS zO{6JieFTnMhH**zth+2oRbnw2S?y-;T59kU9nzK3;$m7et}loS6Fhc$LRFk@R$)T! zN*=1OsJ{=-?}cN;|I9G%e;yr|8uR|=p2BxglL>{p$QY5IpN#Qq^l0zLH{Br&vV@Sa z5acsX_I4p-%G_kE#>8yU6j!dSK*pk&$XMHKY0~WA85k+QJ#UbxO~(9O2<>hJOJY6A zTbzt#UCSii0KfHscpk2^7EhwPN5<|I4TaZ-_O(TkG3q)pR`(j5&OayKmguC_o<1mM zZ1{HO(;d(G8V5|g+3Lkxi_|c}*IL*2H8RD1z7G0)EcjpWnARuuhaa4xKd=+n1)%Zg zK!|q(dw?Jy7zhFO0{ejdKq!EwaG>;I5QhVYfC%6)a0ECC90QI6CxDZ{DIgMv0-^zw zKL+Ah;0zE4oCV^6b3g)c9=HG`0x10@h%WHIJ*pkTFUGECOY(uM73;+2<@y+uQnO!^?Ia9JOT#my(1VP%2KTS;d3AUo z@1plg72F07iFzmhLFM@+tJ26=(eia>cD{(>|v}Q-=f^* z6JM3#T)IP!Sf8~W9~j%-c)}|7&5iibn6|i!&rVs+j()nS!KP#OVd*sbt5p|vW@wc& zb6GgnND+icmFxN2W}m9tXF}AwSJAY4q5MVp-KkQpS}AE>woZp;6CdO|hXojJ)t(#6 zc|=4~uHimIF&VS#jcrlx?ko%;IGn=WsgiH64m5AG2}v!##T|bs{^A<}$J_B`EiDyv zC*_Yx6?i)Cb@p{~3{71-Q}!)Mu-!1Ku6085_V?i~J+~$GQiFSn>n+4ju%^tN^=tR^qvixw^N&{3oeq+?%7i$Y5d~o z(JR-knTA}6<(s8Xckt->;9mBCsEIOBA=~9Hc%5BW)!eJ3p5Pku#&}!Io~z|mDp^|G z6U*y&Fki8Kc_?u5D-LXd*M+_J6@0=pcW#JuT}ekb z%|!Yxn|K{v)82sG{oeRGCz`6)$;~%*@A6iaE*EtOJb+8_eCXg@d|~PO=>h&{G5lPM z{qZ@SEp1i%7tN9)V_mDCwx;MX6e!8Ri>PCpdWVEdNsG$q-}Gc~O=un6<71W`EXxID zr>UK~y5~rNm8$TIJgyE6Dph6ic9KIiySD=IWm|7fMRnlT6QP{Mt~cR!Yv#YG^a!Y` zbI@3~&Q!6Mev_uC)io_4u@D!7{650sj3SMSnS0t-uBpNAk-nudpkdEh)$ET85|BE3 z>db}Z(_f2)tU6r2FYi6cpjt%aY-jpHntR(X-yuwRNo23J+377ym^I(bwnFOgDVJ$i z`GU>_((Vi9qLNs4l8Y+O+_>5{wuL9q`)M1Y$E4jXr8S@}0_1*DR_A9ckjJBJK z@2H0v0WpUY1+Ua6|n^$XHM;iCapX*>}f#l3yDJu;S+ z&t3F=^NC(((d4U!jomy9Wr0-TESED`+*gbz+)7vr5+ph-+#^j zH12=+$Nq<*sZV55+ouPaUobPXpI+C`bA2XV*A+4I+!{X%tBE=;Ve?$_V?t?69NV;a z=bb%;8uYVZEUWG8Ro=@1DYll*VQMz4o8r$WN7Le*Re9DJ__Q_UR0Nc!bCu0|IF+9u zTDLah=*jTZiLBxI3XQ?o7duIm`v06}Y}9|&asR_7{)f50?ti3W0R6`aKzC!fTLEvs z84kj?^-y0>nD^`Qhu51R*(i*Z`t8@#@O2I7YZT`Hx_l~rC`T0dQTZ1k?fX&rGQUAS zk}L2N@~=bMgQN1t^88`B4!6R-j#M(1DM{k-RI(ZDGX@hRf{Za=gwBkNSr>0 zra=Afs4JDt{K+{Ew0dH*?>7qsuBOUnNQx(8ci8xc=(b7^^g-v4Qg8jU^ zIc$QON6lYM7WuAqMA84HP@l$v|BDr4{>1+^?*ACG>jwt%a<`Wn5;$b`l-v!naHKDC zbw~}~8&xObxFC?BK)tANd$&Pqz@a%3s*`91I$B(7r-z(#SR+5(;l8ma>;8lHZ!X~u z-sSQ6Y;_Xn8e6B~a>r-FW>UpTG2fJAY|F z-n2bp=pHH4mG@K*n=(OS!JbxQne<6zyK)u0uZSPmUehM|%+1kdtCVPN%f&k~Z5lI8 z%d@Q*CJj1-J=?+8yk>jc+lx;Y)c;8s)wuruGv*HsNe+nNI&<*@HM*;dROomge0`P> zMO*(prqo}xG17mX^qc#yvcKN{7~Ts2^+8bh`xXBCCwJi^-O>J^+^@^0ngHc-13xOi z7}7o+?f=OCy8Pii3nu@B{MV4SaP<5YeqBD5Ae1Nc6Y`0W_W9`fkI$d~_vX)wr>6(6 zof@Y3Ok*o+LA_XbX=#+@PLf9+8S`eA!q*q$dineGQ>ggMMaWp>TLo^KRwN5+H?kg;o-58^H@t|l#lITvmOi7;QK8*zH)p@AcN%#az4)Y{P{X$70AZ^gL%JnCl^Crjvvhb z^(%(_@sy*t9==NGSj}M_G&+~9aMjS&+xTJrXwDe1f9H(r-%rMG#PgW?Z0BD|Er-V(Yw$=D5igqAK$h&mTKR5W;g88!o+2_GXNm`UtDGE}0cFHdNH zD?M=5SICJJgYVVoNRUX8*G-(k!m-#_y+nJ!#H@m9qlkmB1=M8_)rCfz^N>pbr=ThQJzNEnozoyz3w~ z0Zf7QfElm>Fb6gQ7JwyS1y}Sh;;q0oz#Z@a zJb~?i7vK%}04Oa1Vqbt_e?J@}_V)&idfb2ahxqT5G^bjw*5OiL$ty;9^ZfOUXli`7 zLl=)Ou0OS(c?K3bWIRO2qd~g3!#^0CO2!N`Rn<5N7qp{ed>J#Jia*g^YW604B$r(m zkG_M8z&Sc!kqyCLc2s{w0aEIJ^Z(QOulO7MPoPeQ_v%COS1$7>AJc-~>4xi#!kk~+ zff3ff4e!4Ky`Q!eF zf6xE0D7a#J5R;0Qj#f)R!(tdE`{>wkcf2q@9L8>F^d&1DH3qit%2P>S8e=psj z5e@^l9q~mftpDu$701Om@;jtoF1mf*em|j`i*SPwfoZ9!_LLDa`vsIM*?Y;@5*6+u z9iKE@D=9EEEoTUpKs}-D(#JXO9)N|Ju`O4~7@Sg{~y3N`HVrHHB_|}7Z zmE!#}X7AY>R&R=CjCkB>tHGdEIH`{(za@69 zrKl|JOpyTL2rny*Em5ywLH9LK+-p-qhXioF3>^vHH>9wES@4ADNN}FP$$v!S$m$wh zKNU_-H_xrJ=_bN#oG*Q(YpOxoCqJ;e&mfUG_#J!lBT_v<0$Z-dP;QPMI}ytpnIEN{ zWUf7?sa#H~CFxTwX3BKI;qTxh@P)mJauHAWOvs|iq7Q!@PTDTtq^jOJywZQ|dbg;~ zqD-ZQ&G@F+9d1-Nhc^m%#(zqDu*>OjsFHTy>*`b3<~~xFC#gH239joR!Oqx`GE@XJ z2)Bg^x6M6^35Du|uRCEmZ{)tdC-hMCib$syT7_*<4Qn$-1Q8U3ezi+iML#JB-tJL5qdi?`VsB6pTyn9qp;`?7rZ1pD2aEp?{m z7{9~M3>CIp=ub7NhQvrJs1_t+Ha8u$*S5Le4OwKf(oeXtDMzU)!i$!_fG3HiX+v(y zUeBOv!DNNY``y?lc|7c~CWa=ijDGnLx5uz&ZR$$da@;D9^f1S!#V(2>`_-v!8mz_l z$JSN1*wlrFRBUJ~Ya2@UT{y`(vwcp$Ua^+brAl;dKv%dYLu3IBF8L$Ai||^}Aip zHYdGN^1fpy^}g=a0L*Lg4z8aOJ)v-bI)~%~lUcxw zDC5I*w(<{kNbZgKNCvN&PSK|5tA{mf_nGP+SnR8MY4s^we;LgD#XbJ(kvD8NQeG&} zzpOFhzsF(Y`@jDw{`)ysQqyiEr60GoIBYa^jr&&GFc`|$)4Yx^H#8w*4{5f^t$e}W&>1%F^CunPzP0)gGY9v}z^210C<5DFXs4gz67IB*Dv0MPux zBM=`2jseGk6TnH}6c7nS0nq?T8v}7Ha0ZA2&I0kkIUoTz4_p9H+KUih0xknrfFvLp zxC*2IsX!W#4qOAS12=%1z%Af5kO5=@SwJ>$2gm{L0!T(K#CgDdARl-DJOm1WN5EsC z5O@L<0Vq!i#HGMf;2H27Ctw0;l4s-yW07~BtaSzZ75P?3R9~b}zfgyl|fV7}Gupj>!PV(^YZ<=B& z|5MMeasBnr^_N}@tYxBb?$RZ`XD=Hz2hS(*PEnY&NHVH)c4n#-(|d^TzN(=&?{1|1{@)*PkjY;iJ}Omd@on(xUfVboxt`yx`3 zM!&uBRD2-k;Ts3Gg~m6T7{=`=4tv}Xdi{}gMdgX+ow)90TkI1hPdTRDJm(R-xCD2# z!e);J37^n)kyx@3ljPP?6;{ZaOx3(DILmMKT)Tzxu#~YE-`y@v3M@^D1piB@S5!X{ z_9I+kZ@c2S`;kFpQ;TrS89mE=%+N zH9=aUX?@ciujI~aSzqZX5?pK}PNf@!5AawOYvD?e$mX$JcRF9hr>DDL=Tx9gYq;U9 zPNQYfwcGL$SdsMk(oKvB4R!JZ0gw@lUAKMh+yd zcgP!0+GTINI|ttZBb#RIaHV8rrW;?2Tz+ov=IW_iC%)A$(e|HzaAE=(s}&3(?bw{z z3ge#eqm}!hvyGQG>xFE&A#}NWrV4TB?Xp*r`t+MnqB``#qfT5NfU(hfHUIi+T|72r zdW3J4m1k3?8)fe_IMszv_~<#5PiT)NabC-8YJ3ZYWD<)uTzeCmqqV0MH}IUxrOP^= za7UhhaPTFe8b)gcO0QfA&ZU}c!94Sw;Fq8O=Rp_$8_)lr)&I=@vHr`r{{QFtU#hS5 z%yA>@lbo~m@F||cm>V>hHR7bpj*z@e2{rmrg9dzNTb%ldC*TPn>sXm1sIn_2eE*qG z=L1me*UMw3{*KRI`&0Z+vj@Q1D0H|y$Q(|_f)i3s91|&RNbMBXycKuQJ9n1qG{0A! zWd(Tn+ST>s*k~_|Qh({`$A

                                                          -TRl${TKWXiO~Pxg6oaK zynjLdJ&-RxI{#w+Z;(F`&I7IZhA!0)`F~!5eDu6WLFPBeM{+4)q||S}z6SZZqw>es zfBb9fKl(#8hhkG@i315HCe@~oYA)noN^uaxB`r&PD|<_|*y`k^T)Q(y^;sKt7}O=d z$J;su%`r228)et_u3o?G_NDlEJHzI==>eCVYJ$|VI^|`8lX+jnsk?Txo9SN8sb-7c zo#-|trh-j0S3mMufkwv?QMm>yp*@>j*QS|KXW;D8-O~*tIf^gF-x7J;RvAzoWT>O? znl?BQd#$#J)>`(1M)RZz}?06O3QV6tkz~3!Hs*s9w->f#6xJDKtik#OlHK+^}S; z<}LBK>8H=$v3=cXG9Bpb(DY1AFg)164v6-`0 z-79BY=r~I&F98nnIe!aHJ4^1Gp6#2$*4oJ{xd*$Q@U#qFemzBA$7IQ@$aOhl1vS=q z-D|ux?oXcK?VW_1*YhPkJNz(*pQVmX*{emgLgwV{gZtl1Of%il+w`D7aph5~sr0w2 zwTWzPoy(FVi%aeZ7~Hx6ow~r;f2>v^$Q;z6|u`@Q$$xk@o zB(T6hZ}w!Z$4cHcb93jZh#!}sIZjNtOpMJDW^HqLX)o9A;4VC+q(%B{ajb20gz#!1 zUeja#2mKxjJR%mg@4P3>*1o9cSnd5Tv5;kLoy5TQ?$a~n8K+rxY@G3iXK>%)1->tC ztw|uJXCKFf%Iu6I?p%@nG^JDYVUJhDi<_kl>)uG7B=}~sPfJcpIg(wmqUYIanY8vt zn#81AZPuFf5m zosn3XN0aQqT71R)I;=$I!jaG=H;Wuao^bVDGCy_M#%n0}U9#s*_2Tk|RolIuUM8;D zuAV+%`apW4QO4aIy7+O9`S;cqGSgWwpMzrcZUjQj8YkoiYuBxX<&wdB;d?k#qR?~ysb>`z^MLSAO`6#d3hxHGUU{8+){~d08|Jy%i{+a^m zQ4;vEHSw(#WGsN!tVJAt-zB!O2!7jO7Xf|>A?l{|AcGT0QEdTp)7R`8iv4n9%+z1H zar@=ZuwRB`N-nYT^Is9?)DR6=|L_n4O}mW2N(t?Gy{qwEPc=wOj3t6Zo(OJzcA-TH zMitM*q;xH!Ua35@pg73pSno}V8XL@cfivCLe;XMo>hA?g{f{3b^?%}T-v3DUU+_P5 zf&b|$TyGTQeqH|X{x3h{|009@j8XaWzb^l$=U*{{Y}Zl$qr$JtA3lGy8v(io!x!~C zFB3uj&e8K9_y7HC{=cE6Y3eu9f-SSOI272P(^?1bfGM&fA-MjUsD8#6-}&!k&q-}^ zJneSimdkmrXbTalw=hEf`5u21{gn*&^PkwCRFIDvpaEzBI)ENv02l!#0L>L*ftVFw z1113M00+PcZ~@!^55NoX0sH{UHwj_^KoFP=2m!(X4iEvR0HOd&D+cj2U^*ZUr~oqo z2|yB<1xNw20cl_kFc+8y%m-uuSwIeu2NVEBKnYj?ECdz-$^affG77PXlb_p>(mvtNU0XT!fIL(yM0W5j>TGQR%nkEy?2@1DT?fsu9H z*1Lz-iAzcjsMnLW6Y66^TLeS0my0K7rfkMH#gmj~kczIs zg5@aU>u5H!t4l^#gZmuE^}UMfy`OmbLm_xd2AVZLCKY=+AcG%X(5_K_nz9=G!3S}% zl;iyC==7}p73#LFeQKnCAZx=;qo@jbTxSUx6XLnxC6mY*C6PzF!R>Fq=SOLO?(jVP zC-%et_49*e+<*0_w7-E%!84-Szvh_wP9KKy_2+)_ukE~sc5D+xnMTJD{_bJ_coYGR z6Ic(6K%V)jU&%M}dk2o-E8YekPoh^>_iJbnZ`XMd_LdOeEO*@OMEllV zUO*@)+^NS-U%N}uBIkXzSo?!BEm#mYZQb=V#Pa$Dk5);o&&%uSKYZ1*)=R6ZSa9uK zCAE9GaZZAF+9ympuwb@{Q%&dn%jxP7mb2rLGslzH)LZt9 z*wtk>48k5NzLX4cdpYHW;4GK?`wWpa0`8n0+CdpJyw#s{!LK3boFiV}>Y&*w`;tk= z?nz~4zif!MP%bfRN@p&^!~Nxrm)S#v7p2)`C{NXrQER6a77)-g(l`}n7o>QofPN_Z z1!v(US2M%>7`x*4)#mmC$6lr{j-Qn?L0d?(CbBN{-O2?IJ4o3M4SoKO8O!QD1eaI{ zIb($;%(EHtBKe5T^^z+!YTqAot(&nbBB9xMQMCUf$M>_n--Z~x=!`u$XW9wpgYqIY zjr11==MhiW4GCr^-CyWF>$tjKtzBwJoRS;=mVA80nb3!>Io{E3FDAHz?|ojbb=oe; zWZjGDQTE}LxuSsveoL16Zjd->$!@OY6y1E--<JnA)Jj1eVVufmS;_OPz!FN*ey4$-`_pHISACQT*Y z?!haIq*vSZGs~2$-^LD|vO5vOmfgYMdv^;MQ*2yar55YxKzwdVJfd7p4IkA4y|sp z+)N%W&m_@Gk+szW59Vg~^04+95<*FHO1(|b=HY`J-Rw4REs9%Ni%V8(lDeMK>D}^f zVZq_|3b|P0)mymsopp2>L1*nbJr1rqayGm6oMp+`1HEhow3)HWu@j|YDtSBKKvEO s44n9jdR$IrNh&q|mn^6Ps*lIX&0y96#iIJyp84HR%<=O6D_7uu01#%_tpET3 literal 0 HcmV?d00001 diff --git a/themes/xe_solid_enterprise/modules/message/images/arrowNextA1.gif b/themes/xe_solid_enterprise/modules/message/images/arrowNextA1.gif new file mode 100644 index 0000000000000000000000000000000000000000..15c36291e4cb2bc0eba9723c7e0b4d98b5e33ef7 GIT binary patch literal 46 ycmZ?wbhEHbWM*JxXkcWRIdkU!|Nj+#vM@3*Ff!;c00Bsbfr-_HXgmn~a1W5$fVd-ryBc6N7n&zUo4`t<2bmo9B?Zf2=zrTO+;>C04&i(uM@4tWle*OCO z|NnmmB%t`8JHj_W!6mUI5lGwER}>^BXQ!4ZB&DWj=GiK}-@RW+Av48RDcsc8z_-9T zH6zobswg$M$}c3jDm&RSMakYy!KT8hBDWwnwIorYA~z?m*s8)-DKRBKDb)(d1_|pc zDS(xfWZNn^f+Q3`b~@)5r7D=}8R#Y(m>DXVndljs7+9KE>L?f)7#ips8tEID>lzwZ znVMS}7%D)46417ylr*a#7dNO~K%T8qMoCG5mA-y?dAVM>v0i>ry1t>MrKP@sk-m|U zE>MMTab;dfVufyAu` ztelHd6HD@oLh|!-V4)b0kzbNuoRMFk;2dnKXQ&XKnU|7ZUJO?6>ucqiS6q^qmz?V9 zVygr+K`%2i#md#p)Wyx&!qUaa(7@2p)xgQb$=K4^+{wbs%*?>i(HW-KB|o_|H#M&W zrZ)wl*Ab^)P*TV(0NU)5T9jFqn&MWJpQ`}&vQ;K-x0vHJ52`l>w_7Z5>eUB2MjsTh zND&Pa0;V1i6P|2=9C*S{%>$zB`;K7M%r?(Lh`uU@`* z{_N?K$B!O9xPR~No!hr=-nf44>XplvE?zi)?(CVz2)%Hf~tIZta@Yt5&X9zHI4|#fug$m_KjsoY}Kx&X_)J>XgZoCQj(@>+R|8 z>g;H5Yi((6YHX;ltF5W7s;nq4D=jH5DlEv)%gxEo%FIYlOHD~mN=%54i;annii`*k z3k?Yl3Jmb~^Y!ue^7L?bb9Hfca&)k_v$e6dva~QaGc_>=Mz_A6u8y{rriQwjs*19b zqJq4ftc+3Z`lZUqDcF*qEK!C?6L z`FVPJ5{X1Emz$K76dN0xkdTm;mgep4?d$6s9v&VP6f`0G@6f(4~N5{QmHjH zHA_oN%gf6-IXM&x#mmbpFfed&aWOPB^y<~CbUMAOt7~9jfJ7qk`Fs|O#pCfJA|etK z6XW9I($mu;BO_B%QgU;1*D+=haHUm;X?GmypR2jFH*OClKq zG=#u(U0_CfKqCW)o&gMQ0M`NP!}MTKJ$)$5SXU2*Ff>NM^nl+6NED5XzJfS|wE7lH zv@!!>sZdVkj*G z2}eK^y(nMtc6JCG0)>hqxL|CMW+0IQ1cyT-4jr?wI%HyGjMUc?jbku45^e;yFff86 zP2eW_1_s}`NTSO%JcdC1&PD&lHTfxb(+YT!C^8a5#(84UR%9X`__bsN?&rA}{#5T9 z7ya{GjDE_6ijskDHugUn{e4U1p3UhG+lm%HjE^CR+)ftRT1>dHzP7ruyd>Z+F3iu( z&hVzWQ%arW5g$nel0Yv9Z0Pai+@_x1L??|%2TtFz-M%+FI!)FD)r9DlEv)yO*1jot4SVNKZ>mNxqwum=GTqdnYD3Dl#HG zEHosT5fm8U@8?Uuee0&rjqBbtFVAaK3i&FDNWgozyWy~|S1@Ro%cx6#T)c4pU%#Jo zb~^h{M~5@N*`GdTXM6I5jrDP>V@S)R7Uo9|o0DIqQf0PJ0s{CYjIj|E27jxY)X0tletB4o6^0l4h4lp#U-Wp z%N{%|uc$1~e^m3hwyyq3LrHaGQ}gp?1p{-VEx8H`j-6d^-*vz5>Fw+P@bOdso6oGl zq2ZCyvF-u(#N^b}sb7v9ZGYCX$QLXKR#w-Vm)8LjW52T`E!l)J(O%OWA}s*{ znVvgZk>8bV9jkTWRYk$OJp1euX(uWR-xoQTyM2CDsok@42cjZce1B+cIrd%Qg|cms|83VWtgU;q_H z4ET>Xbv5(s&g_#Jr|KUsPWF|%54@?b74TS1VS9LHfifD}O2+3pp46`jW`^4`PB%PR zUtOA?9O!6h5DEd(U>03+BQHSC7EMZ0RWurB`72w22Lra9#SR9lU&$W~+T}Su$N&a` zhl2Md$PRfQcP6O=bRLZlg~3|D!{G)!*x?A1vHamkQ~vmHl)3c5k!Ylv+&(|?W>S(+ z#ny;35^HaDa5T>GEN(R3`AWfP!g){5XyT=ygJVhP1i1t9nv!KtQMMJFu@q9vL3S#& z2ggpMjTNxdefS)923=ZfoEf0zhGic2Y4nw6>>eD?j<(X`nZ*%gP6+TyYEuL-J zB>ZLRp|=5^aW&fs-l;$%FS(xT%E2Hyjhjjl8iYj zrEDtZC#ec%uFbU@^Va4&k3-iNx}Avi3okTpuk$~7@zw<_Mu$%xe<+c-vCNL8KU3ac z*Jv(vrWq<+Tj(VU*O%D$g&S*vh9hem3QT~Eb))!>8Tz6GP<(r9qcoySd_UcM8yMg# zYd+|w-p-UZZhfkBea0WCm??W)_L=;hnEDpp#Vlopbu(zkY_PR$mWp?N^8v(ch<$k0wmeznfittA&g~#IISY9QNpZlh Fe*)%YwyyvH literal 0 HcmV?d00001 diff --git a/themes/xe_solid_enterprise/modules/message/images/btn_signin.gif b/themes/xe_solid_enterprise/modules/message/images/btn_signin.gif new file mode 100644 index 0000000000000000000000000000000000000000..6caa569588bb3ff766cf310c539eb4a276b8de8a GIT binary patch literal 3161 zcmd5-X;>5I79Jo%z<@v%B5p&h2q?)U5Fk-XfDi%*E^sR@RRW0+FiVpll-Ao2t5T&D zMMc3S5RhFF*9u5jWJeZ7Rwc+5R@r1nZs4l*$9?+y&NI)dBHGFeMY%gD&c)YR1c{QTtPWNmHj?Ck9H^z@4tFBTUU+uPfVi;MgF z`^(GAOG`_iKYw0XS=rs)-PP6A+1dH--Mil2Ub$TU^5x6Ay1MxI_?nuU>gwu>ii)bL zs=~s;va+(0l9HmLqLh@Bfx*GV#Kh#}WQjylP*5;6J)Mw{Ff=?oI5d=$l+@GHQ(s^I z>eZ{6nVAnCJ~TBo&CSg%EG&Hd_)#CZRxB0+|Hqf%;z}>KJs_DTpef!vZ9}*;-#~@{ z^kMih**2*6Ir%7%Nw-1m$GbspTnC0flN!onc!aup`i2Jj66h$~@4%fQ#1Iyj#SqZI z5Y}-vpBQ3;qR}}%45DJZw2VQ4%Md}J4a#n516=ayz~M1KJQ_0dg)Fh4r3D&m0TC<+ z+d&+Jg)mqg2C_24LPWe35yFC>E|kI>kA94}k4*XGOEI%S`3nSGA_fy29E=V&M{{_7 z7%YK6z(6<*4riu7nDKvN3uqx`Z2soY7RU^~FOSI;Fga{+$s)~%6C|)fDI)!^1QvH6 z)6ZYP|6-iYM=y&)`*K*A5E>VQMMD_gGGvk3F7%O6!6Vox%y{EOTbSWh;B4qAVZNw3hg+bvAp5tMkI55gIEl{bzBbVsF zW6%T~o+pQM{Btqv@#hFQe18rXbnvhMjj@V@4Z%T>6&9;V{GrbyGz*O-K#JmktT0$C z2Eq~{91(&PH|QHA;2b-)17v|dJVjLgKbU~vekPmF3Fa@QTOn>qE`!HB!Jt!k92U5I z@}iAewIa z7klk$%$3WRqAy;E`ZMy6i1X)u4?lb6^lzs`VZvYkee#!|Lw^bhJ`p6~^M2%V*sSA$ z0Zf0tV+^{l56%1Nksl5pI(Wcq|M&m$^w_s|&u(|OU9K+9R40lf*}>k9Wc!`X&K*R8 zwUs5_!W^e)aJ1R>ZKfv1TaC7SyBTE&ZrZqE{W^oSNPWFEtH06J(O#vciCC$j4p&oM z0aH;{0szAq*z$LD`_gmi?*XVS3U!Te)~;vHhW~!5-OL%@BX@2nd6k8akye7?gvwe1Ad9<-d+TrrCF4bTqTU`>E zom3rXedyVsSG;uBg>@p04K5E->Lk=?y@x;+O$ny#|ERV$Gp!-r>wdtS3jBb*x{4_X ziiIRR3R$1_L*=8)*2mn%&PPMW9spd)@4Wm?<>R~U`9hVIlda--FC`6>jAcj9>MV^? z)3@YWkG|8?#09>s`s;pgjo2YrwKaNsI9wy`K$P_9!-2*u-^!bA>mHRRpV*uN(8@&8 zcIl~=o7{7sjCNcqHHwT9P3a=EB(AsI^PYYfXiATHly2`B1wR9MB6mN_of((EOh5YT z#$cZ{CN9FG`x1on*oHpL2O^yORncbIN=&4DU4;<<1j`8NDlCK^~@DiQV4uQIL zRmrlRILVNNz8@bWf3Ddgd9j^3dO@RNEv!-<$63z#dr${0UTKpxE zE)|{XdqYQrVpq?o!ep^1mXQ)487oRX`0v>MRF|lsjepO&eRcXBY8WS=lmNW#;|2_S-U5 zULDMV-Oalq8_pSd8kdyoQad-CyG0hq$r~LGe4jr&3Ac+~1(Cv@!gB))3lV>l-&Szi2l^*6-Zfl*# zRhc;rgxyx#;|+rurAHLjQ6)gCF4eEuBGGBb2K-Cs-K-A{PPfi)TcPwVX+l>Sv>9ol z$FNQ`AGn!0+2XfbZ1PYEc~1&E1BWJIA-$PXZ-4f?_PG5QHT1M>qbwjxM;#zd>1xOq z#yg{&(1gT```I(ywvuhU#+869%n&3EOXZ0%?AgAQ=t^?rW5)(Mk0W>=aAjN0$?royT=$rh$$XE7fa zr@LY}&!!G<){<)2XGx`#G7oTZexi}HxG>#&H-G-et=yAyYeU*~JxTchazqHC*9lo{vh9WxD z+^k`%)1pqB$i0A}%+ zUcdPaHYM9@6@!4=B@|FXEy2Z(M)>cN7&KZ_1`S77U_d2g%pQ@sR!3w=m1N^oS?PDP zqkj%cK(!;{spRbK8MI<^=sMr<)Y zAS7ch0;+~op`p9bd6IciWD=3I-Osu5V9VH*#}Rad`&!Z3aMER0?=4$Bkj`4j@vCLK zZsTIgtB#?gqjD#xS4UkGUHHvN{ZV-}J9IowhDf$9P*?GEiB{bVknr35tE>}n zu#t%5oxRRAp)KP#ColEDCuhP|A>w13+qUdHX(AFCOo-ubDfapmwWkyKu!Rge&5zek zsnf+#BdZG>rpoIgLnkDlW-8UTr6&9}N!55mfi_QDnea>;gA)2X`?(H8Q8RUupzohF%%7os}t`^Nz)I&DI= IFaX%`A76}BL;wH) literal 0 HcmV?d00001 diff --git a/themes/xe_solid_enterprise/modules/message/images/btn_white_left.gif b/themes/xe_solid_enterprise/modules/message/images/btn_white_left.gif new file mode 100644 index 0000000000000000000000000000000000000000..356071c773a0a5970db5e32ea461e00e7f2eae27 GIT binary patch literal 1366 zcmZ?wbhEHbWMPnHxXQrr?c29EZ{Dn3yY}VFmlrNv`26|vyLa!dT)A@l_U*TC-yS(~ z(?JYe*FFW_m3Yx{`~p#>({UE-@pI+_wUoEPd|VD{QLLs*RNlfE?xTn|9=K* z0LA~@5xxNmE{P?HK-$K>q98FjJGDe1DK$Ma&sORE?)^#%nJKnP;ikR@z6H*y8JQkc zMXAA6ej&+K*~ykEO7?aNHWgMCxdpkYC5Z|ZxjA{oRu#5Ni7EL>sa8NXNLXJ<0j#7X z+g8aDB%uJZ(>cE=Rl!uxKsVXI%uvD1M9IxIyg#@@$ndN=gc>^!3Zj%k|2Q_413-^$jg8E%gnI^o@*kfhu&1 zEAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5FD$Tv3bRMVDIQ9=jZBI zBo^o!>KTB%1XJkii(hGOE?jkSNl+@ny;uz{4yi0i)elN7&Mz%WP6aAg23b{LN295^CCXS}27G`En78a%^jxfD0`N^fZsd*(Zy(w_L z#s)a`f|5dR0nlcb)S}F?)D*X({9FaFm#s2!yTt{kc~HG6INf68ic_yX&@uX;h((HM zm=G}afSB-P3*^8Perg^twHE=CHRJz(fB*dc_4CK~Z(qNB{`B#~`*&~Oyngla#q(!R zpFDo_@WK6ickkT3b@RscYgeyazI5@z`EzH_oIZ8(#PMTCj~qU9@WB3kd-v?#wR6Yz zZCkf&-n4PU`gLp9tX{Qp#qwoKmn>eiaKZd}bLY&SHFL)FX;Y_6o-}bne_wA;cUNae zds}Nub5mnOeO+x$bya0Wd0A;maZzDGeqL@)c2;IadRl5qa#CVKd|YfybW~(Scvxsi za8O`?zn`ylT#wKO%<)l^lKl@t}^ z9^;o=ZcqP2*SyoAl9Qh~%2kYEO>(pIf8d6)pnOOptZai$>d zh%j{*tVjUE4no-iBDE+G_JFdRg^+}Ok+MS*M(q4i=Kk^Cz4x7SzVCbA`Q7`KCutXs zszGcHzP_cUMX6L~XJ^ah@_~VY>FH^WMl(7(IyW~rGc)u0_3QER@u8ui zv9Ym*g@wh%#mULZ054#1SP-8I2w1^v9$w&rq|)Kz z5MDReZ=;dGGK3%Gf^^e=0Q4~lFc$(GQJ@_Sbix2m4k(NRh;zW%0$30OqA^%B=xm1p z@s7@T5Cgm!NL@58Jpk`ZB)y5HTe%<^d_D({Mu&!mqC)LaF!ux+gTvv_AQp|q+UXE> zyi;sGRba>FZCz0yLOdFm$>B3$HlSCe9*0lzU68s=|62l!^H!G4LoJtsqQNY*fXYE* zP@uk~6(E`X|Di0_TQraF3;mhzUkda5PH`Z#FT{gSa%qqbzEvNJgC}qyDj(+h!Eo@( zU!*W#KFnjl9Ds1Z5rqK`G1+uDl(&p0lkuKx9-qplL7qexq)q|FWYX~jM=S}8+3QZk zVn7ULFX-lswRb0h7%b@IP6V-}6)q8`on%35{tB1=Czr4)S8oLtM;Dn0ahV|yoy3J% zz;elW=IXiNR@HmMrLUfg+p1i&E*Z4GvH#QPl`Wln^wYPt)h*r{A7bm=&ehr4U}Iy>6iUcP8;kv2CqHq_VEN@}XB zoiwX;V$q4{l@>$!LR)e`2K^k--qnI&&$)}E7D#f!QIVu&zCN{zrf>mIXgKz z*z4MjM%mf!wAo?(`S#DYZADrEpKjS~`N^igTYS86!{63_^x?V>-ZwWhUHhKN8sm43 z4Bs(8AgpGLmX8cu{ZoJ5A&i$?<2fF-n_{YxxYfb<`;8*LSEhp9mJuQu3M-f82)t2o z4VwH-(a83U(W28n*_|pU>9d0ab4%e7XClv@JAdKgrOQ!QqOZopthJ22e&gn?+js89 z{fII#b$E~{OiE69C`wIB&&bTm&dGh0my2>*=bT?6E-iap{-h!ijWKgJsH(1!)YjEE zG&VI$TUuYdY-{gmL)#lWqvQ%@uc}Y2(e@7v4h@ftj*U-@?X+LxY&bhNzp%K3FkEZt zk&{pnX|mqta23TWeB<;{k9d#V#L6fO`@pWMT;cN=fNKZ7$d;YqU;QXqatox@ z#CztY)Wz-M^>8)_p&F7mw57&)L7V)fVTe8xjanTgWB(TB+zj`q8?Q$v~4ezFoK7#05j0MZAHY zI&tC1t0$4BpZb&*{h+Xh3jOO#izn2L!hQFB%1R~&+VX;4)tAkMWWLX?ve^H)bY?;$ zP5-{(aoOC|s8Vu&fBE8RLvvIYrJ}rCcRLtc%fgK|GGq}Z+eNZ7W=GelSp*d^;dbn-U-5MO=sY;tyTkgdzX{ literal 0 HcmV?d00001 diff --git a/themes/xe_solid_enterprise/modules/message/images/bullet_input_id.gif b/themes/xe_solid_enterprise/modules/message/images/bullet_input_id.gif new file mode 100644 index 0000000000000000000000000000000000000000..6963cf9e7e1f5ec3028d273b69fbeb266ea11bd1 GIT binary patch literal 1402 zcmaJ>d0g9M7%mf>Zp>>=r=o^1=ccsz(k7Gy3bskRRqbSj4U|n6+CVc%Qj?SxywJ^K z8=L3mea-s>Jcm=~vFW^T=P`ANjzeJF_u-dH8GraAzxX}V1dKkAh9hZ&2`2zWP^pL+ z-~hwT7_b^~K$BJ);K<~ILT`${nD(-+NndbgLj#%?q%kZU4x7RjldP0rI7LwyFk@!3 z5h9Fgg`{y2qok(9EU>)lQ-q)<$P%Jk_g0YiU z(h=jjB~{}jA0OiiN4b_6xiq8joF*%IvRoD`hMa(`$!b6jB1|rUEWzQyM$75{8E|*t? za^CM!WD$v;JS|KU5eh*CEaN1cR?6jaFsu{cIAtdRlkOrdPC!^mU_mE|{%I!{C7LM< z$+BrqiQ~wpco7T)5~mH*~OM%E$hRnCW4cxHsmFkH3c?V+{F0U z=*aNU;6Q(0Z%=nu=aG)~wtre%nwt*){a53k4Tt{t{kMa^{_^ur2Y&qF`|rN}=IgJ% z{NnS^KK*3>#~YU72&)3eTmNTBJM}CC;65{Bg67O^82cR-D0*JQN?jw^H@5emfcxJckkr4)ms8T(k!ZdwIOi}xug4VwN$mCe)eK@ NS6;`01WUXj<6kw;5E1|Y literal 0 HcmV?d00001 diff --git a/themes/xe_solid_enterprise/modules/message/images/bullet_input_pw.gif b/themes/xe_solid_enterprise/modules/message/images/bullet_input_pw.gif new file mode 100644 index 0000000000000000000000000000000000000000..8058f42ae9b51398b55c333ed2d789b2f0adc87c GIT binary patch literal 1398 zcmaJ>cYM@j7(S$^3`bp5t(vB&V0)J@xz(gS>NUB8Du*4XMG-W2$@OBJVF6=HcPtk&%(^?(U(Xq1M*c z&d$#9@$uf?-uCwPo}Qlm{{DuBhK`Pos;a84uCBJWwwjun>gsAkyrmqSyTX%)Fs#PH zJ}WyKV*Mq&hWPkmL2{to`wpOpz&X$&s|R>OG#?a}mMMH;*>bPHti(@pX!c?xD@sMh zkjQH+5*14&m5Mr0mXm!v1;_d_h9WVDR^mXN`Uax=q-BLitR`Ue0~?OmEGFCnNDG;c z5C8`lPGG=p!~tcsQvgRM8VbEBT!1QI+!Maw%z*|qEkt2hBoZ-2%qCeW#&D7(F+gAh zVT1^yx=zyAs8Lc=;}#fR^(#V16J!a|EwVm2tT|8^>Aw=hP=Qb!)YM7il4^>HGWlf@ zi?SgMHvvqEVRU_Qmd7(aLlh^`s#d`N7ySR)SH0^(JXXM~a#->65S}{4)%1>Z;DiRs z!zv{_%%YnuRr%P4$3ro)KP>W+mdiL$2sLp6M>)*|PTMSiA!rMZyI?+?R+@I%+$3YQ z+w5eVn=7drEBX02SD56Q-P3X@TH#quR=l!Y8ZU;tpsdMiP!1tB-8nSl0ys`Ot$@yOTg@(Dv0H%|ogi{kPA*0y zNVAn;Y%ViFJ7dHgH|}I`NVhV;Wiz7~3?SHnlwlx3I)YwpexbFAge*NX=LqGla!}s5P`_0#1 zefh=bpMCnt#~*$8!TSem-+T9+18?ttYu}rD-+2ACS6|t)yQaEo*UK-x_(J9L&prFh z(>tGf@`=YEd-RcqD|T#u=)nidw{5-uzI(UabNA-E?%Z_8?Hf1Tw*J;zZocWp8?G-~ z7mch9YpSv)Buipx$#p`oIKXp$AA9XJt5;pU@~SIW6kTz-x3C~T@3Q5dWtU!(yL5@$ z#n3sGzq#1rPtoiqFR*Z=zKXqc6YY_wD$L2tfy>-zmkdB)le zi4}o0hw>AXYdPQH1xfR_D3#?|+m~$$2sNdp1m KptG4AL*_pPED{6& literal 0 HcmV?d00001 diff --git a/themes/xe_solid_enterprise/modules/message/images/buttonAction.gif b/themes/xe_solid_enterprise/modules/message/images/buttonAction.gif new file mode 100644 index 0000000000000000000000000000000000000000..d10473101f5b6eca5da60348767e8ebde188e0af GIT binary patch literal 1677 zcmd6li&qkc0*3)fypA@e%eo#{q#kw3&{j8DdL60p5KQPLJ9aERJ>BhglSrhvxVWUGq~zq}{rmS52!xcB6f&8-Z{NOx zf`a(?cr+S4H8o{48ZTV9fXCza?%k_UC{QSrNF?HLIA_kBvD@ufEY|6CR##UiBqY#i zGzJU zJb3ct$s&2E9>y#!zWIhIB?*=Cp*CZ4ci@HAOJuHApTnP*Czmon?c?b z5R_C_&b-X3U{_wb%DGl`{ny{Bxi$Z-y-|1bRy~j3AZYwu5EQV9{6jK01>b(}zPRIo zMB4eVtNYR8Cq2D={R4wfhlXX(Qy5?GU13bI~aP7RlQZL`|^iK6nU3n596bkpBgUK&CXpZ*|!&^jTa4zRu^NZQ_tX)jtb6p}mdrF6GSev=@*`=R^1 zI1bH`il%!Q9-nO`cDBz9Fn#OyF#rtJFeiv`B`d=jm z542{Ec0Djmv}Y@BC3j1V?>h?(Q={F|g%4N1M8VLHIxQ+$r4&U6U>7yx0z&=%$6Z## z8*%RRACJ4w8F~gPwxv9ITsCHqRxGXsuy-tf%KwKAvGp2H20L zEb$82!YhLA)+$S37%jXQiio26EIP(L3b)7dl;!ZUu#e2(YFc24PgC z?q%MKRfU+dIxf}GMZ!~phU!T(4JU@3^bE|komviH&XSkMk ziDmoI!yCreHn4Zg`~Qumz`%uH?INKCH9xiJn(BVm>x8_raD8)Q^=bX><|fuDew#$E zZzUsIdN=UHsX#B=4&lI;9?g1#sMj-MzJ1W|U*T=Ckk&j_MJ6>KIF5-hc5FZ>FG6e^ z$rpWJ{%kNxm1Pm8PIYyz>7ll%)zmdFi80+b4@HR1Kd&|S0qk?F3s3BU<3I`IB?Hg{ z-kfLd^9pS<_d}!S%>ytj!ZP?(WbA_b>6V;;v?tp*^ub|xIpRARG!f8W8zgL7lq00` zi;AdW#L~#FiM*vzlqNtt6l*KqAqz&6c6xk|;x9eNh2B~IlNfDWejbPY_8)EV1bRGx zl5@xUIxUg`o}iY0yYl8F_sq&$n()rbyF96Ju^{=V^RT(D-5g^Jb|N1_+jmd3G>uH~1h1upBG z9Fc2f^4x;UrYw&v)`KFL1?vv2P_*uxmoBWYnujBQSdO3p{&d+jBKP{5ZQ)abP#yq+ z>jn9n8D2ylXtS)>bC0{4R6SAS*U6x8ZTM(eZ4exnpxpIC) ku+=6Tj&oYBGN6rc2woQNzsO+{)!Rd1K<~uuFhI=z04((_L;wH) literal 0 HcmV?d00001 diff --git a/themes/xe_solid_enterprise/modules/message/images/coltable_head_bg.gif b/themes/xe_solid_enterprise/modules/message/images/coltable_head_bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..8fb567f73912707e12574b9c2e03b6794eee0e56 GIT binary patch literal 1240 zcmaJ>cYNDK6jn-0filXb%!|TkA(rlB$+ncZ!PaO4xCAGVLMb3imsmI&NOJ9@jIwvx zdvD6#t3X*Td+!Zl&qA1GwI?@D^9R4&Pe19#_r3SNd+%vRyOt9525JhmfT9Km2Zx4+ z8dpx5o$COK9_r-V+E(>+ql80Hz`d4}rk5{XLIcZ8)7?T2<~$h}t(gNp?i`raWek)I z(WKj^gVw54wLKe$I;h%xP9Rm&v~IcuERlJ%&C;L-2}@}@6CHrar|kL|2n>uFFo8gV zXAloXUTg*&M36-s3zIPfB_Sz61cnDqy!mF2lvlK2Uu2c0i(%+VEL*8mm`a>+{azM{ zqR2vy<+vC@#Dab&)T=QkXsTOKaA5eB7h0|ZB8z&#Er)5EM7mmn?d7fBVi=4VcLJs+ ziZNW9t?C|&7|8lHOr)>Q%H_sp*!BoI2=jPN@c(N+=<4?{o5z7$_6*MDauS5(0Y*7=dwN=c4GKPqsyKHV0Ns{jx|JYGHxU=f#lAHU zo0{+1pmy_;HA+OeOcaP}idSSIu4QCJg$Rim0m>;&h^vrK3NTI&6U|XKS0id1r=o09 z<<-^1Y+U0BS&57Bgq#pEG)ux@qcR&+cJ(b%%h7bCiO6E44Y5PA=94CCSoz<-|NQ;e zia-DO{kLC#8T$FBe)0KdgP(r#@kbwi@cw)6zVr55Z@%&RYp=fY z@=Gti@ceVnKJ)alrB6Ni#N&@GdGwKo7eDmi1NYx|?>%?lb>|(o-*)RQH{Z1A#v87` z?%HdvzUs;=F2C&3OD?|X!VAtn@7#0FKI_ag7M_0Esi&NL(upS=f84Rh9KGPEBab+I z{y=}VGOrv4{$ZZ$*nOo#tzvHvHjRRQ$iWBAJ#fwe`_Jy)Z{M!Y{5~Cf&&ut!=N|1d zXK1P-XEVFEO;5MBNMb6P5coJp8k~tW@3!l-sk`jF(~eDaBiLd4?Y7-!>nU4pxy9z2 yZMwRwL~E)H9a%WR_Xoj{Yna%DYi=CroINg16w1-Ypui3%0DIeEoa6}C!=DfvmMRzNmLSYJs2tfVB{ zR>=`0p#ZYeIlm}X!Bo#cH`&0^~=l4^~#O)@{7{-4J|D#^$m>ljf`}GDs+o0 z^GXscbn}XpVJ5hw7AF^F7L;V>=P7_pOiaozEwNPsx)kDt+yc0G8yuzFu#E6=>*lEl2^R8JRMC7=m< znVBh81{TKVre(LT&-jW|!2W%(B!Jx1#)91+bT`GI6`b9H)6uy(zfeVu4eyKF~4xpom3^XqXT% z^?;c0WDDfL6MkwQFtrx}lQrZ2e}Dh{{`K?6_itaneE#(D!~1t{-@JbH^2PIKPoF$~ z^zgy`dw1{LzIF4)^=ntJT)uSi!ufM&&zwGW^2G6DM~@snbnw9beS7!p-nDbb_HA3Y zY~HkS!}@h=*Q{Q(a>epxOP4HOv~a=vd2{E?o;7pE^l4M4OrA7xLVsUxPj^>mM|)dq zOLJ3WLw#LsO?6deMR{3iNpVqOL4ICtPIgviMtWLmN^(+SLVR3oOmtLaM0i+eNN`YK zfWM!wkGGenhr64ri?frXgT0-tjkT4fg}IrjiLntdOX=zAXlrR|sH>@}C@U!{$jiyf zNJ~jdh>MAe2nz`c@bmHVaC32Tu(PqUFf%bSFev_H0hbp#AQDu*FtFrYXlPos*W&fr z-TxP`$}moxld)=D&g*>zI`f?k?pLh4f8yQ$1Cjb3I&AI7mISrMSj}IdRx)c!(0T{$ zve}o5_8aO~oDrIQUfp=snz-iMd3rW|b1$#_W^J;*{L^o*`UbbAW|!7B2PVay-oE}` HK?Z98!3oU5 literal 0 HcmV?d00001 diff --git a/themes/xe_solid_enterprise/modules/message/images/coltable_head_right.gif b/themes/xe_solid_enterprise/modules/message/images/coltable_head_right.gif new file mode 100644 index 0000000000000000000000000000000000000000..92ce652482c105c0aa5ab8eaadbcfdc3b7429395 GIT binary patch literal 1451 zcmaJ>3se+k6kd$VvWNE6vK)pUSg`ZY>~jWITK0jPtr1X=W;yH*>;$v3&CJ4rmWi5* ziUgWUJXFX>Afljw$V1H%6`>bdRy-=8s1_(ov%uMvMb4?ioH;Z9+A&NVecsID8Hi<|15- zgP{Zxaxp1(o^WYk(#j@KggEvrBQWHJ2+0~)>)C)jK6NZdK?*4du>d6sDdkdB4sbah z3}FBT2#O&<6@mgnp&|eZjXtpGjk6{a(R$;kFL9=UZGzw+5F{-vO`0Z?vRo2^;y8`~ z48gDv5fQ?t+Xd1UV&?;W7W5Qv;b@0Ivv$a1kxXEnf(8~Ny(WQiMAJz&fgdw&=cQgz zQVYuGV5L8y4J zE(`z_ii(L}=o?8HDT)KJIDiU4Q3Rj_zz6`u7qU17HZd_2VxR<0jLNoXHU!1db}O64 zd(th6^T?$*I+d~-IhKLECr{AhL^z$I0^FdM>vam5QLED%0E*&T1<P0k87@=mlnO13h+!a}G8mzxe#KPd{mEJ=b#f%<1M+AAfZ6!xP7kH8nQWAFVr5Tl2x;L)BFW4^-~2*jHZm z{@y*icfD6yvUA7w;-bQWck{Px-SW=nO?kO*=WNX0uzp?E+BK`+TD5XT=JGd}z47|e zB^l|iv{a|SbFVpAJCl<9Ds4+jq^y<%a`7uKFM4U=f*0fCUU)t>Ci=OkXXl%rnfJ75 zZluwm*F|Wb3ZJ713ng&1N~w^`FtNdyz zz31+`rcJ%`j@xgWa_cRVZ@%e9{~IRxNhAT6{k^wWu;=T!?IivcQ=3g?_3HkXx{<{} z*;cxU@|$kzZ*T;+3QUKq!oAcz(zJaba`H^ciBhgPg(z+dl7gHC`_GrB))^d)ot3VF zi@B|R)ft7Ls$-xgtgq;T`%=25)qSOQ$+FB9D|O3Pty!CetzMVCF>^ys-X<=0^VV(F zE%}8-@dd>@OXlq;-MuGl*WU7d>nkb`D9a8WDycqPn_qLJKJRG5v8<-!CszcWYCe7D PY|FXUwpo*=NkXpzIB6!7 literal 0 HcmV?d00001 diff --git a/themes/xe_solid_enterprise/modules/message/images/findTable_9slice_bl.gif b/themes/xe_solid_enterprise/modules/message/images/findTable_9slice_bl.gif new file mode 100644 index 0000000000000000000000000000000000000000..07a5dbe1c71805f2bf544195d18d40008d168b09 GIT binary patch literal 1385 zcmaJ>30NCN6i$_TVZF8WUY4pEbfRaFGBcXg>{g`jRoi{V@fA9VC-kUjvE<44g z>!#^ib-LK#P$UvbBt{~AvHt%4cs#y)e{Uj@=<4bk7(CG4(GiQq_V)C3ckk>U7;10t z7#tez+P-6CWF($QL}P=y_Vu>4wGGD;qobqIXjFID$QVs8cNbwSr*de{%?k%Oj~}X7 z6|CV!2i~)OBaZQ22VQ1z19yOdK7MY!3`^?gm3r#^9?Fa7&Bk)WbXW)oQ01_&P%A2Q z*nx9isS46a*0u>8ORA`T2kz7kFwG|;$q=&`fZhYFBxW@mNHd_!R5oS=Bp^s50c?5_ z&=wmFNNjB2$eZk~ri)qEm@l+);67Ci&;$_*g$yB+L6U0-lAJw{|0oE7V!p> z(fFlMZujH}K^WIo)M9uj`2V%9l-30xQ4AF+D0?7M&z#_Daz~ot7zf(T$$p5k=;CS> zm^^U1X;$(C1t_Y8tOG}?1~2cW8HQ!dB+IZyr;{WLfSt7F=bM~lzSU-P0YIj(g`%Qz zq6en1{2^@qq*$7fA*V`msU+2=ilN9SsgmN80vJ#x52 z;`7g1KW+JB)5ecCe6;?<=5-&u|K7Xry#3ajZ@j+twO3zxx#^`BUs&_}bI-1R=IN)N zeB$xP8XsNt$iojkxblJfSKN2+J$E-Ozw6FBmfe2a(j~Xva`R0$*4KqYi-W2nFA7Ma zQ0u>e_tjKGucwNuy#Bh1YZoq!i7iKeaF qyk@CxYg)tdmX_KDGpBD_!ZnqzospH+xjMWdtD(}^+_)t}mva#1h7C3V literal 0 HcmV?d00001 diff --git a/themes/xe_solid_enterprise/modules/message/images/findTable_9slice_br.gif b/themes/xe_solid_enterprise/modules/message/images/findTable_9slice_br.gif new file mode 100644 index 0000000000000000000000000000000000000000..f05b10cd2644af77c5ca1671c9ed25b4ac8c4aea GIT binary patch literal 5244 zcmaJ?d03KZ*Jl?H6iRbR3(;~Z70eCNL`BO=!*a@MDp7HnRB)-(vBJb9wZdv9+tC)= z-qQA(np{iF5*HL)5D*o2a7#<`!}+H9=8x}s@9Vjq=iK*we&?LuS*~ZJpRX&4?hn`p z_yPdT%zmq@`}qF-hwAE@QPo6!{U_D(@D%yhqR|EHAHU zXb{MI2R?spXcLJ$JEhIdts`UOJqksesJ*>i(j}3~6iRV>XP2bAx36z_RNbI~wYD|4 z2pgN4|NQga(5U*;=g%KLd{7RnCEaqBdXiuFQ79BnPS1>wj}MHDtJUh!(J_@uH8wUj zJv}`-Iyy2k(%2*%85wPBYg4PodwcuF$0r1W=B8$$LZNZe-`vtRJUlFw%Erc2LZL|5 zDwfN8xy}MhgR1ORek4#NXi9{WPgF`BnS|*dv%*=Fk zNrr}oCMG5&5@~B|t3=Y>-rg}YGpk|J)1&C@lne|Ew6}MPMD5?dfA3c+TQt_i?G1uv zwR%D!s>$5P zkM+V{c=4v&qg2Zx3vi{T9_7aesqHa5w76hdKZZ*Q+cp-_*H&&|z=MB=%* z`LAEUPEJnE&VFrfZt3su|Mcmzyr)O0RCY^cJv}``i>Z(*dVAFq(=Ec*#>U3U$?1{N z(XU^>&Ch>tX=xD%8f)IapPv5mxuHoemp3)H@cI1KHc?xfXliP@wzgIxk#%-F*zyemUVP=DS8y+6VvS- zl8TB7O+9;i`vr|HgQMdgYHLTw#)Lxgnr{SpdB)aD7=8?>zhaF@j;X)aa(Q)qhu|MA7ana%K_+3u^1b>z{ zBPx1RY64?NYCup}>cKElINoCe&Mldo9LtJjB++rnu`zLpj7Dk+IYwzofW3xLzyE(n#K!)kotU(p@qfYpzxES@QdkW8?Tkd`p@cAo zM&0~huKv5DMa924kp1Zi2N{|w`qE<(8Gl{)`;)26utTwoxFkQSJ6@w|7ako>_I0Kb z3F|zasSci=M4}IY`)RjB4Rx*78jbJi7INJH4e8cIxd`fByq9a8gh$t841yc8R5PO%vjuC znI}j8i^QQr8V0TeXKxorS6^R}H`RwgB$7Ox2;Q!~PV0OKjxJ7wb@;!5;s46qUqDTU zs8m-+Z<4pS_ae}h;OXk=y3WbPK_jix0PQtl*e|x(zuNA{k*1dy#earKv-xKX8F8Ab zC1{2WxbS^`?%UVdnJ?2*lM~}=)!69B@X+9ZvcIoa(Ib~hyCq$n9qnRKTdT08xv5dm z@cC2y$2xxPhxawrRh1Rx@BV!I=8xB}UcPw#?CF!oWu=cE{^!B{dw1`Y+`e`5MsX4E z`n9W9E?>G>c;WZo&YwG5z&&&NRDNFW$(-!0Oisp$boTLMN7H^yO-Vj-_)t<}LOhEZ z7aMc%m*}X-2u65VC_UuB{(V31-LpG**Uq1Uc5Dx%Z42<OLxW}ddP|pJF}gZvlr|Cp z*MdPIU=R=hFq?${7T4Ov*W%wB0AB#iBTP1x@+vamOKpPSCEf3`F}vSHRWOTc@(hWU zujClH_es5VxhB@**Yi%V@Z4#^f6S;LIp-ARyT;%8c-j2ZZmce0%QR z;Q_ph*V9T@@grvU(?c1^ilsGK`MzoMWQd9AmY&<@h~beA;Tqw4+h{_a`NagrM`z-h z{OVd-e}kia-sj|A1jficuteu=s@dJ+2JJ05w!hkpw8Q*JXP}5*edDfRF4f_KML{jLZvB%Wo($cYuktfqp#Wym-4rDU zeu|);sLMT(kbba2GRq3vGW9-k+xp$k!Iq-8)p8+=@0czt`EvQ~X0jNLdZbUWKtcW>Zk+sxQ zD)L@Zo^*B-o^oE_p!hfRf;HF3*Q>7FBrzX<*J55tp)Q@IHgcA1Apog{-Z8{2CQKF~ z6RU4g;cufKQo0SlbFLhs?`%R|9R;okROl=0_*e55Ce5o*!=G`RP_B+oOApak{$yag|Yqhyp>mmFF&_u>`nGjmtG!pgk&H{A)t_b2}`x{5};& zi%I2}?qd@_nx(l`L}HGIvNqwj1!G~Dtni{;p|f|xvn&p{;;qrTW~$s}WEIcH!}P^o zZxpSE;$wDv7?7jCEyT>%WNtjgTes7qq5{f6#ZxWg))pnA9F*L`Dx0I8WhT37J*&Dl zZ^8S$CqGyiQln_Pd&hV?E!Oxx`RRK{hOyt)#`2|{;P`Z{$hAeBou#h?r3W70RouCG zc#E25RkSGqrF&2*m_#|j)4@8MY3hxp^rY9&WkB-pPfbk5|o~hAsXA2r1Z3jsf1NNy%G8Qlg86Xs*ch9Nc}YE zGj7Gh;GIvrw&-5SLg-b%eN;<%avX}92D(zY1=8Lb+UOsebccEh;0ATb&A;^!$r6T2 zl}_Fr=`wWKAvvNf{lppvI?SZx-Hox9^yj-^O;L8%6qOO5L`EAEV z7EWg`7P2D29B!lpK;G1yP8`;YMLf>5YC>c@DSqa%JobSHO}#U1p%Sxyi`8z^2l0<> zJ4;dFbCB$pf$7%uAS^BzYAYzqwnLd=&p$Dt4Q#5+uXF~%O8FM}^}FltZC|;*{P&XT z@^ps>H}a3Y_Qd4lU=hI}Y?J`JJbCtg4}yL&skSq;`BE3l>_2SP=2d(*7Lb7{20wCC z>ijCmn4+7bkFv|%^@u=wYDU~}UuFTz zwc+el6bfS2ju+uUkdVT70Y%4#%*xQ8^fw`^=)KQ%PFg8ItQ=red`^5CAj1ytb|Sen z<5bnU;@%S}jq`n$wUBtu5$ueXBw*@=*1U22Rf0C0Qndhi8=Sd9PzFe7X)AHg0b*Un zZ&qd$I@_^#p>kGP>gmcJ_L`f2UAC*!HAf188rmA$!cSgX5R`uNzlIr?yuFOr?# z%zJn{-8H{a_xh$vbc-MZUtNR(1y|%-%LMC_(o3ehEKT>U3Ccd&*8si9xrGdbuNDZ9 z;9C@v5b~J~PA}mmITv2sqLm#;V-Db~ckTGEnkLGvkaM`H#LQmM1J9`X~FEZDcKG>WlhqYuAUdZdZUD^X{8V-P028 zPD*fz!5l+Tm*RolC~OA+_CN&yvp|1hqVJbOH@F1k(GX2ggDX!-&8n1)lA|yp(t`ps z;ktTqX+!$jS^}L49N+=_5Ko0@DAoQL0&UiU7KR_ydubwmadf>3PUv-V$_74`B1c%q z4(|duI-~ly+E;jp(d_7NK^xNok6$Nd!051ap3X4>bYRC8UpBgui|)4syu(CmVL)#L zsAoK69*erUJSEH^<1LZ3Ott(w1(GY(B2_e80 zX$Z-1tC|CukU?J12Ryw_hU8+5aJ0JN+UzkwD z$yH`KvSD{=kR3Sfqqq~$WHv^XNuPm)C&S`ou@@7Mjw$oh$(TnxxbQ6KKJSbr?S%0M z(1jPM6G~6}nb~+S)BfM!PSP@t5TzD@<%ByUAwRS zY60!X>E0f|&f|;%CaaxDOy4<(%VzCEVan+QjziIqW|!K_EH3Zg0v?TTkI)bomy;lso3Uq z@!DUCyF!51xTv`hm@VywbLtJ(OE<``Z@9JJ*pPdpk&6NlZhSA-^-aCG>C(;3uWxQ` WzZvlLreCi1OA0aqhXDcs>;DHYF`=IT literal 0 HcmV?d00001 diff --git a/themes/xe_solid_enterprise/modules/message/images/findTable_9slice_tl.gif b/themes/xe_solid_enterprise/modules/message/images/findTable_9slice_tl.gif new file mode 100644 index 0000000000000000000000000000000000000000..a88bcf0c19413531ea34bb7078018dd0606e8990 GIT binary patch literal 1314 zcmaJ>d3e-R5D&6erQV{VqCQelz;5!A-EEF`soSK1s*BiGi(u6>``V3dk~PV)+j`)I zC!XMicweZfD54-Lo_OGaN3{hn>P5Y1v8c4&)|a(g`iEch>oZ$yRMj%8T5D<4 zgcw;m9h9WSw2?57tAe!AWIAFxOsX-f4vARywrLV%P29#X8Sxariz!()0wD_eHCV)e zq9DZtp%4@b0Sg&OGb{}`KLf=OCqf1cJtU51$LhsOSs99jS79>lx(Sh{Q>he{3Q(5a zKr@0M(2%8B){iaxPP6H%X}{?dXr#Sk7}Kjbi*Xh^gjwlqEc^&yUwt4 z)1k7YD9tkHw3?t93etAg#^aYmMWdr53}e{ZaVyd8grLMLp+Gqdav>NXhk&sW zCzl06NswheC<&4zc|aaU_y`{eaV(Ys7)awZXs^viv|Vls_p&Dr4-sArk0CN~)oeUu zV+IE@{e8W={`vc_ojrf<=vDU$lPy z*{7du`uL*{KiK&Gd+)xp;qABHeB<@k*1!77%j;fRyXM6gRzJV$xo1~C^Yl|Io_yl* z<&Qo3$iojk_`v=5-FwfnyO-W|=N-4-wq)_Gx7>WwjW;a1{<>?gx%#SwS6*@XWtT3v z7iY-vuX<|kdpz93|9en-x9v zl#?rF&QQu_sVs6*>GW_(u_*9dQ79N-@qknQ!V{-WopQqQlaDJPCxK&+IeOwzM;dwA1S6fe5z1Qk(HQN%109lAC*X}c!b$}C9>6N_`3ZU`t@dbh?dNljAP&G!ox z6(9IUQBhP>e7{jaobR_d=9tgnKqg~PM!V6?o4Stu!MFS6%RTqr^E>DK?m6eqE%woj zFxfKE(qOR+4GkreL;dkY``(^CoxR(dn&R}aqQ7$G!kuIRQDDVwOuL`(=1qzw>SO2_1v zM*02YBV>70TQ^GK!Qc;RUoWo#QhB2YB ziAV%7pg}(8a?m~>!|`4~l8na*INIm5dx68{1a^D`7#MSNDInk&o~Iog!*QGmq=AR_ z&~~SbLXsT;2^0olmf4uHOK+iCHpS5&j z;fEf4;Qm$j-Fwg7EAP7Vjup4xcI)z6ZocWp8?L|Z+H0=9s=h83T^2EP?aHvK$hDy> zq+m@o42V_2(#tPfvUt&@3o9!wxwyQn^rDgr7x*uje}3`2xjrw?&GDR9G}~QRz%sNe z-|4VZsKIU4ymQZ)m3#JCGtbPyv#~Q~oId@uQ>UGB@<~%qJmL5$$4x%=n4>36JSywR zBQi4%KWu`ni1z;)bl=4spenwNv7W gyo@#7)zb=d=dXtNdOozZed?+Wi>EJ#t_(}Te*mZiBLDyZ literal 0 HcmV?d00001 diff --git a/themes/xe_solid_enterprise/modules/message/images/find_account_bg.jpg b/themes/xe_solid_enterprise/modules/message/images/find_account_bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fde837531b3565d6c25492faca4758c01b8f35bf GIT binary patch literal 10896 zcmeHNdr*^C7XLyBgf)Uu6xdPu8njg`$@k?UNd#iZ1Hp}AfTDGMgychFOoCqmMC%ez zJ4+p1rb^ZcqtaFbXil$ZSluo<3lRxgg z=lssS=XcLJ84ht?a^3)fMFwR$0K~_K14N*IIPU>uVU}FA0>A;@*ft9QoHy{*8G3yt zmqyd*s4|5%4WY`lYMMcoNrR~n4T$0yGG%fVq6gEEB}z>+<>A*g6i}&%rlhhYkR(%p zWGH8>M3JPGvy$a2RdSAk!ixc;3|xacQ;q0lph3M%qvIN)DP6|7*xa>Eqkvs1dQ~)q z?>ZHnD@g@-x7 z&Xo$qJ!fI7XiAS$IXOAh90pa3E}_934u=NOX>@u7rV*iAq0!3>5gJ`suLU8ZlcUN^ zy;7?IT^40&+AMuE1-ogt3+ha%a!H0>*Ju2djG<%w7n)-YqPaUDLiK!WMmLh-k1^L$M@tJ^=i?QU_4f zV#$niUIo?yL;``}Lm>M25Qq8t_zoNHMNp40w@ocrwm;954X5p3zs0 zyzw|Mf{!n@-M7^}!HvLS+TKJTFE1~EKyZn@a3iG~@pC@?N7}hjn*!l|`*q$-a{fDX zKDzw#ZyAJE86|ej1oD4aB0H}DBs>ng2A&M?07sME+9)lubXtBdr57m^#3>ti1&zf( zv-HUl>8k1I&W{*7V?a*w5%YzT5o32PY`8nSz(0kSp7q{w-|)=`xSMX`O*1cVjc>!% zTkf6NVaxLXJ>+;Ir!PBv(X#OLbj1~uY_2rf-gs~~k5_EehPL`6hMCtI9@mXYq6U^V zwN1}HPCcJE=AG=~ynVx}E)WV9lz#Sp?0pt4El62DY{b`+>2p86vee6?^nXWzyd?Ns zl|8Ag!@Kpl?#Z3o6XVctCO$}Cd28KQFMUV6sb#ReFxc@eGv-?7;T5OnT&wi^$h@tZ zvgb{if60yyFYF|5uO#3QPqPh8&Y5y_p>@fg8DHkTr1plExWc-&!h53x_s?D}+hQ75 z-@3Wl+_EwJ`WrI;vKjfKDEV{m?>!IqGBE>Qdme7Ul(_?VGR_?{1K#(P$^ld64&W)3 z?wA?qzNb_UlrgvZo>J+Snt=*DrE;K*xz+cSO1IPuP~a(*10>A7`Y&24Pgh#$d(76M z`lC3p&S7!_E1un5_lY);@wi=+MVKSvt|<%D}M+%X>RT%GZ!>gW3Q zji0wUf%_LbZ@26UZ*>nDl;md>QxNtn^|yLj9ICXf-&r%HJq<_4(6xu&d-h#tdvuoQ zkAn&a_h3?P+HdO)lE59K%dACC zfZ5jHlQLG+{EKlhIi+?`mfeD*&MaR$g<}jXY)_2ytIw*iG=)3(b=`@-y_(m!=%E?Q z`|ED;gAw?yZ@5=cex<<_CSjFN+@{VI?p#FLWrQuOR8HUs|89{5x23ns`4*|in~IbU zzIERBg&T}_tR#l<5eKq7v>ET_t-0j{tOxA$oimao#^Umlrc;b*baVBiiWVo(xY75* z$2>Cs$B<+F%}Oj7-$vgz#5${L&pQ0%^qDj0TbfHhI~GYVn&Y3nnEu_L>5I(94~-3? z4zd%N^kvwh>*MqLID2cIVIR&<_SAMqxL7`L_9Pt~!dW_)1T2EJItW0f`8 zEK#`JWMd%z$Rz(Y>{KUk&%|s_I+HNXbc3d2T$~Uzn80}@79VAEpe+kR>nKGvq4fpr z?MsQbx%D3??TueVovW&-i0jx8r7HcR(stQ+V#NI4;S&JT_NS`*#>Rx`?*H|iCe*&t z@L)EZl^qu4j?mCs>A4f<{#bcK$f+(lTySh^HqRF4xK(pdpOmrN@$T%^0cD#4PT+(Y z{&_=iDSW#Vh%pv^YL<-LRd9g8S#C}3Fc}NPhxsKZ>x-I~F8aI5-dG-U=w!WJn)f%d z9e)YHPwKq#-1vB7;k<<-pE9CR{#z)4_JL#{?|vB$D3s$J`1kcivXtDEg%l0g1X zj(6jlS_8J5FqU>t^3Mb4g+EjtI$r*`C!A8MwoI9Q)|&U>Uy4;;7xd@nj@e#XTzhaF zvyo7Kr*v;boP?FXl&h>5Hs`!#u}A4QMZs6f(!Hx_TU&K8sdYsy_SpUQb0v>_QDa*+ zZs9^vN$c?Kp|#U&<)Q2HZRJ2cFUJX-{Uq_wAIu3MMW!j5l(L(w-BaQd_LsFMq$W(h z)~sFp*Q35V(~;HliQ~?E@WgK!n8TTWY2w~|kI2KuuRk_6bqDsW{~@qLQg$3Tz^EC$ zZ*0veYgOfKo4v8-RAEQ*JadzSx43;R36$Z9!PAfWjDYfgeT#rOj)SeOPVDEUm;VjZ CFmFQu literal 0 HcmV?d00001 diff --git a/themes/xe_solid_enterprise/modules/message/images/find_bg_left.gif b/themes/xe_solid_enterprise/modules/message/images/find_bg_left.gif new file mode 100644 index 0000000000000000000000000000000000000000..8543738b9920cdcc36d05047a31305a3a762e728 GIT binary patch literal 1843 zcmaJ>cUTii6c08~^t`j5?UvvvoRXbQA=zlqm=MJ?7Q}LTmXItYLb74ANI*Ti2v|@Q z3pP+hu_9Q&f*lYWY9L?_0@7;~5XfyfQUAEl`S#m+GxL7$z2Cg|W|D`5hsx|}CYw7n z+NZ|mdUIoSow=p8wXLnK;bS8;msZx**4CO#rVpj1t*x!i&CMShn@ol8&1Q3+(O6Sc zQ(ONrFV9$3Raa46pPygQ*z~!msJNx2#b`8|KQ(=BX*C!O7K^2!p~1moKTkRX63a*# zHIEyw*UIF67zue}zABA?UVSB<4yhCZ`dp3_NVOtNshS)@V6#G|dC5ck^qjhUrkd3h5`H3#|u`)u#w2Fo?qdE^^?CK(1^C z!UiZC9Ro1|0$_v*1Fj1K_#7@DAkddVr@RpgAHJtp^2Ham63~?-spZ3PP*4yfh{eDO zUl>7A6b4L~$#kJKTy()2Ql@v&=o~vNh%udqLY2;W3R`m_b{UMewA}|?=6J9v(-%$)R zlsJj&l(-fW&0<4N2z9Y~CIDOnp%TBKLt>~I2nwj;09+VBV1V!elMev(LGnNn_wgAE zsUdHIib}cA8G`1jGzvUOXH7Rn&Po>}RLd}hguvBM`_1!J-;oFmq!{pktBA|yNhGL9 z><$nF6>@-xC*iQ%0h`MKEczFq;=7w`2Lcf)7W3F5R3s8vfjl7O33)6Imq|%13J6nS zz}7PRuIxIts9Ls)Uz>bVgDK?RvL%ZbE&O}I{J-YSoip2O zmgmeF)2B(N{yD{C@+677STs>MVZ57Q+*m%!awrWu4?(Zt_a2Bj7<>50`hD?-65>uA-FzzYm+#%r%+7lJDCgm`oyRi_X%CFIpC8M6UGVnFtK4@*g)i>D&;MY0TKcA>x~lwT zO>sqiow@8&<>$7BqQZgrk_l@YD{{tWYGXyKd-sxf*(Jq^Bl^KhA7m!I5pNqL)bz_w zT9UPX#4O7`uP`D$I~rKFtZ=SZNTa!`9x17PeWxFI)k)E3aG28hh)-nP%qgKKh9@Wv zhewvJNi@XHi|`So88)w;y4Z1p3nzE9G1)t3$80~>(=RT}FC=!wq?CJJk=D8yhU}{L zN}p}BIDSaIuWUWqJAxJ&7BC_s9*Wt%c_VXJb_j^dxq3ONB;$}{=)rMmL}_*cE8+Fk zG}ec_I9XJ*dY|jk7l{GMxt08j)%oduw&{YGT2tY@D91Uk!H6fttp2N3xGhZ6mFH}S z-)wd29A|4^c07wUd`9pn)9#*op2#22dUh|c0NM?kE`ty|trCjuw4pO?IOt?MkbO>Q TV>e(zw{G1>9=##7qmBI+ujLo+ literal 0 HcmV?d00001 diff --git a/themes/xe_solid_enterprise/modules/message/images/find_bg_left.png b/themes/xe_solid_enterprise/modules/message/images/find_bg_left.png new file mode 100644 index 0000000000000000000000000000000000000000..e3f604357d4d2e13d011a7a83b0c913eeacaccf3 GIT binary patch literal 1216 zcmeAS@N?(olHy`uVBq!ia0vp^+zbqik2sistc{-*_5&%&64!{5;QX|b^2DN42FH~A zq*MjZ+{E}FfdWj%4dKI|^K-~-sHue<-iOJci zB??KY>6v-9O7C~?S5nAKu~iB;^)>Jbs{}UJ3djZt>nkaMm6T-LDnT3-;TxdfoL`ixV5(=Jn`~fas9knMZjcj#4%e6n7>Rs zT^vIyZoRo3o84?6((rJO%C6X#|NnPyy}+fdclP?3W5=$UaV6*U?Q?H&kn8u%6FQ=7 znZ7hcZ{exXTd#_5{Pff0{r$H>#`(i5t(157cn{y)x$gCvt=FB-TlTj*-~VpDJHGXl zp<8m#s+O?qh5By)*2=6tr1xcOZg#eD&Fj2bX)kr<`NLZ~{@jTX;9y~DbWp%aZM6LO z#^!b7k7U856x(-UH-6pUvqs{PeCP4@wy!rH{S&$o57N5vV(^BiB0WHJI(`d({41Rh zYVkbCD{J94tLHYpljkK@3KY+ZpS8B*(yb%EzMq}6`1P(rnQV_FpLF@Q#BwX!rO_)w zt{tCJ%W=d3@7U9M1$5#QQ$+E%O+xa zHf-E9FfdRott*vEgR9pTi^X!eOi@&AdBTiD8;B^bLjKJyg{-1xunSVSTQ@`Wn*Jp; z(6tcV$tPeUE9102wa>=webYMBzKkkrbjxJWT#yPz*1)a;3Pz9VNQDrsXjTeKME15> z8dOx=Oo$G92f*_wTQ&wf1AQuNM4&Oipa2vDVgukHf-K@#81x}1@j(e9F!a#Go2_+8 z$w+L-7g>eqwCiRimd)q$Oy18}b~lSeQDh;wjBHZxPP@*qanoTcq!`sQ*n*N}5d&GfqT}(aq7sSG5r#3W?YK$2 zIr#sz?{xHLF`LAWm9te$)aypL8r_knIK)9pD0T*uEXI@`2UiXf2`OT!IRl$+JQAXb zDx>L|6b|}ha+D88xUe6gC~R#FB3a-`V&niHKztP&Hyu|oRb0jDo3Y}kSV^|A;#zix zW%X2xp)GB>mXo%!KyD9!dPFX^z(E*9h$MbyRbmVViI5Zr46+EZ5J`}eAS5qPbFS6Z z)dUQXvPo3wS(5G z->&>-#n)ebx%`XIKl}8Pj|V>b@Pqf?d-t7XZ@;zl%{N|u?bTOae(A**mOQ`sx&CLL zdHSg*pLqPSM<03kp+yfquyDcs_uYHX-FMwN|Bl;ln|JFiH{W#Q4cA|H?KM|lb>$V8 z&%Nx@OD?|X!VAtn@7#0FKI_agPCxC`Q~G)f`8he)u}{ugrqPo*Nl$loVNFdbvrjx> z*6}lsJ9b9rF-Lc_C#Sa^H7#-E5r@a8PKiY$a%=domdT;!CP@^6jeNk*kp^dc4Tl~w zss7-D4m_Zat_Ax~+;87~_TFpHJ$B!1*IjnrX~!M5-)`Fp+l(K#^;TPs9kWFZnN;h? wl6gf@4c^C_YSfsCXTfIf*I05CVV zu(Z6ou&`KDQ~UL6<(DrNQ#145zSYgleQ#=NT3lQzD=Tkn@9604T3K1^?d#_?woXpZ zak-@p4ZOa=(faxZfv~N!Q`Fqd?;jWt2;1A+ySutYgF{2T10!wion75M6H~JdVi;f0 z+|t_E)cpB#$@tW4U44CJW#!1kYx=LQFdc)aGO=GM8n`JtiV<`%*9^o&T< zJ25daFfiEKDs1Jq_4W0)vU2l z!j7e-rQY7YnVH$HuI};iaXz2l-7V_w?)mxiXM4N&bh)#$TTE$mbhN#_v%h~pC~R+O zX>H&&3)|Y;+S-Rl#CFCyI=hF4hub?kXJ^GB4T+=w@#Dw9z>rAPx4ODEIyTnX*|oO5 z&gTop#>c0pXIuF~aSCf|zlpQl*EcXUBsMb9-6LvjY#RCHsB3L)t*?JTY*C^%#iix?hNjk5L349! zb#+ZwR~KI(n3$aG?(XgE?CI`Y})USlHOu*uH_bw3&c6m+&p|u)TTd_sNp;6 z+TraO<}`N?>o9-XiLfIlox{AG4PDd@9>5ug5JP+zKD0n8F2u*%H-H#oqDFP0JJE<@ z`PXYLHQe7SfnFwRroRqwzkHh0{b@K|O}vIPUXOs&)6pd8;0<*Q_u=;A33x5Sel5Jd z1_4jh)hFT!xc@9Qu{VDgSK@IC%m4Ti?@ZL(0|OaEEv?|-V9j7{O}f9E7QxWaPz%3b zYyW-?v4%!KsBa)OM8h{=$3GSd%+`bB?dnpl0uf4TbKj(#crhXc`$>hDDpSJ9H{9YFj0z|M|nL3h6BL-P$hY+<4% zR@HRza3K=R4YUb*hwv8rO?3!_LwHj|3&J7O{g#Ie^(}OC_4NP29`+3gr20D3{=s_u zi?y))pID-~KaCnl_diLed;il6WOsTXJ;0sLz?q-W!Ko9(i4ED0$LkXa;=()rBWe0* z5)AR;=D_P~5eQm%0ujHTh{uaBob$y%x~r=Z&Ijk@FOJIn+-@B1w1=+?JviW3xy9su z(WUu&1kqe9{pmiqzcWwt_%9L{FNzr$;PuS)bqp*m4b3eM;RysoQ(e5dfu*kYA-s;h zE?!&hKR}oN%G}>Tyt$!;g@KN_p}D#FFQ5V5)WFn0TUUR-Ske{)wZvg){c5xSYP)}4 ziF^5%`0o&jH~)?y%~xDCfANq>Z2VkbTU}XR`my+ZVSa9QW_oIJVtj0LWO!(BpuewI z)YIM7+0ou66!2SHnwuJV4fS>3YHO;iD!*2IDK9JKmVEy7@x%M#qIZRF-@JbHlJnyE zv!_oA9zS}R{~+&vZVvme?0Z?68R=` zVQVYPLl)*{rlf-hOpJ|)h6eh2x;onX#RIOXv2X95-Ri&Z`fcY9we7fVTUAw*l@t}W z$jfb(mDz-qmXgGvQAh+F28Dn@5&*D$83O!T`+nVieZ2w125=6cV$ETf#vo+(oVDj1 z{maVf=X$v5%iM}93fi8XRWJJw>8pYkl15(SRo_xSQE;~U)dSnx`bQ$J=*~T;%QOf` zed>p9{$NFnLCLMCf$DOsZxvo5V9soNK)$~cz6l(Uer%s`{B6ctuli@2JCjvy3!k>V zc5lwTlSBK>{w<@w=3a;1U`KJtd><`u?s<0!v$kf$QP*2k9tH2vxLWk`e1-ZtG5e|f z+~Mlm+UQ;0f4&~ByJB>C>w3eh!{73DXKE%9-}bkjQ2fBheE2?5{+8C0o#nVNCCHN8 z@a=S5Vsw_K$R2&J66)Sxw@o|c=R1RoT>cB&%g-aiUAnpkT{on)B8j0z{SBw}UPNlF zF1j|Cr))(2v|nDF7BpN4yBxW;_Pz2P(?z1{uc(b>w{6krJqFuiq=|@av9dP8t#Ml% z9&L?R_6*sYur17bYvPV%g{?`yX9!i3_ZB=-y`uF#MD?n6jkW4E{dNV_>qcWjm6U@k zk5pLZs8E#~R!W8{H*NPUE8jXwELOgK!X{Mt&S?ijV!qSz}oRbeLrMqPq zDrI;TEGuTx-;XM01=JkQyqDe>I?RM5KXA(qDUesE$ABu`{sKh~E9YKDg}MKAO=d+s z>V{H*df;vO_nmnXr{0e~NL+cm+bR1du^@mQpD{ucnTB~fy>Qyt;&t(LSmjvmbN?{P zv(P)qW6#opYWAN0Tvp%}U8$Gm9b0=!=pEk>q~Md-oNDirEGSI#x!S=O`dsf>RPbf> z%b)SRIjooNdwcv;n{VoLkRm;8KJ^Se<40jSJ!_TUHl6)A-r?!f4UhxpzJxY$;w-p1 zjFX2PR`Sc2c0@fbc#_TEQz46XoPD_ENjvA6Qh$wK6-euBcV+&oHLvQ@sj*itRcp^` zztZ2Esr}l>s6+eBL0e^=x8{zHI)zqVnL6)m!#i|}j$TpLEk2RysQdo(lT6(YjvqR7 zKVGO+*8Ak#;i&i7Z9G%2#A~%fkE_1dSi6+2d{)2A&o=8vHQsr{*#E_z%J2Fwqwb$x z3JWm0r2i#6{9{o?#Fa}S4l&xs#ok;EyQ?Ex!_ch;)S-kdr zGj3h}{LRE4%~NkC$^Dvdr%ulMzMZxQzj!-yR(AUBEMQ;${6*n{_lfDk z?+mMK{~>0;(V`!zF(q^TI4>>zWsUnAb3?m=eLr_k&(}qM%c-3HxfXdL^3-6zGyUC0 z$m^bAi2cE}!$&SfH*br;x*NdMjzs8yas3DbA}X~$`e8X`Os9w_RahVM0!*E-Fffwg z*T=pyr%s(LGLm1ck1L6x&bSyDE6F#+SC&)f0*j2d>NO-ZfSndLVhv2xPBkP7%$*i7 zMJ9+QyJ(hk-!j|&!0xh!O41I(j~|I*`{njMN;{zUJmo6< zYh)0g4$PPFwtcM&jb8Xa%uo%F}g_@e`HL=dSxWH5m4_jY9 zc2haeWtT>}b^W=fTlYGh)JvDF{|F-AdN?qkW?F1>tnlXTJ352#V}`bWrrx~sE|8{4 zEk1lEo|RhihPKboFh?=X@3I3vUuCvWT1mb6dRSw*)XmvHNLwv2+9Wf{0^~QvPzj{I zC?8+lpQ0^N%c|UIt6I+itMG95oL)xlT;v^b(>$TU3gIe#WN*YM3uQC>Z^Wvwc=bvK z0Wid&M_QRNvBZ;9xPICfQ(4b%aa$8m7a1TaOfs)_kS!A~bhqj<`!+(#l}W}vw%r$| ztYHy_&=(Hb+Gi-ST>vQ}YxED>uuLm_pVU!C3~^WQQMxcTKRpMs2VhI-GeP-=a=#zG zn65-1n@IzdGNn@l^sX5;Drjl=$m20Z0zO(MOC+J--k9`f-VRJA!|bGAbjwHMvWHq zhFOt0t4wZ=3^TiGDtXF2S`Lr9g5#-S6LBDHJ}0R>KJ}>!;feD!1HPXDl5^pet6pWs z?FFKc#}YvbWz2YM7gOXRtQj_z9cu_|N0RVv_M0;8i}9%#2fUV|{5PZq*9oD=Dw9nl zLCkkXA*~SL?VW6xzI_hjwWOJBGBw#!CmOM^@O#wy4p^_IP$G;6-lOE5q`1aK93Qcg z%M-=^el`l>VE|GH+LT~;35T}jl4Rd+M`PSY%GZQuGS8WDs+gq@Wj9P2Z@Gj0=XKxy zOe>XSkX%)OGMF(dIzze_p?20_W3&0^uW(3?#BVyL2or3X%%iB@qd>3ZWnt7NPkgLg zj1A0?U8cIg88lL-z|0c^)4Z_F1m#kMdr;Z-dPn0}EG<1`PTuj3(D)XO;az#NPpTRSow z8|$mn3sxk3*_1{>85(cr>lKws@A7o#u&9l}yfRgP?v$Bh?pO1r(zLzT#1@L`HoBr& zwUmL8ZbO8(yP5n}EY!k#J6JWOTsDhWpVkBjci4GHD}VIebK3#{aUeiEDPbEz8BQdD zq(elIeF`9Hj}0zf;XN0wgDXZZ(_(I&#zM7KdS&x*Wt%y;Ifj6gyZM|ARpp6q(C_Vn z&DZp|#D9u;q1I6sR|Qu1#$yuRl%njoKz2A=;=n+T1k7qlPX0PtRfNkY9eu=mmYb0K zd;3o0GgIAy(l~8p$2$A8=BD2{#j<;R?Wrn1(!hxQv&@}UR1{;RSha{k z_J7d@&B9GL+RFS;B4?m0K8JTFF%upgjgZ2S&G+7BMr|D^MnntCRF;^Dv^)vKX#=o) z0Y3S4csA_y=Z_s4TU}$Dxbyl&68YvEtuFn&WmbTxB0!HKaXY^&a6q~T@bQ`!IkUtb z@J9JX3giv=!erSCgHAW#(ttp@Zim+LX13W@1 zo`D*M{K;k>+;VB}pI#26OH_X3Hn_j%DQG4P62hd`TOybO)N2yxG3UZ54kB>|a{~`| z#X|oeGn2UiMu5~UH!?R!_5uJ+!^*R80J6gGAkUAv3ZaSV9zMfOG&x!^5l! zA;Ek}Q?et41KS~jNdh1%MmQZ8`EfYBe~76$3*F3>qHYIU!#xge;N#CSJZ64}dIv%0 zS+FG*vI!od#Fp3=bjFM#;VOdfV+dW=?7B44;IkQC44UGoS*d<>zc z&jddfpbqiEy2ub^03^%4I!TdwB=m`mL*J*w>Ef@o2xXSkRXFTxG=(ttMMzdWyjkQy zVTO5HT@V2e0P~P)0Lrlqc$x|!TE*!x;$A3hRyLG(z$WEXI;$nYuaPfHvci;D zE_dY^(G*xI`|fX8=}BIMenL31XW=Z1BKx-cj59kNHL=zLl zWuYP&Qj#R8^To+V6tLw6mudP?HVLV!!*tc-IZw%@Tj8#sIvsHa&d^kZ?_`1CJeHT} z?zx$S%Z2dsq%7w%*@=p`d8W`A!TF5}Zxt-OWsA7f5ECxUlnwD?!yr6R77`U+1*fu- zFC@hWF>btYci-!m?NW-|G=#X$fIfH!WrRrh@shr?E(AS>Y{SC&EKm$t;sFQt9LUOG zhW81QKcCJukIHp6MUFoXR)0u8hlLAp2wPFo*O8klc;E{sy=@ul!-aohCBv<=f>;=p zJ2wn^!DKFmw;iTG1F1=ct-xTH@Scrv7rJ5iZz( zcguQ%xY@HNpJoc49Q8Pcg=yS{HeU4f<~%HBAkh@bOhbw6YV@8epYBCFR29_2EmtEa ze;;#qD(UjPZbXHMF6-%|f|u%?L6zYV>MX?SDEb^$%7YBwz9$=;obQ2xCL78JGyN48 zy_HY7ovDPay+cT{KwnuPFazL<(lHb?Sv?B^jd80fc=kR&tqeK+79_dH?cy%SKAaS2 z3%ryi`2r_tf_i#`atnSMej<(edHB{y#&ed9{38;?iiLj9K?E2&nuu;*;lSERm=f*- zHUrJAh7{?iOn!OvRdI7l^6oGI;$_Zf+wryxPr zcZylS0tEx%qCPvI^01PhMHolc>k~|-appU%ocwTG`Ktir1}~|(@Uapb{hTCiSNjak zOMgd}D#W5PNN<7U_@Q9(nW*A4HCO^mDvAYl(2urdNY=3=?QDTE)?Y|G=p!KciGjMw z3O|D5RC^X{=Hzd}?z3bdqZpnSiy>D4&~BDwCkZIo;1qd@z@JG{HDqKimUG&c!&Cl5 z#(#311$&XNZmPYU$U`RBVs`UD57Ez`JVB~59z7iiP#BeKQr>rvfwUw09AZKHNuXUE zz_S*`bO7DON=ow3$MxPBg$MP^zp^p?;MyyFm+{1ggDzQpwcLLH;23HM0M&>*vuEHS zo7{uD<N83LY(8FJ5JRPUxG12(4LcD@4Ty@_(MX-+1wiE>hxRP$BBB|_u!)doWX?FdF2gSg=XtF?YQ^WZ9*>5z0UG3 z*a45qcFW(XRJSWiY9vo2oywFs$!gyFsoA)z`9Phop=yhsHFOA&21m$fbB=M}wXkW8 zHoa0?fj38d8nxJ;7KX{k?ME z^168L(EB>?tEs6SazF0|Q&UqPR8xEFk9XgekKA7wyCnZQf;;1n^F~MD2%#8+noBtP zD};eNDl`%SLxhGWCk!GS)ztPKNBa2V{Gk`@!_X-6P=$(2W0Jkx01AN% zHAq6m#$oM~oQ^B)+RJ|{h5^S7lp?qor{gN8{Gnb3u4oLxz{cFdEX?ARrNJqnxh2p7 z1O%BHSXo$F04%Kl7Pe-V7WOu__7;`~d!OU-*)ZV|_As}zdvnR3oQ_A~aPjs40D(X- zCs>=KF_8dE5C{aYumV_FnaL&0u*q?_&?K`s>_7js;D*44VUY1SBs$JOVKMY8G#=-4 zT<)oA38?tL%*J8&!XytEASpB+U}0oW#)YE^SfxA^ zYVRJ0#f8R&A>7@Zj>|2WBaz|uu3y?&TY)TW-K@T}u(Uj50dlpoc6Do9fn6C;&6ZJhW}UB?r(J!P(a1YXLdtikco)!vlukWK)GalK)89GI;Cm`9WIy=cB1poX8^M zPqIkoXQZtd1olPdetCX9)Q&3V3Rgwj84%&Fn6tacS0wK%!zr4C&DoWWd4fAogV<Y|C0On*8KkZL|Q)E)F6qw2%fJZ+4Tex+2&^APW3()cNLoqFRm#mDVb;U4#FFi zY|+t+4cWeNhPL6GMHWt4T(Z>90Ksiu`-a^7i(&kljgf3S>Zrv(uG+ zh5Qk3cRzW(Mo6bNv-=o@8T2lduwZj@vsWhAC7;kJVPgk2Q4_hc;$ljI}2-78-JZEiJ9_coDkZV2vTnbfoi<_V4a2l(I*AQZ|;h zuD-}j)HD&74D5xVw-srbTVuM;!hWlB0>b%q{7Ij4BO*gR?*P za1Yr03Al*+?Im#Nun7}XDcdRzeGzj3L`=&F$TsyL6>*O7ek0RaiNxUH^$*#8EpW~C zA(y(LuHgnCXCBa^+_n)^aSdWRym5sW#GA{5d8%bIWu&U%mhrLE1Ca&)$nT=wHmorX zsR~J9q`e&_yFY&Wgued9`mc=pu?VDP7;BiYPmY>sO~8DjPSm3Dm}m>G+AL%?v;F)r zv$_$}b7>eh&8BU7X66_euFtweg3dNT(ld&eS~jMimY-Y7UuTPZ7q_^D%&&`SW?iK9 zb!vO5CBv{Km_mF|r}?Wcr|40ZD&c;w`))odHPr#?ZDthA5@r$#X4<827zX}6gxb?& z66=|FF59S1@0gCCU}_4KV+sg45M0oboEB;>-a1(jG)2=$ui%5L1DY~^wrMQY18h&N zTvFzI`7c1I9OJ^q@oZ{lU)Av4h3RKwPE3DDaD7|OPqCK`opi6d3)D}~FCH97hannQ zayF(%cCHp>7Xc2Wh?gF(jtmLTPA5lEk}cHNuf`dA`KzMfK0R}cAy4h`l)Pu`G#E!e zT3|=Sr9^p}A=z%-B2t1b%`aQ1Y#1;{X^r*ig?&ryamsEwB|Zd)jgHlJ(` zpRH%uKg_#WU7 zTl6Fr=bes_Mi=k=O8oL9N}uj&#@={>uY&|rtuC@xD>uq3TV>9<{q4bvQ<$B%Gl~9y zcT&DURdLzMKKEVSlFE*-omx;u@&+a$TXG+4>K=M}ig zs;L1vIK+4?(y8ojwvI1sY#QC#L^auHu8eqK`QnOB)}CL&;)Th@(+pWs34F4%;k$~o zZ{`*tl?SvsX_y@V%5NWq`z=?T$fr`5H8I_*l@fozZaK5|@Z`(G7;MdI^*sk?L6X@=6iS#-vu_OY69& z$fK@nU3v$NDdW|rjk4u`Kcd)ipBb8+y8)w~EXd~?4<&x_g|2U&wTs-Lhli2uQ~Vu= z!zQ`BfQye9G}`9jj{4Z%LrekB#)N|EZf16M(dp*vjS%XYd{4l;_1RopmN4=5i>yAz zD!H?h)n@_t_ixIga^weD-vvB5(_ z%xUJ%t+AcOI`ckMF>Ys^X69E|2$cbAZ;xdP_A^i2&HG8<%j^Al?O~CD+{54NO#KW* zxhMRdah}CmHQ>Xp)LT`EivaHi7CfKLZHPVhbpgw^mawnmTyQEDo1S*u79=F>Guvk> z_@Oet`+6d$?U%&ea#h&s79JCitoPidA(yrGPvqO3JbIb;t=0G=nC-+e|60z9CbQ|Z z;Lwx#G@U4r7Vvf7T)dq#Ljq;iYQJ6f3t9430X~Y`ptWBZ4Og8ENncV(+gCYZCC-!d zywSy~s{HIu!Sa-4*@Yh6iX;7@v-nY ztT$hEOut9Asu--xx->fYXlm?!+l+eq?0z5WAl1&h*gQsRTjFUhwg3!5v) z(?(Vrh)0#A>ssvuZT*L`1duk)o(}V7rbtJ6`V;lNj?~)6wCNoTOkv8@J&=;B-ku&~ zRQCocZ8tHbJ5LmBQg^Z8<$)Wt&Y$yLQuS5D#j%O&?GF(TZA#3C@S`UPc5*IPfN3KlreG9;MHJiq5OcobVX(S4&Cv1PgqqYP<962wJ2la7?S&^(NULnmZg?3J!?*2&!A42) zq;_n8Rm2rg%qV8AoQ!+-{AtZV0g=41o0g&TMaAp~?X&mO+8%Ar65P#H+)j6j<{|gL zuPWrkrO}k8HK1mnW9jH^P@XCOI z0XY^FAbQSA4>S}On%inE2g~4P6ynFC{fbUt)z%H-{WsF>Qee2N|~aQDS;@>fqNNg%vL(0X@wsDCWZ;PHzFxuz-=bDJTJ?o?ynR zb`i*?#2bAry|U7p_7MuH)N|nSn$*cfEQ@-2vd}z3R7EDeR6&vTp>qM0=50-hC`AX& z5)Xw%7td!dYi1_sdKhh_jdT;xE6dwKYhT|YM?j4Q!qd#cCTkNT%7Ls{{eIHQ13V(f zM3t$LuyY=~>eK5ahJ908Y-`y+&&(j$G~wzQA?D~);m`(`i(n<5q#85X7%OUfNfODeaIJRu;dWt5aKxpl=91A@0zn8HR-9e}q0V-fvVv(R zZO!=-!F3o!a>ixx^OiKxqc+n&CX`1BzfJdDNL~5+#r?0lq#eirrj>?t1S|*aQe>79 z;(^{BAiL~zOenHA^W62#yirGPr*%exvMoqDF$T05YB!a;&cvu=)2%BG*0&V-Jx>&N zceV_KK9RITvcKSl|mlScHD;p!n{9>P_e=`z2<)Bz!t(KR( z(vjg|XE`Uv<0oh{1>VIG>0Wx%8YE9N+}UY=d&NEoa>c~+E{5_dd3lZK;+4V}>Znlh^2j{wGM$>x zrFUncP2=v91VqorcXT`Yp6&`lcI}=0o3FzCCU|YTh5F_1FxcY|doyFUW#vhLY2u`! zV2{)zi<@KQrN-#kHu2M&2|w!dVf4hFf4tZz3Gpu8JZ6Hor%cz9<{h}<@f1zkZQh(Q z`*qPbCZ2l*&2u<8ko7zVYimTA{b@RpJHxh>e*}8u2osa;wib8*06siaeP?vMh|Je8 z8B`t5MK)0Dm9}I3;!iz?`N4jWuKPP%GU*w10jitvbz@s^cXJ4m)`;o-`IM8N2S|FB z*QtUD-TNEh2XpfucOW=)8107w6cw@^KE$A2CL_pAs-yLY4OC|! zIRoVoq5&+-vqi)8HL=l?!{S(Zi9C9v;5TyKx_dNIuh}2D+`C4-N&Y7FhCG(n_%=`` z%0+%sIy-=S={@o*t+2WnU%lDZpl-(IOWLDTD1on@VF5T-mB1B9o!UA$eR?C4ZM$Af zw$iGP&APl)PEPhkl*M#`5Bjj4^F}U{!C_H`6EU~;($3Ny@X)ye5U zLjw93iSRF4elX;7bp6Dym$;GEW|22k{6!2D%vHRe>yzg-ySZE6ug;JH*8&3QGb~nt zeKU*`+|ys3KnBkr1<5*Jw(X^owT7!v7g%>WZUufn>9^R&3%Co2bdl`57Zu$KT_h3_ zlDv%Jr;z%RSXHT>l($G&>=lUk)m$I55Fok>YuQiNza*9u=Jc<)z{Z_ht|mx_4@fGP z6w;}wsV^k*_HY8%W=N8VNh5JS;-;+YvfCfivXEV`_s}&YZ+XSZou)N%)(6gqt;hyr zfC1ivz8CcVMM}pCmq+N=lEv&NS}MCBjlSoiOxRR4_ZD7_8~zbDcfdCO89&*WD>Bs&S`{Wyedj)rapEjJRoQ=Qr48D>oRJW`2)$fxqI4!?Vf zGYq`Q2f)kAhB%itTNGE0uR1oxM^#sq7nLP=>-|29CmvrtJDQ{P{~F+wMxR8qG6KKP zVEfK)R_yN7Rwxu77Diz}4jHQ={oQk{g6V}5HbStBm9e#VuPXk)YYc~4q{A3#R(GUx z+@d`te?lX$ixgCVbrFgK_dt6gx7(R>*9E8e6&8$2OB`DdsY=^M}%Z**!z!?q{)V%C+U<0>vI6H%ZXhXaa zh$Jc~YF5KbnrUQY-oVN%wd7)L305e&=`2cX^)oeV^}r-!nm{ zNs<~pz)+wW0J^(R@7~=^6*BV|crISNG&Otr>s8B-9Xo#TVC&7BH_etjUD_nCcXNHi zx)hnh=krDTLUZ&PpvuS?*>B2tH)S*z5DaJ{@@x*7;J1B;1fb0#6J%q0SWhVlt4&)< z6PcxxvdpCgW~oIm{$()5jl1oXonVZh+dkLf#N9H1(L$OCoSpl(ApzJAVG3jdh5rEb z`&5!N0b)Wp!3-xNV4_%vh+(N%Iu1l(1cne4f+YzEjAIfUM!*L{zPN)E-n@pi-aVd2O(0a6oOF*MH5&=g0sZI7~KgDXUu>F72!0~Hj1&44$yDW zXd+#VOu$C^p9DK)u;p19=R@NTr?6j?&`jDPw~>MnAq>&|7{9&&mR|p4hTZ-U?PLtZ zqu~G7zB8+YA|M0dBwe(bVBs;3xq7lAKk$JDTyLZc2sVov<6I}vf1uanD$?w-6AnhF zk_lL-&|QY}`qYBi}!l^RA6sRDzQNg7O~hQ$&L76~2@Esxz?KM|FRFqJA%Ekc!weqyQy zQK%4>j;UaEqDTO-VL<*ed#vmRw%A(sPaifByLi}!goDi*%{Ezp@1MW_x_|HPoj?D$ zee3s|H?IHo>o3=?Ub)=Yd+FkZ^FN>K`RVMBKYV}YboY1Pp6crCXg~SQ*C&o2`|8W1 zUmW@TvriAVwH`WnVE?{P_I}**(Vh>RKiIwN{hjaa*#7Rety?xXdEa^atxa!k+_1iJ z-P(rwHLF+Et$d?)Ma}Z+s@E%*EnTvBQN_Y?&ua_jm(43JaTgc47$;pwkq-OZf_$4b zFPE^GO~yI1XU%+d#`I}9*;A)vWf~@DyfR5YF+EMEouE;xl&K2&_?KlV$+$F0l8A{# zDBIw|gmEvu7$5gS?AS3ef@pB`^Upmy>Y0&Gj~G5IDl#H`=#ar-Plbl?2L%W5xPhDi z0EoWJ1^i>2|KF(2!|*D%ZPu#hHX9&wjIR#mtWD zLt{rJo1oIcymS)fBf@mGY4Gfb8N&m3I?g13w8=Edt`HzHENxBfkYHihn*91Io;Q?F z52*^XmFZJMT57r4z(J*9oaFu5iqKs{v>Y#G;&6ha>Y}zKYUTVjL9Pw*(m*XQl2=h1 z5tPj}H7|}Zy?qt<5J~5n_n^t~+{q<7ul00pX^T%6RbMzJSXAARd1^^U&UbMq%7;%$ z8piMS^hkBj`9@!O=}&oEC|`RvTpVAXbs!p5rnTZ- zP2A>=Hc~ddmsVeM1$FQ68UQ%$%#JzvRS_$rI%9&~{5pK^52sq@Q7`hE zm(BiT!@c!&pT-}Jt(-|0{d}aQQG94Gw=v+SMGnJu<)+W|ef8(3>sNBxueheZW9S{B zJA7!pC*!S=Ir5USa(N(M-d^EJXlezc##hqWfdRmrliVy-;U>Nh?27~=-Gz#!3oy`_ xIl^?O6YpAPJr}PJk3L^5UI5o>H+OA4Uz3u5vS!NPx8p9I2ZsYd^1uFzywd;x literal 0 HcmV?d00001 diff --git a/themes/xe_solid_enterprise/modules/message/images/icon_member_info.gif b/themes/xe_solid_enterprise/modules/message/images/icon_member_info.gif new file mode 100644 index 0000000000000000000000000000000000000000..0d34860ef94d82536db70cee50da5d96f7de1230 GIT binary patch literal 1413 zcmaJ>d05+I81KgB)Tv|6F}y=?V<>IDTx}ERuua;pYEx5_AP8-3ZHYu;baXTxj}HtCkR;jJ+1b<6)6&w?-rnBb-QC~c9}0y! zIy&m=>V}7hM@B{nf(QnKIF65vjad#gvc_gtvc-^>(>Y@LhSX|bq3T2JU%lXC{o(jN)OQ3=n9g`xGpmR`6s+Bc5=7PC^QZ3NN z+B`;JC@G@XxL~(=0hu-#MHL{@2CO`=qmZ4jp#-1^Di6W{3J?@SfWwLcnsm?rg~kVL zSW^Q*y433*w`J^Ha9GzPG=kLE*W2oGo1%sgl%gmEUrI(a+UtLh^!TX|KXZ zB|+AUye`-fwFSfgjo}RDwv%oz>hqwe4|pixc6vR)4{*%ww0lz6B3aWpnHN%6@gSC( z5=%3x!0C!wt|+ysVkizPx}t@Z2*i{T&|=gGYzzayfucs@SEg1r$%azEC=TF2P!s_u z4KNx2vM8;;K4F%cAnrbxJw6XvG-T%+Ny?g%t>(4(%6Tk1? z_1mw%{QT38KYTwj{N2#E-+cYm&M&{%G5GmspMLW3N83OAVB7oe4fOZD`_9{Mz4=D( z>#x1q(;a_hYuA>SUwZL{=bwAF^O>ig+Wh1bk8gTxny(b{IcstMmb6p7F4idRJECSrr3R(?%yU&fx?RZQQU z?2RjGTNh4mD6yewJBPMdwq|DT*tBhTLSIng?%BYFbEfZ~-#lwjUYD7+e&6;SID@cD Id0CeH0~7!GC;$Ke literal 0 HcmV?d00001 diff --git a/themes/xe_solid_enterprise/modules/message/images/icon_message.gif b/themes/xe_solid_enterprise/modules/message/images/icon_message.gif new file mode 100644 index 0000000000000000000000000000000000000000..86e08d494e587d9187738a267e4bae3be6b9685b GIT binary patch literal 1842 zcmb7FeOwcD7#{{Gh=QU4L*RBGBC_4x-ghu$>_t$g2>1#JW4p1zZnthXm_~t{lrJP9 z8TpnkRGLLuNLgfnW}qQvnH5S2h0+^ZVni>{Z3^;7A3vY&bDz84%lG>{&-eE{&)uR_ zl~|$)WcV{~Fc>fl0|2mK!Ghe}+?be{oSdAxy1E@ZcCguO4u^B?+O@rV_wL`nzp}Ej zwzgIz5~ZZ1Y}vA9aB%R>ojX}sSs)0?WHJ_uC6P!%LPD~$vv=>_9UUFr+uQ5!?|zsyZ`-yFf}ry9^0v0N zo}Qkns;a!ayo!nnCX;#f>eb-jV4+aBb?esF*4B=Wj#aBx1q1|~I&~^EH1ziE+cujm zDk^Gtc-Ukz;W(a{nAq9bSzlit9v(h0Fp!j#)Y#Y<5fM>SQ!_L))ZX6S)zzib=_rcI z%*+&v#VCqaS64STHy=1~AT~Dk(4j+T&YWp!X(=u)Zfa`E$jB%yEgcydxpL*ok|j$> zlI-s8o;Pn^WMm|QAP$FP?%cU?adC3Fd~|e_@&7N@=+rgpG(e%DH1s=Rq1~d<7GV^S zj};irQt(z&GYA-UQgF3E4XZ73%wSB}NMacqmt|@<7HK6qaA6{lU`Oq^1;;22V8=~n zD{7a58Xb|3q4e0b41s_fLKR6tnQH@Z`IHkR1_(GXTMG*jK*;AHd|1Ml!~t9wfgywo z!6G&SqXH2MBXo_pFOc>|>hx&3LUrF4J(Ge4in5>(R8msHDdBMlvH(Kpf`DKy#O1PS z1lzj7OljAC_l8=HDhRC&$IMi!LJHDQj?Sn5Q zoeRSv1fdh3H8$el97F=s#Q}>T1c6`#g}EpU(>I{CQG{L}58yyPNk?VKnGXP~jba)aGyMCoFKwxqZLS$V!lEy;HhMCg%U;(iA(^?#VP?$3G+n) zmL#3=o2cS)l}NHk$yeSZCi7H$nylbSctW{QAOj&f49Hbx6UuIEiLPbWaJ-4= z$#@%LW;$ym-DDo4BmeyU*Pp|G4E=t0@Xl|)-o7>P%g;ak_(T8A8-3q@*V}Xb+i$wB zUG4h%t1qv7aryJlE`55j^Fqfb=g+mbeSG$#GpAcynm;`CLDT#1oqYG5#uE*1zjgf0 zH|k%1?bxeFkG%5oOLd129X#;j{(XD*?0%v4`CZS|?5uvaYR5B`+qZ4q^7K;`o1KnL zbe%t&96wtSg- z>5|2%DT`D}g*;i7v@lVc5RXd4BB6lKC^nC`ua?n?Cs_G$RrO2gEj2w{=CJxp02+KV{%`)+2J&6XZb6U&D))U z+&Lbm*(<%}mCi(!V2Y7pGzI0wS1!h+Aw`B`$C5+TGg!_jAJ1u1L)Uu8di#Y=<*&oD z&Az!l(`z?ph||In*upp`>X+pg;mpx1WK0on{yFE0fbc>u&!XTI$I{8GC&P~Ea|{JH z3yhNtn&tU{Gowy=fL@+Q1cl!FJX*XNj96dquo+5_zpU2~ghOb}0 z4i68nudlbXvVOQjz#yo;Aru4#{`shitc7@bL+#CBf7%kQOjLbQs9>m$PI!2@cDSB4GQ>v*Y-D7l z1Jc#e)zuP7XocPiLb;)}fv1@6IGF?|3@J(*dF2I ziwgZqc~GeKH&WUj$Uq&mTd)pT8>AERO=g?lca*jDKO+JI|B?N~=4UH_!jKF#Z`bOWemO-H?w;&I%?^wit zvEYBiLd`7Nb~|d!ca(WZ)0E}&^<)tmG89^K%gTc$P*bJx*cv2xox^$ zA&8q^p0E&PAn@DGLlJ)?5f&z5U~Xn{%EHhH20L$NZUF*=jn3(V%pfp*Jqyq&Lw%5* z>YqT*zunw7pstagzPY)9g`Te2xo^PpFz`8Zun4Yi4ze)NQ`HfRgH zg9H8azAvA9dp>>q(B0M9(cacdqqe+%_eb+vO4FOyjScm6vo#k-|g-TkQ7qdCb0XJlWBP&tpU(yA4sT+ zCC+8^;+ySZ?%HzCkA-|fcge;3az!Ry`!_M`vduy3hWT|BfWoMaOmrB;ju%X`$ndwXJ+U6$0p`QzXTS0 zbbQB`6;b=&Xl1NTZi??Z2>CD~Ei0*@;X*5a{zt6*&lj`c6*=z{l=b|EXcf8CU9&K5cuU>X$LPF<_7xk67{&D55hC^}xE8m_%3(M4nf!g4SwqpYZ^Fs~jmGP3I z+Om-*?{)D*R%E9A+nBv4ueiG|M)V-SN&NfRpWL;l1*F(Bo zbiGprCAAl(Ui;L#p=NQA9J(-kjbFV-?6B$1!#0g%)&%X*N$To3%JOJ??xklouj@Gr z@fl~SU9TIs%cBMUhXJP>*H>nHin^DwPOoy96YbCB{O;W1^Hvr{erp!o762sGfj0#= zTt^>BA194sWejFVBjsW0V^RCA_>M&@dy~du4xV=sy2b)y)W>m0Q+>zd)a`k0@tQTW z;|ZV^_1p)7boYrw$TVpp>Gay{M6#*miAjRFB4Y9({CL4+is={H7M2>AF_}SCtS|n{uX)o~{p(NQ zfz3?-DNQCtLMedxR$8r?*(_toVE!S0L6h}vpJNtN`h@bwviAqW87wL=R+CLTYK*UF z5u_Hg+caw#>~_$OJ8ZxKYQRb-WTsfJUGJ=G%wbb0t%9&y;Y7 z?{F8nBN!=d-e{E4)7qU@$%{2(c*7;$1mS}A`s8D7BDyERv2=YpD|~5vCcEiw-T3pg zApRUFe|UX1uxN?DP)^l09xDDZTljX7JX5-{)W}`hSf)tnY%<>|AvakxwX#iihvDHy zK-^i^hLv7Nq$GE@rzc!Tz?)1%3f5;w1Y7j6{AIxgld99iTQJ06ck*V+ zgn~`(vQP++$p%QlDdH+jjI>p@xDt&b3AMwh`(pMmxRhPaOssN8wxl8Lt?VHXc5mY| zsSEICg$!ntx|N&26av^)$czTzpUe0-omZ?U#6UWp%ZAg;_R{U5Ok{H8W8v?l1m!rm zRgOX$?yRB>P)r<`vo9b1Uc;Fc@6?f_SWA1a9l=U)mC046!drARSoo_}6bU@j{8T+F zF&LkFa0X6=4hZ+){Z5HX*kiC~_^f1%Ode3ml6GE&O~6^@sVcS7U{Ll$0zU7k+AZ2X zQ`6)-d3nbTTU%`+*pIShUZ^V}EUl8*k4aW9G#p#ot_Ug~@1WyM!nFy z(b|5U&rYK-a<%pLcetyp5NUanphvA8-q4lw=0;D=xSgGT&MO(EF2@aOTRVep+Gh^S zxS|XNGvSzJjAZ~LQsiUJ$nE3qDGnU;E11nE?9rmiYE;_b- zO08dgAp|8BSQ+`*N9&?qLOKgb9QcV@fnt{07?)@7Q;`(j;n6omrkcuD64a>Bl7dAV+@>;R16Y%>$Y`}os(hTUiA^_3Z*%IZ zOs#bRpUlU%yUM;IQW;a=%=Hf6d+d(c7i9(w>z%>gSL$^+h0wwEE_BzcLU#)vla2Lm zjBHi5F=giRZvF?HO;yf`f1Mm1o%={gs>%zi%Gv)b{}ZvR>gBHvbJn-{J=wBhB%!g^ zynQCWmn8e}zT~_4D-8pXqI=cFKGyyh@fQplTdPaMI~T5R@cYtOoq*uo4EF;Ybec^~ zY4l<$4YJW6bwj2q-#W04Fa-p**3{H?E(YD+7#x)~gqgcb1SD(>&Dzw~_jNAaJQ+14 z1mYTJtdZfoi9?*O+Be)S{Oui4BLF!v#s9`KKz(#n+Lqj`)WwW3-W-!pCcjg&VZ~qF z99Qlpw-|P@k}jMEaF~>xyG+?BnVXa9wsmceUF_6`%_&fFU5Ag&O2**kG^D$(>)Jgm zA^FaXsa*YsSew(O=OBG$d58{ zwvFRT-MkiK0gI5_IH_j4-gZ^MCU!SY8+NaEU3e;S7}z*wV$1)ODOe@hzMgmN=C?&& zUoA;~&G50^7#I|+#ogZmK(jGF@C00n+#6=B?dJFaA&+MJhMm^EIc+Rl|B(DO`yt8LLUhYV)ul0!;3UkjyeyC zGIxrCp`+l$sEgz%D|(a-FUkxKFi;kUNJn2mM>`RtoypNI^yus8D0|}FUwF};PBGr- z7++$HA2HGm9qG@D3095`fyDaIV;tbIXku&xIra`IGSEpJ01(GQa8XXU7&Hz?#Kn_w zcseeLha)J*r9k2yJH@4<gois~KnkOeQ=t)bwqzO{|K0AN}K%9wA z<`I+mb{bmUKcqz}))c5uC(7v?)v4a2P)ZNa- z@$&T2)z|&~{r~^}A^8LV00000EC2ui01yBW000GQ;3tk`X`bk)Wk@<6#nZYULKH{p zEx|?+kif!I0vIL|#ZMubBmjWH2OtmxIFVa~6JQ7!1CK!f5W#StOTv&C3=E8h2vI1s n+#cd5;2fT3B_0kF0v!+!GARoV78n&7dMN`JIW(4+BOw4gP{MS* literal 0 HcmV?d00001 diff --git a/themes/xe_solid_enterprise/modules/message/images/signPanel_input_bg.gif b/themes/xe_solid_enterprise/modules/message/images/signPanel_input_bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..cd97a9dca6a5f632ab8320f19e5d2636dabba331 GIT binary patch literal 1855 zcmb_cX;>3i6b-B3QbcTBSR6*%qC#dSB!mo5flQ*Hp^8|wt|1vDLNe)OkVvalam58% zTkBE;5!@98L<=e)qAV^fWk*C2*#%?~Wb1?i@}r->I^TRVZ#n1Qd)~eGEp!vw^Tc-< zQy7H|Mo&*qetv#SOG|5OYkPZpXJ=j ziyIpo-@bj@+}vDLR8(16SzTRSTU%RDP*77-Q&(44UtizW*4EV2^#1+(j*gCjfr0-1 z{tq8M^!4@S=H?C#4l@4l$8vDOD$!B^6H{XP@3=s%6ifVY3h>4^$rMgtOL7Vb$fQo- zN{$E?DfzgsY*7%2FAwtYk_7olcv5h|H-MuWRm+ufoDu_SxxYe%s+~Zwl<>w;daPN7 zKwt<$`8k0unhikXlTVO1z+u8R64(v_?AT0%4fEJMYk&nKFodumm}`T;D2I!}2r&GB zv^P@fgL-1ZVPEvj3G}5XB?>`-fq~3GTP8tnf)E~$2f-|e#j>FhHma=(O02d~sAi8? zz;Km>lqo40p#U@%#oj~!@luB?MMS0)_{t{q#sUaQ7HCT z;X@lD5sDF#06DIp+%PAQhBBoxDasdc*(^Ta4r95p5kvsnb1{J{k0o?*5pskui#Nh` zQ>ZAhLV}NQWgoemPjXQ{iHj+M^dboVkz!ctOHhQ$mrw%yKChvrrhOUqBK-5k5W+fE@59>8O0y%>{s!GKG`~RB6&pi_^%( zN!b=$DkKRxFm&>$Y>bG209paY7qA6fo>1t@#{@8f@LV`B-(JYE6~JsR2et)=iPAAA zH$-IdY&jTaC$MGlU51FRLc|3_XgUXj1$MR|M27)s%4|&8jV#f%tQn3r5j`1gLtH^; zjij4QYjB{yulGYw_xrBSj`nwLtu1exn;IMH>uTTBysm!rvg$?U^NRAa(vsq$!oLgh z^Kzd(eeyUbJ1g_i!;A;%_tR2S?%lnUob=c2TZuOl;^S^ykG*#F%H>NJFPuLY6MZ)7 zOk~9A@IOzTJaPPwW554)^w(d)LXR9ibTH(={(XD*><-?wbH~ryxBc{E&{lQemHdoEl0t%qpIVt2Pi3xxuV@9N^b z;2S4L2b5>ewd1gDS#*OlZLH_dn``y;S6|MV4O#-TEX>VJXU>>D?TgQ+noKdCZ1mZr zi4(>f8jRD|)78<|VlXUwbcZfKYt2`4`!e(gosA@z^~})BXfn$mjmW(~xo<TlyHBoD=09 z?tb%9;pJ8Fo1bUjyj&c+G2Np-jM54Y5;-{PwYgj=zoo3s4(~nYZxHVr?i!PGEA~ao zj+n9xQ=qvlai_`r^^ev5rST?`r&7O!xSE{fwtk6+yy|m8rmYCE5G5tl7eueVe^d=^ z*uQO(Bd0f+G7!IXH4$GxD4{#wk1%Wo{MH8vErj4K$p`5}%LmOxZO-h?eWz*G(&Z9WN zdtNB$baPW=UYj^Jhucs$-JH`MPBy{&LZ{OmEM?&QV?V!Ne#v({&-=d5`@L@_r4mY% zbORwkGXR`BcfP5q*;c{Mnd|QC?8?c_U$V63`0*1*j%v-4m3jPY1OmOLE`j2`(FHETdSkm@2inSq=ItgdRTA6DYGS|%1&ig zrDYkb%8aN9nlK(rc4027%}TK(=(3j64$P&3NE1^`VcguiEr!5e2wSFtG~NTy>l0_} z6et(LiAGp~fC`xik-?}8O#me@0*eue7*0w=U`(Eb!3fwlAkLfJRDv0_M4vBirGm^X zYs19i%F0SnrBuY&OT`F^qGDJgmPisgM51Fh&62J}+7Z)lK}$J|c8iU*Ff{13NES0r zRt0g9{wu+1GgwN^tmBDs+9B!{B{DKrv5T~c5fLo5_hP*I`dNDYvl&+F6SRXhQ2z!0 zzxEwjvu%{vKsgwv-AHlpn5SGl+mRR8rvcNG_A-jQMS?7MP`w9wJ*H)hPAf&Tsah4p zK}9Bu2~(g5jGz;7tyCjJ5FMcScFTgO9I152p0=j&_5GdMF^|E{p@gTnlYtDjnYI=EQmBQg+KM%0$>1E7+TP%<_~7r;}5l z#dR`W5=szU0(3Bfpc*-hD+#$&2g{P=uoUVenx4vBFHwR@R5Z};zY z-@SAD*3BE&uU)-zxvTTiufKF${Q1I9KmPFj`E%c${r1c^U!Okp)t4tv9B=>P^Usd8 zeR}khk6S-F(sKC24-OqXuz%nC&3l{n?0)avUGKcTbH`iTw>36w-BQ1K)5ZGC@-s7y=Tm_QA3nd6w1Z^%9{3K&-|534F>sCI@EDfjY~{FUwl^)p-eM&i)#uC|<`OwgkpVZv-^SC{^Llz=Ep z2#Aj*LV}8d3&L}T_z1MTRG^GX(#R_Ufk8rDT~x?`SYchsiiLvupa42#p^$Q=r~;ck zeB9T6mXIeuh|dk$6@v5X%Zqrt0mTj^k6nPcT$O^Yq8 zCo^T}-r#y(ZT&Bg@=iz3^Nren|IYQw20!Qxq5Y))*A1r$<8vc3lxPRvH~o~k=*H_i zPDHAz=+ISeeojh2T<1w!fP-)=qsq>Bx-as>jN_d5H>hQc1Y62=UFfye6$ZU&<7jww z^T$hkK93wYH9L$dd^hpng(-EqT0>Jzboh(;ffp~>==j!}nnk;R&z zy>mJ_W_6)6EG*{Cz)OEO49JhG!bur^+% z7I}1+WtXYlWu+C!P286f-H_Z6uq!V3W@C{*`q=x-XXd?m-|z4D`@Y}r_tqyGGz1+W z36(TUBtt_(6B85t{ry!{Rh5;M6YkUFZclxEeM3V-OG`^fM@M&ecUxOqZ(mz^xE}O%~2sGld<=J`CrA28oo5hfDF8;<)#0L>_wWvHjCzk6y{v;|7o93 zD{wGa3d6Hb&cr}?_#9W~cO(L5G>}G`%Vl5|4RjvQ_%@72QqP*4HpVU_>a{3@O3hX? zsnW=CN(MA~+yHPq0qB6npw|#;pd#WawO--pCfa#{wwo9~*LsetJ};M~IEEHjE{$dL z{Kb%LVFi}AunvSuRUlC~JXn_u05y)o#BcJ?q&6u|09YJAjo~;3a1zK!0N{g|oC2Gj zy&AD0SsaYYk{OL4=~la$&F95*Lvf;9hO=&A%m$9NA-;olt>BrlQmejln=r z`UI$-&?y0>F(~B;K%rIwIXXi$&pA0Ckx-~9g+?Y<$SIwV7;nIJdK}V~dXS)!qZkYW z6U%H)+4+CLS{A3XO#~OSZOGVR);QQ?^QNb~XC_a3+!Nzt|BQ|d4-F3V_w}CoyQllF zKmYjsw_kth`nmJuiH`QR)|Td`#)kU3pK5EWt12tX%Z`_p{P@H7$BusY?Kelh{_4vw zKL6~~Pd+|;=-@{OKK$VQ_uk$A&fELmdh?CfUwieHmtWeuXZNlbi(hzt=X1|K^Yo6V zwmm&-U}72DDH*Z;=+a9Exon^;+L~m`Ug)Rzb8+=_5R-X{k`LxQz?Zwxqz5XtRaX^ z*`dL~!Hu1L0|NtneSNL1t!-^>*=%<6maYB${XIQBot>S%y}eysT|+}d-QC?C9UblM z?Zd;v#Qz&b+a@iDRRK|UWIUIZXOgngh#XLd8Z;wJcCT7Z0!dEX=zkAl`NkH$})ULPwL2#K}K&fY(5hvW!0=hJYKuUGzoGdPGgvixEH{+DVP=l zehPXN7+^raM=?Ig`M46mLI%dOj{nBew7^OeP#B$UWSc2V zL0G(ajH&Srxq>4c_?T=pBAi7@Zn9DCA{OICQ%UK_a4N+xiA5<@Q~6LJD2BX|h{#Bg zVWKePm4s*jGJ%j7mHeEL$5tA)BO40JW3}yAZd@!cSV(qEtHv~&^2Jbd}1v;p+uvdviGXbd8 z4Ao5AZn`l!moBoj#YmMbQwO=o^V%2^sg%or4G2MBNRl`~jAH&=#1Dm#7zi#;D=bwK3VSU^8-+lYd z*I#}4#k$Ww`}C8KKl<>4_uqSW?K^L;d8_r!H&(y?+N-NxdHJOmUwHnxXPZejyew{T%2RU8(KBZpb>tC;7n4O``eD-! zJ>=kn4xD8_&)!q^+H;S|lXl;2;;y?)DBO9c0)i+SF3de?CGOvS9f=83R}?K> bzM*jKvMG~Smd#sNQZ;S;{34=aB2oG;ILqR^ literal 0 HcmV?d00001 diff --git a/themes/xe_solid_enterprise/modules/message/images/title_bg_right.gif b/themes/xe_solid_enterprise/modules/message/images/title_bg_right.gif new file mode 100644 index 0000000000000000000000000000000000000000..36520336085ed32c5a118c9bc2a277e63140af69 GIT binary patch literal 1539 zcmaJ>d0Z4_7+yfs6w1=PvK)paO?Ky-*>gq~UG@;FHA6~Ew;FZ_c7om6W@cf*4lB#b zEV8nL?)$JiJG8Qr<%YN~HM$gp<(6ev1f1Pis%*eB9GFG(6%T931TI>?|%WZfI!e@9*#F=@}Xt8a+Se^N$V>508wD z6crUUH#fJpw>LI6j*X3<>FVnA43w6Zy4}UK^-UEO6{k*jwzajjwzf7kHPzSG*VWaP zm6g>sG?$c=R99EK-R_BriI$cYpZ{ECWo2z`ZAV8(d3kwNRh9qT=-C-K85D({n2Gt@jGG}H$&wsWx|3p$E3v$TV!89NlPNTxGRUJVP8{wKlaNToBaJU3o$IEF*|LPolnuJVF4s1PsLIH40hieQ{ zeTbW4=Xla?rb1l$A~$J9E}>;9l4sa7hRF^U!)7bPGn|!iK-w)bXf-MvtP2A`iK0T{ zw}(a&n*_yyP#i#speO=R0$>CH!V8(5Jd=^J4zfY%tPqvev<8B<(sm1z%LURchzrQ2 zSUQKY7+A&z1y7!!r-^Vn1qCWhp;gLM1_Q3u=>`3`Mh>(pgIuZyGNl|y;Yp%p+Q|ip zxJ;>)sW7Qbs?`LENd{D-Lj}5A2lNUlj0j;Mfijy`cA+JqmIK47CK4u7ZAjULtg%9q zg-wi)ogY2t_lQJ6y77jTvn zzTmP;qod}}yJYU1*^#p%!ox(O82_x`r4=9e25w)`?3@iLk@|%#QH3j_Gj~SrP_4); z*qbBT-RdbiPRE`sIaYtDHO{mrqSh3jcrq!hVV^r~clTx{=P`RLR_MB~N=fY`Amn{y97Da^NQM2&qsBoEVQFxq2wC)1= CZ*6V> literal 0 HcmV?d00001 diff --git a/themes/xe_solid_enterprise/modules/message/images/title_item_vr.gif b/themes/xe_solid_enterprise/modules/message/images/title_item_vr.gif new file mode 100644 index 0000000000000000000000000000000000000000..ee5485b2cd213cfbcc1c6d466ba52aa69254a672 GIT binary patch literal 1266 zcmaJ>cYNDK6n5J%OIc-veNh-G#L}HC*_IMFIFi)_a0yNzg;GG4F0pVlkmTA4n?l)p zZz!XzvS$mFJqm@gSIXW2$|hl%lZn&((O>k_PrC7a@4fHddpE0Hi3{rFP;F>YC^S4g zJTx>kGBUDyaIjo1hpJCqdFq^W2ar`?CI9A@lA~&Q?1L=sHLL`+X4!HI73k zNH}M-4Y;^-V0M=_kkwFs#8S0#S}e927XA5wH+J2C)o`g%K3_mM)3gj9bA3`l_sSdSZrYj-fq2gVzSXPWxV0zk`_! z_UwYIVFIro=W1d{0dQ1fB*UWuRlkI|M>m4Uw`@erytk+@cnl~-+uG;S6_bd`DdSg^6^I>t{(j0 z{rBE|=k2%NeB<@kR=xVl%9meS@!|{5Klki2Pe1kK6U!fe?9pXQA9?tp2OqfqzI*Sv z`>s2e+;RJDx8Ab&=9_N3VbS&1U3<;dS6z9<<(FN0$;B64c)|JSoqNvNXPtS*>8G8# z@RXAmoOI#|#~*j>F-H&dmx}WXzULn0*p}IsKhntc_F!Ghsz)4t*t|pM9&+%U?t>2O z>dYL_vH$G!e*5mz-ZqO=jntalyJcpgxk(h_u_(_)SkmBhxN)yNXEf}w`)<3|Q*~gM zop;)ChwZnk-FBO;x0=4?7MpLj>9kFzZoJWk8?3)x&6LTLLZP~mn#!fs7<_|UEi`3X U!_rl-W<}fLCAAAzP7gKx2Yhk4LI3~& literal 0 HcmV?d00001 diff --git a/themes/xe_solid_enterprise/modules/message/images/title_on_left.gif b/themes/xe_solid_enterprise/modules/message/images/title_on_left.gif new file mode 100644 index 0000000000000000000000000000000000000000..e54f5187d539c723afdcc730e371720a1a85ee98 GIT binary patch literal 1162 zcmZ?wbhEHbWM+_H*v!DNdGqEMFJ5fixN*gb<=eJxJ#gT_&!0b+FJFG-$dUQ;=Pg~j zWY3=6J9q9_uweeeg$wrX-J|%QJHj_W!6mUI5lGwER}>^BXQ!4ZB&DWj=GiK}-@RW+ zAv48RDcsc8z_-9TH6zobswg$M$}c3jDm&RSMakYy!KT8hBDWwnwIorYA~z?m*s8)- zDKRBKDb)(d1_|pcDS(xfWZNn^f+Q3`b~@)5r7D=}8R#Y(m>DXVndljs7+9KE>L?f) z7#ips8tEID>lzwZnVMS}7%D)46417ylr*a#7dNO~K%T8qMoCG5mA-y?dAVM>v0i>r zy1t>MrKP@sk-m|UE>MMTab;dfVufyAu`telHd6HD@oLh|!-V4)b0kzbNuoRMFk;2dnKXQ&XKnU|7ZUJO?6 z>ucqiS6q^qmz?V9Vygr+K`%2i#mdRV(b37sz|FnJ0o7b;izIguZ>66Eg9zM8#@9v%3w{G6Je(ma&%a<-*IDhW!nbW6Eo;ZH& z=#j&R4j$OQZ||PnyLRr_zHRH4&6_rESif%Vn$@dTu2{Zo>5|2Z7A}}SZ|F(<6Xm4w6X>Mw4sIRN7sjjN5C@(85DK083$j{5o$m zNlr>kh>weniH?el2oDPl2@VPj@b~le@%HlcaCdWcadvWau(z|dv9_|bFgG(bF*X8b zDLq{sZ7od=bv0ELWhF%gc{y1bX(>qwaWPR5VIe^Qem-6vZZ1v^b~aWPW+p}k2F0H& t3?QHbB0%K}1B>*91;HYoZ?=BD^LjpeUy|fJm8`zm(-@hBIs8}{tO3KFsa600 literal 0 HcmV?d00001 diff --git a/themes/xe_solid_enterprise/modules/message/images/title_on_right.gif b/themes/xe_solid_enterprise/modules/message/images/title_on_right.gif new file mode 100644 index 0000000000000000000000000000000000000000..58c03997f9b3674015cca190233393f31868cdeb GIT binary patch literal 1348 zcmZ?wbhEHbyu~2FaD;(j&z{{27R;YNf8NfWJC-kBwrJ6!ZQHhP+O+A&kt08U{@k%+ z`^JqMmo8oM;>8P~q7^HaA2_go;lc%b_wHdJ4k-TTj_?goa7ipl1kyJ46$OdO*{LN8 zNvY|XdA3ULckfqH$V{%1*XSQL?vFu&J=B$SufC zElE_U$j!+swyLmIN=(U5O0@#ALBje<3ScEA*|tiKAPEJKozD41sS2ig2D-@xW`+u8 zCVGY@29_q4ItoSxh6ehEM*0Tkx`qZ;rsh@#h6+%i1hlOvCCw_x#SLl~kY}ruQBqQ1 zrLSLJUanVete0Puu5V~*X{m2uq;F)T3sj+7T$xvrSfQI&tPC^3CAB!YD6^m>Ge1uO zWMX1cerbuV640d(FXR@$jm<081A9j=IX_pwBC$Z$5%`T}$nPsUdZbkXI3Sci= zW#V>=6HfD>dQ)(_#TlnweV}9XK@p1-(J&!k>H#s~$ri|gC;ZerU}`S{CTqt3|Nj2@ z{p;tC@87({PcxqRv3h4bgm zo;iK$#u35cm<%;FYmM&SmXyJnS z^XAT(J!|HS>C>i8nLKIYg#NzXp6;&Bj`p_Jmgc6$hWfhNn(C^`it@73lH#Jmg8aPP zob0U3jP$hBl;otug!s7FnCPg;i14t`kl>)e0DnJUA8#*D4|g|L7iT9&2YWkP8*3{| z3v)A56JsM_meSMJ(bm$`P*+n`QC3n^ke8E{k(QE_5El~_5f%~@;OFDz;pXDxU}s}x zVP;}vU{L(Y0xm>!KqROJ6KVH*MLT&A_;0Pbo8_&E7*hnfcin%}$;=edg@B^F}AQc@-I~0eVIG;s5{u literal 0 HcmV?d00001 diff --git a/themes/xe_solid_enterprise/modules/message/images/topbar_vr.gif b/themes/xe_solid_enterprise/modules/message/images/topbar_vr.gif new file mode 100644 index 0000000000000000000000000000000000000000..47c3619aff9ef5b1e1f55bc62499e25ff268ab8d GIT binary patch literal 1238 zcmaJ>cYNDK6js_Y!`_>#!e}9u?lde*i5ncrZUeXkCy+uZAWN56I2uTDt%Ox**)64I z@4fdP1BjfH_r81Y-PDd;O4b{wMrsa44Gj%Z6g6>0 zfjRi?@_uHVNZS(aJI zu^g8mh(s{pgnE>4f~L9!4F`sAd7Yyk&u#Wyg4H;r;Nwxbw0tU<}^ zei@T2=Jfsm*EaHbMRSdcjh(PVOVb3(n3k!C86Jv4drISwgisdBDG`y01`*;pL6qv; z4krk8$G~;2wTdf^$yHPz>!Is+yKaBI7&=RC=msU%18SE5CLwaL5eFd&fFyoqeZ<%d zk|8M$D6t5!5GjyTAS5p^Dxurk+X8G*^hs2uS(5?iu^iK_264KHxL7Xst=ZVj`K}FW zC$CteL{ut7ft*bVnkw?SjH+dcWH}>3HI);$CO^O+sC1J2}nT;yD`Vy(-csSBTWHQo**dbZ-Ns~3K`0w9;{{CzEpMU)R z+poX;{L_!ie)#^oZ@>Bat1rL!{IgF#`S_y`KY0JWci(w?=&d*3c>T3kUwQeZ7hib( zxo4kw`l%J+PA9;A`Lk~W%Yz2@qxuDs&% z%Pzg-;)^c4;QaH>J?HGR&OBrBqSF_iwqX9Lr<{D!i6GkW&lue+Y1)d`f&Lo<5-)-`wU3b}erzUzL*l~yLx7&7`t+(28i_JINbd!xY t+HiyQ*K1sNowe6mbBzh($2E|fYWW0mUr|(Z{E6={YTWpF3p=Tn{{iqyr`Z4i literal 0 HcmV?d00001 diff --git a/themes/xe_solid_enterprise/modules/message/message.css b/themes/xe_solid_enterprise/modules/message/message.css new file mode 100644 index 000000000..cb0e96609 --- /dev/null +++ b/themes/xe_solid_enterprise/modules/message/message.css @@ -0,0 +1,30 @@ +@charset "utf-8"; + +.sys_message {width:318px;text-align:left;margin:20px auto 2px auto;font-weight:bold;font-size:14px;color:#555;} +fieldset {margin:0;padding:0;border:0 none;} +.signPanel {width:318px; height:191px; margin:10px auto; background: url(images/login_panel_bg.gif) no-repeat top left;} +.signPanel .left {width:192px;height:138px;padding:18px 0 0 23px; _padding-top:28px;_height:128px;float:left;} +.signPanel .right {width:100px;height:111px;padding-top:45px;float:right;} +.signPanel .left .tInBox {width:185px;height:18px;padding:0 0 0 4px;background:url(images/signPanel_input_bg.gif) no-repeat top left;} +.signPanel .left .tInBox img {padding-top:3px;} +.signPanel .left .tInBox input {width:160px;padding-left:5px;height:18px;border:0 none;background:none;font-size:12px;} +.signPanel .left label {display:block;margin:10px 0 1px 0;font-size: 0.75em;} +.signPanel .left label input {margin:0 7px 0 0;padding:0;vertical-align: middle;} +.signPanel .left .lb_chk {margin-top:15px;_margin:0;padding:0;} +.signPanel .bottom_bar {width:245px;text-align:center;padding:9px 0 0 73px;float:left;border-top:#e1e1e1 solid 1px;} +.signPanel .bottom_bar a {dispaly:block;padding-left:10px;float:left;text-decoration:none;color:#757575;} +.signPanel .bottom_bar a.vr {padding-right:10px;border-right:#a8a8a8 solid 1px;} + +.oSignPanel .openLeft {width:192px;height:126px;padding:30px 0 0 12px;float:left;} +.oSignPanel .openLeft .tInBox {width:185px;height:18px;padding:0 0 0 4px;margin-top:30px;background:url(images/signPanel_input_bg.gif) no-repeat top left;} +.oSignPanel .openLeft .tInBox img {padding-top:3px;} +.oSignPanel .openLeft .tInBox input {width:160px;padding-left:5px;height:18px;border:0 none;background:none;} +.oSignPanel .openLeft label {display:block;margin:10px 0 3px 0;} +.oSignPanel .openLeft label input {margin:0 7px 0 0;padding:0;} +.oSignPanel .openLeft .lb_chk {margin-top:10px;_margin:0;padding:0;} + +.oSignPanel {width:318px; height:191px; margin:10px auto; background: url(images/login_panel_bg.gif) no-repeat top left;} +.oSignPanel .right {width:100px;height:111px;padding-top:45px;float:right;} +.oSignPanel .bottom_bar {width:245px;text-align:center;padding:9px 0 0 73px;float:left;border-top:#e1e1e1 solid 1px;} +.oSignPanel .bottom_bar a {dispaly:block;padding-left:10px;float:left;text-decoration:none;color:#757575;} +.oSignPanel .bottom_bar a.vr {padding-right:10px;border-right:#a8a8a8 solid 1px;} diff --git a/themes/xe_solid_enterprise/modules/message/message.js b/themes/xe_solid_enterprise/modules/message/message.js new file mode 100644 index 000000000..8523b8ec3 --- /dev/null +++ b/themes/xe_solid_enterprise/modules/message/message.js @@ -0,0 +1,38 @@ +/* 로그인 후 */ +function completeMessageLogin(ret_obj, response_tags, params, fo_obj) { + var url = current_url.setQuery('act',''); + location.href = url; +} + +/* 오픈아이디 로그인 후 */ +function completeMessageOpenIDLogin(ret_obj, response_tags) { + var redirect_url = ret_obj['redirect_url']; + location.href = redirect_url; +} + +function doLogin(o,filter){ + jQuery('input.inputText',o).each(function(){ + var t = jQuery(this); + if(t.attr('title').length>0 && t.attr('title') == t.val()) t.val(''); + }); + procFilter(o,filter); + initLoginTitleMsg(); + return false; +} + + +function initLoginTitleMsg(){ + jQuery('.gLogin, .mLogin').find('input.inputText').focus(function(){ + var t = jQuery(this); + if(t.attr('title').length>0 && t.attr('title')==t.val()) t.val(''); + }).blur(function(){ + var t = jQuery(this); + if(t.attr('title').length>0 && t.val()=='') t.val(t.attr('title')); + }).focus().blur(); +} + +jQuery(function(){ + initLoginTitleMsg(); +}); + + diff --git a/themes/xe_solid_enterprise/modules/message/skin.xml b/themes/xe_solid_enterprise/modules/message/skin.xml new file mode 100644 index 000000000..6a7090667 --- /dev/null +++ b/themes/xe_solid_enterprise/modules/message/skin.xml @@ -0,0 +1,36 @@ + + + XE 기업 테마 메세지 모듈 스킨n + XE Solid Enterprise Message Skin + XE标准企业信息皮肤 + + + The XE Solid Enterprise skin for message module. + NHN (developers@xpressengine.com) + + + The XE Solid Enterprise skin for message module. + NHN (developers@xpressengine.com) + + + XE标准企业信息模块皮肤。 + NHN (developers@xpressengine.com) + + + 0.1 + 2011-09-26 + + + NHN + NHN + NHN + + + + + default + default + 默认 + + + diff --git a/themes/xe_solid_enterprise/modules/message/system_message.html b/themes/xe_solid_enterprise/modules/message/system_message.html new file mode 100644 index 000000000..dfd88385f --- /dev/null +++ b/themes/xe_solid_enterprise/modules/message/system_message.html @@ -0,0 +1,64 @@ + + +

                                                          + +

                                                          {$system_message}

                                                          + + + + + +
                                                          +
                                                          + +
                                                          +
                                                          +
                                                          + +
                                                          + +
                                                          + +
                                                          +
                                                          + +
                                                          + +
                                                          +
                                                          +
                                                          + + +
                                                          + + + +
                                                          +
                                                          +
                                                          +
                                                          +
                                                          +
                                                          +
                                                          + + +
                                                          +
                                                          +
                                                          + +
                                                          + + + + + +
                                                          diff --git a/themes/xe_solid_enterprise/modules/message/thumbnail.png b/themes/xe_solid_enterprise/modules/message/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..595cb3b25dafa40e6d64b0d07886d7b76fe58d9f GIT binary patch literal 9574 zcmaKSbyQW|);=X5jUXk+@qmPMcO!iO0cj);d5S)CNec+bQCdJiTABk$rwB+&cXx-> z$9uo~-tYeLdw+Y3y=px3nRBf<_ZoYwH6yh(m5B-H2rw`(h*eb-b?)n``!^UL>%O#j z=RS5{(Yn1fbkl{~x_MfrtOK^R@pA43OJZPP10D1X-3&n*;?{5| zx8+|LZX^_OFO7jADT727sSm;3i!W98G^I{ z3UC)NK!}@{%bHi14BM!;T7TH;}sVY5$ELt{QCjkYjd%& z71vQz`nRt8o)pmD%?%;W!{h1c$?Yk?4R^8Q;S&=RHkgviueyL%=O>PbiZIcNJ|6{A2;t`Q~DbS z0{#D?Q0RZqu5LQu|Fif1N$jfUg#h#DfL-D4F4p&svt{~A6+&FW1#IaCchQ5xA%Cx; zwmsYp?rIN502FkExcLAE4lomi(M~VYkPtqHTIGSqD zUz5k+hROzGU>lxqXoqfa}ptgB`B?R8;b) zWpQYPBo>-J$2G9u?DLMHKF-AF1ivN7Ik!$<&)xHyui~R^_qqY$2Hy2IB6nv?IidbP zv^HBs>aL-MvBJw>b~N@4^OgDC zu}J2eAZHuN^k}&B&3eG~dfbc0#Lu4Ki``+5>;GQk@x6JSXIjlylg?ALI+Fx%N_oSD z)wd8$le#*y^z+&gB*3SH0=Fmiu-t|4{8pPpPfjKjlE0az!mYx11SQ0O7EI42a<}Ny ze0eh68lP2kcgC}C#$faf-*C}7%4#>Bkn!%1$UZ37b;SkA{8rMr!n^}|9+X=UAruCm z;SIQM3@pkFxNcpc(^;B1`nk}#O@S$Ar9f`Pb5O9HehXw(KAAb%m%cU_LmAg!`RF!w z;xZS%xjDLdEp^}vKVBX57l8{m`_@ZTiVjAX+XLUfNfQiR*)B^@zuB9Yd1`#s%j5sF zjBA#rkE9V1Ci1b&luk+hx+A(wdOoqv<1kv?b6DnTH9%q-)_fk|f3+JrIA-bz^Ut=& zdlRti+n6JfM2kLXy|OM?Gi2_#y1u#bv&`HmKl{v#r}2F(IeBe){cCP(B+&Rt!@+5K z_4pc&LNw5Nu3jL>$Zumwfci} zT`##*nwC82uEL0g{4)i zRe{U%R1UpwT$m)!`Ly+qOQcG&Gro)4x}BzH5hij_ynM_@L>#A(iCk5tN`RZ)UdP(v z8f!J*tf7BioKxGO1ccB9X#yuY^_&21x3%jh@l|pMOGDD+Hwt%T17CB4gV5SNW%_EU zn3tVeA;j5}37o$y2*ib7CqYE?ju{k{Nb%$kMhV-u00Bcx7mX)V4`c?ywP9 zn#!~c9EuYN&wAWQavcCw1%yF5oa>k?h$(u({z$BD{uWDpGGxYRVMMSj{{Xv&01*%3 z3nzI~mopA65tB+b+Yu$y1pi?$&c_{^`qPa=idqpxK1xlk!6_ZK$H%KwYp>Ndw=@Cm zD~5p&I}t?kR2D(NP(muu z&vCw&(CV9+%;qrxpVO@mlRx<`Lsv}!qvO*_Dq8bKJ;t-$adhazWVFs*0jAy$|MS+@ zF|R)!+e$|14|A{-HIB}AS=vlxEM76!zi0>ynLCp#up91sARdjsH{dAXPN?r?UL~!^?RXk$L)u-1vCc}^Bi6B8>o&nTnADKpdi`sZmIyqt{QBW$f|-dkR2rp4g-p)~1u z0`q}C)LxLEIv3~CejN%t-9Svxcf7OdsJTU%FwOg(T~5iDPfX4arU>~HQ?DP_p>uNt zSX5nftBCm~1A)i%F>IU>*)O+qM7SrOn|qf`crTp>X4Y!7FSll4;Z;DRmf{*u{zRX# zj;M1KEb}zF<=Gvr70S@;ZOV9^LG1M8Yf&6hgQr(lj(Wesp#o&;P1noEVP^ESv}Q&e z?hG==ZJSJ34*jwrR^n+2(T7w8Zg^bm=VLe1_3yoHZCTDTxNF_p&D@(fL_CX?p6E9FMQRj>=c~jDH#^3l zTCR?XNh-4{p0_#8b#891Rlx@hW|CpRtkGJatObo6*#fj^Z0qF2O^|MPV+ApyaZq68VFlT4-6OM>}H}P~07AXXT0AGkRx?yQ0 z@ExM=_7-Y<>g>rY=v-Izb3zp%{dld%N z@~@)i;fYWEQ`1Za>1Jt&yOUfyaXs>crN52Vb|q~1H9n{n(S5KtC?5Tw?v=0C_Wn5= zSfmUEX784Se7MHT(l?c%otNP`Gv)AU#=TtAeab?&uEmt-Z~uNg&MbGQ^xaI{+l$5D z!jtp^M;)^!jA?S-ncf5OpRa_mNy_s_*u(-`{hJw2NGA3z>Jxh2QV153V(lWEPmu{e zXjvDu*SFmkY{U)VJO{M!b$LH){Y5RF#Q1mC!Dy^OoiAk{V4u!r7s4woqGzjxexsZ5 zdIlWRDxnlc=bp-eGyUYv^n;dt9_i%@A@M%J7Tmh6QG?V3PRSaQPf5euL*-jnzYnfs zf2JXc%*MBysTMq!r@)=6SX`%k85HMc79O{i*JWlvrF3+gP{WuF1J~ly^nW&GF%#Id z(bd5ia9ODQWemzSl%o_QFiL^75+dlGjPhbsC>*EaGcj6NXv|8&l5~I#j+X zA=W;xkTs9%{O`6q;RUCO`DpVn@dWF4-S{2dGua9_T-|*#j(I-wIl)? zg&hZ`E-o%U5rH)x4@mTbKt-EXiY-im0Ox?q((BKA4aSFnV2jviQF&$N^)7a;>mL&s zSO=s7I!YgN;4+ZnvD2-)I;CMOp!jqujbb1*Z33K3!SJ%oxRxM4C|7|BV2n1sEyI6FzEoo>t-bt?P z=i(|As$A@zYnGo3Km=x5(drtMYEiBxO8v3R^!xomXSiMDh-xfg=|j1&yDN7pM9QUD zieDI6tr2~QLPfkYYW-;58T8F5K?9GwIBE{qAIYA(?rVmt zb{VBB4wIxF2K}bMv&8W6@mXJA-=CpXXL+=!a`9u8!`0O_3vsa28GX|ocXzcfgW(Zy zI`*4^0ji)7GPyG~f3rJ}_9)`K>e_qf=W{sS)YP=!+-zDhe*35F_K`H!^eXIqNohBu zRvNZMgo5ybS#9tTGA;k78q5I+VK;we{Of1>VbY^D6D<3!trA~O)71xKoZykp#pxWs zvTO33BxFvQsF;MmtHZYh9!IG1FS>ECIi-4bOo_rK#d5zU!PiIH6ll}Ett5_kL&^@- z*RSpD)|uirc>Hgpr)!muFMS26ypH=tc+8p_tLpSbR$2g|@H`z5{QK#+GNWIbX8vJN z$;lqO?aN|Z2yFzl?_u7Y=iLgpG@%!z=2*=uRu1^`=vA|JTH2sNvAtcwu#jK>7f$HP z+OEs1C-vUdrgEGKCQ~L4xSB=Hh(g8N{51t~&(1QC+E~%szkE0roQUGynKIHtpiUq= zex`ON-YW2tFZ>?u%S=uk$D=}~|CO&mqIYS^z z6Xi{@u_UZtdulwZ=IYq}FIPWCt49Z1pTz|)zUTZQB_)M;{E2-`?fKY@@7d0zBJkCV zkFAuUPLDhHcgpMKu4qDM`7*7aZ0@yWO5ApBL)d5^MjXr) zv8){Hu5A0M_|b;AIPZJ>;YIEI6w$&E^Q(z1&XyT=K7pf3A2LK4@WAIgVvlo(IJ zr+`23&CI8#FAWX)-9Wa`U%Jyv!D?(`{9^2d##bButZ_kKT#zP6HG$|wUPFgzD+lbO|=|{--td{Bm!+Q1I*Hi#}pkp)fg2Jb?V1?=o@s^LPx* zT%CslB6+ec&+B2M>yR6!b7f({KDnZ#^!P;}WnL3o)Iolsz8LC(6oFk&kj@2dxP zrLOv>uby`3P*a?1w28aw{V@E-r52n4=(FsI{jEo0iMy zi0ejJkG9#`egjCq%%oM*>exT#R>3Ctl^$9Lvv+8GYD?cX82_0A`_(x@t6HvbyFS%< zw@YjWLf9_o83Wp-rT27IIWNPoigV(CG2+)!1>uM@Ky^k08w1Ec<(rlLiY=NKrPDWq zh#va{farJdU4HK%uW<|J_gU3Cj8sYu?!5S|Lo7ATK1-y^<>7|3%1dhvw~UA0H4&0d z$z^CgQxsz6l_9BiVVoQutiLdnS@3Gg4K2=0-V^T$isV>O0mdUFx+L{e+c^}G@5`~| zrhord#);%GKR4+aCO%BMafuL(bB!Ag6|*t^X&mV*VI z#>K6C|1<35vp}V+^VPThmy*);y@ww8VAF(_P!P+76Im~ z8}6LizE0NW!EZL})HbPkyZTV?;a!W?Rz8ia!kdxsk11{0T5Ie&%PjU`-xEr1&+m{; zVo!Ow8uVYRxUoDvFXPhs2q~{dPj(NrFkw7oJs=9@B%Fn6tHslcJ{kI=UD|3|sX>v* zFHXl~B0{tvz=NL_60BCPJre(j;Ey7VqUSwyB7$-xzK^&LQ)}6=Nn4@Vd~vKI%1De# zKg|aSIu}3Qw-Q76)DdxV%y3qb*&UaWQgMKwaL=@n9wllGDI^DGm z&sPd73D*zN!OTAXt8sxIODIXtLqv_6Wn_6-d52uMzVp+pB zGfS^ZNjCm@WfiH&-15r9-`$zrj6_LZzg)YZ9BOuUH03h+D8=NFzF2LA{yRa>Dpu@G zG}<)AVIOurnH0az9rS$wIXs$~yM{tPt#dGv<<&&qcE zLAindrNMs9QT3Bd-;+CT&5Y}11MeJmQ@-jSI}2ldPU7=(Q!r|3IL~TqhW|~qb$L;y zpJ*YjxzBn(tl)Zc-Fzmc=%%-~mZoo*Ff=lBv*>a;SxzWAalTEzeEzZK)!D?Y(!QF3HBI85P!1P}XeHUv`Aq$!Wun_I<(r zAf$W_#*OQj8-uC1>l4;HIg^yTtsIHX;vwHr5%)vVOU3n~ zfIoffb}$D?em66&Rce-xiO|{o+bW->tMV~OwGd6V>Z{WA5E(L24=PbjTdcl{EDHdJ zV<=04Jnq9b{x4!UL9wr19}>c^`-{q|&9Bb-bWC*FN zDds2!C)4{_eVuIm*{b> zh>=5B-mzU16(#M`_U}HEmrt3kbVKLGaj&)e$K-4TV%@b2q8Qh)7xYsCN6sGUMI_U?8zVwEJ zKj-D7+g7hOL^G+W9QI<_8AMMOt3@iu$^1@NQ<09WH1NM_zH?yi&j`5Oy``81+Nm!M z-H!I6o-LjQkMSe;J9FpncCVb+{7c2UqO2M#k8v0Y6>s7VS2i|tKIp&s)UEu-#Nq9b zfP>e!ew`(UG2o^~PpyqfHP5uqB zgJ#>&!SvZljQZW#VJ+l(qd~@}L7%p*j zc~oUBS9RR$O)c6(N%I0dH_-hFd=j)Z9tQyt$W*ap1z~dbJf-s#nE(W_$J>F1KX#jy zdSGcHt!V?k2Zp;?QMM?jJVs98#*LMl%bk76-MgJ8tCjbhRv#Kwss)^jiSh;;4WG0x zRyL@I9COvr?X(a>XF3UHY0L|l4r!lL(_6$y9oR}rs6NRbp5*1qpGZKma&tW7Klt8Y zJ4#;Tys&~z9=omdT>^PS_-X3Gvr^e?-C2Q+2;G^e$&YPDE&jxLv7h7j69b>DZ{dW& zyK6W(FVxxJw>tLj|E99ZWyE}!Y zKQ^+oGQP6xaf~Vxb{navs{Ssyn2o(iWMJ|5Bf=TWbXN?!UwInjAJ12GQnQUN@}SRB zo~M6uzt`6Q-8*3^x z#aJ|)v)N(^L)J7kBahQZIMA2LmlaB(*{|Zqsq*p#o-@%9+@CHL2~97CmO4;5eA1w; zhn3XsFmIL&)CeIS2~-(zX~lu2U3vyhq7y4$|KtGXJYo6f=6*JCFk#9z*)bJ{{iL3c zuX8r3fBhJ}D-yWx_*{S=>0~KZw1v{Ls+@G;-TGZr2yQP?C6AF)gJa-Ty9mFB_a^tf1IbVj_ z%TBKaMK-Ev+;~fMIdlpSkdAAR3xDym7MZQmzF_a6o~JC=suR_ZelSM_F)q{AHDsJ* z{K&Po8`Z`z+wDDNXak?Dj)=gS<}59xBwpN6_j7HpHF%CmtMsf{(%UZ$<#%8anv`4U zpky4Iz6Gx(f^sEBKhyC{8Z0fyuKQ#pNP{lPFRNsS&}sehpVLY+ZiPj$MUOZ;@d=O4V&-aZcBG17?L86pu~ zKV0!Gf7KHLE*D8v3h!h^3^@-3~W(!1buD#XOo%^6ZyaQQNpe<+bOwtFOZ3Y`z#pzP0` zlJKdYaz?-JZ1EAJQ)k06F42cXCHeY8K1p^5?*V3)jWXnH(b^O%DggR5A&HMAY|;TL zg3)LK6lEk>vDJoFn-ABXLRIHljg7v=sSnKhJQ)%i@*Xte%l!0RXK*O(BVio!u5ZCI zUl$}vry^Vg20w-6Wg`8Y)Kejk$zgkrS*MXhuUI}2u>t!d; zksOSXI;-UI@i8qy)e_|zX+Iy+NJY8A(3>XTmvLPat$D5m*2+`|LJ9gcc`%S&;H^9yw4DB`?})(}pU(k!rI-nHc0@;s@qJb?F3H{! z2E@3kAKOz$*;wmZ#fqVaJE(IRy3b%JNga+t8vF<%5B24l7#V?NBAT5;q_3YY;qc~k zandnZiaxqmvgC<3U!|anQyOt~nzTExhiTTsKvvF$e30-RTg=k(qO6CdqxVahv+E(i z;1krMsA!y;Q(cK1d6XiMR67M@VWKS0+J}U%H8IOQr~cWyAO=mu7n;rr5f9X7`;V@i z-IG+Cx<>%zdfEYQ$E(cJsM+QF8GDQ1iW4C{{Wl`weG~ujPfFl;6_4zHM z=K3P5AW`#fTPmyYnW~iZP}MOvwMmG=D@roaIChn-Ats=wHJdhDFkq&vb}8!qD1Wx@ zG)*}?F7Py)Ew~l)P8#DrTO#6UOaHH&iFiDcI7tL@C8+(s(ka5jZ<{f&F}f;s*+hc8 R1OCcgDQb=julLQCgbT&BN8k-pLvS@>|Z=wAIo)BoVz{ zyO8=67nc6XRpS*Vt%g)$7;!2SE8PnM#W=d+rB~{`gtD@zlp{rPD9OoTpI@o7;Ur)! zV(ieBBuAFUCH%VI3@mkA=)B&Wcxr};?N^`YH%?*nVB%yd@Tl{J;Z#b!CftY|9vIr( z;gAT&Vsrx$U^ZIOc|I~Afo?)XMBdT&U_e1gezVw^pdRJCp7&I-&-j0&a*U9|qL6yL zQUyO@h7p4#0+OZ5K@xIEVfooinxG<7klC1}#WqNd9c0EFx;G07%fHD9L;@M6)4f6} zN(Irrw2qSj*$IQHr*slzL3-~SJ>K7bb4LGM56+9-g2wt#vj39uVLm^h&K>T%I; zL8yTsvk?XcKTuQ-h*<8QuE^QDT7rF6V5V{!MA{fX$c7tYvb$sG>T1w8Hfqu(T6?c^kXG6c_*{ZBXgGrfhy_S5cEm74?z zwCNQx^Tfv4ND(HC9_IX1^5z)T&IG&2`#RC40bimSRCKtkd+zq%+{hMxXeYpYMVhrat4wpy0+2|X;P%5LE`uZZuVr4Hy{-Fi? z`GI%2jBdDw%S@}yGIdQ=L7w85JL(~W&dGp ziE{OcnLy90XX_dS`q$ywJI8{F5@r{{b0r)CB-<Z_zP6Y5zLq7bjxu_772O`$(W=$(KmFx3aCVh zjI^V1#Om~)Qu!3PG!nFEwH2uUiFzP^h&7UHPZb^kaYsDFbjow3hc~E;&fzpmxBU>H zh>|P8p0@Jh%1t3D%A59Rq7ePeU%WqEWrx3I@Ks0@t2lU^}eV?;j%q1_)&eOXw6?sD(ETcsVpk|prvBuC0u?X@B$@D zy^onb?Z>Akrgp;H0Wu42u2?+Xl}7+{Blqv z-zC`P-9@*~=9bhh&DB`_QLIJCmtr7QQw-6lQ;+@elGi);!$c&>$4_N7B^k36cBFRK z_H_qd?S!ituT`?9b$^c?${%DMpj`Ok;Ksa)9FDVPA>t<2>C)9Ai7%{pOpO%8PxLimdaH zgf-%mw_9&1%XyXBxU7vF!I@c^dQ}Ql>Q(YbUHr9(iv02}*$(~ta6HLjMP?&rdE1mp zwETU|CC$|etO^okQK8FP4zObxWpRg$Z?{XuadrXJB&)~lEeROKV-Dc zxa~aTJXFer&P2!bN%@cRaju4PTlw2^VI^Uu;fe8yl8J>JzC2Mb825hOejY4uy~WJH z&wvf`1JY{!v0=xcT>lu-=@M=5LBC8-+rYR{t|q_c%|b^_M+IR;n@XBWRl$O7|IahX zD5SE5{O9f>I=mL*3<);3wIH=^8LaI;PU}hwZVyg+6ve=eUBauPHlPmiZ1Nx$(h*wA zo&0tz9z1xFdB|z2H$^bD$g>T3IretIK3_9$R^FD>w#_s0JT5W*Q^XiYmKaAK<HZPv4fWj_aqPm3_m1n; zA*#}<;kM2D44jsnsk$|=pDks+;A`^}Qn4#BkHT%SZ4rSr?lpbWaeK(V{N~?F-#5uv{(aPa zw)C7c{4;Tj(nhSWRsJckDhGW1o7&0e&p60a#KAt@Fr9K5#P*Nvo{i5~wRLpE)1XUY3+L+$j8VtNFV$%J>{t+~@&hdc78ol= zgRQl$P4`6nuMe431@9&h9SMn?R8Z8(wYEab)HwPLg;4IhIBCnC_9Fm^!|$IZANlD!q&#xjSfCqfgy}l^*Hs{ zo6YZH@+rk$#V6Df!%4GVg)XwJ`0Y~0y8i0USxIlItQu&unzH$AbGWz0USNoq3C`Nf z!gIl0T5iH!*J(mrUdh5avnE*J9gz^}w$g5q)=uk+(a8y6ajoxK7g~2({Kvmno6TW2 zE;GlJft^>pf9K(bo!5_IqfodulD6`^&Aj#f$NR=>@!ELs;Z5efvvG}zvpZrK({tK%RZk2 zt2Z%bX?&<{sW}~_a{uMZL8(J8)tB#A!Ec{suc#wzF;D6&4(f3z8*BZ57K8%=6 zv;8;qIX@#mIE3SN#SC5o3Ea1wTz9~CJ!vQK+Wam1oVYLCDLiTPuhr{c1AObo)_i|K8UV%od>vH z4_;rcldOh#Fh5R?bu9TZAJ=rMcA8#DAS9QhS7YbJ4WCvPPgX)5dVGt{XIA8|(W4`$ zo>DJU@TJjGa#F@(aAS@N1jRml*b?`6Jbb8-p0b)^Djvj$*d;HULL|z9U>Kl3u9rfekGP%&XNA&ux_)?#guH&oj1kr}FJloyYUusTQ z+^3PJr9GpfWS>7+^031Jyh&@RprH%`1-t=)!XiPS+h^c>2m*P(2Z8>Wfj~mpAP}kR zSJOc`5J+R?ql~1M-}2us|7;_B|Fy@!DTDh3<1W|bYyI!!WZB{7i^Dd2=$1W0jLDW% zu>+rowt{?!Fk%Jc#o_Vd5lNzEJ!a!JPL?lw_-SJ##}#wL8A7x#IvA-WG>K5E<5Vsr$dZNYo*2(G?U}(Gw zbm+UmVcTmJRK6~EC@VqOO%eq zJ8y?Uzovw4@rc}X(U|4RUEBDe$*OZ;9BNOqN6}&;e@{O`39#rteg{Id;=z6X?u0%Z zKU?)L5@eJQyM~_8t_x>L-}W-+2zy5fKo4;*uCE)d$K;rpIlrh>{AACwVjcbamnsqk zo&h~{==*bfe0Q!+K>)aW}nz%+gQ1G{;;rjeU(s+b%?1LixOHWEaKs-eh8 zfQpn`Zfqda0G>iu^?zi;?%?bJz zWJ2Y1UnD`8QS=-r5CY_Qr!EcvT3X-UKvP<&MA5i}pa?7pfg|syd--(y;A4!>0__ZF)-qWEqU`u_NPoGFncw<^IDUK+3#H#N+emn^<7hG^-ItdxfT^}ZQ(rM zAYw72e2i&!17C|iMs{AUbqI?36AnY--ptNn14S`}LVLD0Br*atfq9;wyE1Wc+ogbAlcax z&QGiEjbin)B;8Aj?&Z|EZmm1tet4y*~vab?UTE z{1ho*xaIV|`_Ygp^hQ$4c-Y-YOIuPseZhe+g7ypMjDbK1K~W_u7`%lcCdKm3U{GE? zeeCma1%0zY+V%6FI=8VHB$*A*hZTBDxT~dwpq#=@(EgF>E(6UyuLf5w_B6!V6Hd*! zhs)WPVNGtnp3F7Lo=#|z|9lI7ekm(Z*IwmUEA8VXEdDeEoBrwK<3d5NiybFKK#h>T zbYfC1u$istxXt4XO%=^+VTdH~?G7TPx#{7oSA$H?Ehu|9<<)ffoO_Btz7#|vCaL;< zhk=>5ft~c(<|XyPe&0;LAia#3Zi%bayHT&~=R2B^=t1q_0Ei-i!d-(s8+`8yeqADO zIfo@Xrxw@NhUSA={plcn*L zZ01)zwipsryE8^Y%{Mu}h<>Bu(*&W)s@GY=L0BC=Cq)LVLfpk0 zCFWUnG7qU=54QY~>7!$sDj2+qnEap!D*kD?uL9oX9+mkPP!qEs_@h0Zm2uQ7cd+fl zg&XQ{LtK=UV1cT+f4IS{oPVa{0WBsO*}?Fo5jqC?A^B_T*1E#VM9uLj&Ib2c%>CrT z-ZQqlySr176eAA#HlxxRr`pF5wA5r-7;be_iwGU66pI2m0Vc)=pJG?r#1>hpG?{uDmH| z=?g}|ncevH#`m_KShj6I%sTPNu{{QdQHrpp5Lrt(^p6>dS=4sT_8QwSLR1_ayp6Wk z&=W$`uYMwmH3n$KO-}UMk}xl?Ra#5~AL+I)r5da??XTa3h1}LXJ!vDYW|02G3_qm; z z9+?dO9rtp~YK!O9)YhgNK3ufWh4U#l%KD1m4t8%rR^bcBRA_W4&#Yl2s|Q!uRKJq~ zl4yeaDRc7kt=-(dsIhqUOR`7xoQsrKRJ83E1l}ALJ{@|KrhviUgng6OZ}ZoSXY5XI zyKkskR-vR;ZXb$7rwmD_Gp#rM*BaLlvl)36TvhX|;%6_#dmkP|d{^8t;4QAU{{G}J zZ`Z|rmV^jr_}}&J!jzyLhR(bBI_Td0`dPBC+eQx(^kJ8?(f7n8XuX?iI(gfO{Ej5T zpeE+1ozqVOo9;9?)L7*@h(uQX$GpSCoa!U7r>Eyi@b&77H_Z6k2hW&*u8@8=x~Lv^ zs;iUrsguXG6ZhxGYfHEfGr^lOC$u6RWE-GZ1o|Ho$KGs_c8^f|uGIUuzlw5(A0fA! z)cGQHd05sB9u=HW+*O49smLxYwC#_gYQIg#4QsJXM9+hAZDfATWxbs|vYFOWr*kGYOy>!WGtNj>Tg{P)M za(Q_(8tb5~t!=EfKdF-hF}Qgz*8P0{oTymVH<(B|x_>^f#bt8$HOuYh)cj8py7=v+ z??1}!GfI(*Y3ZP+^TPc};S-~H)>>q*#-+a=2OLF(1k-r}u1q9}HM`XU<18ZXTc|Wo zr?E@WV2m=2)aYngi!(BY{(fExTqBsZnORuq^~n>p_)RbVO=9;Aw#h{ask#2bZkP)% z#S!u{1VI_{&sakI8uVCj-5I;Iq<`FXZQ}EHvG?y^wj{aj7{rPcrW1TGaQ*&u_ibMH zsIl*Av@@JV@g3pVxd^fBp@IskObKB6;6k%qK5cDbEp|P`8={ho;6r~*SxLi>gWB578IdmVqcxtlhW;`! z<^Zg~7dZt1;Xa%Z#*v{2KuH*1$o{oh?Mzm4$*MYKEFvYm6cfCWO2<6+p zj;}pg2Te!&I?i@vQ>AV7T>EqoZg3*#V3)CDc`;yx`+g??d>SFwQeCpQk!tPcI8$BdRn zl?*$%ZLP&n;5C+q@ga-%TpA&FU*gBiuqNO}fTqro!b_TTs&N>573J2`1~(jvZbKyK z33q1;AB>0Ou!#*xothVPj`6HO}N`#k8vOvY8!vfzxm1 z?jC=8D@*W2rHqV{viDMCvaqnPfz66`>8JZQD|*Rh4eNgo#F&^lObiUtQT^t7dn6;f z|9-&o(>VyFN{(1-SSxjMR9J|1H47gYhK7gLhhdy6+m!=y^%zoC{#UV(PsaycRgUJ{DQ2ca+_T`vTB8~qXd(18u+E-!d1<5D6 zx2km{Xkyh9yQ)vAcU^}bp*ESHCi`}0xjyxa6QvBdaUPZ*@1kV6?hyIHXn8;v=85k=n~7NQvT z^l@*0|C9=2*!$zaHVZiB!iZQ|8VhY0!ll$WUnlFK&p2}}Dq+Nz@-(`Z=OeeKjg&vO zyYM2o-v}xdJV}mE(Jf~W^R7jOF87=j9;@BA{dfAG>|8+By_%UE zFzmgIhtE4F>F0QB&aWM6ny*fpuOiIJ@_Qn|V3vg6CB6c*u#z*N;C5TBgqs~PcK z-0Q!a&-Z^?KKNeY_;x;k$vx6`sR?VE287Kg&Ta&WBH)UwlhUDLvRz#<-9dznfvk zIH1gr^5FR%98#irwO&G4tQNQaxVpaE7mc0urmPB_V6FdOY3)4ru9L35kU^J#+AU6u1)|MbkoiKz&&W`engCqPkJ7GI<{%;j@>53zM-e}fl<0m750dp z(f%1*izZCrx`*L!jDM3l7*a-SI=K(JD5Wu8A9LrEXvzH^XG`@1Az#&-V6;2u8qBqR z{X!>1u7r!YtT{ULrk}w8eMzA2Yo9Yb*YVBg@jy zFB^FGg;T-Do{VW9J=&-;6oEjJadqY7;o&)GpNzq!TD${(V^b*Xyp6U|;}Z zPiHBO{^vIT%?tFZx$bOFpgX6xx3}V3?ChHR+TB8n$L52-)yDQMQcP_L3oCS+R_m1( zt`Q~Uk7A%_YLlHq82^1)c!S!q9&&$)VgS3WB6{#iKGigFZUQ%IYe#E`IXk}-1Ntt$ zqs0lP1bPAmOvZVG{2;oNbOOw1gIOuejQit2G%0n=phEGRNO3b8n-~Sg-}9ytMB zlYwjJubG&bfOuA(JvccDRSZj(q5rRB7k76Tj*fnG=|J!U@AkjRz`�*cwb+@fc&@ z@%XUzFSEt%V46;`j3`8$dPAjdcp8J!2mmMG! zj5_^NsfB%Lqc))T$I|M=Vs|qs9_zu^^_`vLKoI$z=dCO8=MA2BQkH1F4!)SdD>Lvk z*Wt@Cd_gLPi}fB8S*nF$V&>d_i(o2ZH8j!^W%xFk58roV??<Z0#XO|lT1_R&>r@!YtjuC9o+ZdREW&`KdWzqikKzo)i*t?uxZBkbXX5DnViLv<@ zBUNl`z1XeBQhhB7!)QwX>d~gurd6U-_1lSe#*2E`os62?+{Y&-*mp&eHN)W&8m5Bt z{6eyt#qQk(7j9Cls`9z&(~j_uO+k&BvnaV)6vK#;1C|&`J%N!ZzCRFEzHW&Xtrs2E zLwA9#j>D*;bZDC4u=U?5n8>-Ag8)RG@qSE*%5~yTJZc9zOCOM^prD_!L`QAlJhJ)= zyM&(Uc@=yDox3Uh+Rz+d%Vwl@1M})9W0)2y(J*%HsZUeo?C#VHVx)I1n;#GcT3XHX zEiz*6nYPUa#+;NFtYPSV#cE^r$G5yxg-UZhSI9wcPlF1xD+y`s>Wrmds%Ga@uwXSS zMn^~c^Y+VVzS?8uxX;2tPc#2rPFsRq5+lW3O(?)eA0xM@_9E6x1a9FFK(Z+;Q%Z<_ z*TAy5z?*bJEh=w+OclQ0XnUnUz%sx|oLu4!dK<_8&#a623RB z{~&1m#s$o~8WvZ~O(3wyMKFkM5MJsNHfoyjT*8Vhi`i-RhEL)Zn+~-@@|27!*%Y># z4zgNJA(1IWOtTslC%0C0{@=*Z=Sj~Hx5JyPTw%!5Rb(d26hWn0TitKFh(wE8K_e7VA-Q-Uj^_Gm@)6-KRNbkb%zFUE@W?!XfCVKb9B-Hj84Z0XdfxNWM+K}RZ z%7u<^h;mX4sHHm+5ol}YM@Qd8~Q}js5QJX*x2|$l8GQtAfuqN zsLZZtc>f8^nV9|jI_(Oz1L8veRl%320P26hHjGDOQLndcyB0(vdWbsjkOZvnTH_9( zkK4KBT*AVE4e=k2?t4pk962kYrgibk zFZ!cINDC9+z_Jd&MTh8Y>CSua_`AR4F=}rq7ej9kB!vK!LCIRb9Yn0x?xZe5EGfGZ6hO+MV(D`M0vY zRJ%_!*CO)Z%fi+YmWPG?=j8RfOMD_qs!jQ|2g{%>(=PlrF#Df3tjo)Ih>Sm;%IYKY zC>%P*#KxA=M#TapNJ#7AT&jY04W45xgBm$NKg#d47-pZVq^!*K{{6H=&ky@_#j<4I z5?nhw?L)gKx&82K+=geT@KqEp4&q!!28t7?Wt?(XDxR``IS6qthJpWjz>{5(TX{k|o}a0n z4O@BkBU9SN<)!!Wd{0l$W#9)bq!hLQr3@n$rPu}3*Zf|sQN&Ao1FeRA>C#Y4URh$+(S26)6Mr|PI|}h4#-lS ztoAD8PE-D7O1vRQ^AqmVMGsr(X>$I3%8=(_wqw|h>VzEQB9%e@RFt$hrzT(3d3W!?!11+em1Ge1^r)3bSNd9&W-@dQ zhhEgTVJp#fC9yK$CA<=o-X^ulx%(rQTcWSw6_ zn9i$SQ!0avd3eCcJT;z4^=Y|iaM0l?^0hN!(-ULgJ!rJ!n9Qn^xi4psqENU=g8Mrm zKk-#E)9tUBHzhH@#sn(btXU?XpRS0X|E;;dZqwTnwoSZ{F{FMPo;5#S&);oK8TZ`R z`&vgm#r5UAV8;sWtC?wHG*k5P4ClQueolD04cp62U^@NIWD=6P2%)D3$dx~bRR2=b zQVP5%K%)q7Z~(s|H#Ycg#8G-E1f}^IeD7lflSD_Fv1`)4EUC$p4)z8J7}e4lJJ}6- zLJ`=Y{^2ZL)IoLj74CI#A-f?&q`3L-y%_UU!EWCLj)s&_#?D~N`ofDJO&^@#&yH~Z zO@;4i_-Bg|%KVIK#M8VPsaj-Vv9Co(cY;!B0(VVVcZte0;-OHnFg)7+&C~WUlYG6V zh3=zvj^u5EB)Pi$^Lh)~yO6Mkudk2%0U@W_jiqd2!tD`ctjQtjOCJ34o$=9|1TfLf zlVZpjm==8_K&-u7idIs+)hQV*A|?15Io7r+Y)99mEfsfZLB)r>qLdH4?|hd>Eb#Yr zFn~p4%r$;!y@eh9NRZkHjKZa!$MLox1-W~!`t<7JS2x+FHRVk-;a0c_e%|-bKXa~0 ze(1Hvd*&xi8s4T3gQO|`2jHlJx?ffQ%q5xe>ntUQA-5w?T*Ak;oklHL*tqzj1B#|e zUA4#A*w`$h=oz;O|J{lJP`aR?U?IT-$w_#`g9p^LfNnqGk?vRUH*ER55Xu^$tjRKO zToMyeTd8_v`}{M^$0^T`zBl&iq3-sgdj6L+!9%)p~|J2>Hv*ISF zNJ6jFa#)SoaaLs;)FAEUexCxAdXn|)`dnqAQAV1Fn|=R{qjkDeg$;I-qJN7mgu#^YuB%CL z->0SN#2%k~>w{?{gS)~YY*qd5-~#%_Ia$9aU)nK4TRPU8-uVTu5A!Mm%kP!TPkxEz zU~z}$W$P2i{ma@cD(@yxo;>*Hy17VW+Pz_*WK|NW83`B7M7G;kaanhg01cD8xsiL z<+f2lqldRdOZXDx2?HJdJq^+s+|i{9sNZ`vImVTXg$R= zVxahvAvyw#I7=)H{AMUmBqE}{x0}Zkbi6^;eZAe$>dZS@7rcw=X`RQugqcbD)0Sm2 zKANI}#Ie&|RlLyODj5J3yNgmu(CksAQTkUiBQh76p?a8;9P@3~g1v<_-*#aq>wSi< zlzwu!ZFxusHjN+YQ#ZPUuHFT07WeboPHEmg3A~p!2c*FQwJ&+TQX>6@k9nqM`v(M& zK=v=st%rKO(>am;wOLodXL@JAG`L*WN%lmj(pP_$w1vNsJ2fY$}=dx))tHZ zxN09Ep<&nlaNY8^XIkrNA}jfPIlrsZCXnX&LNnzop+?j%de%jo;>Kbz9T*HSx&{07f!8i3=ee+rc8(dliw1`;{1f`P zcEj#Jo%3!IHrv-Ge$?0GtAv8aY zycfSE{TtDWFUXeE)4fHsIPH@@J-AD?_c{7re8o8my2EI^7*y6EOaku$<-hfd>#49S z{IV15>VyKQD``qhx6R^@$TZJGz8{AyiSZspn>~l!s8bFW@*f^JAF%mxug-rN`lcnz zp4AClJUXE^86h7Cg__&o1}RY|51*Av8f zL5Le7-_I4T&d~uYVqYb+Q7bYXlsE){GP~w+1d49&e`=JK)1adgHxqnivu~Epz@x1t z`z49o4s2Fz!IO)3UN%g!$U|%??HaZ8b+Diqb&A;@rG3Wkivr^fe&`*V*we(xS0%;~ z>VUY1-bYNNQD@UpJ-`!68eX z{yc!paZDEAdJ*9N;6&4-pEm|bD` z8~`mrpW+-@uUu1$e!wr=NG%9@8m6->|1Ao-A@?Lv8q9r&lVJfIL4(O zn^fRcT8KM#IN0n!DD)rA6T9J%oO>x>VU z#airmm*XW2GNaAOj*clDk$fA!Yg7V=$p7!aM`-8{%cdGxR1fQpAvOn*bhTB%ZMfZ5(e~Ls*J<%*c&U7f&z)tI6y3ku zAlsmx@o^kLp}W1k9djAFxe=V5ods09dO-dKR0_lMI^0O$k6`e{)s=-l$=KLf{-9co z&S0w93xRLguPnMvkar5o9Ix-jf&E;tSrYFt_P82q+m!@F!I5T?5R+9B}$Isgd@S= z6AQ;BRhpza;@tsSX94k7i2Y13|6uvpS;?<=!+byg)M#*O5AsUeers?yBT_^YX-z%;Hb=RZjYwDH-s;QG*Lrv~O>*iP_nZJ@@MgP!Z1$e@{ z`+L~DgaG9Tq7Yz^6&L}Qy-bU>)c%h(uY)%O6@a1G617+XCz&zK+{Y%<$u!fA<#UON zY0780(s1h~D{gz%U2g2ePw#k@3E~F;KZWV_gW*#4>odJ?M*U@TUZYDCEjHQ|8AQj5 z%|R^0eZ0z4Q~LuJ`CXQWj>yZ`!6LA|`;`2x7V$Ior};pW!7&%|;VXgaB2aOG#GPH<*6?_D5HQBl!rn1Ip{;Fipv*MHTnq9#`tnY$>7=yw zUyW&rMY-#X7M_qt)WY3qc(V$HmCsLw@y#p=WmrfOqxv_K(N&nz79p$tU0pmf z^rP?m#A4=n5uI(_4(9qt*d5&h5Ox`nH>>*MpJI4 z;AJiLtdc4o;>c{L+9sVZ)Om9AxGEeAZI42{Ud=lF*AENFv?xYXmfq*ndFTg0Vp9O; z4V0ZSBaSr1GC{8c0)S%z02D99AOQXhooCCH0iGRz{k2CPPY?b>Lqk7cM|zpEp`qfz z!NCB5GGoWfLX6c~`-wkqH`CB%6JXe>Yrjp{0HTf?hE~1a=eD*F-_!qFx&ZA`GQ;wp zkK_62v8Rk)PgZ@g)tv$O$?dH_K>rK+|Fhb^#U|xYu}Xi?%Nsc5O#&qcQe$a+l1Gr#np)w1c++gS3^ycV*kF4o%pGzCVXUiRVh zIzwrg10U5epg)8f8*Y>%31LPg3zPtJq`(LmNAmH1dsD+9!u~{Oew}G-a|>(E#}4`= zfc^!r^w#>+zw7KNAkJwj6>o{LfPEY)*-d~mq)Ex}9-9t$z3;YpsR9B6f$y^HGZf2^ zdqzeu=N&SvxR*xn9BEqenc!>W%eU*P3Q-peSUoP0fI=H5A&gl^%GGkohi~{ zEv}iH=F3xVSaP!MMVFN5GO-0D6(|0{=on}^?P-6Yl@YAB!HKw-V8m>2wUP)mYqG7` zZztjEGEUZVhl0Z!zAK~dW~jqZd7qEAMDc-W1O2Nekf3QMj7W>%`UR@*it;9yNI6Xy zGZYCE2Zgw9Aq)1-ksrQ}GS1i$54#^69d$TZW|2yPdLamvTqii%5_Ix52-{V^f5a7*w_!{8v8~g-y8UOgn)DWmluEZYO$rZJ{3BJ(hvy>8SX7??sy}$8_Tt< znH2*IQ=@VK*8SuS%x2u6g$z9*pet}GH@@7hns@k|lw`aR9%64_ndYd@0`MP6fQ)i- z4=9IUm6(J-K7qks70cX=vkG2GTL%Q>0&(?1xusc4xDt#QtF0b?{7)#}-rlAX@%y4! zCIv``G3IW2*<_``J55G-m zmeC<7A?>&>d6sp1s|h7uU{4*Cc4{(xYEfg(?0+&-#?MDzISVfJA*e48W{}c ze*Yej$gP;OOOAwqMdA#H(3O4HVkJzH%PA~8X}w!U*uW(-fTFZ57$sGloVs+(nFXx7 z3`Kw%dC$u`hg6;Z6_^1orbya@>B6%!cc4cHj7~Nl9{(Dwo&vg5fV2gqEWq&a`;a$D zE)wYS^<@yW%1mj8i|7E0w6?a!jC(MD+<56>t>ZW|pY~!odJuY|$wDlIHeS`cf-WV@ z?o+d1LiycbD&tzF_}_e_RyW_aCzQzS-V6g-8#A{chWMUvx#E2~F`7fC&+q-KVNSD6 z!ew`wnU*JU814aZ2Rwv97q%{IMjpz6549ODMVTHOUw-O%W(VHm z1g%#rIr-cXwBQz2@HkvMVYVB+!<(0YYzwE594u%qU+05@67`oNvbm05NMTD=XvE7KRbPS%=Se^)ec+ zi(#W9-m)NQ^a!0#o#3A~tXZO>s?Z+XZhM{SOlKXo-~0^gU^89iolq$}S%*{{8NcJzNGA}*r)5|vs8>n#6yQpKwm#TKChYG}E7Ig@W{3yxrY56zwfFpZqcA)QZeJJL%( z$-Cec<(XiEvtoW>X}ysk^d_Fk75+g#jXdLk#-<|>(B0k(FK5&pdj#w=#uD9Xpe_^2 zxI9%M19mKqw}zx2!(>Vn;*VS8-eMEK?^9jMn?(cQXF1yZUfH(f=f5#c8I10F7~`&H?5B9WmDe>P3p>_Gt`(_c`R|eZO^^ayTwIJLDl{rpvhHiW zc9)m{7z6B9@bU3k#d|`Kpd#AdAolAr$2}T%^9c3JD+Qfm2rJU$rV977AoKuIjW{0U8MC7V`hZ%?r4Ro>p@#7zrbpA=VLF^UZa2 z?6B^I6GzF;yYo6e?+ph{%n&{0m0Oy(>aR}Ugtam$)V2^GIbd%ayd+q-5A2$uL3m9& zCZX#;wid`X-(5EEcU=iLAH9KVUjnOYmj3p|&M4Ay0~@d{r$Tx5PwGe&jpMLxHQJx% zuvUXH6Z{*OxrNZu%2{jYi0}q%u3&4we~N1--cxwpy@pTCOx)EiY6}iqRqV-^dmGg% zgvPGn)lY3gFoW4973;tbvYU2LFyF8GtFhV%L*wB3I^R#Btnf=ucaHVV{@9Pq79&vQ zpo1?PrpGY_!0tFKYrt>s65sJAAHL*h6s9JHIz2Evl%f035SN z?qxKY(oi)S%-%N7{kY+hfdGt~WwhA9Slozz$h!_n6L|vSbuqSU3jIM{S6#69%A?t7 zOEP7eNbyeISmAi z8q3A!+woVj#RfGV$15KIuL6*wo%rG8vopXQLRcikXDRLg9~A%}xcT{qCi8`bSDpSF zi1(+!t-g7tQL$C3_SMXmRhoeO^FKiB!$^kRYjfxyyihvW5l{2~4da##IFH?-OQB`|)^7P1fd{Preck#JMnr2UhA_z|WW>bm{;>y?={NW+b9L3j}aFf@l3GDrq?81yN5_kN4(kjhUMLLS-Td|GrcCs zg(A|Xt|Z2qZ(n7drL$1*-zuinP!8K0;9@e`F~!t!`<~IiG=x}!#Tw83<lq9NM6b-=4p7okG9Ta zBhL@e)EhUf-fGqfg`qDt9!?xRA#*U4n;pgjzRwV zufNJ&_q>V_4GtbUiX+2p*}aqb>2sue2H7}}p!J$q z0;o3|^!4=<_%2P`MUg&=ZsIyFnyTRY{>mU4KvnS_o5k5F4xOIot#5cWOVg+M_#gca zZ+-6vnHV1@KXnWdNfV3rV1{(^vy(_QMqghK2fq0!W{ORI^v&-h9Eoz_%n{0k9FfQX zx8Jp|3zz4zhW^GE9^lZ$CfRVEEiZj5dq(0ses-3KTVndc3>WHx?VCq<@S9)fr~lb6 zGCG*y;Gv^bv?Q;8(N=!&y>HRfif<(D$h1R9><)KF&!@#0u zdkhYaqN^IZsWEeYnvqQ#$Svp4HI3YIp26`=RC9B)-HWXtj$J>n_bk z6<0~3s1hnUE*4y3Q5)5>@zj3CMhBT+TwtI#K{%XdobdU3vBZT1uZFkSMD5L(vA$wbAs;U1Pog75{u!~ zYPgLW@oYZ?9jFLV?9#Uk~Sw96-iL(3&o4 zCW7XbN%e0cu2z^@wi(FwV1}buFcg|P zn>LOitup6l^7QnkId}3bn|JSFAfc11G$x9?fQxL{ATR3L7@`^Voq$FtiZi zbexUj8<{_I7A2vxTy^jqhnS<|nINNK{9=QiYz({EV4#11>GS8&V_}R)gjBMJrQAH8 zr=x2MxHi25eK@rmmh0jQi2=B-gRhvFhD!fn7E@8VFf$Lnk6mjJO(zhl2ChTHb!k*; z#F826)n)d*^i{-7wF|?W4d@{7SYBSjtrdCvH?XU-8T7YRa1bfZDTm8h;sW+=h=#|{!ojEkI8#e?Zolmo>}G?R#S%NVjB@U< z5%i4>W0gxBnL10Rca)yKVe+{Ja=9vDLm{q57$1*u=J+C^NC-a}!kL>vHC3b$W5d`e z%ascKnK)Am1w^$%DxD@AQ^*xPgkLAn6Ev#@q!z{y4m)pu38{$Dh2itTZRdLyzSJ@F z=az3qwPnKJ_@os>Rgg4B7q&LqijsoxFgms*H^E zfz&v0=wVF5q<3T^rdlOmYO-T!6XoU-mZLJaJkRZW_i_HhIm$JQ!AOMIzyNb|Gc;`l zHIl##3G$0IZrPUP_>tp8M)oigwK+9!vFFz9%udc=hzchkpW^OUzJdo2K0-WjiTN(Q z8@3S*Dfm)gI~7hWy7cH8u3TnxV1R1XLTCm96WeIyE;74ZMwOCcv5Bi{yzVvk(w9nf zVemqs9FA?{xgG(MkYP}+RtZOLGAON9Z8aj^aqG>vfMxAgtLbFjr z5rR-8+KQJ*iECLXx`|K(mhBLaMrhV5cxafq3PPY826nxUW*RuQg{qr4wuK@Ds%BuC zI)NXcC@Qwy!1E=VqTnOZbpzM7QB;*sD2(rWNZ-SD99-8&)l|$-7}LZC zr8;P81zpuJLk3bpVYx&s)f!MP1bD84rs)WwplK?O;{vVzz>)wNNQ%WWy}enMO9is& zB!T0#sE(mivs{wVFbk72B!>GjRe{wglk6G5v221Mz%)%11svByQB+*lK~;4WEqX4#D zqgHE@NTplBp1>!+I76y$6jf_cH_!D@6oKP7EqAK#Qma)+WctAOSSr;~WI!|)Cu}HG z^Ya91lx%+=3IUGm;<_Hb?-LG(P=rcuX$CEnBo+-(tJl$V6GPW94HMg;KFhBw{jK z@)+z*P|wE(N5dsE zFvQ3}AC6t&%xr;>>yk*Ps5B}BYJ{QwG=&Dljev9KW*OhSnPzF84HH9r|Jx5!5fPeJ z2_ups_vnL!hPLwBdv9Z6(?<4xcR!mpZsz2%^VG^SWI{S+rvZsk2BHR!ElRfah55m; z(~QOix#>CL0|WfT&-^UsPCdr4lS^#Pc;p;|ty_k9?A#(-Gm?iNJxBjQ8cV7y=4y;> zoZ!X#_R*J$ziX)r%KLoA-8(Wubh-;Y&qkSmlCnu-uAvROt6#p#I~ zs78olxlB5hVR3N*O+Ye{q+we$-GJUyf?}nCra;s7Pzmsy2GK;4L?%lyzliNxOE_#2kH%g&fG#X85l!`AY7)n_@O(ijUuI}@ z2#`2#fKyk|L#^%FTvJ%RIsq~rX@<~O@;6%DP%lpk zYFE(&fsYIVre+ox8ylroFO!NV!SQH%E}?LUdebHv4lzHoKzcAsSX0Os3-qLW+K%^2 z`5i02%OF4^F58AZ&%$*jp^!wto7~YdC>|sra~xK`N{=GgD$@tQQ#spa@C} z=c&|9`bYW+nHrwwQK>XYrW2^EcKS-GNGzF#z-MM5PcoSx84GnoGdC8{l4A!Srgv-$ z{k;huJNP|jXDcYak1Hg)nPB6f#+ie6GVKdOIwX1(%8Qa{7`AOudH7Ke$A-Z^uq_xG zS13;U)OCYjInXs2F^_9&>}ioAW0c6(--Cl zrPA1eN;;q)iQtiq^m6|AV>t0Rd7|ic1I^cvF^CA2X0yV*FMkC`9y@~LGzm17 zEu+2EY@Ma0MKl#snL(`b9JyQp-3+s7%SPrdoJSZsP0L3_k_=>ec<`ZzF`_9vt3;t# z#f*jM4Uf`4BAClHanD`AOh`;~ltNG<)!R=hqR_Bl=jJ{hKYAYDfOs?vR^Ou8D0tq7xakW^{p;?z$lzlmg$9)pfu<3O#Hlu_2u%m+6And4C&DZ(mk1OvHHAj0z(S$M z@bDlA4HyWx3l%rX%V}!z}io_3mBnno;A{LKzD24Pvxk_q=542zM z9f=eIZB0z0UW91+%Kx=IFvO)}yS|UUl0zW_AJ3EM#`UL{T2>P?6vnC6Q9>c~)%hfW z2Z{zkfMeMhk?;@QY^G8wBUFQUJbaal;!$@3B8EbxW|K@tyO4ak06lr?7-l@n@L&(e z4nNH7T!}`xgo8xW;%uBquzdC|rk5mUR1&Cy!3_$U2a82Xp(3$rFqVa}VFd@lx$^<4 z0)0scB?S31K3nh7$(`|N#1%p&%r8l#Au#Kbxw_z$_qh}nA7Vb&BpOe$IUDD~*$XtJ z145^7u%C3MAFp1-t2VI>2bT!dd>LOci0d{N3J#kFdQlb^uzQBNW#0~}^Ha>`tJDf} zG;N#S>@fE1GPS5lJRIZhd+(-}pW*cRDR4A4ZrMcLDslYSN$Qrt?YlQ3RQUeEV?;s* zVrNo-#wYzj~#_>NE6mTa0BWdDI9Z0hl`a&`1XoR`1; zjr3>JU5MTsKnI*Sa*Up#VfuPAT$q|g;*$u4n4CP0FM7CjdxmfP-yY7M0wXNR)nUtK z6~~e+S0tK*`9(=@S};1Su#gKVl_df}Uj{-Ufp1HC2NW8)052jaS6Vbh3J5Il6nM?+ zRBqi-TKA$5mj2`N_DE`617^MOy4j{twG*u5)DTgn;4@}tx&a^xb+4`EJ-4wapKGw z%utrwcWq)}d5O~(W{Bu2eIpwXjS`im0!!r*TW-0H+|o>|!IPqp%nr~fR|&_G#1b)< z78kI~^CUuX5{WowDnmA#?LzdXMhayM+=zDiw>DRq9qc% zm0(C)Y$w1po?MyJ6&`?fTmqLr^+Wg!WPsy37)EI2&nx@={m?xCyYe&xS_VA+@VCi~ z?_nsL;MDO)Sy*i1HY|FE2hkOcXhcw*-9mg^Wp37|o|o7)*tS>2S0OhQP<6qtN@8h& zq6y5nLQ)(;PezfxLnJjwrIf?+0#vCYq$H&J#Cm%10oM;urHcrB>U9gDnJBV>T2g;1Ng@8;`KAA(|yzJ;v^>o0y)Rquz9h#!W)Hi9$fFS|<>K zR4UE#{47EUG(ALEt8w6w!))BRhjd>SXZa#cVd8oozV8r^_JE-=x429=8lkzEC!R{M z@5OiA&?b~!xgmh|nL2lZXwMM6=?te%ox-*~k`a@cnTv$N{Y;GLoP2zoxvHR6l#~}G zx_~XaR2qR~VL>7^&?HoIl5kqE>o$$;<9QZ~)0E03l6{*{1Bb=s0vZYm8XE^=1mQ4q z`7)N}kWIx9Zi8yYf@mC7NU|}Fg_!t_OYhelB}g^(@?i(8qRk@O7+0<9GZ z+_qcc_@h3Nj6x8=!gN5gS5Q6|5ZYw0ZDNkIlT$<@QFKiu9TP0f7l@_O2%u><$@ULZ zT9{{GV2Dy>0m~Iwwj>-i37i_I&MonhJzJPQa+cJdT?`KNFgJUFM$N)*77<#EY$kzS zt>Wn>zAL%o&RfYZ&M-YQPw&7Oz3CW}7cNk3NTlyFG~CY*zO$c^!6A%Ll+kSy%w3$u z4HOJrqfl-zJT}Ibv4Jj(o{Jj#+{vTFGK2K@^>Xa-Ba|ym5~jgIevwcp%S6Azsk1vd zdlu#weG)N&<-^_=X)Isx$vJ|$BdO#iI$$qLB3pF+$-8XI#Zz2ds?(FoFwq}l=He8p zVIrj8VtXbR|)CAmi*NdrCaxCTQm_dE#bS}ca98EoIWnPVr9QFlCIp$Pri9%dJo$X6T!$7k>D+qro944G7trDC0d zO@k~?&C*1nnO~;hsNA||Cp$Kep>}%_JU=N%r6OrG+gq$`rH!sQMTA^QlTa@G6cRES z1^vkuK3}7^hV3|*hVcX&PCyX&Ae2s#>l3x>Sl#`!S}7BX#L%^F3xel8hwe&Ox`6IV zS8gVtW#F@%&*4}OQqdXgPhmAJmU2Z5O+^Zgo^*nRg#}dIz%A7fhDJ1#piyg*%JfpM z6jAgr>8MGy+F)w>B0{R{*s+O9sfZp5QLB^)hhwOrC~;F|dSQvhsTsyLP7n&4griZ) zg=HiRsY2$lRYw(pWm4sdY4LI1Fzw_gx3!FIuOV4)abJ1{Vy zpb4-&80i-ja}vz}7w}w&#RNT>E+2kgYUmRuk5Z}G%*-yaVJt}^+0V?}0O)kn#CRIV8UCue31;FbxBDr9FYFDo82teV=B-#xxDwz(ZXL`x=G;QnrjQDN$4v zxe_K1WPt1WC_=$7bo?Obgw#FPU#Tk$@cmYu-b&vCY{zMp-UU8L&J1imX<)0;I2eDHkG^w#g0j9|-F1<~~zKhG$K1jhzd z2Tg6oEgT0N4^*|4CK`&g@-n*8m1jMmg8*{#0VhxUG@6n^Ub10WLBs{Aq~Oe{fPqaa zckb*Wx+~8CK>I#SUkqqAT6xTl4TD*M?X~>Jg~fmk+f>F!yMXRW*KOC8u5)s4^pW&NybAgEfi68 z9ieE9ZP-X}DuU~J6pKZY$s`jK6U1V%>jSiu9t*QGNTHz{I<6-{KoCeg&%<+E%y1ml zuVH(VOiwSq)1Xi)(%UyoD%qV|(v?-p(f9E@k01zWS~jt01lzXpyns|Hfe?bZxjB}X zmOu!sW}Q;GPH#4Y5GsbQqiG63AhB&5UDuy1pnYu1Zkrp +
                                                          + + + + + + + + +
                                                          diff --git a/widgets/login_info/skins/xe_global/filter/logout.xml b/widgets/login_info/skins/xe_global/filter/logout.xml new file mode 100644 index 000000000..8005776d3 --- /dev/null +++ b/widgets/login_info/skins/xe_global/filter/logout.xml @@ -0,0 +1,7 @@ + +
                                                          + + + + + diff --git a/widgets/login_info/skins/xe_global/filter/openid_login.xml b/widgets/login_info/skins/xe_global/filter/openid_login.xml new file mode 100644 index 000000000..bf0ce028c --- /dev/null +++ b/widgets/login_info/skins/xe_global/filter/openid_login.xml @@ -0,0 +1,10 @@ + + + + + + + + + +
                                                          diff --git a/widgets/login_info/skins/xe_global/images/Thumbs.db b/widgets/login_info/skins/xe_global/images/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..bca18c0a3534f575a0ae57f7a030da5287e3d18c GIT binary patch literal 6144 zcmeHL2~d+)5PpCD|0g6Nn1m#tScQaJ3UVlTKpRjFoly=I1r<3Iu@%Zuyr3#nRH|hJ zkroCVv}$d!N>va%5EZQAP_H6ltDqvbV;zE`6f5bzBv^*AG~hT6Guhz1{ua z?&iIB`DcDpQOSsA)Q8*=iMkamq|@s;0oNEx;vvL<3w+(f#Q={-t6;V@Cox1!k1AXb`Xj$B zX`E%wmk1Js)^Sym4*hk|ppAkm)T1AB4Z0{rq}T``M-?0NFX$(54aB*lsebHwn)+oq z4O+9R<6!(Zg08-5|FP}Z6nxt^|8ZTwH2~*72cQSQ^*|r^FaZ1oAU;3QPc93b@i{<`f>E%3_NRjfRgfx3ILbws9Ue z-o`=MlVZ9{4{CB%2lh=KHreOant6EtnBSM zJ95AJI&atRZ}#ln_wD}gems2SXldE8@`^KO&sEo)|LMZTtJkjoQh%f2W@Gc+d-q!& zv_Aa(4|)5Oryb9pcmCCd{UQ*la_g06ef;8sUkr*ODJJ%dV5|U;e2O-8&=JV|nPG7T z636wrLXT}lB~>h`Q$U+2JpKw>Z06i-F2}AZJ=4sw)IoXn%CUd_YD9V@0h34a(Ff?I zj+}ldx7>R0Y5t}SPsK9n7t^y^Bb{8gMn#*=AhXLw{$)hV;kXO@rB8x8*Va_n5AeqW~Oxu1h;}a3)@>_EVHalOG|w`yq8TrQyi4#Ysxfh9X|5GiM3Ii zyJ{}pIQjSSkjj~|xr&=TarIi>lRqnA7xz_`uP*ME5nNXpZI)j(Dr)R z6TfcS`me43|MkcAcIy8N&-2|DhveSXZn3f(F^_V6uIx^=I&w15Z|uDJ(*nk%=S6Z# z1CkqZq}i)8O&d^1+UZdihuSKu-3(-xe|VJdQy)=iop{pT&*^5!MM21hJmHv9$>jaB z?`4MXbTdi~Dj3!%ZR$9i=rAe$G~s7; z3dB5+>?U-#J6<_4eNP-!+U9Y{*00fY`^E-GUt6i{Scxl@=z7p4tE{yBcK3qJ;;y>T z4*if*YeI7O{3%bmv#@p0S=f_*oOhIec+LDKg!eySy7JrrFE=$A%L0V(dJ~f;3WHr| z82T7?p;4+w1Nw#4-GKLhc+YieKwA12?!Couz+UdQy zBRsCf)Egf!aI7H5|leZ_o|do$4f*4N`Ts8hdzPREmeKN)d!z=Ahkp|w1+|KM<5l2 zqR|rEraWsv>1iLczs8l2=ds5o)Kd~+hUN8Mv)+|s%+74ABw_3LvJm( I)4QdA06somy8r+H literal 0 HcmV?d00001 diff --git a/widgets/login_info/skins/xe_global/images/black/Thumbs.db b/widgets/login_info/skins/xe_global/images/black/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..5c2f3627fd88a50cb3b76fa991fa77cd1e10822b GIT binary patch literal 10752 zcmeI2c|28H-@vzdN@kLB$`CRSp=2y1m6W0o5;Ap6A=9Y{QD#?BP6HAZnG+5vGNs5& zrplPkk>MO?*w5Mx_q|W=dp~vW^UvG!xoi8{d$0MohTq!jch<{xo{^gm*N#HpIUR@r zqQPts^B?@_z%#;U#|=UB-~oB3!7%*A6N13wKkgT50V=5Ls;_;>2<}V(q|aFZtN=Cu zJAebg2|)UKHMnyDzz~3V0K5P`0220(`?Xr&0E7mYAG857gie9G4|E3fKoYPCAO(;H$N)A2WC3yj zd4K{y5ugM>#t+hlssJ^>7JxcH1E2}m3fKk+0c-~#qgw}{3(y1T0}KE=06PJO03(1g z0MTbA;JzDR3fKeK3)lxR1MCNw0}cQV0xSTB0EYpV04u-|z)=8_mkqev0*(Rf0QLX} zz;S>h-~_-4fW$?{;z@ujzzyII@BnxMP65yWFMv0|2jC0v1Dpo<0|Een03@#{*cndle?uADn?%hTvMi3nsRQ5;(;Q`Pz4D|HKA8?G|kBOCuiII_sorQ&& zbrt)nRUGUb9Gt6pxj9$!tmfe07UbsP;};MRSj8o@Mv#9EFTVgkk_jCHNW;j)#>B+N z&&k2b|Cb$H3-Pcbm13Y1gXnqa7V*<5BD*V;a(StfNv#_$UbASk?V208$ zFwiqHAhiauLqRyi$iu|DQCXjv&)k7U%$r~3T;feuaf63-0ta5>#pve-oF0P zvGKR>-cL+UO%vunEi5iA6G^r%5fL!#9j0}t{h+K5^0RRRbMy8F* z%)I*MEDqj$Vk+lY`3(|pKCELCS3Q6iIPUX`T~I=8RFZ&*_F1x@6YTuolI(ZE{ztBU zXcYq;=sX4L6tlPZqdW*F1+9mY3mZ)wa6120cc&F2kwruD0%1&Dj@+>*Gi*bE+st+CGh;MD< za~vM87>!+E!MD@sZ7_rt3R<jI!1h zOG&d6fuZ`^8ZpdER6UBw<_$xQGdGCAWN+ffXPG+q?x-`_f&N;1%?_3oT^%XAw(G7$ z-X)8x(JZUH6T%`N=eit8W%ZFWq#n;855~FCgeTPQHka;JDmjQAwwCudL0Mqx4FWN= z&@33L%ee|eO@7~doDQ%e-XHnMHGR;v|4wYldUYB-V_A863XiF%h0@@q+Dms?5?_WN z(j5&5(Sf0xpXzmq8f7pvHq&{e%y03K?mU*lHy^)*CN0BIvN8_;G7|+uSXW)VYYt}K z7WLh`7EK6K|8WJiT^WYLgV8jFc%tnv7j7~H-$>*9fFoAwmKGO~NHCNFLnBdS4GJ05 z`N}Zyq!||swU=OtYMr_yg-SE_5Yvv3BXZ`oYx_-N<-|-zQk|THoh&0wguGDd9r_!T zp$i_qQR7kdU5r>!qCH)clw}#{R8)TdP>EEdD92--+zNM+qsqCK4Mmk3Q2W_57Y4mw zcN0Tq)FL;fxHoAwo5${3hvPF1UZ{RLYT)grTwEMH?BttFyw!`BY5-$nU%B0i>v^0) z{vylRZO1y42n%)F5N0Zeol;Yf3IX5;Cv%e+rVDUctAUi*W@yLrCCtAa{XLT3(pL6f* zsFaoxelo)A-MNKKLlKo0>=J37E&lc&vxkyrZ2j-!C#Tl>KT>||esN(YKiBv-@k27F z@cEBc)y3_7VlVCCCSsC$+dOLpI!rb3#i?H#w5eRqWd(f38AW zQeVQ4*XP`)OY20tR3VgoiNtUgLs zvZ+n$FE+R@N{yPj)L|HKGtC1qv{%*gxeE+Et%ISSUd)uaR$<;8W)zbwH1?=5TxSc{ z%IQZi)VW81biwWpN-#r|hxk%=s(S(?+;90_JIoc##gGEpRv4PvLo323S}Q&c0#kIC zz9GLQ8@blf0gsN4eZvAng&*Q+DU#lcJrq$*;-isx@@gxP#^B)g*%oRujwne|~J7 zdf}xsfZ=shFKh7>m`xnG7qai?U|ewx*Glv=7|J?a>eyQF zLb;t9CkgYmbR5hW}oSSR!t|=p3e(J$<5}CHfw-&P?ND!hig7MWL4MUOZ@F*%% z6=(vv%ecE5*P8uFd-4(ASk+RNjZ|#1neo)J zU`VHNx?B0xk0$SfU-`b>%C&)*K{i1}=?YV%Mo>g!T#0UZO%n|9ag~vd8DqWhFqA(( z;6Id6gMZ=OcyuXVBd(NS{6VRYT2#Z2B{N~B8jg~6TbB#asHkj%NKwD8YvTbm4<_V= zWL~%~IAPU`hgt%M>%wVR&?X(SF&V9S(S3yWaNQXihALK3pvw$H{h*M=c`PlB@0NEd zm^qPl$y@DW13ITFHJ%ORTVM1%Wq;oFcqWUC#Hq>?Oh>GIST}GRZ-}9^M?Ni&Jk4ok z_E7G@{rjuv%-SZ5y+(_;M8aB)lwZ)Qd{-O^mZpz;Ji*GC9%6U0raH#dJun~-ow(2| zVCl=vY{DRMRx6z{TSyEgC^YWEb>779EAu$bAY!va=WNHj#1j@LRCXR!r$55{cC%Mw zI#o(Mf8TYFtZmB<+uJ3SKZhvu2Sm*jeHW88w)#KG$ohNsz zMv5XlFK*vLIOTrDCGAQ2!pC)J;W#uGDRD0jeZ~3mEg4mvr-L1l&b=8I`<0Kj)S(3A zwpicat;-&mWIa&y{=M~mQB&;p;)`sFCoZSHShQ@R-;q~XFD*W!Q@n!~rdTa%S%jU( zRTShBl@~&Ff*-f((Rq6G@ZGO6#0%{YR%bU=m~(Uy9=P^FD{K)>PLCAvGIXdKc2>+mTU6H%Dn?`wBP_Xq*WyR~V z4>#vlF>4vAc;&He5DnS4Dg3rtPFbj><8Hr+cGT&)uozOxnN({`wE|_ip!Pv%<3_^A z51ad_4{HQIkH#lQ$+E2lmoToI+CN;tm%vc3ELbdgdwK_Erc^CyEnot%OrIg1q|F!H zb!^S+{`j~tj1#p$)ukoc9QdeH${Fj@Si=cJ1yf-0j2o-+;DaF#pul^YF)KFvnje;K z#*U`FZJ3UTUl;h8h8sl&wVOtI`B*$BF|PAjf7ei4l)`=2+`a2teFkjwGL#w3`5h#p z1DwSI86BdwJ{KPD%ajKyQ3rfk(9gmUk$U?5n(ZzSn4RK8XtJ&LUQ47VUPj2W@Tf)9z?|Ni=b>+U#aQuGdu14|MiA4Pqd*Cq18 zkc#K~%MCYatpqfcZF!g|}R)CW;tvR#M*3{}|Cu1OXYmZuZ2 z(J)kO7OS%%p{Zkz+Uh{*4dgNt&34IG=ZeXcIY#(5&`a8%@ z(7+{>hS-{d!46*ySO|82-Mt3b>8k?^f+4U97y#r!$WCBIPytT{AXNWzs0y$fXnuZI z20lAMDDtKcg@Rna*dpkW2c5c5JC#_2gT$Nstt6nF!eVi1Se?EVvn*gui1kl!p2yVlR-Wep-lexAf%?1ev* z=Fj3FO9i+0<~~!CzTG}= zpE%I^XkMJRy%@@!A9wPtdZ7PgZmYo6Q8Qls(dsh~<~&bSm$?V$AF+>d;7Cnp+bC(1 z59uW&rfSQY?IoULPR_Qq8kp+fjt}w>wN400d3?eC%5Hitwdhy=sq^?g2_>zabbrTd64^T5V#cb!2 zyFz%+YaP5fv5>P=h$1yiFu|Ol#!_WxF@0FKPhn<7)cg;D^Gg%0pD^+ML)Sdo+w??C z@B;@x(UCpIztI}l=1#|6=aCFZXu=l4q&dBBdbjXG8lG3e4>nK*Xl zy!xwm4IwG)Sy~F#a-=n*H!@V%p$}ndu4O@X4T|gg`ugi!UC;$~^_*2a5pfdMQS5m) z?14gA4GA=mT&Z1@+*@b4m))eh?a!*RbsL zShU@SDJ7Mq6-vA^iQRhTlo8`PZr111bhl#cF+X11zUi-^U*!9X0b=+^fBkppFT#rS zE!=gkg^?eRQe>t5zumX-oA8UQznlJ9f4}~&_{;Af2yMm(E4#LEWVEzgeK0pC;p$wG zX)wQg)~B`gjGT!?a?_@K(j9W+r(9v0-=iLKGlB`a|Y<=0pw=F?p@3R0IZKHP% zi9@?S>}Q~K(+HHwPu3uMJ{Esz#%=)Hi|Z4Dp#jta7g?2hd+s9)SzaCvct6#dnQG9_ z_EAE4pk88*=dCR7ZyOJps@nUrvq=>)F5O@u-KUO|x+BBK)|=G_-P;zIoI5lX6roj> z|5&D9*s(cP%XXLeh6Jx5Uac@5t*LqrKoPJ@fNu2mn&~87Qu)r}X z(lh9AB0)Uf_t?2RfoUck?}+I8>bKX;pG2>HVVNnVDEhhdG)w!na{VSz zZ&exzhTiDDxIMgw>re?n;o_-;Ngp@$wEf1n6w-U<8@=SR65Q-OH@pwT-)^3Rc~VPY&MPuwzJ6x)J^8jiS7$1>~3?Y;w z=Fsg~^mK{29!u|V7iQZGjW0y8OGhpchD`AflD%C$bB9Sad(s}vu=epiABf54nZNA_ zeTvVO&SCjEt>zC-A6S4>6<*-vf-*Rn;Q~%9Ap4syJ39vC;j5+OI5?Z&2QD-?zp&@? zX&dxspYPLr-WdHMjR!dQ-~`ecfeW$7D1qybX^_(&hz01+%W(xI{xJm-`I{5J-j^V% zx90GKCQCTo`GzVd=E=R1n(BiRNxMzT1`hYWsdi((Y-$m^YEz^d&i8wAPFi|u;)<*| zAQBkR0#2tBLDVR!R;wWx21$~DAQg^dD2fmy-rnv6K_!B~DwT?)2%Nw`l@h~Ig1{jd z1R)g+fhtgiVhBlKbV^aU3RF@gjv{IT#}HIaku-}EB&J4S^)#&lL69C#QaGZ9Ndkvy zT?oQZWc_+AP2dCyK@bSh3<80)9}L40tyV)r?M^2_pctw~)M^-p5fs62daODtYa@!l z8V!l#h_l_P)oM|MZlO?&-V4St452ri4j9K#7=|)3*3&gwgdi}Cc0%Idv~xnGQhGcd z;Qx*APb>xiXn}>(veP#KygWLsdVk@8qJxJHA2G-&W3lO2iTSu$u8uwN$C=XN*wZF~ zz#LjEt_~H4)=9+2s*U3Ff-97$f-R7+B~&Pzx_*}}GP3X51oluzC~-yf*I8R5`(A8n zBSEmA5-raqFCX@_H;Hzap=>J%@`)XG5fu||(jRT@DDnp(68L88XmOj7lfBf^^CT)+`C@MR$=qa5%b+5#-wj)SDU{1pzj)P zpTZSjgTT_=UlI%(Y-_+T!ABDdSe;Pjn)0cS_Tm}Fh*DF4Ji$L|NpginUbCw(x<0$z z5Kp*-kr8ctB{LdCI1@5 zkL|9wD$~2&Q$NU_@A=eF2{1XM=b!K4CPwH0ZU&H5$P{%OfFy~lvWP39!i)SjpRyn1 zq@H3ixl(S`+%UH(f|*v}Vg!b+?$#G2>~%4K)zU*UV0EsW=$Dc7)tn#=Lkd14-c@6k0#<7oT}>&E z+7z+?klIhTa<$7DR<5i&#LC^Z*qQ?vdxlsuK;^ zJ&`$lC~$_4b-1qV?2z5N{?0nX<*QA6-IeC1CqLJnSjlt%F@LUW1?E{+j?~YS$y@m` zlF8({7@7Z~YmV5-WIuSq)#?q)-Wet)9JjrwP%u-t_H!)Qmt3}UH8H*o0pPAf-q+`5CO zk>=W%voaWrF3nb#dw71$S2yQK93USeDV=HHmO0b#n$!sxEZ>~3lN?{l(?~y+_gPvVx%p2>T`eBcF&ai yb@9H;&mYG;p8h}|VDexK<4N3db$lh$^UVQnPF0fdXeDcb!p7g3=B)>Sr2hbpxJeiQ literal 0 HcmV?d00001 diff --git a/widgets/login_info/skins/xe_global/images/black/buttonLogout.gif b/widgets/login_info/skins/xe_global/images/black/buttonLogout.gif new file mode 100644 index 0000000000000000000000000000000000000000..3516fa18a5a0586a634fefd190bca236a5f08af5 GIT binary patch literal 946 zcmdT>>q}E{82-5}w?@sgk*2PB8V$PFibTz9XP$Y9+PVJDr75|day%pnNkWyBIB1FzMGmrzC`fcD2oQ3N)C)W$B#tze9HEp+LRuo(ONHI;aO`Ix z?Ql3K2{Z*+n&((vfV4y)Nt%%&K}%YS;CaY#EJcxmz!8MKw6p|5HWGOvihMjC2mcj} zzZ3}o6o5_tuKxEEpp3f>Nnx0M>kqtY7ld{A^p>U(V zcl1gEHdm2=WXpztZ}XS-u4YSY^g}bY9dx%~sTI~F?e5IaQ*Bh?`e}du3atv{{snG7 BC!hcT literal 0 HcmV?d00001 diff --git a/widgets/login_info/skins/xe_global/images/black/vrType1.gif b/widgets/login_info/skins/xe_global/images/black/vrType1.gif new file mode 100644 index 0000000000000000000000000000000000000000..65772afeeb0b24a717dbc5f36b548dc591be2b25 GIT binary patch literal 44 tcmZ?wbhEHbWMtrCXkcJ)cXwxCU{L(Y0wft2bU*}1hJlH>rJt3-8UT~c1-1YH literal 0 HcmV?d00001 diff --git a/widgets/login_info/skins/xe_global/images/blank.gif b/widgets/login_info/skins/xe_global/images/blank.gif new file mode 100644 index 0000000000000000000000000000000000000000..35d42e808f0a8017b8d52a06be2f8fec0b466a66 GIT binary patch literal 43 scmZ?wbhEHbWMp7uXkcLY|NlP&1B2pE7Dgb&paUX6G7L;iE{qJ;0LZEa`2YX_ literal 0 HcmV?d00001 diff --git a/widgets/login_info/skins/xe_global/images/default/Thumbs.db b/widgets/login_info/skins/xe_global/images/default/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..0a337d5149e2f05738048d6d5b57379d45f47ca1 GIT binary patch literal 11776 zcmeI2c|25Y|HqG=knAc^SrW;fHB-u#BH2X~-4co{37Lk7h^C_4Awu?~g``Af4W$T0 z*-JlkCs?|W3wy*#hy)xG@jd-Xi`#e2?~YdhzAo$LC}`F_rM-o)FJc5_)T^1Gyq zFd=l517ZDDJ_GDyETkm}!U#JUbQDFuWFiRc{*!*75txT_<${YR05AhA0CvsU0Cs=_ zSOjna+yHj17sHkZfGL3R0(<~JAP8XP82_XnV+3{~UhwCKtVHw?PuTh(fp8W7coKpc z^UYGG?=%~G*36Kl+Q@*_+qCLSWu@=5`Cc(Ic%W~`$F|?A|E)X(o6L~5AWmSl6LJtn z!SzelpZZ+#7mlwAN3j3uNR|K8(f++M*w271#rM70P|HLu-yV|1@r*}zz{G3 zjDc-{39uc&>YKvW4A=>n1G@kVz!IafHq0y>EG!%X+??D3 ze>$NL5ngueq?j01BaFNZOuP(e6*i9;Sm1226aJbQ7~vdQ+1NQ2aYBV+SfLC|OpMG- z*jYnu0+b`nyexdHls2>Sn>(?s_7+eMJ(tEVp?C9<;I0>Ak}A$VCpZ=f35zUUCMCT_ zX05EM+6HwEO|30k^$iS-jJH`>T3OrJ+S%{>$z{Lm0XKJFza#!f0|JA>!cRs-o{EY- z9~Xb&V#3dt64NuTW@csQYH0$wzjpudfn06*FW&? z{ose8VeHSSXBG5?Hg)%-d;C@ zZ5!^#pKr~d+CIlBeky3|&u_^>Qq(Rt6rs6ip-A|QK8mEr@z7Zpa>_MOBr-I3D~epf zMG(jM`cZ`R0!4TjDN!i0iO5Clk*Y-z@xnE8TNI&ADWM5P&g-U8_N6??0b7_zD6*Px zN>|S9o+yeO5R-4A>F=*Rc#%YKT~VL%l%HuCZ;LFY|LkkW*fliOHIXPX*kMLn=9WrJ zz%NIU%7^8viOr1poAS9jMR%+%GB7j1Uwem{#hqK1dhR3}%(S7eJ&F zuA<1JtV<~J#P9bRM>+ztJI6C8%yMY?g>%PLQ6zN)1-C{!H*2#OKZ)4`#L zZZol`Wjl%t+{67oV>GyB7$>WPec(!No6XWI##rEBZ2zf)A)U2k1!MA0Hw_UFH|cdZ zqSl^pAjDk1Q-luximlk-o@%NKh-Uhm_x2M}CZc?<l)g-DVO`}-E?)8Juw@RPT%nt_e_a8u! z?A?X)s*msqR@5-E`OO|uY#9BrXT@X-%W=HT(|st?H9|Z?q*~x|gC+1EMN(~vL+mo? z(LK0hi$0cflF6qZrcR69K#}I~>l^NihpiD8(OES6-JD#Ebx~3CHb~pp)4st>h@7utWG0FjiI+Xm(5%I~=jR-MzAWpK z;+eh`N)9oxrA{%fMJeG{D3Vv2>N0bBM3ofOZ5veSTHVEgA~)i@sat&atRuR~J?D50 zv%i}MMXK8iIQw%(Qh7e@_S|0wSnfJI* zUBPu$C4q9?yQe933yc~O8#O1Jq1x)K+VJD5Jk%qlDAHmnI7`CgU@-(2(lt?JXgfV` z?A&gJsvuY+Mw|5oY&hl~+Bl7QkxqB9!D)?>=PGCw9&KB`PeXD zUqO+YRhjg#rl|Ei_1$&vrGg((>(jf&^L6X9924+$*MRFK$>un10T_m85*vyJ`Mb1!WLsp~|pN*`RWLPR?Er zjkPi*p4aPU=jbB74~dgPWMMkeEZ-;4O8x2M1Ck83Ra}zT( z#let@5AuBqG>$NE)olqd1p7!V0r)C=>)Rf=Bh8L(?dE&7#yRMjr>HMZ3kl~_W<6}! z_MoCMb7JF%QvSZO>8lQFPRE%U4$X+UU85b0;f1$89>UixCwxJMTU2>DO3V6V%=yI9U?5T%E{eSV8a4E=+nl z{zjVd4xep+Pl>f~Yelix=w*t1t87iS_Ja(CCy6CCX0H8aB0H8=og3!WihFfh&RNda zqE+>+wq4{7f~MDcNlRY|_J*_1EcYtCm0-Mjwshs*nWYcQPLGOdk`L-SS4qBHwd2!a z;SJW6(nV7iPPvX(6VzvRjBN5lOVV8kQGFQ-2Zg{9H%Pc)l{}mXIjhK~K&Q|C&Kh-;)}Gs`go--dQ_{ zEDy@2$#+kU7A>mo^sHuxCyajB{9#M(v&9}4Qw?rhq#}vQFWl-Q8^gC&zdLmPisZ*y z#{IQk&VkF_sTw5@!kbhw-{h($og2S?t}5E{q)6@gSo*ZtjXAccN@7#>OvaOGE8KY`S^18qmjZ-klM4bk4gbyn_zm6_t50cPIYDVn1(&D^HXMvTkvwTyN=y;6Eiy^(bV zC9c7feR=#~*zm^9HEQ(BneNuU`Wp&z2w8han0iQzH%0)THZ5XBg#~c#8$Ga?%Fou$h6lySDTer1f2z^Kg(;;pO9m&FW9_aa5CY;K#{ucj_2?je-0d6!fc$Es;3&y zwCic&2eWd>xsRjc41f3aCAngf#{xxInrM-u2Z&8|DAHp>Yf90vYKm4PQE5pivPCUn zPeEQVH+g?{Zr2{7Gro2@D#bDBO5t|YUPjv3dq$Iam;vi`@#Z^DZl_tX@2+LZ0CyJC`Ly=io(!X`$HD3@( zw@;kFZAAAG0k7Q1@Gbs23YkAb{Iv*S z_$U5ah%0~m_=`O~T80UIjm^ftocuw3umqLiFen#Fpv<^}Vu9%wUsN0>Z0GAtcLr?& z58A|UYyD{RpAljFubTguZuWQ5U(sLn;DF!sM@$R-I|!pLI;>Rf7E^ts4I*K#*qGp^{2^uGU*|> zzv=(J`LCcKkNCdHRxaqq13}JE^k=MN&Xp4~`xvv$<{}9<3J699$B|Lkn)hPfvEG zKPYDPNeNfz5g&hw`+RPjnnvVU_JCZIL8<1awZuDvQvyCLO@_M@0=OC&4m`fk$bZpt zd2-IMUd(wzCbo^-dPf5EO0^NQG9wXufzPzA{2h|fF^{`a_q}A_t3~J=#HgOKS|Jkq zV$@mWWZj{%DYbTEGQVl-PIm5~XGHJ=saa&7bv3`X430?0! zj`R0%IR!+v5ntSCKPyS!W9%S$Rmbkbuor z|E;&>iV%%nukOpNV|G z{`2H3GyHV5fVGOfqTzR(+c*Ek3HLKUg8vdiwEp@1{V$21S9ZG*vx)A*?#9hjkYfR)abBv{|r>Lh?Jj2URV(GWl;&{iT zlFTHk&Yso`uMcgLHs0rQev{FB$E}FthIIvXBM!6eDPvuZk8&uwfBn)#rzucuQtXC5b**of zAXv}LZFAf|E!V)K7Nf^r*m&;py$xsI9hE0V&IlhSK9<@4(#tE!^11!^ z(Dgw#b)!@l_DwqLnXl{a0dX_?~h-R)PRE_`f{NvlbyLVRbro4Uv?%eZ>q zx-`8xmZt5Irp;Z(C$CzMH8FiWTKrhYtVof$aAj|N&$PtNYsW~@K0^~vJmmA9uH$lc zV_P1b%ufoo!m(x+ltj@yL~Rz&u$e~%`3hpW!ko{h|hr$>D8Ou#J2qUM8PmT z9cZXZrSj&wHy)Ub_56fm{TS`yc8Elc6JMAA8bo8iXC7FMKZUg#sl@A%9wk>8ikP}rORuy;YizizQO@}Km-F#?$WvLHqLN~Jpp zZ^OC3+e8NNhiTY~@b_zF4}0HgK|c6Z8$YP;1#c#8UwDts4fcNB0y_$(Qv6yA{A~*_ zPzU{f(*~>l{j}1sRrV-}&c;JGn$V)kJ#^KosC2>}wx}J(ja|`!m9&Ylg-(S>BLjI; zcm|3>l{IxHf_pl4Ly|`ZtLxp;6xIpD*8}0Q*L*bJY!8_T4S6$&(7F!op3^Jm(+Khn tE?)h1=-FB+$xcsmqsbd*sbz9n=g-`9JN6>z_4L6%vCzJ6%KuA^{{uY`4m|(> literal 0 HcmV?d00001 diff --git a/widgets/login_info/skins/xe_global/images/default/bu_v1.gif b/widgets/login_info/skins/xe_global/images/default/bu_v1.gif new file mode 100644 index 0000000000000000000000000000000000000000..6a54d9d4e007eff05c557c4c354084d674e07e7a GIT binary patch literal 43 scmZ?wbhEHbWMW`qXkcKNGiMG11B2pE79h#MpaUX6G7L;iErATy0I56%V*mgE literal 0 HcmV?d00001 diff --git a/widgets/login_info/skins/xe_global/images/default/buttonLogin.gif b/widgets/login_info/skins/xe_global/images/default/buttonLogin.gif new file mode 100644 index 0000000000000000000000000000000000000000..9942ce25993f2d0ac2c27c6263f8cd20b5d52ea8 GIT binary patch literal 1779 zcmVfPz|5_&!GegS zmz}k7c$bQhsBm|dm71}6f1HMkqnVzuprp2#oUopwwTzLci;$+Ap|hKxvWJYMijSs^ zlBaBQld-kKhmE9&jiZK)qlSy3h>oPe#LtC_qKJ;AijSrF`TL2Eq>7HEjgqK~kEV%_ zrlzaHf`_1qkEMu>rH759hK!_bbd!pYr-h56z{JmnjG~N@sDz23ZFH2BnX!e7qrSn- z{r&y@{rhvjirf?sj{}ijFPK|jiwxW2;8go>s6`~2bK>(|-iqNcc{sJW)9 zx~HtXud~9iw8O5l!KtmitFOMSu)vz2x`~dZhm50pft-kqr2qf_A^8LV00000EC2ui z0HOdO000O7fPZdudWD9Eh>41ejE#(BTJ5>q>tsxN+?^- zJb7~EKAby?9!=UY!W??ws9w#wwd>cgW6Lhn=a22%eQ4Y6BfGci+JAWa9!|XY>(hEj zC|}OJx%21Hqe};VnYt0nMo3(*-p9!H>e-uH=iXhq`Sa+ZBR9dmz5Dm@|vRPy9wAKZq!BS zVSl?>XyS<|N_Yl?dZ^&yi!jD0QitW4Xr}pO8cmkq=9_TFDd(JY z)@kPomaTy2kkpkhq@TOR`DdSY7Ha6BadN?+0WCD@=%bKED(R$+@?hzum}Y7zb(?xg z9RNe}Kpmt*wlFHCsHUnar96PZjR7abD(kGY)@tjmxaNu>pFIB9#|hNYIwY{WS=u+Fnt2?yo?z`@? zAn&~N)@$#)J@mjrzWny2FyUE+~%`B^|^2t1({Bh4f2Ys>+ z97o{C(MTt)^wLP{;Plf%?}5YAR99{F)mC%MB@k6dP4d%Bhb{KlemrgV*=HlY2geTZ zq37Fh$E_#XN_%ZL&kb@(m($zB$jHbDsIfmoH8E)-g@Mz!+rYfr^8J|6$)?@fepO(&ifI- zJ0bkyh&#^5@yF{)`Peix@BH)7M=$;K&yP*{+sGg9I`Q0#;ClAi%TD|M_1eoI!V1hr zK*9R!`|kb>GjI=n_=MMQ|KKakKY#c9i=hAiV#^=$5Vry{BqRb$NT33jfB_7+4|wp4 zApDY$g#Ynj2t$a01~rEYwc8{g3?=LaS>adJ#s9t=|VLdW%wc*c8S@&cDV z#2tYMUuZ)C4nP5eQDBEYOdth<=sp`9VTJsYffnaT$2!ihaaTm#3L}`uBHGb>B7mO_ zJRpEA{NW7-h=2jcP=Ns`;E^C0zyQWz04!J`3v9T+1p*L&5F{W_0TY-&2RiV94@lsY z5@3QVi@<~;xY7khaDgmmNy}Q=@|L*Fr7m~LOIW&+l}tdT1WGx|P<}E2A>iZ%Ho%4~ VSOE(Ls6Z3QzyUS9!3%)^06Tyuk3SzGC-2^^F)Be=ccEpU%q_V zXtbg@R3iZ$pvahwbS2!>!7f*=?SdocpXF@zw307?*k7{O2&K`{dH z1q<$UItd&laRP-gt=>YA0T@QL`c5>s8Af0@=|g-Pqd5==G#I;ZlpqPr2M2or#D@ii za3X*qIEwh{jn;*Q18<`*taxbDN>fw(oX=!qUyA|CWLuP)6l5Z=?%tH%#bRzTEGKo6@`V>wQZN%%^eo2 zr78^M3DmrOZH2X$I)CfAQERK+$2%PgUjNj45HG}JUTXN9mI)5O3+;FP8FhM>s z`PZ57vC`&4$^$K?@EmSw;z;TaA@#F!KK>+_r=sWddXFCM9|qI@$^52w^$%w*ht>90 z?)6M+TByeYDW;C^h9lZmp7(o>%@{95f8muEOqPMH=!}x*k{!8&2Ei^bjS1x6Kf65R zdsX?h8!UFj-o-zxHy&B*OS1NZg5%%LDAs2sDq49n7DwIcbk;%vzdcXYv)-G1727*} z{TWo__1>ff?0I-UOf;5G0k-A5_q)`w-&a$Q>TU7F-a zu)isL^KQn4iJlMxGf~=Fa5O&emx!V*@|#di#-pypovo(HDf&fGy1w;hdYoDtvFY4U zOzlc>{qnzC+A2m#BP2e2VMI+!l>?A~s(7+Tc;)p(J2&Zy@?KQD&BWj&w@Ujt@mDCh z!gvvd%HNtSM-(BPb#j|} zk-PCr859=pQRE9#=Iszo#EUf3D&71u+~TMLh+E`tGD92irBZ0a z`E1ccQQs%oHMepuNA5Ri`0^DaIf9K*O}m7f>P$|~j(I7S!Tnceq0rstU+H3VEcYRoTxj=Add;X{$7e-7{-mDJ)7Y zy2sA0Q2ZGxd&+}YvT`LgQue7?M$0Ug)kSS{^Xs_l9`8&Ji|3de^t5tmeP{}gFQ=us z-4y=CBwc`;Oq*0?Bn zj4C%!7rNS^f$70$aMJKhxv;qA9qNeOlTBe+uWMtrd$uwUX;h?(e4HNM MDBR8rX98LO0m>okN&o-= literal 0 HcmV?d00001 diff --git a/widgets/login_info/skins/xe_global/images/none_ssl.png b/widgets/login_info/skins/xe_global/images/none_ssl.png new file mode 100644 index 0000000000000000000000000000000000000000..b7561bfc406031553257c5750f5429174d66c468 GIT binary patch literal 1152 zcmV-`1b_R9P)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ<08mU+Magk(>ynS`nwR?M=jeTS=zDhh>FDNZW6Xzz z&61Gz*w^Q6XUcbT_0!Vy%E{?~e9n}T=WlB8wzT`~?ChPJ=y`Pb-{1ZC_vdV8=y-GW z($VK@W$mJ$xwx?V?d`8mO6{PXxwx<*A|fLrBP1jwB_$;$CMG8*CnzW=DJdx`Dk>{0 zD=aK5EiElBE-o)GFEB7LF)=YRGBPtWGc+_bH8nLhHa0gmH#j&rIXO8xIyyT$J3Kr* zJv}`>K0ZG`KR`f0K|w)6LPA4BLqtSGMMXtMMn*?RM@UFWNl8gcN=i#hOH52mO-)Ts zPEJoxPf$=$QBhG+Qc_b>Q&dz`RaI41R#sP6S6EnBSy@?HT3TCMTU=aRU0q#XUS3~c zUtnNhVPRonVq#-sV`OAxWo2b%W@cw+XJ}|>X=!O{YHDk1Yiw+6ZEbCCZf7mzbECnVFfInwp!No1C1Sot>SYo}QndpP-Ll?si~=|s;aB2tE{Z7t*x!DuCA}IuduMNv9YnTva++Yv$V9dwY9aj zwzjvox45{txw*Nzy1Ki&yS%)-y}iA@zP`V|zreu2!NI}8!otJD!^FhI#l^+O#>U6T z$H>UY$;rve%F4^j%goHo&CSiu&d$%z&(P4&(b3V;($dq@)6~?|)z#J3*4Ee8*Vx$D z+1c6J+S=RO+uYpT-QC^Z-rnEe-{9cj;o;%p;^O1ulq(=H}<;=jiC@>FMd} z>gwz3>+J08?d|RE?(XmJ@9^;O@$vEU^78ZZ^Yrxe_4W1k_V)Mp_xSku`T62TumA#x0m2m!7Z-pC0R#|8K%P^WjhUHE zm=h!d5I|r7F)m&yDPArykN`jc0R`kagk%(eKt_lIC;|{bAOSuRIWQ360}22H5J-SY z5+WeU1QY-WAdmn9i=c$Gw1glF15f}UfPezB@{FR~?Cjj4jPkOIiU0uwwuOh0pOuxL zkq2Z8KmdURWaZ@b{bmUKcqz}))c5uC(7v?)v4a2P)ZNa- z@$&T2)z|&~{r~^}A^8LV00000EC2ui01yBW000GQ;3tk`X`bk)Wk@<6#nZYULKH{p zEx|?+kif!I0vIL|#ZMubBmjWH2OtmxIFVa~6JQ7!1CK!f5W#StOTv&C3=E8h2vI1s n+#cd5;2fT3B_0kF0v!+!GARoV78n&7dMN`JIW(4+BOw4gP{MS* literal 0 HcmV?d00001 diff --git a/widgets/login_info/skins/xe_global/images/ssl.png b/widgets/login_info/skins/xe_global/images/ssl.png new file mode 100644 index 0000000000000000000000000000000000000000..330eb4e67c045b6b5c1c0df8862581ba4ba692e2 GIT binary patch literal 1171 zcma)52UC-25Pm~ZPR7&msy8=x%!oI0H%F1CbOND7NQBUW3Pg}1y@cKZ2vP(o3W%to zSCJMV6p4@!h?EdW2%XS-2uKIHFaO|nX7|}=cXoDnb~e!zZFu?8ZP>;+@;g}(^`!h3dU`iIeq=6vcW+g&yRgpZLaC9-CiY}&SAY5NIEBSarVSR2%~Cj1 zZ3CRf!y`clqmagqBQt_~hRSQ((`bW*yv5=5t+6e^Y;}Fk1dq<&;gOqbPS1|>s_>8_ zBO@a#D=Q}_CoeC5>((s=1qDS#MI|LAWo2a*6_wk!Z{N9dM^#l-O-)T*U0p*%LsL^z zOG`^zTU$p*2M&kp>gww0=^+pZeSLic0|P@tLn9+2BocY|?pK_O$HzZ=_ADVGAu%yADJdyAIr;hX=P4;Esi~ua&lh3ew~|}`{vD?yu7@(Z{NOq_wN1s_e3HwKR>^qprEj@u&Ai0 zxVX5aq@=X8w5+VGyu7@kqN1|0vZ|`;!-o&m)zu$AeypjfsjaQ8tE;Q8uWx8*AdyIo zjg3uBP0h{CWHPy>rKPpCwXLnKy}kX@r%xRn9TW=X^XJcT~sQSMx%9ichl+g zo}QlG-d+ZS@#V{xzP`Tx{{Df1fx*E+CX+cdG{j=DhKGkoMn>3dHiyF*9UbLzxnpBv z&4Gc&WZvpgPeZfzJYio%pq zpn!k~B0+LCfCL$WFu*YVzH!%kclW+`Hof!C+k3Z$A5~pl-PM)8>iT!RZs8nGeJD7B z{K6?A7=(f{BMd)@r-3k)FOCC2Xdys_f}-dTkq838zujM`2G-zN*Fod)0CWI7Ky7nI zfC*p*SO8Xl4OkCQ+nXJH=mH2Qzy)vvya4qaANc$~hW|oU@gMo9`iMRJoRQ6l8gdbQ zN5lhK?zcNW=rLa_4)ZIQ9o|8pyCdI3LrwQo{D;K5f90BAJ52``=xhE||JTxgJ+Dsf zz~EF6GbptgVhgok`9sw2`p@wP@>hf$9Dg*VvcD_0e@zVKr=i}8I&Ob!`IR88AJuS! zqh3o5QrqOWjDM=FpxS`{Zv0bi2-OCB9sdFl-T(*!LVz%^5!eJ^fz7}cKm-s4!~kly z*a~a|wgVEt4qzuB2}l9bfDEt;p!OeX9m)anz#d>PpaARx_5%ligTPJT5P%18z+vDB zpbV%0s(>1x4rl^tAz%a;1K$EB zz!|_4I188o=KyoyJHP@s4^aE!1;7fR-qQwrTfh#u2-pLc00+PkZ~~kG7r+&81Ka`X zX!Zmy173hP-~&+ac?Eo`O{W14K!c*)=rF>erH)reXrNP_r9L3q2UUZirKSFXqk}(s zCVF~0I(imHMg}G}7B)6k7FO1E>$y1At>;|N%F4mV!O6|T%gf8g&M&~nBf!PO%R{{h z4F;~Eqi3e4XXaVQx{l{}JM<~S$wYl942=jv%SnUbq(N(`{fLGho|gK+KROy(ct!?B zCT12^NKgbLlm>&LrNdC48d7`1d4!IWo@>kQBMjVnW{e^ZJhHw~sZ65E51;Ysw-UwV z&N*IXX5r%(*dQprb=!7{9rAnjD(u^TKt)weT|*PEb^OH1QwFCEjm*EZIB$8u%G$}< z#nsK-!_&_{ATTI6Bs4na#?4!?-^azLrDtT`xto=J?@>WvQE^G>C6>7O?5X=w7`bWurQ7%p>7cCtfhK`Y1 zE*e@l0K-W~zhyTA*AYENGY4)FSzjg|<*3w$&zME!^ohLZ99voV#N@9PCOY5yX9otycFMAKevFVg> zz$+fF<~MxDj(TagBiPwX9II=OYEa~Q8!7puJ+l$nVD?aE1=mEp(M!d3moj6QJnag7 zHR(2H-gKm)8+LkH-%v#)$^<7bFcMoRwBHhDSIG8q%??GoU3hHvZEw`Wn_eicinAHg zP0Wd%5I$Iax_`z0-dQVkt-a+pqTk&Ad~}ro8|ksx0$RTN3V1rmr{Z&4(o6-C%-Ng*h5n7~FD7OzJUZ2q=Ym0ghLv3CoK zL@T9|%#)sEL0K>nC?et=thCdrOc+HjY?5jxtDUd0y%phYxv?>+nHwX>*}jAHHnPVg zY#UjATM&wj_3DxZt&+*Hra~xE^R!Zg@ETi#B{4goNd06A>GG-rY36y760tMLBh%gW zppNeG;zx1A#R;0(V)w3}hzn+9bBOc_EYGquyvgJ!skV0R_G*8)HD$w?e0F1z)~>?i z_Cv-}u6XPTLXEOJf#RKkBG2x`p~ws8Uq-leX=fi{3lJ*}RoHm)ds-Ze{bEr*dF>gB zc;|ZB?0uDV?=Iyyid^;4qco$45{k^7cO(#BCt*<}*$PLrx7oCfngH#(cPD_kc6uLEgO}zgGB`;H zC#)RDWmkxrP6;HRCVXVto)$WcyUa3G$vQiG?P>DjrUxj}=AXB>9P76YE1<|im^cU* zW-{ws^mrV*8b%;$&sk0?`Rx+CG`1n$7Da}-cvBY>mey>9l=rtEr>7EZ zSz<}@b76QX`i;|AUUbLNfP&+nVSC8D`wXisA{l-{gQ(D zp2q6FB0^B|=Y^pa`_lXf7(O9>D3VXDuQWHall>@CjUro}aJ;V+H_T=c+H+ed@n`d! zcC76q6?PLN>U>e;SP5>$`fAng$@!y%)%S#1xQCYI=UD&H9v{(8?20nW_Ow#nLE3V5 zKQFH{MBG}CEny*bXGC7r@NE6_7CJ(=BMf0JuDG%Drk_qi&B?q-zE8pKZ;M2cc0&|d zxZJ6j%vvF}y{pDbBFxpIw1Y=?J6BW2&70~o1N*ieeB0~fm*A`0=5qfsE3TkFE-ik) zxR_K$9!p{Pgo;R{&naO{q$9iH$$S#t7B`lIA|yr_%ypAXUP>aN>8#DRWqI|><=eI6 z#&;`XMjDDt_R&t>kH*ws9%A!2klp#`3uxc)7Qgn_|gmI@+&PDT;r6OJ_C z?0r6HKK}{#3+cMbICJ|uMm;@7st=5e#V*ybcz3rRW=Zcx7)QR{SU{+q9~p-M03)-F zHS}Z5^8;STa=t6wa_myE0bK&2@4$OIE=@1BVI~V9i||isE)Dxcs)skJc_n$DO4KS< z!f#vchR*zi`*pQi{)OIEnK=tn&hZEC@vEcK*Ief`Y_eJw@n^U&_waZ7M0v$H6S%MY zE#z~dNT4v0e~rEZEV1t{!fgCfoRIzXinF*0QGQC4(VGa_DusI7Vk3&YO{UyvDQlch zc)24j)i-B2BW<9pTy$)PWY$81BCm~WO-bC0C?b$f5pa4+Sm2xGr_h1@s@plfalzx} zbEh5@F`h?}71rbtibl&2u_lQYjCe_K6>%#&Mb7Aq&|0`6?+Ag@%BVT-Za&`Su8Eol zmyQFox_keDKw1vXh7HfKMvEvS8{4#$_D(l+zBlSplC;ht?A?CDd7VvG_XaJWY>S&w zYl(a(xf~dw5ME^5lsSKByws7;tGC5X>MenReT4wcqM5hDUiO}-WxWy`bpB=NbfKeV zMEkXTb`&v{K#`9QTOEq_L&ccJh*T!@k!tFW<(#}l*~+$_Nu;qap-ay@_hToPa{dnK z7p{w$H0qr$@h9U)!`N#}oUAz~R(2)YS{BDsI?|4|%0Fy~yoryBXTsxE^2~)@^4lDD zbbRcrlXxLB_|k3dgM0V5);DQwt2^g3II+{~>|D|+i0;zQ>}NzCR<@lhf5O>^w{(^6 z-5{NLdP7Q-T0l#ju){0_BL8qYT>XcG|xwjU5rYm#l1z6ntG!WZlPJ`sNfr&2~0I&*F+RzpHw!#)c3&c0|M9 z<7g|#b(*ljy^V4bD?>T2VFJ50qj7WUE;;{`T%qoDPeP~*tFg|u>PY@49qNe}>@zi0 z_*&1s;mqh0nqq9`z9cZ=eSoh zMmMjR$@!_9wj)w0AeFSWre+h?aLa@C++15*JFR1?yHwr>92ZNMDiWZm5u* zR@QOy` zcWloJW98zPN??mT-14p9J&FR6tR36s+#y7+DC#%=uzYOr3Bf&qP+XaIONUiE{!Q+8 z?Y4tGvt@j~TEYw%QGt)5FfrOqSQjR75Xt>YL3gSSR@!K`D4tzF5evdh)JHWUZitMD zE{PpIO%QhX6bt7JBh-=gAmMy!z z^D2|*Ri+t3S$CP5M{8@0+CEjDujIP+Q?O3U@vUuUp$S=>|MrlzQXPLbZ`wq;jI3Q<*oRa~)2#g(^U@HB-x6LG z$A5k}={Mm%w8EGTuWMrzbxLOtnH)i(t7^LKk?xR1C{Q#;5oPZs3OyLa*%jO`j+O3) zfmQTOCP@?C;cQeWJ{l-OYx+T_w6&rG*OMfLBB@HN5H$r;+Zy&?B97OADL$l2=Eu#k z|Ea6_i&9Yp2c5uIW`1kGRlJR5J!L(ZOL*vo@X@%R*V-EtVI^7C8u;wy0Hu?vcb@$T z)RpAsliy;fTGeGx2;@OwPyuy70hEHhpg^dBs-O%=!5LLhA!H$>3}=sgIV%gg!@e)a zyCFsu&Qgz#d|7$_pk>g){Sl>S-lnomG+)=>ZV>rbSbwu1G=HzZzvv2o{q;9fTIhBR z+C%M)f7rQ#`g8(Rrc0n)?FMDe5)><{e)WSIhoJ_3?CIw~o3e$U1?W`j@S~27UH{OZ zJpUs7AA?~2t@=MzH~lm2kLd4OkYV5#Bltrv`IGt6fU5W9dlg8Uu!i|{cM_5uq6+5V zsCx0Aaet)z){r6hkNH!z>ObSC`agC4qE_c`Ek6O$rco;m+<&nCIJ>evttydyVffFO zz_0W7ZfMWH!u-7zk@>f>U;n}VcWrN*^Xks99j~nHHpd&9;Wyz$*_xVCqVezMth*LZ zC4%hASG6=ksLmd@B|KPoMR?zaU8AwqHqq}~x!fR?H&Pnks7K%Apt&I>GEI~7DQ+iE zw8FDzy%V0C-_S=)2Jl}3uhiMfQ!(nsDFhsJz$=P_7Rvzo3Ft40jZY%eZuFWhukQUHp7tVe2 zv?`U*zGyC6h%i&t8pCe+M}73Rqiqd zy0e5b(C}mT7x zmjV9jGraA4?2gq;pZhd~_f31pn@)$*#blc&1TZ2AnB-CW;3Pg`$u&D? zp+pgUBBg$@yj$wruG8L+Msjm1`X9K?k7WyDySw0T@m5loUJ=8i@92!8ZDpPa3d zF{H6ICfj(RzgH;hmbUS=%bDyP(Xx$o92tzq17F$fG$rYHjM{T`+wk{J?U;L>Azj4# z#P^8H*4wU2#ksaea~E9{xNzU+kMTuV-xtMfi9C?ZLaJAu^(o2f?s0ehC?#c4dUfL& zV*yINn|MVXYlgbMp`e8C(W4LJ_79B0eC45W@^#F-5An=RB&cDNU5NRY_9| z%Ino_eLnR|6)kd8Rh2^pjrA`-cqEHE4YHDCtcFn}xGQOgal=JyW5?!4CmwP3=eTtZ z*+13}S;8JV_13|EN1Z5MY~2Sr`};WJJ;LY*Lbc9XE{br?Oq-H4aRrslt25KssiCQX zL07T|_WW4m+|qKD!tIhJXBvIeh%=yH`*Z8ho-7IYEYx=hS6xQ9e!e)c^Nr;yeRpCk z&HIzG>bD-1=Y6_DCtYvnW^`XQiPJ z%%3ZE6+&jix;^tF?+429u4Ua1d{d%CLJwZP-@qwSt{TRx*dV;@+qj%}ctHB_S?l=a zN2L2s!wmjSFLU-ryNHk^U6`wiDq3W)b1jxJC2q}$%ckXOyx~th@~geI)kq=f{TJ|Q zYMK4x@#X#BT8j+U;blxDW#VXP-?*O&2)2~fV#`rYxuR}2_B@gMSclS9l`MDJcBArw zTkQsAN#lJ{E-VwL0;aWvoa988ua!1SrZ3q9@aXAzBa0Ee{Ktb}VN;M_^Kx}u=wu1y zO>ykh)Pn@c&Mt8d=FxaXb+K<`gZzbDg?Y!7c&yD&ucdkErlyvaY~m_r-se&KdPrCC z(*0Md9nBkRwIk=X*f*}%<~fykc-ek5C~P5D!+=yIIVf0E(vhR6gG7(kH-<_~r1UDI!`KkSQR$=eVO*KKa(2!(;TT6{?oO}*ca|Eylry8@Zu)p+re0$ak1bX!S9^PWibsHmi{qh xad_A1uIniS%o%qX`uwBu_`QABeF9y%NA$9-qkJYO%5iePbISi`=Kl+!{{l{-GZg>; literal 0 HcmV?d00001 diff --git a/widgets/login_info/skins/xe_global/images/white/bulletFF1A00.gif b/widgets/login_info/skins/xe_global/images/white/bulletFF1A00.gif new file mode 100644 index 0000000000000000000000000000000000000000..4026f252116916d88eb182bda80bac490ac97d90 GIT binary patch literal 44 rcmZ?wbhEHbWM*JyXkcLYFU0@^ia%LE6oU?k0Ld^gF}KvSGFSruo2CWe literal 0 HcmV?d00001 diff --git a/widgets/login_info/skins/xe_global/images/white/buttonLogin.gif b/widgets/login_info/skins/xe_global/images/white/buttonLogin.gif new file mode 100644 index 0000000000000000000000000000000000000000..b7513ba4b33d118411a57af709795b685482b436 GIT binary patch literal 605 zcmZ?wbhEHb)Mrp*xXQrr^XHG>zkh!H_T~GJuP09(xp?X9p~HKxT)lAa{K@kdPVd>b z{rHJPM~@wN@#5Lxqx<&l-*Mp3?rYaC??15f(&ckEZd^HY_W0Fn7yteL|MlzVzkmOH z`~LOo*H8cc{r&y>*WbUtfBpLL`OC*IUq1c$^LzK+Z8vUS)zHxR|NsAwAKw_L1QdU= zfKAc?ksv=Yu>C*4o#~+?)qi5iC6~+@^De9?@md=sJ*A`b@Y|~W4>nljbVc~g+){Nm zZ}(R_r^UW~J-xZyZ)NsCPzC$yYtXIj3PF5bDjEGZPR$g8nu-M7;;DJU? z#)!>XcTa6yeSMvpjD$hs!ZkNHXIx$tyZTxSBZr#ViMig}*WKM+@qSi=!a0Dyn(X|Xh}EmRJ)nrJJQ>PqmEDNL4~R;zKwq!?;Xb!Nw9CRLNEiP;|4 z7CN9YS_YadUO)|oRUfKGAyu%YR_a(&&@wRkq87wt54Puib+A8T-}{&E;oH4uS7XzW z22cs+y?|jTnkG4(6-5CjOB}}%WQn3lmZJ$0XE}zX2wvbw5+}%_An*i*lN8Rdlq3p* zz_BbXE+Pp8Q4&O6k_3vvd7h&dEuLjrM&LP;CPa}Zh$6+13`5V(<`-3RsX`D`N#J>$ zC^0O}3%n?aG($?FIP!S-aU%X`bcpBJg@t*ND*ZW;7DRz&7W2jFzo%%HPLC&NW?qbE zQmH4SFY>v+vYF)ABZ|hSo@bL|4|9_fQ&U+{;K!e((od7wY=&c*Ty7$j9-Wzap3mnV zjy#xsIc>FCaiS(Ct%qpzqhrmJ@jiwXII#3*@~WzbpO`V zd!cu$#e#Y+U%A@Xf9?7;)Y5Y4M&G7CZug^KH=}x3e@|a+ggr16hpRo+4I_}==z$Wq zj8KEILGKxYo*B{R{V1euYI1AyhB~*~pfx~+SCF~RU@n;7y1)5Q_p$Ka455xas21^K zu22#QYOSrO?Gd>{x5_#^I2M4MI_1i^YxsMmQvG?X#vXJcvL3f$kZ{fYuvg|jzGCo= zePFNFc32(r;R79VWvtl{bOw6Vs;Cw5BlZj0)xBTtJ2)`5OzF9Gz!k4LR(12x@8;p~ zK)J>SYQaK_5-A5jiuU?ioQ|#sr>CRSfuZ{E?z<0y{uA5kfvxc(Ru0;p1UASt36*OO z%t7btcbr@0-~28cS>3bnZTim9O4QFJ?qc?^vJh?e?fY>@hst#PXEbJVwrdJMbz}}7 zO$E&>qi0kV$uD4wD~2H5zyVclTmIU2>MNNV`mA!NKe8qeC{~zjRVNeia7lOjh7XwJ zYMcEWX2LKl@(jCBk9iC zi@vvA)|;JXcuQu@_3*~0*0u2FNhGwcaei2BzqqM)rxh--CKQHeG#{Jp1y} zoLNk9Nhd9}+F~PDrRu-#ODJ`Y+xPm<{h2dm7CxGgDtR?eqkEgDVxdsD+H2{}SH9G(R literal 0 HcmV?d00001 diff --git a/widgets/login_info/skins/xe_global/images/white/vrType1.gif b/widgets/login_info/skins/xe_global/images/white/vrType1.gif new file mode 100644 index 0000000000000000000000000000000000000000..e3766aa3bc5419735579e4214bd9b2fe9057418b GIT binary patch literal 44 tcmZ?wbhEHbWMtrCXkcJ?{P-~g1B2pE79h#MpaUX6G7L=2E&Z$v)&R<-2Z{gy literal 0 HcmV?d00001 diff --git a/widgets/login_info/skins/xe_global/js/login.js b/widgets/login_info/skins/xe_global/js/login.js new file mode 100644 index 000000000..7e44a5637 --- /dev/null +++ b/widgets/login_info/skins/xe_global/js/login.js @@ -0,0 +1,36 @@ +/* 로그인 영역에 포커스 */ +function doFocusUserId(fo_id) { + if(xScrollTop()) return; + var fo_obj = xGetElementById(fo_id); + if(fo_obj.user_id) { + try{ + fo_obj.user_id.focus(); + } catch(e) {}; + } +} + +/* 로그인 후 */ +function completeLogin(ret_obj, response_tags, params, fo_obj) { + var url = current_url.setQuery('act',''); + location.href = url; +} + +/* 오픈아이디 로그인 후 */ +function completeOpenIDLogin(ret_obj, response_tags) { + var redirect_url = ret_obj['redirect_url']; + location.href = redirect_url; +} + +/* 오픈 아이디 폼 변환 */ +function toggleLoginForm(obj) { + if(xGetElementById('login').style.display != "none") { + xGetElementById('login').style.display = "none"; + xGetElementById('openid_login').style.display = "block"; + xGetElementById('use_open_id_2').checked = true; + } else { + xGetElementById('openid_login').style.display = "none"; + xGetElementById('login').style.display = "block"; + xGetElementById('use_open_id').checked = false; + xGetElementById('use_open_id_2').checked = false; + } +} diff --git a/widgets/login_info/skins/xe_global/login_form.html b/widgets/login_info/skins/xe_global/login_form.html new file mode 100644 index 000000000..e4bb1faff --- /dev/null +++ b/widgets/login_info/skins/xe_global/login_form.html @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + +
                                                          + + + + + + + diff --git a/widgets/login_info/skins/xe_global/login_info.html b/widgets/login_info/skins/xe_global/login_info.html new file mode 100644 index 000000000..d561ff674 --- /dev/null +++ b/widgets/login_info/skins/xe_global/login_info.html @@ -0,0 +1,31 @@ + + + + + + + + + + + + diff --git a/widgets/login_info/skins/xe_global/skin.xml b/widgets/login_info/skins/xe_global/skin.xml new file mode 100644 index 000000000..8ebbdf666 --- /dev/null +++ b/widgets/login_info/skins/xe_global/skin.xml @@ -0,0 +1,48 @@ + + + XE 그레이 스톤 로그인 위젯 스킨 + XE Login Info Widget Global Skin + XE Login Info Widget Global Skin + XE Login Info Widget Global Skin + XE Login Info Widget Global Skin + XE Login Info Widget Global Skin. + XE Login Info Widget Global Skin. + XE灰石系登录皮肤 + XE Login Info Widget Global Skin. + XE Login Info Widget Global Skin. + 0.1 + 2011-06-20 + http://www.xpressengine.com + + + NHN + NHN + NHN + NHN + NHN + + + + + 레이아웃에 맞춤 + レイアウトに合わせる + 随布局 + 레이아웃에 맞춤 + 隨版面 + + + 하얀색(기본) + 白(デフォルト) + 白色(默认) + White (default) + 白色(預設) + + + 검은색 + + Black + 黑色 + 黑色 + + + diff --git a/widgets/login_info/skins/xe_global/thumbnail.png b/widgets/login_info/skins/xe_global/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..1be10048775d7f3f99e1dd7261422d35871fe65f GIT binary patch literal 13927 zcmaKTWmFu^x-Jsj-6as*eQ*dKJa~c(GPn#dxO`l`vR}+hJu1ZlarPF`X1N5KlO+(@9#G=cH8%e2qL8oQL{6J zxEMNspu|n=j6jrfHil-PuOLGcH~T@55EK+Fm4&)CL|aioz}U`))$ku0R#zMFJ2w=R zkf-SS=b6wowamOQCgS?Q)%%ivMYimK;{;*?hYU|cO`XWcPnFl6Dm;= zN+DN)cL6pah#{q`jkT?#fU7XozvK$Mr~fHtqoVv53B*d6>c5QAR#c&suyX)W^02bA z7_;+oQ1WuKa&WWrbMrG(aKN~wI8z(2rI|YlQn=Qo9mBrSP`ri^HL5{`_ z7GQ{loh{`*5)F;)oFKwf@0R{o6>Px&Bi7dOznkg3!Ps04!E79??Eh5h--L>a|9?^& zoByG9gnR}4Uwi+bf*sY}z#z7-AV)hV2jlmSGo}7V6<9#R0b~fVb5OUlv;KE0s+ikB z>>SPQz?2edJggj)S{Ak@b}o+pqE}QDkh67!7}^?xc_|LZR{6~5J&1>?XZQ=coyln5ru>I4q|Er__UG$Egf0F+L+xN`> z03T%gj&_H4SU1sgvOqy`F3U-ZtGg~8dm(s|%_g6vSu_~v#h0+k*PH0DRx^{3uoJ=} zL0iWrrNDgn9OEVbxVzK#0*YNtTup39Z4GQ#Wd1m4C-)JF5Ie=jvJ;-fWd(%yy-m;Q z;Fj~G^-Pc&iJyZKMF)S*v%bPEncs2O^X=+}KZF$UT%Y|LW}F0mGV~*6fJ)?k8Y@y- zxm?^loSy^fxCJqt1N@Hb5J?}j@yfW&&>?V6OB5|4$xBlPXV^`{2l9AK=k>_b2 zRm6AbKc3HHLW*(jyEin3uKdSP0xiMNdIW&A4OAscQtqd1RailckZwa5RCENJ3rOu17*`j)8FkbVep6=;4mwzK27oRw zEl+Vb1N| zIYO-!9#&3gZ*z(teeg&Mw1M2B0q>Hz3?) z9l@gt`pKVzae^g_3cA@hlg!nFu=dpda+8k3(xEB_v|zcBDt}S`LgU)&!3i|s&go45 zd?cWY+zHi?-G%2y%7q3M{1S-4xWcqT&kjQw@88fYye=fhQav)vLWB_X3}<>gK;_nE(x}b#=T-^ zxcHtM890)Tg!HHt-7&6+C=OSSkV{WFhp9!} zLkyAhW!h4wx@YO9L^300@Ff|8g$Y0!5Tm`CiK7xihwfF|BwNALjhe>o0q!}%0H-%3 z_lY-9(BT^;h9^WkktE}(LK&+T6AA?wZy zs@ZTsOEs*)e-$&!LK2D&8SCl&5m^H#js5|ir}7Fpj1V>iHfj$pt;%!{8Z9@S4$!+e z>Og6VsE;J@Bi5w$D#s5;OYD>$zWy^N5vBO=-z3L?UrBKkN3HaP0^A5jJrmGq?3nbS z+Ix$ESrc&sCODBoW)8@~5+P&kO5%H}rbZNol1Sa?%}_uP9|~Pk8Zn96oEs@>lD$xB z`Ggym3~nD(L2IX2X=iPps&5MomEnsiAG+}XH7tEQRVNrKi-ZA+RR(NpDKO-j{u@k@ zB?};Xghf2$K5I7bPxVc!zLrN2!6@xGr z<$xT7C{Ab(U^6r-rXCQ?86 zB2giB_{B~Zh`lJOJQhMEjyIkiuy9{Ht z0fX-9SHPbep0JYLSTKw-{$U>qVtwn$m7ICc0JK;drU_6&z|))ziIzyPc|sAfSk#7k zHmwrFzK9spi15UQz&mp$Vv36oh$#PXxx+u1s8>g*ol_Xz zLjN|Z)q{qmqQ?kExh8~W1U{h@IB-tTBQWXxp%CxLA%{MK!6R{(AzjJ>0>iRiRBN*H zHb2#_h&vMkpQz|vO*ywNC~H56tMH6|?vtW}Ky^uCPI`(deI$1cgkItla!5)34TFpy zKr~AVPLL_Vk4NZ&f)#_0nxAYkE`Z%fM0&lf|77&BNz3MN*XpVqI?NgzZay*lRVhL~l0cS-YZj_ZcluJ^UD~{oh+yaH)WLRZ_uR~4> zKPjelj_n?~o%Y$Zm>BC5te)bp8z>Zfw9j4LMkv6qzNyHqpv(zWXail$uBE?l>ZFJm zyJ^M)Xu|Xn-4-z67DfQ{TqHs&v0SM?Sy=8aLUvUq37fF@xj6Xo(n{HOKMyG$LSEsM zkOkb?)BHceqo!@K3BkjOO<_hv`1)o6^>cc|s_ei#u2?A?NqW$ceBm)rl@pnL(voo^ zt$iz|_yMrmeitQ1=KVQ3@EGcZX++X$9EVV*@Vyg1e?Sw))=+Wkbta<)(|7%589+(8 zNA5HEaBio8wHSrPK;9G2Ebu2FTmeF6t>Etl1wfm@y`;E~45q`D%rPG#ipb8kBJ&*?1y>n$d8{N!~WT_Z}S6c-=Y5p2gGe$ z!rtyI!eA{L^csV-t8A!*iMwASR;L~HV;F6k*+kZv=JZHED zcCqpR@bK`+?FN#zw}1D>=zx9^4>*skd<_ib7-E31LKqG45dyBvMU7}lm}fr$11cdO zz7YfF8RENA*d<3IwlA=Q4<}zg{4gh^=^Y`{rk;Ru6`?edB#ULEtmICZj!E+8T<{2| zsrljnT!J@N-!OHEP-FHO3PXpW<{7UM;dC{Rg%hHQk2xg8m^`qKMR=+ubj@&>g5#VK?qZ-}1ym<__7x*SZ=de3WoZ2%cs5m(Av5K;Y?A|W2l*L2 zXhJ`j62i0j8TuKr4Sl=LSlHDzoskCA5RQs!(pvy5|A;Ed^WW%f`k{e|U-6l#CXLfO7p`sk zu8!^JoeV$oX>kBSJJbU@3WZ>8W=Rv~`z}s+bPa^hNa^^fp#9^3Kwbn=Wl4NwW7-HY zT+|v8g?1G=i7WqY9b)_*Af+)XR_-Te@hBeU*dSg7|IMzhkr4$0_vYTGyL@%V*~Q6^ z!_}jvsjbhH)@hTH8^6@BOPaa(gQCAO?})$35gyO+D2#St6cC^c7%u9XHg{JMd!p!L z%s~Msk*VN;bYc6@J&VL$hr-M^zPzD7g4te`A-L??*+!aRh3f5;;I&^t5pvkT?(K_D zIH6bgwF5x38mc7K)J_I=63P3JATnat8X*si;_#%PFn=8fIYLwwYT(ZhMBWmeB-k+N zzsX7B71BMAEY|a#sHu@o4B8|^LX=#CA))%iI!(Ui2n7;j9-fnT?EFDNHl@}0lQfv| zaC24WXeKalK`>teHRMuuzG|-ue7o<FficUyKVEJB;ii)aTnob^q&)=J4D7iOD#(^S~ zTnmMiUDHT=PS%Q+fXKlgKIo2GT(ga~tG#v6Jb;UUp~PNH=$mFqN%&zxusCuy+Ly_Q z>%%NF)Mh0V)DbtF=01SN(%QPTtgP+nwB^NH)YJ2#m%zYnC*I?8C?ST#Qwz`U&EpTKyxdR>c&IT_PxT=Mtu~xVyXC+A4%YBvztXModl)&tSyiDqxM* zT@|8N8TY<6wC0)U+|bTIGweFptr1Fz=v_B=sP6Y*C+ku3T#mJF)XQ zx^ai*zz+~js`HB%dT4Tk@n|Mu!8aK0$P5VTb!Hb2z zU9rG@oz>EUvSPnz>ai|Hju`y@VZ!C-Z?DhH&x=0%jSZEAVTa~~Rruv}G$(w&5r8kL zaCmm4#={~^Z5$*1RSX{0*hNcAU%#Ca5vP$?WV|0*e2qp-svmBm@rb&Z(ez@h;SNUn zq)`93#`R*$=eghK`1BN>?tS}>6WBk@*5SGCb?1jz_3J`hRyB?TtN*vI$ z#&KKNH|he1U|v^b5;9(RM7iJDc6xL)JT_MEPjn`)3O>qJ^-&tbz4y;Jy8d~N+vP{e zgUV^~31kBLiHgy{&G-F=^h{J&C^I9OVUSZeGp;Q;KAmNQecvtbxU2iz%QmcAF zpZf8O1$>A|{$c6WtPMW1scGr8g;&n1JNsacOCo7Xfg*G<5O_FOjZ&lhSK()B!rw}B zQycVQwsafrwk=)mmrSDiROV((C3KgMTcm1G{nyf4%qgrXreKBS(On(uXEU}HFDkxK3g`HF+G=>tX`?x z0lqy(efenU@(kM7r!lY;$wEG*Rd`k`z)=CtM7tzjaBXd^c?xe3mksZCH@BwVs6~m5 zVs0KDMLGZ@6H_6+NR%X%=BbTl^d~tD4UK8-F1FpB9mSK8_V)Io-c^=nu@7P1Yprh6 ziyH`7M);zpB#NV-D_ilxnZep7emztur1&};l>;y#QuqMo>Q2LGxJZk?3787F?Jg0iQzEezskJeXJZaBg3n< zHCG2!l+CQ{C?_CWe+Hu)@oGA7yFLo8h(v9tKl++Ky}dr8G5IE_dmn7hZ-z&zX13Z)7j|45a8$i%y=}`Nz*_c`VCXemh7DKfHW^9H_P@PWCG|GQuk8XJuE$@u zm0{UtoHCXkR}(v)R$;rM3tt}yZjZcYRPT|OuXdp@X-6(oPu?Wr)> zuQch;M?g2JF`+ORYHp}mRdqY+>kX2(TWkEYzCOvZLKZt*@l8v;btCeKX&M01ou_AH z$#A*)sX+sxxvJ(a*6~cmN|~H}a_zq1X}vg$%3B1mx;!`~>e;j0y;S(@gj}Hr8VF^4 zt8%axuU5Z*lJU9!aZ-@z(?ECpofaJ2oe!xOs43W*Djt;NEc%VV%qk8x!A$@iMZFz~ zlELv-xNn3sysWbcy_(!sji_cT^wgR8HtuX{ekk?VPptFAS@~@1*Nvc02S_Ge`XIZ|N3iwL;8ygN z42!&m8G%2uOXA&TTKR zt`xPO|I&#*To;O_UyUKJ=c**rD@o5^3V-iRgDY}G%p9!eD)Ey2Y*e*yetu5+mB|zz z?al?eH#<99osp-W5Dn`?uIby_@0P7F5PxozJXQ|Vg}J}HykmQfE9RzD*S?iilzB5< z348zE#JGC|!qQ~a*_XK95 zI@hC_jCNqR6J5>BYTN1Ibex7w*@Nvrc>|vuTQKVAK(o8&<;$LDOPp`}@W#PiOW9sz zW%l3dO+O13$tvrm)}CI%8K3N@MAC1Y^Y>n_k8IW%^*JY+?uz8cUOWl(z)|F`tG($*AkL{ zY~*ob5tEua`*^!dRBUy`C8*BvcFVTTM0!7+yBr0V(=EgIK=Jx&+|#O=l)k)3@UmZ! z8rx$NCEA=@Si$>ipy{k+T{nY;I5ry^b`)8`-xEyx-UEA6F&>{N?27mgmi_;7@S}R`Wcu1&6hL7W(5?j8P z#46dOiPmUm+xn|*5YyV~8j*{-Zi{+35`HO50~uhkSh9yK-A@tYwIb--bSUfELFk{a z5c>9WyEC04>AakW3wBY_S?_}OI*wnmPP3>!r-JJ`!0=mV$S2|9x%k-Wsu-T$zY|5y zG{lGdhaD$O>r4?mq$Jm6tmC^6Ggit%;>Bn8ORx>_x5D$Mj{^-N2Cv5y`bR_&6|0rm zSKyPKR6A?Hgi3qC(C~OIFARS{G2`#m_wjQu6Au-B^WH+2Z^!5lKjM!Pah|pM^Mn?@ zijp{K>4@5gtEo>k+&k>NQkUa+FDddtb)i&r+<4ob7!@`;|&%B=M z`0h@H!CCo^=d*MM^x8gqyCsR|64b$V-t7oWNHm|coW(_~=CWe zj}J~!q_I=dGU8dnHdw0e&%bS4J$Qch!hhy`Rj|As7 z>6_PEX{FsfS~3P}buTVLJG*5|>H^Pme6NO?15Hf$cqo5Moj+NJ9FB~E`3FO_>Kh1F zYu&bELdYLQD_T7HRw_-;^Ful=P<5QfS;pq{fBGBBqkfUpNgH0f9idt4v_CsJVPRl^ z79=g5wDWlqY_M(5huG)OpW+5dx&SAlckc%NK((I-+n#rl0qJZZgIGEVsEV^iz=qHs zJ-T|~3(G{yj>qlHrh3j{*&z4FfEYpQ)f0SKp$V>Ig<*%(la1gOAs=VK=Hjm~>jz-p zRoWl~51FlE(T*Qc7}p`@;@JlB`CvZhSxg#z4JW9%k?kG`NL&#Y4^Q#6)Izy+lpe6O zyo`c^;#A+FCoezT>UL$#OSBM}x|&m9k}6t-9$jT)C)0-OjM$}D#SeC{b|yiDr-_$k z5Xg{QXo6o3OQ(Z)+U#^#B6NNp@p97fO+fnOYcE9Qya z>dTy8`484k$?U2WSPyibo9@7mFzf5zo_1f2#pCm8PMTK;w;t_V z#N)6)LoEDZU0kQ&y>BowJ3!Mc7_S?5SmNfMJBfFmM%!g~UKTQrpAq?CYF^lkPnQiYj%NF6NpY3wxp1&=$8;HR3%}rMy1%l?ZMQAGI8cI#vXQ4(fey& zt%J-LRr_CS_)%9eby3cqx6Y=%|_d zx%oA5`scfz`z2A(C#8H)P`Sb(%r;M}#yBQ`R^{R@ zVvyszq0qx%4`1#;7PIQ(7#+a1w%hTVU`!I;vpLWvGBlT)ZU)))WYWC0t!;HFAH=yK zoBx$H(W=~6B4Ow9(gB5NkH^SyfU<4h#cDF7GrsPh<(Oug@l@V{^q1LwWC8vfpnAdw zom!)GM-ozr?0W+5b4kO5WnekO$0WXJnyMe*?6k)gq8 z)>7Tv&1}Q1FINlWR+!i4;6J-pi>^w_QZiK1rU{AK8~47ra(TNT{ zZj3E$YZR~Edtd-G!gWRw**UYW-lu01$+0^vmdm=c#-)gEyJuRU#P^7$?ugy zW$^T!2dQX;X5%CoX#`g|hq38$u_Pb>B3}p%mR3Mr$XHydLFS(CX;J8>@|dBnR9yWf zpYh|IbOG|giEsuwgv;t$J z`{>txn!qR`9$9Gk8~`KNhNw6uzfnRh5YYhlCSm*Ob{6A)ifdyV_YHkjI zNos9Ls#EFUR!(SpaI6~hMe`x$$X1(NU>e_S(kJE1SF^DlExj|fEuG=H@`@A+R0smX z(i2YkkcRxsSf5x@*^C&@MWA{!Hl=cwX4zX3u3ef+N}`ML6r zE)o>coPlAe4@d;B+c5}6cSGCF28%4 zy31Qs|A1uToF4;FKcJK_NfDDKi%iWe-46~^%jwJc!2l#tLU$^mnI)|A-Q6ZB;ru)p zy_1hyw`Q&Y2?zd9N|l4^d<3#tX&bcxVX8EfCo%k<0Q3_BVIs8pIv4(z2McH3MUc-d z=nCO`3h{Vt@HR4*>zXgVN$Q^q^a}YcG~|qsa(HQTuH5_NESaZ-qyh6XHC=LDXV%foZB zh>K=I6z~?l!cg)_DdS*}m0kfy4)qugC~`J3NK1w`>QtzN_KEwm%<|-h=VYqE##JNd zRC-R|Vzt96Y?)J;VqF=m;TLJPVvEQ7d=4yg`mV0%nSAUI_+~0#uyd-3qr0`b8OBo7 z7Ir%~SC7usun@LwkxI37{^S&!*=U7&#hq8f%U;}0(2~cKkQ4~i zr1P=*S2NjK1WmSa-HY7X-bKEd8S|GO=b;2PhavR6Fub2UKUG^AxR+0GhZ5;X1dZKq zhKeEh2k~AH;RHnFd^(@5cJs;5MX;6hISn_GQIl_^i zq{9k(Nm%F$=Bv4D|19Gl-e>lV$k|*0BzuD+{Gl@Ih`oZ?&gDPLxPb0E6A3<)SNQzS zZ>z9ed~Sk42T~0GiD7UIb=W@gA1l7TZ~TzTt6j~R7@oGDyopeRgs70NF{k&9`{ho; ztZRvz>m{zOYhY>R#7iy{E((6E^qV+X#Y?)=Fog~W70z~sH+$tT+j#2S=tCN(SB-h3 z9Qx3w5bw=IC8!{>&`&v4d84$jK57iJwy_`lwAA&m;iCFQRMX#jMHC~LW@@SZCndR4 zAWg^Z+1te<_~cS`7v@Q320h3H&Ia3;m9=x%Wkf&^sVk1 zQi^&gZ0DQcv^^wkQD4G_VXV-;Q5OG=*~DF5Ed&mLgvL(A zo?XZiLwUXrG+JL%k){|}SDTvDREYhl8V~Qav^G=pv6UY2Zq-Z8Nn=sIg7iASg+~#= zMAvJ_At{YK3TFbganW;lmOPP*FwC;K{j9TS1Qmk~3PP_8=={Q*!OSqGSN$81{8hZ1 zRM=SnH_{J~O%UTl;Et^L1!}yNkq7uycc7#3DUY(Y77lo8(BZvPe0aJ3x*2blv7R2i zsiUd`pBBva^2*&AC_1dw1Zgj}Ow?eDv6*73p!n8aTH9PKL>ft?4Gr*Z z*Isy{WuM2sS4hb@X4{#R%b`cw6gg}vvRF0@mXWn}Jm1{X5;>vgZ4@+~+1ekJY{>8hqU zb)jgJ@R*;$GvM5cs&m@3428U`hE~eR)G1TBS~m;D=?!0$!*1WET>2qW7=)3!yqpOX zpGnED_WUP&tCgkzLU?q6^!i|~lijI)pf$WZe3x(IVc3w9RpQ<4_O2Kd!A5ING5Wcs zq`2yg$rmX5EpWsZVHRwp@|W2Su@*f|9ew2!EPMa6xWmC&tv%!Jf0z9jdEtWEtBj zw6R(Ojc!IHU8p3o5;V@^#{mz$ zeJFZiSy4WT39P5G%##GP2C(b;7Q+v31G3=Xb>6vwh?wL^ObW5&b2?3$&_(fAU8%4) zn)A(Is(#2=p!Bh4^m4&nqP0FYS8@~#4<+MwcQ>a$b`V4-voN{mWZ%wmp*g_`}s=^+}uUo?f&3C<%=t5~*=K z#`UTO{3gBE{Gbe-Csaf-yyuRH1g{#OVuG}_h|l$ zCio$JvUK^6UMJoCRW9u97~kKD{`2P(ZcbW*K7%*+wW+&$$Axbwdn%-R_#|hLXa)SX zvp7suM_ApOB=b{WYT;Gm*qykXA6pByTMBA~EBggqGlXcuRW4}^rqc2k^n7^Y9D0@B z6~j}GOsJe#{@YTKE3R(a`xO36ag|yb5oPgx_CouDne+T1ovONVUT?yDehA|zf0=6n z#DVIiX>id<8?FTWBK2P$dkKXc)%O^<fETB36e=G&YrbQo zU^sD~xb4)zj^f^N{Rrx|4^N+#-|B5`jQ%aSsCE%FUN%Z|)1t2&i16(wRd`k&hfaUt zQQ9L$o>|XPq8@9(DNmgDbH?HLir0yeXJZmUew6^4e%z{(gTwlj9l1ykjoji-7u(;A zRkua2=W_4PxO&@F0ZvZN&8=5K@{9WU8 zLY9hu;mp9kKe652CvVqeKqy@4_pqrlKP^0bwU+1Mk&nyw^>SG1IkiR#=|O1Jn+H#` zll)Xtb1km3#wYn=;?UR2Y`c}5}k50Y0 zGkPk=UXFKuI8``;JwX(XR)Z#Awtpum{7f+NKp9HkiWS7zeMrB+@!N<`#g~MwX!F`f zQ|`cL{GMd>aT}XMw)c2h^opS$>}8|pwF~0Yh-Ya%Zf2@JX=k!)=5XItDa?pYO=tr4 z9u8qs(Cz9w_7FEL8k=?LHP~o+SRNht*wL9KhIQeL{QI41Zx41D!k5zq&(CHpN_Dr~JTrA@ z=~tbPT5q*aCgb-OHx+hnn<{$4E^jt>&{_IFmzMQe#>&QH-gZH3psnYwRE1m6+j4s}t&rFv^SN896bW+dUf|5NG73S62 z%|orX#yU|CFGFXCc?usj3Wbh`wdF7}e;R&PRBT9FRTW3Ff>L8+9#eXS?fUJ~sjvit zz{=Fb6wa|wRgIj%b!Z9xsn50wV5QO6WxI}|g=RTHHlpl@@Pbb4$T}qc?Yc??^!HB* zowR4enuDH6rQ_MHD4gTGb+e_Rna6OK=$S%?gK<9J`BZsImzb5B){pHRr+y`wEn$y! zfok)U6P?XDHQ_<2_*wZxmRgPqMNAr15|Ks^<*}hrl!sRdv;fesmS#mcxkz;loy}q& zlP8<-i@O7QaXi>XUeN}2NIeA^{njase|m)ja1xGQRQx#i-A;-s8p$#Un`$YYH3XLL zVVA~JHhRx7L5p>mi9t^OPsnG9W)B?;)y=~pMn1E0lg}hkWc;mf2LvuNJhSsIA)!8N zF|BaJyt-|iLPnVe`kJ-Jha_5{I=*JclHuXu-Qk{9`?Zh5?AuZ;tI}v9d}aqRa5Qd8 z4GAj8`ezawctj%I6TTcD~eza)IdTw!-kxEkBJCWasa_CsBAsne*%JWM;aO8?qNV zfOe*kRkxaccoS@zNFYB}E5#J{mG14`OK+tJsCf8Ou+UZL{kT8PVYbP`r$zBPs$4%m zVO3GWTA`a_?s=Oyem2OGc9xLN52pj=?vk*6G{~$MH|hOX7MG3HjKDOI zA`4a*=>!=FbE~D^;esQ^+v|ONs@?SnN8M*{$Qhn8(~*dWqP;@=oL<7kgp1GJdghX| z)a_HIg_NuriK0*7_2tioM$~M8V$m7OPJxHCw11f2*3+NwH>y^xd#;$rVal&PJ;~!| zXQ*Bec6LmI@~^`_&skJtPVA>PK(z6dg78#V`5E$+EM~JO=TIw?m%UKh=!fM;V!}# zW`l2`d|u%35}CjiH>n_+Q^^;KhEv!eX&mZ8TtWdX8k=?Z2Im~W3xJc8hPS<2&^%5nJar!CKQW%4|_YcL<^)FgZ9T8g6eR#PkXaySJS!U_@QIqQB(VTQ64IZ%cQq zi_+HrQO`3RW_zU&U069QeeKga)o4a1wc@p1YdxNcoFC`jajr*ccsucmOi9$YoZ-(P zV273dFsPK1{&eRQZ{3_cbH?vo>=rLSrjV-D-bu3;7l-t1cBr+ti9VA_voxabOYNNL z^7H%AvUe9($Gw-8j#IPU!->lpP#}MEmzt+7+tSJ0tns(CMk}?(#RHr7C%mYPwI}x| zmnu>1VNjg;px~ANy*W~ zGLFb4!TKwpu2SYuMj?6Tm(!#j#m7dv9c1H-8tNyoHyYP0qtWDV55+cb46`{-@j18c z41QC1j5-xo5nNd2%OQd1E+ewWq8ppw`Ft)Z*Qq!pIfzCePu~pC{Ai~VlcD*$p>64y zr3=qK$mFDb{!rjC`0+_C=g+uNjn8i9N5t-}-f%MXe#t9UIofT8G2ypEW%a9$$D7O; z{_qm~=2>k|6H0TyRe34p`)bGe=*S}&z|a7&`+d4Y;L^IlPx#3~szh_=s7sPc$QoP} z{KD40y2ds{F1PV}n(U<5>Ntw?SX@5Oi0V5$G$fhXQ9P@ zFaxj5$9=T9RN`lqA1wPjj1pJVPDLMNk7wMiS?Ce$^ie=fpDh98zqnApwBeiP4trTk+2vrzDAi0OFpl)9f-2!$~b z7u3_4!SDIIEw_rN`P@#VrM~P{CCZ3Rfo&u`k>(&e76H9*3PqEdA@OSuPoWaL+9{}n zO+N8DviX}xMJfAgGAeom{cWrDIC!~eX-skluf*#!^90#2>rn7u8I5stQbI;(qypmt z1#g-@hv)G^a%q?b$a_kA*>rpW;>N`#R9omspG&{qM?+#2c}+w5uxQaFh0@L9WWRV+ z*>dGDwf$1oe*{Z2YjxR{*I?YK6(`djKpmEL6w;O5)h;rYE}g5oxEF~5pWftF@4B~{ zqB$6=^DFZttCe**NL}6Ko^z#MXQ#{)(NZ?vZ#P!&x%lv5F4vk1H4>xCn7q2 +
                                                          + + + + + + + + + diff --git a/widgets/login_info/skins/xe_globalTwo/filter/logout.xml b/widgets/login_info/skins/xe_globalTwo/filter/logout.xml new file mode 100644 index 000000000..8005776d3 --- /dev/null +++ b/widgets/login_info/skins/xe_globalTwo/filter/logout.xml @@ -0,0 +1,7 @@ + +
                                                          + + + + + diff --git a/widgets/login_info/skins/xe_globalTwo/filter/openid_login.xml b/widgets/login_info/skins/xe_globalTwo/filter/openid_login.xml new file mode 100644 index 000000000..bf0ce028c --- /dev/null +++ b/widgets/login_info/skins/xe_globalTwo/filter/openid_login.xml @@ -0,0 +1,10 @@ + + + + + + + + + +
                                                          diff --git a/widgets/login_info/skins/xe_globalTwo/images/default/Thumbs.db b/widgets/login_info/skins/xe_globalTwo/images/default/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..1e21d3fc14d23d06af1c346fd8ba482eefc8913e GIT binary patch literal 8192 zcmeI12{@G7|G*DpHJ&l_>CZ`@ni z2mTV&0S3?!cEIvgIs?2$Sq!`YFv1J;o{k{M$3y_&<1nqNH z2pfbQ!U;k97z<-A2=}M^AIQv~RsEY5Fa_T5;}1lE4mbc~Ul0U)cj-X@j+oCyqyFGq zfpYS8YjsFH0|p9}@qd(5_*RA`JYxck44?I*@e;BuimXHjIt&{=M*sL1)sOl>bnYxw zKWe(wC;f{5So6n>Q2&?qU#fmtnDxY`&O+;sUZQ>Sck>_h52z3Ldj9jkd-xXsaFAsX zJ_sIy`UwFTFNX+1RzOxlgdqQd2t!suL?EINF^D)s0wM`n4Os(`f~Hyn>hC-NHb5_R=; z0RtS=d*BBkJ+NsojEv|P1}6ArW@Bb%Vq)fCWo2Q*a$vEX9Gsk7+{<{mxN+Q^oV)_O zI6gc-KR=ddxu5`Ea2cK-j~2p!fq9si*_oNy@m!o-`0ox#8Njgt0icRu5C@Dn1`Lh? zsYJ&S12e2GTH#NDff3e`g_Vt+gA)qm@xmF3!7wsm&{{+3Bk(z3!Z9xsQ_y7LGug{3 z?t|ZOEcOPQgx0;s{H9G5NkvEB9>FDZh*C(2p zTUc6I+t}{g@8s;_>gMj}A8;`6P*CuRlVRbfPDe!k78ig1Lc+yMmy=U|znOX~?e?9V z`?+}!@*frymRD3(RoB$kJ!x)fZENr7?CS0#_rG~N@NRHum^wZ&IW;{)oBac|iveIh zn)Su9zu1L?b}=$BVVGD^yBHV)As8GJvzP+QGEEcKy*_;68;-HzwPJ7Fd(1AOXiDLC z^ljo0klfg}nu?mXXxY*XJN}O>`(oIic69?Rh5>dS1_vkLg6M>t64#bFD~s{no1#8o zJGKQG>&5g|m4N_)se4}ZEB@B^4KJ^_&R8Z}9BpKXc)q<#E48nhY@;D;*f%VzXrmy) zXp=jxrq6c&;*K<7$Nd*J*+?>-eVM-2Fpcv}kY4i+W3%IR(J82}JK-PKja4+5I*}R?1 z+47f1561aNOdFrXl)onSzXcC8eH$i>`}W$8j3rdqI#p#Blie)iUX~_!HoLQEAkHUhwZ7Ud zwMhK>yY`c{{vYJtT(s5k#!}R44%*;!YaY^W%O|N_$mz~#E~{R1 z&gbEY<32qqcS5-g?7aDC?J8NqqueQcb@+t!Viq3O#KepmSILJ=4CP^iN4b@Ey|ZiG zjDUm)!lZ<0+r_3K)weG~xw`O=Z{`t(caVata?bs#GIX_FZ+@LHfqv)(0(xZ;P-UXC zz5b!nOBSvj!>e>}Dm@zrnA53`(-YdHDJ@iM!OgzH_!q%rN4IAh(X3TT^V9+alq^R; zWO8I+$!ihHU4I13_WL0qBpU(zUlq-{ShT3TTc}KweUX8|+C-O7h9r)Zamfx%1aM5~ zlP>QMN>zJwsd`}4XVf+MC;{pE>`uNNfA*gSKZyU_1N46S&&B_RAK!m!wq(dTw|LoP z-f(OZtBYP$9^rpj0s->Bl6r5#Q5~n_IV9jP^_Vb;vl8~(86m;3OT6Ac_XK@mJNR<_+4SqsV$jBc2#ixaOkvLmpTm#D`9pGve`Jp_-boST&L-Z z1V1mV#GVLck!d}Cv-eb<+5Jf~wduZZFUHkv9TvbdSdI!-74_l$KaA<9PtdpaQt18` zmCx)FcZVZ@DxHIXEOrE3k8EZYzvsW1K(=r~fV~+4H2JfI25yepcIxvf8CvIfXhcVb zr8J1eSMJqxe$CNX;3xZA@WEB*Q~dqL&lbv@$ONVVX*TXXnHnP+cyAUtRE=4-)q*er zc;4yQZ;!o~T(Yr<@CP~R54OyU`?E+oB-#ZV1a#mL@Lb2EY`(SliQP(~?^>TKJt3@l zv5r`L>RBb?wkr49OLxrlG**nuSq7vx%UK0n$3CS-1j=iG?n4_+aS&8-km zCtgbD@Rb(!(^%nKbHZZ3ZS!UIJg5{n4a-JZp*rM~O9!(Tb*u|-caSOXTAqEO^b})i z%*cAfbHy?D73y5$<7gbkLgor7T2kqE>zZ@O!TEfX*PU~{FJDQ!^Glr-?!E?Y(Fofe z8)R~up0lh5p@*{EVRQiiO(c|nn``5P!+$FclA>bW({oH$tP9-7I>==A1jqNmx-4W|&(O;TR7=J~WdvD(BnJ=*rLYnEk zj(xeCFu9q)GqCoSdrMinsiSpWKkZanawc!%Qk^e!&7b{mAl$_K2{U^pRx@Z1(0($;|fd#pMRJ^4Yl8;<=etvZ}Pt_`G52D-_gJHZTQFi_bRaGr~mrz@LzLL z{p)K8G|dBqdy`>jj_gStl04@m%6dz6Y5P1UXlq{kUO;zfO&@i z@=%B(Wp>`o>-EDMkB)bH`69shK~VjMv272G-*0#O#qfELx%j^*l~V#C3Y1qB)db4P zy3|9*`)jGI-!@!1a?6NqIvcC2T^4_;QJ8JSra+VA(Bas+W?JU2l_&IVY9kFwr;%QV zAYgu%qer1mVp5oAh~7tTc{X5thFQhY@Q~V6>I>6{@%vw%CiE$_8O>LYA%LPzqRU?n zak?Wi8|jXr_ohNSM-(ennNySc4pLdp-+7wmHk9!+IltRWrzkgS*%L`)VY=z>Q;(Ur zW#j1WGwJ$UP2{Of*AjmZF`>$bsXled+D##~y)bO4KJuV|kSaUady=rcj~3%Cm)Yv( zkztoLByLn7j({LiT6P2>uXyAxO`BYo>m3m)d|5!E;nA6{GP-2!abA)do&UV8!c_-9 zTMH+4Ik={eR>v38y!&68>7OU|u-h6~y{Gb>Ur-?s$)$NbGwGB2$Y;yBFyv?P4+?X4 zB;YV_UTIgxCT074aFC^?Ov_SPV*Lkd99pv0O@t{kZhtecVJVWSs?={{Gb)q2nl<2F z9|F2h&9yy0WI&dsX$^Cx9P*UbS! zMJ;Jje7-$d;cF(um&v~ojXl|2rpR9htTdIY=Xls$Utx^6dIrabuL(aYDw1{bKDh3p zfnYR?GP6_QV@E@u@`>(r1XPG0x{82$D(+Zq3bZk?n_ET`4v*fRBIE_ z&3YoA`m%>6Q&Ij_bdLG_n}nt({EwPPBTw>O^(v3{Neb?wWLNLBE8i3>mv>dbwC1M! zhfJ*lxThPdaX8D0=+x)jEZm1X;64X?jC=wC3SLrl1Q;No`ZlTWoSF%oBwteQ^h#Ln zzqxVrtojwQ@OwIsH&^aKa#fyl`;N%Wf!PMO(^-N0oSUxh+dO8Sgf{nx%d{p{0|6Hw z#36tLcbEO`r{WEG;=HT=WE)JY_q=a>xQI~S-5MsaE z{9?C}l;`ayJhweVbql>&LMwuw-S)#5HlEJdlk<$&C0i%KV|2-!r@iDp?Fgl18*T6P z)bq)9K_)I6i1T%_!S}Lkr}_mS*7zmIul hr)&U}JqX`Jd@Y5(kw9zpwbcKv#b3)sh5r-be*mUZH%0&e literal 0 HcmV?d00001 diff --git a/widgets/login_info/skins/xe_globalTwo/images/default/bg_login.gif b/widgets/login_info/skins/xe_globalTwo/images/default/bg_login.gif new file mode 100644 index 0000000000000000000000000000000000000000..4cee2bd4ced6e1681b61b3fa923352929bf98e0e GIT binary patch literal 9508 zcmV++9|9?d$kErm$kDOB$Edc!v%ko+z{;n#!J@If%hTD! z&D6HR%CNo2rnJDOwZNyf!Kt^ym#DXwskX<^*1pKkxWvw_y2Z%R*uBTk`T6gxXf{{R2~A^8LV00000EC2ui z0K)(X0RRX8fD0d409hCqY#j+SLsDZ3ZEYK8PDBq61wK(aJv=-wFGdV1N-75z7Z#|g zst2wrrU$S}K@1E=pgTJ&ygj};IzmD|Ur7bWmk(7(WMx-oURz8xHBe_gAB&4Dthm^CFA^brzac{ zKuHKCA*X23JxG)8$-}fMo~Kap*qKVzPMxb*>&)58b!(ijVB?G!OLnY@vuI72P0O}z z*|%{2OZ1sbx31m0c=Ostkzu9ZmoH_?tZ5VHPMto11|4ctj?$z}BS(c=m1RdZ|kw=o>avhr&V&+nWi6p)PYsqX7kAv z;D~vlpg@5J9!OhlgyE)JgNqRb;bZLO;U0Vz&gWl!r7^c*SsBKW8FJW>XyjgPpqOI+ zcnP-XB7;3SD5H8bN_b<1@?mHlTt4;)WLP^2*;Q8m9ckuVC~TmlN(cI}qJlX=$y0o1aRw>z)mE}0!mizHo zADHuDRn-Y47<%Z4C=jt|N^QRBd$EoCKfSYEd2mYfDD=2pj5g~te`ntCdL zC={?NtBp4KD6BleD8j5WDpg~ixn{L1sJ?>g-!Q@EqtC_(rDD^jSE;r3QkE_MW?KGA zA6Uw1JjaFq+TorF1D{*4b|_Sku)@s__G)?Y&KYr?6GK+Mjvm_`a?nCEwUoeP6I?cTLHL38!tTE7Fw`_6dSyM@k0C?bomw15ThpP?e;^)yxucdQaeD&m7VGQoiA-m`I9&*fa!snoezLy0p zmCp3qg`qAj+>hIeC#F^97`yDiB6k_UU`K|O9C+-$d*DX<&K(*q2@jb6t87Qw_=8hJ z-a5{&W2UpVdrJis=Sewcg7({UFL>D~fFHd0fk_;ss%_VLmip0fk7l z^-(BO7c)-ggatv)<>7iwBuWLLc)^lQF^5%D8sd5gLM=`zeaiD9d|0T!J!&p0FT`CM zNf3v#urYt!^BxLfARDx$ZFr~qp}b~hz#+DWd4A;M9_QD$GYS&_hC;CeS`OJpH--)c zNH~xcKd8920WpZlyA~!zmdSDbv6HtGil*wPPbyPU~!de zBV8Imm>O@AcqQi|eSYGMZTH@*yq!8;#9z4_;pI)_hr&8%|c{|rt z)%BRDO(s7nRzmgFs-S7iY)=UJC&ISnxrYUW4tdXQk6Y4HjqFsI2VcfRG?beEF5B?ct}+49J|*9`Dm%|u}K%A~jJ zx^5l6>Nw!UGQxiaY+!prhduPSy#GC~VT-0-!WcM?q~#$+V=Ai>PcyZ(j=Eq(+vYCJr*CsF~m0@T78mYHn?3*koj_w6VWx;Rg{}zdLcU zp7$)~CHwi$xxI;v3GH4(Q<;wWB(dWbJ?DaA*3NgPg9s|ul`vztq%$@piBziTO}F=d zIliL1PV44*fwI)4o>hKPy%Ve8?ZU5CsD?NHY-XGc`qsFfa$`ZwYnl26qjPrjqlq)zf#zy*0!)I%wnC~Vb%D~H>LOe(`7?Mlyep?(;8_Brou7dh3r z!Gq2uKJgf5xZfB5x5m*e@QzEF-M>}vSEW?)nL*6Xhq*}};~NYF zSlt9aG}|O8GoCNJ&Y7)u(@Ai|$z|;5)*LtfZp-wUI~~euwr;ya9xwf-R-CXT8U3C&@q39JxK1`8*90eWvukd8|?Co-+0ZVEO?xMns{vYNv}gM_XXpG z1ng5_#8aR5K93#Ks!{3OWj}j}-h9nDZ*#*_C$l;2rr~~9Yw){{dgA-n<)fs$tdpMt z?E9VLv@i7Fbqrkdh+JM#@-oVCv(fE~ariHmJov-k`tg^j{L9CDQ09EK2Yt7! zmu4QQBp?SVsKX%9vS5BEXr)(9_9uaN$AT@0bo>W{u6GwIrFc&Gcg+`tQfN9(Q&CvB zc%-L>a-c_bvw}uATS%C6WLSpWkpje)hUiCt>Sut{hI`}zhjHj|CP)(^a5Ii~e?{nh zVHkEVsDyq<7iWlu4ycAtXM^trUm>`NS@?G?##CL%KwnpUVi!gJh9-a*h@CiyX{UBl zR~Y59Amx#Ww^0+0fr_bEbYRF?t%yjkxQV0JiJl0B&u5DVI381H7>Ou=B+x}%7>Qnp zhxu2Dde?s_C4~w~c&OjK;WxusCd-cz)zq ziywH4wxKwl$AP!8S}6#RUzmq_=z>W|Zl9%6DyDmBxQvOs zp0<(5esNntW-NsVS8^$vv&6h3E zm_?&fjrNcx>6U1xoXe>qwaHs|&|?_&n7x^e$EJD;$%m_HF7WwD+^Kb0NRF~On=08R zIoO=fd2nGhR{yD*%35-qoo5)syCKWgb z8lP5qm7ZAtpDEdo5PC%(^b#;*ZT%^oV+o+Ec!UG0no~J2Gdg7Q`GXnBj0O0ht)e1U z7M+%ap6N-Q8Oojnnxw@tqcj?h^C_Zm>7Y`&qaGArVHCB3_ycvx6hnhz!obFjFU>c^$Wup=~qByvteDJ5|153kYhbkzU zMjDl9iHR!ZT8v7V-dUzM7^y1ac~y#+S6Z4xTBO$5jb!+#CYErGYNN@SqeI!Je$ZwN zmYbK_rkU!huWEem`Kh4Fq+)8T3@Vf;qDr#iRVg}}S30PXsEU!tjl^n<#(J!@`kI2c zthk#0tD6@X?e}i;C0VSBp?x`dZndqmdZ%MbrVU!EhR7~g1g&k?U>RkhggS{^%B~u= zt=x)V-g=U6S&nA9CUMC__$opws+%n8rkaYa^r)yQAROz|t)iNzn`u8hoM%Bk=qu%L>dj~1_338^9W7pz37sTGz&3Yoq+vBO%iDuqh}3!*N2qflCi_B6B5 z;;_$-0y)w4dEvG5wSx4NfO2C_7pn=}Q9EvmB`+NJmdwHRxsn5m%1iIU-} zuq)ZH6uP2ZE3wzQvy=(7QA@Vm8KR?#u#WUdYddwRYMwJmtzA2@Un{4(L$~Z9wZ@76 zr$P&}hDdlic(nX!vm`s6g$kU9+Ns(@w{?45cN?^iN~-jFrber#Z}zKLI=FFLxWdV~ zo%^AmtE^~Cw4^JFf6Jz+3%A$Gx|(|et~<7N+oVofwY00Y(dTaY>Z|_QuVwk7nL9%& z1wl`xxUoCD;F`AIF@=%~StDDyIGc^yc(QS-n$c@JIpw*+3!D3BpV{k%ew%1XyPJZm zyTiz(#t17TC3I@lp$|ww^i5$2H zEXANazM?$JevHexOks_f$~(HsI=orWRe9M*v$anVt#x{7#;4#O@ zi?mN1xPz*?K#XD9Og-G3#qw#egB+K%DZsxxxqu6du}sVYN>VD-KuJW(Y|OH-^{q9h ztAyOFnM}Yu{L0lFnZgQ^|2#eJtiR|hRU^#B^9s#u%e}#j!HcY=8?0pi4A9&B&iflu zRGZ5GyTpfh&mtSl`mE0DNmwNvEX`!mxh#%k%0m*|z7(9bV!Xm+{K@@nO(kv8wj4pq zd{)eC&;tl{9R0qCe8G2Y&2PG?W|7oNozqyXxReaepy{}^YrF8v$z#mCr`gC{jniu^ z$wr~e20L9z{L`2m)C{e!s5`%ST+?sC)m`n?Y|KtiEzdSg&yV~6#fVnbJv_`#InrYR z*nu6%-Hba#)`YxhlpUMc5^7rTB2zug*H|6VaG_FpL(y-I%Vmpwnca(rjo1OK*iF29 z@e9&pX{~u&+9|*@sQtlXYs#4wkr>IbQVpK0+{!Avs!{ydm}}a+y+V}jNyxfl{i|v6 zYS-gz$jIBPO6AbNI@;?T*}L5@v=h+D%oHisWvrcu^l8Zn>%|h<(Uoe|kwd?J?cC43 zH>5mJ5*A)=3@g`N!r5)li=D#pJJa_4uOoop`EB0ObX-jo){AqtbuHkGg4eCw-F6Ji zG+mu!!QiK@-vVu?>DzR2IM?o-&=X9~73|UU{m?l}xZ*AUDCJ$z-Mrf72Q}*J%v}uM zSew@xE|Un}*B-v$8ls zx?daHxC1xUhfLe&yqk{gqI;(0{6RVK^V_Bz<`PcaqHE@74$Psw<~pn8Th1}%Jw{A@ zM(Le+QF6-t``YiV&=^kT4@=G84bj)?=YQVdnd8Uk%X^J^#2MXz;ymE&SK#LS(N`_$ zkw@uo{xdO5;`sP;2^z>`-qOZ>+|umP28_;pUZj*>>8G93u0^nkM-RvB)}XLP4Xo zn&`9J<14P+EndKTe&zb|?7W`jEhItb9u#l}?AYG!uwBSGEZ=MD-RRlj8)NU#K0Ocq zp$c6p zWz6v%Pu}=mMk|}%BmmExPVAnZ@+vRebnN1dP4Al`^IW1aNrX!xKNPl-(h}d^6ff{V zpXc~&@S<(%nj!NYAML^-=UY~dO%2?Iy`TWU=szFdEI-Z5PV||f^`rsl4RlL61#C;1 z(ufY#J@4*k|3R8u@EacK;NBH(?s*3HU;#frg=g2#p1!`;7fy_LCe zx3#mOv3#$lt@HEorSE+0wYTZJlI3!`F&d_*m?3b3mMLq7Vn#G+)*>z=bZFebfyuxb z#6ytWFG;)7t?Sh8ojpJFQm#7rPTxLF{V4SUD3D;Hjd&2+QJBnGk%!eHVyklu5x0SP z812khRNPTVA3>tSq^Z`OS@=$>RLQdCte2T$%KZ0B;2xWKaO&h)2Ze=b(}XsgqmiS< zvuP*Rt$3GFxpS06RwaqmWW23h?cw_h7FRBRk!aQ=s1_kxw{YXmokNtO-MeWy>-EgH z@1DPrLgpIjsW2&fi0O5W<+2n1zsF-Emz_*`<64C%4oIUGXKuD|MlI$UI$E34MZr*~ zo~mvz;ZIp%$8I%S7GqAgbyb?VyBpfd;D9Tk7Sy=1jcA!MXWFzhbf}P|T3T)Ws_WOU zY*&wBUeVH+SiI;~o-n-`^qVp$tVi566TwH29h-@E9BIkjho3pq1;$?{?ED9hb^@x> zohY^05*}m<2E-dNzF7vL5ffT7nuRwNw;4}+b(mCiQH3ZNiPvFg*kLKENFZ(Bxfm91 zxk+Z8P3RG_3<^BtI8=Rz*oDV687dT{kRIhX33b&W*%~O>1=ysM@f2vFZ7@+u-h$pV zXpD_*tzbe#K8jXfL5a-&A=i)1A%|v~Ag(E5o12sfXDnLH`NxX+M0ty2aKPvbpGf(6 z$Zsh05Lcm`9ZF0cgtDsPhR)eH){|c%hCLql{OYnv;#GYQ`vO z1?3dfqVCb^=%cuXs4JzGDhZ&Rny%QQl%N)y;IT7C>!4*QJV6bkof%Zns)S}ZYiAsO z=AmC|N~$YsZ@Tj9qi;%pgNhj%%l?E*E zx2I^j>66}pav+uGTFD@d>q1<>v>JkmNFD4=OD4SZ)oLrG`fUqvNdtphFv^{(ymG>O zGW;^ke;$KE0rk@Vx)IJf$0{q3Hg`m1zp8QDZJb7@Xt2`YA#Cos3nTlqx={~;!Vy*X z?5G_h49A|g#KP!upHQDFH4%&As||8-WVUy#_L|u> z;QXo?w%8&sS+;eNN})7 zCw(Wm2$DrAUdk>TI}?Rkdn)dl>)yHF96tqot{`_ivM9hJUni7kr#)rDEtlhZ^n{>r zM)g+bgnjn(W~}k&-hZ!c_(>XHrjB+#^eyjGENflE(o!Q75P)Ys8^HChj%YFuY&REVw=Eb#GtN8QsuKG(ZBr z!cMBg)B0HFJf}e}atA?y28!dkaMS^YF_dA}IM+8D{tRgU^C0njbvVTN5EejOov2Wl zEF|Iq1#Mtr?d)IzC`J)`Gvpi3dUwUZb&zz08=vt`x1H39(O7MB+Y#Yr2oxxQIS7%U z8{Y_&IM%C*bgZNQ`~|?$g-{-eL)y3+r?AIC4~d2}4npEkf<-d2k(+xY3nQto-<^ho zVFOs<$R@%snqn~r8{!zB_qs!%U<{%>#vDpeN>ffyimA+46Y~YSSAuO)cm!b=O?I*Z zrtEKj|=E0uvj^H~}$>X-Z`3PFDM4W;1ihrX6x|kF_-455xFJwvq8|-8^Fm zYDNeXjFXtgq@W{J$-4~R(3KvGWq)RAx_Fw6gt;u&E{!T`rYWx&=XR8C+lcmb0qG zy((n+`?cUHlvfPBl`S>@71!av z9=N)AK|u<7>|?gxH^?cjA#01QTnjVzof+;UMAIi-BIbB9Ql@f)f9yv53VDtOWw9M! zOxg6R^tpTG>uo(Nj5Mpc#N)g&mgTt0{UW!dN4~I~9ZF+A;Bt9oKH>BH{O7e=`N0*; z@{mWmujB@;l9iP)N=BIH5+ZD(P^R>s6}#9|LYUA6CGt;Q{8~lFHq7fCGd4X8Q&OpV z)t3e`D&eZ-ILmpG%N3tjM@{O?vM9Qo1T3F^4Q${Fd)RN*FaJ8t&PmAp{kHbM0p4!$M)qswJ$RCq&1~8_TCCBQ_QR)K>Fu()%_wfSTrWOJ{~{T{ z;oi!)BdtvoLOkN##WZoLC~%))3)x;)cEU5c*G<0E;d{6_mDPRiSMxm9+eT=-&kN&4 zGg{20j;MQctn{V(8|8z3x_HOi-=HI0#tP3mq(e^Ku6teL6KA*BE$%z11GU!k7GTU1 zqxQ8Qy@+n_G1KEN_mFap({`t|ythd2y{Ba6Y>!dk1^;!%raYu$XSt{K1L~nFndr{e z^PUwndCJ2b>=d6nR*wyIybHaH9dGobcfGz{mY&3eM}6uIzxqS}$Gh`Zzbu|ZFM7Xj z{SmjvedS%fbIkYN_jh0X*;9Jw;Sad@#@Ew7lCS*JySnf^T`_VuPf4zB+_E#a{)TOw z{mx2)`wTw0<-^W<@&BCsF1K~#tDoz>x1sHb&g@9W&YX)b2q2_?iCV~<8S0qq_@n?Z5>eYg=z?o0m*|CIgU3; zi?yhem)Mg&>5gEvO$HNfR~o`lJpmo&`6Y9 zMV3d2lm|(OXk(a%`IEeOfS#CuaOs8=Ns59wm__#;lv$Zh>5tF&il!lr0|}Vbh?8P? zilb?Pyy%cZ8IexNfOC10!iSX~XIrC5n*SvKXaM()Jy$UTNsm=&k2z_VU-6rG2$UHJ zXJJ`(Pso}D>6)M^nV;~Rz}b~v36+I5of6rY|FvunsFK{-oo%Iiw8@vYB9_AFn4W2n zDS4LLd5DOZpEg*UFu8?`*@lV-YB2_cM%9}slb-6imb0maZW(pdiJM^fnWl)32%4b6 z>5MuklBv0XfQWuqd68LppZYnXZ-<4ZshFqA*~f0Jp4pIL5&eV3|adyj2|mvV@juD;6i^YdzR zk+s9lc8s2ho~}z`c9p5RaEziyU2?+C*3{eL+Ti6{aD|bjw7tpGUv`RunW|cFgUi(0 zVR(#IY=K;Ig@c=}RBC@wXMEe?=7*oMT62hVi=Ae2kM{QXnykB#rnqZ>lU{I%ovyr? zs<@S?w|SAIXM>uFptFjhw4boOPGopeXnbOEjH-6;W-{tE1`ug_v_F;F5 z-{tA|_xJnz`&Vv)-Q(!o;^&~TzGr=q-sI_Cbcbw%mHhntaE6&?e2`&#knHa8UwM#n zjiY0Hk#UQlWPzAxf|zK9onwHPXn~gR@$$IF(Oq@775?2&o z2q5seL$s*Tqezn~UCOkn)2A6Aw9&>*Wd=Q1vufSSwX4^!V8eDN@A;1AtR%zvxSY~)+hX$bJco_zM{=bwP80K$bJsNf)nhidRcqKPgFp`VOC+9;ruR=TGEUkG5prkr-_ z>8GF?5WpI6M4%k0%E19gss^n3hpMc)3Wuk%%GxTcq2`(^o)84#>#x8DE9|gckl95C z%5{M3AIc`%g#*bh+d&Z01}kl~)efuew!T6zAQ}OLEAF`DmRs(JT$=hv1%v(pLIui2 z0IhN$v@j$1HOJ7N8Nn)?Kj^rNRY%VLOkGw9Ec~b_~MK=?l|HVgy6vBAyn}A z<(OxFxfc)g62&eXm@&s5q?c~`>8Pi!`s%E=?)vMd&tXOmCoN(70x*z}$L_rM?)&e+ z2QU2a#20V;?j*pV1`@T~zQhf=*CGA%)K_o)_1I^x{r22$if!7@P#luVF?u=LJ)ee z0t0wM9>73`4_u%dNcc$-P9VVv+71^JxB&qKUHQ{k%BniAn0sFh5EjOBsUCk|Kt+7*UG(p@0Fj8aaY(CSWX)!mom~g_=Xt?I3gE)yn0$?}_pbN#I z+k@hS3*yjCVkCj$&;>El<0jlB^upp0#lS1zgdQA_muve>@~WHV)j#~$|8u9Zy8J|iVu+SW%iAO2Z$7AC9n4gW^7rr+O4{C0 z zj5BS2TQ6QuJ37%FD@^xi^FNdYb1P$pF177d7TY3)d1u$9_XXdnI3ilj*;`~5!`;Gt zNz$cT$9LCvdc!LDwe@?ug3MHH!3n*`~NcnOUSy$|{u429(3Aoc$r{I(EF-mc{e!P0(=T`&;Qqd}1rz@9_HHGZ=$E z*-cbm%SH`v-8Q?aIZQUwu+rDo?O4mYy*8bfF_$pI?Kf@|@fa3~kQ4qWL9-MRKj)w$ zv0BprcOT`MgInBd&*1nole0MQ^%j`wHvM_Av+`&{U?cUTm9>pb{~oCiW1oRLz)vYw z2(Ja@+OinY4jVNz{EK`9NtD<$+;_DbHGZsH)ToG>UTN&=ciJ5dRB^JYE~v!ZF7l20 z%b{R#!qV>tmmId%F-qi5d_&U;9kqeX-ZFKNe~+Vq_en2B$+GlGWk_~7yFMsoG(p6U z3Bzi6G5O`TfS55MoxL?#m=VnBEy&<72KnD{;(LTXLEH1G1H9PQ{1xo&PJxf#dHz&Z zL{0yU24S9?(J%t~%hgCgnN@@w5IoT!5oYxuRqSk4JCU7EOoc?$STaLZyC}7xrB2Mo z`>e(?z+2aNFU{75a**j~lVK9dMiquM@=6bmR@ F{{{Qb>GS{q literal 0 HcmV?d00001 diff --git a/widgets/login_info/skins/xe_globalTwo/js/login.js b/widgets/login_info/skins/xe_globalTwo/js/login.js new file mode 100644 index 000000000..7e44a5637 --- /dev/null +++ b/widgets/login_info/skins/xe_globalTwo/js/login.js @@ -0,0 +1,36 @@ +/* 로그인 영역에 포커스 */ +function doFocusUserId(fo_id) { + if(xScrollTop()) return; + var fo_obj = xGetElementById(fo_id); + if(fo_obj.user_id) { + try{ + fo_obj.user_id.focus(); + } catch(e) {}; + } +} + +/* 로그인 후 */ +function completeLogin(ret_obj, response_tags, params, fo_obj) { + var url = current_url.setQuery('act',''); + location.href = url; +} + +/* 오픈아이디 로그인 후 */ +function completeOpenIDLogin(ret_obj, response_tags) { + var redirect_url = ret_obj['redirect_url']; + location.href = redirect_url; +} + +/* 오픈 아이디 폼 변환 */ +function toggleLoginForm(obj) { + if(xGetElementById('login').style.display != "none") { + xGetElementById('login').style.display = "none"; + xGetElementById('openid_login').style.display = "block"; + xGetElementById('use_open_id_2').checked = true; + } else { + xGetElementById('openid_login').style.display = "none"; + xGetElementById('login').style.display = "block"; + xGetElementById('use_open_id').checked = false; + xGetElementById('use_open_id_2').checked = false; + } +} diff --git a/widgets/login_info/skins/xe_globalTwo/login_form.html b/widgets/login_info/skins/xe_globalTwo/login_form.html new file mode 100644 index 000000000..dc4dca176 --- /dev/null +++ b/widgets/login_info/skins/xe_globalTwo/login_form.html @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/widgets/login_info/skins/xe_globalTwo/login_info.html b/widgets/login_info/skins/xe_globalTwo/login_info.html new file mode 100644 index 000000000..d561ff674 --- /dev/null +++ b/widgets/login_info/skins/xe_globalTwo/login_info.html @@ -0,0 +1,31 @@ + + + + + + + + + + + + diff --git a/widgets/login_info/skins/xe_globalTwo/skin.xml b/widgets/login_info/skins/xe_globalTwo/skin.xml new file mode 100644 index 000000000..11a426612 --- /dev/null +++ b/widgets/login_info/skins/xe_globalTwo/skin.xml @@ -0,0 +1,48 @@ + + + XE Sapphire 로그인 위젯 스킨 + XE Sapphire Login Info Widget Skin + XE Sapphire 登录皮肤 + XE Sapphire Login Info Widget Skin + XE Sapphire Login Info Widget Skin + XE Sapphire 로그인 위젯 스킨 + XE Sapphire Login Info Widget Skin. + XE Sapphire 登录皮肤 + XE Sapphire Login Info Widget Skin. + XE Sapphire Login Info Widget Skin. + 0.1 + 2011-06-20 + http://www.xpressengine.com + + + NHN + NHN + NHN + NHN + NHN + + + + + 레이아웃에 맞춤 + レイアウトに合わせる + 随布局 + default + 隨版面 + + + 하얀색(기본) + 白(デフォルト) + 白色(默认) + White (default) + 白色(預設) + + + 검은색 + + Black + 黑色 + 黑色 + + + diff --git a/widgets/login_info/skins/xe_globalTwo/thumbnail.png b/widgets/login_info/skins/xe_globalTwo/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..f9ed874970f1ca373de33a35587f6f3275e24eb5 GIT binary patch literal 17665 zcmaI6QY} zP0TE8d5CU1dx;1vjCqLESY+sB?1fCsEyO(?O_V%km5n^Dj5v&m_;?Ap-8uge*qAsQ z5V+e|+d6T&^AP(&e4Q`g_fSih@O>!fR&k+ zftj9znS+{uk)DB`j)9Smo{ffqo|A=*lb(U#zaFB0+8m8dITeLP|4Y}u5f72Mv$H)X z9i5w-8?74?t(~J89Rmjk2OT{l9U~*nKLm}Fhpn@LJB_Uq@qaT2n>ZOcTG%^V*x3^N z2cvA#lg--6M(8`#q^(9-|Ml>QqiBlG_cwXyjhw3D-< z$^W(Y|C88B*~8w1PSM24&c)H_-^Q5||A#7jP9aAV17|x&Wjj0T|6WCTb311{Cv!V{ z0wE<9S_T3&3tMA5H>dx^%gAs_*g82I*czEg2=fsAW1zLLFy>@pVPausWf2tNU}Iol z5TR#h5fTv=5Ta+HXA@yz5@PsoSz$XP7aJ2>=l_;9{=c$9|EuhOxPp!SKh44>jux&a z#-fgPHU$4UWloF#-4>4jmG8e~jsJIB1pZf9x_`#d{l~`szc%{6fBo~G|LFdY+x{E; zkK>!z{_}Rne{TKb<;w#AAmAb)ETHVZan%j!t^MkQ|8~Rn8qz-n5QI$t84uE*iDEGk zO`(xuqR~L2m$*IXdVpu!kjZ?`TJzVY#kO_(re$4jqsX>l+N`yukTStVDv3O@$bAoLk! z(M^?iv#G`9o6EzDiN^0dYKx1WF2IZ(~0>@*tdbA3qCkQmcC=@ZEM}z@o(CWR*Bj9=Peg(w%fKE|Y}DrPcdz;s~|o|sdQpjf1Kc1W(7Dz0|I7F>wjWZpM~%5&^^%mfT;)h5Yse=6Ij_9xR(kHWw;j zwpi4T>-`8AmHnjPbsu)h3@wTh1_gpGF$E&9F|>)yjbeDlWyZjB(P4|yx}3-HQLIPR zRM)kgxl&TpnsL*=-06rIlqf6BsinAb+YOOe@ErH#p^nN6TbXqrd8Fh7q?WWA-5l+{ zY0)F%jsC^BfW#>i@_43$YM5)1w%%ijeM~TaCWgoS%cvXX#hE82utut)WqX#0HGn&q z8(OL!#E>x6_X&03(Ks{Kp`OMq2{4G5JPzM-f39l1z7#6FokxHknR@8+nK-pw(4YdWbq)r9%7-zo?bRK4u~K1Np^lB}*$0Ad4FgQ< zAy)JI`4LK|VzI*T#Fpa=o1U{f4w!l;aL$-F;!AjqbvZ6M$`^AbkrwKJgkzMAjeWRL zbi`n%eih?lTLKL|8#gWQHP4fRknk~jo<@JKj;lA_aNZZ7e=q#Bp&a$O+lGH$e~;l` zuD=J^e)oRg7X3auf8TO{pNLn&rL}wA+xDZ@-7d zUP<`*lez$6LK^~8Olxw@P~(~A|DBjJC);QcOty}>Q)TAp*fulc?o{@$A)A`8CK`gwkA=)>g4kG*}O z@A#a43A?SH9Czk^U76Lw3L_>FBt$3c(6Z($bT6Fo1Q;_96W1n4_@IF-2r{EvxIS%Q z+fCzqU-NZ3KMW$Vcamt2m3ps41Df+J=2%tnbJW2{TjHS0#{HUCG}i$Z%y;g8(_>I1dm0u?IS7 zVqp!qT{lrEng+>9U(5W%F88@tVXPOWK|QUO7z(cvq~Zq9KlV3YH|w?NkL^Y`_S9sU=C-*vNISJ3U}_zoxVx~=hy?;YRHS4U>| z{mX1EjqOiH1i$~=h+|SBFU5FQct4MVVF)`hq(nMB)!)e_K_|#+tO##fuGfw)5mXjR zLRnP}MjCi_RTJ8zJZV#`&d=K(r>9*Cy=K4f++5FRz2C*(Pq&$`!QZ##AUk4+?%U(t z?|Hs;8Fe(hw{CR4_wV0RD>2@!db`^a8a$?9Xrjmh(GW{{3Q6?-LF{CI zY)ed2O;zNY;B!4qE1J@t6)hm<4ln`7$Tx_8^HBaa1Q1ugWwVE0YQ6T}^?o;gq{RkO ztg>I9Z&?W@gr5GK2@lr%K2>Jctjx^z-d$&_3Zq?d<$TQNVr=8fEZ>@s?7j{9@ts8x zao#TSy=Aj{H=+`@@ZP)qo{}{!Lgmc+Tw(W~L#{NXqagQyK?+4_R#M`=SEpQ-Fqu5C z5SSSg5u?vfxV(l5SBtFD>;UD03C!wTRyr+PTRfjYhSQi=Lj=^j`M%iwJcjw2RkOQ( zE);9b+I`*Y{hYhGRcUS`y=U!(Qe_mvfbr@~NXS%8=XzwmD?|klE>U~w_QjWAl80QxQ?IWC(*KK-(pkB}>NA6%8Oo?0?uy4Hy+ zQ)x;(c{IFFAcHcGxKmHPI*nkOHW?YSgqSs18$0HwSYp@8nr?#1FF~!3PtnP$(T<4a zZk-!=R@nxOkKtZlP97X3&YLLlq1NoB8!JhddK*(>B3A;QW!5xaUQi-tVx&Nmms4aS zl`2Oo@&PrS_VBRZ<6kT#xjYIuym!~8(No5CHUlC>*KW{+cxaPWiqUVM!ma==)?O}R z#slFefhd47jY~Y>Sg_Oz2m?dH>+Chslq&p4L0deoUTGZzGN!hjULp?yZY( zzqW?Q;jNF&yw@1!@3>!xU_YjDS1-WLY8(qI_|Tf*jzSl23fnmWiXxFHDM7ZgR#DiQ zlIv)mkBN+em7#Bn~FDCg4-zN?|9JfmJA8=SmxQnxytjf*Su8B{VN zkm8u=5^VSg3cqTrAr#>_y-wZSWz=}f8*xuOd)U|~j9W}nLSsylV}jNLg*oAJ^f?GHQnXP2zWBr~ zNd#_LR^j2Ov*z=Wn}$0I0gDltglXJASOFYi?l?*xLQN;1svE75(J394!FUu#+BEDbaA3FS=*_WQ~u)e62BViE-oGslzV?{ z3 z<~kqQchV&vR$4h-7Dc(Db6_uiwf3p4{=2#a=l#AOFo_Zwo~C-~5x+L+Uw9ZbTNJ7& zkbXFCqtP6Y2^DB$#f~@m#OwRKkgi?+!MaUI5{e zSNc45olyRP*mwgrzEGU3PA_n(L5_7fz zwOr-3Us{VA&A8iD4ZdAFvGiK1CNG3}C*#A?LYVmya>JqA*27R|G913(YOq2S%F^N@ zy;4oo_X!1yscKj@$h_s&f)KCxl-!)7p#IyWSw(~9Fw+VZO;}LMZ`oxN)=Jp&C)>qq z;lz)UrejBF+qq4CD=EsriV*BrP%b~XqRo_6xc{ztlD7cRya^*N% zGvP2ed6}%%nLa>~LVoTcibX`u??>>8JTSj45sKO*Zd&@fI{(HPNE!B88gJBI8_ZCE zkXdgMQgcNVlT@i7x)N=4PQ&kvujd61p^l!LqchTwhM1a;-DU)z+p8{rg$#-)(x`zX z@RmM{A2H!ngg)=glgPduq0w}YUSp30;HT=`0n;{s#Rvc#x2t-A7;zXuqaPUR=h#EI zTl2x%1QBJ4Noz9NGE5M4f$+F%1L_2Rg!VP==VtXa{RsB zIBe30O^E~!44_X~->6C+EL45EWbnAz2>>Wyg-crQ)=mqmo_&vj-U;pOD0tpj8;a?* zG{unmN|_RJ>Y-p)c{3KO-^AUD6Jy}BRlx}KYf$1qy{-CdeJg8j|V(4Coo{gOtsF~pD^C}KvIjvA5GE~ryf z3@HsI8wW$zIQlv}#*_ca+1=RGni3~wW;T?)6a9f4qy*-W1dMiMgjj0c-kz7_3@bx3 zrii3;A<;UE=&w7$2IDnzCJ!Y{EccKQu1{zxy8_rHlCaQv8ZGYm@*XRp{tT=P zoimg9n(AlQW5xRM{+)T!qLF}5GrBk=H0)szLqfDdFU_l-grCnv18u=DG5PZD<`sxt zH3*t5Yz#OFl3}@>tK^p_=HSy)A=ZWS@aWykOt>*1J~qrkPrOU0*sWY`LmN>C55lQK zuFi||`hd+tUu8O)UAzI$mL~a0p`cfE5Zs=oIs%TYcvV4`rf^9ZjoY zLu59P!~SU&eQA<*$)Q4LEG1hTk^EKmBNE6Az#rgCam06f)Pu;b(1Atll6RR*Sm?`OL>Jg6g1+EtB-F0)q)ITQ! z7g3W)*e3Mdg^i7!s$oz_+YL5qQ6l(yns8v~B_%+?)fS^Qtll1;maYQVwbT#$$D}hy z=4%awUP^yQ`N!(br4d5L4yKaiYOF3dnyX`jwT1PA6e>#EE6wb12}6ML>X9<{RPFpi%Vqab{KuM;1a=lqIW{L-bJ}}`&0pq}K>k^sd6j3DIk6K7oPg^tQ z)27$0#Y+%HLS+lklcxqulDbI?i@l$kRFFgGQn9KbBaNUmrz3sz*DJbG_Hk-++U z5Rl6vvJ;or0pN%#AkHgGz^D%F?S~r_6?Qi+yS2Z5xj2hSRWiB1j-*2eE1X)Nl{=+l zVWEYE+Ulh9TSU24RzgbeJY4lf#EE&#FD-Nr1`|S2{B@5#BuA`Z=N>hbCq)1yD0WOM zZ!ccwW9RmEdBHP$ux(i`pOu`r68^0=K?7_OU|rUla;C?N8v#{vvT~}sy%}C~JDO9J zUkxMz8kHz0x*)4(7hBI@Wuc3KhoMGd$g!-nU}=74rqjOoW#>l9%tfWiOkM@)iw8{! zYG&`7Wk-@UxWhC-ih|R@F2U-eMUEi?oi&_)b0=>?by>Wm0Abs_CK{5MFkM(Q4%J#nmaoJ3}dJA2FIIoKzUs zudvuSU?DisY!$%;!(?f--6e|`r9Xep-n690s>|4Tp%DdS`^!Avg;{JJKwjzAmX#u$ zz%p=ku|@(^t(9aEHfppyzxGm%V^T!XJ-JDOAk|+tWKRagVz;wRlL)3UbkS<#w&xj1 z&uY6PiRG=3!^VCIQzpIIJVa?#~vy78K`zE)9juX8F0WE z1|3~Z4FwdLz$zCcV<1je+B&EKUrju>K#1rmB^0Ki;NKS+tqArvv!$7ZIYB(q1Co?R z)(prGE=&TnY`I1aK0(w?sgi43Q*2{f#`QH)mufO)LsJ|tZMeSwvoSx-A7N*Dnl(y7 zE{#ww96EpV0La#? zA%lXOVH2`ns5>N!o#@Yz6GwiA;2FtWq=1i#;K~|v(U6ZkX2RsSBr_HVr7f?Xniind zlnvYOe63&lzPk#q35X6rwgqRERvP@?uU8^-_Ug$?`*8@-n>uic6X~%wlzH-v%fRz{uZDThE=u zi#djrKXvW$VNxmmfmsB(w=}D$jBXXyzqCgg4KDys4`mJI;2N=FE6~YfN?eq3HqQ^8 zTN6V|kI4Rl^YR>F+Ql?Qjsgk18{Y=+emSm%+K7ZE6pguH$6th&9!N-!!jVP8;HU;j zG_<_pF|qv2af&R78IB@*#~B-6^Zf6X+{#NvxyTk!o~m|Be3G#Sa`Ewt|Hb<-q|f`05c3hgTJ!9H>2G7e zQPK*u@Py^sMGlD4JaRMI5e;U~A~A+48p11vlr)0-)MJMAf=$QCcMu%O9m&}Em1x+< z-^j0uA_T`4YWM`8L*f?}iAmwQD}n`-`#rUy{tSxyP&gJEN-V!u453>I2{ukT{c3CK1c-Ak;;g;bM+_l|0Ok`dB|pDJn3NJDF*@+Uk)^ zSp?w))YVgeyIf5dOskCxh-wMb&o=BBRf?N$6W8*^vq&K1Vv4u5E?qZ-6^=LrBKn+MISxkZn=urlJ0`@{Si3gP)9YXg#0H=`ihu|r0 zbYT>{+vpR;A#Zea)=`P^+jrSiumW@a0jkF?5=jJW7`a7s&%5<5>u%01x3|s^liXh> z5WB;OCUv8l68_wiqz22)lMo=G-@s^J<3oxVaUy|xhmbiK4^L-mcZVnCVTOO*fk={D zGu*2~L>jeGO9A1V6d&6=yIbZrE`Pr3WM;844L)d=v{1vfgKyc9UJhB&d8QV5qKJqZ zPHmdmYG2|rV4D+*ln9qsJZV$L7^}KZ=H!5q{=p5E40mqEj~D!v8hu$_RoBoZk3~X3 zmkhVW`*S_4b%bh|jtgSZ#dNt%>-Aa` zD;&Lm#OK9QJV1^0JRCIlcbbV!_kDqoMq>5>M2c%uPG-R>M?{8=u^2y>?LK% zJoh!})Ni}U8@c1c6LU(`)9#7lQ6%P*NW%Bj_U@lJH4#8mlcYt7K>`xvj^IHyurJ`Q zcRtRSx$@;vM1`UX=JSB#Bb~U}k;x3upPMk6YM|XlOSrTy`XJ0<*r=tN)RUFhtB`X` zl8@M2$RRDwqmN6_Q!!HrVVxalK>ATN6kx!F^f4Ew9;gQ$ zf3KgBT^skcW_jS8i8`kZ8L>kDnEnjv_55rhhvjfLL2K(fJC2;!{an1Y2h>}1>y|2_ z@(=n;1GMc-b=8(ueh-(%rp0`C6)M$WZT>;G)4l1gCGj;BnTHD=nXgax&_#gAsyZ`9 zueebgqRP~}m~!ILjR#7=09S1R$rM7b2ef7GZCh$AzJ4!_?eaO;YW028)9sj7GipR2 zFDSLZl^7|QH;cV-+o<|I>HRv8^SejmCrL9+F^J}zux7^L^LcmsdCr}lqVavTl1qE) z5NED2W*U%@s266>0k#98pZBu+S0?$H>^EqDI=h;rR zh0W@595tTX$AGGVWQPQd0@!Pw$)Iw(iIJYtlm_b)BToz$HcY*NA;PFwJn#D!ap^Hh z3nG%}%E%+?hb=hjW=b`|0mq3Tk~mg|94;;>RuT|4V4)_CJaQ>dB9H2`#7M63sR6BP zztUMZD7AiwjFUn#F_DeLG`|y~*D^@?jOyjBDIA}cdERwDA=k&h^>s`LyOCG+-=OYd zkKC_gjAK0ABUl6P0M-}cH%~}%0=dHn2qYM1N3cM4VG)K@Kt;_cO0tx@D|>KqH-%JI z7i5s0TvJtYqF9q#?**r~^PQW45rF!7d z_GS-QW~T-b0m?=mtUKrfbVeWx^*t`8^SyWSGClp)-?@Q-36fY+KuMG8Q>@v-dK*cN z^ZhL@Wo>3<_2Th)6$N|+FdosLD`a0v1gHe)l92cYg%KO-6VRnUbDnrM$sk(d0;B-^ zlJs%6PX#gwU1k6fuADb1)gQiyOq+@#!+VqSeL#k_2FlLTSyCukG({4I98d8`s5H0w z!HGe!=bsQz0FhU}ftwvFK-6XsLFou6mQy-%r1$>3v1dnu9yRyrni*b$H2EXUn>{i#l11lU)2d?j5@CmI8VND;NY=6vnl1Ph!91E4?%0ictH%~cK<>U%ohs? zh^&3KGeoT%&i)cc$ES4b_|v+&gPon``@a4MV7P$X({QD=4h4vL(0mDAZVFIWNC{=m zWC?NUT-+Z3fFL^-F4!naY7j*R%Y}2-5#k_1b%xr~1!#ZMy2Yj015lJhg1pnO$kP>$ zJoJ*c18jL_DZJDMXQY#z-DD zF`8NoCIsu)&NVJ9ZD&~$E_uh64=Ijgu4;g$l;;o8pv9ZGW2ZFMpkv^m^;`3|mKj9)d}A=! zfZlBzSUMh$yV@N-HVzgc1ERb~lN?M5LA)(6v@n8k(WvXnQMj*-o*M0Z4HfeY1=g0p z8Vt^bBtami&AoWU2@mUxo;lW{5`Vq~1zgR~EXwaBZ#yyEb3U*s7j zkHl0YY~}fT!KE|L$D^-!o4u%$QT`7pcIrNfjDbQl31LL*RM1EDK7^PqXbp@>(s&?u zfTGo<+nak$I#;;7KE-aPz6xld%7L&0eQNAg+GSg)BfGH#IMD!;#Dz9#+<)`l>QZjp1DXyhRc>_t z>Jo{=W=JhDDWJhevbtNk+E{F_?8xg`fjctH3MpAvQ0IE4M_SUFm{Cza^RGS^5qMxn zSvm|9<0veNpj11h@xVO>+_>f?G2-CIGQ>9>o!F9R{Lp3Kd@u(oVns$enwY9WrXUwd zq1qWo1+bnu^E(zuXg6m=1jZZiiZ*D9GW69%D0@d5MOlkSe6GYl#~dH zbykO|6qfXPY%a_i&_%uil?nu?X4ObQMj;`LuBC$FD;qE*Re)n|ElVgxx5_9BFrTp) zGsP81diY!UKJ8)satk1bigt!Yk{zAVzarx&Lu7PaHvlAC_g#Y| zSG+-0zm(H+DGlS?x?jl?p8TTk{t_!zOzlRqAQ5t>;EJZ&T~wlcs+!X|FjYrAB9Bpq z{R|8L6fV<`LhnW)As8Jb8HeMGOn&tOCzRzq-ux+mQ_tCvm_U=a51Ggjs1lPX^sF#BatNMD) zp={cu%ndf1t9S1TZWqqub`&A!*}>0s0>v=l6* zc%^Wb*R5`mhQUGM94ldTyV3SfDz{D`R0e8H&!USDxwzz&P5uzER$bhRdn`~BDve+n z1k+Z~y*qdDLtt=T=*CDamgCj-> !n*^)({;l6Hh4sZvOr{WY{&0ZQAF<()Q$6ny z?(g$aHy=Uwx07n#!&tkXy58%bXR07*L=52^kvM*c$OF?_y*7{C`pXa_ou_1_Kb~fo zl5)g}BzESs8hVtFi0xVbs!0Ocu0iFIFaY85{odF8zL#rvx_EI*p1>LtQj8{@c&ApH{OsgrbGpMc&2#o+Vs^H{<8Ev$tsU#E zNw5$B#}yqlO;ijt9cCwyW}Q-2N_0Nqu6MT^D<#l?8hHUVXoBUqilLCo&^YyijVlr`Rh9)KtB3GPU`;B3LBEzSpLuwAXj7@yfsnqS zh~w8Dx+m>=e4PePGqLYS8A^wRjBx%;1n+1YAreIa3n3p0eXst(NR$juHYe&t+>%9O zUq7%dTTS@eYP$m+>^=D1Ix4ik(E`VXm2nRb`wR;sCktZ3Vp|*K&oN)gty0LJF&U^x zcv3(rR@cRwdN8MF$!Sc*6v1e_(RE7&@%Wo$lr=M$Uq5#|iIB9U^Tr?JJCKh%R zH}lAj3?n%+Gt1XLOH9u_`@kq0k3#E!Lr1w^;17UE0tgK_A!$e{iB$iCJj#cQ!uL9{ z+OkQ}7vZkH4oYq!h;r3`n~*{yDh9<{G(re;JsH zCFdZ)#FRxBN6LI3if9prJEEY5N|0gg^iYAj$VhzSovWoL0^BLycfO=srjMHLeD0kDsG zL0OU{zk;Ng#MQ%5H$%!xlTF2_x@sU6-7Pk@76hWqw$>CQ6g?KJMsss%uK*B)#BcYRLP*N0a8k0$gTkZb zc5B)rzxlHsF0TA*cnQiPUN@^NT~VO03T+{I%}Lp%+9IM>k0p2VYO1d|PIk+H90-jm zHIFbTV$=ig3d))r4elK{Aq}7uCJ~GkOFIL*+u`KzWvdxU#t2}2A4TG0-0s)jbYtru zp|YG{Tb+a$Fz+7wq=4p?KAr-B-2ytKQ-Yv`5c9s(%uoz@}XA8bsI*VEn( zX7*u&UEQQc z;&^@s{^Hs)#j3=)qm-VZjaoG=fdr+#(1nQuG0l-sx20p3@}s4vrvnOan={wE-Sk@? z0WZ4MKF30%8JL=95lVB~-b}Rfjvwa(vCZr*_C9svH#HQZkG{dt`8~f`IF3H*ZELZy z*hf`wwmba=M>N*d?clO^i?zCV5f(-NP8osw4bjtiT<*I2zFjfuA5Sl@-@%r?4zTn4 zF2jNSG%Fnuz1j52@iC42{zw*Buz=ad*Wkz5)~T6?MmIz3T;=vVdAi;J-u>o^^P{HVLbGgeYe$3dw8-&{MhAUF!j9W+P#f0rG+v0#D4_)6Y)Lk-Ov5C zGYWlD>vyWPQjC2%TC|eFNgR@z;BFqRBnB02D2Hc|@4(-pu~G{eYEg(Sv+QyD3eQf|qDBZsT6fdOcnG@^SL#MmdOw6ls zTkBLGG+1p3uP|UF(Fw*_G3EHu)pmDz?d*OnYeZa{ghAV`vN=-7M?A>Qt9r7rd)o?f zN>sf?SdLS%nxss!4i!cG&Oh~1ysvlKLmA+1)tZ&>eh7Kbjv7tMfGUt2Yr|9bO^lBd ztVH~TxN)$sj=HSui3d0kU;uItM_Npf3LSa~G1kCHI*Uml2rNXn)aP;1T1F{oGqC>5 zaO^fy1TiumBQNC8Um4^O1JWP*NHrZcM2G>ASUn{w3TAW?LsF@Yn!gwmN*V{nQ{he+ zrzyQo9x1?8M<794ZKWToN+j0A-x<2e4Kk>hUL@dDIGs__ft5^%3zjYsCAQFUf4%k6 z5~tkuPFhqc`(Le^5xmVXE5e8|;m?qIHk`h&J_Nq@%k&I~S1g`a*J!Xku-Yyk85NE46V%wrAnh3=&7l3im=_D~fmp;kB{K5^HJEHH&I(yjq zCATV8vV@kD7A!uLQ+Ru|nO36`pU3snI%02UyO*6;?LRg*2|;Gj4D7^_Y^}?R8mpuhUHseC>SZ3*Ps^zGz~n)5oAx;hNE`w}V~drh&l7 zZ4SpGpGDRA#`^ksOF>uBE3+pq7z0Kkj*OO;PW`9bh`n4;>qxYOH9djHMmMJdQFSvc ztSkxMK82W3VMvTY^YpXJ^yc%U+m6@o-?GcTsM#x*Go)!|NpP`q*EJW6meF*SLaAYKQ!2D;j z!W@4vdH&@?0AUD$1m*}RZfnY@K&x|eEMyHp(r3wU{fLMW;eU6FEQY5jh6-T>v7RF2 z_K>)tZd-`t#(?M!Nao5tLR0&i?In(kwcoMi>CP5ODUf6|#R2L1?FI80EXy&>(}(A* zUq%N?RXeAZJBdwoGA+oFfWPV#dy-vvC@}THfv};O=5#7H1pBFn3c3zLk%@3{oD*Wi z)Jd@t%myYMNHBSUh=o9N5RoI1sU>DcRJ@^ZkfmOlPYn_ABsA3k1%ro(1CRlP4Fxa0 z?)i7*Up!J&w%CaNkflNs-F;<@rv$vz-2AEFBanC$&431@;2xGSG6>OD6sHYop=MoV z#Qtz(#U1H099A1>)8FxCg3rlS%uC?-nXI%nd6N zZhztQ^kaAcNxW#3VE1Iq0coKh(&vMO8C@b<-LSzP-Uk+%=r-|!D1-Mm!GjDVPOv9I z1E&-3yMef5Z*KOXD$OFH0x}hhSMDN|rbaV(7e4&-es7w)|6^Ld7d)T}$qnyiJv7Lm zJ2hDf7-bk>O3jc!UYLZj+5(tPjiyJa%kLV;l$F(AWs(phcmb6}t}9tCs+95oTMSv$ z$WJi*09~{m0&l)~@@=#l*X!q~Z|LlPchlE*#wg~cxs^mPKo5^wUE{iz0FQtXS)yO- zS%z;&ew9Hy$jinqaA0W(B{0t{V_1;`=$q$Frk}4E7@q=G13$%3R5>Fm?jJq`PKU$i z;)K!4=9#UE<$B4FLII-<>pHJMgb+YYDAYkVqsQmO!>@%4hYW}>0*R;4a-6``edy3B zgwex8yJ@Y;Q;cBC@&{UGJN|8`y>YR|^zo@WfWV{y%SDshnY_Vyzq_@TIgk`8-EA|<`}UaMQGIp*yeS*;MxtvW)Mm=Td<=F!``iUF&>oJ`7)6(WGtZevA&bL@D&jwNs z_va5+t0}O5nGMg2ap}&f9!74$W$9P0lh^(D&*tD_ehSaDs`Ja&ee0}l2BS0H+r(tKOPVpiqafR7;dEyU^q05(yjA7m>`Siq?O>&ol=k-i_u1Lo z76=RX2_c&Bl3N_HR;-V2FNNdn(w{+Gt_v_)UHsf!L;Bgjwcb%}T$quvFfedw-}xIE zCva+AzXRC+@-$P#)g3im4@czJacunewQ>Jl^wuly^J6>bWek*_*yW|0?b8g*aDuq} z!$31Br*7b?q~iQ2yIwDjp;39K$NE|ypQtwXTE3O&tYtQIxSAPn}5d|UO!jO!$G}2nRIw{uem>G zE8qJ&n?a#7wZALyJ;$aaBZbs+VulQ8oRc0Y2B5T@ZjW2<6po*-zOSD$UuVUQsbQsm zPEv98zE1w#MTHKt5T)nTa>e@^*cSq4^Nv1;ERM00SIC;0*hPb%Qwx!Bp$#*I0+N$&h7hn zGCe#jLI7UH0000)WnZ<+=6kxNmAh4U>+z#s>EL17e;XIG^|g1Hsl-^Qi3yVY`iKWoPz>-%s+ z$Jfphs#uh90lP#$p-(UWHSh!@cxBldZ~XXTGw_s1u=n%=ybX(CSuy-fK3Wxdw1-=r zImLutBL?fbP%sLDM!Fe?V|i55`}0w`DhBM?H%2dLm)EFzL^F)5L~38wlU$nX+tJ*t z@?2dOVw!A^v(b6Jw(Ic@-uo=)d%78hO;(eeX(s=7yln9=nb>1W?6l3cmzHHr8%h*- zDo1D($hQMQlwedi0VIE1_$Y=bnR(>MGg)P8Pj#c0o0w1`+%T@zD=tUFC=GRv&+XE6 zIYG^!0fS_-bSDT6Nmm&gwn!+ns0i;EJvAJOLh$J!jx{m(ku27ssh3&8NlW%-2Rye! zUW6gpsUQ&{b(lJw0Q>LM)suOp_O|PqKzJu6bm#c5R9#`A^mioq- zP%(D?Es$csphPUnKrv7dYuY{u@wwB%DbBor$b0jw0Ga?2UEOT`baced>V96Q18tZ_ zE-Mqb`SGdb-j7GO&-xh}EgO{9sX&GJ|C#yIv39g`JjWvr6F8zONy4(?MYwAG1nQ*V`qp+g$v#tms73 z(nSjaGCE(!hl%Zdda5(&W}0jp-BLt!V_rNX4PS@1jq%0QptkjEi>mqzaY?!Tt%s*0 z?RWtLXG|a)OYiHGY&?#w*ZE94?JV?a8eCf9bn^pnV_K}J82DlG$(cX7?_U9$MJFwejLtC7az?t^wt5|-XHI>5>ceZ?wmmLVF|#I(G%2eeC{1Py z#c)J?L9n@XikpyOLL37~kgcx1o@4^P7z;b2qlqAj@)+!^t;%MGmns3Hn9f@3t+OJm zsJGR+Y`D)awCvd3Y?FFVd~}Z`Ht&9HOTF9Tupa1ldP`9aP?}1i3#V-w9Jb!71ui5u&pYLgFB)Fwuh|xK{E{jg& zd6YIg-Ok3AR$X}d#+6~~*27XAJc%+qzm@wpv+KV zr}QR0DX>7OMGO|BDj_q`h(ziQ6fUyRR*N)Z$yI3OF)_Xjw5v zV`yfWKirXocq}fUw8f@JQw-k;o|=?3)ntUUkBFQmlBcENYEKfl`xgrvx)bI&ONlnlQ4g#sxwq|@*20L4Nwv6Dk#c9H2fr;}nj-k22 z64kYp73kAi}aqB=aPGha}kEp%X<_T;i2UxE3Z`U`W)5Sl+sTk4|HNiKrj@^ zTP?J56?qE1(IZj5q0kY)syOR~l*GtwtSMJLIF0p8HKylRi~1H5YFac<{(k`m0Fiid UDDivFg8%>k07*qoM6N<$f{vJKyZ`_I literal 0 HcmV?d00001 diff --git a/widgets/login_info/skins/xe_solid_enterprise_login/css/style.css b/widgets/login_info/skins/xe_solid_enterprise_login/css/style.css new file mode 100644 index 000000000..c8312051f --- /dev/null +++ b/widgets/login_info/skins/xe_solid_enterprise_login/css/style.css @@ -0,0 +1,54 @@ +@charset "utf-8"; +/* CSS Document */ + +#login {border:none;margin:0;padding:0;font-family:Arial,Helvetica,sans-serif;} +#login legend {display:none;font-size:0;height:0;overflow:hidden;width:0;} +#sign_box {position:absolute;right:0;top:40px;z-index:100;} +#sign_box div.txt {display:inline-block;padding-right:27px;position:absolute;text-align:right;top:0;right:0;z-index:140;cursor:pointer;} +#sign_box div.txt span.label {display:inline-block;padding-left:10px;white-space:nowrap;} +#sign_box .sign_state1 {color:#d3d3d3;height:31px;background:url(../images/signin_key_right_off.gif) no-repeat top right;} +#sign_box .sign_state2 {color:#d3d3d3;height:30px;background:url(../images/signin_key_right_on.gif) no-repeat top right;} + +#sign_box .sign_state1 span.label {color:#d3d3d3;padding-top:8px;height:23px;background:url(../images/signin_key_left_off.gif) no-repeat top left;} +#sign_box .sign_state2 span.label {color:#d3d3d3;padding-top:8px;height:22px;background:url(../images/signin_key_left_on.gif) no-repeat top left;} + + +#sign_box .signin_window {display:none;width:219px;position:absolute;right:0px;top:29px;z-index:120;} +.signin_window .head {line-height:0;font-size:0;display:block;float:left;width:219px;height:1px;background:url(../images/signin_bg_tt.gif) no-repeat top left;} +.signin_window .tail {display:block;line-height:0;font-size:0;float:left;width:219px;height:3px;} + +.signin_window div.body {width:219px;padding-top:11px;float:left;background:url(../images/signin_body_bg.gif) repeat-y top left;} +.signin_window .mb_input_box {width:195px;height:76px;margin:0 auto;background:url(../images/signin_win_hr.gif) no-repeat bottom left;} +.signin_window .m_left {width:144px;float:left;} +.signin_window .m_right {width:51px;float:left;} +.signin_window .input_text {width:133px;height:21px;padding:0 2px ;margin-bottom:6px;float:left;background:url(../images/signin_input.gif) no-repeat scroll top left;} +.signin_window .input_text input {width:132px;height:17px;margin:0;padding:0;background:none;color:#D3D3D3;font-size:12px;} +.signin_window .input_text {position:relative;} +.signin_window .input_text img {position:absolute;top:4px;left:4px;} +.signin_window .input_text input {position:absolute;width:115px;outline:none;top:2px;left:15px;} +.sign_check {margin:0;padding:0;} +.signin_window input {border:none;margin:0;padding:0;} +.signin_window .btnbar {width:195px;height:23px; padding-top:7px;margin:0 auto;} +.signin_window .btnbar a.in {display:block;margin-right:14px;} +.signin_window .m_left label {color:#ebf8ff;font-size:12px;} +.signin_window .m_left label input {margin-right:6px;vertical-align: middle;} +/* 196px; signin_input.gif */ +#sign_box .mbInfo_window {display:none;width:172px;position:absolute;right:0px;top:29px;z-index:50;} +.mbInfo_window .head {line-height:0;font-size:0;display:block;float:left;width:172px;height:1px;background:url(../images/minfo_bg_tt.gif) no-repeat top left;} +.mbInfo_window div.body {width:172px;padding-top:11px;float:left;background:url(../images/minfo_body_bg.gif) repeat-y top left;} +.mbInfo_window div.body ul {width:143px;margin:0 auto;padding-bottom:4px;background:url(../images/signin_win_hr.gif) no-repeat bottom left;} +.mbInfo_window li {height:23px;padding-left:19px;} +.mbInfo_window li a {text-decoration:none;color:#929292;} +.mbInfo_window div.body .btnbar {width:143px;margin:0 auto;padding:10px 0 8px 0;} +.mbInfo_window .btnbar p {width:75px;margin:0 7px 0 0;float:left;font-size:11px;color:#7e7e7e; font-family:Arial, Helvetica, sans-serif;} +.mbInfo_window .btnbar a {float:right;} +.icon_img {width:16px; height:16px;} +.mbInfo_window .tail {width:172px;height:3px;float:left;} + +.mbInfo_window li.i1 {background:url(../images/icon_write.gif) no-repeat 1px 0;} +.mbInfo_window li.i2 {background:url(../images/icon_add.gif) no-repeat top left;} +.mbInfo_window li.i3 {background:url(../images/icon_check.gif) no-repeat top left;} +.mbInfo_window li.i4 {background:url(../images/icon_article.gif) no-repeat top left;} +.mbInfo_window li.i5 {background:url(../images/icon_friends.gif) no-repeat top left;} +.mbInfo_window li.i6 {background:url(../images/icon_message.gif) no-repeat top left;} +.mbInfo_window li.i7 {background:url(../images/icon_tool.gif) no-repeat top left;} \ No newline at end of file diff --git a/widgets/login_info/skins/xe_solid_enterprise_login/filter/login.xml b/widgets/login_info/skins/xe_solid_enterprise_login/filter/login.xml new file mode 100644 index 000000000..9ef770464 --- /dev/null +++ b/widgets/login_info/skins/xe_solid_enterprise_login/filter/login.xml @@ -0,0 +1,11 @@ + +
                                                          + + + + + + + + +
                                                          diff --git a/widgets/login_info/skins/xe_solid_enterprise_login/filter/logout.xml b/widgets/login_info/skins/xe_solid_enterprise_login/filter/logout.xml new file mode 100644 index 000000000..8005776d3 --- /dev/null +++ b/widgets/login_info/skins/xe_solid_enterprise_login/filter/logout.xml @@ -0,0 +1,7 @@ + +
                                                          + + + + + diff --git a/widgets/login_info/skins/xe_solid_enterprise_login/filter/openid_login.xml b/widgets/login_info/skins/xe_solid_enterprise_login/filter/openid_login.xml new file mode 100644 index 000000000..bf0ce028c --- /dev/null +++ b/widgets/login_info/skins/xe_solid_enterprise_login/filter/openid_login.xml @@ -0,0 +1,10 @@ + + + + + + + + + +
                                                          diff --git a/widgets/login_info/skins/xe_solid_enterprise_login/images/Thumbs.db b/widgets/login_info/skins/xe_solid_enterprise_login/images/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..c21783bf6b273c0b59125528b47ae8e700fd8e55 GIT binary patch literal 45568 zcmeI52_Tir+rVG@zAvGqP$@~-L#bQYN=l0&lr=lqvmB8Y*%Kv8g(OM#BD<)FP=xG+ zkey>Y=X>7bw%-43x!-sH`b_s{&OK*lo|*TZ=b7c5cjkFHL-X}Sjuzw#w;3TqaCi!Y z^po!i;4{j5M~@(c@PP!t;qmwnUm^&6TyXQ~3d}%WDdFZZ0mJ}$Khb+m29N_302ROp zPy;joEkFlA6+jpOW`Gk|1+W0Dz#@PRUi?g z39JUz0Q|sOU>zU|2m;Pl|d0;P~04M@Gfn9(SpbVgOeh>I6v!C~YzaKaN90XJWG|YdyQ$ft(pEcZz9f%qD zClCk7`S&|ks4;V8MC;3ca;|Io$=({45)eV4Ej}MYqWAAt95F&jFee}Nzc;O2Xaxs{ z)}3E*sC)uQ04>w^%13qJ1R4PxT5o^F{Y?2$J-UY)Z*XYd(T`|${!0H*`+(YjztVry zHlX$cwF7^r|EQfn_2OIlkJ<&)2B7+n+7i?Te5(IwJk&m*HsG)HAGHmr4M4-r=|5^m zP#b{iKWZCL8}Oz6qv1c*f7C{xHsD+OkJ=K{2B7+n#zSquxAgxIe18~F1Jr>dfChlZ z(E|S{a177}bO2pI56}k;fa8E6U<9CXOu#n<%m8!10RZ0sB>R<7b(y+%Y-Ok8545KmoC=t$n>MrwbQ3c^=8+GokiB6>N`A=#WgdjJPn)3+CrCJ$ z@qE-io_ET??GMAjSi?nAEZ1MT>PATLS)O{G_{d`O>Vavs%{R`x$ULO6eVwV-=|v0y zvenBF#iXPF$-cz|GsK@DBMK2AL&uq_Ib1hWYrtXxzGHcUTXGc?W<5gjX$BCtsthUXT)nSq>iA8ov#X5JpTN$0MgRweZNb z>g#yqlps!2y?4Yp{K6>%9Ag6{rsj(#26g+hNJi>3|#ERrm+e{;P4ZM;8rlrye6 z!DL#?xP{;J#Grog*88Sz6fZ=U?-onm=Ec3);toCU*-%WT3-Fyeb!R(kaf-^mka z@yL#Ns0~njh^i19Ehs{e9oBnE&ms@Sca6 z$srPbG4|R++|G%ix+zA55t<6Oo9gN!rg2Jm#5trg>$H4zUymsn&QtBKfL!!G6UvXj zs^Af$x0vAx@tM(sE~T4RqiCGkH>J7{k3>Al>Ax+Lnkq9feHAwur~m5Y-mzodJ6^G1 zQf)qb7x`zn$b;FXoA{>IkKE{`%&E(mm92s?HkwTw2MKS6Aen>-V|T%%%3Q=W?f)3^ zKteK|;``r;WXExv-{2AZ7b1J*2|f9)eF@!{S~{nHQ7{Oa5B*>0mM`evZ=!z}58@HO z`2HDN%nbQUwXZ8HVZ5Qt5K9ssx%&i^&9SrCv;cSUE~Hj4(Z|%>q(B8 zqu8c_g52=6So4IfFlHRP5;GH2-8!^Uq=avoA^UQ_+sVXFcKOM(wbR-s_`0y+D(cAc zmCtIjr@mZw_n_gOcw*Vg`ez%~8oJy)BvDr=+8S!jv+1o26RvhMb6VBi<&{S>Un&(U zGY8rF@4Ts|keOMu(u7)9Tj-?o!5qLLBkH>x7oR6%8Zx`ufIv=Xnbs@b)Em=a~A|rWa)M+~+8| z64%Wk7EMxcXSjrE8*9;tgN)nOuf3l8n39>>ORuNay1$O6fEDJ3tsOa~3i-|Bif`8C zZ&NE1qd&(>@GwdI=z6l77RK$q^*V(iD`N)63m6PDx?iSlG;eo&;ki2U3@^nH_k?Gr z>x%QM0u)weDT;K-2F9t{b=^pJF;9}_cxlNL$01=;^73h&Aa6$U7g{u@Km7AXf9MzV z=l9T`$+%|K+<3A_jr7SG_fyi+65S-44>g|>XXM#;%HIQ7pPM(m;lO60X^!X8GA(_! z64p}&@&b7w?2&Q}OX8NvHlz?zoXow(Rm$E9BUb0k)$!(>fwn_s18Q5>3Gp1e-*Lh=R-(Nvlvc^* z{yi*=cO~y)9yHjdkJgxF%e5}8A{b@a`KqL6QDfP7Kc)(|4)WbbZA4mj5b*t)HF$*zoJ}|6F(Rz4Bu~{@|?qQ}Edha0gBU=sJTl;GYG~ z0p|fv-~!+UcmqCwFW?9G0|CHAAP~3&1OdUoW#9@B0-))Jf*%Hi0};SA;5u*vhy0}p@A7zBoZVPFIp1<-io;A4Ra zU=o-Drhyp%2jBs8;m5-Ig}+>x@ptPNrpm|cv2-n5ZaK8p-okQ~eQKk9k&X>JTC^nJ zszh1|>ufqn>#BNd#-{}5d=yqI7~@zjTyN;BFd;p;#T}1uve@;7j}X}P+G-8=kj+eK z4McwYcw5V4Jo1a5Z%_KTM;VRnJKSU#WM`Ya`tb4)5?zavZsd8lvTOV0>Nj-}4fnK; zPcvl}EW#rUqa|T_S;*PSowc4u0zpOn7mWK$8{8+)I@EL%($)eb}j z8|%m+Awu$H9IZAowdpNInL6?6#vGz=9?T>f z(|C83CB$oKzD|9(?|hrbsvz3{iRtG{ZVR1RW=2MMYDsp?l(Erz`?vMV_XgPWsG?KWe@D{jM`|=JRBhti4u?6`s=9oK||_!m%>0`IQJi-MI}$ zF>>MMhs2W}tvEIF_O)#FAn`%Uj>8<={I1=4!ozfA#@|GG=O9LLF!fE$%|kn4?0s>J z+fyo1dg2`PLQR)#bgUI9klJCUA0TDzu8Zu&WNjHzN;H7mqgfIlIWs%24nO51n=>1$-#7A>BaHKEsneJ3^=9z(R)biYW>E@ z4EM70k(XLM#*rmLmvh;U2CclLsSw_`bPD&LsJbYcI7*b1r3BPJ1vT^#Y3gnf%7*RvbPW!W*!WzC%ON zjeJucF~`+D&C#K=(@eodlI0hs1>%lpJem%kH1m7H;w3~vN?f;jPcA9Xb4JU$>}R+_ zc=8c0gPp>7BS&ZA8huk8tH;My1W!XnDz2YC{x`oHU&P+-Ea0LOZP=&uC~Gu6u7oN%q z!-uQQd0&X`EFNC}=;(t0QI)*{*uv#-SG-L!x8#L{8K>7$BnEzFXUBD-SWtUlPl zpiO)sHC^@y$;P~H-a#L4LyS4^Bd>e>EzvwIT+B|l*=)eY`J2_BRu|Ew{6;3u-L_I%$2#-hMA=n zJhuExeA&DnY`DVKn@4tau&IzrhW<%gEYqHV!BH;yJUjhLveKZ$_*VBIF1`Z+^vun! zTZr6UsU%H38b$-{#5uCUFO7L!km&EQHcp~Y+3&ID!hO@G<=Y=0%WQW}Ic$@X;Zqwg z7}UBmC|Q1&QdW%0^&3R&>!@z=zc5>JVvXC|4At}28XQs$+M76(me%&^`pENMd8Z>> zvi`X3x=L7js8`D)o3n-!rch0KtYyw+h@X>IzG*b+6KxLbo)WRQ+cZNKM~9dW?i%Y$ zTInhFx};q~%8lrOWw@=YuJPo-_#1{NH#NqZ6_u-|iHo(iuB_|g3?{QcLP^YohaR7m z5w)ywp*-ENOFJy`f}_bF!YKx)LMjHuvJ4zsn#eCWzIyW@wjKiU~R%-YwqT^^dCKMTahhtljbE58Ggbn)NM3G5c720#;R0b^INs zzZqu5_^uJ*SjsNVOhrs#W%7N$`zOkiIqoS9Ov*uHA^~>i%oxfhw)yT^k5Ox0_2S)K zg8Ev#wvlL>;x6EV@2EvMLtRrkd>9jdlAUhK%$nj9i!%@A3# z*sM;H=nT=RQ&s8GH5;t^oUH^(dv(JNgygYAR!jjF5^s+aeKN=OpEO{u{&y_Y|AqDY zfAwO*|IYe-Gymoi8J>a)C5)MOY(b}JO32B_!-HA5f$hbo^)$)b&6Zr$w7Xqs9j`L< zI6cJlroB_CX+!F{GARR==ZBqky-0awa&&5Gg!LGoPI`DNp{}=l5drmvA~Mb`ouXw8 z!dgd4tfU++mcCKoLd>*J>?Y$>`bH};SO3=%%@6xehx~UvKN0%%`9}guFi4$4xe#{qtbCDQm;e49D*7Lg{|v&enUyd4>+%WM zAU*aUkY5L3WoP9tjK6+*{8frQj7Ny4f*(cD3QX_3^(5|fqx{Ms=1Qf=+Ok`Pd;)7@ z*R;oyFVoHWP{XG|KTyjDYmcYsInKsGjgLbgP-1<2=8=s$~{;Nd=p z)-0IeLsS2rwjg((9Sk?F?b$*9MV$#Rxi zCoIA;O({(a4%FnwGby}yXb^q)b=@_sw+q;>?~ zE&bTyKW?6^F)9C+xqVd`t#HJGv(Wo5M@va}zdTqeAGs7im>Wi??ucO)XYVdf?b|)me;0$m9Ib&OSD!0)$q} z*hcd~P_`)6vb7(v*HTFuWUolYrj%@1xB1D5Z2iZVwm6@EeyV`zJ|RIHzj{W(Bi}RO zq*$3&PI2WL>E|Mue!W4$XD-#PRO#d+CA(=)iFA=TrbM5k~Em%a3CJ!1#j>QfCCdcl^}_VJ&CJAL73* z|Iht}zE}Pj$lo$6U*gy06EHw}Og~V5*aG3t@$bf8m;ZiWCC(p^PY?1rXUjilfA!{x z{bl$sn?G5wzdvn%W2d;CHb8&E{Iqy*_^JV1a9oe7u%erWq61HWC>d4ztz((jx?lTi zDdK9IsMHH1l33z{Jen`BOZ67x-`IL4pINo4Vv8_aZpWF1rw2~HE0;(R7zjSCpE=MN zW*JpiSZCtLv!xn4RBAtA+lICDa@5Wwok@DQd|+|QyZCE8AzpO}UU$X?Zn`rIF*3YV zq*%ezB^wN zSDlz+cw|C6OB|Q^8ukEqlTe=E$u*=ht&T^IIp)kP8QH5TD?U@_8`I_UFnMN*rDyWX z)!!e-4dwpbh8%x_};_4;TQ)0YktD zK*O7WZwiJM;T@u@Es#NODLzOeZ8~lnju@(LxBeul(+^rcCsP5;j|LUbr+ij z-KPy(!gvbD$I`g6ANYt|P|y<45g;pz;})ylQn4X-Z$Nv1#Tw5Z!pVB&`zh5aEyN+t zK4Ndj21Dbc_;O=2yxiF3JFJS;d|S+F{pbPw8_2<279DO$cs%E-u$)7YeZHdi|lqZzk5MX$u}X`OA8lBwy#a(wMv z|7E^B|Dj*#zx*!mKmW(~&tQRXb958AwKCaZdraY&rTWdtSR*F&h~!*tD%z!6;)m($ z?bdjaAcDJG2{LX3Pf*Y&-?5*(*ot)izBBsHH-#|zY%;gPYPY0w)OF1&Yh`or)q^*?^J{h?mapWj7)CYkcn)i&WS z>O~m_*;dyDuIH|=Uqh45b6jdsrSjHkjm_hYcAo1}oMq&*Ds6U38HXvhk{#|lOrX9u zB`h9~C~cA(7?ExlEZ@9naI`G4<(XJ(=kBVGu=wY~fqtyHMZ3A`e3|VhJ9iJfiMBM2 zF&x~T_KqcAUa?(=N3dTjZAL9ZP_#)P!5k}IUox0>b~r)2f8$2ysk#~Q#_Fc>f$W%% zN;0P`-|*-3XZ1YMpD){=^}o0SF8clxbT{!!;o6}7H!jgvUvWaeQxvWj>NfmC^0^?b z@0Gs>YJ8MMIlkw)aH$xm9}wFS{!EIPCJTA*xKxUSp(5ZLHokGG$IF zLblUF?a>XJgB#Lb3nPcedU^Ylukx@HN5mKCDl_a3oryg16pzqUP7HHVoNpDpT^*}j ztK}a(csO(H;OEoTbM|xHJh7j2=nl3E`wzpu%JYByfmDlXZ)8gk7qOw*-LsMQNAG6c zP~TKDmL0}BUk&N7Lo0t^?Q2myS_>YlQE2N4X44XwmAzcrd0HbA2Gb(DC18d z@18R3eJd(}dChI_(qgXwg@h;^n@bIb%39`3I75~BLzSah$rZhQofoDycc;nwaVNEJ z-DaJUZ3ln%<0d3*?;BB{>MW5GjI3reg^AuWJsquv4@;?wi@p& zU(u14Ikhy>D8kTfaC7%L9}DGWOjYs9Z3(pY{B6Dks~^g>)Jr|z{L;!%;AVu;nRjnS zi`IAKoMs9jDB|}RSoDaC3R}`LiPb7h^f$;}d|+o>T1czIRcx`%o|8)kRj^g9S{^Q3 z_KX;6d$W~d`G$Qfed_wIKk(G+Uit10MSu87)hrNnrTtrr<~GS z)ngIqolU(%^);A?vd%fh`Oy9ObN$ZBdDH$Ztl#-f*1t``{@}2I(W7G5X>s20rIi{@ zN@?29^cZ+A2VNXEeiKozHRdo->^))}m$~y9|Mr)r^5N_>56%ndyt)>dl(zm6n+G|q z#^nIk%qAL_3K#lBtX`B_J=RUa#y;howwIED#om?luHp>rkEx|pOYul5#%n~$pxG>j zSCiXRPAenZ)j33>^MDUy?TNCk>ka2LieC}rCMeS>p5?t=6LjJDsQHK{rfMLO#rQ#y z59i^mjtaq-6I@@Y&!75(t|y)k>qi&%pPV}v<3s;Vhl>gu&8AwCrF;F!@r^nCC*}c!Z#8n(yyK_h%E@>&Qm5 ztvb!9w6bVBuHsyuu`bV<$9+5g+*aUk?%>Ct=lcKoa6cF9@51>#-#nP;f9L(b;T+!} z);g^s8P>Ym`bUPQtk>5RQP>!>35Dj^K!&c5`4@10` zw_YKNqbYEsBlYC_-dA2fR(|+2SN~(?N&R2gzyI_8$2@L-un|XK|Nh47ctnd4(rX08qJ^;6DVifNUTK$OZC%e4qd*1ReoJ zKr!$bcmg~HN&qySXW*9s<-l{G0;mM4fEU0^pc<$FUIDcL8m}Jw*FXc%2s8oBKnu_c zv;plv2k-{y1iFB3;4RPt^a6drI{-~{0Q^B<2p9%NfKgx!7zePx1TYCq0n@+?fJ1@! z2-LYBeg3{+zkVD0HIQ?mX=wlZ)v7yvXV{GWZg?VmU%(%amBS+|cIIo1v83UViVI(M zQRnQ})W2lEezg8BjQ>BczY_n#`12IlAF|o;|Hgkv{tD;|f=T~{{Qt|V9SD|-c&VHinVdlg5oo33qQGW5~HeB z7oWH(YzVupzV!Z&PnUgVk>~Vp3)%e8zlHO!KkvWHX=JvkHot7b;!!tC(K zrgrGi#>v-vY9)JajDEe=tNhE@!fF_UrGd_&d!Maq(badT!3;MlPrdb>3wAJ~wm5oK zt;dqecdWAJeAqQ(r_kp@0g{WNT!EhdR@wxP%+~+YWJt!B@(;=j~6E{ zy+6GsXPQ@BYq;MWdg$rcmvK{;JoRakb$NK?MnIgi-^qQQ&iU{^6eKm%Q}xi>7r=?+ z4ESka%CmB2hML;8q%IB2(OVk$0CF#mW28!$7>B_@w)(Uore)a!7z8+CraE$p+>PMS z@28vi;1b-6_$0dAH1DE6g;&l5!r9+@yV2a9hCzf|56-y{kMsw@gL`GH{JNaZ#wOf^ z`CyE5;7Jt#y(Vy6#%Z_CkKtrmmSy}YHMlpj(l^Oh5xumAjeLuQ_>eWB1h9CCg_bOu zdB4{NSs1`m?}gL9iI}zF5#%E_nACj#<>yP!-;V|6`u|$c|B!0yzyITRm4|@{O7G~u5uo(o) zfnb8kbc$NZzKY?7c2w-)rZw*yFA;}yt>H$ksjh0Y4dF6io&YPUKlf$Dn+8m|1ExO` z+8<`;(D$}hNB9}o*6<-{1!R3CdpI(z7aR^N{5{AwPn6FL%BY|Bhl zwj#+ww^rSJ+uvusNmE@OSKRD3>Ey{FihE?3ex04HY|W8&J8EGyM+G|;{|+A2jPhq4 z5+fS~u?L^s4YXNoegE7Y`L=gVp-az>vWR=8P^oVnO8({DWh%mXS2ihU*&bu^st*cbf7WmuUc?v(>cJx; z94}-BR^yQ(U+hjBJTggR#D!(XBW-Hov=svVqf{3zJf7~6BByzMFJMa`>Hht^CkX7e z$afOgMAjb0X7}W)N_K=iV|6#Hr>5sSr0Dfd?<|}3u49+oy}~n(B#=B)=3TnBMq%-& z`h&nFmpcO=d-onlA|K<@&!Sv3G%2!l=3h6tZ#__Y5oFv>IYFox1Jm}(Y za`fKIJIy|o`~|#1>V>q0A)7KiJFhLTNPHDQ#+IOuRa)9~c5+Yg^e8<0PEb;a_s}VF z5{}&w)%1AXfoI+?Wb4{xg<2@cPPpf-d3uKc*Jqnn7xaK8MZ3Ic$6B5}iTA42=+BWN zLp#aXINd^3!%dh?Sa?LGciyVkkTW=@-6wDFBzxS6o@;}NPrOg_a;Oug0&$H?5#Q|~S4T>rIfp7dY27VPKmGJgL5Xg?!* zOME9f@rW;_Owv1<&Ip_|e{k)7oa#7BX=aG#nhf{eG>!u)-8P)p0}NN43-cDaYDY4P zaIbUplW$`-r>Qq{HkH>^)>EhS*oI~>=T3(7=I8IZdg9>o^C{J5zkJVT zw!8F|H>dwqKdJu&ux^JCAOeU15`YvS1IPgifD)hrr~w*)7C_gJ(Sy$bFak^fGr$6{ z0*e4PfE_@?E(U)IzzHk`xPWEAa)2A)0eFEGz)D~hzz3`b)&Ts#T0j6;2M7Y|fenBV zAPk5AqJS764oCo~>;?DNSAde5nu?N&iiVbvo`#lzmWqm=m7al#nT3Ugnr;yrD>EA- zGYd1EUb~Heh?tm!n1q6ago2rdist**UCo93uz%dr1^fTI*ng}bjvdzAtQGQf1KaOWs<9xS-Bcl+!5_xdZ_FC&03i&H}1$TZ?COaIR4lwtdhCTPWR&d z_V&)unv1=WdRv}FFgI)wu%202XPx0w`b6Ynp@M9PQl?wyEdmCs*KTrb2|C#QnNB3p zz8|DNq||dCFqJzAK0I1uB97C)D z6T}=b`0&*a{iXkj^>-W~`wXo2_@~^b*7cuC^GDM875V?y_J3jh`0ulRC1u~O8?H-M zAHU&B2~S-9WLw?WuetnXb*4wi5cJ*Iqq9hZ57X1o!MiruZCFY`b9ij`GQ-9KhFx@74i^h&~zv*#f*bE3x0eF0*hnzS$qkI|9)EhNW~N? z`}6qP5MKA2az!BC`{lIXl#Aw43*=dUCJT-8{t?8iEJH-+eSWkMJLCkE2o10IMgD{! z4k<8qZ9c{^g=>Lc8+}OQ(<_2Xd2i@ubM`UDF_2;nadg1)>U|bxJ;WjZM2a?qL$CU$ zSL0I|Xs#&!LwIw<22%Jmh9rbW&x}K6%dQO}Oy1`My(?%rEZ)aKKkI%Klj^%-TEKPu zROVWUg|?M*GC#c%x?f0H1HsVq?7kKD^OCHCK(uJcudXjzTg;)RewqjL%A#i_e4VZi zavbi0&KKd)yN8}D_jT&}@9PL!KXl=~d?^DxkKpS#1`y{MT-oEFg-1((p55?up3oeb zK=@BnM{|UpbntcRrV!c+{vCtb{&js~{);%M2BNzBsSGqnENJ+zG{X$8D5@1-hDOi- z`#QAs`#WIrS!nbQpeF@>o&Pzl`#g0q2+D?rpUsQupIY|8`k;D!48B99SU_1m^k7hp zVE>y~pVuQ)4#!`{_$#}E+N;HAtp8|tzRn+d7nh*%W=r*{W`8Ufn!}G}LgS!kOnf`e zN1grj-k_yI_l5j+oWHW-sC9r{q5dY;oE866-X9QY*>}f8?Y}e&VxoqY)O| I|HmuvKkt45-2eap literal 0 HcmV?d00001 diff --git a/widgets/login_info/skins/xe_solid_enterprise_login/images/btn_signin.gif b/widgets/login_info/skins/xe_solid_enterprise_login/images/btn_signin.gif new file mode 100644 index 0000000000000000000000000000000000000000..046f4b4477b9fbdca0697b0083c4672d17f36295 GIT binary patch literal 2115 zcmaJ>X;@Qd77hi4VW~LM7AvinNCi?z?#)6-1QfCeYE+PM*BX)wiIBx4K%~|YWK$dk z7qlZFn=R?MAX2I#%h*amQ1%@qAqW9v-`C6yBi0{2-se8|e#`rwbKdWq^KJHGI#bvL z)VHX56so1AWps3OY;0_Ldb+Brs=mH{ety2TwsvS}sJgnkt*vctZfU9~{6Jx}pd3 zi_id{>x$k(Vu36%4d(GZ!zA#ouLqKT)vE6^%ste+dGy4?ln>lfE-9lwub}VL2iJ zPRDBoj$_A~8VQ zMFi|1LWgwXKSabKVc>LS_Fma7Eg`k68@_8IWb&>J zVIh(=3DRVG+J*VK*_r97$%*l?(UIYy!GZoaeZ4)J?ylFJ>JF8%{ng91)|Td`#)kU3 z+M4RB$`{Wo%Ab{${#o+$kKdpCx45XV;Bo$=hYxH5EaymmG5%H>NJ6XGwN|JS*=vu9#sqN5^DM}(jH=gA*Vd>?jP9vTuX zlS+<>MM6PP;88v=z#ryv{MbjnJACNif&KgT?%Dkh-(5c5J9lhnZQHuV%X2f6L8p1R zZ`$bQ>au}KaV9&Fhy*;+;8;h8Z!z|Ew(GyKS%bKQ z=bZ^D?++_d-d5GuoQV7~T<~0&-#+xwmO8JRaza6}@(?AGl&ceC&1+`mOo5cD5D%70u?SXBHl zk7$D{`Lnd_S$W0t5*r1EP+M2u(Ad=6Qj1aOVU(&4b?57@Zl#{W_LKgB!J*-i(XoD8 zg}vU)?A-i<7Ny_2HNlv9_O#I|%)!#^wBJvI#^`IF_tKxnSrU#WStdjqSpu}PR$e)o zWtRX(=EbV?o8?zQ&a))1`!^$f?QAr4XEFkIXj7a+jKA9A`=m16!#nelc^W@5WqTSm zdCRXyeXVvY4ttV1A{tFxi%y!EG}xZcaeEqO7C3RMWu*dBn%pN9Mx}%v>#UC>-#t|H z!)yzSk(RA`;12CEc6>E6o1g4xL-b@_KItgo0Zn;PwFuPiFkYNyKLjSW#2JY~4i z`YdIH>F1^H7*sZ(inQ3xQ$<<&+gYO&+1YtdVt{D7j#!&SUPp{WW{!ucL!PE14lJ=# zpL4hqf7WnWXO{ZB%Y;UKVN;jJ9Roc$(wX47UeS4Rn-iaFs<03jU-sS2e|=@IzvA`f zWmV=8CMzQCyRLB)`CUKqqI*1y*8CA)d|g~(-<>3D;CEk#f~vwz4aR!9Z=70=(WFLB z*wYMG^OWvp=bU;q8SzX^Pv+Nk3GScaA8ablObVge>tRcelvu1bXB+ru{q&20;TlhC Jx;bjY{{SR0l}!Ku literal 0 HcmV?d00001 diff --git a/widgets/login_info/skins/xe_solid_enterprise_login/images/btn_signout.gif b/widgets/login_info/skins/xe_solid_enterprise_login/images/btn_signout.gif new file mode 100644 index 0000000000000000000000000000000000000000..96e5e72dd3b7a40afa1acf34e38d9add5a52ad55 GIT binary patch literal 1820 zcmaJ>X;>3i6b%Z3g1cCeVuxr|Aekk51_H!P!Wx7mfFKkn$v^@mlO_X1x+&VKxYw#^ zMbN6HvM*W@H&E+Bt+rM`ac{M1i&*!i)=pAUezeXv-^^Rix%ZxX?|TtZ3XvE`8Dkh{ z7>v-+P!vTu98PU*ZFO~ZLqkJgU|?foV_jWceSLjRO-)o(RD68AN~Nl*s)~+|j*X3t zh=>RZ3YtEBI)-5h2?=p=ajB`PVPRnz85wD5X-P>*>FMdg!ND*Li^XCb$2A&FOiWB< zWF!cJiHV8H$;oQ9S|AXFgoN;TJdsEwl}d#|VR(2r1VJnoOQBFGl}ZFb^gkrbZozdq1O;e`ETdV%>}}c41dMtKGnuc1l@=LcFh&+y z33XwdMpu}l6YH5_p+JZowVNy^g2Dm2Dc5X6?Gh%gC$$7hj~&Yp6L3PP90^nE*Z>?p zWu%n=_#n*I!2$#j@IZtIi+N%ez=07MLO2jCWFs)j7oso%ynL9nH>*AqRbh&kzUY~R zX`mbdW(ET$Kx?I=GNcCpK(f)SCkt$ja?|1*atW(3pU^9;qzQ0l9yRt8k(Wm+ zz~pkCTqsu1;xRdlAYv&WmWdR6t{mnG`7oFHlBn;OIVVxf6UulZ4wuK3Nu9)L3Pg$_ zG@XyZasihK(P2Q2HtW}ReM@vNJBF_g5j}Zz3<)z`H7k9{TweVB{I6$EpFDo_@WK6i zcmKT8d%Ne4-*4T#@!R!lzy5Od%H>NJFP!f_cebmu+rO#!dfV15Uv1u0UbeAx!Zz0X5+?;HqAuE&6 z>$Lc+jQ7&hW~QdhNKQ)Bs8tE^)8mw}G0{KFG~=-~bl}!~cn^ z^A2MmidnH8p~R}+P%bm&H6Q^8_U*~ zl$UN;Gt|?I16G3WRn@ii4UKh`HBCFJyemd9_A%V{AK2G=sP*uX!)?b8ojBoks?Don zctA(M;7+;%9fQwbx_ItF_top?J4aV|y7csT-0`@5*X90$-g~znKfV9(`BN8G`S|+H z<ylbJBab%gVq{u6(VN%4(DavB3dE|h=@qyay z@qjHecD*3$>Y;UwlTR)$;}mpg{0DfuxkRoUH6t1@s<$f3LcL*rz?rQ{wc5Se4_pF$ zxoyRMG5M^y4TjU({aR+Vy81#_kC(=D&P{ix?%lf3{z&RNWJI>dgxFnmR}L;5J!RO+ zB3BPDm>IJ%wz=V2dkMSyGSGTpf!AUesrkkfL)RmK$x)craR%K&`%UgE#bSuVn L-N*$z7{UJlks6%U literal 0 HcmV?d00001 diff --git a/widgets/login_info/skins/xe_solid_enterprise_login/images/bullet_input_id.gif b/widgets/login_info/skins/xe_solid_enterprise_login/images/bullet_input_id.gif new file mode 100644 index 0000000000000000000000000000000000000000..8cd965ce54f1a01a7e31ac1d20f5bb8f77c4f40c GIT binary patch literal 1294 zcmaJ>cYM@T98UoS0T*sukJLf6m%MkE>osYQ(n~JT;$giOTMB2JOI~~NnqiXTu63Z+ zJrMV{intfg?=PRTX1AFfc$-)U?f$+7eAbQapwHYwHTOqGquN(zshUqx7bgt7)KX zQMxspfC*c~8GUx2gPZ&2wy1qsmDlLH8KAZx6b#$Io&pL+kLe19D6ME#8Vh9XFS9f# zLcDC0uJ<>9?^CoK48jZysIUrwDvm)Ml87*z7i{u7@c7l!)Vt_;w{1d zr+v4j*T!rTyH?IoF@cwla5cIkA2_5zNGMJglPt*C0h{0%bH^ z6JoKrD8)mf#Bm{n;;_1^zFLfgB$4Bx6z5=x+hDq$Vyd{r)wghCqjCk&!HQ=&Etb_& zDu$+vM19m z)PLd$$1gta*kg|F>n-FLF&asnpQeHjz}$B&_2Jd_3(Ku&B?=> z4xO7gWKLtl>{)VL5@Yo<>t;l2YXrVJQWfSxLDJw%pz`2@DyAQJ!2bJ{)6>Ad`|Q2f zo>TYOeYahA*?FfaJMOUkcH2&#G;x~=w+}JT?d3+N^6b@1q3Mzt#x6`c$XtO($Y?|!0p{Ch{Rt?rPwzVO)o84)%qLPZ4+6h%cvn2k;8AKLltZ+DLGd+&Yo-rG5i(EulwyC%Dq zx?HJLDw#~Sx3_n8c4CYrN$Tk67#J9+*fOat)&vC67Rk4^u3(5#7TX|=yA>@+tzWT{ z0*V}@T75AXGr~BdH1wIcxo>Vl>dQ);Ox4W>wFSPQ8Y;F$P*8g`i!THzQP$I#Cv#_; zp+FI0XMs0Kow2PEWvY~%XI41$ zh&7TmlQh}5E&pu(`>#JY{qg&68-M*}!_Pmh|M7?KzgxHV+i$*J^VOGMtp5D7Pe1wi zqYpoL|GjtLdHbz5-+2ACS6_Mgr59g#{<&wLd3xxnCs(a};_=5;Jo?DP4?Xz6;Qh;& z-FNRjci(mA9k<_h>n%6mbmP(+t{=GW+H0=9>dGrFzwFXWF1~2Vg%>P7f6;m8o^$qD zXP$BTX$w#7Kjq|;PCTKnw~$|uvn}&@L)X-v?0hBD-GyZ-Ep~PsmztMsKeny4<(Ncs z{OG2m=EjaZ;_$|XInjs^t`8knH#=Bc!*ciC@3rS1Gj^Z8+q9{>PT6JWohDBzpEzO19kwqUzuh>Ot721`%NbS9%lWIh#=9F5 zQgy^_twT!|O`8`O+AwkPD%4UQpTDMU;o9XhHn%L>I5@p*uz$kP>i#KHT{T+)dj`Ul literal 0 HcmV?d00001 diff --git a/widgets/login_info/skins/xe_solid_enterprise_login/images/icon_add.gif b/widgets/login_info/skins/xe_solid_enterprise_login/images/icon_add.gif new file mode 100644 index 0000000000000000000000000000000000000000..42520c97f33b57ba5e0850e0f805593943d8c0af GIT binary patch literal 1726 zcmb7EX;>3i6b+lGpisottvbZDXp)&Mzyty&nFIj?2vKkW3CTzz$;>nfBp_{B6cm>h zYpb=^x}stil~$?Nr7qQK-FGe8ih!~vge)vdCn)F-KfllS-$jtk zk|l=XVmXFIRy?%Y?Y7R&xT;p+mPVysKfUaca9wS4dpokVKL1e5<=eO09S%vQIq_(# zV)v6KvsqVAFkhjlZ)wRt)V%e4n`nKVsQkY2PS@NsX6exeTSrHRRvTT}l6J`&pOlnz z+M0gV(Q2{GTzjp$rl!eakw~SxDl2b3c+g_AO)skvSJV(CWk`8-quCs_uOZW5;BTuz zb~S5D*KIm$dfd>k@oZ~HcQ>-4+sTmn5YpM*(mWj7FSvxyT zHd~X``n0XB)?}(PnQ~XGXtY?2B_)A@fjvDvly?~cJzmL@cmR>A9ykJ@_VI2BMSc+@101e6d$RH>Sgt3?xYW2N%kOgXHeMuY=lMy^pqXi&WjFlyA8 zj%(ymWePkU<&taXF@p;9LiCwDD&P47aB2#1EedexAWaSiK|m0j4zWR)4Nn7@AOtcX zCIbwnK_HhC%mpFf<)D&kTE!x60wR8?MecZ1GL;0E!7vyMbOVcyYcm)S48shN$zU>R zB!Z^P!SpgC4bzS9vw)yFxmHE!RX7GXEy~jIEIp4(dio*+4Iz>A8^(0>-hk+GT*ENR z2nIw485)f1SL38)Uw(#la1KE97k-rd`UoIuhWZk$#{CPk)3 zaCw#n#q?1KkD8UGQgC5*u#g?XWU*O7z6gXMSRjV@2*l@r90U{vvHA?WP9#mz6(pA= zF*yPjAK|bC5F`Qxut+Fkvyc!_z(zRyer^<|)5|b9>J)WyRj;`4Te)1J7M1C7trW-A zed&)^;(A=C#0fx{$Oe*Bm;yKGoSAtMD1vHL*{DLS#Wg_h)pAvDP#22$%peg0vqBJ# zGire#SRfMe#e6Z01POyd>PxQTov({QdctrP#cM^k#pE!h$- zJ^5t=rOj+=ZE0?5YEhoP&i{4p?4M^&pE~)+iQ~tP{(j`}Z&im5{`yPhf&Ke_{^`db_EzlKy{mlZj_upF zZux%mcbmT5_|1m(Uw^gk%e7@+e75TSrSJtCYJ z7RrS~f`d3@eUR-)r%jt0_|cTflO|3WPYnRZjs0-U=usm_eDMBo|6zXb`T7hU;_Wqf z&_K@t9`0_gE)+^YhkNfcG|f3X-+GGYseHV!sL;*TBi6&!ZRt`szd=L8h7R&uwHkNz z@%1GHA|Kbnab6haHP+MLp9tr9dK9XMdwUO`iV%knGXvGfPpB6{lSdJu6M)D7^?b@@ z3XJj-iCJ+p`7r9l2=|96^eJ-|%$9}3lTJ@^X>mzS9?fOVOBx^?Fn5vi+4E--|0);1 zg28?xRDOXo&z&4N5*h>M&)QeM?M!LZj^uM!WT#iM77I$f@79UkCJsyhRi_T@ybu&a S2R5WtlwaI9gzD}}3H=|wB&kvW literal 0 HcmV?d00001 diff --git a/widgets/login_info/skins/xe_solid_enterprise_login/images/icon_article.gif b/widgets/login_info/skins/xe_solid_enterprise_login/images/icon_article.gif new file mode 100644 index 0000000000000000000000000000000000000000..023b63d2f6f4b19351ac56dd68d10078112f851f GIT binary patch literal 1466 zcmZ?wbhEHb6kyI zH8ij?HMcS_RDc2{plwAdX;wilZcw{`JX@uVl9B=|ef{$Ca=mh6z5JqdeM3u2OML?) zeIp}XpbFjM%Dj@q3f;V7Wta&rsl~}fnFS@8`FRQ;6BCp2OG|8(fG&l2A-BNS7jAG~ zu^!k%ddc~@`W1-<`i6Q2`nkCve}PpOmjtCEoPkw!aY$uBs(w&vaeir0aw<@{GE6ft z?C@IzQV4X7m48ttFj5k8T=J7kb5rw5JY8&+N=q|StSn8;olPu^j7^N49bF9!4K1DA z3>{qz9Zd~PT?|~!j9~^KYXlmpmjcvlYGLVUWNhy2Vrt@KXy|I-=;CJL?C9j;X5ngV zW^85#)9aa6T#}fVoC>lOq&E|x*9os)E9aur#FG4?ko^1{So8;E({PcxqRv3h4bgm zo;iK$#u35cm<%;FYmM&SmXyJnS z^XAT(J!|HS>C>i8nLKIYg#NzXp6;&Bj`p_Jmgc6$hWfhNn(C^`it@73lH#Jmg8aPP zob0U3jP$hBl;otug!s7FnCPg;i14t`kl>)e0DnJUA8#*D4|g|L7iT9&2YWkP8*3{| z3v)A56JsM_cGT0=(bm$`P*+n`QC3n^ke8E{k(QE_5El~_5f%~@;OFDz;pXDxU}s}x zVP;}vU{L(Y0xo5AKqRQFWMHd5a3Ie^N34};ZqdmQt~ReZC0?OUj11z3MNZc`=&a$( zQdk<++^Fg-k;C(NuAa)No9|m))P=4mzH4CTved2RZ76TD6s{HG?y#&>=d0xqH7Qp$ zVv!Nxs5M5*tTE zU`ij3FXtwQqdxa6X6@a?eGgNQKF+@UV*074=_emoZ`?T7_A+UI>xAvCl{Gc9i;E{7 zYPGCew|w<#`a=8EBah~lmM*?!PdnUPSWz*jq$F?2k_9(94z|2BUwdvYEL>1tzSGuT zY_X(WZ7Zp&YG`Q4KGSyie#goU8x*_lSFK-PR$X0prEPoT(@8s;t~|FZw%Ou0+oD%C z1#1hXwYDfrlX%m)SZmXPJ1-`urSVkdN%c1ID%;Cp)yz>r2Qf>Q(vpfE_tEY0|QnoP={n5@dzsxUPiJr0U8<7S;f zM>0yttjp0GakB_ks;P7mXUC3Z1csatMk|8Fjt$7+Q$o=sB;bNj6$nS6a6T911B{P_ zKs7>WX1AjAO*bzU&*jaFyiiBh7|7dsQdSqx*q5hOP^mzx{LrRYoq#V`y3 zJcP#!Wf7sqJUyc{hw6<%E(=o9sG>CnMnmZ#hec&NWnx4y8|gn1bcRGtW)@@YGOjmr zouarZN{5)01_b2-gmz*a`dlo9;`I!jt_y8s63JJ=|Eqmta-M-i5=kRvqE#dd59;RX z^^P3CP7Sz1Noz?qi-a=ANIEwZ3S3I5Ogd7}#7RXk3+1XcYFsQs1sFl_B{G6QQ5lGk z2>?5l%EB=a4kUz&8>criO1+A7aW${FVXx)l5}H&p6rD^_Ij&+z$f6j^m_->NNfI9# zjj{)8<^do?Q8w{YT_diJi(-H+4j@EO6agp>csKy;4XI2Fm5~t%>7aC)jVf!}7zj$y z=+#uN(UEReoI@^2Yi5yZf~Itk^W{G11O4#1wax(2*PB5 zFBE_vc5+T4j}Q=i0+XWHe-IHi48&1p-OA3j#MZK7*wsYrq^k`{J)1R}ZL%Kr zj+ZZ9*uCRPjS@HSu^3Tdjmz8|Fw76)=;=)A>7tH@;UcuZsAJ6_MKhK;y%fuMz znFdO)%h6_QvNAJBwJKdXWBP~FKA8G`T58Ia_mYzmCnrprsF)y+j~gFL$fS~Y#WB(2 zL{X7A79k85@WXg)gL6Ye#s-fWJ!<4TBZA;SX!x+90dEiSA3W%-fqnz}_w)7X`{oe++C32b+Ben&$bPsiVb6;T95 zMMbd!;-MfUoSVm{W75*O;Wbe}L=f;=+5z&%=HJUFpX7IZzwf>8@4c6VMPPx5 z#)IR*xy#{PtgcQ!-uSq^{a$mk?ZJb#&d!F`*1E>VO~u8^bIrt(CF;3z)u)=*7n_&m z7fdgxU0Br`eax~lFK=;f{>*ag(z+KBC04!B7+GPByVMqS#Ij;bVL|zRX?kvU(QYbp zb#777?8BB#W##fB>!LL|!5eD%+Ptj7ovAswG3Q!{r5T$`N*5nI9hhxPU$>69)*f1D zrIs&GvprWHux8zVH8sCBW>q=1$7;&VoN=@%d+XK}cV5ypog4R-GFfZU9NVQEH?CSN zTlSS-tF5iJ*$f%0s;*yu($R6dsp;vnXH9KwHy=K%Z)vgC*JFkEe0_a6|Fg^MRsR@8 zBp}l;8ulGL&1BSQ6LAKJ#pCq`3AgFw87`pLNw{-F3P@p;;tBfjGzyPOQ$}mk619kq zJ8dcuY(hv7 z7zhyZU?GGE5kG(r!4L@ZK}hTmL#RlMLNL&EaanJaE)G@8ur6QhOu|iI7$XXTDJdzu z6akN<;z1Ze5D?;ne7--6@TXG^jK<_|puM{-$Z%Rq>5Yt@GyrysnpiTKk#N~a|B*l# z)%y4ZhVC(Lpm`2aJS|CpCXEq~2oYc*fpDN)8X|zjd=b*kjWE!R#-PQ!x%$^!!5g`#l)^O(Nkx-nQg<;# zCXftCCy+)!8YKjLVD?~5d&!2U6v_EZYebVx{`B772!@~#l_y4+g_s;EGb$|YG^LJaV z)lzfgx9VT7U;E|ft5+^x`sv4uKU}CfU-|ua-<~^r=9|-}PM$b^?C6oN4}W#2;>&{v zzW989`M$E!lD+0V#k+SE?cA}waNE``1)DeJ=WWd0us&y9_S!Y8vocq$T=7}P@?}fY zmn{A?E!C8=D4C(DPmH92NJ{)zpAa91>$I_&j~0HoVE(+hAH>Xg|Gnra_3TKMQZZ}h zjEL|sOfHj#hD@I}RT3P8B7x!nkx;;A8=U9wH^q0d&!l(Xndr^+0w#U1Psve>{I*J(>wbeF% zTidRK2REH_TT9O$yJ;)EWJ@^fIdI*k*ky~Ubi^HX#vXFEw6)c`z46s<`SzyxQ|{T@ z8&t<#`>(sC#dRx=I~qN{TTM3kmZs?&>XWW|?>XGnHJ-S2b-vbC)%tp6g?(;WL($>J zxFgPrYn~lfJZJAX*PnKkU2>IQc3gYpQtq|K>~|=3+b`U6-FG-@Y&J)8^If~$<@0%3 zS|0oTt?li0ueYG6i1ELVkS9SiREYqlCe_q8GRk69YqD_?$i(O93?k4`bqoY_S`nDe zQ^6{u6wlHr3QTx%L41m)AX|fK!KkS~q(x}a8}&G;1}yp zhY6W20>$(XfYy`}CLG|gV5SDMZ*C$jKC1WhF}2`frUJQ5JrG!1EkbU z+S$S+O#V!Z+KIp{k~9h-C@(LMmB(Qbra2ITq9_EjAvT*ySuoA{22yQd8qA@c3>a?K zm~=)`M;HK_QJqQTk|L1u^l1osqe}Ih*kERL1jN!1ddQ+SLI?|n^m;n34r?=+guig( zmDc8zd?OAe;btP&q`@ik&`vOwyVncRhLktL1e1=s6m!gAz@6qR$?7>_GK5E(2H!(0g) z7I4@wACvO1POQ>kCe;QFPK(l5-3u)8TC7lN!qp^UN+F1x&g)OiB1poVMHm5TG8ahK z8MH*6nZB8)fnvBxHxJj!O@tokNUc!!3U#SW%;w85loNsR=%^(UfkY-1%f)gO<4XlF z_zbK4&*_3FPawJ|UMiB#BdYS~<@1uKHqV;|H&C5oqFSQMlYjnhZ)^3p_?o?sJ#LrN zVYf9kHq_TWs(tw2{=K_*YHr{9>*k*~{`md+Z`ZE=dgbz^i@#hrf9~v=)77U=p7{Bv zVojc0QO1E#@x@GeZ-+%Y*ri~>VzFEI+?V8oAidTO9 z)t6sx@7U9h1Lb16n^~Chab!@$hYLp%O%aG_l<->pOZaTmo;ZLuGM6! zGv0gmomp?cHFHLKT53vi()7fHcvW0%j8YLTmtj(gcv{p{QREaM8X@5GxEwasjx1*Q zpk*SI-`SZ*&jn*0l?R5#kT% zc+0}+nSSdTf#ro=XId97TC@O6U%G60`lxZ%-o4XS78lC~gjz#VHq)5~i?5CGD+95{;P9A0BF@2v`G;4i-)hpT_NLO$&$#4vY*KBUS|_1f*F7>^@K& z5Y6iz9NVi`sx@fz5R}tH(tX&VZk`}(N@C)~9vCumd`ru=U^cutqvzQ8#e-&LWh53d hrh}3*g`t@zmskg6+&Hu6es#difZ-!h#Wa91mKmq|n1|s4B1lr;V$q5mX3rUawDqAdA!7UWa zP=GaecyNQ`+I-${QTJ-6wVBc zE#?^pliZ*g9vvMT9Sul5KR7bdr`LOi#hq=}uP;#;M@Eh`YU(=-8iOIU=&{ylEV!<5 zDpL9tx2X+=ye4g4hoMWU3@udzr4-i4`wYXwp;f9*^+^BVU~auSw6r_p((}}`v{t!X zsa7jhs)(At;GKsRDwWP)U~Ep@CpVVgQtO9?>KYnE-$!o?CDmiklLQ3og*s>+g2AVDq3}y>*{)RItYR)tE&9{{e#Pu``dI`+1dR@ zqj$lR=9ZR>3oTt5OddZy7tly&FGbvbv9#l6FY$B#dJ`gC7@e$4}I z;}d;c*+p@^=D?%j)K+8uJ>$m9nvjE+lsa8zR+gr}zq+=TNF=6R>22;b;tIO%cXa5C z#@%;~d5?zSj6$%Wb5%e4g}kk;cVHkVH@CB|@8C5}NM%pARvS{P2(Ro3 zs_q>a9CUGU;ht87mnxi{ogH6UhX<|$m>ekweS7)HL>z7mECnLrD87(}RoB&H0X~n0 z4RZ?w14Rrtn!hqh3HNWdq!;t_Ea0YVE&0Eq-55r-mhl0>1DBf|+L zPU9Asu!Jk-i==!+2$(E#B9VA04U2mEIs}0zFz~Hmp#(n`5T1(&2r`a{0O3J`Kwye% z3@woc!SCGoAX*ZVD1r$=ump)0b72(jG)_iy_i-T;5cP(-R?J6>!ii-f+;{;jl=?Gi z*!Xxpk4hoAGe{mpSCT7(&H^Eb;>(8UOo;9Vx-mf(*>&8&`$W_vo`-VDZe%h@^zdN1 zk$fSD1$vNKBs#<-63KKD$RJY2x&A_llq2NACQ%cY|BmbaQ7)AshB;D19D*RRsVf2g-!S{OvH0Ek*>uSZb;K52!O(bRwC>q`0EKo1*sh zb@yd4=xjQh!Xz`?LF^kY?|-L@fOz{Z2xZU!5 z^R1grH-5X``0KT+4fR)k`MK`$rP_-%KUH5i|KktepF4Zz^mnJKDl5uQo+v9VDgO3& z(Km$!$BrI3eCXhT{rP$OzTTUg^VOd0-C3C#>1nAcyLRqKPD+#|Y>$^p#Bm}-D2R>O z#*dEL3iG&;oGqI-ZH)Nxi_gQuLN|m22d!VXc1_^wfK~o0{n#uf!g2~uf_H3+_1vYDC3+)&FM*r!i`u|W gI|jSZKB6o(E-lmM#J2E~s+*;7)70Xr$()
                                                          73_uI^CttIp@v1peTnR<7SMd9Wegb&%c*ne#v({&-=d5_r7lu5~lW- z5~Fx7JS&fvS6244sj0TP+1l7>x!XZpZSnT@PRYo~DlAOivgJ{I{i@W|irU)UMMc!Q zbrI3go3pbY)YUDoXiLk=N=i>>)6$wdI=1KK?aa?l&CJ}In`@xywG|z4H(R66R2Dq% zS$d*s{liXmes%WK?$XAdMTe~OO01dI?!7hLdv4UFpM4fuWZhcbrKjon`>l9h^{%V6 zaVFD}qg7GIs}>%#W?ZT%Z|Yfou5!c4XDiNC?z>YTQC_9H-iqg054`9()zZ_{-rm^O z_N1X9`gG;W3zd;asx$|z(YITlx3nm7t3wK`ZCzbC#l@|ioyL@udo?w@|Jmi)Gh(SG z9Ks2f;NF2j7Mjq;lPnZN#u-d9xZ%`U7&7Q&aFkdBG_;b`8$y#Aa&hv)NNsYwR;q)8 z=0brM%wnXCBuhXRV}i+yS!6Jwqhd&m8{3u<7_vjyco{6WZ9q1kN{S&NF(3G9fgcL_ ziTJ1pNJUZ~NB~fPpaKL)d{KajB^W@V-V5fuF}heR0$2C?;$|{f&$2XzAW2C{{3Ict zV&V`~DwQHYfCvP>9KzSU#>5g9Uz6FZ&jL=GwTyvg4U`G8StMepL{YiJUQAk9=F zqa``G*8o>9cVq+hYQQuE6HjtkR1*ni(!Qb5U^t~sG?FGZ441(il&>@BFo9fv3vm=E z)d~rUs(`X&jcB|{P{#Y9q6LSHe2>nWBp z>nR#iE*3$vQ0`zY0sy!GxWq5(8}W^NR0_D_01^a65rASqfC0eWkT#K}Vq*g!BNW4M zQR!FAhM*{eNk=7_ZRzI3+2oRpVKu2!Gn5gspFCz5AR;l5Q-G^fB9%m{Rx6aa3ZSS| zE(S_}wOFVEB8eCX;a;L{z{%N(QjtU{@)rn2LZ#eJRH#uoj&gJ{4pe?Z7~#S|Y-Ki} z?E03tTDA@Qn~0nAw;^fbvc_;t=Fsz3_n%#z9qnzcEzN&4y=ZKBUSC&R^XzH0wW{*T z<3|r4{9bYY-rYO5Z{7Uu#;@0Zx%TtbE0=%z@rUofyL9o}3+KN%clPTur%#X95h!J7=TIrC4OR&P{1`f-`8i3_v~3SXH1{w1$#nM zr%awSae{~YcsJK^V_zNPGJ4d=S4IpU=IrD+bjaXA4m_S`#}NCs)5rF-{XKY2WvLSv zq;1?Z(a~|_{B0Q-ypg_+&YJ9;9G=D*b$7!H3NbfciTn6q$=s>a{DP#x<-y}8$fqce z9h)sbDWBjH3eB47B@DfI$z|*yf$H)VFzDJ?4~GEHA-5*^On12N;WSvJe*8o{*y=P) z!Jj;|K5&NOg<{ya;dAD-ceHyCALlv-o;JxNG+dGC?CJ(AS*1l6(*50i=*H6Gi`!f$ Q2h!&cmxSyX%>^IuH_y3$EC2ui literal 0 HcmV?d00001 diff --git a/widgets/login_info/skins/xe_solid_enterprise_login/images/icon_help.gif b/widgets/login_info/skins/xe_solid_enterprise_login/images/icon_help.gif new file mode 100644 index 0000000000000000000000000000000000000000..4f9903d1f7a9e47d91aa7e556d3c7e05717e50b5 GIT binary patch literal 1576 zcmZ?wbhEHb6krfwxXQqgb?eWp<;xwXJU2?3>@el|llSj)Yipl>{Mb5qa?i|}{d4Br zfAc2k)Ypmg=VulaB;5OP_x0W!tGbDI;Ty0^zL2k=`Tgse%3$yn^92E zy6a7TU0qOAR7HDxbyt^l-^04z-t@e@(v}vR{zpZPjbDELjJ^5&`|saDdp|o)c@cl+ z$J9lO3LpOu-uLm_uV0^j{CM^G^V_dq-+%jN-gQ??ON#+7Q2fsw;Txdfl30=mq;2dg z3KEmEQ%e+*Qqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)Wn zQ(;w+TacStlBiITo0C^;Rbi`?n3A8AY6WD2g!Ppaz)DK8ZIv8B5(*$Yo%4%Q6-@OE zbdwFt3>C~w^bAc5EKMwR6pRcE4fG9-^bO2)4GpYJ&8-X!6`()~Xj@TAnpKdC8`Lf! z&sHg;q@=(~U%$M(T(8_%FTW^V-_X+1Qs2Nx-^fT8s6w~6GOr}DLN~8i8D@e@YH@N= zWv^{Nj+xf>iyW)Z+ZoqU2Pda%Ci|@LL2@2=#-NZ(>n) zDlit^5_5`E!4kf{RxbI;rManjC7v#}N({MavwGFa70Z_`U9x!5!Ugl^&7CuQ*322xr%jzQdD6rQ z{e8VX-Cdm>?QN|s%}tFB^>wv1)m4=h1nAc$w`R`@o}*+ z(NU2R;bEa6!9jrm{(inb-d>&_?ryFw&Q6XF_I9>5)>f7l=4PfQ#zw#luBWS`t);1< zuBNJ@tfZ(QFDEM_EhQ--E+#4>EF>tv&&SKd&Be*V&c@2Z%*4pRp!kyoT$1U4NKom^ zz&6`~J=;UYD$8RD%h4PoW+C5A*D4~{Upuf`(M!wcfq{iXn2PX*EmgeUD%zWO)Yz?7 z5!|$=PTyHY-LSE#*-+S1k)2&ytEaa|#l(bJo|TnJPkZqq#@Zc&{dpiHwK{i@4s&Q>VmDWZBph_|>nd8(&rDH}Pbi Mc<=s1W=95V0FEI*IsgCw literal 0 HcmV?d00001 diff --git a/widgets/login_info/skins/xe_solid_enterprise_login/images/icon_mbinfo.gif b/widgets/login_info/skins/xe_solid_enterprise_login/images/icon_mbinfo.gif new file mode 100644 index 0000000000000000000000000000000000000000..17b71fd1ba5fd6e1ec2c1a52b0750ae950e6fb26 GIT binary patch literal 1773 zcmd5-d05kS7%me<5oKO;-XVA*ZIa%NRD`AlWK}3Q6x3PTKr1xK(o`xc^T1gZCW^4( zF%Sh5ouZD-iSuT2oA>6N;ynZ@6g)v-o2DHgf9&z^<;j!$j`#h(@BMw>mxP3=q%y5H z$D32b;cO`>F;WznmS$bECVR&YO>FGO{CrD#I=y1WhHcwcXJ@BnX0FW2N+bxfvVK9i zJ*3zkS7u+En;W^mVgBJpqVi$!1^e_}wU?{yH|rYmuQV7aD(`%KQFTknMZ07!nRTkJ z_=Y3(db4tSZP=z#Q7oBI?g%fc&dAFf_5Dh4)(Xs#;XrYiE@?_SCe66x7BY zy|cT@p+5Gw^lH6f^Il0z{G5Z1g{SOG)~!2!v##t>`_iHVimi{riyuVnyPtc`zVUi< z;kAal4Gj+(8>^d|Zr9h>K6&!IwY8IeYSGFtW>5NM^ex+I(d;_*ZyAqSf(PJn<>F9%~pYFJGvaDy>4mByn| zXGH5#lXNmY7&sLOu%cEIWx^RPU^OKZX4EPNwR$ohN7=D+83F+pgh`TvLCy`p=~F?{ zI3VJ|TpcV%0I`sV2w|B}<`3{;1cnek1WULGjEW>Ei~t=M$a}5v#8Q0n{n5MT8(0)&SJs|CJd8QRMIg~2M3SfL6QBZv}~VPYvJ!32mnNFtT;MV;I*!pvw19p1?`zTt}A%0(44u4PC% znk17uiy^{5GNjo+Qh*{#2uwuSgSGNuSb`vI;^R6;JQEL*!EABB5(q&c7(rn^3d8IT z=qwDGkT3->0r4~&m0{i_0EjUXdNRfAOgAgeDHo@Wi*UV)CQX3r^hg&T6PY*nuwirwINQhS)_lz)Br(800;`@h<^w{*|$lH#IWI}3LdB1P4tEoGK5Pg36>4u}CQ3vklJU`cL+o zG;zZCabtZ!A7ISrQ6onTANKyx_l67}G;qMX-u?S|_4Vx2+oM-c_a5)KaX3D$?ym2p zzw_z*dvH7omb?JgbnwlLN=}4ZUFHd(}C_bcX-Yb%A>cJ US5LqXC@QR6uki#t-8oZU15=uW{r~^~ literal 0 HcmV?d00001 diff --git a/widgets/login_info/skins/xe_solid_enterprise_login/images/icon_message.gif b/widgets/login_info/skins/xe_solid_enterprise_login/images/icon_message.gif new file mode 100644 index 0000000000000000000000000000000000000000..1e7897dea320f1cbc0a1d835200a284d7a67f06a GIT binary patch literal 1674 zcmZ?wbhEHb6ky(DiR_i=X-){}8ZXzjZ>M*NzV^o8JZRcw@Wdwe#G^_R}B!{rA7- z(vP}JKf12}?6~wjE_y7O@E1&+} z`t-N->aV7If2z-Zt330q?d;d`<6jzX{7T#X;ljtiMd!Yk9{bXL=lA0;e>%W~>zjfO1)@JeR+8? zt&$^1LIGr_bAC~(f~lT?ZnA-yp@Nx-o}r0>rHQ4Ef{}rtfxe-UzJa-}p@EgDxs`#T z0u(3#Z7WJivkG!?gW3h;*(zm}loVL$>z9|8>y;bpKhp88yV>WRp=I1 z=9MH?=;jqG!%T2VElw`VEGWs$&r<-In3$AbT4JjNbScCOxdpzyaD(%T^}rs|OU}>L zuShJ=H`FuG&&>t-3#_`hBq$Z(46Le)Ln;eW^@CE2^Gl18Q-R8rVVZ$qhu9>lAm0fo0?bR>0+x?TAG<+WocsWY+_+#Y+~%}=xShSXzAo;=;&hTXlh{U zV&H0K3^M>(BhW~_6rf&nBU4jH6BkDpQxhjcLstVwBLi1UCrcMoV`pa56N~N6u8u}#t}d3w7A~eBUpqOOJGnYLx;eU8x|lhe z8z@2brjQ(5`aqZHgAxT&B7q43Qyz#3Px3$xJkzA+0dqNJFPuMj_RQ&1Cr=zd zcJ#>MLkAD+-?w+q?p-@~Y~QwZ%jQiRH>_W`cFpQlD_1OEwsgtjMGF_qpEq~T>{&Bs zOrJJ&%H&BCC-nFA_H=i3cC@#(wlp_2Hq_VE)>KzjR+N{OmJ}Bi7UbvU=45AOW~8U3 zrX(jNCd9|Z#zaR&Mudljh6D!%2Kf8=`gnVJdbqo}x;Q&II@sIU+E`mzT9})eniv}a zv!kA_j<%MjhPs-nin5ZTg1nrpjI@-bgt(Zfh_H~L06!lu4>uPl2Rj=p3o{cV1B2pE z7I4|810q3XJp+4xgRqcCOKV$;kT55=qFZ181a)psE@fLKr6>RMTHiE-$dnAb1CtBoCjc%jYj&MfrG`1o_>8RRg~ghe3cs=fP$UUNHj! H4hCxgNuE-< literal 0 HcmV?d00001 diff --git a/widgets/login_info/skins/xe_solid_enterprise_login/images/icon_money.gif b/widgets/login_info/skins/xe_solid_enterprise_login/images/icon_money.gif new file mode 100644 index 0000000000000000000000000000000000000000..ac400c442b94322abe8227cd59f426e9343d1453 GIT binary patch literal 1582 zcmaJ>30M?m7+&Jg(v(9|^BRWrBG~z7uh|(`W!Xc})@UIQjC6K)U{~0gab{LlR1A+) z0);>evkWuME-UfKGc7wjx=c&W`#=#TL=e2T*^Nb>ryl2-XXZcN_xry0|Gw`ZlV;N3 zWVj?;a!ewbe)4|Co~BhBHps1&x~jTMjg79kbI&$3%r7r5t*%~FSy{1W&8hnO<*QfM zH8m}{=B=!$Nv^819&E`zbelWgKJWYkC(BMd({|zJ&C}PfFI~CPvv{$4;lkM^C7Z6? zw`65GST#er7`sU^vEiG8d>A1K!uh%R2&lBVAG0B_`8AyQ?|4E}gENRQ5 z1jtI|I%zH3xN|QIIqh0_qRI@+te$c>QwupNqi}qttuW7q+u_lppd=6Baj`B+AR&({ zpXLdV7AEbCl_JEkZyA9hKSapW!aCmuiRJ|h^(grNwa;hHVkyKz@r;|ZQ6fCHi>t>w@&P+E5N49g zqr@zl$b6piZn~Mqqdc!$SHDB{TvR57r|GKny@k z{FJ~*=8~Z}5Q_s~2#O*AC4ig&Kzt#aTVQf>5+N64<;18Q*&`unqLa2W1-viaqBx&i zigV7S>?V$JLH?5`oLxk?-J$}6(Wo?HxXF~FHy8nm;yM-3YfLJI5hyVgP{18TdzX{* z6LBS`S8C)6r9!Xs6H`p6&VY(^l>r#l3K$W?KzwD^rR)MrVlDfIolPW8I@^$<#jJ5+ zlLdJnKDdAHZhPCE)|T7Nx0?QLym_PHdi}MlbyqH5x_IIIxwB_Z|8?r*i9i21e(d+7 zzy12l&p#bGeCXhhKYah)fp5Rrzwhh4dv@>Ix#O$t+qQ10-TdVjpKto?(@#GBXyb<) z)_<_>{k1jkt$FvI)o-t=e(TMZE2=8rs3>2)tgQ6)lBG))zqV-Mg89X-&MTTbXLjK% zPr*#Lz;iQLhIZxWO?NtSb11vbN=}>lO7_cBvL;WOIN_zt49kn@FN`-oKW=PV>KK#J zpij{yj~=B>N+fU%rdBBxa3GvUxjT|w2*idOK90Ls*JZRv6XZ!c-`%HA7sK|)$ z-o2jg+2g4vyLSr<4GDfCNFs@85Aok#@xHI`_LYRyB#+Bam1eQ2(sc*&<)Pu}k=x2A zZ<O?bT}-Qd(9T zgJHpgLPJA(gKB`U0==;T{rZJOOV$s^@%55uY+$!;A${U%@xisVeXx=J`$t5|_U*&> rM`Cc#o)J+&M>fVD35vpogoTah8-Fq$KNa5>OAD^Jbh#o}CrSJVv1d!^ literal 0 HcmV?d00001 diff --git a/widgets/login_info/skins/xe_solid_enterprise_login/images/icon_note.gif b/widgets/login_info/skins/xe_solid_enterprise_login/images/icon_note.gif new file mode 100644 index 0000000000000000000000000000000000000000..2f45c58c08be57928fa3fd2000b184996bf11657 GIT binary patch literal 1545 zcmb7Ec~}%>7+-}5(lV{I%fLb1h@x`r|E3*w7c=n9u<8qb~bFCjN^DS~5qM@L6rUtjO}t_`AN!)j-J zeSJ>4;lz=wmX;RJ{Mi2f{t{Qx(nWK`O#H%yzG6B1(7}D{^NhW{z4qj(n?0uP?(UAZ z#FH^1ZdUyNXVS$H zi|y&a!pIEzC#M8_jMKx)AcxK4yhg0$cohaXml4a<*`eKMX5HNEB9UEKG|%BI@;E6M zmNEk*2j~Fr<5`&j0Y2X=(E%gIxP%;*M&sZzfq@W2_82i!a03K=ngx*sIvlE;Fp&g_ zTAb8EN=qdGH6$THstKr9k&xEuX-I;B2SeUOS1z4lu?_e_Gb84fWgkrt1qB6ofd&`E zJc6VsihycDtyUp~N-FfqOhDz8CWkFpSjj1JKA97|AZU@v5&W_dLy`U~f%j!_d2U%6 zH13t~kSN?K@I-*|5hM-?F@y=~3$yI@D>Hb05G~0W?B(G9)4t>=^sz(+D+zwl$s+jV zA+E0MCX}R<0J)9aX>vmk_04asHP!AFL3&0AvZS(@E}J-QMs4L1CYsi zT|$8rOg9o2l*@|TD%NEa1s;S>p5}&#@cWShi`A;N>M5Ho)oigslB7&JXg1h%8Y|T5 zbx?y15M4t~E<~iXdb8G`)@U_mQ;3*qBTW_((RCJRP1Iln3WEri*^sgeFQHlv4hNeE zO$OVL^`fkasL6(1{HOoI-{>~!>F(<6Xm4w6X>R(fvEkg=KmYjsw_krb^Yc%qPyP7A z_utij`_0L(zdG^d7oUGt_vt4efArx8@4xqM?K?HqRd2ub=J7X;@v*M%jbJma_+ob*5%A$vhP~4d|B4gC5tofT;y1ou^@f^ zJo_DU=cLV^WwTn$siv7JGmObeG-c2y>a-d)YH(bYFkKlR7dvh0l*!m6aQnpDCfqvy zmYc_oz3Ijq#*Dsx)OFX69C1xd^wm*UMMexCrcg}kjSO9H3Bhmh_Ekg`SMR8B)MP7b zPefElZ^XyNMzo%tIezQ>^429FNiqXTz V;PI8mD)BKBrdL(hOfV^uE&+OREr0+3 literal 0 HcmV?d00001 diff --git a/widgets/login_info/skins/xe_solid_enterprise_login/images/icon_tool.gif b/widgets/login_info/skins/xe_solid_enterprise_login/images/icon_tool.gif new file mode 100644 index 0000000000000000000000000000000000000000..8c1835d229c2dcb28ef1447e6b0f88ad2d90f543 GIT binary patch literal 2176 zcmds2Yg7|w8jg2BYiYGNt?U@lt>iM7+=s+ul9`Y|LIMd85rkYuNJBDdGDu|I8WvlZ zYP$tXTP^iUi^{raRYdJ-RM-k)E0pz8b<5V;Qj3TM7j?U9Csb^I^z@wlyWcr8^M2pF z&-=XBnH0TNDznG4;#ngsmhs>%XZPL0kMHRB4RS!lbNTy>4~KG24&`->@RA8z>rfJx zn-v)@>baf7;UqB^2;15inakmUNH!%lSY69J4klwaH= z*Y6$R@cGI49`oBx#^yn>w??<8pC{KUUsyv_?LybJ!3s=ZS;pmqSZ%wu{!+%itLUo6 zw0GMyjRTrp{rQnE9Ic-lsv8kw9+a8~;ud^!x6np8Kl%!ztDqDshYz_g+!N%KWE{DL zZN6+cFko1_SsAWha`a2SSgL+;BM%Y6YCW-~$9m|RYR3)9iUv!|b#={gbY+9JZm+iH zP}Y_M$u@i8sT=xD9UOsFx4p-(>k_tRH&-Avy}r$`oxcORGZNZ;C9;1Jmt!e-|qB~G~ghM+&%^S z=8|= zI!|}BpZe%;ZLKFy9FH73`qvMS96r=?u=&9LeIM-I)AX0!e{S5hb4SDb@6~VLwsp(q zP4CvdvvI@QZ@pRj#`>D-*Z=g|tLxUjQuW6*FTb?9@(&f^RWJU2%jozdGT2{<`mM69~lrGlS1>wuHlSXQ=SSZV&THp#EP2Y7FA?xe9YV_({b~l_Qc8AwdWFm z@e4kgGdY_*r~D2(W`d!iR~3JtJbtmGd6L6-5R literal 0 HcmV?d00001 diff --git a/widgets/login_info/skins/xe_solid_enterprise_login/images/icon_write.gif b/widgets/login_info/skins/xe_solid_enterprise_login/images/icon_write.gif new file mode 100644 index 0000000000000000000000000000000000000000..03afbfc70173a1ca0188ec8ffc2e4e4d900e4399 GIT binary patch literal 1697 zcmZ?wbhEHb6kyop8=GWB)MMagiv`m~ozoNapf6kn`-rky} z>+_GkuDbrMXXebLt#5tzd`QpBi`@9udG?FIb#EqK|7ISZl)C%1X;l8Lmv2@+`*q;< zEB6J@mz{kz?ZhkZWshdBSh4ETYp*5G-Iu*ucJuB0i*H=#J}+!+?3^~Ob@Jr6&F?a% ztWMbaDs;o!nYX`tFMYD~$#>65t5)28yXe8sjDmtiSKn-S@!LEmf8VW_O%o=hZG9WC z=3&;sR~MeVir#f^=9$;g8(!rded;#%`GkWntGl|EpL=!x&6`K>-aUE${_gA7&p&?r z^7H5S-@m6WTJ-Ak=i9Gdz5V+2+pk~mzkSQCt^M@lhnAKW!+-+C|J)J20SYdOC5b@V z#=fE;F*!T6L?J0PJu}Z%>HY5gN(z}Nwo2iqz6QPp&Z!xh9#uuD!Bu`C$yM3OmMKd1 zb_zBXRu#Dgxv3?I3Kh9IdBs*0wn~X9`AMl(KsHENUr7P1q$Jx`$q^)>0J76LzbI9~ zRL?*+*}%+D!OTR@(8R#f#8OAW$iUD*-_S_kz+BhRz{=Fz%D_+o3Y37h6{VzE1-ZCE z?E>;_l`=|73as??%gf94%8m8%i_-NCEiEne4UF`SjC6r2bc-wVN)jt{^NN*WCb*;) zCl_TFlw{`TDS%8&Ov*1Uu~h=P6yk;40$*Ra!Fk1cU=Qgf=jZBIBo^o!>KW+g=7RhM zR$W{Yl!|Z$R@KEJl?AE#L8-<0rA5i9K;_CX&A_n3ZxKi#&^1>6MVY`zNz8G{PcF?( z%`5SAu~jN9%}lYfG%l3$#WU!dR|Y@!gJnU|7ZUJQyEh(}#gi!#enQ{0O3 za}~frYn6$`c4t>dBQsYQOJfTcQ;@HnoXnkEogLjA-7HVgsyL#pFrHdENpF4Zz^r@34jvqUEV zojbN~+qz}*ri~lcuUorj^{SOCmM>enWbvYf3+B(8J7@N+nKPzOn>uCkq=^&y`+9r2 zyE;4C+ge+in;IMH>uPJNt12tX%Sua%iwXi?qaq{1 z!$L!Xg8~Em{d|4Ay*xeK-CSLqog5wP?QCtVtt>6f%}h;V~xOjJZzNKk;EkC%s=i<5($jg^I&iIIUp@h1zoT+;!Opt7EUeOUve zuYzxDTPtH|S17YjUw=OXvq?95;Pe?Y7y{V^yEwfUE?UH}l(UO3WYy|5tGErtG=es7 z*&1ZzXke!quy@~n6&^DyYfHc5Cr+5!Nb$>?b9r65d`VT@SW90b)Wzf8eGhvbJs~CS zE)MrsujL#>b!8Mey4c*leUo(J6;X3_W9wp3k+di{%)udS#UrwyRt#7^Gd^2}B|2gMB%blqKau1Pm zIAbW|HG@%Ib>YFi^4pcAjdeGkJgQ=`SREbhPEJm3tql$i4s15t(b4g7LsjLq6Ag8h z`%>j#oO$};(?`>1GUKuwlD1@|=#pdAtVDCn0_N5I>ZCaB{;5_3#7&tAQJ z8d=?Z`}9g8nAu)mlpD#-!d=*F^IoG$WvhtniKdq|~2JE88EoC(#$5 zF)=$FIA9Kad^MxF>7My%`}=ntot}Y>b zb1hTLN?tMv&M2z6Q?~T_!-`}2hi6m3RasD2WWwT!TVv2Q5uUoRxtc)Mt&^tbck*1< z8br~rU99QRb6*D_kyKwHb#k0Ly?q-*44p~FZIk;ZIPRe<8fBWr{ zxHs*uOd&uVwanSsneqSl&mzElZxf;j1f)tzNq@bjm<&o)I7R`XSQxJN2A`cO1p!>` z4bB%RV1+?~X>tEpBQ_^?X0R$YTqRP2Q+xm~6Kc{KbQq-sOu7g?iJH7YrJ4xEP?0dlq(}h ztm{CbK&6B#N{8vG0I4@fi*nVt8in~Hcd?k~A(8tD5kv-yJfu=Tp+G2t`5rtESki+H z(36x>uflq;_(!bplUP(@#FP|a3?_((o?-~p5)?sd2?HRR!v~xYIZh!1F1~LmkC93xt~NTgAqg|7Qhk@xxh^Z^MwM~4eSQ0dqu7b zDB=qxbb#FWZW3`9&`*wtr3eidNMV_~8wk;EK$bG=RdzjFbS+z^ADW0>d}u>VPiM_Y zH(8(e@BZrSc>AXP^`Ea^zG!QG{;Z|>>650%j~W~5AJ#pnyt^MR z->z3&`}Jyh*_F$eE?zkQ%ek{ZpD8{4(~qZ4o+vr~!}s4E`}XLO!-ozY*uQV@p5424 z78ey3eia6!oYd2@s31kDbdHB&KT`m_N5sdAZA;wSc< z;^Xb*iHbag?gG9Wk8W@-$JND|?c~UEm~0O+fk_i5*p2^U+}JUrN7;@XF?`t2&xZ`Q z`D~E&K&t`$`}OU^U@+hG@45wDEpN-;n_*qe7&FMO_Z{_^>1$@B*roY$gOaiMvOcq<#r^lDh~u{j$CaxS&kfm;^*O_O zRMRq+d5G=mTz}i$>*9CMDl4CC9*{U1O3=(;)`I>?R=9?n(AsCX4OcLD&^YC}w2>Z) z6|T;cRef_ujGK7i1h^|>D;!YxJmh7eY`pzy)cRzkm309(;zC~TF@IUIjgwVC0ongb yf$fNS6(!`djS~bCS4LqQOS;)-td}i2-#33K-)^*BNFb2#tna|(HiNAho__=K@ZoX* literal 0 HcmV?d00001 diff --git a/widgets/login_info/skins/xe_solid_enterprise_login/images/minfo_bg_tail.png b/widgets/login_info/skins/xe_solid_enterprise_login/images/minfo_bg_tail.png new file mode 100644 index 0000000000000000000000000000000000000000..cd80e9a8665044d10c237efb3f2581dacb79cbe5 GIT binary patch literal 1091 zcmbVLO=#0l9Pd!1j!gtbae};MUIsSF%i699>$WyYU1hDaE3U_7$!i;6)DuhYV$dT@)|s4qkj|*XdzQFp#{D{C~gy=WlK#d%C@~ zqcso+w5NxZ99g$P7z5wph)#VQZE{(SbnUK+Vzg3L;ELMm~l5mX^F0%YtW5MlX{ z&PO4LhFKWq#jtn^2t4FDC~$ml2=Y>-SK=YqdKl`>HHuPBNp1O}r#Mq4#F03zTCK9x z9u~VL4vM14@d76ZA!-rwrfs6tLblh{WKfW&yQV`-Yy+QBo4`{f&d^93DOgS>vrTM! zTZN(}<7%42L6+w%%g?KB?U5Y%6UL6#UVhp^Tn>47%GGHr)o8Nm_|B^bc#8h9tvCLg8cKWJ*?59>OHALNOvhz9*bYDzeh#*a-{6(O67~ z$Z{%~fKa6@sv<@cimWD}EDDh(Hf?)Evvt(;Yf`^k*yOHQNp_J&u$#wtvN-`GWlXSF z#tx82BP;}CrfuM==eMVkt%6+hA~I4gwm`kUlDUKbf9Ku68vj!>jt0Z|!|~U!G_U9c z`rGZ%r-yCvAe$=2rPBB$9Jx+q<)xKGzP9q^{k`_*;Nal9wYHm`pyk8f{prn4^Ht(O z@DR9l^2giR=S;_=!H>s3Z#XMGdG_Mwk)qKmed!UN5=z~sczR7Z=CRDomR8T{p9%7-}pOT A=l}o! literal 0 HcmV?d00001 diff --git a/widgets/login_info/skins/xe_solid_enterprise_login/images/minfo_bg_tt.gif b/widgets/login_info/skins/xe_solid_enterprise_login/images/minfo_bg_tt.gif new file mode 100644 index 0000000000000000000000000000000000000000..e0092c140514bca77c019bdd149830ce43b261da GIT binary patch literal 1248 zcmZ?wbhEHbT*JV^a72i~+uPgF(D3u;&qYN=jg5_8zkWS(6v-9O7C~?S5nAKu~iB;^)>JRtPXT0N zVp4u-iLDaQr4TRV7Ql_oE7k*hM=v=)SHB{$K;KZ$0OTc@LSJ9}N^^7Js*6j4QW5UO zYH)E#WkITbP-=00X;E@2P`NV5ssbzLqSVBa{GyQj{2W*)24v)y2=9ZF3nBND}m`vLFjeGsTY(KatnYqyQCInmZhe+73JqDfW2&$ ziQ6qsIL(9VO~LIJXPkQVfsWA!MJ!T8!-RmT2gHOYTObFX@Kf`Esl5o8tQr6R`}^nj zub)4@fBX97^QVs=-oJbM=Jl(WFP=Yp`sDGWhY#-GyL;#Mt(!NlU%Ptc@}-Lx&YwGb z=JctPCypOGdgSn-g9rBS+q-A?uAMu!Z`-%OrteG>WPn$Yr@}!9q`ulo&y1P0%+S^)NnwuIM>g#H2s;eq1%F9Yiii-*h^7C?Y zva>QX($i8?l9Lh>;^SgtqN5@s!oxyCf`bAB{QZ1=yuCa<+}&JVoShsU?CorAtgS39 z%*{+qjE#U5iuTT4?zT}@R*SxHerUQSj^BXQ!4ZB&DWj=GiK} z-@RW+Av48RDcsc8z_-9TH6zobswg$M$}c3jDm&RSMakYy!KT8hBDWwnwIorYA~z?m z*s8)-DKRBKDb)(d1_|pcDS(xfWZNn^f+Q3`b~@)5r7D=}8R#Y(m>DXVndljs7+9KE z>L?f)7#ips8tEID>lzwZnVMS}7%D)46417ylr*a#7dNO~K%T8qMoCG5mA-y?dAVM> zv0i>ry1t>MrKP@sk-m|UE>MMTab;dfVufyAu`telHd6HD@oLh|!-V4)b0kzbNuoRMFk;2dnKXQ&XKnU|7Z zUJO?6>ucqiS6q^qmz?V9Vygr+K`%2i#md>t#L~^w+}PR8$w_A*G>eUB2MjsThND&Pa0;V1i6P|2=9C*S{%>$zB`;K7M%r?(Lh`uU@`*{_N?K$B!O9xPR~No!hr=-nf44>XplvE?zi)?(CVz2)%Hf~tIZta@Yt5&X9zHI4|#fug$m_KjsoY}Kx z&X_)J>XgZoCQj(@>+R|8>g;H5Yi((6YHX;ltF5W7s;nq4D=jH5DlEv)%gxEo%FIYl zOHD~mN=%54i;annii`*k3k?Yl3Jmb~^Y!ue^7L?bb9Hfca&)k_v$e6dva~QaGc_?b z0%j>aT^(&LO$~K5RTX6=MFn{|Ss7_5NeOW=Q4wJwK>>a~ULI~PP7Zc9Ru*O^Mg|7O gpDYX@paUX6r3M2Nk4xXm({K3~&)E{i&Bb6109hV`!~g&Q literal 0 HcmV?d00001 diff --git a/widgets/login_info/skins/xe_solid_enterprise_login/images/signin_bg_tail.png b/widgets/login_info/skins/xe_solid_enterprise_login/images/signin_bg_tail.png new file mode 100644 index 0000000000000000000000000000000000000000..eb65ce349f49b01af98d1161406e04bea6662e3a GIT binary patch literal 1030 zcmaJ=O=#0l91ngBH`vXA-6^C99@c#HYb36AZIikVGiFyJsf+BS-MomU!R<=^0tdG=eFi{)J zskLd9*Qodva>y01fB}#~y2gy@2yTpO=nDAkT{9HffS~CZbsSV)9w$@K24sY011cNk z$Y_}6!Ym)=2go4Hu?!bv*uenD3Xws9<;dnoVQ;op6tZHv=?hyis*I2&Fif>trK=$t z+9ihLd7fc|OfVS0h=4O^BE=1uj=!ZK0!OuV3+d1#Jw>GeD=0?cNRLx6thTJ_G|Pkw z#<+^ba5U?s)B?)#|DlG_Mms1APU8Kiu#=m!0Fwm{tk^1UT+#2jvV@ck6a?)Ygfp!w zj+Y^VP8nKcY9c~&NUAq z=U9RrxeN}5@f!PAqgz*adc0$MY_ZWEd|={fxA9olFK^wzPokC)6FK)?;r-Lfmt|k5 zsMVj(KTyu!UAR7c>*4x3iu?Wh-S<~k`tEFQepVz&>YAPXwR_KZcJ1~kvAjBbG%Cwq zpKNS=y7=nwpdR{t^t1Hl$NrY@?P~n-AvX4Qr}{D0e!0CpU*FmJ-hF9pX>su*apnS% V81OHAi1r1&mzj~q#7D`gg+G2)RXG3v literal 0 HcmV?d00001 diff --git a/widgets/login_info/skins/xe_solid_enterprise_login/images/signin_bg_tt.gif b/widgets/login_info/skins/xe_solid_enterprise_login/images/signin_bg_tt.gif new file mode 100644 index 0000000000000000000000000000000000000000..652c7678ca6fa4b6f902093eb79eb4bb64c4669c GIT binary patch literal 1253 zcmZ?wbhEHbyv@MEa72*7(9qD^+q zQ>I+HbjioZXa4;8T3T8qB_;p=|7Rc?DE{Y;@C{IKNi0bO(l+)L1&PVosU-?Ysp*+{ zwo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&Psj#ZZEyztRNmQuF z&B-gas<2f`Ovz75wF0t1!um=IU?nBlwn~m52?day&iO^D3Z{Any2%D+h6-jTdWI$j zmL`@u3PuKo2Kt6Z`Ud8@h6Yxq=2ixV3Q(W~w5=#5%__*n4QdyVXRDM^Qc_^0uU}qX zu2*iXmtT~wZ)j<0sc&GUZ)BtkRH0j3nOBlnp_^B%3^TzcwK%ybv!En1KTiQIIg#cFVI zNM%8)eo$(0erZv1Dp0vH$f^P>=c3falKi5O{QMkPCP^Az77Ltu^?{Dj2SqGWM8kxDsRzV_CtDx~p72xifT_I*n5-H9|NHyr_phHn zzJL4r<@2YHAKt%v`{wnlmoJ__d-~+@qlXXf-@AL~_N|*Yu3x))1N{AbeZ0LqJ>1<~U7Vd99qjFFZLF;6K&;gYupz?@;)$IXuZ%XF8j8*G$UhgZ=IbYJt#rpA0&HMic78H2sNcEps uQgkxsmlW4wC5D2i^*7d(opxnnYI06FP;leii!D`W^9~DjII6HPSOWka4Z(E) literal 0 HcmV?d00001 diff --git a/widgets/login_info/skins/xe_solid_enterprise_login/images/signin_bg_tt.png b/widgets/login_info/skins/xe_solid_enterprise_login/images/signin_bg_tt.png new file mode 100644 index 0000000000000000000000000000000000000000..859dfab7da11beef774a4af792fef072b7c36b26 GIT binary patch literal 1071 zcmaJ=PfXKL9Im2Z2t;E%2wX~u#st=X+kiDpvaOrUSVG1KBwi@(gEi2;+CE(2BFKTr zkw{{=a3I8Z5HEU>gBl}7F)BnoNQ@G~NtCEDs2KHiu;Ibkq_%zX0z^oKU4V@1at}xVSsgg{2s98x z0i`87P=|CzP@qoBE{1k=6SE1Tq0upAr57Nw3-oA4klL8LLy?*qq}u%wE140H(wYV> z&^p+hR0eyMfJ!xx-OEZxM4boMVyI?;GQaIA>6m&Bu zYuGzw!Uba-*gvL_wwL$E#>Pt4*Vm^jz4-qGaiVef^Tgz2`N+)7 z+Ohe~jkn&P-@o)c{&;5(w|j--(PnWr+cYNDK6jnM|g_ga?MPaldmhNOJwv@Obk*qd=OK<`ylmfDJiG`zqbgrGS3S}3{ z-es0m_9(MJ*{keL%igP$4P}*+8>jiBQ`+^UY%FJLnAr?N2&u2H zuU$QEdZq(t1~KTjxuxtIW&snB!@ahfVplF+!UEe$vE5PzW_%Ur?WqF+?i`rbWeyZf z*~a@3qp({Vqw2ajB?Bk>#7zs9GZdc6Wen^WYNfZMUrA^q-!KNe%9{IlW@qm8*&v< zoas4y+3CNna_afZ+#$>O!auhV|m)$e0Ii$kv%n3%%rhPfKqQ3M>+ zpk$1ofN2(Wqc6mjgG@%zJhSLvm$YjsmO?qpwiHc`%cxaMt7$EbP#PxXq^P#3ZGzB9 zM>1aJw!0xQToYHh_FAqsB3DrZY!EN#^1QxkF?8fT;)Qw72WqDXCL(&VWdXtjLNxI+ zsx!{vkPK;YzyyyF50L@|1w#4&vq-$2o+jXcTtK7B&zuB6x9wV9DU8xh#YJ*)V9&yq z9(WF@+`M8B6HzQu1(KM68q^YqYDhzbo)NnMJkp_q^$RlkO44ZFDtQP3q_)MX9H z|3lddtl>ExhrD>#w_Z!8KQ3b>$V8&%f-_ zOD?|X!VAtn@7#0FK5O2YXUskQv{O$x`J@x)oN)Z?5p6m1# zj^Cj5?>>9CPo1KtHMOmEua?QF<|ai> zCK@F%F3<+&VhwxNPnx*L?z`<;$JT;fcHU{n9k$N{u$BZ6T!!Wh0#xT)nh+fe@j2Sgvo40W3iU|wmFIqM?K6)(E^dB@RuKNH0 literal 0 HcmV?d00001 diff --git a/widgets/login_info/skins/xe_solid_enterprise_login/images/signin_input.gif b/widgets/login_info/skins/xe_solid_enterprise_login/images/signin_input.gif new file mode 100644 index 0000000000000000000000000000000000000000..77ac26511304783aedf94b0a1e97b0fc36827fcc GIT binary patch literal 1519 zcmaJ>d3@7k816Wg%L4@k)GTU27e<8pFx7=}qmNN_rx5fKr3y}qEJAU-}mBO@a(FE1-AD={(AVzD?J4wuW7o11I5 z+hb#6Gcz;e;^H8L>FMd&+1Y7nX*iDO=jXF5%k#W0^n|x`&$N#~C`M(pe_Vp!%do|~ zin#b9LA0RFHMJ-ra27PfWCwPym3Ip%WimgiY`BvxD`p7}O^8S0{G{LG_3$c#_&p_} zLi#Nz!$~fl)W(5j3`K$vwb+6t1vZd?Ppc&Jh{*u-EQp3kw9x>KfG`q~2o4~?AdUgE z9s<&2CILiRA5`-ubA_aXqFa4wGYjfgRWFHQrKP2Y(kO!@7h#Yf2n^sDj_WmqUKt~* zj9)J*149-lUSVays|u2c1S~Qx$){RSEz*A^c)Sjw$gL`E#zn;t6lGu~59VjQ7&HJ( z4q^iOLM*%e-VBeY4XvmS{@>vL)4t*ywge26QwadG;dT+%A@j4H`aNh%2y!w9#eN{U;3NRri?BXbDlCjeJcvuyqH^aBMvx3a& zB@Yrjc~WR6!spWzn2csX0m=+1O#^_CNHPIy3~h?C0i)RjqR>_%*Y4zkM4UF!Mw*}? z@jpaN3j+(3S-Y|eEorqJ7`8Q$Hfd`^UevNCYfTo`^4Fh#-2MH|Z@>QX^G`qi@cr%P z@0z~7_088eZ(RTC%P&6v?Ap~&Ke=-G(#IDsod4+D*)tzDHk>~7LH)@S$B!L7Qg`^! z`v+?e?0>K3-F5ibt64|`!~YRVAWMp=`S5)fd2g+f2?nxM<40^@Iwzi(5q*U?%nRcuWOgiojP_1)9J$R zbP8Ttk%4dEcGPt~R4~$+B~-XKR+rp5;Ek-M8LHFxrm@W}2P?fPk^N>JM{UU|!wij8 z>d-COTQ6=NUEfsLw-1F@HZE?sxwGt)SabFE-m$%=B8Ku~g$>PjTgHu_Fmcl4DO0CS z?$9x;t8T#TIdkXDU$Ah|;w9xvmn|>vKcmB}iZyH3t*=^N8MbOe_110MSFBvUWA~oD z6`Qu~+kc>TK+Ud$bw{cW9X)Y!`SJSG4f9Slo~=J~?n2%9i+fEp=kr~K7Nl3`fNl1W15VDvC!V;7+LI@-ZB!vhO6#-=wtVJ9})QaFh zY83sJRRi8IUEj~ z7nPix3;=j6j#gAuR905z?v8-NQEIgYi=(o6avF`sU@$RQvYR^`g&`UYhQ!3g-l(YU#}f!v6Uj0{gQB_kt~ z#g(g6DmtB!nVHG84m9m93u0iu!&?} zxjc$Y3kVKbM5S{993JG#@IsNsv`WO@L>gGi=%tFy8_h*Y5@21j5g zB_$DwBqS0=AQ)Rp1OOZs3y?@8G#Z1$;n8R;9#8P}^h6@j2n333bOwb2`F}TXvo;Ab zIUrH!6~?@$5db0sj@(BE3dl|Nps z*Xsl0QsS)$6-t@ zV*JJPXTLpt^7zri2fyCGclXZiUvAyJ@$>a-SAQD&@yg{(7ccy9espAb=-k=CGp7go z`+9r6KXtPEL|5nWV;${B+ggtt{_fDXEeD$q?BBPysc}!k?r(PO+)=;1?(1z^w`{K6 zRP)uwFE>_LVv#n0=}=0H;?PZF&-%)ihm zVmS-3vqY&YO8VDXI#WLzYTa|X!XnDf#l5j{yBPl)`T9^>)48tzaTO}Gw#f$7XdUO* zA036UJ)SnQGqipG4?BGGe%lEjmFxyLM|7yCf@&ESA)Bd5BV5Y*1Cd%`m-JXm+_&;0 zqF=gyZ}};1e@NXPk;(yiWa+-fq|xKw-Rw*W9lY1S&eo$#7ytB^(as}xdW*EstKrV3 z+uhj`NCUra;=;Ka0-l(2z*q9ml7Iawa31ABjgT6JH+Oa4RPN|1Z*6oE)&rwIrgPiM{i4@R3~zpy(&2KRTFM*D)j--HmuhQSUCDx2$csCQ`F?7gA6vTy*+t)KI~lyg;8Qp4R7APt?H@i{7a?3wS4=2`?8ig>)FdC zRoJm*&n!s!fEjIm>wOvx<`T8uys2SXOT&?)HP`@oVW zN~=?U=bfeCpbM<|UUtWmLS#wz-J+W#CnwL+CQeNRO)?$P25`WY zkh(k^S+4!wrt=E;{e%;Q1$Bwfni_OZd}n6iRxB^EIFVITZQ)w1gIYw&4~>kpbhQpx z!}PUNXPhz*RgIY4I{)&5-w|7z(SX@o?bOgk0JPS%gD*0dg@Hn+mOlKkG3Mz*=Po5o zp!8!g1uuAXi$!Y!uPfHRSYZ`hc%Ew+ks&X=uEgFQa0*YTsr=cnN|t|XHFj2BeWz#^ zZD6doi7?zLjSp=6g4}%qZ|&;B`Rn16e{|1||MmKA1?&CHgRf`(t%6aPrSM0c6Yt+n?nr@H3C-Gy-u1dU^t|tK zxw{s+>1E2^Ki&FfttQt(&zC{}`nuN~<4}A8fWlgfO=)0FiM3zqJf8bO`@+d}fbAa3 z;E)0P+Cba1=2WZrp#fO8uFS*tG(2`@0C8io9Pkj%vdOyP?u9 z1n(fNkvM`;U&uE!x*P}@q((c=cOGtpbq)uFMD>jkC-Ex%^_B z!|AdmVEMLPR{KGfQ+>iAs29D?JX0_YPwdLzv7&*#7} z$yXM$D;HtmJIsE(;?yJx_UiJ^pC}IsI-D^glcRo*LoXJZX=Znu8H5Yzy0W6PO}k4A zgTioZ@$kZF~>9}-vKSL z{StEEnvuxG{;`cc9nBlp(9;RDpNE-c6lT^kla?8mgYUU5$`f&M!_lxq$-h&UJgrW7 zZ&KHnKS)n05hgenm$ltOT#K8cCRNIwclgN}S*qoUPEQt}#6!wImo>m1haGC~89baX zeBM62)V)W&;@hPUt5RRq_w|ziNLl}A((fkOXVlx;Zp>cIS8gfYvX@-O+1i$6!rBoC z&49JlE1qZY!*i}0NFB}m0<~1^Y(92|}=g{{!W)1XzKpPI!I7DmKT&bO`krc8Y(4 zKhs}E+a-?a?7sN(g+6K>1OcD~Hy@6lKKpFf>&Dh$-?*hY{+ebowxiD` z!uCGGV*Xm+3sV!Mnx1HNTCu?XXw7JRvDMgwy=llx$lY_j6H^z9%~60Ex~tzz&{`4; zOJ$OZ%|%(F;n1roTcMUJ%lnh(nWsuUeLshS^C9pbbQ{|(jucmhb-lS@xX}L1>+_En MPQS5+LLm$O13$c_5VA{~l4+B*`{2=A9X4%wlGYv5k~{>5i>LDQYm9vCIr6jNF>&s(ZOgl%?D( zS;~?uDP&C{q-#x-QphA*D3agkce~&3AHRO*kM}+2ywCG|mh-&F*51a*m|hGr1&xD1 z8X7Pt6sDm8Kp+|@6dH}z*4D;gu~;M$2_Oh0$}dQizL(cAlD-QB0##QBBM=BRHL#|p zCW+z<00@%4GYkf2GMTEX>S}5b0D)&RSui+GO&to=K&hyzX~4AA)HNVbO)waMXlSW} zVHyAi2FF5SXfOl;12A9+TpbLksHmx^s6wDfRW&eL8$+ZxW3V_P#Ysg)1&hULYN3>s zl|^~Ey1FVWs~kS&gTqrbV1TEmCmN%R(9%;EslbsQ9*0pVZLE$Z9D&AQumBu!_^=m& zK-AJUa@g;NKxks{W;h&f?=Ma^_It^OE|ymINKGv`5($B7;7PVvJjHsi0}h901_tSp z^_G=-z>3bJi{88TL~!Xo0Sq4C z%{b0tn<8dv>Jb3T*A(Hd??7_kS~8d{yT}m6{zykxpU40oV_(Fc-N3F0YD5q>h{2-+ z5kZ0MP-=uJg6_-lW>7`*jcpYk(0396ue`rw9zvxijKE{9Y{Xd06UHM!FaUUa; zb0WltA%Y_}LUE~cf$%nTv22zMhGj6;cFAZ2?D;COlAE%7u}!g{loSBc`oFia*3j3 zh#Lp{UkCkTOXQx7>A$uWE&eq=gDrA)+PCuC9Ffyu7sdX<>eDcIM;s2jSHF z$%*lIZ^z!e9)0z4WcbC<^TC1szTTd{pLIX&>g;&Z-q!l~QOm>TrpAW)x(Bs2)%WjJ z-L0%BFS}EEyQH|N@YcAWv{)Rt&O#nrG>fKp53OqOsK|2h6ef+J+kPRBIw|8Sd2CrrKO2PzyX*B z6arRPQ&mykskB3JyTUg4t#Yz5(o&LJHcN#D+6Q&@4UJ9B4;#^F8a;e_M`zd5?#^vJJ^XF_!RJFm120|<_H6I%8+rBO-T3p# ziT4xR-i-B64=+sh@v+#0whIHoMUc1*#I7{6G3F&L70B80+Q3i&x%Zmgoos8vL4yBq z>m8q#cnwQ`39;-Z&=F|d%_D7PxldB6oHGl!Eoa2N4QB?2+d>86*Tth{*3>@byJT4= z&41u4VY;);en(u!?!@-y?Y~T@RO@@+Q*xjOb3~vYFr$1j*ao5M%GjLTp zBQ+5VQ@H`*w~tn9+PNwyjLr;$&hNmIP?VkRYd*Ipziw^y^Mdfz)B5`L zbZ(k2N@g#y@SrQT=9pb9qHug@yE*}-GvJqljOLc;FBW4A?WXU8JrNoRH- zBbm0)unH;jI8uq!SRCciAR>-1G?#srJkCTWP`7+}b3tzl-zQODF>P!;Vfzx(H{Pt@ zNHf`PN=i%uUrK6JHQ3D`OZJRaLvE59G#^hpo^S}2&b)gtFV(N44VC8q$T+a`4wUSBZJ9*zQ==5Mf;qi@RH~;s!seZTK=Uoe%dY_*eTg{S! z)3}xp#q)po-%_lYx+M|v5GyRI==aAJ-@Y3uEU8_Z5*FWYS`n63g>|2~d9VFeKvC2D zP;60<6>hqs*DYYWqTAx+^xfewVNm7sM=R6!2K+8IN-z%=7DM{WwinmTmceIgKXu8T zd$8Dl@^(foSu zF>snDXhmLtkRhm?BlB(eI2ySfpHFLOC!O3C+6jL`3w?qX#_P52&i|?_N21Mcernge zYvFI&n7N=Q!f1`x>q^{O+3V`QM(J_mKo>g>o!+|Cd+gju#dDuHs6qdce21mpL*c~+ zL*71uMhRWJ2PX!injb8^5=at0kDgUwe|~))O}IA_fpa_|=3?n3c$?&2Vk;KuoABjb zs{2d+cuK%G<987eyZMvpaa~{DU(M;FPF^i%^M!XVcv0W|mGd!jqP)3eWfB$zSjy$O zpIUwU_`3Yce23x8*M)9d;@YQPch1`4Kvj3Nobj=lwdK)s#Bb}L-|Edo%MPF9m@No} z^oG?fAMQL}ov$J8`TFT8Y+YkXc%gnZt@+j3(!idt)5O!8m5yzCZP>5^?G}J|F!9BS z1~Es4GuxC#SN)yE)jLLiRqTyfAD^iIJneK!o0cWx-rA&GJ^LFeK1=SnU9);SSJGrQ zb8C2Ov&PEoIWxIznP7o9RA%nH9W7fi<-7%S64<&w)l3{^)`H!4XOn9nNEzJFf^ieX z?fmSm^4RVXIejkPQx2&<(E7-r`dPexR1Rdo=sb03E+L{LM`OA5@$Qwm3j(!VS$XF(>rw`pG5$98?H#;Wy?nl$ zkMp6uokjBoc~M%dkQi`xYuT0DU0QfgjQSDOxT@LbMo_kShj&6VOzg`!m>*hH3f^6knk}KYZKj}e| zaY;~Y5o0_TfCjx?E-kf?P8(zPy0`yrSWuB0Dc!NfO1j6eVqQNnxRd2kp62qVA|>x8 z&CymIoGr7n;QlbnMR%d6x79`hoZ8HG?YTD2oG^AY>Gwh)$f>)`~MmlRK?2GWfF~++dS>Sm{=oXLM`V zY}r=&9i+eM5sYf6U;&dn!HFF7_<7N=dgS|Hnyi@2)ep!EDvs@-&bt=W<<4Q`jz76pYha$SHA8EZARZEhzm7}jj&o&z<>&EB@dTn|c zbJleD_KoKs7#5*vone07*GBLyXs_VTXk|U6s)H@qRkehpQRHk-khI~)wDzI#%Bo@q z_Q4!*VwRt81z)EvxI8`Sw%c88VKK|8q^!T}L)HDx4z`Ms;AIKT4`cGNgXvhFJ`m+c zdI9RZh#Q%{v|QaA%sz3wd_idEzH6jU{^_Z288aWRnG8v%Kh2Y+WSz{Pc;-onP!U+n zU7Rqcrp)}E+EtNPoNr19%sO>dzOum9VQM_%f~2I~qFB*D-MdOBfzsQfTNcil%Qg|C zOG{2j!wxojJ{jt-{kB*#uskKJ$n9_R0>llCnVT^M)IK3NOFE_Vq5t94AyXxb9SyS| p#E-4M7?n5NR@wa<`|9fOq+?a}Kn$?lngsR#;s1(TLe*h(u14RG; literal 0 HcmV?d00001 diff --git a/widgets/login_info/skins/xe_solid_enterprise_login/images/signin_key_left_off.gif b/widgets/login_info/skins/xe_solid_enterprise_login/images/signin_key_left_off.gif new file mode 100644 index 0000000000000000000000000000000000000000..be9663460c01ef8ce0f0ac08250f1f15cd410b0f GIT binary patch literal 2692 zcmcIkXIN9&77fLQh=>TJ-`tQ!Ai1fSC>kIX6$BN*5*C zV8e=n)F6V`PzMB5R1l>_qzO`G5}*3s_rCe&{d(uez31$^*4}&Vz3*{b;5wTp&W2%O zEif2?K!7+)2m~Sq1E5eCB9Vl_U`Zr0nM}ds@n|#_g+e0`NDu_At*zm3B*gZHINksN zVzD>?q*+-Z;BXYhhKj{e0nnC2rqJ15bhbAZXM;jplPNYR48fW}L?QtT3kx3~A2gPP zKmwLla7#-o6dG@-TW~anXklTA0Vqfm&I*o%BhUyW7K0^Y0SX*}L83q$NTRbAQ)~qw z-WrVtP-qOq_QYTTTgZ(-BoWB70UT&!=jhB?augWRLTWy_)$`$(cg zBs?iNe;zP5k{=lw7AjMTfymGeawR{~0TfFW0W!XJuQSs@;2T60;s848J^;Fy&Wdmu zz@b5Q5{SzHxNI7O4e{7KTYw2MAUcCdhwSYb5T9euhZx%Wd|RM4TDWu_f2q**do1nA z0Sr{B!uWK0L_`EFf<;q=uctG3JRTil(wR&Os-lWbO5y$nlwntcVw`ILZKrh zWbrr*h6}`V;<6l_crLD7wv!{5%lg4xAXloya*6B*H|Qsq=lYLazH_)ttWt#gC=?rh zbk93bp;9OV6=8t$G7gOa_yx(OiU_5ywBIw8g$HetNnOJgp}@D=@Pqy1pE?t`pUDw$EX!H-0c6xN%pJS^% z{2Y9lTs!UI+OgIf|2j50GCVZ+WuX6aUvE!$*Qd^pnvV9i)|Lww+YpVZz_Vh{B<3|r4+^@V>QGU1VPN}-2xTvro|8`#Pt(!SFu3x))<#P6=ixPN$wpOFx^DnRV{`g^QQ6&s$w}cAvTC=B?bk+xZ2BMa3oR(mQ2$ zOVMb@MQf%%dR+D7>0{&SYLT(1{>96eb+6vkS5L2b{`&2!4=pd+TH9NV-!<2EHuQBo z7qQv%?fdF9{V)R~l>61x((P|VdFpEhO|B1OuwSX~Q_9G5F`KC1;#ddOt>)Q=X;?c7um( zX4%waE;~fK34h*ReR+BIrvCeJE`}4s`i zfIw)K+SnzUkT8?#>#r8PtJn*7`(xDVy7XS6rC0ICdZz5|{yAPIzroq-sxnyAHy$rp zArDW@i0L*hb!)4?sL<3pq~>Axa*o#l&?$xLm-?lm zs;J;gS7TWs)~mR1sIRR$Jy&cHw|`3a^RivZ8O38GgMFH}PfAM0$6*u6jj^Le-TH>E zrsqx@nn|DeTbR0%n|7G{y5qK+tUA{ekJ^-ni=Q4%PKyTA~vn3F}k3VtfT{3H8l;i-%>}d1&z8M37(j-CcZ0m#W9rXeO;t|+3 z6YjjI=7VeE;S&8RfsQRl*Y8_NJQjFsMdp!pm+upg23PR1jw_3IXPw-TKV|)i&9|oD zPev8r&a_}w!W_+1Un!(x%dNf3&mQy*ZqGQf?m~O!iA^2tS*h{)LDM(_Q>R%b344Ms znB;U^Fz~%=qq&q*8%)ix@ z)DsjAwG>=|8BCfRR%+Ocgh~d7r*_{lA{qCTnoaemjT^cNF8x|!xTvY;9e*we8Xx+!n>9XuW9({Q1-k#y%B|A|YW#P-&Uqn8M00CJS)KzmD(ehqLQWy8@Epgrw`##0*Q@P$+>As;4NBrJIwHyxl z%KNZ7a$Z#1vBavO_T%YQ{I=saP8>?T;r!0>#w_VReuuJziaGE<1YHw^1=74WPPKCm}EhpCT5#@Wb)>o z@{!&G`ux$)Pq5>b1DfQLk)vgA#|G-=k9N|xPB8b^Z?abpqo2mYR9J)lR<+(@({0nu z8%KOn3|WH{Q}(GT7<0h3s+0$glE_MSk~ADCvyxdiOHKgR2wlx>Kh`RF+|e zyLSnU(~R68eY8@s9T4Rhy)Kyk+^PeRJZ%#+mSxtt``3trnCy)RD literal 0 HcmV?d00001 diff --git a/widgets/login_info/skins/xe_solid_enterprise_login/images/signin_key_left_on.gif b/widgets/login_info/skins/xe_solid_enterprise_login/images/signin_key_left_on.gif new file mode 100644 index 0000000000000000000000000000000000000000..4c134a5a412d668d7f63d58dac6ed78bfb220460 GIT binary patch literal 2681 zcmc&!c_5Vg8lGWfIVz>XtlxZtVP?!?tP{eFv6q9JPO^-d$xO`B%oI7D4pB;*qlHRT zS|%h^_LyWVNuBN~ofe8p(jZ++lry^N+&^yj-~0aYeZS>--uHRG-}C*vec4XVoQn`N zRv5;Xf5z#54%N1-(WfVFGGiA18ePXL)r5yXoELsk<=c5noeNF-TX6V^pUtzREY zp-}MFw1|iZnl0VWe^q#Rq?cbH7KaOu<}z8nY+pYU6O+iuXdKQQjmDUpTL1tSgVBg3 zBM>Mo79F}nfG)?`X#e88Sewc%17Xn=zqnPx|IwsR%{wp1FG zLbIh%9c^e-hP@+$N&~(IsHrC7t!D(Y*k5aDX0D(>p^!2tl!Sx?asr(!k;PJI&d$yh zsx8IV)<%P{k#7+zIEgl5Ic_cki!bNOgi?i2A_itNa$+Q#6t18~>AzbLNx!8P%gJBb zA#)`nN+L%}p^>SxEzJP~1OGQvB>IMyD}wod>;12Z<)K@od`d81F4-jG@-=YWY$+*& zDdTe#5?QE350cMCjnFfRj#XL!Z{0lxXkl`zqD>z~<-p`R2dCqZJ67D7uU#ytp^8V&JeV03H z1(8%!nZ=h0H}iRHnM4G9X_+DXz83rM=KIR!eP4^icexae7|QIy{>MSjEos~{JN#x_ z&E%W$`C^URWg1&UXFh+Lp87aBF+TRM52No#hKJPe2Hy_6>3{v|Wnb@$=RMueo<4c} z=cBHN5B~V){on81?Yz@*yZzS9w$_&BrW=jdRSosm>S}AMt12t5Ub$ReR(h%AVsTO7 z1?Bm3XU`OzK6Nrb??mqLV@Gqcj~qU9FzdI>1N-;w-IK9EXV@&DCW&!`aEv!QPH;tNEqKHY6g!+6r%JVU7c_00xahBH(7GCd-yCF*>zZfoW?&ArR~&?925;ntjgR*AU&AWdH4{X*+hN@7kTQXYaoK2Qq)l z+P?JgQo5^~*YVsFdHE+#oh~?Y_S|{pg~D?t7d>sTenFS7T&<|Ay6hcP>s?=8d9ALY zw)%SAjfU21O%+YeR~tK9+Hb1vwB4`9;~C56Eqwl>x9{Z(!~XtY!{B%7p`pRy(Rcj| z-weF}F#K^!{b_o7gezUx%}5zB`W%9{@X9cu8kK7+OHViNF{N*K(zY>A-`Me(BF*IF znVSc#LJHTJokX=~Q@OW7-^k8&WP_}p zTppbgQWQ|Q;pv8Gk1*}%8%a8Eug0$_6I9CVe;y+~y2PF7Y}q$8W)og5{A2Zw#}90x zYBo)7jwp-qOsN+QfnwsxvfkEAod5pYiRCZbbLgu|imOL?Mu278d(zQAscSn9op^9I z;A&aigRC<4(~oO6JiaStw(EqC$3IZ5WBzz5#xpCnv;Z5mvN(D4_1yyhe0A>RqJgf< zaoy;rjPaq)OHtjW98Y5lKh<*Y&iZRpjjy|S*kwL1c0y8i* zRs|WPQV4W0y=H=Cyy`=j`vG^gUf%)MyhpeLZf+w5GrK%3h2~j)?8)APO!gMuVXxq$ zeOXusAwM%{nX^UC8p0!YZ8IJO3T1EG(w8G@F*~DW;NtQ6M8ch)@Og=2YtH9xR^P;* zNSen`=BIw%tvt2$qrTwe-Z6diQ@cM`zc$A0g+L)`ZUn15wpDbK^30J90~eI%3I_^{ zD+UINN?U3MbTRHmI~FZy%ZMvk@L`}x+XqG*ENxmAM=EO=OByV{?eKQ6?55V#;FZ>- z9wGuOJ--bNNz1-n6?jrAS9xon+y6Aqgy~l2MQQULutyBC?TXB(o z+cX-IGCwdDWp{5~0;(Ar6AxN3>ISrZ;)A?@*X{@?}nJ$z)$T)2Q(k9|u(Q>t#lM zd=m<|HxCq^FZuZ9(xp7c+p^R)eu=X zT=#IlmVr@K^3>L)n4bXK|Xc?dPX(p^4$yjsy#gc8RRI8+sJ<)~*rma3Lw#P>H3IYn? K&8B*g<$nPU*Abxr literal 0 HcmV?d00001 diff --git a/widgets/login_info/skins/xe_solid_enterprise_login/images/signin_key_right.gif b/widgets/login_info/skins/xe_solid_enterprise_login/images/signin_key_right.gif new file mode 100644 index 0000000000000000000000000000000000000000..3696404332baa74513a8d99c78ddce1d13b2479c GIT binary patch literal 2289 zcmbVMX+RTa8V(4E2#AVY2{4%)1aizIBq0ezLJ|T9!~g-LXiP{ZBtQ<62!UEnxv2-V zb*UE`l~O!*Egprf2dq-Sde(a44eQZ$wVti+Q8r8cRbJYzVE!xd}$dH z4p)Un@lp3tC;+4pi9{xo85b896GOsc!KkQcn3WS94FCXEr_+HT4uT*ICJKkcM?|0% z3MI_U#1UBp0uhfV5Q#C(&COgc7lvV}R4SLto0^&k1VVg#JcGf&PE-`2P$(K2 z8dk1c86AxUKnk5Dqf%)lB_%L(VREv7OeRyQRHag>P%JGjE>@{jLZPs@cyVQA6^q5P z+wE2EVV6kKQd3i5rZgH$1^^I25WQZn)oLjes#aUdX0vfP9G#t8T3QM-WgrMrC^Qn8 zjm1GEN^(pr1CEzwX2~GtLOdZ3i=*ck6h&j>^79u#@zS*PY!*8yS(rzrCSq|kp-@C3 zClg~6WwIQ-zD$yqMW@qAq*yc>L!;3!n8=uzn8?Ve$jIo32n-q>NphXV#-jeOft{GS zC|d@IRW_CDos?`htJLL)4JbiM^+rDUY8#j zR|6)`2a@bOyTNQgY%0KRs4!Z2c0Q=mm`V_yYwq5LKwuJLE9ZkL?gPLbQ)IFr0E-4w z)i9e5u$eSE6Xr6x6o3KKVTjIv-~=ii=CKlZFx_Q_$pN~eSu|Q+u2}MGEZ2$;>TEVM z4}x4>qE*GyOqNoJ?(zf#Gav?o>OxSh)kd4jPBmI_Qwn0ls5eAj)IW=s=;~s4-PpC-K?YybPn& zrZTFL3^5;cDbVzK4Nnr!NaZrbba8xwkWNp9IgEr9F-t6BiRfGwCxtV`6`Rz{4T#Y; z#nt@AWxSK?wt~UziY!Jf`btD2v6u|NWXU}JJ9809-l_L1SM%;%;CFH%S2B>hvH#KN zsV$d#+|#$VbuHc+A2GVzZgJV#W8#;8{^Rd|d-M9|pI*Iu@%-7-AD=w_>!ZK?@bJO? zdw(7uyL;#Mt(!Nlk6yca$ySl&V`n+@Jj_uBETRXOF-n4PUXYIdR|LG?mx3#WYyJq!A zEzM1h4fS=kA39d8{9wiVHP!a2%H=kzWtrJzG*pzA>2;-AM58WIDVHjiEG~YpXi;H7 zzC15CN48L!ot3#DBRx%$Di#S-1j+OHNr^lzCxOjk#xq>M6pczD$HkIjhy*+i!~)S# zkr;GDcvxu2yx_TWW(Um*4Dg@nH^Xp@O%71JcmIKdotgzp zG+!S+Ty~^ivzbt^<(nbxh&CWK;N;nJC(i_Ye=$IpsJo`Se0}uR?NR-hbnM=JGQ`9& zA@Z1y-skyqY~qWbQ((XFP$V?mPl=zA0(;fg`Bnnr=Gyv3hW}u?MkbjyBiJ`{eR`X~ zd$@ImHYphA9BPa39F%YIV5GEq#`%q`j}@h?ZjRzTd z>{y!@vfz})+~eGxzoQ`ZMxS6=-IaZ4K+$*C(Oh>RaGjH%DBQKdBV=N1C=$^A;5$9~ z`F+0d!{bfII5g$c0l;ws<)5VNbL`xw_KV@9w_|YA>HKuXojKQ{~?Jw)+ zc4a=2$r?LRTcf->DLVzj^{BpO+eSKy2h&gQPwc)3fK?6S^Q1tsb+JR#Jm>uaJoe6- zSC2{s%6^()@Yu?U;O6di9ggKeUKjQ(Tt!UtL*ptsM|!rR(CnYCIr`4^_fJerJf42X z;kC}=c$gH+8LIWaHGHSe54`H*E6vy4Z3rt#S2bcPIoq26h3|0>e7kO}g|u};14#Mm z;n?aH0WiLXd096eT*y?l%((yZ;ZE*zilf$7^%PzZyQ?#I^+bf${LE`!rX==M#8Rb4 z7F76Te};E{*!btfvrZ35{Q32})-Wz*)%gV7GM@I&DSv25%{@fCbX88! zqC#agp+Mc5;~dbeCmfRJEledu=(}RuM!ojj#7m@!uU>v?IO6RT9PxO~-km`TD8v{? z@|^>gGyDhLwvdl|J3Ox!UFmS%UEAAHT}qN|t9g7h^fqI~tDB!~^Yp6p2Zp1XP7j6o orH9?E3l#P#(d6Fkf@Zk)ndmh37kJEjQ{`u literal 0 HcmV?d00001 diff --git a/widgets/login_info/skins/xe_solid_enterprise_login/images/signin_key_right_off.gif b/widgets/login_info/skins/xe_solid_enterprise_login/images/signin_key_right_off.gif new file mode 100644 index 0000000000000000000000000000000000000000..ee62e52bc102dd53d60bd0c6b32d0088f8caa6cb GIT binary patch literal 1943 zcmcgsc|cNk9Dk*$Q(LBXOb{LqL{xYO0t!kfAZZ33P|t=Z+Q ztX#)Bw_3F{r)68mI@Y~PJ63D0yVh!R50|w+=KkFGkN1AZ=kq;&-_P$iG))yR)>8mF za0>v~Y&L@dg@@Ax0zqUXhfW7UkU^u-sZ<&SF%bj_3!^ZZEKHciVnswmuq!Jo+3ZM- zMk5xBO(qkHqB@-}Ha51RqJrFJu~>XQAB12U4a9_*Wo2ckAR{+7x3I7f6=>*mhRfxW z$&x@2QmKZH_1HKb4~~h6iH?qTyWJ@%DFp>CyVyR)Nl%giVD)1Y++<%WOz6Y6=sEnQ7M#g4vC100{$;!bOwx4XM#$- zQ&0XAWp10^Fd27(`S?V$RSMnT*9d`TqZG;!s!_E~ft$>!Gwir_hDK+YG1(wCLb4%X zqFds&*etkH54tT=tPY7=3h9kRJ}x20o@E3AyCBZVQYhK80eWI82s;i6VU%Y;MHna& zz?c9P3&dQIk76i-@ewqRhoKT-oCL*4Rdg9dMzb3yNV1ix*RjZ%6f!xTHVJ}|-GyDT zFkzpFV5B|}l#lTFJQBfkOt(7qZl2Y_?Dn9<9R|DE<}?#l(Bn~`PfT-4Au`jyOR(79 zxV1Xqu5w@lVL{w_8-l^8r=)J6TK(Tpi{%a4;mpS0=KHUX9lGf@9LdHV#5B7BC*e#_ zD4RrK$MsIat|N#k-KUsoBAkT7MA$%uRtRHYj@fD?T#hchS}jSlI-Gi|0Z&s(A<_eE zHX9{Mu?oe+abjhxScqXM31a!(TqR+cX2Gq_Zm#hyH@QcyM+z1j z8Ci+j%>}qoWhX3PSIH7{&$-0)=A##iBykg_(rzmXjcaU%GhV z{JFC~oH>2!encm_KjsoT|!-^0LyB;@L$X7Je{m z=8WlXSHU!=!#>qUSS?c~PcoY(PQZd-1ohDJR+eOOxR zP*sXjAx}<{4Ur}$NW}4RA|csW@=C!xZcKC(Cz2h(VnPg%P79|}!rmJ^XyAa*kl_A7 z{od^x7~ubopRZ3JZ?E3H0D$qryXzU^dcL0b8u0Bb8c|$QT2?-UT2-Z+H-EvxYTD3r zbwa|Jnq|vZtjvi_mJClDT_3Q1LqkCQrp;PKU)kmzJ9pJ<<71#wkc+p^ihGzJ@V2rj(=^cE~vG*a)4i2HJS%_A71FAOPs|oDi03x zs@3UwoocEAz}{_3qDq?QRZ`&Fmmeq(2Kw_S9QR&S*EXCIyhc~qTs&7haM;?^ZHwwQ zj#x7?WJyg@|B`cC2ZI{U!8+fPoq?0;q%V{2EFKtizT=SPq4AEdPuQbdTiTmummd(b zb?57VqH%z~NLN$6cB{dc#!p>JRTLKoctzW0H?3d_rY!>%C6ReHUDBDmW=t4L89Jac3y)->no-H~B=jYGhe z1BIQO(uM`Aik|v-pW2i`^l9xoh(7Le()QY>rMzdm1$$03Hgo=?yw7{y=lhC` z`Wz*mMq|;=(`Y;%kHZ1^d;yEamdRuw$OQlnn++fclA4;9p3dTOp^OY31ZD7e{BSs| zR4OeN3yPwprKM7-w56pbBO?QXAc;g$RaM1e0ZmO!b#--OF${nrm&-*EM0Is_Rn@G@ z%9&!ZI1~yM78dIDMM9yF%@MNMoM13mU0oxW%k%Q`Yiolzj#pMz+H5wf)ml?iqtR%B z!H`HK))$qOmrv(%DS6=J5;H$jVm41HpEg4zf?clJaz(C2qXj`wp->bVOl(dThG9;p zGc7G$AjpJaI6a+NRb}P#`AjAY0O7PWW>!`flgUm^r2vA=%uL$LnbM!lbVT z!6>63s05Kn#1um8pYI9aA+g8L9b(WCe!I`*4Y)`T5Mjh^+!>b z<-m5*jf8M7g28B{q#>Zm^xsgodl>Bxlo5aH{a0eYWxkg{$_PI>&u1qnI5(2YtJ3-i zJV5#^Bsq8JFPfcXfb=^_FQA<&hcTeS<#CWf{~+FEQW-t|0Pe99Mx7d@7$~DURC<{L z)#`HeI;m2QVTGthtIg5N3ksxIL1DIDf(^y$Nc%iD;Ry`II)-DF=!mfqE4aN>W*y;k z)e;W9k8}frC97N`YtfC!cPG{{qL!S(5n~Zb3=(PVKN>x>MY$(39kwmC7&boPq1^7H zY(47sAHV#du={Cwl5AFp5g;p&y|FJHR&-M1IMIsf%nUw(1!?B}1IIeqHWPfmV( z;`m1&9y>bF|H1o54!`&Ap@Rqd-g$ffzTUlW?RoQ!*LU~4_UbFUUViDtoiFTo{<&wj zKhyp6wx_mk>FVs*{NxjlZ`!zF{krzHwQE*Cwrb_0E0!-?+8SV)y*?z=Z7nQ>3j z-DB@cOo)#gGdeaVI*LAuM&sO!9=w%Ak!R$-rj5Q`KV@;_lBVY7($=NRmaoXut68fp zYunn_wMRw8Fel_>W|nuwZGCE6T-P((P1@X|?K@w5sjF;~rnqPK?(*076qoh(j#cjK zJ8*EH={=LVApY>c(Zl`m$4|tYIp$O5lV?t!J$JedSlNafEA6YMoPij@#>Gai%9l1SV11%;xxjJQiv0QMRE(8p{ z^|ao`7idY=RW!Vh&P+H4cXTQ)$MP7*R+Zc=4#qR$N))1=-gU@|*t=lbtD|sR)7xQT z?hdOo7gkE&oysci1xJr&4Mq&U|rG}+QdHr@P2fK literal 0 HcmV?d00001 diff --git a/widgets/login_info/skins/xe_solid_enterprise_login/images/signin_win_hr.gif b/widgets/login_info/skins/xe_solid_enterprise_login/images/signin_win_hr.gif new file mode 100644 index 0000000000000000000000000000000000000000..1f852123b348820f94a776e6f983489464cdace2 GIT binary patch literal 1349 zcmaJ>d3e-B6ko7-Va5BT?QDw5(M=}lrrV@l+T9%8B8#=Hf*@)(NxQL|WKFW&w4!J| zQ9!`^!V^V>QpFpkB3^(B-nYg3K&-dm1(UT~`UhX<%a?gG^M3EW-@Nyxu3oHUr1id$ zzSTaTAPCWDl;?Sl<06qrZEdaJ?*{;sl$3~~SXWn9TwENB#fplGe7WJ@HF`$80q~L| zp}D%oO-pi{>VSmWsu^Lde@!n2G$o8pr{gf5=G3GX>$KFS&S}kZXPe9@Sj}Wm?Xs?( z)>TIWuAVY%)(vBlVkT4;$=)`Bft-rd7RDmp0q}fsrlkTJhXEN@kf0)nlR?M?nKD2@ z5)vduz)*mMEFEGYi5TPthP+uy3){$x1HRBIj3pf>%@Ra5o5i!`xM{T#B*QQSqzH-% zAdP_CVK|Z-FznL21zxpfOG`VNX#mfnlrS?+7(yi2 zX@bNdVdZo@etA?pK0HF#2eoadQQZ^#UhUh>9ch(lRBbb3$tqGW9pY+uN1oyU2R1HQ zZ7Ry5D5Y#QcMy-WyeVgN)o|+hFosldMN?Q9p00kR2(owkR$;~7E&yP=mT=bFN>1 zey>0Rg+X{_Hl*zGTd0;jaj=QdVz3QW17*!ZO*UfJfB*jT_g_1A{Q1Z4zy12l&p-A5 zxc!H1-+%Y*H(!7CwcJDoR-*x95OK-pJ)?04A z>BbwbzwX*4ix*w9aKZemubOw|6_;Oj=_OqkUo`i^3+9~P+2Ll}GmdSYmo^PO)po9y zY;92$IU${M_F1#foHg@|8PiWct+}c3)P_^0#iyP;r9M_C3OpB$)YeQ6S68u2WvGG< zmQ$#~@j%(6i4(@3bm9r)N-;kuDJ~j&{Bg$~bM#S19&z|#haNKK;KGAOA9%q2`|Ufb zV4smAd_Moqg4~N$=Ka0b&Q}oYDTsCzmX29BY6n;}UtuP0oY$S&wsunKW=HRHyZh(# u_Yq6F7Q?X%W8)GVQuxv>%bh7JXD(Z?qJ7i$&fcv(?o@p4szScNSG5}>Thddiv.txt'); + trigger.click(function(){ + if(trigger.hasClass('sign_state1')){ + trigger.removeClass('sign_state1').addClass('sign_state2'); + }else{ + trigger.removeClass('sign_state2').addClass('sign_state1'); + } + sign_box.find('>div.signin_window').slideToggle('fast'); + sign_box.find('>div.mbInfo_window').slideToggle('fast'); + }); + + +}); +function completeLogin(ret_obj, response_tags, params, fo_obj) { + var url = current_url.setQuery('act',''); + location.href = url; +} \ No newline at end of file diff --git a/widgets/login_info/skins/xe_solid_enterprise_login/login_form.html b/widgets/login_info/skins/xe_solid_enterprise_login/login_form.html new file mode 100644 index 000000000..84f26f5cc --- /dev/null +++ b/widgets/login_info/skins/xe_solid_enterprise_login/login_form.html @@ -0,0 +1,49 @@ + + + + + + + +
                                                          +{$lang->cmd_login} +
                                                          + + + +
                                                          +
                                                          \ No newline at end of file diff --git a/widgets/login_info/skins/xe_solid_enterprise_login/login_info.html b/widgets/login_info/skins/xe_solid_enterprise_login/login_info.html new file mode 100644 index 000000000..3043148ef --- /dev/null +++ b/widgets/login_info/skins/xe_solid_enterprise_login/login_info.html @@ -0,0 +1,33 @@ + + + + + \ No newline at end of file diff --git a/widgets/login_info/skins/xe_solid_enterprise_login/skin.xml b/widgets/login_info/skins/xe_solid_enterprise_login/skin.xml new file mode 100644 index 000000000..8a52b7dcf --- /dev/null +++ b/widgets/login_info/skins/xe_solid_enterprise_login/skin.xml @@ -0,0 +1,63 @@ + + + XE 기업용 로그인 스킨 + XE Solid Enterprise Login Skin + XE Solid Enterprise Login Skin + XE Solid Enterprise Login Skin + XE标准企业会员登录皮肤 + XE Solid Enterprise Login Skin + XE Solid Enterprise Login Skin + + XE 기업용 레이아웃과 조합하여 쓰이도록 디자인 된 로그인 위젯스킨입니다. + NHN (developers@xpressengine.com) + + + The Skin inherits the style from the XE Solid Enterprise layout, the users are able to login the site conveniently. + Author : developer + + + The Skin inherits the style from the XE Solid Enterprise layout, the users are able to login the site conveniently. + Author : developer + + + The Skin inherits the style from the XE Solid Enterprise layout, the users are able to login the site conveniently. + Author : developer + + + The Skin inherits the style from the XE Solid Enterprise layout, the users are able to login the site conveniently. + Author : developer + + + The Skin inherits the style from the XE Solid Enterprise layout, the users are able to login the site conveniently. + Author : developer + + + The Skin inherits the style from the XE Solid Enterprise layout, the users are able to login the site conveniently. + Author : developer + + 0.1 + 2011-8-26 + http://www.xpressengine.com/ + + + NHN + NHN + NHN + NHN + NHN + NHN + NHN + + + + + 기본 + デフォルト + 默认 + default + Mặc định + 預設 + Varsayılan + + + diff --git a/widgets/login_info/skins/xe_solid_enterprise_login/thumbnail.png b/widgets/login_info/skins/xe_solid_enterprise_login/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..8ec45e1b248ef91ade69a238309595c84d4942fd GIT binary patch literal 10660 zcmaKSbyOYCvM#~hosCOyclY4IT>_hp%LX>?F2M;JBxtbUY%Dkl?(Q1g-2#u_x%b@r z{&?rjS~J}}tLm%j>Thb*^h~t6+6N3&QdAfi7z{-PS1+X_Qgk%825ExKExla^L834)a5T2s`Vf6p6=9&WBfI%OGVETC z;5Tg;7*Po?usP5k1fjA3S=%~^(VVq)(oor2iqYutsdB132|_8b8vIBy-BdSc{@SOz1W=GX#b5M z3vvUx+JYgr&Q4VSAevh^yF|9iOwoaDLo^Jn=S5*~ObaI23I{`t8vSKuE2<*1Dmcl|(obp2Q z{IYUF0$f~Na-7oATtZUvf`a@!(wzMAJiPzbm30QXJA#}b|JJqqUtPKXsQV8U9Kmmv zWkIgC9w1A3S7%46e@$7~_CNa~{U7oETi5bG`y%rnbvfRg;rM4^|F4Dq_pLYf{L}p( z+P)3`hxj0;H@3UJ(fSg!MG6DMK&&V$rR}wJ?2qJSJllA>_;g*CEMM1ZX_VXs?)}Zr zk9fQRi>Rf7#x*$V&#{BsJg6)!-qXh6-Gbtc!n6~S2uqC(pfaZ7;-BTOB3=RO)mjef zrWYrbjAy^hiGLssqf_o-CKg097>QN;TL1F5I`D@HW){!gP#B#CbaAd1vZ{_B9{qkR znQpnM7uxY#{fjwqt3R#75fUK6_BM_fE_69|;+KE;uJcT&5ag;Ksu3O@%%!I4ZXJIm zM7|}rK!_t8$!*meaI5d4|6K?gpDJl}09Ur~Bt zknEBbesKGUD|wdgA3y(;YJNZEkJnG+fmm>Z!4^bdRU@;&e=KiHOwojjviz({|8u%!{MtY_Zc&v$s@c%4o!EHY4=_W z4hO@$;r&*%g*mJE$#Ju`Q%>$Pk;8POM0&2LfvA9GAIb|C@vi*bhx!5=K);n$yt1Mq z$bg^l^TXd4Nh;*8L8hm{=nH_Ok_DL2{AIbC$v(uEcEn;J71m`+EOV4}D>GAaCHCDU zI>&iz{&0-+Bzpf8rDN@11*8QOt%&jg=5T|B&BAAACz%%R)Ve0+R$tUTx`VdN!)ufdkYSJ-bMvokLn&SZ$3UUg2D9TD5UJaRJY6#T4V z$a2?y-$oQKqEuy4ug<#O;^G^gwQF(hg!I+6Vp2{5QHtbV<8x%33tClY3BG{S-~L;l zh;4PEyRP-NvZxHY!C$}Rrb|@q?d@4uL{PHx%b68`3H@++dpnloqW4ma`0&ED1sHYv za2gOhLqrF=C$RRgnQa*pOzhkozXFnqHOnNj#7PWCfVau!AW`7slfYq}m07!=+HR%{ zlAY0Ca`G2RV_?o&EF{m!5=RPl)HQqhMg*x1bV8HTE?SZyn2e7<+ zD{IADfNnbWi*U8MvY9q3^Ox?K&!*?NLm8YLb|E*rf%mpbi_cL!l>Tl-^u0_h zu{iYL$6l_FkA3QRo%|c4m@n|?k*vo zn!M)p1{OieUmhQc)q5%jjHX50*M_9T@` zBQuLddeuPvG^u=1oP8zuHHP%NIgAUCeU461w}U^*L~3jUIc>MOE7$Y458Jiyv_;Kw z_(wL5S67-Q4};UOtj&o_9wjAwyVfvb%srUNy9`*7-lm6wdh^C)INAa=a2CYD+&vj| z)Yt>?QtClxjd6XHZCm$v%E1xIIY7YBY<_^VC>QLozc2`<>tM zQe#C~8H$I7&ZrV}lv0J8T6QrD=)fBp+-g|FBrF(#i6pbPaM5IZr^9wWM;&na1()9s zdYUcVv2Zd27e{~*jF8T5=v&sge>sKH{NNvLVNMwVn}cG20-U2yoGjMn%Q9EM2+dcl zjRTG9m845qDrnMBB*1zL=8PR4+D#O}V6yzq{N>8T#)iR;)fY){IT6`N9IB?OSYMy2 zF{Yb1p8mUzw?R(+{nOL9tn!E4{PjE2+X{ zVdsZ(gYE2E{ncoo&Px<4QdapPoU}YDp17Wt5#`)Fl%MbAw1u;djC%148)mbeVz*|r z#b>-qpk-RyLV}qEr6FB#AN$_XPL>wS|8PKPmQ4ex7oJ0FYcPhACE5`TWe#J1T zFh;yCngZxUqsBNPii%ub`#Xc&QrJHD!Wi^87?F6A``Gx|PEA3xUaYuUEA%`>tOmv- z`wji+F{GGIYt6+4GJDyWO`$q8NnsIk>7mro;e-kO+EIe6$+)O&!sM}pXfhP6g5<2l zB)ZIKoz&l&S5NEexUuu+`1A)DIe*mEO$~vlvNGV%H$pzc1}BisdSPAhDZOO$6Uq~l-b%^vWfl(y;qs6~cns#KpNyJ8=;e7Y>8EOSYwZv*H}nYe z!pVin!VmRzb(dFH?^QBj?BJwT?2lS{BNM`;rLu^DCkj5g;Q5OaZI2l(gH;uZ$}Oot z6OdSrqdx6VPFlfs8hOS2Yk>cf84=qdO7&W`s$b%zUWF}#3?y7M#dRTI(jk$n$fJ(? za6d@p3k-ZRfx4f+9n!vN^@rx337%4S7yRFFA7p)lE=rX(Ri;sd%w-`F#cZ&(D{An? z7fH}uKl}C<*@$u@IXxa&Trkx@tRrQ-DKt4Pms%L`l13QyH|^EMbKIZf4hx$|Jc%wl zn6;wRrl4doAGCuJqQFX6EoL-7xm0pwI4-rfZ;{h&F=#~!Oaf+3O-;p-3FLlAUEqhc zB5W-~`x<{9{Y@qvuX6uE`?@`|)mH604;$MksV$dMA^#7p_qfsV@$m|D($m*e{w#2zq1b4>&8trK z!e1PFU1H12CvCKoi*oO4HZ;}MYdlVt`0VE_L7+@>_Cf?qNpm1@yF~RXzthUX%8IDX zFlFD7cpisy{bW+)%4tBjfR}Rwdf1;e_S(Z1L!|T2P^+HJsV18 zNoO;%T3xHnM1-+MV%62tgZtcPQG0chjjotDwQ7Z+P^XRG+a078Ug=X-dZN^YP8j&KguyE%A@kaR1(@fi+k^e(d4< z;P2nQe)f?;8ivSzm8%W&RtSS-&^<^}AI4~)E_)_`kplUBVqd8EwAfZw)7gCyr))70xwwLM}RO^gCvp~b+BQt^^d@kyT~?P zyP4KmUk%ety^DJfj*pMS+^zr|$UhNq&{$~I_kxaUSn_Et;I2Qt|NN;xfwH=)y!Ca> z_pJ4(%7Di@EnSZe*VX8&8TNxdEA(Pk_3bgC80Jijs4{G!0ibrayDOVInbJ^nZpEvyq9t)rY_)b`sJmonb)SX@A_&zXgJL}Hy{g?nU%HFDSic69878R zJX@;uf2z!^@7X*b4|ut{yyQ;k2NG~@Xm`;!@->p>uEH!qtPZZNUmxf9a(&0_P86%^ zx-Sk&-Si84Vm^PSe0&K#np=g>z9^*pySJSnL6Pub)d_1HjesDv(Rysf|L*bW^eJLI zJ-<}85PxTH-R~+c-Bh@#uArc!YK@tN*yN}vCHzoUO264=lkI3uQFCi&FlFxXlh~70 zB!R92S*ZT>>Pp zV+y)%YxT3Yy&Vo0b8mEy0_*4^Y0XywnAxn&7{$`Ubl`>5SRA_O4$r9&1VQwrzhzqA z1Mcp(htt?PT~08*QP#V;$$syxnf__WogcS){}E?x(efj@0vlW_}DOR*>d$E)2af+)tH01C;SGAqCW@iHy5Ee>HZD=@E>q@wdcZ2>0PhVbMGWyD1D1;?Iq0q<2 z$BtsmVe>lH-o2)E=xG(ln(gcm40|1&*!9F+zRT&#TR~WB`%njZONK!w?|51Cs>1LQ zdxo~?KUW)EgsU^68&ot}P0V)&U;zj*oBbYUgA@#O1E2FGU@e0ns-`30?sxO>-t`D* zpGAEr8s@zq%ZU8Q@QJGWCfH)#ll9ve0ig-LCkvC4@1AgfF)QEPxGxGVHm$ontq8f1 zl9IB{!^pzC8+7S77a>MBd4N+y#zN;$ zgFBQsv5FJ#)gt+uf!$9h7oLg-!ta9u+vWjUh8frAHr0%uTz-AiIjP9Oh4v#CNiZxoRY89IsIzmbuxkO-)TrWA^zflQsY* zQt8ZFJ#@U@Nhw}SE-`{{6@~h3UUY~{kd_CsVQpm<0{@nQnSrD~5nD(T`cKS@dXf6| z$BalG&y(^o@!;X{2?;~C8hc`jW8TUiW)>DlFuKGrx$-JMKC2;&MMQw?XS#R_v8Ac0 zI|2_zDAO49Bc)rcrT#%#grxVmXdbKY!aZ?G zUNZe~EmD8i`@h8I2z7Jy*5kW-dwYNW#8FC6Xc`>VvftVyZ0ghD1_NeKJd8r!`o9$$ z3o!wF$2(2i%tG{a$2!m-) z*!}hf+vK#08vUyaZz>}=9CyNGoPEQz0)BCTSXeN~CD?w`^D;h3+%rPRWved&gRH9a zE($&-+v zr3E&0PcALBIN2!hA^j&hELYCO5~G8C__L3i?JdzI2l5?im=;>T&iVDgV^Eo(zBXh;h$IiKhk4 zSkOv=A8Ty}9XUVhae!iVQ7S>^+BYB3kIf+?kSmXVtd@65M@N8h<|z0&j|fcM8uqI) zyvbDLJx7{4w)YEtkBK}m?S~U;$IEjHNv&0miy?U8=X82??o9K=&2})dT*BAR!^c6D z2ehxZ2bP)|YK-=B-hP|$!(gJ@Vb%ylAl zhhgAsT>%O~cmM$0&+kKEgY(=!UctSqW5J_;WThuZby`R?RK{6yj0$qSUTsVwyGeK7 zeH#Q)@iwE%&2HQyS_qo%*z_c8s%Vbhfk`Y4GqaG9=-C~Y3hb?>G1}HdRtmV|zpM=M ze7`qbU)I`9$U?6q#cx4Q%NGYClSB!16&4$8-JNBzL~iYF3lYN$1Z^^+24tK>R+!#v z3Bqk+ZGT)kHahD($q_JJtuAJ7Ij|StaQo8PXqJYdrozIgke{kxUud>XY?2SK_4YPZ zi-tfO!S@?|S->g)U4W3eA?*%^2_ z;9B(IX!i7ZT2xGV6nBV+k}&qr9wGqSys&O*kq}iDG&N^a-_u{t%F-s=A@+qT*!W1Q z%WlV5Moac%Uehj=EN#D9-1U_OsbM8VNN?>?qN?*Z87k!TX*RIkaQ0B8^LgyduLY95 z<6ORSow81$(Ds%X+k1K~edNk+LIv_3M$s^02VlI5RLriboA8TK07o9gj_x{?QN;qg zlaqKHV)x5|&;*v&UFG!-psP}4+2O#h*~>#>fryPsukp*X{aGu}M0|FQ-SaeX%lhk5 z^UN^-r8#7<)9<8n6)G&}lzO;zLMi%M&|&j;^z&~78uq5i=BERsyv6A6Z2E04>(!$L z!fI!}d#URZW^oLx`Y!W1o~lH&YNq=utN3!f5l02&OdT$^Ql6(jIgA6JVtOP8_JDSG z9p|4r9i96zH|ycCL^Hs}f<61J{dIs30R!2}S?~D2KarsZk(?cWJ@wr%($f)rq70N6 z__ITxrVqJ#bZ&>a_fkIL+zt-TU!+n3`#w>$RiTR+zqW)o!FkAnZBDy(z}WS!b#@vO2v7ChZSC1$*m@fn=ylz>_Px5<{(*iu@Mg6ilToj#T`XbD@N%|o zk25mxYJgG=IsJ9q+4KyvAth>apmQgN@7EO6O#D1FJwA-#%NXR6WSWpI;|o{Sr?H`< zYL}NQr1drRQ`3e|rn==KZiicn`!n^O0rxl1N&=RuVGmW~zl}yy<*yf4{V&w2Ms9np z^erv*)kXp*3um2o%L15W(pIDc@1uB7=`B^W>d&W)J%^f;hf7)vU!MeC_rjOHfaX`f z6e>*Zm5-SpqT{yPrtnux z^tQ0ZOVQz_^<61aY2-`J6QTVmOf-_gNzJ!11=){#56xcaaGvjYjLno|LWB>9DQU1N zb)8pURwFN~tPqF3ZXiXj3$AEuEgy^xDvl54ekp-6;khxyDc=`nh9fW~ms^O{k&%6JPTO4zicDGKpba){eJ7T<^g%SD0wWg zQ8G96cxm=CJ=rMP*@>?GCLG{;G2+1G;ku00kLkR4`?5J*zTB(-H_4S3ADLO*~_9mRBOOnbUkel3&2qkk3i89+6 z$}~*Y%OJHEzkRu-eJ5ur>D5LO`ir#zbya1twZrD_Pp}=1s4R9bpDn44c_v-^zFRjS zLnX37FqB#m6`B!R6ee4Gw@Z>{wM<%GC_lX(cyUBNedYyT1wAC;A$`oPTx>fS?0mT@ z`mI=7e{ur?>F7k7y)5UMNz9DZ)Rt1>o4$k?RcGFXBhGv~*D?7Jcac>T6W4#_y`ZAM0 z)N?}!P-tjB2$$Ozt}U`SXYjr46;Ana6f=QU;=A#aY6=)9?Cc$HE{5wNtwC+V?{Dz#S^~wV|^x=iI?uxe-E5}iz}RrDAupG0^dmf z-2Xk`Vj|rwwUu-B=UrJRg?ak(PTBiT-+r22Gx7+s(LVoT&%kXnz2BIQe%79Bd$h{v zR6;Y_8f(}JpA511v~z`*t3GEh8R(hlP$nHhC2sEOg#?~249t2*``^{FkIYe-T{h<#1pT_~&UU!}yEv?NbGaa<5-23c^ zWJ=#2R6vftytp={;;ReMasYcF6Wsva(XSo%tz^3iA18ZU{%WaF=qBN>danCBx8LYW z;H998DYWSR9hOOWt!^w&rpgcFM1+PggZD%}jIFi4*yG(O<#^DsM0fqLQpL9+#5IR^ zk^J1hh5ASBqQ-{?J9bJ9Nr?`B#CN3t2g^MIcTDIg@G^xUvg4v%Zwx_O4%R7X*Cu0- z%d#I)HL)tjCozK^f_k8Eoh5j}zkb!Snk7aeXA$#=;l zFKRFD7>-P{WA~zBtB(W4m|{0a=~;}w(bJGgg_#1m6{3~(!EJKc$dOyZyIzLz6+eer zESLZY4}DjO<;i{q(~8s?B?|tD#+1gX1;8|(G6gNghaD}Ep?91(pMRyXo1k_PGp7C_ z(KcDX?AL?-!m|XEMZDTr{>H;qXC{MnO3E*2?@gS&kVaKhQ0%klYKHysi<+DPwnuS6 z9y_r-EL2LcXx|kW_%N5=P@-wOj7PaiP zIUH%L{;)=X-Q}5@#(>+Q{EG9p&Ffq$rRe*=8sfCQy`TKGm0~RuDN2)}X^DtVR$fgU z(=1cB=TLJ_qy`;1C9R67ajp5_+tLq0p@fWff}V@t^!0q8pC@i?2=Wv)f5&wEj6PU( z#vmgJU8|E~E|N?m-JUAN^4))O`H>$tksA9rKkJaEwRbT0Gw4!Cj^X=4VX*k{HF&dd zJgKFWpD#?PmQwHQ`*|N|BzuB?jl$ZMmuRk^{7^q!r2DrWx3&o6cySr}G2ioi(fJwZ zBr?sQulRm8uhquy9M1WpPC@NZM_Px5MRWeH>}aW;q5d3M=g8=fNf@o{$UJplK4}eD z4<1|gLD4KR-M%$qO8nJ=Efdlb{>^KlcpV(qM!~vdW`I7;Yax!VIX6B0NP+#;UTk6W zzyb-$`#GgIGcC8;g!060ByA3}C#{9(O; z(3_a~da(VwrG3pbqnG%DbUrkV5RD${%dQJfMB);>BCKq8xG3Typ`(3Uu>@m;QS%$g&GNOJ-x(vi5vo2@W52B~{ zYH-_5Wrw5LSCl(|jT^FhC8^Mb^kn%hH&9d<{7F_fsDSL8n(i3c6}G!!eB7{6`c+^1 zg*|A?C8?-jp|*)kq#7qVwKg9r^Yeo%@hlx3UQUHV9sSJBedH0NHtyE^=bxXveV-kk zih5D4YIxX+HZlrY77~y(xm$^;6$H2H%9-c1AXSQ;@`|wB-p3-jPmZmlAoYi7Ju5Y~xPlut^@>eH&uo&E{9oUln& z81*RF=8AK)K}V3Wd=MIdjNlvaTkpS*%XG$;tSXlnj@Iq*qKT1_{SUAWPX7fW$R6pdh=Dq;HZ>L#7X8tT&}e3zkF5r? z`|j$*CQzhB0nY+{h<(IN#XLN=9U+p@veG@B9)XF$P?IOmw$v6?wWOAK=Ru;2_9BB2 zzv01l1d0gS6ok?j07n;Q>EOlzqFy!aElF_TjF0XxVik4~9I5Qg8`q^B{5o*po#>hA zy?q~pJ@k<&-0)+&{$Gp=Ofi2JzO0n8mruANtaXW51F6!s2SSh%>xkn|YowX?HKo@B zbq#l9rdRI&$_vqv8I3DYV4YY#e4YQX+Qe!m*3JfP6j4V{iW@vmy=>8)N&7n z(qI^jA}##teImKmZ^ZvJaSxc=E38GkGR^9#T>f)e;`3v6nwstxm9}l`&?khH=qm21 z_Mf!^HrYw&5t9U!6})uq{BFi!Bj)miOt=dVw@20zl8Y2-g*Mx?HQZTnn#3B>JhPUz zL^+}Z_{s6;)gwMrRC#|*#7I7lO+&_HaiHY%{O1HJn9tG-elSUJ^9-Co8=emrincWk+8s-=Zk;V>t`|?yhKiv1;RKw2}1k}mQ zj#@@{Cfh+NE-tRns~#I21wBX5x;?_qcGY#_q~r^E{5rTIQ)Rqr>3-Xo8y*{rxZZk2 bO literal 0 HcmV?d00001 From da50b4b73262f332524a647ec4ed408632523c3e Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Tue, 8 Nov 2011 06:51:45 +0000 Subject: [PATCH 1327/1372] resize_image closing action(scroll, resize) removed. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9808 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- addons/resize_image/js/resize_image.js | 3 --- addons/resize_image/js/resize_image.min.js | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/addons/resize_image/js/resize_image.js b/addons/resize_image/js/resize_image.js index 44ca9b51e..be1e197eb 100644 --- a/addons/resize_image/js/resize_image.js +++ b/addons/resize_image/js/resize_image.js @@ -132,10 +132,7 @@ function getScreen() { }; // 스크린을 닫는 상황 - $(document).scroll(xScreen.xeHide); $(document).keydown(xScreen.xeHide); - $(window).resize(xScreen.xeHide); - $(window).scroll(xScreen.xeHide); } else { controls = $("#xe_gallery_controls"); imgframe = $("#xe_gallery_holder"); diff --git a/addons/resize_image/js/resize_image.min.js b/addons/resize_image/js/resize_image.min.js index 702f20aa2..659fd9f56 100644 --- a/addons/resize_image/js/resize_image.min.js +++ b/addons/resize_image/js/resize_image.min.js @@ -1,7 +1,7 @@ /** * @brief 화면내에서 상위 영역보다 이미지가 크면 리사이즈를 하고 클릭시 원본을 보여줄수 있도록 변경 **/ -(function($){var xScreen=null;function getScreen(){var body=$(document.body);var controls,imgframe,closebtn,prevbtn,nextbtn;if(!xScreen){xScreen=$("
                                                          ").attr("id","xe_gallery_screen").css({position:"absolute",display:"none",backgroundColor:"black",zIndex:500,opacity:0.5});controls=$("
                                                          ").attr("id","xe_gallery_controls").css({position:"absolute",display:"none",overflow:"hidden",zIndex:510});closebtn=$("").attr("id","xe_gallery_closebtn").attr("src",request_uri+"addons/resize_image/iconClose.png").css({top:"10px"}).click(function(){xScreen.xeHide()}).appendTo(controls);prevbtn=$("").attr("id","xe_gallery_prevbtn").attr("src",request_uri+"addons/resize_image/iconLeft.png").css("left","10px").click(function(){xScreen.xePrev()}).appendTo(controls);nextbtn=$("").attr("id","xe_gallery_nextbtn").attr("src",request_uri+"addons/resize_image/iconRight.png").css("right","10px").click(function(){xScreen.xeNext()}).appendTo(controls);controls.find("img").attr({width:60,height:60,className:"iePngFix"}).css({position:"absolute",width:"60px",height:"60px",zIndex:530,cursor:"pointer"});imgframe=$("").attr("id","xe_gallery_holder").css("border","7px solid white").css("zIndex",520).appendTo(controls).draggable();body.append(xScreen).append(controls);xScreen.xeShow=function(){var clientWidth=$(window).width();var clientHeight=$(window).height();$("#xe_gallery_controls,#xe_gallery_screen").css({display:"block",width:clientWidth+"px",height:clientHeight+"px",left:$(document).scrollLeft(),top:$(document).scrollTop()});closebtn.css("left",Math.round((clientWidth-60)/2)+"px");$("#xe_gallery_prevbtn,#xe_gallery_nextbtn").css("top",Math.round((clientHeight-60)/2)+"px");this.xeMove(0);};xScreen.xeHide=function(event){xScreen.css("display","none");controls.css("display","none");};xScreen.xePrev=function(){this.xeMove(-1);};xScreen.xeNext=function(){this.xeMove(1);};xScreen.xeMove=function(val){var clientWidth=$(window).width();var clientHeight=$(window).height();this.index+=val;prevbtn.css("visibility",(this.index>0)?"visible":"hidden");nextbtn.css("visibility",(this.index").attr("id","xe_gallery_screen").css({position:"absolute",display:"none",backgroundColor:"black",zIndex:500,opacity:0.5});controls=$("
                                                          ").attr("id","xe_gallery_controls").css({position:"absolute",display:"none",overflow:"hidden",zIndex:510});closebtn=$("").attr("id","xe_gallery_closebtn").attr("src",request_uri+"addons/resize_image/iconClose.png").css({top:"10px"}).click(function(){xScreen.xeHide()}).appendTo(controls);prevbtn=$("").attr("id","xe_gallery_prevbtn").attr("src",request_uri+"addons/resize_image/iconLeft.png").css("left","10px").click(function(){xScreen.xePrev()}).appendTo(controls);nextbtn=$("").attr("id","xe_gallery_nextbtn").attr("src",request_uri+"addons/resize_image/iconRight.png").css("right","10px").click(function(){xScreen.xeNext()}).appendTo(controls);controls.find("img").attr({width:60,height:60,className:"iePngFix"}).css({position:"absolute",width:"60px",height:"60px",zIndex:530,cursor:"pointer"});imgframe=$("").attr("id","xe_gallery_holder").css("border","7px solid white").css("zIndex",520).appendTo(controls).draggable();body.append(xScreen).append(controls);xScreen.xeShow=function(){var clientWidth=$(window).width();var clientHeight=$(window).height();$("#xe_gallery_controls,#xe_gallery_screen").css({display:"block",width:clientWidth+"px",height:clientHeight+"px",left:$(document).scrollLeft(),top:$(document).scrollTop()});closebtn.css("left",Math.round((clientWidth-60)/2)+"px");$("#xe_gallery_prevbtn,#xe_gallery_nextbtn").css("top",Math.round((clientHeight-60)/2)+"px");this.xeMove(0);};xScreen.xeHide=function(event){xScreen.css("display","none");controls.css("display","none");};xScreen.xePrev=function(){this.xeMove(-1);};xScreen.xeNext=function(){this.xeMove(1);};xScreen.xeMove=function(val){var clientWidth=$(window).width();var clientHeight=$(window).height();this.index+=val;prevbtn.css("visibility",(this.index>0)?"visible":"hidden");nextbtn.css("visibility",(this.index
                                                          ');function doResize(contentWidth,count){if(!count)count=0;if(count>=10)return;var $img=this;var beforSize={'width':$img.width(),'height':$img.height()};if(!beforSize.width||!beforSize.height){setTimeout(function(){doResize.call($img,contentWidth,++count)},200);return;} From 499c586a74fbbf1959791d53d69484992f8ec292 Mon Sep 17 00:00:00 2001 From: ovclas Date: Wed, 9 Nov 2011 01:36:49 +0000 Subject: [PATCH 1328/1372] issue 850 admin favorite bug fix. not use self auto_increment git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9809 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/admin.admin.controller.php | 14 +++++++++++++- modules/admin/admin.class.php | 23 +++++++++++++++++++++++ modules/admin/queries/insertFavorite.xml | 2 ++ modules/admin/schemas/admin_favorite.xml | 1 + 4 files changed, 39 insertions(+), 1 deletion(-) diff --git a/modules/admin/admin.admin.controller.php b/modules/admin/admin.admin.controller.php index c18751ca6..353274717 100644 --- a/modules/admin/admin.admin.controller.php +++ b/modules/admin/admin.admin.controller.php @@ -276,10 +276,12 @@ /** * @brief Insert favorite **/ - function _insertFavorite($siteSrl, $module) + function _insertFavorite($siteSrl, $module, $type = 'module') { + $args->adminFavoriteSrl = getNextSequence(); $args->site_srl = $siteSrl; $args->module = $module; + $args->type = $type; $output = executeQuery('admin.insertFavorite', $args); return $output; } @@ -294,6 +296,16 @@ return $output; } + /** + * @brief Delete favorite + **/ + function _deleteAllFavorite() + { + $args = null; + $output = executeQuery('admin.deleteAllFavorite', $args); + return $output; + } + function procAdminRemoveIcons(){ $iconname = Context::get('iconname'); $file_exist = FileHandler::readFile(_XE_PATH_.'files/attach/xeicon/'.$iconname); diff --git a/modules/admin/admin.class.php b/modules/admin/admin.class.php index a37b25917..f0c4d5d8b 100644 --- a/modules/admin/admin.class.php +++ b/modules/admin/admin.class.php @@ -19,6 +19,9 @@ * @brief if update is necessary it returns true **/ function checkUpdate() { + $oDB = &DB::getInstance(); + if(!$oDB->isColumnExists("admin_favorite", "type")) return true; + return false; } @@ -27,6 +30,26 @@ * @return new Object **/ function moduleUpdate() { + $oDB = &DB::getInstance(); + if(!$oDB->isColumnExists("admin_favorite", "type")) + { + $oAdminAdminModel = &getAdminModel('admin'); + $output = $oAdminAdminModel->getFavoriteList(); + $favoriteList = $output->get('favoriteList'); + + $oDB->dropColumn('admin_favorite', 'admin_favorite_srl'); + $oDB->addColumn('admin_favorite',"admin_favorite_srl","number",11,0); + if(is_array($favoriteList)) + { + $oAdminAdminController = &getAdminController('admin'); + $oAdminAdminController->_deleteAllFavorite(); + foreach($favoriteList AS $key=>$value) + { + $oAdminAdminController->_insertFavorite($value->site_srl, $value->module); + } + } + $oDB->addColumn('admin_favorite',"type","varchar",30, 'module'); + } return new Object(); } diff --git a/modules/admin/queries/insertFavorite.xml b/modules/admin/queries/insertFavorite.xml index 6a878bcdc..084e5a0bb 100644 --- a/modules/admin/queries/insertFavorite.xml +++ b/modules/admin/queries/insertFavorite.xml @@ -3,7 +3,9 @@ + + diff --git a/modules/admin/schemas/admin_favorite.xml b/modules/admin/schemas/admin_favorite.xml index 04d273008..301d7e979 100644 --- a/modules/admin/schemas/admin_favorite.xml +++ b/modules/admin/schemas/admin_favorite.xml @@ -2,4 +2,5 @@ +
                                                          From 6c636cdf7cfe824162d737e1ce07fb4bb9581921 Mon Sep 17 00:00:00 2001 From: ovclas Date: Wed, 9 Nov 2011 01:48:33 +0000 Subject: [PATCH 1329/1372] issue 850 fix favorite bug git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9810 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/queries/deleteAllFavorite.xml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 modules/admin/queries/deleteAllFavorite.xml diff --git a/modules/admin/queries/deleteAllFavorite.xml b/modules/admin/queries/deleteAllFavorite.xml new file mode 100644 index 000000000..20770685f --- /dev/null +++ b/modules/admin/queries/deleteAllFavorite.xml @@ -0,0 +1,5 @@ + + + + + From 8847acd86cd5794806a81047b51e4b2c3c59673b Mon Sep 17 00:00:00 2001 From: flyskyko Date: Wed, 9 Nov 2011 01:51:56 +0000 Subject: [PATCH 1330/1372] issue 850, changed ordering of update sequence git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9811 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/admin/admin.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/admin/admin.class.php b/modules/admin/admin.class.php index f0c4d5d8b..8b106134d 100644 --- a/modules/admin/admin.class.php +++ b/modules/admin/admin.class.php @@ -39,6 +39,7 @@ $oDB->dropColumn('admin_favorite', 'admin_favorite_srl'); $oDB->addColumn('admin_favorite',"admin_favorite_srl","number",11,0); + $oDB->addColumn('admin_favorite',"type","varchar",30, 'module'); if(is_array($favoriteList)) { $oAdminAdminController = &getAdminController('admin'); @@ -48,7 +49,6 @@ $oAdminAdminController->_insertFavorite($value->site_srl, $value->module); } } - $oDB->addColumn('admin_favorite',"type","varchar",30, 'module'); } return new Object(); } From 027dcc83df9fcfc34692e81432f2b0e7e9506a50 Mon Sep 17 00:00:00 2001 From: chschy Date: Wed, 9 Nov 2011 10:12:11 +0000 Subject: [PATCH 1331/1372] issue 780, problem of member info modify page in xe_solid_enterprise theme git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9812 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- themes/xe_solid_enterprise/modules/member/member_info.html | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/themes/xe_solid_enterprise/modules/member/member_info.html b/themes/xe_solid_enterprise/modules/member/member_info.html index 0124fe8d3..e0c5ffdd2 100644 --- a/themes/xe_solid_enterprise/modules/member/member_info.html +++ b/themes/xe_solid_enterprise/modules/member/member_info.html @@ -58,11 +58,9 @@ -
                                                          {zdate($memberInfo[last_login],"Y-m-d")}
                                                          -
                                                          - + {$lang->cmd_modify_member_info} {$lang->cmd_leave} From 9b4f219a0c9bf86103dce072f9cd4229a5ee8e3a Mon Sep 17 00:00:00 2001 From: unryong Date: Thu, 10 Nov 2011 10:05:00 +0000 Subject: [PATCH 1332/1372] issue 995 fixed the login_info widget: login_form.html and login_info.html markup git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9813 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- .../skins/xe_global/css/default.css | 86 +++++++++---------- .../skins/xe_global/login_form.html | 12 +-- .../skins/xe_global/login_info.html | 4 +- .../skins/xe_globalTwo/css/default.css | 66 +++++++------- .../skins/xe_globalTwo/login_form.html | 12 +-- .../skins/xe_globalTwo/login_info.html | 4 +- .../xe_solid_enterprise_login/login_form.html | 6 +- 7 files changed, 95 insertions(+), 95 deletions(-) diff --git a/widgets/login_info/skins/xe_global/css/default.css b/widgets/login_info/skins/xe_global/css/default.css index 2e0f3105c..35c5e7c81 100644 --- a/widgets/login_info/skins/xe_global/css/default.css +++ b/widgets/login_info/skins/xe_global/css/default.css @@ -1,54 +1,54 @@ .login_default { margin:0; padding:0; border:none; position:relative; _padding-top:2px; display:block;} *:first-child+html body .login_default { padding-top:2px;} .login_default legend { display:none; width:0; height:0; overflow:hidden; font-size:0;} -.login_default form { position:relative; padding:25px 0 24px 0; width:161px; margin:0 auto} +form .login_default { position:relative; padding:25px 0 24px 0; width:161px; margin:0 auto} .login_default h2{ margin:0; font-size:14px; margin-bottom:8px;} -.login_default form .idpwWrap { overflow:hidden; clear:both;} -.login_default form .idpw { float:left;} -.login_default form .idpw input { border:1px solid #c9c9c9; color:#282828; width:149px; background:#fbfbfb; padding:1px 5px; margin-bottom:2px; font:.9em Tahoma; margin-bottom:6px;} -.login_default form .login_mod{margin:14px 0 6px 0; padding:0} +form .login_default .idpwWrap { overflow:hidden; clear:both;} +form .login_default .idpw { float:left;} +form .login_default .idpw input { border:1px solid #c9c9c9; color:#282828; width:149px; background:#fbfbfb; padding:1px 5px; margin-bottom:2px; font:.9em Tahoma; margin-bottom:6px;} +form .login_default .login_mod{margin:14px 0 6px 0; padding:0} -.login_default form p.securitySignIn { clear:both; padding:0 0 0 18px; margin:4px 0 0 0; } -.login_default form p.noneSSL { background:url("../images/none_ssl.png") no-repeat left top; } -.login_default form p.SSL { background:url("../images/ssl.png") no-repeat left top; } -.login_default form p.noneSSL a { color:#BF6801; text-decoration:none; } -.login_default form p.SSL a { color:#9CAC74; text-decoration:none; } +form .login_default p.securitySignIn { clear:both; padding:0 0 0 18px; margin:4px 0 0 0; } +form .login_default p.noneSSL { background:url("../images/none_ssl.png") no-repeat left top; } +form .login_default p.SSL { background:url("../images/ssl.png") no-repeat left top; } +form .login_default p.noneSSL a { color:#BF6801; text-decoration:none; } +form .login_default p.SSL a { color:#9CAC74; text-decoration:none; } -.login_default form p.save { margin:0; clear:both; padding:0;} -.login_default form p.save input { vertical-align:middle; margin:0;_margin:-3px;} -*:first-child+html body .login_default form p input { margin:-3px; } -.login_default form p.save label { font:.9em; color:#999999;} -.login_default form ul.help { margin:0;overflow:hidden; padding:.5em 0 0 0; white-space:nowrap; list-style:none; } -.login_default form ul.help li { display:block; padding:0 3px 0 0; background:url(../images/default/bu_v1.gif) no-repeat 0 50%; } -.login_default form ul.help li.first-child { padding-left:0; margin-bottom:3px; } -.login_default form ul.help li a {color:#54564b; font:.9em; white-space:nowrap; text-decoration:none; padding-left:9px; } -.login_default form ul.help li.first-child a { color:#54564b; text-decoration:none;} -.login_default form ul.help li a:hover { text-decoration:underline; } -.login_default form .userName { position:relative;overflow:hidden; padding:0 0 6px 0; margin-top:-5px; *zoom:1} -.login_default form .userName strong { color:#282828; margin:7px 0 0 2px; font:bold .9em Tahoma; display:inline-block} -.login_default form .userName a { position:relative; right:0px;} -.login_default form .userName img { border:none; } -.login_default form .userName .u_name{display:inline-block;width:100px;float:left;} -.login_default form .userName .u_name div{display:inline-block;} -.login_default form .userName .sign_btn{float:right;} -.login_default form ul.userMenu { margin:0; position:relative; padding:0 0 6px 4px; margin-top:10px;} -.login_default form ul.userMenu li { list-style:none; padding-left:10px; background:url(../images/default/bu_v1.gif) no-repeat left 7px;margin-bottom:5px;} -.login_default form ul.userMenu li a { color:#54564b; text-decoration:none;} -.login_default form ul.userMenu li a:hover { text-decoration:underline;} -.login_default form p.latestLogin { margin:0; color:#999999; font:.9em;} -.login_default form p.latestLogin span { font:1em Tahoma;} +form .login_default p.save { margin:0; clear:both; padding:0;} +form .login_default p.save input { vertical-align:middle; margin:0;_margin:-3px;} +*:first-child+html body form .login_default p input { margin:-3px; } +form .login_default p.save label { font:.9em; color:#999999;} +form .login_default ul.help { margin:0;overflow:hidden; padding:.5em 0 0 0; white-space:nowrap; list-style:none; } +form .login_default ul.help li { display:block; padding:0 3px 0 0; background:url(../images/default/bu_v1.gif) no-repeat 0 50%; } +form .login_default ul.help li.first-child { padding-left:0; margin-bottom:3px; } +form .login_default ul.help li a {color:#54564b; font:.9em; white-space:nowrap; text-decoration:none; padding-left:9px; } +form .login_default ul.help li.first-child a { color:#54564b; text-decoration:none;} +form .login_default ul.help li a:hover { text-decoration:underline; } +form .login_default .userName { position:relative;overflow:hidden; padding:0 0 6px 0; margin-top:-5px; *zoom:1} +form .login_default .userName strong { color:#282828; margin:7px 0 0 2px; font:bold .9em Tahoma; display:inline-block} +form .login_default .userName a { position:relative; right:0px;} +form .login_default .userName img { border:none; } +form .login_default .userName .u_name{display:inline-block;width:100px;float:left;} +form .login_default .userName .u_name div{display:inline-block;} +form .login_default .userName .sign_btn{float:right;} +form .login_default ul.userMenu { margin:0; position:relative; padding:0 0 6px 4px; margin-top:10px;} +form .login_default ul.userMenu li { list-style:none; padding-left:10px; background:url(../images/default/bu_v1.gif) no-repeat left 7px;margin-bottom:5px;} +form .login_default ul.userMenu li a { color:#54564b; text-decoration:none;} +form .login_default ul.userMenu li a:hover { text-decoration:underline;} +form .login_default p.latestLogin { margin:0; color:#999999; font:.9em;} +form .login_default p.latestLogin span { font:1em Tahoma;} img.login_mask { width:201px; height:5px; background:#ffffff; display:block;} .openid_login_default { margin:0; padding:0; border:2px solid #d9d9d9; width:196px; position:relative; _padding-top:2px; display:block; } *:first-child+html body .openid_login_default { padding-top:2px;} .openid_login_default legend { display:none; width:0; height:0; overflow:hidden; font-size:0;} -.openid_login_default form { position:relative; border:1px solid #cacaca; padding:11px 11px 7px 11px; width:172px; } -.openid_login_default form .idpwWrap { overflow:hidden; clear:both; width:172px;} -.openid_login_default form .idpw { float:left;} -.openid_login_default form .idpw p { margin:0; padding:0; margin-bottom:5px; background: url(../images/openid_login_bg.gif) left no-repeat; padding-left:18px; font-size:.9em Tahoma;color:#999999} -.openid_login_default form .idpw input { border:1px solid #c9c9c9; color:#282828; width:105px; background:#fbfbfb; padding:1px 5px; margin-bottom:2px; font:.9em Tahoma; } -.openid_login_default form .login { float:right;} -.openid_login_default form p.save { margin:0; padding:0; clear:both; padding:.3em 0;} -.openid_login_default form p.save input { vertical-align:middle; _margin:-3px;} -*:first-child+html body .openid_login_default form p input { margin:-3px; } -.openid_login_default form p.save label { font:.9em; color:#999999;} +form .openid_login_default { position:relative; border:1px solid #cacaca; padding:11px 11px 7px 11px; width:172px; } +form .openid_login_default .idpwWrap { overflow:hidden; clear:both; width:172px;} +form .openid_login_default .idpw { float:left;} +form .openid_login_default .idpw p { margin:0; padding:0; margin-bottom:5px; background: url(../images/openid_login_bg.gif) left no-repeat; padding-left:18px; font-size:.9em Tahoma;color:#999999} +form .openid_login_default .idpw input { border:1px solid #c9c9c9; color:#282828; width:105px; background:#fbfbfb; padding:1px 5px; margin-bottom:2px; font:.9em Tahoma; } +form .openid_login_default .login { float:right;} +form .openid_login_default p.save { margin:0; padding:0; clear:both; padding:.3em 0;} +form .openid_login_default p.save input { vertical-align:middle; _margin:-3px;} +*:first-child+html body form .openid_login_default p input { margin:-3px; } +form .openid_login_default p.save label { font:.9em; color:#999999;} diff --git a/widgets/login_info/skins/xe_global/login_form.html b/widgets/login_info/skins/xe_global/login_form.html index e4bb1faff..b59e6ce3d 100644 --- a/widgets/login_info/skins/xe_global/login_form.html +++ b/widgets/login_info/skins/xe_global/login_form.html @@ -16,9 +16,9 @@ xAddEventListener(window, "load", function(){ doFocusUserId("fo_login_widget"); }); +
                                                          + - - +
                                                          + +
                                                          {$lang->cmd_login} -
                                                          @@ -45,5 +45,5 @@ var keep_signed_msg = "{$lang->about_keep_signed}";
                                                          - - \ No newline at end of file + + \ No newline at end of file From 518a8a2f5976a39fa918bcdcb8015a479d32ff61 Mon Sep 17 00:00:00 2001 From: taggon Date: Tue, 15 Nov 2011 09:25:34 +0000 Subject: [PATCH 1333/1372] Reformat cache handler code git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9814 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/cache/CacheHandler.class.php | 238 +++++++++++++-------------- 1 file changed, 119 insertions(+), 119 deletions(-) diff --git a/classes/cache/CacheHandler.class.php b/classes/cache/CacheHandler.class.php index e310014e7..6196e6be8 100644 --- a/classes/cache/CacheHandler.class.php +++ b/classes/cache/CacheHandler.class.php @@ -1,130 +1,130 @@ use_object_cache =='apc') $type = 'apc'; - else if(substr($info->use_object_cache,0,8)=='memcache'){ - $type = 'memcache'; - $url = $info->use_object_cache; - } - }else if($target == 'template'){ - if($info->use_template_cache =='apc') $type = 'apc'; - else if(substr($info->use_template_cache,0,8)=='memcache'){ - $type = 'memcache'; - $url = $info->use_template_cache; - } + function CacheHandler($target, $info=null) { + if(!$info) $info = Context::getDBInfo(); + if($info){ + if($target == 'object'){ + if($info->use_object_cache =='apc') $type = 'apc'; + else if(substr($info->use_object_cache,0,8)=='memcache'){ + $type = 'memcache'; + $url = $info->use_object_cache; } + }else if($target == 'template'){ + if($info->use_template_cache =='apc') $type = 'apc'; + else if(substr($info->use_template_cache,0,8)=='memcache'){ + $type = 'memcache'; + $url = $info->use_template_cache; + } + } - if($type){ - $class = 'Cache' . ucfirst($type); - include_once sprintf('%sclasses/cache/%s.class.php', _XE_PATH_, $class); - $this->handler = call_user_func(array($class,'getInstance'), $url); - $this->keyGroupVersions = $this->handler->get('key_group_versions', 0); - if(!$this->keyGroupVersions) { - $this->keyGroupVersions = array(); - $this->handler->put('key_group_versions', $this->keyGroupVersions, 0); - } + if($type){ + $class = 'Cache' . ucfirst($type); + include_once sprintf('%sclasses/cache/%s.class.php', _XE_PATH_, $class); + $this->handler = call_user_func(array($class,'getInstance'), $url); + $this->keyGroupVersions = $this->handler->get('key_group_versions', 0); + if(!$this->keyGroupVersions) { + $this->keyGroupVersions = array(); + $this->handler->put('key_group_versions', $this->keyGroupVersions, 0); } } } - - function isSupport(){ - if($this->handler && $this->handler->isSupport()) return true; - return false; - } - - function get($key, $modified_time = 0){ - if(!$this->handler) return false; - return $this->handler->get($key, $modified_time); - } - - function put($key, $obj, $valid_time = 0){ - if(!$this->handler) return false; - return $this->handler->put($key, $obj, $valid_time); - } - - function delete($key){ - if(!$this->handler) return false; - return $this->handler->delete($key); - } - - function isValid($key, $modified_time){ - if(!$this->handler) return false; - return $this->handler->isValid($key, $modified_time); - } - - function truncate(){ - if(!$this->handler) return false; - return $this->handler->truncate(); - } - - /** - * Function used for generating keys for similar objects. - * - * Ex: 1:document:123 - * 1:document:777 - * - * This allows easily removing all object of type "document" - * from cache by simply invalidating the group key. - * - * The new key will be 2:document:123, thus forcing the document - * to be reloaded from the database. - */ - function getGroupKey($keyGroupName, $key){ - if(!$this->keyGroupVersions[$keyGroupName]){ - $this->keyGroupVersions[$keyGroupName] = 1; - $this->handler->put('key_group_versions', $this->keyGroupVersions, 0); - } - - return $this->keyGroupVersions[$keyGroupName] . ':' . $keyGroupName . ':' . $key; - } - - function invalidateGroupKey($keyGroupName){ - $this->keyGroupVersions[$keyGroupName]++; - $this->handler->put('key_group_versions', $this->keyGroupVersions, 0); - } - } - - class CacheBase{ - function get($key, $modified_time = 0){ - return false; - } - - function put($key, $obj, $valid_time = 0){ - return false; - } - - function isValid($key, $modified_time = 0){ - return false; - } - - function isSupport(){ - return false; - } - - function truncate(){ - return false; - } } -?> + + function isSupport(){ + if($this->handler && $this->handler->isSupport()) return true; + return false; + } + + function get($key, $modified_time = 0){ + if(!$this->handler) return false; + return $this->handler->get($key, $modified_time); + } + + function put($key, $obj, $valid_time = 0){ + if(!$this->handler) return false; + return $this->handler->put($key, $obj, $valid_time); + } + + function delete($key){ + if(!$this->handler) return false; + return $this->handler->delete($key); + } + + function isValid($key, $modified_time){ + if(!$this->handler) return false; + return $this->handler->isValid($key, $modified_time); + } + + function truncate(){ + if(!$this->handler) return false; + return $this->handler->truncate(); + } + + /** + * Function used for generating keys for similar objects. + * + * Ex: 1:document:123 + * 1:document:777 + * + * This allows easily removing all object of type "document" + * from cache by simply invalidating the group key. + * + * The new key will be 2:document:123, thus forcing the document + * to be reloaded from the database. + */ + function getGroupKey($keyGroupName, $key){ + if(!$this->keyGroupVersions[$keyGroupName]){ + $this->keyGroupVersions[$keyGroupName] = 1; + $this->handler->put('key_group_versions', $this->keyGroupVersions, 0); + } + + return $this->keyGroupVersions[$keyGroupName] . ':' . $keyGroupName . ':' . $key; + } + + function invalidateGroupKey($keyGroupName){ + $this->keyGroupVersions[$keyGroupName]++; + $this->handler->put('key_group_versions', $this->keyGroupVersions, 0); + } +} + +class CacheBase{ + function get($key, $modified_time = 0){ + return false; + } + + function put($key, $obj, $valid_time = 0){ + return false; + } + + function isValid($key, $modified_time = 0){ + return false; + } + + function isSupport(){ + return false; + } + + function truncate(){ + return false; + } +} + +/* End of file : CacheHandler.class.php */ From c9cd22517cd4d4103a20b1bf9669fcff4c13c8a7 Mon Sep 17 00:00:00 2001 From: ngleader Date: Wed, 16 Nov 2011 05:43:33 +0000 Subject: [PATCH 1334/1372] Issue 1025 adding phpunit.xml git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9815 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- tests/Bootstrap.php | 0 tests/classes/template/TemplateHandlerTest.php | 4 ++-- tests/classes/validator/ValidatorTest.php | 8 ++++---- tests/phpunit.xml | 13 +++++++++++++ 4 files changed, 19 insertions(+), 6 deletions(-) create mode 100644 tests/Bootstrap.php create mode 100644 tests/phpunit.xml diff --git a/tests/Bootstrap.php b/tests/Bootstrap.php new file mode 100644 index 000000000..e69de29bb diff --git a/tests/classes/template/TemplateHandlerTest.php b/tests/classes/template/TemplateHandlerTest.php index 364a22500..6ab37f3ef 100644 --- a/tests/classes/template/TemplateHandlerTest.php +++ b/tests/classes/template/TemplateHandlerTest.php @@ -2,8 +2,8 @@ define('__DEBUG__', 1); define('_XE_PATH_', str_replace('tests/classes/template/TemplateHandlerTest.php', '', strtr(__FILE__, '\\', '/'))); -require _XE_PATH_.'/classes/file/FileHandler.class.php'; -require _XE_PATH_.'/classes/template/TemplateHandler.class.php'; +require_once _XE_PATH_.'/classes/file/FileHandler.class.php'; +require_once _XE_PATH_.'/classes/template/TemplateHandler.class.php'; $_SERVER['SCRIPT_NAME'] = '/xe/index.php'; diff --git a/tests/classes/validator/ValidatorTest.php b/tests/classes/validator/ValidatorTest.php index 04751f6f8..caf1c1b07 100644 --- a/tests/classes/validator/ValidatorTest.php +++ b/tests/classes/validator/ValidatorTest.php @@ -2,10 +2,10 @@ define('__DEBUG__', 1); $xe_path = realpath(dirname(__FILE__).'/../../../'); -require "{$xe_path}/classes/xml/XmlParser.class.php"; -require "{$xe_path}/classes/handler/Handler.class.php"; -require "{$xe_path}/classes/file/FileHandler.class.php"; -require "{$xe_path}/classes/validator/Validator.class.php"; +require_once "{$xe_path}/classes/xml/XmlParser.class.php"; +require_once "{$xe_path}/classes/handler/Handler.class.php"; +require_once "{$xe_path}/classes/file/FileHandler.class.php"; +require_once "{$xe_path}/classes/validator/Validator.class.php"; error_reporting(E_ALL & ~E_NOTICE); diff --git a/tests/phpunit.xml b/tests/phpunit.xml new file mode 100644 index 000000000..11f818271 --- /dev/null +++ b/tests/phpunit.xml @@ -0,0 +1,13 @@ + + + + . + ./classes/db/ + ./classes/security/ + + + + + + + From b2fdd16f6e378da8a6b55826685c2e52afc243a4 Mon Sep 17 00:00:00 2001 From: chschy Date: Wed, 16 Nov 2011 05:59:12 +0000 Subject: [PATCH 1335/1372] issue 997, modified logo url in xe-solid-enterprise layout git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9816 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- .../layouts/xe_solid_enterprise/layout.html | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/themes/xe_solid_enterprise/layouts/xe_solid_enterprise/layout.html b/themes/xe_solid_enterprise/layouts/xe_solid_enterprise/layout.html index 018cc4ccc..4542dd1be 100644 --- a/themes/xe_solid_enterprise/layouts/xe_solid_enterprise/layout.html +++ b/themes/xe_solid_enterprise/layouts/xe_solid_enterprise/layout.html @@ -6,13 +6,12 @@ {@ $layout_info->use_banner = 'demo';} -
                                                            From 186a6b640c1c5dc7803644259ab4d6dd38ea9578 Mon Sep 17 00:00:00 2001 From: ovclas Date: Wed, 16 Nov 2011 06:56:49 +0000 Subject: [PATCH 1336/1372] issue 83 added patch for mobile check git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9817 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/mobile/Mobile.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/mobile/Mobile.class.php b/classes/mobile/Mobile.class.php index b80f34527..694038406 100644 --- a/classes/mobile/Mobile.class.php +++ b/classes/mobile/Mobile.class.php @@ -55,7 +55,7 @@ class Mobile { function isMobileCheckByAgent() { - return !!preg_match('/(iPod|iPhone|Android|BlackBerry|SymbianOS|SCH-M\d+|Googlebot-Mobile)/',$_SERVER['HTTP_USER_AGENT']); + return !!preg_match('/(iPod|iPhone|Android|BlackBerry|SymbianOS|SCH-M\d+|SPH-M\d+|Windows Phone|Dorothy Browser|Googlebot-Mobile)/',$_SERVER['HTTP_USER_AGENT']); } function setMobile($ismobile) From 585e07e1dcd49a21ff44b77017d502f3d7c7808c Mon Sep 17 00:00:00 2001 From: chschy Date: Wed, 16 Nov 2011 06:58:57 +0000 Subject: [PATCH 1337/1372] issue 1014 added moving url after logout git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9818 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/member/member.controller.php | 3 ++- modules/member/member.view.php | 13 +++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/modules/member/member.controller.php b/modules/member/member.controller.php index b81fc626d..861c5aa31 100644 --- a/modules/member/member.controller.php +++ b/modules/member/member.controller.php @@ -352,7 +352,8 @@ $oModuleModel = &getModel('module'); $config = $oModuleModel->getModuleConfig('member'); - if($config->after_logout_url) Context::set('redirect_url', $config->after_logout_url); + if($config->after_logout_url) + $output->redirect_url = $config->after_logout_url; return $output; } diff --git a/modules/member/member.view.php b/modules/member/member.view.php index 7c2466943..f3eb4c149 100644 --- a/modules/member/member.view.php +++ b/modules/member/member.view.php @@ -66,8 +66,9 @@ unset($member_info->email_host); if(!$member_info->member_srl) return $this->dispMemberSignUpForm(); - - Context::set('memberInfo', get_object_vars($member_info)); + + $memberInfo =get_object_vars($member_info); + Context::set('memberInfo', $memberInfo ); $extendForm = $oMemberModel->getCombineJoinForm($member_info); unset($extendForm->find_member_account); @@ -310,8 +311,12 @@ **/ function dispMemberLogout() { $oMemberController = &getController('member'); - $oMemberController->procMemberLogout(); - $this->setRedirectUrl(getNotEncodedUrl('act', '')); + $output = $oMemberController->procMemberLogout(); + if(!$output->redirect_url) + $this->setRedirectUrl(getNotEncodedUrl('act', '')); + else + $this->setRedirectUrl($output->redirect_url); + return; } From f493c3def1e2f803f629dbc923018071fb25ce2b Mon Sep 17 00:00:00 2001 From: chschy Date: Wed, 16 Nov 2011 07:56:11 +0000 Subject: [PATCH 1338/1372] restored origin code (code of r9818) git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9819 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/member/member.view.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/member/member.view.php b/modules/member/member.view.php index f3eb4c149..5fb4016f4 100644 --- a/modules/member/member.view.php +++ b/modules/member/member.view.php @@ -67,8 +67,7 @@ if(!$member_info->member_srl) return $this->dispMemberSignUpForm(); - $memberInfo =get_object_vars($member_info); - Context::set('memberInfo', $memberInfo ); + Context::set('memberInfo', get_object_vars($member_info)); $extendForm = $oMemberModel->getCombineJoinForm($member_info); unset($extendForm->find_member_account); From 05e8acdb84fa459905766908f0bc1d37670e3bea Mon Sep 17 00:00:00 2001 From: ovclas Date: Wed, 16 Nov 2011 08:03:59 +0000 Subject: [PATCH 1339/1372] issue 88 addon install improve git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9820 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/addon/addon.admin.controller.php | 4 ++-- modules/addon/addon.class.php | 23 ++++++++--------------- 2 files changed, 10 insertions(+), 17 deletions(-) diff --git a/modules/addon/addon.admin.controller.php b/modules/addon/addon.admin.controller.php index ae7a07a5f..3a3209e7f 100644 --- a/modules/addon/addon.admin.controller.php +++ b/modules/addon/addon.admin.controller.php @@ -158,9 +158,9 @@ * @brief Add-on * Adds Add to DB **/ - function doInsert($addon, $site_srl = 0, $gtype = 'site') { + function doInsert($addon, $site_srl = 0, $gtype = 'site', $isUsed = 'N') { $args->addon = $addon; - $args->is_used = 'N'; + $args->is_used = $isUsed; if($gtype == 'global') return executeQuery('addon.insertAddon', $args); $args->site_srl = $site_srl; return executeQuery('addon.insertSiteAddon', $args); diff --git a/modules/addon/addon.class.php b/modules/addon/addon.class.php index 1fb73b09b..d7c03e2d1 100644 --- a/modules/addon/addon.class.php +++ b/modules/addon/addon.class.php @@ -13,24 +13,17 @@ function moduleInstall() { // Register to add a few $oAddonController = &getAdminController('addon'); - $oAddonController->doInsert('autolink'); + $oAddonController->doInsert('autolink', 0, 'site', 'Y'); $oAddonController->doInsert('blogapi'); - $oAddonController->doInsert('counter'); - $oAddonController->doInsert('member_communication'); - $oAddonController->doInsert('member_extra_info'); - $oAddonController->doInsert('mobile'); - $oAddonController->doInsert('referer'); - $oAddonController->doInsert('resize_image'); + $oAddonController->doInsert('counter', 0, 'site', 'Y'); + $oAddonController->doInsert('member_communication', 0, 'site', 'Y'); + $oAddonController->doInsert('member_extra_info', 0, 'site', 'Y'); + $oAddonController->doInsert('mobile', 0, 'site', 'Y'); + $oAddonController->doInsert('referer', 0, 'site', 'Y'); + $oAddonController->doInsert('resize_image', 0, 'site', 'Y'); $oAddonController->doInsert('openid_delegation_id'); $oAddonController->doInsert('point_level_icon'); - // To add a few changes to the default activation state - $oAddonController->doActivate('autolink'); - $oAddonController->doActivate('counter'); - $oAddonController->doActivate('member_communication'); - $oAddonController->doActivate('member_extra_info'); - $oAddonController->doActivate('mobile'); - $oAddonController->doActivate('referer'); - $oAddonController->doActivate('resize_image'); + $oAddonController->makeCacheFile(0); return new Object(); } From 50fc5fe25ef7d7e728a3ad64ff593a90424f39c0 Mon Sep 17 00:00:00 2001 From: ovclas Date: Wed, 16 Nov 2011 08:20:12 +0000 Subject: [PATCH 1340/1372] delete referer addon, when install addon git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9824 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/addon/addon.class.php | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/addon/addon.class.php b/modules/addon/addon.class.php index d7c03e2d1..3e95b9bb7 100644 --- a/modules/addon/addon.class.php +++ b/modules/addon/addon.class.php @@ -19,7 +19,6 @@ $oAddonController->doInsert('member_communication', 0, 'site', 'Y'); $oAddonController->doInsert('member_extra_info', 0, 'site', 'Y'); $oAddonController->doInsert('mobile', 0, 'site', 'Y'); - $oAddonController->doInsert('referer', 0, 'site', 'Y'); $oAddonController->doInsert('resize_image', 0, 'site', 'Y'); $oAddonController->doInsert('openid_delegation_id'); $oAddonController->doInsert('point_level_icon'); From 3b9e71ea69890c5010ed34433572721979a78ea0 Mon Sep 17 00:00:00 2001 From: chschy Date: Wed, 16 Nov 2011 08:20:52 +0000 Subject: [PATCH 1341/1372] issue 1026, activated url to redirect after sign in git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9825 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/member/member.controller.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/modules/member/member.controller.php b/modules/member/member.controller.php index 861c5aa31..02044fab4 100644 --- a/modules/member/member.controller.php +++ b/modules/member/member.controller.php @@ -35,7 +35,6 @@ $oModuleModel = &getModel('module'); $config = $oModuleModel->getModuleConfig('member'); - if($config->after_login_url) $this->setRedirectUrl($config->after_login_url); // Check change_password_date $limit_date = $config->change_password_date; @@ -50,7 +49,13 @@ } if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) { - $returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'mid', Context::get('mid'), 'act', ''); + + if(!$config->after_login_url) { + $returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'mid', Context::get('mid'), 'act', ''); + } else { + $returnUrl = $config->after_login_url; + } + $this->setRedirectUrl($returnUrl); return; } From 5af206c9a78c2b4eeb7776bb991cf288669af545 Mon Sep 17 00:00:00 2001 From: ovclas Date: Wed, 16 Nov 2011 09:25:16 +0000 Subject: [PATCH 1342/1372] issue 89 apply patch double quotes change to single quotes. Defined by the user be able to add meta tags git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9826 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/context/Context.class.php | 71 ++++++++++++++++++-------- classes/display/HTMLDisplayHandler.php | 14 +++-- common/tpl/common_layout.html | 6 +++ 3 files changed, 68 insertions(+), 23 deletions(-) diff --git a/classes/context/Context.class.php b/classes/context/Context.class.php index 2261c02af..6c18e5c9a 100644 --- a/classes/context/Context.class.php +++ b/classes/context/Context.class.php @@ -131,12 +131,12 @@ class Context { $oSessionModel = &getModel('session'); $oSessionController = &getController('session'); session_set_save_handler( - array(&$oSessionController,"open"), - array(&$oSessionController,"close"), - array(&$oSessionModel,"read"), - array(&$oSessionController,"write"), - array(&$oSessionController,"destroy"), - array(&$oSessionController,"gc") + array(&$oSessionController, 'open'), + array(&$oSessionController, 'close'), + array(&$oSessionModel, 'read'), + array(&$oSessionController, 'write'), + array(&$oSessionController, 'destroy'), + array(&$oSessionController, 'gc') ); } session_start(); @@ -239,7 +239,7 @@ class Context { $oInstallController->makeConfigFile(); } - if(!$db_info->time_zone) $db_info->time_zone = date("O"); + if(!$db_info->time_zone) $db_info->time_zone = date('O'); $GLOBALS['_time_zone'] = $db_info->time_zone; if($db_info->qmail_compatibility != 'Y') $db_info->qmail_compatibility = 'N'; @@ -359,7 +359,7 @@ class Context { $url_info = parse_url($url); $url_info['query'].= ($url_info['query']?'&':'').'SSOID='.session_id(); $redirect_url = sprintf('%s://%s%s%s?%s',$url_info['scheme'],$url_info['host'],$url_info['port']?':'.$url_info['port']:'',$url_info['path'], $url_info['query']); - header("location:".$redirect_url); + header('location:'.$redirect_url); return false; } // for sites requesting SSO validation @@ -370,13 +370,13 @@ class Context { setcookie(session_name(), $session_name); $url = preg_replace('/([\?\&])$/','',str_replace('SSOID='.$session_name,'',Context::getRequestUrl())); - header("location:".$url); + header('location:'.$url); return false; // send SSO request } else if($_COOKIE['sso']!=md5(Context::getRequestUri()) && !Context::get('SSOID')) { setcookie('sso',md5(Context::getRequestUri()),0,'/'); $url = sprintf("%s?default_url=%s", $default_url, base64_encode(Context::getRequestUrl())); - header("location:".$url); + header('location:'.$url); return false; } } @@ -654,7 +654,7 @@ class Context { if(!count($_REQUEST)) return; foreach($_REQUEST as $key => $val) { - if($val === "" || Context::get($key)) continue; + if($val === '' || Context::get($key)) continue; $val = $this->_filterRequestVar($key, $val); if($this->getRequestMethod()=='GET'&&isset($_GET[$key])) $set_to_vars = true; @@ -710,15 +710,15 @@ class Context { * @return filtered value **/ function _filterRequestVar($key, $val, $do_stripslashes = 1) { - if( ($key == "page" || $key == "cpage" || substr($key,-3)=="srl")) return !preg_match('/^[0-9,]+$/',$val)?(int)$val:$val; + if( ($key == 'page' || $key == 'cpage' || substr($key,-3)=='srl')) return !preg_match('/^[0-9,]+$/',$val)?(int)$val:$val; if(is_array($val) && count($val) ) { foreach($val as $k => $v) { - if($do_stripslashes && version_compare(PHP_VERSION, "5.9.0", "<") && get_magic_quotes_gpc()) $v = stripslashes($v); + if($do_stripslashes && version_compare(PHP_VERSION, '5.9.0', '<') && get_magic_quotes_gpc()) $v = stripslashes($v); $v = trim($v); $val[$k] = $v; } } else { - if($do_stripslashes && version_compare(PHP_VERSION, "5.9.0", "<") && get_magic_quotes_gpc()) $val = stripslashes($val); + if($do_stripslashes && version_compare(PHP_VERSION, '5.9.0', '<') && get_magic_quotes_gpc()) $val = stripslashes($val); $val = trim($val); } return $val; @@ -739,7 +739,7 @@ class Context { **/ function _setUploadedArgument() { if($this->getRequestMethod() != 'POST') return; - if(!preg_match("/multipart\/form-data/i",$_SERVER['CONTENT_TYPE'])) return; + if(!preg_match('/multipart\/form-data/i',$_SERVER['CONTENT_TYPE'])) return; if(!$_FILES) return; foreach($_FILES as $key => $val) { @@ -936,7 +936,7 @@ class Context { // HTTP Request가 아니면 패스 if(!isset($_SERVER['SERVER_PROTOCOL'])) return ; - if(Context::get('_use_ssl') == "always") $ssl_mode = ENFORCE_SSL; + if(Context::get('_use_ssl') == 'always') $ssl_mode = ENFORCE_SSL; if($domain) $domain_key = md5($domain); else $domain_key = 'default'; @@ -975,7 +975,7 @@ class Context { elseif($url_info['port']==80) unset($url_info['port']); } - $url[$ssl_mode][$domain_key] = sprintf("%s://%s%s%s",$use_ssl?'https':$url_info['scheme'], $url_info['host'], $url_info['port']&&$url_info['port']!=80?':'.$url_info['port']:'',$url_info['path']); + $url[$ssl_mode][$domain_key] = sprintf('%s://%s%s%s',$use_ssl?'https':$url_info['scheme'], $url_info['host'], $url_info['port']&&$url_info['port']!=80?':'.$url_info['port']:'',$url_info['path']); return $url[$ssl_mode][$domain_key]; } @@ -1228,7 +1228,7 @@ class Context { if($loaded_plugins[$plugin_name]) return; $loaded_plugins[$plugin_name] = true; - $plugin_path = "./common/js/plugins/$plugin_name/"; + $plugin_path = './common/js/plugins/'.$plugin_name.'/'; $info_file = $plugin_path.'plugin.load'; if(!is_readable($info_file)) return; @@ -1315,14 +1315,14 @@ class Context { * @brief returns the path of the config file that contains database settings **/ function getConfigFile() { - return _XE_PATH_."files/config/db.config.php"; + return _XE_PATH_.'files/config/db.config.php'; } /** * @brief returns the path of the config file that contains FTP settings **/ function getFTPConfigFile() { - return _XE_PATH_."files/config/ftp.config.php"; + return _XE_PATH_.'files/config/ftp.config.php'; } /** @@ -1383,5 +1383,36 @@ class Context { if(substr($path,-1)!='/') $path .= '/'; return $path; } + + /** + * @brief returns the list of meta tags + **/ + function getMetaTag() { + is_a($this,'Context')?$self=&$this:$self=&Context::getInstance(); + + if(!is_array($self->meta_tags)) $self->meta_tags = array(); + + $ret = array(); + $map = &$self->meta_tags; + + foreach($map as $key=>$val) { + list($name, $is_http_equiv) = explode("\t", $key); + $ret[] = array('name'=>$name, 'is_http_equiv'=>$is_http_equiv, 'content' => $val); + } + + return $ret; + } + + /** + * @brief Add the meta tag + **/ + function addMetaTag($name, $content, $is_http_equiv = false) { + is_a($this,'Context')?$self=&$this:$self=&Context::getInstance(); + + $key = $name."\t".($is_http_equiv ? '1' : '0'); + $map = &$self->meta_tags; + + $map[$key] = $content; + } } ?> diff --git a/classes/display/HTMLDisplayHandler.php b/classes/display/HTMLDisplayHandler.php index 6bfc71dcb..5b35a2dde 100644 --- a/classes/display/HTMLDisplayHandler.php +++ b/classes/display/HTMLDisplayHandler.php @@ -63,13 +63,13 @@ class HTMLDisplayHandler { if(file_exists($edited_layout_css)) Context::loadFile(array($edited_layout_css,'all','',100)); } - if(!$layout_path) $layout_path = "./common/tpl"; - if(!$layout_file) $layout_file = "default_layout"; + if(!$layout_path) $layout_path = './common/tpl'; + if(!$layout_file) $layout_file = 'default_layout'; $output = $oTemplate->compile($layout_path, $layout_file, $edited_layout_file); if(__DEBUG__==3) $GLOBALS['__layout_compile_elapsed__'] = getMicroTime()-$start; - if(preg_match('/MSIE/i',$_SERVER['HTTP_USER_AGENT']) && (Context::get("_use_ssl")=='optional'||Context::get("_use_ssl")=="always")) { + if(preg_match('/MSIE/i',$_SERVER['HTTP_USER_AGENT']) && (Context::get('_use_ssl') == 'optional' || Context::get('_use_ssl') == 'always')) { Context::addHtmlFooter(''); } } @@ -138,6 +138,7 @@ class HTMLDisplayHandler { else { $this->_loadJSCSS(); + $this->_addMetaTag(); $output = $oTemplate->compile('./common/tpl', 'common_layout'); } @@ -228,4 +229,11 @@ class HTMLDisplayHandler { } } } + + function _addMetaTag() + { + $oContext =& Context::getInstance(); + $oContext->addMetaTag('Content-Type', 'text/html; charset=UTF-8', true); + $oContext->addMetaTag('imagetoolbar', 'no'); + } } diff --git a/common/tpl/common_layout.html b/common/tpl/common_layout.html index 7980238e9..2b006b4dc 100644 --- a/common/tpl/common_layout.html +++ b/common/tpl/common_layout.html @@ -12,6 +12,12 @@ + {@ $meta_tags = Context::getMetaTag() } + + + + + From 339b2de797c829adf0f5ce7ab7433542bc79ff5a Mon Sep 17 00:00:00 2001 From: ovclas Date: Thu, 17 Nov 2011 01:46:59 +0000 Subject: [PATCH 1343/1372] issue 90 apply patch. show security login message by config status git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9827 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/context/Context.class.php | 10 ++++++++++ widgets/login_info/login_info.class.php | 8 ++++++-- widgets/login_info/skins/xe_global/login_form.html | 4 +--- widgets/login_info/skins/xe_globalTwo/login_form.html | 4 +--- widgets/login_info/skins/xe_official/login_form.html | 2 +- .../skins/xe_solid_enterprise_login/login_form.html | 6 ++---- 6 files changed, 21 insertions(+), 13 deletions(-) diff --git a/classes/context/Context.class.php b/classes/context/Context.class.php index 6c18e5c9a..a2486ecde 100644 --- a/classes/context/Context.class.php +++ b/classes/context/Context.class.php @@ -282,6 +282,16 @@ class Context { return $self->db_info; } + /** + * @brief return ssl status + * @return none|always|optional + **/ + function getSslStatus() + { + $dbInfo = Context::getDBInfo(); + return $dbInfo->use_ssl; + } + /** * @brief return default URL * @return default URL string diff --git a/widgets/login_info/login_info.class.php b/widgets/login_info/login_info.class.php index 5ef9e3392..9cea711d5 100644 --- a/widgets/login_info/login_info.class.php +++ b/widgets/login_info/login_info.class.php @@ -26,12 +26,16 @@ $oModuleModel = &getModel('module'); $this->member_config = $oModuleModel->getModuleConfig('member'); Context::set('member_config', $this->member_config); + // Set a flag to check if the https connection is made when using SSL and create https url $ssl_mode = false; - if($this->member_config->enable_ssl == 'Y') { - if(preg_match('/^https:\/\//i',Context::getRequestUri())) $ssl_mode = true; + $useSsl = Context::getSslStatus(); + if($useSsl != 'none') + { + if(preg_match('/^https:\/\//i', Context::getRequestUri())) $ssl_mode = true; } Context::set('ssl_mode',$ssl_mode); + // Compile a template $oTemplate = &TemplateHandler::getInstance(); return $oTemplate->compile($tpl_path, $tpl_file); diff --git a/widgets/login_info/skins/xe_global/login_form.html b/widgets/login_info/skins/xe_global/login_form.html index b59e6ce3d..9c646861a 100644 --- a/widgets/login_info/skins/xe_global/login_form.html +++ b/widgets/login_info/skins/xe_global/login_form.html @@ -39,11 +39,9 @@

                                                          - -

                                                          +

                                                          {$lang->security_sign_in}

                                                          -
                                                          • {$lang->cmd_signup}
                                                          • {$lang->cmd_find_member_account}
                                                          • diff --git a/widgets/login_info/skins/xe_globalTwo/login_form.html b/widgets/login_info/skins/xe_globalTwo/login_form.html index 9ce08e3db..ea220ef4d 100644 --- a/widgets/login_info/skins/xe_globalTwo/login_form.html +++ b/widgets/login_info/skins/xe_globalTwo/login_form.html @@ -40,11 +40,9 @@

                                                          - -

                                                          +

                                                          {$lang->security_sign_in}

                                                          -
                                                          • {$lang->cmd_signup}
                                                          • {$lang->cmd_find_member_account}
                                                          • diff --git a/widgets/login_info/skins/xe_official/login_form.html b/widgets/login_info/skins/xe_official/login_form.html index 7afd1462d..de1e866d3 100644 --- a/widgets/login_info/skins/xe_official/login_form.html +++ b/widgets/login_info/skins/xe_official/login_form.html @@ -29,7 +29,7 @@
                                                          -

                                                          +

                                                          {$lang->about_keep_warning}

                                                          diff --git a/widgets/login_info/skins/xe_solid_enterprise_login/login_form.html b/widgets/login_info/skins/xe_solid_enterprise_login/login_form.html index 859954bba..0d2cb72ec 100644 --- a/widgets/login_info/skins/xe_solid_enterprise_login/login_form.html +++ b/widgets/login_info/skins/xe_solid_enterprise_login/login_form.html @@ -26,11 +26,9 @@ var keep_signed_msg = "{$lang->about_keep_signed}";
                                                          - -

                                                          +

                                                          {$lang->security_sign_in}

                                                          -
                                                          @@ -46,4 +44,4 @@ var keep_signed_msg = "{$lang->about_keep_signed}";
                                                          - \ No newline at end of file + From be6d9a096d6e690373fa6cfa96f5c17a36a46beb Mon Sep 17 00:00:00 2001 From: taggon Date: Thu, 17 Nov 2011 02:00:46 +0000 Subject: [PATCH 1344/1372] Reformat class files based on PHP coding convention git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9828 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/cache/CacheApc.class.php | 134 +-- classes/cache/CacheHandler.class.php | 18 +- classes/cache/CacheMemcache.class.php | 178 ++-- classes/file/FileHandler.class.php | 1340 +++++++++++++------------ classes/file/FileObject.class.php | 233 ++--- classes/object/Object.class.php | 263 ++--- 6 files changed, 1085 insertions(+), 1081 deletions(-) diff --git a/classes/cache/CacheApc.class.php b/classes/cache/CacheApc.class.php index 4131b5074..f3e8657a4 100644 --- a/classes/cache/CacheApc.class.php +++ b/classes/cache/CacheApc.class.php @@ -1,72 +1,72 @@ valid_time; - return apc_store(md5(_XE_PATH_.$key), array(time(), $buff), $valid_time); - } - - function isValid($key, $modified_time = 0) { - $_key = md5(_XE_PATH_.$key); - $obj = apc_fetch($_key, $success); - if(!$success || !is_array($obj)) return false; - unset($obj[1]); - - if($modified_time > 0 && $modified_time > $obj[0]) { - $this->_delete($_key); - return false; - } - - return true; - } - - function get($key, $modified_time = 0) { - $_key = md5(_XE_PATH_.$key); - $obj = apc_fetch($_key, $success); - if(!$success || !is_array($obj)) return false; - - if($modified_time > 0 && $modified_time > $obj[0]) { - $this->_delete($_key); - return false; - } - - return $obj[1]; - } - - function _delete($_key) { - $this->put($_key,null,1); - } - - function delete($key) { - $this->_delete($key); - } - - function truncate() { - return apc_clear_cache('user'); + function getInstance($opt=null){ + if(!$GLOBALS['__CacheApc__']) { + $GLOBALS['__CacheApc__'] = new CacheApc(); } + return $GLOBALS['__CacheApc__']; } -?> + + function CacheApc(){ + } + + function isSupport(){ + return function_exists('apc_add'); + } + + function put($key, $buff, $valid_time = 0){ + if($valid_time == 0) $valid_time = $this->valid_time; + return apc_store(md5(_XE_PATH_.$key), array(time(), $buff), $valid_time); + } + + function isValid($key, $modified_time = 0) { + $_key = md5(_XE_PATH_.$key); + $obj = apc_fetch($_key, $success); + if(!$success || !is_array($obj)) return false; + unset($obj[1]); + + if($modified_time > 0 && $modified_time > $obj[0]) { + $this->_delete($_key); + return false; + } + + return true; + } + + function get($key, $modified_time = 0) { + $_key = md5(_XE_PATH_.$key); + $obj = apc_fetch($_key, $success); + if(!$success || !is_array($obj)) return false; + + if($modified_time > 0 && $modified_time > $obj[0]) { + $this->_delete($_key); + return false; + } + + return $obj[1]; + } + + function _delete($_key) { + $this->put($_key,null,1); + } + + function delete($key) { + $this->_delete($key); + } + + function truncate() { + return apc_clear_cache('user'); + } +} + +/* End of file CacheApc.class.php */ +/* Location: ./classes/cache/CacheApc.class.php */ diff --git a/classes/cache/CacheHandler.class.php b/classes/cache/CacheHandler.class.php index 6196e6be8..b7ded39be 100644 --- a/classes/cache/CacheHandler.class.php +++ b/classes/cache/CacheHandler.class.php @@ -4,21 +4,20 @@ * @author NHN (developer@xpressengine.com) * @brief Cache Handler * @version 0.1 - * **/ class CacheHandler extends Handler { var $handler = null; var $keyGroupVersions = null; - function &getInstance($target='object') { + function &getInstance($target = 'object') { if(!$GLOBALS['__XE_CACHE_HANDLER__'][$target]) { $GLOBALS['__XE_CACHE_HANDLER__'][$target] = new CacheHandler($target); } return $GLOBALS['__XE_CACHE_HANDLER__'][$target]; } - function CacheHandler($target, $info=null) { + function CacheHandler($target, $info = null) { if(!$info) $info = Context::getDBInfo(); if($info){ if($target == 'object'){ @@ -39,11 +38,11 @@ class CacheHandler extends Handler { $class = 'Cache' . ucfirst($type); include_once sprintf('%sclasses/cache/%s.class.php', _XE_PATH_, $class); $this->handler = call_user_func(array($class,'getInstance'), $url); - $this->keyGroupVersions = $this->handler->get('key_group_versions', 0); - if(!$this->keyGroupVersions) { - $this->keyGroupVersions = array(); - $this->handler->put('key_group_versions', $this->keyGroupVersions, 0); - } + $this->keyGroupVersions = $this->handler->get('key_group_versions', 0); + if(!$this->keyGroupVersions) { + $this->keyGroupVersions = array(); + $this->handler->put('key_group_versions', $this->keyGroupVersions, 0); + } } } } @@ -127,4 +126,5 @@ class CacheBase{ } } -/* End of file : CacheHandler.class.php */ +/* End of file CacheHandler.class.php */ +/* Location: ./classes/cache/CacheHandler.class.php */ diff --git a/classes/cache/CacheMemcache.class.php b/classes/cache/CacheMemcache.class.php index 523535802..80d1adfe3 100644 --- a/classes/cache/CacheMemcache.class.php +++ b/classes/cache/CacheMemcache.class.php @@ -1,97 +1,97 @@ Memcache = new Memcache; + function CacheMemcache($url){ + //$config['url'] = array('memcache://localhost:11211'); + $config['url'] = is_array($url)?$url:array($url); + $this->Memcache = new Memcache; - foreach($config['url'] as $url) { - $info = parse_url($url); - $this->Memcache->addServer($info['host'], $info['port']); - } - } - - function isSupport(){ - if($GLOBALS['XE_MEMCACHE_SUPPORT']) return true; - if($this->Memcache->set('xe', 'xe', MEMCACHE_COMPRESSED, 1)) { - $GLOBALS['XE_MEMCACHE_SUPPORT'] = true; - } else { - $GLOBALS['XE_MEMCACHE_SUPPORT'] = false; - } - return $GLOBALS['XE_MEMCACHE_SUPPORT']; - } - - function getKey($key){ - return md5(_XE_PATH_.$key); - } - - function put($key, $buff, $valid_time = 0){ - if($valid_time == 0) $valid_time = $this->valid_time; - - return $this->Memcache->set($this->getKey($key), array(time(), $buff), MEMCACHE_COMPRESSED, $valid_time); - } - - function isValid($key, $modified_time = 0) { - $_key = $this->getKey($key); - - $obj = $this->Memcache->get($_key); - if(!$obj || !is_array($obj)) return false; - unset($obj[1]); - - if($modified_time > 0 && $modified_time > $obj[0]) { - $this->_delete($_key); - return false; - } - - return true; - } - - function get($key, $modified_time = 0) { - $_key = $this->getKey($key); - $obj = $this->Memcache->get($_key); - if(!$obj || !is_array($obj)) return false; - - if($modified_time > 0 && $modified_time > $obj[0]) { - $this->_delete($_key); - return false; - } - - unset($obj[0]); - - return $obj[1]; - } - - function delete($key) { - $_key = $this->getKey($key); - $this->_delete($_key); - } - - function _delete($_key) { - $this->Memcache->delete($_key); - } - - function truncate() { - // not support memcached - return false; + foreach($config['url'] as $url) { + $info = parse_url($url); + $this->Memcache->addServer($info['host'], $info['port']); } } -?> + + function isSupport(){ + if($GLOBALS['XE_MEMCACHE_SUPPORT']) return true; + if($this->Memcache->set('xe', 'xe', MEMCACHE_COMPRESSED, 1)) { + $GLOBALS['XE_MEMCACHE_SUPPORT'] = true; + } else { + $GLOBALS['XE_MEMCACHE_SUPPORT'] = false; + } + return $GLOBALS['XE_MEMCACHE_SUPPORT']; + } + + function getKey($key){ + return md5(_XE_PATH_.$key); + } + + function put($key, $buff, $valid_time = 0){ + if($valid_time == 0) $valid_time = $this->valid_time; + + return $this->Memcache->set($this->getKey($key), array(time(), $buff), MEMCACHE_COMPRESSED, $valid_time); + } + + function isValid($key, $modified_time = 0) { + $_key = $this->getKey($key); + + $obj = $this->Memcache->get($_key); + if(!$obj || !is_array($obj)) return false; + unset($obj[1]); + + if($modified_time > 0 && $modified_time > $obj[0]) { + $this->_delete($_key); + return false; + } + + return true; + } + + function get($key, $modified_time = 0) { + $_key = $this->getKey($key); + $obj = $this->Memcache->get($_key); + if(!$obj || !is_array($obj)) return false; + + if($modified_time > 0 && $modified_time > $obj[0]) { + $this->_delete($_key); + return false; + } + + unset($obj[0]); + + return $obj[1]; + } + + function delete($key) { + $_key = $this->getKey($key); + $this->_delete($_key); + } + + function _delete($_key) { + $this->Memcache->delete($_key); + } + + function truncate() { + // not supported on memcached + return false; + } +} + +/* End of file CacheMemcache.class.php */ +/* Location: ./classes/cache/CacheMemcache.class.php */ diff --git a/classes/file/FileHandler.class.php b/classes/file/FileHandler.class.php index e628f49ac..87bd8ef2e 100644 --- a/classes/file/FileHandler.class.php +++ b/classes/file/FileHandler.class.php @@ -1,676 +1,678 @@ read()) { - if(substr($file,0,1)=='.') continue; - if($filter && preg_match($filter, $file)) continue; - if(is_dir($source_dir.$file)){ - FileHandler::copyDir($source_dir.$file,$target_dir.$file,$type); - }else{ - if($type == 'force'){ - @unlink($target_dir.$file); - }else{ - if(!file_exists($target_dir.$file)) @copy($source_dir.$file,$target_dir.$file); - } - } - } - } - - /** - * @brief copy a file to target - * @param[in] $source path of source file - * @param[in] $target path of target file - * @param[in] $force Y: overwrite - * @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); - if(!file_exists($target_dir)) FileHandler::makeDir($target_dir); - if($force=='Y') @unlink($target_dir.'/'.$target); - @copy($source, $target_dir.'/'.$target); - } - - /** - * @brief returns the content of the file - * @param[in] $file_name path of target file - * @return the content of the file. if target file does not exist, this function returns nothing. - **/ - function readFile($file_name) { - $file_name = FileHandler::getRealPath($file_name); - - if(!file_exists($file_name)) return; - $filesize = filesize($file_name); - if($filesize<1) return; - - if(function_exists('file_get_contents')) return file_get_contents($file_name); - - $fp = fopen($file_name, "r"); - $buff = ''; - if($fp) { - while(!feof($fp) && strlen($buff)<=$filesize) { - $str = fgets($fp, 1024); - $buff .= $str; - } - fclose($fp); - } - return $buff; - } - - /** - * @brief write $buff into the specified file - * @param[in] $file_name path of target file - * @param[in] $buff content to be writeen - * @param[in] $mode a(append) / w(write) - * @return none - **/ - function writeFile($file_name, $buff, $mode = "w") { - $file_name = FileHandler::getRealPath($file_name); - - $pathinfo = pathinfo($file_name); - $path = $pathinfo['dirname']; - if(!is_dir($path)) FileHandler::makeDir($path); - - $mode = strtolower($mode); - if($mode != "a") $mode = "w"; - if(@!$fp = fopen($file_name,$mode)) return false; - fwrite($fp, $buff); - fclose($fp); - @chmod($file_name, 0644); - } - - /** - * @brief remove a file - * @param[in] $file_name path of target file - * @return returns true on success or false on failure. - **/ - function removeFile($file_name) { - $file_name = FileHandler::getRealPath($file_name); - return (file_exists($file_name) && @unlink($file_name)); - } - - /** - * @brief rename a file - * @param[in] $source path of source file - * @param[in] $target path of target file - * @remarks In order to move a file, use this function. - * @return returns true on success or false on failure. - **/ - function rename($source, $target) { - $source = FileHandler::getRealPath($source); - $target = FileHandler::getRealPath($target); - return @rename($source, $target); - } - - /** - * @brief Move a file - * @param[in] $source path of source file - * @param[in] $target path of target file - * @return returns true on success or false on failure. - */ - function moveFile($source, $target) { - $source = FileHandler::getRealPath($source); - return (file_exists($source) && FileHandler::removeFile($target) && FileHandler::rename($source, $target)); - } - - /** - * @brief move a directory - * @param[in] $source_dir path of source directory - * @param[in] $target_dir path of target directory - * @remarks this function just wraps rename function. - * @return none - **/ - function moveDir($source_dir, $target_dir) { - FileHandler::rename($source_dir, $target_dir); - } - - /** - * @brief return list of the files in the path - * @param[in] $path path of target directory - * @param[in] $filter if specified, return only files matching with the filter - * @param[in] $to_lower if true, file names will be changed into lower case. - * @param[in] $concat_prefix if true, return file name as absolute path - * @remarks the array does not contain files, such as '.', '..', and files starting with '.' - * @return array of the filenames in the path - **/ - function readDir($path, $filter = '', $to_lower = false, $concat_prefix = false) { - $path = FileHandler::getRealPath($path); - - if(substr($path,-1)!='/') $path .= '/'; - if(!is_dir($path)) return array(); - - $oDir = dir($path); - while($file = $oDir->read()) { - if(substr($file,0,1)=='.') continue; - - if($filter && !preg_match($filter, $file)) continue; - - if($to_lower) $file = strtolower($file); - - if($filter) $file = preg_replace($filter, '$1', $file); - else $file = $file; - - if($concat_prefix) { - $file = sprintf('%s%s', str_replace(_XE_PATH_, '', $path), $file); - } - - $output[] = $file; - } - if(!$output) return array(); - - return $output; - } - - /** - * @brief creates a directory - * @param[in] $path_string path of target directory - * @return true if success. it might return nothing when ftp is used and connection to the ftp address failed. - * @remarks This function creates directories recursively, which means that if ancestors of the target directory does not exist, they will be created too. - **/ - function makeDir($path_string) { - static $oFtp = null; - - // if safe_mode is on, use FTP - if(ini_get('safe_mode')) { - $ftp_info = Context::getFTPInfo(); - if($oFtp == null) { - if(!Context::isFTPRegisted()) return; - - require_once(_XE_PATH_.'libs/ftp.class.php'); - $oFtp = new ftp(); - if(!$ftp_info->ftp_host) $ftp_info->ftp_host = "127.0.0.1"; - if(!$ftp_info->ftp_port) $ftp_info->ftp_port = 21; - if(!$oFtp->ftp_connect($ftp_info->ftp_host, $ftp_info->ftp_port)) return; - if(!$oFtp->ftp_login($ftp_info->ftp_user, $ftp_info->ftp_password)) { - $oFtp->ftp_quit(); - return; - } + $oDir = dir($source_dir); + while($file = $oDir->read()) { + if(substr($file,0,1)=='.') continue; + if($filter && preg_match($filter, $file)) continue; + if(is_dir($source_dir.$file)){ + FileHandler::copyDir($source_dir.$file,$target_dir.$file,$type); + }else{ + if($type == 'force'){ + @unlink($target_dir.$file); + }else{ + if(!file_exists($target_dir.$file)) @copy($source_dir.$file,$target_dir.$file); } - $ftp_path = $ftp_info->ftp_root_path; - if(!$ftp_path) $ftp_path = "/"; - } - - $path_string = str_replace(_XE_PATH_,'',$path_string); - $path_list = explode('/', $path_string); - - $path = _XE_PATH_; - for($i=0;$iftp_mkdir($ftp_path); - $oFtp->ftp_site("CHMOD 777 ".$ftp_path); - } else { - @mkdir($path, 0755); - @chmod($path, 0755); - } - } - } - - return is_dir($path_string); - } - - /** - * @brief remove all files under the path - * @param[in] $path path of the target directory - * @return none - **/ - function removeDir($path) { - $path = FileHandler::getRealPath($path); - if(!is_dir($path)) return; - $directory = dir($path); - while($entry = $directory->read()) { - if ($entry != "." && $entry != "..") { - if (is_dir($path."/".$entry)) { - FileHandler::removeDir($path."/".$entry); - } else { - @unlink($path."/".$entry); - } - } - } - $directory->close(); - @rmdir($path); - } - - /** - * @brief remove a directory only if it is empty - * @param[in] $path path of the target directory - * @return none - **/ - function removeBlankDir($path) { - $item_cnt = 0; - - $path = FileHandler::getRealPath($path); - if(!is_dir($path)) return; - $directory = dir($path); - while($entry = $directory->read()) { - if ($entry == "." || $entry == "..") continue; - if (is_dir($path."/".$entry)) $item_cnt = FileHandler::removeBlankDir($path.'/'.$entry); - } - $directory->close(); - - if($item_cnt < 1) @rmdir($path); - } - - - /** - * @biref remove files in the target directory. - * @param[in] $path path of the target directory - * @remarks This function keeps the directory structure. - * @return none - **/ - function removeFilesInDir($path) { - $path = FileHandler::getRealPath($path); - if(!is_dir($path)) return; - $directory = dir($path); - while($entry = $directory->read()) { - if ($entry != "." && $entry != "..") { - if (is_dir($path."/".$entry)) { - FileHandler::removeFilesInDir($path."/".$entry); - } else { - @unlink($path."/".$entry); - } - } - } - $directory->close(); - } - - /** - * @brief makes file size byte into KB, MB according to the size - * @param[in] $size number of the size - * @return file size string - **/ - function filesize($size) { - if(!$size) return "0Byte"; - if($size < 1024) return ($size."Byte"); - if($size >= 1024 && $size < 1024*1024) return sprintf("%0.1fKB",$size / 1024); - return sprintf("%0.2fMB",$size / (1024*1024)); - } - - /** - * @brief return remote file's content via HTTP - * @param[in] $url the address of the target file - * @param[in] $body HTTP request body - * @param[in] $timeout connection timeout - * @param[in] $method GET/POST - * @param[in] $content_type content type header of HTTP request - * @param[in] $headers headers key vaule array. - * @param[in] $cookies cookies key value array. - * @param[in] $post_data request arguments array for POST method - * @return if success, the content of the target file. otherwise: none - * @remarks if the target is moved (when return code is 300~399), this function follows the location specified response header. - **/ - function getRemoteResource($url, $body = null, $timeout = 3, $method = 'GET', $content_type = null, $headers = array(), $cookies = array(), $post_data = array()) { - requirePear(); - require_once('HTTP/Request.php'); - - $parsed_url = parse_url(__PROXY_SERVER__); - if($parsed_url["host"]) { - $oRequest = new HTTP_Request(__PROXY_SERVER__); - $oRequest->setMethod('POST'); - $oRequest->_timeout = $timeout; - $oRequest->addPostData('arg', serialize(array('Destination'=>$url, 'method'=>$method, 'body'=>$body, 'content_type'=>$content_type, "headers"=>$headers, "post_data"=>$post_data))); - } else { - $oRequest = new HTTP_Request($url); - if(count($headers)) { - foreach($headers as $key => $val) { - $oRequest->addHeader($key, $val); - } - } - if($cookies[$host]) { - foreach($cookies[$host] as $key => $val) { - $oRequest->addCookie($key, $val); - } - } - if(count($post_data)) { - foreach($post_data as $key => $val) { - $oRequest->addPostData($key, $val); - } - } - if(!$content_type) $oRequest->addHeader('Content-Type', 'text/html'); - else $oRequest->addHeader('Content-Type', $content_type); - $oRequest->setMethod($method); - if($body) $oRequest->setBody($body); - - $oRequest->_timeout = $timeout; - } - - $oResponse = $oRequest->sendRequest(); - - $code = $oRequest->getResponseCode(); - $header = $oRequest->getResponseHeader(); - $response = $oRequest->getResponseBody(); - if($c = $oRequest->getResponseCookies()) { - foreach($c as $k => $v) { - $cookies[$host][$v['name']] = $v['value']; - } - } - - if($code > 300 && $code < 399 && $header['location']) { - return FileHandler::getRemoteResource($header['location'], $body, $timeout, $method, $content_type, $headers, $cookies, $post_data); - } - - if($code != 200) return; - - return $response; - } - - /** - * @brief retrieves remote file, then stores it into target path. - * @param[in] $url the address of the target file - * @param[in] $target_file the location to store - * @param[in] $body HTTP request body - * @param[in] $timeout connection timeout - * @param[in] $method GET/POST - * @param[in] $content_type content type header of HTTP request - * @param[in] $headers headers key vaule array. - * @return true: success, false: failed - **/ - function getRemoteFile($url, $target_filename, $body = null, $timeout = 3, $method = 'GET', $content_type = null, $headers = array()) { - $body = FileHandler::getRemoteResource($url, $body, $timeout, $method, $content_type, $headers); - if(!$body) return false; - $target_filename = FileHandler::getRealPath($target_filename); - FileHandler::writeFile($target_filename, $body); - return true; - } - - /** - * @brief convert size in string into numeric value - * @param[in] $val size in string (ex., 10, 10K, 10M, 10G ) - * @return converted size - */ - function returnBytes($val) - { - $val = trim($val); - $last = strtolower(substr($val, -1)); - if($last == 'g') $val *= 1024*1024*1024; - else if($last == 'm') $val *= 1024*1024; - else if($last == 'k') $val *= 1024; - - return $val; - } - - /** - * @brief check available memory to load image file - * @param[in] $imageInfo image info retrieved by getimagesize function - * @return true: it's ok, false: otherwise - */ - function checkMemoryLoadImage(&$imageInfo) - { - if(!function_exists('memory_get_usage')) return true; - $K64 = 65536; - $TWEAKFACTOR = 2.0; - $channels = $imageInfo['channels']; - if(!$channels) $channels = 6; //for png - $memoryNeeded = round( ($imageInfo[0] * $imageInfo[1] * $imageInfo['bits'] * $channels / 8 + $K64 ) * $TWEAKFACTOR ); - $availableMemory = FileHandler::returnBytes(ini_get('memory_limit')) - memory_get_usage(); - if($availableMemory < $memoryNeeded) return false; - return true; - } - - /** - * @brief moves an image file (resizing is possible) - * @param[in] $source_file path of the source file - * @param[in] $target_file path of the target file - * @param[in] $resize_width width to resize - * @param[in] $resize_height height to resize - * @param[in] $target_type if $target_type is set (gif, jpg, png, bmp), result image will be saved as target type - * @param[in] $thumbnail_type thumbnail type(crop, ratio) - * @return true: success, false: failed - **/ - function createImageFile($source_file, $target_file, $resize_width = 0, $resize_height = 0, $target_type = '', $thumbnail_type = 'crop') { - $source_file = FileHandler::getRealPath($source_file); - $target_file = FileHandler::getRealPath($target_file); - - if(!file_exists($source_file)) return; - if(!$resize_width) $resize_width = 100; - if(!$resize_height) $resize_height = $resize_width; - - // retrieve source image's information - $imageInfo = getimagesize($source_file); - if(!FileHandler::checkMemoryLoadImage($imageInfo)) return false; - list($width, $height, $type, $attrs) = $imageInfo; - - if($width<1 || $height<1) return; - - switch($type) { - case '1' : - $type = 'gif'; - break; - case '2' : - $type = 'jpg'; - break; - case '3' : - $type = 'png'; - break; - case '6' : - $type = 'bmp'; - break; - default : - return; - break; - } - - // if original image is larger than specified size to resize, calculate the ratio - if($resize_width > 0 && $width >= $resize_width) $width_per = $resize_width / $width; - else $width_per = 1; - - if($resize_height>0 && $height >= $resize_height) $height_per = $resize_height / $height; - else $height_per = 1; - - if($thumbnail_type == 'ratio') { - if($width_per>$height_per) $per = $height_per; - else $per = $width_per; - $resize_width = $width * $per; - $resize_height = $height * $per; - } else { - if($width_per < $height_per) $per = $height_per; - else $per = $width_per; - } - - if(!$per) $per = 1; - - // get type of target file - if(!$target_type) $target_type = $type; - $target_type = strtolower($target_type); - - // create temporary image with target size - if(function_exists('imagecreatetruecolor')) $thumb = imagecreatetruecolor($resize_width, $resize_height); - else if(function_exists('imagecreate')) $thumb = imagecreate($resize_width, $resize_height); - else return false; - if(!$thumb) return false; - - $white = imagecolorallocate($thumb, 255,255,255); - imagefilledrectangle($thumb,0,0,$resize_width-1,$resize_height-1,$white); - - // create temporary image having original type - switch($type) { - case 'gif' : - if(!function_exists('imagecreatefromgif')) return false; - $source = imagecreatefromgif($source_file); - break; - // jpg - case 'jpeg' : - case 'jpg' : - if(!function_exists('imagecreatefromjpeg')) return false; - $source = imagecreatefromjpeg($source_file); - break; - // png - case 'png' : - if(!function_exists('imagecreatefrompng')) return false; - $source = imagecreatefrompng($source_file); - break; - // bmp - case 'wbmp' : - case 'bmp' : - if(!function_exists('imagecreatefromwbmp')) return false; - $source = imagecreatefromwbmp($source_file); - break; - default : - return; - } - - // resize original image and put it into temporary image - $new_width = (int)($width * $per); - $new_height = (int)($height * $per); - - if($thumbnail_type == 'crop') { - $x = (int)($resize_width/2 - $new_width/2); - $y = (int)($resize_height/2 - $new_height/2); - } else { - $x = 0; - $y = 0; - } - - if($source) { - if(function_exists('imagecopyresampled')) imagecopyresampled($thumb, $source, $x, $y, 0, 0, $new_width, $new_height, $width, $height); - else imagecopyresized($thumb, $source, $x, $y, 0, 0, $new_width, $new_height, $width, $height); - } else return false; - - // create directory - $path = dirname($target_file); - if(!is_dir($path)) FileHandler::makeDir($path); - - // write into the file - switch($target_type) { - case 'gif' : - if(!function_exists('imagegif')) return false; - $output = imagegif($thumb, $target_file); - break; - case 'jpeg' : - case 'jpg' : - if(!function_exists('imagejpeg')) return false; - $output = imagejpeg($thumb, $target_file, 100); - break; - case 'png' : - if(!function_exists('imagepng')) return false; - $output = imagepng($thumb, $target_file, 9); - break; - case 'wbmp' : - case 'bmp' : - if(!function_exists('imagewbmp')) return false; - $output = imagewbmp($thumb, $target_file, 100); - break; - } - - imagedestroy($thumb); - imagedestroy($source); - - if(!$output) return false; - @chmod($target_file, 0644); - - return true; - } - - /** - * @brief reads ini file, and puts result into array - * @param[in] $filename path of the ini file - * @return ini array (if the target file does not exist, it returns false) - **/ - function readIniFile($filename){ - $filename = FileHandler::getRealPath($filename); - if(!file_exists($filename)) return false; - $arr = parse_ini_file($filename, true); - if(is_array($arr) && count($arr)>0) return $arr; - else return array(); - } - - - /** - * @brief write array into ini file - * @param[in] $filename target ini file name - * @param[in] $arr array - * @return if array contains nothing it returns false, otherwise true - **/ - function writeIniFile($filename, $arr){ - if(count($arr)==0) return false; - FileHandler::writeFile($filename, FileHandler::_makeIniBuff($arr)); - return true; - } - - function _makeIniBuff($arr){ - $return = ''; - foreach($arr as $key => $val){ - // section - if(is_array($val)){ - $return .= sprintf("[%s]\n",$key); - foreach($val as $k => $v){ - $return .= sprintf("%s=\"%s\"\n",$k,$v); - } - // value - }else if(is_string($val) || is_int($val)){ - $return .= sprintf("%s=\"%s\"\n",$key,$val); - } - } - return $return; - } - - /** - * @brief return file object - * @param[in] $filename target file name - * @param[in] $mode file mode for fopen - * @remarks if the directory of the file does not exist, create it. - * @return file object - **/ - function openFile($filename, $mode) - { - $pathinfo = pathinfo($filename); - $path = $pathinfo['dirname']; - if(!is_dir($path)) FileHandler::makeDir($path); - - require_once("FileObject.class.php"); - $file_object = new FileObject($file_name, $mode); - return $file_object; - } - - /** - * @brief check whether the given file has the content. - * @param[in] $file_name target file name - * @return return true if the file exists and contains something. - */ - function hasContent($filename) - { - return (is_readable($filename) && !!filesize($filename)); + } } - } -?> + } + + /** + * @brief copy a file to target + * @param[in] $source path of source file + * @param[in] $target path of target file + * @param[in] $force Y: overwrite + * @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); + if(!file_exists($target_dir)) FileHandler::makeDir($target_dir); + if($force=='Y') @unlink($target_dir.'/'.$target); + @copy($source, $target_dir.'/'.$target); + } + + /** + * @brief returns the content of the file + * @param[in] $file_name path of target file + * @return the content of the file. if target file does not exist, this function returns nothing. + **/ + function readFile($file_name) { + $file_name = FileHandler::getRealPath($file_name); + + if(!file_exists($file_name)) return; + $filesize = filesize($file_name); + if($filesize<1) return; + + if(function_exists('file_get_contents')) return file_get_contents($file_name); + + $fp = fopen($file_name, "r"); + $buff = ''; + if($fp) { + while(!feof($fp) && strlen($buff)<=$filesize) { + $str = fgets($fp, 1024); + $buff .= $str; + } + fclose($fp); + } + return $buff; + } + + /** + * @brief write $buff into the specified file + * @param[in] $file_name path of target file + * @param[in] $buff content to be writeen + * @param[in] $mode a(append) / w(write) + * @return none + **/ + function writeFile($file_name, $buff, $mode = "w") { + $file_name = FileHandler::getRealPath($file_name); + + $pathinfo = pathinfo($file_name); + $path = $pathinfo['dirname']; + if(!is_dir($path)) FileHandler::makeDir($path); + + $mode = strtolower($mode); + if($mode != "a") $mode = "w"; + if(@!$fp = fopen($file_name,$mode)) return false; + fwrite($fp, $buff); + fclose($fp); + @chmod($file_name, 0644); + } + + /** + * @brief remove a file + * @param[in] $file_name path of target file + * @return returns true on success or false on failure. + **/ + function removeFile($file_name) { + $file_name = FileHandler::getRealPath($file_name); + return (file_exists($file_name) && @unlink($file_name)); + } + + /** + * @brief rename a file + * @param[in] $source path of source file + * @param[in] $target path of target file + * @remarks In order to move a file, use this function. + * @return returns true on success or false on failure. + **/ + function rename($source, $target) { + $source = FileHandler::getRealPath($source); + $target = FileHandler::getRealPath($target); + return @rename($source, $target); + } + + /** + * @brief Move a file + * @param[in] $source path of source file + * @param[in] $target path of target file + * @return returns true on success or false on failure. + */ + function moveFile($source, $target) { + $source = FileHandler::getRealPath($source); + return (file_exists($source) && FileHandler::removeFile($target) && FileHandler::rename($source, $target)); + } + + /** + * @brief move a directory + * @param[in] $source_dir path of source directory + * @param[in] $target_dir path of target directory + * @remarks this function just wraps rename function. + * @return none + **/ + function moveDir($source_dir, $target_dir) { + FileHandler::rename($source_dir, $target_dir); + } + + /** + * @brief return list of the files in the path + * @param[in] $path path of target directory + * @param[in] $filter if specified, return only files matching with the filter + * @param[in] $to_lower if true, file names will be changed into lower case. + * @param[in] $concat_prefix if true, return file name as absolute path + * @remarks the array does not contain files, such as '.', '..', and files starting with '.' + * @return array of the filenames in the path + **/ + function readDir($path, $filter = '', $to_lower = false, $concat_prefix = false) { + $path = FileHandler::getRealPath($path); + + if(substr($path,-1)!='/') $path .= '/'; + if(!is_dir($path)) return array(); + + $oDir = dir($path); + while($file = $oDir->read()) { + if(substr($file,0,1)=='.') continue; + + if($filter && !preg_match($filter, $file)) continue; + + if($to_lower) $file = strtolower($file); + + if($filter) $file = preg_replace($filter, '$1', $file); + else $file = $file; + + if($concat_prefix) { + $file = sprintf('%s%s', str_replace(_XE_PATH_, '', $path), $file); + } + + $output[] = $file; + } + if(!$output) return array(); + + return $output; + } + + /** + * @brief creates a directory + * @param[in] $path_string path of target directory + * @return true if success. it might return nothing when ftp is used and connection to the ftp address failed. + * @remarks This function creates directories recursively, which means that if ancestors of the target directory does not exist, they will be created too. + **/ + function makeDir($path_string) { + static $oFtp = null; + + // if safe_mode is on, use FTP + if(ini_get('safe_mode')) { + $ftp_info = Context::getFTPInfo(); + if($oFtp == null) { + if(!Context::isFTPRegisted()) return; + + require_once(_XE_PATH_.'libs/ftp.class.php'); + $oFtp = new ftp(); + if(!$ftp_info->ftp_host) $ftp_info->ftp_host = "127.0.0.1"; + if(!$ftp_info->ftp_port) $ftp_info->ftp_port = 21; + if(!$oFtp->ftp_connect($ftp_info->ftp_host, $ftp_info->ftp_port)) return; + if(!$oFtp->ftp_login($ftp_info->ftp_user, $ftp_info->ftp_password)) { + $oFtp->ftp_quit(); + return; + } + } + $ftp_path = $ftp_info->ftp_root_path; + if(!$ftp_path) $ftp_path = "/"; + } + + $path_string = str_replace(_XE_PATH_,'',$path_string); + $path_list = explode('/', $path_string); + + $path = _XE_PATH_; + for($i=0;$iftp_mkdir($ftp_path); + $oFtp->ftp_site("CHMOD 777 ".$ftp_path); + } else { + @mkdir($path, 0755); + @chmod($path, 0755); + } + } + } + + return is_dir($path_string); + } + + /** + * @brief remove all files under the path + * @param[in] $path path of the target directory + * @return none + **/ + function removeDir($path) { + $path = FileHandler::getRealPath($path); + if(!is_dir($path)) return; + $directory = dir($path); + while($entry = $directory->read()) { + if ($entry != "." && $entry != "..") { + if (is_dir($path."/".$entry)) { + FileHandler::removeDir($path."/".$entry); + } else { + @unlink($path."/".$entry); + } + } + } + $directory->close(); + @rmdir($path); + } + + /** + * @brief remove a directory only if it is empty + * @param[in] $path path of the target directory + * @return none + **/ + function removeBlankDir($path) { + $item_cnt = 0; + + $path = FileHandler::getRealPath($path); + if(!is_dir($path)) return; + $directory = dir($path); + while($entry = $directory->read()) { + if ($entry == "." || $entry == "..") continue; + if (is_dir($path."/".$entry)) $item_cnt = FileHandler::removeBlankDir($path.'/'.$entry); + } + $directory->close(); + + if($item_cnt < 1) @rmdir($path); + } + + + /** + * @biref remove files in the target directory. + * @param[in] $path path of the target directory + * @remarks This function keeps the directory structure. + * @return none + **/ + function removeFilesInDir($path) { + $path = FileHandler::getRealPath($path); + if(!is_dir($path)) return; + $directory = dir($path); + while($entry = $directory->read()) { + if ($entry != "." && $entry != "..") { + if (is_dir($path."/".$entry)) { + FileHandler::removeFilesInDir($path."/".$entry); + } else { + @unlink($path."/".$entry); + } + } + } + $directory->close(); + } + + /** + * @brief makes file size byte into KB, MB according to the size + * @param[in] $size number of the size + * @return file size string + **/ + function filesize($size) { + if(!$size) return "0Byte"; + if($size < 1024) return ($size."Byte"); + if($size >= 1024 && $size < 1024*1024) return sprintf("%0.1fKB",$size / 1024); + return sprintf("%0.2fMB",$size / (1024*1024)); + } + + /** + * @brief return remote file's content via HTTP + * @param[in] $url the address of the target file + * @param[in] $body HTTP request body + * @param[in] $timeout connection timeout + * @param[in] $method GET/POST + * @param[in] $content_type content type header of HTTP request + * @param[in] $headers headers key vaule array. + * @param[in] $cookies cookies key value array. + * @param[in] $post_data request arguments array for POST method + * @return if success, the content of the target file. otherwise: none + * @remarks if the target is moved (when return code is 300~399), this function follows the location specified response header. + **/ + function getRemoteResource($url, $body = null, $timeout = 3, $method = 'GET', $content_type = null, $headers = array(), $cookies = array(), $post_data = array()) { + requirePear(); + require_once('HTTP/Request.php'); + + $parsed_url = parse_url(__PROXY_SERVER__); + if($parsed_url["host"]) { + $oRequest = new HTTP_Request(__PROXY_SERVER__); + $oRequest->setMethod('POST'); + $oRequest->_timeout = $timeout; + $oRequest->addPostData('arg', serialize(array('Destination'=>$url, 'method'=>$method, 'body'=>$body, 'content_type'=>$content_type, "headers"=>$headers, "post_data"=>$post_data))); + } else { + $oRequest = new HTTP_Request($url); + if(count($headers)) { + foreach($headers as $key => $val) { + $oRequest->addHeader($key, $val); + } + } + if($cookies[$host]) { + foreach($cookies[$host] as $key => $val) { + $oRequest->addCookie($key, $val); + } + } + if(count($post_data)) { + foreach($post_data as $key => $val) { + $oRequest->addPostData($key, $val); + } + } + if(!$content_type) $oRequest->addHeader('Content-Type', 'text/html'); + else $oRequest->addHeader('Content-Type', $content_type); + $oRequest->setMethod($method); + if($body) $oRequest->setBody($body); + + $oRequest->_timeout = $timeout; + } + + $oResponse = $oRequest->sendRequest(); + + $code = $oRequest->getResponseCode(); + $header = $oRequest->getResponseHeader(); + $response = $oRequest->getResponseBody(); + if($c = $oRequest->getResponseCookies()) { + foreach($c as $k => $v) { + $cookies[$host][$v['name']] = $v['value']; + } + } + + if($code > 300 && $code < 399 && $header['location']) { + return FileHandler::getRemoteResource($header['location'], $body, $timeout, $method, $content_type, $headers, $cookies, $post_data); + } + + if($code != 200) return; + + return $response; + } + + /** + * @brief retrieves remote file, then stores it into target path. + * @param[in] $url the address of the target file + * @param[in] $target_file the location to store + * @param[in] $body HTTP request body + * @param[in] $timeout connection timeout + * @param[in] $method GET/POST + * @param[in] $content_type content type header of HTTP request + * @param[in] $headers headers key vaule array. + * @return true: success, false: failed + **/ + function getRemoteFile($url, $target_filename, $body = null, $timeout = 3, $method = 'GET', $content_type = null, $headers = array()) { + $body = FileHandler::getRemoteResource($url, $body, $timeout, $method, $content_type, $headers); + if(!$body) return false; + $target_filename = FileHandler::getRealPath($target_filename); + FileHandler::writeFile($target_filename, $body); + return true; + } + + /** + * @brief convert size in string into numeric value + * @param[in] $val size in string (ex., 10, 10K, 10M, 10G ) + * @return converted size + */ + function returnBytes($val) + { + $val = trim($val); + $last = strtolower(substr($val, -1)); + if($last == 'g') $val *= 1024*1024*1024; + else if($last == 'm') $val *= 1024*1024; + else if($last == 'k') $val *= 1024; + + return $val; + } + + /** + * @brief check available memory to load image file + * @param[in] $imageInfo image info retrieved by getimagesize function + * @return true: it's ok, false: otherwise + */ + function checkMemoryLoadImage(&$imageInfo) + { + if(!function_exists('memory_get_usage')) return true; + $K64 = 65536; + $TWEAKFACTOR = 2.0; + $channels = $imageInfo['channels']; + if(!$channels) $channels = 6; //for png + $memoryNeeded = round( ($imageInfo[0] * $imageInfo[1] * $imageInfo['bits'] * $channels / 8 + $K64 ) * $TWEAKFACTOR ); + $availableMemory = FileHandler::returnBytes(ini_get('memory_limit')) - memory_get_usage(); + if($availableMemory < $memoryNeeded) return false; + return true; + } + + /** + * @brief moves an image file (resizing is possible) + * @param[in] $source_file path of the source file + * @param[in] $target_file path of the target file + * @param[in] $resize_width width to resize + * @param[in] $resize_height height to resize + * @param[in] $target_type if $target_type is set (gif, jpg, png, bmp), result image will be saved as target type + * @param[in] $thumbnail_type thumbnail type(crop, ratio) + * @return true: success, false: failed + **/ + function createImageFile($source_file, $target_file, $resize_width = 0, $resize_height = 0, $target_type = '', $thumbnail_type = 'crop') { + $source_file = FileHandler::getRealPath($source_file); + $target_file = FileHandler::getRealPath($target_file); + + if(!file_exists($source_file)) return; + if(!$resize_width) $resize_width = 100; + if(!$resize_height) $resize_height = $resize_width; + + // retrieve source image's information + $imageInfo = getimagesize($source_file); + if(!FileHandler::checkMemoryLoadImage($imageInfo)) return false; + list($width, $height, $type, $attrs) = $imageInfo; + + if($width<1 || $height<1) return; + + switch($type) { + case '1' : + $type = 'gif'; + break; + case '2' : + $type = 'jpg'; + break; + case '3' : + $type = 'png'; + break; + case '6' : + $type = 'bmp'; + break; + default : + return; + break; + } + + // if original image is larger than specified size to resize, calculate the ratio + if($resize_width > 0 && $width >= $resize_width) $width_per = $resize_width / $width; + else $width_per = 1; + + if($resize_height>0 && $height >= $resize_height) $height_per = $resize_height / $height; + else $height_per = 1; + + if($thumbnail_type == 'ratio') { + if($width_per>$height_per) $per = $height_per; + else $per = $width_per; + $resize_width = $width * $per; + $resize_height = $height * $per; + } else { + if($width_per < $height_per) $per = $height_per; + else $per = $width_per; + } + + if(!$per) $per = 1; + + // get type of target file + if(!$target_type) $target_type = $type; + $target_type = strtolower($target_type); + + // create temporary image with target size + if(function_exists('imagecreatetruecolor')) $thumb = imagecreatetruecolor($resize_width, $resize_height); + else if(function_exists('imagecreate')) $thumb = imagecreate($resize_width, $resize_height); + else return false; + if(!$thumb) return false; + + $white = imagecolorallocate($thumb, 255,255,255); + imagefilledrectangle($thumb,0,0,$resize_width-1,$resize_height-1,$white); + + // create temporary image having original type + switch($type) { + case 'gif' : + if(!function_exists('imagecreatefromgif')) return false; + $source = imagecreatefromgif($source_file); + break; + // jpg + case 'jpeg' : + case 'jpg' : + if(!function_exists('imagecreatefromjpeg')) return false; + $source = imagecreatefromjpeg($source_file); + break; + // png + case 'png' : + if(!function_exists('imagecreatefrompng')) return false; + $source = imagecreatefrompng($source_file); + break; + // bmp + case 'wbmp' : + case 'bmp' : + if(!function_exists('imagecreatefromwbmp')) return false; + $source = imagecreatefromwbmp($source_file); + break; + default : + return; + } + + // resize original image and put it into temporary image + $new_width = (int)($width * $per); + $new_height = (int)($height * $per); + + if($thumbnail_type == 'crop') { + $x = (int)($resize_width/2 - $new_width/2); + $y = (int)($resize_height/2 - $new_height/2); + } else { + $x = 0; + $y = 0; + } + + if($source) { + if(function_exists('imagecopyresampled')) imagecopyresampled($thumb, $source, $x, $y, 0, 0, $new_width, $new_height, $width, $height); + else imagecopyresized($thumb, $source, $x, $y, 0, 0, $new_width, $new_height, $width, $height); + } else return false; + + // create directory + $path = dirname($target_file); + if(!is_dir($path)) FileHandler::makeDir($path); + + // write into the file + switch($target_type) { + case 'gif' : + if(!function_exists('imagegif')) return false; + $output = imagegif($thumb, $target_file); + break; + case 'jpeg' : + case 'jpg' : + if(!function_exists('imagejpeg')) return false; + $output = imagejpeg($thumb, $target_file, 100); + break; + case 'png' : + if(!function_exists('imagepng')) return false; + $output = imagepng($thumb, $target_file, 9); + break; + case 'wbmp' : + case 'bmp' : + if(!function_exists('imagewbmp')) return false; + $output = imagewbmp($thumb, $target_file, 100); + break; + } + + imagedestroy($thumb); + imagedestroy($source); + + if(!$output) return false; + @chmod($target_file, 0644); + + return true; + } + + /** + * @brief reads ini file, and puts result into array + * @param[in] $filename path of the ini file + * @return ini array (if the target file does not exist, it returns false) + **/ + function readIniFile($filename){ + $filename = FileHandler::getRealPath($filename); + if(!file_exists($filename)) return false; + $arr = parse_ini_file($filename, true); + if(is_array($arr) && count($arr)>0) return $arr; + else return array(); + } + + + /** + * @brief write array into ini file + * @param[in] $filename target ini file name + * @param[in] $arr array + * @return if array contains nothing it returns false, otherwise true + **/ + function writeIniFile($filename, $arr){ + if(count($arr)==0) return false; + FileHandler::writeFile($filename, FileHandler::_makeIniBuff($arr)); + return true; + } + + function _makeIniBuff($arr){ + $return = ''; + foreach($arr as $key => $val){ + // section + if(is_array($val)){ + $return .= sprintf("[%s]\n",$key); + foreach($val as $k => $v){ + $return .= sprintf("%s=\"%s\"\n",$k,$v); + } + // value + }else if(is_string($val) || is_int($val)){ + $return .= sprintf("%s=\"%s\"\n",$key,$val); + } + } + return $return; + } + + /** + * @brief return file object + * @param[in] $filename target file name + * @param[in] $mode file mode for fopen + * @remarks if the directory of the file does not exist, create it. + * @return file object + **/ + function openFile($filename, $mode) + { + $pathinfo = pathinfo($filename); + $path = $pathinfo['dirname']; + if(!is_dir($path)) FileHandler::makeDir($path); + + require_once("FileObject.class.php"); + $file_object = new FileObject($file_name, $mode); + return $file_object; + } + + /** + * @brief check whether the given file has the content. + * @param[in] $file_name target file name + * @return return true if the file exists and contains something. + */ + function hasContent($filename) + { + return (is_readable($filename) && !!filesize($filename)); + } +} + +/* End of file FileObject.class.php */ +/* Location: ./classes/file/FileObject.class.php */ diff --git a/classes/file/FileObject.class.php b/classes/file/FileObject.class.php index 6c1ef931a..fd83b127c 100644 --- a/classes/file/FileObject.class.php +++ b/classes/file/FileObject.class.php @@ -1,128 +1,129 @@ Open($path, $mode); - } + /** + * @brief constructor + * @param[in] $path path of target file + * @param[in] $mode file open mode + * @return file object + **/ + function FileObject($path, $mode) + { + if($path != null) $this->Open($path, $mode); + } - /** - * @brief append target file's content to current file - * @param[in] $file_name path of target file - * @return none - **/ - function append($file_name) - { - $target = new FileObject($file_name, "r"); - while(!$target->feof()) - { - $readstr = $target->read(); - $this->write($readstr); - } - $target->close(); - } + /** + * @brief append target file's content to current file + * @param[in] $file_name path of target file + * @return none + **/ + function append($file_name) + { + $target = new FileObject($file_name, "r"); + while(!$target->feof()) + { + $readstr = $target->read(); + $this->write($readstr); + } + $target->close(); + } - /** - * @brief check current file meets eof - * @return true: if eof. false: otherwise - **/ - function feof() - { - return feof($this->fp); - } + /** + * @brief check current file meets eof + * @return true: if eof. false: otherwise + **/ + function feof() + { + return feof($this->fp); + } - /** - * @brief read from current file - * @param[in] $size size to read - * @return read bytes - **/ - function read($size = 1024) - { - return fread($this->fp, $size); - } + /** + * @brief read from current file + * @param[in] $size size to read + * @return read bytes + **/ + function read($size = 1024) + { + return fread($this->fp, $size); + } - /** - * @brief write string to current file - * @param[in] $str string to write - * @return written bytes. if failed, it returns false - **/ - function write($str) - { - $len = strlen($str); - if(!$str || $len <= 0) return false; - if(!$this->fp) return false; - $written = fwrite($this->fp, $str); - return $written; - } + /** + * @brief write string to current file + * @param[in] $str string to write + * @return written bytes. if failed, it returns false + **/ + function write($str) + { + $len = strlen($str); + if(!$str || $len <= 0) return false; + if(!$this->fp) return false; + $written = fwrite($this->fp, $str); + return $written; + } - /** - * @brief open a file - * @param[in] $path path of target file - * @param[in] $mode file open mode - * @remarks if file is opened, close it and open the new path - * @return true if succeed, false otherwise. - */ - function open($path, $mode) - { - if($this->fp != null) - { - $this->close(); - } - $this->fp = fopen($path, $mode); - if(! is_resource($this->fp) ) - { - $this->fp = null; - return false; - } - $this->path = $path; - return true; - } + /** + * @brief open a file + * @param[in] $path path of target file + * @param[in] $mode file open mode + * @remarks if file is opened, close it and open the new path + * @return true if succeed, false otherwise. + */ + function open($path, $mode) + { + if($this->fp != null) + { + $this->close(); + } + $this->fp = fopen($path, $mode); + if(! is_resource($this->fp) ) + { + $this->fp = null; + return false; + } + $this->path = $path; + return true; + } - /** - * @brief return current file's path - * @return file path - **/ - function getPath() - { - if($this->fp != null) - { - return $this->path; - } - else - { - return null; - } - } + /** + * @brief return current file's path + * @return file path + **/ + function getPath() + { + if($this->fp != null) + { + return $this->path; + } + else + { + return null; + } + } - /** - * @brief close file - * @return none - **/ - function close() - { - if($this->fp != null) - { - fclose($this->fp); - $this->fp = null; - } - } + /** + * @brief close file + * @return none + **/ + function close() + { + if($this->fp != null) + { + fclose($this->fp); + $this->fp = null; + } + } +} - } -?> +/* End of file FileObject.class.php */ +/* Location: ./classes/file/FileObject.class.php */ diff --git a/classes/object/Object.class.php b/classes/object/Object.class.php index d2ec62298..36cefe90d 100644 --- a/classes/object/Object.class.php +++ b/classes/object/Object.class.php @@ -1,148 +1,149 @@ setError($error); + $this->setMessage($message); + } - /** - * @brief constructor - **/ - function Object($error = 0, $message = 'success') { - $this->setError($error); - $this->setMessage($message); - } + /** + * @brief Setter to set error code + * @param[in] $error error code + **/ + function setError($error = 0) { + $this->error = $error; + } - /** - * @brief Setter to set error code - * @param[in] $error error code - **/ - function setError($error = 0) { - $this->error = $error; - } + /** + * @brief Getter to retrieve error code + **/ + function getError() { + return $this->error; + } - /** - * @brief Getter to retrieve error code - **/ - function getError() { - return $this->error; - } + function setHttpStatusCode($code = '200') + { + $this->httpStatusCode = $code; + } - function setHttpStatusCode($code = '200') - { - $this->httpStatusCode = $code; + function getHttpStatusCode() + { + return $this->httpStatusCode; + } + + /** + * @brief Setter to set set the error message + * @param[in] $message a messge string + * @return return True + * @remark this method always returns True. We'd better remove it + **/ + function setMessage($message = 'success') { + if(Context::getLang($message)) $message = Context::getLang($message); + $this->message = $message; + return true; + } + + /** + * @brief getter to retrieve an error message + **/ + function getMessage() { + return $this->message; + } + + /** + * @brief setter to set a key/value pair as an additional variable + * @param[in] $key a variable name + * @param[in] $val a value for the variable + **/ + function add($key, $val) { + $this->variables[$key] = $val; + } + + /** + * @brief method to set multiple key/value pairs as an additional variables + * @param[in] $object either object or array containg key/value pairs to be added + **/ + function adds($object) { + if(is_object($object)) { + $vars = get_object_vars($object); + foreach($vars as $key => $val) $this->add($key, $val); + } elseif(is_array($object)) { + foreach($object as $key => $val) $this->add($key, $val); } + } - function getHttpStatusCode() - { - return $this->httpStatusCode; + /** + * @brief method to retrieve a corresponding value to a given key + **/ + function get($key) { + return $this->variables[$key]; + } + + + /** + * @brief method to retrieve an object containing a key/value paris + * @return Returns an object containing key/value pairs + **/ + function gets() { + $num_args = func_num_args(); + $args_list = func_get_args(); + for($i=0;$i<$num_args;$i++) { + $key = $args_list[$i]; + $output->{$key} = $this->get($key); } + return $output; + } - /** - * @brief Setter to set set the error message - * @param[in] $message a messge string - * @return return True - * @remark this method always returns True. We'd better remove it - **/ - function setMessage($message = 'success') { - if(Context::getLang($message)) $message = Context::getLang($message); - $this->message = $message; - return true; - } + /** + * @brief method to retrieve an array of key/value pairs + * @return Return a list of key/value pairs + **/ + function getVariables() { + return $this->variables; + } - /** - * @brief getter to retrieve an error message - **/ - function getMessage() { - return $this->message; - } + /** + * @brief method to retrieve an object of key/value pairs + * @return Return an object of key/value pairs + **/ + function getObjectVars() { + foreach($this->variables as $key => $val) $output->{$key} = $val; + return $output; + } - /** - * @brief setter to set a key/value pair as an additional variable - * @param[in] $key a variable name - * @param[in] $val a value for the variable - **/ - function add($key, $val) { - $this->variables[$key] = $val; - } - - /** - * @brief method to set multiple key/value pairs as an additional variables - * @param[in] $object either object or array containg key/value pairs to be added - **/ - function adds($object) { - if(is_object($object)) { - $vars = get_object_vars($object); - foreach($vars as $key => $val) $this->add($key, $val); - } elseif(is_array($object)) { - foreach($object as $key => $val) $this->add($key, $val); - } - } - - /** - * @brief method to retrieve a corresponding value to a given key - **/ - function get($key) { - return $this->variables[$key]; - } + /** + * @brief method to return either true or false depnding on the value in a 'error' variable + * @remark this method is misleading in that it returns true if error is 0, which should be true in + * boolean representation. + **/ + function toBool() { + return $this->error==0?true:false; + } - /** - * @brief method to retrieve an object containing a key/value paris - * @return Returns an object containing key/value pairs - **/ - function gets() { - $num_args = func_num_args(); - $args_list = func_get_args(); - for($i=0;$i<$num_args;$i++) { - $key = $args_list[$i]; - $output->{$key} = $this->get($key); - } - return $output; - } + /** + * @brief method to return either true or false depnding on the value in a 'error' variable + **/ + function toBoolean() { + return $this->toBool(); + } +} - /** - * @brief method to retrieve an array of key/value pairs - * @return Return a list of key/value pairs - **/ - function getVariables() { - return $this->variables; - } - - /** - * @brief method to retrieve an object of key/value pairs - * @return Return an object of key/value pairs - **/ - function getObjectVars() { - foreach($this->variables as $key => $val) $output->{$key} = $val; - return $output; - } - - /** - * @brief method to return either true or false depnding on the value in a 'error' variable - * @remark this method is misleading in that it returns true if error is 0, which should be true in - * boolean representation. - **/ - function toBool() { - return $this->error==0?true:false; - } - - - /** - * @brief method to return either true or false depnding on the value in a 'error' variable - **/ - function toBoolean() { - return $this->toBool(); - } - } -?> +/* End of file Object.class.php */ +/* Location: ./classes/object/Object.class.php */ From 7a9430263ee8aadc4086d40ef4c3fb9ea4953102 Mon Sep 17 00:00:00 2001 From: devjin Date: Thu, 17 Nov 2011 02:19:05 +0000 Subject: [PATCH 1345/1372] The "getAutoEncodedUrl" function is added git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9829 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/context/Context.class.php | 22 ++++++++++++++++++++-- config/func.inc.php | 9 +++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/classes/context/Context.class.php b/classes/context/Context.class.php index a2486ecde..a1247d33d 100644 --- a/classes/context/Context.class.php +++ b/classes/context/Context.class.php @@ -789,7 +789,7 @@ class Context { * @brief make URL with args_list upon request URL * @return result URL **/ - function getUrl($num_args=0, $args_list=array(), $domain = null, $encode = true) { + function getUrl($num_args=0, $args_list=array(), $domain = null, $encode = true, $auto = false) { static $site_module_info = null; static $current_info = null; @@ -935,7 +935,25 @@ class Context { else $query = getScriptPath().$query; } - return $encode?htmlspecialchars($query):$query; + if ($encode){ + if($auto){ + $parsedUrl = parse_url($query); + parse_str($parsedUrl['query'], $output); + $encode_queries = array(); + foreach($output as $key=>$value){ + if (!preg_match('/&[a-z]{2,};/', $value)){ + $value = htmlspecialchars($value); + } + $encode_queries[] = $key.'='.$value; + } + $encode_query = implode('&', $encode_queries); + return $parsedUrl['path'].'?'.$encode_query; + } + else + return htmlspecialchars($query); + }else{ + return $query; + } } /** diff --git a/config/func.inc.php b/config/func.inc.php index 5a887e3d2..130d7d0c4 100644 --- a/config/func.inc.php +++ b/config/func.inc.php @@ -238,6 +238,15 @@ return preg_replace('@\berror_return_url=[^&]*|\w+=(?:&|$)@', '', $url); } + function getAutoEncodedUrl() { + $num_args = func_num_args(); + $args_list = func_get_args(); + + if($num_args) $url = Context::getUrl($num_args, $args_list, null, true, true); + else $url = Context::getRequestUri(); + + return preg_replace('@\berror_return_url=[^&]*|\w+=(?:&|$)@', '', $url); + } /** * @brief return the value adding request uri to getUrl() * to get the full url From 0a80a5f9e3100c1f0c1c01b0fd48dfb67d3e3f99 Mon Sep 17 00:00:00 2001 From: devjin Date: Thu, 17 Nov 2011 02:58:35 +0000 Subject: [PATCH 1346/1372] git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9830 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/context/Context.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/context/Context.class.php b/classes/context/Context.class.php index a1247d33d..0605543bc 100644 --- a/classes/context/Context.class.php +++ b/classes/context/Context.class.php @@ -941,7 +941,7 @@ class Context { parse_str($parsedUrl['query'], $output); $encode_queries = array(); foreach($output as $key=>$value){ - if (!preg_match('/&[a-z]{2,};/', $value)){ + if (!preg_match('/&([a-z]{2,}|#\d+);/', $value)){ $value = htmlspecialchars($value); } $encode_queries[] = $key.'='.$value; From 264ce13d099501893e0a042b2f39e015d55a9a63 Mon Sep 17 00:00:00 2001 From: chschy Date: Thu, 17 Nov 2011 02:59:11 +0000 Subject: [PATCH 1347/1372] issu 995, modifed markup of xe_sloid_enterprise_login in widget git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9831 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- .../skins/xe_solid_enterprise_login/login_info.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/widgets/login_info/skins/xe_solid_enterprise_login/login_info.html b/widgets/login_info/skins/xe_solid_enterprise_login/login_info.html index 3043148ef..8af0d1fd1 100644 --- a/widgets/login_info/skins/xe_solid_enterprise_login/login_info.html +++ b/widgets/login_info/skins/xe_solid_enterprise_login/login_info.html @@ -2,9 +2,9 @@ +
                                                          - \ No newline at end of file From a66637367fc2f9fdf6ee5151905c1d2b27c1105c Mon Sep 17 00:00:00 2001 From: chschy Date: Thu, 17 Nov 2011 07:07:58 +0000 Subject: [PATCH 1348/1372] issue 783, modifed form of modify_info.html in xe_solid~ theme git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9836 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- .../modules/member/js/signup_check.js | 52 +++ .../modules/member/modify_info.html | 298 ++---------------- 2 files changed, 86 insertions(+), 264 deletions(-) create mode 100644 themes/xe_solid_enterprise/modules/member/js/signup_check.js diff --git a/themes/xe_solid_enterprise/modules/member/js/signup_check.js b/themes/xe_solid_enterprise/modules/member/js/signup_check.js new file mode 100644 index 000000000..77116ddb4 --- /dev/null +++ b/themes/xe_solid_enterprise/modules/member/js/signup_check.js @@ -0,0 +1,52 @@ +/** + * @brief 회원 가입시나 정보 수정시 각 항목의 중복 검사등을 하는 기능을 구현 + * @author NHN (developer@xpressengine.com) + **/ + +// 입력이 시작된 것과 입력후 정해진 시간동안 내용이 변하였을 경우 서버에 ajax로 체크를 하기 위한 변수 설정 +var memberCheckObj = { target:null, value:null } + +// domready시에 특정 필드들에 대해 이벤트를 걸어 놓음 +jQuery(document).ready(memberSetEvent); + +function memberSetEvent() { + jQuery('#fo_insert_member :input') + .filter('[name=user_id],[name=nick_name],[name=email_address]') + .blur(memberCheckValue); +} + + +// 실제 서버에 특정 필드의 value check를 요청하고 이상이 있으면 메세지를 뿌려주는 함수 +function memberCheckValue(event) { + var field = event.target; + var _name = field.name; + var _value = field.value; + if(!_name || !_value) return; + + var params = {name:_name, value:_value}; + var response_tags = ['error','message']; + + exec_xml('member','procMemberCheckValue', params, completeMemberCheckValue, response_tags, field); +} + +// 서버에서 응답이 올 경우 이상이 있으면 메세지를 출력 +function completeMemberCheckValue(ret_obj, response_tags, field) { + var _id = 'dummy_check'+field.name; + var dummy = jQuery('#'+_id); + + if(ret_obj['message']=='success') { + dummy.html('').hide(); + return; + } + + if (!dummy.length) { + dummy = jQuery('
                                                          ').attr('id', _id).appendTo(field.parentNode); + } + + dummy.html(ret_obj['message']).show(); +} + +// 결과 메세지를 정리하는 함수 +function removeMemberCheckValueOutput(dummy, obj) { + dummy.style.display = "none"; +} diff --git a/themes/xe_solid_enterprise/modules/member/modify_info.html b/themes/xe_solid_enterprise/modules/member/modify_info.html index 239956d45..c85e6fe2d 100644 --- a/themes/xe_solid_enterprise/modules/member/modify_info.html +++ b/themes/xe_solid_enterprise/modules/member/modify_info.html @@ -1,32 +1,21 @@ - - - - - - - - - - - - - - - - - - - - - + + -

                                                          {$lang->msg_update_member}

                                                          +

                                                          {$lang->msg_update_member}

                                                          + +
                                                          +

                                                          {$XE_VALIDATOR_MESSAGE}

                                                          +
                                                          -
                                                          profile_image == 'Y' || $member_config->image_name=='Y' || $member_config->image_mark=='Y')-->enctype="multipart/form-data" target="tmp_upload_iframe"> - + + @@ -35,247 +24,33 @@ - - + + - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
                                                          {$formTag->inputTag}
                                                          +
                                                          {$editor}
                                                          + - - - - - - - - - - - - {@ $dummy_chk = 0 } - - class="first-child" {@ $dummy_chk = 1; }> - +

                                                          {$lang->about_allow_mailing}

                                                          + - - - - - - + + -
                                                          {$lang->member_default_info}
                                                          {$lang->user_id}
                                                          {htmlspecialchars($member_info->user_id)}
                                                          {$identifierForm->title} *
                                                          + {$identifierForm->name} + +
                                                          {$lang->user_name} *

                                                          {$lang->about_user_name}

                                                          {$lang->nick_name} *

                                                          {$lang->about_nick_name}

                                                          {$lang->email_address} *

                                                          {$lang->about_email_address}

                                                          {$lang->find_account_question} *
                                                          {$formTag->title}
                                                          - -
                                                          - -
                                                          {$lang->profile_image}
                                                          - - - - - -

                                                          {$lang->profile_image_max_width} : {$member_config->profile_image_max_width}px, {$lang->profile_image_max_height} : {$member_config->profile_image_max_height}px

                                                          -
                                                          {$lang->image_name}
                                                          - - - - - -

                                                          {$lang->image_name_max_width} : {$member_config->image_name_max_width}px, {$lang->image_name_max_height} : {$member_config->image_name_max_height}px

                                                          -
                                                          {$lang->image_mark}
                                                          - - - - - -

                                                          {$lang->image_mark_max_width} : {$member_config->image_mark_max_width}px, {$lang->image_mark_max_height} : {$member_config->image_mark_max_height}px

                                                          -
                                                          {$lang->homepage}

                                                          {$lang->about_homepage}

                                                          {$lang->blog}

                                                          {$lang->about_blog_url}

                                                          {$lang->birthday}
                                                          - - - - -

                                                          {$lang->about_birthday}

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

                                                          {$lang->about_allow_mailing}

                                                          {$lang->signature}
                                                          {$editor}
                                                          {$lang->member_extend_info}
                                                          - {htmlspecialchars($val->column_title)} - * - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                                            - -
                                                          • value)&&in_array($v, $val->value))-->checked="checked"/>{$v}
                                                          • - -
                                                          - - - - - -
                                                            - -
                                                          • value == $v)-->checked="checked"/>{$v}
                                                          • - -
                                                          - - - - - - - - -
                                                          - - -
                                                          - - -
                                                          -
                                                          - - - - - - - - - - - - - - - - - -

                                                          {$val->description}

                                                          -
                                                          - is_opened)-->checked="checked" value="Y" id="open_{$val->column_name}" /> - -
                                                          -
                                                          {$lang->openid}
                                                          - - - - - -
                                                          {$lang->allow_message}
                                                          + + + +
                                                          @@ -284,24 +59,19 @@
                                                          - - - - - - + From 75d660bf1a165b3520fd66e588d2a2e42693b1d2 Mon Sep 17 00:00:00 2001 From: chschy Date: Thu, 17 Nov 2011 08:13:59 +0000 Subject: [PATCH 1349/1372] issue 783, added return action git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9838 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- themes/xe_solid_enterprise/modules/member/modify_info.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/xe_solid_enterprise/modules/member/modify_info.html b/themes/xe_solid_enterprise/modules/member/modify_info.html index c85e6fe2d..e666d1387 100644 --- a/themes/xe_solid_enterprise/modules/member/modify_info.html +++ b/themes/xe_solid_enterprise/modules/member/modify_info.html @@ -14,7 +14,7 @@

                                                          {$XE_VALIDATOR_MESSAGE}

                                                          -
                                                          + From 0dbd9091b06962bec96c0d7cc78eb1f3cacc0dc3 Mon Sep 17 00:00:00 2001 From: devjin Date: Thu, 17 Nov 2011 08:32:55 +0000 Subject: [PATCH 1350/1372] fixed XSS security in integration search git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9839 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/context/Context.class.php | 15 ++++++++------- config/func.inc.php | 10 +++++++++- .../integration_search.view.php | 3 +++ .../skins/default/document.html | 8 ++++---- .../integration_search/skins/default/header.html | 14 +++++++------- .../integration_search/skins/default/index.html | 10 +++++----- 6 files changed, 36 insertions(+), 24 deletions(-) diff --git a/classes/context/Context.class.php b/classes/context/Context.class.php index 0605543bc..40c447551 100644 --- a/classes/context/Context.class.php +++ b/classes/context/Context.class.php @@ -789,7 +789,7 @@ class Context { * @brief make URL with args_list upon request URL * @return result URL **/ - function getUrl($num_args=0, $args_list=array(), $domain = null, $encode = true, $auto = false) { + function getUrl($num_args=0, $args_list=array(), $domain = null, $encode = true, $autoEncode = false) { static $site_module_info = null; static $current_info = null; @@ -936,21 +936,22 @@ class Context { } if ($encode){ - if($auto){ + if($autoEncode){ $parsedUrl = parse_url($query); parse_str($parsedUrl['query'], $output); $encode_queries = array(); foreach($output as $key=>$value){ - if (!preg_match('/&([a-z]{2,}|#\d+);/', $value)){ - $value = htmlspecialchars($value); + if (preg_match('/&([a-z]{2,}|#\d+);/', urldecode($value))){ + $value = urlencode(htmlspecialchars_decode(urldecode($value))); } $encode_queries[] = $key.'='.$value; } - $encode_query = implode('&', $encode_queries); - return $parsedUrl['path'].'?'.$encode_query; + $encode_query = implode('&', $encode_queries); + return htmlspecialchars($parsedUrl['path'].'?'.$encode_query); } - else + else{ return htmlspecialchars($query); + } }else{ return $query; } diff --git a/config/func.inc.php b/config/func.inc.php index 130d7d0c4..ac2bd5642 100644 --- a/config/func.inc.php +++ b/config/func.inc.php @@ -27,7 +27,15 @@ return $str; } '); - } + } + + if ( !function_exists('htmlspecialchars_decode') ) + { + function htmlspecialchars_decode($text) + { + return strtr($text, array_flip(get_html_translation_table(HTML_SPECIALCHARS))); + } + } // time zone $time_zone = array( diff --git a/modules/integration_search/integration_search.view.php b/modules/integration_search/integration_search.view.php index 8b459d8d5..156ec0bf5 100644 --- a/modules/integration_search/integration_search.view.php +++ b/modules/integration_search/integration_search.view.php @@ -98,6 +98,9 @@ } else { $this->setTemplateFile("no_keywords"); } + + $security = new Security(); + $security->encodeHTML('is_keyword', 'search_target', 'where', 'page'); } } ?> diff --git a/modules/integration_search/skins/default/document.html b/modules/integration_search/skins/default/document.html index e6d765804..c1bf9d367 100644 --- a/modules/integration_search/skins/default/document.html +++ b/modules/integration_search/skins/default/document.html @@ -37,17 +37,17 @@ diff --git a/modules/integration_search/skins/default/header.html b/modules/integration_search/skins/default/header.html index 424e6121f..aa65829a3 100644 --- a/modules/integration_search/skins/default/header.html +++ b/modules/integration_search/skins/default/header.html @@ -19,17 +19,17 @@ - + diff --git a/modules/integration_search/skins/default/index.html b/modules/integration_search/skins/default/index.html index e1aef06ec..c701fd677 100644 --- a/modules/integration_search/skins/default/index.html +++ b/modules/integration_search/skins/default/index.html @@ -3,30 +3,30 @@ {@ $output = $search_result['document'] } - + {@ $output = $search_result['comment'] } - + {@ $output = $search_result['trackback'] } {@ $search_target = 'title'; } - + {@ $output = $search_result['multimedia'] } - + {@ $output = $search_result['file'] } - + From 51ebc7316a6cc3bf7fb548e8c185e81ff858d76d Mon Sep 17 00:00:00 2001 From: taggon Date: Thu, 17 Nov 2011 09:16:56 +0000 Subject: [PATCH 1351/1372] Add __XE_VERSION__ git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9840 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- config/config.inc.php | 3 ++- index.php | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/config/config.inc.php b/config/config.inc.php index ce2788579..0e50a57a5 100644 --- a/config/config.inc.php +++ b/config/config.inc.php @@ -13,7 +13,8 @@ * @brief display XE's full version * Even The file should be revised when releasing altough no change is made **/ - define('__ZBXE_VERSION__', '1.5.0.8'); + define('__XE_VERSION__', '1.5.0.8'); + define('__ZBXE_VERSION__', __XE_VERSION__); // deprecated : __ZBXE_VERSION__ will be removed. Use __XE_VERSION__ instead. /** * @brief The base path to where you installed zbXE Wanted diff --git a/index.php b/index.php index a0bd9cec0..2a25abc6f 100644 --- a/index.php +++ b/index.php @@ -33,8 +33,8 @@ /** * @brief Declare constants for generic use and for checking to avoid a direct call from the Web **/ - define('__ZBXE__', true); // deprecated : The constant ZBXE will be removed. Use XE instead. define('__XE__', true); + define('__ZBXE__', true); // deprecated : __ZBXE__ will be removed. Use __XE__ instead. /** * @brief Include the necessary configuration files From b225ca7cd1200392327e9f98cf9426941640e70f Mon Sep 17 00:00:00 2001 From: devjin Date: Thu, 17 Nov 2011 09:33:01 +0000 Subject: [PATCH 1352/1372] version upgade git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9842 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- config/config.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/config.inc.php b/config/config.inc.php index 0e50a57a5..9044fcde1 100644 --- a/config/config.inc.php +++ b/config/config.inc.php @@ -13,7 +13,7 @@ * @brief display XE's full version * Even The file should be revised when releasing altough no change is made **/ - define('__XE_VERSION__', '1.5.0.8'); + define('__XE_VERSION__', '1.5.0.9'); define('__ZBXE_VERSION__', __XE_VERSION__); // deprecated : __ZBXE_VERSION__ will be removed. Use __XE_VERSION__ instead. /** From f665cf843b534ef45bcd7aeb94dbb09f9cc3942b Mon Sep 17 00:00:00 2001 From: ucorina Date: Thu, 17 Nov 2011 13:02:24 +0000 Subject: [PATCH 1353/1372] Added DB type to query cache file name. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9845 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/db/DB.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/db/DB.class.php b/classes/db/DB.class.php index 26b05952b..85339e092 100644 --- a/classes/db/DB.class.php +++ b/classes/db/DB.class.php @@ -382,7 +382,7 @@ function checkQueryCacheFile($query_id,$xml_file){ // first try finding cache file - $cache_file = sprintf('%s%s%s.%s.cache.php', _XE_PATH_, $this->cache_file, $query_id, __ZBXE_VERSION__); + $cache_file = sprintf('%s%s%s.%s.%s.cache.php', _XE_PATH_, $this->cache_file, $query_id, __ZBXE_VERSION__, $this->db_type); if(file_exists($cache_file)) $cache_time = filemtime($cache_file); else $cache_time = -1; From 4dd01ec7c69a9adacba9ed743897a315f87eceba Mon Sep 17 00:00:00 2001 From: taggon Date: Sat, 19 Nov 2011 03:09:32 +0000 Subject: [PATCH 1354/1372] issue 1043: Fixed a bug for empty git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9847 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/install/install.view.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/install/install.view.php b/modules/install/install.view.php index f8a7b43e6..fce943937 100644 --- a/modules/install/install.view.php +++ b/modules/install/install.view.php @@ -13,6 +13,8 @@ * @brief Initialization **/ function init() { + // Set browser title + Context::setBrowserTitle(Context::getLang('introduce_title')); // Specify the template path $this->setTemplatePath($this->module_path.'tpl'); // Error occurs if already installed From 74026e58d7d4f1cafd08e6b08ebf69579b4510e7 Mon Sep 17 00:00:00 2001 From: ovclas <ovclas@gmail.com> Date: Tue, 22 Nov 2011 02:58:20 +0000 Subject: [PATCH 1355/1372] issue 448 check menu_srl git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9848 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/menu/menu.admin.model.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/menu/menu.admin.model.php b/modules/menu/menu.admin.model.php index d0e72089a..6c4b5f2f3 100644 --- a/modules/menu/menu.admin.model.php +++ b/modules/menu/menu.admin.model.php @@ -81,8 +81,11 @@ if(is_array($output->data)) $menu_info = $output->data[0]; else $menu_info = $output->data; - $menu_info->xml_file = sprintf('./files/cache/menu/%s.xml.php',$menu_info->menu_srl); - $menu_info->php_file = sprintf('./files/cache/menu/%s.php',$menu_info->menu_srl); + if($menu_info->menu_srl) + { + $menu_info->xml_file = sprintf('./files/cache/menu/%s.xml.php',$menu_info->menu_srl); + $menu_info->php_file = sprintf('./files/cache/menu/%s.php',$menu_info->menu_srl); + } return $menu_info; } From aa90148aa368ba3d83172082b6c24a8d3e6eac2e Mon Sep 17 00:00:00 2001 From: ChanMyeong <dece24@gmail.com> Date: Tue, 22 Nov 2011 06:10:27 +0000 Subject: [PATCH 1356/1372] Language & UI fixed. Installed Layout Admin. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9849 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/layout/tpl/layout_modify.html | 20 ++++++++++---------- modules/menu/lang/lang.xml | 10 ---------- modules/module/lang/lang.xml | 20 ++++++++++---------- 3 files changed, 20 insertions(+), 30 deletions(-) diff --git a/modules/layout/tpl/layout_modify.html b/modules/layout/tpl/layout_modify.html index 3df6c31ef..5523b2c30 100644 --- a/modules/layout/tpl/layout_modify.html +++ b/modules/layout/tpl/layout_modify.html @@ -28,6 +28,13 @@ <p class="q">{$lang->author}</p> <p class="a"><a href="{$selected_layout->author->homepage}" target="_blank">{$selected_layout->author->name}</a></p> </li> + <li> + <p class="q">{$lang->title} <em>*</em></p> + <p class="a"> + <input type="text" name="title" value="{$selected_layout->layout_title}" /> + </p> + <p class="desc">{$lang->about_title}</p> + </li> <li> <p class="q">{$lang->header_script}</p> <p class="a"> @@ -35,13 +42,6 @@ </p> <p class="desc">{$lang->about_header_script}</p> </li> - <li> - <p class="q">{$lang->title}</p> - <p class="a"> - <input type="text" name="title" value="{$selected_layout->layout_title}" /> - </p> - <p class="desc">{$lang->about_title}</p> - </li> </ul> <block loop="$selected_layout->extra_var => $name, $var"> @@ -124,13 +124,13 @@ <h3 class="h3" cond="$selected_layout->menu">{$lang->menu}</h3> <ul cond="$selected_layout->menu"> <li loop="$selected_layout->menu => $menu_name, $menu_info"> - <p class="q">{$menu_info->title} ({$menu_name})</p> + <p class="q">{$menu_info->title}({$menu_name})</p> <p class="a"> <select name="{$menu_name}"> - <option value="0">------------------------</option> + <option value="0">{$lang->cmd_select}</option> <option loop="$menu_list => $key, $val" value="{$val->menu_srl}" selected="selected"|cond="$val->menu_srl == $menu_info->menu_srl">{$val->title}</option> </select> - <a href="#">{$lang->cmd_management}</a> + <a href="{getUrl('module','admin','act','dispMenuAdminSiteMap')}">{$lang->cmd_management}</a> </p> </li> <li> diff --git a/modules/menu/lang/lang.xml b/modules/menu/lang/lang.xml index f0e02cdba..827b3dabc 100644 --- a/modules/menu/lang/lang.xml +++ b/modules/menu/lang/lang.xml @@ -24,16 +24,6 @@ <value xml:lang="tr"><![CDATA[Menü Yönetimi]]></value> <value xml:lang="vi"><![CDATA[Quản lý Menu]]></value> </item> - <item name="menu"> - <value xml:lang="ko"><![CDATA[메뉴]]></value> - <value xml:lang="en"><![CDATA[Menu]]></value> - <value xml:lang="jp"><![CDATA[メニュー]]></value> - <value xml:lang="zh-CN"><![CDATA[菜单]]></value> - <value xml:lang="zh-TW"><![CDATA[選單]]></value> - <value xml:lang="ru"><![CDATA[Меню]]></value> - <value xml:lang="es"><![CDATA[Menú]]></value> - <value xml:lang="tr"><![CDATA[Menü]]></value> - </item> <item name="menu_count"> <value xml:lang="ko"><![CDATA[메뉴 수]]></value> <value xml:lang="en"><![CDATA[No. of menus]]></value> diff --git a/modules/module/lang/lang.xml b/modules/module/lang/lang.xml index 26a9772c2..3953dd38d 100644 --- a/modules/module/lang/lang.xml +++ b/modules/module/lang/lang.xml @@ -411,16 +411,16 @@ <value xml:lang="tr"><![CDATA[Başlık Betiği(script)]]></value> </item> <item name="about_header_script"> - <value xml:lang="ko"><![CDATA[HTML의 <head>와 </head> 사이에 들어가는 코드를 직접 입력할 수 있습니다.<br /><script, <style 또는 <meta 태그 등을 이용하실 수 있습니다.]]></value> - <value xml:lang="en"><![CDATA[You can input the html script between <header> and </header> by yourself.<br />You can use <script, <style or <meta tags.]]></value> - <value xml:lang="jp"><![CDATA[HTMLの<header>と</header>の間に入れるコードを直接入力できます。<br /><script、<styleまたは<metaタグなどを利用できます。]]></value> - <value xml:lang="zh-CN"><![CDATA[可以直接输入插入到html中<head>区的代码。<br />可使用<script, <style 或 <meta 等标签。]]></value> - <value xml:lang="zh-TW"><![CDATA[可以直接輸入,並插入到 HTML 的<head>之間。<br />可使用<script>,<style>或<meta>等標籤。]]></value> - <value xml:lang="fr"><![CDATA[Vous pouvez entrer un script en html par vous-même entre <header> et </header>.<br />Vous pouvez utiliser <script, <style ou <meta tag]]></value> - <value xml:lang="ru"><![CDATA[html의 <header>와 </header> 사이에 들어가는 코드를 직접 입력할 수 있습니다.<br /><script, <style 또는 <meta 태그등을 이용하실 수 있습니다]]></value> - <value xml:lang="es"><![CDATA[html의 <header>와 </header> 사이에 들어가는 코드를 직접 입력할 수 있습니다.<br /><script, <style 또는 <meta 태그등을 이용하실 수 있습니다]]></value> - <value xml:lang="tr"><![CDATA[Html betiğini(script) <header> ile </header> arasına kendiniz ekleyebilirsiniz.<br /> <script, <style or <meta tag kullanabilirsiniz]]></value> - <value xml:lang="vi"><![CDATA[Bạn co thể nhập mã dang HTML vào giữa <header> và </header>.<br />Bạn có thể sử dụng <script, <style hay <meta tag]]></value> + <value xml:lang="ko"><![CDATA[HTML <head>...</head> 사이에 들어가는 코드를 직접 입력할 수 있습니다. 예) <script>, <style>, <meta> ...]]></value> + <value xml:lang="en"><![CDATA[You can input the html script between <header> and </header> by yourself. You can use <script>, <style> or <meta> tags.]]></value> + <value xml:lang="jp"><![CDATA[HTMLの<header>と</header>の間に入れるコードを直接入力できます。 <script>、<style>または<meta>タグなどを利用できます。]]></value> + <value xml:lang="zh-CN"><![CDATA[可以直接输入插入到html中<head>区的代码。 可使用<script>, <style> 或 <meta> 等标签。]]></value> + <value xml:lang="zh-TW"><![CDATA[可以直接輸入,並插入到 HTML 的<head>之間。 可使用<script>,<style>或<meta>等標籤。]]></value> + <value xml:lang="fr"><![CDATA[Vous pouvez entrer un script en html par vous-même entre <header> et </header>. Vous pouvez utiliser <script>, <style> ou <meta> tag]]></value> + <value xml:lang="ru"><![CDATA[html의 <header>와 </header> 사이에 들어가는 코드를 직접 입력할 수 있습니다. <script>, <style>, <meta> 태그등을 이용하실 수 있습니다]]></value> + <value xml:lang="es"><![CDATA[html의 <header>와 </header> 사이에 들어가는 코드를 직접 입력할 수 있습니다. <script>, <style>, <meta> 태그등을 이용하실 수 있습니다]]></value> + <value xml:lang="tr"><![CDATA[Html betiğini(script) <header> ile </header> arasına kendiniz ekleyebilirsiniz. <script>, <style>, <meta> tag kullanabilirsiniz]]></value> + <value xml:lang="vi"><![CDATA[Bạn co thể nhập mã dang HTML vào giữa <header> và </header>. Bạn có thể sử dụng <script>, <style> hay <meta> tag]]></value> </item> <item name="grant_access"> <value xml:lang="ko"><![CDATA[접근 권한]]></value> From 67751eb85bece02551d4410fc06c3c7bf1559e6b Mon Sep 17 00:00:00 2001 From: taggon <gonom9@gmail.com> Date: Tue, 22 Nov 2011 07:46:47 +0000 Subject: [PATCH 1357/1372] All classes can be tested from now. 1) Add some test files. 2) Create a folder for fronendfile. Move the class file into the folder. 3) Write Bootstrap.php file. 4) Modify phpunit.xml file. 5) Add a context mock class. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9850 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- tests/Bootstrap.php | 24 ++++++ tests/classes/context/Context.mock.php | 62 +++++++++++++++ tests/classes/context/ContextTest.php | 20 +++++ .../FrontEndFileHandlerTest.php | 52 +++---------- tests/classes/security/SecurityTest.php | 38 ++------- .../classes/template/TemplateHandlerTest.php | 8 +- tests/classes/validator/ValidatorTest.php | 77 +++++-------------- tests/phpunit.xml | 2 +- 8 files changed, 148 insertions(+), 135 deletions(-) create mode 100644 tests/classes/context/Context.mock.php create mode 100644 tests/classes/context/ContextTest.php rename tests/classes/{security => frontendfile}/FrontEndFileHandlerTest.php (91%) diff --git a/tests/Bootstrap.php b/tests/Bootstrap.php index e69de29bb..4e9aa95d1 100644 --- a/tests/Bootstrap.php +++ b/tests/Bootstrap.php @@ -0,0 +1,24 @@ +<?php + +if(!defined('__DEBUG__')) define('__DEBUG__', 1); +if(!defined('__XE__')) define('__XE__', true); +if(!defined('__ZBXE__')) define('__ZBXE__', true); +if(!defined('_XE_PATH_')) define('_XE_PATH_', realpath(dirname(__FILE__).'/../').'/'); + +error_reporting(E_ALL & ~E_NOTICE); + +/** + * Print out the message + **/ +function _log($msg) { + $args = func_get_args(); + + foreach($args as $arg) { + fwrite(STDOUT, "\n"); + fwrite(STDOUT, print_r($arg, true)); + } + fwrite(STDOUT, "\n"); +} + +/* End of file Bootstrap.php */ +/* Location: ./tests/Bootstrap.php */ diff --git a/tests/classes/context/Context.mock.php b/tests/classes/context/Context.mock.php new file mode 100644 index 000000000..607c85bd5 --- /dev/null +++ b/tests/classes/context/Context.mock.php @@ -0,0 +1,62 @@ +<?php + +if(!defined('FOLLOW_REQUEST_SSL')) define('FOLLOW_REQUEST_SSL',0); +if(!defined('ENFORCE_SSL')) define('ENFORCE_SSL',1); +if(!defined('RELEASE_SSL')) define('RELEASE_SSL',2); + +class Context +{ + public static $mock_vars = array(); + + public function gets() { + $args = func_get_args(); + $output = new stdClass; + + foreach($args as $name) { + $output->{$name} = Context::$mock_vars[$name]; + } + + return $output; + } + + public function get($name) { + return array_key_exists($name, Context::$mock_vars)?Context::$mock_vars[$name]:''; + } + + public function getRequestVars() { + return Context::$mock_vars; + } + + public function set($name, $value) { + Context::$mock_vars[$name] = $value; + } + + public function getLangType() { + return 'en'; + } + + public function getLang($str) { + return $str; + } + + public function truncate() { + Context::$mock_vars = array(); + } + + public function getDBInfo() { + global $use_cdn; + + $dbInfo = new stdClass; + $dbInfo->use_cdn = $use_cdn; + + return $dbInfo; + } + + public function getRequestUrl() { + global $request_url; + return $request_url; + } +} + +/* End of file Context.mock.php */ +/* Location: ./tests/classes/context/Context.mock.php */ diff --git a/tests/classes/context/ContextTest.php b/tests/classes/context/ContextTest.php new file mode 100644 index 000000000..213ed456e --- /dev/null +++ b/tests/classes/context/ContextTest.php @@ -0,0 +1,20 @@ +<?php + +if(!defined('__XE__')) require dirname(__FILE__).'/../../Bootstrap.php'; + +require_once _XE_PATH_.'classes/context/Context.class.php'; +require_once _XE_PATH_.'classes/handler/Handler.class.php'; +require_once _XE_PATH_.'classes/frontendfile/FrontEndFileHandler.class.php'; + +class ContextTest extends PHPUnit_Framework_TestCase +{ + /** + * test whether the singleton works + */ + public function testGetInstance() + { + } +} + +/* End of file ContextTest.php */ +/* Location: ./tests/classes/context/ContextTest.php */ diff --git a/tests/classes/security/FrontEndFileHandlerTest.php b/tests/classes/frontendfile/FrontEndFileHandlerTest.php similarity index 91% rename from tests/classes/security/FrontEndFileHandlerTest.php rename to tests/classes/frontendfile/FrontEndFileHandlerTest.php index 4d8b0ea3b..67cfde75a 100644 --- a/tests/classes/security/FrontEndFileHandlerTest.php +++ b/tests/classes/frontendfile/FrontEndFileHandlerTest.php @@ -1,11 +1,10 @@ <?php -define('__DEBUG__', 1); -$xe_path = realpath(dirname(__FILE__).'/../../../'); -require "{$xe_path}/classes/handler/Handler.class.php"; -require "{$xe_path}/classes/frontendfile/FrontEndFileHandler.class.php"; +if(!defined('__XE__')) require dirname(__FILE__).'/../../Bootstrap.php'; + +require_once _XE_PATH_.'classes/handler/Handler.class.php'; +require_once _XE_PATH_.'classes/frontendfile/FrontEndFileHandler.class.php'; -error_reporting(E_ALL & ~E_NOTICE); $_SERVER['SCRIPT_NAME'] = '/xe/index.php'; class FrontEndFileHandlerTest extends PHPUnit_Framework_TestCase @@ -214,43 +213,12 @@ class FrontEndFileHandlerTest extends PHPUnit_Framework_TestCase } } -$mock_vars = array(); - -class Context +if(!class_exists('Context')) { - public function gets() { - global $mock_vars; - - $args = func_get_args(); - $output = new stdClass; - - foreach($args as $name) { - $output->{$name} = $mock_vars[$name]; - } - - return $output; - } - - public function get($name) { - global $mock_vars; - return array_key_exists($name, $mock_vars)?$mock_vars[$name]:''; - } - - public function set($name, $value) { - global $mock_vars; - - $mock_vars[$name] = $value; - } - - public function getRequestUrl() { - global $request_url; - return $request_url; - } - public function getDBInfo() { - global $use_cdn; - $dbInfo->use_cdn = $use_cdn; - return $dbInfo; - } + require _XE_PATH_.'/tests/classes/context/Context.mock.php'; } -function debugPrint(){} +if(!function_exists('debugPrint')) +{ + function debugPrint(){} +} diff --git a/tests/classes/security/SecurityTest.php b/tests/classes/security/SecurityTest.php index 32824566b..e1980963b 100644 --- a/tests/classes/security/SecurityTest.php +++ b/tests/classes/security/SecurityTest.php @@ -1,8 +1,8 @@ <?php -define('__DEBUG__', 1); -$xe_path = realpath(dirname(__FILE__).'/../../../'); -require "{$xe_path}/classes/security/Security.class.php"; +if(!defined('__XE__')) require dirname(__FILE__).'/../../Bootstrap.php'; + +require_once _XE_PATH_.'/classes/security/Security.class.php'; error_reporting(E_ALL & ~E_NOTICE); @@ -119,32 +119,10 @@ class SecurityTest extends PHPUnit_Framework_TestCase } } -$mock_vars = array(); - -class Context +if(!class_exists('Context')) { - public function gets() { - global $mock_vars; - - $args = func_get_args(); - $output = new stdClass; - - foreach($args as $name) { - $output->{$name} = $mock_vars[$name]; - } - - return $output; - } - - public function get($name) { - global $mock_vars; - return array_key_exists($name, $mock_vars)?$mock_vars[$name]:''; - } - - public function set($name, $value) { - global $mock_vars; - - $mock_vars[$name] = $value; - } - + require _XE_PATH_.'/tests/classes/context/Context.mock.php'; } + +/* End of file SecurityTest.php */ +/* Location: ./tests/classes/security/SecurityTest.php */ diff --git a/tests/classes/template/TemplateHandlerTest.php b/tests/classes/template/TemplateHandlerTest.php index 6ab37f3ef..b039d7229 100644 --- a/tests/classes/template/TemplateHandlerTest.php +++ b/tests/classes/template/TemplateHandlerTest.php @@ -1,11 +1,9 @@ <?php -define('__DEBUG__', 1); -define('_XE_PATH_', str_replace('tests/classes/template/TemplateHandlerTest.php', '', strtr(__FILE__, '\\', '/'))); -require_once _XE_PATH_.'/classes/file/FileHandler.class.php'; -require_once _XE_PATH_.'/classes/template/TemplateHandler.class.php'; +if(!defined('__XE__')) require dirname(__FILE__).'/../../Bootstrap.php'; -$_SERVER['SCRIPT_NAME'] = '/xe/index.php'; +require_once _XE_PATH_.'classes/file/FileHandler.class.php'; +require_once _XE_PATH_.'classes/template/TemplateHandler.class.php'; class TemplateHandlerTest extends PHPUnit_Framework_TestCase { diff --git a/tests/classes/validator/ValidatorTest.php b/tests/classes/validator/ValidatorTest.php index caf1c1b07..774977723 100644 --- a/tests/classes/validator/ValidatorTest.php +++ b/tests/classes/validator/ValidatorTest.php @@ -1,13 +1,10 @@ <?php -define('__DEBUG__', 1); -$xe_path = realpath(dirname(__FILE__).'/../../../'); -require_once "{$xe_path}/classes/xml/XmlParser.class.php"; -require_once "{$xe_path}/classes/handler/Handler.class.php"; -require_once "{$xe_path}/classes/file/FileHandler.class.php"; -require_once "{$xe_path}/classes/validator/Validator.class.php"; - -error_reporting(E_ALL & ~E_NOTICE); +if(!defined('__XE__')) require dirname(__FILE__).'/../../Bootstrap.php'; +require_once _XE_PATH_.'classes/xml/XmlParser.class.php'; +require_once _XE_PATH_.'classes/handler/Handler.class.php'; +require_once _XE_PATH_.'classes/file/FileHandler.class.php'; +require_once _XE_PATH_.'classes/validator/Validator.class.php'; class ValidatorTest extends PHPUnit_Framework_TestCase { @@ -46,8 +43,6 @@ class ValidatorTest extends PHPUnit_Framework_TestCase } public function testDefault() { - global $mock_vars; - $vd = new Validator(); $vd->addFilter('userid', array('default'=>'ididid')); @@ -64,16 +59,18 @@ class ValidatorTest extends PHPUnit_Framework_TestCase $vd->validate(&$arr); $this->assertEquals( $arr, array('userid'=>'ownid') ); - // context data - $mock_vars = array(); // empty context variables - $vd->validate(); - $this->assertEquals( 'ididid', Context::get('userid') ); + if(method_exists()) { + // context data + $mock_vars = array(); // empty context variables + $vd->validate(); + $this->assertEquals( 'ididid', Context::get('userid') ); - $vd->load(dirname(__FILE__).'/login.xml'); + $vd->load(dirname(__FILE__).'/login.xml'); - Context::set('userid', ''); - $vd->validate(); - $this->assertEquals( 'idididid', Context::get('userid') ); + Context::set('userid', ''); + $vd->validate(); + $this->assertEquals( 'idididid', Context::get('userid') ); + } } public function testLength() { @@ -130,44 +127,10 @@ class ValidatorTest extends PHPUnit_Framework_TestCase } } -$mock_vars = array(); - -class Context +if(!class_exists('Context')) { - public function gets() { - global $mock_vars; - - $args = func_get_args(); - $output = new stdClass; - - foreach($args as $name) { - $output->{$name} = $mock_vars[$name]; - } - - return $output; - } - - public function getRequestVars() { - global $mock_vars; - - return $mock_vars; - } - - public function get($name) { - global $mock_vars; - return array_key_exists($name, $mock_vars)?$mock_vars[$name]:''; - } - - public function set($name, $value) { - global $mock_vars; - - $mock_vars[$name] = $value; - } - - public function getLangType() { - return 'en'; - } - public function getLang($str) { - return $str; - } + require _XE_PATH_.'tests/classes/context/Context.mock.php'; } + +/* End of file ValidatorTest.php */ +/* Location: ./tests/classes/validator/ValidatorTest.php */ diff --git a/tests/phpunit.xml b/tests/phpunit.xml index 11f818271..78ba16f54 100644 --- a/tests/phpunit.xml +++ b/tests/phpunit.xml @@ -2,8 +2,8 @@ <testsuites> <testsuite name="XE Core Test Suite"> <directory>.</directory> + <exclude>./classes/context/Context.mock.php</exclude> <exclude>./classes/db/</exclude> - <exclude>./classes/security/</exclude> </testsuite> </testsuites> <logging> From a59e1ec43aae8788eb9202a3281a6ebb07e1a445 Mon Sep 17 00:00:00 2001 From: ChanMyeong <dece24@gmail.com> Date: Tue, 22 Nov 2011 07:54:09 +0000 Subject: [PATCH 1358/1372] Add en, jp language. /user_layout/conf/info.xml git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9852 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- layouts/user_layout/conf/info.xml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/layouts/user_layout/conf/info.xml b/layouts/user_layout/conf/info.xml index e284c07b4..24f2cfd01 100644 --- a/layouts/user_layout/conf/info.xml +++ b/layouts/user_layout/conf/info.xml @@ -9,11 +9,15 @@ <version>1.0</version> <date>2010-12-24</date> <author email_address="user@user.com" link="http://user-define.com/"> - <name xml:lang="ko">User Name</name> + <name xml:lang="ko">제작자 이름</name> + <name xml:lang="en">Maker Name</name> + <name xml:lang="jp">製作者名</name> </author> <menus> <menu name="main_menu" maxdepth="2" default="true"> - <title xml:lang="ko">메뉴 + 전역 메뉴 + Global Menu + グローバルメニュー From 04a8e382018f778e9c43f977b56f3d5786aacc6d Mon Sep 17 00:00:00 2001 From: ovclas Date: Tue, 22 Nov 2011 07:57:21 +0000 Subject: [PATCH 1359/1372] issue 148 if update group by admin, point should be updated too git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9853 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/member/member.controller.php | 32 ++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/modules/member/member.controller.php b/modules/member/member.controller.php index 02044fab4..d583b228b 100644 --- a/modules/member/member.controller.php +++ b/modules/member/member.controller.php @@ -1854,6 +1854,9 @@ return $output; } } + + // if group is changed, point changed too. + $this->_updatePointByGroup($orgMemberInfo->member_srl, $group_srl_list); } } // Call a trigger (after) @@ -1980,5 +1983,34 @@ executeQuery('member.deleteAutologin', $args); } } + + function _updatePointByGroup($memberSrl, $groupSrlList) + { + $oModuleModel = &getModel('module'); + $pointModuleConfig = $oModuleModel->getModuleConfig('point'); + $pointGroup = $pointModuleConfig->point_group; + + if(is_array($pointGroup) && count($pointGroup)>0) + { + $levelGroup = array_flip($pointGroup); + ksort($levelGroup); + } + $maxLevel = 0; + $resultGroup = array_intersect($levelGroup, $groupSrlList); + if(count($resultGroup) > 0) + $maxLevel = max(array_flip($resultGroup)); + + if($maxLevel > 0) + { + $oPointModel = &getModel('point'); + $originPoint = $oPointModel->getPoint($memberSrl); + + if($pointModuleConfig->level_step[$maxLevel] > $originPoint) + { + $oPointController = &getController('point'); + $oPointController->setPoint($memberSrl, $pointModuleConfig->level_step[$maxLevel], 'update'); + } + } + } } ?> From a9ee03e5129a27d73e21fed17c30e4feb6f43827 Mon Sep 17 00:00:00 2001 From: taggon Date: Tue, 22 Nov 2011 08:54:29 +0000 Subject: [PATCH 1360/1372] Prevent errors git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9854 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/context/Context.class.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/classes/context/Context.class.php b/classes/context/Context.class.php index 40c447551..06b3c9817 100644 --- a/classes/context/Context.class.php +++ b/classes/context/Context.class.php @@ -1059,7 +1059,8 @@ class Context { **/ function getRequestVars() { is_a($this,'Context')?$self=&$this:$self=&Context::getInstance(); - return clone($self->get_vars); + if($self->get_vars) return clone($self->get_vars); + return new stdClass; } /** From c5beeb5f5e9002fcf84126f881887bc6fb518d58 Mon Sep 17 00:00:00 2001 From: taggon Date: Tue, 22 Nov 2011 09:03:29 +0000 Subject: [PATCH 1361/1372] modify classes git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9855 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- tests/classes/context/Context.mock.php | 1 + tests/classes/validator/ValidatorTest.php | 18 +++++++++--------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/tests/classes/context/Context.mock.php b/tests/classes/context/Context.mock.php index 607c85bd5..7b92c994f 100644 --- a/tests/classes/context/Context.mock.php +++ b/tests/classes/context/Context.mock.php @@ -3,6 +3,7 @@ if(!defined('FOLLOW_REQUEST_SSL')) define('FOLLOW_REQUEST_SSL',0); if(!defined('ENFORCE_SSL')) define('ENFORCE_SSL',1); if(!defined('RELEASE_SSL')) define('RELEASE_SSL',2); +if(!defined('MOCK_CONTEXT')) define('MOCK_CONTEXT', 1); class Context { diff --git a/tests/classes/validator/ValidatorTest.php b/tests/classes/validator/ValidatorTest.php index 774977723..329649d98 100644 --- a/tests/classes/validator/ValidatorTest.php +++ b/tests/classes/validator/ValidatorTest.php @@ -8,7 +8,7 @@ require_once _XE_PATH_.'classes/validator/Validator.class.php'; class ValidatorTest extends PHPUnit_Framework_TestCase { - public function _testRequired() { + public function testRequired() { $vd = new Validator(); $vd->addFilter('userid', array('required'=>'true')); @@ -19,9 +19,9 @@ class ValidatorTest extends PHPUnit_Framework_TestCase // context data $this->assertFalse( $vd->validate() ); - Context::set('userid', ''); + Context::set('userid', '', true); $this->assertFalse( $vd->validate() ); - Context::set('userid', 'myuserid'); + Context::set('userid', 'myuserid', true); $this->assertTrue( $vd->validate() ); $vd->removeFilter('userid'); $this->assertTrue( $vd->validate() ); @@ -31,14 +31,14 @@ class ValidatorTest extends PHPUnit_Framework_TestCase $vd = new Validator(); $vd->addFilter('^user_', array('length'=>'5:')); - Context::set('user_123', 'abcd'); - Context::set('user_456', '123'); + Context::set('user_123', 'abcd', true); + Context::set('user_456', '123', true); $this->assertFalse( $vd->validate() ); - Context::set('user_123', 'abcdefg'); + Context::set('user_123', 'abcdefg', true); $this->assertFalse( $vd->validate() ); - Context::set('user_456', '123456'); + Context::set('user_456', '123456', true); $this->assertTrue( $vd->validate() ); } @@ -59,7 +59,7 @@ class ValidatorTest extends PHPUnit_Framework_TestCase $vd->validate(&$arr); $this->assertEquals( $arr, array('userid'=>'ownid') ); - if(method_exists()) { + if(defined('MOCK_CONTEXT')) { // context data $mock_vars = array(); // empty context variables $vd->validate(); @@ -67,7 +67,7 @@ class ValidatorTest extends PHPUnit_Framework_TestCase $vd->load(dirname(__FILE__).'/login.xml'); - Context::set('userid', ''); + Context::set('userid', '', true); $vd->validate(); $this->assertEquals( 'idididid', Context::get('userid') ); } From 634b2c4e6c67c58d95a5d2960f90b1074484d599 Mon Sep 17 00:00:00 2001 From: taggon Date: Tue, 22 Nov 2011 09:55:00 +0000 Subject: [PATCH 1362/1372] Add testcases for FileHandler class. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9856 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- tests/classes/file/FileHandlerTest.php | 80 ++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 tests/classes/file/FileHandlerTest.php diff --git a/tests/classes/file/FileHandlerTest.php b/tests/classes/file/FileHandlerTest.php new file mode 100644 index 000000000..fd56816a5 --- /dev/null +++ b/tests/classes/file/FileHandlerTest.php @@ -0,0 +1,80 @@ +assertEquals(FileHandler::getRealPath(__FILE__), __FILE__); + $this->assertEquals(FileHandler::getRealPath('./tests/classes/file/FileHandlerTest.php'), __FILE__); + } + + public function testFileMethods() + { + $mock = dirname(__FILE__).'/mock.txt'; + $mock2 = dirname(__FILE__).'/mock2.txt'; + touch($mock); + + // copy file + $this->assertTrue(is_readable($mock)); + FileHandler::copyFile($mock, $mock2); + $this->assertTrue(is_readable($mock2)); + + // remove file + $this->assertTrue(FileHandler::removeFile($mock2)); + $this->assertFalse(is_readable($mock2)); + $this->assertFalse(FileHandler::removeFile($mock2)); + + // rename file + $this->assertTrue(FileHandler::rename($mock, $mock2)); + $this->assertFalse(is_readable($mock)); + $this->assertTrue(is_readable($mock2)); + $this->assertFalse(FileHandler::rename($mock, $mock2)); + + // move file + $this->assertTrue(FileHandler::rename($mock2, $mock)); + $this->assertTrue(is_readable($mock)); + $this->assertFalse(is_readable($mock2)); + $this->assertTrue(touch($mock2) && is_readable($mock2)); + $this->assertTrue(FileHandler::moveFile($mock, $mock2)); + $this->assertFalse(is_readable($mock)); + $this->assertTrue(is_readable($mock2)); + + // remove file + $this->assertFalse(FileHandler::removeFile($mock)); + $this->assertTrue(FileHandler::removeFile($mock2)); + $this->assertFalse(is_readable($mock)); + $this->assertFalse(is_readable($mock2)); + } + + public function testFileSize() + { + // file size + $this->assertEquals(FileHandler::filesize(0), '0Byte'); + $this->assertEquals(FileHandler::filesize(1), '1Byte'); + $this->assertEquals(FileHandler::filesize(386), '386Bytes'); + $this->assertEquals(FileHandler::filesize(1023), '1023Bytes'); + $this->assertEquals(FileHandler::filesize(1024), '1.0KB'); + $this->assertEquals(FileHandler::filesize(2480), '2.4KB'); + $this->assertEquals(FileHandler::filesize(1024*1024-1), '1024.0KB'); + $this->assertEquals(FileHandler::filesize(1024*1024), '1.00MB'); + $this->assertEquals(FileHandler::filesize(3*1024*1024+210*1024), '3.21MB'); + + // return bytes + $this->assertEquals(FileHandler::returnBytes('0B'), 0); + $this->assertEquals(FileHandler::returnBytes('1024B'), 1024); + $this->assertEquals(FileHandler::returnBytes('1K'), 1024); + $this->assertEquals(FileHandler::returnBytes('102.48K'), 1024*102.48); + $this->assertEquals(FileHandler::returnBytes('1M'), 1024*1024); + $this->assertEquals(FileHandler::returnBytes('1.12M'), 1024*1024*1.12); + $this->assertEquals(FileHandler::returnBytes('1023.99M'), 1024*1024*1023.99); + $this->assertEquals(FileHandler::returnBytes('1G'), 1024*1024*1024); + $this->assertEquals(FileHandler::returnBytes('12.02G'), 1024*1024*1024*12.02); + } +} + +/* End of file FileHandlerTest.php */ +/* Location: ./tests/classes/file/FileHandlerTest.php */ From 99e196cd4856e4e2e1491977ac5af048f5df5710 Mon Sep 17 00:00:00 2001 From: taggon Date: Tue, 22 Nov 2011 09:59:51 +0000 Subject: [PATCH 1363/1372] return byte's' git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9857 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/file/FileHandler.class.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/classes/file/FileHandler.class.php b/classes/file/FileHandler.class.php index 87bd8ef2e..72772089b 100644 --- a/classes/file/FileHandler.class.php +++ b/classes/file/FileHandler.class.php @@ -321,8 +321,9 @@ class FileHandler { * @return file size string **/ function filesize($size) { - if(!$size) return "0Byte"; - if($size < 1024) return ($size."Byte"); + if(!$size) return '0Byte'; + if($size === 1) return '1Byte'; + if($size < 1024) return $size.'Bytes'; if($size >= 1024 && $size < 1024*1024) return sprintf("%0.1fKB",$size / 1024); return sprintf("%0.2fMB",$size / (1024*1024)); } @@ -426,6 +427,7 @@ class FileHandler { if($last == 'g') $val *= 1024*1024*1024; else if($last == 'm') $val *= 1024*1024; else if($last == 'k') $val *= 1024; + else $val *= 1; return $val; } From 7ee45e57c75cc13e242a375fc65f09005269e3bd Mon Sep 17 00:00:00 2001 From: ucorina Date: Tue, 22 Nov 2011 17:11:53 +0000 Subject: [PATCH 1364/1372] Subquery fix. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9858 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/xml/xmlquery/tags/query/QueryTag.class.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/classes/xml/xmlquery/tags/query/QueryTag.class.php b/classes/xml/xmlquery/tags/query/QueryTag.class.php index 80da6c1ad..ac9a2a6c4 100644 --- a/classes/xml/xmlquery/tags/query/QueryTag.class.php +++ b/classes/xml/xmlquery/tags/query/QueryTag.class.php @@ -28,7 +28,10 @@ class QueryTag { $this->query = $query; $this->isSubQuery = $isSubQuery; if($this->isSubQuery) $this->action = 'select'; - $this->alias = $query->attrs->alias; + if($query->attrs->alias){ + $dbParser = DB::getParser(); + $this->alias = $dbParser->escape($query->attrs->alias); + } $this->join_type = $query->attrs->join_type; $this->getColumns(); @@ -48,7 +51,7 @@ class QueryTag { function getQueryId(){ return $this->query->attrs->query_id ? $this->query->attrs->query_id : $this->query->attrs->id; } - + function getPriority(){ return $this->query->attrs->priority; } @@ -112,7 +115,7 @@ class QueryTag { $buff = ''; if($this->isSubQuery){ $buff = 'new Subquery('; - $buff .= "'\"" . $this->alias . '"\', '; + $buff .= "'" . $this->alias . '\', '; $buff .= ($this->columns ? $this->columns->toString() : 'null' ). ', '.PHP_EOL; $buff .= $this->tables->toString() .','.PHP_EOL; $buff .= $this->conditions->toString() .',' .PHP_EOL; From ebd5c75e33b92f65f54977b0ea4a5afd9c622ba4 Mon Sep 17 00:00:00 2001 From: taggon Date: Wed, 23 Nov 2011 02:31:07 +0000 Subject: [PATCH 1365/1372] Fixed a bug for setRequestMethod() git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9859 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- classes/context/Context.class.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/classes/context/Context.class.php b/classes/context/Context.class.php index 06b3c9817..fbcdf4f0a 100644 --- a/classes/context/Context.class.php +++ b/classes/context/Context.class.php @@ -644,15 +644,15 @@ class Context { /** * @brief determine request method (GET/POST/XMLRPC/JSON) - * @param[in] $type request method + * @param[in] $type request method (optional) * @return none **/ - function setRequestMethod($type) { + function setRequestMethod($type='') { is_a($this,'Context')?$self=&$this:$self=&Context::getInstance(); ($type && $self->request_method=$type) or - (strpos($_SERVER['CONTENT_TYPE'],'json') && $this->request_method='JSON') or - ($GLOBALS['HTTP_RAW_POST_DATA'] && $this->request_method='XMLRPC') or + (strpos($_SERVER['CONTENT_TYPE'],'json') && $self->request_method='JSON') or + ($GLOBALS['HTTP_RAW_POST_DATA'] && $self->request_method='XMLRPC') or ($self->request_method = $_SERVER['REQUEST_METHOD']); } From b17ccdbb05e9b9a2f0a97fb21defeec320fd5bec Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Wed, 23 Nov 2011 02:38:44 +0000 Subject: [PATCH 1366/1372] /modules/menu/lang/lang.xml japanese language update. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9860 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/menu/lang/lang.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/menu/lang/lang.xml b/modules/menu/lang/lang.xml index 827b3dabc..9674ff85b 100644 --- a/modules/menu/lang/lang.xml +++ b/modules/menu/lang/lang.xml @@ -61,12 +61,12 @@ - + - + From 5ae6ca1829610cf7fa41b7b08e22285faefda55a Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Wed, 23 Nov 2011 05:35:55 +0000 Subject: [PATCH 1367/1372] /layouts/user_layout/ var name update. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9861 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- layouts/user_layout/conf/info.xml | 2 +- layouts/user_layout/layout.html | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/layouts/user_layout/conf/info.xml b/layouts/user_layout/conf/info.xml index 24f2cfd01..e169ac982 100644 --- a/layouts/user_layout/conf/info.xml +++ b/layouts/user_layout/conf/info.xml @@ -14,7 +14,7 @@ 製作者名 - + 전역 메뉴 Global Menu グローバルメニュー diff --git a/layouts/user_layout/layout.html b/layouts/user_layout/layout.html index 5a3554723..0a2f46f6f 100644 --- a/layouts/user_layout/layout.html +++ b/layouts/user_layout/layout.html @@ -13,7 +13,7 @@
                                                          .gnb

                                                          .lnb -

                                                          {$val1['link']}

                                                          -
                                                            +

                                                            {$val1['link']}

                                                            +
                                                            • {$val2['link']}
                                                              • {$val3['link']} From 9b5d4c7bac96d3065155b501fab1fdd134237de2 Mon Sep 17 00:00:00 2001 From: taggon Date: Wed, 23 Nov 2011 06:47:07 +0000 Subject: [PATCH 1368/1372] Update test cases git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9862 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- tests/classes/context/ContextTest.php | 65 ++++++++++++++++++++++ tests/classes/security/SecurityTest.php | 6 ++ tests/classes/validator/ValidatorTest.php | 67 +++++++++++++++++++---- tests/classes/validator/condition.en.js | 8 +++ 4 files changed, 135 insertions(+), 11 deletions(-) create mode 100644 tests/classes/validator/condition.en.js diff --git a/tests/classes/context/ContextTest.php b/tests/classes/context/ContextTest.php index 213ed456e..70a61226c 100644 --- a/tests/classes/context/ContextTest.php +++ b/tests/classes/context/ContextTest.php @@ -13,6 +13,71 @@ class ContextTest extends PHPUnit_Framework_TestCase */ public function testGetInstance() { + $this->assertInstanceOf('Context', Context::getInstance()); + $this->assertSame(Context::getInstance(), Context::getInstance()); + } + + public function testSetGetVars() + { + $this->assertSame(Context::get('var1'), null); + Context::set('var1', 'val1'); + $this->assertSame(Context::get('var1'), 'val1'); + + Context::set('var2', 'val2'); + $this->assertSame(Context::get('var2'), 'val2'); + Context::set('var3', 'val3'); + $data = new stdClass; + $data->var1 = 'val1'; + $data->var2 = 'val2'; + $this->assertEquals(Context::gets('var1','var2'), $data); + $data->var3 = 'val3'; + $this->assertEquals(Context::getAll(), $data); + } + + public function testAddGetBodyClass() + { + $this->assertEquals(Context::getBodyClass(), ''); + Context::addBodyClass('red'); + $this->assertEquals(Context::getBodyClass(), ' class="red"'); + Context::addBodyClass('green'); + $this->assertEquals(Context::getBodyClass(), ' class="red green"'); + Context::addBodyClass('blue'); + $this->assertEquals(Context::getBodyClass(), ' class="red green blue"'); + + // remove duplicated class + Context::addBodyClass('red'); + $this->assertEquals(Context::getBodyClass(), ' class="red green blue"'); + } + + public function testRequsetResponseMethod() + { + $this->assertEquals(Context::getRequestMethod(), 'GET'); + + $_SERVER['REQUEST_METHOD'] = 'POST'; + Context::setRequestMethod(); + $this->assertEquals(Context::getRequestMethod(), 'POST'); + + $GLOBALS['HTTP_RAW_POST_DATA'] = 'abcde'; + Context::setRequestMethod(); + $this->assertEquals(Context::getRequestMethod(), 'XMLRPC'); + + $_SERVER['CONTENT_TYPE'] = 'application/json'; + Context::setRequestMethod(); + $this->assertEquals(Context::getRequestMethod(), 'JSON'); + + Context::setRequestMethod('POST'); + $this->assertEquals(Context::getRequestMethod(), 'POST'); + + $this->assertEquals(Context::getResponseMethod(), 'HTML'); + Context::setRequestMethod('JSON'); + $this->assertEquals(Context::getResponseMethod(), 'JSON'); + + Context::setResponseMethod('WRONG_TYPE'); + $this->assertEquals(Context::getResponseMethod(), 'HTML'); + Context::setResponseMethod('XMLRPC'); + $this->assertEquals(Context::getResponseMethod(), 'XMLRPC'); + Context::setResponseMethod('HTML'); + $this->assertEquals(Context::getResponseMethod(), 'HTML'); } } diff --git a/tests/classes/security/SecurityTest.php b/tests/classes/security/SecurityTest.php index e1980963b..cb865f3a4 100644 --- a/tests/classes/security/SecurityTest.php +++ b/tests/classes/security/SecurityTest.php @@ -116,6 +116,12 @@ class SecurityTest extends PHPUnit_Framework_TestCase $security = new Security($array); $returned = $security->encodeHTML('.'); $this->assertEquals($returned, array('Hello', 'World', '<b>Bold</b> is not bald')); + + // associative array + $array = array('first'=>'Hello', 'second'=>'World', '3rd'=>'Bold is not bald'); + $security = new Security($array); + $returned = $security->encodeHTML('first','3rd'); + $this->assertEquals($returned, array('first'=>'Hello', 'second'=>'World', '3rd'=>'<b>Bold</b> is not bald')); } } diff --git a/tests/classes/validator/ValidatorTest.php b/tests/classes/validator/ValidatorTest.php index 329649d98..af0aa861b 100644 --- a/tests/classes/validator/ValidatorTest.php +++ b/tests/classes/validator/ValidatorTest.php @@ -8,6 +8,15 @@ require_once _XE_PATH_.'classes/validator/Validator.class.php'; class ValidatorTest extends PHPUnit_Framework_TestCase { + protected function setUp() { + global $lang; + + $lang->filter = new stdClass; + $lang->filter->isnull = 'isnull'; + $lang->filter->outofrange = 'outofrange'; + $lang->filter->equalto = 'equalto'; + } + public function testRequired() { $vd = new Validator(); $vd->addFilter('userid', array('required'=>'true')); @@ -42,6 +51,26 @@ class ValidatorTest extends PHPUnit_Framework_TestCase $this->assertTrue( $vd->validate() ); } + public function testEqualTo() { + $vd = new Validator(); + $vd->addFilter('pass1', array('equalto'=>'pass2')); + + Context::set('pass1', 'MyPassword', true); + $this->assertFalse( $vd->validate() ); + Context::set('pass2', 'WorngPassword', true); + $this->assertFalse( $vd->validate() ); + Context::set('pass2', 'MyPassword', true); + $this->assertTrue( $vd->validate() ); + } + + public function testArrayTrim() { + $vd = new Validator(); + + $arr = array('red'=>'apple', 'yellow'=>'banana ', 'green'=>' papaya '); + $this->assertEquals($vd->arrayTrim($arr), array('red'=>'apple', 'yellow'=>'banana', 'green'=>'papaya')); + $this->assertEquals($vd->arrayTrim(' string '), 'string'); + } + public function testDefault() { $vd = new Validator(); $vd->addFilter('userid', array('default'=>'ididid')); @@ -60,17 +89,19 @@ class ValidatorTest extends PHPUnit_Framework_TestCase $this->assertEquals( $arr, array('userid'=>'ownid') ); if(defined('MOCK_CONTEXT')) { + Context::truncate(); + // context data - $mock_vars = array(); // empty context variables $vd->validate(); $this->assertEquals( 'ididid', Context::get('userid') ); - $vd->load(dirname(__FILE__).'/login.xml'); - - Context::set('userid', '', true); - $vd->validate(); - $this->assertEquals( 'idididid', Context::get('userid') ); } + + $vd->load(dirname(__FILE__).'/login.xml'); + + Context::set('userid', '', true); + $vd->validate(); + $this->assertEquals( 'idididid', Context::get('userid') ); } public function testLength() { @@ -85,11 +116,6 @@ class ValidatorTest extends PHPUnit_Framework_TestCase public function testCustomRule() { } - public function testJSCompile() { - $vd = new Validator(); - $vd->setCacheDir(dirname(__FILE__)); - } - public function testCondition() { $vd = new Validator(); $data = array('greeting1'=>'hello'); @@ -113,6 +139,7 @@ class ValidatorTest extends PHPUnit_Framework_TestCase } public function testConditionXml() { + $vd = new Validator(dirname(__FILE__).'/condition.xml'); $data = array('greeting1'=>'hello'); @@ -124,6 +151,24 @@ class ValidatorTest extends PHPUnit_Framework_TestCase $data['greeting2'] = 'World'; $this->assertTrue($vd->validate($data)); + + // javascript + $vd->setCacheDir(dirname(__FILE__)); + $js = $vd->getJsPath(); + $this->assertFileEquals($js, dirname(__FILE__).'/condition.en.js'); + } + + protected function tearDown() + { + // remove cache directory + $cache_dir = dirname(__FILE__).'/ruleset'; + if(is_dir($cache_dir)) { + $files = (array)glob($cache_dir.'/*'); + foreach($files as $file) { + unlink($file); + } + rmdir($cache_dir); + } } } diff --git a/tests/classes/validator/condition.en.js b/tests/classes/validator/condition.en.js new file mode 100644 index 000000000..dd24a54df --- /dev/null +++ b/tests/classes/validator/condition.en.js @@ -0,0 +1,8 @@ +(function($,v){ +v=xe.getApp('validator')[0];if(!v)return; + +v.cast('ADD_FILTER',['condition', {'greeting1':{required:true},'greeting2':{'if':[{test:'$greeting1 == \'Hello\'', attr:'required', value:'true'}]}}]); +v.cast('ADD_MESSAGE',['isnull','isnull']); +v.cast('ADD_MESSAGE',['outofrange','outofrange']); +v.cast('ADD_MESSAGE',['equalto','equalto']); +})(jQuery); \ No newline at end of file From 4aa2c8f0fe5945ecc52410236a998725189ca2c2 Mon Sep 17 00:00:00 2001 From: ChanMyeong Date: Wed, 23 Nov 2011 08:25:41 +0000 Subject: [PATCH 1369/1372] modules/menu/ 'add menu' multilingual update. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@9863 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/menu/lang/lang.xml | 12 ++++++------ modules/menu/tpl/js/sitemap.js | 1 - modules/menu/tpl/sitemap.html | 6 +++--- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/modules/menu/lang/lang.xml b/modules/menu/lang/lang.xml index 9674ff85b..9336c5ec4 100644 --- a/modules/menu/lang/lang.xml +++ b/modules/menu/lang/lang.xml @@ -59,14 +59,14 @@ - - - + + + - - - + + + diff --git a/modules/menu/tpl/js/sitemap.js b/modules/menu/tpl/js/sitemap.js index e05bf0b37..c1b811f14 100644 --- a/modules/menu/tpl/js/sitemap.js +++ b/modules/menu/tpl/js/sitemap.js @@ -129,7 +129,6 @@ $('form.siteMap') resetEditForm(); - editForm.find('.h2').html('Add Menu'); editForm.find('input[name=menu_srl]').val($this.closest('form').find('input[name=menu_srl]:first').val()); editForm.find('input[name=parent_srl]').val($this.parent().prevAll('input._item_key').val()); }); diff --git a/modules/menu/tpl/sitemap.html b/modules/menu/tpl/sitemap.html index c771cc58c..f0f3cb444 100644 --- a/modules/menu/tpl/sitemap.html +++ b/modules/menu/tpl/sitemap.html @@ -28,7 +28,7 @@ xe.lang.confirm_delete = "{$lang->confirm_delete}";

                                                              - {$lang->add_menu} + {$lang->add_menu}... @@ -44,7 +44,7 @@ xe.lang.confirm_delete = "{$lang->confirm_delete}";

                                                              - +
                                                          {$lang->editor_skin}{$lang->about_editor_skin}{$lang->about_editor_skin}
                                                          + +
                                                          {$lang->content_style}

                                                          {$lang->about_content_style}

                                                          {$lang->about_content_style}

                                                          + + -
                                                          {$lang->about_content_font}{$lang->about_content_font}
                                                          + content_font)}" />
                                                          {$lang->about_content_font_size}{$lang->about_content_font_size}
                                                          +
                                                          {$lang->editor_height}{$lang->about_editor_height}{$lang->about_editor_height}
                                                          + px + px
                                                          {$lang->enable_autosave}{$lang->about_enable_autosave}{$lang->about_enable_autosave}
                                                          enable_autosave=='Y')-->checked="checked"/>enable_autosave=='Y')-->checked="checked"/>
                                                          {$lang->enable_html_grant}{$lang->about_enable_html_grant}{$lang->about_enable_html_grant}
                                                          + enable_html_grant))-->checked="checked"/> + enable_comment_html_grant))-->checked="checked"/> @@ -123,15 +123,15 @@
                                                          {$lang->upload_file_grant}{$lang->about_upload_file_grant}{$lang->about_upload_file_grant}
                                                          + upload_file_grant))-->checked="checked"/> + comment_upload_file_grant))-->checked="checked"/> @@ -139,15 +139,15 @@
                                                          {$lang->enable_default_component_grant}{$lang->about_default_component_grant}{$lang->about_default_component_grant}
                                                          + enable_default_component_grant))-->checked="checked"/> + enable_comment_default_component_grant))-->checked="checked"/> @@ -155,15 +155,15 @@
                                                          {$lang->enable_component_grant}{$lang->about_component_grant}{$lang->about_component_grant}
                                                          + enable_component_grant))-->checked="checked"/> + enable_comment_component_grant))-->checked="checked"/> diff --git a/modules/menu/tpl/sitemap.html b/modules/menu/tpl/sitemap.html index f77192fb2..f3cfb30db 100644 --- a/modules/menu/tpl/sitemap.html +++ b/modules/menu/tpl/sitemap.html @@ -58,7 +58,7 @@ xe.lang.confirm_delete = "{$lang->confirm_delete}";

                                                          • -

                                                            +

                                                            @@ -89,7 +89,7 @@ xe.lang.confirm_delete = "{$lang->confirm_delete}";
                                                          • -

                                                            {$lang->module_or_url}?

                                                            +

                                                            {$lang->module_or_url} *

                                                            @@ -97,7 +97,7 @@ xe.lang.confirm_delete = "{$lang->confirm_delete}";

                                                          • -

                                                            +

                                                          • -

                                                            +

                                                          • -

                                                            +

                                                          • -

                                                            {$lang->about_menu_open_window}

                                                            +

                                                            {$lang->about_menu_open_window} *

                                                            diff --git a/modules/page/tpl/header.html b/modules/page/tpl/header.html index 3f6fdfe5e..8424024a1 100644 --- a/modules/page/tpl/header.html +++ b/modules/page/tpl/header.html @@ -1,15 +1,15 @@ -

                                                            {$lang->page_management}

                                                            +

                                                            {$lang->page_management}

                                                            {nl2br($lang->about_page)}

                                                            -

                                                            +

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

                                                            + View +
                                                              diff --git a/modules/page/tpl/page_info.html b/modules/page/tpl/page_info.html index 59edb3c04..6d5f0eacd 100644 --- a/modules/page/tpl/page_info.html +++ b/modules/page/tpl/page_info.html @@ -13,20 +13,20 @@ - - - - - - - - @@ -87,14 +87,14 @@ - - @@ -103,7 +103,7 @@ - - - - + + - - @@ -43,7 +43,7 @@ - - - - - - - - - -
                                                              {$lang->page_type} + {$lang->page_type_name[$module_info->page_type]}
                                                              {$lang->mid} +

                                                              {$lang->about_mid}

                                                              {$lang->module_category} +
                                                              {$lang->browser_title} + {$lang->cmd_find_langcode}

                                                              {$lang->about_browser_title}

                                                              @@ -46,7 +46,7 @@
                                                              {$lang->layout} +
                                                              {$lang->mobile_view} - use_mobile == "Y")-->checked="checked" /> -

                                                              {$lang->about_mobile_view}

                                                              +
                                                              + use_mobile == "Y")-->checked="checked" /> +
                                                              {$lang->mobile_layout} +
                                                              {$lang->page_caching_interval} + {$lang->unit_min}

                                                              {$lang->about_page_caching_interval}

                                                              {$lang->opage_path} +

                                                              {$lang->about_opage_path}{realpath("./")}

                                                              {$lang->opage_mobile_path} +

                                                              {$lang->about_opage_mobile_path}{realpath("./")}

                                                              {$lang->skin} +
                                                              {$lang->mobile_skin} +
                                                              {$lang->page_type}
                                                              {$lang->page_type} +
                                                              {$lang->mid} +

                                                              {$lang->about_mid}

                                                              {$lang->module_category} +
                                                              {$lang->browser_title} + {$lang->cmd_find_langcode}

                                                              {$lang->about_browser_title}

                                                              @@ -63,7 +63,7 @@
                                                              {$lang->layout} +
                                                              {$lang->mobile_view} - use_mobile == "Y")-->checked="checked" /> -

                                                              {$lang->about_mobile_view}

                                                              +
                                                              + use_mobile == "Y")-->checked="checked" /> +
                                                              {$lang->mobile_layout} +
                                                              {$lang->page_caching_interval} + {$lang->unit_min}

                                                              {$lang->about_page_caching_interval}

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

                                                              {$lang->about_opage_path}{realpath("./")}

                                                              {$lang->opage_mobile_path} +

                                                              {$lang->about_opage_mobile_path}{realpath("./")}